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.
Files changed (468) hide show
  1. package/lib/globals/aiModels/enums.d.ts +11 -1
  2. package/lib/globals/aiModels/enums.d.ts.map +1 -1
  3. package/lib/globals/aiModels/enums.js +24 -1
  4. package/lib/globals/aiModels/index.d.ts.map +1 -1
  5. package/lib/globals/aiModels/index.js +2 -0
  6. package/lib/globals/aiModels/providers/anthropic.d.ts +12 -0
  7. package/lib/globals/aiModels/providers/anthropic.d.ts.map +1 -0
  8. package/lib/globals/aiModels/providers/anthropic.js +88 -0
  9. package/lib/globals/aiModels/providers/google.d.ts.map +1 -1
  10. package/lib/globals/aiModels/providers/google.js +115 -10
  11. package/lib/globals/aiModels/providers/openai.d.ts.map +1 -1
  12. package/lib/globals/aiModels/providers/openai.js +63 -4
  13. package/lib/globals/aiModels/tierHelpers.d.ts +12 -0
  14. package/lib/globals/aiModels/tierHelpers.d.ts.map +1 -1
  15. package/lib/globals/aiModels/tierHelpers.js +83 -0
  16. package/lib/globals/aiModels/types.d.ts +19 -0
  17. package/lib/globals/aiModels/types.d.ts.map +1 -1
  18. package/lib/globals/types.d.ts +120 -1
  19. package/lib/globals/types.d.ts.map +1 -1
  20. package/lib/globals/types.js +135 -1
  21. package/lib/models/agent.model.d.ts +41 -1
  22. package/lib/models/agent.model.d.ts.map +1 -1
  23. package/lib/models/index.d.ts +1 -0
  24. package/lib/models/index.d.ts.map +1 -1
  25. package/lib/models/index.js +1 -0
  26. package/lib/models/social.model.d.ts +180 -0
  27. package/lib/models/social.model.d.ts.map +1 -0
  28. package/lib/models/social.model.js +2 -0
  29. package/lib/models/user.model.d.ts +10 -0
  30. package/lib/models/user.model.d.ts.map +1 -1
  31. package/lib/models/video.model.d.ts +6 -0
  32. package/lib/models/video.model.d.ts.map +1 -1
  33. package/lib/schemas/brief.schema.d.ts +46 -0
  34. package/lib/schemas/brief.schema.d.ts.map +1 -1
  35. package/lib/schemas/brief.schema.js +72 -1
  36. package/lib/schemas/index.d.ts +1 -0
  37. package/lib/schemas/index.d.ts.map +1 -1
  38. package/lib/schemas/index.js +1 -0
  39. package/lib/schemas/project.schema.d.ts +70 -3
  40. package/lib/schemas/project.schema.d.ts.map +1 -1
  41. package/lib/schemas/project.schema.js +12 -0
  42. package/lib/schemas/social.schema.d.ts +91 -0
  43. package/lib/schemas/social.schema.d.ts.map +1 -0
  44. package/lib/schemas/social.schema.js +114 -0
  45. package/lib/schemas/videoPlan.schema.d.ts +117 -3
  46. package/lib/schemas/videoPlan.schema.d.ts.map +1 -1
  47. package/lib/schemas/videoPlan.schema.js +141 -1
  48. package/lib/services/agent/chatAgent.d.ts +25 -1
  49. package/lib/services/agent/chatAgent.d.ts.map +1 -1
  50. package/lib/services/agent/chatAgent.js +145 -9
  51. package/lib/services/agent/costPreflight.d.ts +11 -1
  52. package/lib/services/agent/costPreflight.d.ts.map +1 -1
  53. package/lib/services/agent/costPreflight.js +18 -1
  54. package/lib/services/agent/covers/coverPlanner.d.ts +41 -0
  55. package/lib/services/agent/covers/coverPlanner.d.ts.map +1 -0
  56. package/lib/services/agent/covers/coverPlanner.js +278 -0
  57. package/lib/services/agent/covers/covers.schema.d.ts +158 -0
  58. package/lib/services/agent/covers/covers.schema.d.ts.map +1 -0
  59. package/lib/services/agent/covers/covers.schema.js +166 -0
  60. package/lib/services/agent/covers/index.d.ts +3 -0
  61. package/lib/services/agent/covers/index.d.ts.map +1 -0
  62. package/lib/services/agent/covers/index.js +18 -0
  63. package/lib/services/agent/critic.d.ts +10 -0
  64. package/lib/services/agent/critic.d.ts.map +1 -1
  65. package/lib/services/agent/critic.js +37 -1
  66. package/lib/services/agent/editClassifier.d.ts +4 -4
  67. package/lib/services/agent/editClassifier.js +2 -2
  68. package/lib/services/agent/editExisting/editAssembler.d.ts +78 -0
  69. package/lib/services/agent/editExisting/editAssembler.d.ts.map +1 -0
  70. package/lib/services/agent/editExisting/editAssembler.js +172 -0
  71. package/lib/services/agent/editExisting/editExisting.schema.d.ts +119 -0
  72. package/lib/services/agent/editExisting/editExisting.schema.d.ts.map +1 -0
  73. package/lib/services/agent/editExisting/editExisting.schema.js +157 -0
  74. package/lib/services/agent/editExisting/highlightPicker.d.ts +48 -0
  75. package/lib/services/agent/editExisting/highlightPicker.d.ts.map +1 -0
  76. package/lib/services/agent/editExisting/highlightPicker.js +199 -0
  77. package/lib/services/agent/editExisting/index.d.ts +4 -0
  78. package/lib/services/agent/editExisting/index.d.ts.map +1 -0
  79. package/lib/services/agent/editExisting/index.js +19 -0
  80. package/lib/services/agent/eval/recorder.d.ts +13 -1
  81. package/lib/services/agent/eval/recorder.d.ts.map +1 -1
  82. package/lib/services/agent/eval/recorder.js +59 -0
  83. package/lib/services/agent/eval/seedBriefs.d.ts +4 -3
  84. package/lib/services/agent/eval/seedBriefs.d.ts.map +1 -1
  85. package/lib/services/agent/eval/seedBriefs.js +283 -3
  86. package/lib/services/agent/eval/types.d.ts +10 -0
  87. package/lib/services/agent/eval/types.d.ts.map +1 -1
  88. package/lib/services/agent/executor/core.d.ts +70 -0
  89. package/lib/services/agent/executor/core.d.ts.map +1 -0
  90. package/lib/services/agent/executor/core.js +250 -0
  91. package/lib/services/agent/executor/duration.d.ts +20 -0
  92. package/lib/services/agent/executor/duration.d.ts.map +1 -0
  93. package/lib/services/agent/executor/duration.js +46 -0
  94. package/lib/services/agent/executor/index.d.ts +15 -0
  95. package/lib/services/agent/executor/index.d.ts.map +1 -0
  96. package/lib/services/agent/executor/index.js +32 -0
  97. package/lib/services/agent/executor/types.d.ts +183 -0
  98. package/lib/services/agent/executor/types.d.ts.map +1 -0
  99. package/lib/services/agent/executor/types.js +29 -0
  100. package/lib/services/agent/executor/visual.d.ts +32 -0
  101. package/lib/services/agent/executor/visual.d.ts.map +1 -0
  102. package/lib/services/agent/executor/visual.js +400 -0
  103. package/lib/services/agent/executor/voice.d.ts +17 -0
  104. package/lib/services/agent/executor/voice.d.ts.map +1 -0
  105. package/lib/services/agent/executor/voice.js +119 -0
  106. package/lib/services/agent/extendChain.d.ts +101 -0
  107. package/lib/services/agent/extendChain.d.ts.map +1 -0
  108. package/lib/services/agent/extendChain.js +177 -0
  109. package/lib/services/agent/index.d.ts +11 -1
  110. package/lib/services/agent/index.d.ts.map +1 -1
  111. package/lib/services/agent/index.js +11 -1
  112. package/lib/services/agent/llmCaller.d.ts +7 -8
  113. package/lib/services/agent/llmCaller.d.ts.map +1 -1
  114. package/lib/services/agent/llmCallerAnthropic.d.ts +44 -31
  115. package/lib/services/agent/llmCallerAnthropic.d.ts.map +1 -1
  116. package/lib/services/agent/llmCallerAnthropic.js +135 -60
  117. package/lib/services/agent/llmCallerFactory.d.ts +34 -0
  118. package/lib/services/agent/llmCallerFactory.d.ts.map +1 -0
  119. package/lib/services/agent/llmCallerFactory.js +31 -0
  120. package/lib/services/agent/llmCallerGemini.d.ts +62 -0
  121. package/lib/services/agent/llmCallerGemini.d.ts.map +1 -0
  122. package/lib/services/agent/llmCallerGemini.js +235 -0
  123. package/lib/services/agent/llmCallerOpenai.d.ts +56 -0
  124. package/lib/services/agent/llmCallerOpenai.d.ts.map +1 -0
  125. package/lib/services/agent/llmCallerOpenai.js +230 -0
  126. package/lib/services/agent/llmCallerRegistry.d.ts.map +1 -1
  127. package/lib/services/agent/llmCallerRegistry.js +7 -7
  128. package/lib/services/agent/llmCallerRouting.d.ts +63 -0
  129. package/lib/services/agent/llmCallerRouting.d.ts.map +1 -0
  130. package/lib/services/agent/llmCallerRouting.js +124 -0
  131. package/lib/services/agent/llmModelRegistry.d.ts +59 -0
  132. package/lib/services/agent/llmModelRegistry.d.ts.map +1 -0
  133. package/lib/services/agent/llmModelRegistry.js +168 -0
  134. package/lib/services/agent/llmRetry.d.ts +57 -0
  135. package/lib/services/agent/llmRetry.d.ts.map +1 -0
  136. package/lib/services/agent/llmRetry.js +102 -0
  137. package/lib/services/agent/modelRouter.d.ts +3 -3
  138. package/lib/services/agent/modelRouter.d.ts.map +1 -1
  139. package/lib/services/agent/modelRouter.js +27 -13
  140. package/lib/services/agent/planMutations.d.ts +54 -1
  141. package/lib/services/agent/planMutations.d.ts.map +1 -1
  142. package/lib/services/agent/planMutations.js +78 -0
  143. package/lib/services/agent/planner/Planner.d.ts +0 -17
  144. package/lib/services/agent/planner/Planner.d.ts.map +1 -1
  145. package/lib/services/agent/planner/Planner.js +67 -303
  146. package/lib/services/agent/planner/overlayRegen.d.ts +38 -0
  147. package/lib/services/agent/planner/overlayRegen.d.ts.map +1 -0
  148. package/lib/services/agent/planner/overlayRegen.js +145 -0
  149. package/lib/services/agent/planner/plannerMessages.d.ts +34 -0
  150. package/lib/services/agent/planner/plannerMessages.d.ts.map +1 -0
  151. package/lib/services/agent/planner/plannerMessages.js +185 -0
  152. package/lib/services/agent/planner/promptSections.d.ts +12 -0
  153. package/lib/services/agent/planner/promptSections.d.ts.map +1 -1
  154. package/lib/services/agent/planner/promptSections.js +57 -0
  155. package/lib/services/agent/planner/scriptFirstPlanner.d.ts +35 -0
  156. package/lib/services/agent/planner/scriptFirstPlanner.d.ts.map +1 -0
  157. package/lib/services/agent/planner/scriptFirstPlanner.js +140 -0
  158. package/lib/services/agent/planner/structuralRules.d.ts +10 -0
  159. package/lib/services/agent/planner/structuralRules.d.ts.map +1 -1
  160. package/lib/services/agent/planner/structuralRules.js +92 -9
  161. package/lib/services/agent/planner/validators.d.ts +18 -0
  162. package/lib/services/agent/planner/validators.d.ts.map +1 -1
  163. package/lib/services/agent/planner/validators.js +97 -0
  164. package/lib/services/agent/planner.d.ts +2 -1
  165. package/lib/services/agent/planner.d.ts.map +1 -1
  166. package/lib/services/agent/planner.js +5 -1
  167. package/lib/services/agent/priorProject.d.ts +26 -0
  168. package/lib/services/agent/priorProject.d.ts.map +1 -0
  169. package/lib/services/agent/priorProject.js +51 -0
  170. package/lib/services/agent/providerFallback/chains.d.ts.map +1 -1
  171. package/lib/services/agent/providerFallback/chains.js +27 -15
  172. package/lib/services/agent/repurpose/index.d.ts +3 -0
  173. package/lib/services/agent/repurpose/index.d.ts.map +1 -0
  174. package/lib/services/agent/repurpose/index.js +18 -0
  175. package/lib/services/agent/repurpose/repurpose.schema.d.ts +132 -0
  176. package/lib/services/agent/repurpose/repurpose.schema.d.ts.map +1 -0
  177. package/lib/services/agent/repurpose/repurpose.schema.js +144 -0
  178. package/lib/services/agent/repurpose/shortsPicker.d.ts +25 -0
  179. package/lib/services/agent/repurpose/shortsPicker.d.ts.map +1 -0
  180. package/lib/services/agent/repurpose/shortsPicker.js +218 -0
  181. package/lib/services/agent/runHelpers.d.ts +21 -2
  182. package/lib/services/agent/runHelpers.d.ts.map +1 -1
  183. package/lib/services/agent/runHelpers.js +71 -2
  184. package/lib/services/agent/tools/animateImage.tool.d.ts +1 -0
  185. package/lib/services/agent/tools/animateImage.tool.d.ts.map +1 -1
  186. package/lib/services/agent/tools/animateImage.tool.js +12 -0
  187. package/lib/services/agent/tools/chapterOutline.tool.d.ts +42 -0
  188. package/lib/services/agent/tools/chapterOutline.tool.d.ts.map +1 -0
  189. package/lib/services/agent/tools/chapterOutline.tool.js +115 -0
  190. package/lib/services/agent/tools/composeScene.tool.d.ts +65 -2
  191. package/lib/services/agent/tools/composeScene.tool.d.ts.map +1 -1
  192. package/lib/services/agent/tools/estimateCost.tool.d.ts +28 -1
  193. package/lib/services/agent/tools/estimateCost.tool.d.ts.map +1 -1
  194. package/lib/services/agent/tools/estimateCost.tool.js +55 -7
  195. package/lib/services/agent/tools/extendVideo.tool.d.ts +26 -0
  196. package/lib/services/agent/tools/extendVideo.tool.d.ts.map +1 -0
  197. package/lib/services/agent/tools/extendVideo.tool.js +149 -0
  198. package/lib/services/agent/tools/generateScript.tool.d.ts +184 -0
  199. package/lib/services/agent/tools/generateScript.tool.d.ts.map +1 -0
  200. package/lib/services/agent/tools/generateScript.tool.js +123 -0
  201. package/lib/services/agent/tools/generateVideo.tool.d.ts +1 -0
  202. package/lib/services/agent/tools/generateVideo.tool.d.ts.map +1 -1
  203. package/lib/services/agent/tools/generateVideo.tool.js +20 -1
  204. package/lib/services/agent/tools/index.d.ts +4 -0
  205. package/lib/services/agent/tools/index.d.ts.map +1 -1
  206. package/lib/services/agent/tools/index.js +4 -0
  207. package/lib/services/agent/tools/matchBrollToScript.tool.d.ts +50 -0
  208. package/lib/services/agent/tools/matchBrollToScript.tool.d.ts.map +1 -0
  209. package/lib/services/agent/tools/matchBrollToScript.tool.js +139 -0
  210. package/lib/services/agent/tools/planVideo.tool.d.ts +57 -1
  211. package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -1
  212. package/lib/services/agent/tools/planVideo.tool.js +3 -3
  213. package/lib/services/agent/tools/render.tool.d.ts +22 -1
  214. package/lib/services/agent/tools/render.tool.d.ts.map +1 -1
  215. package/lib/services/aiGen/aiGenFactory.service.d.ts.map +1 -1
  216. package/lib/services/aiGen/aiGenFactory.service.js +18 -3
  217. package/lib/services/aiGen/helpers.d.ts +8 -0
  218. package/lib/services/aiGen/helpers.d.ts.map +1 -1
  219. package/lib/services/aiGen/helpers.js +12 -0
  220. package/lib/services/aiGen/providers/anthropic/anthropic.service.d.ts +26 -0
  221. package/lib/services/aiGen/providers/anthropic/anthropic.service.d.ts.map +1 -0
  222. package/lib/services/aiGen/providers/anthropic/anthropic.service.js +95 -0
  223. package/lib/services/aiGen/providers/google/google.service.d.ts +25 -1
  224. package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
  225. package/lib/services/aiGen/providers/google/google.service.js +136 -237
  226. package/lib/services/aiGen/providers/google/googleApiKeys.d.ts +71 -0
  227. package/lib/services/aiGen/providers/google/googleApiKeys.d.ts.map +1 -0
  228. package/lib/services/aiGen/providers/google/googleApiKeys.js +137 -0
  229. package/lib/services/aiGen/providers/google/googleErrors.d.ts +13 -0
  230. package/lib/services/aiGen/providers/google/googleErrors.d.ts.map +1 -0
  231. package/lib/services/aiGen/providers/google/googleErrors.js +102 -0
  232. package/lib/services/aiGen/providers/google/googleFetch.d.ts +8 -0
  233. package/lib/services/aiGen/providers/google/googleFetch.d.ts.map +1 -0
  234. package/lib/services/aiGen/providers/google/googleFetch.js +96 -0
  235. package/lib/services/aiGen/providers/google/googleKeyPool.d.ts +52 -0
  236. package/lib/services/aiGen/providers/google/googleKeyPool.d.ts.map +1 -0
  237. package/lib/services/aiGen/providers/google/googleKeyPool.js +129 -0
  238. package/lib/services/aiGen/providers/google/googleMusic.d.ts +15 -0
  239. package/lib/services/aiGen/providers/google/googleMusic.d.ts.map +1 -0
  240. package/lib/services/aiGen/providers/google/googleMusic.js +77 -0
  241. package/lib/services/aiGen/providers/kling/kling.service.d.ts +7 -3
  242. package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
  243. package/lib/services/aiGen/providers/kling/kling.service.js +23 -367
  244. package/lib/services/aiGen/providers/kling/klingCredits.d.ts +9 -0
  245. package/lib/services/aiGen/providers/kling/klingCredits.d.ts.map +1 -0
  246. package/lib/services/aiGen/providers/kling/klingCredits.js +63 -0
  247. package/lib/services/aiGen/providers/kling/klingRequests.d.ts +32 -0
  248. package/lib/services/aiGen/providers/kling/klingRequests.d.ts.map +1 -0
  249. package/lib/services/aiGen/providers/kling/klingRequests.js +194 -0
  250. package/lib/services/aiGen/providers/kling/klingStatus.d.ts +16 -0
  251. package/lib/services/aiGen/providers/kling/klingStatus.d.ts.map +1 -0
  252. package/lib/services/aiGen/providers/kling/klingStatus.js +173 -0
  253. package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts.map +1 -1
  254. package/lib/services/aiGen/providers/pixverse/pixverse.service.js +7 -1
  255. package/lib/services/bullmq.service.d.ts +61 -0
  256. package/lib/services/bullmq.service.d.ts.map +1 -1
  257. package/lib/services/bullmq.service.js +124 -2
  258. package/lib/services/crypto/index.d.ts +2 -0
  259. package/lib/services/crypto/index.d.ts.map +1 -0
  260. package/lib/services/crypto/index.js +17 -0
  261. package/lib/services/crypto/tokenVault.d.ts +47 -0
  262. package/lib/services/crypto/tokenVault.d.ts.map +1 -0
  263. package/lib/services/crypto/tokenVault.js +179 -0
  264. package/lib/services/editor/captionStyleHint.d.ts +3 -0
  265. package/lib/services/editor/captionStyleHint.d.ts.map +1 -0
  266. package/lib/services/editor/captionStyleHint.js +112 -0
  267. package/lib/services/editor/planToProject.d.ts +7 -66
  268. package/lib/services/editor/planToProject.d.ts.map +1 -1
  269. package/lib/services/editor/planToProject.helpers.d.ts +40 -0
  270. package/lib/services/editor/planToProject.helpers.d.ts.map +1 -0
  271. package/lib/services/editor/planToProject.helpers.js +177 -0
  272. package/lib/services/editor/planToProject.js +197 -180
  273. package/lib/services/editor/planToProject.types.d.ts +94 -0
  274. package/lib/services/editor/planToProject.types.d.ts.map +1 -0
  275. package/lib/services/editor/planToProject.types.js +2 -0
  276. package/lib/services/firestore.service.d.ts +5 -0
  277. package/lib/services/firestore.service.d.ts.map +1 -1
  278. package/lib/services/firestore.service.js +13 -0
  279. package/lib/services/index.d.ts +13 -0
  280. package/lib/services/index.d.ts.map +1 -1
  281. package/lib/services/index.js +13 -0
  282. package/lib/services/promptEnhancer/index.d.ts +18 -0
  283. package/lib/services/promptEnhancer/index.d.ts.map +1 -0
  284. package/lib/services/promptEnhancer/index.js +33 -0
  285. package/lib/services/promptEnhancer/models.d.ts +54 -0
  286. package/lib/services/promptEnhancer/models.d.ts.map +1 -0
  287. package/lib/services/promptEnhancer/models.js +37 -0
  288. package/lib/services/promptEnhancer/profiles/agent.profile.d.ts +14 -0
  289. package/lib/services/promptEnhancer/profiles/agent.profile.d.ts.map +1 -0
  290. package/lib/services/promptEnhancer/profiles/agent.profile.js +40 -0
  291. package/lib/services/promptEnhancer/profiles/avatar.profile.d.ts +13 -0
  292. package/lib/services/promptEnhancer/profiles/avatar.profile.d.ts.map +1 -0
  293. package/lib/services/promptEnhancer/profiles/avatar.profile.js +40 -0
  294. package/lib/services/promptEnhancer/profiles/base.d.ts +28 -0
  295. package/lib/services/promptEnhancer/profiles/base.d.ts.map +1 -0
  296. package/lib/services/promptEnhancer/profiles/base.js +35 -0
  297. package/lib/services/promptEnhancer/profiles/image.profile.d.ts +11 -0
  298. package/lib/services/promptEnhancer/profiles/image.profile.d.ts.map +1 -0
  299. package/lib/services/promptEnhancer/profiles/image.profile.js +42 -0
  300. package/lib/services/promptEnhancer/profiles/index.d.ts +12 -0
  301. package/lib/services/promptEnhancer/profiles/index.d.ts.map +1 -0
  302. package/lib/services/promptEnhancer/profiles/index.js +33 -0
  303. package/lib/services/promptEnhancer/profiles/video.profile.d.ts +15 -0
  304. package/lib/services/promptEnhancer/profiles/video.profile.d.ts.map +1 -0
  305. package/lib/services/promptEnhancer/profiles/video.profile.js +81 -0
  306. package/lib/services/promptEnhancer/promptEnhancer.service.d.ts +45 -0
  307. package/lib/services/promptEnhancer/promptEnhancer.service.d.ts.map +1 -0
  308. package/lib/services/promptEnhancer/promptEnhancer.service.js +157 -0
  309. package/lib/services/promptEnhancer/schema.d.ts +19 -0
  310. package/lib/services/promptEnhancer/schema.d.ts.map +1 -0
  311. package/lib/services/promptEnhancer/schema.js +43 -0
  312. package/lib/services/promptEnhancer/types.d.ts +112 -0
  313. package/lib/services/promptEnhancer/types.d.ts.map +1 -0
  314. package/lib/services/promptEnhancer/types.js +2 -0
  315. package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts +60 -5
  316. package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts.map +1 -1
  317. package/lib/services/rateLimiter/distributedRateLimiter.service.js +184 -16
  318. package/lib/services/socialAI/captionGen.d.ts +81 -0
  319. package/lib/services/socialAI/captionGen.d.ts.map +1 -0
  320. package/lib/services/socialAI/captionGen.js +206 -0
  321. package/lib/services/socialAI/hookScore.d.ts +85 -0
  322. package/lib/services/socialAI/hookScore.d.ts.map +1 -0
  323. package/lib/services/socialAI/hookScore.js +170 -0
  324. package/lib/services/socialAI/index.d.ts +3 -0
  325. package/lib/services/socialAI/index.d.ts.map +1 -0
  326. package/lib/services/socialAI/index.js +18 -0
  327. package/lib/services/socialAccounts/index.d.ts +2 -0
  328. package/lib/services/socialAccounts/index.d.ts.map +1 -0
  329. package/lib/services/socialAccounts/index.js +17 -0
  330. package/lib/services/socialAccounts/socialAccountService.d.ts +25 -0
  331. package/lib/services/socialAccounts/socialAccountService.d.ts.map +1 -0
  332. package/lib/services/socialAccounts/socialAccountService.js +105 -0
  333. package/lib/services/socialEngage/factory.d.ts +7 -0
  334. package/lib/services/socialEngage/factory.d.ts.map +1 -0
  335. package/lib/services/socialEngage/factory.js +25 -0
  336. package/lib/services/socialEngage/index.d.ts +6 -0
  337. package/lib/services/socialEngage/index.d.ts.map +1 -0
  338. package/lib/services/socialEngage/index.js +21 -0
  339. package/lib/services/socialEngage/meta.engage.d.ts +17 -0
  340. package/lib/services/socialEngage/meta.engage.d.ts.map +1 -0
  341. package/lib/services/socialEngage/meta.engage.js +128 -0
  342. package/lib/services/socialEngage/metaWebhook.d.ts +50 -0
  343. package/lib/services/socialEngage/metaWebhook.d.ts.map +1 -0
  344. package/lib/services/socialEngage/metaWebhook.js +93 -0
  345. package/lib/services/socialEngage/types.d.ts +72 -0
  346. package/lib/services/socialEngage/types.d.ts.map +1 -0
  347. package/lib/services/socialEngage/types.js +10 -0
  348. package/lib/services/socialEngage/youtube.engage.d.ts +9 -0
  349. package/lib/services/socialEngage/youtube.engage.d.ts.map +1 -0
  350. package/lib/services/socialEngage/youtube.engage.js +87 -0
  351. package/lib/services/socialFormat/aspectGeometry.d.ts +74 -0
  352. package/lib/services/socialFormat/aspectGeometry.d.ts.map +1 -0
  353. package/lib/services/socialFormat/aspectGeometry.js +135 -0
  354. package/lib/services/socialFormat/index.d.ts +2 -0
  355. package/lib/services/socialFormat/index.d.ts.map +1 -0
  356. package/lib/services/socialFormat/index.js +19 -0
  357. package/lib/services/socialInsights/index.d.ts +3 -0
  358. package/lib/services/socialInsights/index.d.ts.map +1 -0
  359. package/lib/services/socialInsights/index.js +18 -0
  360. package/lib/services/socialInsights/recommendations.d.ts +131 -0
  361. package/lib/services/socialInsights/recommendations.d.ts.map +1 -0
  362. package/lib/services/socialInsights/recommendations.js +277 -0
  363. package/lib/services/socialInsights/timeBuckets.d.ts +35 -0
  364. package/lib/services/socialInsights/timeBuckets.d.ts.map +1 -0
  365. package/lib/services/socialInsights/timeBuckets.js +78 -0
  366. package/lib/services/socialMetrics/factory.d.ts +5 -0
  367. package/lib/services/socialMetrics/factory.d.ts.map +1 -0
  368. package/lib/services/socialMetrics/factory.js +24 -0
  369. package/lib/services/socialMetrics/index.d.ts +6 -0
  370. package/lib/services/socialMetrics/index.d.ts.map +1 -0
  371. package/lib/services/socialMetrics/index.js +21 -0
  372. package/lib/services/socialMetrics/meta.metrics.d.ts +22 -0
  373. package/lib/services/socialMetrics/meta.metrics.d.ts.map +1 -0
  374. package/lib/services/socialMetrics/meta.metrics.js +137 -0
  375. package/lib/services/socialMetrics/tiktok.metrics.d.ts +8 -0
  376. package/lib/services/socialMetrics/tiktok.metrics.d.ts.map +1 -0
  377. package/lib/services/socialMetrics/tiktok.metrics.js +43 -0
  378. package/lib/services/socialMetrics/types.d.ts +54 -0
  379. package/lib/services/socialMetrics/types.d.ts.map +1 -0
  380. package/lib/services/socialMetrics/types.js +2 -0
  381. package/lib/services/socialMetrics/youtube.metrics.d.ts +8 -0
  382. package/lib/services/socialMetrics/youtube.metrics.d.ts.map +1 -0
  383. package/lib/services/socialMetrics/youtube.metrics.js +43 -0
  384. package/lib/services/socialOAuth/factory.d.ts +7 -0
  385. package/lib/services/socialOAuth/factory.d.ts.map +1 -0
  386. package/lib/services/socialOAuth/factory.js +42 -0
  387. package/lib/services/socialOAuth/index.d.ts +11 -0
  388. package/lib/services/socialOAuth/index.d.ts.map +1 -0
  389. package/lib/services/socialOAuth/index.js +26 -0
  390. package/lib/services/socialOAuth/linkedin.oauth.d.ts +14 -0
  391. package/lib/services/socialOAuth/linkedin.oauth.d.ts.map +1 -0
  392. package/lib/services/socialOAuth/linkedin.oauth.js +127 -0
  393. package/lib/services/socialOAuth/meta.oauth.d.ts +31 -0
  394. package/lib/services/socialOAuth/meta.oauth.d.ts.map +1 -0
  395. package/lib/services/socialOAuth/meta.oauth.js +214 -0
  396. package/lib/services/socialOAuth/oauthState.d.ts +14 -0
  397. package/lib/services/socialOAuth/oauthState.d.ts.map +1 -0
  398. package/lib/services/socialOAuth/oauthState.js +66 -0
  399. package/lib/services/socialOAuth/pinterest.oauth.d.ts +15 -0
  400. package/lib/services/socialOAuth/pinterest.oauth.d.ts.map +1 -0
  401. package/lib/services/socialOAuth/pinterest.oauth.js +126 -0
  402. package/lib/services/socialOAuth/threads.oauth.d.ts +14 -0
  403. package/lib/services/socialOAuth/threads.oauth.d.ts.map +1 -0
  404. package/lib/services/socialOAuth/threads.oauth.js +129 -0
  405. package/lib/services/socialOAuth/tiktok.oauth.d.ts +15 -0
  406. package/lib/services/socialOAuth/tiktok.oauth.d.ts.map +1 -0
  407. package/lib/services/socialOAuth/tiktok.oauth.js +151 -0
  408. package/lib/services/socialOAuth/types.d.ts +67 -0
  409. package/lib/services/socialOAuth/types.d.ts.map +1 -0
  410. package/lib/services/socialOAuth/types.js +2 -0
  411. package/lib/services/socialOAuth/x.oauth.d.ts +17 -0
  412. package/lib/services/socialOAuth/x.oauth.d.ts.map +1 -0
  413. package/lib/services/socialOAuth/x.oauth.js +134 -0
  414. package/lib/services/socialOAuth/youtube.oauth.d.ts +15 -0
  415. package/lib/services/socialOAuth/youtube.oauth.d.ts.map +1 -0
  416. package/lib/services/socialOAuth/youtube.oauth.js +156 -0
  417. package/lib/services/socialPublish/factory.d.ts +5 -0
  418. package/lib/services/socialPublish/factory.d.ts.map +1 -0
  419. package/lib/services/socialPublish/factory.js +32 -0
  420. package/lib/services/socialPublish/index.d.ts +10 -0
  421. package/lib/services/socialPublish/index.d.ts.map +1 -0
  422. package/lib/services/socialPublish/index.js +25 -0
  423. package/lib/services/socialPublish/linkedin.publish.d.ts +9 -0
  424. package/lib/services/socialPublish/linkedin.publish.d.ts.map +1 -0
  425. package/lib/services/socialPublish/linkedin.publish.js +143 -0
  426. package/lib/services/socialPublish/meta.publish.d.ts +28 -0
  427. package/lib/services/socialPublish/meta.publish.d.ts.map +1 -0
  428. package/lib/services/socialPublish/meta.publish.js +149 -0
  429. package/lib/services/socialPublish/pinterest.publish.d.ts +13 -0
  430. package/lib/services/socialPublish/pinterest.publish.d.ts.map +1 -0
  431. package/lib/services/socialPublish/pinterest.publish.js +130 -0
  432. package/lib/services/socialPublish/threads.publish.d.ts +12 -0
  433. package/lib/services/socialPublish/threads.publish.d.ts.map +1 -0
  434. package/lib/services/socialPublish/threads.publish.js +96 -0
  435. package/lib/services/socialPublish/tiktok.publish.d.ts +13 -0
  436. package/lib/services/socialPublish/tiktok.publish.d.ts.map +1 -0
  437. package/lib/services/socialPublish/tiktok.publish.js +118 -0
  438. package/lib/services/socialPublish/types.d.ts +47 -0
  439. package/lib/services/socialPublish/types.d.ts.map +1 -0
  440. package/lib/services/socialPublish/types.js +2 -0
  441. package/lib/services/socialPublish/x.publish.d.ts +12 -0
  442. package/lib/services/socialPublish/x.publish.d.ts.map +1 -0
  443. package/lib/services/socialPublish/x.publish.js +147 -0
  444. package/lib/services/socialPublish/youtube.publish.d.ts +9 -0
  445. package/lib/services/socialPublish/youtube.publish.d.ts.map +1 -0
  446. package/lib/services/socialPublish/youtube.publish.js +107 -0
  447. package/lib/services/stock/index.d.ts +2 -0
  448. package/lib/services/stock/index.d.ts.map +1 -0
  449. package/lib/services/stock/index.js +17 -0
  450. package/lib/services/stock/realPersonSafety.d.ts +99 -0
  451. package/lib/services/stock/realPersonSafety.d.ts.map +1 -0
  452. package/lib/services/stock/realPersonSafety.js +248 -0
  453. package/lib/services/translation/index.d.ts +2 -0
  454. package/lib/services/translation/index.d.ts.map +1 -0
  455. package/lib/services/translation/index.js +9 -0
  456. package/lib/services/translation/translation.service.d.ts +50 -0
  457. package/lib/services/translation/translation.service.d.ts.map +1 -0
  458. package/lib/services/translation/translation.service.js +211 -0
  459. package/lib/utils/helpers.d.ts +2 -4
  460. package/lib/utils/helpers.d.ts.map +1 -1
  461. package/lib/utils/helpers.js +9 -63
  462. package/lib/utils/index.d.ts +1 -0
  463. package/lib/utils/index.d.ts.map +1 -1
  464. package/lib/utils/index.js +1 -0
  465. package/lib/utils/renderTier.d.ts +26 -0
  466. package/lib/utils/renderTier.d.ts.map +1 -0
  467. package/lib/utils/renderTier.js +34 -0
  468. 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,2 @@
1
+ export * from "./aspectGeometry";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export * from "./timeBuckets";
2
+ export * from "./recommendations";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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);