import type { EpisodeScript, GenerationPlan, ShotScript, SeriesState, VideoModelDefaults } from '../series/types.js'; export declare function parseShotDuration(duration: string): number; /** * A shot must render as a single exact-lip-sync clip only when the series * explicitly selected `audioStrategy: 'lip-sync'`, it has dialogue from a * visible non-narrator, and motion is not high. Native dialogue stays on the * selected R2V family and may use voice-donor references. * * High-motion dialogue stays on the R2V model for identity preservation — the * audio-driven lanes prioritize motion over reference adherence. */ export declare function mustRenderAsExactLipSync(shot: ShotScript, videoDefaults?: VideoModelDefaults): boolean; /** * @deprecated Renamed to `mustRenderAsExactLipSync` once lip-sync stopped * meaning "Wan 2.7". Kept so external importers keep compiling. */ export declare const mustStayAsWanLipSync: typeof mustRenderAsExactLipSync; /** * Does the planner expect this shot to render with the Seedance R2V keyframe * pipeline? True when the shot must render as an exact-lip-sync clip on a * model that takes no reference images, has at least one character, and * neither the series nor the shot opts out. See AGENTS.md rule 32. * * A reference-capable lip-sync model (Seedance or MiniMax H3 R2V) skips the * pre-pass entirely — it already anchors identity from the reference stack, * so the extra render would just double the cost. */ export declare function shouldUseSeedanceKeyframe(shot: ShotScript, videoDefaults?: VideoModelDefaults): boolean; export declare function buildGenerationPlan(script: EpisodeScript, series?: Pick): GenerationPlan; export declare function saveGenerationPlan(episodeDir: string, plan: GenerationPlan): Promise; export declare function loadGenerationPlan(episodeDir: string): Promise; //# sourceMappingURL=generation-planner.d.ts.map