/** * Shared types for the `vclaw video assemble` post-execution stage. * * Sub-slice 3a establishes only the structural surface. The actual * TTS / PDF / title-card / slide-animation / music / stitch logic lands * in sub-slices 3b–3h. No video/audio I/O lives here yet. */ import type { VideoProjectWorkspace } from '../workspace.js'; import type { AssembleMediaQcReport } from './media-qc.js'; export interface AssembleInput { workspace: VideoProjectWorkspace; /** Path to the brand-profile.json for the active presenter (Slice 2 output). */ brandProfilePath?: string; /** Optional override of FFmpeg path. Defaults to `ffmpeg` on PATH. */ ffmpegBin?: string; /** Dry run produces the report but skips actual generation. */ dryRun?: boolean; /** * Clip-stitch mode. When set, the body segments are the per-scene rendered * clips `vclaw video execute` downloads to `outputs/scene-.mp4` (NOT * animated slides). Each clip's native audio (incl. omni-flash voice) is * kept; the background-music bed is the only optional extra layer; no TTS * narration and no dialogue/sfx auto-layers are added. */ fromRenderedClips?: boolean; } export interface AssembleManifestEntry { kind: 'narration' | 'music' | 'title-card' | 'slide-animation' | 'rendered-clip' | 'final-video'; path: string; durationMs: number; sceneIndex?: number; sizeBytes: number; generator: string; } export interface AssembleResult { status: 'complete' | 'partial' | 'dry-run'; outputPath: string; manifest: AssembleManifestEntry[]; events: string[]; warnings: string[]; qc?: AssembleMediaQcReport; }