videoclaw 3.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +165 -0
- package/CLAUDE.md +232 -0
- package/LICENSE +36 -0
- package/README.md +737 -0
- package/dist/cli/args.d.ts +59 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +279 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/handlers/analysis.d.ts +3 -0
- package/dist/cli/handlers/analysis.d.ts.map +1 -0
- package/dist/cli/handlers/analysis.js +111 -0
- package/dist/cli/handlers/analysis.js.map +1 -0
- package/dist/cli/handlers/audio.d.ts +25 -0
- package/dist/cli/handlers/audio.d.ts.map +1 -0
- package/dist/cli/handlers/audio.js +321 -0
- package/dist/cli/handlers/audio.js.map +1 -0
- package/dist/cli/handlers/batch.d.ts +4 -0
- package/dist/cli/handlers/batch.d.ts.map +1 -0
- package/dist/cli/handlers/batch.js +424 -0
- package/dist/cli/handlers/batch.js.map +1 -0
- package/dist/cli/handlers/candidates.d.ts +10 -0
- package/dist/cli/handlers/candidates.d.ts.map +1 -0
- package/dist/cli/handlers/candidates.js +389 -0
- package/dist/cli/handlers/candidates.js.map +1 -0
- package/dist/cli/handlers/character.d.ts +8 -0
- package/dist/cli/handlers/character.d.ts.map +1 -0
- package/dist/cli/handlers/character.js +202 -0
- package/dist/cli/handlers/character.js.map +1 -0
- package/dist/cli/handlers/clone.d.ts +5 -0
- package/dist/cli/handlers/clone.d.ts.map +1 -0
- package/dist/cli/handlers/clone.js +303 -0
- package/dist/cli/handlers/clone.js.map +1 -0
- package/dist/cli/handlers/create.d.ts +5 -0
- package/dist/cli/handlers/create.d.ts.map +1 -0
- package/dist/cli/handlers/create.js +635 -0
- package/dist/cli/handlers/create.js.map +1 -0
- package/dist/cli/handlers/execution.d.ts +5 -0
- package/dist/cli/handlers/execution.d.ts.map +1 -0
- package/dist/cli/handlers/execution.js +132 -0
- package/dist/cli/handlers/execution.js.map +1 -0
- package/dist/cli/handlers/library.d.ts +8 -0
- package/dist/cli/handlers/library.d.ts.map +1 -0
- package/dist/cli/handlers/library.js +77 -0
- package/dist/cli/handlers/library.js.map +1 -0
- package/dist/cli/handlers/media-ops.d.ts +7 -0
- package/dist/cli/handlers/media-ops.d.ts.map +1 -0
- package/dist/cli/handlers/media-ops.js +120 -0
- package/dist/cli/handlers/media-ops.js.map +1 -0
- package/dist/cli/handlers/media-production.d.ts +56 -0
- package/dist/cli/handlers/media-production.d.ts.map +1 -0
- package/dist/cli/handlers/media-production.js +673 -0
- package/dist/cli/handlers/media-production.js.map +1 -0
- package/dist/cli/handlers/motion-overlay.d.ts +10 -0
- package/dist/cli/handlers/motion-overlay.d.ts.map +1 -0
- package/dist/cli/handlers/motion-overlay.js +651 -0
- package/dist/cli/handlers/motion-overlay.js.map +1 -0
- package/dist/cli/handlers/multi-shot.d.ts +2 -0
- package/dist/cli/handlers/multi-shot.d.ts.map +1 -0
- package/dist/cli/handlers/multi-shot.js +424 -0
- package/dist/cli/handlers/multi-shot.js.map +1 -0
- package/dist/cli/handlers/project-ops.d.ts +14 -0
- package/dist/cli/handlers/project-ops.d.ts.map +1 -0
- package/dist/cli/handlers/project-ops.js +241 -0
- package/dist/cli/handlers/project-ops.js.map +1 -0
- package/dist/cli/handlers/prompt-craft.d.ts +8 -0
- package/dist/cli/handlers/prompt-craft.d.ts.map +1 -0
- package/dist/cli/handlers/prompt-craft.js +397 -0
- package/dist/cli/handlers/prompt-craft.js.map +1 -0
- package/dist/cli/handlers/provider-registration.d.ts +29 -0
- package/dist/cli/handlers/provider-registration.d.ts.map +1 -0
- package/dist/cli/handlers/provider-registration.js +225 -0
- package/dist/cli/handlers/provider-registration.js.map +1 -0
- package/dist/cli/handlers/reference-sheets.d.ts +6 -0
- package/dist/cli/handlers/reference-sheets.d.ts.map +1 -0
- package/dist/cli/handlers/reference-sheets.js +181 -0
- package/dist/cli/handlers/reference-sheets.js.map +1 -0
- package/dist/cli/handlers/reporting.d.ts +18 -0
- package/dist/cli/handlers/reporting.d.ts.map +1 -0
- package/dist/cli/handlers/reporting.js +155 -0
- package/dist/cli/handlers/reporting.js.map +1 -0
- package/dist/cli/handlers/review-portal.d.ts +8 -0
- package/dist/cli/handlers/review-portal.d.ts.map +1 -0
- package/dist/cli/handlers/review-portal.js +276 -0
- package/dist/cli/handlers/review-portal.js.map +1 -0
- package/dist/cli/handlers/show.d.ts +11 -0
- package/dist/cli/handlers/show.d.ts.map +1 -0
- package/dist/cli/handlers/show.js +136 -0
- package/dist/cli/handlers/show.js.map +1 -0
- package/dist/cli/handlers/stages.d.ts +6 -0
- package/dist/cli/handlers/stages.d.ts.map +1 -0
- package/dist/cli/handlers/stages.js +333 -0
- package/dist/cli/handlers/stages.js.map +1 -0
- package/dist/cli/handlers/studio.d.ts +2 -0
- package/dist/cli/handlers/studio.d.ts.map +1 -0
- package/dist/cli/handlers/studio.js +159 -0
- package/dist/cli/handlers/studio.js.map +1 -0
- package/dist/cli/handlers/templates.d.ts +7 -0
- package/dist/cli/handlers/templates.d.ts.map +1 -0
- package/dist/cli/handlers/templates.js +61 -0
- package/dist/cli/handlers/templates.js.map +1 -0
- package/dist/cli/provider-adapter.d.ts +3 -0
- package/dist/cli/provider-adapter.d.ts.map +1 -0
- package/dist/cli/provider-adapter.js +96 -0
- package/dist/cli/provider-adapter.js.map +1 -0
- package/dist/cli/vclaw.d.ts +15 -0
- package/dist/cli/vclaw.d.ts.map +1 -0
- package/dist/cli/vclaw.js +318 -0
- package/dist/cli/vclaw.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +27 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +168 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +55 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +80 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/video/analyze-output.d.ts +5 -0
- package/dist/video/analyze-output.d.ts.map +1 -0
- package/dist/video/analyze-output.js +7 -0
- package/dist/video/analyze-output.js.map +1 -0
- package/dist/video/archive-project.d.ts +14 -0
- package/dist/video/archive-project.d.ts.map +1 -0
- package/dist/video/archive-project.js +41 -0
- package/dist/video/archive-project.js.map +1 -0
- package/dist/video/artifact-history.d.ts +8 -0
- package/dist/video/artifact-history.d.ts.map +1 -0
- package/dist/video/artifact-history.js +12 -0
- package/dist/video/artifact-history.js.map +1 -0
- package/dist/video/artifact-store.d.ts +8 -0
- package/dist/video/artifact-store.d.ts.map +1 -0
- package/dist/video/artifact-store.js +37 -0
- package/dist/video/artifact-store.js.map +1 -0
- package/dist/video/artifact-validation.d.ts +15 -0
- package/dist/video/artifact-validation.d.ts.map +1 -0
- package/dist/video/artifact-validation.js +287 -0
- package/dist/video/artifact-validation.js.map +1 -0
- package/dist/video/artifacts.d.ts +112 -0
- package/dist/video/artifacts.d.ts.map +1 -0
- package/dist/video/artifacts.js +31 -0
- package/dist/video/artifacts.js.map +1 -0
- package/dist/video/assemble/animate-slides.d.ts +108 -0
- package/dist/video/assemble/animate-slides.d.ts.map +1 -0
- package/dist/video/assemble/animate-slides.js +152 -0
- package/dist/video/assemble/animate-slides.js.map +1 -0
- package/dist/video/assemble/animation-styles.d.ts +21 -0
- package/dist/video/assemble/animation-styles.d.ts.map +1 -0
- package/dist/video/assemble/animation-styles.js +32 -0
- package/dist/video/assemble/animation-styles.js.map +1 -0
- package/dist/video/assemble/animation-styles.json +97 -0
- package/dist/video/assemble/assemble.d.ts +24 -0
- package/dist/video/assemble/assemble.d.ts.map +1 -0
- package/dist/video/assemble/assemble.js +457 -0
- package/dist/video/assemble/assemble.js.map +1 -0
- package/dist/video/assemble/audio-concat.d.ts +61 -0
- package/dist/video/assemble/audio-concat.d.ts.map +1 -0
- package/dist/video/assemble/audio-concat.js +108 -0
- package/dist/video/assemble/audio-concat.js.map +1 -0
- package/dist/video/assemble/audio-mix-plan.d.ts +84 -0
- package/dist/video/assemble/audio-mix-plan.d.ts.map +1 -0
- package/dist/video/assemble/audio-mix-plan.js +74 -0
- package/dist/video/assemble/audio-mix-plan.js.map +1 -0
- package/dist/video/assemble/audio-utils.d.ts +32 -0
- package/dist/video/assemble/audio-utils.d.ts.map +1 -0
- package/dist/video/assemble/audio-utils.js +91 -0
- package/dist/video/assemble/audio-utils.js.map +1 -0
- package/dist/video/assemble/cut-segment.d.ts +40 -0
- package/dist/video/assemble/cut-segment.d.ts.map +1 -0
- package/dist/video/assemble/cut-segment.js +77 -0
- package/dist/video/assemble/cut-segment.js.map +1 -0
- package/dist/video/assemble/ffmpeg.d.ts +91 -0
- package/dist/video/assemble/ffmpeg.d.ts.map +1 -0
- package/dist/video/assemble/ffmpeg.js +251 -0
- package/dist/video/assemble/ffmpeg.js.map +1 -0
- package/dist/video/assemble/gemini-vision-classify.d.ts +37 -0
- package/dist/video/assemble/gemini-vision-classify.d.ts.map +1 -0
- package/dist/video/assemble/gemini-vision-classify.js +123 -0
- package/dist/video/assemble/gemini-vision-classify.js.map +1 -0
- package/dist/video/assemble/index.d.ts +47 -0
- package/dist/video/assemble/index.d.ts.map +1 -0
- package/dist/video/assemble/index.js +40 -0
- package/dist/video/assemble/index.js.map +1 -0
- package/dist/video/assemble/media-qc.d.ts +44 -0
- package/dist/video/assemble/media-qc.d.ts.map +1 -0
- package/dist/video/assemble/media-qc.js +181 -0
- package/dist/video/assemble/media-qc.js.map +1 -0
- package/dist/video/assemble/music.d.ts +51 -0
- package/dist/video/assemble/music.d.ts.map +1 -0
- package/dist/video/assemble/music.js +171 -0
- package/dist/video/assemble/music.js.map +1 -0
- package/dist/video/assemble/narration-fit.d.ts +32 -0
- package/dist/video/assemble/narration-fit.d.ts.map +1 -0
- package/dist/video/assemble/narration-fit.js +59 -0
- package/dist/video/assemble/narration-fit.js.map +1 -0
- package/dist/video/assemble/overlay.d.ts +81 -0
- package/dist/video/assemble/overlay.d.ts.map +1 -0
- package/dist/video/assemble/overlay.js +141 -0
- package/dist/video/assemble/overlay.js.map +1 -0
- package/dist/video/assemble/pdf.d.ts +46 -0
- package/dist/video/assemble/pdf.d.ts.map +1 -0
- package/dist/video/assemble/pdf.js +111 -0
- package/dist/video/assemble/pdf.js.map +1 -0
- package/dist/video/assemble/qa-dialogue-lint.d.ts +56 -0
- package/dist/video/assemble/qa-dialogue-lint.d.ts.map +1 -0
- package/dist/video/assemble/qa-dialogue-lint.js +85 -0
- package/dist/video/assemble/qa-dialogue-lint.js.map +1 -0
- package/dist/video/assemble/qa-image-filter.d.ts +52 -0
- package/dist/video/assemble/qa-image-filter.d.ts.map +1 -0
- package/dist/video/assemble/qa-image-filter.js +102 -0
- package/dist/video/assemble/qa-image-filter.js.map +1 -0
- package/dist/video/assemble/qa-image-vision.d.ts +57 -0
- package/dist/video/assemble/qa-image-vision.d.ts.map +1 -0
- package/dist/video/assemble/qa-image-vision.js +96 -0
- package/dist/video/assemble/qa-image-vision.js.map +1 -0
- package/dist/video/assemble/qa-narration-vision.d.ts +53 -0
- package/dist/video/assemble/qa-narration-vision.d.ts.map +1 -0
- package/dist/video/assemble/qa-narration-vision.js +87 -0
- package/dist/video/assemble/qa-narration-vision.js.map +1 -0
- package/dist/video/assemble/qa-narration.d.ts +53 -0
- package/dist/video/assemble/qa-narration.d.ts.map +1 -0
- package/dist/video/assemble/qa-narration.js +85 -0
- package/dist/video/assemble/qa-narration.js.map +1 -0
- package/dist/video/assemble/stitch-ad.d.ts +88 -0
- package/dist/video/assemble/stitch-ad.d.ts.map +1 -0
- package/dist/video/assemble/stitch-ad.js +161 -0
- package/dist/video/assemble/stitch-ad.js.map +1 -0
- package/dist/video/assemble/stitch.d.ts +341 -0
- package/dist/video/assemble/stitch.d.ts.map +1 -0
- package/dist/video/assemble/stitch.js +607 -0
- package/dist/video/assemble/stitch.js.map +1 -0
- package/dist/video/assemble/text-card.d.ts +78 -0
- package/dist/video/assemble/text-card.d.ts.map +1 -0
- package/dist/video/assemble/text-card.js +210 -0
- package/dist/video/assemble/text-card.js.map +1 -0
- package/dist/video/assemble/title-card.d.ts +39 -0
- package/dist/video/assemble/title-card.d.ts.map +1 -0
- package/dist/video/assemble/title-card.js +127 -0
- package/dist/video/assemble/title-card.js.map +1 -0
- package/dist/video/assemble/transcript.d.ts +66 -0
- package/dist/video/assemble/transcript.d.ts.map +1 -0
- package/dist/video/assemble/transcript.js +200 -0
- package/dist/video/assemble/transcript.js.map +1 -0
- package/dist/video/assemble/tts-elevenlabs.d.ts +52 -0
- package/dist/video/assemble/tts-elevenlabs.d.ts.map +1 -0
- package/dist/video/assemble/tts-elevenlabs.js +118 -0
- package/dist/video/assemble/tts-elevenlabs.js.map +1 -0
- package/dist/video/assemble/tts.d.ts +79 -0
- package/dist/video/assemble/tts.d.ts.map +1 -0
- package/dist/video/assemble/tts.js +131 -0
- package/dist/video/assemble/tts.js.map +1 -0
- package/dist/video/assemble/types.d.ts +43 -0
- package/dist/video/assemble/types.d.ts.map +1 -0
- package/dist/video/assemble/types.js +2 -0
- package/dist/video/assemble/types.js.map +1 -0
- package/dist/video/assemble/upscale.d.ts +43 -0
- package/dist/video/assemble/upscale.d.ts.map +1 -0
- package/dist/video/assemble/upscale.js +52 -0
- package/dist/video/assemble/upscale.js.map +1 -0
- package/dist/video/asset-spec.d.ts +15 -0
- package/dist/video/asset-spec.d.ts.map +1 -0
- package/dist/video/asset-spec.js +43 -0
- package/dist/video/asset-spec.js.map +1 -0
- package/dist/video/asset-tag-lookup.d.ts +31 -0
- package/dist/video/asset-tag-lookup.d.ts.map +1 -0
- package/dist/video/asset-tag-lookup.js +45 -0
- package/dist/video/asset-tag-lookup.js.map +1 -0
- package/dist/video/atomic-write.d.ts +2 -0
- package/dist/video/atomic-write.d.ts.map +1 -0
- package/dist/video/atomic-write.js +7 -0
- package/dist/video/atomic-write.js.map +1 -0
- package/dist/video/audio-platform/native-elevenlabs-sfx.d.ts +29 -0
- package/dist/video/audio-platform/native-elevenlabs-sfx.d.ts.map +1 -0
- package/dist/video/audio-platform/native-elevenlabs-sfx.js +95 -0
- package/dist/video/audio-platform/native-elevenlabs-sfx.js.map +1 -0
- package/dist/video/audio-platform/native-elevenlabs-tts.d.ts +30 -0
- package/dist/video/audio-platform/native-elevenlabs-tts.d.ts.map +1 -0
- package/dist/video/audio-platform/native-elevenlabs-tts.js +95 -0
- package/dist/video/audio-platform/native-elevenlabs-tts.js.map +1 -0
- package/dist/video/audio-platform/native-flowmusic.d.ts +21 -0
- package/dist/video/audio-platform/native-flowmusic.d.ts.map +1 -0
- package/dist/video/audio-platform/native-flowmusic.js +137 -0
- package/dist/video/audio-platform/native-flowmusic.js.map +1 -0
- package/dist/video/audio-platform/native-gemini-tts.d.ts +26 -0
- package/dist/video/audio-platform/native-gemini-tts.d.ts.map +1 -0
- package/dist/video/audio-platform/native-gemini-tts.js +202 -0
- package/dist/video/audio-platform/native-gemini-tts.js.map +1 -0
- package/dist/video/audio-platform/native-lyria.d.ts +35 -0
- package/dist/video/audio-platform/native-lyria.d.ts.map +1 -0
- package/dist/video/audio-platform/native-lyria.js +189 -0
- package/dist/video/audio-platform/native-lyria.js.map +1 -0
- package/dist/video/audio-platform/native-lyria3.d.ts +36 -0
- package/dist/video/audio-platform/native-lyria3.d.ts.map +1 -0
- package/dist/video/audio-platform/native-lyria3.js +210 -0
- package/dist/video/audio-platform/native-lyria3.js.map +1 -0
- package/dist/video/audio-platform/registry.d.ts +82 -0
- package/dist/video/audio-platform/registry.d.ts.map +1 -0
- package/dist/video/audio-platform/registry.js +189 -0
- package/dist/video/audio-platform/registry.js.map +1 -0
- package/dist/video/audio-platform/suno-backend.d.ts +11 -0
- package/dist/video/audio-platform/suno-backend.d.ts.map +1 -0
- package/dist/video/audio-platform/suno-backend.js +33 -0
- package/dist/video/audio-platform/suno-backend.js.map +1 -0
- package/dist/video/audio-platform/types.d.ts +128 -0
- package/dist/video/audio-platform/types.d.ts.map +1 -0
- package/dist/video/audio-platform/types.js +9 -0
- package/dist/video/audio-platform/types.js.map +1 -0
- package/dist/video/batch-queue.d.ts +276 -0
- package/dist/video/batch-queue.d.ts.map +1 -0
- package/dist/video/batch-queue.js +519 -0
- package/dist/video/batch-queue.js.map +1 -0
- package/dist/video/blueprint-prompt.d.ts +37 -0
- package/dist/video/blueprint-prompt.d.ts.map +1 -0
- package/dist/video/blueprint-prompt.js +107 -0
- package/dist/video/blueprint-prompt.js.map +1 -0
- package/dist/video/brand-definition.d.ts +97 -0
- package/dist/video/brand-definition.d.ts.map +1 -0
- package/dist/video/brand-definition.js +206 -0
- package/dist/video/brand-definition.js.map +1 -0
- package/dist/video/brand-dna.d.ts +101 -0
- package/dist/video/brand-dna.d.ts.map +1 -0
- package/dist/video/brand-dna.js +370 -0
- package/dist/video/brand-dna.js.map +1 -0
- package/dist/video/brand-prompt.d.ts +13 -0
- package/dist/video/brand-prompt.d.ts.map +1 -0
- package/dist/video/brand-prompt.js +26 -0
- package/dist/video/brand-prompt.js.map +1 -0
- package/dist/video/candidate-migrate.d.ts +27 -0
- package/dist/video/candidate-migrate.d.ts.map +1 -0
- package/dist/video/candidate-migrate.js +119 -0
- package/dist/video/candidate-migrate.js.map +1 -0
- package/dist/video/category-registry.d.ts +38 -0
- package/dist/video/category-registry.d.ts.map +1 -0
- package/dist/video/category-registry.js +188 -0
- package/dist/video/category-registry.js.map +1 -0
- package/dist/video/chain-fallback.d.ts +39 -0
- package/dist/video/chain-fallback.d.ts.map +1 -0
- package/dist/video/chain-fallback.js +43 -0
- package/dist/video/chain-fallback.js.map +1 -0
- package/dist/video/character-auto-create.d.ts +72 -0
- package/dist/video/character-auto-create.d.ts.map +1 -0
- package/dist/video/character-auto-create.js +392 -0
- package/dist/video/character-auto-create.js.map +1 -0
- package/dist/video/character-consistency.d.ts +3 -0
- package/dist/video/character-consistency.d.ts.map +1 -0
- package/dist/video/character-consistency.js +69 -0
- package/dist/video/character-consistency.js.map +1 -0
- package/dist/video/characters.d.ts +44 -0
- package/dist/video/characters.d.ts.map +1 -0
- package/dist/video/characters.js +96 -0
- package/dist/video/characters.js.map +1 -0
- package/dist/video/checkpoints.d.ts +16 -0
- package/dist/video/checkpoints.d.ts.map +1 -0
- package/dist/video/checkpoints.js +29 -0
- package/dist/video/checkpoints.js.map +1 -0
- package/dist/video/cinema-profile.d.ts +57 -0
- package/dist/video/cinema-profile.d.ts.map +1 -0
- package/dist/video/cinema-profile.js +89 -0
- package/dist/video/cinema-profile.js.map +1 -0
- package/dist/video/cinematography.d.ts +299 -0
- package/dist/video/cinematography.d.ts.map +1 -0
- package/dist/video/cinematography.js +914 -0
- package/dist/video/cinematography.js.map +1 -0
- package/dist/video/cli-output.d.ts +52 -0
- package/dist/video/cli-output.d.ts.map +1 -0
- package/dist/video/cli-output.js +81 -0
- package/dist/video/cli-output.js.map +1 -0
- package/dist/video/cli-schema.d.ts +40 -0
- package/dist/video/cli-schema.d.ts.map +1 -0
- package/dist/video/cli-schema.js +447 -0
- package/dist/video/cli-schema.js.map +1 -0
- package/dist/video/cost-estimate.d.ts +37 -0
- package/dist/video/cost-estimate.d.ts.map +1 -0
- package/dist/video/cost-estimate.js +103 -0
- package/dist/video/cost-estimate.js.map +1 -0
- package/dist/video/csv-export.d.ts +8 -0
- package/dist/video/csv-export.d.ts.map +1 -0
- package/dist/video/csv-export.js +133 -0
- package/dist/video/csv-export.js.map +1 -0
- package/dist/video/dependencies.d.ts +23 -0
- package/dist/video/dependencies.d.ts.map +1 -0
- package/dist/video/dependencies.js +36 -0
- package/dist/video/dependencies.js.map +1 -0
- package/dist/video/dialogue-fit.d.ts +23 -0
- package/dist/video/dialogue-fit.d.ts.map +1 -0
- package/dist/video/dialogue-fit.js +38 -0
- package/dist/video/dialogue-fit.js.map +1 -0
- package/dist/video/dialogue.d.ts +77 -0
- package/dist/video/dialogue.d.ts.map +1 -0
- package/dist/video/dialogue.js +143 -0
- package/dist/video/dialogue.js.map +1 -0
- package/dist/video/director-defaults.d.ts +37 -0
- package/dist/video/director-defaults.d.ts.map +1 -0
- package/dist/video/director-defaults.js +383 -0
- package/dist/video/director-defaults.js.map +1 -0
- package/dist/video/director-preflight.d.ts +53 -0
- package/dist/video/director-preflight.d.ts.map +1 -0
- package/dist/video/director-preflight.js +462 -0
- package/dist/video/director-preflight.js.map +1 -0
- package/dist/video/doctor-portfolio.d.ts +43 -0
- package/dist/video/doctor-portfolio.d.ts.map +1 -0
- package/dist/video/doctor-portfolio.js +137 -0
- package/dist/video/doctor-portfolio.js.map +1 -0
- package/dist/video/doctor.d.ts +13 -0
- package/dist/video/doctor.d.ts.map +1 -0
- package/dist/video/doctor.js +449 -0
- package/dist/video/doctor.js.map +1 -0
- package/dist/video/emotion-cues.d.ts +15 -0
- package/dist/video/emotion-cues.d.ts.map +1 -0
- package/dist/video/emotion-cues.js +37 -0
- package/dist/video/emotion-cues.js.map +1 -0
- package/dist/video/environment-assets.d.ts +28 -0
- package/dist/video/environment-assets.d.ts.map +1 -0
- package/dist/video/environment-assets.js +43 -0
- package/dist/video/environment-assets.js.map +1 -0
- package/dist/video/environment-auto-create.d.ts +20 -0
- package/dist/video/environment-auto-create.d.ts.map +1 -0
- package/dist/video/environment-auto-create.js +88 -0
- package/dist/video/environment-auto-create.js.map +1 -0
- package/dist/video/errors.d.ts +35 -0
- package/dist/video/errors.d.ts.map +1 -0
- package/dist/video/errors.js +117 -0
- package/dist/video/errors.js.map +1 -0
- package/dist/video/events.d.ts +11 -0
- package/dist/video/events.d.ts.map +1 -0
- package/dist/video/events.js +32 -0
- package/dist/video/events.js.map +1 -0
- package/dist/video/execute-autochain.d.ts +65 -0
- package/dist/video/execute-autochain.d.ts.map +1 -0
- package/dist/video/execute-autochain.js +165 -0
- package/dist/video/execute-autochain.js.map +1 -0
- package/dist/video/execute.d.ts +27 -0
- package/dist/video/execute.d.ts.map +1 -0
- package/dist/video/execute.js +477 -0
- package/dist/video/execute.js.map +1 -0
- package/dist/video/execution-cancel.d.ts +11 -0
- package/dist/video/execution-cancel.d.ts.map +1 -0
- package/dist/video/execution-cancel.js +85 -0
- package/dist/video/execution-cancel.js.map +1 -0
- package/dist/video/execution-plan.d.ts +5 -0
- package/dist/video/execution-plan.d.ts.map +1 -0
- package/dist/video/execution-plan.js +145 -0
- package/dist/video/execution-plan.js.map +1 -0
- package/dist/video/execution-profile.d.ts +25 -0
- package/dist/video/execution-profile.d.ts.map +1 -0
- package/dist/video/execution-profile.js +124 -0
- package/dist/video/execution-profile.js.map +1 -0
- package/dist/video/execution-runtime.d.ts +104 -0
- package/dist/video/execution-runtime.d.ts.map +1 -0
- package/dist/video/execution-runtime.js +750 -0
- package/dist/video/execution-runtime.js.map +1 -0
- package/dist/video/execution-seed.d.ts +14 -0
- package/dist/video/execution-seed.d.ts.map +1 -0
- package/dist/video/execution-seed.js +29 -0
- package/dist/video/execution-seed.js.map +1 -0
- package/dist/video/execution-status.d.ts +12 -0
- package/dist/video/execution-status.d.ts.map +1 -0
- package/dist/video/execution-status.js +666 -0
- package/dist/video/execution-status.js.map +1 -0
- package/dist/video/filmmaking-prompts.d.ts +356 -0
- package/dist/video/filmmaking-prompts.d.ts.map +1 -0
- package/dist/video/filmmaking-prompts.js +1212 -0
- package/dist/video/filmmaking-prompts.js.map +1 -0
- package/dist/video/final-media.d.ts +17 -0
- package/dist/video/final-media.d.ts.map +1 -0
- package/dist/video/final-media.js +78 -0
- package/dist/video/final-media.js.map +1 -0
- package/dist/video/finish.d.ts +99 -0
- package/dist/video/finish.d.ts.map +1 -0
- package/dist/video/finish.js +159 -0
- package/dist/video/finish.js.map +1 -0
- package/dist/video/flow-character-library.d.ts +143 -0
- package/dist/video/flow-character-library.d.ts.map +1 -0
- package/dist/video/flow-character-library.js +211 -0
- package/dist/video/flow-character-library.js.map +1 -0
- package/dist/video/flow-markers.d.ts +107 -0
- package/dist/video/flow-markers.d.ts.map +1 -0
- package/dist/video/flow-markers.js +278 -0
- package/dist/video/flow-markers.js.map +1 -0
- package/dist/video/gemini-analyze.d.ts +44 -0
- package/dist/video/gemini-analyze.d.ts.map +1 -0
- package/dist/video/gemini-analyze.js +323 -0
- package/dist/video/gemini-analyze.js.map +1 -0
- package/dist/video/gemini-continuity.d.ts +40 -0
- package/dist/video/gemini-continuity.d.ts.map +1 -0
- package/dist/video/gemini-continuity.js +145 -0
- package/dist/video/gemini-continuity.js.map +1 -0
- package/dist/video/gemini-judge.d.ts +33 -0
- package/dist/video/gemini-judge.d.ts.map +1 -0
- package/dist/video/gemini-judge.js +218 -0
- package/dist/video/gemini-judge.js.map +1 -0
- package/dist/video/gemini-key-pool.d.ts +23 -0
- package/dist/video/gemini-key-pool.d.ts.map +1 -0
- package/dist/video/gemini-key-pool.js +107 -0
- package/dist/video/gemini-key-pool.js.map +1 -0
- package/dist/video/gen-image-flow.d.ts +187 -0
- package/dist/video/gen-image-flow.d.ts.map +1 -0
- package/dist/video/gen-image-flow.js +331 -0
- package/dist/video/gen-image-flow.js.map +1 -0
- package/dist/video/gen-image.d.ts +153 -0
- package/dist/video/gen-image.d.ts.map +1 -0
- package/dist/video/gen-image.js +263 -0
- package/dist/video/gen-image.js.map +1 -0
- package/dist/video/generation-telemetry.d.ts +60 -0
- package/dist/video/generation-telemetry.d.ts.map +1 -0
- package/dist/video/generation-telemetry.js +214 -0
- package/dist/video/generation-telemetry.js.map +1 -0
- package/dist/video/http-error-safety.d.ts +9 -0
- package/dist/video/http-error-safety.d.ts.map +1 -0
- package/dist/video/http-error-safety.js +14 -0
- package/dist/video/http-error-safety.js.map +1 -0
- package/dist/video/image-dimensions.d.ts +7 -0
- package/dist/video/image-dimensions.d.ts.map +1 -0
- package/dist/video/image-dimensions.js +54 -0
- package/dist/video/image-dimensions.js.map +1 -0
- package/dist/video/legacy-import.d.ts +11 -0
- package/dist/video/legacy-import.d.ts.map +1 -0
- package/dist/video/legacy-import.js +181 -0
- package/dist/video/legacy-import.js.map +1 -0
- package/dist/video/library-clean.d.ts +34 -0
- package/dist/video/library-clean.d.ts.map +1 -0
- package/dist/video/library-clean.js +340 -0
- package/dist/video/library-clean.js.map +1 -0
- package/dist/video/lipsync.d.ts +72 -0
- package/dist/video/lipsync.d.ts.map +1 -0
- package/dist/video/lipsync.js +136 -0
- package/dist/video/lipsync.js.map +1 -0
- package/dist/video/media-host.d.ts +41 -0
- package/dist/video/media-host.d.ts.map +1 -0
- package/dist/video/media-host.js +106 -0
- package/dist/video/media-host.js.map +1 -0
- package/dist/video/metrics.d.ts +30 -0
- package/dist/video/metrics.d.ts.map +1 -0
- package/dist/video/metrics.js +81 -0
- package/dist/video/metrics.js.map +1 -0
- package/dist/video/motion-overlay/analyze-reel.d.ts +38 -0
- package/dist/video/motion-overlay/analyze-reel.d.ts.map +1 -0
- package/dist/video/motion-overlay/analyze-reel.js +185 -0
- package/dist/video/motion-overlay/analyze-reel.js.map +1 -0
- package/dist/video/motion-overlay/animate-render.d.ts +63 -0
- package/dist/video/motion-overlay/animate-render.d.ts.map +1 -0
- package/dist/video/motion-overlay/animate-render.js +128 -0
- package/dist/video/motion-overlay/animate-render.js.map +1 -0
- package/dist/video/motion-overlay/animate.d.ts +37 -0
- package/dist/video/motion-overlay/animate.d.ts.map +1 -0
- package/dist/video/motion-overlay/animate.js +97 -0
- package/dist/video/motion-overlay/animate.js.map +1 -0
- package/dist/video/motion-overlay/avatar-host-transport.d.ts +161 -0
- package/dist/video/motion-overlay/avatar-host-transport.d.ts.map +1 -0
- package/dist/video/motion-overlay/avatar-host-transport.js +325 -0
- package/dist/video/motion-overlay/avatar-host-transport.js.map +1 -0
- package/dist/video/motion-overlay/avatar-host.d.ts +131 -0
- package/dist/video/motion-overlay/avatar-host.d.ts.map +1 -0
- package/dist/video/motion-overlay/avatar-host.js +131 -0
- package/dist/video/motion-overlay/avatar-host.js.map +1 -0
- package/dist/video/motion-overlay/compose-prompt.d.ts +48 -0
- package/dist/video/motion-overlay/compose-prompt.d.ts.map +1 -0
- package/dist/video/motion-overlay/compose-prompt.js +217 -0
- package/dist/video/motion-overlay/compose-prompt.js.map +1 -0
- package/dist/video/motion-overlay/execute.d.ts +190 -0
- package/dist/video/motion-overlay/execute.d.ts.map +1 -0
- package/dist/video/motion-overlay/execute.js +205 -0
- package/dist/video/motion-overlay/execute.js.map +1 -0
- package/dist/video/motion-overlay/flow-pack.d.ts +65 -0
- package/dist/video/motion-overlay/flow-pack.d.ts.map +1 -0
- package/dist/video/motion-overlay/flow-pack.js +178 -0
- package/dist/video/motion-overlay/flow-pack.js.map +1 -0
- package/dist/video/motion-overlay/ingest.d.ts +74 -0
- package/dist/video/motion-overlay/ingest.d.ts.map +1 -0
- package/dist/video/motion-overlay/ingest.js +172 -0
- package/dist/video/motion-overlay/ingest.js.map +1 -0
- package/dist/video/motion-overlay/motifs.d.ts +63 -0
- package/dist/video/motion-overlay/motifs.d.ts.map +1 -0
- package/dist/video/motion-overlay/motifs.js +192 -0
- package/dist/video/motion-overlay/motifs.js.map +1 -0
- package/dist/video/motion-overlay/motion-style.d.ts +56 -0
- package/dist/video/motion-overlay/motion-style.d.ts.map +1 -0
- package/dist/video/motion-overlay/motion-style.js +130 -0
- package/dist/video/motion-overlay/motion-style.js.map +1 -0
- package/dist/video/motion-overlay/plan.d.ts +49 -0
- package/dist/video/motion-overlay/plan.d.ts.map +1 -0
- package/dist/video/motion-overlay/plan.js +79 -0
- package/dist/video/motion-overlay/plan.js.map +1 -0
- package/dist/video/motion-overlay/preview.d.ts +36 -0
- package/dist/video/motion-overlay/preview.d.ts.map +1 -0
- package/dist/video/motion-overlay/preview.js +169 -0
- package/dist/video/motion-overlay/preview.js.map +1 -0
- package/dist/video/motion-overlay/render-local.d.ts +118 -0
- package/dist/video/motion-overlay/render-local.d.ts.map +1 -0
- package/dist/video/motion-overlay/render-local.js +298 -0
- package/dist/video/motion-overlay/render-local.js.map +1 -0
- package/dist/video/motion-overlay/run.d.ts +58 -0
- package/dist/video/motion-overlay/run.d.ts.map +1 -0
- package/dist/video/motion-overlay/run.js +147 -0
- package/dist/video/motion-overlay/run.js.map +1 -0
- package/dist/video/motion-overlay/slice.d.ts +29 -0
- package/dist/video/motion-overlay/slice.d.ts.map +1 -0
- package/dist/video/motion-overlay/slice.js +88 -0
- package/dist/video/motion-overlay/slice.js.map +1 -0
- package/dist/video/motion-overlay/transcribe.d.ts +49 -0
- package/dist/video/motion-overlay/transcribe.d.ts.map +1 -0
- package/dist/video/motion-overlay/transcribe.js +180 -0
- package/dist/video/motion-overlay/transcribe.js.map +1 -0
- package/dist/video/motion-overlay/types.d.ts +82 -0
- package/dist/video/motion-overlay/types.d.ts.map +1 -0
- package/dist/video/motion-overlay/types.js +12 -0
- package/dist/video/motion-overlay/types.js.map +1 -0
- package/dist/video/motion-overlay/v2v-transport.d.ts +37 -0
- package/dist/video/motion-overlay/v2v-transport.d.ts.map +1 -0
- package/dist/video/motion-overlay/v2v-transport.js +178 -0
- package/dist/video/motion-overlay/v2v-transport.js.map +1 -0
- package/dist/video/motion-overlay/write.d.ts +40 -0
- package/dist/video/motion-overlay/write.d.ts.map +1 -0
- package/dist/video/motion-overlay/write.js +113 -0
- package/dist/video/motion-overlay/write.js.map +1 -0
- package/dist/video/multi-shot-artifact.d.ts +19 -0
- package/dist/video/multi-shot-artifact.d.ts.map +1 -0
- package/dist/video/multi-shot-artifact.js +44 -0
- package/dist/video/multi-shot-artifact.js.map +1 -0
- package/dist/video/multi-shot-prompt.d.ts +99 -0
- package/dist/video/multi-shot-prompt.d.ts.map +1 -0
- package/dist/video/multi-shot-prompt.js +466 -0
- package/dist/video/multi-shot-prompt.js.map +1 -0
- package/dist/video/music-video.d.ts +110 -0
- package/dist/video/music-video.d.ts.map +1 -0
- package/dist/video/music-video.js +190 -0
- package/dist/video/music-video.js.map +1 -0
- package/dist/video/narrate.d.ts +58 -0
- package/dist/video/narrate.d.ts.map +1 -0
- package/dist/video/narrate.js +145 -0
- package/dist/video/narrate.js.map +1 -0
- package/dist/video/native-dreamina.d.ts +35 -0
- package/dist/video/native-dreamina.d.ts.map +1 -0
- package/dist/video/native-dreamina.js +532 -0
- package/dist/video/native-dreamina.js.map +1 -0
- package/dist/video/native-flow-r2v.d.ts +113 -0
- package/dist/video/native-flow-r2v.d.ts.map +1 -0
- package/dist/video/native-flow-r2v.js +223 -0
- package/dist/video/native-flow-r2v.js.map +1 -0
- package/dist/video/native-runway.d.ts +41 -0
- package/dist/video/native-runway.d.ts.map +1 -0
- package/dist/video/native-runway.js +523 -0
- package/dist/video/native-runway.js.map +1 -0
- package/dist/video/native-seedance.d.ts +74 -0
- package/dist/video/native-seedance.d.ts.map +1 -0
- package/dist/video/native-seedance.js +461 -0
- package/dist/video/native-seedance.js.map +1 -0
- package/dist/video/native-veo.d.ts +20 -0
- package/dist/video/native-veo.d.ts.map +1 -0
- package/dist/video/native-veo.js +390 -0
- package/dist/video/native-veo.js.map +1 -0
- package/dist/video/next-actions.d.ts +27 -0
- package/dist/video/next-actions.d.ts.map +1 -0
- package/dist/video/next-actions.js +201 -0
- package/dist/video/next-actions.js.map +1 -0
- package/dist/video/obsidian-export.d.ts +12 -0
- package/dist/video/obsidian-export.d.ts.map +1 -0
- package/dist/video/obsidian-export.js +285 -0
- package/dist/video/obsidian-export.js.map +1 -0
- package/dist/video/obsidian-sync.d.ts +13 -0
- package/dist/video/obsidian-sync.d.ts.map +1 -0
- package/dist/video/obsidian-sync.js +479 -0
- package/dist/video/obsidian-sync.js.map +1 -0
- package/dist/video/obsidian-vault.d.ts +8 -0
- package/dist/video/obsidian-vault.d.ts.map +1 -0
- package/dist/video/obsidian-vault.js +81 -0
- package/dist/video/obsidian-vault.js.map +1 -0
- package/dist/video/outfit-prompts.d.ts +10 -0
- package/dist/video/outfit-prompts.d.ts.map +1 -0
- package/dist/video/outfit-prompts.js +14 -0
- package/dist/video/outfit-prompts.js.map +1 -0
- package/dist/video/outpaint-keyframe.d.ts +95 -0
- package/dist/video/outpaint-keyframe.d.ts.map +1 -0
- package/dist/video/outpaint-keyframe.js +244 -0
- package/dist/video/outpaint-keyframe.js.map +1 -0
- package/dist/video/pipeline-manifest.d.ts +4 -0
- package/dist/video/pipeline-manifest.d.ts.map +1 -0
- package/dist/video/pipeline-manifest.js +13 -0
- package/dist/video/pipeline-manifest.js.map +1 -0
- package/dist/video/pipeline-manifests/director.json +46 -0
- package/dist/video/pipeline-manifests/storyboard.json +46 -0
- package/dist/video/platform-specs.d.ts +26 -0
- package/dist/video/platform-specs.d.ts.map +1 -0
- package/dist/video/platform-specs.js +34 -0
- package/dist/video/platform-specs.js.map +1 -0
- package/dist/video/playbooks.d.ts +11 -0
- package/dist/video/playbooks.d.ts.map +1 -0
- package/dist/video/playbooks.js +22 -0
- package/dist/video/playbooks.js.map +1 -0
- package/dist/video/post-production.d.ts +57 -0
- package/dist/video/post-production.d.ts.map +1 -0
- package/dist/video/post-production.js +210 -0
- package/dist/video/post-production.js.map +1 -0
- package/dist/video/preview-portal/audit.d.ts +4 -0
- package/dist/video/preview-portal/audit.d.ts.map +1 -0
- package/dist/video/preview-portal/audit.js +16 -0
- package/dist/video/preview-portal/audit.js.map +1 -0
- package/dist/video/preview-portal/discovery.d.ts +23 -0
- package/dist/video/preview-portal/discovery.d.ts.map +1 -0
- package/dist/video/preview-portal/discovery.js +733 -0
- package/dist/video/preview-portal/discovery.js.map +1 -0
- package/dist/video/preview-portal/generate.d.ts +42 -0
- package/dist/video/preview-portal/generate.d.ts.map +1 -0
- package/dist/video/preview-portal/generate.js +101 -0
- package/dist/video/preview-portal/generate.js.map +1 -0
- package/dist/video/preview-portal/index.d.ts +12 -0
- package/dist/video/preview-portal/index.d.ts.map +1 -0
- package/dist/video/preview-portal/index.js +8 -0
- package/dist/video/preview-portal/index.js.map +1 -0
- package/dist/video/preview-portal/publish.d.ts +48 -0
- package/dist/video/preview-portal/publish.d.ts.map +1 -0
- package/dist/video/preview-portal/publish.js +169 -0
- package/dist/video/preview-portal/publish.js.map +1 -0
- package/dist/video/preview-portal/render.d.ts +4 -0
- package/dist/video/preview-portal/render.d.ts.map +1 -0
- package/dist/video/preview-portal/render.js +822 -0
- package/dist/video/preview-portal/render.js.map +1 -0
- package/dist/video/preview-portal/shared-assets.d.ts +6 -0
- package/dist/video/preview-portal/shared-assets.d.ts.map +1 -0
- package/dist/video/preview-portal/shared-assets.js +452 -0
- package/dist/video/preview-portal/shared-assets.js.map +1 -0
- package/dist/video/preview-portal/templates.d.ts +4 -0
- package/dist/video/preview-portal/templates.d.ts.map +1 -0
- package/dist/video/preview-portal/templates.js +109 -0
- package/dist/video/preview-portal/templates.js.map +1 -0
- package/dist/video/preview-portal/types.d.ts +246 -0
- package/dist/video/preview-portal/types.d.ts.map +1 -0
- package/dist/video/preview-portal/types.js +28 -0
- package/dist/video/preview-portal/types.js.map +1 -0
- package/dist/video/product-references.d.ts +21 -0
- package/dist/video/product-references.d.ts.map +1 -0
- package/dist/video/product-references.js +25 -0
- package/dist/video/product-references.js.map +1 -0
- package/dist/video/project-blueprint.d.ts +178 -0
- package/dist/video/project-blueprint.d.ts.map +1 -0
- package/dist/video/project-blueprint.js +286 -0
- package/dist/video/project-blueprint.js.map +1 -0
- package/dist/video/project-index.d.ts +82 -0
- package/dist/video/project-index.d.ts.map +1 -0
- package/dist/video/project-index.js +89 -0
- package/dist/video/project-index.js.map +1 -0
- package/dist/video/projects.d.ts +3 -0
- package/dist/video/projects.d.ts.map +1 -0
- package/dist/video/projects.js +18 -0
- package/dist/video/projects.js.map +1 -0
- package/dist/video/prompt-guidance.d.ts +14 -0
- package/dist/video/prompt-guidance.d.ts.map +1 -0
- package/dist/video/prompt-guidance.js +44 -0
- package/dist/video/prompt-guidance.js.map +1 -0
- package/dist/video/prompt-library.d.ts +11 -0
- package/dist/video/prompt-library.d.ts.map +1 -0
- package/dist/video/prompt-library.js +85 -0
- package/dist/video/prompt-library.js.map +1 -0
- package/dist/video/prompt-lint.d.ts +146 -0
- package/dist/video/prompt-lint.d.ts.map +1 -0
- package/dist/video/prompt-lint.js +433 -0
- package/dist/video/prompt-lint.js.map +1 -0
- package/dist/video/prompt-quality.d.ts +29 -0
- package/dist/video/prompt-quality.d.ts.map +1 -0
- package/dist/video/prompt-quality.js +532 -0
- package/dist/video/prompt-quality.js.map +1 -0
- package/dist/video/prompt-rules.d.ts +94 -0
- package/dist/video/prompt-rules.d.ts.map +1 -0
- package/dist/video/prompt-rules.js +169 -0
- package/dist/video/prompt-rules.js.map +1 -0
- package/dist/video/provider-adapter-runner.d.ts +5 -0
- package/dist/video/provider-adapter-runner.d.ts.map +1 -0
- package/dist/video/provider-adapter-runner.js +92 -0
- package/dist/video/provider-adapter-runner.js.map +1 -0
- package/dist/video/provider-platform/index.d.ts +6 -0
- package/dist/video/provider-platform/index.d.ts.map +1 -0
- package/dist/video/provider-platform/index.js +6 -0
- package/dist/video/provider-platform/index.js.map +1 -0
- package/dist/video/provider-platform/registry.d.ts +5 -0
- package/dist/video/provider-platform/registry.d.ts.map +1 -0
- package/dist/video/provider-platform/registry.js +279 -0
- package/dist/video/provider-platform/registry.js.map +1 -0
- package/dist/video/provider-platform/route-capabilities.d.ts +133 -0
- package/dist/video/provider-platform/route-capabilities.d.ts.map +1 -0
- package/dist/video/provider-platform/route-capabilities.js +192 -0
- package/dist/video/provider-platform/route-capabilities.js.map +1 -0
- package/dist/video/provider-platform/router.d.ts +7 -0
- package/dist/video/provider-platform/router.d.ts.map +1 -0
- package/dist/video/provider-platform/router.js +150 -0
- package/dist/video/provider-platform/router.js.map +1 -0
- package/dist/video/provider-platform/security.d.ts +8 -0
- package/dist/video/provider-platform/security.d.ts.map +1 -0
- package/dist/video/provider-platform/security.js +21 -0
- package/dist/video/provider-platform/security.js.map +1 -0
- package/dist/video/provider-platform/telemetry.d.ts +24 -0
- package/dist/video/provider-platform/telemetry.d.ts.map +1 -0
- package/dist/video/provider-platform/telemetry.js +88 -0
- package/dist/video/provider-platform/telemetry.js.map +1 -0
- package/dist/video/provider-platform/types.d.ts +139 -0
- package/dist/video/provider-platform/types.d.ts.map +1 -0
- package/dist/video/provider-platform/types.js +17 -0
- package/dist/video/provider-platform/types.js.map +1 -0
- package/dist/video/provider-status.d.ts +12 -0
- package/dist/video/provider-status.d.ts.map +1 -0
- package/dist/video/provider-status.js +169 -0
- package/dist/video/provider-status.js.map +1 -0
- package/dist/video/providers/dreamina-useapi.d.ts +170 -0
- package/dist/video/providers/dreamina-useapi.d.ts.map +1 -0
- package/dist/video/providers/dreamina-useapi.js +176 -0
- package/dist/video/providers/dreamina-useapi.js.map +1 -0
- package/dist/video/providers/flowmusic-useapi.d.ts +114 -0
- package/dist/video/providers/flowmusic-useapi.d.ts.map +1 -0
- package/dist/video/providers/flowmusic-useapi.js +159 -0
- package/dist/video/providers/flowmusic-useapi.js.map +1 -0
- package/dist/video/providers/google-flow.d.ts +57 -0
- package/dist/video/providers/google-flow.d.ts.map +1 -0
- package/dist/video/providers/google-flow.js +63 -0
- package/dist/video/providers/google-flow.js.map +1 -0
- package/dist/video/providers/public-host.d.ts +40 -0
- package/dist/video/providers/public-host.d.ts.map +1 -0
- package/dist/video/providers/public-host.js +91 -0
- package/dist/video/providers/public-host.js.map +1 -0
- package/dist/video/providers/runway-useapi.d.ts +159 -0
- package/dist/video/providers/runway-useapi.d.ts.map +1 -0
- package/dist/video/providers/runway-useapi.js +200 -0
- package/dist/video/providers/runway-useapi.js.map +1 -0
- package/dist/video/providers/xskill.d.ts +108 -0
- package/dist/video/providers/xskill.d.ts.map +1 -0
- package/dist/video/providers/xskill.js +233 -0
- package/dist/video/providers/xskill.js.map +1 -0
- package/dist/video/readiness.d.ts +18 -0
- package/dist/video/readiness.d.ts.map +1 -0
- package/dist/video/readiness.js +221 -0
- package/dist/video/readiness.js.map +1 -0
- package/dist/video/reference-sheet-store.d.ts +5 -0
- package/dist/video/reference-sheet-store.d.ts.map +1 -0
- package/dist/video/reference-sheet-store.js +28 -0
- package/dist/video/reference-sheet-store.js.map +1 -0
- package/dist/video/reference-sheets.d.ts +40 -0
- package/dist/video/reference-sheets.d.ts.map +1 -0
- package/dist/video/reference-sheets.js +160 -0
- package/dist/video/reference-sheets.js.map +1 -0
- package/dist/video/remix-narrated.d.ts +12 -0
- package/dist/video/remix-narrated.d.ts.map +1 -0
- package/dist/video/remix-narrated.js +73 -0
- package/dist/video/remix-narrated.js.map +1 -0
- package/dist/video/report-diff.d.ts +89 -0
- package/dist/video/report-diff.d.ts.map +1 -0
- package/dist/video/report-diff.js +176 -0
- package/dist/video/report-diff.js.map +1 -0
- package/dist/video/report-history.d.ts +40 -0
- package/dist/video/report-history.d.ts.map +1 -0
- package/dist/video/report-history.js +74 -0
- package/dist/video/report-history.js.map +1 -0
- package/dist/video/report.d.ts +15 -0
- package/dist/video/report.d.ts.map +1 -0
- package/dist/video/report.js +21 -0
- package/dist/video/report.js.map +1 -0
- package/dist/video/review-ui.d.ts +180 -0
- package/dist/video/review-ui.d.ts.map +1 -0
- package/dist/video/review-ui.js +2008 -0
- package/dist/video/review-ui.js.map +1 -0
- package/dist/video/scene-candidate-store.d.ts +12 -0
- package/dist/video/scene-candidate-store.d.ts.map +1 -0
- package/dist/video/scene-candidate-store.js +134 -0
- package/dist/video/scene-candidate-store.js.map +1 -0
- package/dist/video/scene-candidates.d.ts +57 -0
- package/dist/video/scene-candidates.d.ts.map +1 -0
- package/dist/video/scene-candidates.js +149 -0
- package/dist/video/scene-candidates.js.map +1 -0
- package/dist/video/scene-selection-store.d.ts +5 -0
- package/dist/video/scene-selection-store.d.ts.map +1 -0
- package/dist/video/scene-selection-store.js +22 -0
- package/dist/video/scene-selection-store.js.map +1 -0
- package/dist/video/scene-selection.d.ts +83 -0
- package/dist/video/scene-selection.d.ts.map +1 -0
- package/dist/video/scene-selection.js +225 -0
- package/dist/video/scene-selection.js.map +1 -0
- package/dist/video/scheduling.d.ts +3 -0
- package/dist/video/scheduling.d.ts.map +1 -0
- package/dist/video/scheduling.js +16 -0
- package/dist/video/scheduling.js.map +1 -0
- package/dist/video/scorecard.d.ts +12 -0
- package/dist/video/scorecard.d.ts.map +1 -0
- package/dist/video/scorecard.js +68 -0
- package/dist/video/scorecard.js.map +1 -0
- package/dist/video/seedance-asset-library.d.ts +82 -0
- package/dist/video/seedance-asset-library.d.ts.map +1 -0
- package/dist/video/seedance-asset-library.js +146 -0
- package/dist/video/seedance-asset-library.js.map +1 -0
- package/dist/video/seedance-blocks.d.ts +56 -0
- package/dist/video/seedance-blocks.d.ts.map +1 -0
- package/dist/video/seedance-blocks.js +97 -0
- package/dist/video/seedance-blocks.js.map +1 -0
- package/dist/video/seedance-chain-host.d.ts +42 -0
- package/dist/video/seedance-chain-host.d.ts.map +1 -0
- package/dist/video/seedance-chain-host.js +128 -0
- package/dist/video/seedance-chain-host.js.map +1 -0
- package/dist/video/seedance-content-filter.d.ts +80 -0
- package/dist/video/seedance-content-filter.d.ts.map +1 -0
- package/dist/video/seedance-content-filter.js +293 -0
- package/dist/video/seedance-content-filter.js.map +1 -0
- package/dist/video/seedance-skill-loader.d.ts +40 -0
- package/dist/video/seedance-skill-loader.d.ts.map +1 -0
- package/dist/video/seedance-skill-loader.js +53 -0
- package/dist/video/seedance-skill-loader.js.map +1 -0
- package/dist/video/sfx.d.ts +49 -0
- package/dist/video/sfx.d.ts.map +1 -0
- package/dist/video/sfx.js +104 -0
- package/dist/video/sfx.js.map +1 -0
- package/dist/video/shot-grammar.d.ts +103 -0
- package/dist/video/shot-grammar.d.ts.map +1 -0
- package/dist/video/shot-grammar.js +286 -0
- package/dist/video/shot-grammar.js.map +1 -0
- package/dist/video/show-bible.d.ts +113 -0
- package/dist/video/show-bible.d.ts.map +1 -0
- package/dist/video/show-bible.js +140 -0
- package/dist/video/show-bible.js.map +1 -0
- package/dist/video/soundtrack.d.ts +72 -0
- package/dist/video/soundtrack.d.ts.map +1 -0
- package/dist/video/soundtrack.js +171 -0
- package/dist/video/soundtrack.js.map +1 -0
- package/dist/video/stage-guards.d.ts +4 -0
- package/dist/video/stage-guards.d.ts.map +1 -0
- package/dist/video/stage-guards.js +94 -0
- package/dist/video/stage-guards.js.map +1 -0
- package/dist/video/status.d.ts +69 -0
- package/dist/video/status.d.ts.map +1 -0
- package/dist/video/status.js +245 -0
- package/dist/video/status.js.map +1 -0
- package/dist/video/story-bible.d.ts +70 -0
- package/dist/video/story-bible.d.ts.map +1 -0
- package/dist/video/story-bible.js +181 -0
- package/dist/video/story-bible.js.map +1 -0
- package/dist/video/storyboard-grid.d.ts +28 -0
- package/dist/video/storyboard-grid.d.ts.map +1 -0
- package/dist/video/storyboard-grid.js +231 -0
- package/dist/video/storyboard-grid.js.map +1 -0
- package/dist/video/storyboard-markdown.d.ts +62 -0
- package/dist/video/storyboard-markdown.d.ts.map +1 -0
- package/dist/video/storyboard-markdown.js +332 -0
- package/dist/video/storyboard-markdown.js.map +1 -0
- package/dist/video/storyboard-still-candidates.d.ts +31 -0
- package/dist/video/storyboard-still-candidates.d.ts.map +1 -0
- package/dist/video/storyboard-still-candidates.js +57 -0
- package/dist/video/storyboard-still-candidates.js.map +1 -0
- package/dist/video/storyboard-templates.d.ts +28 -0
- package/dist/video/storyboard-templates.d.ts.map +1 -0
- package/dist/video/storyboard-templates.js +215 -0
- package/dist/video/storyboard-templates.js.map +1 -0
- package/dist/video/studio/execute.d.ts +142 -0
- package/dist/video/studio/execute.d.ts.map +1 -0
- package/dist/video/studio/execute.js +270 -0
- package/dist/video/studio/execute.js.map +1 -0
- package/dist/video/studio/planner.d.ts +3 -0
- package/dist/video/studio/planner.d.ts.map +1 -0
- package/dist/video/studio/planner.js +110 -0
- package/dist/video/studio/planner.js.map +1 -0
- package/dist/video/studio/project-context.d.ts +4 -0
- package/dist/video/studio/project-context.d.ts.map +1 -0
- package/dist/video/studio/project-context.js +20 -0
- package/dist/video/studio/project-context.js.map +1 -0
- package/dist/video/studio/recipes.d.ts +4 -0
- package/dist/video/studio/recipes.d.ts.map +1 -0
- package/dist/video/studio/recipes.js +343 -0
- package/dist/video/studio/recipes.js.map +1 -0
- package/dist/video/studio/session.d.ts +8 -0
- package/dist/video/studio/session.d.ts.map +1 -0
- package/dist/video/studio/session.js +17 -0
- package/dist/video/studio/session.js.map +1 -0
- package/dist/video/studio/types.d.ts +59 -0
- package/dist/video/studio/types.d.ts.map +1 -0
- package/dist/video/studio/types.js +2 -0
- package/dist/video/studio/types.js.map +1 -0
- package/dist/video/template-store.d.ts +65 -0
- package/dist/video/template-store.d.ts.map +1 -0
- package/dist/video/template-store.js +168 -0
- package/dist/video/template-store.js.map +1 -0
- package/dist/video/timeline.d.ts +8 -0
- package/dist/video/timeline.d.ts.map +1 -0
- package/dist/video/timeline.js +21 -0
- package/dist/video/timeline.js.map +1 -0
- package/dist/video/title-overlay.d.ts +85 -0
- package/dist/video/title-overlay.d.ts.map +1 -0
- package/dist/video/title-overlay.js +163 -0
- package/dist/video/title-overlay.js.map +1 -0
- package/dist/video/types.d.ts +403 -0
- package/dist/video/types.d.ts.map +1 -0
- package/dist/video/types.js +2 -0
- package/dist/video/types.js.map +1 -0
- package/dist/video/veo-subprocess.d.ts +27 -0
- package/dist/video/veo-subprocess.d.ts.map +1 -0
- package/dist/video/veo-subprocess.js +52 -0
- package/dist/video/veo-subprocess.js.map +1 -0
- package/dist/video/verify-env.d.ts +43 -0
- package/dist/video/verify-env.d.ts.map +1 -0
- package/dist/video/verify-env.js +156 -0
- package/dist/video/verify-env.js.map +1 -0
- package/dist/video/verify-final.d.ts +20 -0
- package/dist/video/verify-final.d.ts.map +1 -0
- package/dist/video/verify-final.js +39 -0
- package/dist/video/verify-final.js.map +1 -0
- package/dist/video/video-context.d.ts +10 -0
- package/dist/video/video-context.d.ts.map +1 -0
- package/dist/video/video-context.js +74 -0
- package/dist/video/video-context.js.map +1 -0
- package/dist/video/vocal-map.d.ts +55 -0
- package/dist/video/vocal-map.d.ts.map +1 -0
- package/dist/video/vocal-map.js +107 -0
- package/dist/video/vocal-map.js.map +1 -0
- package/dist/video/vocal-sync-plan.d.ts +76 -0
- package/dist/video/vocal-sync-plan.d.ts.map +1 -0
- package/dist/video/vocal-sync-plan.js +166 -0
- package/dist/video/vocal-sync-plan.js.map +1 -0
- package/dist/video/voice-clone.d.ts +152 -0
- package/dist/video/voice-clone.d.ts.map +1 -0
- package/dist/video/voice-clone.js +267 -0
- package/dist/video/voice-clone.js.map +1 -0
- package/dist/video/with-retry.d.ts +67 -0
- package/dist/video/with-retry.d.ts.map +1 -0
- package/dist/video/with-retry.js +105 -0
- package/dist/video/with-retry.js.map +1 -0
- package/dist/video/workload.d.ts +20 -0
- package/dist/video/workload.d.ts.map +1 -0
- package/dist/video/workload.js +55 -0
- package/dist/video/workload.js.map +1 -0
- package/dist/video/workspace.d.ts +109 -0
- package/dist/video/workspace.d.ts.map +1 -0
- package/dist/video/workspace.js +132 -0
- package/dist/video/workspace.js.map +1 -0
- package/docs/AGENT_INTEGRATION_RESEARCH.md +123 -0
- package/docs/AI_FILMMAKING_PROMPTS.md +195 -0
- package/docs/ARCHITECTURE.md +257 -0
- package/docs/ASSEMBLE.md +376 -0
- package/docs/BRAND_AGENCY.md +63 -0
- package/docs/CLAWBOT_COVERAGE_PROMPT.md +78 -0
- package/docs/CLI_REFERENCE.md +2638 -0
- package/docs/CONCIERGE_PROMPT.md +139 -0
- package/docs/Claude Code + Higgsfield MCP = FULL Creative Agency.md +179 -0
- package/docs/DEMO_RECORDING.md +61 -0
- package/docs/DEPRECATION.md +79 -0
- package/docs/DIAGRAMS_SOURCE.md +347 -0
- package/docs/DIRECTOR_BLUEPRINT.md +94 -0
- package/docs/GENERATION_TELEMETRY.md +81 -0
- package/docs/IMPROVE_PROMPT.md +76 -0
- package/docs/INFOGRAPHICS_PROMPT.md +83 -0
- package/docs/MASTER_PLAN_ALIGNMENT.md +563 -0
- package/docs/MIGRATION.md +213 -0
- package/docs/MOTION_OVERLAY.md +355 -0
- package/docs/OBSIDIAN.md +300 -0
- package/docs/OPERATIONS.md +142 -0
- package/docs/OPERATOR_HANDOFF.md +108 -0
- package/docs/PRODUCTION_WORKFLOW.md +148 -0
- package/docs/PROJECT_LAYOUT.md +262 -0
- package/docs/PROMPT_QUALITY.md +214 -0
- package/docs/PROVIDER_PLATFORM.md +195 -0
- package/docs/PUBLISHING.md +175 -0
- package/docs/PYTHON_PIPELINE.md +139 -0
- package/docs/REFERENCE_SHEETS.md +469 -0
- package/docs/REFERENCE_VIDEO_SEEDANCE_MOTION_DESIGN_WORKFLOW.md +465 -0
- package/docs/RELEASE_READINESS.md +573 -0
- package/docs/REVIEW_UI_STORYBOARD_WORKFLOW.md +200 -0
- package/docs/SCENE_CANDIDATES.md +518 -0
- package/docs/SKILLS.md +477 -0
- package/docs/SKILL_COHESION_PROMPT.md +88 -0
- package/docs/STORY_BIBLE.md +288 -0
- package/docs/STUDIO.md +96 -0
- package/docs/TEMPLATES.md +143 -0
- package/docs/UNIFICATION_AUDIT.md +321 -0
- package/docs/UPDATE_DOCS_PROMPT.md +78 -0
- package/docs/assets/demo-quickstart.cast +13 -0
- package/docs/assets/demo-quickstart.gif +0 -0
- package/docs/assets/diagram-architecture.jpg +0 -0
- package/docs/assets/diagram-assemble.jpg +0 -0
- package/docs/assets/diagram-lifecycle.jpg +0 -0
- package/docs/assets/diagram-obsidian-loop.jpg +0 -0
- package/docs/assets/diagram-obsidian-vault.jpg +0 -0
- package/docs/assets/diagram-routing.jpg +0 -0
- package/docs/assets/diagram-skills-ecosystem.jpg +0 -0
- package/docs/assets/diagram-story-bible.jpg +0 -0
- package/docs/assets/diagram-studio-goals.jpg +0 -0
- package/docs/assets/docsite-preview.png +0 -0
- package/docs/assets/logo.jpg +0 -0
- package/docs/assets/logo.png +0 -0
- package/docs/preview-portal-audit.md +151 -0
- package/package.json +119 -0
- package/playbooks/seedance-ugc.json +32 -0
- package/playbooks/veo-generic.json +26 -0
- package/references/video/.fixtures/multi-shot-runway-10s.txt +9 -0
- package/references/video/.fixtures/multi-shot-seedance-10s.txt +9 -0
- package/references/video/.fixtures/multi-shot-valid.txt +13 -0
- package/references/video/.fixtures/multi-shot-veo-8s.txt +9 -0
- package/references/video/ai-director-blueprint.md +614 -0
- package/references/video/camera-bible.md +294 -0
- package/references/video/character-reference-sheet.md +14 -0
- package/references/video/checkpoint-protocol.md +26 -0
- package/references/video/clone-ad-template-workflow.md +14 -0
- package/references/video/dialogue-duration-preflight.md +17 -0
- package/references/video/generation-telemetry.md +18 -0
- package/references/video/multi-shot-framework.md +455 -0
- package/references/video/seedance-skills/01-cinematic.md +1329 -0
- package/references/video/seedance-skills/02-3d-cgi.md +884 -0
- package/references/video/seedance-skills/03-cartoon.md +1668 -0
- package/references/video/seedance-skills/04-comic-to-video.md +1810 -0
- package/references/video/seedance-skills/05-fight-scenes.md +741 -0
- package/references/video/seedance-skills/06-motion-design-ad.md +1145 -0
- package/references/video/seedance-skills/07-ecommerce-ad.md +928 -0
- package/references/video/seedance-skills/08-anime-action.md +1145 -0
- package/references/video/seedance-skills/09-product-360.md +988 -0
- package/references/video/seedance-skills/10-music-video.md +1662 -0
- package/references/video/seedance-skills/11-social-hook.md +1874 -0
- package/references/video/seedance-skills/12-brand-story.md +1151 -0
- package/references/video/seedance-skills/13-fashion-lookbook.md +1236 -0
- package/references/video/seedance-skills/14-food-beverage.md +1110 -0
- package/references/video/seedance-skills/15-real-estate.md +2344 -0
- package/references/video/seedance-transport-payloads.md +144 -0
- package/references/video/seedance-ugc-formulas.md +104 -0
- package/references/video/stage-directors.md +47 -0
- package/references/video/style-template-schema.md +40 -0
- package/references/video/veo-prompting-guide.md +42 -0
- package/schemas/video/artifacts/analyze-output.schema.json +60 -0
- package/schemas/video/artifacts/assemble-report.schema.json +116 -0
- package/schemas/video/artifacts/asset-manifest.schema.json +23 -0
- package/schemas/video/artifacts/batch-queue-manifest.schema.json +59 -0
- package/schemas/video/artifacts/brand-definition.schema.json +93 -0
- package/schemas/video/artifacts/brand-dna.schema.json +55 -0
- package/schemas/video/artifacts/brief.schema.json +13 -0
- package/schemas/video/artifacts/clone-plan.schema.json +44 -0
- package/schemas/video/artifacts/dialogue.schema.json +52 -0
- package/schemas/video/artifacts/environment-assets.schema.json +30 -0
- package/schemas/video/artifacts/execution-plan.schema.json +64 -0
- package/schemas/video/artifacts/execution-report.schema.json +37 -0
- package/schemas/video/artifacts/filmmaking-prompts.schema.json +129 -0
- package/schemas/video/artifacts/flow-characters.schema.json +31 -0
- package/schemas/video/artifacts/flow-voices.schema.json +30 -0
- package/schemas/video/artifacts/motion-overlay-plan.schema.json +50 -0
- package/schemas/video/artifacts/multi-shot-prompt.schema.json +90 -0
- package/schemas/video/artifacts/music-video-config.schema.json +108 -0
- package/schemas/video/artifacts/narration.schema.json +54 -0
- package/schemas/video/artifacts/product-references.schema.json +29 -0
- package/schemas/video/artifacts/project-blueprint.schema.json +236 -0
- package/schemas/video/artifacts/publish-report.schema.json +12 -0
- package/schemas/video/artifacts/reference-sheets.schema.json +85 -0
- package/schemas/video/artifacts/review-report.schema.json +12 -0
- package/schemas/video/artifacts/scene-candidates.schema.json +86 -0
- package/schemas/video/artifacts/scene-selection.schema.json +50 -0
- package/schemas/video/artifacts/seedance-assets.schema.json +31 -0
- package/schemas/video/artifacts/sfx.schema.json +31 -0
- package/schemas/video/artifacts/show-bible.schema.json +66 -0
- package/schemas/video/artifacts/soundtrack.schema.json +39 -0
- package/schemas/video/artifacts/story-bible.schema.json +131 -0
- package/schemas/video/artifacts/storyboard.schema.json +58 -0
- package/schemas/video/artifacts/voice-clones.schema.json +37 -0
- package/schemas/video/brand-profile.schema.json +20 -0
- package/schemas/video/errors.json +48 -0
- package/schemas/video/pipeline-manifest.schema.json +51 -0
- package/skills/README.md +113 -0
- package/skills/ai-director/SKILL.md +140 -0
- package/skills/ai-filmmaking/SKILL.md +239 -0
- package/skills/ai-slop-cleaner/SKILL.md +114 -0
- package/skills/brand-agency/SKILL.md +181 -0
- package/skills/brand-presenter/SKILL.md +114 -0
- package/skills/build-fix/SKILL.md +145 -0
- package/skills/bunty/SKILL.md +41 -0
- package/skills/catalog.json +326 -0
- package/skills/character-ad/SKILL.md +154 -0
- package/skills/character-creator/SKILL.md +303 -0
- package/skills/character-library/README.md +12 -0
- package/skills/character-library/SKILL.md +110 -0
- package/skills/clawbot/SKILL.md +26 -0
- package/skills/concierge/SKILL.md +183 -0
- package/skills/configure-notifications/SKILL.md +286 -0
- package/skills/davendra-presenter/SKILL.md +27 -0
- package/skills/davendra-presenter/assets/davendra_intro_1.jpg +0 -0
- package/skills/davendra-presenter/assets/davendra_intro_2.jpg +0 -0
- package/skills/davendra-presenter/assets/davendra_outro_1.jpg +0 -0
- package/skills/davendra-presenter/assets/davendra_outro_2.jpg +0 -0
- package/skills/deep-interview/SKILL.md +358 -0
- package/skills/deepsearch/SKILL.md +38 -0
- package/skills/doctor/SKILL.md +200 -0
- package/skills/graphify/SKILL.md +616 -0
- package/skills/help/SKILL.md +200 -0
- package/skills/higgsfield-generate/SKILL.md +171 -0
- package/skills/improvement-run/SKILL.md +47 -0
- package/skills/motion-reel/SKILL.md +102 -0
- package/skills/movie-director/SKILL.md +338 -0
- package/skills/multi-shot-prompt/SKILL.md +77 -0
- package/skills/nex-presenter/SKILL.md +25 -0
- package/skills/nex-presenter/assets/logo_manifest.json +26 -0
- package/skills/nex-presenter/assets/logo_source.jpg +0 -0
- package/skills/nex-presenter/assets/nex_brief_intro.mp4 +0 -0
- package/skills/nex-presenter/assets/nex_intro_1.jpg +0 -0
- package/skills/nex-presenter/assets/nex_intro_2.jpg +0 -0
- package/skills/nex-presenter/assets/nex_outro_1.jpg +0 -0
- package/skills/nex-presenter/assets/nex_outro_2.jpg +0 -0
- package/skills/nex-presenter/assets/text_overlay.png +0 -0
- package/skills/note/SKILL.md +62 -0
- package/skills/pipeline/SKILL.md +86 -0
- package/skills/review/SKILL.md +38 -0
- package/skills/runway/SKILL.md +131 -0
- package/skills/seedance-prompts/SKILL.md +194 -0
- package/skills/skill/SKILL.md +835 -0
- package/skills/skills-auditor/SKILL.md +73 -0
- package/skills/studio-mode/SKILL.md +148 -0
- package/skills/ugc/SKILL.md +386 -0
- package/skills/ui-ux-pro-max/SKILL.md +386 -0
- package/skills/video-analyze-template/SKILL.md +77 -0
- package/skills/video-clone-ad/SKILL.md +67 -0
- package/skills/video-framework/SKILL.md +201 -0
- package/skills/video-portfolio-ops/SKILL.md +84 -0
- package/skills/video-post/SKILL.md +97 -0
- package/skills/video-production-handoff/SKILL.md +130 -0
- package/skills/video-release-readiness/SKILL.md +93 -0
- package/skills/video-replicator/SKILL.md +368 -0
- package/skills/video-review-ui-qa/SKILL.md +103 -0
- package/skills/video-storyboard/SKILL.md +71 -0
- package/skills/video-thumbnail-lab/SKILL.md +67 -0
- package/skills/web-clone/SKILL.md +366 -0
- package/skills/worker/SKILL.md +106 -0
- package/skills/youtube-audio/SKILL.md +114 -0
- package/src/video/analyze-output.ts +10 -0
- package/src/video/archive-project.ts +65 -0
- package/src/video/artifact-history.ts +23 -0
- package/src/video/artifact-store.ts +59 -0
- package/src/video/artifact-validation.ts +268 -0
- package/src/video/artifacts.ts +156 -0
- package/src/video/assemble/animate-slides.ts +199 -0
- package/src/video/assemble/animation-styles.json +97 -0
- package/src/video/assemble/animation-styles.ts +54 -0
- package/src/video/assemble/assemble.ts +547 -0
- package/src/video/assemble/audio-concat.ts +165 -0
- package/src/video/assemble/audio-mix-plan.ts +150 -0
- package/src/video/assemble/audio-utils.ts +101 -0
- package/src/video/assemble/cut-segment.ts +121 -0
- package/src/video/assemble/ffmpeg.ts +333 -0
- package/src/video/assemble/gemini-vision-classify.ts +153 -0
- package/src/video/assemble/index.ts +247 -0
- package/src/video/assemble/media-qc.ts +252 -0
- package/src/video/assemble/music.ts +261 -0
- package/src/video/assemble/narration-fit.ts +90 -0
- package/src/video/assemble/overlay.ts +225 -0
- package/src/video/assemble/pdf.ts +169 -0
- package/src/video/assemble/qa-dialogue-lint.ts +129 -0
- package/src/video/assemble/qa-image-filter.ts +147 -0
- package/src/video/assemble/qa-image-vision.ts +154 -0
- package/src/video/assemble/qa-narration-vision.ts +135 -0
- package/src/video/assemble/qa-narration.ts +139 -0
- package/src/video/assemble/stitch-ad.ts +222 -0
- package/src/video/assemble/stitch.ts +918 -0
- package/src/video/assemble/text-card.ts +285 -0
- package/src/video/assemble/title-card.ts +186 -0
- package/src/video/assemble/transcript.ts +240 -0
- package/src/video/assemble/tts-elevenlabs.ts +182 -0
- package/src/video/assemble/tts.ts +227 -0
- package/src/video/assemble/types.ts +45 -0
- package/src/video/assemble/upscale.ts +80 -0
- package/src/video/asset-spec.ts +53 -0
- package/src/video/asset-tag-lookup.ts +51 -0
- package/src/video/atomic-write.ts +7 -0
- package/src/video/audio-platform/native-elevenlabs-sfx.ts +128 -0
- package/src/video/audio-platform/native-elevenlabs-tts.ts +119 -0
- package/src/video/audio-platform/native-flowmusic.ts +167 -0
- package/src/video/audio-platform/native-gemini-tts.ts +226 -0
- package/src/video/audio-platform/native-lyria.ts +231 -0
- package/src/video/audio-platform/native-lyria3.ts +244 -0
- package/src/video/audio-platform/registry.ts +220 -0
- package/src/video/audio-platform/suno-backend.ts +36 -0
- package/src/video/audio-platform/types.ts +138 -0
- package/src/video/batch-queue.ts +685 -0
- package/src/video/blueprint-prompt.ts +118 -0
- package/src/video/brand-definition.ts +287 -0
- package/src/video/brand-dna.ts +478 -0
- package/src/video/brand-prompt.ts +28 -0
- package/src/video/candidate-migrate.ts +171 -0
- package/src/video/category-registry.ts +224 -0
- package/src/video/chain-fallback.ts +53 -0
- package/src/video/character-auto-create.ts +547 -0
- package/src/video/character-consistency.ts +85 -0
- package/src/video/characters.ts +145 -0
- package/src/video/checkpoints.ts +60 -0
- package/src/video/cinema-profile.ts +120 -0
- package/src/video/cinematography.ts +1229 -0
- package/src/video/cli-output.ts +94 -0
- package/src/video/cli-schema.ts +505 -0
- package/src/video/cost-estimate.ts +150 -0
- package/src/video/csv-export.ts +150 -0
- package/src/video/dependencies.ts +64 -0
- package/src/video/dialogue-fit.ts +62 -0
- package/src/video/dialogue.ts +221 -0
- package/src/video/director-defaults.ts +432 -0
- package/src/video/director-preflight.ts +543 -0
- package/src/video/doctor-portfolio.ts +197 -0
- package/src/video/doctor.ts +499 -0
- package/src/video/emotion-cues.ts +36 -0
- package/src/video/environment-assets.ts +69 -0
- package/src/video/environment-auto-create.ts +122 -0
- package/src/video/errors.ts +133 -0
- package/src/video/events.ts +42 -0
- package/src/video/execute-autochain.ts +226 -0
- package/src/video/execute.ts +569 -0
- package/src/video/execution-cancel.ts +103 -0
- package/src/video/execution-plan.ts +178 -0
- package/src/video/execution-profile.ts +162 -0
- package/src/video/execution-runtime.ts +975 -0
- package/src/video/execution-seed.ts +46 -0
- package/src/video/execution-status.ts +736 -0
- package/src/video/filmmaking-prompts.ts +1789 -0
- package/src/video/final-media.ts +118 -0
- package/src/video/finish.ts +255 -0
- package/src/video/flow-character-library.ts +342 -0
- package/src/video/flow-markers.ts +330 -0
- package/src/video/gemini-analyze.ts +387 -0
- package/src/video/gemini-continuity.ts +186 -0
- package/src/video/gemini-judge.ts +300 -0
- package/src/video/gemini-key-pool.ts +153 -0
- package/src/video/gen-image-flow.ts +491 -0
- package/src/video/gen-image.ts +392 -0
- package/src/video/generation-telemetry.ts +282 -0
- package/src/video/http-error-safety.ts +13 -0
- package/src/video/image-dimensions.ts +69 -0
- package/src/video/legacy-import.ts +197 -0
- package/src/video/library-clean.ts +399 -0
- package/src/video/lipsync.ts +200 -0
- package/src/video/media-host.ts +153 -0
- package/src/video/metrics.ts +116 -0
- package/src/video/motion-overlay/analyze-reel.ts +200 -0
- package/src/video/motion-overlay/animate-render.ts +176 -0
- package/src/video/motion-overlay/animate.ts +93 -0
- package/src/video/motion-overlay/avatar-host-transport.ts +458 -0
- package/src/video/motion-overlay/avatar-host.ts +238 -0
- package/src/video/motion-overlay/compose-prompt.ts +247 -0
- package/src/video/motion-overlay/execute.ts +355 -0
- package/src/video/motion-overlay/flow-pack.ts +223 -0
- package/src/video/motion-overlay/ingest.ts +210 -0
- package/src/video/motion-overlay/motifs.ts +223 -0
- package/src/video/motion-overlay/motion-style.ts +162 -0
- package/src/video/motion-overlay/plan.ts +111 -0
- package/src/video/motion-overlay/preview.ts +191 -0
- package/src/video/motion-overlay/render-local.ts +441 -0
- package/src/video/motion-overlay/run.ts +217 -0
- package/src/video/motion-overlay/slice.ts +98 -0
- package/src/video/motion-overlay/transcribe.ts +211 -0
- package/src/video/motion-overlay/types.ts +89 -0
- package/src/video/motion-overlay/v2v-transport.ts +209 -0
- package/src/video/motion-overlay/write.ts +142 -0
- package/src/video/multi-shot-artifact.ts +64 -0
- package/src/video/multi-shot-prompt.ts +608 -0
- package/src/video/music-video.ts +324 -0
- package/src/video/narrate.ts +221 -0
- package/src/video/native-dreamina.ts +638 -0
- package/src/video/native-flow-r2v.ts +279 -0
- package/src/video/native-runway.ts +647 -0
- package/src/video/native-seedance.ts +615 -0
- package/src/video/native-veo.ts +470 -0
- package/src/video/next-actions.ts +247 -0
- package/src/video/obsidian-export.ts +336 -0
- package/src/video/obsidian-sync.ts +649 -0
- package/src/video/obsidian-vault.ts +96 -0
- package/src/video/outfit-prompts.ts +14 -0
- package/src/video/outpaint-keyframe.ts +365 -0
- package/src/video/pipeline-manifest.ts +16 -0
- package/src/video/pipeline-manifests/director.json +46 -0
- package/src/video/pipeline-manifests/storyboard.json +46 -0
- package/src/video/platform-specs.ts +50 -0
- package/src/video/playbooks.ts +34 -0
- package/src/video/post-production.ts +277 -0
- package/src/video/preview-portal/audit.ts +20 -0
- package/src/video/preview-portal/discovery.ts +787 -0
- package/src/video/preview-portal/generate.ts +138 -0
- package/src/video/preview-portal/index.ts +41 -0
- package/src/video/preview-portal/publish.ts +215 -0
- package/src/video/preview-portal/render.ts +865 -0
- package/src/video/preview-portal/shared-assets.ts +455 -0
- package/src/video/preview-portal/templates.ts +112 -0
- package/src/video/preview-portal/types.ts +288 -0
- package/src/video/product-references.ts +43 -0
- package/src/video/project-blueprint.ts +458 -0
- package/src/video/project-index.ts +179 -0
- package/src/video/projects.ts +18 -0
- package/src/video/prompt-guidance.ts +64 -0
- package/src/video/prompt-library.ts +96 -0
- package/src/video/prompt-lint.ts +568 -0
- package/src/video/prompt-quality.ts +635 -0
- package/src/video/prompt-rules.ts +209 -0
- package/src/video/provider-adapter-runner.ts +104 -0
- package/src/video/provider-platform/index.ts +5 -0
- package/src/video/provider-platform/registry.ts +286 -0
- package/src/video/provider-platform/route-capabilities.ts +327 -0
- package/src/video/provider-platform/router.ts +221 -0
- package/src/video/provider-platform/security.ts +29 -0
- package/src/video/provider-platform/telemetry.ts +116 -0
- package/src/video/provider-platform/types.ts +192 -0
- package/src/video/provider-status.ts +199 -0
- package/src/video/providers/dreamina-useapi.ts +345 -0
- package/src/video/providers/flowmusic-useapi.ts +252 -0
- package/src/video/providers/google-flow.ts +110 -0
- package/src/video/providers/public-host.ts +128 -0
- package/src/video/providers/runway-useapi.ts +377 -0
- package/src/video/providers/xskill.ts +304 -0
- package/src/video/readiness.ts +284 -0
- package/src/video/reference-sheet-store.ts +40 -0
- package/src/video/reference-sheets.ts +224 -0
- package/src/video/remix-narrated.ts +92 -0
- package/src/video/report-diff.ts +299 -0
- package/src/video/report-history.ts +122 -0
- package/src/video/report.ts +35 -0
- package/src/video/review-ui.ts +2495 -0
- package/src/video/scene-candidate-store.ts +152 -0
- package/src/video/scene-candidates.ts +195 -0
- package/src/video/scene-selection-store.ts +36 -0
- package/src/video/scene-selection.ts +306 -0
- package/src/video/scheduling.ts +18 -0
- package/src/video/scorecard.ts +90 -0
- package/src/video/seedance-asset-library.ts +259 -0
- package/src/video/seedance-blocks.ts +118 -0
- package/src/video/seedance-chain-host.ts +152 -0
- package/src/video/seedance-content-filter.ts +354 -0
- package/src/video/seedance-skill-loader.ts +83 -0
- package/src/video/sfx.ts +159 -0
- package/src/video/shot-grammar.ts +349 -0
- package/src/video/show-bible.ts +235 -0
- package/src/video/soundtrack.ts +257 -0
- package/src/video/stage-guards.ts +112 -0
- package/src/video/status.ts +342 -0
- package/src/video/story-bible.ts +302 -0
- package/src/video/storyboard-grid.ts +320 -0
- package/src/video/storyboard-markdown.ts +434 -0
- package/src/video/storyboard-still-candidates.ts +82 -0
- package/src/video/storyboard-templates.ts +249 -0
- package/src/video/studio/execute.ts +401 -0
- package/src/video/studio/planner.ts +114 -0
- package/src/video/studio/project-context.ts +25 -0
- package/src/video/studio/recipes.ts +346 -0
- package/src/video/studio/session.ts +24 -0
- package/src/video/studio/types.ts +76 -0
- package/src/video/template-store.ts +241 -0
- package/src/video/timeline.ts +32 -0
- package/src/video/title-overlay.ts +234 -0
- package/src/video/types.ts +465 -0
- package/src/video/veo-subprocess.ts +77 -0
- package/src/video/verify-env.ts +206 -0
- package/src/video/verify-final.ts +65 -0
- package/src/video/video-context.ts +92 -0
- package/src/video/vocal-map.ts +155 -0
- package/src/video/vocal-sync-plan.ts +224 -0
- package/src/video/voice-clone.ts +410 -0
- package/src/video/with-retry.ts +149 -0
- package/src/video/workload.ts +87 -0
- package/src/video/workspace.ts +255 -0
- package/tmp/review-station/index.html +4194 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,918 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stitch keystone for the assemble stage (sub-slice 3h).
|
|
3
|
+
*
|
|
4
|
+
* Source of truth (ported VERBATIM):
|
|
5
|
+
* - `skills/video-replicator/scripts/stitch_bunty.py` — the bunty stitch. Uses
|
|
6
|
+
* the concat **demuxer** path (`ffmpeg -y -f concat -safe 0 -i concat.txt
|
|
7
|
+
* -c copy output`) — a single ffmpeg invocation regardless of segment count,
|
|
8
|
+
* chosen deliberately so it survives the sandbox's per-session FFmpeg limit.
|
|
9
|
+
* - `skills/video-replicator/scripts/ffmpeg_wrapper.py:concat_via_filter` — the
|
|
10
|
+
* concat **filter** fallback (`-filter_complex
|
|
11
|
+
* "[0:v][0:a]...concat=n=N:v=1:a=1[outv][outa]"` + re-encode). Used for 8+
|
|
12
|
+
* segments where demuxer-accumulated AV drift across boundaries matters, OR
|
|
13
|
+
* when a segment has incompatible codec params and the demuxer rejects it.
|
|
14
|
+
* - `skills/video-replicator/scripts/assembly_utils.py:add_background_music` —
|
|
15
|
+
* the music-bed mix (loops the music under the narration at low volume with a
|
|
16
|
+
* tail fade-out, via amix).
|
|
17
|
+
*
|
|
18
|
+
* bunty (stitch_bunty.py) and nex (nex_assemble.py) collapse into ONE
|
|
19
|
+
* parameterized stitch driven by brand-profile-derived knobs:
|
|
20
|
+
* - bunty: pre-encoded segments → demuxer concat, no music, intro/outro by
|
|
21
|
+
* lip-sync scene segments. (`_concat_via_demuxer`, demuxer-first with a
|
|
22
|
+
* filter fallback.)
|
|
23
|
+
* - nex: normalized segments → filter concat (drift-free for 8+), optional
|
|
24
|
+
* background-music bed, optional title-card prepend. (`concat_via_filter`
|
|
25
|
+
* + `add_background_music`.)
|
|
26
|
+
* These differences become StitchInput fields: `concatStrategy`
|
|
27
|
+
* (demuxer | filter | auto), `intro` / `outro` segment paths, and the optional
|
|
28
|
+
* `music` block (track + volume + tail fade). The demuxer-vs-filter selection in
|
|
29
|
+
* `auto` mode flips at `FILTER_FALLBACK_SEGMENT_THRESHOLD` segments — the real
|
|
30
|
+
* sandbox-survival + drift lesson from the Python.
|
|
31
|
+
*
|
|
32
|
+
* AV-drift note (stitch_bunty.py ~L471-479): demuxer `-c copy` preserves exact
|
|
33
|
+
* packet timing and accumulates no re-encode drift, BUT it requires every
|
|
34
|
+
* segment to share encoding params. The per-segment AV-lock from 3e
|
|
35
|
+
* (1280×720@24, H.264 libx264 preset-fast crf20, AAC 44100 stereo) guarantees
|
|
36
|
+
* that, so the demuxer path is the primary one. Filter concat re-encodes (and so
|
|
37
|
+
* can introduce its own drift) but tolerates mismatched inputs — it is the
|
|
38
|
+
* fallback.
|
|
39
|
+
*
|
|
40
|
+
* IMPORTANT — testing boundary (SAME as 3e): the PURE arg-builders
|
|
41
|
+
* (`buildConcatDemuxerArgs`, `buildConcatFilterArgs`, `buildMusicMixArgs`) are
|
|
42
|
+
* the unit-tested surface (arg-shape only). `stitch` actually spawns ffmpeg and
|
|
43
|
+
* writes the concat list; verifying that the final MP4 looks/sounds right on
|
|
44
|
+
* real media is a HUMAN integration checkpoint, explicitly OUT OF SCOPE for the
|
|
45
|
+
* unit tests. Tests use the dry-run path and never run ffmpeg or require media.
|
|
46
|
+
*/
|
|
47
|
+
import { writeFile, mkdir, stat } from 'node:fs/promises';
|
|
48
|
+
import { dirname, resolve as resolvePath } from 'node:path';
|
|
49
|
+
import { runFfmpeg, ffprobeDuration, isValidMp4, trimTailArgs, letterboxFilter, type RunFfmpegOptions } from './ffmpeg.js';
|
|
50
|
+
import { VclawError } from '../errors.js';
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Segment-count threshold at which `auto` strategy switches from the
|
|
54
|
+
* concat demuxer to the concat filter. Mirrors the Python lesson that the
|
|
55
|
+
* demuxer accumulates audible AV drift across "8+ segments"
|
|
56
|
+
* (ffmpeg_wrapper.concat_via_filter docstring). At or above this many segments
|
|
57
|
+
* `auto` prefers the filter path.
|
|
58
|
+
*/
|
|
59
|
+
export const FILTER_FALLBACK_SEGMENT_THRESHOLD = 8;
|
|
60
|
+
|
|
61
|
+
/** Default background-music mix level (nex_assemble.py --music-volume default 0.05). */
|
|
62
|
+
export const DEFAULT_MUSIC_VOLUME = 0.05;
|
|
63
|
+
/** Default tail fade-out for the music bed in seconds (add_background_music default 3.0). */
|
|
64
|
+
export const DEFAULT_MUSIC_FADE_OUT_SEC = 3.0;
|
|
65
|
+
/** AAC bitrate for re-encode paths (filter concat + music mix). Matches the Python "192k". */
|
|
66
|
+
export const STANDARD_AUDIO_BITRATE = '192k';
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Named post-production color grades → FFmpeg video-filter chains (WS9+). Applied
|
|
70
|
+
* in the per-segment prep pass, so different segments can carry different grades —
|
|
71
|
+
* which is exactly the reference advert's narrative color language (cool-steel
|
|
72
|
+
* "normal ops" -> crimson "breach" -> electric-blue "resolution"). These are real
|
|
73
|
+
* post transforms on the rendered footage (colorbalance/eq), NOT prompt hints.
|
|
74
|
+
* `kodak-500t` approximates the Vision3 500T tungsten stock (cool shadows, warm
|
|
75
|
+
* highlights, mild desat). For a true film LUT, pass a `.cube` via `gradeLut`.
|
|
76
|
+
*/
|
|
77
|
+
const GRADE_FILTERS: Record<string, string> = {
|
|
78
|
+
'cool-steel': 'colorbalance=rs=-0.08:gs=-0.04:bs=0.12,eq=saturation=0.82:contrast=1.06',
|
|
79
|
+
'crimson-threat': 'colorbalance=rs=0.18:gs=-0.06:bs=-0.08,eq=saturation=1.05:contrast=1.12',
|
|
80
|
+
'electric-blue': 'colorbalance=rs=-0.06:gs=0.04:bs=0.18,eq=saturation=1.00:contrast=1.05',
|
|
81
|
+
'kodak-500t': 'colorbalance=bs=0.08:rh=0.05:bh=-0.05,eq=saturation=0.90:contrast=1.05',
|
|
82
|
+
'bleach-bypass': 'eq=saturation=0.50:contrast=1.32',
|
|
83
|
+
'desaturated': 'eq=saturation=0.70:contrast=1.08',
|
|
84
|
+
'teal-orange': 'colorbalance=rs=0.05:bs=0.10:rh=0.08:bh=-0.06,eq=saturation=1.08',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/** Stable list of the named grade ids (for CLI validation / docs). */
|
|
88
|
+
export const GRADE_FILTER_IDS = Object.keys(GRADE_FILTERS);
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Resolve a named grade id to its FFmpeg filter chain. Returns '' for an
|
|
92
|
+
* undefined/empty/unknown id (the prep pass then applies no grade) — callers that
|
|
93
|
+
* want a hard failure on an unknown id should validate against {@link GRADE_FILTER_IDS}.
|
|
94
|
+
*/
|
|
95
|
+
export function resolveGradeFilter(id: string | undefined): string {
|
|
96
|
+
if (!id) return '';
|
|
97
|
+
return GRADE_FILTERS[id] ?? '';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Which concat path to use. `auto` picks demuxer/filter by segment count. */
|
|
101
|
+
export type ConcatStrategy = 'demuxer' | 'filter' | 'auto';
|
|
102
|
+
|
|
103
|
+
export interface MusicMixSettings {
|
|
104
|
+
/** Path to the background-music track. Looped under the narration. */
|
|
105
|
+
trackPath: string;
|
|
106
|
+
/** Mix level for the music bed (0..1). Defaults to {@link DEFAULT_MUSIC_VOLUME}. */
|
|
107
|
+
volume?: number;
|
|
108
|
+
/** Tail fade-out duration in seconds. Defaults to {@link DEFAULT_MUSIC_FADE_OUT_SEC}. */
|
|
109
|
+
fadeOutSec?: number;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface StitchInput {
|
|
113
|
+
/**
|
|
114
|
+
* Ordered body segment paths (the slide segments). These sit between the
|
|
115
|
+
* optional intro and outro segments. From 3e every segment conforms to
|
|
116
|
+
* 1280×720@24 / H.264 / AAC 44100 stereo, so demuxer concat is valid.
|
|
117
|
+
*/
|
|
118
|
+
segments: string[];
|
|
119
|
+
/** Optional ordered intro segment paths, prepended before `segments`. */
|
|
120
|
+
intro?: string[];
|
|
121
|
+
/** Optional ordered outro segment paths, appended after `segments`. */
|
|
122
|
+
outro?: string[];
|
|
123
|
+
/** Where the final stitched MP4 is written. */
|
|
124
|
+
outputPath: string;
|
|
125
|
+
/**
|
|
126
|
+
* Path for the concat-demuxer list file. Defaults to `concat.txt` alongside
|
|
127
|
+
* the output. Only used by the demuxer path.
|
|
128
|
+
*/
|
|
129
|
+
concatListPath?: string;
|
|
130
|
+
/**
|
|
131
|
+
* Concat strategy. `auto` (default) uses the demuxer up to
|
|
132
|
+
* {@link FILTER_FALLBACK_SEGMENT_THRESHOLD} segments, then the filter.
|
|
133
|
+
* bunty maps to `auto`/`demuxer`; nex maps to `filter`.
|
|
134
|
+
*/
|
|
135
|
+
concatStrategy?: ConcatStrategy;
|
|
136
|
+
/** Optional background-music bed (the nex-brand knob). Omit for bunty. */
|
|
137
|
+
music?: MusicMixSettings;
|
|
138
|
+
/**
|
|
139
|
+
* Optional EXTRA global audio layers (dialogue / sfx / additional voice)
|
|
140
|
+
* mixed over the concatenated video at the stitch step, BEYOND the `music`
|
|
141
|
+
* bed above. Presence-driven and additive: when this is empty/undefined the
|
|
142
|
+
* stitch is byte-identical to legacy (the music-only {@link buildMusicMixArgs}
|
|
143
|
+
* path, or the no-audio path). When non-empty, the music bed (if any) is
|
|
144
|
+
* prepended as a `music` layer and the whole set is mixed via
|
|
145
|
+
* {@link buildMultiLayerMixArgs}. See assemble.ts Step 6 (dialogue/sfx wiring).
|
|
146
|
+
*/
|
|
147
|
+
audioLayers?: AudioLayer[];
|
|
148
|
+
/**
|
|
149
|
+
* Optional per-clip tail cut (WS9). When set, each ordered segment is
|
|
150
|
+
* re-encoded with `-t <clipMaxSeconds>` before concat, dropping the dead /
|
|
151
|
+
* freeze frames AI generators append. Omit for byte-identical legacy behavior.
|
|
152
|
+
*/
|
|
153
|
+
clipMaxSeconds?: number;
|
|
154
|
+
/**
|
|
155
|
+
* Optional letterbox normalization (WS9). When set (e.g. `2.39:1`), each
|
|
156
|
+
* segment is scaled+padded onto the {@link letterboxCanvas} (default
|
|
157
|
+
* 1280×720) before concat, producing cinematic bars. Omit to disable.
|
|
158
|
+
*/
|
|
159
|
+
letterboxRatio?: string;
|
|
160
|
+
/**
|
|
161
|
+
* Canvas for {@link letterboxRatio}. Defaults to the 3e segment standard
|
|
162
|
+
* (1280×720) so normalized segments stay uniform for demuxer concat.
|
|
163
|
+
*/
|
|
164
|
+
letterboxCanvas?: { width: number; height: number };
|
|
165
|
+
/**
|
|
166
|
+
* Path to a `.cube`/`.3dl` LUT applied to every segment via `lut3d` (e.g. a
|
|
167
|
+
* Kodak Vision3 500T film-stock LUT). Omit to skip. Triggers the prep pass.
|
|
168
|
+
*/
|
|
169
|
+
gradeLut?: string;
|
|
170
|
+
/**
|
|
171
|
+
* Named color grade applied to every segment (see {@link GRADE_FILTER_IDS}).
|
|
172
|
+
* A real post transform on the footage, not a prompt hint. Omit to skip.
|
|
173
|
+
*/
|
|
174
|
+
gradeId?: string;
|
|
175
|
+
/**
|
|
176
|
+
* Per-segment grade overrides, indexed to {@link orderedSegments} (intro +
|
|
177
|
+
* body + outro). A defined entry overrides {@link gradeId} for that segment —
|
|
178
|
+
* this is how the narrative color language is realized (e.g. cool-steel for the
|
|
179
|
+
* calm scenes, crimson-threat for the breach, electric-blue for the resolution).
|
|
180
|
+
*/
|
|
181
|
+
segmentGradeIds?: Array<string | undefined>;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export interface StitchPlannedStep {
|
|
185
|
+
/** What this step does. */
|
|
186
|
+
kind: 'segment-prep' | 'concat-demuxer' | 'concat-filter' | 'music-mix' | 'multi-layer-mix';
|
|
187
|
+
/** The ffmpeg args (everything after the binary and the auto-prepended `-y`). */
|
|
188
|
+
args: string[];
|
|
189
|
+
/** The output this step writes. */
|
|
190
|
+
outputPath: string;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export interface StitchResult {
|
|
194
|
+
status: 'complete' | 'dry-run';
|
|
195
|
+
/** Final MP4 path. */
|
|
196
|
+
outputPath: string;
|
|
197
|
+
/** Ordered list of every segment that went into the concat. */
|
|
198
|
+
orderedSegments: string[];
|
|
199
|
+
/** Which concat path was actually used. */
|
|
200
|
+
concatStrategy: 'demuxer' | 'filter';
|
|
201
|
+
/** Whether a music bed was mixed. */
|
|
202
|
+
music: boolean;
|
|
203
|
+
/** The planned ffmpeg command sequence (always populated, incl. dry-run). */
|
|
204
|
+
plan: StitchPlannedStep[];
|
|
205
|
+
/** Final video duration in milliseconds (0 on dry-run — no probe). */
|
|
206
|
+
durationMs: number;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Assemble the full ordered segment list: intro + body + outro. */
|
|
210
|
+
export function orderedSegments(input: StitchInput): string[] {
|
|
211
|
+
return [...(input.intro ?? []), ...input.segments, ...(input.outro ?? [])];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Choose the effective concat path. `demuxer`/`filter` are honored directly;
|
|
216
|
+
* `auto` flips to the filter at {@link FILTER_FALLBACK_SEGMENT_THRESHOLD}
|
|
217
|
+
* segments (the drift lesson from the Python).
|
|
218
|
+
*/
|
|
219
|
+
export function selectConcatStrategy(
|
|
220
|
+
strategy: ConcatStrategy,
|
|
221
|
+
segmentCount: number,
|
|
222
|
+
): 'demuxer' | 'filter' {
|
|
223
|
+
if (strategy === 'demuxer' || strategy === 'filter') return strategy;
|
|
224
|
+
return segmentCount >= FILTER_FALLBACK_SEGMENT_THRESHOLD ? 'filter' : 'demuxer';
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Render the concat-demuxer list file body: one `file '<abspath>'` line per segment. */
|
|
228
|
+
export function buildConcatListContent(segments: string[]): string {
|
|
229
|
+
// Mirrors stitch_bunty._concat_via_demuxer: file '<os.path.abspath(seg)>'.
|
|
230
|
+
// DEVIATION from the Python (which had this bug): single quotes in the path
|
|
231
|
+
// are escaped ('\'') — an apostrophe anywhere in a parent directory name
|
|
232
|
+
// would otherwise corrupt the concat list for every segment.
|
|
233
|
+
return segments.map((seg) => `file '${resolvePath(seg).replace(/'/g, `'\\''`)}'\n`).join('');
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Build the concat-DEMUXER ffmpeg args (PURE). The primary path.
|
|
238
|
+
*
|
|
239
|
+
* Ported VERBATIM from stitch_bunty._concat_via_demuxer (L240):
|
|
240
|
+
* ffmpeg -y -f concat -safe 0 -i concat.txt -c copy output
|
|
241
|
+
* (`-y` is prepended by `runFfmpeg`, so it is NOT included here.)
|
|
242
|
+
*
|
|
243
|
+
* A single ffmpeg invocation regardless of segment count — survives the
|
|
244
|
+
* sandbox's per-session FFmpeg limit. Requires all segments to share encoding
|
|
245
|
+
* params (true for 3e segments).
|
|
246
|
+
*/
|
|
247
|
+
export function buildConcatDemuxerArgs(
|
|
248
|
+
_segments: string[],
|
|
249
|
+
concatListPath: string,
|
|
250
|
+
outputPath: string,
|
|
251
|
+
): string[] {
|
|
252
|
+
return ['-f', 'concat', '-safe', '0', '-i', concatListPath, '-c', 'copy', outputPath];
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export interface BuildConcatFilterOptions {
|
|
256
|
+
/** H.264 CRF (Python default 20). */
|
|
257
|
+
crf?: number;
|
|
258
|
+
/** AAC bitrate (Python default "192k"). */
|
|
259
|
+
audioBitrate?: string;
|
|
260
|
+
/** Audio sample rate Hz (Python default 44100). */
|
|
261
|
+
sampleRate?: number;
|
|
262
|
+
/** Audio channel count (Python default 2). */
|
|
263
|
+
channels?: number;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Build the concat-FILTER fallback ffmpeg args (PURE). For 8+ segments where
|
|
268
|
+
* demuxer drift accumulates, or when a segment has incompatible codec params.
|
|
269
|
+
*
|
|
270
|
+
* Ported VERBATIM from ffmpeg_wrapper.concat_via_filter (L296-326):
|
|
271
|
+
* -i f0 -i f1 ... -i f{n-1}
|
|
272
|
+
* -filter_complex "[0:v][0:a][1:v][1:a]...concat=n=N:v=1:a=1[outv][outa]"
|
|
273
|
+
* -map [outv] -map [outa]
|
|
274
|
+
* -c:v libx264 -preset fast -crf 20
|
|
275
|
+
* -c:a aac -b:a 192k -ar 44100 -ac 2
|
|
276
|
+
* -movflags +faststart output
|
|
277
|
+
*/
|
|
278
|
+
export function buildConcatFilterArgs(
|
|
279
|
+
segments: string[],
|
|
280
|
+
outputPath: string,
|
|
281
|
+
opts: BuildConcatFilterOptions = {},
|
|
282
|
+
): string[] {
|
|
283
|
+
const crf = opts.crf ?? 20;
|
|
284
|
+
const audioBitrate = opts.audioBitrate ?? STANDARD_AUDIO_BITRATE;
|
|
285
|
+
const sampleRate = opts.sampleRate ?? 44100;
|
|
286
|
+
const channels = opts.channels ?? 2;
|
|
287
|
+
|
|
288
|
+
const inputArgs: string[] = [];
|
|
289
|
+
for (const seg of segments) {
|
|
290
|
+
inputArgs.push('-i', seg);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// [0:v][0:a][1:v][1:a]...[n-1:v][n-1:a]concat=n=N:v=1:a=1[outv][outa]
|
|
294
|
+
let filterInputs = '';
|
|
295
|
+
for (let i = 0; i < segments.length; i += 1) {
|
|
296
|
+
filterInputs += `[${i}:v][${i}:a]`;
|
|
297
|
+
}
|
|
298
|
+
const filterComplex = `${filterInputs}concat=n=${segments.length}:v=1:a=1[outv][outa]`;
|
|
299
|
+
|
|
300
|
+
return [
|
|
301
|
+
...inputArgs,
|
|
302
|
+
'-filter_complex',
|
|
303
|
+
filterComplex,
|
|
304
|
+
'-map',
|
|
305
|
+
'[outv]',
|
|
306
|
+
'-map',
|
|
307
|
+
'[outa]',
|
|
308
|
+
'-c:v',
|
|
309
|
+
'libx264',
|
|
310
|
+
'-preset',
|
|
311
|
+
'fast',
|
|
312
|
+
'-crf',
|
|
313
|
+
String(crf),
|
|
314
|
+
'-c:a',
|
|
315
|
+
'aac',
|
|
316
|
+
'-b:a',
|
|
317
|
+
audioBitrate,
|
|
318
|
+
'-ar',
|
|
319
|
+
String(sampleRate),
|
|
320
|
+
'-ac',
|
|
321
|
+
String(channels),
|
|
322
|
+
'-movflags',
|
|
323
|
+
'+faststart',
|
|
324
|
+
outputPath,
|
|
325
|
+
];
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
export interface BuildSegmentPrepOptions {
|
|
329
|
+
/** Per-clip tail cut in seconds (WS9 trimTailArgs). Omit/<=0 disables the trim. */
|
|
330
|
+
clipMaxSeconds?: number;
|
|
331
|
+
/** Letterbox target ratio label (WS9 letterboxFilter). Omit/'' disables the filter. */
|
|
332
|
+
letterboxRatio?: string;
|
|
333
|
+
/** Path to a `.cube`/`.3dl` LUT applied via `lut3d` (e.g. a Kodak Vision3 500T LUT). Omit to skip. */
|
|
334
|
+
gradeLut?: string;
|
|
335
|
+
/** Resolved FFmpeg grade filter chain (from {@link resolveGradeFilter}). Omit/'' to skip. */
|
|
336
|
+
gradeFilter?: string;
|
|
337
|
+
/** Letterbox canvas width. Default 1280 (3e segment standard). */
|
|
338
|
+
width?: number;
|
|
339
|
+
/** Letterbox canvas height. Default 720. */
|
|
340
|
+
height?: number;
|
|
341
|
+
/** Output frame rate. Default 24. */
|
|
342
|
+
fps?: number;
|
|
343
|
+
/** H.264 CRF. Default 20. */
|
|
344
|
+
crf?: number;
|
|
345
|
+
/** AAC bitrate. Default {@link STANDARD_AUDIO_BITRATE}. */
|
|
346
|
+
audioBitrate?: string;
|
|
347
|
+
/** Audio sample rate Hz. Default 44100. */
|
|
348
|
+
sampleRate?: number;
|
|
349
|
+
/** Audio channels. Default 2. */
|
|
350
|
+
channels?: number;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Build the per-segment normalization ffmpeg args (PURE, WS9). Re-encodes one
|
|
355
|
+
* clip to the 3e segment standard (1280×720@24 / libx264 preset-fast crf20 / AAC
|
|
356
|
+
* 44100 stereo) while optionally trimming its tail ({@link trimTailArgs}) and
|
|
357
|
+
* letterboxing it onto a canvas ({@link letterboxFilter}). Re-encoding to the
|
|
358
|
+
* standard keeps the normalized segments uniform, so the demuxer `-c copy` concat
|
|
359
|
+
* stays valid. `-t` is placed just before the output path so it caps the OUTPUT.
|
|
360
|
+
*/
|
|
361
|
+
export function buildSegmentPrepArgs(
|
|
362
|
+
segment: string,
|
|
363
|
+
outputPath: string,
|
|
364
|
+
opts: BuildSegmentPrepOptions = {},
|
|
365
|
+
): string[] {
|
|
366
|
+
const width = opts.width ?? 1280;
|
|
367
|
+
const height = opts.height ?? 720;
|
|
368
|
+
// Compose the vf chain in deterministic order: letterbox (geometry) → LUT
|
|
369
|
+
// (film-stock emulation) → named grade (state color). Each is optional; empties
|
|
370
|
+
// are dropped, so default behavior is no `-vf` at all.
|
|
371
|
+
const vf = [
|
|
372
|
+
letterboxFilter(opts.letterboxRatio, width, height),
|
|
373
|
+
opts.gradeLut ? `lut3d=${opts.gradeLut}` : '',
|
|
374
|
+
opts.gradeFilter ?? '',
|
|
375
|
+
]
|
|
376
|
+
.filter((f) => f !== '')
|
|
377
|
+
.join(',');
|
|
378
|
+
const args: string[] = ['-i', segment];
|
|
379
|
+
if (vf) args.push('-vf', vf);
|
|
380
|
+
args.push(
|
|
381
|
+
'-r', String(opts.fps ?? 24),
|
|
382
|
+
'-c:v', 'libx264', '-preset', 'fast', '-crf', String(opts.crf ?? 20),
|
|
383
|
+
'-c:a', 'aac', '-b:a', opts.audioBitrate ?? STANDARD_AUDIO_BITRATE,
|
|
384
|
+
'-ar', String(opts.sampleRate ?? 44100), '-ac', String(opts.channels ?? 2),
|
|
385
|
+
'-movflags', '+faststart',
|
|
386
|
+
);
|
|
387
|
+
// -t (when set) just before the output path → caps the output duration.
|
|
388
|
+
args.push(...trimTailArgs(opts.clipMaxSeconds), outputPath);
|
|
389
|
+
return args;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
export interface BuildMusicMixOptions {
|
|
393
|
+
/** Mix level for the music bed (0..1). Default {@link DEFAULT_MUSIC_VOLUME}. */
|
|
394
|
+
volume?: number;
|
|
395
|
+
/** Tail fade-out seconds. Default {@link DEFAULT_MUSIC_FADE_OUT_SEC}. */
|
|
396
|
+
fadeOutSec?: number;
|
|
397
|
+
/**
|
|
398
|
+
* Total video duration in seconds — used to compute the fade-out start
|
|
399
|
+
* (`total - fadeOut`) and the `-t` cap. The caller probes this via
|
|
400
|
+
* `ffprobeDuration`. Defaults to 0 (fade starts at 0 / `-t 0`), only used by
|
|
401
|
+
* the dry-run / pure-builder path where the duration is not yet known.
|
|
402
|
+
*/
|
|
403
|
+
totalDurationSec?: number;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/** Format a number the way the Python f-strings do (`:.2f` / `:.3f`). */
|
|
407
|
+
function fixed(value: number, digits: number): string {
|
|
408
|
+
return value.toFixed(digits);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Build the background-music mix ffmpeg args (PURE). Loops the music under the
|
|
413
|
+
* narration at a low volume with a tail fade-out, then mixes via amix.
|
|
414
|
+
*
|
|
415
|
+
* Ported VERBATIM from assembly_utils.add_background_music (L408-435):
|
|
416
|
+
* -i video -stream_loop -1 -i music
|
|
417
|
+
* -filter_complex "[0:a]volume=1.0[v];
|
|
418
|
+
* [1:a]volume={vol},afade=t=out:st={fade_start}:d={fade_out}[m];
|
|
419
|
+
* [v][m]amix=inputs=2:duration=first:dropout_transition=600:normalize=0[a]"
|
|
420
|
+
* -map 0:v -map [a]
|
|
421
|
+
* -c:v copy -c:a aac -b:a 192k
|
|
422
|
+
* -movflags +faststart
|
|
423
|
+
* -t {total} output
|
|
424
|
+
*
|
|
425
|
+
* fade_start = max(0, total - fade_out). `dropout_transition=600` prevents early
|
|
426
|
+
* audio cutoff on silent sections; `normalize=0` keeps the narration at full
|
|
427
|
+
* level while the music stays at `volume`.
|
|
428
|
+
*/
|
|
429
|
+
export function buildMusicMixArgs(
|
|
430
|
+
videoPath: string,
|
|
431
|
+
musicPath: string,
|
|
432
|
+
outputPath: string,
|
|
433
|
+
opts: BuildMusicMixOptions = {},
|
|
434
|
+
): string[] {
|
|
435
|
+
const volume = opts.volume ?? DEFAULT_MUSIC_VOLUME;
|
|
436
|
+
const fadeOut = opts.fadeOutSec ?? DEFAULT_MUSIC_FADE_OUT_SEC;
|
|
437
|
+
const totalDur = opts.totalDurationSec ?? 0;
|
|
438
|
+
const fadeStart = Math.max(0, totalDur - fadeOut);
|
|
439
|
+
|
|
440
|
+
const filterComplex =
|
|
441
|
+
`[0:a]volume=1.0[v];` +
|
|
442
|
+
`[1:a]volume=${volume},afade=t=out:st=${fixed(fadeStart, 2)}:d=${fadeOut}[m];` +
|
|
443
|
+
`[v][m]amix=inputs=2:duration=first:dropout_transition=600:normalize=0[a]`;
|
|
444
|
+
|
|
445
|
+
return [
|
|
446
|
+
'-i',
|
|
447
|
+
videoPath,
|
|
448
|
+
'-stream_loop',
|
|
449
|
+
'-1',
|
|
450
|
+
'-i',
|
|
451
|
+
musicPath,
|
|
452
|
+
'-filter_complex',
|
|
453
|
+
filterComplex,
|
|
454
|
+
'-map',
|
|
455
|
+
'0:v',
|
|
456
|
+
'-map',
|
|
457
|
+
'[a]',
|
|
458
|
+
'-c:v',
|
|
459
|
+
'copy',
|
|
460
|
+
'-c:a',
|
|
461
|
+
'aac',
|
|
462
|
+
'-b:a',
|
|
463
|
+
STANDARD_AUDIO_BITRATE,
|
|
464
|
+
'-movflags',
|
|
465
|
+
'+faststart',
|
|
466
|
+
'-t',
|
|
467
|
+
fixed(totalDur, 3),
|
|
468
|
+
outputPath,
|
|
469
|
+
];
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// ---------------------------------------------------------------------------
|
|
473
|
+
// Multi-layer audio mix
|
|
474
|
+
// ---------------------------------------------------------------------------
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* A single audio layer to mix under or alongside the video's native audio.
|
|
478
|
+
*/
|
|
479
|
+
export interface AudioLayer {
|
|
480
|
+
/** Path to the audio track file. */
|
|
481
|
+
trackPath: string;
|
|
482
|
+
/**
|
|
483
|
+
* Semantic role of this layer.
|
|
484
|
+
* - `'music'` — background music bed (low volume, looped).
|
|
485
|
+
* - `'narration'` — voice-over narration track (full volume, no loop).
|
|
486
|
+
* - `'dialogue'` — on-screen dialogue (full volume, no loop).
|
|
487
|
+
* - `'sfx'` — sound-effect track (mixed alongside, NOT a ducking
|
|
488
|
+
* sidechain signal; does not by itself enable ducking).
|
|
489
|
+
*/
|
|
490
|
+
role: 'music' | 'narration' | 'dialogue' | 'sfx';
|
|
491
|
+
/** Mix level (0..1). Defaults: music → {@link DEFAULT_MUSIC_VOLUME}, voice → 1.0. */
|
|
492
|
+
volume?: number;
|
|
493
|
+
/**
|
|
494
|
+
* Whether to loop this track to fill the video duration.
|
|
495
|
+
* Default: `true` for `music` layers, `false` for `narration`/`dialogue`.
|
|
496
|
+
*/
|
|
497
|
+
loop?: boolean;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
export interface BuildMultiLayerMixOptions {
|
|
501
|
+
/**
|
|
502
|
+
* When `true` AND at least one `narration`/`dialogue` layer is present,
|
|
503
|
+
* music layers are sidechained under the voice via `sidechaincompress`
|
|
504
|
+
* (threshold −12 dB / 0.25 linear, ratio 4:1, attack 5 ms, release 200 ms)
|
|
505
|
+
* so the music ducks automatically whenever voice is active.
|
|
506
|
+
* Falls back to static-volume amix when there are no voice layers.
|
|
507
|
+
* Default: `false`.
|
|
508
|
+
*/
|
|
509
|
+
duckMusicUnderVoice?: boolean;
|
|
510
|
+
/**
|
|
511
|
+
* Global music-bed volume applied to every `music` layer that does not
|
|
512
|
+
* set its own `volume`. Individual `layer.volume` takes precedence.
|
|
513
|
+
* Default: {@link DEFAULT_MUSIC_VOLUME} (0.05).
|
|
514
|
+
*/
|
|
515
|
+
musicVolume?: number;
|
|
516
|
+
/** Reserved for callers that need to override the ffmpeg binary path. */
|
|
517
|
+
ffmpegBin?: string;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Build ffmpeg args that mix the video's own audio together with N additional
|
|
522
|
+
* audio layers. **PURE** — returns only the arg-string array; never spawns
|
|
523
|
+
* processes, reads files, or has side-effects.
|
|
524
|
+
*
|
|
525
|
+
* ## Input numbering
|
|
526
|
+
* - Input 0 : the video file (carries video + its original audio).
|
|
527
|
+
* - Inputs 1…N : the supplied `layers`, in order.
|
|
528
|
+
*
|
|
529
|
+
* ## Filter graph — static-volume path (default)
|
|
530
|
+
* ```
|
|
531
|
+
* [1:a]volume=<v1>[l1]; [2:a]volume=<v2>[l2]; …
|
|
532
|
+
* [0:a][l1][l2]…amix=inputs=N+1:duration=first:dropout_transition=600:normalize=0[a]
|
|
533
|
+
* ```
|
|
534
|
+
*
|
|
535
|
+
* ## Filter graph — ducking path (`duckMusicUnderVoice=true` + voice layer present)
|
|
536
|
+
* ```
|
|
537
|
+
* per-layer volume chains as above …
|
|
538
|
+
* [voice_labels…]amix=…[voice] (or direct passthrough for single voice)
|
|
539
|
+
* [voice]asplit=M+1[vs0]…[vsM-1][vsfinal]
|
|
540
|
+
* [l_music0][vs0]sidechaincompress=…[duck0]; [l_music1][vs1]sidechaincompress=…[duck1]; …
|
|
541
|
+
* [0:a][duck0][duck1]…[vsfinal][sfx…]amix=inputs=M+2+S:…[a]
|
|
542
|
+
* ```
|
|
543
|
+
* where M = number of music layers and S = number of sfx layers.
|
|
544
|
+
* SFX layers are mixed in at their own volume but are NEVER used as a
|
|
545
|
+
* sidechain signal and do NOT by themselves enable ducking (only
|
|
546
|
+
* `narration`/`dialogue` layers count as voice for the `duckMusicUnderVoice`
|
|
547
|
+
* gate).
|
|
548
|
+
*
|
|
549
|
+
* ## Output mapping
|
|
550
|
+
* `-map 0:v -map [a] -c:v copy -c:a aac -b:a 192k -movflags +faststart <output>`
|
|
551
|
+
*/
|
|
552
|
+
export function buildMultiLayerMixArgs(
|
|
553
|
+
videoPath: string,
|
|
554
|
+
layers: AudioLayer[],
|
|
555
|
+
outputPath: string,
|
|
556
|
+
opts: BuildMultiLayerMixOptions = {},
|
|
557
|
+
): string[] {
|
|
558
|
+
if (layers.length === 0) {
|
|
559
|
+
throw new Error('buildMultiLayerMixArgs: at least one layer is required');
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
const doDuck = opts.duckMusicUnderVoice ?? false;
|
|
563
|
+
const globalMusicVol = opts.musicVolume ?? DEFAULT_MUSIC_VOLUME;
|
|
564
|
+
|
|
565
|
+
// ── Input args ────────────────────────────────────────────────────────────
|
|
566
|
+
// Video is always input 0. Each layer follows; music layers get -stream_loop.
|
|
567
|
+
const inputArgs: string[] = ['-i', videoPath];
|
|
568
|
+
for (const layer of layers) {
|
|
569
|
+
const shouldLoop = layer.loop ?? layer.role === 'music';
|
|
570
|
+
if (shouldLoop) inputArgs.push('-stream_loop', '-1');
|
|
571
|
+
inputArgs.push('-i', layer.trackPath);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// ── Per-layer volume chains ───────────────────────────────────────────────
|
|
575
|
+
// Build these first (index-stable); categorise into music vs voice labels.
|
|
576
|
+
const filterParts: string[] = [];
|
|
577
|
+
const allLayerLabels: string[] = []; // [l1], [l2], … (in layer order)
|
|
578
|
+
const musicLayerLabels: string[] = []; // subset with role === 'music'
|
|
579
|
+
const voiceLayerLabels: string[] = []; // subset with role narration|dialogue
|
|
580
|
+
const sfxLayerLabels: string[] = []; // subset with role === 'sfx' (mixed, never a sidechain)
|
|
581
|
+
|
|
582
|
+
for (let i = 0; i < layers.length; i += 1) {
|
|
583
|
+
const layer = layers[i];
|
|
584
|
+
const inputIdx = i + 1; // 0 is video
|
|
585
|
+
const label = `[l${inputIdx}]`;
|
|
586
|
+
allLayerLabels.push(label);
|
|
587
|
+
|
|
588
|
+
const vol =
|
|
589
|
+
layer.volume !== undefined
|
|
590
|
+
? layer.volume
|
|
591
|
+
: layer.role === 'music'
|
|
592
|
+
? globalMusicVol
|
|
593
|
+
: 1.0;
|
|
594
|
+
|
|
595
|
+
filterParts.push(`[${inputIdx}:a]volume=${vol}${label}`);
|
|
596
|
+
|
|
597
|
+
if (layer.role === 'music') {
|
|
598
|
+
musicLayerLabels.push(label);
|
|
599
|
+
} else if (layer.role === 'sfx') {
|
|
600
|
+
// SFX is mixed alongside everything else but must never serve as a
|
|
601
|
+
// sidechain signal and must not by itself enable music ducking.
|
|
602
|
+
sfxLayerLabels.push(label);
|
|
603
|
+
} else {
|
|
604
|
+
// narration | dialogue → genuine voice signal that drives ducking.
|
|
605
|
+
voiceLayerLabels.push(label);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
const hasVoice = voiceLayerLabels.length > 0;
|
|
610
|
+
const hasMusic = musicLayerLabels.length > 0;
|
|
611
|
+
|
|
612
|
+
if (doDuck && hasVoice && hasMusic) {
|
|
613
|
+
// ── Sidechain-ducking path ──────────────────────────────────────────────
|
|
614
|
+
//
|
|
615
|
+
// Step 1: Merge all voice labels into a single [voice] stream.
|
|
616
|
+
// - One voice label → simple volume=1.0 passthrough (rename).
|
|
617
|
+
// - Multiple labels → amix down to mono [voice].
|
|
618
|
+
const voiceLabel = '[voice]';
|
|
619
|
+
if (voiceLayerLabels.length === 1) {
|
|
620
|
+
filterParts.push(`${voiceLayerLabels[0]}volume=1.0${voiceLabel}`);
|
|
621
|
+
} else {
|
|
622
|
+
const joined = voiceLayerLabels.join('');
|
|
623
|
+
filterParts.push(
|
|
624
|
+
`${joined}amix=inputs=${voiceLayerLabels.length}:duration=first:dropout_transition=600:normalize=0${voiceLabel}`,
|
|
625
|
+
);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// Step 2: asplit [voice] into M+1 copies:
|
|
629
|
+
// [vs0]…[vsM-1] → one per music layer (sidechain signal)
|
|
630
|
+
// [vsfinal] → passed into the final amix so voice stays audible
|
|
631
|
+
const numMusicLayers = musicLayerLabels.length;
|
|
632
|
+
const totalSplits = numMusicLayers + 1;
|
|
633
|
+
const splitOutputLabels = Array.from(
|
|
634
|
+
{ length: totalSplits },
|
|
635
|
+
(_, k) => (k < numMusicLayers ? `[vs${k}]` : '[vsfinal]'),
|
|
636
|
+
);
|
|
637
|
+
filterParts.push(`${voiceLabel}asplit=${totalSplits}${splitOutputLabels.join('')}`);
|
|
638
|
+
|
|
639
|
+
// Step 3: Sidechain-compress each music layer against its voice copy.
|
|
640
|
+
// sidechaincompress: [main][sidechain] → [duckN]
|
|
641
|
+
const duckLabels: string[] = [];
|
|
642
|
+
for (let mi = 0; mi < numMusicLayers; mi += 1) {
|
|
643
|
+
const duckLabel = `[duck${mi}]`;
|
|
644
|
+
filterParts.push(
|
|
645
|
+
`${musicLayerLabels[mi]}[vs${mi}]sidechaincompress=threshold=0.25:ratio=4:attack=5:release=200${duckLabel}`,
|
|
646
|
+
);
|
|
647
|
+
duckLabels.push(duckLabel);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
// Step 4: Final amix — video audio + all ducked music + the final voice
|
|
651
|
+
// copy + any sfx layers (mixed at full/own volume, NOT ducked).
|
|
652
|
+
// inputs = 1 (video) + M (ducked music) + 1 (vsfinal) + S (sfx)
|
|
653
|
+
const finalMixInputs = ['[0:a]', ...duckLabels, '[vsfinal]', ...sfxLayerLabels].join('');
|
|
654
|
+
const finalMixCount = 1 + duckLabels.length + 1 + sfxLayerLabels.length;
|
|
655
|
+
filterParts.push(
|
|
656
|
+
`${finalMixInputs}amix=inputs=${finalMixCount}:duration=first:dropout_transition=600:normalize=0[a]`,
|
|
657
|
+
);
|
|
658
|
+
} else {
|
|
659
|
+
// ── Static-volume amix path (default / legacy-compatible) ───────────────
|
|
660
|
+
// Mix: [0:a] + [l1] + [l2] + … → amix → [a]
|
|
661
|
+
const allInputs = ['[0:a]', ...allLayerLabels].join('');
|
|
662
|
+
const totalInputs = 1 + allLayerLabels.length;
|
|
663
|
+
filterParts.push(
|
|
664
|
+
`${allInputs}amix=inputs=${totalInputs}:duration=first:dropout_transition=600:normalize=0[a]`,
|
|
665
|
+
);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// ── Output args ───────────────────────────────────────────────────────────
|
|
669
|
+
return [
|
|
670
|
+
...inputArgs,
|
|
671
|
+
'-filter_complex',
|
|
672
|
+
filterParts.join(';'),
|
|
673
|
+
'-map',
|
|
674
|
+
'0:v',
|
|
675
|
+
'-map',
|
|
676
|
+
'[a]',
|
|
677
|
+
'-c:v',
|
|
678
|
+
'copy',
|
|
679
|
+
'-c:a',
|
|
680
|
+
'aac',
|
|
681
|
+
'-b:a',
|
|
682
|
+
STANDARD_AUDIO_BITRATE,
|
|
683
|
+
'-movflags',
|
|
684
|
+
'+faststart',
|
|
685
|
+
outputPath,
|
|
686
|
+
];
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* Compose the full ordered layer list for the multi-layer mix step: the
|
|
691
|
+
* `music` bed (if present) first as a looped `music` layer, then the extra
|
|
692
|
+
* `audioLayers` (dialogue/sfx/voice) in order. Pure. Only called when
|
|
693
|
+
* `input.audioLayers` is non-empty, so the result always has ≥1 layer.
|
|
694
|
+
*/
|
|
695
|
+
function combinedAudioLayers(input: StitchInput): AudioLayer[] {
|
|
696
|
+
const musicLayer: AudioLayer[] = input.music
|
|
697
|
+
? [
|
|
698
|
+
{
|
|
699
|
+
trackPath: input.music.trackPath,
|
|
700
|
+
role: 'music',
|
|
701
|
+
loop: true,
|
|
702
|
+
...(input.music.volume !== undefined ? { volume: input.music.volume } : {}),
|
|
703
|
+
},
|
|
704
|
+
]
|
|
705
|
+
: [];
|
|
706
|
+
return [...musicLayer, ...(input.audioLayers ?? [])];
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
export interface StitchOptions extends RunFfmpegOptions {
|
|
710
|
+
/** Override the ffprobe binary (forwarded to `ffprobeDuration`). */
|
|
711
|
+
ffprobeBin?: string;
|
|
712
|
+
/**
|
|
713
|
+
* Skip the pre-concat MP4-validity guard. Default OFF (validation ON) for
|
|
714
|
+
* real runs. The guard probes each input segment with {@link isValidMp4} and
|
|
715
|
+
* fails fast on a truncated/no-moov MP4 instead of letting ffmpeg concat die
|
|
716
|
+
* with a cryptic "Invalid data found when processing input". Always skipped on
|
|
717
|
+
* dry-run (no real files to probe).
|
|
718
|
+
*/
|
|
719
|
+
skipSegmentValidation?: boolean;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* Orchestrate the stitch: write the concat list (demuxer path), pick the
|
|
724
|
+
* demuxer-vs-filter path, run via `runFfmpeg`, optionally mix a music bed, and
|
|
725
|
+
* return the final MP4 path + a plan of the executed command sequence.
|
|
726
|
+
*
|
|
727
|
+
* On `dryRun`, returns the planned command sequence WITHOUT writing the concat
|
|
728
|
+
* list, spawning ffmpeg, or probing durations (music fade-start is computed
|
|
729
|
+
* from 0). This is the path unit tests use.
|
|
730
|
+
*
|
|
731
|
+
* NOTE: the real-spawn path. The final-MP4 quality check is a HUMAN integration
|
|
732
|
+
* checkpoint — out of scope here.
|
|
733
|
+
*/
|
|
734
|
+
export async function stitch(
|
|
735
|
+
input: StitchInput,
|
|
736
|
+
opts: StitchOptions = {},
|
|
737
|
+
): Promise<StitchResult> {
|
|
738
|
+
const segs = orderedSegments(input);
|
|
739
|
+
if (segs.length === 0) {
|
|
740
|
+
// Defensive: nothing to concat. Caller is expected to pass >=1 segment.
|
|
741
|
+
throw new Error('stitch: no segments to concatenate');
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
const strategy = selectConcatStrategy(input.concatStrategy ?? 'auto', segs.length);
|
|
745
|
+
const hasMusic = input.music !== undefined;
|
|
746
|
+
// Extra (dialogue/sfx/voice) global layers beyond the music bed. Presence
|
|
747
|
+
// here flips the mix step from the legacy single-music buildMusicMixArgs path
|
|
748
|
+
// to the multi-layer buildMultiLayerMixArgs path. Empty/undefined ⇒ legacy.
|
|
749
|
+
const hasExtraLayers = (input.audioLayers?.length ?? 0) > 0;
|
|
750
|
+
// Any audio mix at all (music bed and/or extra layers) requires the
|
|
751
|
+
// concat→intermediate→mix two-step. When neither is present, concat targets
|
|
752
|
+
// the final output directly (byte-identical legacy no-audio path).
|
|
753
|
+
const hasAudioMix = hasMusic || hasExtraLayers;
|
|
754
|
+
const concatListPath =
|
|
755
|
+
input.concatListPath ?? resolvePath(dirname(input.outputPath), 'concat.txt');
|
|
756
|
+
|
|
757
|
+
// When audio is mixed, concat writes an intermediate file and the mix step
|
|
758
|
+
// produces the final output (mirrors nex_assemble's concat_no_music.mp4).
|
|
759
|
+
const concatOutput = hasAudioMix
|
|
760
|
+
? resolvePath(dirname(input.outputPath), 'concat_no_music.mp4')
|
|
761
|
+
: input.outputPath;
|
|
762
|
+
|
|
763
|
+
const plan: StitchPlannedStep[] = [];
|
|
764
|
+
|
|
765
|
+
// --- Optional per-segment normalization pre-pass (WS9) ---
|
|
766
|
+
// When a tail-cut or letterbox is requested, each ordered segment is
|
|
767
|
+
// re-encoded to the standard (dropping dead tail frames / adding cinematic
|
|
768
|
+
// bars) before concat; the concat then consumes the normalized clips. Default
|
|
769
|
+
// (neither field set) emits no prep steps and is byte-identical to legacy.
|
|
770
|
+
const hasGrade =
|
|
771
|
+
(typeof input.gradeLut === 'string' && input.gradeLut !== '') ||
|
|
772
|
+
(typeof input.gradeId === 'string' && input.gradeId !== '') ||
|
|
773
|
+
(input.segmentGradeIds?.some((g) => typeof g === 'string' && g !== '') ?? false);
|
|
774
|
+
const needsPrep =
|
|
775
|
+
(input.clipMaxSeconds !== undefined && input.clipMaxSeconds > 0) ||
|
|
776
|
+
(typeof input.letterboxRatio === 'string' && input.letterboxRatio !== '') ||
|
|
777
|
+
hasGrade;
|
|
778
|
+
const prepDir = resolvePath(dirname(input.outputPath), '.prep');
|
|
779
|
+
const concatSegs = needsPrep
|
|
780
|
+
? segs.map((_, i) => resolvePath(prepDir, `seg-${String(i).padStart(3, '0')}.mp4`))
|
|
781
|
+
: segs;
|
|
782
|
+
if (needsPrep) {
|
|
783
|
+
segs.forEach((seg, i) => {
|
|
784
|
+
// Per-segment grade override realizes the narrative color language; falls
|
|
785
|
+
// back to the uniform gradeId.
|
|
786
|
+
const gradeFilter = resolveGradeFilter(input.segmentGradeIds?.[i] ?? input.gradeId);
|
|
787
|
+
plan.push({
|
|
788
|
+
kind: 'segment-prep',
|
|
789
|
+
args: buildSegmentPrepArgs(seg, concatSegs[i], {
|
|
790
|
+
clipMaxSeconds: input.clipMaxSeconds,
|
|
791
|
+
letterboxRatio: input.letterboxRatio,
|
|
792
|
+
width: input.letterboxCanvas?.width,
|
|
793
|
+
height: input.letterboxCanvas?.height,
|
|
794
|
+
gradeLut: input.gradeLut,
|
|
795
|
+
gradeFilter,
|
|
796
|
+
}),
|
|
797
|
+
outputPath: concatSegs[i],
|
|
798
|
+
});
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// --- Concat step ---
|
|
803
|
+
const concatArgs =
|
|
804
|
+
strategy === 'demuxer'
|
|
805
|
+
? buildConcatDemuxerArgs(concatSegs, concatListPath, concatOutput)
|
|
806
|
+
: buildConcatFilterArgs(concatSegs, concatOutput);
|
|
807
|
+
plan.push({
|
|
808
|
+
kind: strategy === 'demuxer' ? 'concat-demuxer' : 'concat-filter',
|
|
809
|
+
args: concatArgs,
|
|
810
|
+
outputPath: concatOutput,
|
|
811
|
+
});
|
|
812
|
+
|
|
813
|
+
// --- Audio-mix step (optional) ---
|
|
814
|
+
// Two mutually-exclusive paths:
|
|
815
|
+
// * hasExtraLayers → multi-layer mix (music bed prepended + dialogue/sfx).
|
|
816
|
+
// * music-only → the EXACT legacy buildMusicMixArgs path (byte-identical).
|
|
817
|
+
// Neither ⇒ no mix step (legacy no-audio path).
|
|
818
|
+
if (hasExtraLayers) {
|
|
819
|
+
const layers = combinedAudioLayers(input);
|
|
820
|
+
const mixArgs = buildMultiLayerMixArgs(concatOutput, layers, input.outputPath);
|
|
821
|
+
plan.push({ kind: 'multi-layer-mix', args: mixArgs, outputPath: input.outputPath });
|
|
822
|
+
} else if (hasMusic && input.music) {
|
|
823
|
+
// The fade-start / -t cap need the concat duration; on dry-run we leave it 0.
|
|
824
|
+
const musicArgs = buildMusicMixArgs(concatOutput, input.music.trackPath, input.outputPath, {
|
|
825
|
+
volume: input.music.volume,
|
|
826
|
+
fadeOutSec: input.music.fadeOutSec,
|
|
827
|
+
totalDurationSec: 0,
|
|
828
|
+
});
|
|
829
|
+
plan.push({ kind: 'music-mix', args: musicArgs, outputPath: input.outputPath });
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
if (opts.dryRun) {
|
|
833
|
+
return {
|
|
834
|
+
status: 'dry-run',
|
|
835
|
+
outputPath: input.outputPath,
|
|
836
|
+
orderedSegments: segs,
|
|
837
|
+
concatStrategy: strategy,
|
|
838
|
+
music: hasMusic,
|
|
839
|
+
plan,
|
|
840
|
+
durationMs: 0,
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
// --- Pre-concat corruption guard ---
|
|
845
|
+
// useapi sometimes reports a generation 'complete' while the downloaded mp4
|
|
846
|
+
// is truncated (no moov atom): it passes existence/size checks but ffmpeg
|
|
847
|
+
// concat later dies with "Invalid data found when processing input". Probe
|
|
848
|
+
// each real input segment up front so the corrupt one is named clearly.
|
|
849
|
+
// Only the actual segment inputs are probed (not derived intermediates).
|
|
850
|
+
if (!opts.skipSegmentValidation) {
|
|
851
|
+
for (const seg of segs) {
|
|
852
|
+
const ok = await isValidMp4(seg, { ffprobeBin: opts.ffprobeBin });
|
|
853
|
+
if (!ok) {
|
|
854
|
+
throw new VclawError(
|
|
855
|
+
'ffmpeg_failed',
|
|
856
|
+
`stitch input segment is a corrupt or truncated MP4 (ffprobe could not read a valid duration): ${seg}`,
|
|
857
|
+
{ segment: seg },
|
|
858
|
+
);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
// --- Real execution ---
|
|
864
|
+
await mkdir(dirname(input.outputPath), { recursive: true });
|
|
865
|
+
|
|
866
|
+
// Per-segment normalization pre-pass: concat then reads the normalized clips.
|
|
867
|
+
if (needsPrep) {
|
|
868
|
+
await mkdir(prepDir, { recursive: true });
|
|
869
|
+
for (const step of plan) {
|
|
870
|
+
if (step.kind === 'segment-prep') await runFfmpeg(step.args, opts);
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
if (strategy === 'demuxer') {
|
|
875
|
+
await mkdir(dirname(concatListPath), { recursive: true });
|
|
876
|
+
await writeFile(concatListPath, buildConcatListContent(concatSegs), 'utf8');
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
await runFfmpeg(concatArgs, opts);
|
|
880
|
+
|
|
881
|
+
let finalPath = concatOutput;
|
|
882
|
+
if (hasExtraLayers) {
|
|
883
|
+
// Multi-layer mix: dialogue/sfx (+ optional music bed) over the concat.
|
|
884
|
+
// buildMultiLayerMixArgs uses duration=first (driven by the video input),
|
|
885
|
+
// so it needs no probed total — the args are already final from planning.
|
|
886
|
+
const mixStep = plan.find((s) => s.kind === 'multi-layer-mix');
|
|
887
|
+
const mixArgs = mixStep?.args ?? buildMultiLayerMixArgs(concatOutput, combinedAudioLayers(input), input.outputPath);
|
|
888
|
+
await runFfmpeg(mixArgs, opts);
|
|
889
|
+
finalPath = input.outputPath;
|
|
890
|
+
} else if (hasMusic && input.music) {
|
|
891
|
+
// Probe the concat output to compute the real fade-start + -t cap.
|
|
892
|
+
const concatMs = await ffprobeDuration(concatOutput, { ffprobeBin: opts.ffprobeBin });
|
|
893
|
+
const musicArgs = buildMusicMixArgs(concatOutput, input.music.trackPath, input.outputPath, {
|
|
894
|
+
volume: input.music.volume,
|
|
895
|
+
fadeOutSec: input.music.fadeOutSec,
|
|
896
|
+
totalDurationSec: concatMs / 1000,
|
|
897
|
+
});
|
|
898
|
+
// Refresh the plan's music step with the duration-resolved args.
|
|
899
|
+
const musicStep = plan.find((s) => s.kind === 'music-mix');
|
|
900
|
+
if (musicStep) musicStep.args = musicArgs;
|
|
901
|
+
await runFfmpeg(musicArgs, opts);
|
|
902
|
+
finalPath = input.outputPath;
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
const durationMs = await ffprobeDuration(finalPath, { ffprobeBin: opts.ffprobeBin });
|
|
906
|
+
// Touch stat so a 0-byte output surfaces as a runtime failure path-side.
|
|
907
|
+
await stat(finalPath);
|
|
908
|
+
|
|
909
|
+
return {
|
|
910
|
+
status: 'complete',
|
|
911
|
+
outputPath: finalPath,
|
|
912
|
+
orderedSegments: segs,
|
|
913
|
+
concatStrategy: strategy,
|
|
914
|
+
music: hasMusic,
|
|
915
|
+
plan,
|
|
916
|
+
durationMs,
|
|
917
|
+
};
|
|
918
|
+
}
|