/** * Motion-overlay shared type contract. * * This is the binding contract for the whole `motion-overlay/` module family. * Every pure module (slice, analyze-reel, motion-style, compose-prompt, plan) * and every side-effect module (transcribe, ingest, write, preview, execute, * avatar-host) speaks these types. Keep it in lockstep with * `schemas/video/artifacts/motion-overlay-plan.schema.json` and the design/plan * specs under `docs/design/specs/`. */ export type MotionLayout = 'split' | 'overlay' | 'motion-only' | 'avatar-host'; export type MotionStyleId = 'apple-clean' | 'editorial-dark' | 'knowledge-tool'; export type ReelAnatomy = 'hook' | 'contextualize' | 'burst' | 'breath' | 'cta'; export interface TranscriptSegment { start: number; end: number; text: string; } export interface Transcript { language: string; segments: TranscriptSegment[]; } export interface TakeSplit { index: number; start: number; end: number; segmentIndices: number[]; } export type AnchorKind = 'number' | 'verb' | 'entity' | 'keyword'; export interface AnchorWord { word: string; kind: AnchorKind; relativeTime: number; } export interface TakePause { start: number; end: number; } export interface TakeAnalysis { index: number; anatomy: ReelAnatomy; anchorWords: AnchorWord[]; pauses: TakePause[]; } export interface ResolvedStyle { id: MotionStyleId; accent: string; visualBlock: string; motionBlock: string; } export interface FrameObservations { speakerSide?: 'left' | 'right' | 'center'; notes: string[]; } export interface MotionTake { index: number; start: number; end: number; durationSeconds: number; file: string; promptFile: string; anatomy: ReelAnatomy; prompt: string; } export interface MotionOverlayPlan { schemaVersion: 1; input: { path: string; durationSeconds: number; width: number; height: number; aspect: '16:9' | '9:16' | '1:1' | string; }; layout: MotionLayout; style: MotionStyleId; accent: string; language: string; workdir: string; takes: MotionTake[]; generatedAt?: string; } //# sourceMappingURL=types.d.ts.map