videoclaw 3.0.0-alpha.1

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 (1452) hide show
  1. package/AGENTS.md +165 -0
  2. package/CLAUDE.md +232 -0
  3. package/LICENSE +36 -0
  4. package/README.md +737 -0
  5. package/dist/cli/args.d.ts +59 -0
  6. package/dist/cli/args.d.ts.map +1 -0
  7. package/dist/cli/args.js +279 -0
  8. package/dist/cli/args.js.map +1 -0
  9. package/dist/cli/handlers/analysis.d.ts +3 -0
  10. package/dist/cli/handlers/analysis.d.ts.map +1 -0
  11. package/dist/cli/handlers/analysis.js +111 -0
  12. package/dist/cli/handlers/analysis.js.map +1 -0
  13. package/dist/cli/handlers/audio.d.ts +25 -0
  14. package/dist/cli/handlers/audio.d.ts.map +1 -0
  15. package/dist/cli/handlers/audio.js +321 -0
  16. package/dist/cli/handlers/audio.js.map +1 -0
  17. package/dist/cli/handlers/batch.d.ts +4 -0
  18. package/dist/cli/handlers/batch.d.ts.map +1 -0
  19. package/dist/cli/handlers/batch.js +424 -0
  20. package/dist/cli/handlers/batch.js.map +1 -0
  21. package/dist/cli/handlers/candidates.d.ts +10 -0
  22. package/dist/cli/handlers/candidates.d.ts.map +1 -0
  23. package/dist/cli/handlers/candidates.js +389 -0
  24. package/dist/cli/handlers/candidates.js.map +1 -0
  25. package/dist/cli/handlers/character.d.ts +8 -0
  26. package/dist/cli/handlers/character.d.ts.map +1 -0
  27. package/dist/cli/handlers/character.js +202 -0
  28. package/dist/cli/handlers/character.js.map +1 -0
  29. package/dist/cli/handlers/clone.d.ts +5 -0
  30. package/dist/cli/handlers/clone.d.ts.map +1 -0
  31. package/dist/cli/handlers/clone.js +303 -0
  32. package/dist/cli/handlers/clone.js.map +1 -0
  33. package/dist/cli/handlers/create.d.ts +5 -0
  34. package/dist/cli/handlers/create.d.ts.map +1 -0
  35. package/dist/cli/handlers/create.js +635 -0
  36. package/dist/cli/handlers/create.js.map +1 -0
  37. package/dist/cli/handlers/execution.d.ts +5 -0
  38. package/dist/cli/handlers/execution.d.ts.map +1 -0
  39. package/dist/cli/handlers/execution.js +132 -0
  40. package/dist/cli/handlers/execution.js.map +1 -0
  41. package/dist/cli/handlers/library.d.ts +8 -0
  42. package/dist/cli/handlers/library.d.ts.map +1 -0
  43. package/dist/cli/handlers/library.js +77 -0
  44. package/dist/cli/handlers/library.js.map +1 -0
  45. package/dist/cli/handlers/media-ops.d.ts +7 -0
  46. package/dist/cli/handlers/media-ops.d.ts.map +1 -0
  47. package/dist/cli/handlers/media-ops.js +120 -0
  48. package/dist/cli/handlers/media-ops.js.map +1 -0
  49. package/dist/cli/handlers/media-production.d.ts +56 -0
  50. package/dist/cli/handlers/media-production.d.ts.map +1 -0
  51. package/dist/cli/handlers/media-production.js +673 -0
  52. package/dist/cli/handlers/media-production.js.map +1 -0
  53. package/dist/cli/handlers/motion-overlay.d.ts +10 -0
  54. package/dist/cli/handlers/motion-overlay.d.ts.map +1 -0
  55. package/dist/cli/handlers/motion-overlay.js +651 -0
  56. package/dist/cli/handlers/motion-overlay.js.map +1 -0
  57. package/dist/cli/handlers/multi-shot.d.ts +2 -0
  58. package/dist/cli/handlers/multi-shot.d.ts.map +1 -0
  59. package/dist/cli/handlers/multi-shot.js +424 -0
  60. package/dist/cli/handlers/multi-shot.js.map +1 -0
  61. package/dist/cli/handlers/project-ops.d.ts +14 -0
  62. package/dist/cli/handlers/project-ops.d.ts.map +1 -0
  63. package/dist/cli/handlers/project-ops.js +241 -0
  64. package/dist/cli/handlers/project-ops.js.map +1 -0
  65. package/dist/cli/handlers/prompt-craft.d.ts +8 -0
  66. package/dist/cli/handlers/prompt-craft.d.ts.map +1 -0
  67. package/dist/cli/handlers/prompt-craft.js +397 -0
  68. package/dist/cli/handlers/prompt-craft.js.map +1 -0
  69. package/dist/cli/handlers/provider-registration.d.ts +29 -0
  70. package/dist/cli/handlers/provider-registration.d.ts.map +1 -0
  71. package/dist/cli/handlers/provider-registration.js +225 -0
  72. package/dist/cli/handlers/provider-registration.js.map +1 -0
  73. package/dist/cli/handlers/reference-sheets.d.ts +6 -0
  74. package/dist/cli/handlers/reference-sheets.d.ts.map +1 -0
  75. package/dist/cli/handlers/reference-sheets.js +181 -0
  76. package/dist/cli/handlers/reference-sheets.js.map +1 -0
  77. package/dist/cli/handlers/reporting.d.ts +18 -0
  78. package/dist/cli/handlers/reporting.d.ts.map +1 -0
  79. package/dist/cli/handlers/reporting.js +155 -0
  80. package/dist/cli/handlers/reporting.js.map +1 -0
  81. package/dist/cli/handlers/review-portal.d.ts +8 -0
  82. package/dist/cli/handlers/review-portal.d.ts.map +1 -0
  83. package/dist/cli/handlers/review-portal.js +276 -0
  84. package/dist/cli/handlers/review-portal.js.map +1 -0
  85. package/dist/cli/handlers/show.d.ts +11 -0
  86. package/dist/cli/handlers/show.d.ts.map +1 -0
  87. package/dist/cli/handlers/show.js +136 -0
  88. package/dist/cli/handlers/show.js.map +1 -0
  89. package/dist/cli/handlers/stages.d.ts +6 -0
  90. package/dist/cli/handlers/stages.d.ts.map +1 -0
  91. package/dist/cli/handlers/stages.js +333 -0
  92. package/dist/cli/handlers/stages.js.map +1 -0
  93. package/dist/cli/handlers/studio.d.ts +2 -0
  94. package/dist/cli/handlers/studio.d.ts.map +1 -0
  95. package/dist/cli/handlers/studio.js +159 -0
  96. package/dist/cli/handlers/studio.js.map +1 -0
  97. package/dist/cli/handlers/templates.d.ts +7 -0
  98. package/dist/cli/handlers/templates.d.ts.map +1 -0
  99. package/dist/cli/handlers/templates.js +61 -0
  100. package/dist/cli/handlers/templates.js.map +1 -0
  101. package/dist/cli/provider-adapter.d.ts +3 -0
  102. package/dist/cli/provider-adapter.d.ts.map +1 -0
  103. package/dist/cli/provider-adapter.js +96 -0
  104. package/dist/cli/provider-adapter.js.map +1 -0
  105. package/dist/cli/vclaw.d.ts +15 -0
  106. package/dist/cli/vclaw.d.ts.map +1 -0
  107. package/dist/cli/vclaw.js +318 -0
  108. package/dist/cli/vclaw.js.map +1 -0
  109. package/dist/index.d.ts +79 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +68 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/mcp/index.d.ts +3 -0
  114. package/dist/mcp/index.d.ts.map +1 -0
  115. package/dist/mcp/index.js +3 -0
  116. package/dist/mcp/index.js.map +1 -0
  117. package/dist/mcp/server.d.ts +27 -0
  118. package/dist/mcp/server.d.ts.map +1 -0
  119. package/dist/mcp/server.js +168 -0
  120. package/dist/mcp/server.js.map +1 -0
  121. package/dist/mcp/tools.d.ts +55 -0
  122. package/dist/mcp/tools.d.ts.map +1 -0
  123. package/dist/mcp/tools.js +80 -0
  124. package/dist/mcp/tools.js.map +1 -0
  125. package/dist/video/analyze-output.d.ts +5 -0
  126. package/dist/video/analyze-output.d.ts.map +1 -0
  127. package/dist/video/analyze-output.js +7 -0
  128. package/dist/video/analyze-output.js.map +1 -0
  129. package/dist/video/archive-project.d.ts +14 -0
  130. package/dist/video/archive-project.d.ts.map +1 -0
  131. package/dist/video/archive-project.js +41 -0
  132. package/dist/video/archive-project.js.map +1 -0
  133. package/dist/video/artifact-history.d.ts +8 -0
  134. package/dist/video/artifact-history.d.ts.map +1 -0
  135. package/dist/video/artifact-history.js +12 -0
  136. package/dist/video/artifact-history.js.map +1 -0
  137. package/dist/video/artifact-store.d.ts +8 -0
  138. package/dist/video/artifact-store.d.ts.map +1 -0
  139. package/dist/video/artifact-store.js +37 -0
  140. package/dist/video/artifact-store.js.map +1 -0
  141. package/dist/video/artifact-validation.d.ts +15 -0
  142. package/dist/video/artifact-validation.d.ts.map +1 -0
  143. package/dist/video/artifact-validation.js +287 -0
  144. package/dist/video/artifact-validation.js.map +1 -0
  145. package/dist/video/artifacts.d.ts +112 -0
  146. package/dist/video/artifacts.d.ts.map +1 -0
  147. package/dist/video/artifacts.js +31 -0
  148. package/dist/video/artifacts.js.map +1 -0
  149. package/dist/video/assemble/animate-slides.d.ts +108 -0
  150. package/dist/video/assemble/animate-slides.d.ts.map +1 -0
  151. package/dist/video/assemble/animate-slides.js +152 -0
  152. package/dist/video/assemble/animate-slides.js.map +1 -0
  153. package/dist/video/assemble/animation-styles.d.ts +21 -0
  154. package/dist/video/assemble/animation-styles.d.ts.map +1 -0
  155. package/dist/video/assemble/animation-styles.js +32 -0
  156. package/dist/video/assemble/animation-styles.js.map +1 -0
  157. package/dist/video/assemble/animation-styles.json +97 -0
  158. package/dist/video/assemble/assemble.d.ts +24 -0
  159. package/dist/video/assemble/assemble.d.ts.map +1 -0
  160. package/dist/video/assemble/assemble.js +457 -0
  161. package/dist/video/assemble/assemble.js.map +1 -0
  162. package/dist/video/assemble/audio-concat.d.ts +61 -0
  163. package/dist/video/assemble/audio-concat.d.ts.map +1 -0
  164. package/dist/video/assemble/audio-concat.js +108 -0
  165. package/dist/video/assemble/audio-concat.js.map +1 -0
  166. package/dist/video/assemble/audio-mix-plan.d.ts +84 -0
  167. package/dist/video/assemble/audio-mix-plan.d.ts.map +1 -0
  168. package/dist/video/assemble/audio-mix-plan.js +74 -0
  169. package/dist/video/assemble/audio-mix-plan.js.map +1 -0
  170. package/dist/video/assemble/audio-utils.d.ts +32 -0
  171. package/dist/video/assemble/audio-utils.d.ts.map +1 -0
  172. package/dist/video/assemble/audio-utils.js +91 -0
  173. package/dist/video/assemble/audio-utils.js.map +1 -0
  174. package/dist/video/assemble/cut-segment.d.ts +40 -0
  175. package/dist/video/assemble/cut-segment.d.ts.map +1 -0
  176. package/dist/video/assemble/cut-segment.js +77 -0
  177. package/dist/video/assemble/cut-segment.js.map +1 -0
  178. package/dist/video/assemble/ffmpeg.d.ts +91 -0
  179. package/dist/video/assemble/ffmpeg.d.ts.map +1 -0
  180. package/dist/video/assemble/ffmpeg.js +251 -0
  181. package/dist/video/assemble/ffmpeg.js.map +1 -0
  182. package/dist/video/assemble/gemini-vision-classify.d.ts +37 -0
  183. package/dist/video/assemble/gemini-vision-classify.d.ts.map +1 -0
  184. package/dist/video/assemble/gemini-vision-classify.js +123 -0
  185. package/dist/video/assemble/gemini-vision-classify.js.map +1 -0
  186. package/dist/video/assemble/index.d.ts +47 -0
  187. package/dist/video/assemble/index.d.ts.map +1 -0
  188. package/dist/video/assemble/index.js +40 -0
  189. package/dist/video/assemble/index.js.map +1 -0
  190. package/dist/video/assemble/media-qc.d.ts +44 -0
  191. package/dist/video/assemble/media-qc.d.ts.map +1 -0
  192. package/dist/video/assemble/media-qc.js +181 -0
  193. package/dist/video/assemble/media-qc.js.map +1 -0
  194. package/dist/video/assemble/music.d.ts +51 -0
  195. package/dist/video/assemble/music.d.ts.map +1 -0
  196. package/dist/video/assemble/music.js +171 -0
  197. package/dist/video/assemble/music.js.map +1 -0
  198. package/dist/video/assemble/narration-fit.d.ts +32 -0
  199. package/dist/video/assemble/narration-fit.d.ts.map +1 -0
  200. package/dist/video/assemble/narration-fit.js +59 -0
  201. package/dist/video/assemble/narration-fit.js.map +1 -0
  202. package/dist/video/assemble/overlay.d.ts +81 -0
  203. package/dist/video/assemble/overlay.d.ts.map +1 -0
  204. package/dist/video/assemble/overlay.js +141 -0
  205. package/dist/video/assemble/overlay.js.map +1 -0
  206. package/dist/video/assemble/pdf.d.ts +46 -0
  207. package/dist/video/assemble/pdf.d.ts.map +1 -0
  208. package/dist/video/assemble/pdf.js +111 -0
  209. package/dist/video/assemble/pdf.js.map +1 -0
  210. package/dist/video/assemble/qa-dialogue-lint.d.ts +56 -0
  211. package/dist/video/assemble/qa-dialogue-lint.d.ts.map +1 -0
  212. package/dist/video/assemble/qa-dialogue-lint.js +85 -0
  213. package/dist/video/assemble/qa-dialogue-lint.js.map +1 -0
  214. package/dist/video/assemble/qa-image-filter.d.ts +52 -0
  215. package/dist/video/assemble/qa-image-filter.d.ts.map +1 -0
  216. package/dist/video/assemble/qa-image-filter.js +102 -0
  217. package/dist/video/assemble/qa-image-filter.js.map +1 -0
  218. package/dist/video/assemble/qa-image-vision.d.ts +57 -0
  219. package/dist/video/assemble/qa-image-vision.d.ts.map +1 -0
  220. package/dist/video/assemble/qa-image-vision.js +96 -0
  221. package/dist/video/assemble/qa-image-vision.js.map +1 -0
  222. package/dist/video/assemble/qa-narration-vision.d.ts +53 -0
  223. package/dist/video/assemble/qa-narration-vision.d.ts.map +1 -0
  224. package/dist/video/assemble/qa-narration-vision.js +87 -0
  225. package/dist/video/assemble/qa-narration-vision.js.map +1 -0
  226. package/dist/video/assemble/qa-narration.d.ts +53 -0
  227. package/dist/video/assemble/qa-narration.d.ts.map +1 -0
  228. package/dist/video/assemble/qa-narration.js +85 -0
  229. package/dist/video/assemble/qa-narration.js.map +1 -0
  230. package/dist/video/assemble/stitch-ad.d.ts +88 -0
  231. package/dist/video/assemble/stitch-ad.d.ts.map +1 -0
  232. package/dist/video/assemble/stitch-ad.js +161 -0
  233. package/dist/video/assemble/stitch-ad.js.map +1 -0
  234. package/dist/video/assemble/stitch.d.ts +341 -0
  235. package/dist/video/assemble/stitch.d.ts.map +1 -0
  236. package/dist/video/assemble/stitch.js +607 -0
  237. package/dist/video/assemble/stitch.js.map +1 -0
  238. package/dist/video/assemble/text-card.d.ts +78 -0
  239. package/dist/video/assemble/text-card.d.ts.map +1 -0
  240. package/dist/video/assemble/text-card.js +210 -0
  241. package/dist/video/assemble/text-card.js.map +1 -0
  242. package/dist/video/assemble/title-card.d.ts +39 -0
  243. package/dist/video/assemble/title-card.d.ts.map +1 -0
  244. package/dist/video/assemble/title-card.js +127 -0
  245. package/dist/video/assemble/title-card.js.map +1 -0
  246. package/dist/video/assemble/transcript.d.ts +66 -0
  247. package/dist/video/assemble/transcript.d.ts.map +1 -0
  248. package/dist/video/assemble/transcript.js +200 -0
  249. package/dist/video/assemble/transcript.js.map +1 -0
  250. package/dist/video/assemble/tts-elevenlabs.d.ts +52 -0
  251. package/dist/video/assemble/tts-elevenlabs.d.ts.map +1 -0
  252. package/dist/video/assemble/tts-elevenlabs.js +118 -0
  253. package/dist/video/assemble/tts-elevenlabs.js.map +1 -0
  254. package/dist/video/assemble/tts.d.ts +79 -0
  255. package/dist/video/assemble/tts.d.ts.map +1 -0
  256. package/dist/video/assemble/tts.js +131 -0
  257. package/dist/video/assemble/tts.js.map +1 -0
  258. package/dist/video/assemble/types.d.ts +43 -0
  259. package/dist/video/assemble/types.d.ts.map +1 -0
  260. package/dist/video/assemble/types.js +2 -0
  261. package/dist/video/assemble/types.js.map +1 -0
  262. package/dist/video/assemble/upscale.d.ts +43 -0
  263. package/dist/video/assemble/upscale.d.ts.map +1 -0
  264. package/dist/video/assemble/upscale.js +52 -0
  265. package/dist/video/assemble/upscale.js.map +1 -0
  266. package/dist/video/asset-spec.d.ts +15 -0
  267. package/dist/video/asset-spec.d.ts.map +1 -0
  268. package/dist/video/asset-spec.js +43 -0
  269. package/dist/video/asset-spec.js.map +1 -0
  270. package/dist/video/asset-tag-lookup.d.ts +31 -0
  271. package/dist/video/asset-tag-lookup.d.ts.map +1 -0
  272. package/dist/video/asset-tag-lookup.js +45 -0
  273. package/dist/video/asset-tag-lookup.js.map +1 -0
  274. package/dist/video/atomic-write.d.ts +2 -0
  275. package/dist/video/atomic-write.d.ts.map +1 -0
  276. package/dist/video/atomic-write.js +7 -0
  277. package/dist/video/atomic-write.js.map +1 -0
  278. package/dist/video/audio-platform/native-elevenlabs-sfx.d.ts +29 -0
  279. package/dist/video/audio-platform/native-elevenlabs-sfx.d.ts.map +1 -0
  280. package/dist/video/audio-platform/native-elevenlabs-sfx.js +95 -0
  281. package/dist/video/audio-platform/native-elevenlabs-sfx.js.map +1 -0
  282. package/dist/video/audio-platform/native-elevenlabs-tts.d.ts +30 -0
  283. package/dist/video/audio-platform/native-elevenlabs-tts.d.ts.map +1 -0
  284. package/dist/video/audio-platform/native-elevenlabs-tts.js +95 -0
  285. package/dist/video/audio-platform/native-elevenlabs-tts.js.map +1 -0
  286. package/dist/video/audio-platform/native-flowmusic.d.ts +21 -0
  287. package/dist/video/audio-platform/native-flowmusic.d.ts.map +1 -0
  288. package/dist/video/audio-platform/native-flowmusic.js +137 -0
  289. package/dist/video/audio-platform/native-flowmusic.js.map +1 -0
  290. package/dist/video/audio-platform/native-gemini-tts.d.ts +26 -0
  291. package/dist/video/audio-platform/native-gemini-tts.d.ts.map +1 -0
  292. package/dist/video/audio-platform/native-gemini-tts.js +202 -0
  293. package/dist/video/audio-platform/native-gemini-tts.js.map +1 -0
  294. package/dist/video/audio-platform/native-lyria.d.ts +35 -0
  295. package/dist/video/audio-platform/native-lyria.d.ts.map +1 -0
  296. package/dist/video/audio-platform/native-lyria.js +189 -0
  297. package/dist/video/audio-platform/native-lyria.js.map +1 -0
  298. package/dist/video/audio-platform/native-lyria3.d.ts +36 -0
  299. package/dist/video/audio-platform/native-lyria3.d.ts.map +1 -0
  300. package/dist/video/audio-platform/native-lyria3.js +210 -0
  301. package/dist/video/audio-platform/native-lyria3.js.map +1 -0
  302. package/dist/video/audio-platform/registry.d.ts +82 -0
  303. package/dist/video/audio-platform/registry.d.ts.map +1 -0
  304. package/dist/video/audio-platform/registry.js +189 -0
  305. package/dist/video/audio-platform/registry.js.map +1 -0
  306. package/dist/video/audio-platform/suno-backend.d.ts +11 -0
  307. package/dist/video/audio-platform/suno-backend.d.ts.map +1 -0
  308. package/dist/video/audio-platform/suno-backend.js +33 -0
  309. package/dist/video/audio-platform/suno-backend.js.map +1 -0
  310. package/dist/video/audio-platform/types.d.ts +128 -0
  311. package/dist/video/audio-platform/types.d.ts.map +1 -0
  312. package/dist/video/audio-platform/types.js +9 -0
  313. package/dist/video/audio-platform/types.js.map +1 -0
  314. package/dist/video/batch-queue.d.ts +276 -0
  315. package/dist/video/batch-queue.d.ts.map +1 -0
  316. package/dist/video/batch-queue.js +519 -0
  317. package/dist/video/batch-queue.js.map +1 -0
  318. package/dist/video/blueprint-prompt.d.ts +37 -0
  319. package/dist/video/blueprint-prompt.d.ts.map +1 -0
  320. package/dist/video/blueprint-prompt.js +107 -0
  321. package/dist/video/blueprint-prompt.js.map +1 -0
  322. package/dist/video/brand-definition.d.ts +97 -0
  323. package/dist/video/brand-definition.d.ts.map +1 -0
  324. package/dist/video/brand-definition.js +206 -0
  325. package/dist/video/brand-definition.js.map +1 -0
  326. package/dist/video/brand-dna.d.ts +101 -0
  327. package/dist/video/brand-dna.d.ts.map +1 -0
  328. package/dist/video/brand-dna.js +370 -0
  329. package/dist/video/brand-dna.js.map +1 -0
  330. package/dist/video/brand-prompt.d.ts +13 -0
  331. package/dist/video/brand-prompt.d.ts.map +1 -0
  332. package/dist/video/brand-prompt.js +26 -0
  333. package/dist/video/brand-prompt.js.map +1 -0
  334. package/dist/video/candidate-migrate.d.ts +27 -0
  335. package/dist/video/candidate-migrate.d.ts.map +1 -0
  336. package/dist/video/candidate-migrate.js +119 -0
  337. package/dist/video/candidate-migrate.js.map +1 -0
  338. package/dist/video/category-registry.d.ts +38 -0
  339. package/dist/video/category-registry.d.ts.map +1 -0
  340. package/dist/video/category-registry.js +188 -0
  341. package/dist/video/category-registry.js.map +1 -0
  342. package/dist/video/chain-fallback.d.ts +39 -0
  343. package/dist/video/chain-fallback.d.ts.map +1 -0
  344. package/dist/video/chain-fallback.js +43 -0
  345. package/dist/video/chain-fallback.js.map +1 -0
  346. package/dist/video/character-auto-create.d.ts +72 -0
  347. package/dist/video/character-auto-create.d.ts.map +1 -0
  348. package/dist/video/character-auto-create.js +392 -0
  349. package/dist/video/character-auto-create.js.map +1 -0
  350. package/dist/video/character-consistency.d.ts +3 -0
  351. package/dist/video/character-consistency.d.ts.map +1 -0
  352. package/dist/video/character-consistency.js +69 -0
  353. package/dist/video/character-consistency.js.map +1 -0
  354. package/dist/video/characters.d.ts +44 -0
  355. package/dist/video/characters.d.ts.map +1 -0
  356. package/dist/video/characters.js +96 -0
  357. package/dist/video/characters.js.map +1 -0
  358. package/dist/video/checkpoints.d.ts +16 -0
  359. package/dist/video/checkpoints.d.ts.map +1 -0
  360. package/dist/video/checkpoints.js +29 -0
  361. package/dist/video/checkpoints.js.map +1 -0
  362. package/dist/video/cinema-profile.d.ts +57 -0
  363. package/dist/video/cinema-profile.d.ts.map +1 -0
  364. package/dist/video/cinema-profile.js +89 -0
  365. package/dist/video/cinema-profile.js.map +1 -0
  366. package/dist/video/cinematography.d.ts +299 -0
  367. package/dist/video/cinematography.d.ts.map +1 -0
  368. package/dist/video/cinematography.js +914 -0
  369. package/dist/video/cinematography.js.map +1 -0
  370. package/dist/video/cli-output.d.ts +52 -0
  371. package/dist/video/cli-output.d.ts.map +1 -0
  372. package/dist/video/cli-output.js +81 -0
  373. package/dist/video/cli-output.js.map +1 -0
  374. package/dist/video/cli-schema.d.ts +40 -0
  375. package/dist/video/cli-schema.d.ts.map +1 -0
  376. package/dist/video/cli-schema.js +447 -0
  377. package/dist/video/cli-schema.js.map +1 -0
  378. package/dist/video/cost-estimate.d.ts +37 -0
  379. package/dist/video/cost-estimate.d.ts.map +1 -0
  380. package/dist/video/cost-estimate.js +103 -0
  381. package/dist/video/cost-estimate.js.map +1 -0
  382. package/dist/video/csv-export.d.ts +8 -0
  383. package/dist/video/csv-export.d.ts.map +1 -0
  384. package/dist/video/csv-export.js +133 -0
  385. package/dist/video/csv-export.js.map +1 -0
  386. package/dist/video/dependencies.d.ts +23 -0
  387. package/dist/video/dependencies.d.ts.map +1 -0
  388. package/dist/video/dependencies.js +36 -0
  389. package/dist/video/dependencies.js.map +1 -0
  390. package/dist/video/dialogue-fit.d.ts +23 -0
  391. package/dist/video/dialogue-fit.d.ts.map +1 -0
  392. package/dist/video/dialogue-fit.js +38 -0
  393. package/dist/video/dialogue-fit.js.map +1 -0
  394. package/dist/video/dialogue.d.ts +77 -0
  395. package/dist/video/dialogue.d.ts.map +1 -0
  396. package/dist/video/dialogue.js +143 -0
  397. package/dist/video/dialogue.js.map +1 -0
  398. package/dist/video/director-defaults.d.ts +37 -0
  399. package/dist/video/director-defaults.d.ts.map +1 -0
  400. package/dist/video/director-defaults.js +383 -0
  401. package/dist/video/director-defaults.js.map +1 -0
  402. package/dist/video/director-preflight.d.ts +53 -0
  403. package/dist/video/director-preflight.d.ts.map +1 -0
  404. package/dist/video/director-preflight.js +462 -0
  405. package/dist/video/director-preflight.js.map +1 -0
  406. package/dist/video/doctor-portfolio.d.ts +43 -0
  407. package/dist/video/doctor-portfolio.d.ts.map +1 -0
  408. package/dist/video/doctor-portfolio.js +137 -0
  409. package/dist/video/doctor-portfolio.js.map +1 -0
  410. package/dist/video/doctor.d.ts +13 -0
  411. package/dist/video/doctor.d.ts.map +1 -0
  412. package/dist/video/doctor.js +449 -0
  413. package/dist/video/doctor.js.map +1 -0
  414. package/dist/video/emotion-cues.d.ts +15 -0
  415. package/dist/video/emotion-cues.d.ts.map +1 -0
  416. package/dist/video/emotion-cues.js +37 -0
  417. package/dist/video/emotion-cues.js.map +1 -0
  418. package/dist/video/environment-assets.d.ts +28 -0
  419. package/dist/video/environment-assets.d.ts.map +1 -0
  420. package/dist/video/environment-assets.js +43 -0
  421. package/dist/video/environment-assets.js.map +1 -0
  422. package/dist/video/environment-auto-create.d.ts +20 -0
  423. package/dist/video/environment-auto-create.d.ts.map +1 -0
  424. package/dist/video/environment-auto-create.js +88 -0
  425. package/dist/video/environment-auto-create.js.map +1 -0
  426. package/dist/video/errors.d.ts +35 -0
  427. package/dist/video/errors.d.ts.map +1 -0
  428. package/dist/video/errors.js +117 -0
  429. package/dist/video/errors.js.map +1 -0
  430. package/dist/video/events.d.ts +11 -0
  431. package/dist/video/events.d.ts.map +1 -0
  432. package/dist/video/events.js +32 -0
  433. package/dist/video/events.js.map +1 -0
  434. package/dist/video/execute-autochain.d.ts +65 -0
  435. package/dist/video/execute-autochain.d.ts.map +1 -0
  436. package/dist/video/execute-autochain.js +165 -0
  437. package/dist/video/execute-autochain.js.map +1 -0
  438. package/dist/video/execute.d.ts +27 -0
  439. package/dist/video/execute.d.ts.map +1 -0
  440. package/dist/video/execute.js +477 -0
  441. package/dist/video/execute.js.map +1 -0
  442. package/dist/video/execution-cancel.d.ts +11 -0
  443. package/dist/video/execution-cancel.d.ts.map +1 -0
  444. package/dist/video/execution-cancel.js +85 -0
  445. package/dist/video/execution-cancel.js.map +1 -0
  446. package/dist/video/execution-plan.d.ts +5 -0
  447. package/dist/video/execution-plan.d.ts.map +1 -0
  448. package/dist/video/execution-plan.js +145 -0
  449. package/dist/video/execution-plan.js.map +1 -0
  450. package/dist/video/execution-profile.d.ts +25 -0
  451. package/dist/video/execution-profile.d.ts.map +1 -0
  452. package/dist/video/execution-profile.js +124 -0
  453. package/dist/video/execution-profile.js.map +1 -0
  454. package/dist/video/execution-runtime.d.ts +104 -0
  455. package/dist/video/execution-runtime.d.ts.map +1 -0
  456. package/dist/video/execution-runtime.js +750 -0
  457. package/dist/video/execution-runtime.js.map +1 -0
  458. package/dist/video/execution-seed.d.ts +14 -0
  459. package/dist/video/execution-seed.d.ts.map +1 -0
  460. package/dist/video/execution-seed.js +29 -0
  461. package/dist/video/execution-seed.js.map +1 -0
  462. package/dist/video/execution-status.d.ts +12 -0
  463. package/dist/video/execution-status.d.ts.map +1 -0
  464. package/dist/video/execution-status.js +666 -0
  465. package/dist/video/execution-status.js.map +1 -0
  466. package/dist/video/filmmaking-prompts.d.ts +356 -0
  467. package/dist/video/filmmaking-prompts.d.ts.map +1 -0
  468. package/dist/video/filmmaking-prompts.js +1212 -0
  469. package/dist/video/filmmaking-prompts.js.map +1 -0
  470. package/dist/video/final-media.d.ts +17 -0
  471. package/dist/video/final-media.d.ts.map +1 -0
  472. package/dist/video/final-media.js +78 -0
  473. package/dist/video/final-media.js.map +1 -0
  474. package/dist/video/finish.d.ts +99 -0
  475. package/dist/video/finish.d.ts.map +1 -0
  476. package/dist/video/finish.js +159 -0
  477. package/dist/video/finish.js.map +1 -0
  478. package/dist/video/flow-character-library.d.ts +143 -0
  479. package/dist/video/flow-character-library.d.ts.map +1 -0
  480. package/dist/video/flow-character-library.js +211 -0
  481. package/dist/video/flow-character-library.js.map +1 -0
  482. package/dist/video/flow-markers.d.ts +107 -0
  483. package/dist/video/flow-markers.d.ts.map +1 -0
  484. package/dist/video/flow-markers.js +278 -0
  485. package/dist/video/flow-markers.js.map +1 -0
  486. package/dist/video/gemini-analyze.d.ts +44 -0
  487. package/dist/video/gemini-analyze.d.ts.map +1 -0
  488. package/dist/video/gemini-analyze.js +323 -0
  489. package/dist/video/gemini-analyze.js.map +1 -0
  490. package/dist/video/gemini-continuity.d.ts +40 -0
  491. package/dist/video/gemini-continuity.d.ts.map +1 -0
  492. package/dist/video/gemini-continuity.js +145 -0
  493. package/dist/video/gemini-continuity.js.map +1 -0
  494. package/dist/video/gemini-judge.d.ts +33 -0
  495. package/dist/video/gemini-judge.d.ts.map +1 -0
  496. package/dist/video/gemini-judge.js +218 -0
  497. package/dist/video/gemini-judge.js.map +1 -0
  498. package/dist/video/gemini-key-pool.d.ts +23 -0
  499. package/dist/video/gemini-key-pool.d.ts.map +1 -0
  500. package/dist/video/gemini-key-pool.js +107 -0
  501. package/dist/video/gemini-key-pool.js.map +1 -0
  502. package/dist/video/gen-image-flow.d.ts +187 -0
  503. package/dist/video/gen-image-flow.d.ts.map +1 -0
  504. package/dist/video/gen-image-flow.js +331 -0
  505. package/dist/video/gen-image-flow.js.map +1 -0
  506. package/dist/video/gen-image.d.ts +153 -0
  507. package/dist/video/gen-image.d.ts.map +1 -0
  508. package/dist/video/gen-image.js +263 -0
  509. package/dist/video/gen-image.js.map +1 -0
  510. package/dist/video/generation-telemetry.d.ts +60 -0
  511. package/dist/video/generation-telemetry.d.ts.map +1 -0
  512. package/dist/video/generation-telemetry.js +214 -0
  513. package/dist/video/generation-telemetry.js.map +1 -0
  514. package/dist/video/http-error-safety.d.ts +9 -0
  515. package/dist/video/http-error-safety.d.ts.map +1 -0
  516. package/dist/video/http-error-safety.js +14 -0
  517. package/dist/video/http-error-safety.js.map +1 -0
  518. package/dist/video/image-dimensions.d.ts +7 -0
  519. package/dist/video/image-dimensions.d.ts.map +1 -0
  520. package/dist/video/image-dimensions.js +54 -0
  521. package/dist/video/image-dimensions.js.map +1 -0
  522. package/dist/video/legacy-import.d.ts +11 -0
  523. package/dist/video/legacy-import.d.ts.map +1 -0
  524. package/dist/video/legacy-import.js +181 -0
  525. package/dist/video/legacy-import.js.map +1 -0
  526. package/dist/video/library-clean.d.ts +34 -0
  527. package/dist/video/library-clean.d.ts.map +1 -0
  528. package/dist/video/library-clean.js +340 -0
  529. package/dist/video/library-clean.js.map +1 -0
  530. package/dist/video/lipsync.d.ts +72 -0
  531. package/dist/video/lipsync.d.ts.map +1 -0
  532. package/dist/video/lipsync.js +136 -0
  533. package/dist/video/lipsync.js.map +1 -0
  534. package/dist/video/media-host.d.ts +41 -0
  535. package/dist/video/media-host.d.ts.map +1 -0
  536. package/dist/video/media-host.js +106 -0
  537. package/dist/video/media-host.js.map +1 -0
  538. package/dist/video/metrics.d.ts +30 -0
  539. package/dist/video/metrics.d.ts.map +1 -0
  540. package/dist/video/metrics.js +81 -0
  541. package/dist/video/metrics.js.map +1 -0
  542. package/dist/video/motion-overlay/analyze-reel.d.ts +38 -0
  543. package/dist/video/motion-overlay/analyze-reel.d.ts.map +1 -0
  544. package/dist/video/motion-overlay/analyze-reel.js +185 -0
  545. package/dist/video/motion-overlay/analyze-reel.js.map +1 -0
  546. package/dist/video/motion-overlay/animate-render.d.ts +63 -0
  547. package/dist/video/motion-overlay/animate-render.d.ts.map +1 -0
  548. package/dist/video/motion-overlay/animate-render.js +128 -0
  549. package/dist/video/motion-overlay/animate-render.js.map +1 -0
  550. package/dist/video/motion-overlay/animate.d.ts +37 -0
  551. package/dist/video/motion-overlay/animate.d.ts.map +1 -0
  552. package/dist/video/motion-overlay/animate.js +97 -0
  553. package/dist/video/motion-overlay/animate.js.map +1 -0
  554. package/dist/video/motion-overlay/avatar-host-transport.d.ts +161 -0
  555. package/dist/video/motion-overlay/avatar-host-transport.d.ts.map +1 -0
  556. package/dist/video/motion-overlay/avatar-host-transport.js +325 -0
  557. package/dist/video/motion-overlay/avatar-host-transport.js.map +1 -0
  558. package/dist/video/motion-overlay/avatar-host.d.ts +131 -0
  559. package/dist/video/motion-overlay/avatar-host.d.ts.map +1 -0
  560. package/dist/video/motion-overlay/avatar-host.js +131 -0
  561. package/dist/video/motion-overlay/avatar-host.js.map +1 -0
  562. package/dist/video/motion-overlay/compose-prompt.d.ts +48 -0
  563. package/dist/video/motion-overlay/compose-prompt.d.ts.map +1 -0
  564. package/dist/video/motion-overlay/compose-prompt.js +217 -0
  565. package/dist/video/motion-overlay/compose-prompt.js.map +1 -0
  566. package/dist/video/motion-overlay/execute.d.ts +190 -0
  567. package/dist/video/motion-overlay/execute.d.ts.map +1 -0
  568. package/dist/video/motion-overlay/execute.js +205 -0
  569. package/dist/video/motion-overlay/execute.js.map +1 -0
  570. package/dist/video/motion-overlay/flow-pack.d.ts +65 -0
  571. package/dist/video/motion-overlay/flow-pack.d.ts.map +1 -0
  572. package/dist/video/motion-overlay/flow-pack.js +178 -0
  573. package/dist/video/motion-overlay/flow-pack.js.map +1 -0
  574. package/dist/video/motion-overlay/ingest.d.ts +74 -0
  575. package/dist/video/motion-overlay/ingest.d.ts.map +1 -0
  576. package/dist/video/motion-overlay/ingest.js +172 -0
  577. package/dist/video/motion-overlay/ingest.js.map +1 -0
  578. package/dist/video/motion-overlay/motifs.d.ts +63 -0
  579. package/dist/video/motion-overlay/motifs.d.ts.map +1 -0
  580. package/dist/video/motion-overlay/motifs.js +192 -0
  581. package/dist/video/motion-overlay/motifs.js.map +1 -0
  582. package/dist/video/motion-overlay/motion-style.d.ts +56 -0
  583. package/dist/video/motion-overlay/motion-style.d.ts.map +1 -0
  584. package/dist/video/motion-overlay/motion-style.js +130 -0
  585. package/dist/video/motion-overlay/motion-style.js.map +1 -0
  586. package/dist/video/motion-overlay/plan.d.ts +49 -0
  587. package/dist/video/motion-overlay/plan.d.ts.map +1 -0
  588. package/dist/video/motion-overlay/plan.js +79 -0
  589. package/dist/video/motion-overlay/plan.js.map +1 -0
  590. package/dist/video/motion-overlay/preview.d.ts +36 -0
  591. package/dist/video/motion-overlay/preview.d.ts.map +1 -0
  592. package/dist/video/motion-overlay/preview.js +169 -0
  593. package/dist/video/motion-overlay/preview.js.map +1 -0
  594. package/dist/video/motion-overlay/render-local.d.ts +118 -0
  595. package/dist/video/motion-overlay/render-local.d.ts.map +1 -0
  596. package/dist/video/motion-overlay/render-local.js +298 -0
  597. package/dist/video/motion-overlay/render-local.js.map +1 -0
  598. package/dist/video/motion-overlay/run.d.ts +58 -0
  599. package/dist/video/motion-overlay/run.d.ts.map +1 -0
  600. package/dist/video/motion-overlay/run.js +147 -0
  601. package/dist/video/motion-overlay/run.js.map +1 -0
  602. package/dist/video/motion-overlay/slice.d.ts +29 -0
  603. package/dist/video/motion-overlay/slice.d.ts.map +1 -0
  604. package/dist/video/motion-overlay/slice.js +88 -0
  605. package/dist/video/motion-overlay/slice.js.map +1 -0
  606. package/dist/video/motion-overlay/transcribe.d.ts +49 -0
  607. package/dist/video/motion-overlay/transcribe.d.ts.map +1 -0
  608. package/dist/video/motion-overlay/transcribe.js +180 -0
  609. package/dist/video/motion-overlay/transcribe.js.map +1 -0
  610. package/dist/video/motion-overlay/types.d.ts +82 -0
  611. package/dist/video/motion-overlay/types.d.ts.map +1 -0
  612. package/dist/video/motion-overlay/types.js +12 -0
  613. package/dist/video/motion-overlay/types.js.map +1 -0
  614. package/dist/video/motion-overlay/v2v-transport.d.ts +37 -0
  615. package/dist/video/motion-overlay/v2v-transport.d.ts.map +1 -0
  616. package/dist/video/motion-overlay/v2v-transport.js +178 -0
  617. package/dist/video/motion-overlay/v2v-transport.js.map +1 -0
  618. package/dist/video/motion-overlay/write.d.ts +40 -0
  619. package/dist/video/motion-overlay/write.d.ts.map +1 -0
  620. package/dist/video/motion-overlay/write.js +113 -0
  621. package/dist/video/motion-overlay/write.js.map +1 -0
  622. package/dist/video/multi-shot-artifact.d.ts +19 -0
  623. package/dist/video/multi-shot-artifact.d.ts.map +1 -0
  624. package/dist/video/multi-shot-artifact.js +44 -0
  625. package/dist/video/multi-shot-artifact.js.map +1 -0
  626. package/dist/video/multi-shot-prompt.d.ts +99 -0
  627. package/dist/video/multi-shot-prompt.d.ts.map +1 -0
  628. package/dist/video/multi-shot-prompt.js +466 -0
  629. package/dist/video/multi-shot-prompt.js.map +1 -0
  630. package/dist/video/music-video.d.ts +110 -0
  631. package/dist/video/music-video.d.ts.map +1 -0
  632. package/dist/video/music-video.js +190 -0
  633. package/dist/video/music-video.js.map +1 -0
  634. package/dist/video/narrate.d.ts +58 -0
  635. package/dist/video/narrate.d.ts.map +1 -0
  636. package/dist/video/narrate.js +145 -0
  637. package/dist/video/narrate.js.map +1 -0
  638. package/dist/video/native-dreamina.d.ts +35 -0
  639. package/dist/video/native-dreamina.d.ts.map +1 -0
  640. package/dist/video/native-dreamina.js +532 -0
  641. package/dist/video/native-dreamina.js.map +1 -0
  642. package/dist/video/native-flow-r2v.d.ts +113 -0
  643. package/dist/video/native-flow-r2v.d.ts.map +1 -0
  644. package/dist/video/native-flow-r2v.js +223 -0
  645. package/dist/video/native-flow-r2v.js.map +1 -0
  646. package/dist/video/native-runway.d.ts +41 -0
  647. package/dist/video/native-runway.d.ts.map +1 -0
  648. package/dist/video/native-runway.js +523 -0
  649. package/dist/video/native-runway.js.map +1 -0
  650. package/dist/video/native-seedance.d.ts +74 -0
  651. package/dist/video/native-seedance.d.ts.map +1 -0
  652. package/dist/video/native-seedance.js +461 -0
  653. package/dist/video/native-seedance.js.map +1 -0
  654. package/dist/video/native-veo.d.ts +20 -0
  655. package/dist/video/native-veo.d.ts.map +1 -0
  656. package/dist/video/native-veo.js +390 -0
  657. package/dist/video/native-veo.js.map +1 -0
  658. package/dist/video/next-actions.d.ts +27 -0
  659. package/dist/video/next-actions.d.ts.map +1 -0
  660. package/dist/video/next-actions.js +201 -0
  661. package/dist/video/next-actions.js.map +1 -0
  662. package/dist/video/obsidian-export.d.ts +12 -0
  663. package/dist/video/obsidian-export.d.ts.map +1 -0
  664. package/dist/video/obsidian-export.js +285 -0
  665. package/dist/video/obsidian-export.js.map +1 -0
  666. package/dist/video/obsidian-sync.d.ts +13 -0
  667. package/dist/video/obsidian-sync.d.ts.map +1 -0
  668. package/dist/video/obsidian-sync.js +479 -0
  669. package/dist/video/obsidian-sync.js.map +1 -0
  670. package/dist/video/obsidian-vault.d.ts +8 -0
  671. package/dist/video/obsidian-vault.d.ts.map +1 -0
  672. package/dist/video/obsidian-vault.js +81 -0
  673. package/dist/video/obsidian-vault.js.map +1 -0
  674. package/dist/video/outfit-prompts.d.ts +10 -0
  675. package/dist/video/outfit-prompts.d.ts.map +1 -0
  676. package/dist/video/outfit-prompts.js +14 -0
  677. package/dist/video/outfit-prompts.js.map +1 -0
  678. package/dist/video/outpaint-keyframe.d.ts +95 -0
  679. package/dist/video/outpaint-keyframe.d.ts.map +1 -0
  680. package/dist/video/outpaint-keyframe.js +244 -0
  681. package/dist/video/outpaint-keyframe.js.map +1 -0
  682. package/dist/video/pipeline-manifest.d.ts +4 -0
  683. package/dist/video/pipeline-manifest.d.ts.map +1 -0
  684. package/dist/video/pipeline-manifest.js +13 -0
  685. package/dist/video/pipeline-manifest.js.map +1 -0
  686. package/dist/video/pipeline-manifests/director.json +46 -0
  687. package/dist/video/pipeline-manifests/storyboard.json +46 -0
  688. package/dist/video/platform-specs.d.ts +26 -0
  689. package/dist/video/platform-specs.d.ts.map +1 -0
  690. package/dist/video/platform-specs.js +34 -0
  691. package/dist/video/platform-specs.js.map +1 -0
  692. package/dist/video/playbooks.d.ts +11 -0
  693. package/dist/video/playbooks.d.ts.map +1 -0
  694. package/dist/video/playbooks.js +22 -0
  695. package/dist/video/playbooks.js.map +1 -0
  696. package/dist/video/post-production.d.ts +57 -0
  697. package/dist/video/post-production.d.ts.map +1 -0
  698. package/dist/video/post-production.js +210 -0
  699. package/dist/video/post-production.js.map +1 -0
  700. package/dist/video/preview-portal/audit.d.ts +4 -0
  701. package/dist/video/preview-portal/audit.d.ts.map +1 -0
  702. package/dist/video/preview-portal/audit.js +16 -0
  703. package/dist/video/preview-portal/audit.js.map +1 -0
  704. package/dist/video/preview-portal/discovery.d.ts +23 -0
  705. package/dist/video/preview-portal/discovery.d.ts.map +1 -0
  706. package/dist/video/preview-portal/discovery.js +733 -0
  707. package/dist/video/preview-portal/discovery.js.map +1 -0
  708. package/dist/video/preview-portal/generate.d.ts +42 -0
  709. package/dist/video/preview-portal/generate.d.ts.map +1 -0
  710. package/dist/video/preview-portal/generate.js +101 -0
  711. package/dist/video/preview-portal/generate.js.map +1 -0
  712. package/dist/video/preview-portal/index.d.ts +12 -0
  713. package/dist/video/preview-portal/index.d.ts.map +1 -0
  714. package/dist/video/preview-portal/index.js +8 -0
  715. package/dist/video/preview-portal/index.js.map +1 -0
  716. package/dist/video/preview-portal/publish.d.ts +48 -0
  717. package/dist/video/preview-portal/publish.d.ts.map +1 -0
  718. package/dist/video/preview-portal/publish.js +169 -0
  719. package/dist/video/preview-portal/publish.js.map +1 -0
  720. package/dist/video/preview-portal/render.d.ts +4 -0
  721. package/dist/video/preview-portal/render.d.ts.map +1 -0
  722. package/dist/video/preview-portal/render.js +822 -0
  723. package/dist/video/preview-portal/render.js.map +1 -0
  724. package/dist/video/preview-portal/shared-assets.d.ts +6 -0
  725. package/dist/video/preview-portal/shared-assets.d.ts.map +1 -0
  726. package/dist/video/preview-portal/shared-assets.js +452 -0
  727. package/dist/video/preview-portal/shared-assets.js.map +1 -0
  728. package/dist/video/preview-portal/templates.d.ts +4 -0
  729. package/dist/video/preview-portal/templates.d.ts.map +1 -0
  730. package/dist/video/preview-portal/templates.js +109 -0
  731. package/dist/video/preview-portal/templates.js.map +1 -0
  732. package/dist/video/preview-portal/types.d.ts +246 -0
  733. package/dist/video/preview-portal/types.d.ts.map +1 -0
  734. package/dist/video/preview-portal/types.js +28 -0
  735. package/dist/video/preview-portal/types.js.map +1 -0
  736. package/dist/video/product-references.d.ts +21 -0
  737. package/dist/video/product-references.d.ts.map +1 -0
  738. package/dist/video/product-references.js +25 -0
  739. package/dist/video/product-references.js.map +1 -0
  740. package/dist/video/project-blueprint.d.ts +178 -0
  741. package/dist/video/project-blueprint.d.ts.map +1 -0
  742. package/dist/video/project-blueprint.js +286 -0
  743. package/dist/video/project-blueprint.js.map +1 -0
  744. package/dist/video/project-index.d.ts +82 -0
  745. package/dist/video/project-index.d.ts.map +1 -0
  746. package/dist/video/project-index.js +89 -0
  747. package/dist/video/project-index.js.map +1 -0
  748. package/dist/video/projects.d.ts +3 -0
  749. package/dist/video/projects.d.ts.map +1 -0
  750. package/dist/video/projects.js +18 -0
  751. package/dist/video/projects.js.map +1 -0
  752. package/dist/video/prompt-guidance.d.ts +14 -0
  753. package/dist/video/prompt-guidance.d.ts.map +1 -0
  754. package/dist/video/prompt-guidance.js +44 -0
  755. package/dist/video/prompt-guidance.js.map +1 -0
  756. package/dist/video/prompt-library.d.ts +11 -0
  757. package/dist/video/prompt-library.d.ts.map +1 -0
  758. package/dist/video/prompt-library.js +85 -0
  759. package/dist/video/prompt-library.js.map +1 -0
  760. package/dist/video/prompt-lint.d.ts +146 -0
  761. package/dist/video/prompt-lint.d.ts.map +1 -0
  762. package/dist/video/prompt-lint.js +433 -0
  763. package/dist/video/prompt-lint.js.map +1 -0
  764. package/dist/video/prompt-quality.d.ts +29 -0
  765. package/dist/video/prompt-quality.d.ts.map +1 -0
  766. package/dist/video/prompt-quality.js +532 -0
  767. package/dist/video/prompt-quality.js.map +1 -0
  768. package/dist/video/prompt-rules.d.ts +94 -0
  769. package/dist/video/prompt-rules.d.ts.map +1 -0
  770. package/dist/video/prompt-rules.js +169 -0
  771. package/dist/video/prompt-rules.js.map +1 -0
  772. package/dist/video/provider-adapter-runner.d.ts +5 -0
  773. package/dist/video/provider-adapter-runner.d.ts.map +1 -0
  774. package/dist/video/provider-adapter-runner.js +92 -0
  775. package/dist/video/provider-adapter-runner.js.map +1 -0
  776. package/dist/video/provider-platform/index.d.ts +6 -0
  777. package/dist/video/provider-platform/index.d.ts.map +1 -0
  778. package/dist/video/provider-platform/index.js +6 -0
  779. package/dist/video/provider-platform/index.js.map +1 -0
  780. package/dist/video/provider-platform/registry.d.ts +5 -0
  781. package/dist/video/provider-platform/registry.d.ts.map +1 -0
  782. package/dist/video/provider-platform/registry.js +279 -0
  783. package/dist/video/provider-platform/registry.js.map +1 -0
  784. package/dist/video/provider-platform/route-capabilities.d.ts +133 -0
  785. package/dist/video/provider-platform/route-capabilities.d.ts.map +1 -0
  786. package/dist/video/provider-platform/route-capabilities.js +192 -0
  787. package/dist/video/provider-platform/route-capabilities.js.map +1 -0
  788. package/dist/video/provider-platform/router.d.ts +7 -0
  789. package/dist/video/provider-platform/router.d.ts.map +1 -0
  790. package/dist/video/provider-platform/router.js +150 -0
  791. package/dist/video/provider-platform/router.js.map +1 -0
  792. package/dist/video/provider-platform/security.d.ts +8 -0
  793. package/dist/video/provider-platform/security.d.ts.map +1 -0
  794. package/dist/video/provider-platform/security.js +21 -0
  795. package/dist/video/provider-platform/security.js.map +1 -0
  796. package/dist/video/provider-platform/telemetry.d.ts +24 -0
  797. package/dist/video/provider-platform/telemetry.d.ts.map +1 -0
  798. package/dist/video/provider-platform/telemetry.js +88 -0
  799. package/dist/video/provider-platform/telemetry.js.map +1 -0
  800. package/dist/video/provider-platform/types.d.ts +139 -0
  801. package/dist/video/provider-platform/types.d.ts.map +1 -0
  802. package/dist/video/provider-platform/types.js +17 -0
  803. package/dist/video/provider-platform/types.js.map +1 -0
  804. package/dist/video/provider-status.d.ts +12 -0
  805. package/dist/video/provider-status.d.ts.map +1 -0
  806. package/dist/video/provider-status.js +169 -0
  807. package/dist/video/provider-status.js.map +1 -0
  808. package/dist/video/providers/dreamina-useapi.d.ts +170 -0
  809. package/dist/video/providers/dreamina-useapi.d.ts.map +1 -0
  810. package/dist/video/providers/dreamina-useapi.js +176 -0
  811. package/dist/video/providers/dreamina-useapi.js.map +1 -0
  812. package/dist/video/providers/flowmusic-useapi.d.ts +114 -0
  813. package/dist/video/providers/flowmusic-useapi.d.ts.map +1 -0
  814. package/dist/video/providers/flowmusic-useapi.js +159 -0
  815. package/dist/video/providers/flowmusic-useapi.js.map +1 -0
  816. package/dist/video/providers/google-flow.d.ts +57 -0
  817. package/dist/video/providers/google-flow.d.ts.map +1 -0
  818. package/dist/video/providers/google-flow.js +63 -0
  819. package/dist/video/providers/google-flow.js.map +1 -0
  820. package/dist/video/providers/public-host.d.ts +40 -0
  821. package/dist/video/providers/public-host.d.ts.map +1 -0
  822. package/dist/video/providers/public-host.js +91 -0
  823. package/dist/video/providers/public-host.js.map +1 -0
  824. package/dist/video/providers/runway-useapi.d.ts +159 -0
  825. package/dist/video/providers/runway-useapi.d.ts.map +1 -0
  826. package/dist/video/providers/runway-useapi.js +200 -0
  827. package/dist/video/providers/runway-useapi.js.map +1 -0
  828. package/dist/video/providers/xskill.d.ts +108 -0
  829. package/dist/video/providers/xskill.d.ts.map +1 -0
  830. package/dist/video/providers/xskill.js +233 -0
  831. package/dist/video/providers/xskill.js.map +1 -0
  832. package/dist/video/readiness.d.ts +18 -0
  833. package/dist/video/readiness.d.ts.map +1 -0
  834. package/dist/video/readiness.js +221 -0
  835. package/dist/video/readiness.js.map +1 -0
  836. package/dist/video/reference-sheet-store.d.ts +5 -0
  837. package/dist/video/reference-sheet-store.d.ts.map +1 -0
  838. package/dist/video/reference-sheet-store.js +28 -0
  839. package/dist/video/reference-sheet-store.js.map +1 -0
  840. package/dist/video/reference-sheets.d.ts +40 -0
  841. package/dist/video/reference-sheets.d.ts.map +1 -0
  842. package/dist/video/reference-sheets.js +160 -0
  843. package/dist/video/reference-sheets.js.map +1 -0
  844. package/dist/video/remix-narrated.d.ts +12 -0
  845. package/dist/video/remix-narrated.d.ts.map +1 -0
  846. package/dist/video/remix-narrated.js +73 -0
  847. package/dist/video/remix-narrated.js.map +1 -0
  848. package/dist/video/report-diff.d.ts +89 -0
  849. package/dist/video/report-diff.d.ts.map +1 -0
  850. package/dist/video/report-diff.js +176 -0
  851. package/dist/video/report-diff.js.map +1 -0
  852. package/dist/video/report-history.d.ts +40 -0
  853. package/dist/video/report-history.d.ts.map +1 -0
  854. package/dist/video/report-history.js +74 -0
  855. package/dist/video/report-history.js.map +1 -0
  856. package/dist/video/report.d.ts +15 -0
  857. package/dist/video/report.d.ts.map +1 -0
  858. package/dist/video/report.js +21 -0
  859. package/dist/video/report.js.map +1 -0
  860. package/dist/video/review-ui.d.ts +180 -0
  861. package/dist/video/review-ui.d.ts.map +1 -0
  862. package/dist/video/review-ui.js +2008 -0
  863. package/dist/video/review-ui.js.map +1 -0
  864. package/dist/video/scene-candidate-store.d.ts +12 -0
  865. package/dist/video/scene-candidate-store.d.ts.map +1 -0
  866. package/dist/video/scene-candidate-store.js +134 -0
  867. package/dist/video/scene-candidate-store.js.map +1 -0
  868. package/dist/video/scene-candidates.d.ts +57 -0
  869. package/dist/video/scene-candidates.d.ts.map +1 -0
  870. package/dist/video/scene-candidates.js +149 -0
  871. package/dist/video/scene-candidates.js.map +1 -0
  872. package/dist/video/scene-selection-store.d.ts +5 -0
  873. package/dist/video/scene-selection-store.d.ts.map +1 -0
  874. package/dist/video/scene-selection-store.js +22 -0
  875. package/dist/video/scene-selection-store.js.map +1 -0
  876. package/dist/video/scene-selection.d.ts +83 -0
  877. package/dist/video/scene-selection.d.ts.map +1 -0
  878. package/dist/video/scene-selection.js +225 -0
  879. package/dist/video/scene-selection.js.map +1 -0
  880. package/dist/video/scheduling.d.ts +3 -0
  881. package/dist/video/scheduling.d.ts.map +1 -0
  882. package/dist/video/scheduling.js +16 -0
  883. package/dist/video/scheduling.js.map +1 -0
  884. package/dist/video/scorecard.d.ts +12 -0
  885. package/dist/video/scorecard.d.ts.map +1 -0
  886. package/dist/video/scorecard.js +68 -0
  887. package/dist/video/scorecard.js.map +1 -0
  888. package/dist/video/seedance-asset-library.d.ts +82 -0
  889. package/dist/video/seedance-asset-library.d.ts.map +1 -0
  890. package/dist/video/seedance-asset-library.js +146 -0
  891. package/dist/video/seedance-asset-library.js.map +1 -0
  892. package/dist/video/seedance-blocks.d.ts +56 -0
  893. package/dist/video/seedance-blocks.d.ts.map +1 -0
  894. package/dist/video/seedance-blocks.js +97 -0
  895. package/dist/video/seedance-blocks.js.map +1 -0
  896. package/dist/video/seedance-chain-host.d.ts +42 -0
  897. package/dist/video/seedance-chain-host.d.ts.map +1 -0
  898. package/dist/video/seedance-chain-host.js +128 -0
  899. package/dist/video/seedance-chain-host.js.map +1 -0
  900. package/dist/video/seedance-content-filter.d.ts +80 -0
  901. package/dist/video/seedance-content-filter.d.ts.map +1 -0
  902. package/dist/video/seedance-content-filter.js +293 -0
  903. package/dist/video/seedance-content-filter.js.map +1 -0
  904. package/dist/video/seedance-skill-loader.d.ts +40 -0
  905. package/dist/video/seedance-skill-loader.d.ts.map +1 -0
  906. package/dist/video/seedance-skill-loader.js +53 -0
  907. package/dist/video/seedance-skill-loader.js.map +1 -0
  908. package/dist/video/sfx.d.ts +49 -0
  909. package/dist/video/sfx.d.ts.map +1 -0
  910. package/dist/video/sfx.js +104 -0
  911. package/dist/video/sfx.js.map +1 -0
  912. package/dist/video/shot-grammar.d.ts +103 -0
  913. package/dist/video/shot-grammar.d.ts.map +1 -0
  914. package/dist/video/shot-grammar.js +286 -0
  915. package/dist/video/shot-grammar.js.map +1 -0
  916. package/dist/video/show-bible.d.ts +113 -0
  917. package/dist/video/show-bible.d.ts.map +1 -0
  918. package/dist/video/show-bible.js +140 -0
  919. package/dist/video/show-bible.js.map +1 -0
  920. package/dist/video/soundtrack.d.ts +72 -0
  921. package/dist/video/soundtrack.d.ts.map +1 -0
  922. package/dist/video/soundtrack.js +171 -0
  923. package/dist/video/soundtrack.js.map +1 -0
  924. package/dist/video/stage-guards.d.ts +4 -0
  925. package/dist/video/stage-guards.d.ts.map +1 -0
  926. package/dist/video/stage-guards.js +94 -0
  927. package/dist/video/stage-guards.js.map +1 -0
  928. package/dist/video/status.d.ts +69 -0
  929. package/dist/video/status.d.ts.map +1 -0
  930. package/dist/video/status.js +245 -0
  931. package/dist/video/status.js.map +1 -0
  932. package/dist/video/story-bible.d.ts +70 -0
  933. package/dist/video/story-bible.d.ts.map +1 -0
  934. package/dist/video/story-bible.js +181 -0
  935. package/dist/video/story-bible.js.map +1 -0
  936. package/dist/video/storyboard-grid.d.ts +28 -0
  937. package/dist/video/storyboard-grid.d.ts.map +1 -0
  938. package/dist/video/storyboard-grid.js +231 -0
  939. package/dist/video/storyboard-grid.js.map +1 -0
  940. package/dist/video/storyboard-markdown.d.ts +62 -0
  941. package/dist/video/storyboard-markdown.d.ts.map +1 -0
  942. package/dist/video/storyboard-markdown.js +332 -0
  943. package/dist/video/storyboard-markdown.js.map +1 -0
  944. package/dist/video/storyboard-still-candidates.d.ts +31 -0
  945. package/dist/video/storyboard-still-candidates.d.ts.map +1 -0
  946. package/dist/video/storyboard-still-candidates.js +57 -0
  947. package/dist/video/storyboard-still-candidates.js.map +1 -0
  948. package/dist/video/storyboard-templates.d.ts +28 -0
  949. package/dist/video/storyboard-templates.d.ts.map +1 -0
  950. package/dist/video/storyboard-templates.js +215 -0
  951. package/dist/video/storyboard-templates.js.map +1 -0
  952. package/dist/video/studio/execute.d.ts +142 -0
  953. package/dist/video/studio/execute.d.ts.map +1 -0
  954. package/dist/video/studio/execute.js +270 -0
  955. package/dist/video/studio/execute.js.map +1 -0
  956. package/dist/video/studio/planner.d.ts +3 -0
  957. package/dist/video/studio/planner.d.ts.map +1 -0
  958. package/dist/video/studio/planner.js +110 -0
  959. package/dist/video/studio/planner.js.map +1 -0
  960. package/dist/video/studio/project-context.d.ts +4 -0
  961. package/dist/video/studio/project-context.d.ts.map +1 -0
  962. package/dist/video/studio/project-context.js +20 -0
  963. package/dist/video/studio/project-context.js.map +1 -0
  964. package/dist/video/studio/recipes.d.ts +4 -0
  965. package/dist/video/studio/recipes.d.ts.map +1 -0
  966. package/dist/video/studio/recipes.js +343 -0
  967. package/dist/video/studio/recipes.js.map +1 -0
  968. package/dist/video/studio/session.d.ts +8 -0
  969. package/dist/video/studio/session.d.ts.map +1 -0
  970. package/dist/video/studio/session.js +17 -0
  971. package/dist/video/studio/session.js.map +1 -0
  972. package/dist/video/studio/types.d.ts +59 -0
  973. package/dist/video/studio/types.d.ts.map +1 -0
  974. package/dist/video/studio/types.js +2 -0
  975. package/dist/video/studio/types.js.map +1 -0
  976. package/dist/video/template-store.d.ts +65 -0
  977. package/dist/video/template-store.d.ts.map +1 -0
  978. package/dist/video/template-store.js +168 -0
  979. package/dist/video/template-store.js.map +1 -0
  980. package/dist/video/timeline.d.ts +8 -0
  981. package/dist/video/timeline.d.ts.map +1 -0
  982. package/dist/video/timeline.js +21 -0
  983. package/dist/video/timeline.js.map +1 -0
  984. package/dist/video/title-overlay.d.ts +85 -0
  985. package/dist/video/title-overlay.d.ts.map +1 -0
  986. package/dist/video/title-overlay.js +163 -0
  987. package/dist/video/title-overlay.js.map +1 -0
  988. package/dist/video/types.d.ts +403 -0
  989. package/dist/video/types.d.ts.map +1 -0
  990. package/dist/video/types.js +2 -0
  991. package/dist/video/types.js.map +1 -0
  992. package/dist/video/veo-subprocess.d.ts +27 -0
  993. package/dist/video/veo-subprocess.d.ts.map +1 -0
  994. package/dist/video/veo-subprocess.js +52 -0
  995. package/dist/video/veo-subprocess.js.map +1 -0
  996. package/dist/video/verify-env.d.ts +43 -0
  997. package/dist/video/verify-env.d.ts.map +1 -0
  998. package/dist/video/verify-env.js +156 -0
  999. package/dist/video/verify-env.js.map +1 -0
  1000. package/dist/video/verify-final.d.ts +20 -0
  1001. package/dist/video/verify-final.d.ts.map +1 -0
  1002. package/dist/video/verify-final.js +39 -0
  1003. package/dist/video/verify-final.js.map +1 -0
  1004. package/dist/video/video-context.d.ts +10 -0
  1005. package/dist/video/video-context.d.ts.map +1 -0
  1006. package/dist/video/video-context.js +74 -0
  1007. package/dist/video/video-context.js.map +1 -0
  1008. package/dist/video/vocal-map.d.ts +55 -0
  1009. package/dist/video/vocal-map.d.ts.map +1 -0
  1010. package/dist/video/vocal-map.js +107 -0
  1011. package/dist/video/vocal-map.js.map +1 -0
  1012. package/dist/video/vocal-sync-plan.d.ts +76 -0
  1013. package/dist/video/vocal-sync-plan.d.ts.map +1 -0
  1014. package/dist/video/vocal-sync-plan.js +166 -0
  1015. package/dist/video/vocal-sync-plan.js.map +1 -0
  1016. package/dist/video/voice-clone.d.ts +152 -0
  1017. package/dist/video/voice-clone.d.ts.map +1 -0
  1018. package/dist/video/voice-clone.js +267 -0
  1019. package/dist/video/voice-clone.js.map +1 -0
  1020. package/dist/video/with-retry.d.ts +67 -0
  1021. package/dist/video/with-retry.d.ts.map +1 -0
  1022. package/dist/video/with-retry.js +105 -0
  1023. package/dist/video/with-retry.js.map +1 -0
  1024. package/dist/video/workload.d.ts +20 -0
  1025. package/dist/video/workload.d.ts.map +1 -0
  1026. package/dist/video/workload.js +55 -0
  1027. package/dist/video/workload.js.map +1 -0
  1028. package/dist/video/workspace.d.ts +109 -0
  1029. package/dist/video/workspace.d.ts.map +1 -0
  1030. package/dist/video/workspace.js +132 -0
  1031. package/dist/video/workspace.js.map +1 -0
  1032. package/docs/AGENT_INTEGRATION_RESEARCH.md +123 -0
  1033. package/docs/AI_FILMMAKING_PROMPTS.md +195 -0
  1034. package/docs/ARCHITECTURE.md +257 -0
  1035. package/docs/ASSEMBLE.md +376 -0
  1036. package/docs/BRAND_AGENCY.md +63 -0
  1037. package/docs/CLAWBOT_COVERAGE_PROMPT.md +78 -0
  1038. package/docs/CLI_REFERENCE.md +2638 -0
  1039. package/docs/CONCIERGE_PROMPT.md +139 -0
  1040. package/docs/Claude Code + Higgsfield MCP = FULL Creative Agency.md +179 -0
  1041. package/docs/DEMO_RECORDING.md +61 -0
  1042. package/docs/DEPRECATION.md +79 -0
  1043. package/docs/DIAGRAMS_SOURCE.md +347 -0
  1044. package/docs/DIRECTOR_BLUEPRINT.md +94 -0
  1045. package/docs/GENERATION_TELEMETRY.md +81 -0
  1046. package/docs/IMPROVE_PROMPT.md +76 -0
  1047. package/docs/INFOGRAPHICS_PROMPT.md +83 -0
  1048. package/docs/MASTER_PLAN_ALIGNMENT.md +563 -0
  1049. package/docs/MIGRATION.md +213 -0
  1050. package/docs/MOTION_OVERLAY.md +355 -0
  1051. package/docs/OBSIDIAN.md +300 -0
  1052. package/docs/OPERATIONS.md +142 -0
  1053. package/docs/OPERATOR_HANDOFF.md +108 -0
  1054. package/docs/PRODUCTION_WORKFLOW.md +148 -0
  1055. package/docs/PROJECT_LAYOUT.md +262 -0
  1056. package/docs/PROMPT_QUALITY.md +214 -0
  1057. package/docs/PROVIDER_PLATFORM.md +195 -0
  1058. package/docs/PUBLISHING.md +175 -0
  1059. package/docs/PYTHON_PIPELINE.md +139 -0
  1060. package/docs/REFERENCE_SHEETS.md +469 -0
  1061. package/docs/REFERENCE_VIDEO_SEEDANCE_MOTION_DESIGN_WORKFLOW.md +465 -0
  1062. package/docs/RELEASE_READINESS.md +573 -0
  1063. package/docs/REVIEW_UI_STORYBOARD_WORKFLOW.md +200 -0
  1064. package/docs/SCENE_CANDIDATES.md +518 -0
  1065. package/docs/SKILLS.md +477 -0
  1066. package/docs/SKILL_COHESION_PROMPT.md +88 -0
  1067. package/docs/STORY_BIBLE.md +288 -0
  1068. package/docs/STUDIO.md +96 -0
  1069. package/docs/TEMPLATES.md +143 -0
  1070. package/docs/UNIFICATION_AUDIT.md +321 -0
  1071. package/docs/UPDATE_DOCS_PROMPT.md +78 -0
  1072. package/docs/assets/demo-quickstart.cast +13 -0
  1073. package/docs/assets/demo-quickstart.gif +0 -0
  1074. package/docs/assets/diagram-architecture.jpg +0 -0
  1075. package/docs/assets/diagram-assemble.jpg +0 -0
  1076. package/docs/assets/diagram-lifecycle.jpg +0 -0
  1077. package/docs/assets/diagram-obsidian-loop.jpg +0 -0
  1078. package/docs/assets/diagram-obsidian-vault.jpg +0 -0
  1079. package/docs/assets/diagram-routing.jpg +0 -0
  1080. package/docs/assets/diagram-skills-ecosystem.jpg +0 -0
  1081. package/docs/assets/diagram-story-bible.jpg +0 -0
  1082. package/docs/assets/diagram-studio-goals.jpg +0 -0
  1083. package/docs/assets/docsite-preview.png +0 -0
  1084. package/docs/assets/logo.jpg +0 -0
  1085. package/docs/assets/logo.png +0 -0
  1086. package/docs/preview-portal-audit.md +151 -0
  1087. package/package.json +119 -0
  1088. package/playbooks/seedance-ugc.json +32 -0
  1089. package/playbooks/veo-generic.json +26 -0
  1090. package/references/video/.fixtures/multi-shot-runway-10s.txt +9 -0
  1091. package/references/video/.fixtures/multi-shot-seedance-10s.txt +9 -0
  1092. package/references/video/.fixtures/multi-shot-valid.txt +13 -0
  1093. package/references/video/.fixtures/multi-shot-veo-8s.txt +9 -0
  1094. package/references/video/ai-director-blueprint.md +614 -0
  1095. package/references/video/camera-bible.md +294 -0
  1096. package/references/video/character-reference-sheet.md +14 -0
  1097. package/references/video/checkpoint-protocol.md +26 -0
  1098. package/references/video/clone-ad-template-workflow.md +14 -0
  1099. package/references/video/dialogue-duration-preflight.md +17 -0
  1100. package/references/video/generation-telemetry.md +18 -0
  1101. package/references/video/multi-shot-framework.md +455 -0
  1102. package/references/video/seedance-skills/01-cinematic.md +1329 -0
  1103. package/references/video/seedance-skills/02-3d-cgi.md +884 -0
  1104. package/references/video/seedance-skills/03-cartoon.md +1668 -0
  1105. package/references/video/seedance-skills/04-comic-to-video.md +1810 -0
  1106. package/references/video/seedance-skills/05-fight-scenes.md +741 -0
  1107. package/references/video/seedance-skills/06-motion-design-ad.md +1145 -0
  1108. package/references/video/seedance-skills/07-ecommerce-ad.md +928 -0
  1109. package/references/video/seedance-skills/08-anime-action.md +1145 -0
  1110. package/references/video/seedance-skills/09-product-360.md +988 -0
  1111. package/references/video/seedance-skills/10-music-video.md +1662 -0
  1112. package/references/video/seedance-skills/11-social-hook.md +1874 -0
  1113. package/references/video/seedance-skills/12-brand-story.md +1151 -0
  1114. package/references/video/seedance-skills/13-fashion-lookbook.md +1236 -0
  1115. package/references/video/seedance-skills/14-food-beverage.md +1110 -0
  1116. package/references/video/seedance-skills/15-real-estate.md +2344 -0
  1117. package/references/video/seedance-transport-payloads.md +144 -0
  1118. package/references/video/seedance-ugc-formulas.md +104 -0
  1119. package/references/video/stage-directors.md +47 -0
  1120. package/references/video/style-template-schema.md +40 -0
  1121. package/references/video/veo-prompting-guide.md +42 -0
  1122. package/schemas/video/artifacts/analyze-output.schema.json +60 -0
  1123. package/schemas/video/artifacts/assemble-report.schema.json +116 -0
  1124. package/schemas/video/artifacts/asset-manifest.schema.json +23 -0
  1125. package/schemas/video/artifacts/batch-queue-manifest.schema.json +59 -0
  1126. package/schemas/video/artifacts/brand-definition.schema.json +93 -0
  1127. package/schemas/video/artifacts/brand-dna.schema.json +55 -0
  1128. package/schemas/video/artifacts/brief.schema.json +13 -0
  1129. package/schemas/video/artifacts/clone-plan.schema.json +44 -0
  1130. package/schemas/video/artifacts/dialogue.schema.json +52 -0
  1131. package/schemas/video/artifacts/environment-assets.schema.json +30 -0
  1132. package/schemas/video/artifacts/execution-plan.schema.json +64 -0
  1133. package/schemas/video/artifacts/execution-report.schema.json +37 -0
  1134. package/schemas/video/artifacts/filmmaking-prompts.schema.json +129 -0
  1135. package/schemas/video/artifacts/flow-characters.schema.json +31 -0
  1136. package/schemas/video/artifacts/flow-voices.schema.json +30 -0
  1137. package/schemas/video/artifacts/motion-overlay-plan.schema.json +50 -0
  1138. package/schemas/video/artifacts/multi-shot-prompt.schema.json +90 -0
  1139. package/schemas/video/artifacts/music-video-config.schema.json +108 -0
  1140. package/schemas/video/artifacts/narration.schema.json +54 -0
  1141. package/schemas/video/artifacts/product-references.schema.json +29 -0
  1142. package/schemas/video/artifacts/project-blueprint.schema.json +236 -0
  1143. package/schemas/video/artifacts/publish-report.schema.json +12 -0
  1144. package/schemas/video/artifacts/reference-sheets.schema.json +85 -0
  1145. package/schemas/video/artifacts/review-report.schema.json +12 -0
  1146. package/schemas/video/artifacts/scene-candidates.schema.json +86 -0
  1147. package/schemas/video/artifacts/scene-selection.schema.json +50 -0
  1148. package/schemas/video/artifacts/seedance-assets.schema.json +31 -0
  1149. package/schemas/video/artifacts/sfx.schema.json +31 -0
  1150. package/schemas/video/artifacts/show-bible.schema.json +66 -0
  1151. package/schemas/video/artifacts/soundtrack.schema.json +39 -0
  1152. package/schemas/video/artifacts/story-bible.schema.json +131 -0
  1153. package/schemas/video/artifacts/storyboard.schema.json +58 -0
  1154. package/schemas/video/artifacts/voice-clones.schema.json +37 -0
  1155. package/schemas/video/brand-profile.schema.json +20 -0
  1156. package/schemas/video/errors.json +48 -0
  1157. package/schemas/video/pipeline-manifest.schema.json +51 -0
  1158. package/skills/README.md +113 -0
  1159. package/skills/ai-director/SKILL.md +140 -0
  1160. package/skills/ai-filmmaking/SKILL.md +239 -0
  1161. package/skills/ai-slop-cleaner/SKILL.md +114 -0
  1162. package/skills/brand-agency/SKILL.md +181 -0
  1163. package/skills/brand-presenter/SKILL.md +114 -0
  1164. package/skills/build-fix/SKILL.md +145 -0
  1165. package/skills/bunty/SKILL.md +41 -0
  1166. package/skills/catalog.json +326 -0
  1167. package/skills/character-ad/SKILL.md +154 -0
  1168. package/skills/character-creator/SKILL.md +303 -0
  1169. package/skills/character-library/README.md +12 -0
  1170. package/skills/character-library/SKILL.md +110 -0
  1171. package/skills/clawbot/SKILL.md +26 -0
  1172. package/skills/concierge/SKILL.md +183 -0
  1173. package/skills/configure-notifications/SKILL.md +286 -0
  1174. package/skills/davendra-presenter/SKILL.md +27 -0
  1175. package/skills/davendra-presenter/assets/davendra_intro_1.jpg +0 -0
  1176. package/skills/davendra-presenter/assets/davendra_intro_2.jpg +0 -0
  1177. package/skills/davendra-presenter/assets/davendra_outro_1.jpg +0 -0
  1178. package/skills/davendra-presenter/assets/davendra_outro_2.jpg +0 -0
  1179. package/skills/deep-interview/SKILL.md +358 -0
  1180. package/skills/deepsearch/SKILL.md +38 -0
  1181. package/skills/doctor/SKILL.md +200 -0
  1182. package/skills/graphify/SKILL.md +616 -0
  1183. package/skills/help/SKILL.md +200 -0
  1184. package/skills/higgsfield-generate/SKILL.md +171 -0
  1185. package/skills/improvement-run/SKILL.md +47 -0
  1186. package/skills/motion-reel/SKILL.md +102 -0
  1187. package/skills/movie-director/SKILL.md +338 -0
  1188. package/skills/multi-shot-prompt/SKILL.md +77 -0
  1189. package/skills/nex-presenter/SKILL.md +25 -0
  1190. package/skills/nex-presenter/assets/logo_manifest.json +26 -0
  1191. package/skills/nex-presenter/assets/logo_source.jpg +0 -0
  1192. package/skills/nex-presenter/assets/nex_brief_intro.mp4 +0 -0
  1193. package/skills/nex-presenter/assets/nex_intro_1.jpg +0 -0
  1194. package/skills/nex-presenter/assets/nex_intro_2.jpg +0 -0
  1195. package/skills/nex-presenter/assets/nex_outro_1.jpg +0 -0
  1196. package/skills/nex-presenter/assets/nex_outro_2.jpg +0 -0
  1197. package/skills/nex-presenter/assets/text_overlay.png +0 -0
  1198. package/skills/note/SKILL.md +62 -0
  1199. package/skills/pipeline/SKILL.md +86 -0
  1200. package/skills/review/SKILL.md +38 -0
  1201. package/skills/runway/SKILL.md +131 -0
  1202. package/skills/seedance-prompts/SKILL.md +194 -0
  1203. package/skills/skill/SKILL.md +835 -0
  1204. package/skills/skills-auditor/SKILL.md +73 -0
  1205. package/skills/studio-mode/SKILL.md +148 -0
  1206. package/skills/ugc/SKILL.md +386 -0
  1207. package/skills/ui-ux-pro-max/SKILL.md +386 -0
  1208. package/skills/video-analyze-template/SKILL.md +77 -0
  1209. package/skills/video-clone-ad/SKILL.md +67 -0
  1210. package/skills/video-framework/SKILL.md +201 -0
  1211. package/skills/video-portfolio-ops/SKILL.md +84 -0
  1212. package/skills/video-post/SKILL.md +97 -0
  1213. package/skills/video-production-handoff/SKILL.md +130 -0
  1214. package/skills/video-release-readiness/SKILL.md +93 -0
  1215. package/skills/video-replicator/SKILL.md +368 -0
  1216. package/skills/video-review-ui-qa/SKILL.md +103 -0
  1217. package/skills/video-storyboard/SKILL.md +71 -0
  1218. package/skills/video-thumbnail-lab/SKILL.md +67 -0
  1219. package/skills/web-clone/SKILL.md +366 -0
  1220. package/skills/worker/SKILL.md +106 -0
  1221. package/skills/youtube-audio/SKILL.md +114 -0
  1222. package/src/video/analyze-output.ts +10 -0
  1223. package/src/video/archive-project.ts +65 -0
  1224. package/src/video/artifact-history.ts +23 -0
  1225. package/src/video/artifact-store.ts +59 -0
  1226. package/src/video/artifact-validation.ts +268 -0
  1227. package/src/video/artifacts.ts +156 -0
  1228. package/src/video/assemble/animate-slides.ts +199 -0
  1229. package/src/video/assemble/animation-styles.json +97 -0
  1230. package/src/video/assemble/animation-styles.ts +54 -0
  1231. package/src/video/assemble/assemble.ts +547 -0
  1232. package/src/video/assemble/audio-concat.ts +165 -0
  1233. package/src/video/assemble/audio-mix-plan.ts +150 -0
  1234. package/src/video/assemble/audio-utils.ts +101 -0
  1235. package/src/video/assemble/cut-segment.ts +121 -0
  1236. package/src/video/assemble/ffmpeg.ts +333 -0
  1237. package/src/video/assemble/gemini-vision-classify.ts +153 -0
  1238. package/src/video/assemble/index.ts +247 -0
  1239. package/src/video/assemble/media-qc.ts +252 -0
  1240. package/src/video/assemble/music.ts +261 -0
  1241. package/src/video/assemble/narration-fit.ts +90 -0
  1242. package/src/video/assemble/overlay.ts +225 -0
  1243. package/src/video/assemble/pdf.ts +169 -0
  1244. package/src/video/assemble/qa-dialogue-lint.ts +129 -0
  1245. package/src/video/assemble/qa-image-filter.ts +147 -0
  1246. package/src/video/assemble/qa-image-vision.ts +154 -0
  1247. package/src/video/assemble/qa-narration-vision.ts +135 -0
  1248. package/src/video/assemble/qa-narration.ts +139 -0
  1249. package/src/video/assemble/stitch-ad.ts +222 -0
  1250. package/src/video/assemble/stitch.ts +918 -0
  1251. package/src/video/assemble/text-card.ts +285 -0
  1252. package/src/video/assemble/title-card.ts +186 -0
  1253. package/src/video/assemble/transcript.ts +240 -0
  1254. package/src/video/assemble/tts-elevenlabs.ts +182 -0
  1255. package/src/video/assemble/tts.ts +227 -0
  1256. package/src/video/assemble/types.ts +45 -0
  1257. package/src/video/assemble/upscale.ts +80 -0
  1258. package/src/video/asset-spec.ts +53 -0
  1259. package/src/video/asset-tag-lookup.ts +51 -0
  1260. package/src/video/atomic-write.ts +7 -0
  1261. package/src/video/audio-platform/native-elevenlabs-sfx.ts +128 -0
  1262. package/src/video/audio-platform/native-elevenlabs-tts.ts +119 -0
  1263. package/src/video/audio-platform/native-flowmusic.ts +167 -0
  1264. package/src/video/audio-platform/native-gemini-tts.ts +226 -0
  1265. package/src/video/audio-platform/native-lyria.ts +231 -0
  1266. package/src/video/audio-platform/native-lyria3.ts +244 -0
  1267. package/src/video/audio-platform/registry.ts +220 -0
  1268. package/src/video/audio-platform/suno-backend.ts +36 -0
  1269. package/src/video/audio-platform/types.ts +138 -0
  1270. package/src/video/batch-queue.ts +685 -0
  1271. package/src/video/blueprint-prompt.ts +118 -0
  1272. package/src/video/brand-definition.ts +287 -0
  1273. package/src/video/brand-dna.ts +478 -0
  1274. package/src/video/brand-prompt.ts +28 -0
  1275. package/src/video/candidate-migrate.ts +171 -0
  1276. package/src/video/category-registry.ts +224 -0
  1277. package/src/video/chain-fallback.ts +53 -0
  1278. package/src/video/character-auto-create.ts +547 -0
  1279. package/src/video/character-consistency.ts +85 -0
  1280. package/src/video/characters.ts +145 -0
  1281. package/src/video/checkpoints.ts +60 -0
  1282. package/src/video/cinema-profile.ts +120 -0
  1283. package/src/video/cinematography.ts +1229 -0
  1284. package/src/video/cli-output.ts +94 -0
  1285. package/src/video/cli-schema.ts +505 -0
  1286. package/src/video/cost-estimate.ts +150 -0
  1287. package/src/video/csv-export.ts +150 -0
  1288. package/src/video/dependencies.ts +64 -0
  1289. package/src/video/dialogue-fit.ts +62 -0
  1290. package/src/video/dialogue.ts +221 -0
  1291. package/src/video/director-defaults.ts +432 -0
  1292. package/src/video/director-preflight.ts +543 -0
  1293. package/src/video/doctor-portfolio.ts +197 -0
  1294. package/src/video/doctor.ts +499 -0
  1295. package/src/video/emotion-cues.ts +36 -0
  1296. package/src/video/environment-assets.ts +69 -0
  1297. package/src/video/environment-auto-create.ts +122 -0
  1298. package/src/video/errors.ts +133 -0
  1299. package/src/video/events.ts +42 -0
  1300. package/src/video/execute-autochain.ts +226 -0
  1301. package/src/video/execute.ts +569 -0
  1302. package/src/video/execution-cancel.ts +103 -0
  1303. package/src/video/execution-plan.ts +178 -0
  1304. package/src/video/execution-profile.ts +162 -0
  1305. package/src/video/execution-runtime.ts +975 -0
  1306. package/src/video/execution-seed.ts +46 -0
  1307. package/src/video/execution-status.ts +736 -0
  1308. package/src/video/filmmaking-prompts.ts +1789 -0
  1309. package/src/video/final-media.ts +118 -0
  1310. package/src/video/finish.ts +255 -0
  1311. package/src/video/flow-character-library.ts +342 -0
  1312. package/src/video/flow-markers.ts +330 -0
  1313. package/src/video/gemini-analyze.ts +387 -0
  1314. package/src/video/gemini-continuity.ts +186 -0
  1315. package/src/video/gemini-judge.ts +300 -0
  1316. package/src/video/gemini-key-pool.ts +153 -0
  1317. package/src/video/gen-image-flow.ts +491 -0
  1318. package/src/video/gen-image.ts +392 -0
  1319. package/src/video/generation-telemetry.ts +282 -0
  1320. package/src/video/http-error-safety.ts +13 -0
  1321. package/src/video/image-dimensions.ts +69 -0
  1322. package/src/video/legacy-import.ts +197 -0
  1323. package/src/video/library-clean.ts +399 -0
  1324. package/src/video/lipsync.ts +200 -0
  1325. package/src/video/media-host.ts +153 -0
  1326. package/src/video/metrics.ts +116 -0
  1327. package/src/video/motion-overlay/analyze-reel.ts +200 -0
  1328. package/src/video/motion-overlay/animate-render.ts +176 -0
  1329. package/src/video/motion-overlay/animate.ts +93 -0
  1330. package/src/video/motion-overlay/avatar-host-transport.ts +458 -0
  1331. package/src/video/motion-overlay/avatar-host.ts +238 -0
  1332. package/src/video/motion-overlay/compose-prompt.ts +247 -0
  1333. package/src/video/motion-overlay/execute.ts +355 -0
  1334. package/src/video/motion-overlay/flow-pack.ts +223 -0
  1335. package/src/video/motion-overlay/ingest.ts +210 -0
  1336. package/src/video/motion-overlay/motifs.ts +223 -0
  1337. package/src/video/motion-overlay/motion-style.ts +162 -0
  1338. package/src/video/motion-overlay/plan.ts +111 -0
  1339. package/src/video/motion-overlay/preview.ts +191 -0
  1340. package/src/video/motion-overlay/render-local.ts +441 -0
  1341. package/src/video/motion-overlay/run.ts +217 -0
  1342. package/src/video/motion-overlay/slice.ts +98 -0
  1343. package/src/video/motion-overlay/transcribe.ts +211 -0
  1344. package/src/video/motion-overlay/types.ts +89 -0
  1345. package/src/video/motion-overlay/v2v-transport.ts +209 -0
  1346. package/src/video/motion-overlay/write.ts +142 -0
  1347. package/src/video/multi-shot-artifact.ts +64 -0
  1348. package/src/video/multi-shot-prompt.ts +608 -0
  1349. package/src/video/music-video.ts +324 -0
  1350. package/src/video/narrate.ts +221 -0
  1351. package/src/video/native-dreamina.ts +638 -0
  1352. package/src/video/native-flow-r2v.ts +279 -0
  1353. package/src/video/native-runway.ts +647 -0
  1354. package/src/video/native-seedance.ts +615 -0
  1355. package/src/video/native-veo.ts +470 -0
  1356. package/src/video/next-actions.ts +247 -0
  1357. package/src/video/obsidian-export.ts +336 -0
  1358. package/src/video/obsidian-sync.ts +649 -0
  1359. package/src/video/obsidian-vault.ts +96 -0
  1360. package/src/video/outfit-prompts.ts +14 -0
  1361. package/src/video/outpaint-keyframe.ts +365 -0
  1362. package/src/video/pipeline-manifest.ts +16 -0
  1363. package/src/video/pipeline-manifests/director.json +46 -0
  1364. package/src/video/pipeline-manifests/storyboard.json +46 -0
  1365. package/src/video/platform-specs.ts +50 -0
  1366. package/src/video/playbooks.ts +34 -0
  1367. package/src/video/post-production.ts +277 -0
  1368. package/src/video/preview-portal/audit.ts +20 -0
  1369. package/src/video/preview-portal/discovery.ts +787 -0
  1370. package/src/video/preview-portal/generate.ts +138 -0
  1371. package/src/video/preview-portal/index.ts +41 -0
  1372. package/src/video/preview-portal/publish.ts +215 -0
  1373. package/src/video/preview-portal/render.ts +865 -0
  1374. package/src/video/preview-portal/shared-assets.ts +455 -0
  1375. package/src/video/preview-portal/templates.ts +112 -0
  1376. package/src/video/preview-portal/types.ts +288 -0
  1377. package/src/video/product-references.ts +43 -0
  1378. package/src/video/project-blueprint.ts +458 -0
  1379. package/src/video/project-index.ts +179 -0
  1380. package/src/video/projects.ts +18 -0
  1381. package/src/video/prompt-guidance.ts +64 -0
  1382. package/src/video/prompt-library.ts +96 -0
  1383. package/src/video/prompt-lint.ts +568 -0
  1384. package/src/video/prompt-quality.ts +635 -0
  1385. package/src/video/prompt-rules.ts +209 -0
  1386. package/src/video/provider-adapter-runner.ts +104 -0
  1387. package/src/video/provider-platform/index.ts +5 -0
  1388. package/src/video/provider-platform/registry.ts +286 -0
  1389. package/src/video/provider-platform/route-capabilities.ts +327 -0
  1390. package/src/video/provider-platform/router.ts +221 -0
  1391. package/src/video/provider-platform/security.ts +29 -0
  1392. package/src/video/provider-platform/telemetry.ts +116 -0
  1393. package/src/video/provider-platform/types.ts +192 -0
  1394. package/src/video/provider-status.ts +199 -0
  1395. package/src/video/providers/dreamina-useapi.ts +345 -0
  1396. package/src/video/providers/flowmusic-useapi.ts +252 -0
  1397. package/src/video/providers/google-flow.ts +110 -0
  1398. package/src/video/providers/public-host.ts +128 -0
  1399. package/src/video/providers/runway-useapi.ts +377 -0
  1400. package/src/video/providers/xskill.ts +304 -0
  1401. package/src/video/readiness.ts +284 -0
  1402. package/src/video/reference-sheet-store.ts +40 -0
  1403. package/src/video/reference-sheets.ts +224 -0
  1404. package/src/video/remix-narrated.ts +92 -0
  1405. package/src/video/report-diff.ts +299 -0
  1406. package/src/video/report-history.ts +122 -0
  1407. package/src/video/report.ts +35 -0
  1408. package/src/video/review-ui.ts +2495 -0
  1409. package/src/video/scene-candidate-store.ts +152 -0
  1410. package/src/video/scene-candidates.ts +195 -0
  1411. package/src/video/scene-selection-store.ts +36 -0
  1412. package/src/video/scene-selection.ts +306 -0
  1413. package/src/video/scheduling.ts +18 -0
  1414. package/src/video/scorecard.ts +90 -0
  1415. package/src/video/seedance-asset-library.ts +259 -0
  1416. package/src/video/seedance-blocks.ts +118 -0
  1417. package/src/video/seedance-chain-host.ts +152 -0
  1418. package/src/video/seedance-content-filter.ts +354 -0
  1419. package/src/video/seedance-skill-loader.ts +83 -0
  1420. package/src/video/sfx.ts +159 -0
  1421. package/src/video/shot-grammar.ts +349 -0
  1422. package/src/video/show-bible.ts +235 -0
  1423. package/src/video/soundtrack.ts +257 -0
  1424. package/src/video/stage-guards.ts +112 -0
  1425. package/src/video/status.ts +342 -0
  1426. package/src/video/story-bible.ts +302 -0
  1427. package/src/video/storyboard-grid.ts +320 -0
  1428. package/src/video/storyboard-markdown.ts +434 -0
  1429. package/src/video/storyboard-still-candidates.ts +82 -0
  1430. package/src/video/storyboard-templates.ts +249 -0
  1431. package/src/video/studio/execute.ts +401 -0
  1432. package/src/video/studio/planner.ts +114 -0
  1433. package/src/video/studio/project-context.ts +25 -0
  1434. package/src/video/studio/recipes.ts +346 -0
  1435. package/src/video/studio/session.ts +24 -0
  1436. package/src/video/studio/types.ts +76 -0
  1437. package/src/video/template-store.ts +241 -0
  1438. package/src/video/timeline.ts +32 -0
  1439. package/src/video/title-overlay.ts +234 -0
  1440. package/src/video/types.ts +465 -0
  1441. package/src/video/veo-subprocess.ts +77 -0
  1442. package/src/video/verify-env.ts +206 -0
  1443. package/src/video/verify-final.ts +65 -0
  1444. package/src/video/video-context.ts +92 -0
  1445. package/src/video/vocal-map.ts +155 -0
  1446. package/src/video/vocal-sync-plan.ts +224 -0
  1447. package/src/video/voice-clone.ts +410 -0
  1448. package/src/video/with-retry.ts +149 -0
  1449. package/src/video/workload.ts +87 -0
  1450. package/src/video/workspace.ts +255 -0
  1451. package/tmp/review-station/index.html +4194 -0
  1452. package/tsconfig.json +19 -0
