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 @@
1
+ {"version":3,"file":"scene-extractor.js","sourceRoot":"","sources":["../../src/parsers/scene-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { SeriesState, MiniDramaCharacter, EpisodeMeta, EpisodeScript, Location } from './types.js';
2
+ import { type AudioStrategy, type VideoFamilyPreference } from './types.js';
3
+ export interface CreateSeriesOptions {
4
+ /** Upfront questionnaire: how dialogue reaches the final mix. */
5
+ audioStrategy?: AudioStrategy;
6
+ /** Upfront questionnaire: preferred video model family. */
7
+ videoFamilyPreference?: VideoFamilyPreference;
8
+ /** Directory that contains every series project. */
9
+ workspace?: string;
10
+ /** Broad standalone-CLI creation type. */
11
+ projectType?: 'film' | 'series' | 'product-video' | 'music-video' | 'screenplay';
12
+ }
13
+ export declare function createSeries(name: string, concept: string, genre: string, setting: string, options?: CreateSeriesOptions): SeriesState;
14
+ /**
15
+ * Read every `characters/*\/character.json` on disk and return the resulting
16
+ * array. This is the authoritative source of truth — the in-memory
17
+ * `series.characters` is allowed to drift (commands sometimes mutate it
18
+ * accidentally), but the per-character JSON files are written once by
19
+ * `add-character` and only changed by explicit user action.
20
+ *
21
+ * Returns an empty array when the characters/ directory doesn't exist yet.
22
+ */
23
+ export declare function loadCharactersFromDisk(outputDir: string): Promise<MiniDramaCharacter[]>;
24
+ export declare function saveSeries(series: SeriesState): Promise<void>;
25
+ export declare function loadSeries(outputDir: string): Promise<SeriesState | null>;
26
+ export declare function listSeries(workspace?: string): Promise<{
27
+ name: string;
28
+ slug: string;
29
+ dir: string;
30
+ }[]>;
31
+ export declare function addCharacter(series: SeriesState, character: MiniDramaCharacter): void;
32
+ export declare function getCharacter(series: SeriesState, name: string): MiniDramaCharacter | undefined;
33
+ export declare function addEpisode(series: SeriesState, title: string): EpisodeMeta;
34
+ export declare function getEpisodeDir(series: SeriesState, episodeNumber: number): string;
35
+ export declare function getCharacterDir(series: SeriesState, characterName: string): string;
36
+ /**
37
+ * Directory for a location's reference assets, mirroring getCharacterDir.
38
+ * Accepts a slug or a display name; slugifies to find the canonical dir and
39
+ * falls back to the raw name for directories created outside the CLI.
40
+ */
41
+ export declare function getLocationDir(series: SeriesState, locationSlugOrName: string): string;
42
+ export declare function locationSlugify(name: string): string;
43
+ /**
44
+ * Directory for composed storyboard blocking plates (StoryboardReference).
45
+ * Plates are series-level assets keyed by slug — slugs are conventionally
46
+ * prefixed with the episode (e.g. "e01-courtyard-chalice-fight") so beats
47
+ * from different episodes never collide.
48
+ */
49
+ export declare function getStoryboardDir(series: SeriesState): string;
50
+ /**
51
+ * Absolute path to a storyboard blocking plate by slug. Returns the first
52
+ * existing candidate (slugified, then raw name — mirroring getLocationDir's
53
+ * tolerance for files created outside the CLI), falling back to the
54
+ * canonical slugified path (the write target) when none exists yet.
55
+ * Callers deciding whether to USE the plate should existsSync() the result.
56
+ */
57
+ export declare function getStoryboardRefPath(series: SeriesState, slug: string): string;
58
+ /** Find a location by slug (preferred) or display name. */
59
+ export declare function getLocation(series: SeriesState, slugOrName: string): Location | undefined;
60
+ /** Insert or replace a location by slug. */
61
+ export declare function addLocation(series: SeriesState, location: Location): void;
62
+ export declare function saveEpisodeScript(series: SeriesState, script: EpisodeScript): Promise<string>;
63
+ export declare function loadEpisodeScript(series: SeriesState, episodeNumber: number): Promise<EpisodeScript | null>;
64
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/series/manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,QAAQ,EACT,MAAM,YAAY,CAAC;AACpB,OAAO,EAQL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAC;AASpB,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,2DAA2D;IAC3D,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAa,GAAG,YAAY,CAAC;CAClF;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,mBAAmB,GAC5B,WAAW,CAmCb;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA0B/B;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCnE;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAK/E;AAED,wBAAsB,UAAU,CAAC,SAAS,SAAoB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAoBtH;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,GAAG,IAAI,CASrF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAE9F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAS1E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAWlF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAUtF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAU9E;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAKzF;AAED,4CAA4C;AAC5C,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAKzE;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAM/B"}
@@ -0,0 +1,282 @@
1
+ import { readFile, writeFile, mkdir, readdir, rename } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import { DEFAULT_ACTION_MODEL, DEFAULT_ATMOSPHERE_MODEL, DEFAULT_CHARACTER_CONSISTENCY_MODEL, DEFAULT_IMAGE_GENERATION_MODEL, DEFAULT_IMAGE_EDIT_MODEL, DEFAULT_LIP_SYNC_MODEL, resolveVideoFamilyDefaults, } from './types.js';
5
+ function slugify(name) {
6
+ return name
7
+ .toLowerCase()
8
+ .replace(/[^a-z0-9]+/g, '-')
9
+ .replace(/^-+|-+$/g, '');
10
+ }
11
+ export function createSeries(name, concept, genre, setting, options) {
12
+ const slug = slugify(name);
13
+ const outputDir = join(resolve(options?.workspace ?? 'output'), slug);
14
+ const now = new Date().toISOString();
15
+ const family = options?.videoFamilyPreference ?? 'auto';
16
+ const familyDefaults = resolveVideoFamilyDefaults(family);
17
+ return {
18
+ name,
19
+ slug,
20
+ concept,
21
+ genre,
22
+ setting,
23
+ ...(options?.projectType ? { projectType: options.projectType } : {}),
24
+ aesthetic: null,
25
+ characters: [],
26
+ episodes: [],
27
+ videoDefaults: {
28
+ actionModel: family === 'auto' ? DEFAULT_ACTION_MODEL : familyDefaults.actionModel,
29
+ atmosphereModel: family === 'auto' ? DEFAULT_ATMOSPHERE_MODEL : familyDefaults.atmosphereModel,
30
+ characterConsistencyModel: family === 'auto' ? DEFAULT_CHARACTER_CONSISTENCY_MODEL : familyDefaults.characterConsistencyModel,
31
+ imageDefaults: {
32
+ generationModel: DEFAULT_IMAGE_GENERATION_MODEL,
33
+ editModel: DEFAULT_IMAGE_EDIT_MODEL,
34
+ },
35
+ lipSyncModel: DEFAULT_LIP_SYNC_MODEL,
36
+ ...(options?.audioStrategy ? { audioStrategy: options.audioStrategy } : {}),
37
+ ...(options?.videoFamilyPreference ? { videoFamilyPreference: options.videoFamilyPreference } : {}),
38
+ },
39
+ outputDir,
40
+ createdAt: now,
41
+ updatedAt: now,
42
+ };
43
+ }
44
+ /**
45
+ * Read every `characters/*\/character.json` on disk and return the resulting
46
+ * array. This is the authoritative source of truth — the in-memory
47
+ * `series.characters` is allowed to drift (commands sometimes mutate it
48
+ * accidentally), but the per-character JSON files are written once by
49
+ * `add-character` and only changed by explicit user action.
50
+ *
51
+ * Returns an empty array when the characters/ directory doesn't exist yet.
52
+ */
53
+ export async function loadCharactersFromDisk(outputDir) {
54
+ const charsDir = join(outputDir, 'characters');
55
+ if (!existsSync(charsDir))
56
+ return [];
57
+ const out = [];
58
+ let entries;
59
+ try {
60
+ entries = await readdir(charsDir, { withFileTypes: true });
61
+ }
62
+ catch {
63
+ return [];
64
+ }
65
+ for (const entry of entries) {
66
+ if (!entry.isDirectory())
67
+ continue;
68
+ const charJsonPath = join(charsDir, entry.name, 'character.json');
69
+ if (!existsSync(charJsonPath))
70
+ continue;
71
+ try {
72
+ const raw = await readFile(charJsonPath, 'utf-8');
73
+ const character = JSON.parse(raw);
74
+ if (character && typeof character.name === 'string') {
75
+ out.push(character);
76
+ }
77
+ }
78
+ catch {
79
+ // Skip malformed character.json — log to stderr so it's visible.
80
+ console.warn(` loadCharactersFromDisk: skipped malformed ${charJsonPath}`);
81
+ }
82
+ }
83
+ return out;
84
+ }
85
+ export async function saveSeries(series) {
86
+ if (!existsSync(series.outputDir)) {
87
+ await mkdir(series.outputDir, { recursive: true });
88
+ }
89
+ series.updatedAt = new Date().toISOString();
90
+ const filePath = join(series.outputDir, 'series.json');
91
+ // NOTE: the former `seedanceCompatibility` auto-fill was removed (2026-07)
92
+ // once Venice dropped the Seedance seedream-only face restriction. Seedance
93
+ // now accepts face-bearing input images from any image family, so there is no
94
+ // provenance-driven mode to infer. The field is still honored if an operator
95
+ // sets it explicitly, but nothing sets it automatically anymore.
96
+ // Rebuild `characters[]` from the on-disk per-character JSON files. This
97
+ // closes a recurring data-loss bug where storyboard-episode / qa-approve /
98
+ // other commands would load series.json, mutate one field, and save the
99
+ // whole document back with an empty characters[] because they'd never
100
+ // populated that field in their working copy. The per-character JSON files
101
+ // are the single source of truth.
102
+ try {
103
+ const fromDisk = await loadCharactersFromDisk(series.outputDir);
104
+ if (fromDisk.length > 0) {
105
+ // Merge: prefer disk entries, but keep any in-memory characters that
106
+ // don't yet have a disk record (e.g. the caller just created the
107
+ // character in-process and hasn't written the json yet).
108
+ const diskByName = new Map(fromDisk.map(c => [c.name.toUpperCase(), c]));
109
+ const merged = [...fromDisk];
110
+ for (const inMem of series.characters) {
111
+ if (!diskByName.has(inMem.name.toUpperCase()))
112
+ merged.push(inMem);
113
+ }
114
+ series.characters = merged;
115
+ }
116
+ }
117
+ catch (err) {
118
+ console.warn(` saveSeries: characters merge from disk failed (${err.message}); writing in-memory copy as-is.`);
119
+ }
120
+ await writeFile(filePath, JSON.stringify(series, null, 2), 'utf-8');
121
+ }
122
+ export async function loadSeries(outputDir) {
123
+ const filePath = join(outputDir, 'series.json');
124
+ if (!existsSync(filePath))
125
+ return null;
126
+ const raw = await readFile(filePath, 'utf-8');
127
+ return JSON.parse(raw);
128
+ }
129
+ export async function listSeries(workspace = resolve('output')) {
130
+ const outputBase = resolve(workspace);
131
+ const results = [];
132
+ if (!existsSync(outputBase))
133
+ return results;
134
+ const entries = await readdir(outputBase, { withFileTypes: true });
135
+ for (const entry of entries) {
136
+ if (!entry.isDirectory())
137
+ continue;
138
+ const dir = join(outputBase, entry.name);
139
+ const seriesFile = join(dir, 'series.json');
140
+ if (!existsSync(seriesFile))
141
+ continue;
142
+ try {
143
+ const raw = await readFile(seriesFile, 'utf-8');
144
+ const data = JSON.parse(raw);
145
+ results.push({ name: data.name, slug: data.slug, dir });
146
+ }
147
+ catch {
148
+ // skip invalid
149
+ }
150
+ }
151
+ return results;
152
+ }
153
+ export function addCharacter(series, character) {
154
+ const existing = series.characters.findIndex(c => c.name.toUpperCase() === character.name.toUpperCase());
155
+ if (existing >= 0) {
156
+ series.characters[existing] = character;
157
+ }
158
+ else {
159
+ series.characters.push(character);
160
+ }
161
+ }
162
+ export function getCharacter(series, name) {
163
+ return series.characters.find(c => c.name.toUpperCase() === name.toUpperCase());
164
+ }
165
+ export function addEpisode(series, title) {
166
+ const number = series.episodes.length + 1;
167
+ const episode = {
168
+ number,
169
+ title,
170
+ status: 'draft',
171
+ };
172
+ series.episodes.push(episode);
173
+ return episode;
174
+ }
175
+ export function getEpisodeDir(series, episodeNumber) {
176
+ return join(series.outputDir, 'episodes', `episode-${String(episodeNumber).padStart(3, '0')}`);
177
+ }
178
+ export function getCharacterDir(series, characterName) {
179
+ const safeName = characterName
180
+ .toLowerCase()
181
+ .replace(/[^a-z0-9]+/g, '-')
182
+ .replace(/^-+|-+$/g, '');
183
+ const slugPath = join(series.outputDir, 'characters', safeName);
184
+ if (existsSync(slugPath))
185
+ return slugPath;
186
+ // Fall back to raw character name (handles directories created outside the CLI)
187
+ const rawPath = join(series.outputDir, 'characters', characterName);
188
+ if (existsSync(rawPath))
189
+ return rawPath;
190
+ return slugPath;
191
+ }
192
+ /**
193
+ * Directory for a location's reference assets, mirroring getCharacterDir.
194
+ * Accepts a slug or a display name; slugifies to find the canonical dir and
195
+ * falls back to the raw name for directories created outside the CLI.
196
+ */
197
+ export function getLocationDir(series, locationSlugOrName) {
198
+ const safeName = locationSlugOrName
199
+ .toLowerCase()
200
+ .replace(/[^a-z0-9]+/g, '-')
201
+ .replace(/^-+|-+$/g, '');
202
+ const slugPath = join(series.outputDir, 'locations', safeName);
203
+ if (existsSync(slugPath))
204
+ return slugPath;
205
+ const rawPath = join(series.outputDir, 'locations', locationSlugOrName);
206
+ if (existsSync(rawPath))
207
+ return rawPath;
208
+ return slugPath;
209
+ }
210
+ export function locationSlugify(name) {
211
+ return slugify(name);
212
+ }
213
+ /**
214
+ * Directory for composed storyboard blocking plates (StoryboardReference).
215
+ * Plates are series-level assets keyed by slug — slugs are conventionally
216
+ * prefixed with the episode (e.g. "e01-courtyard-chalice-fight") so beats
217
+ * from different episodes never collide.
218
+ */
219
+ export function getStoryboardDir(series) {
220
+ return join(series.outputDir, 'storyboards');
221
+ }
222
+ /**
223
+ * Absolute path to a storyboard blocking plate by slug. Returns the first
224
+ * existing candidate (slugified, then raw name — mirroring getLocationDir's
225
+ * tolerance for files created outside the CLI), falling back to the
226
+ * canonical slugified path (the write target) when none exists yet.
227
+ * Callers deciding whether to USE the plate should existsSync() the result.
228
+ */
229
+ export function getStoryboardRefPath(series, slug) {
230
+ const dir = getStoryboardDir(series);
231
+ const safe = slug
232
+ .toLowerCase()
233
+ .replace(/[^a-z0-9]+/g, '-')
234
+ .replace(/^-+|-+$/g, '');
235
+ for (const candidate of [join(dir, `${safe}.png`), join(dir, `${slug}.png`)]) {
236
+ if (existsSync(candidate))
237
+ return candidate;
238
+ }
239
+ return join(dir, `${safe}.png`);
240
+ }
241
+ /** Find a location by slug (preferred) or display name. */
242
+ export function getLocation(series, slugOrName) {
243
+ const needle = slugOrName.toLowerCase();
244
+ return (series.locations ?? []).find(l => l.slug.toLowerCase() === needle || l.name.toLowerCase() === needle);
245
+ }
246
+ /** Insert or replace a location by slug. */
247
+ export function addLocation(series, location) {
248
+ if (!series.locations)
249
+ series.locations = [];
250
+ const idx = series.locations.findIndex(l => l.slug === location.slug);
251
+ if (idx >= 0)
252
+ series.locations[idx] = location;
253
+ else
254
+ series.locations.push(location);
255
+ }
256
+ export async function saveEpisodeScript(series, script) {
257
+ const episodeDir = getEpisodeDir(series, script.episode);
258
+ if (!existsSync(episodeDir)) {
259
+ await mkdir(episodeDir, { recursive: true });
260
+ }
261
+ const filePath = join(episodeDir, 'script.json');
262
+ if (existsSync(filePath)) {
263
+ let version = 1;
264
+ let archivePath = join(episodeDir, `script-v${version}.json`);
265
+ while (existsSync(archivePath)) {
266
+ version++;
267
+ archivePath = join(episodeDir, `script-v${version}.json`);
268
+ }
269
+ await rename(filePath, archivePath);
270
+ }
271
+ await writeFile(filePath, JSON.stringify(script, null, 2), 'utf-8');
272
+ return filePath;
273
+ }
274
+ export async function loadEpisodeScript(series, episodeNumber) {
275
+ const episodeDir = getEpisodeDir(series, episodeNumber);
276
+ const filePath = join(episodeDir, 'script.json');
277
+ if (!existsSync(filePath))
278
+ return null;
279
+ const raw = await readFile(filePath, 'utf-8');
280
+ return JSON.parse(raw);
281
+ }
282
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/series/manager.ts"],"names":[],"mappings":"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"}