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,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ENGAGE_POLL_PROVIDERS = void 0;
4
+ exports.getSocialEngageClient = getSocialEngageClient;
5
+ exports.isSocialEngageSupported = isSocialEngageSupported;
6
+ const types_1 = require("../../globals/types");
7
+ const meta_engage_1 = require("./meta.engage");
8
+ const youtube_engage_1 = require("./youtube.engage");
9
+ const registry = {
10
+ [types_1.ESocialProvider.YOUTUBE]: () => new youtube_engage_1.YouTubeEngageClient(),
11
+ [types_1.ESocialProvider.INSTAGRAM]: () => new meta_engage_1.InstagramEngageClient(),
12
+ [types_1.ESocialProvider.FACEBOOK]: () => new meta_engage_1.FacebookEngageClient(),
13
+ };
14
+ function getSocialEngageClient(provider) {
15
+ const make = registry[provider];
16
+ if (!make) {
17
+ throw new Error(`Social engage not implemented for '${provider}'`);
18
+ }
19
+ return make();
20
+ }
21
+ function isSocialEngageSupported(provider) {
22
+ return Boolean(registry[provider]);
23
+ }
24
+ /** Providers whose comments must be PULLED (no webhook) by the poll sweep. */
25
+ exports.ENGAGE_POLL_PROVIDERS = [types_1.ESocialProvider.YOUTUBE];
@@ -0,0 +1,6 @@
1
+ export * from "./types";
2
+ export * from "./youtube.engage";
3
+ export * from "./meta.engage";
4
+ export * from "./factory";
5
+ export * from "./metaWebhook";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/socialEngage/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./youtube.engage"), exports);
19
+ __exportStar(require("./meta.engage"), exports);
20
+ __exportStar(require("./factory"), exports);
21
+ __exportStar(require("./metaWebhook"), exports);
@@ -0,0 +1,17 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { FetchCommentsInput, IRemoteComment, ISocialEngageClient, ModerateInput, ReplyInput, ReplyResult } from "./types";
3
+ /** Instagram comment engagement on a published media/Reel. */
4
+ export declare class InstagramEngageClient implements ISocialEngageClient {
5
+ readonly provider = ESocialProvider.INSTAGRAM;
6
+ fetchComments({ accessToken, providerPostId, since, limit, }: FetchCommentsInput): Promise<IRemoteComment[]>;
7
+ replyToComment({ accessToken, externalId, message, }: ReplyInput): Promise<ReplyResult>;
8
+ moderateComment({ accessToken, externalId, hidden, }: ModerateInput): Promise<void>;
9
+ }
10
+ /** Facebook Page post/video comment engagement. */
11
+ export declare class FacebookEngageClient implements ISocialEngageClient {
12
+ readonly provider = ESocialProvider.FACEBOOK;
13
+ fetchComments({ accessToken, providerPostId, since, limit, }: FetchCommentsInput): Promise<IRemoteComment[]>;
14
+ replyToComment({ accessToken, externalId, message, }: ReplyInput): Promise<ReplyResult>;
15
+ moderateComment({ accessToken, externalId, hidden, }: ModerateInput): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=meta.engage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.engage.d.ts","sourceRoot":"","sources":["../../../src/services/socialEngage/meta.engage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,UAAU,EACV,WAAW,EAEZ,MAAM,SAAS,CAAC;AA+BjB,8DAA8D;AAC9D,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,QAAQ,CAAC,QAAQ,6BAA6B;IAExC,aAAa,CAAC,EAClB,WAAW,EACX,cAAc,EACd,KAAK,EACL,KAAU,GACX,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA+B3C,cAAc,CAAC,EACnB,WAAW,EACX,UAAU,EACV,OAAO,GACR,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAe9B,eAAe,CAAC,EACpB,WAAW,EACX,UAAU,EACV,MAAM,GACP,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAajC;AAWD,mDAAmD;AACnD,qBAAa,oBAAqB,YAAW,mBAAmB;IAC9D,QAAQ,CAAC,QAAQ,4BAA4B;IAEvC,aAAa,CAAC,EAClB,WAAW,EACX,cAAc,EACd,KAAK,EACL,KAAU,GACX,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA+B3C,cAAc,CAAC,EACnB,WAAW,EACX,UAAU,EACV,OAAO,GACR,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAe9B,eAAe,CAAC,EACpB,WAAW,EACX,UAAU,EACV,MAAM,GACP,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAajC"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FacebookEngageClient = exports.InstagramEngageClient = void 0;
4
+ const types_1 = require("../../globals/types");
5
+ const types_2 = require("./types");
6
+ /**
7
+ * Meta engagement clients (Instagram + Facebook). Comments PUSH in via webhooks
8
+ * (handled in the Functions webhook receiver), but we still expose fetchComments
9
+ * for backfill / reconciliation. Replies and hide/unhide go through the Graph
10
+ * API. Env: META_GRAPH_VERSION (optional, default v21.0). See plan §D.
11
+ */
12
+ const DEFAULT_GRAPH_VERSION = "v21.0";
13
+ function graph(path) {
14
+ const v = process.env.META_GRAPH_VERSION || DEFAULT_GRAPH_VERSION;
15
+ return `https://graph.facebook.com/${v}${path}`;
16
+ }
17
+ /** Instagram comment engagement on a published media/Reel. */
18
+ class InstagramEngageClient {
19
+ constructor() {
20
+ this.provider = types_1.ESocialProvider.INSTAGRAM;
21
+ }
22
+ async fetchComments({ accessToken, providerPostId, since, limit = 50, }) {
23
+ const tokenQs = `access_token=${encodeURIComponent(accessToken)}`;
24
+ const resp = await fetch(graph(`/${providerPostId}/comments?fields=id,text,username,timestamp&limit=${Math.min(100, Math.max(1, limit))}&${tokenQs}`));
25
+ const json = (await resp.json());
26
+ if (!resp.ok || json.error) {
27
+ throw new Error(`InstagramEngage: comments ${resp.status} ${json.error?.message ?? ""}`.trim());
28
+ }
29
+ const out = [];
30
+ for (const c of json.data ?? []) {
31
+ if (!c.id)
32
+ continue;
33
+ const createdAt = (0, types_2.isoToMillis)(c.timestamp);
34
+ if (since && createdAt <= since)
35
+ continue;
36
+ out.push({
37
+ externalId: c.id,
38
+ parentProviderPostId: providerPostId,
39
+ authorHandle: c.username,
40
+ authorName: c.username,
41
+ text: c.text ?? "",
42
+ createdAt,
43
+ type: types_1.ESocialInboxType.COMMENT,
44
+ });
45
+ }
46
+ return out;
47
+ }
48
+ async replyToComment({ accessToken, externalId, message, }) {
49
+ const resp = await fetch(graph(`/${externalId}/replies`), {
50
+ method: "POST",
51
+ headers: { "Content-Type": "application/json" },
52
+ body: JSON.stringify({ message, access_token: accessToken }),
53
+ });
54
+ const json = (await resp.json());
55
+ if (!resp.ok || !json.id) {
56
+ throw new Error(`InstagramEngage: reply ${resp.status} ${json.error?.message ?? ""}`.trim());
57
+ }
58
+ return { externalId: json.id };
59
+ }
60
+ async moderateComment({ accessToken, externalId, hidden, }) {
61
+ const resp = await fetch(graph(`/${externalId}`), {
62
+ method: "POST",
63
+ headers: { "Content-Type": "application/json" },
64
+ body: JSON.stringify({ hide: hidden, access_token: accessToken }),
65
+ });
66
+ if (!resp.ok) {
67
+ const json = (await resp.json().catch(() => ({})));
68
+ throw new Error(`InstagramEngage: hide ${resp.status} ${json.error?.message ?? ""}`.trim());
69
+ }
70
+ }
71
+ }
72
+ exports.InstagramEngageClient = InstagramEngageClient;
73
+ /** Facebook Page post/video comment engagement. */
74
+ class FacebookEngageClient {
75
+ constructor() {
76
+ this.provider = types_1.ESocialProvider.FACEBOOK;
77
+ }
78
+ async fetchComments({ accessToken, providerPostId, since, limit = 50, }) {
79
+ const tokenQs = `access_token=${encodeURIComponent(accessToken)}`;
80
+ const resp = await fetch(graph(`/${providerPostId}/comments?fields=id,message,from,created_time&limit=${Math.min(100, Math.max(1, limit))}&${tokenQs}`));
81
+ const json = (await resp.json());
82
+ if (!resp.ok || json.error) {
83
+ throw new Error(`FacebookEngage: comments ${resp.status} ${json.error?.message ?? ""}`.trim());
84
+ }
85
+ const out = [];
86
+ for (const c of json.data ?? []) {
87
+ if (!c.id)
88
+ continue;
89
+ const createdAt = (0, types_2.isoToMillis)(c.created_time);
90
+ if (since && createdAt <= since)
91
+ continue;
92
+ out.push({
93
+ externalId: c.id,
94
+ parentProviderPostId: providerPostId,
95
+ authorHandle: c.from?.id,
96
+ authorName: c.from?.name,
97
+ text: c.message ?? "",
98
+ createdAt,
99
+ type: types_1.ESocialInboxType.COMMENT,
100
+ });
101
+ }
102
+ return out;
103
+ }
104
+ async replyToComment({ accessToken, externalId, message, }) {
105
+ const resp = await fetch(graph(`/${externalId}/comments`), {
106
+ method: "POST",
107
+ headers: { "Content-Type": "application/json" },
108
+ body: JSON.stringify({ message, access_token: accessToken }),
109
+ });
110
+ const json = (await resp.json());
111
+ if (!resp.ok || !json.id) {
112
+ throw new Error(`FacebookEngage: reply ${resp.status} ${json.error?.message ?? ""}`.trim());
113
+ }
114
+ return { externalId: json.id };
115
+ }
116
+ async moderateComment({ accessToken, externalId, hidden, }) {
117
+ const resp = await fetch(graph(`/${externalId}`), {
118
+ method: "POST",
119
+ headers: { "Content-Type": "application/json" },
120
+ body: JSON.stringify({ is_hidden: hidden, access_token: accessToken }),
121
+ });
122
+ if (!resp.ok) {
123
+ const json = (await resp.json().catch(() => ({})));
124
+ throw new Error(`FacebookEngage: hide ${resp.status} ${json.error?.message ?? ""}`.trim());
125
+ }
126
+ }
127
+ }
128
+ exports.FacebookEngageClient = FacebookEngageClient;
@@ -0,0 +1,50 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { IRemoteComment } from "./types";
3
+ /**
4
+ * Meta webhook helpers — Phase 5. Instagram + Facebook push comment/mention/DM
5
+ * events to our public `/v1/social/webhooks/meta` endpoint. Two concerns live
6
+ * here so the controller stays thin:
7
+ *
8
+ * 1. `verifyMetaSignature` — Meta signs every POST with HMAC-SHA256 of the raw
9
+ * body using the app secret, in the `X-Hub-Signature-256` header. We MUST
10
+ * verify it (the endpoint is public) before trusting anything.
11
+ * 2. `parseMetaWebhook` — flattens the nested `entry[].changes[]` envelope into
12
+ * normalized `MetaWebhookEvent`s keyed by the providerAccountId (page/IG id)
13
+ * so the controller can resolve the owning socialAccount and write inbox
14
+ * items. Unknown change types are skipped (we only ingest comments today).
15
+ *
16
+ * Env: META_APP_SECRET (signature key), META_WEBHOOK_VERIFY_TOKEN (GET verify).
17
+ * See notes/SOCIAL_SUITE_PLAN.md §D / §6 Phase 5.
18
+ */
19
+ /** A normalized webhook event tied to the account that owns it. */
20
+ export interface MetaWebhookEvent {
21
+ provider: ESocialProvider;
22
+ /** The page id (FB) or IG user id the event belongs to — matches our account. */
23
+ providerAccountId: string;
24
+ comment: IRemoteComment;
25
+ }
26
+ /**
27
+ * Verify the `X-Hub-Signature-256` header against the raw request body. Returns
28
+ * false on any mismatch/missing-secret rather than throwing, so the caller can
29
+ * respond 403 uniformly. `rawBody` MUST be the exact bytes Meta sent (mount a
30
+ * raw-body capture on the webhook route — JSON.stringify of a parsed body will
31
+ * not match).
32
+ */
33
+ export declare function verifyMetaSignature(rawBody: Buffer | string, signatureHeader: string | undefined): boolean;
34
+ /**
35
+ * Handle the GET verification handshake Meta performs when you register a
36
+ * webhook. Returns the challenge string to echo (200) when the verify token
37
+ * matches, else null (caller responds 403).
38
+ */
39
+ export declare function verifyMetaSubscription(query: {
40
+ "hub.mode"?: string;
41
+ "hub.verify_token"?: string;
42
+ "hub.challenge"?: string;
43
+ }): string | null;
44
+ /**
45
+ * Flatten a verified Meta webhook body into normalized comment events. `object`
46
+ * tells us the platform: "instagram" → IG, "page" → Facebook. Only `comments`
47
+ * (and IG `mentions`) changes are ingested today; everything else is ignored.
48
+ */
49
+ export declare function parseMetaWebhook(body: unknown): MetaWebhookEvent[];
50
+ //# sourceMappingURL=metaWebhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metaWebhook.d.ts","sourceRoot":"","sources":["../../../src/services/socialEngage/metaWebhook.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC;;;;;;;;;;;;;;;GAeG;AAEH,mEAAmE;AACnE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,OAAO,CAYT;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,MAAM,GAAG,IAAI,CAUhB;AAyBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,EAAE,CA8ClE"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyMetaSignature = verifyMetaSignature;
4
+ exports.verifyMetaSubscription = verifyMetaSubscription;
5
+ exports.parseMetaWebhook = parseMetaWebhook;
6
+ const crypto_1 = require("crypto");
7
+ const types_1 = require("../../globals/types");
8
+ /**
9
+ * Verify the `X-Hub-Signature-256` header against the raw request body. Returns
10
+ * false on any mismatch/missing-secret rather than throwing, so the caller can
11
+ * respond 403 uniformly. `rawBody` MUST be the exact bytes Meta sent (mount a
12
+ * raw-body capture on the webhook route — JSON.stringify of a parsed body will
13
+ * not match).
14
+ */
15
+ function verifyMetaSignature(rawBody, signatureHeader) {
16
+ const secret = process.env.META_APP_SECRET;
17
+ if (!secret || !signatureHeader)
18
+ return false;
19
+ const expected = "sha256=" +
20
+ (0, crypto_1.createHmac)("sha256", secret)
21
+ .update(typeof rawBody === "string" ? Buffer.from(rawBody) : rawBody)
22
+ .digest("hex");
23
+ const a = Buffer.from(expected);
24
+ const b = Buffer.from(signatureHeader);
25
+ if (a.length !== b.length)
26
+ return false;
27
+ return (0, crypto_1.timingSafeEqual)(a, b);
28
+ }
29
+ /**
30
+ * Handle the GET verification handshake Meta performs when you register a
31
+ * webhook. Returns the challenge string to echo (200) when the verify token
32
+ * matches, else null (caller responds 403).
33
+ */
34
+ function verifyMetaSubscription(query) {
35
+ const token = process.env.META_WEBHOOK_VERIFY_TOKEN;
36
+ if (query["hub.mode"] === "subscribe" &&
37
+ token &&
38
+ query["hub.verify_token"] === token) {
39
+ return query["hub.challenge"] ?? "";
40
+ }
41
+ return null;
42
+ }
43
+ /**
44
+ * Flatten a verified Meta webhook body into normalized comment events. `object`
45
+ * tells us the platform: "instagram" → IG, "page" → Facebook. Only `comments`
46
+ * (and IG `mentions`) changes are ingested today; everything else is ignored.
47
+ */
48
+ function parseMetaWebhook(body) {
49
+ const parsed = body;
50
+ const provider = parsed.object === "instagram"
51
+ ? types_1.ESocialProvider.INSTAGRAM
52
+ : parsed.object === "page"
53
+ ? types_1.ESocialProvider.FACEBOOK
54
+ : null;
55
+ if (!provider)
56
+ return [];
57
+ const events = [];
58
+ for (const entry of parsed.entry ?? []) {
59
+ const providerAccountId = entry.id;
60
+ if (!providerAccountId)
61
+ continue;
62
+ for (const change of entry.changes ?? []) {
63
+ const isComment = change.field === "comments" || change.field === "mentions";
64
+ if (!isComment)
65
+ continue;
66
+ const v = change.value ?? {};
67
+ const externalId = v.comment_id ?? v.id;
68
+ if (!externalId)
69
+ continue;
70
+ const createdMs = typeof v.created_time === "number"
71
+ ? v.created_time * 1000 // Meta sends unix seconds
72
+ : typeof entry.time === "number"
73
+ ? entry.time * 1000
74
+ : 0;
75
+ events.push({
76
+ provider,
77
+ providerAccountId,
78
+ comment: {
79
+ externalId,
80
+ parentProviderPostId: v.media?.id ?? v.post_id,
81
+ authorHandle: v.from?.username ?? v.from?.id,
82
+ authorName: v.from?.name ?? v.from?.username,
83
+ text: v.text ?? v.message ?? "",
84
+ createdAt: createdMs,
85
+ type: change.field === "mentions"
86
+ ? types_1.ESocialInboxType.MENTION
87
+ : types_1.ESocialInboxType.COMMENT,
88
+ },
89
+ });
90
+ }
91
+ }
92
+ return events;
93
+ }
@@ -0,0 +1,72 @@
1
+ import { ESocialInboxType, ESocialProvider } from "../../globals/types";
2
+ /**
3
+ * X8 Social Suite — Phase 5 engagement (inbox) client abstraction. Mirrors the
4
+ * socialMetrics/socialPublish adapter shape: one thin implementation per
5
+ * platform behind a single interface, registered in a factory. Comments arrive
6
+ * two ways — Meta PUSHES them via webhooks (~1–5s), while YouTube has no comment
7
+ * webhook so the metrics-style poll sweep PULLS them. Either way the provider
8
+ * payload is normalized into `IRemoteComment`, which the controller/sweep maps
9
+ * onto the `socialInbox` model. See notes/SOCIAL_SUITE_PLAN.md §D.
10
+ *
11
+ * TikTok comment read/reply is Business-API-only, so it is intentionally absent
12
+ * here (plan §6 — TikTok engage deferred).
13
+ */
14
+ /** A comment/mention/DM as returned by a provider, before we persist it. */
15
+ export interface IRemoteComment {
16
+ /** Provider's stable id for this comment (used for reply + dedupe). */
17
+ externalId: string;
18
+ /** The post this relates to (provider post id), when known. */
19
+ parentProviderPostId?: string;
20
+ authorHandle?: string;
21
+ authorName?: string;
22
+ text: string;
23
+ /** Unix ms the comment was created. */
24
+ createdAt: number;
25
+ type: ESocialInboxType;
26
+ }
27
+ export interface FetchCommentsInput {
28
+ /** Cleartext access token for the owning account (already refreshed). */
29
+ accessToken: string;
30
+ /** Provider's post/video id whose comments we want. */
31
+ providerPostId: string;
32
+ /** Only return comments newer than this unix-ms (incremental poll). */
33
+ since?: number;
34
+ /** Soft cap on how many to return per poll. */
35
+ limit?: number;
36
+ }
37
+ export interface ReplyInput {
38
+ /** Cleartext access token for the owning account (already refreshed). */
39
+ accessToken: string;
40
+ /** Provider id of the comment/thread we're replying to. */
41
+ externalId: string;
42
+ message: string;
43
+ /** Provider post id — some platforms need it alongside the comment id. */
44
+ providerPostId?: string;
45
+ }
46
+ export interface ReplyResult {
47
+ /** Provider id of the reply we just created. */
48
+ externalId: string;
49
+ }
50
+ export interface ModerateInput {
51
+ /** Cleartext access token for the owning account (already refreshed). */
52
+ accessToken: string;
53
+ /** Provider id of the comment to hide/unhide. */
54
+ externalId: string;
55
+ /** true → hide, false → unhide. */
56
+ hidden: boolean;
57
+ }
58
+ export interface ISocialEngageClient {
59
+ readonly provider: ESocialProvider;
60
+ /** Pull recent comments for a published post (used by the poll sweep). */
61
+ fetchComments(input: FetchCommentsInput): Promise<IRemoteComment[]>;
62
+ /** Post a reply to a comment. */
63
+ replyToComment(input: ReplyInput): Promise<ReplyResult>;
64
+ /**
65
+ * Hide/unhide a comment (moderation). Optional — providers without a
66
+ * moderation API simply omit it and the caller degrades to "reply only".
67
+ */
68
+ moderateComment?(input: ModerateInput): Promise<void>;
69
+ }
70
+ /** Parse an ISO-8601 timestamp into unix ms, defaulting to 0 on garbage. */
71
+ export declare function isoToMillis(iso: string | undefined): number;
72
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/socialEngage/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAExE;;;;;;;;;;;GAWG;AAEH,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,0EAA0E;IAC1E,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACpE,iCAAiC;IACjC,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxD;;;OAGG;IACH,eAAe,CAAC,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI3D"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isoToMillis = isoToMillis;
4
+ /** Parse an ISO-8601 timestamp into unix ms, defaulting to 0 on garbage. */
5
+ function isoToMillis(iso) {
6
+ if (!iso)
7
+ return 0;
8
+ const ms = Date.parse(iso);
9
+ return Number.isFinite(ms) ? ms : 0;
10
+ }
@@ -0,0 +1,9 @@
1
+ import { ESocialProvider } from "../../globals/types";
2
+ import { FetchCommentsInput, IRemoteComment, ISocialEngageClient, ModerateInput, ReplyInput, ReplyResult } from "./types";
3
+ export declare class YouTubeEngageClient implements ISocialEngageClient {
4
+ readonly provider = ESocialProvider.YOUTUBE;
5
+ fetchComments({ accessToken, providerPostId, since, limit, }: FetchCommentsInput): Promise<IRemoteComment[]>;
6
+ replyToComment({ accessToken, externalId, message, }: ReplyInput): Promise<ReplyResult>;
7
+ moderateComment({ accessToken, externalId, hidden, }: ModerateInput): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=youtube.engage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube.engage.d.ts","sourceRoot":"","sources":["../../../src/services/socialEngage/youtube.engage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,UAAU,EACV,WAAW,EAEZ,MAAM,SAAS,CAAC;AAiCjB,qBAAa,mBAAoB,YAAW,mBAAmB;IAC7D,QAAQ,CAAC,QAAQ,2BAA2B;IAEtC,aAAa,CAAC,EAClB,WAAW,EACX,cAAc,EACd,KAAK,EACL,KAAU,GACX,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAkC3C,cAAc,CAAC,EACnB,WAAW,EACX,UAAU,EACV,OAAO,GACR,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAoB9B,eAAe,CAAC,EACpB,WAAW,EACX,UAAU,EACV,MAAM,GACP,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBjC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.YouTubeEngageClient = void 0;
4
+ const types_1 = require("../../globals/types");
5
+ const types_2 = require("./types");
6
+ /**
7
+ * YouTube engagement client. YouTube has NO comment webhook, so the poll sweep
8
+ * pulls `commentThreads` for each published video on a schedule. Replies use
9
+ * `comments.insert` (needs the `youtube.force-ssl` scope, which our publish
10
+ * scope already includes). Moderation maps "hide" → setModerationStatus
11
+ * `rejected` (channel-owner only). See notes/SOCIAL_SUITE_PLAN.md §D.
12
+ */
13
+ const API = "https://www.googleapis.com/youtube/v3";
14
+ class YouTubeEngageClient {
15
+ constructor() {
16
+ this.provider = types_1.ESocialProvider.YOUTUBE;
17
+ }
18
+ async fetchComments({ accessToken, providerPostId, since, limit = 50, }) {
19
+ const max = Math.min(100, Math.max(1, limit));
20
+ const url = `${API}/commentThreads?part=snippet&order=time&textFormat=plainText` +
21
+ `&maxResults=${max}&videoId=${encodeURIComponent(providerPostId)}`;
22
+ const resp = await fetch(url, {
23
+ headers: { Authorization: `Bearer ${accessToken}` },
24
+ });
25
+ if (!resp.ok) {
26
+ // Comments disabled / video private surfaces as 403 — treat as "none".
27
+ if (resp.status === 403 || resp.status === 404)
28
+ return [];
29
+ throw new Error(`YouTubeEngage: commentThreads ${resp.status}`);
30
+ }
31
+ const json = (await resp.json());
32
+ const out = [];
33
+ for (const item of json.items ?? []) {
34
+ const top = item.snippet?.topLevelComment;
35
+ const s = top?.snippet;
36
+ if (!top?.id || !s)
37
+ continue;
38
+ const createdAt = (0, types_2.isoToMillis)(s.publishedAt);
39
+ if (since && createdAt <= since)
40
+ continue;
41
+ out.push({
42
+ externalId: top.id,
43
+ parentProviderPostId: providerPostId,
44
+ authorHandle: s.authorChannelId?.value,
45
+ authorName: s.authorDisplayName,
46
+ text: s.textDisplay ?? "",
47
+ createdAt,
48
+ type: types_1.ESocialInboxType.COMMENT,
49
+ });
50
+ }
51
+ return out;
52
+ }
53
+ async replyToComment({ accessToken, externalId, message, }) {
54
+ const resp = await fetch(`${API}/comments?part=snippet`, {
55
+ method: "POST",
56
+ headers: {
57
+ Authorization: `Bearer ${accessToken}`,
58
+ "Content-Type": "application/json",
59
+ },
60
+ body: JSON.stringify({
61
+ snippet: { parentId: externalId, textOriginal: message },
62
+ }),
63
+ });
64
+ const json = (await resp.json());
65
+ if (!resp.ok || !json.id) {
66
+ throw new Error(`YouTubeEngage: comments.insert ${resp.status} ${json.error?.message ?? ""}`.trim());
67
+ }
68
+ return { externalId: json.id };
69
+ }
70
+ async moderateComment({ accessToken, externalId, hidden, }) {
71
+ // YouTube has no "unhide"; rejecting removes from public view. Unhide would
72
+ // require the comment to be re-published, which the API doesn't expose for
73
+ // arbitrary comments — so unhide is a no-op (status stays as the user left it).
74
+ if (!hidden)
75
+ return;
76
+ const url = `${API}/comments/setModerationStatus` +
77
+ `?id=${encodeURIComponent(externalId)}&moderationStatus=rejected`;
78
+ const resp = await fetch(url, {
79
+ method: "POST",
80
+ headers: { Authorization: `Bearer ${accessToken}` },
81
+ });
82
+ if (!resp.ok) {
83
+ throw new Error(`YouTubeEngage: setModerationStatus ${resp.status}`);
84
+ }
85
+ }
86
+ }
87
+ exports.YouTubeEngageClient = YouTubeEngageClient;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * X8 Social Suite — B2 auto-format geometry.
3
+ *
4
+ * Pure, dependency-free math for re-framing an already-rendered video into a
5
+ * platform's recommended aspect. Lives in `shared` (not the node app) so it is
6
+ * unit-testable and reused by both the publish worker and any future preview UI.
7
+ *
8
+ * The plan's intent (SOCIAL_SUITE_PLAN.md §4 B2): *don't re-encode blindly* — but
9
+ * for plain generated videos we only have the stitched MP4 (no Project JSON), so
10
+ * the reframe is an ffmpeg scale+crop/pad transform here rather than a Remotion
11
+ * re-render. Agent projects that DO carry Project JSON can later route through
12
+ * the Remotion path; this module only computes target dimensions + the ffmpeg
13
+ * filter, so both callers share the same geometry.
14
+ *
15
+ * Two modes:
16
+ * - "cover" (default) — scale to fill the target frame, then center-crop the
17
+ * overflow. No bars; loses edge content. This is what Reels/Shorts
18
+ * auto-format expects. (Smart/face-aware crop is deferred — v1 is
19
+ * a center crop.)
20
+ * - "contain" — scale to fit inside the target frame, then pad (letterbox /
21
+ * pillarbox) with a solid colour. Preserves all content; adds bars.
22
+ */
23
+ export type EReframeMode = "cover" | "contain";
24
+ /** Aspects the composer can request (mirrors AspectSchema + a few publish-only ratios). */
25
+ export declare const SUPPORTED_ASPECTS: readonly ["9:16", "1:1", "4:5", "16:9", "4:3", "3:4"];
26
+ export type SupportedAspect = (typeof SUPPORTED_ASPECTS)[number];
27
+ /** Parse "9:16" → { w: 9, h: 16 }. Throws on malformed input (validated upstream by zod). */
28
+ export declare function parseAspect(aspect: string): {
29
+ w: number;
30
+ h: number;
31
+ };
32
+ /** Numeric width/height ratio of an aspect string (e.g. "16:9" → 1.777…). */
33
+ export declare function aspectRatio(aspect: string): number;
34
+ /**
35
+ * Target output dimensions for an aspect. Uses the canonical table when known;
36
+ * otherwise derives a ~1080-class box from the parsed ratio so any zod-valid
37
+ * "W:H" still produces sane even dimensions.
38
+ */
39
+ export declare function targetSizeFor(aspect: string): {
40
+ width: number;
41
+ height: number;
42
+ };
43
+ /**
44
+ * Whether a source of (srcW × srcH) needs re-framing to hit `targetAspect`.
45
+ * Returns false when the source ratio already matches within `tolerance`
46
+ * (default 1%) — the publish worker then skips the render and publishes the
47
+ * source as-is (no wasted transcode, no quality loss).
48
+ */
49
+ export declare function needsReframe(srcWidth: number, srcHeight: number, targetAspect: string, tolerance?: number): boolean;
50
+ /**
51
+ * Build the ffmpeg `-vf` filter string that reframes a source of (srcW × srcH)
52
+ * into (dstW × dstH) using the chosen mode. SAR is reset to 1 so non-square
53
+ * source pixels don't skew the output.
54
+ *
55
+ * cover: scale to the smallest size that fully covers the target (increase),
56
+ * then center-crop to exact target dimensions.
57
+ * contain: scale to the largest size that fits inside (decrease), then pad the
58
+ * remainder centred with `padColor`.
59
+ */
60
+ export declare function buildReframeFilter(dstWidth: number, dstHeight: number, mode?: EReframeMode, padColor?: string): string;
61
+ /**
62
+ * One-shot geometry resolution for a reframe job: given the probed source
63
+ * dimensions and a requested aspect, return the target dimensions, whether a
64
+ * reframe is actually required, and the ready-to-use ffmpeg filter. The worker
65
+ * calls this and either skips (when `reframe` is false) or runs ffmpeg with
66
+ * `filter`.
67
+ */
68
+ export declare function resolveReframe(srcWidth: number, srcHeight: number, targetAspect: string, mode?: EReframeMode): {
69
+ width: number;
70
+ height: number;
71
+ reframe: boolean;
72
+ filter: string;
73
+ };
74
+ //# sourceMappingURL=aspectGeometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aspectGeometry.d.ts","sourceRoot":"","sources":["../../../src/services/socialFormat/aspectGeometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/C,2FAA2F;AAC3F,eAAO,MAAM,iBAAiB,uDAAwD,CAAC;AACvF,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAgBjE,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAOpE;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlD;AAOD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAS/E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,SAAO,GACf,OAAO,CAKT;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,YAAsB,EAC5B,QAAQ,SAAU,GACjB,MAAM,CAaR;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,YAAsB,GAC3B;IACD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAQA"}