vidspotai-shared 1.0.82-dev.0 → 1.0.83
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 +11 -1
- package/lib/globals/aiModels/enums.d.ts.map +1 -1
- package/lib/globals/aiModels/enums.js +24 -1
- package/lib/globals/aiModels/index.d.ts.map +1 -1
- package/lib/globals/aiModels/index.js +2 -0
- package/lib/globals/aiModels/providers/anthropic.d.ts +12 -0
- package/lib/globals/aiModels/providers/anthropic.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/anthropic.js +88 -0
- package/lib/globals/aiModels/providers/google.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/google.js +115 -10
- package/lib/globals/aiModels/providers/openai.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/openai.js +63 -4
- package/lib/globals/aiModels/tierHelpers.d.ts +12 -0
- package/lib/globals/aiModels/tierHelpers.d.ts.map +1 -1
- package/lib/globals/aiModels/tierHelpers.js +83 -0
- package/lib/globals/aiModels/types.d.ts +19 -0
- package/lib/globals/aiModels/types.d.ts.map +1 -1
- package/lib/globals/types.d.ts +120 -1
- package/lib/globals/types.d.ts.map +1 -1
- package/lib/globals/types.js +135 -1
- package/lib/models/agent.model.d.ts +41 -1
- package/lib/models/agent.model.d.ts.map +1 -1
- package/lib/models/index.d.ts +1 -0
- package/lib/models/index.d.ts.map +1 -1
- package/lib/models/index.js +1 -0
- package/lib/models/social.model.d.ts +180 -0
- package/lib/models/social.model.d.ts.map +1 -0
- package/lib/models/social.model.js +2 -0
- package/lib/models/user.model.d.ts +10 -0
- package/lib/models/user.model.d.ts.map +1 -1
- package/lib/models/video.model.d.ts +6 -0
- package/lib/models/video.model.d.ts.map +1 -1
- package/lib/schemas/brief.schema.d.ts +46 -0
- package/lib/schemas/brief.schema.d.ts.map +1 -1
- package/lib/schemas/brief.schema.js +72 -1
- package/lib/schemas/index.d.ts +1 -0
- package/lib/schemas/index.d.ts.map +1 -1
- package/lib/schemas/index.js +1 -0
- package/lib/schemas/project.schema.d.ts +70 -3
- package/lib/schemas/project.schema.d.ts.map +1 -1
- package/lib/schemas/project.schema.js +12 -0
- package/lib/schemas/social.schema.d.ts +91 -0
- package/lib/schemas/social.schema.d.ts.map +1 -0
- package/lib/schemas/social.schema.js +114 -0
- package/lib/schemas/videoPlan.schema.d.ts +117 -3
- package/lib/schemas/videoPlan.schema.d.ts.map +1 -1
- package/lib/schemas/videoPlan.schema.js +141 -1
- package/lib/services/agent/chatAgent.d.ts +25 -1
- package/lib/services/agent/chatAgent.d.ts.map +1 -1
- package/lib/services/agent/chatAgent.js +145 -9
- package/lib/services/agent/costPreflight.d.ts +11 -1
- package/lib/services/agent/costPreflight.d.ts.map +1 -1
- package/lib/services/agent/costPreflight.js +18 -1
- package/lib/services/agent/covers/coverPlanner.d.ts +41 -0
- package/lib/services/agent/covers/coverPlanner.d.ts.map +1 -0
- package/lib/services/agent/covers/coverPlanner.js +278 -0
- package/lib/services/agent/covers/covers.schema.d.ts +158 -0
- package/lib/services/agent/covers/covers.schema.d.ts.map +1 -0
- package/lib/services/agent/covers/covers.schema.js +166 -0
- package/lib/services/agent/covers/index.d.ts +3 -0
- package/lib/services/agent/covers/index.d.ts.map +1 -0
- package/lib/services/agent/covers/index.js +18 -0
- package/lib/services/agent/critic.d.ts +10 -0
- package/lib/services/agent/critic.d.ts.map +1 -1
- package/lib/services/agent/critic.js +37 -1
- package/lib/services/agent/editClassifier.d.ts +4 -4
- package/lib/services/agent/editClassifier.js +2 -2
- package/lib/services/agent/editExisting/editAssembler.d.ts +78 -0
- package/lib/services/agent/editExisting/editAssembler.d.ts.map +1 -0
- package/lib/services/agent/editExisting/editAssembler.js +172 -0
- package/lib/services/agent/editExisting/editExisting.schema.d.ts +119 -0
- package/lib/services/agent/editExisting/editExisting.schema.d.ts.map +1 -0
- package/lib/services/agent/editExisting/editExisting.schema.js +157 -0
- package/lib/services/agent/editExisting/highlightPicker.d.ts +48 -0
- package/lib/services/agent/editExisting/highlightPicker.d.ts.map +1 -0
- package/lib/services/agent/editExisting/highlightPicker.js +199 -0
- package/lib/services/agent/editExisting/index.d.ts +4 -0
- package/lib/services/agent/editExisting/index.d.ts.map +1 -0
- package/lib/services/agent/editExisting/index.js +19 -0
- package/lib/services/agent/eval/recorder.d.ts +13 -1
- package/lib/services/agent/eval/recorder.d.ts.map +1 -1
- package/lib/services/agent/eval/recorder.js +59 -0
- package/lib/services/agent/eval/seedBriefs.d.ts +4 -3
- package/lib/services/agent/eval/seedBriefs.d.ts.map +1 -1
- package/lib/services/agent/eval/seedBriefs.js +283 -3
- package/lib/services/agent/eval/types.d.ts +10 -0
- package/lib/services/agent/eval/types.d.ts.map +1 -1
- package/lib/services/agent/executor/core.d.ts +70 -0
- package/lib/services/agent/executor/core.d.ts.map +1 -0
- package/lib/services/agent/executor/core.js +250 -0
- package/lib/services/agent/executor/duration.d.ts +20 -0
- package/lib/services/agent/executor/duration.d.ts.map +1 -0
- package/lib/services/agent/executor/duration.js +46 -0
- package/lib/services/agent/executor/index.d.ts +15 -0
- package/lib/services/agent/executor/index.d.ts.map +1 -0
- package/lib/services/agent/executor/index.js +32 -0
- package/lib/services/agent/executor/types.d.ts +183 -0
- package/lib/services/agent/executor/types.d.ts.map +1 -0
- package/lib/services/agent/executor/types.js +29 -0
- package/lib/services/agent/executor/visual.d.ts +32 -0
- package/lib/services/agent/executor/visual.d.ts.map +1 -0
- package/lib/services/agent/executor/visual.js +400 -0
- package/lib/services/agent/executor/voice.d.ts +17 -0
- package/lib/services/agent/executor/voice.d.ts.map +1 -0
- package/lib/services/agent/executor/voice.js +119 -0
- package/lib/services/agent/extendChain.d.ts +101 -0
- package/lib/services/agent/extendChain.d.ts.map +1 -0
- package/lib/services/agent/extendChain.js +177 -0
- package/lib/services/agent/index.d.ts +11 -1
- package/lib/services/agent/index.d.ts.map +1 -1
- package/lib/services/agent/index.js +11 -1
- package/lib/services/agent/llmCaller.d.ts +7 -8
- package/lib/services/agent/llmCaller.d.ts.map +1 -1
- package/lib/services/agent/llmCallerAnthropic.d.ts +44 -31
- package/lib/services/agent/llmCallerAnthropic.d.ts.map +1 -1
- package/lib/services/agent/llmCallerAnthropic.js +135 -60
- package/lib/services/agent/llmCallerFactory.d.ts +34 -0
- package/lib/services/agent/llmCallerFactory.d.ts.map +1 -0
- package/lib/services/agent/llmCallerFactory.js +31 -0
- package/lib/services/agent/llmCallerGemini.d.ts +62 -0
- package/lib/services/agent/llmCallerGemini.d.ts.map +1 -0
- package/lib/services/agent/llmCallerGemini.js +235 -0
- package/lib/services/agent/llmCallerOpenai.d.ts +56 -0
- package/lib/services/agent/llmCallerOpenai.d.ts.map +1 -0
- package/lib/services/agent/llmCallerOpenai.js +230 -0
- package/lib/services/agent/llmCallerRegistry.d.ts.map +1 -1
- package/lib/services/agent/llmCallerRegistry.js +7 -7
- package/lib/services/agent/llmCallerRouting.d.ts +63 -0
- package/lib/services/agent/llmCallerRouting.d.ts.map +1 -0
- package/lib/services/agent/llmCallerRouting.js +124 -0
- package/lib/services/agent/llmModelRegistry.d.ts +59 -0
- package/lib/services/agent/llmModelRegistry.d.ts.map +1 -0
- package/lib/services/agent/llmModelRegistry.js +168 -0
- package/lib/services/agent/llmRetry.d.ts +57 -0
- package/lib/services/agent/llmRetry.d.ts.map +1 -0
- package/lib/services/agent/llmRetry.js +102 -0
- package/lib/services/agent/modelRouter.d.ts +3 -3
- package/lib/services/agent/modelRouter.d.ts.map +1 -1
- package/lib/services/agent/modelRouter.js +27 -13
- package/lib/services/agent/planMutations.d.ts +54 -1
- package/lib/services/agent/planMutations.d.ts.map +1 -1
- package/lib/services/agent/planMutations.js +78 -0
- package/lib/services/agent/planner/Planner.d.ts +0 -17
- package/lib/services/agent/planner/Planner.d.ts.map +1 -1
- package/lib/services/agent/planner/Planner.js +67 -303
- package/lib/services/agent/planner/overlayRegen.d.ts +38 -0
- package/lib/services/agent/planner/overlayRegen.d.ts.map +1 -0
- package/lib/services/agent/planner/overlayRegen.js +145 -0
- package/lib/services/agent/planner/plannerMessages.d.ts +34 -0
- package/lib/services/agent/planner/plannerMessages.d.ts.map +1 -0
- package/lib/services/agent/planner/plannerMessages.js +185 -0
- package/lib/services/agent/planner/promptSections.d.ts +12 -0
- package/lib/services/agent/planner/promptSections.d.ts.map +1 -1
- package/lib/services/agent/planner/promptSections.js +57 -0
- package/lib/services/agent/planner/scriptFirstPlanner.d.ts +35 -0
- package/lib/services/agent/planner/scriptFirstPlanner.d.ts.map +1 -0
- package/lib/services/agent/planner/scriptFirstPlanner.js +140 -0
- package/lib/services/agent/planner/structuralRules.d.ts +10 -0
- package/lib/services/agent/planner/structuralRules.d.ts.map +1 -1
- package/lib/services/agent/planner/structuralRules.js +92 -9
- package/lib/services/agent/planner/validators.d.ts +18 -0
- package/lib/services/agent/planner/validators.d.ts.map +1 -1
- package/lib/services/agent/planner/validators.js +97 -0
- package/lib/services/agent/planner.d.ts +2 -1
- package/lib/services/agent/planner.d.ts.map +1 -1
- package/lib/services/agent/planner.js +5 -1
- package/lib/services/agent/priorProject.d.ts +26 -0
- package/lib/services/agent/priorProject.d.ts.map +1 -0
- package/lib/services/agent/priorProject.js +51 -0
- package/lib/services/agent/providerFallback/chains.d.ts.map +1 -1
- package/lib/services/agent/providerFallback/chains.js +27 -15
- package/lib/services/agent/repurpose/index.d.ts +3 -0
- package/lib/services/agent/repurpose/index.d.ts.map +1 -0
- package/lib/services/agent/repurpose/index.js +18 -0
- package/lib/services/agent/repurpose/repurpose.schema.d.ts +132 -0
- package/lib/services/agent/repurpose/repurpose.schema.d.ts.map +1 -0
- package/lib/services/agent/repurpose/repurpose.schema.js +144 -0
- package/lib/services/agent/repurpose/shortsPicker.d.ts +25 -0
- package/lib/services/agent/repurpose/shortsPicker.d.ts.map +1 -0
- package/lib/services/agent/repurpose/shortsPicker.js +218 -0
- package/lib/services/agent/runHelpers.d.ts +21 -2
- package/lib/services/agent/runHelpers.d.ts.map +1 -1
- package/lib/services/agent/runHelpers.js +71 -2
- package/lib/services/agent/tools/animateImage.tool.d.ts +1 -0
- package/lib/services/agent/tools/animateImage.tool.d.ts.map +1 -1
- package/lib/services/agent/tools/animateImage.tool.js +12 -0
- package/lib/services/agent/tools/chapterOutline.tool.d.ts +42 -0
- package/lib/services/agent/tools/chapterOutline.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/chapterOutline.tool.js +115 -0
- package/lib/services/agent/tools/composeScene.tool.d.ts +65 -2
- package/lib/services/agent/tools/composeScene.tool.d.ts.map +1 -1
- package/lib/services/agent/tools/estimateCost.tool.d.ts +28 -1
- package/lib/services/agent/tools/estimateCost.tool.d.ts.map +1 -1
- package/lib/services/agent/tools/estimateCost.tool.js +55 -7
- package/lib/services/agent/tools/extendVideo.tool.d.ts +26 -0
- package/lib/services/agent/tools/extendVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/extendVideo.tool.js +149 -0
- package/lib/services/agent/tools/generateScript.tool.d.ts +184 -0
- package/lib/services/agent/tools/generateScript.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateScript.tool.js +123 -0
- package/lib/services/agent/tools/generateVideo.tool.d.ts +1 -0
- package/lib/services/agent/tools/generateVideo.tool.d.ts.map +1 -1
- package/lib/services/agent/tools/generateVideo.tool.js +20 -1
- package/lib/services/agent/tools/index.d.ts +4 -0
- package/lib/services/agent/tools/index.d.ts.map +1 -1
- package/lib/services/agent/tools/index.js +4 -0
- package/lib/services/agent/tools/matchBrollToScript.tool.d.ts +50 -0
- package/lib/services/agent/tools/matchBrollToScript.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/matchBrollToScript.tool.js +139 -0
- package/lib/services/agent/tools/planVideo.tool.d.ts +57 -1
- package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -1
- package/lib/services/agent/tools/planVideo.tool.js +3 -3
- package/lib/services/agent/tools/render.tool.d.ts +22 -1
- package/lib/services/agent/tools/render.tool.d.ts.map +1 -1
- package/lib/services/aiGen/aiGenFactory.service.d.ts.map +1 -1
- package/lib/services/aiGen/aiGenFactory.service.js +18 -3
- package/lib/services/aiGen/helpers.d.ts +8 -0
- package/lib/services/aiGen/helpers.d.ts.map +1 -1
- package/lib/services/aiGen/helpers.js +12 -0
- package/lib/services/aiGen/providers/anthropic/anthropic.service.d.ts +26 -0
- package/lib/services/aiGen/providers/anthropic/anthropic.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/anthropic/anthropic.service.js +95 -0
- package/lib/services/aiGen/providers/google/google.service.d.ts +25 -1
- package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/google/google.service.js +136 -237
- package/lib/services/aiGen/providers/google/googleApiKeys.d.ts +71 -0
- package/lib/services/aiGen/providers/google/googleApiKeys.d.ts.map +1 -0
- package/lib/services/aiGen/providers/google/googleApiKeys.js +137 -0
- package/lib/services/aiGen/providers/google/googleErrors.d.ts +13 -0
- package/lib/services/aiGen/providers/google/googleErrors.d.ts.map +1 -0
- package/lib/services/aiGen/providers/google/googleErrors.js +102 -0
- package/lib/services/aiGen/providers/google/googleFetch.d.ts +8 -0
- package/lib/services/aiGen/providers/google/googleFetch.d.ts.map +1 -0
- package/lib/services/aiGen/providers/google/googleFetch.js +96 -0
- package/lib/services/aiGen/providers/google/googleKeyPool.d.ts +52 -0
- package/lib/services/aiGen/providers/google/googleKeyPool.d.ts.map +1 -0
- package/lib/services/aiGen/providers/google/googleKeyPool.js +129 -0
- package/lib/services/aiGen/providers/google/googleMusic.d.ts +15 -0
- package/lib/services/aiGen/providers/google/googleMusic.d.ts.map +1 -0
- package/lib/services/aiGen/providers/google/googleMusic.js +77 -0
- package/lib/services/aiGen/providers/kling/kling.service.d.ts +7 -3
- package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/kling/kling.service.js +23 -367
- package/lib/services/aiGen/providers/kling/klingCredits.d.ts +9 -0
- package/lib/services/aiGen/providers/kling/klingCredits.d.ts.map +1 -0
- package/lib/services/aiGen/providers/kling/klingCredits.js +63 -0
- package/lib/services/aiGen/providers/kling/klingRequests.d.ts +32 -0
- package/lib/services/aiGen/providers/kling/klingRequests.d.ts.map +1 -0
- package/lib/services/aiGen/providers/kling/klingRequests.js +194 -0
- package/lib/services/aiGen/providers/kling/klingStatus.d.ts +16 -0
- package/lib/services/aiGen/providers/kling/klingStatus.d.ts.map +1 -0
- package/lib/services/aiGen/providers/kling/klingStatus.js +173 -0
- package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/pixverse/pixverse.service.js +7 -1
- package/lib/services/bullmq.service.d.ts +61 -0
- package/lib/services/bullmq.service.d.ts.map +1 -1
- package/lib/services/bullmq.service.js +124 -2
- package/lib/services/crypto/index.d.ts +2 -0
- package/lib/services/crypto/index.d.ts.map +1 -0
- package/lib/services/crypto/index.js +17 -0
- package/lib/services/crypto/tokenVault.d.ts +47 -0
- package/lib/services/crypto/tokenVault.d.ts.map +1 -0
- package/lib/services/crypto/tokenVault.js +179 -0
- package/lib/services/editor/captionStyleHint.d.ts +3 -0
- package/lib/services/editor/captionStyleHint.d.ts.map +1 -0
- package/lib/services/editor/captionStyleHint.js +112 -0
- package/lib/services/editor/planToProject.d.ts +7 -66
- package/lib/services/editor/planToProject.d.ts.map +1 -1
- package/lib/services/editor/planToProject.helpers.d.ts +40 -0
- package/lib/services/editor/planToProject.helpers.d.ts.map +1 -0
- package/lib/services/editor/planToProject.helpers.js +177 -0
- package/lib/services/editor/planToProject.js +197 -180
- package/lib/services/editor/planToProject.types.d.ts +94 -0
- package/lib/services/editor/planToProject.types.d.ts.map +1 -0
- package/lib/services/editor/planToProject.types.js +2 -0
- package/lib/services/firestore.service.d.ts +5 -0
- package/lib/services/firestore.service.d.ts.map +1 -1
- package/lib/services/firestore.service.js +13 -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/promptEnhancer/index.d.ts +18 -0
- package/lib/services/promptEnhancer/index.d.ts.map +1 -0
- package/lib/services/promptEnhancer/index.js +33 -0
- package/lib/services/promptEnhancer/models.d.ts +54 -0
- package/lib/services/promptEnhancer/models.d.ts.map +1 -0
- package/lib/services/promptEnhancer/models.js +37 -0
- package/lib/services/promptEnhancer/profiles/agent.profile.d.ts +14 -0
- package/lib/services/promptEnhancer/profiles/agent.profile.d.ts.map +1 -0
- package/lib/services/promptEnhancer/profiles/agent.profile.js +40 -0
- package/lib/services/promptEnhancer/profiles/avatar.profile.d.ts +13 -0
- package/lib/services/promptEnhancer/profiles/avatar.profile.d.ts.map +1 -0
- package/lib/services/promptEnhancer/profiles/avatar.profile.js +40 -0
- package/lib/services/promptEnhancer/profiles/base.d.ts +28 -0
- package/lib/services/promptEnhancer/profiles/base.d.ts.map +1 -0
- package/lib/services/promptEnhancer/profiles/base.js +35 -0
- package/lib/services/promptEnhancer/profiles/image.profile.d.ts +11 -0
- package/lib/services/promptEnhancer/profiles/image.profile.d.ts.map +1 -0
- package/lib/services/promptEnhancer/profiles/image.profile.js +42 -0
- package/lib/services/promptEnhancer/profiles/index.d.ts +12 -0
- package/lib/services/promptEnhancer/profiles/index.d.ts.map +1 -0
- package/lib/services/promptEnhancer/profiles/index.js +33 -0
- package/lib/services/promptEnhancer/profiles/video.profile.d.ts +15 -0
- package/lib/services/promptEnhancer/profiles/video.profile.d.ts.map +1 -0
- package/lib/services/promptEnhancer/profiles/video.profile.js +81 -0
- package/lib/services/promptEnhancer/promptEnhancer.service.d.ts +45 -0
- package/lib/services/promptEnhancer/promptEnhancer.service.d.ts.map +1 -0
- package/lib/services/promptEnhancer/promptEnhancer.service.js +157 -0
- package/lib/services/promptEnhancer/schema.d.ts +19 -0
- package/lib/services/promptEnhancer/schema.d.ts.map +1 -0
- package/lib/services/promptEnhancer/schema.js +43 -0
- package/lib/services/promptEnhancer/types.d.ts +112 -0
- package/lib/services/promptEnhancer/types.d.ts.map +1 -0
- package/lib/services/promptEnhancer/types.js +2 -0
- package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts +60 -5
- package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts.map +1 -1
- package/lib/services/rateLimiter/distributedRateLimiter.service.js +184 -16
- package/lib/services/socialAI/captionGen.d.ts +81 -0
- package/lib/services/socialAI/captionGen.d.ts.map +1 -0
- package/lib/services/socialAI/captionGen.js +206 -0
- package/lib/services/socialAI/hookScore.d.ts +85 -0
- package/lib/services/socialAI/hookScore.d.ts.map +1 -0
- package/lib/services/socialAI/hookScore.js +170 -0
- package/lib/services/socialAI/index.d.ts +3 -0
- package/lib/services/socialAI/index.d.ts.map +1 -0
- package/lib/services/socialAI/index.js +18 -0
- package/lib/services/socialAccounts/index.d.ts +2 -0
- package/lib/services/socialAccounts/index.d.ts.map +1 -0
- package/lib/services/socialAccounts/index.js +17 -0
- package/lib/services/socialAccounts/socialAccountService.d.ts +25 -0
- package/lib/services/socialAccounts/socialAccountService.d.ts.map +1 -0
- package/lib/services/socialAccounts/socialAccountService.js +105 -0
- package/lib/services/socialEngage/factory.d.ts +7 -0
- package/lib/services/socialEngage/factory.d.ts.map +1 -0
- package/lib/services/socialEngage/factory.js +25 -0
- package/lib/services/socialEngage/index.d.ts +6 -0
- package/lib/services/socialEngage/index.d.ts.map +1 -0
- package/lib/services/socialEngage/index.js +21 -0
- package/lib/services/socialEngage/meta.engage.d.ts +17 -0
- package/lib/services/socialEngage/meta.engage.d.ts.map +1 -0
- package/lib/services/socialEngage/meta.engage.js +128 -0
- package/lib/services/socialEngage/metaWebhook.d.ts +50 -0
- package/lib/services/socialEngage/metaWebhook.d.ts.map +1 -0
- package/lib/services/socialEngage/metaWebhook.js +93 -0
- package/lib/services/socialEngage/types.d.ts +72 -0
- package/lib/services/socialEngage/types.d.ts.map +1 -0
- package/lib/services/socialEngage/types.js +10 -0
- package/lib/services/socialEngage/youtube.engage.d.ts +9 -0
- package/lib/services/socialEngage/youtube.engage.d.ts.map +1 -0
- package/lib/services/socialEngage/youtube.engage.js +87 -0
- package/lib/services/socialFormat/aspectGeometry.d.ts +74 -0
- package/lib/services/socialFormat/aspectGeometry.d.ts.map +1 -0
- package/lib/services/socialFormat/aspectGeometry.js +135 -0
- package/lib/services/socialFormat/index.d.ts +2 -0
- package/lib/services/socialFormat/index.d.ts.map +1 -0
- package/lib/services/socialFormat/index.js +19 -0
- package/lib/services/socialInsights/index.d.ts +3 -0
- package/lib/services/socialInsights/index.d.ts.map +1 -0
- package/lib/services/socialInsights/index.js +18 -0
- package/lib/services/socialInsights/recommendations.d.ts +131 -0
- package/lib/services/socialInsights/recommendations.d.ts.map +1 -0
- package/lib/services/socialInsights/recommendations.js +277 -0
- package/lib/services/socialInsights/timeBuckets.d.ts +35 -0
- package/lib/services/socialInsights/timeBuckets.d.ts.map +1 -0
- package/lib/services/socialInsights/timeBuckets.js +78 -0
- package/lib/services/socialMetrics/factory.d.ts +5 -0
- package/lib/services/socialMetrics/factory.d.ts.map +1 -0
- package/lib/services/socialMetrics/factory.js +24 -0
- package/lib/services/socialMetrics/index.d.ts +6 -0
- package/lib/services/socialMetrics/index.d.ts.map +1 -0
- package/lib/services/socialMetrics/index.js +21 -0
- package/lib/services/socialMetrics/meta.metrics.d.ts +22 -0
- package/lib/services/socialMetrics/meta.metrics.d.ts.map +1 -0
- package/lib/services/socialMetrics/meta.metrics.js +137 -0
- package/lib/services/socialMetrics/tiktok.metrics.d.ts +8 -0
- package/lib/services/socialMetrics/tiktok.metrics.d.ts.map +1 -0
- package/lib/services/socialMetrics/tiktok.metrics.js +43 -0
- package/lib/services/socialMetrics/types.d.ts +54 -0
- package/lib/services/socialMetrics/types.d.ts.map +1 -0
- package/lib/services/socialMetrics/types.js +2 -0
- package/lib/services/socialMetrics/youtube.metrics.d.ts +8 -0
- package/lib/services/socialMetrics/youtube.metrics.d.ts.map +1 -0
- package/lib/services/socialMetrics/youtube.metrics.js +43 -0
- package/lib/services/socialOAuth/factory.d.ts +7 -0
- package/lib/services/socialOAuth/factory.d.ts.map +1 -0
- package/lib/services/socialOAuth/factory.js +42 -0
- package/lib/services/socialOAuth/index.d.ts +11 -0
- package/lib/services/socialOAuth/index.d.ts.map +1 -0
- package/lib/services/socialOAuth/index.js +26 -0
- package/lib/services/socialOAuth/linkedin.oauth.d.ts +14 -0
- package/lib/services/socialOAuth/linkedin.oauth.d.ts.map +1 -0
- package/lib/services/socialOAuth/linkedin.oauth.js +127 -0
- package/lib/services/socialOAuth/meta.oauth.d.ts +31 -0
- package/lib/services/socialOAuth/meta.oauth.d.ts.map +1 -0
- package/lib/services/socialOAuth/meta.oauth.js +214 -0
- package/lib/services/socialOAuth/oauthState.d.ts +14 -0
- package/lib/services/socialOAuth/oauthState.d.ts.map +1 -0
- package/lib/services/socialOAuth/oauthState.js +66 -0
- package/lib/services/socialOAuth/pinterest.oauth.d.ts +15 -0
- package/lib/services/socialOAuth/pinterest.oauth.d.ts.map +1 -0
- package/lib/services/socialOAuth/pinterest.oauth.js +126 -0
- package/lib/services/socialOAuth/threads.oauth.d.ts +14 -0
- package/lib/services/socialOAuth/threads.oauth.d.ts.map +1 -0
- package/lib/services/socialOAuth/threads.oauth.js +129 -0
- package/lib/services/socialOAuth/tiktok.oauth.d.ts +15 -0
- package/lib/services/socialOAuth/tiktok.oauth.d.ts.map +1 -0
- package/lib/services/socialOAuth/tiktok.oauth.js +151 -0
- package/lib/services/socialOAuth/types.d.ts +67 -0
- package/lib/services/socialOAuth/types.d.ts.map +1 -0
- package/lib/services/socialOAuth/types.js +2 -0
- package/lib/services/socialOAuth/x.oauth.d.ts +17 -0
- package/lib/services/socialOAuth/x.oauth.d.ts.map +1 -0
- package/lib/services/socialOAuth/x.oauth.js +134 -0
- package/lib/services/socialOAuth/youtube.oauth.d.ts +15 -0
- package/lib/services/socialOAuth/youtube.oauth.d.ts.map +1 -0
- package/lib/services/socialOAuth/youtube.oauth.js +156 -0
- package/lib/services/socialPublish/factory.d.ts +5 -0
- package/lib/services/socialPublish/factory.d.ts.map +1 -0
- package/lib/services/socialPublish/factory.js +32 -0
- package/lib/services/socialPublish/index.d.ts +10 -0
- package/lib/services/socialPublish/index.d.ts.map +1 -0
- package/lib/services/socialPublish/index.js +25 -0
- package/lib/services/socialPublish/linkedin.publish.d.ts +9 -0
- package/lib/services/socialPublish/linkedin.publish.d.ts.map +1 -0
- package/lib/services/socialPublish/linkedin.publish.js +143 -0
- package/lib/services/socialPublish/meta.publish.d.ts +28 -0
- package/lib/services/socialPublish/meta.publish.d.ts.map +1 -0
- package/lib/services/socialPublish/meta.publish.js +149 -0
- package/lib/services/socialPublish/pinterest.publish.d.ts +13 -0
- package/lib/services/socialPublish/pinterest.publish.d.ts.map +1 -0
- package/lib/services/socialPublish/pinterest.publish.js +130 -0
- package/lib/services/socialPublish/threads.publish.d.ts +12 -0
- package/lib/services/socialPublish/threads.publish.d.ts.map +1 -0
- package/lib/services/socialPublish/threads.publish.js +96 -0
- package/lib/services/socialPublish/tiktok.publish.d.ts +13 -0
- package/lib/services/socialPublish/tiktok.publish.d.ts.map +1 -0
- package/lib/services/socialPublish/tiktok.publish.js +118 -0
- package/lib/services/socialPublish/types.d.ts +47 -0
- package/lib/services/socialPublish/types.d.ts.map +1 -0
- package/lib/services/socialPublish/types.js +2 -0
- package/lib/services/socialPublish/x.publish.d.ts +12 -0
- package/lib/services/socialPublish/x.publish.d.ts.map +1 -0
- package/lib/services/socialPublish/x.publish.js +147 -0
- package/lib/services/socialPublish/youtube.publish.d.ts +9 -0
- package/lib/services/socialPublish/youtube.publish.d.ts.map +1 -0
- package/lib/services/socialPublish/youtube.publish.js +107 -0
- package/lib/services/stock/index.d.ts +2 -0
- package/lib/services/stock/index.d.ts.map +1 -0
- package/lib/services/stock/index.js +17 -0
- package/lib/services/stock/realPersonSafety.d.ts +99 -0
- package/lib/services/stock/realPersonSafety.d.ts.map +1 -0
- package/lib/services/stock/realPersonSafety.js +248 -0
- package/lib/services/translation/index.d.ts +2 -0
- package/lib/services/translation/index.d.ts.map +1 -0
- package/lib/services/translation/index.js +9 -0
- package/lib/services/translation/translation.service.d.ts +50 -0
- package/lib/services/translation/translation.service.d.ts.map +1 -0
- package/lib/services/translation/translation.service.js +211 -0
- package/lib/utils/helpers.d.ts +2 -4
- package/lib/utils/helpers.d.ts.map +1 -1
- package/lib/utils/helpers.js +9 -63
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.d.ts.map +1 -1
- package/lib/utils/index.js +1 -0
- package/lib/utils/renderTier.d.ts +26 -0
- package/lib/utils/renderTier.d.ts.map +1 -0
- package/lib/utils/renderTier.js +34 -0
- package/package.json +1 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyMetaSignature = verifyMetaSignature;
|
|
4
|
+
exports.verifyMetaSubscription = verifyMetaSubscription;
|
|
5
|
+
exports.parseMetaWebhook = parseMetaWebhook;
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const types_1 = require("../../globals/types");
|
|
8
|
+
/**
|
|
9
|
+
* Verify the `X-Hub-Signature-256` header against the raw request body. Returns
|
|
10
|
+
* false on any mismatch/missing-secret rather than throwing, so the caller can
|
|
11
|
+
* respond 403 uniformly. `rawBody` MUST be the exact bytes Meta sent (mount a
|
|
12
|
+
* raw-body capture on the webhook route — JSON.stringify of a parsed body will
|
|
13
|
+
* not match).
|
|
14
|
+
*/
|
|
15
|
+
function verifyMetaSignature(rawBody, signatureHeader) {
|
|
16
|
+
const secret = process.env.META_APP_SECRET;
|
|
17
|
+
if (!secret || !signatureHeader)
|
|
18
|
+
return false;
|
|
19
|
+
const expected = "sha256=" +
|
|
20
|
+
(0, crypto_1.createHmac)("sha256", secret)
|
|
21
|
+
.update(typeof rawBody === "string" ? Buffer.from(rawBody) : rawBody)
|
|
22
|
+
.digest("hex");
|
|
23
|
+
const a = Buffer.from(expected);
|
|
24
|
+
const b = Buffer.from(signatureHeader);
|
|
25
|
+
if (a.length !== b.length)
|
|
26
|
+
return false;
|
|
27
|
+
return (0, crypto_1.timingSafeEqual)(a, b);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Handle the GET verification handshake Meta performs when you register a
|
|
31
|
+
* webhook. Returns the challenge string to echo (200) when the verify token
|
|
32
|
+
* matches, else null (caller responds 403).
|
|
33
|
+
*/
|
|
34
|
+
function verifyMetaSubscription(query) {
|
|
35
|
+
const token = process.env.META_WEBHOOK_VERIFY_TOKEN;
|
|
36
|
+
if (query["hub.mode"] === "subscribe" &&
|
|
37
|
+
token &&
|
|
38
|
+
query["hub.verify_token"] === token) {
|
|
39
|
+
return query["hub.challenge"] ?? "";
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Flatten a verified Meta webhook body into normalized comment events. `object`
|
|
45
|
+
* tells us the platform: "instagram" → IG, "page" → Facebook. Only `comments`
|
|
46
|
+
* (and IG `mentions`) changes are ingested today; everything else is ignored.
|
|
47
|
+
*/
|
|
48
|
+
function parseMetaWebhook(body) {
|
|
49
|
+
const parsed = body;
|
|
50
|
+
const provider = parsed.object === "instagram"
|
|
51
|
+
? types_1.ESocialProvider.INSTAGRAM
|
|
52
|
+
: parsed.object === "page"
|
|
53
|
+
? types_1.ESocialProvider.FACEBOOK
|
|
54
|
+
: null;
|
|
55
|
+
if (!provider)
|
|
56
|
+
return [];
|
|
57
|
+
const events = [];
|
|
58
|
+
for (const entry of parsed.entry ?? []) {
|
|
59
|
+
const providerAccountId = entry.id;
|
|
60
|
+
if (!providerAccountId)
|
|
61
|
+
continue;
|
|
62
|
+
for (const change of entry.changes ?? []) {
|
|
63
|
+
const isComment = change.field === "comments" || change.field === "mentions";
|
|
64
|
+
if (!isComment)
|
|
65
|
+
continue;
|
|
66
|
+
const v = change.value ?? {};
|
|
67
|
+
const externalId = v.comment_id ?? v.id;
|
|
68
|
+
if (!externalId)
|
|
69
|
+
continue;
|
|
70
|
+
const createdMs = typeof v.created_time === "number"
|
|
71
|
+
? v.created_time * 1000 // Meta sends unix seconds
|
|
72
|
+
: typeof entry.time === "number"
|
|
73
|
+
? entry.time * 1000
|
|
74
|
+
: 0;
|
|
75
|
+
events.push({
|
|
76
|
+
provider,
|
|
77
|
+
providerAccountId,
|
|
78
|
+
comment: {
|
|
79
|
+
externalId,
|
|
80
|
+
parentProviderPostId: v.media?.id ?? v.post_id,
|
|
81
|
+
authorHandle: v.from?.username ?? v.from?.id,
|
|
82
|
+
authorName: v.from?.name ?? v.from?.username,
|
|
83
|
+
text: v.text ?? v.message ?? "",
|
|
84
|
+
createdAt: createdMs,
|
|
85
|
+
type: change.field === "mentions"
|
|
86
|
+
? types_1.ESocialInboxType.MENTION
|
|
87
|
+
: types_1.ESocialInboxType.COMMENT,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return events;
|
|
93
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ESocialInboxType, ESocialProvider } from "../../globals/types";
|
|
2
|
+
/**
|
|
3
|
+
* X8 Social Suite — Phase 5 engagement (inbox) client abstraction. Mirrors the
|
|
4
|
+
* socialMetrics/socialPublish adapter shape: one thin implementation per
|
|
5
|
+
* platform behind a single interface, registered in a factory. Comments arrive
|
|
6
|
+
* two ways — Meta PUSHES them via webhooks (~1–5s), while YouTube has no comment
|
|
7
|
+
* webhook so the metrics-style poll sweep PULLS them. Either way the provider
|
|
8
|
+
* payload is normalized into `IRemoteComment`, which the controller/sweep maps
|
|
9
|
+
* onto the `socialInbox` model. See notes/SOCIAL_SUITE_PLAN.md §D.
|
|
10
|
+
*
|
|
11
|
+
* TikTok comment read/reply is Business-API-only, so it is intentionally absent
|
|
12
|
+
* here (plan §6 — TikTok engage deferred).
|
|
13
|
+
*/
|
|
14
|
+
/** A comment/mention/DM as returned by a provider, before we persist it. */
|
|
15
|
+
export interface IRemoteComment {
|
|
16
|
+
/** Provider's stable id for this comment (used for reply + dedupe). */
|
|
17
|
+
externalId: string;
|
|
18
|
+
/** The post this relates to (provider post id), when known. */
|
|
19
|
+
parentProviderPostId?: string;
|
|
20
|
+
authorHandle?: string;
|
|
21
|
+
authorName?: string;
|
|
22
|
+
text: string;
|
|
23
|
+
/** Unix ms the comment was created. */
|
|
24
|
+
createdAt: number;
|
|
25
|
+
type: ESocialInboxType;
|
|
26
|
+
}
|
|
27
|
+
export interface FetchCommentsInput {
|
|
28
|
+
/** Cleartext access token for the owning account (already refreshed). */
|
|
29
|
+
accessToken: string;
|
|
30
|
+
/** Provider's post/video id whose comments we want. */
|
|
31
|
+
providerPostId: string;
|
|
32
|
+
/** Only return comments newer than this unix-ms (incremental poll). */
|
|
33
|
+
since?: number;
|
|
34
|
+
/** Soft cap on how many to return per poll. */
|
|
35
|
+
limit?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface ReplyInput {
|
|
38
|
+
/** Cleartext access token for the owning account (already refreshed). */
|
|
39
|
+
accessToken: string;
|
|
40
|
+
/** Provider id of the comment/thread we're replying to. */
|
|
41
|
+
externalId: string;
|
|
42
|
+
message: string;
|
|
43
|
+
/** Provider post id — some platforms need it alongside the comment id. */
|
|
44
|
+
providerPostId?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ReplyResult {
|
|
47
|
+
/** Provider id of the reply we just created. */
|
|
48
|
+
externalId: string;
|
|
49
|
+
}
|
|
50
|
+
export interface ModerateInput {
|
|
51
|
+
/** Cleartext access token for the owning account (already refreshed). */
|
|
52
|
+
accessToken: string;
|
|
53
|
+
/** Provider id of the comment to hide/unhide. */
|
|
54
|
+
externalId: string;
|
|
55
|
+
/** true → hide, false → unhide. */
|
|
56
|
+
hidden: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface ISocialEngageClient {
|
|
59
|
+
readonly provider: ESocialProvider;
|
|
60
|
+
/** Pull recent comments for a published post (used by the poll sweep). */
|
|
61
|
+
fetchComments(input: FetchCommentsInput): Promise<IRemoteComment[]>;
|
|
62
|
+
/** Post a reply to a comment. */
|
|
63
|
+
replyToComment(input: ReplyInput): Promise<ReplyResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Hide/unhide a comment (moderation). Optional — providers without a
|
|
66
|
+
* moderation API simply omit it and the caller degrades to "reply only".
|
|
67
|
+
*/
|
|
68
|
+
moderateComment?(input: ModerateInput): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
/** Parse an ISO-8601 timestamp into unix ms, defaulting to 0 on garbage. */
|
|
71
|
+
export declare function isoToMillis(iso: string | undefined): number;
|
|
72
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/socialEngage/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAExE;;;;;;;;;;;GAWG;AAEH,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,0EAA0E;IAC1E,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACpE,iCAAiC;IACjC,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxD;;;OAGG;IACH,eAAe,CAAC,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI3D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isoToMillis = isoToMillis;
|
|
4
|
+
/** Parse an ISO-8601 timestamp into unix ms, defaulting to 0 on garbage. */
|
|
5
|
+
function isoToMillis(iso) {
|
|
6
|
+
if (!iso)
|
|
7
|
+
return 0;
|
|
8
|
+
const ms = Date.parse(iso);
|
|
9
|
+
return Number.isFinite(ms) ? ms : 0;
|
|
10
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ESocialProvider } from "../../globals/types";
|
|
2
|
+
import { FetchCommentsInput, IRemoteComment, ISocialEngageClient, ModerateInput, ReplyInput, ReplyResult } from "./types";
|
|
3
|
+
export declare class YouTubeEngageClient implements ISocialEngageClient {
|
|
4
|
+
readonly provider = ESocialProvider.YOUTUBE;
|
|
5
|
+
fetchComments({ accessToken, providerPostId, since, limit, }: FetchCommentsInput): Promise<IRemoteComment[]>;
|
|
6
|
+
replyToComment({ accessToken, externalId, message, }: ReplyInput): Promise<ReplyResult>;
|
|
7
|
+
moderateComment({ accessToken, externalId, hidden, }: ModerateInput): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=youtube.engage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube.engage.d.ts","sourceRoot":"","sources":["../../../src/services/socialEngage/youtube.engage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,UAAU,EACV,WAAW,EAEZ,MAAM,SAAS,CAAC;AAiCjB,qBAAa,mBAAoB,YAAW,mBAAmB;IAC7D,QAAQ,CAAC,QAAQ,2BAA2B;IAEtC,aAAa,CAAC,EAClB,WAAW,EACX,cAAc,EACd,KAAK,EACL,KAAU,GACX,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAkC3C,cAAc,CAAC,EACnB,WAAW,EACX,UAAU,EACV,OAAO,GACR,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAoB9B,eAAe,CAAC,EACpB,WAAW,EACX,UAAU,EACV,MAAM,GACP,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBjC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.YouTubeEngageClient = void 0;
|
|
4
|
+
const types_1 = require("../../globals/types");
|
|
5
|
+
const types_2 = require("./types");
|
|
6
|
+
/**
|
|
7
|
+
* YouTube engagement client. YouTube has NO comment webhook, so the poll sweep
|
|
8
|
+
* pulls `commentThreads` for each published video on a schedule. Replies use
|
|
9
|
+
* `comments.insert` (needs the `youtube.force-ssl` scope, which our publish
|
|
10
|
+
* scope already includes). Moderation maps "hide" → setModerationStatus
|
|
11
|
+
* `rejected` (channel-owner only). See notes/SOCIAL_SUITE_PLAN.md §D.
|
|
12
|
+
*/
|
|
13
|
+
const API = "https://www.googleapis.com/youtube/v3";
|
|
14
|
+
class YouTubeEngageClient {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.provider = types_1.ESocialProvider.YOUTUBE;
|
|
17
|
+
}
|
|
18
|
+
async fetchComments({ accessToken, providerPostId, since, limit = 50, }) {
|
|
19
|
+
const max = Math.min(100, Math.max(1, limit));
|
|
20
|
+
const url = `${API}/commentThreads?part=snippet&order=time&textFormat=plainText` +
|
|
21
|
+
`&maxResults=${max}&videoId=${encodeURIComponent(providerPostId)}`;
|
|
22
|
+
const resp = await fetch(url, {
|
|
23
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
24
|
+
});
|
|
25
|
+
if (!resp.ok) {
|
|
26
|
+
// Comments disabled / video private surfaces as 403 — treat as "none".
|
|
27
|
+
if (resp.status === 403 || resp.status === 404)
|
|
28
|
+
return [];
|
|
29
|
+
throw new Error(`YouTubeEngage: commentThreads ${resp.status}`);
|
|
30
|
+
}
|
|
31
|
+
const json = (await resp.json());
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const item of json.items ?? []) {
|
|
34
|
+
const top = item.snippet?.topLevelComment;
|
|
35
|
+
const s = top?.snippet;
|
|
36
|
+
if (!top?.id || !s)
|
|
37
|
+
continue;
|
|
38
|
+
const createdAt = (0, types_2.isoToMillis)(s.publishedAt);
|
|
39
|
+
if (since && createdAt <= since)
|
|
40
|
+
continue;
|
|
41
|
+
out.push({
|
|
42
|
+
externalId: top.id,
|
|
43
|
+
parentProviderPostId: providerPostId,
|
|
44
|
+
authorHandle: s.authorChannelId?.value,
|
|
45
|
+
authorName: s.authorDisplayName,
|
|
46
|
+
text: s.textDisplay ?? "",
|
|
47
|
+
createdAt,
|
|
48
|
+
type: types_1.ESocialInboxType.COMMENT,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
async replyToComment({ accessToken, externalId, message, }) {
|
|
54
|
+
const resp = await fetch(`${API}/comments?part=snippet`, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
headers: {
|
|
57
|
+
Authorization: `Bearer ${accessToken}`,
|
|
58
|
+
"Content-Type": "application/json",
|
|
59
|
+
},
|
|
60
|
+
body: JSON.stringify({
|
|
61
|
+
snippet: { parentId: externalId, textOriginal: message },
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
const json = (await resp.json());
|
|
65
|
+
if (!resp.ok || !json.id) {
|
|
66
|
+
throw new Error(`YouTubeEngage: comments.insert ${resp.status} ${json.error?.message ?? ""}`.trim());
|
|
67
|
+
}
|
|
68
|
+
return { externalId: json.id };
|
|
69
|
+
}
|
|
70
|
+
async moderateComment({ accessToken, externalId, hidden, }) {
|
|
71
|
+
// YouTube has no "unhide"; rejecting removes from public view. Unhide would
|
|
72
|
+
// require the comment to be re-published, which the API doesn't expose for
|
|
73
|
+
// arbitrary comments — so unhide is a no-op (status stays as the user left it).
|
|
74
|
+
if (!hidden)
|
|
75
|
+
return;
|
|
76
|
+
const url = `${API}/comments/setModerationStatus` +
|
|
77
|
+
`?id=${encodeURIComponent(externalId)}&moderationStatus=rejected`;
|
|
78
|
+
const resp = await fetch(url, {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
81
|
+
});
|
|
82
|
+
if (!resp.ok) {
|
|
83
|
+
throw new Error(`YouTubeEngage: setModerationStatus ${resp.status}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.YouTubeEngageClient = YouTubeEngageClient;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* X8 Social Suite — B2 auto-format geometry.
|
|
3
|
+
*
|
|
4
|
+
* Pure, dependency-free math for re-framing an already-rendered video into a
|
|
5
|
+
* platform's recommended aspect. Lives in `shared` (not the node app) so it is
|
|
6
|
+
* unit-testable and reused by both the publish worker and any future preview UI.
|
|
7
|
+
*
|
|
8
|
+
* The plan's intent (SOCIAL_SUITE_PLAN.md §4 B2): *don't re-encode blindly* — but
|
|
9
|
+
* for plain generated videos we only have the stitched MP4 (no Project JSON), so
|
|
10
|
+
* the reframe is an ffmpeg scale+crop/pad transform here rather than a Remotion
|
|
11
|
+
* re-render. Agent projects that DO carry Project JSON can later route through
|
|
12
|
+
* the Remotion path; this module only computes target dimensions + the ffmpeg
|
|
13
|
+
* filter, so both callers share the same geometry.
|
|
14
|
+
*
|
|
15
|
+
* Two modes:
|
|
16
|
+
* - "cover" (default) — scale to fill the target frame, then center-crop the
|
|
17
|
+
* overflow. No bars; loses edge content. This is what Reels/Shorts
|
|
18
|
+
* auto-format expects. (Smart/face-aware crop is deferred — v1 is
|
|
19
|
+
* a center crop.)
|
|
20
|
+
* - "contain" — scale to fit inside the target frame, then pad (letterbox /
|
|
21
|
+
* pillarbox) with a solid colour. Preserves all content; adds bars.
|
|
22
|
+
*/
|
|
23
|
+
export type EReframeMode = "cover" | "contain";
|
|
24
|
+
/** Aspects the composer can request (mirrors AspectSchema + a few publish-only ratios). */
|
|
25
|
+
export declare const SUPPORTED_ASPECTS: readonly ["9:16", "1:1", "4:5", "16:9", "4:3", "3:4"];
|
|
26
|
+
export type SupportedAspect = (typeof SUPPORTED_ASPECTS)[number];
|
|
27
|
+
/** Parse "9:16" → { w: 9, h: 16 }. Throws on malformed input (validated upstream by zod). */
|
|
28
|
+
export declare function parseAspect(aspect: string): {
|
|
29
|
+
w: number;
|
|
30
|
+
h: number;
|
|
31
|
+
};
|
|
32
|
+
/** Numeric width/height ratio of an aspect string (e.g. "16:9" → 1.777…). */
|
|
33
|
+
export declare function aspectRatio(aspect: string): number;
|
|
34
|
+
/**
|
|
35
|
+
* Target output dimensions for an aspect. Uses the canonical table when known;
|
|
36
|
+
* otherwise derives a ~1080-class box from the parsed ratio so any zod-valid
|
|
37
|
+
* "W:H" still produces sane even dimensions.
|
|
38
|
+
*/
|
|
39
|
+
export declare function targetSizeFor(aspect: string): {
|
|
40
|
+
width: number;
|
|
41
|
+
height: number;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Whether a source of (srcW × srcH) needs re-framing to hit `targetAspect`.
|
|
45
|
+
* Returns false when the source ratio already matches within `tolerance`
|
|
46
|
+
* (default 1%) — the publish worker then skips the render and publishes the
|
|
47
|
+
* source as-is (no wasted transcode, no quality loss).
|
|
48
|
+
*/
|
|
49
|
+
export declare function needsReframe(srcWidth: number, srcHeight: number, targetAspect: string, tolerance?: number): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Build the ffmpeg `-vf` filter string that reframes a source of (srcW × srcH)
|
|
52
|
+
* into (dstW × dstH) using the chosen mode. SAR is reset to 1 so non-square
|
|
53
|
+
* source pixels don't skew the output.
|
|
54
|
+
*
|
|
55
|
+
* cover: scale to the smallest size that fully covers the target (increase),
|
|
56
|
+
* then center-crop to exact target dimensions.
|
|
57
|
+
* contain: scale to the largest size that fits inside (decrease), then pad the
|
|
58
|
+
* remainder centred with `padColor`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildReframeFilter(dstWidth: number, dstHeight: number, mode?: EReframeMode, padColor?: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* One-shot geometry resolution for a reframe job: given the probed source
|
|
63
|
+
* dimensions and a requested aspect, return the target dimensions, whether a
|
|
64
|
+
* reframe is actually required, and the ready-to-use ffmpeg filter. The worker
|
|
65
|
+
* calls this and either skips (when `reframe` is false) or runs ffmpeg with
|
|
66
|
+
* `filter`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveReframe(srcWidth: number, srcHeight: number, targetAspect: string, mode?: EReframeMode): {
|
|
69
|
+
width: number;
|
|
70
|
+
height: number;
|
|
71
|
+
reframe: boolean;
|
|
72
|
+
filter: string;
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=aspectGeometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aspectGeometry.d.ts","sourceRoot":"","sources":["../../../src/services/socialFormat/aspectGeometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/C,2FAA2F;AAC3F,eAAO,MAAM,iBAAiB,uDAAwD,CAAC;AACvF,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAgBjE,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAOpE;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlD;AAOD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAS/E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,SAAO,GACf,OAAO,CAKT;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,YAAsB,EAC5B,QAAQ,SAAU,GACjB,MAAM,CAaR;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,YAAsB,GAC3B;IACD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAQA"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* X8 Social Suite — B2 auto-format geometry.
|
|
4
|
+
*
|
|
5
|
+
* Pure, dependency-free math for re-framing an already-rendered video into a
|
|
6
|
+
* platform's recommended aspect. Lives in `shared` (not the node app) so it is
|
|
7
|
+
* unit-testable and reused by both the publish worker and any future preview UI.
|
|
8
|
+
*
|
|
9
|
+
* The plan's intent (SOCIAL_SUITE_PLAN.md §4 B2): *don't re-encode blindly* — but
|
|
10
|
+
* for plain generated videos we only have the stitched MP4 (no Project JSON), so
|
|
11
|
+
* the reframe is an ffmpeg scale+crop/pad transform here rather than a Remotion
|
|
12
|
+
* re-render. Agent projects that DO carry Project JSON can later route through
|
|
13
|
+
* the Remotion path; this module only computes target dimensions + the ffmpeg
|
|
14
|
+
* filter, so both callers share the same geometry.
|
|
15
|
+
*
|
|
16
|
+
* Two modes:
|
|
17
|
+
* - "cover" (default) — scale to fill the target frame, then center-crop the
|
|
18
|
+
* overflow. No bars; loses edge content. This is what Reels/Shorts
|
|
19
|
+
* auto-format expects. (Smart/face-aware crop is deferred — v1 is
|
|
20
|
+
* a center crop.)
|
|
21
|
+
* - "contain" — scale to fit inside the target frame, then pad (letterbox /
|
|
22
|
+
* pillarbox) with a solid colour. Preserves all content; adds bars.
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.SUPPORTED_ASPECTS = void 0;
|
|
26
|
+
exports.parseAspect = parseAspect;
|
|
27
|
+
exports.aspectRatio = aspectRatio;
|
|
28
|
+
exports.targetSizeFor = targetSizeFor;
|
|
29
|
+
exports.needsReframe = needsReframe;
|
|
30
|
+
exports.buildReframeFilter = buildReframeFilter;
|
|
31
|
+
exports.resolveReframe = resolveReframe;
|
|
32
|
+
/** Aspects the composer can request (mirrors AspectSchema + a few publish-only ratios). */
|
|
33
|
+
exports.SUPPORTED_ASPECTS = ["9:16", "1:1", "4:5", "16:9", "4:3", "3:4"];
|
|
34
|
+
/**
|
|
35
|
+
* Canonical upload dimensions per aspect — the resolution each platform
|
|
36
|
+
* recommends. Even-numbered (h264 requires even width/height). Portrait/Reels
|
|
37
|
+
* caps the long edge at 1920 (1080×1920); square/landscape use 1080-class.
|
|
38
|
+
*/
|
|
39
|
+
const CANONICAL_SIZE = {
|
|
40
|
+
"9:16": { width: 1080, height: 1920 },
|
|
41
|
+
"16:9": { width: 1920, height: 1080 },
|
|
42
|
+
"1:1": { width: 1080, height: 1080 },
|
|
43
|
+
"4:5": { width: 1080, height: 1350 },
|
|
44
|
+
"4:3": { width: 1440, height: 1080 },
|
|
45
|
+
"3:4": { width: 1080, height: 1440 },
|
|
46
|
+
};
|
|
47
|
+
/** Parse "9:16" → { w: 9, h: 16 }. Throws on malformed input (validated upstream by zod). */
|
|
48
|
+
function parseAspect(aspect) {
|
|
49
|
+
const m = /^(\d{1,2}):(\d{1,2})$/.exec(aspect.trim());
|
|
50
|
+
if (!m)
|
|
51
|
+
throw new Error(`invalid aspect "${aspect}"`);
|
|
52
|
+
const w = Number(m[1]);
|
|
53
|
+
const h = Number(m[2]);
|
|
54
|
+
if (!w || !h)
|
|
55
|
+
throw new Error(`invalid aspect "${aspect}"`);
|
|
56
|
+
return { w, h };
|
|
57
|
+
}
|
|
58
|
+
/** Numeric width/height ratio of an aspect string (e.g. "16:9" → 1.777…). */
|
|
59
|
+
function aspectRatio(aspect) {
|
|
60
|
+
const { w, h } = parseAspect(aspect);
|
|
61
|
+
return w / h;
|
|
62
|
+
}
|
|
63
|
+
/** Round to the nearest even integer (h264 demands even pixel dimensions). */
|
|
64
|
+
function even(n) {
|
|
65
|
+
return Math.max(2, 2 * Math.round(n / 2));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Target output dimensions for an aspect. Uses the canonical table when known;
|
|
69
|
+
* otherwise derives a ~1080-class box from the parsed ratio so any zod-valid
|
|
70
|
+
* "W:H" still produces sane even dimensions.
|
|
71
|
+
*/
|
|
72
|
+
function targetSizeFor(aspect) {
|
|
73
|
+
const known = CANONICAL_SIZE[aspect];
|
|
74
|
+
if (known)
|
|
75
|
+
return known;
|
|
76
|
+
const { w, h } = parseAspect(aspect);
|
|
77
|
+
// Base the shorter side on 1080 and scale the longer side off the ratio.
|
|
78
|
+
if (w >= h) {
|
|
79
|
+
return { width: even((1080 * w) / h), height: 1080 };
|
|
80
|
+
}
|
|
81
|
+
return { width: 1080, height: even((1080 * h) / w) };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Whether a source of (srcW × srcH) needs re-framing to hit `targetAspect`.
|
|
85
|
+
* Returns false when the source ratio already matches within `tolerance`
|
|
86
|
+
* (default 1%) — the publish worker then skips the render and publishes the
|
|
87
|
+
* source as-is (no wasted transcode, no quality loss).
|
|
88
|
+
*/
|
|
89
|
+
function needsReframe(srcWidth, srcHeight, targetAspect, tolerance = 0.01) {
|
|
90
|
+
if (!srcWidth || !srcHeight)
|
|
91
|
+
return true;
|
|
92
|
+
const src = srcWidth / srcHeight;
|
|
93
|
+
const target = aspectRatio(targetAspect);
|
|
94
|
+
return Math.abs(src - target) / target > tolerance;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Build the ffmpeg `-vf` filter string that reframes a source of (srcW × srcH)
|
|
98
|
+
* into (dstW × dstH) using the chosen mode. SAR is reset to 1 so non-square
|
|
99
|
+
* source pixels don't skew the output.
|
|
100
|
+
*
|
|
101
|
+
* cover: scale to the smallest size that fully covers the target (increase),
|
|
102
|
+
* then center-crop to exact target dimensions.
|
|
103
|
+
* contain: scale to the largest size that fits inside (decrease), then pad the
|
|
104
|
+
* remainder centred with `padColor`.
|
|
105
|
+
*/
|
|
106
|
+
function buildReframeFilter(dstWidth, dstHeight, mode = "cover", padColor = "black") {
|
|
107
|
+
if (mode === "contain") {
|
|
108
|
+
return [
|
|
109
|
+
`scale=${dstWidth}:${dstHeight}:force_original_aspect_ratio=decrease`,
|
|
110
|
+
`pad=${dstWidth}:${dstHeight}:(ow-iw)/2:(oh-ih)/2:color=${padColor}`,
|
|
111
|
+
`setsar=1`,
|
|
112
|
+
].join(",");
|
|
113
|
+
}
|
|
114
|
+
return [
|
|
115
|
+
`scale=${dstWidth}:${dstHeight}:force_original_aspect_ratio=increase`,
|
|
116
|
+
`crop=${dstWidth}:${dstHeight}`,
|
|
117
|
+
`setsar=1`,
|
|
118
|
+
].join(",");
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* One-shot geometry resolution for a reframe job: given the probed source
|
|
122
|
+
* dimensions and a requested aspect, return the target dimensions, whether a
|
|
123
|
+
* reframe is actually required, and the ready-to-use ffmpeg filter. The worker
|
|
124
|
+
* calls this and either skips (when `reframe` is false) or runs ffmpeg with
|
|
125
|
+
* `filter`.
|
|
126
|
+
*/
|
|
127
|
+
function resolveReframe(srcWidth, srcHeight, targetAspect, mode = "cover") {
|
|
128
|
+
const { width, height } = targetSizeFor(targetAspect);
|
|
129
|
+
return {
|
|
130
|
+
width,
|
|
131
|
+
height,
|
|
132
|
+
reframe: needsReframe(srcWidth, srcHeight, targetAspect),
|
|
133
|
+
filter: buildReframeFilter(width, height, mode),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/socialFormat/index.ts"],"names":[],"mappings":"AAEA,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
// X8 Social Suite — B2 auto-format. Pure geometry shared by the publish worker
|
|
18
|
+
// (ffmpeg reframe) and any future per-platform preview. See aspectGeometry.ts.
|
|
19
|
+
__exportStar(require("./aspectGeometry"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/socialInsights/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./timeBuckets"), exports);
|
|
18
|
+
__exportStar(require("./recommendations"), exports);
|