videobook 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (565) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +195 -2
  4. package/bin/videobook.js +7 -0
  5. package/dist/acestep/client.js +203 -0
  6. package/dist/acestep/config.js +62 -0
  7. package/dist/acestep/errors.js +8 -0
  8. package/dist/acestep/process.js +175 -0
  9. package/dist/alive-captions/analyze.js +117 -0
  10. package/dist/alive-captions/audio.js +179 -0
  11. package/dist/alive-captions/frames.js +59 -0
  12. package/dist/alive-captions/model.js +37 -0
  13. package/dist/alive-captions/schema.js +49 -0
  14. package/dist/alive-captions/track.js +9 -0
  15. package/dist/api-key.js +33 -0
  16. package/dist/app-state.js +56 -0
  17. package/dist/app.js +257 -0
  18. package/dist/archive-b2.js +332 -0
  19. package/dist/archive-store.js +169 -0
  20. package/dist/artifact-label.js +36 -0
  21. package/dist/artifact-refs.js +49 -0
  22. package/dist/asset-tag-extraction.js +169 -0
  23. package/dist/asset-tags.js +228 -0
  24. package/dist/asset-usage.js +23 -0
  25. package/dist/audio-cue.js +71 -0
  26. package/dist/audio-encoding.js +32 -0
  27. package/dist/audio-sync-request.js +1 -0
  28. package/dist/audio-sync.js +223 -0
  29. package/dist/audio-trim-range.js +31 -0
  30. package/dist/book-context.js +31 -0
  31. package/dist/book-manager.js +374 -0
  32. package/dist/catalog-gc.js +26 -0
  33. package/dist/chain-executor.js +815 -0
  34. package/dist/chain-generation.js +115 -0
  35. package/dist/chain-plan.js +746 -0
  36. package/dist/chain-step-review.js +60 -0
  37. package/dist/character-name.js +25 -0
  38. package/dist/chat-generation-routing.js +73 -0
  39. package/dist/chat-generation-settings.js +78 -0
  40. package/dist/chat-models.js +44 -0
  41. package/dist/chat-prompt-rewrite.js +67 -0
  42. package/dist/chat-router.js +628 -0
  43. package/dist/chat-view-actions.js +49 -0
  44. package/dist/cli/args.js +242 -0
  45. package/dist/cli/config-command.js +103 -0
  46. package/dist/cli/doctor-command.js +289 -0
  47. package/dist/cli/entry.js +2 -0
  48. package/dist/cli/key-report.js +16 -0
  49. package/dist/cli/main.js +104 -0
  50. package/dist/cli/mcp-command.js +88 -0
  51. package/dist/cli/mcp-relay.js +51 -0
  52. package/dist/cli/open-browser.js +14 -0
  53. package/dist/cli/run-command.js +231 -0
  54. package/dist/cli/serve-command.js +62 -0
  55. package/dist/cli/setup-command.js +60 -0
  56. package/dist/cli/stdio-guard.js +8 -0
  57. package/dist/cold-open-model.js +7 -0
  58. package/dist/cold-open.js +79 -0
  59. package/dist/command-reference.js +95 -0
  60. package/dist/content-store.js +74 -0
  61. package/dist/cost.js +8 -0
  62. package/dist/crop-geometry.js +23 -0
  63. package/dist/dancing-workflow.js +447 -0
  64. package/dist/data-home.js +44 -0
  65. package/dist/diagnostics.js +109 -0
  66. package/dist/dialog-quality.js +34 -0
  67. package/dist/downloads-dest.js +56 -0
  68. package/dist/editing-moments.js +194 -0
  69. package/dist/elevenlabs-audio-extension.js +66 -0
  70. package/dist/engine.js +54 -0
  71. package/dist/env-file.js +91 -0
  72. package/dist/env-secrets.js +148 -0
  73. package/dist/ffmpeg-binary.js +12 -0
  74. package/dist/ffmpeg.js +425 -0
  75. package/dist/ffprobe-binary.js +77 -0
  76. package/dist/forget-asset.js +216 -0
  77. package/dist/frame-utils.js +27 -0
  78. package/dist/generation-credit-error.js +11 -0
  79. package/dist/generation-input-mentions.js +117 -0
  80. package/dist/generation-input-policy.js +68 -0
  81. package/dist/generation-reference-mentions.js +97 -0
  82. package/dist/goal-characters.js +49 -0
  83. package/dist/goal-plan-v3.js +273 -0
  84. package/dist/goal-plan.js +220 -0
  85. package/dist/goal-planner-prompt.js +28 -0
  86. package/dist/goal-prompt-budget.js +4 -0
  87. package/dist/goal-reference-images.js +25 -0
  88. package/dist/goal-state.js +261 -0
  89. package/dist/goal-stills.js +153 -0
  90. package/dist/goal-store.js +144 -0
  91. package/dist/goal-styles.js +144 -0
  92. package/dist/goal-v3-runtime.js +157 -0
  93. package/dist/guides/character_schema_guide.md +70 -0
  94. package/dist/guides/gpt_image_2_5_prompting_guide.md +21 -0
  95. package/dist/guides/grok_imagine_prompting_guide.md +72 -0
  96. package/dist/guides/image_reproduction_guide.md +84 -0
  97. package/dist/guides/kling_3_0_prompting_guide.md +136 -0
  98. package/dist/guides/nano_banana_pro_prompting_guide.md +28 -0
  99. package/dist/guides/seedance_2_prompting_guide.md +172 -0
  100. package/dist/http-access.js +49 -0
  101. package/dist/http-byte-range.js +31 -0
  102. package/dist/hydration.js +56 -0
  103. package/dist/image-compress.js +77 -0
  104. package/dist/image-edit-default.js +1 -0
  105. package/dist/image-edit-models.js +41 -0
  106. package/dist/image-edit-settings.js +11 -0
  107. package/dist/image-region-edit.js +32 -0
  108. package/dist/image-subject-map.js +523 -0
  109. package/dist/image.js +46 -0
  110. package/dist/index.js +12 -0
  111. package/dist/job-deadline.js +60 -0
  112. package/dist/jobs/_alibaba-upload.js +30 -0
  113. package/dist/jobs/_audio-chunks.js +31 -0
  114. package/dist/jobs/_download-into-asset.js +15 -0
  115. package/dist/jobs/_fal-shared.js +22 -0
  116. package/dist/jobs/_fal-upload.js +35 -0
  117. package/dist/jobs/_image-edit-adapter.js +213 -0
  118. package/dist/jobs/_kie-poll.js +119 -0
  119. package/dist/jobs/_kie-upload.js +32 -0
  120. package/dist/jobs/_lease.js +163 -0
  121. package/dist/jobs/_persist-output.js +19 -0
  122. package/dist/jobs/_storage-retry.js +21 -0
  123. package/dist/jobs/_transcribe.js +245 -0
  124. package/dist/jobs/_translate-transcript.js +270 -0
  125. package/dist/jobs/analyze-alive-captions.js +10 -0
  126. package/dist/jobs/analyze-editing-moments.js +104 -0
  127. package/dist/jobs/analyze-jokes.js +143 -0
  128. package/dist/jobs/analyze-keyword-placement.js +155 -0
  129. package/dist/jobs/analyze-music.js +14 -0
  130. package/dist/jobs/analyze-video.js +282 -0
  131. package/dist/jobs/apply-cuts.js +83 -0
  132. package/dist/jobs/apply-sfx.js +107 -0
  133. package/dist/jobs/archive-clip.js +458 -0
  134. package/dist/jobs/assemble-goal.js +98 -0
  135. package/dist/jobs/audio-boost.js +71 -0
  136. package/dist/jobs/audio-mix.js +161 -0
  137. package/dist/jobs/backfill-asset-tags.js +144 -0
  138. package/dist/jobs/burn-watermark.js +316 -0
  139. package/dist/jobs/change-video-speed.js +176 -0
  140. package/dist/jobs/clean-video-audio.js +207 -0
  141. package/dist/jobs/cold-open.js +166 -0
  142. package/dist/jobs/combine-goal.js +108 -0
  143. package/dist/jobs/complete-provider-task.js +185 -0
  144. package/dist/jobs/copy-library-asset.js +33 -0
  145. package/dist/jobs/cost-estimate-assessment.js +113 -0
  146. package/dist/jobs/crop-image.js +47 -0
  147. package/dist/jobs/crop-video.js +71 -0
  148. package/dist/jobs/describe-image.js +181 -0
  149. package/dist/jobs/detect-scenes.js +33 -0
  150. package/dist/jobs/doctor-fix.js +100 -0
  151. package/dist/jobs/download-video.js +427 -0
  152. package/dist/jobs/enqueue-search-index.js +24 -0
  153. package/dist/jobs/even-split.js +122 -0
  154. package/dist/jobs/export-sequence.js +365 -0
  155. package/dist/jobs/extend-audio.js +229 -0
  156. package/dist/jobs/extract-audio.js +72 -0
  157. package/dist/jobs/extract-frame.js +58 -0
  158. package/dist/jobs/extract-notebook-audio.js +82 -0
  159. package/dist/jobs/extract-notebook-frame.js +93 -0
  160. package/dist/jobs/extract-video-clip.js +8 -0
  161. package/dist/jobs/extract-video-poster.js +55 -0
  162. package/dist/jobs/extract-waveform.js +25 -0
  163. package/dist/jobs/finish-goal.js +255 -0
  164. package/dist/jobs/forget-asset.js +11 -0
  165. package/dist/jobs/generate-acestep-cover.js +219 -0
  166. package/dist/jobs/generate-media.js +70 -0
  167. package/dist/jobs/image-subjects.js +1059 -0
  168. package/dist/jobs/index.js +18 -0
  169. package/dist/jobs/inject-first-frame.js +175 -0
  170. package/dist/jobs/isolate-vocals.js +69 -0
  171. package/dist/jobs/kie-paygate.js +177 -0
  172. package/dist/jobs/label-music-sections.js +5 -0
  173. package/dist/jobs/osg-placement.js +135 -0
  174. package/dist/jobs/pad-video.js +72 -0
  175. package/dist/jobs/plan-goal.js +97 -0
  176. package/dist/jobs/post-record.js +21 -0
  177. package/dist/jobs/post-to-x.js +21 -0
  178. package/dist/jobs/prepare-search-reference.js +190 -0
  179. package/dist/jobs/prepare-temporal-search.js +16 -0
  180. package/dist/jobs/process-audio.js +67 -0
  181. package/dist/jobs/process-image.js +58 -0
  182. package/dist/jobs/process-upload.js +166 -0
  183. package/dist/jobs/process-video.js +438 -0
  184. package/dist/jobs/register-all.js +161 -0
  185. package/dist/jobs/relayout-notebook.js +78 -0
  186. package/dist/jobs/remove-sound.js +299 -0
  187. package/dist/jobs/render-project.js +380 -0
  188. package/dist/jobs/render-qr-outro.js +138 -0
  189. package/dist/jobs/render-timeline.js +283 -0
  190. package/dist/jobs/repair-search-indexes.js +42 -0
  191. package/dist/jobs/replace-video-audio.js +64 -0
  192. package/dist/jobs/restore-archive-clip.js +53 -0
  193. package/dist/jobs/reverse-video.js +53 -0
  194. package/dist/jobs/rewrite-script.js +173 -0
  195. package/dist/jobs/run-notebook.js +3335 -0
  196. package/dist/jobs/semantic-index.js +797 -0
  197. package/dist/jobs/smooth-scene-concat.js +257 -0
  198. package/dist/jobs/splice-video.js +280 -0
  199. package/dist/jobs/split-video.js +127 -0
  200. package/dist/jobs/suggest-cuts.js +149 -0
  201. package/dist/jobs/suggest-sfx.js +135 -0
  202. package/dist/jobs/sync-video-to-audio.js +329 -0
  203. package/dist/jobs/tag-asset.js +266 -0
  204. package/dist/jobs/task-failure.js +16 -0
  205. package/dist/jobs/timewarp-video.js +152 -0
  206. package/dist/jobs/transcribe-video-audio.js +117 -0
  207. package/dist/jobs/transcribe.js +35 -0
  208. package/dist/jobs/translate-transcript.js +55 -0
  209. package/dist/jobs/trim-audio.js +133 -0
  210. package/dist/jobs/trim-video.js +291 -0
  211. package/dist/jobs/xai-paygate.js +26 -0
  212. package/dist/keyword-placement-cache.js +74 -0
  213. package/dist/lazy-render.js +142 -0
  214. package/dist/library-browse.js +78 -0
  215. package/dist/lightning-defaults.js +206 -0
  216. package/dist/load-env.js +12 -0
  217. package/dist/local-search-models.js +206 -0
  218. package/dist/local-upload.js +318 -0
  219. package/dist/logger.js +69 -0
  220. package/dist/media/adapters/alibaba.js +20 -0
  221. package/dist/media/adapters/elevenlabs.js +58 -0
  222. package/dist/media/adapters/fal.js +45 -0
  223. package/dist/media/adapters/index.js +26 -0
  224. package/dist/media/adapters/kie.js +120 -0
  225. package/dist/media/adapters/pending.js +21 -0
  226. package/dist/media/adapters/types.js +5 -0
  227. package/dist/media/adapters/xai.js +18 -0
  228. package/dist/media/catalog.js +236 -0
  229. package/dist/media/complete.js +191 -0
  230. package/dist/media/cost.js +45 -0
  231. package/dist/media/descriptor.js +157 -0
  232. package/dist/media/endpoints.js +11 -0
  233. package/dist/media/frame-options.js +18 -0
  234. package/dist/media/insert-video-timing.js +17 -0
  235. package/dist/media/json-schema.js +75 -0
  236. package/dist/media/legacy-task-types.js +129 -0
  237. package/dist/media/listing.js +24 -0
  238. package/dist/media/model-id.js +14 -0
  239. package/dist/media/preview.js +86 -0
  240. package/dist/media/prompt-dialects.js +65 -0
  241. package/dist/media/ref-fields.js +106 -0
  242. package/dist/media/refs.js +131 -0
  243. package/dist/media/request.js +188 -0
  244. package/dist/media/types.js +6 -0
  245. package/dist/media/wire.js +161 -0
  246. package/dist/media-library.js +535 -0
  247. package/dist/media-output-path.js +33 -0
  248. package/dist/multyculty-workflow.js +757 -0
  249. package/dist/notebook-action-catalog.js +608 -0
  250. package/dist/notebook-cell-outputs.js +726 -0
  251. package/dist/notebook-credit-retry.js +45 -0
  252. package/dist/notebook-fixtures.js +8 -0
  253. package/dist/notebook-generation-contract.js +77 -0
  254. package/dist/notebook-generation-controls.js +145 -0
  255. package/dist/notebook-goal-layout.js +40 -0
  256. package/dist/notebook-graph.js +37 -0
  257. package/dist/notebook-image-edit.js +84 -0
  258. package/dist/notebook-initial-generation-prompt.js +222 -0
  259. package/dist/notebook-live-analysis.js +941 -0
  260. package/dist/notebook-media-ops.js +579 -0
  261. package/dist/notebook-mutations.js +20 -0
  262. package/dist/notebook-placement.js +41 -0
  263. package/dist/notebook-provider-failure.js +87 -0
  264. package/dist/notebook-published-post.js +26 -0
  265. package/dist/notebook-reference-resolver.js +227 -0
  266. package/dist/notebook-relayout.js +270 -0
  267. package/dist/notebook-run-plan.js +519 -0
  268. package/dist/notebook-shots.js +162 -0
  269. package/dist/notebook-workflow.js +856 -0
  270. package/dist/one-password.js +200 -0
  271. package/dist/openai-intelligence.js +99 -0
  272. package/dist/original-media-file.js +12 -0
  273. package/dist/osg-assets.js +36 -0
  274. package/dist/osg-placement-cache.js +64 -0
  275. package/dist/osg-settings.js +27 -0
  276. package/dist/paid-tools.js +22 -0
  277. package/dist/platform-guidance.js +26 -0
  278. package/dist/posts/dropbox-auth.js +91 -0
  279. package/dist/posts/dropbox-upload.js +132 -0
  280. package/dist/posts/icloud-drive.js +134 -0
  281. package/dist/posts/icloud-status.js +64 -0
  282. package/dist/posts/post-contract.js +2 -0
  283. package/dist/posts/post-copy-format.js +43 -0
  284. package/dist/posts/post-copy.js +193 -0
  285. package/dist/posts/post-folder.js +18 -0
  286. package/dist/posts/post-metrics.js +119 -0
  287. package/dist/posts/post-store.js +340 -0
  288. package/dist/posts/x-post-target.js +43 -0
  289. package/dist/preview-payload.js +90 -0
  290. package/dist/prompt-surfaces.js +22 -0
  291. package/dist/provider-prompt-transform.js +77 -0
  292. package/dist/provider-status-link.js +21 -0
  293. package/dist/provider-task-record.js +78 -0
  294. package/dist/provider-task-status.js +47 -0
  295. package/dist/provider-usage.js +294 -0
  296. package/dist/queue.js +810 -0
  297. package/dist/reference-video-duration.js +17 -0
  298. package/dist/remotion/BlurFillVideo.js +51 -0
  299. package/dist/remotion/KeywordGraphicsOverlay.js +68 -0
  300. package/dist/remotion/OsgOverlay.js +30 -0
  301. package/dist/remotion/QrOutroComposition.js +47 -0
  302. package/dist/remotion/RenderComposition.js +11 -0
  303. package/dist/remotion/browser.js +59 -0
  304. package/dist/remotion/constants.js +35 -0
  305. package/dist/remotion/index.js +66 -0
  306. package/dist/remotion/keyword-graphics.js +151 -0
  307. package/dist/remotion/keyword-placement.js +182 -0
  308. package/dist/remotion/osg-spec.js +198 -0
  309. package/dist/remotion/public/qr-outro-impact.wav +0 -0
  310. package/dist/remotion/qr-outro-audio.js +1 -0
  311. package/dist/remotion/qr-outro-spec.js +211 -0
  312. package/dist/remotion/shared-bundle.js +37 -0
  313. package/dist/remotion/subtitles/AliveCaptions.js +83 -0
  314. package/dist/remotion/subtitles/Highlight.js +58 -0
  315. package/dist/remotion/subtitles/Impact.js +67 -0
  316. package/dist/remotion/subtitles/SubtitleOverlay.js +9 -0
  317. package/dist/remotion/subtitles/alive-layout.js +321 -0
  318. package/dist/remotion/subtitles/alive-types.js +17 -0
  319. package/dist/remotion/subtitles/chunker.js +68 -0
  320. package/dist/remotion/subtitles/segments.js +42 -0
  321. package/dist/remotion/subtitles/styles.js +4 -0
  322. package/dist/remotion/subtitles/types.js +1 -0
  323. package/dist/remotion/util.js +18 -0
  324. package/dist/remotion-cancellation.js +15 -0
  325. package/dist/rename-helpers.js +204 -0
  326. package/dist/rhythm/analyze.js +128 -0
  327. package/dist/rhythm/contract.js +14 -0
  328. package/dist/rhythm/draft-model.js +19 -0
  329. package/dist/rhythm/energy.js +133 -0
  330. package/dist/rhythm/fft.js +44 -0
  331. package/dist/rhythm/model.js +71 -0
  332. package/dist/rhythm/music-analysis.js +124 -0
  333. package/dist/rhythm/music-draft.js +261 -0
  334. package/dist/rhythm/onset.js +101 -0
  335. package/dist/rhythm/run-worker.js +51 -0
  336. package/dist/rhythm/score.js +47 -0
  337. package/dist/rhythm/section-labels.js +168 -0
  338. package/dist/rhythm/sequence-rhythm.js +67 -0
  339. package/dist/rhythm/synthesize.js +103 -0
  340. package/dist/rhythm/timing.js +98 -0
  341. package/dist/rhythm/track.js +320 -0
  342. package/dist/rhythm/visual-fit.js +4 -0
  343. package/dist/rhythm/worker.js +25 -0
  344. package/dist/scene-detect.js +200 -0
  345. package/dist/scene-transition.js +12 -0
  346. package/dist/scheduled-posts.js +200 -0
  347. package/dist/search-index-coverage.js +13 -0
  348. package/dist/search-index-media.js +71 -0
  349. package/dist/search-reference-store.js +60 -0
  350. package/dist/search-scoring.js +17 -0
  351. package/dist/serve.js +125 -0
  352. package/dist/server-lock.js +143 -0
  353. package/dist/server.js +42 -0
  354. package/dist/srt.js +16 -0
  355. package/dist/tag-backfill-state.js +121 -0
  356. package/dist/tag-settings.js +30 -0
  357. package/dist/tag-vocabulary.js +237 -0
  358. package/dist/test-queue-cleanup.js +1 -0
  359. package/dist/time-parse.js +50 -0
  360. package/dist/timeline-helpers.js +554 -0
  361. package/dist/timewarp.js +87 -0
  362. package/dist/tools/_image-inputs.js +9 -0
  363. package/dist/tools/_media-refs.js +84 -0
  364. package/dist/tools/_shared.js +59 -0
  365. package/dist/tools/_suggest-shared.js +279 -0
  366. package/dist/tools/add-timeline-audio.js +73 -0
  367. package/dist/tools/alive-captions.js +157 -0
  368. package/dist/tools/analyze-jokes.js +56 -0
  369. package/dist/tools/analyze-video.js +66 -0
  370. package/dist/tools/animate-keywords.js +217 -0
  371. package/dist/tools/api-status.js +42 -0
  372. package/dist/tools/application-commands.js +34 -0
  373. package/dist/tools/apply-cuts.js +112 -0
  374. package/dist/tools/apply-sfx.js +152 -0
  375. package/dist/tools/apply-watermark.js +670 -0
  376. package/dist/tools/archive-clip.js +74 -0
  377. package/dist/tools/asset-history.js +61 -0
  378. package/dist/tools/asset-manifest.js +24 -0
  379. package/dist/tools/asset-tags.js +151 -0
  380. package/dist/tools/assign-slot.js +97 -0
  381. package/dist/tools/audio-boost.js +107 -0
  382. package/dist/tools/audio-mix.js +121 -0
  383. package/dist/tools/book-usage.js +16 -0
  384. package/dist/tools/chain.js +136 -0
  385. package/dist/tools/change-video-speed.js +105 -0
  386. package/dist/tools/chat-history.js +5 -0
  387. package/dist/tools/chat.js +848 -0
  388. package/dist/tools/clean-video-audio.js +97 -0
  389. package/dist/tools/clear-failed-tasks.js +66 -0
  390. package/dist/tools/cold-open.js +114 -0
  391. package/dist/tools/command-plan.js +1680 -0
  392. package/dist/tools/commands.js +1666 -0
  393. package/dist/tools/concat-images.js +236 -0
  394. package/dist/tools/connect-service.js +55 -0
  395. package/dist/tools/copy-file-to-clipboard.js +58 -0
  396. package/dist/tools/create-character.js +114 -0
  397. package/dist/tools/create-qart.js +253 -0
  398. package/dist/tools/create-qr-outro.js +149 -0
  399. package/dist/tools/create-qrbtf.js +215 -0
  400. package/dist/tools/create-watermark.js +97 -0
  401. package/dist/tools/crop-asset.js +18 -0
  402. package/dist/tools/crop-image.js +120 -0
  403. package/dist/tools/crop-video.js +97 -0
  404. package/dist/tools/delete-asset.js +104 -0
  405. package/dist/tools/describe-image.js +69 -0
  406. package/dist/tools/detect-scenes.js +44 -0
  407. package/dist/tools/doctor.js +126 -0
  408. package/dist/tools/download-video.js +114 -0
  409. package/dist/tools/duplicate-asset.js +184 -0
  410. package/dist/tools/edit-timeline.js +59 -0
  411. package/dist/tools/editing-moments.js +105 -0
  412. package/dist/tools/estimate-cost.js +171 -0
  413. package/dist/tools/even-split.js +295 -0
  414. package/dist/tools/export-asset-file.js +22 -0
  415. package/dist/tools/export-asset.js +140 -0
  416. package/dist/tools/export-sequence.js +250 -0
  417. package/dist/tools/export-to-downloads.js +54 -0
  418. package/dist/tools/export-transcript-srt.js +79 -0
  419. package/dist/tools/extend-audio.js +100 -0
  420. package/dist/tools/extract-audio.js +174 -0
  421. package/dist/tools/extract-frame.js +108 -0
  422. package/dist/tools/extract-notebook-audio.js +173 -0
  423. package/dist/tools/extract-notebook-frame.js +160 -0
  424. package/dist/tools/extract-video-clip.js +101 -0
  425. package/dist/tools/generate-media.js +157 -0
  426. package/dist/tools/generation-payload.js +48 -0
  427. package/dist/tools/get-timeline.js +12 -0
  428. package/dist/tools/get-watermark-config.js +38 -0
  429. package/dist/tools/goal.js +644 -0
  430. package/dist/tools/image-subjects.js +711 -0
  431. package/dist/tools/index.js +323 -0
  432. package/dist/tools/inject-first-frame.js +154 -0
  433. package/dist/tools/invert-image.js +70 -0
  434. package/dist/tools/isolate-vocals.js +66 -0
  435. package/dist/tools/list-assets.js +98 -0
  436. package/dist/tools/list-cell-generations.js +225 -0
  437. package/dist/tools/list-elevenlabs-voices.js +163 -0
  438. package/dist/tools/log-wrapper.js +29 -0
  439. package/dist/tools/make-cover-song.js +95 -0
  440. package/dist/tools/mark-asset-seen.js +23 -0
  441. package/dist/tools/media-library.js +245 -0
  442. package/dist/tools/move-timeline-audio.js +35 -0
  443. package/dist/tools/music-analysis.js +60 -0
  444. package/dist/tools/music-draft.js +29 -0
  445. package/dist/tools/pad-video.js +87 -0
  446. package/dist/tools/post-record.js +83 -0
  447. package/dist/tools/post.js +168 -0
  448. package/dist/tools/prompt-history.js +164 -0
  449. package/dist/tools/provider-key-status.js +248 -0
  450. package/dist/tools/qrbtf-render.js +849 -0
  451. package/dist/tools/read-asset-metadata.js +26 -0
  452. package/dist/tools/read-file-at-commit.js +29 -0
  453. package/dist/tools/read-transcript.js +41 -0
  454. package/dist/tools/reconcile-project-work.js +1452 -0
  455. package/dist/tools/recover-asset.js +28 -0
  456. package/dist/tools/remove-sound.js +72 -0
  457. package/dist/tools/remove-timeline-audio.js +34 -0
  458. package/dist/tools/remove-timeline-slot.js +40 -0
  459. package/dist/tools/rename-all.js +434 -0
  460. package/dist/tools/rename-asset.js +34 -0
  461. package/dist/tools/render-settings.js +47 -0
  462. package/dist/tools/render-timeline.js +120 -0
  463. package/dist/tools/render.js +384 -0
  464. package/dist/tools/reorder-character-images.js +45 -0
  465. package/dist/tools/replace-video-audio.js +133 -0
  466. package/dist/tools/restore-archive-clips.js +209 -0
  467. package/dist/tools/restore-asset-version.js +37 -0
  468. package/dist/tools/retry-generation.js +54 -0
  469. package/dist/tools/reverse-video.js +74 -0
  470. package/dist/tools/rewrite-prompt.js +388 -0
  471. package/dist/tools/rewrite-script.js +67 -0
  472. package/dist/tools/schema-from-apicity.js +66 -0
  473. package/dist/tools/search-archive.js +150 -0
  474. package/dist/tools/semantic-search.js +1214 -0
  475. package/dist/tools/sequence-rhythm.js +43 -0
  476. package/dist/tools/set-character-metadata.js +84 -0
  477. package/dist/tools/set-env-secret.js +40 -0
  478. package/dist/tools/set-osg.js +143 -0
  479. package/dist/tools/show-folder.js +37 -0
  480. package/dist/tools/smooth-scene-concat.js +122 -0
  481. package/dist/tools/splice-video.js +149 -0
  482. package/dist/tools/split-video.js +202 -0
  483. package/dist/tools/suggest-cuts.js +45 -0
  484. package/dist/tools/suggest-sfx.js +43 -0
  485. package/dist/tools/sync-video-to-audio.js +115 -0
  486. package/dist/tools/tag-backfill.js +177 -0
  487. package/dist/tools/timewarp-video.js +85 -0
  488. package/dist/tools/tool-def.js +1 -0
  489. package/dist/tools/tool-json-schema.js +116 -0
  490. package/dist/tools/transcribe.js +90 -0
  491. package/dist/tools/translate-subtitles.js +59 -0
  492. package/dist/tools/trim-audio.js +139 -0
  493. package/dist/tools/trim-video.js +168 -0
  494. package/dist/tools/update-script.js +25 -0
  495. package/dist/tools/update-timeline-audio.js +40 -0
  496. package/dist/tools/upload-file.js +41 -0
  497. package/dist/tools/verify-x-mentions.js +141 -0
  498. package/dist/tools/video-editing-command-contract.js +291 -0
  499. package/dist/tools/video-source-reference.js +30 -0
  500. package/dist/tools/video-time-input.js +18 -0
  501. package/dist/tools/videobook-domain.js +2021 -0
  502. package/dist/tools/wait-for-asset-ready.js +143 -0
  503. package/dist/tools/workspace-actions.js +54 -0
  504. package/dist/transcript-projection.js +202 -0
  505. package/dist/transcript-srt.js +33 -0
  506. package/dist/upload.js +76 -0
  507. package/dist/usage-providers.js +25 -0
  508. package/dist/video-analysis-projection.js +46 -0
  509. package/dist/video-poster.js +33 -0
  510. package/dist/video-proxy.js +99 -0
  511. package/dist/vision-regions.js +111 -0
  512. package/dist/voice-actions.js +90 -0
  513. package/dist/voice-audio.js +55 -0
  514. package/dist/voice-config.js +122 -0
  515. package/dist/voice-continuation.js +54 -0
  516. package/dist/voice-contract.js +1 -0
  517. package/dist/voice-http.js +145 -0
  518. package/dist/voice-reply-progress.js +55 -0
  519. package/dist/voice-session.js +992 -0
  520. package/dist/watermark-badge.js +259 -0
  521. package/dist/watermark-config.js +111 -0
  522. package/dist/watermark-handle-position.js +55 -0
  523. package/dist/watermark-platform.js +15 -0
  524. package/dist/watermark-timing.js +16 -0
  525. package/dist/workspace-action-catalog.js +315 -0
  526. package/dist/workspace-action-contract.js +21 -0
  527. package/dist/workspace-action-groups.js +98 -0
  528. package/dist/workspace-action-surfaces.js +7 -0
  529. package/dist/x/account.js +88 -0
  530. package/dist/x/authenticated-handle.js +30 -0
  531. package/dist/x/oauth-flow.js +191 -0
  532. package/dist/x/post-contract.js +1 -0
  533. package/dist/x/post-metadata.js +44 -0
  534. package/dist/x/post-to-x.js +456 -0
  535. package/dist/x/published-post-cell.js +90 -0
  536. package/dist/x/x-tokens.js +69 -0
  537. package/dist/ytdlp-binary.js +65 -0
  538. package/dist/zod-slots.js +334 -0
  539. package/package.json +84 -4
  540. package/ui/assets/alive-captions-BWb5nLKj.css +1 -0
  541. package/ui/assets/alive-captions-DPEr1nKM.js +1 -0
  542. package/ui/assets/confirm-bodies-D8ouHXKy.js +1 -0
  543. package/ui/assets/confirm-bodies-DrMhaXC6.css +1 -0
  544. package/ui/assets/fullscreen-B7nw4YbE.js +1 -0
  545. package/ui/assets/goal-ui-DK-xTCK0.js +2 -0
  546. package/ui/assets/goal-ui-DXdUM2KF.css +1 -0
  547. package/ui/assets/index-DzPAnCUj.css +1 -0
  548. package/ui/assets/index-kS1905s5.js +37 -0
  549. package/ui/assets/inspector-MlzQbTVo.js +1 -0
  550. package/ui/assets/jobs-ui-CoinOWx0.js +1 -0
  551. package/ui/assets/music-video-Cbe80kmQ.js +1 -0
  552. package/ui/assets/music-video-DPaiKKEq.css +1 -0
  553. package/ui/assets/ui-Oirr9VOf.css +1 -0
  554. package/ui/assets/ui-xo_Y1yQg.js +2 -0
  555. package/ui/assets/vendor-D2rfiZ5j.css +1 -0
  556. package/ui/assets/vendor-DfTCWgKm.js +19 -0
  557. package/ui/assets/vendor-flow-BXbeWxW7.js +7 -0
  558. package/ui/assets/vendor-flow-BnuhLJ6X.css +1 -0
  559. package/ui/assets/vendor-icons-CGqhCIXV.js +1 -0
  560. package/ui/assets/vendor-mcp-BTlEJcHV.js +67 -0
  561. package/ui/assets/vendor-react-Dj7D1fD4.js +9 -0
  562. package/ui/assets/vendor-remotion-CH1HXrlc.js +95 -0
  563. package/ui/assets/videobook-Qlp9HQFu.js +20 -0
  564. package/ui/favicon.svg +8 -0
  565. package/ui/index.html +126 -0
