import type { VideoReviewFeedback } from "../ai-edit.js";
import { type ReviewIssue, type ReviewSeverity, type ReviewSummary, type ReviewStatus } from "./review-report.js";
export interface TimeRange {
    start: number;
    end: number;
    duration: number;
}
export interface BeatTiming {
    id: string;
    start: number;
    end: number;
    sceneDurationSec: number;
    narrationDurationSec?: number;
}
export type RenderInspectModel = string;
export interface RenderInspectOptions {
    projectDir: string;
    beatId?: string;
    videoPath?: string;
    outputPath?: string;
    writeReport?: boolean;
    ai?: boolean;
    model?: RenderInspectModel;
}
export interface RenderInspectDryRunResult {
    schemaVersion: "1";
    kind: "render";
    project: string;
    beat?: string;
    videoPath: string | null;
    reportPath?: string;
    params: {
        projectDir: string;
        beatId?: string;
        videoPath?: string;
        outputPath?: string;
        writeReport: boolean;
        cheap: true;
        ai: boolean;
        model: RenderInspectModel;
    };
    checks: {
        renderFound: boolean;
        storyboardPath: string | null;
    };
}
export interface RenderAiCheck {
    enabled: true;
    model: RenderInspectModel;
    success: boolean;
    overallScore?: number;
    categories?: VideoReviewFeedback["categories"];
    recommendations?: string[];
    error?: string;
}
export interface RenderInspectResult {
    schemaVersion: "1";
    kind: "render";
    mode: "render";
    project: string;
    beat?: string;
    videoPath: string | null;
    status: ReviewStatus;
    score: number;
    issues: ReviewIssue[];
    summary: ReviewSummary;
    sourceReports: string[];
    checks: {
        renderFound: boolean;
        fileSizeBytes?: number;
        durationSec?: number;
        expectedDurationSec?: number;
        durationDriftSec?: number;
        width?: number;
        height?: number;
        expectedAspect?: string;
        hasAudio?: boolean;
        blackFrames: TimeRange[];
        staticFrames: TimeRange[];
        silences: TimeRange[];
        ai?: RenderAiCheck;
    };
    retryWith: string[];
    reportPath?: string;
}
export declare function parseBlackdetectOutput(output: string): TimeRange[];
export declare function parseSilencedetectOutput(output: string): TimeRange[];
export declare function parseFreezedetectOutput(output: string): TimeRange[];
export declare function staticFrameIssueForRange(range: TimeRange, beats: BeatTiming[], videoPath?: string): ReviewIssue;
export declare function blackFrameIssueForRange(range: TimeRange, beats: BeatTiming[], videoPath?: string): ReviewIssue;
export declare function durationDriftIssue(params: {
    durationSec: number;
    expectedDurationSec: number;
    driftSec: number;
    beats: BeatTiming[];
    beatId?: string;
    videoPath?: string;
}): ReviewIssue;
export declare function previewInspectRender(opts: RenderInspectOptions): Promise<RenderInspectDryRunResult>;
export declare function aiReviewSeverity(score: number): ReviewSeverity;
export declare function mapAiReviewFeedbackToIssues(feedback: VideoReviewFeedback, videoPath?: string): ReviewIssue[];
export declare function scoreRenderReview(issues: ReviewIssue[], aiOverallScore?: number): number;
export declare function inspectRender(opts: RenderInspectOptions): Promise<RenderInspectResult>;
export declare function resolveRenderVideoPath(projectDir: string, explicit?: string, beatId?: string): Promise<string | null>;
