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 { /** 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'; } 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; //# sourceMappingURL=workspace.d.ts.map