vidspotai-shared 1.0.67 → 1.0.69-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/globals/aiModels/enums.d.ts +63 -6
- package/lib/globals/aiModels/enums.d.ts.map +1 -1
- package/lib/globals/aiModels/enums.js +78 -9
- package/lib/globals/aiModels/index.d.ts +2 -0
- package/lib/globals/aiModels/index.d.ts.map +1 -1
- package/lib/globals/aiModels/index.js +6 -0
- package/lib/globals/aiModels/providers/alibaba.d.ts +4 -0
- package/lib/globals/aiModels/providers/alibaba.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/alibaba.js +194 -0
- package/lib/globals/aiModels/providers/bytedance.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/bytedance.js +19 -0
- package/lib/globals/aiModels/providers/elevenlabs.d.ts +14 -0
- package/lib/globals/aiModels/providers/elevenlabs.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/elevenlabs.js +29 -0
- package/lib/globals/aiModels/providers/google.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/google.js +150 -2
- package/lib/globals/aiModels/providers/kling.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/kling.js +280 -37
- package/lib/globals/aiModels/providers/minimax.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/minimax.js +73 -2
- package/lib/globals/aiModels/providers/openai.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/openai.js +90 -6
- package/lib/globals/aiModels/providers/pixverse.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/pixverse.js +111 -29
- package/lib/globals/aiModels/providers/pixverseTemplates.d.ts +36 -0
- package/lib/globals/aiModels/providers/pixverseTemplates.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/pixverseTemplates.js +42 -0
- package/lib/globals/aiModels/providers/runway.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/runway.js +64 -2
- package/lib/globals/aiModels/tierHelpers.d.ts +33 -0
- package/lib/globals/aiModels/tierHelpers.d.ts.map +1 -0
- package/lib/globals/aiModels/tierHelpers.js +109 -0
- package/lib/globals/aiModels/types.d.ts +20 -1
- package/lib/globals/aiModels/types.d.ts.map +1 -1
- package/lib/globals/ttsModels/index.d.ts +2 -0
- package/lib/globals/ttsModels/index.d.ts.map +1 -1
- package/lib/globals/ttsModels/index.js +9 -1
- package/lib/globals/ttsModels/providers/minimax.d.ts +8 -0
- package/lib/globals/ttsModels/providers/minimax.d.ts.map +1 -0
- package/lib/globals/ttsModels/providers/minimax.js +18 -0
- package/lib/globals/ttsModels/providers/openai.d.ts +12 -0
- package/lib/globals/ttsModels/providers/openai.d.ts.map +1 -0
- package/lib/globals/ttsModels/providers/openai.js +22 -0
- package/lib/globals/ttsModels/types.d.ts +1 -1
- package/lib/globals/ttsModels/types.d.ts.map +1 -1
- package/lib/globals/ttsModels/voices.d.ts +39 -4
- package/lib/globals/ttsModels/voices.d.ts.map +1 -1
- package/lib/globals/ttsModels/voices.js +273 -26
- package/lib/globals/types.d.ts +59 -1
- package/lib/globals/types.d.ts.map +1 -1
- package/lib/globals/types.js +81 -2
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/models/agent.model.d.ts +357 -0
- package/lib/models/agent.model.d.ts.map +1 -0
- package/lib/models/agent.model.js +21 -0
- package/lib/models/cachedAsset.model.d.ts +18 -0
- package/lib/models/cachedAsset.model.d.ts.map +1 -0
- package/lib/models/cachedAsset.model.js +2 -0
- package/lib/models/cachedRawAsset.model.d.ts +20 -0
- package/lib/models/cachedRawAsset.model.d.ts.map +1 -0
- package/lib/models/cachedRawAsset.model.js +2 -0
- package/lib/models/image.model.d.ts +47 -0
- package/lib/models/image.model.d.ts.map +1 -0
- package/lib/models/image.model.js +2 -0
- package/lib/models/index.d.ts +6 -0
- package/lib/models/index.d.ts.map +1 -1
- package/lib/models/index.js +6 -0
- package/lib/models/notification.model.d.ts +25 -0
- package/lib/models/notification.model.d.ts.map +1 -0
- package/lib/models/notification.model.js +2 -0
- package/lib/models/ref.model.d.ts +80 -0
- package/lib/models/ref.model.d.ts.map +1 -0
- package/lib/models/ref.model.js +13 -0
- package/lib/models/share.model.d.ts +29 -0
- package/lib/models/share.model.d.ts.map +1 -0
- package/lib/models/share.model.js +2 -0
- package/lib/models/user.model.d.ts +12 -1
- package/lib/models/user.model.d.ts.map +1 -1
- package/lib/models/video.model.d.ts +120 -0
- package/lib/models/video.model.d.ts.map +1 -1
- package/lib/models/video.model.js +10 -0
- package/lib/schemas/agentPersona.schema.d.ts +10 -0
- package/lib/schemas/agentPersona.schema.d.ts.map +1 -0
- package/lib/schemas/agentPersona.schema.js +11 -0
- package/lib/schemas/agentRunJob.schema.d.ts +105 -0
- package/lib/schemas/agentRunJob.schema.d.ts.map +1 -0
- package/lib/schemas/agentRunJob.schema.js +88 -0
- package/lib/schemas/brandKit.schema.d.ts +113 -0
- package/lib/schemas/brandKit.schema.d.ts.map +1 -0
- package/lib/schemas/brandKit.schema.js +46 -0
- package/lib/schemas/brief.schema.d.ts +263 -0
- package/lib/schemas/brief.schema.d.ts.map +1 -0
- package/lib/schemas/brief.schema.js +157 -0
- package/lib/schemas/index.d.ts +7 -0
- package/lib/schemas/index.d.ts.map +1 -0
- package/lib/schemas/index.js +22 -0
- package/lib/schemas/project.schema.d.ts +1025 -0
- package/lib/schemas/project.schema.d.ts.map +1 -0
- package/lib/schemas/project.schema.js +256 -0
- package/lib/schemas/videoPlan.schema.d.ts +590 -0
- package/lib/schemas/videoPlan.schema.d.ts.map +1 -0
- package/lib/schemas/videoPlan.schema.js +412 -0
- package/lib/services/agent/beatSnap.d.ts +10 -0
- package/lib/services/agent/beatSnap.d.ts.map +1 -0
- package/lib/services/agent/beatSnap.js +128 -0
- package/lib/services/agent/bibleBuilder.d.ts +43 -0
- package/lib/services/agent/bibleBuilder.d.ts.map +1 -0
- package/lib/services/agent/bibleBuilder.js +102 -0
- package/lib/services/agent/bibleImageVision.d.ts +45 -0
- package/lib/services/agent/bibleImageVision.d.ts.map +1 -0
- package/lib/services/agent/bibleImageVision.js +169 -0
- package/lib/services/agent/chatAgent.d.ts +79 -0
- package/lib/services/agent/chatAgent.d.ts.map +1 -0
- package/lib/services/agent/chatAgent.js +136 -0
- package/lib/services/agent/costPreflight.d.ts +61 -0
- package/lib/services/agent/costPreflight.d.ts.map +1 -0
- package/lib/services/agent/costPreflight.js +143 -0
- package/lib/services/agent/critic.d.ts +103 -0
- package/lib/services/agent/critic.d.ts.map +1 -0
- package/lib/services/agent/critic.js +139 -0
- package/lib/services/agent/editClassifier.d.ts +262 -0
- package/lib/services/agent/editClassifier.d.ts.map +1 -0
- package/lib/services/agent/editClassifier.js +186 -0
- package/lib/services/agent/eval/index.d.ts +5 -0
- package/lib/services/agent/eval/index.d.ts.map +1 -0
- package/lib/services/agent/eval/index.js +20 -0
- package/lib/services/agent/eval/judge.d.ts +14 -0
- package/lib/services/agent/eval/judge.d.ts.map +1 -0
- package/lib/services/agent/eval/judge.js +96 -0
- package/lib/services/agent/eval/recorder.d.ts +28 -0
- package/lib/services/agent/eval/recorder.d.ts.map +1 -0
- package/lib/services/agent/eval/recorder.js +100 -0
- package/lib/services/agent/eval/seedBriefs.d.ts +16 -0
- package/lib/services/agent/eval/seedBriefs.d.ts.map +1 -0
- package/lib/services/agent/eval/seedBriefs.js +1188 -0
- package/lib/services/agent/eval/types.d.ts +230 -0
- package/lib/services/agent/eval/types.d.ts.map +1 -0
- package/lib/services/agent/eval/types.js +73 -0
- package/lib/services/agent/executor.d.ts +141 -0
- package/lib/services/agent/executor.d.ts.map +1 -0
- package/lib/services/agent/executor.js +561 -0
- package/lib/services/agent/globalActions.d.ts +49 -0
- package/lib/services/agent/globalActions.d.ts.map +1 -0
- package/lib/services/agent/globalActions.js +328 -0
- package/lib/services/agent/index.d.ts +38 -0
- package/lib/services/agent/index.d.ts.map +1 -0
- package/lib/services/agent/index.js +53 -0
- package/lib/services/agent/llmCaller.d.ts +144 -0
- package/lib/services/agent/llmCaller.d.ts.map +1 -0
- package/lib/services/agent/llmCaller.js +16 -0
- package/lib/services/agent/llmCallerAnthropic.d.ts +90 -0
- package/lib/services/agent/llmCallerAnthropic.d.ts.map +1 -0
- package/lib/services/agent/llmCallerAnthropic.js +255 -0
- package/lib/services/agent/llmCallerGateway.d.ts +61 -0
- package/lib/services/agent/llmCallerGateway.d.ts.map +1 -0
- package/lib/services/agent/llmCallerGateway.js +360 -0
- package/lib/services/agent/llmCallerRegistry.d.ts +6 -0
- package/lib/services/agent/llmCallerRegistry.d.ts.map +1 -0
- package/lib/services/agent/llmCallerRegistry.js +39 -0
- package/lib/services/agent/modelQualityNotes.d.ts +100 -0
- package/lib/services/agent/modelQualityNotes.d.ts.map +1 -0
- package/lib/services/agent/modelQualityNotes.js +248 -0
- package/lib/services/agent/modelRouter.d.ts +41 -0
- package/lib/services/agent/modelRouter.d.ts.map +1 -0
- package/lib/services/agent/modelRouter.js +65 -0
- package/lib/services/agent/musicSelect.d.ts +23 -0
- package/lib/services/agent/musicSelect.d.ts.map +1 -0
- package/lib/services/agent/musicSelect.js +109 -0
- package/lib/services/agent/overlayRenderer.d.ts +67 -0
- package/lib/services/agent/overlayRenderer.d.ts.map +1 -0
- package/lib/services/agent/overlayRenderer.js +253 -0
- package/lib/services/agent/perSceneCritic.d.ts +90 -0
- package/lib/services/agent/perSceneCritic.d.ts.map +1 -0
- package/lib/services/agent/perSceneCritic.js +125 -0
- package/lib/services/agent/personas.d.ts +78 -0
- package/lib/services/agent/personas.d.ts.map +1 -0
- package/lib/services/agent/personas.js +177 -0
- package/lib/services/agent/planDiff.d.ts +76 -0
- package/lib/services/agent/planDiff.d.ts.map +1 -0
- package/lib/services/agent/planDiff.js +182 -0
- package/lib/services/agent/planMutations.d.ts +46 -0
- package/lib/services/agent/planMutations.d.ts.map +1 -0
- package/lib/services/agent/planMutations.js +120 -0
- package/lib/services/agent/planner/Planner.d.ts +107 -0
- package/lib/services/agent/planner/Planner.d.ts.map +1 -0
- package/lib/services/agent/planner/Planner.js +591 -0
- package/lib/services/agent/planner/overlaySanity.d.ts +7 -0
- package/lib/services/agent/planner/overlaySanity.d.ts.map +1 -0
- package/lib/services/agent/planner/overlaySanity.js +86 -0
- package/lib/services/agent/planner/promptSections.d.ts +25 -0
- package/lib/services/agent/planner/promptSections.d.ts.map +1 -0
- package/lib/services/agent/planner/promptSections.js +174 -0
- package/lib/services/agent/planner/repair.d.ts +16 -0
- package/lib/services/agent/planner/repair.d.ts.map +1 -0
- package/lib/services/agent/planner/repair.js +51 -0
- package/lib/services/agent/planner/structuralRules.d.ts +10 -0
- package/lib/services/agent/planner/structuralRules.d.ts.map +1 -0
- package/lib/services/agent/planner/structuralRules.js +111 -0
- package/lib/services/agent/planner/validators.d.ts +65 -0
- package/lib/services/agent/planner/validators.d.ts.map +1 -0
- package/lib/services/agent/planner/validators.js +284 -0
- package/lib/services/agent/planner.d.ts +3 -0
- package/lib/services/agent/planner.d.ts.map +1 -0
- package/lib/services/agent/planner.js +14 -0
- package/lib/services/agent/providerFallback/chains.d.ts +100 -0
- package/lib/services/agent/providerFallback/chains.d.ts.map +1 -0
- package/lib/services/agent/providerFallback/chains.js +198 -0
- package/lib/services/agent/providerFallback/classifier.d.ts +36 -0
- package/lib/services/agent/providerFallback/classifier.d.ts.map +1 -0
- package/lib/services/agent/providerFallback/classifier.js +103 -0
- package/lib/services/agent/providerFallback/index.d.ts +4 -0
- package/lib/services/agent/providerFallback/index.d.ts.map +1 -0
- package/lib/services/agent/providerFallback/index.js +19 -0
- package/lib/services/agent/providerFallback/withFallback.d.ts +60 -0
- package/lib/services/agent/providerFallback/withFallback.d.ts.map +1 -0
- package/lib/services/agent/providerFallback/withFallback.js +93 -0
- package/lib/services/agent/providerTaskCache.d.ts +50 -0
- package/lib/services/agent/providerTaskCache.d.ts.map +1 -0
- package/lib/services/agent/providerTaskCache.js +98 -0
- package/lib/services/agent/qualityGate.d.ts +82 -0
- package/lib/services/agent/qualityGate.d.ts.map +1 -0
- package/lib/services/agent/qualityGate.js +232 -0
- package/lib/services/agent/referenceImageRenderer.d.ts +37 -0
- package/lib/services/agent/referenceImageRenderer.d.ts.map +1 -0
- package/lib/services/agent/referenceImageRenderer.js +92 -0
- package/lib/services/agent/regenCore.d.ts +60 -0
- package/lib/services/agent/regenCore.d.ts.map +1 -0
- package/lib/services/agent/regenCore.js +487 -0
- package/lib/services/agent/runHelpers.d.ts +44 -0
- package/lib/services/agent/runHelpers.d.ts.map +1 -0
- package/lib/services/agent/runHelpers.js +196 -0
- package/lib/services/agent/sceneLayoutVision.d.ts +90 -0
- package/lib/services/agent/sceneLayoutVision.d.ts.map +1 -0
- package/lib/services/agent/sceneLayoutVision.js +212 -0
- package/lib/services/agent/stitchedVideoCritic.d.ts +136 -0
- package/lib/services/agent/stitchedVideoCritic.d.ts.map +1 -0
- package/lib/services/agent/stitchedVideoCritic.gemini.d.ts +26 -0
- package/lib/services/agent/stitchedVideoCritic.gemini.d.ts.map +1 -0
- package/lib/services/agent/stitchedVideoCritic.gemini.js +198 -0
- package/lib/services/agent/stitchedVideoCritic.js +162 -0
- package/lib/services/agent/taskPoller.d.ts +65 -0
- package/lib/services/agent/taskPoller.d.ts.map +1 -0
- package/lib/services/agent/taskPoller.js +176 -0
- package/lib/services/agent/textOverlayStyles.d.ts +60 -0
- package/lib/services/agent/textOverlayStyles.d.ts.map +1 -0
- package/lib/services/agent/textOverlayStyles.js +174 -0
- package/lib/services/agent/toolRegistry.d.ts +73 -0
- package/lib/services/agent/toolRegistry.d.ts.map +1 -0
- package/lib/services/agent/toolRegistry.js +95 -0
- package/lib/services/agent/tools/analyzeReference.tool.d.ts +36 -0
- package/lib/services/agent/tools/analyzeReference.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/analyzeReference.tool.js +44 -0
- package/lib/services/agent/tools/animateImage.tool.d.ts +24 -0
- package/lib/services/agent/tools/animateImage.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/animateImage.tool.js +115 -0
- package/lib/services/agent/tools/animateImageWithMotionBrush.tool.d.ts +32 -0
- package/lib/services/agent/tools/animateImageWithMotionBrush.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/animateImageWithMotionBrush.tool.js +135 -0
- package/lib/services/agent/tools/composeScene.tool.d.ts +978 -0
- package/lib/services/agent/tools/composeScene.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/composeScene.tool.js +90 -0
- package/lib/services/agent/tools/estimateCost.tool.d.ts +352 -0
- package/lib/services/agent/tools/estimateCost.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/estimateCost.tool.js +62 -0
- package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts +32 -0
- package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateAvatarVideo.tool.js +143 -0
- package/lib/services/agent/tools/generateCaptions.tool.d.ts +42 -0
- package/lib/services/agent/tools/generateCaptions.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateCaptions.tool.js +196 -0
- package/lib/services/agent/tools/generateImage.tool.d.ts +74 -0
- package/lib/services/agent/tools/generateImage.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateImage.tool.js +206 -0
- package/lib/services/agent/tools/generateVideo.tool.d.ts +31 -0
- package/lib/services/agent/tools/generateVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateVideo.tool.js +153 -0
- package/lib/services/agent/tools/generateVoiceover.tool.d.ts +44 -0
- package/lib/services/agent/tools/generateVoiceover.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateVoiceover.tool.js +206 -0
- package/lib/services/agent/tools/index.d.ts +20 -0
- package/lib/services/agent/tools/index.d.ts.map +1 -0
- package/lib/services/agent/tools/index.js +35 -0
- package/lib/services/agent/tools/planVideo.tool.d.ts +343 -0
- package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/planVideo.tool.js +46 -0
- package/lib/services/agent/tools/render.tool.d.ts +367 -0
- package/lib/services/agent/tools/render.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/render.tool.js +48 -0
- package/lib/services/agent/tools/searchMusic.tool.d.ts +49 -0
- package/lib/services/agent/tools/searchMusic.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/searchMusic.tool.js +74 -0
- package/lib/services/agent/tools/searchStock.tool.d.ts +41 -0
- package/lib/services/agent/tools/searchStock.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/searchStock.tool.js +314 -0
- package/lib/services/agent/tools/searchUserLibrary.tool.d.ts +59 -0
- package/lib/services/agent/tools/searchUserLibrary.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/searchUserLibrary.tool.js +58 -0
- package/lib/services/agent/ttsDuration.d.ts +29 -0
- package/lib/services/agent/ttsDuration.d.ts.map +1 -0
- package/lib/services/agent/ttsDuration.js +60 -0
- package/lib/services/aiGen/aiGenFactory.service.d.ts +21 -1
- package/lib/services/aiGen/aiGenFactory.service.d.ts.map +1 -1
- package/lib/services/aiGen/aiGenFactory.service.js +84 -21
- package/lib/services/aiGen/canonicalAdapters/cameraControl.types.d.ts +31 -0
- package/lib/services/aiGen/canonicalAdapters/cameraControl.types.d.ts.map +1 -0
- package/lib/services/aiGen/canonicalAdapters/cameraControl.types.js +2 -0
- package/lib/services/aiGen/canonicalAdapters/index.d.ts +3 -0
- package/lib/services/aiGen/canonicalAdapters/index.d.ts.map +1 -0
- package/lib/services/aiGen/canonicalAdapters/index.js +18 -0
- package/lib/services/aiGen/canonicalAdapters/multiShot.types.d.ts +23 -0
- package/lib/services/aiGen/canonicalAdapters/multiShot.types.d.ts.map +1 -0
- package/lib/services/aiGen/canonicalAdapters/multiShot.types.js +12 -0
- package/lib/services/aiGen/helpers.d.ts.map +1 -1
- package/lib/services/aiGen/helpers.js +10 -0
- package/lib/services/aiGen/providers/alibaba/alibaba.d.ts +14 -3
- package/lib/services/aiGen/providers/alibaba/alibaba.d.ts.map +1 -1
- package/lib/services/aiGen/providers/alibaba/alibaba.js +155 -22
- package/lib/services/aiGen/providers/baseAiGenProvider.service.d.ts +22 -4
- package/lib/services/aiGen/providers/baseAiGenProvider.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/baseAiGenProvider.service.js +32 -0
- package/lib/services/aiGen/providers/bytedance/bytedance.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/bytedance/bytedance.service.js +13 -13
- package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.d.ts +18 -0
- package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.js +102 -0
- package/lib/services/aiGen/providers/fal/falImage.service.d.ts +15 -0
- package/lib/services/aiGen/providers/fal/falImage.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/fal/falImage.service.js +141 -0
- package/lib/services/aiGen/providers/fal/index.d.ts +2 -0
- package/lib/services/aiGen/providers/fal/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/fal/index.js +17 -0
- package/lib/services/aiGen/providers/google/google.service.d.ts +11 -2
- package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/google/google.service.js +245 -28
- package/lib/services/aiGen/providers/index.d.ts +3 -0
- package/lib/services/aiGen/providers/index.d.ts.map +1 -1
- package/lib/services/aiGen/providers/index.js +3 -0
- package/lib/services/aiGen/providers/kling/cameraAdapter.d.ts +4 -0
- package/lib/services/aiGen/providers/kling/cameraAdapter.d.ts.map +1 -0
- package/lib/services/aiGen/providers/kling/cameraAdapter.js +53 -0
- package/lib/services/aiGen/providers/kling/index.d.ts +1 -0
- package/lib/services/aiGen/providers/kling/index.d.ts.map +1 -1
- package/lib/services/aiGen/providers/kling/index.js +1 -0
- package/lib/services/aiGen/providers/kling/kling.service.d.ts +12 -1
- package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/kling/kling.service.js +357 -26
- package/lib/services/aiGen/providers/kling/klingImage.service.d.ts +21 -0
- package/lib/services/aiGen/providers/kling/klingImage.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/kling/klingImage.service.js +208 -0
- package/lib/services/aiGen/providers/kling/types.d.ts +105 -0
- package/lib/services/aiGen/providers/kling/types.d.ts.map +1 -1
- package/lib/services/aiGen/providers/minimax/minimax.service.d.ts +15 -2
- package/lib/services/aiGen/providers/minimax/minimax.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/minimax/minimax.service.js +127 -1
- package/lib/services/aiGen/providers/minimax/types.d.ts +10 -1
- package/lib/services/aiGen/providers/minimax/types.d.ts.map +1 -1
- package/lib/services/aiGen/providers/openai/openai.service.d.ts +8 -2
- package/lib/services/aiGen/providers/openai/openai.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/openai/openai.service.js +184 -7
- package/lib/services/aiGen/providers/pexels/index.d.ts +2 -0
- package/lib/services/aiGen/providers/pexels/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/{azure → pexels}/index.js +1 -1
- package/lib/services/aiGen/providers/pexels/pexels.service.d.ts +11 -0
- package/lib/services/aiGen/providers/pexels/pexels.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/pexels/pexels.service.js +150 -0
- package/lib/services/aiGen/providers/pixabay/index.d.ts +2 -0
- package/lib/services/aiGen/providers/pixabay/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/pixabay/index.js +17 -0
- package/lib/services/aiGen/providers/pixabay/pixabay.service.d.ts +12 -0
- package/lib/services/aiGen/providers/pixabay/pixabay.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/pixabay/pixabay.service.js +156 -0
- package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/pixverse/pixverse.service.js +125 -2
- package/lib/services/aiGen/providers/runway/cameraAdapter.d.ts +3 -0
- package/lib/services/aiGen/providers/runway/cameraAdapter.d.ts.map +1 -0
- package/lib/services/aiGen/providers/runway/cameraAdapter.js +46 -0
- package/lib/services/aiGen/providers/runway/runway.service.d.ts +12 -2
- package/lib/services/aiGen/providers/runway/runway.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/runway/runway.service.js +224 -21
- package/lib/services/aiGen/providers/types.d.ts +263 -6
- package/lib/services/aiGen/providers/types.d.ts.map +1 -1
- package/lib/services/aiGen/providers/unsplash/index.d.ts +2 -0
- package/lib/services/aiGen/providers/unsplash/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/unsplash/index.js +17 -0
- package/lib/services/aiGen/providers/unsplash/unsplash.service.d.ts +16 -0
- package/lib/services/aiGen/providers/unsplash/unsplash.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/unsplash/unsplash.service.js +131 -0
- package/lib/services/analytics.service.js +2 -4
- package/lib/services/apiUsageCounter.service.d.ts +20 -0
- package/lib/services/apiUsageCounter.service.d.ts.map +1 -0
- package/lib/services/apiUsageCounter.service.js +84 -0
- package/lib/services/asr/assemblyai.service.d.ts +72 -0
- package/lib/services/asr/assemblyai.service.d.ts.map +1 -0
- package/lib/services/asr/assemblyai.service.js +89 -0
- package/lib/services/asr/index.d.ts +3 -0
- package/lib/services/asr/index.d.ts.map +1 -0
- package/lib/services/asr/index.js +18 -0
- package/lib/services/asr/whisper.service.d.ts +18 -0
- package/lib/services/asr/whisper.service.d.ts.map +1 -0
- package/lib/services/asr/whisper.service.js +151 -0
- package/lib/services/assetCache.service.d.ts +54 -0
- package/lib/services/assetCache.service.d.ts.map +1 -0
- package/lib/services/assetCache.service.js +109 -0
- package/lib/services/audioAnalysis/index.d.ts +2 -0
- package/lib/services/audioAnalysis/index.d.ts.map +1 -0
- package/lib/services/audioAnalysis/index.js +17 -0
- package/lib/services/audioAnalysis/onsetDetection.service.d.ts +50 -0
- package/lib/services/audioAnalysis/onsetDetection.service.d.ts.map +1 -0
- package/lib/services/audioAnalysis/onsetDetection.service.js +140 -0
- package/lib/services/bullmq.service.d.ts +6 -1
- package/lib/services/bullmq.service.d.ts.map +1 -1
- package/lib/services/bullmq.service.js +62 -14
- package/lib/services/credit.service.d.ts.map +1 -1
- package/lib/services/credit.service.js +45 -7
- package/lib/services/credits/pricing.d.ts +58 -0
- package/lib/services/credits/pricing.d.ts.map +1 -0
- package/lib/services/credits/pricing.js +111 -0
- package/lib/services/editor/designToProject.d.ts +75 -0
- package/lib/services/editor/designToProject.d.ts.map +1 -0
- package/lib/services/editor/designToProject.js +295 -0
- package/lib/services/editor/planToProject.d.ts +84 -0
- package/lib/services/editor/planToProject.d.ts.map +1 -0
- package/lib/services/editor/planToProject.js +395 -0
- package/lib/services/editor/projectToDesign.d.ts +4 -0
- package/lib/services/editor/projectToDesign.d.ts.map +1 -0
- package/lib/services/editor/projectToDesign.js +186 -0
- package/lib/services/firestore.service.d.ts +17 -0
- package/lib/services/firestore.service.d.ts.map +1 -1
- package/lib/services/firestore.service.js +30 -0
- package/lib/services/gcp/index.d.ts +1 -0
- package/lib/services/gcp/index.d.ts.map +1 -1
- package/lib/services/gcp/index.js +1 -0
- package/lib/services/gcp/uploadAudioBuffer.d.ts +13 -0
- package/lib/services/gcp/uploadAudioBuffer.d.ts.map +1 -0
- package/lib/services/gcp/uploadAudioBuffer.js +28 -0
- package/lib/services/index.d.ts +13 -0
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/index.js +13 -0
- package/lib/services/musicGen/index.d.ts +6 -0
- package/lib/services/musicGen/index.d.ts.map +1 -0
- package/lib/services/musicGen/index.js +26 -0
- package/lib/services/musicGen/musicSearchFactory.service.d.ts +14 -0
- package/lib/services/musicGen/musicSearchFactory.service.d.ts.map +1 -0
- package/lib/services/musicGen/musicSearchFactory.service.js +59 -0
- package/lib/services/musicGen/providers/curated.service.d.ts +24 -0
- package/lib/services/musicGen/providers/curated.service.d.ts.map +1 -0
- package/lib/services/musicGen/providers/curated.service.js +173 -0
- package/lib/services/musicGen/providers/jamendo.service.d.ts +8 -0
- package/lib/services/musicGen/providers/jamendo.service.d.ts.map +1 -0
- package/lib/services/musicGen/providers/jamendo.service.js +113 -0
- package/lib/services/musicGen/providers/mubert.service.d.ts +10 -0
- package/lib/services/musicGen/providers/mubert.service.d.ts.map +1 -0
- package/lib/services/musicGen/providers/mubert.service.js +128 -0
- package/lib/services/musicGen/types.d.ts +46 -0
- package/lib/services/musicGen/types.d.ts.map +1 -0
- package/lib/services/musicGen/types.js +10 -0
- package/lib/services/notification.service.d.ts +22 -0
- package/lib/services/notification.service.d.ts.map +1 -0
- package/lib/services/notification.service.js +76 -0
- package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts +78 -0
- package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts.map +1 -0
- package/lib/services/rateLimiter/distributedRateLimiter.service.js +269 -0
- package/lib/services/rateLimiter/index.d.ts +2 -0
- package/lib/services/rateLimiter/index.d.ts.map +1 -0
- package/lib/services/rateLimiter/index.js +17 -0
- package/lib/services/redis.service.d.ts +9 -0
- package/lib/services/redis.service.d.ts.map +1 -1
- package/lib/services/redis.service.js +20 -11
- package/lib/services/redisOptions.d.ts +22 -0
- package/lib/services/redisOptions.d.ts.map +1 -0
- package/lib/services/redisOptions.js +51 -0
- package/lib/services/tts/index.d.ts +2 -0
- package/lib/services/tts/index.d.ts.map +1 -1
- package/lib/services/tts/index.js +2 -0
- package/lib/services/tts/providers/elevenlabs.service.d.ts.map +1 -1
- package/lib/services/tts/providers/elevenlabs.service.js +91 -24
- package/lib/services/tts/providers/minimax.service.d.ts +14 -0
- package/lib/services/tts/providers/minimax.service.d.ts.map +1 -0
- package/lib/services/tts/providers/minimax.service.js +78 -0
- package/lib/services/tts/providers/openai.service.d.ts +14 -0
- package/lib/services/tts/providers/openai.service.d.ts.map +1 -0
- package/lib/services/tts/providers/openai.service.js +73 -0
- package/lib/services/tts/ttsFactory.service.d.ts.map +1 -1
- package/lib/services/tts/ttsFactory.service.js +6 -0
- package/lib/services/tts/types.d.ts +33 -0
- package/lib/services/tts/types.d.ts.map +1 -1
- package/lib/utils/errors.d.ts +8 -0
- package/lib/utils/errors.d.ts.map +1 -1
- package/lib/utils/errors.js +8 -0
- package/lib/utils/helpers.d.ts +13 -0
- package/lib/utils/helpers.d.ts.map +1 -1
- package/lib/utils/helpers.js +48 -11
- package/lib/utils/logger.d.ts.map +1 -1
- package/lib/utils/logger.js +37 -1
- package/package.json +5 -1
- package/lib/services/aiGen/providers/azure/azure.service.d.ts +0 -14
- package/lib/services/aiGen/providers/azure/azure.service.d.ts.map +0 -1
- package/lib/services/aiGen/providers/azure/azure.service.js +0 -108
- package/lib/services/aiGen/providers/azure/index.d.ts +0 -2
- package/lib/services/aiGen/providers/azure/index.d.ts.map +0 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PersonaRouter = exports.PERSONA_PACKS = exports.AgentPersonaSchema = void 0;
|
|
4
|
+
exports.resolveConsistencyTier = resolveConsistencyTier;
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const agentPersona_schema_1 = require("../../schemas/agentPersona.schema");
|
|
7
|
+
Object.defineProperty(exports, "AgentPersonaSchema", { enumerable: true, get: function () { return agentPersona_schema_1.AgentPersonaSchema; } });
|
|
8
|
+
const modelRouter_1 = require("./modelRouter");
|
|
9
|
+
exports.PERSONA_PACKS = {
|
|
10
|
+
"ugc-ad": {
|
|
11
|
+
id: "ugc-ad",
|
|
12
|
+
label: "UGC Ad",
|
|
13
|
+
blurb: "Hook-first 9:16 ads with creator energy and punchy product reveals.",
|
|
14
|
+
defaults: {
|
|
15
|
+
aspect: "9:16",
|
|
16
|
+
durationSec: 30,
|
|
17
|
+
tone: "warm",
|
|
18
|
+
pacing: "fast",
|
|
19
|
+
hookStyle: "pattern-interrupt",
|
|
20
|
+
tierBudget: "T2",
|
|
21
|
+
},
|
|
22
|
+
plannerPrompt: [
|
|
23
|
+
"UGC ad rules:",
|
|
24
|
+
"- First 3s MUST be a problem-statement or pattern-interrupt hook (no logos, no slow b-roll).",
|
|
25
|
+
"- Cut every 1.5–2.5s after the hook.",
|
|
26
|
+
"- Voiceover or talking-head drives the script; visuals support, not lead.",
|
|
27
|
+
"- End with a one-sentence CTA + product name burned in.",
|
|
28
|
+
"- Avoid medical / unverifiable claims (legal risk).",
|
|
29
|
+
].join("\n"),
|
|
30
|
+
defaultBpm: 110,
|
|
31
|
+
criticEmphasis: { hookStrength: 0.3, brandSafety: 0.2 },
|
|
32
|
+
recommendedConsistencyTier: "C2",
|
|
33
|
+
},
|
|
34
|
+
"faceless-yt": {
|
|
35
|
+
id: "faceless-yt",
|
|
36
|
+
label: "Faceless YouTube",
|
|
37
|
+
blurb: "Educational 16:9 explainers built mostly from cheap stock + voiceover.",
|
|
38
|
+
defaults: {
|
|
39
|
+
aspect: "16:9",
|
|
40
|
+
durationSec: 60,
|
|
41
|
+
tone: "informational",
|
|
42
|
+
pacing: "medium",
|
|
43
|
+
hookStyle: "bold-claim",
|
|
44
|
+
tierBudget: "T0",
|
|
45
|
+
},
|
|
46
|
+
plannerPrompt: [
|
|
47
|
+
"Faceless YouTube rules:",
|
|
48
|
+
"- Mostly T0 (stock + Ken Burns) to keep cost <$0.10/video.",
|
|
49
|
+
"- Hook = counter-intuitive claim or surprising stat in first 8s.",
|
|
50
|
+
"- Captions burned in; assume sound-off viewing.",
|
|
51
|
+
"- 1 voiceover line per scene; visuals illustrate the line literally.",
|
|
52
|
+
"- Avoid copyrighted footage; prefer stock and AI-generated stills.",
|
|
53
|
+
].join("\n"),
|
|
54
|
+
criticEmphasis: { costVsTier: 0.25, voVisualSync: 0.25 },
|
|
55
|
+
recommendedConsistencyTier: "C1",
|
|
56
|
+
},
|
|
57
|
+
"product-demo": {
|
|
58
|
+
id: "product-demo",
|
|
59
|
+
label: "Product Demo",
|
|
60
|
+
blurb: "Square e-comm demos with hero shot first and crisp end-cards.",
|
|
61
|
+
defaults: {
|
|
62
|
+
aspect: "1:1",
|
|
63
|
+
durationSec: 20,
|
|
64
|
+
tone: "energetic",
|
|
65
|
+
pacing: "fast",
|
|
66
|
+
hookStyle: "demo",
|
|
67
|
+
tierBudget: "T2",
|
|
68
|
+
},
|
|
69
|
+
plannerPrompt: [
|
|
70
|
+
"Product demo rules:",
|
|
71
|
+
"- Hero product shot in first 3s (T2 image-to-video on the hero only).",
|
|
72
|
+
"- T0 stock or T1 AI image+motion for filler scenes between.",
|
|
73
|
+
"- Background music ducked under voiceover; no music-only sections.",
|
|
74
|
+
"- End-card with logo + CTA; aspect MUST match brief (default 1:1).",
|
|
75
|
+
].join("\n"),
|
|
76
|
+
criticEmphasis: { intentMatch: 0.3, brandSafety: 0.15 },
|
|
77
|
+
recommendedConsistencyTier: "C2",
|
|
78
|
+
},
|
|
79
|
+
"talking-head": {
|
|
80
|
+
id: "talking-head",
|
|
81
|
+
label: "Talking-Head Educator",
|
|
82
|
+
blurb: "Authority-driven explainers using a presenter avatar + b-roll cutaways.",
|
|
83
|
+
defaults: {
|
|
84
|
+
aspect: "16:9",
|
|
85
|
+
durationSec: 45,
|
|
86
|
+
tone: "professional",
|
|
87
|
+
pacing: "medium",
|
|
88
|
+
hookStyle: "question",
|
|
89
|
+
tierBudget: "T1",
|
|
90
|
+
},
|
|
91
|
+
plannerPrompt: [
|
|
92
|
+
"Talking-head educator rules:",
|
|
93
|
+
"- Persona is on-camera (avatar or stock talking-head); cut to b-roll for emphasis only.",
|
|
94
|
+
"- Open with a question the viewer has googled.",
|
|
95
|
+
"- One key insight per 10s; recap at end.",
|
|
96
|
+
"- Prefer T1 (image+motion) for b-roll; T0 stock fallbacks if budget tight.",
|
|
97
|
+
].join("\n"),
|
|
98
|
+
criticEmphasis: { intentMatch: 0.25, voVisualSync: 0.25 },
|
|
99
|
+
recommendedConsistencyTier: "C2",
|
|
100
|
+
},
|
|
101
|
+
"social-recap": {
|
|
102
|
+
id: "social-recap",
|
|
103
|
+
label: "Social Recap",
|
|
104
|
+
blurb: "Fast multi-clip recaps for news, sports, listicles — beat-cut energy.",
|
|
105
|
+
defaults: {
|
|
106
|
+
aspect: "9:16",
|
|
107
|
+
durationSec: 30,
|
|
108
|
+
tone: "energetic",
|
|
109
|
+
pacing: "very-fast",
|
|
110
|
+
hookStyle: "stat",
|
|
111
|
+
tierBudget: "T0",
|
|
112
|
+
},
|
|
113
|
+
plannerPrompt: [
|
|
114
|
+
"Social recap rules:",
|
|
115
|
+
"- Cuts on the music beat; assume an upbeat track at 110–130 BPM.",
|
|
116
|
+
"- 1 sentence per clip max; on-screen text mirrors voice.",
|
|
117
|
+
"- Mostly T0 stock; use AI generation sparingly for transitions.",
|
|
118
|
+
"- Hook = the most surprising stat or the punchline up front.",
|
|
119
|
+
].join("\n"),
|
|
120
|
+
defaultBpm: 120,
|
|
121
|
+
criticEmphasis: { pacingFit: 0.3, costVsTier: 0.2 },
|
|
122
|
+
recommendedConsistencyTier: "C1",
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* AG-30: resolve the consistency tier for an agent run. Brief wins when set
|
|
127
|
+
* explicitly; otherwise fall back to the persona's recommendation; otherwise
|
|
128
|
+
* the safe global default of C1. UGC / talking-head / product-demo
|
|
129
|
+
* recommend C2 because the same presenter/product needs to look identical
|
|
130
|
+
* across cuts — text descriptions alone produce a different actor every
|
|
131
|
+
* scene (Test 1 had 5 different women in 5 scenes on C1).
|
|
132
|
+
*/
|
|
133
|
+
function resolveConsistencyTier(persona, briefTier) {
|
|
134
|
+
if (briefTier)
|
|
135
|
+
return briefTier;
|
|
136
|
+
const personaTier = persona ? exports.PERSONA_PACKS[persona]?.recommendedConsistencyTier : undefined;
|
|
137
|
+
return personaTier ?? "C1";
|
|
138
|
+
}
|
|
139
|
+
const RoutedPersonaSchema = zod_1.z.object({
|
|
140
|
+
persona: agentPersona_schema_1.AgentPersonaSchema,
|
|
141
|
+
confidence: zod_1.z.number().min(0).max(1),
|
|
142
|
+
reason: zod_1.z.string(),
|
|
143
|
+
});
|
|
144
|
+
class PersonaRouter {
|
|
145
|
+
constructor(llm, router = new modelRouter_1.ModelRouter()) {
|
|
146
|
+
this.llm = llm;
|
|
147
|
+
this.router = router;
|
|
148
|
+
}
|
|
149
|
+
async route(rawPrompt) {
|
|
150
|
+
const model = this.router.pickFor("router");
|
|
151
|
+
const personaList = Object.values(exports.PERSONA_PACKS)
|
|
152
|
+
.map((p) => `- ${p.id}: ${p.blurb}`)
|
|
153
|
+
.join("\n");
|
|
154
|
+
const result = await this.llm.structured({
|
|
155
|
+
model,
|
|
156
|
+
fallbackModel: this.router.fallbackFor("router"),
|
|
157
|
+
schema: RoutedPersonaSchema,
|
|
158
|
+
schemaName: "RoutedPersona",
|
|
159
|
+
temperature: 0,
|
|
160
|
+
messages: [
|
|
161
|
+
{
|
|
162
|
+
role: "system",
|
|
163
|
+
content: [
|
|
164
|
+
"Classify the user's video request into ONE persona.",
|
|
165
|
+
"Personas:",
|
|
166
|
+
personaList,
|
|
167
|
+
"",
|
|
168
|
+
"Pick the closest fit. confidence 0..1; reason in <20 words.",
|
|
169
|
+
].join("\n"),
|
|
170
|
+
},
|
|
171
|
+
{ role: "user", content: rawPrompt },
|
|
172
|
+
],
|
|
173
|
+
});
|
|
174
|
+
return result.data;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.PersonaRouter = PersonaRouter;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { VideoPlan } from "../../schemas/videoPlan.schema";
|
|
2
|
+
import type { RegenComponent } from "../credits/pricing";
|
|
3
|
+
/**
|
|
4
|
+
* Stage 7 slice 2 — plan diff engine.
|
|
5
|
+
*
|
|
6
|
+
* Computes a structured changeset between two VideoPlans and derives which
|
|
7
|
+
* per-scene components (visual / voiceover / overlays / captions) and which
|
|
8
|
+
* top-level singletons (music) would need to be regenerated to materialize
|
|
9
|
+
* the new plan from the old project.
|
|
10
|
+
*
|
|
11
|
+
* Pure / no I/O. Feeds slice 3's bulk-regen endpoint: the endpoint takes the
|
|
12
|
+
* `regenTargets` array and fans out to the existing per-component regen
|
|
13
|
+
* handlers (regenerateScene / regenerateVoiceover / regenerateOverlays /
|
|
14
|
+
* regenerateCaptions / regenerateMusic).
|
|
15
|
+
*
|
|
16
|
+
* Why a separate helper and not just "regen everything that's different":
|
|
17
|
+
* each regen costs money. The user might edit only scene 3's voiceoverLine
|
|
18
|
+
* — we'd waste $0.30+ on visual regens if we naively reflowed every scene.
|
|
19
|
+
* The diff makes the actual change-set explicit.
|
|
20
|
+
*
|
|
21
|
+
* Field → component mapping:
|
|
22
|
+
* prompt, strategy, preferredModel, preferredProvider, durationMs,
|
|
23
|
+
* tier, bibleEntityIds, characterAnchorSceneIndex, avatarFaceUrl
|
|
24
|
+
* → visual
|
|
25
|
+
* voiceoverLine, voiceStyle → voiceover
|
|
26
|
+
* + captions (derived from VO audio)
|
|
27
|
+
* overlays, onScreenText → overlays
|
|
28
|
+
* transitionIn → none (stitch-time)
|
|
29
|
+
* estimatedCredits, intent → none (derived / informational)
|
|
30
|
+
*
|
|
31
|
+
* Plan-level cascades:
|
|
32
|
+
* aspect change → all scenes' visual
|
|
33
|
+
* voiceId / voiceStyle → all scenes' voiceover + captions
|
|
34
|
+
* bible.* → all scenes' visual (bible drives reference images)
|
|
35
|
+
* music.* → music singleton
|
|
36
|
+
*/
|
|
37
|
+
export interface RegenTarget {
|
|
38
|
+
component: RegenComponent;
|
|
39
|
+
/** Omitted for "music" — there is one music clip per project. */
|
|
40
|
+
sceneIndex?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface SceneDiff {
|
|
43
|
+
sceneIndex: number;
|
|
44
|
+
kind: "added" | "removed" | "modified";
|
|
45
|
+
/** Names of scene fields that differ. Empty for "removed" (nothing to regen). */
|
|
46
|
+
changedFields: string[];
|
|
47
|
+
/** Derived from changedFields via the mapping above. */
|
|
48
|
+
affectedComponents: RegenComponent[];
|
|
49
|
+
}
|
|
50
|
+
export interface PlanLevelChanges {
|
|
51
|
+
aspectChanged: boolean;
|
|
52
|
+
voiceIdChanged: boolean;
|
|
53
|
+
voiceStyleChanged: boolean;
|
|
54
|
+
bibleChanged: boolean;
|
|
55
|
+
musicChanged: boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface PlanDiff {
|
|
58
|
+
hasChanges: boolean;
|
|
59
|
+
sceneChanges: SceneDiff[];
|
|
60
|
+
planLevel: PlanLevelChanges;
|
|
61
|
+
/**
|
|
62
|
+
* Deduplicated list of components × scenes that need regen. Already
|
|
63
|
+
* accounts for plan-level cascades — if aspect changed, every existing
|
|
64
|
+
* scene's visual is included here even if its own fields didn't change.
|
|
65
|
+
* Stable order: scene 0 first (visual → voiceover → overlays → captions),
|
|
66
|
+
* then scene 1, ..., then "music" last.
|
|
67
|
+
*/
|
|
68
|
+
regenTargets: RegenTarget[];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Diff two plans. Both args required — fresh-project bootstrap should call
|
|
72
|
+
* /execute, not /regenerate-bulk, so there's no "old plan is undefined" case
|
|
73
|
+
* to support here.
|
|
74
|
+
*/
|
|
75
|
+
export declare function diffPlans(oldPlan: VideoPlan, newPlan: VideoPlan): PlanDiff;
|
|
76
|
+
//# sourceMappingURL=planDiff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planDiff.d.ts","sourceRoot":"","sources":["../../../src/services/agent/planDiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,SAAS,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,cAAc,CAAC;IAC1B,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACvC,iFAAiF;IACjF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,wDAAwD;IACxD,kBAAkB,EAAE,cAAc,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,SAAS,EAAE,gBAAgB,CAAC;IAC5B;;;;;;OAMG;IACH,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAoGD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,QAAQ,CAwF1E"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.diffPlans = diffPlans;
|
|
4
|
+
/**
|
|
5
|
+
* Per-component mapping. Some fields fan out to multiple components (e.g.
|
|
6
|
+
* voiceoverLine drives both VO audio AND its caption transcript).
|
|
7
|
+
*/
|
|
8
|
+
const SCENE_FIELD_TO_COMPONENTS = {
|
|
9
|
+
prompt: ["visual"],
|
|
10
|
+
strategy: ["visual"],
|
|
11
|
+
preferredModel: ["visual"],
|
|
12
|
+
preferredProvider: ["visual"],
|
|
13
|
+
durationMs: ["visual"],
|
|
14
|
+
tier: ["visual"],
|
|
15
|
+
bibleEntityIds: ["visual"],
|
|
16
|
+
characterAnchorSceneIndex: ["visual"],
|
|
17
|
+
avatarFaceUrl: ["visual"],
|
|
18
|
+
voiceoverLine: ["voiceover", "captions"],
|
|
19
|
+
voiceStyle: ["voiceover", "captions"],
|
|
20
|
+
overlays: ["overlays"],
|
|
21
|
+
onScreenText: ["overlays"],
|
|
22
|
+
};
|
|
23
|
+
const SCENE_FIELDS_TO_DIFF = [
|
|
24
|
+
"prompt",
|
|
25
|
+
"strategy",
|
|
26
|
+
"preferredModel",
|
|
27
|
+
"preferredProvider",
|
|
28
|
+
"durationMs",
|
|
29
|
+
"tier",
|
|
30
|
+
"bibleEntityIds",
|
|
31
|
+
"characterAnchorSceneIndex",
|
|
32
|
+
"avatarFaceUrl",
|
|
33
|
+
"voiceoverLine",
|
|
34
|
+
"voiceStyle",
|
|
35
|
+
"overlays",
|
|
36
|
+
"onScreenText",
|
|
37
|
+
];
|
|
38
|
+
function stableStringify(value) {
|
|
39
|
+
if (value === undefined)
|
|
40
|
+
return "undefined";
|
|
41
|
+
if (value === null)
|
|
42
|
+
return "null";
|
|
43
|
+
if (typeof value === "number")
|
|
44
|
+
return Number.isFinite(value) ? String(value) : "null";
|
|
45
|
+
if (typeof value === "string" || typeof value === "boolean")
|
|
46
|
+
return JSON.stringify(value);
|
|
47
|
+
if (Array.isArray(value)) {
|
|
48
|
+
return "[" + value.map(stableStringify).join(",") + "]";
|
|
49
|
+
}
|
|
50
|
+
if (typeof value === "object") {
|
|
51
|
+
const obj = value;
|
|
52
|
+
const keys = Object.keys(obj).sort();
|
|
53
|
+
return ("{" +
|
|
54
|
+
keys
|
|
55
|
+
.map((k) => JSON.stringify(k) + ":" + stableStringify(obj[k]))
|
|
56
|
+
.join(",") +
|
|
57
|
+
"}");
|
|
58
|
+
}
|
|
59
|
+
return "null";
|
|
60
|
+
}
|
|
61
|
+
function fieldChanged(a, b) {
|
|
62
|
+
return stableStringify(a) !== stableStringify(b);
|
|
63
|
+
}
|
|
64
|
+
function diffScene(oldScene, newScene) {
|
|
65
|
+
const changedFields = [];
|
|
66
|
+
for (const field of SCENE_FIELDS_TO_DIFF) {
|
|
67
|
+
if (fieldChanged(oldScene[field], newScene[field])) {
|
|
68
|
+
changedFields.push(field);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (changedFields.length === 0)
|
|
72
|
+
return null;
|
|
73
|
+
const affected = new Set();
|
|
74
|
+
for (const field of changedFields) {
|
|
75
|
+
const mapped = SCENE_FIELD_TO_COMPONENTS[field];
|
|
76
|
+
if (mapped) {
|
|
77
|
+
for (const c of mapped)
|
|
78
|
+
affected.add(c);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
sceneIndex: newScene.sceneIndex,
|
|
83
|
+
kind: "modified",
|
|
84
|
+
changedFields,
|
|
85
|
+
affectedComponents: Array.from(affected),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function diffPlanLevel(oldPlan, newPlan) {
|
|
89
|
+
return {
|
|
90
|
+
aspectChanged: oldPlan.aspect !== newPlan.aspect,
|
|
91
|
+
voiceIdChanged: (oldPlan.voiceId ?? null) !== (newPlan.voiceId ?? null),
|
|
92
|
+
voiceStyleChanged: (oldPlan.voiceStyle ?? null) !== (newPlan.voiceStyle ?? null),
|
|
93
|
+
bibleChanged: fieldChanged(oldPlan.bible, newPlan.bible),
|
|
94
|
+
musicChanged: fieldChanged(oldPlan.music, newPlan.music),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Diff two plans. Both args required — fresh-project bootstrap should call
|
|
99
|
+
* /execute, not /regenerate-bulk, so there's no "old plan is undefined" case
|
|
100
|
+
* to support here.
|
|
101
|
+
*/
|
|
102
|
+
function diffPlans(oldPlan, newPlan) {
|
|
103
|
+
// Index scenes by sceneIndex (NOT array position — planners may reorder).
|
|
104
|
+
const oldByIdx = new Map(oldPlan.scenes.map((s) => [s.sceneIndex, s]));
|
|
105
|
+
const newByIdx = new Map(newPlan.scenes.map((s) => [s.sceneIndex, s]));
|
|
106
|
+
const sceneChanges = [];
|
|
107
|
+
// Added or modified — iterate the new plan so order matches scene order.
|
|
108
|
+
for (const newScene of newPlan.scenes) {
|
|
109
|
+
const oldScene = oldByIdx.get(newScene.sceneIndex);
|
|
110
|
+
if (!oldScene) {
|
|
111
|
+
// Brand new scene — every component needs to be produced.
|
|
112
|
+
const affected = ["visual"];
|
|
113
|
+
if (newScene.voiceoverLine) {
|
|
114
|
+
affected.push("voiceover", "captions");
|
|
115
|
+
}
|
|
116
|
+
if (newScene.overlays?.length || newScene.onScreenText) {
|
|
117
|
+
affected.push("overlays");
|
|
118
|
+
}
|
|
119
|
+
sceneChanges.push({
|
|
120
|
+
sceneIndex: newScene.sceneIndex,
|
|
121
|
+
kind: "added",
|
|
122
|
+
changedFields: [],
|
|
123
|
+
affectedComponents: affected,
|
|
124
|
+
});
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const modDiff = diffScene(oldScene, newScene);
|
|
128
|
+
if (modDiff)
|
|
129
|
+
sceneChanges.push(modDiff);
|
|
130
|
+
}
|
|
131
|
+
// Removed.
|
|
132
|
+
for (const oldScene of oldPlan.scenes) {
|
|
133
|
+
if (!newByIdx.has(oldScene.sceneIndex)) {
|
|
134
|
+
sceneChanges.push({
|
|
135
|
+
sceneIndex: oldScene.sceneIndex,
|
|
136
|
+
kind: "removed",
|
|
137
|
+
changedFields: [],
|
|
138
|
+
affectedComponents: [],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const planLevel = diffPlanLevel(oldPlan, newPlan);
|
|
143
|
+
// Build deduplicated regen targets in stable order.
|
|
144
|
+
// 1) Per-scene targets, scene order, component order (visual → vo → overlays → captions).
|
|
145
|
+
const componentOrder = ["visual", "voiceover", "overlays", "captions"];
|
|
146
|
+
const seen = new Set();
|
|
147
|
+
const regenTargets = [];
|
|
148
|
+
// Per-scene targets from the diff (covers added + modified).
|
|
149
|
+
for (const newScene of newPlan.scenes) {
|
|
150
|
+
const change = sceneChanges.find((c) => c.sceneIndex === newScene.sceneIndex && c.kind !== "removed");
|
|
151
|
+
const componentsForScene = new Set(change?.affectedComponents ?? []);
|
|
152
|
+
// Plan-level cascades — only apply to scenes that still exist in newPlan.
|
|
153
|
+
if (planLevel.aspectChanged || planLevel.bibleChanged) {
|
|
154
|
+
componentsForScene.add("visual");
|
|
155
|
+
}
|
|
156
|
+
if ((planLevel.voiceIdChanged || planLevel.voiceStyleChanged) &&
|
|
157
|
+
newScene.voiceoverLine) {
|
|
158
|
+
componentsForScene.add("voiceover");
|
|
159
|
+
componentsForScene.add("captions");
|
|
160
|
+
}
|
|
161
|
+
for (const c of componentOrder) {
|
|
162
|
+
if (!componentsForScene.has(c))
|
|
163
|
+
continue;
|
|
164
|
+
const key = `${c}:${newScene.sceneIndex}`;
|
|
165
|
+
if (seen.has(key))
|
|
166
|
+
continue;
|
|
167
|
+
seen.add(key);
|
|
168
|
+
regenTargets.push({ component: c, sceneIndex: newScene.sceneIndex });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Music — singleton, no sceneIndex.
|
|
172
|
+
if (planLevel.musicChanged) {
|
|
173
|
+
regenTargets.push({ component: "music" });
|
|
174
|
+
}
|
|
175
|
+
const hasChanges = sceneChanges.length > 0 || regenTargets.length > 0;
|
|
176
|
+
return {
|
|
177
|
+
hasChanges,
|
|
178
|
+
sceneChanges,
|
|
179
|
+
planLevel,
|
|
180
|
+
regenTargets,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Project } from "../../schemas/project.schema";
|
|
2
|
+
/**
|
|
3
|
+
* planMutations — Stage 7-prep helper for the agent permission flow.
|
|
4
|
+
*
|
|
5
|
+
* When the agent is asked to (re)generate against an existing Project, the
|
|
6
|
+
* controller calls `findClipsNeedingPermission(currentProject)` BEFORE
|
|
7
|
+
* enqueuing the run. Any clip that is `locked === true` OR has a
|
|
8
|
+
* user-placed provenance source is surfaced as a `MutationProposal` so the
|
|
9
|
+
* drawer can prompt the user with a per-clip yes/no modal.
|
|
10
|
+
*
|
|
11
|
+
* v0 contract (this file): coarse — we list every protected clip in the
|
|
12
|
+
* current project. We don't yet diff against the new plan to determine
|
|
13
|
+
* which protected clips it would actually displace (that's Stage 7's diff
|
|
14
|
+
* engine). Over-prompting is acceptable for v0; under-prompting is not.
|
|
15
|
+
*
|
|
16
|
+
* Provenance sources considered "user-placed" (the agent should ask before
|
|
17
|
+
* touching them) are listed in USER_PLACED_PROVENANCE_SOURCES below.
|
|
18
|
+
*/
|
|
19
|
+
/** Provenance.source strings that mark a clip as user-placed (not agent-generated). */
|
|
20
|
+
export declare const USER_PLACED_PROVENANCE_SOURCES: ReadonlySet<string>;
|
|
21
|
+
export type MutationReason = "locked" | "user-placed";
|
|
22
|
+
export interface MutationProposal {
|
|
23
|
+
/** Existing clip id in `currentProject.clips`. */
|
|
24
|
+
clipId: string;
|
|
25
|
+
/** The clip's track kind (visual / voiceover / music / text / caption / unknown). */
|
|
26
|
+
clipKind: "visual" | "voiceover" | "music" | "text" | "caption" | "unknown";
|
|
27
|
+
/** Human-readable label for the modal row, e.g. "Scene 3 — voiceover". */
|
|
28
|
+
currentLabel: string;
|
|
29
|
+
/** Why the agent must ask. */
|
|
30
|
+
reason: MutationReason;
|
|
31
|
+
/** Original provenance source if known (e.g. "user-upload"). */
|
|
32
|
+
provenanceSource?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Returns the list of clips in `currentProject` that the agent must obtain
|
|
36
|
+
* user permission for before touching. Returns `[]` if there's no current
|
|
37
|
+
* project (first run on an empty canvas) or no protected clips.
|
|
38
|
+
*/
|
|
39
|
+
export declare function findClipsNeedingPermission(currentProject: Project | null | undefined): MutationProposal[];
|
|
40
|
+
/**
|
|
41
|
+
* Convenience predicate used by the controller before enqueueing a run.
|
|
42
|
+
* Returns true if the user must be prompted; false if the run can proceed
|
|
43
|
+
* straight through.
|
|
44
|
+
*/
|
|
45
|
+
export declare function requiresUserConfirmation(currentProject: Project | null | undefined): boolean;
|
|
46
|
+
//# sourceMappingURL=planMutations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planMutations.d.ts","sourceRoot":"","sources":["../../../src/services/agent/planMutations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAGlE;;;;;;;;;;;;;;;;GAgBG;AAEH,uFAAuF;AACvF,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,CAG7D,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5E,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAyDD;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,GACzC,gBAAgB,EAAE,CAgBpB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,GACzC,OAAO,CAET"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.USER_PLACED_PROVENANCE_SOURCES = void 0;
|
|
4
|
+
exports.findClipsNeedingPermission = findClipsNeedingPermission;
|
|
5
|
+
exports.requiresUserConfirmation = requiresUserConfirmation;
|
|
6
|
+
const planToProject_1 = require("../editor/planToProject");
|
|
7
|
+
/**
|
|
8
|
+
* planMutations — Stage 7-prep helper for the agent permission flow.
|
|
9
|
+
*
|
|
10
|
+
* When the agent is asked to (re)generate against an existing Project, the
|
|
11
|
+
* controller calls `findClipsNeedingPermission(currentProject)` BEFORE
|
|
12
|
+
* enqueuing the run. Any clip that is `locked === true` OR has a
|
|
13
|
+
* user-placed provenance source is surfaced as a `MutationProposal` so the
|
|
14
|
+
* drawer can prompt the user with a per-clip yes/no modal.
|
|
15
|
+
*
|
|
16
|
+
* v0 contract (this file): coarse — we list every protected clip in the
|
|
17
|
+
* current project. We don't yet diff against the new plan to determine
|
|
18
|
+
* which protected clips it would actually displace (that's Stage 7's diff
|
|
19
|
+
* engine). Over-prompting is acceptable for v0; under-prompting is not.
|
|
20
|
+
*
|
|
21
|
+
* Provenance sources considered "user-placed" (the agent should ask before
|
|
22
|
+
* touching them) are listed in USER_PLACED_PROVENANCE_SOURCES below.
|
|
23
|
+
*/
|
|
24
|
+
/** Provenance.source strings that mark a clip as user-placed (not agent-generated). */
|
|
25
|
+
exports.USER_PLACED_PROVENANCE_SOURCES = new Set([
|
|
26
|
+
"user-upload",
|
|
27
|
+
"user-library",
|
|
28
|
+
]);
|
|
29
|
+
/**
|
|
30
|
+
* Maps a clip to its track kind based on the project's track list. Falls
|
|
31
|
+
* back to "unknown" when the track id isn't declared (defensive — every
|
|
32
|
+
* clip's track should appear in project.tracks, but the schema doesn't
|
|
33
|
+
* enforce referential integrity yet).
|
|
34
|
+
*/
|
|
35
|
+
function clipKindFor(clip, project) {
|
|
36
|
+
// TRACK_ID values are the canonical track handles emitted by planToProject;
|
|
37
|
+
// checking them first cleanly separates voiceover from music (both have
|
|
38
|
+
// Track.kind === "audio") without depending on a free-form Track.name.
|
|
39
|
+
if (clip.trackId === planToProject_1.TRACK_ID.voiceover)
|
|
40
|
+
return "voiceover";
|
|
41
|
+
if (clip.trackId === planToProject_1.TRACK_ID.music)
|
|
42
|
+
return "music";
|
|
43
|
+
if (clip.trackId === planToProject_1.TRACK_ID.visual)
|
|
44
|
+
return "visual";
|
|
45
|
+
if (clip.trackId === planToProject_1.TRACK_ID.text)
|
|
46
|
+
return "text";
|
|
47
|
+
if (clip.trackId === planToProject_1.TRACK_ID.caption)
|
|
48
|
+
return "caption";
|
|
49
|
+
const track = project.tracks.find((t) => t.id === clip.trackId);
|
|
50
|
+
if (!track)
|
|
51
|
+
return "unknown";
|
|
52
|
+
switch (track.kind) {
|
|
53
|
+
case "video":
|
|
54
|
+
return "visual";
|
|
55
|
+
case "audio":
|
|
56
|
+
// Track.name is the only signal left to distinguish vo from music when
|
|
57
|
+
// the trackId doesn't match the planToProject canonical set (e.g. a
|
|
58
|
+
// user-added audio track in the editor).
|
|
59
|
+
return /voice|vo|narration/i.test(track.name ?? "") ? "voiceover" : "music";
|
|
60
|
+
case "text":
|
|
61
|
+
return "text";
|
|
62
|
+
case "caption":
|
|
63
|
+
return "caption";
|
|
64
|
+
case "fx":
|
|
65
|
+
return "unknown";
|
|
66
|
+
default:
|
|
67
|
+
return "unknown";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Best-effort label for the modal: prefer the clip's user-set `name`, else
|
|
72
|
+
* "<kind> clip @<seconds>s". Used purely for display — never relied on for
|
|
73
|
+
* identity (clip.id is the only stable handle).
|
|
74
|
+
*/
|
|
75
|
+
function clipLabel(clip, kind) {
|
|
76
|
+
if (clip.name && clip.name.trim().length > 0)
|
|
77
|
+
return clip.name.trim();
|
|
78
|
+
const seconds = Math.round((clip.display.from ?? 0) / 100) / 10;
|
|
79
|
+
return `${kind} clip @${seconds}s`;
|
|
80
|
+
}
|
|
81
|
+
function isProtected(clip) {
|
|
82
|
+
if (clip.locked)
|
|
83
|
+
return "locked";
|
|
84
|
+
const source = clip.provenance?.source;
|
|
85
|
+
if (source && exports.USER_PLACED_PROVENANCE_SOURCES.has(source))
|
|
86
|
+
return "user-placed";
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Returns the list of clips in `currentProject` that the agent must obtain
|
|
91
|
+
* user permission for before touching. Returns `[]` if there's no current
|
|
92
|
+
* project (first run on an empty canvas) or no protected clips.
|
|
93
|
+
*/
|
|
94
|
+
function findClipsNeedingPermission(currentProject) {
|
|
95
|
+
if (!currentProject)
|
|
96
|
+
return [];
|
|
97
|
+
const out = [];
|
|
98
|
+
for (const clip of currentProject.clips) {
|
|
99
|
+
const reason = isProtected(clip);
|
|
100
|
+
if (!reason)
|
|
101
|
+
continue;
|
|
102
|
+
const kind = clipKindFor(clip, currentProject);
|
|
103
|
+
out.push({
|
|
104
|
+
clipId: clip.id,
|
|
105
|
+
clipKind: kind,
|
|
106
|
+
currentLabel: clipLabel(clip, kind),
|
|
107
|
+
reason,
|
|
108
|
+
provenanceSource: clip.provenance?.source,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Convenience predicate used by the controller before enqueueing a run.
|
|
115
|
+
* Returns true if the user must be prompted; false if the run can proceed
|
|
116
|
+
* straight through.
|
|
117
|
+
*/
|
|
118
|
+
function requiresUserConfirmation(currentProject) {
|
|
119
|
+
return findClipsNeedingPermission(currentProject).length > 0;
|
|
120
|
+
}
|