/** Provider-agnostic render state for one generation/scene or a whole project. */ export type RunState = 'none' | 'queued' | 'rendering' | 'done' | 'failed' | 'blocked'; /** One-word project headline used to bucket the overview. */ export type ProjectHeadline = 'rendering' | 'awaiting-review' | 'delivered' | 'blocked' | 'idle'; /** Candidate status as written on disk (src/video/types.ts SceneCandidateStatus). */ export type CandidateStatus = 'pending' | 'completed' | 'failed' | 'cancelled'; export interface GenerationState { sceneIndex: number; state: RunState; externalJobId: string | null; hasVideo: boolean; } export interface RunCounts { total: number; done: number; rendering: number; failed: number; queued: number; } export interface ProjectRunState { slug: string; workspaceRoot: string; routeId: string | null; headline: ProjectHeadline; scenes: GenerationState[]; counts: RunCounts; blockers: string[]; reviewState?: 'missing' | 'current' | 'stale'; hasFinal: boolean; lastActivity: string | null; // ISO }