/** * Joey-style Seedance block emitters: Subject Lock / Frame Map / Cross-Frame / * Last Frame. Pure/deterministic — no I/O. * * WS0 binding probe (docs/design/notes/ark-reference-order-result.md) is * RESOLVED positional: per UseAPI docs + production ARK payloads (2026-05-30), * all three gateways honor reference ORDER as the `@imageN` mapping, so `@imageN` * slots are emitted as a HARD positional binding contract — the slot label is the * reference-order key, not a descriptive hint. */ import { type DetailLevel, type HazeDensity } from './cinematography.js'; /** * WS0 reference-order binding mode. Resolved to `true`: positional binding is * confirmed (UseAPI docs + production ARK payloads, 2026-05-30 — all three * gateways honor reference ORDER as the `@imageN` mapping). `@imageN` is a hard * positional reference-order contract, not guidance only. */ export declare const POSITIONAL_BINDING = true; export interface SubjectLockEntry { label: string; slot: string; } export interface FrameMapEntry { t: string; beat: string; } /** FRAME MAP — ordered beats with timecodes. */ export declare function frameMapBlock(entries: FrameMapEntry[]): string; /** SUBJECT LOCK — per-character identity binding to @imageN slots. */ export declare function subjectLockBlock(entries: SubjectLockEntry[]): string; /** CROSS-FRAME RULES — identity/geography stability across cuts. */ export declare function crossFrameBlock(): string; /** * Per-character POSITIONAL visual-descriptor line. Each subject is placed at a * frame position (Center / Left / Right / …) carrying its VISUAL DESCRIPTOR * (`entry.label`) — never a proper name. A missing descriptor falls back to a * stable "as established in the reference image" so the slot still reads. Returns * `''` for an empty list so single-subject / character-free scenes add nothing. */ export declare function buildPositionalDescriptorLine(entries: SubjectLockEntry[]): string; /** * Explicit identity-lock / no-face-morph discipline line. Reuses the standing * {@link noFaceMorphTag} rule (prompt-rules) so the "no face morphing" wording * stays canonical across surfaces. */ export declare function buildIdentityLockLine(): string; /** * Single-full-frame guard: forces the model to perform grid panels over time * instead of reproducing a 3x3 collage as a moving split-screen. Shared between * the grid-bearing packet variants and the opt-in text-discipline path so every * multi-reference packet can carry the same guard text. * See multi-shot-framework Anti-patterns ("Grid leakage"). */ export declare const SINGLE_FULL_FRAME_GUARD = "Output a single full-frame cinematic shot that fills the entire frame edge to edge \u2014 no 3x3 grid, no split-screen, no panel borders, no collage, no multi-panel montage, no contact sheet, no reference-card layout. The character reference sheets and storyboard grid are reference ONLY \u2014 never reproduce the multi-panel sheet, the character-sheet grid, or any panel layout in the video; read identity and motion from them and render one continuous live scene. Perform any grid panels as consecutive moments over time, never as one image."; /** * LAST FRAME — closing composition ONLY. * * Text suppression deliberately does NOT live here. Overlay text is decided * early in the frame, so the instruction has to sit early in the prompt: * {@link noOnScreenTextBlock} is emitted as the first directive block instead. * Restating it at the bottom bought length without buying weight, and left the * only copy of the rule below every block competing for attention. */ export declare function lastFrameBlock(closing: string): string; /** * NO ON-SCREEN TEXT — the mandatory first directive block. * * Deliberately carries NO exception clause. An "other than…" carve-out for * in-world signage reopens the door and the model renders captions again; * physical text that genuinely exists in a scene is described elsewhere as an * object (shape, colour, placement), never as an exception here. Weighs * heaviest on phone / selfie / talking-head packets, which pull captions * straight from social training data. */ export declare function noOnScreenTextBlock(): string; /** Capture family for {@link captureCadenceBlock}. */ export type CaptureRegisterKind = 'cinema' | 'phone'; export interface CaptureCadenceOpts { /** * Move the stepped/stuttering quality onto the LIGHT and off the footage. * Required whenever the scene strobes: without it the model reads "stepped" * as an instruction about the capture and returns genuinely broken frames. */ strobeQuarantine?: boolean; } /** * CAPTURE CADENCE (cinema) / CAPTURE FORMAT (phone) — the anti-artifact block. * * Emitted SECOND, immediately after the text block, before anything else * competes for attention. The negation run is held at every detail level on * purpose: it is the part that suppresses interpolation judder, and dropping * items brings the corresponding artifact straight back, so only the * descriptive prose scales with `d`. */ export declare function captureCadenceBlock(register: CaptureRegisterKind, d: DetailLevel, opts?: CaptureCadenceOpts): string; /** Haze density for {@link atmosphereBlock}; `'none'` emits the clean-air lock. */ export type AtmosphereDensity = HazeDensity | 'none'; /** * ATMOSPHERE — depth separation, never mood. * * Haze is the most drift-prone element in the grammar, so it gets its own * block with a complete negation battery rather than a clause inside CAPTURE * REALISM. Like the cadence run, the battery is held at every detail level: * each dropped item is one artifact allowed back in. `planes` should name the * actual planes of the actual shot, nearest to furthest — a generic haze line * reads as mood and drifts toward fog. */ export declare function atmosphereBlock(density: AtmosphereDensity, planes: string[], d: DetailLevel): string; //# sourceMappingURL=seedance-blocks.d.ts.map