vidspotai-shared 1.0.82 → 1.0.84

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 (442) 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 +82 -0
  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 +67 -0
  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 +114 -0
  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 +2 -2
  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/seedBriefs.d.ts +4 -3
  81. package/lib/services/agent/eval/seedBriefs.d.ts.map +1 -1
  82. package/lib/services/agent/eval/seedBriefs.js +283 -3
  83. package/lib/services/agent/eval/types.d.ts +10 -0
  84. package/lib/services/agent/eval/types.d.ts.map +1 -1
  85. package/lib/services/agent/executor/core.d.ts +70 -0
  86. package/lib/services/agent/executor/core.d.ts.map +1 -0
  87. package/lib/services/agent/executor/core.js +250 -0
  88. package/lib/services/agent/executor/duration.d.ts +20 -0
  89. package/lib/services/agent/executor/duration.d.ts.map +1 -0
  90. package/lib/services/agent/executor/duration.js +46 -0
  91. package/lib/services/agent/executor/index.d.ts +15 -0
  92. package/lib/services/agent/executor/index.d.ts.map +1 -0
  93. package/lib/services/agent/executor/index.js +32 -0
  94. package/lib/services/agent/executor/types.d.ts +183 -0
  95. package/lib/services/agent/executor/types.d.ts.map +1 -0
  96. package/lib/services/agent/executor/types.js +29 -0
  97. package/lib/services/agent/executor/visual.d.ts +32 -0
  98. package/lib/services/agent/executor/visual.d.ts.map +1 -0
  99. package/lib/services/agent/executor/visual.js +400 -0
  100. package/lib/services/agent/executor/voice.d.ts +17 -0
  101. package/lib/services/agent/executor/voice.d.ts.map +1 -0
  102. package/lib/services/agent/executor/voice.js +119 -0
  103. package/lib/services/agent/extendChain.d.ts +101 -0
  104. package/lib/services/agent/extendChain.d.ts.map +1 -0
  105. package/lib/services/agent/extendChain.js +177 -0
  106. package/lib/services/agent/index.d.ts +11 -1
  107. package/lib/services/agent/index.d.ts.map +1 -1
  108. package/lib/services/agent/index.js +11 -1
  109. package/lib/services/agent/llmCaller.d.ts +7 -8
  110. package/lib/services/agent/llmCaller.d.ts.map +1 -1
  111. package/lib/services/agent/llmCallerAnthropic.d.ts +44 -31
  112. package/lib/services/agent/llmCallerAnthropic.d.ts.map +1 -1
  113. package/lib/services/agent/llmCallerAnthropic.js +135 -60
  114. package/lib/services/agent/llmCallerFactory.d.ts +34 -0
  115. package/lib/services/agent/llmCallerFactory.d.ts.map +1 -0
  116. package/lib/services/agent/llmCallerFactory.js +31 -0
  117. package/lib/services/agent/llmCallerGemini.d.ts +62 -0
  118. package/lib/services/agent/llmCallerGemini.d.ts.map +1 -0
  119. package/lib/services/agent/llmCallerGemini.js +235 -0
  120. package/lib/services/agent/llmCallerOpenai.d.ts +56 -0
  121. package/lib/services/agent/llmCallerOpenai.d.ts.map +1 -0
  122. package/lib/services/agent/llmCallerOpenai.js +230 -0
  123. package/lib/services/agent/llmCallerRegistry.d.ts.map +1 -1
  124. package/lib/services/agent/llmCallerRegistry.js +7 -7
  125. package/lib/services/agent/llmCallerRouting.d.ts +63 -0
  126. package/lib/services/agent/llmCallerRouting.d.ts.map +1 -0
  127. package/lib/services/agent/llmCallerRouting.js +124 -0
  128. package/lib/services/agent/llmModelRegistry.d.ts +59 -0
  129. package/lib/services/agent/llmModelRegistry.d.ts.map +1 -0
  130. package/lib/services/agent/llmModelRegistry.js +168 -0
  131. package/lib/services/agent/llmRetry.d.ts +57 -0
  132. package/lib/services/agent/llmRetry.d.ts.map +1 -0
  133. package/lib/services/agent/llmRetry.js +102 -0
  134. package/lib/services/agent/modelRouter.d.ts +3 -3
  135. package/lib/services/agent/modelRouter.d.ts.map +1 -1
  136. package/lib/services/agent/modelRouter.js +27 -13
  137. package/lib/services/agent/planMutations.d.ts +54 -1
  138. package/lib/services/agent/planMutations.d.ts.map +1 -1
  139. package/lib/services/agent/planMutations.js +78 -0
  140. package/lib/services/agent/planner/Planner.d.ts +0 -17
  141. package/lib/services/agent/planner/Planner.d.ts.map +1 -1
  142. package/lib/services/agent/planner/Planner.js +67 -303
  143. package/lib/services/agent/planner/overlayRegen.d.ts +38 -0
  144. package/lib/services/agent/planner/overlayRegen.d.ts.map +1 -0
  145. package/lib/services/agent/planner/overlayRegen.js +145 -0
  146. package/lib/services/agent/planner/plannerMessages.d.ts +34 -0
  147. package/lib/services/agent/planner/plannerMessages.d.ts.map +1 -0
  148. package/lib/services/agent/planner/plannerMessages.js +185 -0
  149. package/lib/services/agent/planner/promptSections.d.ts +12 -0
  150. package/lib/services/agent/planner/promptSections.d.ts.map +1 -1
  151. package/lib/services/agent/planner/promptSections.js +57 -0
  152. package/lib/services/agent/planner/scriptFirstPlanner.d.ts +35 -0
  153. package/lib/services/agent/planner/scriptFirstPlanner.d.ts.map +1 -0
  154. package/lib/services/agent/planner/scriptFirstPlanner.js +140 -0
  155. package/lib/services/agent/planner/structuralRules.d.ts +10 -0
  156. package/lib/services/agent/planner/structuralRules.d.ts.map +1 -1
  157. package/lib/services/agent/planner/structuralRules.js +92 -9
  158. package/lib/services/agent/planner/validators.d.ts +18 -0
  159. package/lib/services/agent/planner/validators.d.ts.map +1 -1
  160. package/lib/services/agent/planner/validators.js +97 -0
  161. package/lib/services/agent/planner.d.ts +2 -1
  162. package/lib/services/agent/planner.d.ts.map +1 -1
  163. package/lib/services/agent/planner.js +5 -1
  164. package/lib/services/agent/priorProject.d.ts +26 -0
  165. package/lib/services/agent/priorProject.d.ts.map +1 -0
  166. package/lib/services/agent/priorProject.js +51 -0
  167. package/lib/services/agent/providerFallback/chains.d.ts.map +1 -1
  168. package/lib/services/agent/providerFallback/chains.js +27 -15
  169. package/lib/services/agent/repurpose/index.d.ts +3 -0
  170. package/lib/services/agent/repurpose/index.d.ts.map +1 -0
  171. package/lib/services/agent/repurpose/index.js +18 -0
  172. package/lib/services/agent/repurpose/repurpose.schema.d.ts +132 -0
  173. package/lib/services/agent/repurpose/repurpose.schema.d.ts.map +1 -0
  174. package/lib/services/agent/repurpose/repurpose.schema.js +144 -0
  175. package/lib/services/agent/repurpose/shortsPicker.d.ts +25 -0
  176. package/lib/services/agent/repurpose/shortsPicker.d.ts.map +1 -0
  177. package/lib/services/agent/repurpose/shortsPicker.js +218 -0
  178. package/lib/services/agent/runHelpers.d.ts +21 -2
  179. package/lib/services/agent/runHelpers.d.ts.map +1 -1
  180. package/lib/services/agent/runHelpers.js +71 -2
  181. package/lib/services/agent/tools/animateImage.tool.d.ts +1 -0
  182. package/lib/services/agent/tools/animateImage.tool.d.ts.map +1 -1
  183. package/lib/services/agent/tools/animateImage.tool.js +12 -0
  184. package/lib/services/agent/tools/chapterOutline.tool.d.ts +42 -0
  185. package/lib/services/agent/tools/chapterOutline.tool.d.ts.map +1 -0
  186. package/lib/services/agent/tools/chapterOutline.tool.js +115 -0
  187. package/lib/services/agent/tools/composeScene.tool.d.ts +63 -0
  188. package/lib/services/agent/tools/composeScene.tool.d.ts.map +1 -1
  189. package/lib/services/agent/tools/estimateCost.tool.d.ts +27 -0
  190. package/lib/services/agent/tools/estimateCost.tool.d.ts.map +1 -1
  191. package/lib/services/agent/tools/estimateCost.tool.js +55 -7
  192. package/lib/services/agent/tools/extendVideo.tool.d.ts +26 -0
  193. package/lib/services/agent/tools/extendVideo.tool.d.ts.map +1 -0
  194. package/lib/services/agent/tools/extendVideo.tool.js +149 -0
  195. package/lib/services/agent/tools/generateScript.tool.d.ts +184 -0
  196. package/lib/services/agent/tools/generateScript.tool.d.ts.map +1 -0
  197. package/lib/services/agent/tools/generateScript.tool.js +123 -0
  198. package/lib/services/agent/tools/generateVideo.tool.d.ts +1 -0
  199. package/lib/services/agent/tools/generateVideo.tool.d.ts.map +1 -1
  200. package/lib/services/agent/tools/generateVideo.tool.js +20 -1
  201. package/lib/services/agent/tools/index.d.ts +4 -0
  202. package/lib/services/agent/tools/index.d.ts.map +1 -1
  203. package/lib/services/agent/tools/index.js +4 -0
  204. package/lib/services/agent/tools/matchBrollToScript.tool.d.ts +50 -0
  205. package/lib/services/agent/tools/matchBrollToScript.tool.d.ts.map +1 -0
  206. package/lib/services/agent/tools/matchBrollToScript.tool.js +139 -0
  207. package/lib/services/agent/tools/planVideo.tool.d.ts +56 -0
  208. package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -1
  209. package/lib/services/agent/tools/planVideo.tool.js +3 -3
  210. package/lib/services/agent/tools/render.tool.d.ts +21 -0
  211. package/lib/services/agent/tools/render.tool.d.ts.map +1 -1
  212. package/lib/services/aiGen/aiGenFactory.service.d.ts.map +1 -1
  213. package/lib/services/aiGen/aiGenFactory.service.js +18 -3
  214. package/lib/services/aiGen/providers/anthropic/anthropic.service.d.ts +26 -0
  215. package/lib/services/aiGen/providers/anthropic/anthropic.service.d.ts.map +1 -0
  216. package/lib/services/aiGen/providers/anthropic/anthropic.service.js +95 -0
  217. package/lib/services/aiGen/providers/google/google.service.d.ts +24 -1
  218. package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
  219. package/lib/services/aiGen/providers/google/google.service.js +96 -244
  220. package/lib/services/aiGen/providers/google/googleErrors.d.ts +13 -0
  221. package/lib/services/aiGen/providers/google/googleErrors.d.ts.map +1 -0
  222. package/lib/services/aiGen/providers/google/googleErrors.js +102 -0
  223. package/lib/services/aiGen/providers/google/googleFetch.d.ts +8 -0
  224. package/lib/services/aiGen/providers/google/googleFetch.d.ts.map +1 -0
  225. package/lib/services/aiGen/providers/google/googleFetch.js +96 -0
  226. package/lib/services/aiGen/providers/google/googleMusic.d.ts +15 -0
  227. package/lib/services/aiGen/providers/google/googleMusic.d.ts.map +1 -0
  228. package/lib/services/aiGen/providers/google/googleMusic.js +77 -0
  229. package/lib/services/aiGen/providers/kling/kling.service.d.ts +7 -3
  230. package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
  231. package/lib/services/aiGen/providers/kling/kling.service.js +23 -367
  232. package/lib/services/aiGen/providers/kling/klingCredits.d.ts +9 -0
  233. package/lib/services/aiGen/providers/kling/klingCredits.d.ts.map +1 -0
  234. package/lib/services/aiGen/providers/kling/klingCredits.js +63 -0
  235. package/lib/services/aiGen/providers/kling/klingRequests.d.ts +32 -0
  236. package/lib/services/aiGen/providers/kling/klingRequests.d.ts.map +1 -0
  237. package/lib/services/aiGen/providers/kling/klingRequests.js +194 -0
  238. package/lib/services/aiGen/providers/kling/klingStatus.d.ts +16 -0
  239. package/lib/services/aiGen/providers/kling/klingStatus.d.ts.map +1 -0
  240. package/lib/services/aiGen/providers/kling/klingStatus.js +173 -0
  241. package/lib/services/bullmq.service.d.ts +61 -0
  242. package/lib/services/bullmq.service.d.ts.map +1 -1
  243. package/lib/services/bullmq.service.js +101 -1
  244. package/lib/services/crypto/index.d.ts +2 -0
  245. package/lib/services/crypto/index.d.ts.map +1 -0
  246. package/lib/services/crypto/index.js +17 -0
  247. package/lib/services/crypto/tokenVault.d.ts +47 -0
  248. package/lib/services/crypto/tokenVault.d.ts.map +1 -0
  249. package/lib/services/crypto/tokenVault.js +179 -0
  250. package/lib/services/editor/captionStyleHint.d.ts +3 -0
  251. package/lib/services/editor/captionStyleHint.d.ts.map +1 -0
  252. package/lib/services/editor/captionStyleHint.js +112 -0
  253. package/lib/services/editor/planToProject.d.ts +7 -66
  254. package/lib/services/editor/planToProject.d.ts.map +1 -1
  255. package/lib/services/editor/planToProject.helpers.d.ts +40 -0
  256. package/lib/services/editor/planToProject.helpers.d.ts.map +1 -0
  257. package/lib/services/editor/planToProject.helpers.js +177 -0
  258. package/lib/services/editor/planToProject.js +197 -180
  259. package/lib/services/editor/planToProject.types.d.ts +94 -0
  260. package/lib/services/editor/planToProject.types.d.ts.map +1 -0
  261. package/lib/services/editor/planToProject.types.js +2 -0
  262. package/lib/services/firestore.service.d.ts +5 -0
  263. package/lib/services/firestore.service.d.ts.map +1 -1
  264. package/lib/services/firestore.service.js +13 -0
  265. package/lib/services/index.d.ts +12 -0
  266. package/lib/services/index.d.ts.map +1 -1
  267. package/lib/services/index.js +12 -0
  268. package/lib/services/promptEnhancer/index.d.ts +18 -0
  269. package/lib/services/promptEnhancer/index.d.ts.map +1 -0
  270. package/lib/services/promptEnhancer/index.js +33 -0
  271. package/lib/services/promptEnhancer/models.d.ts +54 -0
  272. package/lib/services/promptEnhancer/models.d.ts.map +1 -0
  273. package/lib/services/promptEnhancer/models.js +37 -0
  274. package/lib/services/promptEnhancer/profiles/agent.profile.d.ts +14 -0
  275. package/lib/services/promptEnhancer/profiles/agent.profile.d.ts.map +1 -0
  276. package/lib/services/promptEnhancer/profiles/agent.profile.js +40 -0
  277. package/lib/services/promptEnhancer/profiles/avatar.profile.d.ts +13 -0
  278. package/lib/services/promptEnhancer/profiles/avatar.profile.d.ts.map +1 -0
  279. package/lib/services/promptEnhancer/profiles/avatar.profile.js +40 -0
  280. package/lib/services/promptEnhancer/profiles/base.d.ts +28 -0
  281. package/lib/services/promptEnhancer/profiles/base.d.ts.map +1 -0
  282. package/lib/services/promptEnhancer/profiles/base.js +35 -0
  283. package/lib/services/promptEnhancer/profiles/image.profile.d.ts +11 -0
  284. package/lib/services/promptEnhancer/profiles/image.profile.d.ts.map +1 -0
  285. package/lib/services/promptEnhancer/profiles/image.profile.js +42 -0
  286. package/lib/services/promptEnhancer/profiles/index.d.ts +12 -0
  287. package/lib/services/promptEnhancer/profiles/index.d.ts.map +1 -0
  288. package/lib/services/promptEnhancer/profiles/index.js +33 -0
  289. package/lib/services/promptEnhancer/profiles/video.profile.d.ts +15 -0
  290. package/lib/services/promptEnhancer/profiles/video.profile.d.ts.map +1 -0
  291. package/lib/services/promptEnhancer/profiles/video.profile.js +81 -0
  292. package/lib/services/promptEnhancer/promptEnhancer.service.d.ts +45 -0
  293. package/lib/services/promptEnhancer/promptEnhancer.service.d.ts.map +1 -0
  294. package/lib/services/promptEnhancer/promptEnhancer.service.js +157 -0
  295. package/lib/services/promptEnhancer/schema.d.ts +19 -0
  296. package/lib/services/promptEnhancer/schema.d.ts.map +1 -0
  297. package/lib/services/promptEnhancer/schema.js +43 -0
  298. package/lib/services/promptEnhancer/types.d.ts +112 -0
  299. package/lib/services/promptEnhancer/types.d.ts.map +1 -0
  300. package/lib/services/promptEnhancer/types.js +2 -0
  301. package/lib/services/socialAI/captionGen.d.ts +81 -0
  302. package/lib/services/socialAI/captionGen.d.ts.map +1 -0
  303. package/lib/services/socialAI/captionGen.js +206 -0
  304. package/lib/services/socialAI/hookScore.d.ts +85 -0
  305. package/lib/services/socialAI/hookScore.d.ts.map +1 -0
  306. package/lib/services/socialAI/hookScore.js +170 -0
  307. package/lib/services/socialAI/index.d.ts +3 -0
  308. package/lib/services/socialAI/index.d.ts.map +1 -0
  309. package/lib/services/socialAI/index.js +18 -0
  310. package/lib/services/socialAccounts/index.d.ts +2 -0
  311. package/lib/services/socialAccounts/index.d.ts.map +1 -0
  312. package/lib/services/socialAccounts/index.js +17 -0
  313. package/lib/services/socialAccounts/socialAccountService.d.ts +25 -0
  314. package/lib/services/socialAccounts/socialAccountService.d.ts.map +1 -0
  315. package/lib/services/socialAccounts/socialAccountService.js +105 -0
  316. package/lib/services/socialEngage/factory.d.ts +7 -0
  317. package/lib/services/socialEngage/factory.d.ts.map +1 -0
  318. package/lib/services/socialEngage/factory.js +25 -0
  319. package/lib/services/socialEngage/index.d.ts +6 -0
  320. package/lib/services/socialEngage/index.d.ts.map +1 -0
  321. package/lib/services/socialEngage/index.js +21 -0
  322. package/lib/services/socialEngage/meta.engage.d.ts +17 -0
  323. package/lib/services/socialEngage/meta.engage.d.ts.map +1 -0
  324. package/lib/services/socialEngage/meta.engage.js +128 -0
  325. package/lib/services/socialEngage/metaWebhook.d.ts +50 -0
  326. package/lib/services/socialEngage/metaWebhook.d.ts.map +1 -0
  327. package/lib/services/socialEngage/metaWebhook.js +93 -0
  328. package/lib/services/socialEngage/types.d.ts +72 -0
  329. package/lib/services/socialEngage/types.d.ts.map +1 -0
  330. package/lib/services/socialEngage/types.js +10 -0
  331. package/lib/services/socialEngage/youtube.engage.d.ts +9 -0
  332. package/lib/services/socialEngage/youtube.engage.d.ts.map +1 -0
  333. package/lib/services/socialEngage/youtube.engage.js +87 -0
  334. package/lib/services/socialFormat/aspectGeometry.d.ts +74 -0
  335. package/lib/services/socialFormat/aspectGeometry.d.ts.map +1 -0
  336. package/lib/services/socialFormat/aspectGeometry.js +135 -0
  337. package/lib/services/socialFormat/index.d.ts +2 -0
  338. package/lib/services/socialFormat/index.d.ts.map +1 -0
  339. package/lib/services/socialFormat/index.js +19 -0
  340. package/lib/services/socialInsights/index.d.ts +3 -0
  341. package/lib/services/socialInsights/index.d.ts.map +1 -0
  342. package/lib/services/socialInsights/index.js +18 -0
  343. package/lib/services/socialInsights/recommendations.d.ts +131 -0
  344. package/lib/services/socialInsights/recommendations.d.ts.map +1 -0
  345. package/lib/services/socialInsights/recommendations.js +277 -0
  346. package/lib/services/socialInsights/timeBuckets.d.ts +35 -0
  347. package/lib/services/socialInsights/timeBuckets.d.ts.map +1 -0
  348. package/lib/services/socialInsights/timeBuckets.js +78 -0
  349. package/lib/services/socialMetrics/factory.d.ts +5 -0
  350. package/lib/services/socialMetrics/factory.d.ts.map +1 -0
  351. package/lib/services/socialMetrics/factory.js +24 -0
  352. package/lib/services/socialMetrics/index.d.ts +6 -0
  353. package/lib/services/socialMetrics/index.d.ts.map +1 -0
  354. package/lib/services/socialMetrics/index.js +21 -0
  355. package/lib/services/socialMetrics/meta.metrics.d.ts +22 -0
  356. package/lib/services/socialMetrics/meta.metrics.d.ts.map +1 -0
  357. package/lib/services/socialMetrics/meta.metrics.js +137 -0
  358. package/lib/services/socialMetrics/tiktok.metrics.d.ts +8 -0
  359. package/lib/services/socialMetrics/tiktok.metrics.d.ts.map +1 -0
  360. package/lib/services/socialMetrics/tiktok.metrics.js +43 -0
  361. package/lib/services/socialMetrics/types.d.ts +54 -0
  362. package/lib/services/socialMetrics/types.d.ts.map +1 -0
  363. package/lib/services/socialMetrics/types.js +2 -0
  364. package/lib/services/socialMetrics/youtube.metrics.d.ts +8 -0
  365. package/lib/services/socialMetrics/youtube.metrics.d.ts.map +1 -0
  366. package/lib/services/socialMetrics/youtube.metrics.js +43 -0
  367. package/lib/services/socialOAuth/factory.d.ts +7 -0
  368. package/lib/services/socialOAuth/factory.d.ts.map +1 -0
  369. package/lib/services/socialOAuth/factory.js +42 -0
  370. package/lib/services/socialOAuth/index.d.ts +11 -0
  371. package/lib/services/socialOAuth/index.d.ts.map +1 -0
  372. package/lib/services/socialOAuth/index.js +26 -0
  373. package/lib/services/socialOAuth/linkedin.oauth.d.ts +14 -0
  374. package/lib/services/socialOAuth/linkedin.oauth.d.ts.map +1 -0
  375. package/lib/services/socialOAuth/linkedin.oauth.js +127 -0
  376. package/lib/services/socialOAuth/meta.oauth.d.ts +31 -0
  377. package/lib/services/socialOAuth/meta.oauth.d.ts.map +1 -0
  378. package/lib/services/socialOAuth/meta.oauth.js +214 -0
  379. package/lib/services/socialOAuth/oauthState.d.ts +14 -0
  380. package/lib/services/socialOAuth/oauthState.d.ts.map +1 -0
  381. package/lib/services/socialOAuth/oauthState.js +66 -0
  382. package/lib/services/socialOAuth/pinterest.oauth.d.ts +15 -0
  383. package/lib/services/socialOAuth/pinterest.oauth.d.ts.map +1 -0
  384. package/lib/services/socialOAuth/pinterest.oauth.js +126 -0
  385. package/lib/services/socialOAuth/threads.oauth.d.ts +14 -0
  386. package/lib/services/socialOAuth/threads.oauth.d.ts.map +1 -0
  387. package/lib/services/socialOAuth/threads.oauth.js +129 -0
  388. package/lib/services/socialOAuth/tiktok.oauth.d.ts +15 -0
  389. package/lib/services/socialOAuth/tiktok.oauth.d.ts.map +1 -0
  390. package/lib/services/socialOAuth/tiktok.oauth.js +151 -0
  391. package/lib/services/socialOAuth/types.d.ts +67 -0
  392. package/lib/services/socialOAuth/types.d.ts.map +1 -0
  393. package/lib/services/socialOAuth/types.js +2 -0
  394. package/lib/services/socialOAuth/x.oauth.d.ts +17 -0
  395. package/lib/services/socialOAuth/x.oauth.d.ts.map +1 -0
  396. package/lib/services/socialOAuth/x.oauth.js +134 -0
  397. package/lib/services/socialOAuth/youtube.oauth.d.ts +15 -0
  398. package/lib/services/socialOAuth/youtube.oauth.d.ts.map +1 -0
  399. package/lib/services/socialOAuth/youtube.oauth.js +156 -0
  400. package/lib/services/socialPublish/factory.d.ts +5 -0
  401. package/lib/services/socialPublish/factory.d.ts.map +1 -0
  402. package/lib/services/socialPublish/factory.js +32 -0
  403. package/lib/services/socialPublish/index.d.ts +10 -0
  404. package/lib/services/socialPublish/index.d.ts.map +1 -0
  405. package/lib/services/socialPublish/index.js +25 -0
  406. package/lib/services/socialPublish/linkedin.publish.d.ts +9 -0
  407. package/lib/services/socialPublish/linkedin.publish.d.ts.map +1 -0
  408. package/lib/services/socialPublish/linkedin.publish.js +143 -0
  409. package/lib/services/socialPublish/meta.publish.d.ts +28 -0
  410. package/lib/services/socialPublish/meta.publish.d.ts.map +1 -0
  411. package/lib/services/socialPublish/meta.publish.js +149 -0
  412. package/lib/services/socialPublish/pinterest.publish.d.ts +13 -0
  413. package/lib/services/socialPublish/pinterest.publish.d.ts.map +1 -0
  414. package/lib/services/socialPublish/pinterest.publish.js +130 -0
  415. package/lib/services/socialPublish/threads.publish.d.ts +12 -0
  416. package/lib/services/socialPublish/threads.publish.d.ts.map +1 -0
  417. package/lib/services/socialPublish/threads.publish.js +96 -0
  418. package/lib/services/socialPublish/tiktok.publish.d.ts +13 -0
  419. package/lib/services/socialPublish/tiktok.publish.d.ts.map +1 -0
  420. package/lib/services/socialPublish/tiktok.publish.js +118 -0
  421. package/lib/services/socialPublish/types.d.ts +47 -0
  422. package/lib/services/socialPublish/types.d.ts.map +1 -0
  423. package/lib/services/socialPublish/types.js +2 -0
  424. package/lib/services/socialPublish/x.publish.d.ts +12 -0
  425. package/lib/services/socialPublish/x.publish.d.ts.map +1 -0
  426. package/lib/services/socialPublish/x.publish.js +147 -0
  427. package/lib/services/socialPublish/youtube.publish.d.ts +9 -0
  428. package/lib/services/socialPublish/youtube.publish.d.ts.map +1 -0
  429. package/lib/services/socialPublish/youtube.publish.js +107 -0
  430. package/lib/services/stock/index.d.ts +2 -0
  431. package/lib/services/stock/index.d.ts.map +1 -0
  432. package/lib/services/stock/index.js +17 -0
  433. package/lib/services/stock/realPersonSafety.d.ts +99 -0
  434. package/lib/services/stock/realPersonSafety.d.ts.map +1 -0
  435. package/lib/services/stock/realPersonSafety.js +248 -0
  436. package/lib/utils/index.d.ts +1 -0
  437. package/lib/utils/index.d.ts.map +1 -1
  438. package/lib/utils/index.js +1 -0
  439. package/lib/utils/renderTier.d.ts +26 -0
  440. package/lib/utils/renderTier.d.ts.map +1 -0
  441. package/lib/utils/renderTier.js +34 -0
  442. package/package.json +1 -1
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PinterestPublisher = void 0;
4
+ const types_1 = require("../../globals/types");
5
+ const logger_1 = require("../../utils/logger");
6
+ /**
7
+ * Pinterest publisher (v5) — Phase 6. Video Pin flow:
8
+ * 1. POST /v5/media (media_type=video) → { media_id, upload_url, upload_parameters }
9
+ * 2. POST the bytes to the (S3) upload_url with the returned form parameters
10
+ * 3. Poll GET /v5/media/{media_id} until status=succeeded
11
+ * 4. POST /v5/pins { board_id, title, description, media_source }
12
+ *
13
+ * Two Pinterest-specific realities handled here:
14
+ * - A pin needs a BOARD. PublishInput carries none, so we pin to the account's
15
+ * first board (GET /v5/boards). A board picker is a future enhancement.
16
+ * - A video pin REQUIRES a cover image. We use input.thumbnailUrl when the
17
+ * worker provides it; the worker must populate it (videoJob poster) for
18
+ * Pinterest to publish. (Documented in PublishInput + ACTION_PLAN.)
19
+ */
20
+ const API = "https://api.pinterest.com/v5";
21
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
22
+ class PinterestPublisher {
23
+ constructor() {
24
+ this.provider = types_1.ESocialProvider.PINTEREST;
25
+ this.maxPolls = 30;
26
+ this.pollDelayMs = 4000;
27
+ }
28
+ async publish(input) {
29
+ const token = input.accessToken;
30
+ // 0. Resolve a destination board (first board for now).
31
+ const boardId = await this.firstBoardId(token);
32
+ // 1. Register the video upload.
33
+ const reg = await this.json(await fetch(`${API}/media`, {
34
+ method: "POST",
35
+ headers: {
36
+ Authorization: `Bearer ${token}`,
37
+ "Content-Type": "application/json",
38
+ },
39
+ body: JSON.stringify({ media_type: "video" }),
40
+ }), "register media");
41
+ if (!reg.media_id || !reg.upload_url || !reg.upload_parameters) {
42
+ throw new Error("PinterestPublisher: media register returned no upload target");
43
+ }
44
+ // 2. Upload the bytes to S3 with the supplied form parameters.
45
+ const mediaResp = await fetch(input.mediaUrl);
46
+ if (!mediaResp.ok) {
47
+ throw new Error(`PinterestPublisher: media fetch ${mediaResp.status}`);
48
+ }
49
+ const bytes = Buffer.from(await mediaResp.arrayBuffer());
50
+ const form = new FormData();
51
+ for (const [k, v] of Object.entries(reg.upload_parameters))
52
+ form.append(k, v);
53
+ form.append("file", new Blob([bytes]));
54
+ const s3Resp = await fetch(reg.upload_url, { method: "POST", body: form });
55
+ if (!s3Resp.ok) {
56
+ throw new Error(`PinterestPublisher: media upload ${s3Resp.status}`);
57
+ }
58
+ // 3. Poll until the media is processed.
59
+ await this.pollMedia(token, reg.media_id);
60
+ // 4. Create the pin.
61
+ const mediaSource = {
62
+ source_type: "video_id",
63
+ media_id: reg.media_id,
64
+ };
65
+ if (input.thumbnailUrl)
66
+ mediaSource.cover_image_url = input.thumbnailUrl;
67
+ else
68
+ mediaSource.cover_image_key_frame_time = 0;
69
+ const pin = await this.json(await fetch(`${API}/pins`, {
70
+ method: "POST",
71
+ headers: {
72
+ Authorization: `Bearer ${token}`,
73
+ "Content-Type": "application/json",
74
+ },
75
+ body: JSON.stringify({
76
+ board_id: boardId,
77
+ title: (input.title ?? input.caption ?? "VidSpot video").slice(0, 100),
78
+ description: this.buildDescription(input),
79
+ media_source: mediaSource,
80
+ }),
81
+ }), "create pin");
82
+ if (!pin.id) {
83
+ throw new Error(`PinterestPublisher: create pin failed ${pin.message ?? ""}`);
84
+ }
85
+ logger_1.logger.info("PinterestPublisher: published", { pinId: pin.id, boardId });
86
+ return {
87
+ providerPostId: pin.id,
88
+ publishedUrl: `https://www.pinterest.com/pin/${pin.id}/`,
89
+ };
90
+ }
91
+ async firstBoardId(token) {
92
+ const boards = await this.json(await fetch(`${API}/boards?page_size=1`, {
93
+ headers: { Authorization: `Bearer ${token}` },
94
+ }), "list boards");
95
+ const id = boards.items?.[0]?.id;
96
+ if (!id) {
97
+ throw new Error("PinterestPublisher: account has no board to pin to — create one first");
98
+ }
99
+ return id;
100
+ }
101
+ async pollMedia(token, mediaId) {
102
+ for (let i = 0; i < this.maxPolls; i++) {
103
+ await sleep(this.pollDelayMs);
104
+ const status = await this.json(await fetch(`${API}/media/${mediaId}`, {
105
+ headers: { Authorization: `Bearer ${token}` },
106
+ }), "media status");
107
+ if (status.status === "succeeded")
108
+ return;
109
+ if (status.status === "failed") {
110
+ throw new Error("PinterestPublisher: media processing failed");
111
+ }
112
+ }
113
+ throw new Error("PinterestPublisher: timed out waiting for media processing");
114
+ }
115
+ async json(resp, what) {
116
+ if (!resp.ok) {
117
+ const text = await resp.text();
118
+ throw new Error(`PinterestPublisher: ${what} ${resp.status} ${text}`);
119
+ }
120
+ return (await resp.json());
121
+ }
122
+ buildDescription(input) {
123
+ const tags = input.hashtags && input.hashtags.length
124
+ ? "\n\n" +
125
+ input.hashtags.map((h) => (h.startsWith("#") ? h : `#${h}`)).join(" ")
126
+ : "";
127
+ return `${input.caption ?? ""}${tags}`.trim().slice(0, 800);
128
+ }
129
+ }
130
+ exports.PinterestPublisher = PinterestPublisher;
@@ -0,0 +1,12 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { ISocialPublisher, PublishInput, PublishResult } from "./types";
3
+ export declare class ThreadsPublisher implements ISocialPublisher {
4
+ readonly provider = ESocialProvider.THREADS;
5
+ private readonly maxPolls;
6
+ private readonly pollDelayMs;
7
+ publish(input: PublishInput): Promise<PublishResult>;
8
+ private pollContainer;
9
+ private fetchPermalink;
10
+ private buildText;
11
+ }
12
+ //# sourceMappingURL=threads.publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.publish.d.ts","sourceRoot":"","sources":["../../../src/services/socialPublish/threads.publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA6BxE,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,QAAQ,CAAC,QAAQ,2BAA2B;IAE5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IAE9B,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;YAmD5C,aAAa;YAiBb,cAAc;IAe5B,OAAO,CAAC,SAAS;CAQlB"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThreadsPublisher = void 0;
4
+ const types_1 = require("../../globals/types");
5
+ const logger_1 = require("../../utils/logger");
6
+ /**
7
+ * Threads publisher — Phase 6. Two-step container flow (same shape as IG Reels):
8
+ * 1. POST /v1.0/{user-id}/threads (media_type=VIDEO, video_url, text) → creation_id
9
+ * 2. Poll /v1.0/{creation_id}?fields=status until FINISHED
10
+ * 3. POST /v1.0/{user-id}/threads_publish (creation_id) → media id
11
+ * 4. GET /v1.0/{media-id}?fields=permalink for the public URL
12
+ *
13
+ * Threads has no native scheduling — the worker schedules via BullMQ delay.
14
+ */
15
+ const API_BASE = "https://graph.threads.net/v1.0";
16
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
17
+ class ThreadsPublisher {
18
+ constructor() {
19
+ this.provider = types_1.ESocialProvider.THREADS;
20
+ this.maxPolls = 30;
21
+ this.pollDelayMs = 4000;
22
+ }
23
+ async publish(input) {
24
+ const userId = input.providerAccountId;
25
+ if (!userId) {
26
+ throw new Error("ThreadsPublisher: missing providerAccountId (Threads user id)");
27
+ }
28
+ const token = input.accessToken;
29
+ const text = this.buildText(input);
30
+ // 1. Create the media container.
31
+ const createResp = await fetch(`${API_BASE}/${userId}/threads`, {
32
+ method: "POST",
33
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
34
+ body: new URLSearchParams({
35
+ media_type: "VIDEO",
36
+ video_url: input.mediaUrl,
37
+ text,
38
+ access_token: token,
39
+ }).toString(),
40
+ });
41
+ const created = (await createResp.json());
42
+ if (!createResp.ok || created.error || !created.id) {
43
+ throw new Error(`ThreadsPublisher: create container ${createResp.status} ${created.error?.message ?? ""}`.trim());
44
+ }
45
+ const creationId = created.id;
46
+ // 2. Poll until the container finishes processing.
47
+ await this.pollContainer(creationId, token);
48
+ // 3. Publish the container.
49
+ const pubResp = await fetch(`${API_BASE}/${userId}/threads_publish`, {
50
+ method: "POST",
51
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
52
+ body: new URLSearchParams({
53
+ creation_id: creationId,
54
+ access_token: token,
55
+ }).toString(),
56
+ });
57
+ const published = (await pubResp.json());
58
+ if (!pubResp.ok || published.error || !published.id) {
59
+ throw new Error(`ThreadsPublisher: publish ${pubResp.status} ${published.error?.message ?? ""}`.trim());
60
+ }
61
+ logger_1.logger.info("ThreadsPublisher: published", { mediaId: published.id });
62
+ const permalink = await this.fetchPermalink(published.id, token);
63
+ return { providerPostId: published.id, publishedUrl: permalink };
64
+ }
65
+ async pollContainer(creationId, token) {
66
+ for (let i = 0; i < this.maxPolls; i++) {
67
+ await sleep(this.pollDelayMs);
68
+ const resp = await fetch(`${API_BASE}/${creationId}?fields=status,error_message&access_token=${encodeURIComponent(token)}`);
69
+ const json = (await resp.json());
70
+ if (json.status === "FINISHED")
71
+ return;
72
+ if (json.status === "ERROR" || json.status === "EXPIRED") {
73
+ throw new Error(`ThreadsPublisher: container ${json.status} — ${json.error_message ?? ""}`);
74
+ }
75
+ }
76
+ throw new Error("ThreadsPublisher: timed out waiting for container");
77
+ }
78
+ async fetchPermalink(mediaId, token) {
79
+ try {
80
+ const resp = await fetch(`${API_BASE}/${mediaId}?fields=permalink&access_token=${encodeURIComponent(token)}`);
81
+ const json = (await resp.json());
82
+ return json.permalink;
83
+ }
84
+ catch {
85
+ return undefined;
86
+ }
87
+ }
88
+ buildText(input) {
89
+ const tags = input.hashtags && input.hashtags.length
90
+ ? "\n\n" +
91
+ input.hashtags.map((h) => (h.startsWith("#") ? h : `#${h}`)).join(" ")
92
+ : "";
93
+ return `${input.caption ?? ""}${tags}`.trim().slice(0, 500);
94
+ }
95
+ }
96
+ exports.ThreadsPublisher = ThreadsPublisher;
@@ -0,0 +1,13 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { ISocialPublisher, PublishInput, PublishResult } from "./types";
3
+ export declare class TikTokPublisher implements ISocialPublisher {
4
+ readonly provider = ESocialProvider.TIKTOK;
5
+ private readonly maxPolls;
6
+ private readonly pollDelayMs;
7
+ publish(input: PublishInput): Promise<PublishResult>;
8
+ private pollStatus;
9
+ /** TikTok caption ("title") max ~2200 chars; merge hashtags inline. */
10
+ private buildTitle;
11
+ private resolvePrivacy;
12
+ }
13
+ //# sourceMappingURL=tiktok.publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiktok.publish.d.ts","sourceRoot":"","sources":["../../../src/services/socialPublish/tiktok.publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAyCxE,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,QAAQ,CAAC,QAAQ,0BAA0B;IAE3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IAE9B,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;YA6C5C,UAAU;IA6BxB,uEAAuE;IACvE,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,cAAc;CAQvB"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TikTokPublisher = void 0;
4
+ const types_1 = require("../../globals/types");
5
+ const logger_1 = require("../../utils/logger");
6
+ /**
7
+ * TikTok publisher — Content Posting API, PULL_FROM_URL direct post. Phase 6.
8
+ *
9
+ * Flow (plan §G, TikTok Content Posting API):
10
+ * 1. POST /v2/post/publish/video/init/ with source=PULL_FROM_URL + video_url
11
+ * → { publish_id }
12
+ * 2. Poll /v2/post/publish/status/fetch/ until PUBLISH_COMPLETE / FAILED.
13
+ *
14
+ * Gates:
15
+ * - PULL_FROM_URL requires the media domain (our CDN) verified in the dev portal.
16
+ * - Until the Content Posting audit passes, `privacy_level` is forced to
17
+ * SELF_ONLY (private) and the app can only post for test users. We map the
18
+ * generic `privacy` to TikTok's enum and default to SELF_ONLY (safe pre-audit).
19
+ * - TikTok has NO native scheduling — the worker schedules via BullMQ delay.
20
+ */
21
+ const INIT_ENDPOINT = "https://open.tiktokapis.com/v2/post/publish/video/init/";
22
+ const STATUS_ENDPOINT = "https://open.tiktokapis.com/v2/post/publish/status/fetch/";
23
+ const PRIVACY_VALUES = new Set([
24
+ "PUBLIC_TO_EVERYONE",
25
+ "MUTUAL_FOLLOW_FRIENDS",
26
+ "FOLLOWER_OF_CREATOR",
27
+ "SELF_ONLY",
28
+ ]);
29
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
30
+ class TikTokPublisher {
31
+ constructor() {
32
+ this.provider = types_1.ESocialProvider.TIKTOK;
33
+ this.maxPolls = 30;
34
+ this.pollDelayMs = 5000;
35
+ }
36
+ async publish(input) {
37
+ const title = this.buildTitle(input);
38
+ const privacyLevel = this.resolvePrivacy(input);
39
+ // 1. Init the direct post with PULL_FROM_URL.
40
+ const initResp = await fetch(INIT_ENDPOINT, {
41
+ method: "POST",
42
+ headers: {
43
+ Authorization: `Bearer ${input.accessToken}`,
44
+ "Content-Type": "application/json; charset=UTF-8",
45
+ },
46
+ body: JSON.stringify({
47
+ post_info: {
48
+ title,
49
+ privacy_level: privacyLevel,
50
+ disable_duet: false,
51
+ disable_comment: false,
52
+ disable_stitch: false,
53
+ },
54
+ source_info: {
55
+ source: "PULL_FROM_URL",
56
+ video_url: input.mediaUrl,
57
+ },
58
+ }),
59
+ });
60
+ const init = (await initResp.json());
61
+ const publishId = init.data?.publish_id;
62
+ if (!initResp.ok || init.error?.code === "access_token_invalid" || !publishId) {
63
+ throw new Error(`TikTokPublisher: init ${initResp.status} ${init.error?.message ?? "no publish_id"}`);
64
+ }
65
+ // 2. Poll for completion.
66
+ const postId = await this.pollStatus(input.accessToken, publishId);
67
+ logger_1.logger.info("TikTokPublisher: published", { publishId, postId });
68
+ return {
69
+ providerPostId: postId ?? publishId,
70
+ // TikTok doesn't return a canonical web URL pre-audit; the worker can fill
71
+ // it once the post id resolves (profile-relative).
72
+ publishedUrl: undefined,
73
+ };
74
+ }
75
+ async pollStatus(accessToken, publishId) {
76
+ for (let i = 0; i < this.maxPolls; i++) {
77
+ await sleep(this.pollDelayMs);
78
+ const resp = await fetch(STATUS_ENDPOINT, {
79
+ method: "POST",
80
+ headers: {
81
+ Authorization: `Bearer ${accessToken}`,
82
+ "Content-Type": "application/json; charset=UTF-8",
83
+ },
84
+ body: JSON.stringify({ publish_id: publishId }),
85
+ });
86
+ const json = (await resp.json());
87
+ const status = json.data?.status;
88
+ if (status === "PUBLISH_COMPLETE") {
89
+ return json.data?.publicaly_available_post_id?.[0];
90
+ }
91
+ if (status === "FAILED") {
92
+ throw new Error(`TikTokPublisher: publish failed — ${json.data?.fail_reason ?? "unknown"}`);
93
+ }
94
+ // PROCESSING_* / SEND_TO_USER_INBOX → keep polling.
95
+ }
96
+ throw new Error("TikTokPublisher: timed out waiting for publish completion");
97
+ }
98
+ /** TikTok caption ("title") max ~2200 chars; merge hashtags inline. */
99
+ buildTitle(input) {
100
+ const tags = input.hashtags && input.hashtags.length
101
+ ? " " +
102
+ input.hashtags.map((h) => (h.startsWith("#") ? h : `#${h}`)).join(" ")
103
+ : "";
104
+ return `${input.caption ?? ""}${tags}`.trim().slice(0, 2200);
105
+ }
106
+ resolvePrivacy(input) {
107
+ const p = (input.privacy ?? "").toUpperCase();
108
+ if (PRIVACY_VALUES.has(p))
109
+ return p;
110
+ // Map common generic values; default SELF_ONLY (audit-safe).
111
+ if (p === "PUBLIC")
112
+ return "PUBLIC_TO_EVERYONE";
113
+ if (p === "PRIVATE")
114
+ return "SELF_ONLY";
115
+ return "SELF_ONLY";
116
+ }
117
+ }
118
+ exports.TikTokPublisher = TikTokPublisher;
@@ -0,0 +1,47 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ /**
3
+ * X8 Social Suite — publisher abstraction. One implementation per platform turns
4
+ * a (mediaUrl, caption, options, accessToken) into a live post. The publish
5
+ * worker resolves a valid access token (refreshing if needed) and calls this.
6
+ * See notes/SOCIAL_SUITE_PLAN.md §4.
7
+ */
8
+ export interface PublishInput {
9
+ /** Cleartext access token for the target account (already refreshed). */
10
+ accessToken: string;
11
+ /**
12
+ * The provider's account id (IG Business user id / FB Page id). Required by
13
+ * Meta publishers, which POST to `/{ig-user-id}/media` or `/{page-id}/videos`.
14
+ * YouTube ignores it (the access token already scopes to the channel).
15
+ */
16
+ providerAccountId?: string;
17
+ /** Public URL of the media to publish (rendered/cropped for the platform). */
18
+ mediaUrl: string;
19
+ /**
20
+ * Public URL of a poster/cover frame for the video. Optional and ignored by
21
+ * most publishers; Pinterest REQUIRES a cover image for video pins, so the
22
+ * worker should populate it (e.g. the videoJob's poster) when targeting
23
+ * Pinterest. When absent, the Pinterest publisher falls back to a key-frame.
24
+ */
25
+ thumbnailUrl?: string;
26
+ /** Caption / description text. */
27
+ caption: string;
28
+ /** Title (YouTube uses this; others ignore). */
29
+ title?: string;
30
+ /** Provider visibility value (e.g. "public" | "unlisted" | "private"). */
31
+ privacy?: string;
32
+ /** Unix ms for native scheduled publish where the platform supports it (YT). */
33
+ scheduledAt?: number;
34
+ /** Hashtags to merge into the caption per-platform convention. */
35
+ hashtags?: string[];
36
+ }
37
+ export interface PublishResult {
38
+ /** Provider's id for the new post. */
39
+ providerPostId: string;
40
+ /** Public URL of the live (or scheduled) post, when derivable. */
41
+ publishedUrl?: string;
42
+ }
43
+ export interface ISocialPublisher {
44
+ readonly provider: ESocialProvider;
45
+ publish(input: PublishInput): Promise<PublishResult>;
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/socialPublish/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACtD"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { ISocialPublisher, PublishInput, PublishResult } from "./types";
3
+ export declare class XPublisher implements ISocialPublisher {
4
+ readonly provider = ESocialProvider.X;
5
+ private readonly maxPolls;
6
+ publish(input: PublishInput): Promise<PublishResult>;
7
+ private uploadForm;
8
+ private pollMediaStatus;
9
+ /** X has a hard 280-char limit; trim caption + as many hashtags as fit. */
10
+ private buildText;
11
+ }
12
+ //# sourceMappingURL=x.publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x.publish.d.ts","sourceRoot":"","sources":["../../../src/services/socialPublish/x.publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAkCxE,qBAAa,UAAW,YAAW,gBAAgB;IACjD,QAAQ,CAAC,QAAQ,qBAAqB;IAEtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;IAEzB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;YAoF5C,UAAU;YAoBV,eAAe;IAuB7B,2EAA2E;IAC3E,OAAO,CAAC,SAAS;CAalB"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XPublisher = void 0;
4
+ const types_1 = require("../../globals/types");
5
+ const logger_1 = require("../../utils/logger");
6
+ /**
7
+ * X (Twitter) publisher — Phase 6. Chunked video upload (v1.1 media/upload,
8
+ * which accepts an OAuth 2.0 user-context bearer) then a v2 Tweet referencing
9
+ * the media id:
10
+ * 1. INIT → media_id_string
11
+ * 2. APPEND → upload each ≤5MB chunk (multipart)
12
+ * 3. FINALIZE → may return async processing_info
13
+ * 4. STATUS → poll until state=succeeded
14
+ * 5. POST /2/tweets { text, media: { media_ids: [id] } }
15
+ *
16
+ * No native scheduling — the worker schedules via BullMQ delay. Caption is hard-
17
+ * capped at 280 chars (X's real limit), hashtags merged inline within that cap.
18
+ */
19
+ const UPLOAD_ENDPOINT = "https://upload.twitter.com/1.1/media/upload.json";
20
+ const TWEETS_ENDPOINT = "https://api.twitter.com/2/tweets";
21
+ const CHUNK_SIZE = 5 * 1024 * 1024; // 5MB, X's per-APPEND limit
22
+ const TWEET_MAX = 280;
23
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
24
+ class XPublisher {
25
+ constructor() {
26
+ this.provider = types_1.ESocialProvider.X;
27
+ this.maxPolls = 30;
28
+ }
29
+ async publish(input) {
30
+ const token = input.accessToken;
31
+ // 0. Fetch the media bytes.
32
+ const mediaResp = await fetch(input.mediaUrl);
33
+ if (!mediaResp.ok) {
34
+ throw new Error(`XPublisher: media fetch ${mediaResp.status}`);
35
+ }
36
+ const bytes = Buffer.from(await mediaResp.arrayBuffer());
37
+ // 1. INIT.
38
+ const init = (await this.uploadForm(token, {
39
+ command: "INIT",
40
+ total_bytes: String(bytes.length),
41
+ media_type: "video/mp4",
42
+ media_category: "tweet_video",
43
+ }));
44
+ const mediaId = init.media_id_string;
45
+ if (!mediaId) {
46
+ throw new Error(`XPublisher: INIT failed ${init.errors?.[0]?.message ?? ""}`);
47
+ }
48
+ // 2. APPEND each chunk.
49
+ let segment = 0;
50
+ for (let offset = 0; offset < bytes.length; offset += CHUNK_SIZE) {
51
+ const chunk = bytes.subarray(offset, offset + CHUNK_SIZE);
52
+ const form = new FormData();
53
+ form.append("command", "APPEND");
54
+ form.append("media_id", mediaId);
55
+ form.append("segment_index", String(segment));
56
+ form.append("media", new Blob([chunk]));
57
+ const resp = await fetch(UPLOAD_ENDPOINT, {
58
+ method: "POST",
59
+ headers: { Authorization: `Bearer ${token}` },
60
+ body: form,
61
+ });
62
+ if (!resp.ok) {
63
+ throw new Error(`XPublisher: APPEND segment ${segment} ${resp.status}`);
64
+ }
65
+ segment++;
66
+ }
67
+ // 3. FINALIZE.
68
+ const finalize = (await this.uploadForm(token, {
69
+ command: "FINALIZE",
70
+ media_id: mediaId,
71
+ }));
72
+ // 4. Poll async processing if needed.
73
+ if (finalize.processing_info && finalize.processing_info.state !== "succeeded") {
74
+ await this.pollMediaStatus(token, mediaId, finalize.processing_info.check_after_secs);
75
+ }
76
+ // 5. Create the Tweet.
77
+ const tweetResp = await fetch(TWEETS_ENDPOINT, {
78
+ method: "POST",
79
+ headers: {
80
+ Authorization: `Bearer ${token}`,
81
+ "Content-Type": "application/json",
82
+ },
83
+ body: JSON.stringify({
84
+ text: this.buildText(input),
85
+ media: { media_ids: [mediaId] },
86
+ }),
87
+ });
88
+ const tweet = (await tweetResp.json());
89
+ const tweetId = tweet.data?.id;
90
+ if (!tweetResp.ok || !tweetId) {
91
+ throw new Error(`XPublisher: create tweet ${tweetResp.status} ${tweet.errors?.[0]?.message ?? tweet.detail ?? ""}`.trim());
92
+ }
93
+ logger_1.logger.info("XPublisher: published", { tweetId });
94
+ return {
95
+ providerPostId: tweetId,
96
+ publishedUrl: `https://x.com/i/web/status/${tweetId}`,
97
+ };
98
+ }
99
+ async uploadForm(token, fields) {
100
+ const form = new FormData();
101
+ for (const [k, v] of Object.entries(fields))
102
+ form.append(k, v);
103
+ const resp = await fetch(UPLOAD_ENDPOINT, {
104
+ method: "POST",
105
+ headers: { Authorization: `Bearer ${token}` },
106
+ body: form,
107
+ });
108
+ if (!resp.ok) {
109
+ const text = await resp.text();
110
+ throw new Error(`XPublisher: upload ${fields.command} ${resp.status} ${text}`);
111
+ }
112
+ return resp.json();
113
+ }
114
+ async pollMediaStatus(token, mediaId, firstDelaySecs) {
115
+ let delayMs = (firstDelaySecs ?? 3) * 1000;
116
+ for (let i = 0; i < this.maxPolls; i++) {
117
+ await sleep(delayMs);
118
+ const url = `${UPLOAD_ENDPOINT}?command=STATUS&media_id=${mediaId}`;
119
+ const resp = await fetch(url, {
120
+ headers: { Authorization: `Bearer ${token}` },
121
+ });
122
+ const json = (await resp.json());
123
+ const state = json.processing_info?.state;
124
+ if (state === "succeeded")
125
+ return;
126
+ if (state === "failed") {
127
+ throw new Error("XPublisher: media processing failed");
128
+ }
129
+ delayMs = (json.processing_info?.check_after_secs ?? 3) * 1000;
130
+ }
131
+ throw new Error("XPublisher: timed out waiting for media processing");
132
+ }
133
+ /** X has a hard 280-char limit; trim caption + as many hashtags as fit. */
134
+ buildText(input) {
135
+ const caption = (input.caption ?? "").trim();
136
+ const tags = (input.hashtags ?? []).map((h) => h.startsWith("#") ? h : `#${h}`);
137
+ let text = caption;
138
+ for (const tag of tags) {
139
+ const candidate = text ? `${text} ${tag}` : tag;
140
+ if (candidate.length > TWEET_MAX)
141
+ break;
142
+ text = candidate;
143
+ }
144
+ return text.slice(0, TWEET_MAX);
145
+ }
146
+ }
147
+ exports.XPublisher = XPublisher;
@@ -0,0 +1,9 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { ISocialPublisher, PublishInput, PublishResult } from "./types";
3
+ export declare class YouTubePublisher implements ISocialPublisher {
4
+ readonly provider = ESocialProvider.YOUTUBE;
5
+ publish(input: PublishInput): Promise<PublishResult>;
6
+ private resolvePrivacy;
7
+ private buildDescription;
8
+ }
9
+ //# sourceMappingURL=youtube.publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube.publish.d.ts","sourceRoot":"","sources":["../../../src/services/socialPublish/youtube.publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA0BxE,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,QAAQ,CAAC,QAAQ,2BAA2B;IAEtC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IA+E1D,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,gBAAgB;CAUzB"}