@@ -0,0 +1,865 @@
1
+ import type {
2
+ PreviewPortalAsset,
3
+ PreviewPortalBrand,
4
+ PreviewPortalIndexRenderOptions,
5
+ PreviewPortalProject,
6
+ PreviewPortalReferenceSlot,
7
+ PreviewPortalRenderOptions,
8
+ PreviewPortalScene,
9
+ PreviewPortalSurface,
10
+ PreviewPortalTemplate,
11
+ } from './types.js';
12
+ import { PORTAL_CLIENT_JS, PORTAL_CSS, PORTAL_EDITOR_JS, PORTAL_JS, PORTAL_REVIEW_TABS_JS } from './shared-assets.js';
13
+ import { resolvePreviewPortalTemplate } from './templates.js';
14
+
15
+ export function renderPreviewPortalHtml(options: PreviewPortalRenderOptions): string {
16
+ if (options.surface === 'compare') {
17
+ return renderComparePortalHtml(options);
18
+ }
19
+ const mode = modeForSurface(options.surface);
20
+ const { project } = options;
21
+ const template = resolvePreviewPortalTemplate(project.template);
22
+ // Size the media cards + hero to the project's aspect ratio (CSS keys off this
23
+ // attribute) so vertical 9:16 clips render portrait, not letterboxed landscape.
24
+ const aspect = aspectForProject(project);
25
+ const final = project.assets.find((asset) => asset.section === 'final' && asset.kind === 'video');
26
+ const stats = [
27
+ [project.run.runId, 'run'],
28
+ [template.name, 'template'],
29
+ [String(project.assets.filter((asset) => asset.kind === 'video').length), 'videos'],
30
+ [String(project.assets.filter((asset) => asset.kind === 'image').length), 'images'],
31
+ ];
32
+ const review = isReviewSurface(options.surface);
33
+ const reviewModeAttr = review ? ` data-review-mode="${options.surface === 'client-review' ? 'client' : 'editor'}"` : '';
34
+ const sections = `${final ? renderHeroVideo(final, template) : ''}${renderTemplateSections(project, template, options.surface)}${options.surface === 'preview' ? renderBrandBook(project) : ''}`;
35
+ // Review surface = one feedback page with Decide|Compare tabs + an editor↔client
36
+ // mode toggle. Preview stays a clean, controls-free deliverable.
37
+ const content = review
38
+ ? `${renderReviewBar(options.surface)}<div class="tab-panel" data-tab="decide">${sections}</div><div class="tab-panel" data-tab="compare" hidden>${renderCompareTab(project)}</div>`
39
+ : sections;
40
+ return `<!doctype html>
41
+ <html lang="en">
42
+ <head>
43
+ <meta charset="utf-8">
44
+ <meta name="viewport" content="width=device-width, initial-scale=1">
45
+ <link rel="icon" href="data:,">
46
+ <title>${esc(project.title)}</title>
47
+ <style>${PORTAL_CSS}</style>${renderBrandTheme(project, options.surface)}
48
+ </head>
49
+ <body data-mode="${mode}" data-aspect="${esc(aspect)}"${reviewModeAttr}>
50
+ ${options.surface === 'preview' ? '<div class="grain" aria-hidden="true"></div>' : ''}<nav class="toc" id="toc" aria-label="Sections"></nav>
51
+ <header class="hero">
52
+ ${renderBrandBar(project, options.surface)}<div class="eyebrow">${labelForSurface(options.surface)} · ${esc(template.heroLabel)}${renderStatusChip(project, options.surface)}</div>
53
+ <h1>${esc(project.title)}</h1>
54
+ ${renderHeroTagline(project, options.surface)}${project.summary ? `<p class="sub">${esc(project.summary)}</p>` : ''}
55
+ <div class="stats">${stats.map(([value, label]) => `<div class="stat"><div class="v">${esc(value)}</div><div class="l">${esc(label)}</div></div>`).join('')}</div>
56
+ ${renderSoundtrackPlayer(options.surface, project)}
57
+ </header>
58
+ ${options.surface === 'preview' ? renderFilterChips() : ''}${content}
59
+ ${renderHud(options.surface)}
60
+ ${renderShortcutsHelp()}
61
+ <footer>${project.brand ? `${esc(project.brand.brandName)} · produced with videoclaw · ` : 'Generated by videoclaw · '}${esc(project.slug)} · ${esc(fmtDate(project.run.updatedAt))}</footer>
62
+ <script>${PORTAL_JS}${scriptForSurface(options.surface)}</script>
63
+ </body>
64
+ </html>
65
+ `;
66
+ }
67
+
68
+ /** The feedback "family" — all render the single tabbed Review surface. */
69
+ function isReviewSurface(surface: PreviewPortalSurface): boolean {
70
+ return surface === 'edit' || surface === 'review' || surface === 'client-review';
71
+ }
72
+
73
+ /** Tab bar (Decide | Compare) + editor↔client mode toggle for the Review surface. */
74
+ function renderReviewBar(surface: PreviewPortalSurface): string {
75
+ const client = surface === 'client-review';
76
+ return `<div class="review-bar">
77
+ <button type="button" class="review-tab" data-tab="decide" aria-selected="true">Decide</button>
78
+ <button type="button" class="review-tab" data-tab="compare" aria-selected="false">Compare</button>
79
+ <div class="review-mode"><span>Feedback as</span>
80
+ <button type="button" data-mode="editor" aria-pressed="${client ? 'false' : 'true'}">Me ↔ Claude</button>
81
+ <button type="button" data-mode="client" aria-pressed="${client ? 'true' : 'false'}">Client</button>
82
+ </div>
83
+ </div>`;
84
+ }
85
+
86
+ /** The Compare tab: run/version comparison for this project (empty-state friendly). */
87
+ function renderCompareTab(project: PreviewPortalProject): string {
88
+ return `<section id="compare" data-toc="Compare">
89
+ <div class="section-head"><h2>Compare</h2><div class="section-title">Run Comparison</div><div class="section-sub">Compare finals across this project's runs.</div></div>
90
+ <div class="grid">${renderCompareCard(project.projectDir, project)}</div>
91
+ </section>`;
92
+ }
93
+
94
+ export function renderPreviewPortalIndexHtml(options: PreviewPortalIndexRenderOptions): string {
95
+ const generatedAt = options.generatedAt ?? new Date().toISOString();
96
+ const title = options.title ?? (options.client ? `${options.client} Review Index` : 'Videoclaw Review Index');
97
+ const stats = [
98
+ [String(options.projects.length), 'projects'],
99
+ [String(options.projects.filter((project) => project.status === 'published').length), 'published'],
100
+ [String(options.projects.filter((project) => project.status.includes('review')).length), 'in review'],
101
+ [String(options.projects.reduce((sum, project) => sum + project.assets.length, 0)), 'assets'],
102
+ ];
103
+ return `<!doctype html>
104
+ <html lang="en">
105
+ <head>
106
+ <meta charset="utf-8">
107
+ <meta name="viewport" content="width=device-width, initial-scale=1">
108
+ <link rel="icon" href="data:,">
109
+ <title>${esc(title)}</title>
110
+ <style>${PORTAL_CSS}</style>
111
+ </head>
112
+ <body data-mode="preview">
113
+ <nav class="toc" id="toc" aria-label="Sections"></nav>
114
+ <header class="hero">
115
+ <div class="eyebrow">client portal · ${options.client ? esc(options.client) : 'all clients'}</div>
116
+ <h1>${esc(title)}</h1>
117
+ <p class="sub">Review, compare, and deliver generated video projects from one consistent index.</p>
118
+ <div class="stats">${stats.map(([value, label]) => `<div class="stat"><div class="v">${esc(value)}</div><div class="l">${esc(label)}</div></div>`).join('')}</div>
119
+ </header>
120
+ <section id="projects" data-toc="Projects">
121
+ <div class="section-head"><h2>Projects</h2><div class="section-title">Project Library</div><div class="section-sub">${options.projects.length} project${options.projects.length === 1 ? '' : 's'} available.</div></div>
122
+ <div class="grid">
123
+ ${options.projects.map((project) => renderProjectIndexCard(project, {
124
+ linkPrefix: options.linkPrefix ?? '',
125
+ linkMode: options.linkMode ?? 'local',
126
+ client: options.client ?? null,
127
+ })).join('') || '<div class="card"><div class="meta"><div class="title">No projects found</div><div class="who">Generate a project portal first, then rebuild this index.</div></div></div>'}
128
+ </div>
129
+ </section>
130
+ <footer>Generated by videoclaw · ${esc(generatedAt)}</footer>
131
+ <script>${PORTAL_JS}</script>
132
+ </body>
133
+ </html>
134
+ `;
135
+ }
136
+
137
+ function renderComparePortalHtml(options: PreviewPortalRenderOptions): string {
138
+ const projects = options.compareProjects?.length ? options.compareProjects : [options.project];
139
+ const title = `${options.project.title} Compare`;
140
+ const stats = [
141
+ [String(projects.length), 'versions'],
142
+ [String(projects.filter((project) => project.assets.some((asset) => asset.section === 'final' && asset.kind === 'video')).length), 'finals'],
143
+ [String(projects.reduce((sum, project) => sum + project.assets.filter((asset) => asset.kind === 'video').length, 0)), 'videos'],
144
+ [String(projects.reduce((sum, project) => sum + project.assets.filter((asset) => asset.kind === 'image').length, 0)), 'images'],
145
+ ];
146
+ return `<!doctype html>
147
+ <html lang="en">
148
+ <head>
149
+ <meta charset="utf-8">
150
+ <meta name="viewport" content="width=device-width, initial-scale=1">
151
+ <link rel="icon" href="data:,">
152
+ <title>${esc(title)}</title>
153
+ <style>${PORTAL_CSS}</style>
154
+ </head>
155
+ <body data-mode="compare">
156
+ <nav class="toc" id="toc" aria-label="Sections"></nav>
157
+ <header class="hero">
158
+ <div class="eyebrow">compare · ${esc(options.project.template)}</div>
159
+ <h1>${esc(title)}</h1>
160
+ ${options.project.summary ? `<p class="sub">${esc(options.project.summary)}</p>` : ''}
161
+ <div class="stats">${stats.map(([value, label]) => `<div class="stat"><div class="v">${esc(value)}</div><div class="l">${esc(label)}</div></div>`).join('')}</div>
162
+ </header>
163
+ <section id="versions" data-toc="Versions">
164
+ <div class="section-head"><h2>Versions</h2><div class="section-title">Run Comparison</div><div class="section-sub">Compare finals, run metadata, and links for each generated version.</div></div>
165
+ <div class="grid">
166
+ ${projects.map((project) => renderCompareCard(options.project.projectDir, project)).join('')}
167
+ </div>
168
+ </section>
169
+ <footer>Generated by videoclaw · ${esc(options.project.slug)} · ${esc(fmtDate(options.project.run.updatedAt))}</footer>
170
+ <script>${PORTAL_JS}</script>
171
+ </body>
172
+ </html>
173
+ `;
174
+ }
175
+
176
+ function renderSoundtrackPlayer(surface: PreviewPortalSurface, project: PreviewPortalProject): string {
177
+ // Soundtrack player is part of the polished final showcase only. When no
178
+ // soundtrack was discovered, emit nothing (no broken/empty <audio> element).
179
+ if (surface !== 'preview' || !project.soundtrack) return '';
180
+ const { path, label, candidates } = project.soundtrack;
181
+
182
+ // A/B candidates: render one labelled player per backend so a human can
183
+ // compare/pick. The selected candidate is flagged as the headline.
184
+ if (candidates && candidates.length > 1) {
185
+ const rows = candidates
186
+ .map(
187
+ (c) =>
188
+ `<div class="soundtrack-player">
189
+ <span class="soundtrack-label">${esc(c.label)}${c.selected ? ' · selected' : ''}</span>
190
+ <audio controls preload="none" data-downloadable src="${escAttr(c.path)}"></audio>
191
+ </div>`,
192
+ )
193
+ .join('\n');
194
+ return rows;
195
+ }
196
+
197
+ return `<div class="soundtrack-player">
198
+ <span class="soundtrack-label">${esc(label)}</span>
199
+ <audio controls preload="none" data-downloadable src="${escAttr(path)}"></audio>
200
+ </div>`;
201
+ }
202
+
203
+ /**
204
+ * Per-ASSET aspect attributes: class for the orientation bucket (drives the
205
+ * hero/card max-height CSS) plus an exact inline aspect-ratio when dimensions
206
+ * were probed. A 9:16 deliverable must render in a portrait card even inside a
207
+ * 16:9 project — never letterboxed in a landscape box.
208
+ */
209
+ function mediaAspectAttrs(asset: PreviewPortalAsset): string {
210
+ const cls = asset.orientation ? ` class="orient-${asset.orientation}"` : '';
211
+ const style = asset.width && asset.height ? ` style="aspect-ratio:${asset.width}/${asset.height}"` : '';
212
+ return `${cls}${style}`;
213
+ }
214
+
215
+ function renderHeroVideo(asset: PreviewPortalAsset, template: PreviewPortalTemplate): string {
216
+ return `<div class="hero-video">
217
+ <video${mediaAspectAttrs(asset)} controls preload="metadata" playsinline data-downloadable src="${escAttr(asset.path)}"></video>
218
+ <div class="final-meta"><span class="num">${esc(template.primaryAssetLabel)}</span><span>${esc(asset.path)}</span></div>
219
+ </div>`;
220
+ }
221
+
222
+ function renderProjectIndexCard(
223
+ project: PreviewPortalProject,
224
+ options: { linkPrefix: string; linkMode: 'local' | 'published-run'; client?: string | null },
225
+ ): string {
226
+ const final = project.assets.find((asset) => asset.section === 'final' && asset.kind === 'video');
227
+ const poster = project.assets.find((asset) => asset.kind === 'image');
228
+ const base = projectIndexBase(project, options);
229
+ const media = final
230
+ ? `<video${mediaAspectAttrs(final)} controls preload="metadata" data-downloadable src="${escAttr(base)}/${escAttr(final.path)}"></video>`
231
+ : poster
232
+ ? `<img${mediaAspectAttrs(poster)} data-downloadable data-lightbox-group="projects" data-lb-caption="${escAttr(project.title)}" src="${escAttr(base)}/${escAttr(poster.path)}" alt="${escAttr(project.title)}">`
233
+ : '';
234
+ return `<div class="card" data-card-kind="project" data-card-id="${escAttr(project.slug)}">
235
+ ${media}
236
+ <div class="meta"><div class="num">${esc(project.status)}</div><div class="title">${esc(project.title)}</div><div class="who">${esc(project.slug)} · ${esc(project.template)} · ${esc(fmtDate(project.run.updatedAt))}</div>
237
+ <div class="who"><a href="${escAttr(base)}/review.html">Review</a> · <a href="${escAttr(base)}/preview.html">Preview</a></div>
238
+ </div>
239
+ </div>`;
240
+ }
241
+
242
+ function projectIndexBase(
243
+ project: PreviewPortalProject,
244
+ options: { linkPrefix: string; linkMode: 'local' | 'published-run'; client?: string | null },
245
+ ): string {
246
+ if (options.linkMode === 'local') return `${options.linkPrefix}${project.slug}`;
247
+ const runPath = `${project.slug}/runs/${project.run.runId}`;
248
+ if (options.client) return `${options.linkPrefix}${runPath}`;
249
+ return `${options.linkPrefix}clients/${slugify(project.client ?? 'unknown')}/${runPath}`;
250
+ }
251
+
252
+ function renderCompareCard(baseProjectDir: string, project: PreviewPortalProject): string {
253
+ const final = project.assets.find((asset) => asset.section === 'final' && asset.kind === 'video');
254
+ const prefix = relativePrefix(baseProjectDir, project.projectDir);
255
+ const media = final
256
+ ? `<video${mediaAspectAttrs(final)} controls preload="metadata" data-downloadable src="${escAttr(prefix)}${escAttr(final.path)}"></video>`
257
+ : '<div class="meta"><code>No final video discovered</code></div>';
258
+ return `<div class="card" data-card-kind="run" data-card-id="${escAttr(project.slug)}-${escAttr(project.run.runId)}">
259
+ ${media}
260
+ <div class="meta"><div class="num">${esc(project.run.status)}</div><div class="title">${esc(project.title)}</div><div class="who">${esc(project.slug)} · ${esc(project.run.runId)} · ${esc(project.template)}</div>
261
+ <div class="who">Updated ${esc(fmtDate(project.run.updatedAt))}</div>
262
+ <div class="who"><a href="${escAttr(prefix)}review.html">Review</a> · <a href="${escAttr(prefix)}preview.html">Preview</a></div>
263
+ </div>
264
+ </div>`;
265
+ }
266
+
267
+ function relativePrefix(baseProjectDir: string, targetProjectDir: string): string {
268
+ if (baseProjectDir === targetProjectDir) return '';
269
+ const base = baseProjectDir.split('/').filter(Boolean);
270
+ const target = targetProjectDir.split('/').filter(Boolean);
271
+ while (base.length && target.length && base[0] === target[0]) {
272
+ base.shift();
273
+ target.shift();
274
+ }
275
+ return `${base.map(() => '..').join('/')}/${target.join('/')}/`.replace(/^\//, '');
276
+ }
277
+
278
+ function renderCardsSection(
279
+ id: string,
280
+ title: string,
281
+ assets: PreviewPortalAsset[],
282
+ surface: PreviewPortalSurface,
283
+ ): string {
284
+ if (assets.length === 0) return '';
285
+ return `<section id="${id}" data-toc="${escAttr(title)}">
286
+ <div class="section-head"><h2>${esc(title)}</h2><div class="section-title">${esc(title)}</div><div class="section-sub">${assets.length} item${assets.length === 1 ? '' : 's'} discovered.</div></div>
287
+ <div class="grid">
288
+ ${assets.map((asset) => renderAssetCard(asset, surface)).join('')}
289
+ </div>
290
+ </section>`;
291
+ }
292
+
293
+ /**
294
+ * Production-sheet sections that every template should surface (Cast + the
295
+ * scene/character/candidate/story sheet dirs). They are spliced in right after
296
+ * the storyboard so they read as "what we built" before the raw clip/image
297
+ * grids, without editing all six template section orders. Each renders only when
298
+ * it has content, so a template that already lists one keeps a single copy.
299
+ */
300
+ const PRODUCTION_SHEET_SECTIONS = ['cast', 'keyframes', 'reference-sheets', 'scene-candidates', 'story-sheets'];
301
+
302
+ function effectiveSectionOrder(template: PreviewPortalTemplate): string[] {
303
+ const order = [...template.sectionOrder];
304
+ const missing = PRODUCTION_SHEET_SECTIONS.filter((section) => !order.includes(section));
305
+ if (missing.length === 0) return order;
306
+ const afterStoryboard = order.indexOf('storyboard');
307
+ const insertAt = afterStoryboard >= 0 ? afterStoryboard + 1 : Math.min(order.indexOf('brief') + 1 || 0, order.length);
308
+ order.splice(insertAt, 0, ...missing);
309
+ return order;
310
+ }
311
+
312
+ function renderTemplateSections(
313
+ project: PreviewPortalProject,
314
+ template: PreviewPortalTemplate,
315
+ surface: PreviewPortalSurface,
316
+ ): string {
317
+ // When the storyboard section renders the scene keyframes, suppress those same
318
+ // sceneIndex'd keyframes from the generic generation-inputs grid (no duplicates).
319
+ const storyboardSceneIndexes = project.storyboard
320
+ ? new Set(project.storyboard.scenes.map((scene) => scene.sceneIndex))
321
+ : null;
322
+ return effectiveSectionOrder(template)
323
+ .map((section) => {
324
+ if (section === 'brief') return renderBriefSection(project);
325
+ if (section === 'storyboard') return renderStoryboardSection(project, surface);
326
+ if (section === 'cast') return renderCastSection(project, surface);
327
+ let assets = project.assets.filter((asset) => asset.section === section);
328
+ if (section === 'generation-inputs' && storyboardSceneIndexes) {
329
+ assets = assets.filter(
330
+ (asset) => asset.sceneIndex === undefined || !storyboardSceneIndexes.has(asset.sceneIndex),
331
+ );
332
+ }
333
+ return renderCardsSection(sectionId(section), template.sectionLabels[section] ?? titleFromSection(section), assets, surface);
334
+ })
335
+ .join('');
336
+ }
337
+
338
+ /**
339
+ * The Cast section: one card per locked identity (Flow Character or reference
340
+ * character), with a matched still or a monogram, a source/role badge, and the
341
+ * stable id. Lets the client see who/what is identity-locked across the cut.
342
+ * Renders nothing when no cast is registered.
343
+ */
344
+ function renderCastSection(project: PreviewPortalProject, surface: PreviewPortalSurface): string {
345
+ const cast = project.cast;
346
+ if (!cast || cast.length === 0) return '';
347
+ const cards = cast
348
+ .map((member) => {
349
+ const media = member.stillPath
350
+ ? `<img data-downloadable data-lightbox-group="cast" data-lb-caption="${escAttr(member.name)}" src="${escAttr(member.stillPath)}" alt="${escAttr(member.name)}">`
351
+ : `<div class="cast-mono" aria-hidden="true">${esc(member.name.slice(0, 1).toUpperCase())}</div>`;
352
+ const badge = member.source === 'flow-character' ? 'Flow Character' : 'Reference';
353
+ const num = member.role ? `${badge} · ${member.role}` : badge;
354
+ return `<div class="card" data-card-kind="cast" data-card-id="cast-${escAttr(slugify(member.name))}" data-media-kind="image">
355
+ ${media}
356
+ <div class="meta"><div class="num">${esc(num)}</div><div class="title">${esc(member.name)}</div>${member.ref ? `<div class="who">${esc(member.ref)}</div>` : ''}</div>
357
+ ${renderControls(surface)}
358
+ </div>`;
359
+ })
360
+ .join('');
361
+ return `<section id="cast" data-toc="Cast">
362
+ <div class="section-head"><h2>Cast</h2><div class="section-title">Cast &amp; Identity Locks</div><div class="section-sub">${cast.length} locked ${cast.length === 1 ? 'identity' : 'identities'} carried across every shot.</div></div>
363
+ <div class="grid">${cards}</div>
364
+ </section>`;
365
+ }
366
+
367
+ function renderBriefSection(project: PreviewPortalProject): string {
368
+ const brief = project.brief;
369
+ if (!brief) return '';
370
+ const meta = brief.metadata ?? {};
371
+ const profile = meta.executionProfile ?? {};
372
+ const chips: string[] = [];
373
+ if (typeof meta.platform === 'string') chips.push(meta.platform);
374
+ if (typeof profile.aspectRatio === 'string') chips.push(profile.aspectRatio);
375
+ if (typeof profile.resolution === 'string') chips.push(profile.resolution);
376
+ if (typeof profile.quality === 'string') chips.push(profile.quality);
377
+ if (profile.generateAudio === true) chips.push('audio on');
378
+ else if (profile.generateAudio === false) chips.push('audio off');
379
+ const chipHtml = chips.length ? `<div class="who">${chips.map((chip) => esc(chip)).join(' · ')}</div>` : '';
380
+ return `<section id="brief" data-toc="Brief">
381
+ <div class="section-head"><h2>Brief</h2><div class="section-title">${esc(brief.title)}</div>${chipHtml}</div>
382
+ <div class="grid"><div class="card"><div class="meta"><div class="title">${esc(brief.intent)}</div></div></div></div>
383
+ </section>`;
384
+ }
385
+
386
+ function renderStoryboardSection(project: PreviewPortalProject, surface: PreviewPortalSurface): string {
387
+ const storyboard = project.storyboard;
388
+ if (!storyboard || storyboard.scenes.length === 0) return '';
389
+ const scenes = [...storyboard.scenes].sort((a, b) => a.sceneIndex - b.sceneIndex);
390
+ const cards = scenes
391
+ .map((scene) => {
392
+ const keyframe = project.assets.find(
393
+ (asset) => asset.kind === 'image' && asset.sceneIndex === scene.sceneIndex,
394
+ );
395
+ const sceneLabel = `Scene ${scene.sceneIndex + 1}`;
396
+ const media = keyframe
397
+ ? `<img${mediaAspectAttrs(keyframe)} data-downloadable data-lightbox-group="storyboard" data-lb-caption="${escAttr(sceneLabel)}" src="${escAttr(keyframe.path)}" alt="${escAttr(sceneLabel)}">`
398
+ : '<div class="meta"><code>No keyframe yet</code></div>';
399
+ const chips: string[] = [];
400
+ if (scene.characters?.length) chips.push(...scene.characters);
401
+ if (scene.scenePrompt?.cameraMove) chips.push(scene.scenePrompt.cameraMove);
402
+ if (typeof scene.durationSeconds === 'number') chips.push(`${scene.durationSeconds}s`);
403
+ const chipHtml = chips.length ? `<div class="who">${chips.map((chip) => esc(chip)).join(' · ')}</div>` : '';
404
+ const dialogue = scene.dialogue ? `<div class="who">“${esc(scene.dialogue)}”</div>` : '';
405
+ return `<div class="card" data-card-kind="scene" data-card-id="storyboard-scene-${scene.sceneIndex}" data-media-kind="image">
406
+ ${media}
407
+ <div class="meta"><div class="num">${esc(sceneLabel)}</div><div class="title">${esc(scene.description)}</div>${scene.colorState ? renderColorStateChip(scene.colorState) : ''}${chipHtml}${dialogue}${keyframe?.createdAt ? `<div class="who card-date">keyframe ${esc(fmtDate(keyframe.createdAt))}</div>` : ''}</div>
408
+ ${renderSceneContract(scene, project)}
409
+ ${renderControls(surface)}
410
+ </div>`;
411
+ })
412
+ .join('');
413
+ return `<section id="storyboard" data-toc="Storyboard">
414
+ <div class="section-head"><h2>Storyboard</h2><div class="section-title">Storyboard</div><div class="section-sub">${scenes.length} scene${scenes.length === 1 ? '' : 's'}.</div></div>
415
+ <div class="grid">
416
+ ${cards}
417
+ </div>
418
+ </section>`;
419
+ }
420
+
421
+ /**
422
+ * The per-scene "contract": the exact prompt text that will be submitted to the
423
+ * provider plus the identity-lock reference sheets for the scene's characters.
424
+ * This turns each storyboard card from a thumbnail-and-caption gallery into a
425
+ * "what you will actually get" review surface — the operator sees the submit
426
+ * prompt and the locked references inline, before any spend. Rendered expanded
427
+ * (no click-to-reveal) so the contract is always visible. Returns an empty
428
+ * string when a scene carries neither a prompt nor a matchable reference.
429
+ */
430
+ function renderSceneContract(scene: PreviewPortalScene, project: PreviewPortalProject): string {
431
+ const prompt = scene.scenePrompt;
432
+ const rows: string[] = [];
433
+ // The resolved provider submit text (10-block packet) is the authoritative
434
+ // contract; show it first and in full when present.
435
+ if (scene.renderPrompt) rows.push(promptRow('Submit', scene.renderPrompt));
436
+ if (prompt?.imagePrompt) rows.push(promptRow('Image', prompt.imagePrompt));
437
+ if (prompt?.animationPrompt) rows.push(promptRow('Motion', prompt.animationPrompt));
438
+ if (prompt?.styleFooter) rows.push(promptRow('Style', prompt.styleFooter));
439
+ const promptBlock = rows.length
440
+ ? `<div class="contract-block"><div class="contract-label">Submit prompt · what the model receives</div>${rows.join('')}</div>`
441
+ : '';
442
+
443
+ // Identity-lock references: the character reference sheets discovered for the
444
+ // names this scene casts. A character image can surface either from the
445
+ // characters.json appender (label "<Name> reference") or the generic dir scan
446
+ // (filename-based label/path), so match the slugified character name against
447
+ // both the label and the path. De-duped by path so a character listed twice
448
+ // does not double-render.
449
+ const wantNames = (scene.characters ?? []).map(contractSlug).filter(Boolean);
450
+ const seen = new Set<string>();
451
+ const refs = project.assets.filter((asset) => {
452
+ if (asset.kind !== 'image' || asset.section !== 'characters' || seen.has(asset.path)) return false;
453
+ const haystacks = [contractSlug(asset.label), contractSlug(asset.path)];
454
+ if (!wantNames.some((name) => haystacks.some((hay) => hay.includes(name)))) return false;
455
+ seen.add(asset.path);
456
+ return true;
457
+ });
458
+ // Reference-slot contract: which slot locks this scene, ready vs pending, and
459
+ // the bound Asset:// URI for identity. Falls back to the discovered character
460
+ // thumbnails when no resolved slots exist yet.
461
+ const slotRows = (scene.referenceSlots ?? []).map(renderReferenceSlot).join('');
462
+ const thumbs = refs.length
463
+ ? `<div class="scene-refs">${refs
464
+ .map(
465
+ (ref) =>
466
+ `<img class="scene-ref" data-downloadable data-lightbox-group="storyboard-refs" data-lb-caption="${escAttr(ref.label)}" src="${escAttr(ref.path)}" alt="${escAttr(ref.label)}">`,
467
+ )
468
+ .join('')}</div>`
469
+ : '';
470
+ const refBlock = slotRows || thumbs
471
+ ? `<div class="contract-block"><div class="contract-label">References · identity lock</div>${slotRows ? `<div class="ref-slots">${slotRows}</div>` : ''}${thumbs}</div>`
472
+ : '';
473
+
474
+ if (!promptBlock && !refBlock) return '';
475
+ return `<div class="scene-contract">${promptBlock}${refBlock}</div>`;
476
+ }
477
+
478
+ /**
479
+ * One reference-slot row: role · label · ready/pending badge · binding (the
480
+ * Asset:// URI when registered, else the local path, else the character name
481
+ * flagged unregistered). This is the operator's pre-render identity-lock check.
482
+ */
483
+ function renderReferenceSlot(slot: PreviewPortalReferenceSlot): string {
484
+ const badge = `<span class="ref-status ref-${slot.status === 'ready' ? 'ready' : 'pending'}">${esc(slot.status)}</span>`;
485
+ const bind = slot.assetUri
486
+ ? `<span class="ref-bind">${esc(slot.assetUri)}</span>`
487
+ : slot.path
488
+ ? `<span class="ref-bind">${esc(slot.path)}</span>`
489
+ : slot.characterName
490
+ ? `<span class="ref-bind ref-unbound">${esc(slot.characterName)} · unregistered</span>`
491
+ : '';
492
+ return `<div class="ref-slot"><span class="ref-role">${esc(slot.role)}</span><span class="ref-slot-label">${esc(slot.label)}</span>${badge}${bind}</div>`;
493
+ }
494
+
495
+ function promptRow(key: string, value: string): string {
496
+ return `<div class="contract-row"><span class="contract-k">${esc(key)}</span><span class="contract-v">${esc(value)}</span></div>`;
497
+ }
498
+
499
+ /** Lowercase alphanumeric reduction for tolerant character-name → asset matching. */
500
+ function contractSlug(value: string): string {
501
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, '');
502
+ }
503
+
504
+ /**
505
+ * Display metadata for the known narrative color states (the grade ids). The hex
506
+ * is the on-screen swatch; the label is the human-readable beat name. Unknown
507
+ * states render with a neutral swatch and the raw id, so the chip is always safe
508
+ * (the inline style only ever uses a hardcoded hex, never the untrusted id).
509
+ */
510
+ const COLOR_STATE_DISPLAY: Record<string, { label: string; hex: string }> = {
511
+ 'cool-steel': { label: 'Normal ops', hex: '#6A7A87' },
512
+ 'crimson-threat': { label: 'Breach', hex: '#CC0000' },
513
+ 'electric-blue': { label: 'Resolution', hex: '#00B4D8' },
514
+ 'kodak-500t': { label: 'Film base', hex: '#C9A36A' },
515
+ 'bleach-bypass': { label: 'Bleach bypass', hex: '#B8B8B0' },
516
+ desaturated: { label: 'Desaturated', hex: '#8A8A8A' },
517
+ 'teal-orange': { label: 'Teal / orange', hex: '#1F7A7A' },
518
+ };
519
+
520
+ /** Render the per-scene color-state chip: a hex swatch + beat label + grade id. */
521
+ function renderColorStateChip(colorState: string): string {
522
+ const display = COLOR_STATE_DISPLAY[colorState];
523
+ const hex = display?.hex ?? '#888888';
524
+ const label = display?.label ?? colorState;
525
+ return `<div class="color-state"><span class="cs-swatch" style="background:${escAttr(hex)}"></span><span class="cs-label">${esc(label)}</span><span class="cs-id">${esc(colorState)}</span></div>`;
526
+ }
527
+
528
+ function sectionId(section: string): string {
529
+ if (section === 'final') return 'finals';
530
+ return section.replace(/[^a-z0-9]+/gi, '-').toLowerCase();
531
+ }
532
+
533
+ function titleFromSection(section: string): string {
534
+ return section
535
+ .split(/[-_\s]+/)
536
+ .filter(Boolean)
537
+ .map((part) => `${part[0]?.toUpperCase() ?? ''}${part.slice(1)}`)
538
+ .join(' ');
539
+ }
540
+
541
+ function renderAssetCard(asset: PreviewPortalAsset, surface: PreviewPortalSurface): string {
542
+ const kind = asset.section === 'final' ? 'final' : asset.section === 'videos' ? 'scene' : 'asset';
543
+ const media = asset.kind === 'video'
544
+ ? `<video${mediaAspectAttrs(asset)} controls preload="metadata" data-downloadable src="${escAttr(asset.path)}"></video>`
545
+ : asset.kind === 'image'
546
+ ? `<img${mediaAspectAttrs(asset)} data-downloadable data-lightbox-group="${escAttr(asset.section)}" data-lb-caption="${escAttr(asset.label)}" src="${escAttr(asset.path)}" alt="${escAttr(asset.label)}">`
547
+ : asset.kind === 'audio'
548
+ ? `<div class="meta"><audio controls data-downloadable src="${escAttr(asset.path)}"></audio></div>`
549
+ : asset.kind === 'html'
550
+ ? `<a class="doc-thumb" href="${escAttr(asset.path)}" target="_blank" rel="noopener"><span>⤢ Open ${esc(asset.label)}</span></a>`
551
+ : `<div class="meta"><code>${esc(asset.path)}</code></div>`;
552
+ return `<div class="card" data-card-kind="${kind}" data-card-id="${escAttr(asset.id)}" data-media-kind="${escAttr(asset.kind)}">
553
+ ${media}
554
+ <div class="meta"><div class="num">${esc(asset.section)}</div><div class="title">${esc(asset.label)}</div><div class="who">${esc(asset.path)}</div>${asset.createdAt ? `<div class="who card-date">added ${esc(fmtDate(asset.createdAt))}</div>` : ''}</div>
555
+ ${renderControls(surface)}
556
+ </div>`;
557
+ }
558
+
559
+ function renderControls(surface: PreviewPortalSurface): string {
560
+ // The unified Review surface renders BOTH control sets per card; CSS shows only
561
+ // the active mode's set (editor vs client). Preview renders none.
562
+ if (!isReviewSurface(surface)) return '';
563
+ return `<div class="review-controls">
564
+ <button type="button" class="review-btn approve" data-review-action="approve" aria-pressed="false">Approve</button>
565
+ <button type="button" class="review-btn regenerate" data-review-action="regenerate" aria-pressed="false">Regenerate</button>
566
+ <input type="text" class="review-note" placeholder="why / what to change">
567
+ </div>
568
+ <div class="client-controls">
569
+ <button type="button" class="client-btn approve" data-client-action="approve" aria-pressed="false">Approve</button>
570
+ <button type="button" class="client-btn decline" data-client-action="decline" aria-pressed="false">Decline</button>
571
+ <input type="text" class="client-note" placeholder="comment">
572
+ </div>`;
573
+ }
574
+
575
+ /** Media filter chips (preview surface only): All / Videos / Images. The viewer
576
+ * JS toggles `.card[data-media-kind]` visibility and hides emptied sections. */
577
+ function renderFilterChips(): string {
578
+ return `<div class="media-filter" role="toolbar" aria-label="Filter media">
579
+ <button type="button" data-filter-chip="all" aria-pressed="true">All</button>
580
+ <button type="button" data-filter-chip="video" aria-pressed="false">Videos</button>
581
+ <button type="button" data-filter-chip="image" aria-pressed="false">Images</button>
582
+ </div>`;
583
+ }
584
+
585
+ /** Keyboard-shortcuts help overlay, toggled with `?` by the viewer JS. Rendered
586
+ * statically (hidden) so tests can assert its presence without executing JS. */
587
+ function renderShortcutsHelp(): string {
588
+ const rows: Array<[string, string]> = [
589
+ ['← → or [ ]', 'Select previous / next media (page) · previous / next asset (viewer)'],
590
+ ['Enter', 'Open the selected media in the viewer'],
591
+ ['Esc', 'Close the viewer or this help'],
592
+ ['Space / K', 'Play / pause video'],
593
+ ['J / L', 'Playback slower / faster (0.25–4×)'],
594
+ [', / .', 'Frame step back / forward (Shift: 10 frames)'],
595
+ ['F', 'Fullscreen video'],
596
+ ['M / ↑ ↓', 'Mute · volume up / down'],
597
+ ['G', 'Grab the current video frame as a PNG'],
598
+ ['D', 'Download the current asset'],
599
+ ['Z or click', 'Zoom image 2× (drag to pan)'],
600
+ ['?', 'Toggle this help'],
601
+ ];
602
+ const grid = rows
603
+ .map(([keys, what]) => `<kbd>${esc(keys)}</kbd><span>${esc(what)}</span>`)
604
+ .join('');
605
+ return `<div id="kb-help" role="dialog" aria-label="Keyboard shortcuts" hidden>
606
+ <div class="kb-card"><h3>Keyboard shortcuts</h3><div class="kb-grid">${grid}</div></div>
607
+ </div>`;
608
+ }
609
+
610
+ /* ── Brand theming: palette-driven accent, client wordmark/logo, brand book ──
611
+ Sourced from artifacts/brand-definition.json (discovered onto project.brand).
612
+ No brand → every helper returns '' and the stock theme renders unchanged. */
613
+
614
+ /** Surfaces that carry the client's identity (vs the operator's utilitarian view). */
615
+ function isClientSurface(surface: PreviewPortalSurface): boolean {
616
+ return surface === 'preview' || surface === 'client-review';
617
+ }
618
+
619
+ /** WCAG relative luminance of a #RRGGBB color. */
620
+ function relativeLuminance(hex: string): number {
621
+ const channel = (i: number) => {
622
+ const c = parseInt(hex.slice(i, i + 2), 16) / 255;
623
+ return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
624
+ };
625
+ return 0.2126 * channel(1) + 0.7152 * channel(3) + 0.0722 * channel(5);
626
+ }
627
+
628
+ /**
629
+ * Pick the brand accent: the first palette role (metallic → primary → secondary
630
+ * → contrast) bright enough to read on the near-black portal background
631
+ * (luminance ≥ 0.2 ≈ 4.5:1 contrast). All-dark palettes return null and the
632
+ * stock amber accent stays — readability beats brand fidelity.
633
+ */
634
+ function pickBrandAccent(brand: PreviewPortalBrand): string | null {
635
+ for (const role of ['metallic', 'primary', 'secondary', 'contrast']) {
636
+ const color = brand.palette.find((entry) => entry.role === role);
637
+ if (color && relativeLuminance(color.hex) >= 0.2) return color.hex;
638
+ }
639
+ return null;
640
+ }
641
+
642
+ function hexToRgba(hex: string, alpha: number): string {
643
+ const r = parseInt(hex.slice(1, 3), 16);
644
+ const g = parseInt(hex.slice(3, 5), 16);
645
+ const b = parseInt(hex.slice(5, 7), 16);
646
+ return `rgba(${r},${g},${b},${alpha})`;
647
+ }
648
+
649
+ /** First numeric CSS weight found in the artifact's free-form weight string. */
650
+ function fontWeightOf(weight: string): string | null {
651
+ const m = /\d{3}/.exec(weight);
652
+ return m ? m[0] : null;
653
+ }
654
+
655
+ /**
656
+ * Reduce a brand font name to the characters a Google-font family legitimately
657
+ * uses (letters, digits, spaces). This is the one guard for BOTH the Google
658
+ * Fonts URL and the `:root{}` font-family values: an unsanitized name carrying
659
+ * `& ; } :` would otherwise corrupt the font-link query string or break out of
660
+ * the inline `<style>` block. Returns '' when nothing survives (caller skips it).
661
+ */
662
+ function sanitizeFontFamily(name: string): string {
663
+ return name.replace(/[^A-Za-z0-9 ]/g, '').replace(/\s+/g, ' ').trim();
664
+ }
665
+
666
+ /** Typography level lookup with a fallback chain (display falls back to headline). */
667
+ function typographyFor(brand: PreviewPortalBrand, levels: string[]): { font: string; weight: string } | null {
668
+ for (const level of levels) {
669
+ const entry = brand.typography.find((t) => t.level === level && t.font.trim());
670
+ if (entry) return { font: entry.font.trim(), weight: entry.weight };
671
+ }
672
+ return null;
673
+ }
674
+
675
+ /**
676
+ * The themed head block: a Google Fonts stylesheet link (client surfaces only —
677
+ * progressive enhancement, full system-font fallback stacks keep the page
678
+ * presentable offline/file://) plus a `:root` override of the accent/glow/font
679
+ * variables. Review/edit get the accent variables only.
680
+ */
681
+ function renderBrandTheme(project: PreviewPortalProject, surface: PreviewPortalSurface): string {
682
+ const brand = project.brand;
683
+ if (!brand) return '';
684
+ const vars: string[] = [];
685
+ const accent = pickBrandAccent(brand);
686
+ if (accent) {
687
+ vars.push(`--accent:${accent}`);
688
+ vars.push(`--glow:${hexToRgba(accent, 0.07)}`);
689
+ }
690
+ let fontLinks = '';
691
+ if (isClientSurface(surface)) {
692
+ const display = typographyFor(brand, ['display', 'headline', 'wordmark']);
693
+ const body = typographyFor(brand, ['body']);
694
+ const wordmark = typographyFor(brand, ['wordmark', 'display']);
695
+ const families = new Map<string, Set<string>>();
696
+ for (const entry of [display, body, wordmark]) {
697
+ if (!entry) continue;
698
+ const weights = families.get(entry.font) ?? new Set<string>();
699
+ weights.add(fontWeightOf(entry.weight) ?? '400');
700
+ if (entry === display || entry === wordmark) weights.add('700');
701
+ families.set(entry.font, weights);
702
+ }
703
+ if (families.size > 0) {
704
+ const familyParams = [...families.entries()]
705
+ .map(([font, weights]) => ({ clean: sanitizeFontFamily(font), weights }))
706
+ .filter((entry) => entry.clean)
707
+ .map((entry) => `family=${entry.clean.replace(/ /g, '+')}:wght@${[...entry.weights].sort().join(';')}`)
708
+ .join('&');
709
+ if (familyParams) {
710
+ fontLinks = `\n<link rel="preconnect" href="https://fonts.googleapis.com">\n<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>\n<link rel="stylesheet" href="https://fonts.googleapis.com/css2?${familyParams}&display=swap">`;
711
+ }
712
+ }
713
+ const displayClean = display ? sanitizeFontFamily(display.font) : '';
714
+ const bodyClean = body ? sanitizeFontFamily(body.font) : '';
715
+ const wordmarkClean = wordmark ? sanitizeFontFamily(wordmark.font) : '';
716
+ if (displayClean) vars.push(`--font-display:'${displayClean}',var(--font-body)`);
717
+ if (bodyClean) vars.push(`--font-body:'${bodyClean}',-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,sans-serif`);
718
+ if (wordmarkClean) vars.push(`--font-wordmark:'${wordmarkClean}',var(--font-display)`);
719
+ }
720
+ if (!vars.length && !fontLinks) return '';
721
+ return `${fontLinks}\n<style>:root{${vars.join(';')}}</style>`;
722
+ }
723
+
724
+ /** Client identity bar above the hero: logo image when discovered, else the
725
+ * brand name typeset in the wordmark face; right side names the recipient. */
726
+ function renderBrandBar(project: PreviewPortalProject, surface: PreviewPortalSurface): string {
727
+ const brand = project.brand;
728
+ if (!brand || !isClientSurface(surface)) return '';
729
+ const mark = brand.logoPath
730
+ ? `<img src="${escAttr(brand.logoPath)}" alt="${escAttr(brand.brandName)}">`
731
+ : `<span class="brand-wordmark">${esc(brand.brandName)}</span>`;
732
+ const recipient = project.client ? `prepared for ${project.client}` : 'client delivery';
733
+ return `<div class="brand-bar">${mark}<span class="brand-for">${esc(recipient)}</span></div>
734
+ `;
735
+ }
736
+
737
+ /** Emotional tagline as the hero subline on client surfaces. */
738
+ function renderHeroTagline(project: PreviewPortalProject, surface: PreviewPortalSurface): string {
739
+ const line = project.brand?.taglines?.emotional;
740
+ if (!line || !isClientSurface(surface)) return '';
741
+ return `<p class="tagline">${esc(line)}</p>
742
+ `;
743
+ }
744
+
745
+ /** Review-status chip in the hero eyebrow (preview only; silent while draft). */
746
+ function renderStatusChip(project: PreviewPortalProject, surface: PreviewPortalSurface): string {
747
+ if (surface !== 'preview' || project.status === 'draft') return '';
748
+ const approved = project.status === 'client-approved' || project.status === 'final' || project.status === 'published';
749
+ return `<span class="status-chip${approved ? ' st-approved' : ''}">${esc(project.status)}</span>`;
750
+ }
751
+
752
+ /** Prettify a camelCase palette role for the swatch label. */
753
+ function roleLabel(role: string): string {
754
+ return role.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();
755
+ }
756
+
757
+ /**
758
+ * The brand-book annex (preview only): palette swatches, typography specimens
759
+ * rendered in their own faces, and the three taglines — the page doubles as a
760
+ * mini brand portal the client can keep using after delivery.
761
+ */
762
+ function renderBrandBook(project: PreviewPortalProject): string {
763
+ const brand = project.brand;
764
+ if (!brand) return '';
765
+ const swatches = brand.palette
766
+ .map(
767
+ (color) =>
768
+ `<div class="swatch"><div class="sw" style="background:${escAttr(color.hex)}"></div><div class="sw-meta"><div class="sw-role">${esc(roleLabel(color.role))}</div>${color.name ? `<div class="sw-name">${esc(color.name)}</div>` : ''}<div class="sw-hex">${esc(color.hex)}</div></div></div>`,
769
+ )
770
+ .join('');
771
+ const specimens = brand.typography
772
+ .map((t) => {
773
+ const weight = fontWeightOf(t.weight);
774
+ const sample = t.level === 'wordmark' ? brand.brandName : 'Aa Bb Cc 0123';
775
+ // Same sanitization as the head theme: a font name with `'`/`;`/`}` would
776
+ // otherwise corrupt this inline font-family. Show the cleaned name too.
777
+ const cleanFont = sanitizeFontFamily(t.font);
778
+ const style = cleanFont
779
+ ? `font-family:'${cleanFont}',var(--font-body)${weight ? `;font-weight:${weight}` : ''}`
780
+ : weight ? `font-weight:${weight}` : '';
781
+ return `<div class="type-specimen"><span class="ts-level">${esc(t.level)}</span><span class="ts-sample" style="${escAttr(style)}">${esc(sample)}</span><span class="ts-font">${esc(cleanFont || t.level)}${t.weight ? ` · ${esc(t.weight)}` : ''}</span></div>`;
782
+ })
783
+ .join('');
784
+ const taglineKinds: Array<[string, string | undefined]> = [
785
+ ['functional', brand.taglines?.functional],
786
+ ['emotional', brand.taglines?.emotional],
787
+ ['community', brand.taglines?.community],
788
+ ];
789
+ const taglines = taglineKinds.filter(([, line]) => line);
790
+ const taglineHtml = taglines.length
791
+ ? `<div class="tagline-list">${taglines
792
+ .map(([kind, line]) => `<div class="tagline-card"><div class="tg-kind">${esc(kind)}</div><div class="tg-line">${esc(line as string)}</div></div>`)
793
+ .join('')}</div>`
794
+ : '';
795
+ return `<section id="brand-book" data-toc="Brand">
796
+ <div class="section-head"><h2>Brand</h2><div class="section-title">${esc(brand.brandName)} Brand System</div>${brand.positioning ? `<div class="section-sub">${esc(brand.positioning)}</div>` : ''}</div>
797
+ ${swatches ? `<div class="swatch-grid">${swatches}</div>` : ''}
798
+ ${specimens ? `<div class="type-specimens">${specimens}</div>` : ''}
799
+ ${taglineHtml}
800
+ </section>`;
801
+ }
802
+
803
+ function renderHud(surface: PreviewPortalSurface): string {
804
+ // Both HUDs render; CSS shows the one matching the active mode.
805
+ if (!isReviewSurface(surface)) return '';
806
+ return `<div class="hud" id="review-hud" role="status"><span id="rs-approved">0 approved</span><span id="rs-regen">0 to regenerate</span><button type="button" id="copy-decisions-btn">Copy Review Decisions</button></div>
807
+ <div class="hud" id="client-hud" role="status"><span>Client feedback</span><button type="button" id="copy-client-feedback-btn">Copy Feedback</button></div>`;
808
+ }
809
+
810
+ function modeForSurface(surface: PreviewPortalSurface): 'editor' | 'client' | 'preview' | 'compare' {
811
+ if (surface === 'edit' || surface === 'review') return 'editor';
812
+ if (surface === 'client-review') return 'client';
813
+ if (surface === 'compare') return 'compare';
814
+ return 'preview';
815
+ }
816
+
817
+ function labelForSurface(surface: PreviewPortalSurface): string {
818
+ if (surface === 'edit') return 'editor edit';
819
+ if (surface === 'review') return 'editor review';
820
+ if (surface === 'client-review') return 'client review';
821
+ if (surface === 'compare') return 'compare';
822
+ if (surface === 'index') return 'index';
823
+ return 'preview';
824
+ }
825
+
826
+ function scriptForSurface(surface: PreviewPortalSurface): string {
827
+ // Review surface drives both control sets + the tab/mode toggle.
828
+ if (isReviewSurface(surface)) return PORTAL_EDITOR_JS + PORTAL_CLIENT_JS + PORTAL_REVIEW_TABS_JS;
829
+ return '';
830
+ }
831
+
832
+ function slugify(value: string): string {
833
+ return value
834
+ .trim()
835
+ .toLowerCase()
836
+ .replace(/[^a-z0-9]+/g, '-')
837
+ .replace(/^-|-$/g, '') || 'unknown';
838
+ }
839
+
840
+ /** Project aspect ratio (from the brief's execution profile) used to size the
841
+ * media cards + hero. Falls back to landscape when unknown. */
842
+ function aspectForProject(project: PreviewPortalProject): string {
843
+ const ratio = project.brief?.metadata?.executionProfile?.aspectRatio;
844
+ return ratio === '9:16' || ratio === '1:1' || ratio === '16:9' ? ratio : '16:9';
845
+ }
846
+
847
+ /** Compact, locale-independent card date: "2026-06-01 18:01 UTC" from an ISO
848
+ * string (deterministic — no Date/locale parsing). Empty string when absent. */
849
+ function fmtDate(iso?: string): string {
850
+ if (!iso) return '';
851
+ const m = /^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2})/.exec(iso);
852
+ return m ? `${m[1]} ${m[2]} UTC` : iso;
853
+ }
854
+
855
+ function esc(value: string): string {
856
+ return value
857
+ .replaceAll('&', '&amp;')
858
+ .replaceAll('<', '&lt;')
859
+ .replaceAll('>', '&gt;')
860
+ .replaceAll('"', '&quot;');
861
+ }
862
+
863
+ function escAttr(value: string): string {
864
+ return esc(value);
865
+ }