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,822 @@
|
|
|
1
|
+
import { PORTAL_CLIENT_JS, PORTAL_CSS, PORTAL_EDITOR_JS, PORTAL_JS, PORTAL_REVIEW_TABS_JS } from './shared-assets.js';
|
|
2
|
+
import { resolvePreviewPortalTemplate } from './templates.js';
|
|
3
|
+
export function renderPreviewPortalHtml(options) {
|
|
4
|
+
if (options.surface === 'compare') {
|
|
5
|
+
return renderComparePortalHtml(options);
|
|
6
|
+
}
|
|
7
|
+
const mode = modeForSurface(options.surface);
|
|
8
|
+
const { project } = options;
|
|
9
|
+
const template = resolvePreviewPortalTemplate(project.template);
|
|
10
|
+
// Size the media cards + hero to the project's aspect ratio (CSS keys off this
|
|
11
|
+
// attribute) so vertical 9:16 clips render portrait, not letterboxed landscape.
|
|
12
|
+
const aspect = aspectForProject(project);
|
|
13
|
+
const final = project.assets.find((asset) => asset.section === 'final' && asset.kind === 'video');
|
|
14
|
+
const stats = [
|
|
15
|
+
[project.run.runId, 'run'],
|
|
16
|
+
[template.name, 'template'],
|
|
17
|
+
[String(project.assets.filter((asset) => asset.kind === 'video').length), 'videos'],
|
|
18
|
+
[String(project.assets.filter((asset) => asset.kind === 'image').length), 'images'],
|
|
19
|
+
];
|
|
20
|
+
const review = isReviewSurface(options.surface);
|
|
21
|
+
const reviewModeAttr = review ? ` data-review-mode="${options.surface === 'client-review' ? 'client' : 'editor'}"` : '';
|
|
22
|
+
const sections = `${final ? renderHeroVideo(final, template) : ''}${renderTemplateSections(project, template, options.surface)}${options.surface === 'preview' ? renderBrandBook(project) : ''}`;
|
|
23
|
+
// Review surface = one feedback page with Decide|Compare tabs + an editor↔client
|
|
24
|
+
// mode toggle. Preview stays a clean, controls-free deliverable.
|
|
25
|
+
const content = review
|
|
26
|
+
? `${renderReviewBar(options.surface)}<div class="tab-panel" data-tab="decide">${sections}</div><div class="tab-panel" data-tab="compare" hidden>${renderCompareTab(project)}</div>`
|
|
27
|
+
: sections;
|
|
28
|
+
return `<!doctype html>
|
|
29
|
+
<html lang="en">
|
|
30
|
+
<head>
|
|
31
|
+
<meta charset="utf-8">
|
|
32
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
33
|
+
<link rel="icon" href="data:,">
|
|
34
|
+
<title>${esc(project.title)}</title>
|
|
35
|
+
<style>${PORTAL_CSS}</style>${renderBrandTheme(project, options.surface)}
|
|
36
|
+
</head>
|
|
37
|
+
<body data-mode="${mode}" data-aspect="${esc(aspect)}"${reviewModeAttr}>
|
|
38
|
+
${options.surface === 'preview' ? '<div class="grain" aria-hidden="true"></div>' : ''}<nav class="toc" id="toc" aria-label="Sections"></nav>
|
|
39
|
+
<header class="hero">
|
|
40
|
+
${renderBrandBar(project, options.surface)}<div class="eyebrow">${labelForSurface(options.surface)} · ${esc(template.heroLabel)}${renderStatusChip(project, options.surface)}</div>
|
|
41
|
+
<h1>${esc(project.title)}</h1>
|
|
42
|
+
${renderHeroTagline(project, options.surface)}${project.summary ? `<p class="sub">${esc(project.summary)}</p>` : ''}
|
|
43
|
+
<div class="stats">${stats.map(([value, label]) => `<div class="stat"><div class="v">${esc(value)}</div><div class="l">${esc(label)}</div></div>`).join('')}</div>
|
|
44
|
+
${renderSoundtrackPlayer(options.surface, project)}
|
|
45
|
+
</header>
|
|
46
|
+
${options.surface === 'preview' ? renderFilterChips() : ''}${content}
|
|
47
|
+
${renderHud(options.surface)}
|
|
48
|
+
${renderShortcutsHelp()}
|
|
49
|
+
<footer>${project.brand ? `${esc(project.brand.brandName)} · produced with videoclaw · ` : 'Generated by videoclaw · '}${esc(project.slug)} · ${esc(fmtDate(project.run.updatedAt))}</footer>
|
|
50
|
+
<script>${PORTAL_JS}${scriptForSurface(options.surface)}</script>
|
|
51
|
+
</body>
|
|
52
|
+
</html>
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
/** The feedback "family" — all render the single tabbed Review surface. */
|
|
56
|
+
function isReviewSurface(surface) {
|
|
57
|
+
return surface === 'edit' || surface === 'review' || surface === 'client-review';
|
|
58
|
+
}
|
|
59
|
+
/** Tab bar (Decide | Compare) + editor↔client mode toggle for the Review surface. */
|
|
60
|
+
function renderReviewBar(surface) {
|
|
61
|
+
const client = surface === 'client-review';
|
|
62
|
+
return `<div class="review-bar">
|
|
63
|
+
<button type="button" class="review-tab" data-tab="decide" aria-selected="true">Decide</button>
|
|
64
|
+
<button type="button" class="review-tab" data-tab="compare" aria-selected="false">Compare</button>
|
|
65
|
+
<div class="review-mode"><span>Feedback as</span>
|
|
66
|
+
<button type="button" data-mode="editor" aria-pressed="${client ? 'false' : 'true'}">Me ↔ Claude</button>
|
|
67
|
+
<button type="button" data-mode="client" aria-pressed="${client ? 'true' : 'false'}">Client</button>
|
|
68
|
+
</div>
|
|
69
|
+
</div>`;
|
|
70
|
+
}
|
|
71
|
+
/** The Compare tab: run/version comparison for this project (empty-state friendly). */
|
|
72
|
+
function renderCompareTab(project) {
|
|
73
|
+
return `<section id="compare" data-toc="Compare">
|
|
74
|
+
<div class="section-head"><h2>Compare</h2><div class="section-title">Run Comparison</div><div class="section-sub">Compare finals across this project's runs.</div></div>
|
|
75
|
+
<div class="grid">${renderCompareCard(project.projectDir, project)}</div>
|
|
76
|
+
</section>`;
|
|
77
|
+
}
|
|
78
|
+
export function renderPreviewPortalIndexHtml(options) {
|
|
79
|
+
const generatedAt = options.generatedAt ?? new Date().toISOString();
|
|
80
|
+
const title = options.title ?? (options.client ? `${options.client} Review Index` : 'Videoclaw Review Index');
|
|
81
|
+
const stats = [
|
|
82
|
+
[String(options.projects.length), 'projects'],
|
|
83
|
+
[String(options.projects.filter((project) => project.status === 'published').length), 'published'],
|
|
84
|
+
[String(options.projects.filter((project) => project.status.includes('review')).length), 'in review'],
|
|
85
|
+
[String(options.projects.reduce((sum, project) => sum + project.assets.length, 0)), 'assets'],
|
|
86
|
+
];
|
|
87
|
+
return `<!doctype html>
|
|
88
|
+
<html lang="en">
|
|
89
|
+
<head>
|
|
90
|
+
<meta charset="utf-8">
|
|
91
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
92
|
+
<link rel="icon" href="data:,">
|
|
93
|
+
<title>${esc(title)}</title>
|
|
94
|
+
<style>${PORTAL_CSS}</style>
|
|
95
|
+
</head>
|
|
96
|
+
<body data-mode="preview">
|
|
97
|
+
<nav class="toc" id="toc" aria-label="Sections"></nav>
|
|
98
|
+
<header class="hero">
|
|
99
|
+
<div class="eyebrow">client portal · ${options.client ? esc(options.client) : 'all clients'}</div>
|
|
100
|
+
<h1>${esc(title)}</h1>
|
|
101
|
+
<p class="sub">Review, compare, and deliver generated video projects from one consistent index.</p>
|
|
102
|
+
<div class="stats">${stats.map(([value, label]) => `<div class="stat"><div class="v">${esc(value)}</div><div class="l">${esc(label)}</div></div>`).join('')}</div>
|
|
103
|
+
</header>
|
|
104
|
+
<section id="projects" data-toc="Projects">
|
|
105
|
+
<div class="section-head"><h2>Projects</h2><div class="section-title">Project Library</div><div class="section-sub">${options.projects.length} project${options.projects.length === 1 ? '' : 's'} available.</div></div>
|
|
106
|
+
<div class="grid">
|
|
107
|
+
${options.projects.map((project) => renderProjectIndexCard(project, {
|
|
108
|
+
linkPrefix: options.linkPrefix ?? '',
|
|
109
|
+
linkMode: options.linkMode ?? 'local',
|
|
110
|
+
client: options.client ?? null,
|
|
111
|
+
})).join('') || '<div class="card"><div class="meta"><div class="title">No projects found</div><div class="who">Generate a project portal first, then rebuild this index.</div></div></div>'}
|
|
112
|
+
</div>
|
|
113
|
+
</section>
|
|
114
|
+
<footer>Generated by videoclaw · ${esc(generatedAt)}</footer>
|
|
115
|
+
<script>${PORTAL_JS}</script>
|
|
116
|
+
</body>
|
|
117
|
+
</html>
|
|
118
|
+
`;
|
|
119
|
+
}
|
|
120
|
+
function renderComparePortalHtml(options) {
|
|
121
|
+
const projects = options.compareProjects?.length ? options.compareProjects : [options.project];
|
|
122
|
+
const title = `${options.project.title} Compare`;
|
|
123
|
+
const stats = [
|
|
124
|
+
[String(projects.length), 'versions'],
|
|
125
|
+
[String(projects.filter((project) => project.assets.some((asset) => asset.section === 'final' && asset.kind === 'video')).length), 'finals'],
|
|
126
|
+
[String(projects.reduce((sum, project) => sum + project.assets.filter((asset) => asset.kind === 'video').length, 0)), 'videos'],
|
|
127
|
+
[String(projects.reduce((sum, project) => sum + project.assets.filter((asset) => asset.kind === 'image').length, 0)), 'images'],
|
|
128
|
+
];
|
|
129
|
+
return `<!doctype html>
|
|
130
|
+
<html lang="en">
|
|
131
|
+
<head>
|
|
132
|
+
<meta charset="utf-8">
|
|
133
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
134
|
+
<link rel="icon" href="data:,">
|
|
135
|
+
<title>${esc(title)}</title>
|
|
136
|
+
<style>${PORTAL_CSS}</style>
|
|
137
|
+
</head>
|
|
138
|
+
<body data-mode="compare">
|
|
139
|
+
<nav class="toc" id="toc" aria-label="Sections"></nav>
|
|
140
|
+
<header class="hero">
|
|
141
|
+
<div class="eyebrow">compare · ${esc(options.project.template)}</div>
|
|
142
|
+
<h1>${esc(title)}</h1>
|
|
143
|
+
${options.project.summary ? `<p class="sub">${esc(options.project.summary)}</p>` : ''}
|
|
144
|
+
<div class="stats">${stats.map(([value, label]) => `<div class="stat"><div class="v">${esc(value)}</div><div class="l">${esc(label)}</div></div>`).join('')}</div>
|
|
145
|
+
</header>
|
|
146
|
+
<section id="versions" data-toc="Versions">
|
|
147
|
+
<div class="section-head"><h2>Versions</h2><div class="section-title">Run Comparison</div><div class="section-sub">Compare finals, run metadata, and links for each generated version.</div></div>
|
|
148
|
+
<div class="grid">
|
|
149
|
+
${projects.map((project) => renderCompareCard(options.project.projectDir, project)).join('')}
|
|
150
|
+
</div>
|
|
151
|
+
</section>
|
|
152
|
+
<footer>Generated by videoclaw · ${esc(options.project.slug)} · ${esc(fmtDate(options.project.run.updatedAt))}</footer>
|
|
153
|
+
<script>${PORTAL_JS}</script>
|
|
154
|
+
</body>
|
|
155
|
+
</html>
|
|
156
|
+
`;
|
|
157
|
+
}
|
|
158
|
+
function renderSoundtrackPlayer(surface, project) {
|
|
159
|
+
// Soundtrack player is part of the polished final showcase only. When no
|
|
160
|
+
// soundtrack was discovered, emit nothing (no broken/empty <audio> element).
|
|
161
|
+
if (surface !== 'preview' || !project.soundtrack)
|
|
162
|
+
return '';
|
|
163
|
+
const { path, label, candidates } = project.soundtrack;
|
|
164
|
+
// A/B candidates: render one labelled player per backend so a human can
|
|
165
|
+
// compare/pick. The selected candidate is flagged as the headline.
|
|
166
|
+
if (candidates && candidates.length > 1) {
|
|
167
|
+
const rows = candidates
|
|
168
|
+
.map((c) => `<div class="soundtrack-player">
|
|
169
|
+
<span class="soundtrack-label">${esc(c.label)}${c.selected ? ' · selected' : ''}</span>
|
|
170
|
+
<audio controls preload="none" data-downloadable src="${escAttr(c.path)}"></audio>
|
|
171
|
+
</div>`)
|
|
172
|
+
.join('\n');
|
|
173
|
+
return rows;
|
|
174
|
+
}
|
|
175
|
+
return `<div class="soundtrack-player">
|
|
176
|
+
<span class="soundtrack-label">${esc(label)}</span>
|
|
177
|
+
<audio controls preload="none" data-downloadable src="${escAttr(path)}"></audio>
|
|
178
|
+
</div>`;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Per-ASSET aspect attributes: class for the orientation bucket (drives the
|
|
182
|
+
* hero/card max-height CSS) plus an exact inline aspect-ratio when dimensions
|
|
183
|
+
* were probed. A 9:16 deliverable must render in a portrait card even inside a
|
|
184
|
+
* 16:9 project — never letterboxed in a landscape box.
|
|
185
|
+
*/
|
|
186
|
+
function mediaAspectAttrs(asset) {
|
|
187
|
+
const cls = asset.orientation ? ` class="orient-${asset.orientation}"` : '';
|
|
188
|
+
const style = asset.width && asset.height ? ` style="aspect-ratio:${asset.width}/${asset.height}"` : '';
|
|
189
|
+
return `${cls}${style}`;
|
|
190
|
+
}
|
|
191
|
+
function renderHeroVideo(asset, template) {
|
|
192
|
+
return `<div class="hero-video">
|
|
193
|
+
<video${mediaAspectAttrs(asset)} controls preload="metadata" playsinline data-downloadable src="${escAttr(asset.path)}"></video>
|
|
194
|
+
<div class="final-meta"><span class="num">${esc(template.primaryAssetLabel)}</span><span>${esc(asset.path)}</span></div>
|
|
195
|
+
</div>`;
|
|
196
|
+
}
|
|
197
|
+
function renderProjectIndexCard(project, options) {
|
|
198
|
+
const final = project.assets.find((asset) => asset.section === 'final' && asset.kind === 'video');
|
|
199
|
+
const poster = project.assets.find((asset) => asset.kind === 'image');
|
|
200
|
+
const base = projectIndexBase(project, options);
|
|
201
|
+
const media = final
|
|
202
|
+
? `<video${mediaAspectAttrs(final)} controls preload="metadata" data-downloadable src="${escAttr(base)}/${escAttr(final.path)}"></video>`
|
|
203
|
+
: poster
|
|
204
|
+
? `<img${mediaAspectAttrs(poster)} data-downloadable data-lightbox-group="projects" data-lb-caption="${escAttr(project.title)}" src="${escAttr(base)}/${escAttr(poster.path)}" alt="${escAttr(project.title)}">`
|
|
205
|
+
: '';
|
|
206
|
+
return `<div class="card" data-card-kind="project" data-card-id="${escAttr(project.slug)}">
|
|
207
|
+
${media}
|
|
208
|
+
<div class="meta"><div class="num">${esc(project.status)}</div><div class="title">${esc(project.title)}</div><div class="who">${esc(project.slug)} · ${esc(project.template)} · ${esc(fmtDate(project.run.updatedAt))}</div>
|
|
209
|
+
<div class="who"><a href="${escAttr(base)}/review.html">Review</a> · <a href="${escAttr(base)}/preview.html">Preview</a></div>
|
|
210
|
+
</div>
|
|
211
|
+
</div>`;
|
|
212
|
+
}
|
|
213
|
+
function projectIndexBase(project, options) {
|
|
214
|
+
if (options.linkMode === 'local')
|
|
215
|
+
return `${options.linkPrefix}${project.slug}`;
|
|
216
|
+
const runPath = `${project.slug}/runs/${project.run.runId}`;
|
|
217
|
+
if (options.client)
|
|
218
|
+
return `${options.linkPrefix}${runPath}`;
|
|
219
|
+
return `${options.linkPrefix}clients/${slugify(project.client ?? 'unknown')}/${runPath}`;
|
|
220
|
+
}
|
|
221
|
+
function renderCompareCard(baseProjectDir, project) {
|
|
222
|
+
const final = project.assets.find((asset) => asset.section === 'final' && asset.kind === 'video');
|
|
223
|
+
const prefix = relativePrefix(baseProjectDir, project.projectDir);
|
|
224
|
+
const media = final
|
|
225
|
+
? `<video${mediaAspectAttrs(final)} controls preload="metadata" data-downloadable src="${escAttr(prefix)}${escAttr(final.path)}"></video>`
|
|
226
|
+
: '<div class="meta"><code>No final video discovered</code></div>';
|
|
227
|
+
return `<div class="card" data-card-kind="run" data-card-id="${escAttr(project.slug)}-${escAttr(project.run.runId)}">
|
|
228
|
+
${media}
|
|
229
|
+
<div class="meta"><div class="num">${esc(project.run.status)}</div><div class="title">${esc(project.title)}</div><div class="who">${esc(project.slug)} · ${esc(project.run.runId)} · ${esc(project.template)}</div>
|
|
230
|
+
<div class="who">Updated ${esc(fmtDate(project.run.updatedAt))}</div>
|
|
231
|
+
<div class="who"><a href="${escAttr(prefix)}review.html">Review</a> · <a href="${escAttr(prefix)}preview.html">Preview</a></div>
|
|
232
|
+
</div>
|
|
233
|
+
</div>`;
|
|
234
|
+
}
|
|
235
|
+
function relativePrefix(baseProjectDir, targetProjectDir) {
|
|
236
|
+
if (baseProjectDir === targetProjectDir)
|
|
237
|
+
return '';
|
|
238
|
+
const base = baseProjectDir.split('/').filter(Boolean);
|
|
239
|
+
const target = targetProjectDir.split('/').filter(Boolean);
|
|
240
|
+
while (base.length && target.length && base[0] === target[0]) {
|
|
241
|
+
base.shift();
|
|
242
|
+
target.shift();
|
|
243
|
+
}
|
|
244
|
+
return `${base.map(() => '..').join('/')}/${target.join('/')}/`.replace(/^\//, '');
|
|
245
|
+
}
|
|
246
|
+
function renderCardsSection(id, title, assets, surface) {
|
|
247
|
+
if (assets.length === 0)
|
|
248
|
+
return '';
|
|
249
|
+
return `<section id="${id}" data-toc="${escAttr(title)}">
|
|
250
|
+
<div class="section-head"><h2>${esc(title)}</h2><div class="section-title">${esc(title)}</div><div class="section-sub">${assets.length} item${assets.length === 1 ? '' : 's'} discovered.</div></div>
|
|
251
|
+
<div class="grid">
|
|
252
|
+
${assets.map((asset) => renderAssetCard(asset, surface)).join('')}
|
|
253
|
+
</div>
|
|
254
|
+
</section>`;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Production-sheet sections that every template should surface (Cast + the
|
|
258
|
+
* scene/character/candidate/story sheet dirs). They are spliced in right after
|
|
259
|
+
* the storyboard so they read as "what we built" before the raw clip/image
|
|
260
|
+
* grids, without editing all six template section orders. Each renders only when
|
|
261
|
+
* it has content, so a template that already lists one keeps a single copy.
|
|
262
|
+
*/
|
|
263
|
+
const PRODUCTION_SHEET_SECTIONS = ['cast', 'keyframes', 'reference-sheets', 'scene-candidates', 'story-sheets'];
|
|
264
|
+
function effectiveSectionOrder(template) {
|
|
265
|
+
const order = [...template.sectionOrder];
|
|
266
|
+
const missing = PRODUCTION_SHEET_SECTIONS.filter((section) => !order.includes(section));
|
|
267
|
+
if (missing.length === 0)
|
|
268
|
+
return order;
|
|
269
|
+
const afterStoryboard = order.indexOf('storyboard');
|
|
270
|
+
const insertAt = afterStoryboard >= 0 ? afterStoryboard + 1 : Math.min(order.indexOf('brief') + 1 || 0, order.length);
|
|
271
|
+
order.splice(insertAt, 0, ...missing);
|
|
272
|
+
return order;
|
|
273
|
+
}
|
|
274
|
+
function renderTemplateSections(project, template, surface) {
|
|
275
|
+
// When the storyboard section renders the scene keyframes, suppress those same
|
|
276
|
+
// sceneIndex'd keyframes from the generic generation-inputs grid (no duplicates).
|
|
277
|
+
const storyboardSceneIndexes = project.storyboard
|
|
278
|
+
? new Set(project.storyboard.scenes.map((scene) => scene.sceneIndex))
|
|
279
|
+
: null;
|
|
280
|
+
return effectiveSectionOrder(template)
|
|
281
|
+
.map((section) => {
|
|
282
|
+
if (section === 'brief')
|
|
283
|
+
return renderBriefSection(project);
|
|
284
|
+
if (section === 'storyboard')
|
|
285
|
+
return renderStoryboardSection(project, surface);
|
|
286
|
+
if (section === 'cast')
|
|
287
|
+
return renderCastSection(project, surface);
|
|
288
|
+
let assets = project.assets.filter((asset) => asset.section === section);
|
|
289
|
+
if (section === 'generation-inputs' && storyboardSceneIndexes) {
|
|
290
|
+
assets = assets.filter((asset) => asset.sceneIndex === undefined || !storyboardSceneIndexes.has(asset.sceneIndex));
|
|
291
|
+
}
|
|
292
|
+
return renderCardsSection(sectionId(section), template.sectionLabels[section] ?? titleFromSection(section), assets, surface);
|
|
293
|
+
})
|
|
294
|
+
.join('');
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* The Cast section: one card per locked identity (Flow Character or reference
|
|
298
|
+
* character), with a matched still or a monogram, a source/role badge, and the
|
|
299
|
+
* stable id. Lets the client see who/what is identity-locked across the cut.
|
|
300
|
+
* Renders nothing when no cast is registered.
|
|
301
|
+
*/
|
|
302
|
+
function renderCastSection(project, surface) {
|
|
303
|
+
const cast = project.cast;
|
|
304
|
+
if (!cast || cast.length === 0)
|
|
305
|
+
return '';
|
|
306
|
+
const cards = cast
|
|
307
|
+
.map((member) => {
|
|
308
|
+
const media = member.stillPath
|
|
309
|
+
? `<img data-downloadable data-lightbox-group="cast" data-lb-caption="${escAttr(member.name)}" src="${escAttr(member.stillPath)}" alt="${escAttr(member.name)}">`
|
|
310
|
+
: `<div class="cast-mono" aria-hidden="true">${esc(member.name.slice(0, 1).toUpperCase())}</div>`;
|
|
311
|
+
const badge = member.source === 'flow-character' ? 'Flow Character' : 'Reference';
|
|
312
|
+
const num = member.role ? `${badge} · ${member.role}` : badge;
|
|
313
|
+
return `<div class="card" data-card-kind="cast" data-card-id="cast-${escAttr(slugify(member.name))}" data-media-kind="image">
|
|
314
|
+
${media}
|
|
315
|
+
<div class="meta"><div class="num">${esc(num)}</div><div class="title">${esc(member.name)}</div>${member.ref ? `<div class="who">${esc(member.ref)}</div>` : ''}</div>
|
|
316
|
+
${renderControls(surface)}
|
|
317
|
+
</div>`;
|
|
318
|
+
})
|
|
319
|
+
.join('');
|
|
320
|
+
return `<section id="cast" data-toc="Cast">
|
|
321
|
+
<div class="section-head"><h2>Cast</h2><div class="section-title">Cast & Identity Locks</div><div class="section-sub">${cast.length} locked ${cast.length === 1 ? 'identity' : 'identities'} carried across every shot.</div></div>
|
|
322
|
+
<div class="grid">${cards}</div>
|
|
323
|
+
</section>`;
|
|
324
|
+
}
|
|
325
|
+
function renderBriefSection(project) {
|
|
326
|
+
const brief = project.brief;
|
|
327
|
+
if (!brief)
|
|
328
|
+
return '';
|
|
329
|
+
const meta = brief.metadata ?? {};
|
|
330
|
+
const profile = meta.executionProfile ?? {};
|
|
331
|
+
const chips = [];
|
|
332
|
+
if (typeof meta.platform === 'string')
|
|
333
|
+
chips.push(meta.platform);
|
|
334
|
+
if (typeof profile.aspectRatio === 'string')
|
|
335
|
+
chips.push(profile.aspectRatio);
|
|
336
|
+
if (typeof profile.resolution === 'string')
|
|
337
|
+
chips.push(profile.resolution);
|
|
338
|
+
if (typeof profile.quality === 'string')
|
|
339
|
+
chips.push(profile.quality);
|
|
340
|
+
if (profile.generateAudio === true)
|
|
341
|
+
chips.push('audio on');
|
|
342
|
+
else if (profile.generateAudio === false)
|
|
343
|
+
chips.push('audio off');
|
|
344
|
+
const chipHtml = chips.length ? `<div class="who">${chips.map((chip) => esc(chip)).join(' · ')}</div>` : '';
|
|
345
|
+
return `<section id="brief" data-toc="Brief">
|
|
346
|
+
<div class="section-head"><h2>Brief</h2><div class="section-title">${esc(brief.title)}</div>${chipHtml}</div>
|
|
347
|
+
<div class="grid"><div class="card"><div class="meta"><div class="title">${esc(brief.intent)}</div></div></div></div>
|
|
348
|
+
</section>`;
|
|
349
|
+
}
|
|
350
|
+
function renderStoryboardSection(project, surface) {
|
|
351
|
+
const storyboard = project.storyboard;
|
|
352
|
+
if (!storyboard || storyboard.scenes.length === 0)
|
|
353
|
+
return '';
|
|
354
|
+
const scenes = [...storyboard.scenes].sort((a, b) => a.sceneIndex - b.sceneIndex);
|
|
355
|
+
const cards = scenes
|
|
356
|
+
.map((scene) => {
|
|
357
|
+
const keyframe = project.assets.find((asset) => asset.kind === 'image' && asset.sceneIndex === scene.sceneIndex);
|
|
358
|
+
const sceneLabel = `Scene ${scene.sceneIndex + 1}`;
|
|
359
|
+
const media = keyframe
|
|
360
|
+
? `<img${mediaAspectAttrs(keyframe)} data-downloadable data-lightbox-group="storyboard" data-lb-caption="${escAttr(sceneLabel)}" src="${escAttr(keyframe.path)}" alt="${escAttr(sceneLabel)}">`
|
|
361
|
+
: '<div class="meta"><code>No keyframe yet</code></div>';
|
|
362
|
+
const chips = [];
|
|
363
|
+
if (scene.characters?.length)
|
|
364
|
+
chips.push(...scene.characters);
|
|
365
|
+
if (scene.scenePrompt?.cameraMove)
|
|
366
|
+
chips.push(scene.scenePrompt.cameraMove);
|
|
367
|
+
if (typeof scene.durationSeconds === 'number')
|
|
368
|
+
chips.push(`${scene.durationSeconds}s`);
|
|
369
|
+
const chipHtml = chips.length ? `<div class="who">${chips.map((chip) => esc(chip)).join(' · ')}</div>` : '';
|
|
370
|
+
const dialogue = scene.dialogue ? `<div class="who">“${esc(scene.dialogue)}”</div>` : '';
|
|
371
|
+
return `<div class="card" data-card-kind="scene" data-card-id="storyboard-scene-${scene.sceneIndex}" data-media-kind="image">
|
|
372
|
+
${media}
|
|
373
|
+
<div class="meta"><div class="num">${esc(sceneLabel)}</div><div class="title">${esc(scene.description)}</div>${scene.colorState ? renderColorStateChip(scene.colorState) : ''}${chipHtml}${dialogue}${keyframe?.createdAt ? `<div class="who card-date">keyframe ${esc(fmtDate(keyframe.createdAt))}</div>` : ''}</div>
|
|
374
|
+
${renderSceneContract(scene, project)}
|
|
375
|
+
${renderControls(surface)}
|
|
376
|
+
</div>`;
|
|
377
|
+
})
|
|
378
|
+
.join('');
|
|
379
|
+
return `<section id="storyboard" data-toc="Storyboard">
|
|
380
|
+
<div class="section-head"><h2>Storyboard</h2><div class="section-title">Storyboard</div><div class="section-sub">${scenes.length} scene${scenes.length === 1 ? '' : 's'}.</div></div>
|
|
381
|
+
<div class="grid">
|
|
382
|
+
${cards}
|
|
383
|
+
</div>
|
|
384
|
+
</section>`;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* The per-scene "contract": the exact prompt text that will be submitted to the
|
|
388
|
+
* provider plus the identity-lock reference sheets for the scene's characters.
|
|
389
|
+
* This turns each storyboard card from a thumbnail-and-caption gallery into a
|
|
390
|
+
* "what you will actually get" review surface — the operator sees the submit
|
|
391
|
+
* prompt and the locked references inline, before any spend. Rendered expanded
|
|
392
|
+
* (no click-to-reveal) so the contract is always visible. Returns an empty
|
|
393
|
+
* string when a scene carries neither a prompt nor a matchable reference.
|
|
394
|
+
*/
|
|
395
|
+
function renderSceneContract(scene, project) {
|
|
396
|
+
const prompt = scene.scenePrompt;
|
|
397
|
+
const rows = [];
|
|
398
|
+
// The resolved provider submit text (10-block packet) is the authoritative
|
|
399
|
+
// contract; show it first and in full when present.
|
|
400
|
+
if (scene.renderPrompt)
|
|
401
|
+
rows.push(promptRow('Submit', scene.renderPrompt));
|
|
402
|
+
if (prompt?.imagePrompt)
|
|
403
|
+
rows.push(promptRow('Image', prompt.imagePrompt));
|
|
404
|
+
if (prompt?.animationPrompt)
|
|
405
|
+
rows.push(promptRow('Motion', prompt.animationPrompt));
|
|
406
|
+
if (prompt?.styleFooter)
|
|
407
|
+
rows.push(promptRow('Style', prompt.styleFooter));
|
|
408
|
+
const promptBlock = rows.length
|
|
409
|
+
? `<div class="contract-block"><div class="contract-label">Submit prompt · what the model receives</div>${rows.join('')}</div>`
|
|
410
|
+
: '';
|
|
411
|
+
// Identity-lock references: the character reference sheets discovered for the
|
|
412
|
+
// names this scene casts. A character image can surface either from the
|
|
413
|
+
// characters.json appender (label "<Name> reference") or the generic dir scan
|
|
414
|
+
// (filename-based label/path), so match the slugified character name against
|
|
415
|
+
// both the label and the path. De-duped by path so a character listed twice
|
|
416
|
+
// does not double-render.
|
|
417
|
+
const wantNames = (scene.characters ?? []).map(contractSlug).filter(Boolean);
|
|
418
|
+
const seen = new Set();
|
|
419
|
+
const refs = project.assets.filter((asset) => {
|
|
420
|
+
if (asset.kind !== 'image' || asset.section !== 'characters' || seen.has(asset.path))
|
|
421
|
+
return false;
|
|
422
|
+
const haystacks = [contractSlug(asset.label), contractSlug(asset.path)];
|
|
423
|
+
if (!wantNames.some((name) => haystacks.some((hay) => hay.includes(name))))
|
|
424
|
+
return false;
|
|
425
|
+
seen.add(asset.path);
|
|
426
|
+
return true;
|
|
427
|
+
});
|
|
428
|
+
// Reference-slot contract: which slot locks this scene, ready vs pending, and
|
|
429
|
+
// the bound Asset:// URI for identity. Falls back to the discovered character
|
|
430
|
+
// thumbnails when no resolved slots exist yet.
|
|
431
|
+
const slotRows = (scene.referenceSlots ?? []).map(renderReferenceSlot).join('');
|
|
432
|
+
const thumbs = refs.length
|
|
433
|
+
? `<div class="scene-refs">${refs
|
|
434
|
+
.map((ref) => `<img class="scene-ref" data-downloadable data-lightbox-group="storyboard-refs" data-lb-caption="${escAttr(ref.label)}" src="${escAttr(ref.path)}" alt="${escAttr(ref.label)}">`)
|
|
435
|
+
.join('')}</div>`
|
|
436
|
+
: '';
|
|
437
|
+
const refBlock = slotRows || thumbs
|
|
438
|
+
? `<div class="contract-block"><div class="contract-label">References · identity lock</div>${slotRows ? `<div class="ref-slots">${slotRows}</div>` : ''}${thumbs}</div>`
|
|
439
|
+
: '';
|
|
440
|
+
if (!promptBlock && !refBlock)
|
|
441
|
+
return '';
|
|
442
|
+
return `<div class="scene-contract">${promptBlock}${refBlock}</div>`;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* One reference-slot row: role · label · ready/pending badge · binding (the
|
|
446
|
+
* Asset:// URI when registered, else the local path, else the character name
|
|
447
|
+
* flagged unregistered). This is the operator's pre-render identity-lock check.
|
|
448
|
+
*/
|
|
449
|
+
function renderReferenceSlot(slot) {
|
|
450
|
+
const badge = `<span class="ref-status ref-${slot.status === 'ready' ? 'ready' : 'pending'}">${esc(slot.status)}</span>`;
|
|
451
|
+
const bind = slot.assetUri
|
|
452
|
+
? `<span class="ref-bind">${esc(slot.assetUri)}</span>`
|
|
453
|
+
: slot.path
|
|
454
|
+
? `<span class="ref-bind">${esc(slot.path)}</span>`
|
|
455
|
+
: slot.characterName
|
|
456
|
+
? `<span class="ref-bind ref-unbound">${esc(slot.characterName)} · unregistered</span>`
|
|
457
|
+
: '';
|
|
458
|
+
return `<div class="ref-slot"><span class="ref-role">${esc(slot.role)}</span><span class="ref-slot-label">${esc(slot.label)}</span>${badge}${bind}</div>`;
|
|
459
|
+
}
|
|
460
|
+
function promptRow(key, value) {
|
|
461
|
+
return `<div class="contract-row"><span class="contract-k">${esc(key)}</span><span class="contract-v">${esc(value)}</span></div>`;
|
|
462
|
+
}
|
|
463
|
+
/** Lowercase alphanumeric reduction for tolerant character-name → asset matching. */
|
|
464
|
+
function contractSlug(value) {
|
|
465
|
+
return value.toLowerCase().replace(/[^a-z0-9]+/g, '');
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Display metadata for the known narrative color states (the grade ids). The hex
|
|
469
|
+
* is the on-screen swatch; the label is the human-readable beat name. Unknown
|
|
470
|
+
* states render with a neutral swatch and the raw id, so the chip is always safe
|
|
471
|
+
* (the inline style only ever uses a hardcoded hex, never the untrusted id).
|
|
472
|
+
*/
|
|
473
|
+
const COLOR_STATE_DISPLAY = {
|
|
474
|
+
'cool-steel': { label: 'Normal ops', hex: '#6A7A87' },
|
|
475
|
+
'crimson-threat': { label: 'Breach', hex: '#CC0000' },
|
|
476
|
+
'electric-blue': { label: 'Resolution', hex: '#00B4D8' },
|
|
477
|
+
'kodak-500t': { label: 'Film base', hex: '#C9A36A' },
|
|
478
|
+
'bleach-bypass': { label: 'Bleach bypass', hex: '#B8B8B0' },
|
|
479
|
+
desaturated: { label: 'Desaturated', hex: '#8A8A8A' },
|
|
480
|
+
'teal-orange': { label: 'Teal / orange', hex: '#1F7A7A' },
|
|
481
|
+
};
|
|
482
|
+
/** Render the per-scene color-state chip: a hex swatch + beat label + grade id. */
|
|
483
|
+
function renderColorStateChip(colorState) {
|
|
484
|
+
const display = COLOR_STATE_DISPLAY[colorState];
|
|
485
|
+
const hex = display?.hex ?? '#888888';
|
|
486
|
+
const label = display?.label ?? colorState;
|
|
487
|
+
return `<div class="color-state"><span class="cs-swatch" style="background:${escAttr(hex)}"></span><span class="cs-label">${esc(label)}</span><span class="cs-id">${esc(colorState)}</span></div>`;
|
|
488
|
+
}
|
|
489
|
+
function sectionId(section) {
|
|
490
|
+
if (section === 'final')
|
|
491
|
+
return 'finals';
|
|
492
|
+
return section.replace(/[^a-z0-9]+/gi, '-').toLowerCase();
|
|
493
|
+
}
|
|
494
|
+
function titleFromSection(section) {
|
|
495
|
+
return section
|
|
496
|
+
.split(/[-_\s]+/)
|
|
497
|
+
.filter(Boolean)
|
|
498
|
+
.map((part) => `${part[0]?.toUpperCase() ?? ''}${part.slice(1)}`)
|
|
499
|
+
.join(' ');
|
|
500
|
+
}
|
|
501
|
+
function renderAssetCard(asset, surface) {
|
|
502
|
+
const kind = asset.section === 'final' ? 'final' : asset.section === 'videos' ? 'scene' : 'asset';
|
|
503
|
+
const media = asset.kind === 'video'
|
|
504
|
+
? `<video${mediaAspectAttrs(asset)} controls preload="metadata" data-downloadable src="${escAttr(asset.path)}"></video>`
|
|
505
|
+
: asset.kind === 'image'
|
|
506
|
+
? `<img${mediaAspectAttrs(asset)} data-downloadable data-lightbox-group="${escAttr(asset.section)}" data-lb-caption="${escAttr(asset.label)}" src="${escAttr(asset.path)}" alt="${escAttr(asset.label)}">`
|
|
507
|
+
: asset.kind === 'audio'
|
|
508
|
+
? `<div class="meta"><audio controls data-downloadable src="${escAttr(asset.path)}"></audio></div>`
|
|
509
|
+
: asset.kind === 'html'
|
|
510
|
+
? `<a class="doc-thumb" href="${escAttr(asset.path)}" target="_blank" rel="noopener"><span>⤢ Open ${esc(asset.label)}</span></a>`
|
|
511
|
+
: `<div class="meta"><code>${esc(asset.path)}</code></div>`;
|
|
512
|
+
return `<div class="card" data-card-kind="${kind}" data-card-id="${escAttr(asset.id)}" data-media-kind="${escAttr(asset.kind)}">
|
|
513
|
+
${media}
|
|
514
|
+
<div class="meta"><div class="num">${esc(asset.section)}</div><div class="title">${esc(asset.label)}</div><div class="who">${esc(asset.path)}</div>${asset.createdAt ? `<div class="who card-date">added ${esc(fmtDate(asset.createdAt))}</div>` : ''}</div>
|
|
515
|
+
${renderControls(surface)}
|
|
516
|
+
</div>`;
|
|
517
|
+
}
|
|
518
|
+
function renderControls(surface) {
|
|
519
|
+
// The unified Review surface renders BOTH control sets per card; CSS shows only
|
|
520
|
+
// the active mode's set (editor vs client). Preview renders none.
|
|
521
|
+
if (!isReviewSurface(surface))
|
|
522
|
+
return '';
|
|
523
|
+
return `<div class="review-controls">
|
|
524
|
+
<button type="button" class="review-btn approve" data-review-action="approve" aria-pressed="false">Approve</button>
|
|
525
|
+
<button type="button" class="review-btn regenerate" data-review-action="regenerate" aria-pressed="false">Regenerate</button>
|
|
526
|
+
<input type="text" class="review-note" placeholder="why / what to change">
|
|
527
|
+
</div>
|
|
528
|
+
<div class="client-controls">
|
|
529
|
+
<button type="button" class="client-btn approve" data-client-action="approve" aria-pressed="false">Approve</button>
|
|
530
|
+
<button type="button" class="client-btn decline" data-client-action="decline" aria-pressed="false">Decline</button>
|
|
531
|
+
<input type="text" class="client-note" placeholder="comment">
|
|
532
|
+
</div>`;
|
|
533
|
+
}
|
|
534
|
+
/** Media filter chips (preview surface only): All / Videos / Images. The viewer
|
|
535
|
+
* JS toggles `.card[data-media-kind]` visibility and hides emptied sections. */
|
|
536
|
+
function renderFilterChips() {
|
|
537
|
+
return `<div class="media-filter" role="toolbar" aria-label="Filter media">
|
|
538
|
+
<button type="button" data-filter-chip="all" aria-pressed="true">All</button>
|
|
539
|
+
<button type="button" data-filter-chip="video" aria-pressed="false">Videos</button>
|
|
540
|
+
<button type="button" data-filter-chip="image" aria-pressed="false">Images</button>
|
|
541
|
+
</div>`;
|
|
542
|
+
}
|
|
543
|
+
/** Keyboard-shortcuts help overlay, toggled with `?` by the viewer JS. Rendered
|
|
544
|
+
* statically (hidden) so tests can assert its presence without executing JS. */
|
|
545
|
+
function renderShortcutsHelp() {
|
|
546
|
+
const rows = [
|
|
547
|
+
['← → or [ ]', 'Select previous / next media (page) · previous / next asset (viewer)'],
|
|
548
|
+
['Enter', 'Open the selected media in the viewer'],
|
|
549
|
+
['Esc', 'Close the viewer or this help'],
|
|
550
|
+
['Space / K', 'Play / pause video'],
|
|
551
|
+
['J / L', 'Playback slower / faster (0.25–4×)'],
|
|
552
|
+
[', / .', 'Frame step back / forward (Shift: 10 frames)'],
|
|
553
|
+
['F', 'Fullscreen video'],
|
|
554
|
+
['M / ↑ ↓', 'Mute · volume up / down'],
|
|
555
|
+
['G', 'Grab the current video frame as a PNG'],
|
|
556
|
+
['D', 'Download the current asset'],
|
|
557
|
+
['Z or click', 'Zoom image 2× (drag to pan)'],
|
|
558
|
+
['?', 'Toggle this help'],
|
|
559
|
+
];
|
|
560
|
+
const grid = rows
|
|
561
|
+
.map(([keys, what]) => `<kbd>${esc(keys)}</kbd><span>${esc(what)}</span>`)
|
|
562
|
+
.join('');
|
|
563
|
+
return `<div id="kb-help" role="dialog" aria-label="Keyboard shortcuts" hidden>
|
|
564
|
+
<div class="kb-card"><h3>Keyboard shortcuts</h3><div class="kb-grid">${grid}</div></div>
|
|
565
|
+
</div>`;
|
|
566
|
+
}
|
|
567
|
+
/* ── Brand theming: palette-driven accent, client wordmark/logo, brand book ──
|
|
568
|
+
Sourced from artifacts/brand-definition.json (discovered onto project.brand).
|
|
569
|
+
No brand → every helper returns '' and the stock theme renders unchanged. */
|
|
570
|
+
/** Surfaces that carry the client's identity (vs the operator's utilitarian view). */
|
|
571
|
+
function isClientSurface(surface) {
|
|
572
|
+
return surface === 'preview' || surface === 'client-review';
|
|
573
|
+
}
|
|
574
|
+
/** WCAG relative luminance of a #RRGGBB color. */
|
|
575
|
+
function relativeLuminance(hex) {
|
|
576
|
+
const channel = (i) => {
|
|
577
|
+
const c = parseInt(hex.slice(i, i + 2), 16) / 255;
|
|
578
|
+
return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
|
|
579
|
+
};
|
|
580
|
+
return 0.2126 * channel(1) + 0.7152 * channel(3) + 0.0722 * channel(5);
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Pick the brand accent: the first palette role (metallic → primary → secondary
|
|
584
|
+
* → contrast) bright enough to read on the near-black portal background
|
|
585
|
+
* (luminance ≥ 0.2 ≈ 4.5:1 contrast). All-dark palettes return null and the
|
|
586
|
+
* stock amber accent stays — readability beats brand fidelity.
|
|
587
|
+
*/
|
|
588
|
+
function pickBrandAccent(brand) {
|
|
589
|
+
for (const role of ['metallic', 'primary', 'secondary', 'contrast']) {
|
|
590
|
+
const color = brand.palette.find((entry) => entry.role === role);
|
|
591
|
+
if (color && relativeLuminance(color.hex) >= 0.2)
|
|
592
|
+
return color.hex;
|
|
593
|
+
}
|
|
594
|
+
return null;
|
|
595
|
+
}
|
|
596
|
+
function hexToRgba(hex, alpha) {
|
|
597
|
+
const r = parseInt(hex.slice(1, 3), 16);
|
|
598
|
+
const g = parseInt(hex.slice(3, 5), 16);
|
|
599
|
+
const b = parseInt(hex.slice(5, 7), 16);
|
|
600
|
+
return `rgba(${r},${g},${b},${alpha})`;
|
|
601
|
+
}
|
|
602
|
+
/** First numeric CSS weight found in the artifact's free-form weight string. */
|
|
603
|
+
function fontWeightOf(weight) {
|
|
604
|
+
const m = /\d{3}/.exec(weight);
|
|
605
|
+
return m ? m[0] : null;
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Reduce a brand font name to the characters a Google-font family legitimately
|
|
609
|
+
* uses (letters, digits, spaces). This is the one guard for BOTH the Google
|
|
610
|
+
* Fonts URL and the `:root{}` font-family values: an unsanitized name carrying
|
|
611
|
+
* `& ; } :` would otherwise corrupt the font-link query string or break out of
|
|
612
|
+
* the inline `<style>` block. Returns '' when nothing survives (caller skips it).
|
|
613
|
+
*/
|
|
614
|
+
function sanitizeFontFamily(name) {
|
|
615
|
+
return name.replace(/[^A-Za-z0-9 ]/g, '').replace(/\s+/g, ' ').trim();
|
|
616
|
+
}
|
|
617
|
+
/** Typography level lookup with a fallback chain (display falls back to headline). */
|
|
618
|
+
function typographyFor(brand, levels) {
|
|
619
|
+
for (const level of levels) {
|
|
620
|
+
const entry = brand.typography.find((t) => t.level === level && t.font.trim());
|
|
621
|
+
if (entry)
|
|
622
|
+
return { font: entry.font.trim(), weight: entry.weight };
|
|
623
|
+
}
|
|
624
|
+
return null;
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* The themed head block: a Google Fonts stylesheet link (client surfaces only —
|
|
628
|
+
* progressive enhancement, full system-font fallback stacks keep the page
|
|
629
|
+
* presentable offline/file://) plus a `:root` override of the accent/glow/font
|
|
630
|
+
* variables. Review/edit get the accent variables only.
|
|
631
|
+
*/
|
|
632
|
+
function renderBrandTheme(project, surface) {
|
|
633
|
+
const brand = project.brand;
|
|
634
|
+
if (!brand)
|
|
635
|
+
return '';
|
|
636
|
+
const vars = [];
|
|
637
|
+
const accent = pickBrandAccent(brand);
|
|
638
|
+
if (accent) {
|
|
639
|
+
vars.push(`--accent:${accent}`);
|
|
640
|
+
vars.push(`--glow:${hexToRgba(accent, 0.07)}`);
|
|
641
|
+
}
|
|
642
|
+
let fontLinks = '';
|
|
643
|
+
if (isClientSurface(surface)) {
|
|
644
|
+
const display = typographyFor(brand, ['display', 'headline', 'wordmark']);
|
|
645
|
+
const body = typographyFor(brand, ['body']);
|
|
646
|
+
const wordmark = typographyFor(brand, ['wordmark', 'display']);
|
|
647
|
+
const families = new Map();
|
|
648
|
+
for (const entry of [display, body, wordmark]) {
|
|
649
|
+
if (!entry)
|
|
650
|
+
continue;
|
|
651
|
+
const weights = families.get(entry.font) ?? new Set();
|
|
652
|
+
weights.add(fontWeightOf(entry.weight) ?? '400');
|
|
653
|
+
if (entry === display || entry === wordmark)
|
|
654
|
+
weights.add('700');
|
|
655
|
+
families.set(entry.font, weights);
|
|
656
|
+
}
|
|
657
|
+
if (families.size > 0) {
|
|
658
|
+
const familyParams = [...families.entries()]
|
|
659
|
+
.map(([font, weights]) => ({ clean: sanitizeFontFamily(font), weights }))
|
|
660
|
+
.filter((entry) => entry.clean)
|
|
661
|
+
.map((entry) => `family=${entry.clean.replace(/ /g, '+')}:wght@${[...entry.weights].sort().join(';')}`)
|
|
662
|
+
.join('&');
|
|
663
|
+
if (familyParams) {
|
|
664
|
+
fontLinks = `\n<link rel="preconnect" href="https://fonts.googleapis.com">\n<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>\n<link rel="stylesheet" href="https://fonts.googleapis.com/css2?${familyParams}&display=swap">`;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
const displayClean = display ? sanitizeFontFamily(display.font) : '';
|
|
668
|
+
const bodyClean = body ? sanitizeFontFamily(body.font) : '';
|
|
669
|
+
const wordmarkClean = wordmark ? sanitizeFontFamily(wordmark.font) : '';
|
|
670
|
+
if (displayClean)
|
|
671
|
+
vars.push(`--font-display:'${displayClean}',var(--font-body)`);
|
|
672
|
+
if (bodyClean)
|
|
673
|
+
vars.push(`--font-body:'${bodyClean}',-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,sans-serif`);
|
|
674
|
+
if (wordmarkClean)
|
|
675
|
+
vars.push(`--font-wordmark:'${wordmarkClean}',var(--font-display)`);
|
|
676
|
+
}
|
|
677
|
+
if (!vars.length && !fontLinks)
|
|
678
|
+
return '';
|
|
679
|
+
return `${fontLinks}\n<style>:root{${vars.join(';')}}</style>`;
|
|
680
|
+
}
|
|
681
|
+
/** Client identity bar above the hero: logo image when discovered, else the
|
|
682
|
+
* brand name typeset in the wordmark face; right side names the recipient. */
|
|
683
|
+
function renderBrandBar(project, surface) {
|
|
684
|
+
const brand = project.brand;
|
|
685
|
+
if (!brand || !isClientSurface(surface))
|
|
686
|
+
return '';
|
|
687
|
+
const mark = brand.logoPath
|
|
688
|
+
? `<img src="${escAttr(brand.logoPath)}" alt="${escAttr(brand.brandName)}">`
|
|
689
|
+
: `<span class="brand-wordmark">${esc(brand.brandName)}</span>`;
|
|
690
|
+
const recipient = project.client ? `prepared for ${project.client}` : 'client delivery';
|
|
691
|
+
return `<div class="brand-bar">${mark}<span class="brand-for">${esc(recipient)}</span></div>
|
|
692
|
+
`;
|
|
693
|
+
}
|
|
694
|
+
/** Emotional tagline as the hero subline on client surfaces. */
|
|
695
|
+
function renderHeroTagline(project, surface) {
|
|
696
|
+
const line = project.brand?.taglines?.emotional;
|
|
697
|
+
if (!line || !isClientSurface(surface))
|
|
698
|
+
return '';
|
|
699
|
+
return `<p class="tagline">${esc(line)}</p>
|
|
700
|
+
`;
|
|
701
|
+
}
|
|
702
|
+
/** Review-status chip in the hero eyebrow (preview only; silent while draft). */
|
|
703
|
+
function renderStatusChip(project, surface) {
|
|
704
|
+
if (surface !== 'preview' || project.status === 'draft')
|
|
705
|
+
return '';
|
|
706
|
+
const approved = project.status === 'client-approved' || project.status === 'final' || project.status === 'published';
|
|
707
|
+
return `<span class="status-chip${approved ? ' st-approved' : ''}">${esc(project.status)}</span>`;
|
|
708
|
+
}
|
|
709
|
+
/** Prettify a camelCase palette role for the swatch label. */
|
|
710
|
+
function roleLabel(role) {
|
|
711
|
+
return role.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* The brand-book annex (preview only): palette swatches, typography specimens
|
|
715
|
+
* rendered in their own faces, and the three taglines — the page doubles as a
|
|
716
|
+
* mini brand portal the client can keep using after delivery.
|
|
717
|
+
*/
|
|
718
|
+
function renderBrandBook(project) {
|
|
719
|
+
const brand = project.brand;
|
|
720
|
+
if (!brand)
|
|
721
|
+
return '';
|
|
722
|
+
const swatches = brand.palette
|
|
723
|
+
.map((color) => `<div class="swatch"><div class="sw" style="background:${escAttr(color.hex)}"></div><div class="sw-meta"><div class="sw-role">${esc(roleLabel(color.role))}</div>${color.name ? `<div class="sw-name">${esc(color.name)}</div>` : ''}<div class="sw-hex">${esc(color.hex)}</div></div></div>`)
|
|
724
|
+
.join('');
|
|
725
|
+
const specimens = brand.typography
|
|
726
|
+
.map((t) => {
|
|
727
|
+
const weight = fontWeightOf(t.weight);
|
|
728
|
+
const sample = t.level === 'wordmark' ? brand.brandName : 'Aa Bb Cc 0123';
|
|
729
|
+
// Same sanitization as the head theme: a font name with `'`/`;`/`}` would
|
|
730
|
+
// otherwise corrupt this inline font-family. Show the cleaned name too.
|
|
731
|
+
const cleanFont = sanitizeFontFamily(t.font);
|
|
732
|
+
const style = cleanFont
|
|
733
|
+
? `font-family:'${cleanFont}',var(--font-body)${weight ? `;font-weight:${weight}` : ''}`
|
|
734
|
+
: weight ? `font-weight:${weight}` : '';
|
|
735
|
+
return `<div class="type-specimen"><span class="ts-level">${esc(t.level)}</span><span class="ts-sample" style="${escAttr(style)}">${esc(sample)}</span><span class="ts-font">${esc(cleanFont || t.level)}${t.weight ? ` · ${esc(t.weight)}` : ''}</span></div>`;
|
|
736
|
+
})
|
|
737
|
+
.join('');
|
|
738
|
+
const taglineKinds = [
|
|
739
|
+
['functional', brand.taglines?.functional],
|
|
740
|
+
['emotional', brand.taglines?.emotional],
|
|
741
|
+
['community', brand.taglines?.community],
|
|
742
|
+
];
|
|
743
|
+
const taglines = taglineKinds.filter(([, line]) => line);
|
|
744
|
+
const taglineHtml = taglines.length
|
|
745
|
+
? `<div class="tagline-list">${taglines
|
|
746
|
+
.map(([kind, line]) => `<div class="tagline-card"><div class="tg-kind">${esc(kind)}</div><div class="tg-line">${esc(line)}</div></div>`)
|
|
747
|
+
.join('')}</div>`
|
|
748
|
+
: '';
|
|
749
|
+
return `<section id="brand-book" data-toc="Brand">
|
|
750
|
+
<div class="section-head"><h2>Brand</h2><div class="section-title">${esc(brand.brandName)} Brand System</div>${brand.positioning ? `<div class="section-sub">${esc(brand.positioning)}</div>` : ''}</div>
|
|
751
|
+
${swatches ? `<div class="swatch-grid">${swatches}</div>` : ''}
|
|
752
|
+
${specimens ? `<div class="type-specimens">${specimens}</div>` : ''}
|
|
753
|
+
${taglineHtml}
|
|
754
|
+
</section>`;
|
|
755
|
+
}
|
|
756
|
+
function renderHud(surface) {
|
|
757
|
+
// Both HUDs render; CSS shows the one matching the active mode.
|
|
758
|
+
if (!isReviewSurface(surface))
|
|
759
|
+
return '';
|
|
760
|
+
return `<div class="hud" id="review-hud" role="status"><span id="rs-approved">0 approved</span><span id="rs-regen">0 to regenerate</span><button type="button" id="copy-decisions-btn">Copy Review Decisions</button></div>
|
|
761
|
+
<div class="hud" id="client-hud" role="status"><span>Client feedback</span><button type="button" id="copy-client-feedback-btn">Copy Feedback</button></div>`;
|
|
762
|
+
}
|
|
763
|
+
function modeForSurface(surface) {
|
|
764
|
+
if (surface === 'edit' || surface === 'review')
|
|
765
|
+
return 'editor';
|
|
766
|
+
if (surface === 'client-review')
|
|
767
|
+
return 'client';
|
|
768
|
+
if (surface === 'compare')
|
|
769
|
+
return 'compare';
|
|
770
|
+
return 'preview';
|
|
771
|
+
}
|
|
772
|
+
function labelForSurface(surface) {
|
|
773
|
+
if (surface === 'edit')
|
|
774
|
+
return 'editor edit';
|
|
775
|
+
if (surface === 'review')
|
|
776
|
+
return 'editor review';
|
|
777
|
+
if (surface === 'client-review')
|
|
778
|
+
return 'client review';
|
|
779
|
+
if (surface === 'compare')
|
|
780
|
+
return 'compare';
|
|
781
|
+
if (surface === 'index')
|
|
782
|
+
return 'index';
|
|
783
|
+
return 'preview';
|
|
784
|
+
}
|
|
785
|
+
function scriptForSurface(surface) {
|
|
786
|
+
// Review surface drives both control sets + the tab/mode toggle.
|
|
787
|
+
if (isReviewSurface(surface))
|
|
788
|
+
return PORTAL_EDITOR_JS + PORTAL_CLIENT_JS + PORTAL_REVIEW_TABS_JS;
|
|
789
|
+
return '';
|
|
790
|
+
}
|
|
791
|
+
function slugify(value) {
|
|
792
|
+
return value
|
|
793
|
+
.trim()
|
|
794
|
+
.toLowerCase()
|
|
795
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
796
|
+
.replace(/^-|-$/g, '') || 'unknown';
|
|
797
|
+
}
|
|
798
|
+
/** Project aspect ratio (from the brief's execution profile) used to size the
|
|
799
|
+
* media cards + hero. Falls back to landscape when unknown. */
|
|
800
|
+
function aspectForProject(project) {
|
|
801
|
+
const ratio = project.brief?.metadata?.executionProfile?.aspectRatio;
|
|
802
|
+
return ratio === '9:16' || ratio === '1:1' || ratio === '16:9' ? ratio : '16:9';
|
|
803
|
+
}
|
|
804
|
+
/** Compact, locale-independent card date: "2026-06-01 18:01 UTC" from an ISO
|
|
805
|
+
* string (deterministic — no Date/locale parsing). Empty string when absent. */
|
|
806
|
+
function fmtDate(iso) {
|
|
807
|
+
if (!iso)
|
|
808
|
+
return '';
|
|
809
|
+
const m = /^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2})/.exec(iso);
|
|
810
|
+
return m ? `${m[1]} ${m[2]} UTC` : iso;
|
|
811
|
+
}
|
|
812
|
+
function esc(value) {
|
|
813
|
+
return value
|
|
814
|
+
.replaceAll('&', '&')
|
|
815
|
+
.replaceAll('<', '<')
|
|
816
|
+
.replaceAll('>', '>')
|
|
817
|
+
.replaceAll('"', '"');
|
|
818
|
+
}
|
|
819
|
+
function escAttr(value) {
|
|
820
|
+
return esc(value);
|
|
821
|
+
}
|
|
822
|
+
//# sourceMappingURL=render.js.map
|