/** * Project Blueprint — the AI Animation Director "director layer" artifact. * * A project-level visual blueprint that locks the film language ABOVE the * existing execution layer ({@link ./cinematography}, {@link ./filmmaking-prompts}). * Distinct from {@link ./story-bible} (a CONTINUITY bible: cast/props/timeline) — * this is the VISUAL DIRECTION bible: visual identity, master color system, * lighting grammar, per-character blueprint (silhouette + palette + voice + * power/vulnerability/signature camera framing), environment blueprint (with the * 5-sensory-words rule), a project camera bible (dominant shots, forbidden * movements, the one rule the camera must never break), and voice/performance * world rules. * * Generation is a creative LLM task (the `ai-director` skill runs the staged * director master-prompt and emits a JSON). This module is the deterministic * half: validate the skill-authored JSON, normalize it to the canonical artifact * shape, and persist it as a managed, history-tracked artifact. The * {@link ./filmmaking-prompts} composer reads it back (graceful when absent) to * enrich every scene packet. */ import type { VideoProjectWorkspace } from './workspace.js'; import type { SensorySignature } from './shot-grammar.js'; export interface BlueprintInfluence { name: string; /** The specific visual element borrowed (not a vibe — a concrete element). */ borrowed: string; } export interface VisualIdentity { aesthetic: string; influences: BlueprintInfluence[]; texture: string; scale: string; timeOfDay: string; /** One-line "looks like X, feels like Y, lit like Z" thesis. */ thesis: string; } export interface MasterColor { name: string; where: string; emotion: string; hex?: string; } export interface ColorSystem { colors: MasterColor[]; kelvinRange: string; warmShiftMeaning: string; coolShiftMeaning: string; contrast: string; saturation: string; /** Optional grade-register id resolved by {@link gradeSpec} (e.g. teal-orange). */ gradeId?: string; } export interface SignatureLightingSetups { intimate: string; tension: string; hero: string; } export interface LightingGrammar { keyDirection: string; quality: string; shadowStrategy: string; practicals: string; signatureSetups: SignatureLightingSetups; } export interface CharacterVoice { ageGender: string; timbre: string; rhythm: string; accent: string; emotionalLeak: string; /** Two performance anchors. */ anchors: string[]; } export interface CharacterCameraLanguage { power: string; vulnerability: string; signature: string; } export interface BlueprintCharacter { name: string; role: string; visualType: string; silhouette: string; signatureDetail: string; /** Three character colors. */ palette: string[]; costume: string; communicates: string; voice: CharacterVoice; cameraLanguage: CharacterCameraLanguage; } export interface BlueprintEnvironment { name: string; type: string; emotionalFunction: string; anchors: string[]; scale: string; lightColor: string; /** The 5-sensory-words rule: 1 smell + 1 texture + 1 sound + 2 feelings. */ sensory: SensorySignature; } export interface RareShot { shot: string; when: string; } export interface ProjectCameraBible { relationship: string; whenMoves: string; whenLocked: string; /** Three dominant shot ids/labels. */ dominantShots: string[]; rareShots: RareShot[]; primaryAngles: string[]; primaryMovements: string[]; /** Movement ids/labels banned for this project — validated by the composer. */ forbiddenMovements: string[]; focalFeel: string; depthStrategy: string; /** The single rule the camera must never break. */ oneRule: string; } export interface PerformanceRules { actingStyle: string; dialogueEnergy: string; silenceUsage: string; intensityScale: string; castingPattern: string; avoid: string; } export interface OutputNotes { runtimeSeconds: number; aspectRatio: string; motionStyle: string; editingRhythm: string; /** 8–12 vibe keywords. */ vibeKeywords: string[]; } export interface ProjectBlueprintArtifact { schemaVersion: 1; projectSlug: string; generatedAt: string; source: 'ai-director'; title: string; visualIdentity: VisualIdentity; colorSystem: ColorSystem; lightingGrammar: LightingGrammar; characters: BlueprintCharacter[]; environments: BlueprintEnvironment[]; cameraBible: ProjectCameraBible; performanceRules: PerformanceRules; output: OutputNotes; } export interface ValidateBlueprintOptions { projectSlug: string; generatedAt?: string; } /** * Validate + normalize a skill-authored blueprint JSON into the canonical * {@link ProjectBlueprintArtifact}. Lenient on sub-fields (missing strings → '') * but strict on the required top-level sections: throws a single * `invalid_flag_value` VclawError listing every missing/invalid section so the * operator can fix them all at once. Pure (apart from the injected generatedAt). */ export declare function validateProjectBlueprint(input: unknown, options: ValidateBlueprintOptions): ProjectBlueprintArtifact; /** * Read + JSON-parse a blueprint file. Throws `invalid_flag_value` on a missing * file or malformed JSON so the CLI surfaces a clear exit-1 error. */ export declare function loadBlueprintJson(path: string): Promise; /** Persist a validated blueprint as the managed, history-tracked artifact. */ export declare function writeProjectBlueprint(workspace: VideoProjectWorkspace, artifact: ProjectBlueprintArtifact): Promise; /** * Read `artifacts/project-blueprint.json`. Returns null when absent (graceful — * the composer then behaves byte-identically to today). Mirrors * {@link readEnvironmentAssets} / {@link readSeedanceAssets}. */ export declare function readProjectBlueprint(root: string, slug: string): Promise; //# sourceMappingURL=project-blueprint.d.ts.map