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.
- package/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +195 -2
- package/bin/videobook.js +7 -0
- package/dist/acestep/client.js +203 -0
- package/dist/acestep/config.js +62 -0
- package/dist/acestep/errors.js +8 -0
- package/dist/acestep/process.js +175 -0
- package/dist/alive-captions/analyze.js +117 -0
- package/dist/alive-captions/audio.js +179 -0
- package/dist/alive-captions/frames.js +59 -0
- package/dist/alive-captions/model.js +37 -0
- package/dist/alive-captions/schema.js +49 -0
- package/dist/alive-captions/track.js +9 -0
- package/dist/api-key.js +33 -0
- package/dist/app-state.js +56 -0
- package/dist/app.js +257 -0
- package/dist/archive-b2.js +332 -0
- package/dist/archive-store.js +169 -0
- package/dist/artifact-label.js +36 -0
- package/dist/artifact-refs.js +49 -0
- package/dist/asset-tag-extraction.js +169 -0
- package/dist/asset-tags.js +228 -0
- package/dist/asset-usage.js +23 -0
- package/dist/audio-cue.js +71 -0
- package/dist/audio-encoding.js +32 -0
- package/dist/audio-sync-request.js +1 -0
- package/dist/audio-sync.js +223 -0
- package/dist/audio-trim-range.js +31 -0
- package/dist/book-context.js +31 -0
- package/dist/book-manager.js +374 -0
- package/dist/catalog-gc.js +26 -0
- package/dist/chain-executor.js +815 -0
- package/dist/chain-generation.js +115 -0
- package/dist/chain-plan.js +746 -0
- package/dist/chain-step-review.js +60 -0
- package/dist/character-name.js +25 -0
- package/dist/chat-generation-routing.js +73 -0
- package/dist/chat-generation-settings.js +78 -0
- package/dist/chat-models.js +44 -0
- package/dist/chat-prompt-rewrite.js +67 -0
- package/dist/chat-router.js +628 -0
- package/dist/chat-view-actions.js +49 -0
- package/dist/cli/args.js +242 -0
- package/dist/cli/config-command.js +103 -0
- package/dist/cli/doctor-command.js +289 -0
- package/dist/cli/entry.js +2 -0
- package/dist/cli/key-report.js +16 -0
- package/dist/cli/main.js +104 -0
- package/dist/cli/mcp-command.js +88 -0
- package/dist/cli/mcp-relay.js +51 -0
- package/dist/cli/open-browser.js +14 -0
- package/dist/cli/run-command.js +231 -0
- package/dist/cli/serve-command.js +62 -0
- package/dist/cli/setup-command.js +60 -0
- package/dist/cli/stdio-guard.js +8 -0
- package/dist/cold-open-model.js +7 -0
- package/dist/cold-open.js +79 -0
- package/dist/command-reference.js +95 -0
- package/dist/content-store.js +74 -0
- package/dist/cost.js +8 -0
- package/dist/crop-geometry.js +23 -0
- package/dist/dancing-workflow.js +447 -0
- package/dist/data-home.js +44 -0
- package/dist/diagnostics.js +109 -0
- package/dist/dialog-quality.js +34 -0
- package/dist/downloads-dest.js +56 -0
- package/dist/editing-moments.js +194 -0
- package/dist/elevenlabs-audio-extension.js +66 -0
- package/dist/engine.js +54 -0
- package/dist/env-file.js +91 -0
- package/dist/env-secrets.js +148 -0
- package/dist/ffmpeg-binary.js +12 -0
- package/dist/ffmpeg.js +425 -0
- package/dist/ffprobe-binary.js +77 -0
- package/dist/forget-asset.js +216 -0
- package/dist/frame-utils.js +27 -0
- package/dist/generation-credit-error.js +11 -0
- package/dist/generation-input-mentions.js +117 -0
- package/dist/generation-input-policy.js +68 -0
- package/dist/generation-reference-mentions.js +97 -0
- package/dist/goal-characters.js +49 -0
- package/dist/goal-plan-v3.js +273 -0
- package/dist/goal-plan.js +220 -0
- package/dist/goal-planner-prompt.js +28 -0
- package/dist/goal-prompt-budget.js +4 -0
- package/dist/goal-reference-images.js +25 -0
- package/dist/goal-state.js +261 -0
- package/dist/goal-stills.js +153 -0
- package/dist/goal-store.js +144 -0
- package/dist/goal-styles.js +144 -0
- package/dist/goal-v3-runtime.js +157 -0
- package/dist/guides/character_schema_guide.md +70 -0
- package/dist/guides/gpt_image_2_5_prompting_guide.md +21 -0
- package/dist/guides/grok_imagine_prompting_guide.md +72 -0
- package/dist/guides/image_reproduction_guide.md +84 -0
- package/dist/guides/kling_3_0_prompting_guide.md +136 -0
- package/dist/guides/nano_banana_pro_prompting_guide.md +28 -0
- package/dist/guides/seedance_2_prompting_guide.md +172 -0
- package/dist/http-access.js +49 -0
- package/dist/http-byte-range.js +31 -0
- package/dist/hydration.js +56 -0
- package/dist/image-compress.js +77 -0
- package/dist/image-edit-default.js +1 -0
- package/dist/image-edit-models.js +41 -0
- package/dist/image-edit-settings.js +11 -0
- package/dist/image-region-edit.js +32 -0
- package/dist/image-subject-map.js +523 -0
- package/dist/image.js +46 -0
- package/dist/index.js +12 -0
- package/dist/job-deadline.js +60 -0
- package/dist/jobs/_alibaba-upload.js +30 -0
- package/dist/jobs/_audio-chunks.js +31 -0
- package/dist/jobs/_download-into-asset.js +15 -0
- package/dist/jobs/_fal-shared.js +22 -0
- package/dist/jobs/_fal-upload.js +35 -0
- package/dist/jobs/_image-edit-adapter.js +213 -0
- package/dist/jobs/_kie-poll.js +119 -0
- package/dist/jobs/_kie-upload.js +32 -0
- package/dist/jobs/_lease.js +163 -0
- package/dist/jobs/_persist-output.js +19 -0
- package/dist/jobs/_storage-retry.js +21 -0
- package/dist/jobs/_transcribe.js +245 -0
- package/dist/jobs/_translate-transcript.js +270 -0
- package/dist/jobs/analyze-alive-captions.js +10 -0
- package/dist/jobs/analyze-editing-moments.js +104 -0
- package/dist/jobs/analyze-jokes.js +143 -0
- package/dist/jobs/analyze-keyword-placement.js +155 -0
- package/dist/jobs/analyze-music.js +14 -0
- package/dist/jobs/analyze-video.js +282 -0
- package/dist/jobs/apply-cuts.js +83 -0
- package/dist/jobs/apply-sfx.js +107 -0
- package/dist/jobs/archive-clip.js +458 -0
- package/dist/jobs/assemble-goal.js +98 -0
- package/dist/jobs/audio-boost.js +71 -0
- package/dist/jobs/audio-mix.js +161 -0
- package/dist/jobs/backfill-asset-tags.js +144 -0
- package/dist/jobs/burn-watermark.js +316 -0
- package/dist/jobs/change-video-speed.js +176 -0
- package/dist/jobs/clean-video-audio.js +207 -0
- package/dist/jobs/cold-open.js +166 -0
- package/dist/jobs/combine-goal.js +108 -0
- package/dist/jobs/complete-provider-task.js +185 -0
- package/dist/jobs/copy-library-asset.js +33 -0
- package/dist/jobs/cost-estimate-assessment.js +113 -0
- package/dist/jobs/crop-image.js +47 -0
- package/dist/jobs/crop-video.js +71 -0
- package/dist/jobs/describe-image.js +181 -0
- package/dist/jobs/detect-scenes.js +33 -0
- package/dist/jobs/doctor-fix.js +100 -0
- package/dist/jobs/download-video.js +427 -0
- package/dist/jobs/enqueue-search-index.js +24 -0
- package/dist/jobs/even-split.js +122 -0
- package/dist/jobs/export-sequence.js +365 -0
- package/dist/jobs/extend-audio.js +229 -0
- package/dist/jobs/extract-audio.js +72 -0
- package/dist/jobs/extract-frame.js +58 -0
- package/dist/jobs/extract-notebook-audio.js +82 -0
- package/dist/jobs/extract-notebook-frame.js +93 -0
- package/dist/jobs/extract-video-clip.js +8 -0
- package/dist/jobs/extract-video-poster.js +55 -0
- package/dist/jobs/extract-waveform.js +25 -0
- package/dist/jobs/finish-goal.js +255 -0
- package/dist/jobs/forget-asset.js +11 -0
- package/dist/jobs/generate-acestep-cover.js +219 -0
- package/dist/jobs/generate-media.js +70 -0
- package/dist/jobs/image-subjects.js +1059 -0
- package/dist/jobs/index.js +18 -0
- package/dist/jobs/inject-first-frame.js +175 -0
- package/dist/jobs/isolate-vocals.js +69 -0
- package/dist/jobs/kie-paygate.js +177 -0
- package/dist/jobs/label-music-sections.js +5 -0
- package/dist/jobs/osg-placement.js +135 -0
- package/dist/jobs/pad-video.js +72 -0
- package/dist/jobs/plan-goal.js +97 -0
- package/dist/jobs/post-record.js +21 -0
- package/dist/jobs/post-to-x.js +21 -0
- package/dist/jobs/prepare-search-reference.js +190 -0
- package/dist/jobs/prepare-temporal-search.js +16 -0
- package/dist/jobs/process-audio.js +67 -0
- package/dist/jobs/process-image.js +58 -0
- package/dist/jobs/process-upload.js +166 -0
- package/dist/jobs/process-video.js +438 -0
- package/dist/jobs/register-all.js +161 -0
- package/dist/jobs/relayout-notebook.js +78 -0
- package/dist/jobs/remove-sound.js +299 -0
- package/dist/jobs/render-project.js +380 -0
- package/dist/jobs/render-qr-outro.js +138 -0
- package/dist/jobs/render-timeline.js +283 -0
- package/dist/jobs/repair-search-indexes.js +42 -0
- package/dist/jobs/replace-video-audio.js +64 -0
- package/dist/jobs/restore-archive-clip.js +53 -0
- package/dist/jobs/reverse-video.js +53 -0
- package/dist/jobs/rewrite-script.js +173 -0
- package/dist/jobs/run-notebook.js +3335 -0
- package/dist/jobs/semantic-index.js +797 -0
- package/dist/jobs/smooth-scene-concat.js +257 -0
- package/dist/jobs/splice-video.js +280 -0
- package/dist/jobs/split-video.js +127 -0
- package/dist/jobs/suggest-cuts.js +149 -0
- package/dist/jobs/suggest-sfx.js +135 -0
- package/dist/jobs/sync-video-to-audio.js +329 -0
- package/dist/jobs/tag-asset.js +266 -0
- package/dist/jobs/task-failure.js +16 -0
- package/dist/jobs/timewarp-video.js +152 -0
- package/dist/jobs/transcribe-video-audio.js +117 -0
- package/dist/jobs/transcribe.js +35 -0
- package/dist/jobs/translate-transcript.js +55 -0
- package/dist/jobs/trim-audio.js +133 -0
- package/dist/jobs/trim-video.js +291 -0
- package/dist/jobs/xai-paygate.js +26 -0
- package/dist/keyword-placement-cache.js +74 -0
- package/dist/lazy-render.js +142 -0
- package/dist/library-browse.js +78 -0
- package/dist/lightning-defaults.js +206 -0
- package/dist/load-env.js +12 -0
- package/dist/local-search-models.js +206 -0
- package/dist/local-upload.js +318 -0
- package/dist/logger.js +69 -0
- package/dist/media/adapters/alibaba.js +20 -0
- package/dist/media/adapters/elevenlabs.js +58 -0
- package/dist/media/adapters/fal.js +45 -0
- package/dist/media/adapters/index.js +26 -0
- package/dist/media/adapters/kie.js +120 -0
- package/dist/media/adapters/pending.js +21 -0
- package/dist/media/adapters/types.js +5 -0
- package/dist/media/adapters/xai.js +18 -0
- package/dist/media/catalog.js +236 -0
- package/dist/media/complete.js +191 -0
- package/dist/media/cost.js +45 -0
- package/dist/media/descriptor.js +157 -0
- package/dist/media/endpoints.js +11 -0
- package/dist/media/frame-options.js +18 -0
- package/dist/media/insert-video-timing.js +17 -0
- package/dist/media/json-schema.js +75 -0
- package/dist/media/legacy-task-types.js +129 -0
- package/dist/media/listing.js +24 -0
- package/dist/media/model-id.js +14 -0
- package/dist/media/preview.js +86 -0
- package/dist/media/prompt-dialects.js +65 -0
- package/dist/media/ref-fields.js +106 -0
- package/dist/media/refs.js +131 -0
- package/dist/media/request.js +188 -0
- package/dist/media/types.js +6 -0
- package/dist/media/wire.js +161 -0
- package/dist/media-library.js +535 -0
- package/dist/media-output-path.js +33 -0
- package/dist/multyculty-workflow.js +757 -0
- package/dist/notebook-action-catalog.js +608 -0
- package/dist/notebook-cell-outputs.js +726 -0
- package/dist/notebook-credit-retry.js +45 -0
- package/dist/notebook-fixtures.js +8 -0
- package/dist/notebook-generation-contract.js +77 -0
- package/dist/notebook-generation-controls.js +145 -0
- package/dist/notebook-goal-layout.js +40 -0
- package/dist/notebook-graph.js +37 -0
- package/dist/notebook-image-edit.js +84 -0
- package/dist/notebook-initial-generation-prompt.js +222 -0
- package/dist/notebook-live-analysis.js +941 -0
- package/dist/notebook-media-ops.js +579 -0
- package/dist/notebook-mutations.js +20 -0
- package/dist/notebook-placement.js +41 -0
- package/dist/notebook-provider-failure.js +87 -0
- package/dist/notebook-published-post.js +26 -0
- package/dist/notebook-reference-resolver.js +227 -0
- package/dist/notebook-relayout.js +270 -0
- package/dist/notebook-run-plan.js +519 -0
- package/dist/notebook-shots.js +162 -0
- package/dist/notebook-workflow.js +856 -0
- package/dist/one-password.js +200 -0
- package/dist/openai-intelligence.js +99 -0
- package/dist/original-media-file.js +12 -0
- package/dist/osg-assets.js +36 -0
- package/dist/osg-placement-cache.js +64 -0
- package/dist/osg-settings.js +27 -0
- package/dist/paid-tools.js +22 -0
- package/dist/platform-guidance.js +26 -0
- package/dist/posts/dropbox-auth.js +91 -0
- package/dist/posts/dropbox-upload.js +132 -0
- package/dist/posts/icloud-drive.js +134 -0
- package/dist/posts/icloud-status.js +64 -0
- package/dist/posts/post-contract.js +2 -0
- package/dist/posts/post-copy-format.js +43 -0
- package/dist/posts/post-copy.js +193 -0
- package/dist/posts/post-folder.js +18 -0
- package/dist/posts/post-metrics.js +119 -0
- package/dist/posts/post-store.js +340 -0
- package/dist/posts/x-post-target.js +43 -0
- package/dist/preview-payload.js +90 -0
- package/dist/prompt-surfaces.js +22 -0
- package/dist/provider-prompt-transform.js +77 -0
- package/dist/provider-status-link.js +21 -0
- package/dist/provider-task-record.js +78 -0
- package/dist/provider-task-status.js +47 -0
- package/dist/provider-usage.js +294 -0
- package/dist/queue.js +810 -0
- package/dist/reference-video-duration.js +17 -0
- package/dist/remotion/BlurFillVideo.js +51 -0
- package/dist/remotion/KeywordGraphicsOverlay.js +68 -0
- package/dist/remotion/OsgOverlay.js +30 -0
- package/dist/remotion/QrOutroComposition.js +47 -0
- package/dist/remotion/RenderComposition.js +11 -0
- package/dist/remotion/browser.js +59 -0
- package/dist/remotion/constants.js +35 -0
- package/dist/remotion/index.js +66 -0
- package/dist/remotion/keyword-graphics.js +151 -0
- package/dist/remotion/keyword-placement.js +182 -0
- package/dist/remotion/osg-spec.js +198 -0
- package/dist/remotion/public/qr-outro-impact.wav +0 -0
- package/dist/remotion/qr-outro-audio.js +1 -0
- package/dist/remotion/qr-outro-spec.js +211 -0
- package/dist/remotion/shared-bundle.js +37 -0
- package/dist/remotion/subtitles/AliveCaptions.js +83 -0
- package/dist/remotion/subtitles/Highlight.js +58 -0
- package/dist/remotion/subtitles/Impact.js +67 -0
- package/dist/remotion/subtitles/SubtitleOverlay.js +9 -0
- package/dist/remotion/subtitles/alive-layout.js +321 -0
- package/dist/remotion/subtitles/alive-types.js +17 -0
- package/dist/remotion/subtitles/chunker.js +68 -0
- package/dist/remotion/subtitles/segments.js +42 -0
- package/dist/remotion/subtitles/styles.js +4 -0
- package/dist/remotion/subtitles/types.js +1 -0
- package/dist/remotion/util.js +18 -0
- package/dist/remotion-cancellation.js +15 -0
- package/dist/rename-helpers.js +204 -0
- package/dist/rhythm/analyze.js +128 -0
- package/dist/rhythm/contract.js +14 -0
- package/dist/rhythm/draft-model.js +19 -0
- package/dist/rhythm/energy.js +133 -0
- package/dist/rhythm/fft.js +44 -0
- package/dist/rhythm/model.js +71 -0
- package/dist/rhythm/music-analysis.js +124 -0
- package/dist/rhythm/music-draft.js +261 -0
- package/dist/rhythm/onset.js +101 -0
- package/dist/rhythm/run-worker.js +51 -0
- package/dist/rhythm/score.js +47 -0
- package/dist/rhythm/section-labels.js +168 -0
- package/dist/rhythm/sequence-rhythm.js +67 -0
- package/dist/rhythm/synthesize.js +103 -0
- package/dist/rhythm/timing.js +98 -0
- package/dist/rhythm/track.js +320 -0
- package/dist/rhythm/visual-fit.js +4 -0
- package/dist/rhythm/worker.js +25 -0
- package/dist/scene-detect.js +200 -0
- package/dist/scene-transition.js +12 -0
- package/dist/scheduled-posts.js +200 -0
- package/dist/search-index-coverage.js +13 -0
- package/dist/search-index-media.js +71 -0
- package/dist/search-reference-store.js +60 -0
- package/dist/search-scoring.js +17 -0
- package/dist/serve.js +125 -0
- package/dist/server-lock.js +143 -0
- package/dist/server.js +42 -0
- package/dist/srt.js +16 -0
- package/dist/tag-backfill-state.js +121 -0
- package/dist/tag-settings.js +30 -0
- package/dist/tag-vocabulary.js +237 -0
- package/dist/test-queue-cleanup.js +1 -0
- package/dist/time-parse.js +50 -0
- package/dist/timeline-helpers.js +554 -0
- package/dist/timewarp.js +87 -0
- package/dist/tools/_image-inputs.js +9 -0
- package/dist/tools/_media-refs.js +84 -0
- package/dist/tools/_shared.js +59 -0
- package/dist/tools/_suggest-shared.js +279 -0
- package/dist/tools/add-timeline-audio.js +73 -0
- package/dist/tools/alive-captions.js +157 -0
- package/dist/tools/analyze-jokes.js +56 -0
- package/dist/tools/analyze-video.js +66 -0
- package/dist/tools/animate-keywords.js +217 -0
- package/dist/tools/api-status.js +42 -0
- package/dist/tools/application-commands.js +34 -0
- package/dist/tools/apply-cuts.js +112 -0
- package/dist/tools/apply-sfx.js +152 -0
- package/dist/tools/apply-watermark.js +670 -0
- package/dist/tools/archive-clip.js +74 -0
- package/dist/tools/asset-history.js +61 -0
- package/dist/tools/asset-manifest.js +24 -0
- package/dist/tools/asset-tags.js +151 -0
- package/dist/tools/assign-slot.js +97 -0
- package/dist/tools/audio-boost.js +107 -0
- package/dist/tools/audio-mix.js +121 -0
- package/dist/tools/book-usage.js +16 -0
- package/dist/tools/chain.js +136 -0
- package/dist/tools/change-video-speed.js +105 -0
- package/dist/tools/chat-history.js +5 -0
- package/dist/tools/chat.js +848 -0
- package/dist/tools/clean-video-audio.js +97 -0
- package/dist/tools/clear-failed-tasks.js +66 -0
- package/dist/tools/cold-open.js +114 -0
- package/dist/tools/command-plan.js +1680 -0
- package/dist/tools/commands.js +1666 -0
- package/dist/tools/concat-images.js +236 -0
- package/dist/tools/connect-service.js +55 -0
- package/dist/tools/copy-file-to-clipboard.js +58 -0
- package/dist/tools/create-character.js +114 -0
- package/dist/tools/create-qart.js +253 -0
- package/dist/tools/create-qr-outro.js +149 -0
- package/dist/tools/create-qrbtf.js +215 -0
- package/dist/tools/create-watermark.js +97 -0
- package/dist/tools/crop-asset.js +18 -0
- package/dist/tools/crop-image.js +120 -0
- package/dist/tools/crop-video.js +97 -0
- package/dist/tools/delete-asset.js +104 -0
- package/dist/tools/describe-image.js +69 -0
- package/dist/tools/detect-scenes.js +44 -0
- package/dist/tools/doctor.js +126 -0
- package/dist/tools/download-video.js +114 -0
- package/dist/tools/duplicate-asset.js +184 -0
- package/dist/tools/edit-timeline.js +59 -0
- package/dist/tools/editing-moments.js +105 -0
- package/dist/tools/estimate-cost.js +171 -0
- package/dist/tools/even-split.js +295 -0
- package/dist/tools/export-asset-file.js +22 -0
- package/dist/tools/export-asset.js +140 -0
- package/dist/tools/export-sequence.js +250 -0
- package/dist/tools/export-to-downloads.js +54 -0
- package/dist/tools/export-transcript-srt.js +79 -0
- package/dist/tools/extend-audio.js +100 -0
- package/dist/tools/extract-audio.js +174 -0
- package/dist/tools/extract-frame.js +108 -0
- package/dist/tools/extract-notebook-audio.js +173 -0
- package/dist/tools/extract-notebook-frame.js +160 -0
- package/dist/tools/extract-video-clip.js +101 -0
- package/dist/tools/generate-media.js +157 -0
- package/dist/tools/generation-payload.js +48 -0
- package/dist/tools/get-timeline.js +12 -0
- package/dist/tools/get-watermark-config.js +38 -0
- package/dist/tools/goal.js +644 -0
- package/dist/tools/image-subjects.js +711 -0
- package/dist/tools/index.js +323 -0
- package/dist/tools/inject-first-frame.js +154 -0
- package/dist/tools/invert-image.js +70 -0
- package/dist/tools/isolate-vocals.js +66 -0
- package/dist/tools/list-assets.js +98 -0
- package/dist/tools/list-cell-generations.js +225 -0
- package/dist/tools/list-elevenlabs-voices.js +163 -0
- package/dist/tools/log-wrapper.js +29 -0
- package/dist/tools/make-cover-song.js +95 -0
- package/dist/tools/mark-asset-seen.js +23 -0
- package/dist/tools/media-library.js +245 -0
- package/dist/tools/move-timeline-audio.js +35 -0
- package/dist/tools/music-analysis.js +60 -0
- package/dist/tools/music-draft.js +29 -0
- package/dist/tools/pad-video.js +87 -0
- package/dist/tools/post-record.js +83 -0
- package/dist/tools/post.js +168 -0
- package/dist/tools/prompt-history.js +164 -0
- package/dist/tools/provider-key-status.js +248 -0
- package/dist/tools/qrbtf-render.js +849 -0
- package/dist/tools/read-asset-metadata.js +26 -0
- package/dist/tools/read-file-at-commit.js +29 -0
- package/dist/tools/read-transcript.js +41 -0
- package/dist/tools/reconcile-project-work.js +1452 -0
- package/dist/tools/recover-asset.js +28 -0
- package/dist/tools/remove-sound.js +72 -0
- package/dist/tools/remove-timeline-audio.js +34 -0
- package/dist/tools/remove-timeline-slot.js +40 -0
- package/dist/tools/rename-all.js +434 -0
- package/dist/tools/rename-asset.js +34 -0
- package/dist/tools/render-settings.js +47 -0
- package/dist/tools/render-timeline.js +120 -0
- package/dist/tools/render.js +384 -0
- package/dist/tools/reorder-character-images.js +45 -0
- package/dist/tools/replace-video-audio.js +133 -0
- package/dist/tools/restore-archive-clips.js +209 -0
- package/dist/tools/restore-asset-version.js +37 -0
- package/dist/tools/retry-generation.js +54 -0
- package/dist/tools/reverse-video.js +74 -0
- package/dist/tools/rewrite-prompt.js +388 -0
- package/dist/tools/rewrite-script.js +67 -0
- package/dist/tools/schema-from-apicity.js +66 -0
- package/dist/tools/search-archive.js +150 -0
- package/dist/tools/semantic-search.js +1214 -0
- package/dist/tools/sequence-rhythm.js +43 -0
- package/dist/tools/set-character-metadata.js +84 -0
- package/dist/tools/set-env-secret.js +40 -0
- package/dist/tools/set-osg.js +143 -0
- package/dist/tools/show-folder.js +37 -0
- package/dist/tools/smooth-scene-concat.js +122 -0
- package/dist/tools/splice-video.js +149 -0
- package/dist/tools/split-video.js +202 -0
- package/dist/tools/suggest-cuts.js +45 -0
- package/dist/tools/suggest-sfx.js +43 -0
- package/dist/tools/sync-video-to-audio.js +115 -0
- package/dist/tools/tag-backfill.js +177 -0
- package/dist/tools/timewarp-video.js +85 -0
- package/dist/tools/tool-def.js +1 -0
- package/dist/tools/tool-json-schema.js +116 -0
- package/dist/tools/transcribe.js +90 -0
- package/dist/tools/translate-subtitles.js +59 -0
- package/dist/tools/trim-audio.js +139 -0
- package/dist/tools/trim-video.js +168 -0
- package/dist/tools/update-script.js +25 -0
- package/dist/tools/update-timeline-audio.js +40 -0
- package/dist/tools/upload-file.js +41 -0
- package/dist/tools/verify-x-mentions.js +141 -0
- package/dist/tools/video-editing-command-contract.js +291 -0
- package/dist/tools/video-source-reference.js +30 -0
- package/dist/tools/video-time-input.js +18 -0
- package/dist/tools/videobook-domain.js +2021 -0
- package/dist/tools/wait-for-asset-ready.js +143 -0
- package/dist/tools/workspace-actions.js +54 -0
- package/dist/transcript-projection.js +202 -0
- package/dist/transcript-srt.js +33 -0
- package/dist/upload.js +76 -0
- package/dist/usage-providers.js +25 -0
- package/dist/video-analysis-projection.js +46 -0
- package/dist/video-poster.js +33 -0
- package/dist/video-proxy.js +99 -0
- package/dist/vision-regions.js +111 -0
- package/dist/voice-actions.js +90 -0
- package/dist/voice-audio.js +55 -0
- package/dist/voice-config.js +122 -0
- package/dist/voice-continuation.js +54 -0
- package/dist/voice-contract.js +1 -0
- package/dist/voice-http.js +145 -0
- package/dist/voice-reply-progress.js +55 -0
- package/dist/voice-session.js +992 -0
- package/dist/watermark-badge.js +259 -0
- package/dist/watermark-config.js +111 -0
- package/dist/watermark-handle-position.js +55 -0
- package/dist/watermark-platform.js +15 -0
- package/dist/watermark-timing.js +16 -0
- package/dist/workspace-action-catalog.js +315 -0
- package/dist/workspace-action-contract.js +21 -0
- package/dist/workspace-action-groups.js +98 -0
- package/dist/workspace-action-surfaces.js +7 -0
- package/dist/x/account.js +88 -0
- package/dist/x/authenticated-handle.js +30 -0
- package/dist/x/oauth-flow.js +191 -0
- package/dist/x/post-contract.js +1 -0
- package/dist/x/post-metadata.js +44 -0
- package/dist/x/post-to-x.js +456 -0
- package/dist/x/published-post-cell.js +90 -0
- package/dist/x/x-tokens.js +69 -0
- package/dist/ytdlp-binary.js +65 -0
- package/dist/zod-slots.js +334 -0
- package/package.json +84 -4
- package/ui/assets/alive-captions-BWb5nLKj.css +1 -0
- package/ui/assets/alive-captions-DPEr1nKM.js +1 -0
- package/ui/assets/confirm-bodies-D8ouHXKy.js +1 -0
- package/ui/assets/confirm-bodies-DrMhaXC6.css +1 -0
- package/ui/assets/fullscreen-B7nw4YbE.js +1 -0
- package/ui/assets/goal-ui-DK-xTCK0.js +2 -0
- package/ui/assets/goal-ui-DXdUM2KF.css +1 -0
- package/ui/assets/index-DzPAnCUj.css +1 -0
- package/ui/assets/index-kS1905s5.js +37 -0
- package/ui/assets/inspector-MlzQbTVo.js +1 -0
- package/ui/assets/jobs-ui-CoinOWx0.js +1 -0
- package/ui/assets/music-video-Cbe80kmQ.js +1 -0
- package/ui/assets/music-video-DPaiKKEq.css +1 -0
- package/ui/assets/ui-Oirr9VOf.css +1 -0
- package/ui/assets/ui-xo_Y1yQg.js +2 -0
- package/ui/assets/vendor-D2rfiZ5j.css +1 -0
- package/ui/assets/vendor-DfTCWgKm.js +19 -0
- package/ui/assets/vendor-flow-BXbeWxW7.js +7 -0
- package/ui/assets/vendor-flow-BnuhLJ6X.css +1 -0
- package/ui/assets/vendor-icons-CGqhCIXV.js +1 -0
- package/ui/assets/vendor-mcp-BTlEJcHV.js +67 -0
- package/ui/assets/vendor-react-Dj7D1fD4.js +9 -0
- package/ui/assets/vendor-remotion-CH1HXrlc.js +95 -0
- package/ui/assets/videobook-Qlp9HQFu.js +20 -0
- package/ui/favicon.svg +8 -0
- 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
|
+
}
|