@@ -0,0 +1,726 @@
1
+ import { notebookOccupiedSlots } from "videobook-engine/notebook-grid";
2
+ import { findGenerateAudioOutputCell, findGenerateImageOutputCell, findGenerateVideoOutputCell, } from "videobook-engine";
3
+ import { notebookGridTag } from "videobook-engine/notebook-grid";
4
+ import { nextGenerationOutputSlot } from "./notebook-placement.js";
5
+ import { isPublishedPostCell } from "./notebook-published-post.js";
6
+ export const EXTRACT_FRAME_OUTPUT_ROLE = "extract-frame-output";
7
+ export const EXTRACT_AUDIO_OUTPUT_ROLE = "extract-audio-output";
8
+ function extractPairOutputType(extract) {
9
+ if (extract.type === "extract_audio")
10
+ return "audio";
11
+ return null;
12
+ }
13
+ function findLegacyExtractPair(document, extract) {
14
+ const expectedType = extractPairOutputType(extract);
15
+ if (!expectedType)
16
+ return null;
17
+ for (const edge of document.edges) {
18
+ if (edge.source !== extract.id || edge.targetInput !== "media")
19
+ continue;
20
+ const outputCell = document.cells.find((cell) => cell.id === edge.target);
21
+ if (outputCell?.type === expectedType) {
22
+ return { outputCell, outputEdge: edge };
23
+ }
24
+ }
25
+ return null;
26
+ }
27
+ function versionArtifactIds(cell) {
28
+ const persisted = Array.isArray(cell.inputs?.outputVersionArtifactIds)
29
+ ? cell.inputs.outputVersionArtifactIds.filter((value) => typeof value === "string" && value.length > 0)
30
+ : [];
31
+ return [...new Set([
32
+ ...persisted,
33
+ ...(cell.outputArtifactId ? [cell.outputArtifactId] : []),
34
+ ])];
35
+ }
36
+ function adoptExtractFromPair(extract, outputCell) {
37
+ const adoptedArtifact = outputCell.outputArtifactId ?? extract.outputArtifactId;
38
+ const pairInputs = outputCell.inputs ?? {};
39
+ const extractInputs = extract.inputs ?? {};
40
+ const inputs = { ...extractInputs };
41
+ for (const key of [
42
+ "durationSeconds",
43
+ "frameMode",
44
+ "timestampSeconds",
45
+ "atSeconds",
46
+ ]) {
47
+ if (inputs[key] === undefined && pairInputs[key] !== undefined) {
48
+ inputs[key] = pairInputs[key];
49
+ }
50
+ }
51
+ const outputVersionArtifactIds = [...new Set([
52
+ ...versionArtifactIds(extract),
53
+ ...versionArtifactIds(outputCell),
54
+ ])];
55
+ if (outputVersionArtifactIds.length > 0) {
56
+ inputs.outputVersionArtifactIds = outputVersionArtifactIds;
57
+ }
58
+ if (adoptedArtifact)
59
+ inputs.state = "completed";
60
+ else if (inputs.state === "awaiting-output")
61
+ delete inputs.state;
62
+ return {
63
+ ...extract,
64
+ ...(adoptedArtifact ? { outputArtifactId: adoptedArtifact } : {}),
65
+ inputs,
66
+ };
67
+ }
68
+ export function normalizeLegacyExtractCells(document) {
69
+ return migrateLegacyExtractAudioCells(migrateLegacyExtractFrameCells(collapseLegacyExtractPairs(document)));
70
+ }
71
+ export function collapseLegacyExtractPairs(document) {
72
+ const pairs = document.cells.flatMap((extract) => {
73
+ const pair = findLegacyExtractPair(document, extract);
74
+ return pair ? [{ extract, ...pair }] : [];
75
+ });
76
+ if (pairs.length === 0)
77
+ return document;
78
+ const deletedCellIds = new Set(pairs.map((pair) => pair.outputCell.id));
79
+ const deletedEdgeIds = new Set(pairs.map((pair) => pair.outputEdge.id));
80
+ const adoptByExtractId = new Map(pairs.map((pair) => [pair.extract.id, pair.outputCell]));
81
+ const rewireFrom = new Map(pairs.map((pair) => [pair.outputCell.id, pair.extract.id]));
82
+ const cells = document.cells
83
+ .filter((cell) => !deletedCellIds.has(cell.id))
84
+ .map((cell) => {
85
+ const outputCell = adoptByExtractId.get(cell.id);
86
+ return outputCell ? adoptExtractFromPair(cell, outputCell) : cell;
87
+ });
88
+ const seenEdges = new Set();
89
+ const edges = [];
90
+ for (const edge of document.edges) {
91
+ if (deletedEdgeIds.has(edge.id) || deletedCellIds.has(edge.target)) {
92
+ continue;
93
+ }
94
+ const source = rewireFrom.get(edge.source) ?? edge.source;
95
+ const next = source === edge.source ? edge : { ...edge, source };
96
+ const key = `${next.source}:${next.target}:${next.targetInput}`;
97
+ if (seenEdges.has(key))
98
+ continue;
99
+ seenEdges.add(key);
100
+ edges.push(next);
101
+ }
102
+ const execution = { ...(document.execution ?? {}) };
103
+ for (const pair of pairs) {
104
+ delete execution[pair.outputCell.id];
105
+ if (execution[pair.extract.id]?.status === "awaiting-output") {
106
+ delete execution[pair.extract.id];
107
+ }
108
+ }
109
+ return {
110
+ ...document,
111
+ cells,
112
+ edges,
113
+ execution,
114
+ };
115
+ }
116
+ function isLegacyExtractFrameProducer(document, cell) {
117
+ if (cell.type !== "image")
118
+ return false;
119
+ const inputs = cell.inputs ?? {};
120
+ if (inputs.mediaRole !== undefined)
121
+ return false;
122
+ if (cell.operation === "extract_frame")
123
+ return true;
124
+ if (inputs.frameMode !== undefined)
125
+ return true;
126
+ return document.edges.some((edge) => edge.target === cell.id && edge.targetInput === "video");
127
+ }
128
+ function findLegacyExtractFrameOutput(document, producer) {
129
+ for (const edge of document.edges) {
130
+ if (edge.source !== producer.id || edge.targetInput !== "media")
131
+ continue;
132
+ const outputCell = document.cells.find((cell) => cell.id === edge.target);
133
+ if (outputCell?.type === "image") {
134
+ return { outputCell, outputEdge: edge };
135
+ }
136
+ }
137
+ return null;
138
+ }
139
+ function migratedFrameOutputCell(carrier, producer, sourceCellId) {
140
+ const inputs = { ...(carrier.inputs ?? {}) };
141
+ const producerInputs = producer.inputs ?? {};
142
+ for (const key of ["frameMode", "timestampSeconds", "atSeconds"]) {
143
+ if (inputs[key] === undefined && producerInputs[key] !== undefined) {
144
+ inputs[key] = producerInputs[key];
145
+ }
146
+ }
147
+ const outputVersionArtifactIds = [...new Set([
148
+ ...versionArtifactIds(producer),
149
+ ...versionArtifactIds(carrier),
150
+ ])];
151
+ if (outputVersionArtifactIds.length > 0) {
152
+ inputs.outputVersionArtifactIds = outputVersionArtifactIds;
153
+ }
154
+ inputs.mediaRole = EXTRACT_FRAME_OUTPUT_ROLE;
155
+ if (sourceCellId)
156
+ inputs.sourceCellId = sourceCellId;
157
+ delete inputs.producerCellId;
158
+ const outputArtifactId = carrier.outputArtifactId ?? producer.outputArtifactId;
159
+ if (outputArtifactId)
160
+ inputs.state = "completed";
161
+ else if (inputs.state === "awaiting-output")
162
+ delete inputs.state;
163
+ return {
164
+ ...carrier,
165
+ operation: undefined,
166
+ provider: undefined,
167
+ model: undefined,
168
+ tool: undefined,
169
+ ...(outputArtifactId ? { outputArtifactId } : {}),
170
+ inputs,
171
+ };
172
+ }
173
+ export function migrateLegacyExtractAudioCells(document) {
174
+ const extracts = document.cells.filter((cell) => cell.type === "extract_audio");
175
+ if (extracts.length === 0)
176
+ return document;
177
+ const retargetEdgeIds = new Map();
178
+ const replaceById = new Map();
179
+ for (const extract of extracts) {
180
+ const videoEdge = document.edges.find((edge) => edge.target === extract.id && edge.targetInput === "video") ?? null;
181
+ if (videoEdge)
182
+ retargetEdgeIds.set(videoEdge.id, extract.id);
183
+ const inputs = { ...(extract.inputs ?? {}) };
184
+ inputs.mediaRole = EXTRACT_AUDIO_OUTPUT_ROLE;
185
+ if (videoEdge)
186
+ inputs.sourceCellId = videoEdge.source;
187
+ delete inputs.producerCellId;
188
+ if (extract.outputArtifactId)
189
+ inputs.state = "completed";
190
+ else if (inputs.state === "awaiting-output")
191
+ delete inputs.state;
192
+ replaceById.set(extract.id, {
193
+ ...extract,
194
+ type: "audio",
195
+ operation: undefined,
196
+ provider: undefined,
197
+ model: undefined,
198
+ tool: undefined,
199
+ inputs,
200
+ });
201
+ }
202
+ const cells = document.cells.map((cell) => replaceById.get(cell.id) ?? cell);
203
+ const seenTargetInputs = new Set();
204
+ const edges = [];
205
+ for (const edge of document.edges) {
206
+ const retarget = retargetEdgeIds.get(edge.id);
207
+ const target = retarget ?? edge.target;
208
+ const targetInput = retarget === undefined ? edge.targetInput : "segment";
209
+ const next = target === edge.target && targetInput === edge.targetInput
210
+ ? edge
211
+ : { ...edge, target, targetInput };
212
+ const key = `${next.target}:${next.targetInput}`;
213
+ if (seenTargetInputs.has(key))
214
+ continue;
215
+ seenTargetInputs.add(key);
216
+ edges.push(next);
217
+ }
218
+ return { ...document, cells, edges };
219
+ }
220
+ export function migrateLegacyExtractFrameCells(document) {
221
+ const producers = document.cells.filter((cell) => isLegacyExtractFrameProducer(document, cell));
222
+ if (producers.length === 0)
223
+ return document;
224
+ const deletedCellIds = new Set();
225
+ const deletedEdgeIds = new Set();
226
+ const rewireFrom = new Map();
227
+ const retargetEdgeIds = new Map();
228
+ const replaceById = new Map();
229
+ for (const producer of producers) {
230
+ const videoEdge = document.edges.find((edge) => edge.target === producer.id && edge.targetInput === "video") ?? null;
231
+ const sourceCellId = videoEdge?.source ?? null;
232
+ const pair = findLegacyExtractFrameOutput(document, producer);
233
+ const carrier = pair?.outputCell ?? producer;
234
+ if (pair) {
235
+ deletedCellIds.add(producer.id);
236
+ deletedEdgeIds.add(pair.outputEdge.id);
237
+ rewireFrom.set(producer.id, carrier.id);
238
+ }
239
+ if (videoEdge)
240
+ retargetEdgeIds.set(videoEdge.id, carrier.id);
241
+ replaceById.set(carrier.id, migratedFrameOutputCell(carrier, producer, sourceCellId));
242
+ }
243
+ const cells = document.cells
244
+ .filter((cell) => !deletedCellIds.has(cell.id))
245
+ .map((cell) => replaceById.get(cell.id) ?? cell);
246
+ const seenTargetInputs = new Set();
247
+ const edges = [];
248
+ for (const edge of document.edges) {
249
+ if (deletedEdgeIds.has(edge.id))
250
+ continue;
251
+ const retarget = retargetEdgeIds.get(edge.id);
252
+ if (retarget === undefined && deletedCellIds.has(edge.target))
253
+ continue;
254
+ const source = deletedCellIds.has(edge.source)
255
+ ? rewireFrom.get(edge.source) ?? edge.source
256
+ : edge.source;
257
+ const target = retarget ?? edge.target;
258
+ const targetInput = retarget === undefined ? edge.targetInput : "segment";
259
+ const next = source === edge.source
260
+ && target === edge.target
261
+ && targetInput === edge.targetInput
262
+ ? edge
263
+ : { ...edge, source, target, targetInput };
264
+ const key = `${next.target}:${next.targetInput}`;
265
+ if (seenTargetInputs.has(key))
266
+ continue;
267
+ seenTargetInputs.add(key);
268
+ edges.push(next);
269
+ }
270
+ const execution = { ...(document.execution ?? {}) };
271
+ for (const cellId of deletedCellIds) {
272
+ delete execution[cellId];
273
+ }
274
+ for (const carrierId of replaceById.keys()) {
275
+ if (execution[carrierId]?.status === "awaiting-output") {
276
+ delete execution[carrierId];
277
+ }
278
+ }
279
+ return {
280
+ ...document,
281
+ cells,
282
+ edges,
283
+ execution,
284
+ };
285
+ }
286
+ const GENERATE_IMAGE_OUTPUT_ROLE = "generate-image-output";
287
+ const GENERATE_VIDEO_OUTPUT_ROLE = "generate-video-output";
288
+ const GENERATE_AUDIO_OUTPUT_ROLE = "generate-audio-output";
289
+ const IMAGE_OUTPUT_SPEC = {
290
+ producerType: "generate_image",
291
+ outputType: "image",
292
+ mediaRole: GENERATE_IMAGE_OUTPUT_ROLE,
293
+ labelSuffix: "image",
294
+ concurrent: true,
295
+ };
296
+ const VIDEO_OUTPUT_SPEC = {
297
+ producerType: "generate_video",
298
+ outputType: "video",
299
+ mediaRole: GENERATE_VIDEO_OUTPUT_ROLE,
300
+ labelSuffix: "video",
301
+ concurrent: true,
302
+ };
303
+ const AUDIO_OUTPUT_SPEC = {
304
+ producerType: "generate_audio",
305
+ outputType: "audio",
306
+ mediaRole: GENERATE_AUDIO_OUTPUT_ROLE,
307
+ labelSuffix: "audio",
308
+ concurrent: false,
309
+ };
310
+ export function isConcurrentGenerationProducer(cell) {
311
+ return cell.type === "generate_image" || cell.type === "generate_video";
312
+ }
313
+ export function isImageVideoGenerationResult(cell) {
314
+ const role = cell.inputs?.mediaRole;
315
+ return (cell.type === "image" && role === GENERATE_IMAGE_OUTPUT_ROLE)
316
+ || (cell.type === "video" && role === GENERATE_VIDEO_OUTPUT_ROLE);
317
+ }
318
+ function generationAcceptedAt(cell) {
319
+ return typeof cell.inputs?.acceptedAt === "string" ? cell.inputs.acceptedAt : "";
320
+ }
321
+ function compareGenerationResults(left, right) {
322
+ const byAccepted = generationAcceptedAt(left.outputCell)
323
+ .localeCompare(generationAcceptedAt(right.outputCell));
324
+ if (byAccepted !== 0)
325
+ return byAccepted;
326
+ return left.outputCell.id.localeCompare(right.outputCell.id);
327
+ }
328
+ function listGenerationOutputs(document, producerCellId, spec) {
329
+ const matches = [];
330
+ for (const edge of document.edges) {
331
+ if (edge.source !== producerCellId || edge.targetInput !== "media")
332
+ continue;
333
+ const outputCell = document.cells.find((cell) => cell.id === edge.target);
334
+ if (outputCell?.type !== spec.outputType)
335
+ continue;
336
+ if (isPublishedPostCell(outputCell))
337
+ continue;
338
+ const role = outputCell.inputs?.mediaRole;
339
+ const producer = outputCell.inputs?.producerCellId;
340
+ if (role === spec.mediaRole
341
+ || producer === producerCellId
342
+ || (role === undefined && producer === undefined)) {
343
+ matches.push({ outputCell, outputEdge: edge });
344
+ }
345
+ }
346
+ return matches.sort(compareGenerationResults);
347
+ }
348
+ export function listGenerateImageOutputs(document, generateImageCellId) {
349
+ return listGenerationOutputs(document, generateImageCellId, IMAGE_OUTPUT_SPEC);
350
+ }
351
+ export function listGenerateVideoOutputs(document, generateVideoCellId) {
352
+ return listGenerationOutputs(document, generateVideoCellId, VIDEO_OUTPUT_SPEC);
353
+ }
354
+ function latestCompletedResult(matches) {
355
+ if (matches.length === 0)
356
+ return null;
357
+ const completed = [...matches].reverse().find((match) => typeof match.outputCell.outputArtifactId === "string"
358
+ && match.outputCell.outputArtifactId.length > 0);
359
+ return completed ?? matches[matches.length - 1] ?? null;
360
+ }
361
+ function generationOutputInputs(cell, producerCellId, mediaRole, identity) {
362
+ return {
363
+ ...(cell.inputs ?? {}),
364
+ mediaRole,
365
+ producerCellId,
366
+ ...(identity?.runId ? { generationRunId: identity.runId } : {}),
367
+ ...(identity?.planId ? { generationPlanId: identity.planId } : {}),
368
+ ...(identity?.acceptedAt ? { acceptedAt: identity.acceptedAt } : {}),
369
+ };
370
+ }
371
+ function generationOutputLabel(producer, labelSuffix) {
372
+ const base = producer.label ?? notebookGridTag(producer.slot);
373
+ return `${base} ${labelSuffix}`;
374
+ }
375
+ function stampGenerationOutputCell(producer, outputCell, spec, identity) {
376
+ const inheritedOutput = {
377
+ ...outputCell,
378
+ ...(outputCell.prompt === undefined && producer.prompt !== undefined
379
+ ? { prompt: producer.prompt }
380
+ : {}),
381
+ ...(outputCell.provider === undefined && producer.provider !== undefined
382
+ ? { provider: producer.provider }
383
+ : {}),
384
+ ...(outputCell.model === undefined && producer.model !== undefined
385
+ ? { model: producer.model }
386
+ : {}),
387
+ ...(outputCell.tool === undefined && producer.tool !== undefined
388
+ ? { tool: producer.tool }
389
+ : {}),
390
+ };
391
+ const inputs = generationOutputInputs(inheritedOutput, producer.id, spec.mediaRole, identity);
392
+ if (spec.concurrent) {
393
+ delete inputs.outputVersionArtifactIds;
394
+ }
395
+ return { ...inheritedOutput, inputs };
396
+ }
397
+ function requireProducer(document, cellId, spec) {
398
+ const producer = document.cells.find((cell) => cell.id === cellId);
399
+ if (producer?.type !== spec.producerType) {
400
+ const label = spec.producerType === "generate_image"
401
+ ? "Generate Image"
402
+ : spec.producerType === "generate_audio"
403
+ ? "Generate Audio"
404
+ : "Generate Video";
405
+ throw new Error(`${label} cell not found: ${cellId}`);
406
+ }
407
+ return producer;
408
+ }
409
+ function allocateGenerationResult(engine, document, producerCellId, spec, identity) {
410
+ const producer = requireProducer(document, producerCellId, spec);
411
+ const occupied = notebookOccupiedSlots(document.cells);
412
+ const created = engine.notebooks.createCell({
413
+ type: spec.outputType,
414
+ label: generationOutputLabel(producer, spec.labelSuffix),
415
+ slot: nextGenerationOutputSlot(spec.producerType, producer.slot, occupied),
416
+ inputs: {
417
+ state: identity.state ?? "pending",
418
+ },
419
+ ...(identity.artifactId ? { outputArtifactId: identity.artifactId } : {}),
420
+ });
421
+ const outputCell = stampGenerationOutputCell(producer, created, spec, identity);
422
+ const outputEdge = engine.notebooks.createEdge({
423
+ source: producer.id,
424
+ target: outputCell.id,
425
+ targetInput: "media",
426
+ });
427
+ return {
428
+ document: {
429
+ ...document,
430
+ cells: [
431
+ ...document.cells.map((cell) => cell.id === producer.id && producer.outputArtifactId
432
+ ? { ...cell, outputArtifactId: undefined }
433
+ : cell),
434
+ outputCell,
435
+ ],
436
+ edges: [...document.edges, outputEdge],
437
+ },
438
+ outputCell,
439
+ outputEdge,
440
+ created: true,
441
+ updated: false,
442
+ };
443
+ }
444
+ export function allocateGenerateImageResult(engine, document, generateImageCellId, identity) {
445
+ return allocateGenerationResult(engine, document, generateImageCellId, IMAGE_OUTPUT_SPEC, identity);
446
+ }
447
+ export function allocateGenerateVideoResult(engine, document, generateVideoCellId, identity) {
448
+ return allocateGenerationResult(engine, document, generateVideoCellId, VIDEO_OUTPUT_SPEC, identity);
449
+ }
450
+ export function allocateGenerateAudioResult(engine, document, generateAudioCellId, identity) {
451
+ return allocateGenerationResult(engine, document, generateAudioCellId, AUDIO_OUTPUT_SPEC, identity);
452
+ }
453
+ function existingResultForArtifact(matches, artifactId) {
454
+ return matches.find((match) => match.outputCell.outputArtifactId === artifactId);
455
+ }
456
+ function stripVersionStack(cell) {
457
+ if (!("outputVersionArtifactIds" in (cell.inputs ?? {})))
458
+ return cell;
459
+ const inputs = { ...(cell.inputs ?? {}) };
460
+ delete inputs.outputVersionArtifactIds;
461
+ return { ...cell, inputs };
462
+ }
463
+ function expandStackedProducer(engine, document, producer, spec) {
464
+ let working = document;
465
+ let results = listGenerationOutputs(working, producer.id, spec);
466
+ if (results.length === 0 && producer.outputArtifactId) {
467
+ const allocated = allocateGenerationResult(engine, working, producer.id, spec, {
468
+ runId: `legacy-inline-${producer.id}`,
469
+ acceptedAt: producer.id,
470
+ artifactId: producer.outputArtifactId,
471
+ state: "completed",
472
+ });
473
+ working = {
474
+ ...allocated.document,
475
+ cells: allocated.document.cells.map((cell) => cell.id === producer.id ? { ...cell, outputArtifactId: undefined } : cell),
476
+ };
477
+ results = listGenerationOutputs(working, producer.id, spec);
478
+ }
479
+ const leftoverInline = working.cells.find((cell) => cell.id === producer.id)
480
+ ?.outputArtifactId;
481
+ if (leftoverInline && !existingResultForArtifact(results, leftoverInline)) {
482
+ const allocated = allocateGenerationResult(engine, working, producer.id, spec, {
483
+ runId: `legacy-inline-${leftoverInline}`,
484
+ acceptedAt: "0",
485
+ artifactId: leftoverInline,
486
+ state: "completed",
487
+ });
488
+ working = allocated.document;
489
+ results = listGenerationOutputs(working, producer.id, spec);
490
+ }
491
+ else if (leftoverInline) {
492
+ working = {
493
+ ...working,
494
+ cells: working.cells.map((cell) => cell.id === producer.id ? { ...cell, outputArtifactId: undefined } : cell),
495
+ };
496
+ }
497
+ for (const result of results) {
498
+ const versions = versionArtifactIds(result.outputCell);
499
+ const current = result.outputCell.outputArtifactId ?? versions.at(-1);
500
+ const historical = versions.filter((artifactId) => artifactId !== current);
501
+ if (historical.length === 0) {
502
+ if (result.outputCell.inputs?.outputVersionArtifactIds) {
503
+ working = {
504
+ ...working,
505
+ cells: working.cells.map((cell) => cell.id === result.outputCell.id ? stripVersionStack(cell) : cell),
506
+ };
507
+ }
508
+ continue;
509
+ }
510
+ working = {
511
+ ...working,
512
+ cells: working.cells.map((cell) => {
513
+ if (cell.id !== result.outputCell.id)
514
+ return cell;
515
+ const inputs = { ...(cell.inputs ?? {}) };
516
+ delete inputs.outputVersionArtifactIds;
517
+ if (current)
518
+ inputs.state = "completed";
519
+ return {
520
+ ...cell,
521
+ ...(current ? { outputArtifactId: current } : {}),
522
+ inputs,
523
+ };
524
+ }),
525
+ };
526
+ const live = listGenerationOutputs(working, producer.id, spec);
527
+ for (const artifactId of historical) {
528
+ if (existingResultForArtifact(live, artifactId))
529
+ continue;
530
+ const allocated = allocateGenerationResult(engine, working, producer.id, spec, {
531
+ runId: `legacy-stack-${artifactId}`,
532
+ acceptedAt: "0",
533
+ artifactId,
534
+ state: "completed",
535
+ });
536
+ working = allocated.document;
537
+ live.push({
538
+ outputCell: allocated.outputCell,
539
+ outputEdge: allocated.outputEdge,
540
+ });
541
+ }
542
+ }
543
+ return working;
544
+ }
545
+ export function migrateStackedGenerationResults(engine, document) {
546
+ let working = document;
547
+ for (const cell of document.cells) {
548
+ if (cell.type === "generate_image") {
549
+ working = expandStackedProducer(engine, working, cell, IMAGE_OUTPUT_SPEC);
550
+ }
551
+ else if (cell.type === "generate_video") {
552
+ working = expandStackedProducer(engine, working, cell, VIDEO_OUTPUT_SPEC);
553
+ }
554
+ }
555
+ return working;
556
+ }
557
+ function lookupLatestResult(document, producerCellId, spec, fallback) {
558
+ const listed = listGenerationOutputs(document, producerCellId, spec);
559
+ return latestCompletedResult(listed) ?? fallback(document, producerCellId);
560
+ }
561
+ export function findGenerateVideoOutput(document, generateVideoCellId) {
562
+ return lookupLatestResult(document, generateVideoCellId, VIDEO_OUTPUT_SPEC, findGenerateVideoOutputCell);
563
+ }
564
+ export function findGenerateImageOutput(document, generateImageCellId) {
565
+ return lookupLatestResult(document, generateImageCellId, IMAGE_OUTPUT_SPEC, findGenerateImageOutputCell);
566
+ }
567
+ export function findGenerateAudioOutput(document, generateAudioCellId) {
568
+ return findGenerateAudioOutputCell(document, generateAudioCellId);
569
+ }
570
+ export function findGenerationResultForRun(document, producer, identity) {
571
+ if (identity.outputCellId) {
572
+ const outputCell = document.cells.find((cell) => cell.id === identity.outputCellId);
573
+ const outputEdge = document.edges.find((edge) => edge.source === producer.id
574
+ && edge.target === identity.outputCellId
575
+ && edge.targetInput === "media");
576
+ if (!outputCell || !outputEdge)
577
+ return null;
578
+ const boundRunId = outputCell.inputs?.generationRunId
579
+ ?? document.execution?.[outputCell.id]?.runId;
580
+ if (identity.runId
581
+ && typeof boundRunId === "string"
582
+ && boundRunId !== identity.runId) {
583
+ return null;
584
+ }
585
+ return { outputCell, outputEdge };
586
+ }
587
+ if (identity.runId) {
588
+ const spec = producer.type === "generate_image"
589
+ ? IMAGE_OUTPUT_SPEC
590
+ : producer.type === "generate_video"
591
+ ? VIDEO_OUTPUT_SPEC
592
+ : AUDIO_OUTPUT_SPEC;
593
+ const match = listGenerationOutputs(document, producer.id, spec).find((item) => item.outputCell.inputs?.generationRunId === identity.runId
594
+ || document.execution?.[item.outputCell.id]?.runId === identity.runId);
595
+ if (match)
596
+ return match;
597
+ if (spec.concurrent)
598
+ return null;
599
+ }
600
+ return findGenerationMediaOutput(document, producer);
601
+ }
602
+ function ensureAudioOutput(engine, document, generateAudioCellId) {
603
+ const producer = requireProducer(document, generateAudioCellId, AUDIO_OUTPUT_SPEC);
604
+ const existing = findGenerateAudioOutput(document, generateAudioCellId);
605
+ if (existing) {
606
+ const outputCell = stampGenerationOutputCell(producer, existing.outputCell, AUDIO_OUTPUT_SPEC);
607
+ const inlineArtifactId = producer.outputArtifactId;
608
+ const withInline = inlineArtifactId && !outputCell.outputArtifactId
609
+ ? {
610
+ ...outputCell,
611
+ outputArtifactId: inlineArtifactId,
612
+ inputs: { ...outputCell.inputs, state: "completed" },
613
+ }
614
+ : outputCell;
615
+ const unchanged = existing.outputCell.inputs?.mediaRole === AUDIO_OUTPUT_SPEC.mediaRole
616
+ && existing.outputCell.inputs?.producerCellId === generateAudioCellId
617
+ && existing.outputCell.prompt === withInline.prompt
618
+ && existing.outputCell.provider === withInline.provider
619
+ && existing.outputCell.model === withInline.model
620
+ && existing.outputCell.tool === withInline.tool
621
+ && !producer.outputArtifactId;
622
+ if (unchanged) {
623
+ return { document, ...existing, created: false, updated: false };
624
+ }
625
+ return {
626
+ document: {
627
+ ...document,
628
+ cells: document.cells.map((cell) => {
629
+ if (cell.id === withInline.id)
630
+ return withInline;
631
+ if (cell.id === producer.id && producer.outputArtifactId) {
632
+ return { ...cell, outputArtifactId: undefined };
633
+ }
634
+ return cell;
635
+ }),
636
+ },
637
+ outputCell: withInline,
638
+ outputEdge: existing.outputEdge,
639
+ created: false,
640
+ updated: true,
641
+ };
642
+ }
643
+ return allocateGenerationResult(engine, document, generateAudioCellId, AUDIO_OUTPUT_SPEC, {
644
+ runId: `audio-${generateAudioCellId}`,
645
+ acceptedAt: generateAudioCellId,
646
+ ...(producer.outputArtifactId
647
+ ? { artifactId: producer.outputArtifactId, state: "completed" }
648
+ : {}),
649
+ });
650
+ }
651
+ export function ensureGenerateVideoOutput(engine, document, generateVideoCellId) {
652
+ const producer = requireProducer(document, generateVideoCellId, VIDEO_OUTPUT_SPEC);
653
+ const migrated = expandStackedProducer(engine, document, producer, VIDEO_OUTPUT_SPEC);
654
+ const existing = findGenerateVideoOutput(migrated, generateVideoCellId);
655
+ if (existing) {
656
+ return {
657
+ document: migrated,
658
+ ...existing,
659
+ created: migrated !== document,
660
+ updated: migrated !== document,
661
+ };
662
+ }
663
+ return allocateGenerateVideoResult(engine, migrated, generateVideoCellId, {
664
+ runId: `legacy-ensure-${generateVideoCellId}`,
665
+ acceptedAt: generateVideoCellId,
666
+ });
667
+ }
668
+ export function ensureGenerateImageOutput(engine, document, generateImageCellId) {
669
+ const producer = requireProducer(document, generateImageCellId, IMAGE_OUTPUT_SPEC);
670
+ const migrated = expandStackedProducer(engine, document, producer, IMAGE_OUTPUT_SPEC);
671
+ const existing = findGenerateImageOutput(migrated, generateImageCellId);
672
+ if (existing) {
673
+ return {
674
+ document: migrated,
675
+ ...existing,
676
+ created: migrated !== document,
677
+ updated: migrated !== document,
678
+ };
679
+ }
680
+ return allocateGenerateImageResult(engine, migrated, generateImageCellId, {
681
+ runId: `legacy-ensure-${generateImageCellId}`,
682
+ acceptedAt: generateImageCellId,
683
+ });
684
+ }
685
+ export function ensureGenerateAudioOutput(engine, document, generateAudioCellId) {
686
+ return ensureAudioOutput(engine, document, generateAudioCellId);
687
+ }
688
+ export function findGenerationMediaOutput(document, cell) {
689
+ if (cell.type === "generate_video") {
690
+ return findGenerateVideoOutput(document, cell.id);
691
+ }
692
+ if (cell.type === "generate_image") {
693
+ return findGenerateImageOutput(document, cell.id);
694
+ }
695
+ if (cell.type === "generate_audio") {
696
+ return findGenerateAudioOutput(document, cell.id);
697
+ }
698
+ return null;
699
+ }
700
+ export function ensureGenerationMediaOutput(engine, document, cell) {
701
+ if (cell.type === "generate_audio") {
702
+ return ensureGenerateAudioOutput(engine, document, cell.id);
703
+ }
704
+ if (cell.type === "generate_video") {
705
+ const existing = findGenerateVideoOutput(document, cell.id);
706
+ if (existing)
707
+ return { document, ...existing, created: false, updated: false };
708
+ throw new Error(`Generate Video result cell is not allocated for ${cell.id}`);
709
+ }
710
+ if (cell.type === "generate_image") {
711
+ const existing = findGenerateImageOutput(document, cell.id);
712
+ if (existing)
713
+ return { document, ...existing, created: false, updated: false };
714
+ throw new Error(`Generate Image result cell is not allocated for ${cell.id}`);
715
+ }
716
+ throw new Error(`Generation output cell is not supported for ${cell.type}`);
717
+ }
718
+ export function ensureGenerationMediaOutputs(engine, document) {
719
+ let working = migrateStackedGenerationResults(engine, document);
720
+ for (const cell of working.cells) {
721
+ if (cell.type !== "generate_audio")
722
+ continue;
723
+ working = ensureGenerateAudioOutput(engine, working, cell.id).document;
724
+ }
725
+ return working;
726
+ }