/** * Motion pack — one per video: coverage map + action-only blocks. This module * is the anti-drift gate: lint (style words stay OUT of actions), stats * (counts + cost tiers for the review gate), and prompt assembly (style lock + * SHOT + AVOID stacked by code, never by hand). * * Pure/deterministic — the CLI handler does the I/O. */ import type { MographLintResult, MographPriority, MotionPackArtifact, MotionPackBlock, MotionSheetArtifact } from './types.js'; export declare const ACTION_TARGET_WORDS = 90; export declare const ACTION_FAIL_WORDS = 120; export declare const TEXT_STRING_MAX_WORDS = 4; export declare const TEXT_STRINGS_MAX = 2; /** * A sheet on the `film` style-lock budget is refused once the pack has more * blocks than this: the 320-word lock is paid once per block, and the cost * argument that sizes the fleet budget at 120 words is a function of block * count, so the gate keys on block count, not on the word count. */ export declare const FILM_BUDGET_MAX_BLOCKS = 4; export declare function packPathFor(root: string, slug: string): string; export declare function readMotionPack(root: string, slug: string): Promise; export declare function writeMotionPack(root: string, slug: string, pack: MotionPackArtifact): Promise; /** Parse "mm:ss" or "h:mm:ss" (also plain seconds) into seconds. */ export declare function parseTimecode(value: string): number; export declare function formatTimecode(totalSec: number): string; /** * How many copy-bearing components the action builds WITHOUT giving them words. * Pure, and 0 whenever the action declares its spares blank. * * Counts per sentence so a count word only applies to the component it governs: * "Three image cards with label bars" is three slots, while a later "A caption * strip" in the next sentence is one. */ export declare function countUnspecifiedTextSlots(action: string, quotedCount: number): number; /** * Lint a motion pack (optionally against its sheet). Errors block rendering; * warnings are advisory. The rules encode the drift lessons: style lives in * the sheet, actions are choreography, sfx cues are sound design (they go to * the post mix, not to the model), text is quoted. */ export declare function lintMotionPack(pack: MotionPackArtifact, sheet?: MotionSheetArtifact | null): MographLintResult; export interface MographPackStats { blockCount: number; byPriority: Record; byMode: Record; v2vCount: number; loopCount: number; /** Clip counts per render scope. */ scopes: { p1: number; p1p2: number; all: number; }; /** Estimated USD per scope; null when the per-clip cost is unknown. */ estCostUsd: { p1: number | null; p1p2: number | null; all: number | null; }; } export declare function motionPackStats(pack: MotionPackArtifact, costPerClipUsd?: number | null): MographPackStats; export interface AssembleBlockPromptOptions { /** The pack aspect; `9:16` appends the SAFE ZONES line. Omitted = no line (legacy). */ aspect?: string; } /** * Assemble the exact prompt a block submits: style lock + (HERO) + SHOT + * (LOOP) + (SAFE ZONES) + AVOID. Code stacks these — hand-assembly * (and hand-paraphrase of the style lock) is how packs drift. The HERO line * is how a split film restates its subject and identity anchor above every * segment without the author re-typing it into the action. */ export declare function assembleBlockPrompt(block: MotionPackBlock, sheet: MotionSheetArtifact, options?: AssembleBlockPromptOptions): string; /** Reference images for a block: sheet ref first, then pack-wide logos, then per-block refs. */ export declare function blockReferencePaths(block: MotionPackBlock, pack: MotionPackArtifact, sheet: MotionSheetArtifact): string[]; export declare function filterBlocks(pack: MotionPackArtifact, opts?: { priority?: MographPriority; blockIds?: string[]; }): MotionPackBlock[]; //# sourceMappingURL=pack.d.ts.map