vidspotai-shared 1.0.68 → 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 -30
- package/lib/globals/aiModels/index.d.ts.map +1 -1
- package/lib/globals/aiModels/index.js +7 -35
- 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 +76 -11
- 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 -8
- 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 -19
- 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 +128 -5
- 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,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.detectOnsets = detectOnsets;
|
|
40
|
+
const axios_1 = __importDefault(require("axios"));
|
|
41
|
+
const logger_1 = require("../../utils/logger");
|
|
42
|
+
let decodePromise;
|
|
43
|
+
async function loadDecode() {
|
|
44
|
+
if (!decodePromise) {
|
|
45
|
+
decodePromise = Promise.resolve().then(() => __importStar(require("audio-decode"))).then((m) => (m.default ?? m));
|
|
46
|
+
}
|
|
47
|
+
return decodePromise;
|
|
48
|
+
}
|
|
49
|
+
const TIMEOUT_MS = 12000;
|
|
50
|
+
const MAX_DOWNLOAD_BYTES = 30 * 1024 * 1024; // 30MB cap; longer tracks are rare and bloat memory.
|
|
51
|
+
const cache = new Map();
|
|
52
|
+
let essentiaPromise;
|
|
53
|
+
function isEnabled() {
|
|
54
|
+
return process.env.ENABLE_ONSET_DETECTION === "true";
|
|
55
|
+
}
|
|
56
|
+
async function loadEssentia() {
|
|
57
|
+
if (essentiaPromise)
|
|
58
|
+
return essentiaPromise;
|
|
59
|
+
essentiaPromise = (async () => {
|
|
60
|
+
// Dynamic require — keeps the WASM module out of the cold-start path
|
|
61
|
+
// for callers that never invoke onset detection (the default until
|
|
62
|
+
// the commercial license is in place).
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
64
|
+
const mod = require("essentia.js");
|
|
65
|
+
const wasm = mod.EssentiaWASM;
|
|
66
|
+
const inst = new mod.Essentia(wasm);
|
|
67
|
+
return inst;
|
|
68
|
+
})();
|
|
69
|
+
return essentiaPromise;
|
|
70
|
+
}
|
|
71
|
+
async function downloadAudio(url) {
|
|
72
|
+
const res = await axios_1.default.get(url, {
|
|
73
|
+
responseType: "arraybuffer",
|
|
74
|
+
timeout: 8000,
|
|
75
|
+
maxContentLength: MAX_DOWNLOAD_BYTES,
|
|
76
|
+
});
|
|
77
|
+
return Buffer.from(res.data);
|
|
78
|
+
}
|
|
79
|
+
function mixToMono(channels) {
|
|
80
|
+
if (channels.length === 1)
|
|
81
|
+
return channels[0];
|
|
82
|
+
const len = channels[0].length;
|
|
83
|
+
const out = new Float32Array(len);
|
|
84
|
+
for (let i = 0; i < len; i++) {
|
|
85
|
+
let sum = 0;
|
|
86
|
+
for (const ch of channels)
|
|
87
|
+
sum += ch[i];
|
|
88
|
+
out[i] = sum / channels.length;
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
async function runDetection(audioUrl) {
|
|
93
|
+
const buf = await downloadAudio(audioUrl);
|
|
94
|
+
const decode = await loadDecode();
|
|
95
|
+
const decoded = await decode(buf);
|
|
96
|
+
const mono = mixToMono(decoded.channelData);
|
|
97
|
+
const essentia = (await loadEssentia());
|
|
98
|
+
const signal = essentia.arrayToVector(mono);
|
|
99
|
+
const result = essentia.RhythmExtractor2013(signal);
|
|
100
|
+
const beats = [];
|
|
101
|
+
const beatVec = result.beats_position;
|
|
102
|
+
for (let i = 0; i < beatVec.size(); i++)
|
|
103
|
+
beats.push(beatVec.get(i));
|
|
104
|
+
if (!beats.length || !result.bpm)
|
|
105
|
+
return undefined;
|
|
106
|
+
return { bpm: Math.round(result.bpm), onsets: beats };
|
|
107
|
+
}
|
|
108
|
+
function withTimeout(p, ms) {
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
const t = setTimeout(() => resolve(undefined), ms);
|
|
111
|
+
p.then((v) => {
|
|
112
|
+
clearTimeout(t);
|
|
113
|
+
resolve(v);
|
|
114
|
+
}, (err) => {
|
|
115
|
+
clearTimeout(t);
|
|
116
|
+
logger_1.logger.warn("onsetDetection: withTimeout rejected", {
|
|
117
|
+
err: err?.stack ?? err?.message ?? String(err),
|
|
118
|
+
});
|
|
119
|
+
resolve(undefined);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async function detectOnsets(audioUrl) {
|
|
124
|
+
if (!isEnabled())
|
|
125
|
+
return undefined;
|
|
126
|
+
const hit = cache.get(audioUrl);
|
|
127
|
+
if (hit)
|
|
128
|
+
return hit;
|
|
129
|
+
const analysis = await withTimeout(runDetection(audioUrl), TIMEOUT_MS);
|
|
130
|
+
if (analysis) {
|
|
131
|
+
cache.set(audioUrl, analysis);
|
|
132
|
+
if (cache.size > 100) {
|
|
133
|
+
// Drop oldest entry to bound memory; Map preserves insertion order.
|
|
134
|
+
const firstKey = cache.keys().next().value;
|
|
135
|
+
if (firstKey)
|
|
136
|
+
cache.delete(firstKey);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return analysis;
|
|
140
|
+
}
|
|
@@ -22,7 +22,12 @@ declare class BullMQService {
|
|
|
22
22
|
jobId?: string;
|
|
23
23
|
delay?: number;
|
|
24
24
|
}): Promise<void>;
|
|
25
|
-
startWorkers(queueNames: string[], processor: (job: Job) => Promise<void
|
|
25
|
+
startWorkers(queueNames: string[], processor: (job: Job) => Promise<void>, perQueueOptions?: Record<string, {
|
|
26
|
+
lockDuration?: number;
|
|
27
|
+
stalledInterval?: number;
|
|
28
|
+
maxStalledCount?: number;
|
|
29
|
+
concurrency?: number;
|
|
30
|
+
}>): void;
|
|
26
31
|
}
|
|
27
32
|
export declare const bullmq: BullMQService;
|
|
28
33
|
export type BullMQJob = Job;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bullmq.service.d.ts","sourceRoot":"","sources":["../../src/services/bullmq.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"bullmq.service.d.ts","sourceRoot":"","sources":["../../src/services/bullmq.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvC,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE1C,UAAU,oBAAoB;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO;WAQO,WAAW,CAAC,OAAO,EAAE,oBAAoB;IAOvD,sDAAsD;IACzC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBlC,gBAAgB;IACH,MAAM,CACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EACb,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAUpC,YAAY,CACjB,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,EACtC,eAAe,CAAC,EAAE,MAAM,CACtB,MAAM,EACN;QACE,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CACF;CA+FJ;AASD,eAAO,MAAM,MAAM,eAGjB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,GAAG,CAAC"}
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.bullmq = void 0;
|
|
4
4
|
// libs/bullmqService.ts
|
|
5
5
|
const bullmq_1 = require("bullmq");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
|
+
const redisOptions_1 = require("./redisOptions");
|
|
6
8
|
class BullMQService {
|
|
7
9
|
constructor({ redisOptions, concurrency = 10, }) {
|
|
8
10
|
this.queues = new Map();
|
|
@@ -32,10 +34,12 @@ class BullMQService {
|
|
|
32
34
|
testQueueClient.ping();
|
|
33
35
|
await testQueue.close();
|
|
34
36
|
this.initialized = true;
|
|
35
|
-
|
|
37
|
+
logger_1.logger.info("BullMQService initialized and connected to Redis");
|
|
36
38
|
}
|
|
37
39
|
catch (err) {
|
|
38
|
-
|
|
40
|
+
logger_1.logger.error("BullMQService failed to connect to Redis", {
|
|
41
|
+
err: err instanceof Error ? err.stack ?? err.message : String(err),
|
|
42
|
+
});
|
|
39
43
|
throw err;
|
|
40
44
|
}
|
|
41
45
|
}
|
|
@@ -48,7 +52,7 @@ class BullMQService {
|
|
|
48
52
|
this.queues.set(queueName, queue);
|
|
49
53
|
await queue.add(opts?.jobId || "default", data, { delay: opts?.delay });
|
|
50
54
|
}
|
|
51
|
-
startWorkers(queueNames, processor) {
|
|
55
|
+
startWorkers(queueNames, processor, perQueueOptions) {
|
|
52
56
|
const start = async () => {
|
|
53
57
|
if (!this.initialized)
|
|
54
58
|
await this.init();
|
|
@@ -56,44 +60,88 @@ class BullMQService {
|
|
|
56
60
|
const queue = this.queues.get(queueName) ??
|
|
57
61
|
new bullmq_1.Queue(queueName, { connection: this.redisOptions });
|
|
58
62
|
this.queues.set(queueName, queue);
|
|
63
|
+
const overrides = perQueueOptions?.[queueName] ?? {};
|
|
59
64
|
const worker = new bullmq_1.Worker(queueName, async (job) => processor(job), {
|
|
60
65
|
connection: this.redisOptions,
|
|
61
|
-
concurrency: this.concurrency,
|
|
66
|
+
concurrency: overrides.concurrency ?? this.concurrency,
|
|
67
|
+
// N5 (agent refactor Stage 2). Explicit lock semantics:
|
|
68
|
+
// - lockDuration: 60s default. BullMQ auto-renews while the
|
|
69
|
+
// worker is alive; bumped above the 30s default so a slow
|
|
70
|
+
// Firestore write or GC pause can't drop the lock mid-job.
|
|
71
|
+
// Per-queue override required for long CPU-bound jobs
|
|
72
|
+
// (render: Remotion blocks the event loop, lock renewal
|
|
73
|
+
// heartbeat misses, scheduler rescues → duplicate render).
|
|
74
|
+
// - stalledInterval: 30s. How often the scheduler checks for
|
|
75
|
+
// jobs whose lock expired (worker crashed or got SIGKILL'd).
|
|
76
|
+
// - maxStalledCount: 1. A crashed job gets exactly one
|
|
77
|
+
// handoff to a fresh worker; if that one also crashes the
|
|
78
|
+
// job moves to failed instead of looping forever on a
|
|
79
|
+
// poison payload. Agent reruns rely on the providerTaskCache
|
|
80
|
+
// replay (N4) for cheap resume rather than re-submission.
|
|
81
|
+
lockDuration: overrides.lockDuration ?? 60000,
|
|
82
|
+
stalledInterval: overrides.stalledInterval ?? 30000,
|
|
83
|
+
maxStalledCount: overrides.maxStalledCount ?? 1,
|
|
84
|
+
});
|
|
85
|
+
worker.on("completed", (job) => logger_1.logger.info(`BullMQ job completed`, {
|
|
86
|
+
queueName,
|
|
87
|
+
jobId: job.id,
|
|
88
|
+
}));
|
|
89
|
+
// Job-level failure (processor threw or exhausted retries). Routes to
|
|
90
|
+
// Slack via the winston error transport so a stuck provider or a
|
|
91
|
+
// bad payload always surfaces. Stack tail truncated to keep Slack
|
|
92
|
+
// payloads under their block-size limits.
|
|
93
|
+
worker.on("failed", (job, err) => {
|
|
94
|
+
logger_1.logger.error(`BullMQ job failed`, {
|
|
95
|
+
queueName,
|
|
96
|
+
jobId: job?.id,
|
|
97
|
+
jobName: job?.name,
|
|
98
|
+
userId: job?.data?.userId,
|
|
99
|
+
attemptsMade: job?.attemptsMade,
|
|
100
|
+
failedReason: job?.failedReason,
|
|
101
|
+
err: err?.stack ?? err?.message ?? String(err),
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
// Worker-shell failure (Redis lost, malformed payload, processor
|
|
105
|
+
// import error, etc.). Without this handler these crashes are silent.
|
|
106
|
+
worker.on("error", (err) => {
|
|
107
|
+
logger_1.logger.error(`BullMQ worker error`, {
|
|
108
|
+
queueName,
|
|
109
|
+
err: err?.stack ?? err?.message ?? String(err),
|
|
110
|
+
});
|
|
62
111
|
});
|
|
63
|
-
worker.on("completed", (job) => console.log(`✅ [${queueName}] Job ${job.id} completed`));
|
|
64
|
-
worker.on("failed", (job, err) => console.error(`❌ [${queueName}] Job ${job?.id} failed:`, err));
|
|
65
112
|
this.workers.push(worker);
|
|
66
113
|
}
|
|
67
|
-
|
|
114
|
+
logger_1.logger.info(`Started workers for queues`, { queueNames });
|
|
68
115
|
// Setup graceful shutdown
|
|
69
116
|
const graceful = async () => {
|
|
70
117
|
if (this.shuttingDown)
|
|
71
118
|
return;
|
|
72
119
|
this.shuttingDown = true;
|
|
73
|
-
|
|
120
|
+
logger_1.logger.info("Shutting down BullMQ workers gracefully...");
|
|
74
121
|
for (const worker of this.workers) {
|
|
75
122
|
await worker.close();
|
|
76
|
-
|
|
123
|
+
logger_1.logger.info(`Worker for queue closed`, { queueName: worker.name });
|
|
77
124
|
}
|
|
78
|
-
|
|
125
|
+
logger_1.logger.info("All workers closed. Exiting process.");
|
|
79
126
|
process.exit(0);
|
|
80
127
|
};
|
|
81
128
|
process.on("SIGINT", graceful);
|
|
82
129
|
process.on("SIGTERM", graceful);
|
|
83
130
|
};
|
|
84
131
|
start().catch((err) => {
|
|
85
|
-
|
|
132
|
+
logger_1.logger.error("BullMQ failed to start workers — process exiting", {
|
|
133
|
+
queueNames,
|
|
134
|
+
err: err?.stack ?? err?.message ?? String(err),
|
|
135
|
+
});
|
|
86
136
|
process.exit(1);
|
|
87
137
|
});
|
|
88
138
|
}
|
|
89
139
|
}
|
|
90
140
|
const redisOptions = {
|
|
141
|
+
...redisOptions_1.sharedRedisOptions,
|
|
91
142
|
host: process.env.REDIS_HOST,
|
|
92
143
|
port: Number(process.env.REDIS_PORT),
|
|
93
144
|
password: process.env.REDIS_PASSWORD,
|
|
94
|
-
// username: process.env.REDIS_USERNAME,
|
|
95
|
-
// tls: {},
|
|
96
|
-
maxRetriesPerRequest: null, // REQUIRED for BullMQ stability
|
|
97
145
|
};
|
|
98
146
|
exports.bullmq = BullMQService.getInstance({
|
|
99
147
|
redisOptions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credit.service.d.ts","sourceRoot":"","sources":["../../src/services/credit.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"credit.service.d.ts","sourceRoot":"","sources":["../../src/services/credit.service.ts"],"names":[],"mappings":"AAaA,qBAAa,aAAa;WACX,cAAc,CACzB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;WAwDH,aAAa,CACxB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;CAoBjB"}
|
|
@@ -1,29 +1,67 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CreditService = void 0;
|
|
4
|
+
const firestore_1 = require("firebase-admin/firestore");
|
|
5
|
+
const types_1 = require("../globals/types");
|
|
4
6
|
const firebase_1 = require("../libs/firebase");
|
|
7
|
+
const logger_1 = require("../utils/logger");
|
|
5
8
|
const firestore_service_1 = require("./firestore.service");
|
|
9
|
+
const notification_service_1 = require("./notification.service");
|
|
10
|
+
// Once balance drops below this fraction of total, fire CREDITS_LOW. The
|
|
11
|
+
// throttle below stops it from re-firing more often than once per 24h so users
|
|
12
|
+
// who linger near the threshold don't see daily spam.
|
|
13
|
+
const CREDITS_LOW_THRESHOLD = 0.2;
|
|
14
|
+
const CREDITS_LOW_THROTTLE_MS = 24 * 60 * 60 * 1000;
|
|
6
15
|
class CreditService {
|
|
7
16
|
static async consumeCredits(userId, creditsToConsume) {
|
|
8
|
-
|
|
17
|
+
// Capture the post-consume balance so we can fire CREDITS_LOW outside the
|
|
18
|
+
// transaction (notification writes must not interleave with the credit
|
|
19
|
+
// mutation — that would risk transaction abort + retry firing duplicate
|
|
20
|
+
// notifications).
|
|
21
|
+
const postState = await firebase_1.firestore.runTransaction(async (tx) => {
|
|
9
22
|
const userRef = firestore_service_1.FirestoreService.usersCol.doc(userId);
|
|
10
23
|
const snap = await tx.get(userRef);
|
|
11
24
|
if (!snap.exists) {
|
|
12
25
|
throw new Error("USER_NOT_FOUND");
|
|
13
26
|
}
|
|
14
|
-
const
|
|
15
|
-
const consumed = credits?.consumed ?? 0;
|
|
16
|
-
const total = credits?.total ?? 0;
|
|
17
|
-
// console.log(`Consuming ${creditsToConsume} credits for user ${userId}`);
|
|
18
|
-
// console.log(`Current credits: ${consumed}/${total}`);
|
|
19
|
-
// 🔒 HARD INVARIANT
|
|
27
|
+
const data = snap.data();
|
|
28
|
+
const consumed = data.credits?.consumed ?? 0;
|
|
29
|
+
const total = data.credits?.total ?? 0;
|
|
20
30
|
if (consumed + creditsToConsume > total) {
|
|
21
31
|
throw new Error("INSUFFICIENT_CREDITS");
|
|
22
32
|
}
|
|
23
33
|
tx.update(userRef, {
|
|
24
34
|
"credits.consumed": consumed + creditsToConsume,
|
|
25
35
|
});
|
|
36
|
+
const newRemaining = total - (consumed + creditsToConsume);
|
|
37
|
+
const lastNotifiedMs = data.lastCreditsLowNotifiedAt?.toMillis?.() ?? 0;
|
|
38
|
+
return { total, newRemaining, lastNotifiedMs };
|
|
26
39
|
});
|
|
40
|
+
const { total, newRemaining, lastNotifiedMs } = postState;
|
|
41
|
+
if (total > 0 && newRemaining < total * CREDITS_LOW_THRESHOLD) {
|
|
42
|
+
const sinceLast = Date.now() - lastNotifiedMs;
|
|
43
|
+
if (sinceLast > CREDITS_LOW_THROTTLE_MS) {
|
|
44
|
+
const pct = Math.max(0, Math.round((newRemaining / total) * 100));
|
|
45
|
+
await notification_service_1.NotificationService.create({
|
|
46
|
+
userId,
|
|
47
|
+
type: types_1.ENotificationType.CREDITS_LOW,
|
|
48
|
+
severity: types_1.ENotificationSeverity.WARNING,
|
|
49
|
+
title: "You're running low on credits",
|
|
50
|
+
body: `${newRemaining} of ${total} credits remaining (${pct}%). Top up to avoid interrupting jobs.`,
|
|
51
|
+
link: "/dashboard/pricing",
|
|
52
|
+
data: { remaining: newRemaining, total },
|
|
53
|
+
});
|
|
54
|
+
await firestore_service_1.FirestoreService.usersCol.doc(userId).update({
|
|
55
|
+
lastCreditsLowNotifiedAt: firestore_1.FieldValue.serverTimestamp(),
|
|
56
|
+
}).catch((err) => {
|
|
57
|
+
logger_1.logger.warn("credit.service: lastCreditsLowNotifiedAt write failed", {
|
|
58
|
+
userId,
|
|
59
|
+
err: err instanceof Error ? err.stack ?? err.message : String(err),
|
|
60
|
+
});
|
|
61
|
+
return undefined;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
27
65
|
}
|
|
28
66
|
static async refundCredits(userId, creditsToRefund) {
|
|
29
67
|
if (creditsToRefund <= 0)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Clip, Project } from "../../schemas/project.schema";
|
|
2
|
+
import { PlannedScene } from "../../schemas/videoPlan.schema";
|
|
3
|
+
/**
|
|
4
|
+
* Per-component pricing model for agent regen endpoints (Stage 6).
|
|
5
|
+
*
|
|
6
|
+
* Charging granularity matches generation granularity: regen the VO of a
|
|
7
|
+
* single clip → only VO cost is charged. Regen the visual → only visual.
|
|
8
|
+
* Music + overlays + captions have their own (mostly free) rates.
|
|
9
|
+
*
|
|
10
|
+
* Rates are conservative upper bounds used by the budget guard before a
|
|
11
|
+
* regen is dispatched. The *actual* spend is reconciled from provider
|
|
12
|
+
* receipts inside the executor and written back to `clip.provenance.creditsSpent`.
|
|
13
|
+
*/
|
|
14
|
+
export declare const CREDITS_PER_USD = 100;
|
|
15
|
+
export declare const BUDGET_GUARD_THRESHOLD_USD = 0.5;
|
|
16
|
+
export type RegenComponent = "visual" | "voiceover" | "music" | "overlays" | "captions";
|
|
17
|
+
export interface RegenCostEstimate {
|
|
18
|
+
component: RegenComponent;
|
|
19
|
+
amountUsd: number;
|
|
20
|
+
amountCredits: number;
|
|
21
|
+
breakdown: Record<string, number>;
|
|
22
|
+
exceedsBudgetGuard: boolean;
|
|
23
|
+
budgetGuardThresholdUsd: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Estimate the cost of regenerating one component of a clip / scene.
|
|
27
|
+
* Pass either a `clip` (existing Project clip) or a `scene` (PlannedScene)
|
|
28
|
+
* — both expose tier + duration, just from different sources.
|
|
29
|
+
*/
|
|
30
|
+
export declare function estimateRegenCost(args: {
|
|
31
|
+
component: RegenComponent;
|
|
32
|
+
clip?: Clip;
|
|
33
|
+
scene?: PlannedScene;
|
|
34
|
+
/** For voiceover regens: the new VO line text (used to count chars). */
|
|
35
|
+
voiceoverLine?: string;
|
|
36
|
+
/** When the VO line text changes, captions must also be re-cut. */
|
|
37
|
+
captionsAlsoChange?: boolean;
|
|
38
|
+
}): RegenCostEstimate;
|
|
39
|
+
/** History entry appended to `project.metadata.history[]` on each regen. */
|
|
40
|
+
export interface RegenHistoryEntry {
|
|
41
|
+
ts: string;
|
|
42
|
+
action: "regenerate";
|
|
43
|
+
component: RegenComponent;
|
|
44
|
+
clipId?: string;
|
|
45
|
+
sceneIndex?: number;
|
|
46
|
+
modelKey?: string;
|
|
47
|
+
estimatedCreditsSpent: number;
|
|
48
|
+
estimatedUsd: number;
|
|
49
|
+
actualCreditsSpent?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Append a regen entry to `project.metadata.history[]`, returning the
|
|
53
|
+
* mutated project. Caller persists. Caps history at the most recent 200
|
|
54
|
+
* entries to keep the Firestore doc well under the 1 MiB limit (see
|
|
55
|
+
* Risk #2 in notes/AGENT_EDITOR_ROUND_TRIP.md).
|
|
56
|
+
*/
|
|
57
|
+
export declare function appendRegenHistory(project: Project, entry: RegenHistoryEntry): Project;
|
|
58
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/services/credits/pricing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAQ,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D;;;;;;;;;;GAUG;AAKH,eAAO,MAAM,eAAe,MAAM,CAAC;AAGnC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,WAAW,GACX,OAAO,GACP,UAAU,GACV,UAAU,CAAC;AAqBf,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAmCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,cAAc,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,iBAAiB,CA6BpB;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAUT"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BUDGET_GUARD_THRESHOLD_USD = exports.CREDITS_PER_USD = void 0;
|
|
4
|
+
exports.estimateRegenCost = estimateRegenCost;
|
|
5
|
+
exports.appendRegenHistory = appendRegenHistory;
|
|
6
|
+
/**
|
|
7
|
+
* Per-component pricing model for agent regen endpoints (Stage 6).
|
|
8
|
+
*
|
|
9
|
+
* Charging granularity matches generation granularity: regen the VO of a
|
|
10
|
+
* single clip → only VO cost is charged. Regen the visual → only visual.
|
|
11
|
+
* Music + overlays + captions have their own (mostly free) rates.
|
|
12
|
+
*
|
|
13
|
+
* Rates are conservative upper bounds used by the budget guard before a
|
|
14
|
+
* regen is dispatched. The *actual* spend is reconciled from provider
|
|
15
|
+
* receipts inside the executor and written back to `clip.provenance.creditsSpent`.
|
|
16
|
+
*/
|
|
17
|
+
// VidSpot convention: 1 credit ≈ $0.01 USD. The product surface (Stripe
|
|
18
|
+
// plans, dashboard chips) all speak credits; the budget guard speaks USD
|
|
19
|
+
// because the spec threshold ($0.50) is product-facing.
|
|
20
|
+
exports.CREDITS_PER_USD = 100;
|
|
21
|
+
// $0.50 user-confirmation threshold per Decision 4 (notes/AGENT_EDITOR_ROUND_TRIP.md §12).
|
|
22
|
+
exports.BUDGET_GUARD_THRESHOLD_USD = 0.5;
|
|
23
|
+
// Per-second visual cost by tier (USD). Coarse upper bounds — the executor
|
|
24
|
+
// reconciles to the provider's true charge after the fact.
|
|
25
|
+
const TIER_PER_SECOND_USD = {
|
|
26
|
+
T0: 0.005, // stock (per-call cost amortised over duration)
|
|
27
|
+
T1: 0.1, // image-to-video
|
|
28
|
+
T2: 0.03, // image-gen still
|
|
29
|
+
T3: 0.8, // premium text-to-video
|
|
30
|
+
};
|
|
31
|
+
// ElevenLabs creator-tier ballpark. Real rate varies by plan; conservative bound.
|
|
32
|
+
const ELEVENLABS_USD_PER_1K_CHARS = 0.18;
|
|
33
|
+
// Tiny GPT-4o-mini call to rewrite an overlay line.
|
|
34
|
+
const OVERLAY_LLM_USD_PER_CALL = 0.005;
|
|
35
|
+
// Local Whisper, Jamendo: free at the moment.
|
|
36
|
+
const CAPTION_USD_PER_MINUTE = 0;
|
|
37
|
+
const MUSIC_SEARCH_USD = 0;
|
|
38
|
+
const clipDurationMs = (c) => Math.max(0, c.display.to - c.display.from);
|
|
39
|
+
const sceneDurationMs = (s) => s.durationMs;
|
|
40
|
+
function visualUsd(args) {
|
|
41
|
+
if (!args.tier)
|
|
42
|
+
return 0;
|
|
43
|
+
return (args.durationMs / 1000) * TIER_PER_SECOND_USD[args.tier];
|
|
44
|
+
}
|
|
45
|
+
function voiceoverUsd(charCount) {
|
|
46
|
+
return (charCount / 1000) * ELEVENLABS_USD_PER_1K_CHARS;
|
|
47
|
+
}
|
|
48
|
+
function captionsUsd(durationMs) {
|
|
49
|
+
return (durationMs / 60000) * CAPTION_USD_PER_MINUTE;
|
|
50
|
+
}
|
|
51
|
+
function toEstimate(component, breakdown) {
|
|
52
|
+
const amountUsd = Object.values(breakdown).reduce((s, v) => s + v, 0);
|
|
53
|
+
return {
|
|
54
|
+
component,
|
|
55
|
+
amountUsd,
|
|
56
|
+
amountCredits: Math.ceil(amountUsd * exports.CREDITS_PER_USD),
|
|
57
|
+
breakdown,
|
|
58
|
+
exceedsBudgetGuard: amountUsd > exports.BUDGET_GUARD_THRESHOLD_USD,
|
|
59
|
+
budgetGuardThresholdUsd: exports.BUDGET_GUARD_THRESHOLD_USD,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Estimate the cost of regenerating one component of a clip / scene.
|
|
64
|
+
* Pass either a `clip` (existing Project clip) or a `scene` (PlannedScene)
|
|
65
|
+
* — both expose tier + duration, just from different sources.
|
|
66
|
+
*/
|
|
67
|
+
function estimateRegenCost(args) {
|
|
68
|
+
const { component } = args;
|
|
69
|
+
const tier = args.clip?.provenance?.tier ?? args.scene?.tier;
|
|
70
|
+
const durationMs = (args.clip ? clipDurationMs(args.clip) : undefined) ??
|
|
71
|
+
(args.scene ? sceneDurationMs(args.scene) : 0);
|
|
72
|
+
switch (component) {
|
|
73
|
+
case "visual":
|
|
74
|
+
return toEstimate("visual", {
|
|
75
|
+
visual: visualUsd({ tier, durationMs }),
|
|
76
|
+
});
|
|
77
|
+
case "voiceover": {
|
|
78
|
+
const chars = args.voiceoverLine?.length ?? 0;
|
|
79
|
+
const breakdown = {
|
|
80
|
+
voiceover: voiceoverUsd(chars),
|
|
81
|
+
};
|
|
82
|
+
if (args.captionsAlsoChange) {
|
|
83
|
+
breakdown.captions = captionsUsd(durationMs);
|
|
84
|
+
}
|
|
85
|
+
return toEstimate("voiceover", breakdown);
|
|
86
|
+
}
|
|
87
|
+
case "music":
|
|
88
|
+
return toEstimate("music", { music: MUSIC_SEARCH_USD });
|
|
89
|
+
case "overlays":
|
|
90
|
+
return toEstimate("overlays", { overlays: OVERLAY_LLM_USD_PER_CALL });
|
|
91
|
+
case "captions":
|
|
92
|
+
return toEstimate("captions", { captions: captionsUsd(durationMs) });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Append a regen entry to `project.metadata.history[]`, returning the
|
|
97
|
+
* mutated project. Caller persists. Caps history at the most recent 200
|
|
98
|
+
* entries to keep the Firestore doc well under the 1 MiB limit (see
|
|
99
|
+
* Risk #2 in notes/AGENT_EDITOR_ROUND_TRIP.md).
|
|
100
|
+
*/
|
|
101
|
+
function appendRegenHistory(project, entry) {
|
|
102
|
+
const meta = (project.metadata ?? {});
|
|
103
|
+
const existing = Array.isArray(meta.history)
|
|
104
|
+
? meta.history
|
|
105
|
+
: [];
|
|
106
|
+
const next = [...existing, entry].slice(-200);
|
|
107
|
+
return {
|
|
108
|
+
...project,
|
|
109
|
+
metadata: { ...meta, history: next },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Project } from "../../schemas/project.schema";
|
|
2
|
+
/**
|
|
3
|
+
* Inverse of `projectToDesign`. Converts the editor's IDesign-shaped
|
|
4
|
+
* autosave blob into the canonical Project JSON the Remotion renderer
|
|
5
|
+
* consumes.
|
|
6
|
+
*
|
|
7
|
+
* The shared package can't import `@designcombo/types` (editor-only),
|
|
8
|
+
* so the input shape is declared inline as a permissive interface — we
|
|
9
|
+
* read what we need and ignore unknown fields. Producers (the editor's
|
|
10
|
+
* autosave hook) are not formally validated here; the resulting Project
|
|
11
|
+
* is validated by `ProjectSchema.parse()` downstream.
|
|
12
|
+
*
|
|
13
|
+
* Round-trip contract: designToProject(projectToDesign(p)) deeply
|
|
14
|
+
* equals p (covered by tests in this package). To preserve fields the
|
|
15
|
+
* editor's IDesign can't represent natively (provenance, locked, clip
|
|
16
|
+
* motion, ducking, caption words), the translator pair stashes them
|
|
17
|
+
* inside `metadata.*` on the design item; designToProject pulls them
|
|
18
|
+
* back here.
|
|
19
|
+
*/
|
|
20
|
+
interface DesignTrack {
|
|
21
|
+
id: string;
|
|
22
|
+
type: string;
|
|
23
|
+
items?: string[];
|
|
24
|
+
index?: number;
|
|
25
|
+
}
|
|
26
|
+
interface DesignItemBase {
|
|
27
|
+
id: string;
|
|
28
|
+
name?: string;
|
|
29
|
+
type: string;
|
|
30
|
+
display?: {
|
|
31
|
+
from?: number;
|
|
32
|
+
to?: number;
|
|
33
|
+
};
|
|
34
|
+
metadata?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
interface DesignItemDetails extends DesignItemBase {
|
|
37
|
+
details?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
interface DesignBackground {
|
|
40
|
+
type?: "color" | "image" | "transparent";
|
|
41
|
+
value?: string;
|
|
42
|
+
}
|
|
43
|
+
interface DesignTransition {
|
|
44
|
+
id?: string;
|
|
45
|
+
fromId?: string;
|
|
46
|
+
toId?: string;
|
|
47
|
+
kind?: string;
|
|
48
|
+
duration?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface EditorDesignInput {
|
|
51
|
+
id?: string;
|
|
52
|
+
fps?: number;
|
|
53
|
+
size?: {
|
|
54
|
+
width?: number;
|
|
55
|
+
height?: number;
|
|
56
|
+
};
|
|
57
|
+
duration?: number;
|
|
58
|
+
background?: DesignBackground;
|
|
59
|
+
tracks?: DesignTrack[];
|
|
60
|
+
trackItemIds?: string[];
|
|
61
|
+
trackItemsMap?: Record<string, DesignItemBase>;
|
|
62
|
+
trackItemDetailsMap?: Record<string, DesignItemDetails>;
|
|
63
|
+
transitionIds?: string[];
|
|
64
|
+
transitionsMap?: Record<string, DesignTransition>;
|
|
65
|
+
/** Server-write-zone field: editor passes it back as-is on autosave. */
|
|
66
|
+
agentRunId?: string;
|
|
67
|
+
}
|
|
68
|
+
export declare function designToProject(design: unknown, meta: {
|
|
69
|
+
id: string;
|
|
70
|
+
name: string;
|
|
71
|
+
createdAt?: string;
|
|
72
|
+
updatedAt?: string;
|
|
73
|
+
}): Project;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=designToProject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designToProject.d.ts","sourceRoot":"","sources":["../../../src/services/editor/designToProject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,OAAO,EAIR,MAAM,8BAA8B,CAAC;AAGtC;;;;;;;;;;;;;;;;;GAiBG;AAEH,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,UAAU,iBAAkB,SAAQ,cAAc;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,gBAAgB;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/C,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACxD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAClD,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA+BD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,OAAO,EACf,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE,OAAO,CA4FT"}
|