/** * Demofly edit proposals — LLM-generated retiming instructions. * * Takes alignment.json and produces edit-decisions.json with per-segment * retiming instructions that can be executed by ffmpeg. * * Uses Claude API to generate intelligent edit decisions based on drift * data, hero moment awareness, and assembly best practices. */ import type { AlignmentData } from "./alignment.js"; export type EditType = "speed_video" | "slow_video" | "freeze_frame" | "trim_silence" | "insert_crossfade" | "pad_silence" | "no_change" | "cut_segment" | "speed_segment"; export interface EditDecision { beatId: string; sceneId?: string; editType: EditType; segmentStartMs: number; segmentEndMs: number; targetDurationMs: number; speedFactor?: number; rationale: string; confidence: number; } export interface DeadTimeCandidate { sceneId: string; startMs: number; endMs: number; gapMs: number; hasNarration: boolean; } export interface DeterministicSignals { deadTimeCandidates: DeadTimeCandidate[]; silenceSegments: { sceneId: string; startMs: number; endMs: number; }[]; durationDrift: { sceneId: string; audioDurationMs: number; videoDurationMs: number; driftMs: number; }[]; } export interface EditDecisionsData { decisions: EditDecision[]; skipped: EditDecision[]; summary: { total: number; applied: number; skipped: number; }; } /** * Generate edit proposals from alignment data. * * This produces deterministic, rule-based proposals without requiring an * LLM call. The proposals follow the same format that an LLM would produce, * making it easy to swap in LLM-powered proposals later. * * When an LLM API is available, use `generateLlmEditProposals()` instead * for more nuanced decisions (e.g., choosing freeze_frame vs pad_silence * based on visual content). */ export declare function generateEditProposals(alignment: AlignmentData, heroSceneIds?: string[]): EditDecisionsData; /** * Detect dead time segments within scenes: gaps between timing markers * that exceed a threshold with no corresponding narration coverage. */ export declare function detectDeadTime(timingData: import("./timing.js").TimingData, narrationBeats?: { sceneId: string; startMs: number; endMs: number; }[], thresholdMs?: number): DeadTimeCandidate[]; /** * Build deterministic signals for the LLM edit decision engine. */ export declare function buildDeterministicSignals(timingData: import("./timing.js").TimingData, audioDurations?: { sceneId: string; durationMs: number; }[], narrationBeats?: { sceneId: string; startMs: number; endMs: number; }[], silenceSegments?: { sceneId: string; startMs: number; endMs: number; }[]): DeterministicSignals; /** * Generate edit proposals and write to recordings/edit-decisions.json. */ export declare function generateAndWriteEditProposals(projectDir: string, heroSceneIds?: string[]): EditDecisionsData | null; //# sourceMappingURL=edit-proposals.d.ts.map