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,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vocal-sync-plan.ts — the planner that makes a music-video edit feel "in sync":
|
|
3
|
+
* it pins each PERFORMER to the moment their own vocal is heard, and keeps the
|
|
4
|
+
* baked lip-sync locked to the muxed song.
|
|
5
|
+
*
|
|
6
|
+
* Given a VOCAL MAP (the song segmented by timestamp into rap / hook /
|
|
7
|
+
* instrumental / outro, each vocal section carrying its lip-synced performer
|
|
8
|
+
* clip) plus the beat grid and B-roll pools, it emits a frame-aligned segment
|
|
9
|
+
* list (`clip | inSec | durationSec`) for {@link buildSegmentCutArgs}. PURE and
|
|
10
|
+
* deterministic given an injected `rng` and `clipDuration` — no I/O, no ffmpeg.
|
|
11
|
+
*
|
|
12
|
+
* The three lessons it encodes (each learned by getting it wrong first):
|
|
13
|
+
* 1. PERFORMER-ON-VOCAL: a music video needs the rapper on the rap and the
|
|
14
|
+
* singer on the hook — assigning performers to GUESSED time blocks fights the
|
|
15
|
+
* audio. Sections come from the transcribed vocal map, not a shot script.
|
|
16
|
+
* 2. TIME-ALIGNED SCRUB: a performer cut shows its clip at in-point
|
|
17
|
+
* `(songTime - sectionStart)`, so the baked lips stay locked to the song even
|
|
18
|
+
* across B-roll cutaways (cut away and back → correct lip position). The
|
|
19
|
+
* performer holds ~2 of every 3 cuts and OPENS each vocal section.
|
|
20
|
+
* 3. FRAME-EXACT CONTINUOUS TIMELINE: walk one timeline from t=0 (no per-section
|
|
21
|
+
* reset — that drops the intro and offsets every cue) and snap every cut to
|
|
22
|
+
* the frame grid so the concatenated video-time == song-time. Paired with
|
|
23
|
+
* `-frames:v` cutting, total drift is < 1 frame.
|
|
24
|
+
* Plus DE-PATTERNING: B-roll draws from a shuffle-bag (never round-robin) with a
|
|
25
|
+
* stepped in-point on reuse, so recurring footage doesn't read as a loop.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export type VocalSectionType = 'rap' | 'hook' | 'instrumental' | 'outro';
|
|
29
|
+
|
|
30
|
+
export interface VocalSection {
|
|
31
|
+
/** Section start in song seconds. */
|
|
32
|
+
start: number;
|
|
33
|
+
/** Section end in song seconds. */
|
|
34
|
+
end: number;
|
|
35
|
+
type: VocalSectionType;
|
|
36
|
+
/**
|
|
37
|
+
* The lip-synced performer clip id for this vocal section (rap → rapper clip,
|
|
38
|
+
* hook → singer clip). Omitted for instrumental/outro (B-roll only).
|
|
39
|
+
*/
|
|
40
|
+
performerClip?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** B-roll clip ids grouped by role; performers come from the vocal map, not here. */
|
|
44
|
+
export interface BrollPools {
|
|
45
|
+
action: string[];
|
|
46
|
+
atmo: string[];
|
|
47
|
+
trio: string[];
|
|
48
|
+
vanish: string[];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface PlanVocalSyncInput {
|
|
52
|
+
/** Contiguous, ordered vocal map covering [0, songEnd]. */
|
|
53
|
+
vocalMap: VocalSection[];
|
|
54
|
+
/** Beat timestamps (seconds), e.g. from aubiotrack. */
|
|
55
|
+
beats: number[];
|
|
56
|
+
/** Song length in seconds. */
|
|
57
|
+
songEnd: number;
|
|
58
|
+
pools: BrollPools;
|
|
59
|
+
/** Duration (seconds) of a clip id — injected so the planner stays pure. */
|
|
60
|
+
clipDuration: (clipId: string) => number;
|
|
61
|
+
/** Output frame rate (default 24). */
|
|
62
|
+
fps?: number;
|
|
63
|
+
/** Seconds-per-cut by section type. Verses cut fast; hooks hold longer. */
|
|
64
|
+
cutLengths?: Partial<Record<VocalSectionType, number>>;
|
|
65
|
+
/** Injected RNG (default Math.random) — seed it for deterministic tests. */
|
|
66
|
+
rng?: () => number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface PlannedSegment {
|
|
70
|
+
clip: string;
|
|
71
|
+
/** Frame-aligned input-seek point. */
|
|
72
|
+
inSec: number;
|
|
73
|
+
/** Frame-aligned duration. */
|
|
74
|
+
durationSec: number;
|
|
75
|
+
/** True when this cut is a lip-synced performer (vs B-roll). */
|
|
76
|
+
performer: boolean;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const DEFAULT_CUTS: Record<VocalSectionType, number> = {
|
|
80
|
+
rap: 1.3, hook: 2.4, instrumental: 2.0, outro: 3.1,
|
|
81
|
+
};
|
|
82
|
+
const BROLL_ORDER: Record<VocalSectionType, Array<keyof BrollPools>> = {
|
|
83
|
+
rap: ['action', 'trio'],
|
|
84
|
+
hook: ['atmo', 'trio'],
|
|
85
|
+
instrumental: ['atmo', 'trio', 'action'],
|
|
86
|
+
outro: ['vanish', 'atmo'],
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
function shuffle<T>(arr: T[], rng: () => number): T[] {
|
|
90
|
+
const a = [...arr];
|
|
91
|
+
for (let i = a.length - 1; i > 0; i--) {
|
|
92
|
+
const j = Math.floor(rng() * (i + 1));
|
|
93
|
+
[a[i], a[j]] = [a[j], a[i]];
|
|
94
|
+
}
|
|
95
|
+
return a;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function planVocalSync(input: PlanVocalSyncInput): PlannedSegment[] {
|
|
99
|
+
const fps = input.fps ?? 24;
|
|
100
|
+
const rng = input.rng ?? Math.random;
|
|
101
|
+
const cuts = { ...DEFAULT_CUTS, ...input.cutLengths };
|
|
102
|
+
const beats = input.beats;
|
|
103
|
+
const nearestBeat = (t: number): number =>
|
|
104
|
+
beats.length === 0 ? t : beats.reduce((p, b) => (Math.abs(b - t) < Math.abs(p - t) ? b : p), beats[0]);
|
|
105
|
+
|
|
106
|
+
// Boundaries and section lookup are FRAME-based, using the same rounding the
|
|
107
|
+
// walk uses. The previous float version (`find(b => b > t + 0.05)`) skipped a
|
|
108
|
+
// boundary whenever frame rounding put the walk within 0.05s before it, so
|
|
109
|
+
// the previous section's type/performer bled a full cut into the next
|
|
110
|
+
// section for roughly half of all boundaries.
|
|
111
|
+
const songEndF = Math.round(input.songEnd * fps);
|
|
112
|
+
const boundaryFrames = input.vocalMap.map((s) => Math.round(s.start * fps)).concat(songEndF);
|
|
113
|
+
const sectionAtFrame = (frame: number): VocalSection => {
|
|
114
|
+
for (const s of input.vocalMap) {
|
|
115
|
+
if (frame >= Math.round(s.start * fps) && frame < Math.round(s.end * fps)) return s;
|
|
116
|
+
}
|
|
117
|
+
return { start: 0, end: input.songEnd, type: 'instrumental' };
|
|
118
|
+
};
|
|
119
|
+
const nextBoundaryFrame = (frame: number): number =>
|
|
120
|
+
boundaryFrames.find((bf) => bf > frame) ?? songEndF;
|
|
121
|
+
|
|
122
|
+
const segs: PlannedSegment[] = [];
|
|
123
|
+
const useCount: Record<string, number> = {};
|
|
124
|
+
let lastClip: string | null = null;
|
|
125
|
+
const bags: Partial<Record<keyof BrollPools, string[]>> = {};
|
|
126
|
+
|
|
127
|
+
const draw = (poolKey: keyof BrollPools): string | null => {
|
|
128
|
+
const pool = input.pools[poolKey];
|
|
129
|
+
if (!pool || pool.length === 0) return null;
|
|
130
|
+
let bag = bags[poolKey];
|
|
131
|
+
if (!bag || bag.length === 0) bag = bags[poolKey] = shuffle(pool, rng);
|
|
132
|
+
let clip = bag.shift() as string;
|
|
133
|
+
if (clip === lastClip && bag.length > 0) {
|
|
134
|
+
bag.push(clip);
|
|
135
|
+
clip = bag.shift() as string;
|
|
136
|
+
}
|
|
137
|
+
return clip;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const emitBroll = (clip: string, durationSec: number): void => {
|
|
141
|
+
const od = input.clipDuration(clip);
|
|
142
|
+
// Fail at PLAN time when the source can't supply the cut (plus the 0.05s
|
|
143
|
+
// min in-point and 0.15s tail margin the in-point stepper reserves).
|
|
144
|
+
// Previously the Math.max(0.05) floor masked this and it surfaced
|
|
145
|
+
// post-render as a misleading drift failure.
|
|
146
|
+
if (od < durationSec + 0.2) {
|
|
147
|
+
throw new Error(
|
|
148
|
+
`planVocalSync: B-roll clip "${clip}" is ${od.toFixed(2)}s but a ${durationSec.toFixed(2)}s cut (+0.2s margin) is planned — use longer pool footage or shorter cutLengths.`,
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
lastClip = clip;
|
|
152
|
+
const n = (useCount[clip] = (useCount[clip] ?? 0) + 1);
|
|
153
|
+
const room = Math.max(0.05, od - durationSec - 0.15);
|
|
154
|
+
const inSec = +(((n - 1) * (durationSec + 0.5) + 0.2) % room).toFixed(4);
|
|
155
|
+
segs.push({ clip, inSec, durationSec, performer: false });
|
|
156
|
+
};
|
|
157
|
+
const emitPerformer = (clip: string, wantIn: number, durationSec: number): void => {
|
|
158
|
+
const od = input.clipDuration(clip);
|
|
159
|
+
// An undersized lip-synced take cannot cover its section's cuts; the old
|
|
160
|
+
// clamp silently scrubbed to 0 and desynced the lips post-render.
|
|
161
|
+
if (od < durationSec) {
|
|
162
|
+
throw new Error(
|
|
163
|
+
`planVocalSync: performer clip "${clip}" is ${od.toFixed(2)}s but a ${durationSec.toFixed(2)}s cut is planned — the lip-synced take must cover its section's cuts.`,
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
lastClip = clip;
|
|
167
|
+
const inSec = Math.max(0, Math.min(wantIn, od - durationSec));
|
|
168
|
+
segs.push({ clip, inSec: +inSec.toFixed(4), durationSec, performer: true });
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// Walk an INTEGER-FRAME timeline so cumulative video-time == song-time exactly
|
|
172
|
+
// (float `t` accumulates rounding and would drift cuts off section boundaries).
|
|
173
|
+
const minFrames = Math.round(0.3 * fps); // skip sub-0.3s slivers
|
|
174
|
+
let tf = 0;
|
|
175
|
+
let lastType: VocalSectionType | null = null;
|
|
176
|
+
let cutIdx = 0;
|
|
177
|
+
let brollRot = 0;
|
|
178
|
+
while (tf < songEndF - Math.round(0.2 * fps)) {
|
|
179
|
+
const t = tf / fps;
|
|
180
|
+
const sec = sectionAtFrame(tf);
|
|
181
|
+
const spc = cuts[sec.type];
|
|
182
|
+
if (sec.type !== lastType) {
|
|
183
|
+
cutIdx = 0;
|
|
184
|
+
brollRot = 0;
|
|
185
|
+
lastType = sec.type;
|
|
186
|
+
}
|
|
187
|
+
let cutSec = nearestBeat(t + spc);
|
|
188
|
+
if (cutSec <= t + 0.25) cutSec = t + spc;
|
|
189
|
+
let cf = Math.round(cutSec * fps);
|
|
190
|
+
const nbf = nextBoundaryFrame(tf);
|
|
191
|
+
if (cf > nbf) cf = nbf;
|
|
192
|
+
if (cf > songEndF) cf = songEndF;
|
|
193
|
+
if (cf <= tf) {
|
|
194
|
+
tf += 1; // guarantee forward progress at a degenerate boundary
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
const durFrames = cf - tf;
|
|
198
|
+
if (durFrames < minFrames) {
|
|
199
|
+
tf = cf;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const durationSec = durFrames / fps;
|
|
203
|
+
if (sec.performerClip && cutIdx % 3 !== 2) {
|
|
204
|
+
emitPerformer(sec.performerClip, (tf - Math.round(sec.start * fps)) / fps, durationSec);
|
|
205
|
+
} else {
|
|
206
|
+
const order = BROLL_ORDER[sec.type];
|
|
207
|
+
const key = order[brollRot++ % order.length];
|
|
208
|
+
const clip = draw(key) ?? draw('trio') ?? draw('atmo');
|
|
209
|
+
if (!clip) {
|
|
210
|
+
tf = cf;
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
emitBroll(clip, durationSec);
|
|
214
|
+
}
|
|
215
|
+
tf = cf;
|
|
216
|
+
cutIdx += 1;
|
|
217
|
+
}
|
|
218
|
+
return segs;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Total planned duration (seconds) — feed to {@link assertNoDrift} against the built file. */
|
|
222
|
+
export function plannedDuration(segs: PlannedSegment[]): number {
|
|
223
|
+
return +segs.reduce((a, s) => a + s.durationSec, 0).toFixed(4);
|
|
224
|
+
}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice clones — the "blank video with audio" voice-reference trick.
|
|
3
|
+
*
|
|
4
|
+
* Source of truth: the Jack-Vs-AI "cartoon show" workflow (VOICE DESIGN chapter).
|
|
5
|
+
* The production-learned insight is that supplying a target voice to a video model
|
|
6
|
+
* (Seedance 2 / Veo) as a raw MP3/WAV audio reference does NOT lock the voice — the
|
|
7
|
+
* generation drifts to a generic accent. Supplying the SAME audio as the track of a
|
|
8
|
+
* **black-frame video** ("blank video with the audio track there") DOES lock it: the
|
|
9
|
+
* model treats it as a video reference and clones the voice as a driving asset.
|
|
10
|
+
*
|
|
11
|
+
* This module is the deterministic CLI half: it BUILDS that black-frame-plus-audio
|
|
12
|
+
* MP4 from an audio sample (via the shared `runFfmpeg` helper) and persists each clip
|
|
13
|
+
* as a reusable **voice clone** asset (`artifacts/voice-clones.json`), mirroring the
|
|
14
|
+
* seedance-asset-library / environment-assets pattern. A voice clone can be bound to a
|
|
15
|
+
* character so that any scene featuring that character auto-injects the blank video
|
|
16
|
+
* into the Seedance `reference_videos` set at execution time — or reference a voice
|
|
17
|
+
* explicitly with an `@<voice-name>` tag (see `execution-runtime.ts` /
|
|
18
|
+
* `asset-tag-lookup.ts`). Absent artifact → byte-identical to today.
|
|
19
|
+
*
|
|
20
|
+
* Voice-drift fix from the workflow: `sliceSeconds` chops one long recording into N
|
|
21
|
+
* short clips (the creator recommends 2-second slices per dialogue line) so the model
|
|
22
|
+
* has cleaner per-line references.
|
|
23
|
+
*
|
|
24
|
+
* PURE / TESTABLE: `planBlankVideoWithAudio()` returns the ffmpeg argv WITHOUT
|
|
25
|
+
* spawning, so the whole planning surface is offline-testable. The executor only
|
|
26
|
+
* shells out when `dryRun` is false — and `runFfmpeg`/`ffprobeDuration` themselves
|
|
27
|
+
* short-circuit on dryRun, so tests never need ffmpeg installed.
|
|
28
|
+
*/
|
|
29
|
+
import { existsSync } from 'node:fs';
|
|
30
|
+
import { mkdir, readFile } from 'node:fs/promises';
|
|
31
|
+
import { dirname, extname, join } from 'node:path';
|
|
32
|
+
import { resolveProjectWorkspace } from './workspace.js';
|
|
33
|
+
import { writeTextFileAtomic } from './atomic-write.js';
|
|
34
|
+
import { runFfmpeg, ffprobeDuration, STANDARD_VIDEO_ARGS, STANDARD_AUDIO_ARGS } from './assemble/ffmpeg.js';
|
|
35
|
+
import type { AssetTagEntry } from './prompt-rules.js';
|
|
36
|
+
|
|
37
|
+
// ── Artifact ──────────────────────────────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
/** One registered voice clone in `voice-clones.json`. */
|
|
40
|
+
export interface VoiceCloneEntry {
|
|
41
|
+
/** Voice-asset name (what an @Name tag / character binding resolves to). */
|
|
42
|
+
name: string;
|
|
43
|
+
/** Optional character this voice belongs to (so the character always speaks it). */
|
|
44
|
+
character?: string;
|
|
45
|
+
/** The source audio sample this clone was built from. */
|
|
46
|
+
sourceAudio: string;
|
|
47
|
+
/** The built blank-video-with-audio clip (the reference the model consumes). */
|
|
48
|
+
clipPath: string;
|
|
49
|
+
/**
|
|
50
|
+
* Durable public URL for `clipPath`, hosted on Go Bananas. Required for the
|
|
51
|
+
* seedance-direct r2v voice-lock (the remote API needs a hosted URL, not a local
|
|
52
|
+
* path). Populated by `voice-clone --execute` when GB media hosting is available;
|
|
53
|
+
* absent when hosting is unavailable (the clip stays a local path).
|
|
54
|
+
*/
|
|
55
|
+
hostedUrl?: string;
|
|
56
|
+
/** When sliced for drift control: the per-line clip paths (in order). */
|
|
57
|
+
slices?: string[];
|
|
58
|
+
/** Optional human description of the voice character/tone. */
|
|
59
|
+
description?: string;
|
|
60
|
+
/** Duration of the source audio in milliseconds (0 when not probed / dry-run). */
|
|
61
|
+
durationMs?: number;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface VoiceClonesArtifact {
|
|
65
|
+
schemaVersion: 1;
|
|
66
|
+
projectSlug: string;
|
|
67
|
+
generatedAt: string;
|
|
68
|
+
voices: VoiceCloneEntry[];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface VoiceClonesLookup {
|
|
72
|
+
voices: VoiceCloneEntry[];
|
|
73
|
+
/** name (lowercased) -> entry. */
|
|
74
|
+
voiceByName: Map<string, VoiceCloneEntry>;
|
|
75
|
+
/** character (lowercased) -> entry, for character→voice binding. */
|
|
76
|
+
voiceByCharacter: Map<string, VoiceCloneEntry>;
|
|
77
|
+
/**
|
|
78
|
+
* name (lowercased) -> AssetTagEntry, ready for buildAssetTagLookup's
|
|
79
|
+
* `voicesByName`. The referencePath is the blank-video clip so it classifies
|
|
80
|
+
* into Seedance `reference_videos`.
|
|
81
|
+
*/
|
|
82
|
+
voiceEntryByName: Map<string, AssetTagEntry>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function voiceClonesPathFor(root: string, slug: string): string {
|
|
86
|
+
return join(resolveProjectWorkspace(slug, root).artifactsDir, 'voice-clones.json');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Directory the built blank-video clips live in (under the project). */
|
|
90
|
+
export function voiceCloneClipsDir(root: string, slug: string): string {
|
|
91
|
+
return join(resolveProjectWorkspace(slug, root).projectDir, 'voices');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export async function writeVoiceClones(
|
|
95
|
+
root: string,
|
|
96
|
+
slug: string,
|
|
97
|
+
artifact: VoiceClonesArtifact,
|
|
98
|
+
): Promise<void> {
|
|
99
|
+
const path = voiceClonesPathFor(root, slug);
|
|
100
|
+
await mkdir(dirname(path), { recursive: true });
|
|
101
|
+
await writeTextFileAtomic(path, `${JSON.stringify(artifact, null, 2)}\n`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Read `artifacts/voice-clones.json`. Returns empty lookups when absent (graceful —
|
|
106
|
+
* the execution layer then injects no voice references, byte-identical to today). A
|
|
107
|
+
* present-but-malformed file is NOT swallowed (JSON.parse surfaces it).
|
|
108
|
+
*/
|
|
109
|
+
export async function readVoiceClones(root: string, slug: string): Promise<VoiceClonesLookup> {
|
|
110
|
+
const path = voiceClonesPathFor(root, slug);
|
|
111
|
+
if (!existsSync(path)) {
|
|
112
|
+
return {
|
|
113
|
+
voices: [],
|
|
114
|
+
voiceByName: new Map(),
|
|
115
|
+
voiceByCharacter: new Map(),
|
|
116
|
+
voiceEntryByName: new Map(),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const parsed = JSON.parse(await readFile(path, 'utf-8')) as Partial<VoiceClonesArtifact>;
|
|
120
|
+
const voices: VoiceCloneEntry[] = Array.isArray(parsed.voices)
|
|
121
|
+
? parsed.voices.filter((v): v is VoiceCloneEntry => !!v && !!v.name && !!v.clipPath)
|
|
122
|
+
: [];
|
|
123
|
+
const voiceByName = new Map<string, VoiceCloneEntry>();
|
|
124
|
+
const voiceByCharacter = new Map<string, VoiceCloneEntry>();
|
|
125
|
+
const voiceEntryByName = new Map<string, AssetTagEntry>();
|
|
126
|
+
for (const v of voices) {
|
|
127
|
+
voiceByName.set(v.name.toLowerCase(), v);
|
|
128
|
+
if (v.character) voiceByCharacter.set(v.character.toLowerCase(), v);
|
|
129
|
+
voiceEntryByName.set(v.name.toLowerCase(), {
|
|
130
|
+
descriptor: v.description ?? `the voice of ${v.character ?? v.name}`,
|
|
131
|
+
// Prefer the durable hosted URL (required by remote routes); fall back to the
|
|
132
|
+
// local clip when hosting was unavailable at clone time.
|
|
133
|
+
referencePath: v.hostedUrl ?? v.clipPath,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return { voices, voiceByName, voiceByCharacter, voiceEntryByName };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ── Blank-video-with-audio builder ──────────────────────────────────────────────
|
|
140
|
+
|
|
141
|
+
const AUDIO_EXTENSIONS = new Set(['.mp3', '.wav', '.m4a', '.aac', '.ogg', '.flac']);
|
|
142
|
+
|
|
143
|
+
export interface BlankVideoPlanOptions {
|
|
144
|
+
/** Source audio sample path. */
|
|
145
|
+
audioPath: string;
|
|
146
|
+
/** Output clip path (.mp4). */
|
|
147
|
+
outputPath: string;
|
|
148
|
+
/** Black-frame canvas width (default 1280). */
|
|
149
|
+
width?: number;
|
|
150
|
+
/** Black-frame canvas height (default 720). */
|
|
151
|
+
height?: number;
|
|
152
|
+
/** Optional fixed slice window for drift control (e.g. 2 seconds). */
|
|
153
|
+
startSeconds?: number;
|
|
154
|
+
durationSeconds?: number;
|
|
155
|
+
/**
|
|
156
|
+
* Clamp the OUTPUT to this many seconds (output-side `-t`). x264 keeps encoding
|
|
157
|
+
* frames after the audio ends, so `-shortest` alone lets the video stream overshoot
|
|
158
|
+
* the audio (e.g. 14s audio -> 16.2s video) and trip the r2v duration cap. Setting
|
|
159
|
+
* this to the audio length forces the whole clip to exactly that duration.
|
|
160
|
+
*/
|
|
161
|
+
clampSeconds?: number;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Build the ffmpeg argv for one black-frame-plus-audio clip WITHOUT spawning.
|
|
166
|
+
*
|
|
167
|
+
* `-f lavfi -i color=c=black:s=WxH:r=24` synthesizes the black video; the audio
|
|
168
|
+
* sample is the second input. When a slice window is given, `-ss <start> -t <duration>`
|
|
169
|
+
* trims the AUDIO input. `clampSeconds` adds an output-side `-t` that forces the whole
|
|
170
|
+
* clip to that length — necessary because `-shortest` alone lets x264 overshoot the
|
|
171
|
+
* audio (trailing video frames), which would trip the r2v duration cap. PURE — splice
|
|
172
|
+
* the result straight into a runFfmpeg call. Throws on a non-audio source (code 1).
|
|
173
|
+
*/
|
|
174
|
+
export function planBlankVideoWithAudio(opts: BlankVideoPlanOptions): string[] {
|
|
175
|
+
const ext = extname(opts.audioPath).toLowerCase();
|
|
176
|
+
if (!AUDIO_EXTENSIONS.has(ext)) {
|
|
177
|
+
throw new Error(
|
|
178
|
+
`voice-clone source must be an audio file (${[...AUDIO_EXTENSIONS].join(', ')}); got "${opts.audioPath}".`,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
const width = opts.width ?? 1280;
|
|
182
|
+
const height = opts.height ?? 720;
|
|
183
|
+
const args: string[] = [
|
|
184
|
+
'-f',
|
|
185
|
+
'lavfi',
|
|
186
|
+
'-i',
|
|
187
|
+
`color=c=black:s=${width}x${height}:r=24`,
|
|
188
|
+
];
|
|
189
|
+
// Trim the AUDIO input window when slicing (apply -ss/-t to the audio input).
|
|
190
|
+
if (opts.startSeconds !== undefined) args.push('-ss', String(opts.startSeconds));
|
|
191
|
+
if (opts.durationSeconds !== undefined) args.push('-t', String(opts.durationSeconds));
|
|
192
|
+
args.push(
|
|
193
|
+
'-i',
|
|
194
|
+
opts.audioPath,
|
|
195
|
+
...STANDARD_VIDEO_ARGS,
|
|
196
|
+
...STANDARD_AUDIO_ARGS,
|
|
197
|
+
// Map the synthesized video + the real audio.
|
|
198
|
+
'-map',
|
|
199
|
+
'0:v:0',
|
|
200
|
+
'-map',
|
|
201
|
+
'1:a:0',
|
|
202
|
+
);
|
|
203
|
+
// Output-side clamp: forces the whole clip (video + audio) to clampSeconds, so the
|
|
204
|
+
// video can't overshoot the audio. Falls back to -shortest when no clamp is known
|
|
205
|
+
// (e.g. dry-run, where the audio length isn't probed).
|
|
206
|
+
if (opts.clampSeconds !== undefined) args.push('-t', String(opts.clampSeconds));
|
|
207
|
+
args.push('-shortest', opts.outputPath);
|
|
208
|
+
return args;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export interface VoiceCloneInput {
|
|
212
|
+
/** Voice-asset name. */
|
|
213
|
+
name: string;
|
|
214
|
+
/** Source audio sample path. */
|
|
215
|
+
audioPath: string;
|
|
216
|
+
/** Optional character to bind the voice to. */
|
|
217
|
+
character?: string;
|
|
218
|
+
/** Optional voice description. */
|
|
219
|
+
description?: string;
|
|
220
|
+
/** Slice the recording into windows of this many seconds (drift fix; 0/undefined = single clip). */
|
|
221
|
+
sliceSeconds?: number;
|
|
222
|
+
/** Black-frame canvas. */
|
|
223
|
+
width?: number;
|
|
224
|
+
height?: number;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Max reference-video length the Seedance/Dreamina r2v voice-lock accepts
|
|
229
|
+
* (`dreamina-seedance-2-0` rejects refs over this with HTTP 500). A longer voice
|
|
230
|
+
* clip is warned about at clone time so the operator slices it before it hits the
|
|
231
|
+
* provider as an opaque 500.
|
|
232
|
+
*/
|
|
233
|
+
export const VOICE_REF_MAX_SECONDS = 15.2;
|
|
234
|
+
|
|
235
|
+
export interface BuildVoiceCloneOptions {
|
|
236
|
+
workspaceRoot: string;
|
|
237
|
+
slug: string;
|
|
238
|
+
/** ISO timestamp (injected so the artifact stays deterministic/testable). */
|
|
239
|
+
generatedAt: string;
|
|
240
|
+
/** When true, plan only: return the entry + ffmpeg commands but spawn nothing. */
|
|
241
|
+
dryRun?: boolean;
|
|
242
|
+
/** Override the ffmpeg binary (tests / non-standard installs). */
|
|
243
|
+
ffmpegBin?: string;
|
|
244
|
+
/**
|
|
245
|
+
* Host the built clip and return its durable URL (or null when unavailable).
|
|
246
|
+
* Injected so it is testable and so dry-runs never touch the network; the handler
|
|
247
|
+
* wires the real Go Bananas uploader. Omitted/undefined -> no hosting attempted.
|
|
248
|
+
*/
|
|
249
|
+
hostMedia?: (clipPath: string) => Promise<string | null>;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export interface BuildVoiceCloneResult {
|
|
253
|
+
entry: VoiceCloneEntry;
|
|
254
|
+
/** The ffmpeg command line(s) that were (or, on dryRun, would be) run. */
|
|
255
|
+
commands: string[];
|
|
256
|
+
/** Advisory warnings (duration over the r2v cap, hosting unavailable, …). */
|
|
257
|
+
warnings: string[];
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Build a single voice clone: render its blank-video-with-audio clip(s) and return
|
|
262
|
+
* the artifact entry. On `dryRun`, no ffmpeg is spawned (commands are still
|
|
263
|
+
* returned for inspection) and durationMs is 0.
|
|
264
|
+
*
|
|
265
|
+
* Slicing: when `sliceSeconds > 0`, the source is probed for its length and one
|
|
266
|
+
* `<name>-NN.mp4` clip is emitted per window; `clipPath` points at the first slice
|
|
267
|
+
* (the primary reference) and `slices[]` lists them all. Without slicing, a single
|
|
268
|
+
* `<name>.mp4` clip is built.
|
|
269
|
+
*/
|
|
270
|
+
export async function buildVoiceClone(
|
|
271
|
+
input: VoiceCloneInput,
|
|
272
|
+
opts: BuildVoiceCloneOptions,
|
|
273
|
+
): Promise<BuildVoiceCloneResult> {
|
|
274
|
+
if (!input.name?.trim()) throw new Error('voice-clone requires a --name.');
|
|
275
|
+
if (!input.audioPath?.trim()) throw new Error('voice-clone requires an --audio sample.');
|
|
276
|
+
if (!opts.dryRun && !existsSync(input.audioPath)) {
|
|
277
|
+
throw new Error(`voice-clone --audio not found: ${input.audioPath}`);
|
|
278
|
+
}
|
|
279
|
+
// Validate the source extension up front — before any ffprobe — so a non-audio
|
|
280
|
+
// sample fails fast with the input-error message (planBlankVideoWithAudio also
|
|
281
|
+
// checks, but now that we probe duration first, the early check keeps the error
|
|
282
|
+
// classification stable: input error / exit 1, not an ffprobe failure / exit 2).
|
|
283
|
+
const sourceExt = extname(input.audioPath).toLowerCase();
|
|
284
|
+
if (!AUDIO_EXTENSIONS.has(sourceExt)) {
|
|
285
|
+
throw new Error(
|
|
286
|
+
`voice-clone source must be an audio file (${[...AUDIO_EXTENSIONS].join(', ')}); got "${input.audioPath}".`,
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const clipsDir = voiceCloneClipsDir(opts.workspaceRoot, opts.slug);
|
|
291
|
+
if (!opts.dryRun) await mkdir(clipsDir, { recursive: true });
|
|
292
|
+
|
|
293
|
+
const safeName = input.name
|
|
294
|
+
.trim()
|
|
295
|
+
.toLowerCase()
|
|
296
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
297
|
+
.replace(/^-+|-+$/g, '') || 'voice';
|
|
298
|
+
|
|
299
|
+
const commands: string[] = [];
|
|
300
|
+
const slices: string[] = [];
|
|
301
|
+
const warnings: string[] = [];
|
|
302
|
+
let durationMs = 0;
|
|
303
|
+
|
|
304
|
+
const sliceSeconds = input.sliceSeconds && input.sliceSeconds > 0 ? input.sliceSeconds : 0;
|
|
305
|
+
|
|
306
|
+
if (sliceSeconds > 0) {
|
|
307
|
+
durationMs = await ffprobeDuration(input.audioPath, { dryRun: opts.dryRun });
|
|
308
|
+
// On dry-run we cannot probe, so plan a single representative slice; the real
|
|
309
|
+
// run probes and emits the full set. Either way the arg shapes are identical.
|
|
310
|
+
const totalSeconds = durationMs > 0 ? durationMs / 1000 : sliceSeconds;
|
|
311
|
+
const count = Math.max(1, Math.ceil(totalSeconds / sliceSeconds));
|
|
312
|
+
for (let i = 0; i < count; i += 1) {
|
|
313
|
+
const outputPath = join(clipsDir, `${safeName}-${String(i + 1).padStart(2, '0')}.mp4`);
|
|
314
|
+
const args = planBlankVideoWithAudio({
|
|
315
|
+
audioPath: input.audioPath,
|
|
316
|
+
outputPath,
|
|
317
|
+
...(input.width !== undefined ? { width: input.width } : {}),
|
|
318
|
+
...(input.height !== undefined ? { height: input.height } : {}),
|
|
319
|
+
startSeconds: i * sliceSeconds,
|
|
320
|
+
durationSeconds: sliceSeconds,
|
|
321
|
+
clampSeconds: sliceSeconds,
|
|
322
|
+
});
|
|
323
|
+
const { command } = await runFfmpeg(args, {
|
|
324
|
+
dryRun: opts.dryRun,
|
|
325
|
+
...(opts.ffmpegBin ? { ffmpegBin: opts.ffmpegBin } : {}),
|
|
326
|
+
});
|
|
327
|
+
commands.push(command);
|
|
328
|
+
slices.push(outputPath);
|
|
329
|
+
}
|
|
330
|
+
} else {
|
|
331
|
+
const outputPath = join(clipsDir, `${safeName}.mp4`);
|
|
332
|
+
// Probe the audio length BEFORE building so we can clamp the output to it (the
|
|
333
|
+
// video would otherwise overshoot — see planBlankVideoWithAudio). 0 on dry-run.
|
|
334
|
+
if (!opts.dryRun) durationMs = await ffprobeDuration(input.audioPath, { dryRun: false });
|
|
335
|
+
const args = planBlankVideoWithAudio({
|
|
336
|
+
audioPath: input.audioPath,
|
|
337
|
+
outputPath,
|
|
338
|
+
...(input.width !== undefined ? { width: input.width } : {}),
|
|
339
|
+
...(input.height !== undefined ? { height: input.height } : {}),
|
|
340
|
+
...(durationMs > 0 ? { clampSeconds: durationMs / 1000 } : {}),
|
|
341
|
+
});
|
|
342
|
+
const { command } = await runFfmpeg(args, {
|
|
343
|
+
dryRun: opts.dryRun,
|
|
344
|
+
...(opts.ffmpegBin ? { ffmpegBin: opts.ffmpegBin } : {}),
|
|
345
|
+
});
|
|
346
|
+
commands.push(command);
|
|
347
|
+
slices.push(outputPath);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// Duration preflight (1B): a single voice reference longer than the r2v cap is
|
|
351
|
+
// rejected by Seedance with an opaque HTTP 500. Warn (without slicing) so the
|
|
352
|
+
// operator slices it; a sliced clone's primary slice is already short, so only
|
|
353
|
+
// warn for the un-sliced case.
|
|
354
|
+
if (sliceSeconds === 0 && durationMs > 0 && durationMs / 1000 > VOICE_REF_MAX_SECONDS) {
|
|
355
|
+
warnings.push(
|
|
356
|
+
`voice clip is ${(durationMs / 1000).toFixed(1)}s; Seedance r2v requires the reference video ≤${VOICE_REF_MAX_SECONDS}s. ` +
|
|
357
|
+
`Re-run with --slice-seconds ${Math.floor(VOICE_REF_MAX_SECONDS)} (or a shorter sample) before using it on seedance-direct.`,
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Host the primary clip so remote routes get a durable public URL (seedance-direct
|
|
362
|
+
// r2v needs a hosted ref, not a local path). Injected + executor-only; on dry-run
|
|
363
|
+
// or when hosting is unavailable, hostedUrl stays unset and the clip stays local.
|
|
364
|
+
let hostedUrl: string | undefined;
|
|
365
|
+
if (!opts.dryRun && opts.hostMedia) {
|
|
366
|
+
const url = await opts.hostMedia(slices[0]);
|
|
367
|
+
if (url) hostedUrl = url;
|
|
368
|
+
else warnings.push('voice clip not hosted; remote routes (seedance-direct) need a hosted URL — host it before use.');
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const entry: VoiceCloneEntry = {
|
|
372
|
+
name: input.name.trim(),
|
|
373
|
+
...(input.character ? { character: input.character.trim() } : {}),
|
|
374
|
+
sourceAudio: input.audioPath,
|
|
375
|
+
clipPath: slices[0],
|
|
376
|
+
...(hostedUrl ? { hostedUrl } : {}),
|
|
377
|
+
...(slices.length > 1 ? { slices } : {}),
|
|
378
|
+
...(input.description ? { description: input.description.trim() } : {}),
|
|
379
|
+
durationMs,
|
|
380
|
+
};
|
|
381
|
+
return { entry, commands, warnings };
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Build one voice clone and merge it into `voice-clones.json` (replacing any entry
|
|
386
|
+
* with the same name). Returns the persisted artifact + the build result. On
|
|
387
|
+
* `dryRun`, nothing is written and nothing is spawned — the would-be artifact is
|
|
388
|
+
* returned for inspection.
|
|
389
|
+
*/
|
|
390
|
+
export async function registerVoiceClone(
|
|
391
|
+
input: VoiceCloneInput,
|
|
392
|
+
opts: BuildVoiceCloneOptions,
|
|
393
|
+
): Promise<{ artifact: VoiceClonesArtifact; result: BuildVoiceCloneResult }> {
|
|
394
|
+
const result = await buildVoiceClone(input, opts);
|
|
395
|
+
const existing = await readVoiceClones(opts.workspaceRoot, opts.slug);
|
|
396
|
+
const merged = existing.voices.filter(
|
|
397
|
+
(v) => v.name.toLowerCase() !== result.entry.name.toLowerCase(),
|
|
398
|
+
);
|
|
399
|
+
merged.push(result.entry);
|
|
400
|
+
const artifact: VoiceClonesArtifact = {
|
|
401
|
+
schemaVersion: 1,
|
|
402
|
+
projectSlug: opts.slug,
|
|
403
|
+
generatedAt: opts.generatedAt,
|
|
404
|
+
voices: merged,
|
|
405
|
+
};
|
|
406
|
+
if (!opts.dryRun) {
|
|
407
|
+
await writeVoiceClones(opts.workspaceRoot, opts.slug, artifact);
|
|
408
|
+
}
|
|
409
|
+
return { artifact, result };
|
|
410
|
+
}
|