import type { VideoPipelineManifest, VideoProductionMode } from './types.js'; import type { ProviderRouteId } from './provider-platform/types.js'; export interface VideoProjectWorkspace { root: string; slug: string; projectDir: string; artifactsDir: string; artifactsHistoryDir: string; checkpointsDir: string; charactersDir: string; charactersPath: string; eventsDir: string; eventsPath: string; stateDir: string; manifestPath: string; } /** * Project-level cinematic look profile. Persisted on the manifest so a project * carries its default cinematography register across every `vclaw` invocation * (Joey 2.0: "photorealism is the universal default, dial down by exception"). * Every field is optional and backward-compatible — an absent block resolves to * the HARD DEFAULT in {@link ../video/cinema-profile.resolveCinemaProfile}. */ export interface VideoCinemaProfile { /** Persist the reference workflow so later commands inherit its review gates. */ referenceProfile?: 'legacy' | 'cinematic-face-first'; /** Cinematography language density. Default (resolved) `'rich'`. */ detail?: 'terse' | 'standard' | 'rich'; /** Whether the anti-plastic capture-realism block is emitted. Default `true`. */ realism?: boolean; /** Prose (behaviour) vs numeric (Kelvin/°/ratio) cinematography register. Default `'prose'`. */ register?: 'prose' | 'numeric'; /** Volumetric-haze density for the realism block. Default `'light'`. */ haze?: 'thin' | 'light' | 'heavy'; /** Emit the moisture-matte clause in the realism block. Default off. */ wet?: boolean; /** Lighting register id (see cinematography `lightingSpec`/`lightingProse`). */ lightingId?: string; /** Color-grade register id (see cinematography `gradeSpec`/`gradeProse`). */ gradeId?: string; /** Backdrop plate kind. Default `'mid-gray'`. */ plateKind?: 'mid-gray' | 'white' | 'black'; /** Cinema (film hardware) vs phone (UGC smartphone) capture register. */ captureRegister?: 'cinema' | 'phone'; /** * Energy dial — how hot the camera runs. Binds cant range, camera * physicality, and frame stillness together so they cannot disagree. * Undefined leaves the camera-body clause off entirely (byte-identical). */ dynamicRegister?: 'composed' | 'elevated' | 'kinetic' | 'violent'; /** * Strobe pulse in BPM. Setting it emits THE STROBE block AND forces the * cadence quarantine — the two are coupled in code rather than left to the * operator to remember, because a strobe without the quarantine returns * genuinely broken footage. */ strobeBpm?: number; } export interface VideoProjectManifest { slug: string; productionMode: VideoProductionMode; createdAt: string; updatedAt: string; pipeline: VideoPipelineManifest; owner?: string | null; priority?: 'low' | 'medium' | 'high' | 'critical' | null; dueDate?: string | null; tags?: string[]; blockedBy?: string[]; blockedReason?: string | null; currentStage?: string | null; lastCompletedStage?: string | null; lastCheckpointStatus?: string | null; /** Optional project-level cinematic look profile (backward-compatible). */ cinemaProfile?: VideoCinemaProfile; /** * Optional project-relative path to the selected soundtrack audio file. * Written by `vclaw video soundtrack --select ` and read by the * preview portal's soundtrack discovery (preview-portal/discovery.ts). */ soundtrack?: string | null; /** * Optional project-level provider-route preference: an ordered list of route * ids that overrides the built-in per-mode default ordering when the * execution plan picks a route. Routes not listed here still apply as * fallback (appended after the preferred ones), so a partial preference is * safe. Each entry must be a known `ProviderRouteId` — `buildExecutionPlan` * rejects unknown ids at plan time (free, before any submit). Absent/empty = * byte-identical to the built-in defaults. */ routePreference?: ProviderRouteId[] | null; /** * Opt-OUT of the standing per-scene render rules (the no-speech / * natural-motion / nothing-appears block `buildExecutionPayload` bakes into * every scene's animation prompt). Defaults to enabled when ABSENT — set to * `false` to suppress the injection for a project (the env kill-switch * `VCLAW_DISABLE_STANDING_RULES=1` is the per-invocation equivalent). When * disabled the per-scene prompt is byte-identical to the legacy output. */ standingRenderRules?: boolean; } export declare function resolveProjectWorkspace(slug: string, root?: string): VideoProjectWorkspace; export declare function ensureProjectWorkspace(slug: string, root?: string): Promise; export declare function writeProjectManifest(workspace: VideoProjectWorkspace, manifest: VideoProjectManifest): Promise; export declare function readProjectManifest(workspace: VideoProjectWorkspace): Promise; export declare function updateProjectManifestState(workspace: VideoProjectWorkspace, input: { updatedAt?: string; currentStage?: string | null; lastCompletedStage?: string | null; lastCheckpointStatus?: string | null; }): Promise; export declare function updateProjectManifestMetadata(workspace: VideoProjectWorkspace, input: { updatedAt?: string; owner?: string | null; priority?: 'low' | 'medium' | 'high' | 'critical' | null; dueDate?: string | null; tags?: string[]; blockedBy?: string[]; blockedReason?: string | null; }): Promise; /** * Set (or clear) the project manifest's `soundtrack` field — the project-relative * path to the human-selected soundtrack audio that the preview portal renders. * Pass `null` to clear it. */ export declare function updateProjectManifestSoundtrack(workspace: VideoProjectWorkspace, soundtrack: string | null, updatedAt?: string): Promise; /** * Merge a partial {@link VideoCinemaProfile} into the project manifest's * `cinemaProfile` block. Only the provided fields are written; absent fields are * preserved from any existing block. Mirrors {@link updateProjectManifestMetadata}. */ export declare function updateProjectManifestCinemaProfile(workspace: VideoProjectWorkspace, patch: VideoCinemaProfile, updatedAt?: string): Promise; /** * Set the project manifest's `routePreference` — the head of the render route * ladder that `buildRenderRouteLadder` resolves in `execution-plan`. * * The field was READ by the planner and written by nothing: no CLI flag, no * mutator. So a caller that had already resolved a route (`mograph-render * --execute` takes `--route`) had no way to hand it to the produce chain, and * produce silently resolved its own — sending a run asked for on `veo-useapi` * to `seedance-direct` instead. Replaces rather than merges: a route preference * is an ordered ladder, and merging two ladders yields neither. */ export declare function updateProjectManifestRoutePreference(workspace: VideoProjectWorkspace, routePreference: ProviderRouteId[], updatedAt?: string): Promise; //# sourceMappingURL=workspace.d.ts.map