export declare const RENDER_JOB_STATUSES: readonly ["queued", "running", "done", "failed", "cancelled"];
export type RenderJobStatus = (typeof RENDER_JOB_STATUSES)[number];
export declare const RENDER_STAGES: readonly ["render", "duck", "loudnorm", "burn", "encode"];
export type RenderStage = (typeof RENDER_STAGES)[number];
export declare const RENDER_JOB_TYPES: readonly ["full", "proxy"];
export type RenderJobType = (typeof RENDER_JOB_TYPES)[number];
export interface RenderJobLogEntry {
    at: string;
    level: "info" | "warn" | "error";
    msg: string;
}
export interface RenderJob {
    id: string;
    workId: string;
    type: RenderJobType;
    presetId?: string;
    status: RenderJobStatus;
    progress: number;
    stage?: RenderStage;
    log: RenderJobLogEntry[];
    outputPath?: string;
    error?: string;
    createdAt: string;
    startedAt?: string;
    finishedAt?: string;
}
export interface RenderJobOptions {
    workId: string;
    type: RenderJobType;
    presetId?: string;
    /** Optional metadata forwarded to runRenderPipeline (burnSubtitles, loudnessTargetLufs). */
    burnSubtitles?: boolean;
    loudnessTargetLufs?: number;
    /** Phase H (issue #35) — Resolve-model per-text-track caption strategy.
     *  Forwarded verbatim to runRenderPipeline. burnTrackId selects the lone
     *  text track to bake into the video; sidecarTrackIds enumerate text
     *  tracks emitted as `<output>.<lang>.srt` next to the final mp4. */
    captionTracks?: {
        burnTrackId?: string | null;
        sidecarTrackIds?: string[];
    };
}
export declare const TERMINAL_STATUSES: ReadonlySet<RenderJobStatus>;
export declare function isTerminalStatus(s: RenderJobStatus): boolean;
export declare function assertStatus(s: string): RenderJobStatus;
export declare function assertStage(s: string | null | undefined): RenderStage | undefined;
export declare function assertType(s: string): RenderJobType;
//# sourceMappingURL=job.d.ts.map