vidspotai-shared 1.0.82 → 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 (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 +87 -243
  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,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThreadsOAuthProvider = void 0;
4
+ const types_1 = require("../../globals/types");
5
+ /**
6
+ * Threads (Meta) OAuth provider. Phase 6 — fast-follow adapter. Threads has its
7
+ * OWN app + API host (graph.threads.net), separate from the Facebook/IG Graph.
8
+ *
9
+ * Config (env):
10
+ * THREADS_APP_ID — Threads app client id
11
+ * THREADS_APP_SECRET — Threads app client secret
12
+ *
13
+ * Token model (plan §3): short-lived code exchange → exchange for a LONG-LIVED
14
+ * token (~60 days) → refresh before expiry. The refresh daemon handles renewal.
15
+ */
16
+ const AUTH_ENDPOINT = "https://threads.net/oauth/authorize";
17
+ const TOKEN_ENDPOINT = "https://graph.threads.net/oauth/access_token";
18
+ const LONG_LIVED_ENDPOINT = "https://graph.threads.net/access_token";
19
+ const REFRESH_ENDPOINT = "https://graph.threads.net/refresh_access_token";
20
+ const ME_ENDPOINT = "https://graph.threads.net/v1.0/me?fields=id,username,name,threads_profile_picture_url";
21
+ const BASE_SCOPES = ["threads_basic", "threads_content_publish"];
22
+ const BUSINESS_SCOPES = ["threads_manage_insights", "threads_manage_replies"];
23
+ class ThreadsOAuthProvider {
24
+ constructor() {
25
+ this.provider = types_1.ESocialProvider.THREADS;
26
+ }
27
+ appId() {
28
+ const v = process.env.THREADS_APP_ID;
29
+ if (!v)
30
+ throw new Error("ThreadsOAuth: THREADS_APP_ID not set");
31
+ return v;
32
+ }
33
+ appSecret() {
34
+ const v = process.env.THREADS_APP_SECRET;
35
+ if (!v)
36
+ throw new Error("ThreadsOAuth: THREADS_APP_SECRET not set");
37
+ return v;
38
+ }
39
+ getAuthUrl({ state, redirectUri, requestBusinessScopes, }) {
40
+ const scopes = requestBusinessScopes
41
+ ? [...BASE_SCOPES, ...BUSINESS_SCOPES]
42
+ : BASE_SCOPES;
43
+ const params = new URLSearchParams({
44
+ client_id: this.appId(),
45
+ redirect_uri: redirectUri,
46
+ response_type: "code",
47
+ scope: scopes.join(","),
48
+ state,
49
+ });
50
+ return `${AUTH_ENDPOINT}?${params.toString()}`;
51
+ }
52
+ async exchangeCode({ code, redirectUri, }) {
53
+ // 1. Short-lived token (also returns the Threads user id).
54
+ const shortResp = await fetch(TOKEN_ENDPOINT, {
55
+ method: "POST",
56
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
57
+ body: new URLSearchParams({
58
+ client_id: this.appId(),
59
+ client_secret: this.appSecret(),
60
+ grant_type: "authorization_code",
61
+ redirect_uri: redirectUri,
62
+ // Threads strips a trailing "#_" the browser may append.
63
+ code: code.replace(/#_$/, ""),
64
+ }).toString(),
65
+ });
66
+ const short = (await shortResp.json());
67
+ if (!shortResp.ok || short.error_type || !short.access_token) {
68
+ throw new Error(`ThreadsOAuth: code exchange ${shortResp.status} ${short.error_message ?? ""}`.trim());
69
+ }
70
+ // 2. Exchange for a long-lived (~60d) token.
71
+ const tokens = await this.toLongLived(short.access_token);
72
+ const account = await this.resolveAccount(tokens.accessToken);
73
+ return { account, tokens };
74
+ }
75
+ async refresh(refreshToken) {
76
+ // Threads long-lived tokens are refreshed (not re-granted) once ≥24h old.
77
+ const url = `${REFRESH_ENDPOINT}?${new URLSearchParams({
78
+ grant_type: "th_refresh_token",
79
+ access_token: refreshToken,
80
+ }).toString()}`;
81
+ const resp = await fetch(url);
82
+ const json = (await resp.json());
83
+ if (!resp.ok || json.error || !json.access_token) {
84
+ throw new Error(`ThreadsOAuth: refresh ${resp.status} ${json.error?.message ?? ""}`.trim());
85
+ }
86
+ return this.toTokens(json);
87
+ }
88
+ async toLongLived(shortToken) {
89
+ const url = `${LONG_LIVED_ENDPOINT}?${new URLSearchParams({
90
+ grant_type: "th_exchange_token",
91
+ client_secret: this.appSecret(),
92
+ access_token: shortToken,
93
+ }).toString()}`;
94
+ const resp = await fetch(url);
95
+ const json = (await resp.json());
96
+ if (!resp.ok || json.error || !json.access_token) {
97
+ throw new Error(`ThreadsOAuth: long-lived exchange ${resp.status} ${json.error?.message ?? ""}`.trim());
98
+ }
99
+ return this.toTokens(json);
100
+ }
101
+ toTokens(json) {
102
+ // Long-lived token doubles as its own refresh token (refresh_access_token
103
+ // takes the current access token). No separate refresh secret.
104
+ const accessToken = json.access_token;
105
+ return {
106
+ accessToken,
107
+ refreshToken: accessToken,
108
+ expiresAt: Date.now() + (json.expires_in ?? 60 * 24 * 3600) * 1000,
109
+ scopes: [],
110
+ };
111
+ }
112
+ async resolveAccount(accessToken) {
113
+ const resp = await fetch(ME_ENDPOINT, {
114
+ headers: { Authorization: `Bearer ${accessToken}` },
115
+ });
116
+ const json = (await resp.json());
117
+ if (!resp.ok || json.error || !json.id) {
118
+ throw new Error(`ThreadsOAuth: /me ${resp.status} ${json.error?.message ?? ""}`.trim());
119
+ }
120
+ return {
121
+ providerAccountId: json.id,
122
+ displayName: json.name ?? json.username ?? "Threads account",
123
+ handle: json.username,
124
+ avatarUrl: json.threads_profile_picture_url,
125
+ kind: types_1.ESocialAccountKind.CREATOR,
126
+ };
127
+ }
128
+ }
129
+ exports.ThreadsOAuthProvider = ThreadsOAuthProvider;
@@ -0,0 +1,15 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { AuthUrlParams, ConnectResult, ExchangeCodeParams, ISocialOAuthProvider, OAuthTokens } from "./types";
3
+ export declare class TikTokOAuthProvider implements ISocialOAuthProvider {
4
+ readonly provider = ESocialProvider.TIKTOK;
5
+ private clientKey;
6
+ private clientSecret;
7
+ getAuthUrl({ state, redirectUri, requestBusinessScopes, }: AuthUrlParams): string;
8
+ exchangeCode({ code, redirectUri, }: ExchangeCodeParams): Promise<ConnectResult>;
9
+ refresh(refreshToken: string): Promise<OAuthTokens>;
10
+ revoke(token: string): Promise<void>;
11
+ private postToken;
12
+ private toTokens;
13
+ private resolveAccount;
14
+ }
15
+ //# sourceMappingURL=tiktok.oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiktok.oauth.d.ts","sourceRoot":"","sources":["../../../src/services/socialOAuth/tiktok.oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACZ,MAAM,SAAS,CAAC;AAoDjB,qBAAa,mBAAoB,YAAW,oBAAoB;IAC9D,QAAQ,CAAC,QAAQ,0BAA0B;IAE3C,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,YAAY;IAMpB,UAAU,CAAC,EACT,KAAK,EACL,WAAW,EACX,qBAAqB,GACtB,EAAE,aAAa,GAAG,MAAM;IAcnB,YAAY,CAAC,EACjB,IAAI,EACJ,WAAW,GACZ,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAiBxC,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAenD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAkB5B,SAAS;IAsBvB,OAAO,CAAC,QAAQ;YAaF,cAAc;CAmB7B"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TikTokOAuthProvider = void 0;
4
+ const types_1 = require("../../globals/types");
5
+ const logger_1 = require("../../utils/logger");
6
+ /**
7
+ * TikTok (Login Kit v2) OAuth provider. Phase 6 — TikTok publish.
8
+ *
9
+ * Config (env):
10
+ * TIKTOK_CLIENT_KEY — app client key
11
+ * TIKTOK_CLIENT_SECRET — app client secret
12
+ *
13
+ * Notes / gates (plan §3, §G):
14
+ * - Access token lives 24h; refresh token 365d WITH rotation (a refresh returns
15
+ * a NEW refresh token — we persist it). The refresh daemon is mandatory.
16
+ * - `video.publish` (direct post) + `video.upload` (draft) require the Content
17
+ * Posting API audit; until approved, posts are forced SELF_ONLY/draft and only
18
+ * test users can connect.
19
+ * - PULL_FROM_URL publishing needs the media domain (our CDN) verified in the
20
+ * TikTok developer portal.
21
+ */
22
+ const AUTH_ENDPOINT = "https://www.tiktok.com/v2/auth/authorize/";
23
+ const TOKEN_ENDPOINT = "https://open.tiktokapis.com/v2/oauth/token/";
24
+ const REVOKE_ENDPOINT = "https://open.tiktokapis.com/v2/oauth/revoke/";
25
+ const USERINFO_ENDPOINT = "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name,username";
26
+ /** Basic scopes: identity + publish. `video.list` (read) gates metrics. */
27
+ const BASE_SCOPES = ["user.info.basic", "video.publish", "video.upload"];
28
+ const BUSINESS_SCOPES = ["video.list"];
29
+ class TikTokOAuthProvider {
30
+ constructor() {
31
+ this.provider = types_1.ESocialProvider.TIKTOK;
32
+ }
33
+ clientKey() {
34
+ const k = process.env.TIKTOK_CLIENT_KEY;
35
+ if (!k)
36
+ throw new Error("TikTokOAuth: TIKTOK_CLIENT_KEY not set");
37
+ return k;
38
+ }
39
+ clientSecret() {
40
+ const s = process.env.TIKTOK_CLIENT_SECRET;
41
+ if (!s)
42
+ throw new Error("TikTokOAuth: TIKTOK_CLIENT_SECRET not set");
43
+ return s;
44
+ }
45
+ getAuthUrl({ state, redirectUri, requestBusinessScopes, }) {
46
+ const scopes = requestBusinessScopes
47
+ ? [...BASE_SCOPES, ...BUSINESS_SCOPES]
48
+ : BASE_SCOPES;
49
+ const params = new URLSearchParams({
50
+ client_key: this.clientKey(),
51
+ scope: scopes.join(","),
52
+ response_type: "code",
53
+ redirect_uri: redirectUri,
54
+ state,
55
+ });
56
+ return `${AUTH_ENDPOINT}?${params.toString()}`;
57
+ }
58
+ async exchangeCode({ code, redirectUri, }) {
59
+ const body = new URLSearchParams({
60
+ client_key: this.clientKey(),
61
+ client_secret: this.clientSecret(),
62
+ code,
63
+ grant_type: "authorization_code",
64
+ redirect_uri: redirectUri,
65
+ });
66
+ const token = await this.postToken(body);
67
+ if (!token.access_token) {
68
+ throw new Error("TikTokOAuth: token exchange returned no access_token");
69
+ }
70
+ const tokens = this.toTokens(token);
71
+ const account = await this.resolveAccount(token.access_token);
72
+ return { account, tokens };
73
+ }
74
+ async refresh(refreshToken) {
75
+ const body = new URLSearchParams({
76
+ client_key: this.clientKey(),
77
+ client_secret: this.clientSecret(),
78
+ grant_type: "refresh_token",
79
+ refresh_token: refreshToken,
80
+ });
81
+ const token = await this.postToken(body);
82
+ if (!token.access_token) {
83
+ throw new Error("TikTokOAuth: refresh returned no access_token");
84
+ }
85
+ // TikTok ROTATES the refresh token — keep whatever it returned.
86
+ return this.toTokens(token);
87
+ }
88
+ async revoke(token) {
89
+ try {
90
+ await fetch(REVOKE_ENDPOINT, {
91
+ method: "POST",
92
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
93
+ body: new URLSearchParams({
94
+ client_key: this.clientKey(),
95
+ client_secret: this.clientSecret(),
96
+ token,
97
+ }).toString(),
98
+ });
99
+ }
100
+ catch (err) {
101
+ logger_1.logger.warn("TikTokOAuth.revoke: failed (non-fatal)", {
102
+ error: err instanceof Error ? err.message : String(err),
103
+ });
104
+ }
105
+ }
106
+ async postToken(body) {
107
+ const resp = await fetch(TOKEN_ENDPOINT, {
108
+ method: "POST",
109
+ headers: {
110
+ "Content-Type": "application/x-www-form-urlencoded",
111
+ "Cache-Control": "no-cache",
112
+ },
113
+ body: body.toString(),
114
+ });
115
+ const json = (await resp.json());
116
+ if (!resp.ok || json.error) {
117
+ throw new Error(`TikTokOAuth: token endpoint ${resp.status} ${json.error ?? ""} ${json.error_description ?? ""}`.trim());
118
+ }
119
+ return json;
120
+ }
121
+ toTokens(token) {
122
+ const now = Date.now();
123
+ return {
124
+ accessToken: token.access_token,
125
+ refreshToken: token.refresh_token,
126
+ expiresAt: now + (token.expires_in ?? 86400) * 1000,
127
+ refreshExpiresAt: token.refresh_expires_in
128
+ ? now + token.refresh_expires_in * 1000
129
+ : undefined,
130
+ scopes: token.scope ? token.scope.split(",").filter(Boolean) : [],
131
+ };
132
+ }
133
+ async resolveAccount(accessToken) {
134
+ const resp = await fetch(USERINFO_ENDPOINT, {
135
+ headers: { Authorization: `Bearer ${accessToken}` },
136
+ });
137
+ const json = (await resp.json());
138
+ const user = json.data?.user;
139
+ if (!resp.ok || json.error?.code || !user?.open_id) {
140
+ throw new Error(`TikTokOAuth: user info ${resp.status} ${json.error?.message ?? ""}`.trim());
141
+ }
142
+ return {
143
+ providerAccountId: user.open_id,
144
+ displayName: user.display_name ?? "TikTok account",
145
+ handle: user.username,
146
+ avatarUrl: user.avatar_url,
147
+ kind: types_1.ESocialAccountKind.CREATOR,
148
+ };
149
+ }
150
+ }
151
+ exports.TikTokOAuthProvider = TikTokOAuthProvider;
@@ -0,0 +1,67 @@
1
+ import { ESocialAccountKind, ESocialProvider } from "../../globals/types";
2
+ /**
3
+ * X8 Social Suite — OAuth provider abstraction. One implementation per platform
4
+ * behind a single interface so the connect/callback controllers and the token
5
+ * refresh daemon are provider-agnostic. See notes/SOCIAL_SUITE_PLAN.md §4.
6
+ *
7
+ * IMPORTANT: this layer deals in CLEARTEXT tokens. Encryption (tokenVault) is
8
+ * applied by the persistence layer right before writing to Firestore, and
9
+ * decryption right after reading — providers never see ciphertext.
10
+ */
11
+ /** Cleartext OAuth credential bundle returned by exchange/refresh. */
12
+ export interface OAuthTokens {
13
+ accessToken: string;
14
+ refreshToken?: string;
15
+ /** Unix ms when the access token expires. */
16
+ expiresAt: number;
17
+ /** Unix ms when the refresh token expires, if applicable. */
18
+ refreshExpiresAt?: number;
19
+ /** Scopes actually granted (may differ from requested). */
20
+ scopes: string[];
21
+ }
22
+ /** Identity of the connected account, resolved after token exchange. */
23
+ export interface ResolvedSocialAccount {
24
+ providerAccountId: string;
25
+ displayName: string;
26
+ handle?: string;
27
+ avatarUrl?: string;
28
+ kind: ESocialAccountKind;
29
+ }
30
+ export interface AuthUrlParams {
31
+ /** Opaque CSRF state we generate + verify on callback. */
32
+ state: string;
33
+ /** The OAuth redirect URI registered with the provider. */
34
+ redirectUri: string;
35
+ /** Ask for premium/business scopes (G-features) where supported. */
36
+ requestBusinessScopes?: boolean;
37
+ }
38
+ export interface ExchangeCodeParams {
39
+ code: string;
40
+ redirectUri: string;
41
+ }
42
+ /** Result of a successful connect: who they are + their (cleartext) tokens. */
43
+ export interface ConnectResult {
44
+ account: ResolvedSocialAccount;
45
+ tokens: OAuthTokens;
46
+ }
47
+ /** Abstract OAuth provider. Implementations are stateless + config-driven. */
48
+ export interface ISocialOAuthProvider {
49
+ readonly provider: ESocialProvider;
50
+ /** Build the provider authorization URL to redirect the user to. */
51
+ getAuthUrl(params: AuthUrlParams): string;
52
+ /** Exchange the callback `code` for tokens + resolve the account identity. */
53
+ exchangeCode(params: ExchangeCodeParams): Promise<ConnectResult>;
54
+ /**
55
+ * Multi-account variant: a single OAuth grant can yield several accounts (e.g.
56
+ * Meta returns every FB Page + linked IG Business account the user manages).
57
+ * When present, the callback upserts ALL returned accounts. Providers that map
58
+ * one grant → one account (YouTube) leave this undefined and the callback uses
59
+ * `exchangeCode`. See notes/SOCIAL_SUITE_PLAN.md §4.
60
+ */
61
+ exchangeCodeMulti?(params: ExchangeCodeParams): Promise<ConnectResult[]>;
62
+ /** Refresh an expiring access token using the stored refresh token. */
63
+ refresh(refreshToken: string): Promise<OAuthTokens>;
64
+ /** Best-effort revoke at the provider (called on disconnect). */
65
+ revoke?(token: string): Promise<void>;
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/socialOAuth/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;;;;;;;GAQG;AAEH,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wEAAwE;AACxE,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,8EAA8E;AAC9E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,oEAAoE;IACpE,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC;IAC1C,8EAA8E;IAC9E,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACjE;;;;;;OAMG;IACH,iBAAiB,CAAC,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACzE,uEAAuE;IACvE,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACpD,iEAAiE;IACjE,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,17 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { AuthUrlParams, ConnectResult, ExchangeCodeParams, ISocialOAuthProvider, OAuthTokens } from "./types";
3
+ export declare class XOAuthProvider implements ISocialOAuthProvider {
4
+ readonly provider = ESocialProvider.X;
5
+ private clientId;
6
+ private clientSecret;
7
+ /** Deterministic PKCE verifier (base64url, 43 chars) — see header note. */
8
+ private codeVerifier;
9
+ private basicAuth;
10
+ getAuthUrl({ state, redirectUri }: AuthUrlParams): string;
11
+ exchangeCode({ code, redirectUri, }: ExchangeCodeParams): Promise<ConnectResult>;
12
+ refresh(refreshToken: string): Promise<OAuthTokens>;
13
+ private postToken;
14
+ private toTokens;
15
+ private resolveAccount;
16
+ }
17
+ //# sourceMappingURL=x.oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x.oauth.d.ts","sourceRoot":"","sources":["../../../src/services/socialOAuth/x.oauth.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACZ,MAAM,SAAS,CAAC;AAuCjB,qBAAa,cAAe,YAAW,oBAAoB;IACzD,QAAQ,CAAC,QAAQ,qBAAqB;IAEtC,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,YAAY;IAKpB,2EAA2E;IAC3E,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,SAAS;IAMjB,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,aAAa,GAAG,MAAM;IAenD,YAAY,CAAC,EACjB,IAAI,EACJ,WAAW,GACZ,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAkBxC,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YAiB3C,SAAS;IAoBvB,OAAO,CAAC,QAAQ;YASF,cAAc;CAkB7B"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XOAuthProvider = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const types_1 = require("../../globals/types");
6
+ /**
7
+ * X (Twitter) OAuth 2.0 provider with PKCE. Phase 6 — fast-follow adapter.
8
+ *
9
+ * Config (env):
10
+ * X_CLIENT_ID
11
+ * X_CLIENT_SECRET — confidential client (sent via HTTP Basic on token calls)
12
+ *
13
+ * PKCE note: X mandates PKCE even for confidential clients, but the OAuth
14
+ * callback hands `exchangeCode` only {code, redirectUri} — not the per-session
15
+ * `state`. So we use a DETERMINISTIC app-level verifier derived from the client
16
+ * secret (method=plain): `getAuthUrl` and `exchangeCode` both recompute the same
17
+ * value with no shared session storage. With a confidential client the secret
18
+ * (Basic auth) is the real protection; the static verifier just satisfies the
19
+ * PKCE requirement. `offline.access` is required to receive a refresh token.
20
+ */
21
+ const AUTH_ENDPOINT = "https://twitter.com/i/oauth2/authorize";
22
+ const TOKEN_ENDPOINT = "https://api.twitter.com/2/oauth2/token";
23
+ const ME_ENDPOINT = "https://api.twitter.com/2/users/me?user.fields=profile_image_url,username,name";
24
+ const BASE_SCOPES = ["tweet.read", "tweet.write", "users.read", "offline.access"];
25
+ class XOAuthProvider {
26
+ constructor() {
27
+ this.provider = types_1.ESocialProvider.X;
28
+ }
29
+ clientId() {
30
+ const v = process.env.X_CLIENT_ID;
31
+ if (!v)
32
+ throw new Error("XOAuth: X_CLIENT_ID not set");
33
+ return v;
34
+ }
35
+ clientSecret() {
36
+ const v = process.env.X_CLIENT_SECRET;
37
+ if (!v)
38
+ throw new Error("XOAuth: X_CLIENT_SECRET not set");
39
+ return v;
40
+ }
41
+ /** Deterministic PKCE verifier (base64url, 43 chars) — see header note. */
42
+ codeVerifier() {
43
+ return (0, crypto_1.createHash)("sha256")
44
+ .update(`${this.clientSecret()}:vidspot-x-pkce`)
45
+ .digest("base64url");
46
+ }
47
+ basicAuth() {
48
+ return Buffer.from(`${this.clientId()}:${this.clientSecret()}`).toString("base64");
49
+ }
50
+ getAuthUrl({ state, redirectUri }) {
51
+ const verifier = this.codeVerifier();
52
+ const params = new URLSearchParams({
53
+ response_type: "code",
54
+ client_id: this.clientId(),
55
+ redirect_uri: redirectUri,
56
+ scope: BASE_SCOPES.join(" "),
57
+ state,
58
+ // method=plain → challenge equals verifier verbatim.
59
+ code_challenge: verifier,
60
+ code_challenge_method: "plain",
61
+ });
62
+ return `${AUTH_ENDPOINT}?${params.toString()}`;
63
+ }
64
+ async exchangeCode({ code, redirectUri, }) {
65
+ const token = await this.postToken(new URLSearchParams({
66
+ grant_type: "authorization_code",
67
+ code,
68
+ redirect_uri: redirectUri,
69
+ client_id: this.clientId(),
70
+ code_verifier: this.codeVerifier(),
71
+ }));
72
+ if (!token.access_token) {
73
+ throw new Error("XOAuth: token exchange returned no access_token");
74
+ }
75
+ const tokens = this.toTokens(token);
76
+ const account = await this.resolveAccount(token.access_token);
77
+ return { account, tokens };
78
+ }
79
+ async refresh(refreshToken) {
80
+ const token = await this.postToken(new URLSearchParams({
81
+ grant_type: "refresh_token",
82
+ refresh_token: refreshToken,
83
+ client_id: this.clientId(),
84
+ }));
85
+ if (!token.access_token) {
86
+ throw new Error("XOAuth: refresh returned no access_token");
87
+ }
88
+ const tokens = this.toTokens(token);
89
+ // X rotates refresh tokens; keep the old one only if none came back.
90
+ if (!tokens.refreshToken)
91
+ tokens.refreshToken = refreshToken;
92
+ return tokens;
93
+ }
94
+ async postToken(body) {
95
+ const resp = await fetch(TOKEN_ENDPOINT, {
96
+ method: "POST",
97
+ headers: {
98
+ "Content-Type": "application/x-www-form-urlencoded",
99
+ Authorization: `Basic ${this.basicAuth()}`,
100
+ },
101
+ body: body.toString(),
102
+ });
103
+ const json = (await resp.json());
104
+ if (!resp.ok || json.error) {
105
+ throw new Error(`XOAuth: token endpoint ${resp.status} ${json.error ?? ""} ${json.error_description ?? ""}`.trim());
106
+ }
107
+ return json;
108
+ }
109
+ toTokens(token) {
110
+ return {
111
+ accessToken: token.access_token,
112
+ refreshToken: token.refresh_token,
113
+ expiresAt: Date.now() + (token.expires_in ?? 7200) * 1000,
114
+ scopes: token.scope ? token.scope.split(" ").filter(Boolean) : [],
115
+ };
116
+ }
117
+ async resolveAccount(accessToken) {
118
+ const resp = await fetch(ME_ENDPOINT, {
119
+ headers: { Authorization: `Bearer ${accessToken}` },
120
+ });
121
+ const json = (await resp.json());
122
+ if (!resp.ok || !json.data?.id) {
123
+ throw new Error(`XOAuth: /users/me ${resp.status} ${json.errors?.[0]?.detail ?? ""}`.trim());
124
+ }
125
+ return {
126
+ providerAccountId: json.data.id,
127
+ displayName: json.data.name ?? "X account",
128
+ handle: json.data.username,
129
+ avatarUrl: json.data.profile_image_url,
130
+ kind: types_1.ESocialAccountKind.PERSONAL,
131
+ };
132
+ }
133
+ }
134
+ exports.XOAuthProvider = XOAuthProvider;
@@ -0,0 +1,15 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { AuthUrlParams, ConnectResult, ExchangeCodeParams, ISocialOAuthProvider, OAuthTokens } from "./types";
3
+ export declare class YouTubeOAuthProvider implements ISocialOAuthProvider {
4
+ readonly provider = ESocialProvider.YOUTUBE;
5
+ private clientId;
6
+ private clientSecret;
7
+ getAuthUrl({ state, redirectUri, requestBusinessScopes, }: AuthUrlParams): string;
8
+ exchangeCode({ code, redirectUri, }: ExchangeCodeParams): Promise<ConnectResult>;
9
+ refresh(refreshToken: string): Promise<OAuthTokens>;
10
+ revoke(token: string): Promise<void>;
11
+ private postToken;
12
+ private toTokens;
13
+ private resolveAccount;
14
+ }
15
+ //# sourceMappingURL=youtube.oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube.oauth.d.ts","sourceRoot":"","sources":["../../../src/services/socialOAuth/youtube.oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACZ,MAAM,SAAS,CAAC;AAoDjB,qBAAa,oBAAqB,YAAW,oBAAoB;IAC/D,QAAQ,CAAC,QAAQ,2BAA2B;IAE5C,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,YAAY;IAOpB,UAAU,CAAC,EACT,KAAK,EACL,WAAW,EACX,qBAAqB,GACtB,EAAE,aAAa,GAAG,MAAM;IAiBnB,YAAY,CAAC,EACjB,IAAI,EACJ,WAAW,GACZ,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAiBxC,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBnD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAc5B,SAAS;IAmBvB,OAAO,CAAC,QAAQ;YAUF,cAAc;CAwB7B"}