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,1212 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { artifactPathFor, writeArtifact } from './artifact-store.js';
|
|
4
|
+
import { audioMix, beats, captureRealismBlock, cameraSpec, cameraProse, backgroundPlate, gradeSpec, gradeProse, lightingSpec, lightingProse, musicSyncLine, orbitGrammar, phoneCaptureBlock, } from './cinematography.js';
|
|
5
|
+
import { referenceBuildOrder, resolveCategory, } from './category-registry.js';
|
|
6
|
+
import { crossFrameBlock, frameMapBlock, lastFrameBlock, subjectLockBlock, buildPositionalDescriptorLine, buildIdentityLockLine, SINGLE_FULL_FRAME_GUARD, POSITIONAL_BINDING, } from './seedance-blocks.js';
|
|
7
|
+
import { listCharacterProfiles } from './characters.js';
|
|
8
|
+
import { readProductReferences } from './product-references.js';
|
|
9
|
+
import { readReferenceSheetsArtifact } from './reference-sheet-store.js';
|
|
10
|
+
import { ensureProjectWorkspace, readProjectManifest } from './workspace.js';
|
|
11
|
+
import { withDialogue } from './multi-shot-prompt.js';
|
|
12
|
+
import { readProjectBlueprint } from './project-blueprint.js';
|
|
13
|
+
import { renderDirectorLine, forbiddenMovementHits } from './blueprint-prompt.js';
|
|
14
|
+
import { readBrandDefinition } from './brand-definition.js';
|
|
15
|
+
import { renderBrandLine } from './brand-prompt.js';
|
|
16
|
+
import { resolveCinemaProfile } from './cinema-profile.js';
|
|
17
|
+
// Quantified cinematography suffix appended only at detail === 'rich'. Built from
|
|
18
|
+
// the shared cinematography emitters so the numbers stay consistent with the
|
|
19
|
+
// multi-shot framework. Deterministic and pure.
|
|
20
|
+
const RICH_CAMERA_MOVE = {
|
|
21
|
+
shot: 'master',
|
|
22
|
+
lens: 35,
|
|
23
|
+
angle: 'eye-level',
|
|
24
|
+
movement: 'dolly',
|
|
25
|
+
};
|
|
26
|
+
export function richCinematographySuffix(opts = {}) {
|
|
27
|
+
const lightingId = opts.lightingId ?? 'neutral-studio';
|
|
28
|
+
const gradeId = opts.gradeId ?? 'teal-orange';
|
|
29
|
+
const register = opts.register ?? 'numeric';
|
|
30
|
+
const base = register === 'prose'
|
|
31
|
+
? `Cinematography: ${cameraProse(RICH_CAMERA_MOVE.movement, 'rich')}; ` +
|
|
32
|
+
`${lightingProse(lightingId, 'rich')}; ` +
|
|
33
|
+
`${gradeProse(gradeId, 'rich')}.`
|
|
34
|
+
: `Cinematography: ${cameraSpec(RICH_CAMERA_MOVE, 'rich')}; ` +
|
|
35
|
+
`${lightingSpec(lightingId, 'rich')}; ` +
|
|
36
|
+
`${gradeSpec(gradeId, 'rich')}.`;
|
|
37
|
+
if (opts.realism) {
|
|
38
|
+
return `${base} ${captureRealismBlock(opts.realism, 'rich')}`;
|
|
39
|
+
}
|
|
40
|
+
return base;
|
|
41
|
+
}
|
|
42
|
+
function richAudioSuffix() {
|
|
43
|
+
return `Audio: ${audioMix('rich')}.`;
|
|
44
|
+
}
|
|
45
|
+
export const SUPPORTED_PANEL_COUNTS = [9, 12, 15, 20];
|
|
46
|
+
// Grid layout per panel count (storyboard-prompt-builder skill). Horizontal
|
|
47
|
+
// orientation keeps cols ≥ rows; a vertical (taller-than-wide) aspect ratio
|
|
48
|
+
// transposes so the sheet reads top-to-bottom.
|
|
49
|
+
function gridLayout(panelCount, aspectRatio) {
|
|
50
|
+
const base = {
|
|
51
|
+
9: { rows: 3, cols: 3 },
|
|
52
|
+
12: { rows: 3, cols: 4 },
|
|
53
|
+
15: { rows: 3, cols: 5 },
|
|
54
|
+
20: { rows: 4, cols: 5 },
|
|
55
|
+
};
|
|
56
|
+
const layout = base[panelCount] ?? { rows: 3, cols: Math.ceil(panelCount / 3) };
|
|
57
|
+
const [w, h] = aspectRatio.split(':').map((n) => Number(n));
|
|
58
|
+
const vertical = Number.isFinite(w) && Number.isFinite(h) && h > w;
|
|
59
|
+
return vertical ? { rows: layout.cols, cols: layout.rows } : layout;
|
|
60
|
+
}
|
|
61
|
+
export function resolvePanelCount(panelCount) {
|
|
62
|
+
if (panelCount === undefined)
|
|
63
|
+
return 15;
|
|
64
|
+
if (!SUPPORTED_PANEL_COUNTS.includes(panelCount)) {
|
|
65
|
+
throw new Error(`filmmaking-prompts: --panels must be one of ${SUPPORTED_PANEL_COUNTS.join(', ')} (got ${panelCount})`);
|
|
66
|
+
}
|
|
67
|
+
return panelCount;
|
|
68
|
+
}
|
|
69
|
+
const GENRE_STYLES = new Map([
|
|
70
|
+
['live-action', {
|
|
71
|
+
genre: 'live-action',
|
|
72
|
+
charSheetStyle: 'photorealistic, life-like live action shot on a DSLR camera with 35mm film and muted color tones, do not make it look like a 3D render',
|
|
73
|
+
gridStyleDescriptors: 'live-action, photorealistic, lifelike, 35mm film grain',
|
|
74
|
+
annotationThirdLine: 'MOOD',
|
|
75
|
+
formatTone: 'cinematic grounded realism',
|
|
76
|
+
}],
|
|
77
|
+
['pixar', {
|
|
78
|
+
genre: 'pixar',
|
|
79
|
+
charSheetStyle: 'stylized 3D render in the visual language of modern Pixar features, soft global illumination, expressive proportions, no photoreal rendering',
|
|
80
|
+
gridStyleDescriptors: 'stylized 3D Pixar-style render, soft global illumination, expressive proportions',
|
|
81
|
+
annotationThirdLine: 'MOOD',
|
|
82
|
+
formatTone: 'stylized 3D animation',
|
|
83
|
+
}],
|
|
84
|
+
['anime', {
|
|
85
|
+
genre: 'anime',
|
|
86
|
+
charSheetStyle: '2D anime cel-shading, clean line work, painterly backgrounds, no 3D render',
|
|
87
|
+
gridStyleDescriptors: '2D anime cel-shading, clean line work, painterly backgrounds',
|
|
88
|
+
annotationThirdLine: 'MOOD',
|
|
89
|
+
formatTone: '2D anime',
|
|
90
|
+
}],
|
|
91
|
+
['noir', {
|
|
92
|
+
genre: 'noir',
|
|
93
|
+
charSheetStyle: 'high-contrast black and white film, harsh chiaroscuro lighting, 35mm grain',
|
|
94
|
+
gridStyleDescriptors: 'high-contrast black and white, harsh chiaroscuro, 35mm grain',
|
|
95
|
+
annotationThirdLine: 'MOOD',
|
|
96
|
+
formatTone: 'high-contrast noir',
|
|
97
|
+
}],
|
|
98
|
+
['influencer', {
|
|
99
|
+
genre: 'influencer',
|
|
100
|
+
charSheetStyle: 'natural daylight, iPhone selfie-camera aesthetic, soft skin tones, no cinematic grade',
|
|
101
|
+
gridStyleDescriptors: 'natural daylight, iPhone selfie-camera aesthetic, soft skin tones',
|
|
102
|
+
annotationThirdLine: 'VOICE',
|
|
103
|
+
formatTone: 'handheld vlog realism',
|
|
104
|
+
}],
|
|
105
|
+
['action', {
|
|
106
|
+
genre: 'action',
|
|
107
|
+
charSheetStyle: 'photorealistic, life-like live action shot on a DSLR camera with 35mm film and muted color tones, do not make it look like a 3D render',
|
|
108
|
+
gridStyleDescriptors: 'live-action, photorealistic, kinetic, 35mm film grain',
|
|
109
|
+
annotationThirdLine: 'STYLE',
|
|
110
|
+
formatTone: 'kinetic action realism',
|
|
111
|
+
}],
|
|
112
|
+
['music-video', {
|
|
113
|
+
genre: 'music-video',
|
|
114
|
+
charSheetStyle: 'photorealistic, life-like live action shot on a DSLR camera with 35mm film and muted color tones, do not make it look like a 3D render',
|
|
115
|
+
gridStyleDescriptors: 'live-action, photorealistic, lifelike, 35mm film grain',
|
|
116
|
+
annotationThirdLine: 'MOOD',
|
|
117
|
+
formatTone: 'cinematic music-video energy',
|
|
118
|
+
}],
|
|
119
|
+
['cgi', {
|
|
120
|
+
genre: 'cgi',
|
|
121
|
+
charSheetStyle: 'photoreal CGI render with ray-traced global illumination and physically-based materials, crisp specular highlights and volumetric light — rendered, not live-action',
|
|
122
|
+
gridStyleDescriptors: 'photoreal CGI render, ray-traced global illumination, PBR materials, volumetric light',
|
|
123
|
+
annotationThirdLine: 'MOOD',
|
|
124
|
+
formatTone: 'photoreal CGI render',
|
|
125
|
+
}],
|
|
126
|
+
['cartoon', {
|
|
127
|
+
genre: 'cartoon',
|
|
128
|
+
charSheetStyle: 'hand-drawn 2D cartoon with bold clean outlines and flat cel fills, exaggerated proportions, no 3D render',
|
|
129
|
+
gridStyleDescriptors: 'hand-drawn 2D cartoon, bold outlines, flat cel fills, saturated primaries',
|
|
130
|
+
annotationThirdLine: 'MOOD',
|
|
131
|
+
formatTone: '2D cartoon',
|
|
132
|
+
}],
|
|
133
|
+
]);
|
|
134
|
+
const GENRE_ALIASES = new Map([
|
|
135
|
+
['photorealistic', 'live-action'], ['photoreal', 'live-action'], ['cinematic', 'live-action'], ['realism', 'live-action'],
|
|
136
|
+
['3d', 'pixar'], ['animation', 'pixar'],
|
|
137
|
+
['2d', 'anime'], ['cel', 'anime'],
|
|
138
|
+
['vlog', 'influencer'], ['social', 'influencer'], ['ugc', 'influencer'],
|
|
139
|
+
['martial-arts', 'action'], ['fight', 'action'], ['combat', 'action'],
|
|
140
|
+
['musicvideo', 'music-video'], ['music_video', 'music-video'], ['mv', 'music-video'],
|
|
141
|
+
]);
|
|
142
|
+
export function resolveGenreStyle(genre) {
|
|
143
|
+
if (!genre || !genre.trim())
|
|
144
|
+
return GENRE_STYLES.get('live-action');
|
|
145
|
+
const key = genre.trim().toLowerCase();
|
|
146
|
+
const canonical = GENRE_ALIASES.get(key) ?? key;
|
|
147
|
+
const known = GENRE_STYLES.get(canonical);
|
|
148
|
+
if (known)
|
|
149
|
+
return known;
|
|
150
|
+
// Unknown genre: pass the user's descriptor straight through (skill is
|
|
151
|
+
// genre-agnostic), defaulting the annotation third line to MOOD.
|
|
152
|
+
return {
|
|
153
|
+
genre: genre.trim(),
|
|
154
|
+
charSheetStyle: `${genre.trim()} style`,
|
|
155
|
+
gridStyleDescriptors: genre.trim(),
|
|
156
|
+
annotationThirdLine: 'MOOD',
|
|
157
|
+
formatTone: genre.trim(),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Build the per-call CLI override layer for {@link resolveCinemaProfile} from the
|
|
162
|
+
* generate options. Only fields the caller actually set are forwarded so the
|
|
163
|
+
* project manifest + genre + HARD DEFAULT layers fill in the rest. The legacy
|
|
164
|
+
* `realism` option (a {@link CaptureRealismOpts} | false) is mapped onto the
|
|
165
|
+
* profile's boolean `realism` plus its `haze`/`wet` knobs.
|
|
166
|
+
*/
|
|
167
|
+
function cinemaOverridesFromOptions(options) {
|
|
168
|
+
const overrides = {};
|
|
169
|
+
if (options.detail !== undefined)
|
|
170
|
+
overrides.detail = options.detail;
|
|
171
|
+
if (options.register !== undefined)
|
|
172
|
+
overrides.register = options.register;
|
|
173
|
+
if (options.lightingId !== undefined)
|
|
174
|
+
overrides.lightingId = options.lightingId;
|
|
175
|
+
if (options.gradeId !== undefined)
|
|
176
|
+
overrides.gradeId = options.gradeId;
|
|
177
|
+
if (options.plateKind !== undefined)
|
|
178
|
+
overrides.plateKind = options.plateKind;
|
|
179
|
+
if (options.realism !== undefined) {
|
|
180
|
+
if (options.realism === false) {
|
|
181
|
+
overrides.realism = false;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
overrides.realism = true;
|
|
185
|
+
if (options.realism.haze !== undefined)
|
|
186
|
+
overrides.haze = options.realism.haze;
|
|
187
|
+
if (options.realism.wet !== undefined)
|
|
188
|
+
overrides.wet = options.realism.wet;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return overrides;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Project the resolved profile into the cinematography-override bag accepted by
|
|
195
|
+
* {@link buildStoryboardGridPrompt} / {@link seedancePromptText}. `realism:false`
|
|
196
|
+
* disables the capture-realism block; otherwise the resolved haze/wet flow in.
|
|
197
|
+
*/
|
|
198
|
+
function cinematicsFromProfile(profile) {
|
|
199
|
+
return {
|
|
200
|
+
realism: profile.realism ? { haze: profile.haze, ...(profile.wet ? { wet: true } : {}) } : false,
|
|
201
|
+
register: profile.register,
|
|
202
|
+
captureRegister: profile.captureRegister,
|
|
203
|
+
...(profile.lightingId !== undefined ? { lightingId: profile.lightingId } : {}),
|
|
204
|
+
...(profile.gradeId !== undefined ? { gradeId: profile.gradeId } : {}),
|
|
205
|
+
plateKind: profile.plateKind,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
export async function generateFilmmakingPrompts(options) {
|
|
209
|
+
const root = options.root ?? process.cwd();
|
|
210
|
+
const durationSeconds = options.durationSeconds ?? 15;
|
|
211
|
+
const noFaces = options.noFaces ?? false;
|
|
212
|
+
// Resolve the category descriptor (default → cinematic character descriptor).
|
|
213
|
+
// The descriptor supplies a default genre; an explicit `--genre` still wins.
|
|
214
|
+
// For the cinematic default this yields `'live-action'`, identical to today's
|
|
215
|
+
// behavior — purely internal plumbing, no output change on the character path.
|
|
216
|
+
// `subjectType` selects the branch: `'character'` (default) keeps today's
|
|
217
|
+
// cinematic/character path verbatim; `'product'` takes the additive
|
|
218
|
+
// product-subject branch below.
|
|
219
|
+
const descriptor = resolveCategory(options.category);
|
|
220
|
+
const effectiveGenre = options.genre ?? descriptor.genre;
|
|
221
|
+
const genreStyle = resolveGenreStyle(effectiveGenre);
|
|
222
|
+
const aspectRatio = options.aspectRatio?.trim() || '16:9';
|
|
223
|
+
const panelCount = resolvePanelCount(options.panelCount);
|
|
224
|
+
const workspace = await ensureProjectWorkspace(options.projectSlug, root);
|
|
225
|
+
// Resolve the cinema profile ONCE: project manifest < CLI overrides, with the
|
|
226
|
+
// genre + HARD DEFAULT below them (Joey 2.0: rich + realism + prose by default).
|
|
227
|
+
// With ZERO flags and no project block this yields the full photoreal treatment.
|
|
228
|
+
const manifest = await readProjectManifest(workspace);
|
|
229
|
+
const profile = resolveCinemaProfile(manifest?.cinemaProfile, cinemaOverridesFromOptions(options), effectiveGenre);
|
|
230
|
+
const detail = profile.detail;
|
|
231
|
+
const brief = await readOptionalArtifact(workspace, 'brief');
|
|
232
|
+
const generatedAt = new Date().toISOString();
|
|
233
|
+
if (descriptor.subjectType === 'product') {
|
|
234
|
+
return generateProductPrompts({
|
|
235
|
+
options,
|
|
236
|
+
workspace,
|
|
237
|
+
brief,
|
|
238
|
+
descriptor,
|
|
239
|
+
genreStyle,
|
|
240
|
+
aspectRatio,
|
|
241
|
+
durationSeconds,
|
|
242
|
+
detail,
|
|
243
|
+
profile,
|
|
244
|
+
generatedAt,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
const storyboard = await readOptionalArtifact(workspace, 'storyboard');
|
|
248
|
+
const assetManifest = await readOptionalArtifact(workspace, 'asset-manifest');
|
|
249
|
+
const referenceSheets = await readReferenceSheetsArtifact(root, options.projectSlug);
|
|
250
|
+
const characters = await listCharacterProfiles(workspace);
|
|
251
|
+
// Director layer: the explicit option wins; otherwise auto-read the persisted
|
|
252
|
+
// blueprint (graceful null when absent → byte-identical legacy output).
|
|
253
|
+
const blueprint = options.blueprint ?? (await readProjectBlueprint(root, options.projectSlug)) ?? undefined;
|
|
254
|
+
// Brand layer: the explicit option wins; otherwise auto-read the persisted
|
|
255
|
+
// brand definition (graceful null when absent → byte-identical legacy output).
|
|
256
|
+
const brandDefinition = options.brandDefinition ?? (await readBrandDefinition(root, options.projectSlug)) ?? undefined;
|
|
257
|
+
const issues = [];
|
|
258
|
+
const sheetLayout = options.sheetLayout ?? '8-shot';
|
|
259
|
+
const referenceMap = buildReferenceMap(referenceSheets, characters, assetManifest);
|
|
260
|
+
const characterSheetPrompts = buildCharacterSheetPrompts(characters, referenceMap, issues, genreStyle, aspectRatio, sheetLayout);
|
|
261
|
+
// Character lock: carry each character's identity description + its @imageN
|
|
262
|
+
// slot forward into the Seedance Variant A SUBJECT lines (verbatim reuse is
|
|
263
|
+
// the skill's most important rule).
|
|
264
|
+
const characterContext = new Map();
|
|
265
|
+
for (const character of characters) {
|
|
266
|
+
const slot = referenceMap.find((s) => s.role === 'character-sheet' && s.characterName === character.name && s.status === 'ready');
|
|
267
|
+
characterContext.set(character.name, {
|
|
268
|
+
...(slot ? { slot: slot.slot } : {}),
|
|
269
|
+
description: cleanSentence(character.description ?? `${character.name}, visually distinctive lead character`),
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
const storyboardGridPrompt = storyboard
|
|
273
|
+
? buildStoryboardGridPrompt(storyboard, brief, characterSheetPrompts, noFaces, genreStyle, aspectRatio, panelCount, durationSeconds, detail, cinematicsFromProfile(profile))
|
|
274
|
+
: null;
|
|
275
|
+
if (!storyboard) {
|
|
276
|
+
issues.push({
|
|
277
|
+
code: 'storyboard-missing',
|
|
278
|
+
severity: 'warning',
|
|
279
|
+
message: 'No storyboard artifact exists; Seedance packets fall back to text-driven prompts.',
|
|
280
|
+
path: 'artifacts/storyboard.json',
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
if (storyboardGridPrompt) {
|
|
284
|
+
const storyboardGridPath = options.storyboardGridPath?.trim();
|
|
285
|
+
referenceMap.push({
|
|
286
|
+
slot: nextSlot(referenceMap.length),
|
|
287
|
+
role: 'storyboard-grid',
|
|
288
|
+
label: '9-panel storyboard grid',
|
|
289
|
+
...(storyboardGridPath ? { path: storyboardGridPath } : {}),
|
|
290
|
+
status: storyboardGridPath ? 'ready' : 'pending',
|
|
291
|
+
});
|
|
292
|
+
if (!storyboardGridPath) {
|
|
293
|
+
issues.push({
|
|
294
|
+
code: 'storyboard-grid-pending',
|
|
295
|
+
severity: 'warning',
|
|
296
|
+
message: 'Storyboard grid prompt was generated, but no rendered grid image is attached yet.',
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Two-phase gate (E5): in storyboard phase, omit the heavy video-generation
|
|
301
|
+
// packets (and their packet-only issues) — return the storyboard/camera-
|
|
302
|
+
// language portion only. Default/video phase builds the full packets.
|
|
303
|
+
const seedancePackets = options.phase === 'storyboard'
|
|
304
|
+
? []
|
|
305
|
+
: buildSeedancePackets({
|
|
306
|
+
storyboard,
|
|
307
|
+
brief,
|
|
308
|
+
referenceMap,
|
|
309
|
+
durationSeconds,
|
|
310
|
+
noFaces,
|
|
311
|
+
genreStyle,
|
|
312
|
+
aspectRatio,
|
|
313
|
+
characterContext,
|
|
314
|
+
detail,
|
|
315
|
+
profile,
|
|
316
|
+
issues,
|
|
317
|
+
textDiscipline: options.textDiscipline ?? false,
|
|
318
|
+
generateAudio: options.generateAudio ?? false,
|
|
319
|
+
...(options.resolution !== undefined ? { resolution: options.resolution } : {}),
|
|
320
|
+
// A single kinetic shot carries no timeline; otherwise honour the opt-in.
|
|
321
|
+
emitTimeline: !(options.singleShot ?? false) && (options.timeline ?? false),
|
|
322
|
+
...(blueprint ? { blueprint } : {}),
|
|
323
|
+
...(brandDefinition ? { brandDefinition } : {}),
|
|
324
|
+
...(options.dialogue ? { dialogue: options.dialogue } : {}),
|
|
325
|
+
...(options.dialogueByScene && options.dialogueByScene.size > 0 ? { dialogueByScene: options.dialogueByScene } : {}),
|
|
326
|
+
...(options.dialogue || (options.dialogueByScene && options.dialogueByScene.size > 0)
|
|
327
|
+
? { emotionCues: options.emotionCues ?? false }
|
|
328
|
+
: {}),
|
|
329
|
+
});
|
|
330
|
+
const artifact = {
|
|
331
|
+
schemaVersion: 1,
|
|
332
|
+
projectSlug: options.projectSlug,
|
|
333
|
+
generatedAt,
|
|
334
|
+
sourceSkill: 'ai-filmmaking',
|
|
335
|
+
durationDefaultSeconds: durationSeconds,
|
|
336
|
+
referenceMap,
|
|
337
|
+
characterSheetPrompts,
|
|
338
|
+
storyboardGridPrompt,
|
|
339
|
+
seedancePackets,
|
|
340
|
+
issues,
|
|
341
|
+
};
|
|
342
|
+
if (!options.write)
|
|
343
|
+
return { artifact };
|
|
344
|
+
return {
|
|
345
|
+
artifact,
|
|
346
|
+
artifactPath: await writeArtifact(workspace, 'filmmaking-prompts', artifact),
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// ---------------------------------------------------------------------------
|
|
350
|
+
// Product-subject branch (descriptor.subjectType === 'product').
|
|
351
|
+
//
|
|
352
|
+
// Additive path: NO character sheets, NO storyboard-grid character lock. Each
|
|
353
|
+
// product becomes a text-driven Seedance packet whose timeline follows the
|
|
354
|
+
// descriptor's beat template (ad-hook-feature-cta / turntable / lookbook), with
|
|
355
|
+
// orbit grammar woven in for orbit/turntable camera vocabularies and the
|
|
356
|
+
// product reference assets carried as @imageN reference slots.
|
|
357
|
+
// ---------------------------------------------------------------------------
|
|
358
|
+
async function generateProductPrompts(input) {
|
|
359
|
+
const { options, workspace, brief, descriptor, genreStyle, aspectRatio, durationSeconds, detail, profile, generatedAt } = input;
|
|
360
|
+
const issues = [];
|
|
361
|
+
const { products } = await readProductReferences(workspace);
|
|
362
|
+
const productList = products.length > 0
|
|
363
|
+
? products
|
|
364
|
+
: [{ name: brief?.title ?? 'the product', referenceAssets: [] }];
|
|
365
|
+
if (products.length === 0) {
|
|
366
|
+
issues.push({
|
|
367
|
+
code: 'reference-slot-pending',
|
|
368
|
+
severity: 'warning',
|
|
369
|
+
message: 'No product-references.json found; product packets fall back to a description-only hero from the brief.',
|
|
370
|
+
path: 'artifacts/product-references.json',
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
const referenceMap = [];
|
|
374
|
+
for (const product of productList) {
|
|
375
|
+
for (const asset of product.referenceAssets) {
|
|
376
|
+
referenceMap.push({
|
|
377
|
+
slot: nextSlot(referenceMap.length),
|
|
378
|
+
role: 'reference-image',
|
|
379
|
+
label: `${product.name} reference`,
|
|
380
|
+
path: asset,
|
|
381
|
+
status: 'ready',
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
const orbitKind = descriptor.beatTemplate === 'turntable' ? 'product-rotation' : 'camera-orbit';
|
|
386
|
+
const useOrbit = descriptor.cameraVocab === 'orbit' || descriptor.beatTemplate === 'turntable';
|
|
387
|
+
// Two-phase gate (E5): storyboard phase omits the video-generation packets.
|
|
388
|
+
const productPackets = productList.map((product, index) => {
|
|
389
|
+
const productSlots = referenceMap.filter((slot) => slot.label === `${product.name} reference`);
|
|
390
|
+
const productBeats = beats(descriptor.beatTemplate, durationSeconds, descriptor.hookSeconds);
|
|
391
|
+
return {
|
|
392
|
+
sceneIndex: index,
|
|
393
|
+
variant: 'text-driven',
|
|
394
|
+
durationSeconds,
|
|
395
|
+
// OUTPUT-DEPENDENT params (omitted unless requested → default byte-stable).
|
|
396
|
+
...(options.resolution ? { resolution: options.resolution } : {}),
|
|
397
|
+
...(!(options.singleShot ?? false) && (options.timeline ?? false)
|
|
398
|
+
? {
|
|
399
|
+
timeline: productBeats.map((beat) => ({
|
|
400
|
+
t: `${formatSeconds(Math.round(beat.start))}-${formatSeconds(Math.round(beat.end))}`,
|
|
401
|
+
beat: `${beat.label.toUpperCase()}: ${beat.direction}`,
|
|
402
|
+
})),
|
|
403
|
+
}
|
|
404
|
+
: {}),
|
|
405
|
+
references: productSlots,
|
|
406
|
+
promptText: productPromptText({
|
|
407
|
+
product,
|
|
408
|
+
productSlots,
|
|
409
|
+
brief,
|
|
410
|
+
descriptor,
|
|
411
|
+
genreStyle,
|
|
412
|
+
aspectRatio,
|
|
413
|
+
durationSeconds,
|
|
414
|
+
detail,
|
|
415
|
+
profile,
|
|
416
|
+
productBeats,
|
|
417
|
+
useOrbit,
|
|
418
|
+
orbitKind,
|
|
419
|
+
}),
|
|
420
|
+
warnings: productSlots.filter((slot) => slot.status === 'pending').map((slot) => `${slot.slot} ${slot.label} is pending.`),
|
|
421
|
+
};
|
|
422
|
+
});
|
|
423
|
+
const seedancePackets = options.phase === 'storyboard' ? [] : productPackets;
|
|
424
|
+
const artifact = {
|
|
425
|
+
schemaVersion: 1,
|
|
426
|
+
projectSlug: options.projectSlug,
|
|
427
|
+
generatedAt,
|
|
428
|
+
sourceSkill: 'ai-filmmaking',
|
|
429
|
+
durationDefaultSeconds: durationSeconds,
|
|
430
|
+
referenceMap,
|
|
431
|
+
characterSheetPrompts: [],
|
|
432
|
+
storyboardGridPrompt: null,
|
|
433
|
+
seedancePackets,
|
|
434
|
+
issues,
|
|
435
|
+
};
|
|
436
|
+
if (!options.write)
|
|
437
|
+
return { artifact };
|
|
438
|
+
return {
|
|
439
|
+
artifact,
|
|
440
|
+
artifactPath: await writeArtifact(workspace, 'filmmaking-prompts', artifact),
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
function productPromptText(input) {
|
|
444
|
+
const { product, productSlots, brief, descriptor, genreStyle, aspectRatio, durationSeconds, detail, profile, productBeats, useOrbit, orbitKind } = input;
|
|
445
|
+
const productName = cleanSentence(product.name) || 'the product';
|
|
446
|
+
const subjectDescription = cleanSentence(brief?.intent ?? '') || `the hero product, ${productName}`;
|
|
447
|
+
const refLine = productSlots.length > 0
|
|
448
|
+
? `REFERENCE: ${productSlots.map((slot) => `${slot.slot} (${slot.label})`).join(', ')} — match the product's exact form, color, finish, and proportions.`
|
|
449
|
+
: 'REFERENCE: no reference image attached — render the product faithfully from the description.';
|
|
450
|
+
const heroNote = descriptor.beatTemplate === 'turntable'
|
|
451
|
+
? 'Open and close on the hero three-quarter angle; the rotation must return cleanly to that hero framing.'
|
|
452
|
+
: '';
|
|
453
|
+
const orbitLine = useOrbit ? `CAMERA: ${orbitGrammar(orbitKind)}` : '';
|
|
454
|
+
const lines = [
|
|
455
|
+
`FORMAT: ${durationSeconds} seconds / ${genreStyle.formatTone} / ${aspectRatio} / ${descriptor.label}`,
|
|
456
|
+
'',
|
|
457
|
+
`PRODUCT: ${productName} — ${subjectDescription}.`,
|
|
458
|
+
refLine,
|
|
459
|
+
orbitLine,
|
|
460
|
+
heroNote,
|
|
461
|
+
`STYLE: ${genreStyle.gridStyleDescriptors}. Aspect ratio ${aspectRatio} held across every shot.${detail === 'rich' ? ` ${richCinematographySuffix(richSuffixOptsFromProfile(profile))}` : ''}`,
|
|
462
|
+
`AUDIO: diegetic product sound only, natural ambience, no voice-over unless the brief asks.${detail === 'rich' ? ` ${richAudioSuffix()}` : ''}`,
|
|
463
|
+
'',
|
|
464
|
+
`TIMELINE (must cover full 0:00-${formatSeconds(durationSeconds)}):`,
|
|
465
|
+
...productBeats.map((beat) => (`${formatSeconds(Math.round(beat.start))}-${formatSeconds(Math.round(beat.end))} ${beat.label.toUpperCase()}: ${beat.direction}.`)),
|
|
466
|
+
];
|
|
467
|
+
return lines.filter(Boolean).join('\n');
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Map a reference slot's role onto its canonical build step (the banana-pro-
|
|
471
|
+
* director discipline). `background-plate` is the scene-context-free `base-ref`;
|
|
472
|
+
* the character sheet is the `sheet`; every in-context frame is a `scene-plate`.
|
|
473
|
+
*/
|
|
474
|
+
function buildStepForRole(role) {
|
|
475
|
+
switch (role) {
|
|
476
|
+
case 'background-plate':
|
|
477
|
+
return 'base-ref';
|
|
478
|
+
case 'character-sheet':
|
|
479
|
+
return 'sheet';
|
|
480
|
+
case 'storyboard-grid':
|
|
481
|
+
case 'start-frame':
|
|
482
|
+
case 'end-frame':
|
|
483
|
+
case 'reference-image':
|
|
484
|
+
return 'scene-plate';
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
function buildReferenceMap(referenceSheets, characters, assetManifest) {
|
|
488
|
+
// Collect every slot first (the `slot` field is assigned last, once the final
|
|
489
|
+
// build-order is known, so `@imageN == array order` per WS0).
|
|
490
|
+
const collected = [];
|
|
491
|
+
for (const character of characters) {
|
|
492
|
+
const identitySheet = findIdentitySheet(referenceSheets, character.name);
|
|
493
|
+
const path = firstCharacterReference(character, identitySheet);
|
|
494
|
+
collected.push({
|
|
495
|
+
role: 'character-sheet',
|
|
496
|
+
label: `${character.name} character sheet`,
|
|
497
|
+
characterName: character.name,
|
|
498
|
+
...(path ? { path } : {}),
|
|
499
|
+
status: path ? 'ready' : 'pending',
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
for (const asset of assetManifest?.assets ?? []) {
|
|
503
|
+
if (asset.kind !== 'image')
|
|
504
|
+
continue;
|
|
505
|
+
if (asset.role === 'background-plate') {
|
|
506
|
+
// A scene-context-free background/base plate (no sceneIndex required).
|
|
507
|
+
if (collected.some((slot) => slot.role === 'background-plate' && slot.path === asset.path))
|
|
508
|
+
continue;
|
|
509
|
+
collected.push({
|
|
510
|
+
role: 'background-plate',
|
|
511
|
+
label: 'Background plate',
|
|
512
|
+
path: asset.path,
|
|
513
|
+
status: 'ready',
|
|
514
|
+
});
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
if (!Number.isInteger(asset.sceneIndex))
|
|
518
|
+
continue;
|
|
519
|
+
if (collected.some((slot) => slot.path === asset.path && slot.sceneIndex === asset.sceneIndex))
|
|
520
|
+
continue;
|
|
521
|
+
collected.push({
|
|
522
|
+
role: 'start-frame',
|
|
523
|
+
label: `Scene ${asset.sceneIndex} start frame`,
|
|
524
|
+
path: asset.path,
|
|
525
|
+
sceneIndex: asset.sceneIndex,
|
|
526
|
+
status: 'ready',
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
// Consult the canonical reference build order (base-ref -> sheet -> scene-plate)
|
|
530
|
+
// and group the collected slots by build step. The sort is STABLE, so within a
|
|
531
|
+
// step the original collection order is preserved — and the canonical character
|
|
532
|
+
// sheet (a `sheet` step) is never displaced/replaced by a scene plate. A default
|
|
533
|
+
// single-character project (sheet only) keeps its original order unchanged.
|
|
534
|
+
const order = referenceBuildOrder('character');
|
|
535
|
+
const rank = new Map(order.map((step, index) => [step, index]));
|
|
536
|
+
const ordered = collected
|
|
537
|
+
.map((slot, index) => ({ slot, index }))
|
|
538
|
+
.sort((left, right) => {
|
|
539
|
+
const leftRank = rank.get(buildStepForRole(left.slot.role)) ?? order.length;
|
|
540
|
+
const rightRank = rank.get(buildStepForRole(right.slot.role)) ?? order.length;
|
|
541
|
+
if (leftRank !== rightRank)
|
|
542
|
+
return leftRank - rightRank;
|
|
543
|
+
return left.index - right.index;
|
|
544
|
+
})
|
|
545
|
+
.map((entry) => entry.slot);
|
|
546
|
+
return ordered.map((slot, index) => ({ slot: nextSlot(index), ...slot }));
|
|
547
|
+
}
|
|
548
|
+
function buildCharacterSheetPrompts(characters, referenceMap, issues, genreStyle, aspectRatio, sheetLayout = '8-shot') {
|
|
549
|
+
return characters.map((character) => {
|
|
550
|
+
const slots = referenceMap.filter((slot) => slot.role === 'character-sheet' && slot.characterName === character.name);
|
|
551
|
+
const readySlots = slots.filter((slot) => slot.status === 'ready').map((slot) => slot.slot);
|
|
552
|
+
const mode = readySlots.length > 0 ? 'reference-image' : 'description-only';
|
|
553
|
+
const description = cleanSentence(character.description ?? `${character.name}, visually distinctive lead character`);
|
|
554
|
+
const wordCount = description.split(/\s+/).filter(Boolean).length;
|
|
555
|
+
if (!character.description) {
|
|
556
|
+
issues.push({
|
|
557
|
+
code: 'character-description-missing',
|
|
558
|
+
severity: 'warning',
|
|
559
|
+
message: `${character.name} has no stored identity description; generated prompt uses a fallback.`,
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
else if (wordCount > 100) {
|
|
563
|
+
// The skill calls >100 words an outright failure: bloat dilutes the
|
|
564
|
+
// identity signal and bakes scene contamination into the reference.
|
|
565
|
+
issues.push({
|
|
566
|
+
code: 'character-description-long',
|
|
567
|
+
severity: 'error',
|
|
568
|
+
message: `${character.name} identity description is ${wordCount} words; ai-filmmaking treats >100 as a failure (target 30-60). Trim scene effects/atmosphere down to identity-locking traits.`,
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
else if (wordCount > 60) {
|
|
572
|
+
issues.push({
|
|
573
|
+
code: 'character-description-long',
|
|
574
|
+
severity: 'warning',
|
|
575
|
+
message: `${character.name} identity description is ${wordCount} words; ai-filmmaking target is 30-60 words.`,
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
return {
|
|
579
|
+
characterName: character.name,
|
|
580
|
+
mode,
|
|
581
|
+
referenceSlots: readySlots,
|
|
582
|
+
promptText: sheetLayout === '6-panel'
|
|
583
|
+
? characterSheetSixPanelPrompt(description, genreStyle.charSheetStyle, aspectRatio)
|
|
584
|
+
: mode === 'reference-image'
|
|
585
|
+
? characterSheetReferencePrompt(readySlots, genreStyle.charSheetStyle, aspectRatio)
|
|
586
|
+
: characterSheetDescriptionPrompt(description, genreStyle.charSheetStyle, aspectRatio),
|
|
587
|
+
};
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
function buildStoryboardGridPrompt(storyboard, brief, characterPrompts, noFaces = false, genreStyle = resolveGenreStyle(), aspectRatio = '16:9', panelCount = 15, durationSeconds = 15, detail = 'standard',
|
|
591
|
+
// Resolved cinema-profile overrides (default {} → byte-identical legacy output).
|
|
592
|
+
cinematics = {}) {
|
|
593
|
+
const { rows, cols } = gridLayout(panelCount, aspectRatio);
|
|
594
|
+
const panels = buildPanels(storyboard, panelCount, durationSeconds, cols);
|
|
595
|
+
const characters = characterPrompts
|
|
596
|
+
.map((prompt) => `${prompt.characterName.toUpperCase()}: ${characterLine(prompt)}`)
|
|
597
|
+
.join('\n');
|
|
598
|
+
const sceneType = brief?.productionMode === 'director' ? 'cinematic director scene' : 'cinematic sequence';
|
|
599
|
+
const location = brief?.title ?? storyboard.projectSlug;
|
|
600
|
+
const third = genreStyle.annotationThirdLine; // MOOD | VOICE | STYLE
|
|
601
|
+
const noFaceClause = noFaces
|
|
602
|
+
? ' Render ALL figures as backlit silhouettes, shot from behind, or at distance — faces obscured, in shadow, or turned away, with NO clear frontal facial features (this keeps the sheet usable as a provider reference image despite real-person content filters).'
|
|
603
|
+
: '';
|
|
604
|
+
// At `rich`, append a cinematography suffix to the Style line. `terse`/`standard`
|
|
605
|
+
// keep the line byte-identical to today. When any cinema-profile override is set
|
|
606
|
+
// (realism / register / lighting / grade), pass them through; otherwise the
|
|
607
|
+
// no-arg call reproduces today's legacy suffix exactly.
|
|
608
|
+
const hasCinematicsOverride = cinematics.realism !== undefined
|
|
609
|
+
|| cinematics.register !== undefined
|
|
610
|
+
|| cinematics.lightingId !== undefined
|
|
611
|
+
|| cinematics.gradeId !== undefined;
|
|
612
|
+
const richStyleSuffix = detail === 'rich'
|
|
613
|
+
? ` ${hasCinematicsOverride ? richCinematographySuffix({
|
|
614
|
+
...(cinematics.realism !== undefined ? { realism: cinematics.realism } : {}),
|
|
615
|
+
...(cinematics.register !== undefined ? { register: cinematics.register } : {}),
|
|
616
|
+
...(cinematics.lightingId !== undefined ? { lightingId: cinematics.lightingId } : {}),
|
|
617
|
+
...(cinematics.gradeId !== undefined ? { gradeId: cinematics.gradeId } : {}),
|
|
618
|
+
}) : richCinematographySuffix()}`
|
|
619
|
+
: '';
|
|
620
|
+
// Opt-in backdrop plate clause. Omitted → no clause, Style line unchanged.
|
|
621
|
+
const plateClause = cinematics.plateKind !== undefined
|
|
622
|
+
? ` Backdrop: ${backgroundPlate(cinematics.plateKind, detail)}.`
|
|
623
|
+
: '';
|
|
624
|
+
const promptText = [
|
|
625
|
+
// A) Title & format header
|
|
626
|
+
`Create a professional ${durationSeconds}-second ${genreStyle.formatTone} storyboard sheet for "${location}" — a complete production presentation page of ${panelCount} sequential cinematic panels arranged in a clean ${rows}×${cols} grid layout, depicting ONE CONTINUOUS ${sceneType}.`,
|
|
627
|
+
'',
|
|
628
|
+
// B) Style declaration
|
|
629
|
+
`Style: Cinematic, production-grade, ${genreStyle.gridStyleDescriptors}.${noFaceClause} Aspect ratio = ${aspectRatio} page layout.${richStyleSuffix}${plateClause}`,
|
|
630
|
+
'',
|
|
631
|
+
// C) Character descriptions + lock
|
|
632
|
+
'CHARACTER LOCK - all recurring characters must appear IDENTICAL across every panel (same face, same build, same clothing, same props). Use the descriptions below as the source of truth. If reference images are attached, treat them as additional identity anchors and match them precisely.',
|
|
633
|
+
characters || 'NO NAMED CHARACTER: preserve the same subject, setting, palette, and camera language across all panels.',
|
|
634
|
+
'',
|
|
635
|
+
// D) Visual tone
|
|
636
|
+
`Visual tone: consistent colour grade, lighting logic, and lens language across all ${panelCount} panels — establish it once and hold it. This is one continuous moment in ${location}: same geography, same lighting, same wardrobe, same props.`,
|
|
637
|
+
'',
|
|
638
|
+
// E) Storyboard layout details
|
|
639
|
+
`Storyboard sheet layout: a clean ${rows}×${cols} grid on a neutral production board, thin clean separators between panels, each panel numbered with its timecode label, a short shot description beneath. UNDER EACH panel a thin off-white annotation strip with three short lines in a clean, high-contrast sans-serif font legible at rendered size: CAM, MOVE, and ${third}. Notes must read as short uppercase slug lines, not sentences. No readable UI text, no logos unless already part of the brief. Camera moves naturally around the action as if shot in a single continuous take broken into ${panelCount} sequential beats.`,
|
|
640
|
+
'',
|
|
641
|
+
// F) Scene breakdown (read left-to-right, top-to-bottom)
|
|
642
|
+
'Narrative - read left-to-right, top-to-bottom:',
|
|
643
|
+
// Aspect ratio is part of the prompt — state it on every shot, not just the
|
|
644
|
+
// header (ai-filmmaking pitfall: "Forgetting aspect ratio on shots 2-9").
|
|
645
|
+
...panels.map((panel) => (`Panel ${panel.panel} ${panel.timecode} (${panel.position}): ${panel.beat}. CAM: ${panel.cam}. MOVE: ${panel.move}. ${third}: ${panel.mood}. ASPECT: ${aspectRatio}.`)),
|
|
646
|
+
'',
|
|
647
|
+
// G/H) Art-direction + rendering footer
|
|
648
|
+
`Art direction: vary the framing every panel (wide -> medium -> close-up -> over-the-shoulder), build intensity through the middle, peak near the end, then resolve. Distribute character detail across panels — faces in close-ups, full wardrobe in wides. Render quality: masterpiece, production-ready, ${aspectRatio} professional storyboard sheet.`,
|
|
649
|
+
].join('\n');
|
|
650
|
+
return {
|
|
651
|
+
variant: 'storyboard-grid',
|
|
652
|
+
panelCount,
|
|
653
|
+
rows,
|
|
654
|
+
cols,
|
|
655
|
+
promptText,
|
|
656
|
+
panels,
|
|
657
|
+
};
|
|
658
|
+
}
|
|
659
|
+
function buildSeedancePackets(input) {
|
|
660
|
+
const scenes = input.storyboard?.scenes ?? [];
|
|
661
|
+
const characterSlots = input.referenceMap.filter((slot) => slot.role === 'character-sheet');
|
|
662
|
+
const gridSlot = input.referenceMap.find((slot) => slot.role === 'storyboard-grid');
|
|
663
|
+
// Does the blueprint forbid handheld? Reuses the forbidden-move matcher so the
|
|
664
|
+
// grid-reference packet can drop its handheld boilerplate (see seedancePromptText).
|
|
665
|
+
const forbidHandheld = input.blueprint ? forbiddenMovementHits(input.blueprint, 'handheld').length > 0 : false;
|
|
666
|
+
if (gridSlot?.status === 'pending') {
|
|
667
|
+
input.issues.push({
|
|
668
|
+
code: 'reference-slot-pending',
|
|
669
|
+
severity: 'warning',
|
|
670
|
+
message: `${gridSlot.slot} is reserved for the storyboard grid, but the rendered grid image is not attached yet.`,
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
if (input.genreStyle?.genre !== 'music-video') {
|
|
674
|
+
input.issues.push({
|
|
675
|
+
code: 'seedance-music-default',
|
|
676
|
+
severity: 'warning',
|
|
677
|
+
message: 'Seedance packets default to NO MUSIC unless a scene prompt explicitly asks for music.',
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
return scenes.map((scene) => {
|
|
681
|
+
const startFrame = input.referenceMap.find((slot) => slot.role === 'start-frame' && slot.sceneIndex === scene.sceneIndex);
|
|
682
|
+
const references = [
|
|
683
|
+
...characterSlots.filter((slot) => !scene.characters?.length || scene.characters.includes(slot.characterName ?? '')),
|
|
684
|
+
...(gridSlot ? [gridSlot] : []),
|
|
685
|
+
...(startFrame ? [startFrame] : []),
|
|
686
|
+
];
|
|
687
|
+
const variant = gridSlot && characterSlots.length > 0
|
|
688
|
+
? 'character-sheets-plus-storyboard-grid'
|
|
689
|
+
: gridSlot
|
|
690
|
+
? 'storyboard-grid-reference'
|
|
691
|
+
: 'text-driven';
|
|
692
|
+
// Per-scene dialogue wins over the blanket dialogue; either is optional.
|
|
693
|
+
const sceneDialogue = input.dialogueByScene?.get(scene.sceneIndex) ?? input.dialogue;
|
|
694
|
+
const promptText = seedancePromptText({
|
|
695
|
+
scene,
|
|
696
|
+
brief: input.brief,
|
|
697
|
+
references,
|
|
698
|
+
variant,
|
|
699
|
+
durationSeconds: scene.durationSeconds ?? input.durationSeconds,
|
|
700
|
+
noFaces: input.noFaces ?? false,
|
|
701
|
+
genreStyle: input.genreStyle,
|
|
702
|
+
aspectRatio: input.aspectRatio,
|
|
703
|
+
characterContext: input.characterContext,
|
|
704
|
+
detail: input.detail,
|
|
705
|
+
profile: input.profile,
|
|
706
|
+
textDiscipline: input.textDiscipline ?? false,
|
|
707
|
+
generateAudio: input.generateAudio ?? false,
|
|
708
|
+
forbidHandheld,
|
|
709
|
+
...(sceneDialogue ? { dialogue: sceneDialogue, emotionCues: input.emotionCues ?? false } : {}),
|
|
710
|
+
});
|
|
711
|
+
// QA gate (WS6): only the text-driven packet follows the 10-block contract;
|
|
712
|
+
// grid variants intentionally use the grid-reference body shape.
|
|
713
|
+
// Block-order QA runs on the canonical 10-block body (BEFORE the director
|
|
714
|
+
// addendum, which appends after the last block and never reorders).
|
|
715
|
+
if (variant === 'text-driven') {
|
|
716
|
+
const blockIssue = checkSeedanceBlockOrder(promptText);
|
|
717
|
+
if (blockIssue)
|
|
718
|
+
input.issues.push(blockIssue);
|
|
719
|
+
}
|
|
720
|
+
// Director layer: append the prose-only DIRECTOR addendum and validate the
|
|
721
|
+
// scene's camera direction against the camera bible's forbidden movements.
|
|
722
|
+
let finalPromptText = promptText;
|
|
723
|
+
if (input.blueprint) {
|
|
724
|
+
const directorLine = renderDirectorLine(input.blueprint, {
|
|
725
|
+
characterNames: scene.characters ?? [],
|
|
726
|
+
sceneText: `${scene.description ?? ''} ${scene.scenePrompt?.animationPrompt ?? ''}`,
|
|
727
|
+
});
|
|
728
|
+
if (directorLine)
|
|
729
|
+
finalPromptText = `${promptText}\n\n${directorLine}`;
|
|
730
|
+
for (const hit of forbiddenMovementHits(input.blueprint, promptText)) {
|
|
731
|
+
input.issues.push({
|
|
732
|
+
code: 'forbidden-camera-movement',
|
|
733
|
+
severity: 'warning',
|
|
734
|
+
message: `scene ${scene.sceneIndex}: camera movement "${hit}" is forbidden by the project blueprint camera bible.`,
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
// Brand layer: append the prose-only BRAND addendum after any DIRECTOR line.
|
|
739
|
+
if (input.brandDefinition) {
|
|
740
|
+
const brandLine = renderBrandLine(input.brandDefinition);
|
|
741
|
+
if (brandLine)
|
|
742
|
+
finalPromptText = `${finalPromptText}\n\n${brandLine}`;
|
|
743
|
+
}
|
|
744
|
+
const packetDurationSeconds = scene.durationSeconds ?? input.durationSeconds;
|
|
745
|
+
const action = cleanSentence(scene.scenePrompt?.animationPrompt ?? scene.description);
|
|
746
|
+
return {
|
|
747
|
+
sceneIndex: scene.sceneIndex,
|
|
748
|
+
variant,
|
|
749
|
+
durationSeconds: packetDurationSeconds,
|
|
750
|
+
// OUTPUT-DEPENDENT params (omitted unless requested → default byte-stable).
|
|
751
|
+
...(input.resolution ? { resolution: input.resolution } : {}),
|
|
752
|
+
...(input.emitTimeline
|
|
753
|
+
? { timeline: weaveDialogueIntoFrameMap(threeBeatFrameMap(packetDurationSeconds, action, input.aspectRatio), sceneDialogue, input.characterContext, input.emotionCues ?? false) }
|
|
754
|
+
: {}),
|
|
755
|
+
references,
|
|
756
|
+
promptText: finalPromptText,
|
|
757
|
+
warnings: references.filter((reference) => reference.status === 'pending')
|
|
758
|
+
.map((reference) => `${reference.slot} ${reference.label} is pending.`),
|
|
759
|
+
};
|
|
760
|
+
});
|
|
761
|
+
}
|
|
762
|
+
// Canonical 10-block order for the text-driven Seedance master-prompt (WS6).
|
|
763
|
+
// Source of truth shared by seedancePromptText (which emits them) and
|
|
764
|
+
// checkSeedanceBlockOrder (which validates them) so they cannot drift.
|
|
765
|
+
const SEEDANCE_BLOCK_ORDER = [
|
|
766
|
+
'SCENE & MOOD',
|
|
767
|
+
'FRAME MAP',
|
|
768
|
+
'SUBJECT LOCK',
|
|
769
|
+
'CROSS-FRAME',
|
|
770
|
+
'MOVEMENT',
|
|
771
|
+
'LAST FRAME',
|
|
772
|
+
'WORLD PLATE',
|
|
773
|
+
'SOUND BED',
|
|
774
|
+
'CAPTURE REALISM',
|
|
775
|
+
'CAMERA CAPTURE',
|
|
776
|
+
];
|
|
777
|
+
/**
|
|
778
|
+
* QA validator (WS6): confirm a text-driven Seedance packet carries all ten
|
|
779
|
+
* Joey master-prompt blocks in the canonical order. Returns a warning-level
|
|
780
|
+
* {@link FilmmakingPromptIssue} when a block is missing or out of sequence, or
|
|
781
|
+
* `null` when the packet is well-formed. Pure/deterministic — operates on the
|
|
782
|
+
* rendered prompt text only.
|
|
783
|
+
*/
|
|
784
|
+
export function checkSeedanceBlockOrder(promptText) {
|
|
785
|
+
let last = -1;
|
|
786
|
+
for (const block of SEEDANCE_BLOCK_ORDER) {
|
|
787
|
+
const idx = promptText.indexOf(block);
|
|
788
|
+
if (idx === -1) {
|
|
789
|
+
return {
|
|
790
|
+
code: 'seedance-block-order',
|
|
791
|
+
severity: 'warning',
|
|
792
|
+
message: `text-driven Seedance packet is missing the "${block}" block (expected the 10-block order: ${SEEDANCE_BLOCK_ORDER.join(' → ')}).`,
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
if (idx < last) {
|
|
796
|
+
return {
|
|
797
|
+
code: 'seedance-block-order',
|
|
798
|
+
severity: 'warning',
|
|
799
|
+
message: `text-driven Seedance packet has the "${block}" block out of order (expected the 10-block order: ${SEEDANCE_BLOCK_ORDER.join(' → ')}).`,
|
|
800
|
+
};
|
|
801
|
+
}
|
|
802
|
+
last = idx;
|
|
803
|
+
}
|
|
804
|
+
return null;
|
|
805
|
+
}
|
|
806
|
+
/** @internal — exported for testing the text-driven AUDIO / MOOD branch only. */
|
|
807
|
+
export function seedancePromptText(input) {
|
|
808
|
+
const genreStyle = input.genreStyle ?? resolveGenreStyle();
|
|
809
|
+
const aspectRatio = input.aspectRatio ?? '16:9';
|
|
810
|
+
const detail = input.detail ?? 'standard';
|
|
811
|
+
const textDiscipline = input.textDiscipline ?? false;
|
|
812
|
+
const profile = input.profile;
|
|
813
|
+
const characterRefs = input.references.filter((reference) => reference.role === 'character-sheet');
|
|
814
|
+
const gridRef = input.references.find((reference) => reference.role === 'storyboard-grid');
|
|
815
|
+
const startFrame = input.references.find((reference) => reference.role === 'start-frame');
|
|
816
|
+
const duration = `${input.durationSeconds} seconds`;
|
|
817
|
+
const action = cleanSentence(input.scene.scenePrompt?.animationPrompt ?? input.scene.description);
|
|
818
|
+
const noFaceLine = input.noFaces
|
|
819
|
+
? 'Keep all figures as backlit silhouettes, backs, or distance with faces obscured (content-filter safe).'
|
|
820
|
+
: '';
|
|
821
|
+
// Spoken-dialogue clause (ai-filmmaking Dialog scenes). Speakers that match a
|
|
822
|
+
// stored character render as their visual descriptor, never a proper name —
|
|
823
|
+
// the same character-lock discipline as SUBJECT LOCK. Absent → `speak` is the
|
|
824
|
+
// identity function and every variant stays byte-identical to today.
|
|
825
|
+
const dialogue = input.dialogue ? dialogueWithDescriptors(input.dialogue, input.characterContext) : undefined;
|
|
826
|
+
const speak = (line) => (dialogue ? withDialogue(line, dialogue, { emotionCues: input.emotionCues ?? false }) : line);
|
|
827
|
+
// Opt-in WS-C discipline lines, computed once and spliced into each variant.
|
|
828
|
+
// All-empty (default) → byte-identical output. The positional descriptor reuses
|
|
829
|
+
// the same scene.characters → stored-descriptor mapping as SUBJECT LOCK, so the
|
|
830
|
+
// emitted text is a visual descriptor per subject, never a proper name.
|
|
831
|
+
const positionalLine = textDiscipline
|
|
832
|
+
? buildPositionalDescriptorLine(subjectLockEntriesFromContext(input))
|
|
833
|
+
: '';
|
|
834
|
+
const identityLockLine = textDiscipline ? buildIdentityLockLine() : '';
|
|
835
|
+
// Music suffix on the grid variants. Default keeps the hardcoded "NO MUSIC"; with
|
|
836
|
+
// text-discipline on it follows the scene's generateAudio flag (audio → diegetic).
|
|
837
|
+
const gridMusicClause = textDiscipline && input.generateAudio
|
|
838
|
+
? 'NO TEXT ON SCREEN. Diegetic soundscape — natural ambience, environmental foley, and subject-driven sound, no added music.'
|
|
839
|
+
: 'NO TEXT ON SCREEN, NO MUSIC.';
|
|
840
|
+
// Invariant: ANY packet that references a storyboard grid OR a character
|
|
841
|
+
// reference sheet must carry the single-frame guard, or the sheet/grid leaks
|
|
842
|
+
// into the video as an animated split-screen / reproduced reference card.
|
|
843
|
+
// Character sheets are themselves multi-panel layouts, so a character-sheets
|
|
844
|
+
// packet needs the guard even when no storyboard grid is attached. With
|
|
845
|
+
// text-discipline on, the guard is unconditional. Enforce it once at the exit
|
|
846
|
+
// so a new variant can't silently omit it. `withGridGuard` is a no-op when the
|
|
847
|
+
// body already includes the guard text (the explicit branches keep it inline).
|
|
848
|
+
const withGridGuard = (body) => ((gridRef || textDiscipline || characterRefs.length > 0) && !body.includes(SINGLE_FULL_FRAME_GUARD)
|
|
849
|
+
? `${body}\n${SINGLE_FULL_FRAME_GUARD}`
|
|
850
|
+
: body);
|
|
851
|
+
if (input.variant === 'character-sheets-plus-storyboard-grid' && gridRef) {
|
|
852
|
+
// The per-character header lines carry the sheet label (which may include a
|
|
853
|
+
// proper name). With text-discipline on they are suppressed in favour of the
|
|
854
|
+
// positional visual-descriptor line (visual descriptors only, never names).
|
|
855
|
+
const characterHeaders = textDiscipline
|
|
856
|
+
? []
|
|
857
|
+
: characterRefs.map((reference, index) => `Character ${index + 1}: ${reference.slot} (${reference.label})`);
|
|
858
|
+
return withGridGuard([
|
|
859
|
+
...characterHeaders,
|
|
860
|
+
positionalLine,
|
|
861
|
+
'',
|
|
862
|
+
`Use the provided character sheets and cinematic storyboard grid ${gridRef.slot} as visual and motion reference. Create a ${duration} ${genreStyle.formatTone} sequence at ${aspectRatio}. ${SINGLE_FULL_FRAME_GUARD} Follow the panel order, camera logic, motion, and framing consistently and temporally. ${gridMusicClause}`,
|
|
863
|
+
identityLockLine,
|
|
864
|
+
noFaceLine,
|
|
865
|
+
startFrame ? `Use ${startFrame.slot} as the scene start-frame continuity anchor.` : '',
|
|
866
|
+
'',
|
|
867
|
+
`Storyline: ${speak(action)}`,
|
|
868
|
+
].filter(Boolean).join('\n'));
|
|
869
|
+
}
|
|
870
|
+
if (input.variant === 'storyboard-grid-reference' && gridRef) {
|
|
871
|
+
// Drop the handheld-realism boilerplate when the blueprint forbids handheld
|
|
872
|
+
// (otherwise the clause contradicts the bible and trips its own forbidden-move
|
|
873
|
+
// checker). No blueprint / handheld allowed → clause stays, byte-identical.
|
|
874
|
+
const handheldClause = input.forbidHandheld ? '' : 'Handheld camera moments may be used to boost realism. ';
|
|
875
|
+
return withGridGuard([
|
|
876
|
+
positionalLine,
|
|
877
|
+
`Use the provided cinematic storyboard grid ${gridRef.slot} as visual and motion reference. Create a ${duration} ${genreStyle.formatTone} sequence at ${aspectRatio}. ${SINGLE_FULL_FRAME_GUARD} Follow the panel order, camera logic, motion and camera framing consistently. ${handheldClause}${gridMusicClause}`,
|
|
878
|
+
identityLockLine,
|
|
879
|
+
noFaceLine,
|
|
880
|
+
startFrame ? `Use ${startFrame.slot} as the scene start-frame continuity anchor.` : '',
|
|
881
|
+
'',
|
|
882
|
+
`Storyline: ${speak(action)}`,
|
|
883
|
+
].filter(Boolean).join('\n'));
|
|
884
|
+
}
|
|
885
|
+
// Variant A (text-driven) — the Joey 10-block Seedance master-prompt (WS6, now
|
|
886
|
+
// the default packet shape). The blocks are assembled in a fixed contract order
|
|
887
|
+
// (SCENE & MOOD → FRAME MAP → SUBJECT LOCK → CROSS-FRAME → MOVEMENT → LAST FRAME
|
|
888
|
+
// → WORLD PLATE → SOUND BED → CAPTURE REALISM → CAMERA CAPTURE) using the
|
|
889
|
+
// shared seedance-blocks.ts / cinematography.ts emitters. `terse`/`standard`
|
|
890
|
+
// detail emit no quantified cinematography tokens; `rich` appends them.
|
|
891
|
+
// SOUND BED. With text-discipline on, the diegetic-vs-no-music choice is keyed
|
|
892
|
+
// on the scene's generateAudio flag (audio → diegetic soundscape; otherwise the
|
|
893
|
+
// existing no-music line). Default (text-discipline off) keeps today's wording.
|
|
894
|
+
const soundBed = genreStyle.genre === 'music-video'
|
|
895
|
+
? `SOUND BED: Music-driven — ${musicSyncLine(undefined, detail)}.`
|
|
896
|
+
: textDiscipline && input.generateAudio
|
|
897
|
+
? `SOUND BED: Diegetic soundscape — natural ambience, environmental foley, and subject-driven sound, no added music.${detail === 'rich' ? ` ${richAudioSuffix()}` : ''}`
|
|
898
|
+
: `SOUND BED: No music. Natural ambience and subject-driven sound only.${detail === 'rich' ? ` ${richAudioSuffix()}` : ''}`;
|
|
899
|
+
// FRAME MAP rows; with dialogue, the spoken line is baked into the opening
|
|
900
|
+
// beat (the guide's "bake it into the TIMELINE in quoted brackets" rule).
|
|
901
|
+
// Same weave as the machine-readable `timeline` field (shared helper).
|
|
902
|
+
const frameMap = weaveDialogueIntoFrameMap(threeBeatFrameMap(input.durationSeconds, action, aspectRatio), input.dialogue, input.characterContext, input.emotionCues ?? false);
|
|
903
|
+
return withGridGuard([
|
|
904
|
+
`SCENE & MOOD: ${duration} ${genreStyle.formatTone} at ${aspectRatio}. ${cleanSentence(input.brief?.intent ?? input.scene.description)}.`,
|
|
905
|
+
'',
|
|
906
|
+
frameMapBlock(frameMap),
|
|
907
|
+
'',
|
|
908
|
+
subjectLockBlock(subjectLockEntriesFromContext(input)),
|
|
909
|
+
positionalLine,
|
|
910
|
+
identityLockLine,
|
|
911
|
+
'',
|
|
912
|
+
crossFrameBlock(),
|
|
913
|
+
'',
|
|
914
|
+
timecodedMovementBlock(input.durationSeconds, action, aspectRatio, detail),
|
|
915
|
+
'',
|
|
916
|
+
lastFrameBlock('resolved final beat, clean composition'),
|
|
917
|
+
'',
|
|
918
|
+
`WORLD PLATE: ${input.brief?.title ?? input.scene.description}.`,
|
|
919
|
+
'',
|
|
920
|
+
soundBed,
|
|
921
|
+
'',
|
|
922
|
+
captureRealismLine(profile, detail),
|
|
923
|
+
'',
|
|
924
|
+
`CAMERA CAPTURE: ${genreStyle.gridStyleDescriptors}, ${aspectRatio} held across every shot.${detail === 'rich' ? ` ${richCinematographySuffix(richSuffixOptsFromProfile(profile))}` : ''}`,
|
|
925
|
+
noFaceLine,
|
|
926
|
+
].filter(Boolean).join('\n'));
|
|
927
|
+
}
|
|
928
|
+
/**
|
|
929
|
+
* Render the CAPTURE REALISM block from the resolved cinema profile.
|
|
930
|
+
* - no profile (legacy callers) → today's `captureRealismBlock({}, detail)`.
|
|
931
|
+
* - realism off → a single line stating capture realism is dialled off.
|
|
932
|
+
* - phone capture register → the Joey 2.0 phone-capture (UGC) block.
|
|
933
|
+
* - cinema capture register → the anti-plastic capture-realism block with the
|
|
934
|
+
* profile's haze/wet knobs.
|
|
935
|
+
*/
|
|
936
|
+
function captureRealismLine(profile, detail) {
|
|
937
|
+
if (!profile) {
|
|
938
|
+
return `CAPTURE REALISM: ${captureRealismBlock({}, detail)}`;
|
|
939
|
+
}
|
|
940
|
+
if (!profile.realism) {
|
|
941
|
+
return 'CAPTURE REALISM: realism dialled off — render the scene without the anti-plastic capture-realism treatment.';
|
|
942
|
+
}
|
|
943
|
+
if (profile.captureRegister === 'phone') {
|
|
944
|
+
return `CAPTURE REALISM: ${phoneCaptureBlock({}, detail)}`;
|
|
945
|
+
}
|
|
946
|
+
return `CAPTURE REALISM: ${captureRealismBlock({ haze: profile.haze, ...(profile.wet ? { wet: true } : {}) }, detail)}`;
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* Build the {@link richCinematographySuffix} opts bag from the resolved profile.
|
|
950
|
+
* No profile (legacy callers) → `{ realism: {} }`, byte-identical to before.
|
|
951
|
+
*/
|
|
952
|
+
function richSuffixOptsFromProfile(profile) {
|
|
953
|
+
if (!profile) {
|
|
954
|
+
return { realism: {} };
|
|
955
|
+
}
|
|
956
|
+
return {
|
|
957
|
+
realism: profile.realism ? { haze: profile.haze, ...(profile.wet ? { wet: true } : {}) } : false,
|
|
958
|
+
register: profile.register,
|
|
959
|
+
...(profile.lightingId !== undefined ? { lightingId: profile.lightingId } : {}),
|
|
960
|
+
...(profile.gradeId !== undefined ? { gradeId: profile.gradeId } : {}),
|
|
961
|
+
};
|
|
962
|
+
}
|
|
963
|
+
// Above this runtime (seconds) a single Seedance packet is treated as a genuine
|
|
964
|
+
// multi-cut sequence, matching cinema-worldbuilder-pro-2.0's shot-complexity
|
|
965
|
+
// guidance: "4–8 seconds — one strong character action, single locked
|
|
966
|
+
// composition" (one main idea per shot) vs "12–15 seconds — 2–3 simple beats
|
|
967
|
+
// with hard cuts inside the prompt". A 9–10s scene stays a single flowing shot;
|
|
968
|
+
// 11s+ earns the per-shot hard-cut Movement form.
|
|
969
|
+
const MULTI_CUT_DURATION_THRESHOLD_SECONDS = 10;
|
|
970
|
+
// TIMECODED MOVEMENT block (Joey discipline): the Movement block carries per-beat
|
|
971
|
+
// timestamps inline. The beats are sourced from the SAME three-beat timeline split
|
|
972
|
+
// as the FRAME MAP (threeBeatFrameMap → 0:00 / d÷3 / 2d÷3 / d) so the two blocks
|
|
973
|
+
// stay aligned, and the camera move per beat reuses cameraSpec(RICH_CAMERA_MOVE,
|
|
974
|
+
// detail) so detail (terse/standard/rich) still governs quantified-token emission.
|
|
975
|
+
//
|
|
976
|
+
// The FORM depends on genuine multi-shot intent so the packet does not contradict
|
|
977
|
+
// itself (cinema-worldbuilder-pro-2.0 Universal Rule #6 reserves the inline
|
|
978
|
+
// per-shot "Hard cut to" form "for any multi-cut sequence"; Rule #21 is "one main
|
|
979
|
+
// idea per shot"):
|
|
980
|
+
// - SINGLE-SHOT (≤ MULTI_CUT_DURATION_THRESHOLD_SECONDS): one flowing paragraph
|
|
981
|
+
// with the per-beat timestamps inline and NO "Shot N" / "Hard cut to" labels —
|
|
982
|
+
// matching the skill's single-shot Movement example, which is one continuous
|
|
983
|
+
// evolving take. This is the FRAME MAP's "wide establish → medium develop →
|
|
984
|
+
// resolved close" rendered as one shot, not three cuts.
|
|
985
|
+
// - MULTI-CUT (above the threshold): "Shot 1 (…): … Hard cut to Shot 2 (…): …"
|
|
986
|
+
// per the skill's multi-shot Movement example and cut-trigger rule.
|
|
987
|
+
// Pure/deterministic — no Date, no Math.random, no I/O.
|
|
988
|
+
function timecodedMovementBlock(durationSeconds, action, aspectRatio, detail) {
|
|
989
|
+
const beats = threeBeatFrameMap(durationSeconds, action, aspectRatio);
|
|
990
|
+
const move = cameraSpec(RICH_CAMERA_MOVE, detail);
|
|
991
|
+
if (durationSeconds > MULTI_CUT_DURATION_THRESHOLD_SECONDS) {
|
|
992
|
+
const shots = beats.map((beat, index) => {
|
|
993
|
+
const lead = index === 0 ? `Shot ${index + 1}` : `Hard cut to Shot ${index + 1}`;
|
|
994
|
+
return `${lead} (${beat.t}): ${move} — ${beat.beat}.`;
|
|
995
|
+
});
|
|
996
|
+
return `MOVEMENT: ${shots.join(' ')}`;
|
|
997
|
+
}
|
|
998
|
+
// Single-shot: one continuous take. Lead the paragraph with the camera move once,
|
|
999
|
+
// then evolve the same locked composition across the inline-timestamped beats.
|
|
1000
|
+
const flow = beats.map((beat) => `${beat.beat} (${beat.t}).`).join(' ');
|
|
1001
|
+
return `MOVEMENT: ${move} held across one continuous take — ${flow}`;
|
|
1002
|
+
}
|
|
1003
|
+
// FRAME MAP rows for the text-driven packet — the original three-beat timeline
|
|
1004
|
+
// (wide establish → medium develop → resolved close), now emitted as ordered
|
|
1005
|
+
// FrameMapEntry rows keyed on the same 0:00 / d÷3 / 2d÷3 / d split.
|
|
1006
|
+
function threeBeatFrameMap(durationSeconds, action, aspectRatio) {
|
|
1007
|
+
const third = Math.floor(durationSeconds / 3);
|
|
1008
|
+
const twoThirds = Math.floor((durationSeconds * 2) / 3);
|
|
1009
|
+
return [
|
|
1010
|
+
{ t: `0:00-${formatSeconds(third)}`, beat: `Wide establishing shot, ${aspectRatio} — ${action}` },
|
|
1011
|
+
{ t: `${formatSeconds(third)}-${formatSeconds(twoThirds)}`, beat: `Medium shot, ${aspectRatio} — preserve subject identity and geography while the action develops` },
|
|
1012
|
+
{ t: `${formatSeconds(twoThirds)}-${formatSeconds(durationSeconds)}`, beat: `Close-up or resolved final frame, ${aspectRatio} — complete the scene beat cleanly` },
|
|
1013
|
+
];
|
|
1014
|
+
}
|
|
1015
|
+
// SUBJECT LOCK entries from the carried character context. Per WS0/WS5, @imageN
|
|
1016
|
+
// slots are emitted as hard binding labels ONLY when POSITIONAL_BINDING is true;
|
|
1017
|
+
// otherwise each character's locked identity description is carried as a
|
|
1018
|
+
// descriptor-only guidance label (visual descriptor, never a proper name as the
|
|
1019
|
+
// binding key). Falls back to a single primary-subject entry when no characters
|
|
1020
|
+
// are present on the scene.
|
|
1021
|
+
function subjectLockEntriesFromContext(input) {
|
|
1022
|
+
const names = input.scene.characters ?? [];
|
|
1023
|
+
if (names.length === 0)
|
|
1024
|
+
return [];
|
|
1025
|
+
return names.map((name, index) => {
|
|
1026
|
+
const ctx = input.characterContext?.get(name);
|
|
1027
|
+
const label = ctx?.description ?? name;
|
|
1028
|
+
const slot = POSITIONAL_BINDING && ctx?.slot ? ctx.slot : `subject ${index + 1}`;
|
|
1029
|
+
return { label, slot };
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
1032
|
+
// Render dialogue speakers through the character-lock discipline: a speaker
|
|
1033
|
+
// whose name matches a stored character is replaced by that character's locked
|
|
1034
|
+
// visual descriptor (exact-name match, same as the scene.characters lookup),
|
|
1035
|
+
// so the packet never carries a proper name. Unmatched speakers (e.g. "She",
|
|
1036
|
+
// "He") pass through unchanged.
|
|
1037
|
+
function dialogueWithDescriptors(dialogue, characterContext) {
|
|
1038
|
+
if (!characterContext)
|
|
1039
|
+
return dialogue;
|
|
1040
|
+
const resolve = (speaker) => characterContext.get(speaker)?.description ?? speaker;
|
|
1041
|
+
return {
|
|
1042
|
+
...dialogue,
|
|
1043
|
+
speaker: resolve(dialogue.speaker),
|
|
1044
|
+
...(dialogue.secondSpeaker
|
|
1045
|
+
? { secondSpeaker: { ...dialogue.secondSpeaker, speaker: resolve(dialogue.secondSpeaker.speaker) } }
|
|
1046
|
+
: {}),
|
|
1047
|
+
};
|
|
1048
|
+
}
|
|
1049
|
+
// Bake spoken dialogue onto the FIRST beat of a frame map — the ai-filmmaking
|
|
1050
|
+
// "bake dialogue into the opening beat" rule. Resolves each speaker to its
|
|
1051
|
+
// locked visual descriptor first (never a proper name), then applies the
|
|
1052
|
+
// says:/replies: notation. Pure; returns `beats` unchanged when there is no
|
|
1053
|
+
// dialogue or no beats, so the default path stays byte-identical. Shared by the
|
|
1054
|
+
// prose FRAME MAP and the machine-readable `timeline` field so the two can't
|
|
1055
|
+
// drift (the timeline previously omitted the dialogue the prose carried).
|
|
1056
|
+
function weaveDialogueIntoFrameMap(beats, dialogue, characterContext, emotionCues) {
|
|
1057
|
+
const opening = beats[0];
|
|
1058
|
+
if (!dialogue || !opening)
|
|
1059
|
+
return beats;
|
|
1060
|
+
const resolved = dialogueWithDescriptors(dialogue, characterContext);
|
|
1061
|
+
const next = beats.slice();
|
|
1062
|
+
next[0] = { ...opening, beat: withDialogue(opening.beat, resolved, { emotionCues }) };
|
|
1063
|
+
return next;
|
|
1064
|
+
}
|
|
1065
|
+
export function characterSheetReferencePrompt(referenceSlots, style, aspectRatio) {
|
|
1066
|
+
return `Create a professional character reference sheet for the attached character using ${referenceSlots.join(', ')} as strong reference, 1:1 similarity, ${style}. Divide the sheet into four vertical columns for a total of eight shots. The top row shows full-body views from head to toe: front, side, three-quarter, and back. No cropping at ankles, knees, or head. The bottom row contains four matching face close-ups, including front and profile views. Use clean neutral studio lighting. Background: even neutral mid-gray seamless, no seam line, no gradient, subject rendered at true natural tone against the neutral gray. Aspect ratio = ${aspectRatio}.`;
|
|
1067
|
+
}
|
|
1068
|
+
export function characterSheetDescriptionPrompt(description, style, aspectRatio) {
|
|
1069
|
+
return `Create a professional character reference sheet for ${description}. Divide the sheet into four vertical columns for a total of eight shots. The top row shows full-body views from head to toe: front, side, three-quarter, and back. No cropping at ankles, knees, or head. The bottom row contains four matching face close-ups, including front and profile views. Style: ${style}. Use clean neutral studio lighting, no scene-specific lighting. Background: even neutral mid-gray seamless, no seam line, no gradient, subject rendered at true natural tone against the neutral gray. Aspect ratio = ${aspectRatio}.`;
|
|
1070
|
+
}
|
|
1071
|
+
export function characterSheetSixPanelPrompt(description, style, aspectRatio) {
|
|
1072
|
+
return [
|
|
1073
|
+
`A 6-panel character reference sheet arranged as a 3-column by 2-row grid in a single ${aspectRatio} frame, thin clean white gutters between panels.`,
|
|
1074
|
+
`Each panel shows the same single character — ${description}.`,
|
|
1075
|
+
'Panel 1 (top-left): full body front. Panel 2 (top-center): side profile close headshot, left side. Panel 3 (top-right): full body back.',
|
|
1076
|
+
'Panel 4 (bottom-left): side profile close headshot, right side. Panel 5 (bottom-center): front face close headshot. Panel 6 (bottom-right): detail shot (hands / accessory / held prop).',
|
|
1077
|
+
'Even neutral mid-gray seamless backdrop applied uniformly across all six panels, no seam line, no gradient.',
|
|
1078
|
+
`Style: ${style}. Identical character identity locked across all six panels — same face, skin, hair, wardrobe, accessories, proportions in every cell.`,
|
|
1079
|
+
].join(' ');
|
|
1080
|
+
}
|
|
1081
|
+
function buildPanels(storyboard, panelCount, durationSeconds, cols) {
|
|
1082
|
+
const scenes = storyboard.scenes.length > 0 ? storyboard.scenes : [{
|
|
1083
|
+
sceneIndex: 0,
|
|
1084
|
+
description: 'Opening visual beat',
|
|
1085
|
+
}];
|
|
1086
|
+
return Array.from({ length: panelCount }, (_, index) => {
|
|
1087
|
+
// Map each panel onto a scene proportionally so N panels spread across the
|
|
1088
|
+
// available scenes instead of cycling 1:1.
|
|
1089
|
+
const scene = scenes[Math.min(Math.floor((index / panelCount) * scenes.length), scenes.length - 1)];
|
|
1090
|
+
const row = Math.floor(index / cols) + 1;
|
|
1091
|
+
const col = (index % cols) + 1;
|
|
1092
|
+
return {
|
|
1093
|
+
panel: index + 1,
|
|
1094
|
+
position: `row ${row}, col ${col}`,
|
|
1095
|
+
timecode: panelTimecode(index, panelCount, durationSeconds),
|
|
1096
|
+
beat: shortBeat(scene.description, index, scenes.length),
|
|
1097
|
+
cam: cameraLine(index),
|
|
1098
|
+
move: moveLine(index),
|
|
1099
|
+
mood: actBeat(index, panelCount),
|
|
1100
|
+
};
|
|
1101
|
+
});
|
|
1102
|
+
}
|
|
1103
|
+
// Split totalSeconds evenly across panelCount panels → [MM:SS - MM:SS] per panel.
|
|
1104
|
+
function panelTimecode(index, panelCount, totalSeconds) {
|
|
1105
|
+
const start = Math.round((index / panelCount) * totalSeconds);
|
|
1106
|
+
const end = Math.round(((index + 1) / panelCount) * totalSeconds);
|
|
1107
|
+
const fmt = (s) => `${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;
|
|
1108
|
+
return `[${fmt(start)} - ${fmt(end)}]`;
|
|
1109
|
+
}
|
|
1110
|
+
// Padding verbs for panels beyond the scene count — vary the phrasing per
|
|
1111
|
+
// padding-step so a long sheet over few scenes reads as a developing sequence
|
|
1112
|
+
// ("Hold on …", "Push closer on …") instead of the same "Resolved echo of …"
|
|
1113
|
+
// line repeated down the page.
|
|
1114
|
+
const BEAT_DEVELOPMENTS = ['Hold on', 'Push closer on', 'Linger on', 'Resolve on'];
|
|
1115
|
+
function shortBeat(value, index, sceneCount) {
|
|
1116
|
+
const cleaned = cleanSentence(value).split(/\s+/).slice(0, 12).join(' ');
|
|
1117
|
+
if (index >= sceneCount) {
|
|
1118
|
+
const develop = BEAT_DEVELOPMENTS[(index - sceneCount) % BEAT_DEVELOPMENTS.length];
|
|
1119
|
+
return `${develop} ${cleaned.toLowerCase()}`;
|
|
1120
|
+
}
|
|
1121
|
+
return cleaned;
|
|
1122
|
+
}
|
|
1123
|
+
const CAMERA_VOCAB = [
|
|
1124
|
+
'WIDE. LOW TRACK',
|
|
1125
|
+
'MEDIUM. WHIP PAN',
|
|
1126
|
+
'CLOSE. STATIC',
|
|
1127
|
+
'OVER SHOULDER. PUSH',
|
|
1128
|
+
'WIDE. SLOW ORBIT',
|
|
1129
|
+
'MEDIUM CLOSE. HANDHELD',
|
|
1130
|
+
'LOW ANGLE. PUSH IN',
|
|
1131
|
+
'PROFILE. TRACK',
|
|
1132
|
+
'CLOSE. SOFT HOLD',
|
|
1133
|
+
'HIGH ANGLE. CRANE DOWN',
|
|
1134
|
+
'MACRO. RACK FOCUS',
|
|
1135
|
+
'DUTCH. SNAP ZOOM',
|
|
1136
|
+
];
|
|
1137
|
+
// Never repeat a framing in consecutive panels (skill: vary shot types).
|
|
1138
|
+
function cameraLine(index) {
|
|
1139
|
+
return CAMERA_VOCAB[index % CAMERA_VOCAB.length];
|
|
1140
|
+
}
|
|
1141
|
+
// Camera-movement slugs for the MOVE annotation line. Previously this echoed the
|
|
1142
|
+
// scene DESCRIPTION (the beat text) into MOVE — so the strip read e.g.
|
|
1143
|
+
// "MOVE: THE DHUAAN CANDLE JAR ON DARK SLATE" instead of an actual move. CAM
|
|
1144
|
+
// already carries the shot/framing; MOVE is the distinct camera-motion slug.
|
|
1145
|
+
const MOVE_VOCAB = [
|
|
1146
|
+
'SLOW PUSH-IN',
|
|
1147
|
+
'LOCKED',
|
|
1148
|
+
'DOLLY IN',
|
|
1149
|
+
'CRANE DOWN',
|
|
1150
|
+
'HANDHELD DRIFT',
|
|
1151
|
+
'SLOW ORBIT',
|
|
1152
|
+
'TRACK WITH SUBJECT',
|
|
1153
|
+
'TILT UP',
|
|
1154
|
+
'PULL BACK',
|
|
1155
|
+
'RACK FOCUS',
|
|
1156
|
+
'WHIP PAN',
|
|
1157
|
+
'STATIC HOLD',
|
|
1158
|
+
];
|
|
1159
|
+
function moveLine(index) {
|
|
1160
|
+
return MOVE_VOCAB[index % MOVE_VOCAB.length];
|
|
1161
|
+
}
|
|
1162
|
+
// Three-act emotional progression across the panels (storyboard-prompt-builder):
|
|
1163
|
+
// setup -> inciting -> rising tension -> climax -> denouement.
|
|
1164
|
+
function actBeat(index, panelCount) {
|
|
1165
|
+
const p = (index + 1) / panelCount;
|
|
1166
|
+
if (p <= 0.2)
|
|
1167
|
+
return 'SETUP. ESTABLISH.';
|
|
1168
|
+
if (p <= 0.4)
|
|
1169
|
+
return 'INCITING. SHIFT.';
|
|
1170
|
+
if (p <= 0.7)
|
|
1171
|
+
return 'RISING. BUILD TENSION.';
|
|
1172
|
+
if (p <= 0.87)
|
|
1173
|
+
return 'CLIMAX. PEAK INTENSITY.';
|
|
1174
|
+
return 'DENOUEMENT. RESOLVE.';
|
|
1175
|
+
}
|
|
1176
|
+
function characterLine(prompt) {
|
|
1177
|
+
if (prompt.mode === 'reference-image')
|
|
1178
|
+
return `Locked by ${prompt.referenceSlots.join(', ')}. Keep face, build, wardrobe, and props identical.`;
|
|
1179
|
+
return prompt.promptText
|
|
1180
|
+
.replace(/^Create a professional character reference sheet for\s+/i, '')
|
|
1181
|
+
.split('. Divide the sheet')[0] ?? prompt.characterName;
|
|
1182
|
+
}
|
|
1183
|
+
function findIdentitySheet(referenceSheets, characterName) {
|
|
1184
|
+
return referenceSheets.sheets.find((sheet) => (sheet.type === 'identity'
|
|
1185
|
+
&& (sheet.characterName === characterName || sheet.name === characterName)));
|
|
1186
|
+
}
|
|
1187
|
+
function firstCharacterReference(character, sheet) {
|
|
1188
|
+
if (character.referenceAssets[0])
|
|
1189
|
+
return character.referenceAssets[0];
|
|
1190
|
+
const pathRef = sheet?.references.find((reference) => 'path' in reference);
|
|
1191
|
+
return pathRef && 'path' in pathRef ? pathRef.path : null;
|
|
1192
|
+
}
|
|
1193
|
+
async function readOptionalArtifact(workspace, name) {
|
|
1194
|
+
const path = artifactPathFor(workspace, name);
|
|
1195
|
+
if (!existsSync(path))
|
|
1196
|
+
return undefined;
|
|
1197
|
+
return JSON.parse(await readFile(path, 'utf-8'));
|
|
1198
|
+
}
|
|
1199
|
+
function nextSlot(index) {
|
|
1200
|
+
return `@image${index + 1}`;
|
|
1201
|
+
}
|
|
1202
|
+
function cleanSentence(value) {
|
|
1203
|
+
return value
|
|
1204
|
+
.replace(/\s+/g, ' ')
|
|
1205
|
+
.replace(/\[[^\]]+\]/g, '')
|
|
1206
|
+
.trim()
|
|
1207
|
+
.replace(/[.。]+$/g, '');
|
|
1208
|
+
}
|
|
1209
|
+
function formatSeconds(seconds) {
|
|
1210
|
+
return `0:${String(seconds).padStart(2, '0')}`;
|
|
1211
|
+
}
|
|
1212
|
+
//# sourceMappingURL=filmmaking-prompts.js.map
|