venice-video-harness 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +598 -0
  4. package/dist/assembly/manifest-builder.d.ts +8 -0
  5. package/dist/assembly/manifest-builder.d.ts.map +1 -0
  6. package/dist/assembly/manifest-builder.js +196 -0
  7. package/dist/assembly/manifest-builder.js.map +1 -0
  8. package/dist/assembly/remotion-scaffold.d.ts +14 -0
  9. package/dist/assembly/remotion-scaffold.d.ts.map +1 -0
  10. package/dist/assembly/remotion-scaffold.js +292 -0
  11. package/dist/assembly/remotion-scaffold.js.map +1 -0
  12. package/dist/assembly/types.d.ts +67 -0
  13. package/dist/assembly/types.d.ts.map +1 -0
  14. package/dist/assembly/types.js +5 -0
  15. package/dist/assembly/types.js.map +1 -0
  16. package/dist/characters/describer.d.ts +32 -0
  17. package/dist/characters/describer.d.ts.map +1 -0
  18. package/dist/characters/describer.js +309 -0
  19. package/dist/characters/describer.js.map +1 -0
  20. package/dist/characters/extractor.d.ts +27 -0
  21. package/dist/characters/extractor.d.ts.map +1 -0
  22. package/dist/characters/extractor.js +274 -0
  23. package/dist/characters/extractor.js.map +1 -0
  24. package/dist/characters/reference-manager.d.ts +95 -0
  25. package/dist/characters/reference-manager.d.ts.map +1 -0
  26. package/dist/characters/reference-manager.js +346 -0
  27. package/dist/characters/reference-manager.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +310 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/config.d.ts +22 -0
  33. package/dist/config.d.ts.map +1 -0
  34. package/dist/config.js +66 -0
  35. package/dist/config.js.map +1 -0
  36. package/dist/editing/aligner.d.ts +44 -0
  37. package/dist/editing/aligner.d.ts.map +1 -0
  38. package/dist/editing/aligner.js +201 -0
  39. package/dist/editing/aligner.js.map +1 -0
  40. package/dist/editing/edl.d.ts +45 -0
  41. package/dist/editing/edl.d.ts.map +1 -0
  42. package/dist/editing/edl.js +133 -0
  43. package/dist/editing/edl.js.map +1 -0
  44. package/dist/editing/overlays.d.ts +97 -0
  45. package/dist/editing/overlays.d.ts.map +1 -0
  46. package/dist/editing/overlays.js +41 -0
  47. package/dist/editing/overlays.js.map +1 -0
  48. package/dist/editing/packer.d.ts +52 -0
  49. package/dist/editing/packer.d.ts.map +1 -0
  50. package/dist/editing/packer.js +170 -0
  51. package/dist/editing/packer.js.map +1 -0
  52. package/dist/editing/providers/whisper-cpp.d.ts +32 -0
  53. package/dist/editing/providers/whisper-cpp.d.ts.map +1 -0
  54. package/dist/editing/providers/whisper-cpp.js +239 -0
  55. package/dist/editing/providers/whisper-cpp.js.map +1 -0
  56. package/dist/editing/render.d.ts +36 -0
  57. package/dist/editing/render.d.ts.map +1 -0
  58. package/dist/editing/render.js +227 -0
  59. package/dist/editing/render.js.map +1 -0
  60. package/dist/editing/self-eval.d.ts +48 -0
  61. package/dist/editing/self-eval.d.ts.map +1 -0
  62. package/dist/editing/self-eval.js +293 -0
  63. package/dist/editing/self-eval.js.map +1 -0
  64. package/dist/editing/silence.d.ts +76 -0
  65. package/dist/editing/silence.d.ts.map +1 -0
  66. package/dist/editing/silence.js +189 -0
  67. package/dist/editing/silence.js.map +1 -0
  68. package/dist/editing/types.d.ts +178 -0
  69. package/dist/editing/types.d.ts.map +1 -0
  70. package/dist/editing/types.js +13 -0
  71. package/dist/editing/types.js.map +1 -0
  72. package/dist/index.d.ts +6 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +5 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/interactive.d.ts +12 -0
  77. package/dist/interactive.d.ts.map +1 -0
  78. package/dist/interactive.js +78 -0
  79. package/dist/interactive.js.map +1 -0
  80. package/dist/mini-drama/assembler.d.ts +61 -0
  81. package/dist/mini-drama/assembler.d.ts.map +1 -0
  82. package/dist/mini-drama/assembler.js +466 -0
  83. package/dist/mini-drama/assembler.js.map +1 -0
  84. package/dist/mini-drama/audio-mix.d.ts +65 -0
  85. package/dist/mini-drama/audio-mix.d.ts.map +1 -0
  86. package/dist/mini-drama/audio-mix.js +118 -0
  87. package/dist/mini-drama/audio-mix.js.map +1 -0
  88. package/dist/mini-drama/cli.d.ts +3 -0
  89. package/dist/mini-drama/cli.d.ts.map +1 -0
  90. package/dist/mini-drama/cli.js +2869 -0
  91. package/dist/mini-drama/cli.js.map +1 -0
  92. package/dist/mini-drama/fcpxml-export.d.ts +2 -0
  93. package/dist/mini-drama/fcpxml-export.d.ts.map +1 -0
  94. package/dist/mini-drama/fcpxml-export.js +5 -0
  95. package/dist/mini-drama/fcpxml-export.js.map +1 -0
  96. package/dist/mini-drama/generation-planner.d.ts +24 -0
  97. package/dist/mini-drama/generation-planner.d.ts.map +1 -0
  98. package/dist/mini-drama/generation-planner.js +304 -0
  99. package/dist/mini-drama/generation-planner.js.map +1 -0
  100. package/dist/mini-drama/location-generator.d.ts +23 -0
  101. package/dist/mini-drama/location-generator.d.ts.map +1 -0
  102. package/dist/mini-drama/location-generator.js +144 -0
  103. package/dist/mini-drama/location-generator.js.map +1 -0
  104. package/dist/mini-drama/music-cues.d.ts +96 -0
  105. package/dist/mini-drama/music-cues.d.ts.map +1 -0
  106. package/dist/mini-drama/music-cues.js +332 -0
  107. package/dist/mini-drama/music-cues.js.map +1 -0
  108. package/dist/mini-drama/panel-fixer.d.ts +12 -0
  109. package/dist/mini-drama/panel-fixer.d.ts.map +1 -0
  110. package/dist/mini-drama/panel-fixer.js +319 -0
  111. package/dist/mini-drama/panel-fixer.js.map +1 -0
  112. package/dist/mini-drama/prompt-builder.d.ts +149 -0
  113. package/dist/mini-drama/prompt-builder.d.ts.map +1 -0
  114. package/dist/mini-drama/prompt-builder.js +722 -0
  115. package/dist/mini-drama/prompt-builder.js.map +1 -0
  116. package/dist/mini-drama/reference-slots.d.ts +31 -0
  117. package/dist/mini-drama/reference-slots.d.ts.map +1 -0
  118. package/dist/mini-drama/reference-slots.js +161 -0
  119. package/dist/mini-drama/reference-slots.js.map +1 -0
  120. package/dist/mini-drama/shot-paths.d.ts +77 -0
  121. package/dist/mini-drama/shot-paths.d.ts.map +1 -0
  122. package/dist/mini-drama/shot-paths.js +101 -0
  123. package/dist/mini-drama/shot-paths.js.map +1 -0
  124. package/dist/mini-drama/storyboard-reference-generator.d.ts +47 -0
  125. package/dist/mini-drama/storyboard-reference-generator.d.ts.map +1 -0
  126. package/dist/mini-drama/storyboard-reference-generator.js +293 -0
  127. package/dist/mini-drama/storyboard-reference-generator.js.map +1 -0
  128. package/dist/mini-drama/subtitle-generator.d.ts +12 -0
  129. package/dist/mini-drama/subtitle-generator.d.ts.map +1 -0
  130. package/dist/mini-drama/subtitle-generator.js +139 -0
  131. package/dist/mini-drama/subtitle-generator.js.map +1 -0
  132. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts +3 -0
  133. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts.map +1 -0
  134. package/dist/mini-drama/timeline-export/davinci-fcpxml.js +150 -0
  135. package/dist/mini-drama/timeline-export/davinci-fcpxml.js.map +1 -0
  136. package/dist/mini-drama/timeline-export/fcpxml.d.ts +11 -0
  137. package/dist/mini-drama/timeline-export/fcpxml.d.ts.map +1 -0
  138. package/dist/mini-drama/timeline-export/fcpxml.js +140 -0
  139. package/dist/mini-drama/timeline-export/fcpxml.js.map +1 -0
  140. package/dist/mini-drama/timeline-export/index.d.ts +13 -0
  141. package/dist/mini-drama/timeline-export/index.d.ts.map +1 -0
  142. package/dist/mini-drama/timeline-export/index.js +26 -0
  143. package/dist/mini-drama/timeline-export/index.js.map +1 -0
  144. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts +3 -0
  145. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts.map +1 -0
  146. package/dist/mini-drama/timeline-export/premiere-xmeml.js +211 -0
  147. package/dist/mini-drama/timeline-export/premiere-xmeml.js.map +1 -0
  148. package/dist/mini-drama/timeline-export/probe.d.ts +53 -0
  149. package/dist/mini-drama/timeline-export/probe.d.ts.map +1 -0
  150. package/dist/mini-drama/timeline-export/probe.js +89 -0
  151. package/dist/mini-drama/timeline-export/probe.js.map +1 -0
  152. package/dist/mini-drama/timeline-export/types.d.ts +57 -0
  153. package/dist/mini-drama/timeline-export/types.d.ts.map +1 -0
  154. package/dist/mini-drama/timeline-export/types.js +14 -0
  155. package/dist/mini-drama/timeline-export/types.js.map +1 -0
  156. package/dist/mini-drama/video-generator.d.ts +22 -0
  157. package/dist/mini-drama/video-generator.d.ts.map +1 -0
  158. package/dist/mini-drama/video-generator.js +1305 -0
  159. package/dist/mini-drama/video-generator.js.map +1 -0
  160. package/dist/mini-drama/voice-reference.d.ts +42 -0
  161. package/dist/mini-drama/voice-reference.d.ts.map +1 -0
  162. package/dist/mini-drama/voice-reference.js +170 -0
  163. package/dist/mini-drama/voice-reference.js.map +1 -0
  164. package/dist/output/html-renderer.d.ts +2 -0
  165. package/dist/output/html-renderer.d.ts.map +1 -0
  166. package/dist/output/html-renderer.js +37 -0
  167. package/dist/output/html-renderer.js.map +1 -0
  168. package/dist/parsers/fountain-parser.d.ts +34 -0
  169. package/dist/parsers/fountain-parser.d.ts.map +1 -0
  170. package/dist/parsers/fountain-parser.js +71 -0
  171. package/dist/parsers/fountain-parser.js.map +1 -0
  172. package/dist/parsers/pdf-parser.d.ts +24 -0
  173. package/dist/parsers/pdf-parser.d.ts.map +1 -0
  174. package/dist/parsers/pdf-parser.js +237 -0
  175. package/dist/parsers/pdf-parser.js.map +1 -0
  176. package/dist/parsers/scene-extractor.d.ts +41 -0
  177. package/dist/parsers/scene-extractor.d.ts.map +1 -0
  178. package/dist/parsers/scene-extractor.js +400 -0
  179. package/dist/parsers/scene-extractor.js.map +1 -0
  180. package/dist/series/manager.d.ts +64 -0
  181. package/dist/series/manager.d.ts.map +1 -0
  182. package/dist/series/manager.js +282 -0
  183. package/dist/series/manager.js.map +1 -0
  184. package/dist/series/types.d.ts +641 -0
  185. package/dist/series/types.d.ts.map +1 -0
  186. package/dist/series/types.js +304 -0
  187. package/dist/series/types.js.map +1 -0
  188. package/dist/storyboard/assembler.d.ts +134 -0
  189. package/dist/storyboard/assembler.d.ts.map +1 -0
  190. package/dist/storyboard/assembler.js +319 -0
  191. package/dist/storyboard/assembler.js.map +1 -0
  192. package/dist/storyboard/prompt-builder.d.ts +113 -0
  193. package/dist/storyboard/prompt-builder.d.ts.map +1 -0
  194. package/dist/storyboard/prompt-builder.js +578 -0
  195. package/dist/storyboard/prompt-builder.js.map +1 -0
  196. package/dist/storyboard/shot-planner.d.ts +34 -0
  197. package/dist/storyboard/shot-planner.d.ts.map +1 -0
  198. package/dist/storyboard/shot-planner.js +446 -0
  199. package/dist/storyboard/shot-planner.js.map +1 -0
  200. package/dist/user-config.d.ts +15 -0
  201. package/dist/user-config.d.ts.map +1 -0
  202. package/dist/user-config.js +103 -0
  203. package/dist/user-config.js.map +1 -0
  204. package/dist/venice/audio-preflight.d.ts +80 -0
  205. package/dist/venice/audio-preflight.d.ts.map +1 -0
  206. package/dist/venice/audio-preflight.js +142 -0
  207. package/dist/venice/audio-preflight.js.map +1 -0
  208. package/dist/venice/audio.d.ts +88 -0
  209. package/dist/venice/audio.d.ts.map +1 -0
  210. package/dist/venice/audio.js +234 -0
  211. package/dist/venice/audio.js.map +1 -0
  212. package/dist/venice/client.d.ts +86 -0
  213. package/dist/venice/client.d.ts.map +1 -0
  214. package/dist/venice/client.js +375 -0
  215. package/dist/venice/client.js.map +1 -0
  216. package/dist/venice/edit.d.ts +57 -0
  217. package/dist/venice/edit.d.ts.map +1 -0
  218. package/dist/venice/edit.js +100 -0
  219. package/dist/venice/edit.js.map +1 -0
  220. package/dist/venice/generate.d.ts +47 -0
  221. package/dist/venice/generate.d.ts.map +1 -0
  222. package/dist/venice/generate.js +150 -0
  223. package/dist/venice/generate.js.map +1 -0
  224. package/dist/venice/image-bytes.d.ts +26 -0
  225. package/dist/venice/image-bytes.d.ts.map +1 -0
  226. package/dist/venice/image-bytes.js +101 -0
  227. package/dist/venice/image-bytes.js.map +1 -0
  228. package/dist/venice/models.d.ts +143 -0
  229. package/dist/venice/models.d.ts.map +1 -0
  230. package/dist/venice/models.js +984 -0
  231. package/dist/venice/models.js.map +1 -0
  232. package/dist/venice/multi-edit.d.ts +40 -0
  233. package/dist/venice/multi-edit.d.ts.map +1 -0
  234. package/dist/venice/multi-edit.js +97 -0
  235. package/dist/venice/multi-edit.js.map +1 -0
  236. package/dist/venice/provenance.d.ts +66 -0
  237. package/dist/venice/provenance.d.ts.map +1 -0
  238. package/dist/venice/provenance.js +151 -0
  239. package/dist/venice/provenance.js.map +1 -0
  240. package/dist/venice/recipe.d.ts +69 -0
  241. package/dist/venice/recipe.d.ts.map +1 -0
  242. package/dist/venice/recipe.js +103 -0
  243. package/dist/venice/recipe.js.map +1 -0
  244. package/dist/venice/rejection.d.ts +63 -0
  245. package/dist/venice/rejection.d.ts.map +1 -0
  246. package/dist/venice/rejection.js +111 -0
  247. package/dist/venice/rejection.js.map +1 -0
  248. package/dist/venice/seedance-preflight.d.ts +38 -0
  249. package/dist/venice/seedance-preflight.d.ts.map +1 -0
  250. package/dist/venice/seedance-preflight.js +29 -0
  251. package/dist/venice/seedance-preflight.js.map +1 -0
  252. package/dist/venice/types.d.ts +212 -0
  253. package/dist/venice/types.d.ts.map +1 -0
  254. package/dist/venice/types.js +9 -0
  255. package/dist/venice/types.js.map +1 -0
  256. package/dist/venice/video.d.ts +77 -0
  257. package/dist/venice/video.d.ts.map +1 -0
  258. package/dist/venice/video.js +163 -0
  259. package/dist/venice/video.js.map +1 -0
  260. package/dist/venice/voices.d.ts +40 -0
  261. package/dist/venice/voices.d.ts.map +1 -0
  262. package/dist/venice/voices.js +194 -0
  263. package/dist/venice/voices.js.map +1 -0
  264. package/package.json +79 -0
@@ -0,0 +1,641 @@
1
+ import type { AestheticProfile } from '../storyboard/prompt-builder.js';
2
+ export interface SeriesState {
3
+ name: string;
4
+ slug: string;
5
+ concept: string;
6
+ genre: string;
7
+ setting: string;
8
+ projectType?: 'film' | 'series' | 'product-video' | 'music-video' | 'screenplay';
9
+ aesthetic: AestheticProfile | null;
10
+ aestheticSeed?: number;
11
+ characters: Character[];
12
+ /** First-class location entities with generated reference images. */
13
+ locations?: Location[];
14
+ episodes: EpisodeMeta[];
15
+ videoDefaults: VideoModelDefaults;
16
+ storyboardAspectRatio?: '16:9' | '9:16' | '1:1';
17
+ outputDir: string;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ }
21
+ export interface VideoModelDefaults {
22
+ actionModel: string;
23
+ atmosphereModel: string;
24
+ characterConsistencyModel?: string;
25
+ /**
26
+ * Paired image-generation defaults. When the video family is Seedance 2.0,
27
+ * Venice blocks requests that include images produced by any other family,
28
+ * so the image defaults must match the video family.
29
+ */
30
+ imageDefaults?: ImageModelDefaults;
31
+ /**
32
+ * Strategy when an incompatible (non-seedream) image is about to be sent
33
+ * to a Seedance model. Defaults to `prompt` in interactive shells and
34
+ * `fallback` in non-TTY environments.
35
+ */
36
+ seedanceCompatibility?: SeedanceCompatibilityMode;
37
+ /**
38
+ * Default lip-sync model for dialogue shots whose character is a
39
+ * non-narrator with a visible face. Defaults to `wan-2-7-image-to-video`.
40
+ * The planner only routes to this model when `shot.motion !== 'high'`;
41
+ * high-motion dialogue stays on the R2V model for identity preservation.
42
+ */
43
+ lipSyncModel?: string;
44
+ /**
45
+ * Auto-keyframe Wan 2.7 i2v from a Seedance R2V render instead of the
46
+ * panel image. Wan 2.7 has no `reference_image_urls` capability; its
47
+ * only identity anchor is the single `image_url` keyframe. A panel-derived
48
+ * keyframe drifts mid-clip because the panel was generated without strong
49
+ * character anchoring. When this flag is true (the default), every shot
50
+ * routed to the lip-sync model first renders a quick Seedance R2V pass
51
+ * (no audio, all character refs), extracts frame 1, and uses that frame
52
+ * as the Wan 2.7 keyframe — locking identity from frame 0 + adding
53
+ * lip-sync from the dialogue MP3. Doubles per-shot cost (~$0.85 total).
54
+ * Skip per-shot with `ShotScript.disableSeedanceKeyframe = true`.
55
+ *
56
+ * See AGENTS.md rule 32 for the underlying motivation.
57
+ */
58
+ seedanceKeyframeForWan?: boolean;
59
+ /**
60
+ * Operator's answer to "lip-sync mode or native model voices?" from the
61
+ * upfront questionnaire. See AudioStrategy for semantics. When unset, the
62
+ * harness uses the per-call defaults (effectively 'native'). Setting this
63
+ * at series-creation time eliminates the double-narration / mouth-out-of-
64
+ * sync class of bugs we hit during the PNW field-guide episode.
65
+ */
66
+ audioStrategy?: AudioStrategy;
67
+ /**
68
+ * Operator's answer to "which video model family?" from the upfront
69
+ * questionnaire. See VideoFamilyPreference. `auto` (or unset) keeps the
70
+ * harness's Seedance 2.0 defaults. Setting this swaps the action /
71
+ * atmosphere / character-consistency model defaults to the chosen family.
72
+ */
73
+ videoFamilyPreference?: VideoFamilyPreference;
74
+ /**
75
+ * Auto-generate + attach a per-character voice-donor reference clip
76
+ * (`reference_audio_urls`, bound in-prompt as @AudioN) on dialogue shots
77
+ * that route to a reference-audio-capable model (Seedance 2.0 R2V family,
78
+ * HappyHorse 1.1 R2V). The clip locks the character's voice — timbre,
79
+ * accent, pacing — across shots so the native model dialogue doesn't drift
80
+ * take to take. Defaults to `true`. Set `false` to disable series-wide;
81
+ * `generate-videos --no-voice-reference` disables for one run. See
82
+ * AGENTS.md rule 40.
83
+ */
84
+ voiceReferenceForDialogue?: boolean;
85
+ }
86
+ export interface ImageModelDefaults {
87
+ /** Image generation model (t2i) — e.g. `seedream-v5-lite`, `nano-banana-pro`. */
88
+ generationModel: string;
89
+ /** Multi-edit model — e.g. `seedream-v5-lite-edit`, `nano-banana-pro-edit`. */
90
+ editModel: string;
91
+ /**
92
+ * Strategy for the negative-prompt builder when constructing character
93
+ * reference images and panels:
94
+ * - 'auto' — (default) infer from the series aesthetic. Aesthetics
95
+ * mentioning "photoreal", "photograph", "documentary",
96
+ * "photo", "live action", "cinematic photography" suppress
97
+ * the anti-photoreal guards; everything else keeps them.
98
+ * - 'stylized' — always inject anti-photoreal guards (photorealistic,
99
+ * photograph, photo, 3D render, Pixar). Legacy behaviour.
100
+ * - 'photoreal'— never inject anti-photoreal guards; keep only structural
101
+ * guards (deformed, watermark, text, etc.).
102
+ * - 'none' — emit an empty negative prompt; trust positives only.
103
+ * Useful for paths that have already hand-tuned a negative
104
+ * via `negativePromptOverride`.
105
+ */
106
+ negativePromptStrategy?: 'auto' | 'stylized' | 'photoreal' | 'none';
107
+ }
108
+ export type SeedanceCompatibilityMode = 'prompt' | 'fallback' | 'launder';
109
+ /**
110
+ * How dialogue reaches the final mix.
111
+ *
112
+ * - 'native' — the video model speaks the dialogue in-frame. Best when
113
+ * characters speak only once or twice, the model's voice
114
+ * range suffices, and you don't need precise control.
115
+ * `assemble-episode` keeps `dialogueReplace: false`.
116
+ * - 'lip-sync' — Venice TTS renders each dialogue line, Wan 2.7 i2v
117
+ * lip-syncs the character's mouth to the audio. Best when
118
+ * a character speaks many times (so a single voice picks
119
+ * up across the episode), the user wants accent control,
120
+ * or the dialogue needs deterministic delivery.
121
+ * The planner routes face-visible low/medium-motion
122
+ * dialogue shots to `videoDefaults.lipSyncModel`.
123
+ * `assemble-episode` defaults `dialogueReplace: true`.
124
+ * - 'narrator-vo' — the speaker is a NARRATOR / voice-over only (no on-camera
125
+ * speaking mouth). Every dialogue-bearing shot is queued
126
+ * with `audio: false` so Seedance can't synthesize a
127
+ * competing narrator; Venice TTS owns the dialogue lane.
128
+ * `assemble-episode` defaults `dialogueReplace: true` and
129
+ * `nativeVolume: 0`. Sets `audioMix.suppressModelNarration: true`.
130
+ */
131
+ export type AudioStrategy = 'native' | 'lip-sync' | 'narrator-vo';
132
+ /**
133
+ * Operator's preferred video model family for action / atmosphere shots.
134
+ * `auto` keeps the current defaults (Seedance 2.0). Picking a family swaps
135
+ * `actionModel`, `atmosphereModel`, and `characterConsistencyModel` to that
136
+ * family's i2v / R2V variants. `lipSyncModel` stays on Wan 2.7 regardless —
137
+ * it's the only Venice model with proper lip-sync today.
138
+ *
139
+ * Family quick reference:
140
+ * - 'seedance' — Seedance 2.0 (default). Strong R2V identity anchoring,
141
+ * 4-15s native durations, mature `audio: true` support,
142
+ * strict provenance requirements (seedream face refs only).
143
+ * - 'happyhorse' — HappyHorse 1.1 (Alibaba, #1 blind-preference T2V + I2V).
144
+ * Joint single-pass video+audio, phoneme-level lip-sync in
145
+ * 7 languages, and R2V with up to 9 reference images. 3-15s
146
+ * natives, 720p/1080p. Best for talking characters and
147
+ * multilingual localization; SFW/commercial-leaning (for
148
+ * mature work prefer Seedance 2.0 or Wan 2.7). The 1.0 IDs
149
+ * remain in the registry for back-compat.
150
+ * - 'grok-imagine' — Grok Imagine i2v + R2V (R2V durations stepped at
151
+ * 5s/8s/10s only). Pick for atmosphere-rich shots or
152
+ * when the user wants Grok's signature look.
153
+ * - 'kling-o3' — Kling O3 Standard / Pro / 4K. Best for stylized /
154
+ * illustrated aesthetics. Accepts non-seedream images.
155
+ */
156
+ export type VideoFamilyPreference = 'auto' | 'seedance' | 'happyhorse' | 'grok-imagine' | 'kling-o3';
157
+ /**
158
+ * Returns the model-id triplet for a given preferred family. Used by
159
+ * `createSeries` to populate `actionModel` / `atmosphereModel` /
160
+ * `characterConsistencyModel` from the operator's questionnaire answer.
161
+ *
162
+ * `lipSyncModel` is intentionally NOT included — Wan 2.7 i2v is the only
163
+ * Venice lip-sync option today; callers should keep it at the default
164
+ * regardless of family.
165
+ */
166
+ export declare function resolveVideoFamilyDefaults(family: VideoFamilyPreference): {
167
+ actionModel: string;
168
+ atmosphereModel: string;
169
+ characterConsistencyModel: string;
170
+ };
171
+ /**
172
+ * Recommended `seedanceCompatibility` mode given an image-generation model.
173
+ * Used by `saveSeries` to auto-fill the field when the operator hasn't
174
+ * explicitly set it. The table is intentionally conservative: models known
175
+ * to produce face-bearing images Seedance will accept get `prompt` (run a
176
+ * fast preflight, but expect success); known-bad pairings get `fallback`
177
+ * (auto-switch to a Kling fallback); unknowns get `launder` (rewrite the
178
+ * image through Seedream before sending to Seedance).
179
+ */
180
+ export declare const SEEDANCE_COMPATIBILITY_BY_IMAGE_MODEL: Record<string, SeedanceCompatibilityMode>;
181
+ export declare function recommendedSeedanceCompatibility(generationModel: string | undefined): SeedanceCompatibilityMode | undefined;
182
+ export interface Character {
183
+ name: string;
184
+ gender: 'male' | 'female' | 'other';
185
+ age: string;
186
+ description: string;
187
+ fullDescription: string;
188
+ wardrobe: string;
189
+ voiceDescription: string;
190
+ voiceId?: string;
191
+ voiceName?: string;
192
+ baseTraits?: string;
193
+ /**
194
+ * Path (relative to the series output dir or absolute) to a short
195
+ * voice-donor clip used as a `reference_audio_urls` entry (bound in-prompt
196
+ * as @AudioN) so the character's voice — timbre, accent, pacing — stays
197
+ * consistent across shots on reference-audio-capable video models
198
+ * (Seedance 2.0 R2V family, HappyHorse 1.1 R2V). Generated via
199
+ * `generate-voice-reference` (default source: seed-audio-1-0 from
200
+ * `voiceDescription`) or supplied by the operator via
201
+ * `lock-character --voice-reference`. Convention:
202
+ * `characters/<slug>/voice-reference.mp3`. See AGENTS.md rule 40.
203
+ */
204
+ voiceReferencePath?: string;
205
+ /** Model that produced the voice reference (e.g. `seed-audio-1-0`), or `user-supplied`. */
206
+ voiceReferenceModel?: string;
207
+ locked: boolean;
208
+ seed: number;
209
+ }
210
+ export interface Location {
211
+ /** Display name, e.g. "Sietch Workshop". */
212
+ name: string;
213
+ /** Filesystem-safe slug; also the directory name under locations/. */
214
+ slug: string;
215
+ /** Locked prose description of the environment (drives panel + ref prompts). */
216
+ description: string;
217
+ /**
218
+ * Lighting notes carried into every panel prompt for this location so
219
+ * consecutive shots in the same place stay lit consistently (anti-pattern 7).
220
+ */
221
+ lightingNotes?: string;
222
+ /**
223
+ * Optional time-of-day / weather variants keyed by label
224
+ * (e.g. { "night": "…", "dawn": "…" }). Reserved for future per-shot
225
+ * variant selection; the base `description` is used when unset.
226
+ */
227
+ timeVariants?: Record<string, string>;
228
+ /** Deterministic seed so the reference angles stay reproducible. */
229
+ seed: number;
230
+ /** Image-generation model used for the reference angles (default nano-banana-pro). */
231
+ referenceModel?: string;
232
+ }
233
+ export interface StoryboardReference {
234
+ /** Filesystem-safe slug; also the file stem under storyboards/<episode>/. */
235
+ slug: string;
236
+ /** Prose description of the moment: who is where, doing what, with what. */
237
+ description: string;
238
+ /** Character names composed into the plate (drives face refs at gen time). */
239
+ characters: string[];
240
+ /** Location slug the moment takes place in (drives the env ref at gen time). */
241
+ location?: string;
242
+ /** Episode this beat belongs to. */
243
+ episode: number;
244
+ /** Shot numbers (or suffixed ids like "3b") this plate anchors. */
245
+ shotIds: Array<number | string>;
246
+ /** Deterministic seed for reproducible regeneration. */
247
+ seed: number;
248
+ /** Image model used to compose the plate. */
249
+ referenceModel?: string;
250
+ }
251
+ /**
252
+ * @deprecated Use Character instead. Kept for backward compatibility.
253
+ */
254
+ export type MiniDramaCharacter = Character;
255
+ export interface EpisodeMeta {
256
+ number: number;
257
+ title: string;
258
+ status: 'draft' | 'scripted' | 'storyboarded' | 'produced' | 'assembled';
259
+ }
260
+ export interface EpisodeScript {
261
+ episode: number;
262
+ title: string;
263
+ seriesName: string;
264
+ totalDuration: string;
265
+ status?: 'draft' | 'approved';
266
+ shots: ShotScript[];
267
+ /**
268
+ * First-class locations introduced by this episode's script (from
269
+ * workshop-episode). Merged into SeriesState.locations on save so their
270
+ * reference images can be generated once and reused across shots/episodes.
271
+ */
272
+ locations?: Location[];
273
+ /**
274
+ * Composed storyboard blocking plates for this episode's key beats
275
+ * (see StoryboardReference). Planned during workshop/storyboard, generated
276
+ * per beat, and referenced by shots via ShotScript.storyboardRef.
277
+ */
278
+ storyboardRefs?: StoryboardReference[];
279
+ /**
280
+ * Optional per-act music cues. When set, the assembler renders each cue
281
+ * and ffmpeg-crossfades between adjacent cues at their fade points. The
282
+ * single static music-bed path on the assembler options is kept for
283
+ * back-compat — when both are present, cues win.
284
+ */
285
+ musicCues?: MusicCueSpec[];
286
+ /**
287
+ * Audio-mix defaults for this episode. Overrides the assembler's built-in
288
+ * defaults. Optional — sensible -16 LUFS targeting is applied when omitted.
289
+ */
290
+ audioMix?: AudioMixDefaults;
291
+ }
292
+ /**
293
+ * Per-act music cue. References shot ids by **string** so that suffixed
294
+ * inserts like "3b" / "3c" can be addressed without coercion bugs. The
295
+ * assembler converts shot-id → start/end seconds via the placementMap
296
+ * built during segment iteration.
297
+ */
298
+ export interface MusicCueSpec {
299
+ /**
300
+ * Shot id at which this cue starts. Numeric shot numbers (e.g. `6`) or
301
+ * the suffixed string form (`"3b"`) are both accepted; the assembler
302
+ * normalizes via the same path builder it uses for dialogue placement.
303
+ */
304
+ startShot: number | string;
305
+ /** Shot id at which this cue ends (inclusive). */
306
+ endShot: number | string;
307
+ /** Prompt for the music generation model. */
308
+ prompt: string;
309
+ /** Music model id. Defaults to `elevenlabs-music`. */
310
+ model?: string;
311
+ /** Output gain in dB. Defaults to -22. */
312
+ gain?: number;
313
+ /**
314
+ * Optional time-varying gain stops for a single cue. Each stop says "by the
315
+ * time we reach shot `atShot`, ramp gain to `gainDb`." Stops are ramped with
316
+ * a smooth volume crossfade `rampSec` seconds long (default 2.0). Stops
317
+ * outside the cue's [startShot, endShot] window are ignored. When supplied,
318
+ * this layers on top of the base `gain`.
319
+ *
320
+ * Example: "drop -20% by the time of the florida porch shot"
321
+ * { startShot: 1, endShot: 10, gain: -22,
322
+ * gainStops: [{ atShot: 7, gainDb: -24, rampSec: 3 }] }
323
+ */
324
+ gainStops?: Array<{
325
+ atShot: number | string;
326
+ gainDb: number;
327
+ rampSec?: number;
328
+ }>;
329
+ /** Fade-in in seconds. Defaults to 1.0. */
330
+ fadeIn?: number;
331
+ /** Fade-out in seconds. Defaults to 1.5. */
332
+ fadeOut?: number;
333
+ /**
334
+ * How this music cue behaves over the underlying score:
335
+ * - 'sustain' — flat bed (default)
336
+ * - 'swell' — ramp +4 dB across the cue
337
+ * - 'drop' — duck to -inf for the cue's range
338
+ * - 'stinger' — 0.4s pulse +6 dB then return to bed
339
+ * Per-shot `shot.musicHold` automation is layered on top of this.
340
+ */
341
+ musicHold?: 'sustain' | 'swell' | 'drop' | 'stinger';
342
+ /**
343
+ * Optional pre-rendered audio file. When set, the assembler skips the
344
+ * generation step and uses this directly. Useful for music beds that
345
+ * were rendered by other harnesses or hand-edited.
346
+ */
347
+ audioPath?: string;
348
+ }
349
+ /**
350
+ * Episode-level audio-mix defaults.
351
+ */
352
+ export interface AudioMixDefaults {
353
+ /** Cap any SFX clip to this many seconds. Defaults to 2.0. */
354
+ sfxMaxDurationSec?: number;
355
+ /** Fade-out applied after the SFX trim. Defaults to 0.3. */
356
+ sfxFadeOutSec?: number;
357
+ /** Dialogue track gain in dB. Defaults to 0. */
358
+ dialogueGainDb?: number;
359
+ /** Music bed gain in dB. Defaults to -22. */
360
+ musicGainDb?: number;
361
+ /** SFX track gain in dB. Defaults to -16. */
362
+ sfxGainDb?: number;
363
+ /** Final-pass integrated loudness target. Defaults to -16 LUFS. */
364
+ lufsTarget?: number;
365
+ /** Final-pass true peak target. Defaults to -1 dBTP. */
366
+ truePeakDb?: number;
367
+ /**
368
+ * When true, every shot that has dialogue is queued at Seedance / Wan with
369
+ * `audio: false` so the model doesn't synthesize its own narrator on top of
370
+ * the Venice TTS that will be mixed in by the assembler. Strongly recommended
371
+ * whenever the script's primary speaker is `NARRATOR` — Seedance i2v with
372
+ * `audio: true` will eagerly generate a competing English narration track
373
+ * when the prompt contains "narrator" / "documentary" / "naturalist". When
374
+ * unset, the buildVideoPrompt heuristic forces `audio: false` for NARRATOR
375
+ * shots anyway (since there's nothing on-camera to lip-sync to).
376
+ */
377
+ suppressModelNarration?: boolean;
378
+ }
379
+ export type ShotEnvironment = 'DAY_INTERIOR' | 'DAY_EXTERIOR' | 'NIGHT_INTERIOR' | 'NIGHT_EXTERIOR';
380
+ export declare const DAYTIME_ENVIRONMENTS: Set<ShotEnvironment>;
381
+ export declare const INTERIOR_ENVIRONMENTS: Set<ShotEnvironment>;
382
+ export interface ShotScript {
383
+ shotNumber: number;
384
+ type: 'establishing' | 'dialogue' | 'action' | 'reaction' | 'insert' | 'close-up';
385
+ duration: string;
386
+ videoModel: 'action' | 'atmosphere';
387
+ environment?: ShotEnvironment;
388
+ description: string;
389
+ panelDescription?: string;
390
+ characters: string[];
391
+ /**
392
+ * Characters visible as silhouettes/distant figures but not requiring R2V
393
+ * identity anchoring. Included in panel prompts but don't trigger R2V routing.
394
+ * Example: a silhouetted figure in a doorway for an establishing shot.
395
+ */
396
+ silhouetteCharacters?: string[];
397
+ /**
398
+ * Slug of the Location this shot takes place in (see SeriesState.locations).
399
+ * When set and the location has generated reference images, the storyboard
400
+ * folds the location's wide/medium ref into the panel generation and the
401
+ * video generator folds it into scene_image_urls (Kling O3 R2V) or
402
+ * reference_image_urls + an @ImageN env tag (Seedance / HappyHorse).
403
+ */
404
+ location?: string;
405
+ /**
406
+ * Slug of the StoryboardReference (composed blocking plate) for this shot's
407
+ * scene beat. When set and the plate exists on disk, the video generator
408
+ * appends it to reference_image_urls with an @ImageN blocking role clause —
409
+ * PROTECTED in the budget allocator (dropped last, after extra character
410
+ * angles and extra location angles). Set by the beat planner during
411
+ * storyboarding or by hand.
412
+ */
413
+ storyboardRef?: string;
414
+ dialogue: {
415
+ character: string;
416
+ line: string;
417
+ delivery?: string;
418
+ } | null;
419
+ sfx: string | null;
420
+ cameraMovement: string;
421
+ transition: string;
422
+ trimStart?: number;
423
+ trimEnd?: number;
424
+ flip?: boolean;
425
+ allowMultiShot?: boolean;
426
+ mustStaySingle?: boolean;
427
+ continuityPriority?: 'identity' | 'continuity' | 'balanced';
428
+ /**
429
+ * Per-shot motion intensity. Drives planner routing between:
430
+ * - Wan 2.7 i2v (lip-sync) for low/medium-motion dialogue shots, and
431
+ * - Seedance R2V (identity preservation, no lip-sync) for high motion.
432
+ *
433
+ * Defaults to `'medium'` when unset. Camera prompt suggestions:
434
+ * - 'low' -> slow push-in, subtle parallax, still hold
435
+ * - 'medium' -> gentle tracking, lateral pan
436
+ * - 'high' -> tracking action, dynamic camera, whip pan
437
+ */
438
+ motion?: 'low' | 'medium' | 'high';
439
+ /**
440
+ * Whether the character's face is visible in the shot. Used by the
441
+ * planner to decide if lip-sync makes sense. When false, dialogue-bearing
442
+ * shots can stay on Seedance because there's no mouth to animate.
443
+ */
444
+ faceVisible?: boolean;
445
+ titleOverlay?: {
446
+ text: string;
447
+ fadeInSec?: number;
448
+ holdSec?: number;
449
+ };
450
+ episodeWardrobe?: Record<string, string>;
451
+ skipRefine?: boolean;
452
+ useElements?: boolean;
453
+ useReferenceImages?: boolean;
454
+ sceneImagePaths?: string[];
455
+ /** Describes what the scene reference image should visually contribute (used in Pass 3 multi-edit). */
456
+ sceneRefDescription?: string;
457
+ /** Negative prompt appended during video generation for this shot. */
458
+ negativePrompt?: string;
459
+ /** Audio URL to use as background audio input for models that support it. */
460
+ audioUrl?: string;
461
+ /** Video URL to use as reference input for models that support it. */
462
+ videoUrl?: string;
463
+ /**
464
+ * When true, skip the automatic Seedance R2V → Wan 2.7 keyframe pipeline
465
+ * for this shot even if it routes to the lip-sync model. Use when you
466
+ * have a specific reason to prefer the panel as the Wan 2.7 keyframe
467
+ * (e.g. you've manually retouched the panel for this shot). Default
468
+ * undefined → the series-level `videoDefaults.seedanceKeyframeForWan`
469
+ * (default `true`) decides.
470
+ */
471
+ disableSeedanceKeyframe?: boolean;
472
+ /**
473
+ * Per-shot music-cue automation. Layered on top of the containing
474
+ * `MusicCueSpec.musicHold`. Set when a story beat (reveal, lightbulb
475
+ * moment, drop) needs audio emphasis at this shot.
476
+ */
477
+ musicHold?: 'sustain' | 'swell' | 'drop' | 'stinger';
478
+ /**
479
+ * How the assembler should treat the video model's native (Seedance / Wan)
480
+ * audio track during dialogue replacement:
481
+ * - 'mute' — multiply native by 0 (silenced; only Venice TTS audible)
482
+ * - 'duck' — multiply native by 0.2 (legacy default; keeps ambient bed)
483
+ * - 'keep' — multiply native by 1.0 (no ducking; competes with TTS)
484
+ * Per-shot value wins over the CLI's `--native-volume`. Use when one shot
485
+ * has genuine ambient (paper rustle, room tone) you want to preserve while
486
+ * the rest of the episode mutes a competing AI narrator.
487
+ */
488
+ nativeAudio?: 'mute' | 'duck' | 'keep';
489
+ /**
490
+ * Optional suffix letter for inserted shots. When set, the canonical
491
+ * shot id becomes `shotNumber + shotIdSuffix` — for example, shotNumber 3
492
+ * with shotIdSuffix "b" → "3b" → key "003b". Inserted shots use this so
493
+ * the order of the original shotNumbers is preserved.
494
+ */
495
+ shotIdSuffix?: string;
496
+ }
497
+ export type GenerationUnitType = 'single' | 'kling-multishot';
498
+ export type StartFrameStrategy = 'panel' | 'previous-last-frame';
499
+ export type EndFrameStrategy = 'natural' | 'next-panel-target';
500
+ export interface GenerationUnitSegment {
501
+ shotNumber: number;
502
+ startOffsetSec: number;
503
+ durationSec: number;
504
+ outputFile: string;
505
+ }
506
+ export interface GenerationUnit {
507
+ unitId: string;
508
+ unitType: GenerationUnitType;
509
+ shotNumbers: number[];
510
+ outputFile: string;
511
+ model: string;
512
+ duration: string;
513
+ startFrameStrategy: StartFrameStrategy;
514
+ endFrameStrategy: EndFrameStrategy;
515
+ decisionReasons: string[];
516
+ fallbackToSingles: boolean;
517
+ renderedDurationSec?: number;
518
+ segments?: GenerationUnitSegment[];
519
+ /**
520
+ * When true, render the keyframe via Seedance R2V first and use it as the
521
+ * Wan 2.7 `image_url`. Set by the planner when the unit routes to the
522
+ * lip-sync model on a single-character dialogue shot. See AGENTS.md
523
+ * rule 32.
524
+ */
525
+ useSeedanceKeyframe?: boolean;
526
+ /** Model used for the Seedance keyframe stage when `useSeedanceKeyframe`. */
527
+ keyframeModel?: string;
528
+ }
529
+ export interface GenerationPlan {
530
+ episode: number;
531
+ generatedAt: string;
532
+ units: GenerationUnit[];
533
+ }
534
+ export declare const DEFAULT_ACTION_MODEL = "seedance-2-0-enhanced-reference-to-video";
535
+ export declare const DEFAULT_ATMOSPHERE_MODEL = "seedance-2-0-enhanced-reference-to-video";
536
+ export declare const DEFAULT_CHARACTER_CONSISTENCY_MODEL = "seedance-2-0-enhanced-reference-to-video";
537
+ export declare const KLING_R2V_MODEL = "kling-o3-standard-reference-to-video";
538
+ export declare const KLING_MULTISHOT_MODEL = "kling-o3-pro-image-to-video";
539
+ /**
540
+ * Default lip-sync model. Used by the planner for dialogue shots whose
541
+ * character is a non-narrator with a visible face and motion !== 'high'.
542
+ * Wan 2.7 i2v inherits the aspect ratio from the input image and
543
+ * synthesizes lip-sync from `audio_url`. R2V dialogue (high motion or
544
+ * multi-speaker) stays on Seedance for identity preservation.
545
+ */
546
+ export declare const DEFAULT_LIP_SYNC_MODEL = "wan-2-7-image-to-video";
547
+ /**
548
+ * Default image models for ALL panels — character-bearing and faceless alike.
549
+ *
550
+ * Historical note: Seedance 2.0 used to reject face-bearing input images that
551
+ * weren't produced by `seedream-v5-lite`, so the harness forced seedream on any
552
+ * panel with a character. **Venice removed that cross-family restriction (2026-07)**
553
+ * — Seedance now accepts face-bearing images from any image family — so a single
554
+ * high-quality default is used everywhere. `nano-banana-2` is the global default.
555
+ */
556
+ export declare const DEFAULT_IMAGE_GENERATION_MODEL = "nano-banana-2";
557
+ export declare const DEFAULT_IMAGE_EDIT_MODEL = "nano-banana-2-edit";
558
+ /**
559
+ * @deprecated Venice removed the Seedance seedream-only face restriction (2026-07).
560
+ * These constants are retained only for backward-compatible imports; the harness
561
+ * no longer forces seedream on face-bearing panels. Use
562
+ * `DEFAULT_IMAGE_GENERATION_MODEL` / `DEFAULT_IMAGE_EDIT_MODEL` instead.
563
+ */
564
+ export declare const SEEDANCE_FACE_GENERATION_MODEL = "seedream-v5-lite";
565
+ export declare const SEEDANCE_FACE_EDIT_MODEL = "seedream-v5-lite-edit";
566
+ /**
567
+ * @deprecated Venice removed the Seedance face-image family restriction (2026-07).
568
+ * Seedance now accepts face-bearing images from any image family; these sets are
569
+ * kept only so older imports keep compiling.
570
+ */
571
+ export declare const SEEDANCE_COMPATIBLE_GENERATION_MODELS: Set<string>;
572
+ export declare const SEEDANCE_COMPATIBLE_EDIT_MODELS: Set<string>;
573
+ /** True when the model id belongs to the Seedance 2.0 family. */
574
+ export declare function isSeedanceVideoModel(modelId: string): boolean;
575
+ /**
576
+ * Atmosphere/i2v fallback when the user is on a Seedance default but the
577
+ * images in the request are not Seedance-compatible (or the user is in a
578
+ * region where Seedance is unavailable).
579
+ */
580
+ export declare const SEEDANCE_FALLBACK_ATMOSPHERE_MODEL = "veo3.1-fast-image-to-video";
581
+ export declare const SEEDANCE_FALLBACK_R2V_MODEL = "kling-o3-standard-reference-to-video";
582
+ export declare const VIDEO_NO_MUSIC_SUFFIX = "No background music. Only generate dialogue, ambient sound, and sound effects.";
583
+ export declare const MODELS_SUPPORTING_ELEMENTS: Set<string>;
584
+ export declare const MODELS_SUPPORTING_REFERENCE_IMAGES: Set<string>;
585
+ export declare const MODELS_SUPPORTING_SCENE_IMAGES: Set<string>;
586
+ export declare const MODELS_SUPPORTING_END_IMAGE: Set<string>;
587
+ export declare const MODELS_USING_IMAGE_TAGS: Set<string>;
588
+ export declare const MODELS_SUPPORTING_AUDIO_INPUT: Set<string>;
589
+ /**
590
+ * Models that accept per-reference `audio_url` inside `elements[]`.
591
+ *
592
+ * Wan 2.7 R2V is the only one today. Each `elements[].audio_url` drives a
593
+ * different speaker's lip-sync inside a single render — useful for
594
+ * multi-character speaking scenes. NOT interchangeable with the global
595
+ * `audio_url` field used by the i2v / t2v variants.
596
+ */
597
+ export declare const MODELS_SUPPORTING_PER_REFERENCE_AUDIO: Set<string>;
598
+ /**
599
+ * Models that accept `reference_audio_urls` — voice-donor clips bound
600
+ * in-prompt as @Audio1, @Audio2, … to keep a character's voice (timbre,
601
+ * accent, pacing) consistent across shots. Up to 3 clips, 2-15s each,
602
+ * ≤15s aggregate, wav/mp3, ≤15MB per file, and Venice REQUIRES at least
603
+ * one reference image alongside them (audio-only is rejected at
604
+ * validation). Mirror of `MODELS_SUPPORTING_AUDIO_INPUT` — kept here as a
605
+ * fast lookup set for the video generator. Confirmed live via /video/quote
606
+ * (HTTP 200) 2026-07-23 on all four; these do NOT set `audio_input: true`
607
+ * in GET /models, so reference audio is a separate capability from the
608
+ * lip-sync `audio_url` lane.
609
+ */
610
+ export declare const MODELS_SUPPORTING_REFERENCE_AUDIO: Set<string>;
611
+ /**
612
+ * Per-model reference_image_urls budget. The Venice API cap is 9 (per the
613
+ * venice-video SKILL.md params table); models not listed here fall back to
614
+ * the legacy conservative cap of 4. The old universal `.slice(0, 4)` was a
615
+ * harness convention, NOT the API limit — Seedance 2.0 R2V and HappyHorse
616
+ * 1.1 R2V both accept up to 9 flat reference images, which is what makes the
617
+ * full reference stack (character sheets + multi-angle locations + storyboard
618
+ * blocking plates) possible.
619
+ */
620
+ export declare const MAX_REFERENCE_IMAGES_BY_MODEL: Record<string, number>;
621
+ export declare const DEFAULT_MAX_REFERENCE_IMAGES = 4;
622
+ export declare function getMaxReferenceImages(modelId: string): number;
623
+ export interface VideoElement {
624
+ frontalImageUrl?: string;
625
+ referenceImageUrls?: string[];
626
+ videoUrl?: string;
627
+ /**
628
+ * Per-reference audio for Wan 2.7 R2V (`per_reference_audio: true`).
629
+ * When set, this element's character lip-syncs to the supplied audio
630
+ * while other characters in the same render stay silent. NOT used by
631
+ * models that lack `MODELS_SUPPORTING_PER_REFERENCE_AUDIO`.
632
+ *
633
+ * Pass as a data URL or a local file path — `audioPath` is preferred so
634
+ * the audio pre-flight pad can run.
635
+ */
636
+ audioUrl?: string;
637
+ audioPath?: string;
638
+ }
639
+ export declare const FEMALE_BASE_TRAITS = "beautiful, elegant, detailed features";
640
+ export declare const MALE_BASE_TRAITS = "handsome, strong features, detailed features";
641
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/series/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAMxE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAa,GAAG,YAAY,CAAC;IACjF,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,qEAAqE;IACrE,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,aAAa,EAAE,kBAAkB,CAAC;IAClC,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC;;;;OAIG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C;;;;;;;;;OASG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,eAAe,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;;OAcG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;CACrE;AAED,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAiB1E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN,UAAU,GACV,YAAY,GACZ,cAAc,GACd,UAAU,CAAC;AAEf;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,qBAAqB,GAC5B;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,yBAAyB,EAAE,MAAM,CAAA;CAAE,CAuCrF;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,qCAAqC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CA4B3F,CAAC;AAEF,wBAAgB,gCAAgC,CAC9C,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,yBAAyB,GAAG,SAAS,CAGvC;AAMD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2FAA2F;IAC3F,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAkBD,MAAM,WAAW,QAAQ;IACvB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAgBD,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAChC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAM3C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;CAC1E;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC9B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,kDAAkD;IAClD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACrD;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAMD,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,cAAc,GACd,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,eAAO,MAAM,oBAAoB,sBAA6D,CAAC;AAC/F,eAAO,MAAM,qBAAqB,sBAA+D,CAAC;AAMlG,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,QAAQ,GAAG,YAAY,CAAC;IACpC,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;IAC5D;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,uGAAuG;IACvG,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACrD;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACvC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,qBAAqB,CAAC;AACjE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,mBAAmB,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACnC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAaD,eAAO,MAAM,oBAAoB,6CAA6C,CAAC;AAC/E,eAAO,MAAM,wBAAwB,6CAA6C,CAAC;AACnF,eAAO,MAAM,mCAAmC,6CAA6C,CAAC;AAC9F,eAAO,MAAM,eAAe,yCAAyC,CAAC;AACtE,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,kBAAkB,CAAC;AAC9D,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,qBAAqB,CAAC;AACjE,eAAO,MAAM,wBAAwB,0BAA0B,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,aAEhD,CAAC;AACH,eAAO,MAAM,+BAA+B,aAE1C,CAAC;AAEH,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,+BAA+B,CAAC;AAC/E,eAAO,MAAM,2BAA2B,yCAAkB,CAAC;AAE3D,eAAO,MAAM,qBAAqB,mFAAmF,CAAC;AAStH,eAAO,MAAM,0BAA0B,aAIrC,CAAC;AAEH,eAAO,MAAM,kCAAkC,aAmB7C,CAAC;AAEH,eAAO,MAAM,8BAA8B,aAKzC,CAAC;AAEH,eAAO,MAAM,2BAA2B,aAkBtC,CAAC;AAEH,eAAO,MAAM,uBAAuB,aAWlC,CAAC;AAEH,eAAO,MAAM,6BAA6B,aAmBxC,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,qCAAqC,aAEhD,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iCAAiC,aAK5C,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKhE,CAAC;AAEF,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAMD,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,eAAO,MAAM,kBAAkB,0CAA0C,CAAC;AAC1E,eAAO,MAAM,gBAAgB,iDAAiD,CAAC"}