@nlabs/reaktor 1.18.0 → 1.20.0-reactorbox.1

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 (396) hide show
  1. package/README.md +290 -0
  2. package/docs/GENERATION.md +42 -16
  3. package/lib/actions/alfredFaq.js +1 -1
  4. package/lib/actions/analytics.js +1 -1
  5. package/lib/actions/apps.js +17 -2
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +1 -1
  8. package/lib/actions/contentGeneration.d.ts +22 -1
  9. package/lib/actions/contentGeneration.js +120 -32
  10. package/lib/actions/contentGenerationErrors.js +1 -1
  11. package/lib/actions/contentGenerationSources.d.ts +29 -0
  12. package/lib/actions/contentGenerationSources.js +103 -0
  13. package/lib/actions/conversations.js +1 -1
  14. package/lib/actions/crm.d.ts +6 -2
  15. package/lib/actions/crm.js +91 -12
  16. package/lib/actions/crmCanonicalOutcomes.d.ts +88 -0
  17. package/lib/actions/crmCanonicalOutcomes.js +398 -0
  18. package/lib/actions/crmCanonicalPolicy.d.ts +92 -0
  19. package/lib/actions/crmCanonicalPolicy.js +104 -0
  20. package/lib/actions/crmCheckoutRecovery.d.ts +72 -0
  21. package/lib/actions/crmCheckoutRecovery.js +413 -0
  22. package/lib/actions/crmCheckoutRecoveryPolicy.d.ts +38 -0
  23. package/lib/actions/crmCheckoutRecoveryPolicy.js +61 -0
  24. package/lib/actions/crmDeliveryEvents.d.ts +24 -0
  25. package/lib/actions/crmDeliveryEvents.js +207 -0
  26. package/lib/actions/crmDeliveryEvidence.d.ts +17 -0
  27. package/lib/actions/crmDeliveryEvidence.js +58 -0
  28. package/lib/actions/crmExecution.d.ts +125 -0
  29. package/lib/actions/crmExecution.js +830 -0
  30. package/lib/actions/crmFinancialEvidence.d.ts +12 -0
  31. package/lib/actions/crmFinancialEvidence.js +60 -0
  32. package/lib/actions/crmInsights.d.ts +60 -0
  33. package/lib/actions/crmInsights.js +225 -0
  34. package/lib/actions/crmLeadFollowups.d.ts +66 -0
  35. package/lib/actions/crmLeadFollowups.js +209 -0
  36. package/lib/actions/crmOutcomes.d.ts +106 -0
  37. package/lib/actions/crmOutcomes.js +289 -0
  38. package/lib/actions/crmRecoveryRetention.d.ts +13 -0
  39. package/lib/actions/crmRecoveryRetention.js +163 -0
  40. package/lib/actions/crmReminderDispatch.d.ts +10 -0
  41. package/lib/actions/crmReminderDispatch.js +65 -0
  42. package/lib/actions/crmSourceOwnership.d.ts +7 -0
  43. package/lib/actions/crmSourceOwnership.js +27 -0
  44. package/lib/actions/crmSupportInsights.d.ts +18 -0
  45. package/lib/actions/crmSupportInsights.js +47 -0
  46. package/lib/actions/crmWinback.d.ts +71 -0
  47. package/lib/actions/crmWinback.js +347 -0
  48. package/lib/actions/crmWinbackConsent.d.ts +29 -0
  49. package/lib/actions/crmWinbackConsent.js +158 -0
  50. package/lib/actions/crmWinbackPolicy.d.ts +33 -0
  51. package/lib/actions/crmWinbackPolicy.js +115 -0
  52. package/lib/actions/crmWinbackShopSource.d.ts +15 -0
  53. package/lib/actions/crmWinbackShopSource.js +63 -0
  54. package/lib/actions/crud.js +1 -1
  55. package/lib/actions/databaseAccounts.js +1 -1
  56. package/lib/actions/databaseProvisioningLease.js +1 -1
  57. package/lib/actions/dynamodb.js +1 -1
  58. package/lib/actions/email.d.ts +4 -1
  59. package/lib/actions/email.js +25 -3
  60. package/lib/actions/files.js +1 -1
  61. package/lib/actions/flags.js +1 -1
  62. package/lib/actions/geminiVideo.js +1 -1
  63. package/lib/actions/groups.js +1 -1
  64. package/lib/actions/higgsfield.js +1 -1
  65. package/lib/actions/imageGeneration.js +1 -1
  66. package/lib/actions/images.js +1 -1
  67. package/lib/actions/index.d.ts +56 -0
  68. package/lib/actions/index.js +42 -1
  69. package/lib/actions/ios.js +1 -1
  70. package/lib/actions/locations.js +1 -1
  71. package/lib/actions/merchantAccountExperiment.d.ts +50 -0
  72. package/lib/actions/merchantAccountExperiment.js +424 -0
  73. package/lib/actions/merchantAccountExperimentConfig.d.ts +7 -0
  74. package/lib/actions/merchantAccountExperimentConfig.js +32 -0
  75. package/lib/actions/merchantAccountExperimentHost.d.ts +69 -0
  76. package/lib/actions/merchantAccountExperimentHost.js +92 -0
  77. package/lib/actions/merchantAccountExperimentPolicy.d.ts +66 -0
  78. package/lib/actions/merchantAccountExperimentPolicy.js +121 -0
  79. package/lib/actions/merchantAccountExperimentRelay.d.ts +10 -0
  80. package/lib/actions/merchantAccountExperimentRelay.js +75 -0
  81. package/lib/actions/merchantCalendar.d.ts +34 -0
  82. package/lib/actions/merchantCalendar.js +119 -0
  83. package/lib/actions/merchantCalendarBookings.d.ts +17 -0
  84. package/lib/actions/merchantCalendarBookings.js +113 -0
  85. package/lib/actions/merchantCalendarDelegation.d.ts +80 -0
  86. package/lib/actions/merchantCalendarDelegation.js +353 -0
  87. package/lib/actions/merchantCalendarDiscovery.d.ts +38 -0
  88. package/lib/actions/merchantCalendarDiscovery.js +124 -0
  89. package/lib/actions/merchantCalendarEventHost.d.ts +105 -0
  90. package/lib/actions/merchantCalendarEventHost.js +16 -0
  91. package/lib/actions/merchantCalendarEventPrivacy.d.ts +7 -0
  92. package/lib/actions/merchantCalendarEventPrivacy.js +70 -0
  93. package/lib/actions/merchantCalendarEventRepository.d.ts +121 -0
  94. package/lib/actions/merchantCalendarEventRepository.js +295 -0
  95. package/lib/actions/merchantCalendarEventTransport.d.ts +65 -0
  96. package/lib/actions/merchantCalendarEventTransport.js +132 -0
  97. package/lib/actions/merchantCalendarEvents.d.ts +172 -0
  98. package/lib/actions/merchantCalendarEvents.js +365 -0
  99. package/lib/actions/merchantCalendarInvitationConsent.d.ts +28 -0
  100. package/lib/actions/merchantCalendarInvitationConsent.js +118 -0
  101. package/lib/actions/merchantCalendarManagedSource.d.ts +22 -0
  102. package/lib/actions/merchantCalendarManagedSource.js +24 -0
  103. package/lib/actions/merchantCalendarOAuth.d.ts +92 -0
  104. package/lib/actions/merchantCalendarOAuth.js +502 -0
  105. package/lib/actions/merchantCalendarOAuthConfig.d.ts +4 -0
  106. package/lib/actions/merchantCalendarOAuthConfig.js +30 -0
  107. package/lib/actions/merchantCalendarOAuthRepository.d.ts +57 -0
  108. package/lib/actions/merchantCalendarOAuthRepository.js +108 -0
  109. package/lib/actions/merchantCalendarOAuthTransport.d.ts +4 -0
  110. package/lib/actions/merchantCalendarOAuthTransport.js +25 -0
  111. package/lib/actions/merchantCalendarScopes.d.ts +4 -0
  112. package/lib/actions/merchantCalendarScopes.js +31 -0
  113. package/lib/actions/merchantFinance.d.ts +65 -0
  114. package/lib/actions/merchantFinance.js +244 -0
  115. package/lib/actions/merchantFinanceProvider.d.ts +57 -0
  116. package/lib/actions/merchantFinanceProvider.js +180 -0
  117. package/lib/actions/merchantOperations.d.ts +94 -0
  118. package/lib/actions/merchantOperations.js +489 -0
  119. package/lib/actions/messages.js +1 -1
  120. package/lib/actions/notifications.js +1 -1
  121. package/lib/actions/ollamaGeneration.js +1 -1
  122. package/lib/actions/openaiResponseSession.js +1 -1
  123. package/lib/actions/payments.js +1 -1
  124. package/lib/actions/personas.js +1 -1
  125. package/lib/actions/phoneSupport.js +1 -1
  126. package/lib/actions/posts.js +1 -1
  127. package/lib/actions/providerCredentials.d.ts +35 -0
  128. package/lib/actions/providerCredentials.js +166 -0
  129. package/lib/actions/query.js +1 -1
  130. package/lib/actions/reactions.js +1 -1
  131. package/lib/actions/rum.js +1 -1
  132. package/lib/actions/s3.d.ts +10 -7
  133. package/lib/actions/s3.js +59 -14
  134. package/lib/actions/search.js +1 -1
  135. package/lib/actions/sms.js +1 -1
  136. package/lib/actions/statistics.js +1 -1
  137. package/lib/actions/subscriptions.js +1 -1
  138. package/lib/actions/supportChannelSources.d.ts +66 -0
  139. package/lib/actions/supportChannelSources.js +183 -0
  140. package/lib/actions/supportCommerce.d.ts +62 -0
  141. package/lib/actions/supportCommerce.js +252 -0
  142. package/lib/actions/supportConnect.d.ts +39 -0
  143. package/lib/actions/supportConnect.js +224 -0
  144. package/lib/actions/supportContext.d.ts +31 -0
  145. package/lib/actions/supportContext.js +88 -0
  146. package/lib/actions/supportConversation.d.ts +102 -0
  147. package/lib/actions/supportConversation.js +100 -0
  148. package/lib/actions/supportEmailEvents.d.ts +20 -0
  149. package/lib/actions/supportEmailEvents.js +130 -0
  150. package/lib/actions/supportEmailHandoff.d.ts +114 -0
  151. package/lib/actions/supportEmailHandoff.js +356 -0
  152. package/lib/actions/supportOperations.d.ts +32 -0
  153. package/lib/actions/supportOperations.js +74 -0
  154. package/lib/actions/supportPolicy.d.ts +9 -0
  155. package/lib/actions/supportPolicy.js +44 -0
  156. package/lib/actions/supportPurposeConsent.d.ts +32 -0
  157. package/lib/actions/supportPurposeConsent.js +196 -0
  158. package/lib/actions/supportPurposePrivacy.d.ts +15 -0
  159. package/lib/actions/supportPurposePrivacy.js +181 -0
  160. package/lib/actions/supportSemanticReview.d.ts +64 -0
  161. package/lib/actions/supportSemanticReview.js +239 -0
  162. package/lib/actions/tags.js +1 -1
  163. package/lib/actions/users.js +22 -3
  164. package/lib/actions/videoGeneration.js +1 -1
  165. package/lib/actions/videos.js +1 -1
  166. package/lib/adapters/arangoAdapter.js +1 -1
  167. package/lib/adapters/contentAdapter.js +1 -1
  168. package/lib/adapters/fileAdapter.js +1 -1
  169. package/lib/adapters/geminiGenerationAdapter.js +1 -1
  170. package/lib/adapters/higgsfieldAdapter.js +1 -1
  171. package/lib/adapters/higgsfieldModelCatalog.js +1 -1
  172. package/lib/adapters/higgsfieldModels.js +1 -1
  173. package/lib/adapters/imageAdapter.js +1 -1
  174. package/lib/adapters/imageGenerationAdapter.js +1 -1
  175. package/lib/adapters/index.js +1 -1
  176. package/lib/adapters/messageAdapter.js +1 -1
  177. package/lib/adapters/postAdapter.js +1 -1
  178. package/lib/adapters/reaktorAdapter.js +1 -1
  179. package/lib/adapters/tagAdapter.js +1 -1
  180. package/lib/adapters/userAdapter.js +1 -1
  181. package/lib/assistant/core.js +1 -1
  182. package/lib/assistant/faq.js +1 -1
  183. package/lib/assistant/faqCore.js +1 -1
  184. package/lib/assistant/index.js +1 -1
  185. package/lib/assistant/service.js +1 -1
  186. package/lib/config.js +1 -1
  187. package/lib/constants/collections.d.ts +2 -1
  188. package/lib/constants/collections.js +2 -1
  189. package/lib/durableChat/conversations.js +1 -1
  190. package/lib/durableChat/errors.js +1 -1
  191. package/lib/durableChat/events.js +1 -1
  192. package/lib/durableChat/index.js +1 -1
  193. package/lib/durableChat/membership.js +1 -1
  194. package/lib/durableChat/messageTypes.js +1 -1
  195. package/lib/durableChat/messages.js +1 -1
  196. package/lib/durableChat/transaction.js +1 -1
  197. package/lib/durableChat/types.js +1 -1
  198. package/lib/handlers/graphqlHandler.js +1 -1
  199. package/lib/index.js +1 -1
  200. package/lib/lambdas/actions/websockets.js +1 -1
  201. package/lib/lambdas/authorizer.js +1 -1
  202. package/lib/lambdas/connection.js +1 -1
  203. package/lib/lambdas/utils/message.js +1 -1
  204. package/lib/lambdas/utils/websocket.js +1 -1
  205. package/lib/mocks/conversation.js +1 -1
  206. package/lib/mocks/file.js +1 -1
  207. package/lib/mocks/group.js +1 -1
  208. package/lib/mocks/image.js +1 -1
  209. package/lib/mocks/post.js +1 -1
  210. package/lib/mocks/tag.js +1 -1
  211. package/lib/mocks/user.js +1 -1
  212. package/lib/mocks/video.js +1 -1
  213. package/lib/mutations/analytics/analytics.js +1 -1
  214. package/lib/mutations/content/content.js +1 -1
  215. package/lib/mutations/crm/crm.js +395 -7
  216. package/lib/mutations/events/events.js +1 -1
  217. package/lib/mutations/flags/flags.js +1 -1
  218. package/lib/mutations/groups/groups.js +1 -1
  219. package/lib/mutations/higgsfield/higgsfield.js +1 -1
  220. package/lib/mutations/images/images.js +1 -1
  221. package/lib/mutations/index.js +1 -1
  222. package/lib/mutations/locations/locations.js +1 -1
  223. package/lib/mutations/messages/messages.js +1 -1
  224. package/lib/mutations/personas/personas.js +1 -1
  225. package/lib/mutations/posts/posts.js +1 -1
  226. package/lib/mutations/reactions/reactions.js +1 -1
  227. package/lib/mutations/rum/rum.js +1 -1
  228. package/lib/mutations/statistics/statistics.js +1 -1
  229. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  230. package/lib/mutations/tags/tags.js +1 -1
  231. package/lib/mutations/users/users.js +1 -1
  232. package/lib/mutations/videos/videos.js +1 -1
  233. package/lib/nativePush/graphql.js +1 -1
  234. package/lib/nativePush/index.js +1 -1
  235. package/lib/nativePush/migrations.js +1 -1
  236. package/lib/nativePush/nativePushContract.fixture.js +1 -1
  237. package/lib/nativePush/payload.js +1 -1
  238. package/lib/nativePush/repository.js +1 -1
  239. package/lib/nativePush/service.js +1 -1
  240. package/lib/nativePush/snsProvider.js +1 -1
  241. package/lib/nativePush/types.js +1 -1
  242. package/lib/objectTypes/analytics.js +1 -1
  243. package/lib/objectTypes/app.js +1 -1
  244. package/lib/objectTypes/bankAccount.js +1 -1
  245. package/lib/objectTypes/connection.js +1 -1
  246. package/lib/objectTypes/content.js +1 -1
  247. package/lib/objectTypes/contentGeneration.js +1 -1
  248. package/lib/objectTypes/conversation.js +1 -1
  249. package/lib/objectTypes/creditCard.js +1 -1
  250. package/lib/objectTypes/crm.js +1 -1
  251. package/lib/objectTypes/document.js +1 -1
  252. package/lib/objectTypes/error.js +1 -1
  253. package/lib/objectTypes/event.js +1 -1
  254. package/lib/objectTypes/external.js +1 -1
  255. package/lib/objectTypes/file.js +1 -1
  256. package/lib/objectTypes/filter.js +1 -1
  257. package/lib/objectTypes/flag.js +1 -1
  258. package/lib/objectTypes/group.js +1 -1
  259. package/lib/objectTypes/higgsfield.js +1 -1
  260. package/lib/objectTypes/iapSubscription.js +1 -1
  261. package/lib/objectTypes/image.js +1 -1
  262. package/lib/objectTypes/imageGeneration.js +1 -1
  263. package/lib/objectTypes/index.js +1 -1
  264. package/lib/objectTypes/location.js +1 -1
  265. package/lib/objectTypes/message.js +1 -1
  266. package/lib/objectTypes/passcode.js +1 -1
  267. package/lib/objectTypes/persona.js +1 -1
  268. package/lib/objectTypes/plan.js +1 -1
  269. package/lib/objectTypes/post.js +1 -1
  270. package/lib/objectTypes/query.js +1 -1
  271. package/lib/objectTypes/reaction.js +1 -1
  272. package/lib/objectTypes/relation.js +1 -1
  273. package/lib/objectTypes/rum.js +1 -1
  274. package/lib/objectTypes/search.js +1 -1
  275. package/lib/objectTypes/statistics.js +1 -1
  276. package/lib/objectTypes/subscription.js +1 -1
  277. package/lib/objectTypes/tag.js +1 -1
  278. package/lib/objectTypes/user.js +1 -1
  279. package/lib/objectTypes/video.js +1 -1
  280. package/lib/objectTypes/videoGeneration.js +1 -1
  281. package/lib/organizations/accountLifecycle.js +1 -1
  282. package/lib/organizations/authorization.js +1 -1
  283. package/lib/organizations/billing.js +1 -1
  284. package/lib/organizations/billingProvider.js +1 -1
  285. package/lib/organizations/billingUpdates.js +1 -1
  286. package/lib/organizations/index.js +1 -1
  287. package/lib/organizations/mail.js +1 -1
  288. package/lib/organizations/memberDirectory.js +1 -1
  289. package/lib/organizations/membership.js +1 -1
  290. package/lib/organizations/passwordRecovery.js +1 -1
  291. package/lib/organizations/plans.js +1 -1
  292. package/lib/organizations/providerPagination.js +1 -1
  293. package/lib/organizations/reconciliation.js +1 -1
  294. package/lib/organizations/signup.js +1 -1
  295. package/lib/organizations/store.js +1 -1
  296. package/lib/organizations/types.js +1 -1
  297. package/lib/organizations/verification.js +1 -1
  298. package/lib/queries/analytics/analytics.js +1 -1
  299. package/lib/queries/content/content.js +1 -1
  300. package/lib/queries/crm/crm.js +251 -5
  301. package/lib/queries/events/events.js +1 -1
  302. package/lib/queries/flags/flags.js +1 -1
  303. package/lib/queries/groups/groups.js +1 -1
  304. package/lib/queries/higgsfield/higgsfield.js +1 -1
  305. package/lib/queries/images/images.js +1 -1
  306. package/lib/queries/index.js +1 -1
  307. package/lib/queries/locations/locations.js +1 -1
  308. package/lib/queries/messages/messages.js +1 -1
  309. package/lib/queries/personas/personas.js +1 -1
  310. package/lib/queries/posts/posts.js +1 -1
  311. package/lib/queries/query/query.js +1 -1
  312. package/lib/queries/reactions/reactions.js +1 -1
  313. package/lib/queries/statistics/statistics.js +1 -1
  314. package/lib/queries/subscriptions/subscriptions.js +1 -1
  315. package/lib/queries/tags/tags.js +1 -1
  316. package/lib/queries/users/users.js +1 -1
  317. package/lib/queries/videos/videos.js +1 -1
  318. package/lib/templates/email/layout.js +1 -1
  319. package/lib/templates/email/passwordForgot.js +1 -1
  320. package/lib/templates/email/passwordRecovery.js +1 -1
  321. package/lib/templates/email/verifyEmail.js +1 -1
  322. package/lib/templates/email/welcome.js +1 -1
  323. package/lib/templates/sms/passwordForgot.js +1 -1
  324. package/lib/templates/sms/passwordRecovery.js +1 -1
  325. package/lib/templates/sms/verifyEmail.js +1 -1
  326. package/lib/templates/sms/verifyPhone.js +1 -1
  327. package/lib/templates/sms/welcome.js +1 -1
  328. package/lib/types/analytics.types.js +1 -1
  329. package/lib/types/apps.types.js +1 -1
  330. package/lib/types/arangodb.types.js +1 -1
  331. package/lib/types/auth.types.d.ts +2 -0
  332. package/lib/types/auth.types.js +1 -1
  333. package/lib/types/connections.types.js +1 -1
  334. package/lib/types/content.types.js +1 -1
  335. package/lib/types/conversations.types.js +1 -1
  336. package/lib/types/crm.types.d.ts +6 -0
  337. package/lib/types/crm.types.js +1 -1
  338. package/lib/types/databaseCredentials.types.js +1 -1
  339. package/lib/types/email.types.js +1 -1
  340. package/lib/types/error.types.js +1 -1
  341. package/lib/types/files.types.js +1 -1
  342. package/lib/types/flags.types.js +1 -1
  343. package/lib/types/google.types.js +1 -1
  344. package/lib/types/groups.types.js +1 -1
  345. package/lib/types/images.types.js +1 -1
  346. package/lib/types/index.js +1 -1
  347. package/lib/types/locations.types.js +1 -1
  348. package/lib/types/messages.types.js +1 -1
  349. package/lib/types/notifications.types.js +1 -1
  350. package/lib/types/payments.types.js +1 -1
  351. package/lib/types/personas.types.js +1 -1
  352. package/lib/types/posts.types.js +1 -1
  353. package/lib/types/rum.types.js +1 -1
  354. package/lib/types/statistics.types.js +1 -1
  355. package/lib/types/tags.types.js +1 -1
  356. package/lib/types/users.types.d.ts +2 -0
  357. package/lib/types/users.types.js +1 -1
  358. package/lib/types/videos.types.js +1 -1
  359. package/lib/types/websockets.types.js +1 -1
  360. package/lib/upload.js +1 -1
  361. package/lib/utils/adapterUtils.js +1 -1
  362. package/lib/utils/analyticsUtils.js +1 -1
  363. package/lib/utils/appContext.js +1 -1
  364. package/lib/utils/aqlHelpers.js +1 -1
  365. package/lib/utils/arangodbUtils.js +1 -1
  366. package/lib/utils/authUtils.js +17 -1
  367. package/lib/utils/awsUtils.js +1 -1
  368. package/lib/utils/collectionRegistry.js +1 -1
  369. package/lib/utils/contextUtils.js +1 -1
  370. package/lib/utils/databaseCredentials.js +1 -1
  371. package/lib/utils/dbI18n.example.js +1 -1
  372. package/lib/utils/dbI18n.js +1 -1
  373. package/lib/utils/generationCallback.js +1 -1
  374. package/lib/utils/googleTranslate.js +1 -1
  375. package/lib/utils/graphqlUtils.d.ts +2 -0
  376. package/lib/utils/graphqlUtils.js +1 -1
  377. package/lib/utils/imageUtils.js +1 -1
  378. package/lib/utils/index.js +1 -1
  379. package/lib/utils/languageDetection.js +1 -1
  380. package/lib/utils/localeUtils.example.js +1 -1
  381. package/lib/utils/localeUtils.js +1 -1
  382. package/lib/utils/mediaAccess.js +1 -1
  383. package/lib/utils/middlewareUtils.js +1 -1
  384. package/lib/utils/nodeRealtime.js +1 -1
  385. package/lib/utils/opaqueToken.js +1 -1
  386. package/lib/utils/queryBuilder.js +1 -1
  387. package/lib/utils/schemaUtils.js +1 -1
  388. package/lib/utils/secretDatabase.js +1 -1
  389. package/lib/utils/sessionUtils.js +1 -1
  390. package/lib/utils/stripeUtils.js +1 -1
  391. package/lib/utils/templateUtils.js +1 -1
  392. package/lib/utils/testUtils.js +1 -1
  393. package/lib/utils/translationQueue.example.js +1 -1
  394. package/lib/utils/translationQueue.js +1 -1
  395. package/lib/videoProcessing.js +1 -1
  396. package/package.json +8 -6
@@ -0,0 +1,92 @@
1
+ import type Stripe from 'stripe';
2
+ export interface CrmCanonicalEvent {
3
+ adjustmentId?: string;
4
+ amountMinor?: number;
5
+ campaignId: string;
6
+ currency?: string;
7
+ deleted?: true;
8
+ eventId: string;
9
+ occurredAt: string;
10
+ orderId?: string;
11
+ productId?: string;
12
+ projectId: string;
13
+ revision: number;
14
+ type: 'lead' | 'qualified_lead' | 'lead_won' | 'lead_lost' | 'purchase' | 'refund' | 'order_canceled';
15
+ version: 1;
16
+ }
17
+ export interface CrmCanonicalAssociation {
18
+ appId: string;
19
+ campaignId: string;
20
+ canonicalConsent?: {
21
+ evidenceRef: string;
22
+ expiresAt: number;
23
+ purpose: 'canonical_campaign_outcomes';
24
+ };
25
+ id: string;
26
+ kind: string;
27
+ organizationId: string;
28
+ productId?: string;
29
+ projectId: string;
30
+ revision: number;
31
+ sourceId: string;
32
+ sourceRevision: string;
33
+ status: string;
34
+ }
35
+ export interface CrmCanonicalNativeHistory {
36
+ association: CrmCanonicalAssociation;
37
+ source: {
38
+ revision: string;
39
+ history: {
40
+ at: number;
41
+ id?: string;
42
+ revision?: number;
43
+ stage: string;
44
+ deleted?: boolean;
45
+ }[];
46
+ truncated?: boolean;
47
+ deleted?: boolean;
48
+ };
49
+ suppressed: boolean;
50
+ }
51
+ export declare const crmCanonicalDigest: (value: unknown) => string;
52
+ /** Only real versioned native observations are eligible; legacy timestamps never become fabricated history. */
53
+ export declare const crmCanonicalHistoryEvents: (row: CrmCanonicalNativeHistory, at: number) => {
54
+ events: CrmCanonicalEvent[];
55
+ held: string;
56
+ incomplete: boolean;
57
+ };
58
+ export interface CrmFinancialVerificationSource {
59
+ amountMinor: number;
60
+ chargeId: string;
61
+ currency: string;
62
+ customerId: string;
63
+ invoiceIssuedAt: number;
64
+ invoiceStatus: string;
65
+ invoiceTotalMinor: number;
66
+ nativePaymentAmountMinor: number;
67
+ nativePaymentChargeId: string;
68
+ nativePaymentCurrency: string;
69
+ nativePaymentUserId: string;
70
+ settlementReference: string;
71
+ userId: string;
72
+ }
73
+ export interface CrmVerifiedFinancialProviderEvidence {
74
+ amountMinor: number;
75
+ chargeId: string;
76
+ currency: string;
77
+ occurredAt: number;
78
+ provider: 'stripe';
79
+ refunds: {
80
+ amountMinor: number;
81
+ id: string;
82
+ occurredAt: number;
83
+ }[];
84
+ revision: string;
85
+ }
86
+ type ReadClient = Pick<Stripe, 'charges' | 'customers' | 'refunds'>;
87
+ /** GET-only verification of an existing payment; legal registration alone cannot establish external settlement. */
88
+ export declare const verifyCrmFinancialProviderEvidence: (source: CrmFinancialVerificationSource, at: number, client?: ReadClient) => Promise<{
89
+ evidence?: CrmVerifiedFinancialProviderEvidence;
90
+ held?: string;
91
+ }>;
92
+ export {};
@@ -0,0 +1,104 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { getStripeClient } from '../utils/stripeUtils.js';
3
+ export const crmCanonicalDigest = (value)=>createHash('sha256').update(JSON.stringify(value)).digest('hex');
4
+ const stages = {
5
+ lost: 'lead_lost',
6
+ new: 'lead',
7
+ qualified: 'qualified_lead',
8
+ won: 'lead_won'
9
+ };
10
+ /** Only real versioned native observations are eligible; legacy timestamps never become fabricated history. */ export const crmCanonicalHistoryEvents = (row, at)=>{
11
+ const { association, source } = row;
12
+ if (association.status !== 'active' || row.suppressed || source.deleted || source.revision !== association.sourceRevision || association.canonicalConsent?.purpose !== 'canonical_campaign_outcomes' || !Number.isFinite(association.canonicalConsent.expiresAt) || association.canonicalConsent.expiresAt <= at) {
13
+ return {
14
+ events: [],
15
+ held: 'source_or_consent_withdrawn',
16
+ incomplete: false
17
+ };
18
+ }
19
+ if (source.truncated || source.history.length > 100 || source.history.some((event)=>!event.id || !/^[a-f0-9]{64}$/.test(event.id) || !Number.isSafeInteger(event.revision) || event.revision < 1 || !Number.isSafeInteger(event.at) || event.at > at + 60000 || !Object.hasOwn(stages, event.stage))) {
20
+ return {
21
+ events: [],
22
+ held: 'unversioned_or_truncated_history',
23
+ incomplete: true
24
+ };
25
+ }
26
+ const events = source.history.filter((event)=>!event.deleted).map((event)=>({
27
+ campaignId: association.campaignId,
28
+ eventId: crmCanonicalDigest([
29
+ association.appId,
30
+ association.organizationId,
31
+ association.projectId,
32
+ association.campaignId,
33
+ association.id,
34
+ event.id,
35
+ event.stage
36
+ ]),
37
+ occurredAt: new Date(event.at).toISOString(),
38
+ productId: association.productId,
39
+ projectId: association.projectId,
40
+ revision: event.revision,
41
+ type: stages[event.stage],
42
+ version: 1
43
+ }));
44
+ return {
45
+ events,
46
+ held: undefined,
47
+ incomplete: false
48
+ };
49
+ };
50
+ /** GET-only verification of an existing payment; legal registration alone cannot establish external settlement. */ export const verifyCrmFinancialProviderEvidence = async (source, at, client)=>{
51
+ if (typeof source.nativePaymentCurrency !== 'string' || typeof source.currency !== 'string' || !/^ch_[A-Za-z0-9]{1,160}$/.test(source.chargeId) || !/^cus_[A-Za-z0-9]{1,160}$/.test(source.customerId) || source.settlementReference !== source.chargeId || source.nativePaymentChargeId !== source.chargeId || source.nativePaymentUserId !== source.userId || source.nativePaymentAmountMinor !== source.amountMinor || source.nativePaymentCurrency.toUpperCase() !== source.currency || source.invoiceStatus !== 'issued' || source.invoiceTotalMinor !== source.amountMinor || !Number.isSafeInteger(source.amountMinor) || source.amountMinor <= 0 || !/^[A-Z]{3}$/.test(source.currency) || !Number.isSafeInteger(source.invoiceIssuedAt) || source.invoiceIssuedAt > at) {
52
+ return {
53
+ held: 'native_legal_payment_binding_unverified'
54
+ };
55
+ }
56
+ let charge;
57
+ let customer;
58
+ let refunds;
59
+ try {
60
+ const provider = client || getStripeClient();
61
+ [charge, customer, refunds] = await Promise.all([
62
+ provider.charges.retrieve(source.chargeId),
63
+ provider.customers.retrieve(source.customerId),
64
+ provider.refunds.list({
65
+ charge: source.chargeId,
66
+ limit: 100
67
+ })
68
+ ]);
69
+ } catch {
70
+ return {
71
+ held: 'provider_verification_unavailable'
72
+ };
73
+ }
74
+ const chargeCustomerId = typeof charge.customer === 'string' ? charge.customer : charge.customer?.id;
75
+ if (charge.id !== source.chargeId || chargeCustomerId !== source.customerId || customer.id !== source.customerId || customer.deleted || !('metadata' in customer) || customer.metadata.userId !== source.userId || charge.paid !== true || charge.captured !== true || charge.status !== 'succeeded' || charge.disputed || charge.livemode !== true || charge.amount !== source.amountMinor || charge.amount_captured !== source.amountMinor || charge.currency.toUpperCase() !== source.currency || !Number.isSafeInteger(charge.created) || charge.created * 1000 > at + 60000 || charge.created * 1000 < source.invoiceIssuedAt) {
76
+ return {
77
+ held: 'provider_customer_or_settlement_mismatch'
78
+ };
79
+ }
80
+ if (refunds.has_more || refunds.data.length > 100 || refunds.data.some((refund)=>refund.charge !== charge.id || refund.currency.toUpperCase() !== source.currency || refund.status !== 'succeeded' || !Number.isSafeInteger(refund.amount) || refund.amount <= 0 || !Number.isSafeInteger(refund.created) || refund.created < charge.created || refund.created * 1000 > at + 60000) || new Set(refunds.data.map((refund)=>refund.id)).size !== refunds.data.length || refunds.data.reduce((sum, refund)=>sum + refund.amount, 0) !== charge.amount_refunded || charge.amount_refunded > charge.amount) {
81
+ return {
82
+ held: 'provider_refund_evidence_incomplete'
83
+ };
84
+ }
85
+ const evidence = {
86
+ amountMinor: charge.amount,
87
+ chargeId: charge.id,
88
+ currency: source.currency,
89
+ occurredAt: charge.created * 1000,
90
+ provider: 'stripe',
91
+ refunds: refunds.data.map((refund)=>({
92
+ amountMinor: refund.amount,
93
+ id: refund.id,
94
+ occurredAt: refund.created * 1000
95
+ })).sort((left, right)=>left.id.localeCompare(right.id)),
96
+ revision: ''
97
+ };
98
+ evidence.revision = crmCanonicalDigest(evidence);
99
+ return {
100
+ evidence
101
+ };
102
+ };
103
+
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jcm1DYW5vbmljYWxQb2xpY3kudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjcmVhdGVIYXNofSBmcm9tICdub2RlOmNyeXB0byc7XG5cbmltcG9ydCB7Z2V0U3RyaXBlQ2xpZW50fSBmcm9tICcuLi91dGlscy9zdHJpcGVVdGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIFN0cmlwZSBmcm9tICdzdHJpcGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENybUNhbm9uaWNhbEV2ZW50IHtcbiAgYWRqdXN0bWVudElkPzogc3RyaW5nO1xuICBhbW91bnRNaW5vcj86IG51bWJlcjtcbiAgY2FtcGFpZ25JZDogc3RyaW5nO1xuICBjdXJyZW5jeT86IHN0cmluZztcbiAgZGVsZXRlZD86IHRydWU7XG4gIGV2ZW50SWQ6IHN0cmluZztcbiAgb2NjdXJyZWRBdDogc3RyaW5nO1xuICBvcmRlcklkPzogc3RyaW5nO1xuICBwcm9kdWN0SWQ/OiBzdHJpbmc7XG4gIHByb2plY3RJZDogc3RyaW5nO1xuICByZXZpc2lvbjogbnVtYmVyO1xuICB0eXBlOiAnbGVhZCcgfCAncXVhbGlmaWVkX2xlYWQnIHwgJ2xlYWRfd29uJyB8ICdsZWFkX2xvc3QnIHwgJ3B1cmNoYXNlJyB8ICdyZWZ1bmQnIHwgJ29yZGVyX2NhbmNlbGVkJztcbiAgdmVyc2lvbjogMTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ3JtQ2Fub25pY2FsQXNzb2NpYXRpb24ge1xuICBhcHBJZDogc3RyaW5nO1xuICBjYW1wYWlnbklkOiBzdHJpbmc7XG4gIGNhbm9uaWNhbENvbnNlbnQ/OiB7ZXZpZGVuY2VSZWY6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHB1cnBvc2U6ICdjYW5vbmljYWxfY2FtcGFpZ25fb3V0Y29tZXMnfTtcbiAgaWQ6IHN0cmluZztcbiAga2luZDogc3RyaW5nO1xuICBvcmdhbml6YXRpb25JZDogc3RyaW5nO1xuICBwcm9kdWN0SWQ/OiBzdHJpbmc7XG4gIHByb2plY3RJZDogc3RyaW5nO1xuICByZXZpc2lvbjogbnVtYmVyO1xuICBzb3VyY2VJZDogc3RyaW5nO1xuICBzb3VyY2VSZXZpc2lvbjogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ3JtQ2Fub25pY2FsTmF0aXZlSGlzdG9yeSB7XG4gIGFzc29jaWF0aW9uOiBDcm1DYW5vbmljYWxBc3NvY2lhdGlvbjtcbiAgc291cmNlOiB7cmV2aXNpb246IHN0cmluZzsgaGlzdG9yeToge2F0OiBudW1iZXI7IGlkPzogc3RyaW5nOyByZXZpc2lvbj86IG51bWJlcjsgc3RhZ2U6IHN0cmluZzsgZGVsZXRlZD86IGJvb2xlYW59W107XG4gICAgdHJ1bmNhdGVkPzogYm9vbGVhbjsgZGVsZXRlZD86IGJvb2xlYW47fTtcbiAgc3VwcHJlc3NlZDogYm9vbGVhbjtcbn1cbmV4cG9ydCBjb25zdCBjcm1DYW5vbmljYWxEaWdlc3QgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT5cbiAgY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkuZGlnZXN0KCdoZXgnKTtcbmNvbnN0IHN0YWdlcyA9IHtsb3N0OiAnbGVhZF9sb3N0JywgbmV3OiAnbGVhZCcsIHF1YWxpZmllZDogJ3F1YWxpZmllZF9sZWFkJywgd29uOiAnbGVhZF93b24nfSBhcyBjb25zdDtcbi8qKiBPbmx5IHJlYWwgdmVyc2lvbmVkIG5hdGl2ZSBvYnNlcnZhdGlvbnMgYXJlIGVsaWdpYmxlOyBsZWdhY3kgdGltZXN0YW1wcyBuZXZlciBiZWNvbWUgZmFicmljYXRlZCBoaXN0b3J5LiAqL1xuZXhwb3J0IGNvbnN0IGNybUNhbm9uaWNhbEhpc3RvcnlFdmVudHMgPSAocm93OiBDcm1DYW5vbmljYWxOYXRpdmVIaXN0b3J5LCBhdDogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHthc3NvY2lhdGlvbiwgc291cmNlfSA9IHJvdztcbiAgaWYoYXNzb2NpYXRpb24uc3RhdHVzICE9PSAnYWN0aXZlJyB8fCByb3cuc3VwcHJlc3NlZCB8fCBzb3VyY2UuZGVsZXRlZFxuICAgIHx8IHNvdXJjZS5yZXZpc2lvbiAhPT0gYXNzb2NpYXRpb24uc291cmNlUmV2aXNpb25cbiAgICB8fCBhc3NvY2lhdGlvbi5jYW5vbmljYWxDb25zZW50Py5wdXJwb3NlICE9PSAnY2Fub25pY2FsX2NhbXBhaWduX291dGNvbWVzJ1xuICAgIHx8ICFOdW1iZXIuaXNGaW5pdGUoYXNzb2NpYXRpb24uY2Fub25pY2FsQ29uc2VudC5leHBpcmVzQXQpIHx8IGFzc29jaWF0aW9uLmNhbm9uaWNhbENvbnNlbnQuZXhwaXJlc0F0IDw9IGF0KSB7XG4gICAgcmV0dXJuIHtldmVudHM6IFtdIGFzIENybUNhbm9uaWNhbEV2ZW50W10sIGhlbGQ6ICdzb3VyY2Vfb3JfY29uc2VudF93aXRoZHJhd24nLCBpbmNvbXBsZXRlOiBmYWxzZX07XG4gIH1cbiAgaWYoc291cmNlLnRydW5jYXRlZCB8fCBzb3VyY2UuaGlzdG9yeS5sZW5ndGggPiAxMDAgfHwgc291cmNlLmhpc3Rvcnkuc29tZSgoZXZlbnQpID0+XG4gICAgIWV2ZW50LmlkIHx8ICEvXlthLWYwLTldezY0fSQvLnRlc3QoZXZlbnQuaWQpIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihldmVudC5yZXZpc2lvbikgfHwgZXZlbnQucmV2aXNpb24hIDwgMVxuICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihldmVudC5hdCkgfHwgZXZlbnQuYXQgPiBhdCArIDYwMDAwIHx8ICFPYmplY3QuaGFzT3duKHN0YWdlcywgZXZlbnQuc3RhZ2UpKSkge1xuICAgIHJldHVybiB7ZXZlbnRzOiBbXSBhcyBDcm1DYW5vbmljYWxFdmVudFtdLCBoZWxkOiAndW52ZXJzaW9uZWRfb3JfdHJ1bmNhdGVkX2hpc3RvcnknLCBpbmNvbXBsZXRlOiB0cnVlfTtcbiAgfVxuICBjb25zdCBldmVudHM6IENybUNhbm9uaWNhbEV2ZW50W10gPSBzb3VyY2UuaGlzdG9yeS5maWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQuZGVsZXRlZCkubWFwKChldmVudCkgPT4gKHtcbiAgICBjYW1wYWlnbklkOiBhc3NvY2lhdGlvbi5jYW1wYWlnbklkLFxuICAgIGV2ZW50SWQ6IGNybUNhbm9uaWNhbERpZ2VzdChbYXNzb2NpYXRpb24uYXBwSWQsIGFzc29jaWF0aW9uLm9yZ2FuaXphdGlvbklkLCBhc3NvY2lhdGlvbi5wcm9qZWN0SWQsXG4gICAgICBhc3NvY2lhdGlvbi5jYW1wYWlnbklkLCBhc3NvY2lhdGlvbi5pZCwgZXZlbnQuaWQsIGV2ZW50LnN0YWdlXSksIG9jY3VycmVkQXQ6IG5ldyBEYXRlKGV2ZW50LmF0KS50b0lTT1N0cmluZygpLFxuICAgIHByb2R1Y3RJZDogYXNzb2NpYXRpb24ucHJvZHVjdElkLCBwcm9qZWN0SWQ6IGFzc29jaWF0aW9uLnByb2plY3RJZCwgcmV2aXNpb246IGV2ZW50LnJldmlzaW9uISxcbiAgICB0eXBlOiBzdGFnZXNbZXZlbnQuc3RhZ2UgYXMga2V5b2YgdHlwZW9mIHN0YWdlc10sIHZlcnNpb246IDF9KSk7XG4gIHJldHVybiB7ZXZlbnRzLCBoZWxkOiB1bmRlZmluZWQsIGluY29tcGxldGU6IGZhbHNlfTtcbn07XG5leHBvcnQgaW50ZXJmYWNlIENybUZpbmFuY2lhbFZlcmlmaWNhdGlvblNvdXJjZSB7XG4gIGFtb3VudE1pbm9yOiBudW1iZXI7XG4gIGNoYXJnZUlkOiBzdHJpbmc7XG4gIGN1cnJlbmN5OiBzdHJpbmc7XG4gIGN1c3RvbWVySWQ6IHN0cmluZztcbiAgaW52b2ljZUlzc3VlZEF0OiBudW1iZXI7XG4gIGludm9pY2VTdGF0dXM6IHN0cmluZztcbiAgaW52b2ljZVRvdGFsTWlub3I6IG51bWJlcjtcbiAgbmF0aXZlUGF5bWVudEFtb3VudE1pbm9yOiBudW1iZXI7XG4gIG5hdGl2ZVBheW1lbnRDaGFyZ2VJZDogc3RyaW5nO1xuICBuYXRpdmVQYXltZW50Q3VycmVuY3k6IHN0cmluZztcbiAgbmF0aXZlUGF5bWVudFVzZXJJZDogc3RyaW5nO1xuICBzZXR0bGVtZW50UmVmZXJlbmNlOiBzdHJpbmc7XG4gIHVzZXJJZDogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBDcm1WZXJpZmllZEZpbmFuY2lhbFByb3ZpZGVyRXZpZGVuY2Uge1xuICBhbW91bnRNaW5vcjogbnVtYmVyO1xuICBjaGFyZ2VJZDogc3RyaW5nO1xuICBjdXJyZW5jeTogc3RyaW5nO1xuICBvY2N1cnJlZEF0OiBudW1iZXI7XG4gIHByb3ZpZGVyOiAnc3RyaXBlJztcbiAgcmVmdW5kczoge2Ftb3VudE1pbm9yOiBudW1iZXI7IGlkOiBzdHJpbmc7IG9jY3VycmVkQXQ6IG51bWJlcn1bXTtcbiAgcmV2aXNpb246IHN0cmluZztcbn1cbnR5cGUgUmVhZENsaWVudCA9IFBpY2s8U3RyaXBlLCAnY2hhcmdlcycgfCAnY3VzdG9tZXJzJyB8ICdyZWZ1bmRzJz47XG4vKiogR0VULW9ubHkgdmVyaWZpY2F0aW9uIG9mIGFuIGV4aXN0aW5nIHBheW1lbnQ7IGxlZ2FsIHJlZ2lzdHJhdGlvbiBhbG9uZSBjYW5ub3QgZXN0YWJsaXNoIGV4dGVybmFsIHNldHRsZW1lbnQuICovXG5leHBvcnQgY29uc3QgdmVyaWZ5Q3JtRmluYW5jaWFsUHJvdmlkZXJFdmlkZW5jZSA9IGFzeW5jIChcbiAgc291cmNlOiBDcm1GaW5hbmNpYWxWZXJpZmljYXRpb25Tb3VyY2UsIGF0OiBudW1iZXIsIGNsaWVudD86IFJlYWRDbGllbnRcbik6IFByb21pc2U8e2V2aWRlbmNlPzogQ3JtVmVyaWZpZWRGaW5hbmNpYWxQcm92aWRlckV2aWRlbmNlOyBoZWxkPzogc3RyaW5nfT4gPT4ge1xuICBpZih0eXBlb2Ygc291cmNlLm5hdGl2ZVBheW1lbnRDdXJyZW5jeSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHNvdXJjZS5jdXJyZW5jeSAhPT0gJ3N0cmluZydcbiAgICB8fCAhL15jaF9bQS1aYS16MC05XXsxLDE2MH0kLy50ZXN0KHNvdXJjZS5jaGFyZ2VJZCkgfHwgIS9eY3VzX1tBLVphLXowLTldezEsMTYwfSQvLnRlc3Qoc291cmNlLmN1c3RvbWVySWQpXG4gICAgfHwgc291cmNlLnNldHRsZW1lbnRSZWZlcmVuY2UgIT09IHNvdXJjZS5jaGFyZ2VJZCB8fCBzb3VyY2UubmF0aXZlUGF5bWVudENoYXJnZUlkICE9PSBzb3VyY2UuY2hhcmdlSWRcbiAgICB8fCBzb3VyY2UubmF0aXZlUGF5bWVudFVzZXJJZCAhPT0gc291cmNlLnVzZXJJZCB8fCBzb3VyY2UubmF0aXZlUGF5bWVudEFtb3VudE1pbm9yICE9PSBzb3VyY2UuYW1vdW50TWlub3JcbiAgICB8fCBzb3VyY2UubmF0aXZlUGF5bWVudEN1cnJlbmN5LnRvVXBwZXJDYXNlKCkgIT09IHNvdXJjZS5jdXJyZW5jeSB8fCBzb3VyY2UuaW52b2ljZVN0YXR1cyAhPT0gJ2lzc3VlZCdcbiAgICB8fCBzb3VyY2UuaW52b2ljZVRvdGFsTWlub3IgIT09IHNvdXJjZS5hbW91bnRNaW5vciB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIoc291cmNlLmFtb3VudE1pbm9yKVxuICAgIHx8IHNvdXJjZS5hbW91bnRNaW5vciA8PSAwIHx8ICEvXltBLVpdezN9JC8udGVzdChzb3VyY2UuY3VycmVuY3kpXG4gICAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHNvdXJjZS5pbnZvaWNlSXNzdWVkQXQpIHx8IHNvdXJjZS5pbnZvaWNlSXNzdWVkQXQgPiBhdCkge1xuICAgIHJldHVybiB7aGVsZDogJ25hdGl2ZV9sZWdhbF9wYXltZW50X2JpbmRpbmdfdW52ZXJpZmllZCd9O1xuICB9XG4gIGxldCBjaGFyZ2U6IFN0cmlwZS5DaGFyZ2U7XG4gIGxldCBjdXN0b21lcjogU3RyaXBlLkN1c3RvbWVyIHwgU3RyaXBlLkRlbGV0ZWRDdXN0b21lcjtcbiAgbGV0IHJlZnVuZHM6IFN0cmlwZS5BcGlMaXN0PFN0cmlwZS5SZWZ1bmQ+O1xuICB0cnkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gY2xpZW50IHx8IGdldFN0cmlwZUNsaWVudCgpO1xuICAgIFtjaGFyZ2UsIGN1c3RvbWVyLCByZWZ1bmRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtwcm92aWRlci5jaGFyZ2VzLnJldHJpZXZlKHNvdXJjZS5jaGFyZ2VJZCksXG4gICAgICBwcm92aWRlci5jdXN0b21lcnMucmV0cmlldmUoc291cmNlLmN1c3RvbWVySWQpLCBwcm92aWRlci5yZWZ1bmRzLmxpc3Qoe2NoYXJnZTogc291cmNlLmNoYXJnZUlkLCBsaW1pdDogMTAwfSldKTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4ge2hlbGQ6ICdwcm92aWRlcl92ZXJpZmljYXRpb25fdW5hdmFpbGFibGUnfTtcbiAgfVxuICBjb25zdCBjaGFyZ2VDdXN0b21lcklkID0gdHlwZW9mIGNoYXJnZS5jdXN0b21lciA9PT0gJ3N0cmluZycgPyBjaGFyZ2UuY3VzdG9tZXIgOiBjaGFyZ2UuY3VzdG9tZXI/LmlkO1xuICBpZihjaGFyZ2UuaWQgIT09IHNvdXJjZS5jaGFyZ2VJZCB8fCBjaGFyZ2VDdXN0b21lcklkICE9PSBzb3VyY2UuY3VzdG9tZXJJZCB8fCBjdXN0b21lci5pZCAhPT0gc291cmNlLmN1c3RvbWVySWRcbiAgICB8fCBjdXN0b21lci5kZWxldGVkIHx8ICEoJ21ldGFkYXRhJyBpbiBjdXN0b21lcikgfHwgY3VzdG9tZXIubWV0YWRhdGEudXNlcklkICE9PSBzb3VyY2UudXNlcklkXG4gICAgICB8fCBjaGFyZ2UucGFpZCAhPT0gdHJ1ZSB8fCBjaGFyZ2UuY2FwdHVyZWQgIT09IHRydWVcbiAgICB8fCBjaGFyZ2Uuc3RhdHVzICE9PSAnc3VjY2VlZGVkJyB8fCBjaGFyZ2UuZGlzcHV0ZWQgfHwgY2hhcmdlLmxpdmVtb2RlICE9PSB0cnVlXG4gICAgfHwgY2hhcmdlLmFtb3VudCAhPT0gc291cmNlLmFtb3VudE1pbm9yIHx8IGNoYXJnZS5hbW91bnRfY2FwdHVyZWQgIT09IHNvdXJjZS5hbW91bnRNaW5vclxuICAgIHx8IGNoYXJnZS5jdXJyZW5jeS50b1VwcGVyQ2FzZSgpICE9PSBzb3VyY2UuY3VycmVuY3kgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGNoYXJnZS5jcmVhdGVkKVxuICAgIHx8IGNoYXJnZS5jcmVhdGVkICogMTAwMCA+IGF0ICsgNjAwMDAgfHwgY2hhcmdlLmNyZWF0ZWQgKiAxMDAwIDwgc291cmNlLmludm9pY2VJc3N1ZWRBdCkge1xuICAgIHJldHVybiB7aGVsZDogJ3Byb3ZpZGVyX2N1c3RvbWVyX29yX3NldHRsZW1lbnRfbWlzbWF0Y2gnfTtcbiAgfVxuICBpZihyZWZ1bmRzLmhhc19tb3JlIHx8IHJlZnVuZHMuZGF0YS5sZW5ndGggPiAxMDAgfHwgcmVmdW5kcy5kYXRhLnNvbWUoKHJlZnVuZCkgPT5cbiAgICByZWZ1bmQuY2hhcmdlICE9PSBjaGFyZ2UuaWQgfHwgcmVmdW5kLmN1cnJlbmN5LnRvVXBwZXJDYXNlKCkgIT09IHNvdXJjZS5jdXJyZW5jeSB8fCByZWZ1bmQuc3RhdHVzICE9PSAnc3VjY2VlZGVkJ1xuICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZWZ1bmQuYW1vdW50KSB8fCByZWZ1bmQuYW1vdW50IDw9IDAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlZnVuZC5jcmVhdGVkKVxuICAgIHx8IHJlZnVuZC5jcmVhdGVkIDwgY2hhcmdlLmNyZWF0ZWQgfHwgcmVmdW5kLmNyZWF0ZWQgKiAxMDAwID4gYXQgKyA2MDAwMClcbiAgICB8fCBuZXcgU2V0KHJlZnVuZHMuZGF0YS5tYXAoKHJlZnVuZCkgPT4gcmVmdW5kLmlkKSkuc2l6ZSAhPT0gcmVmdW5kcy5kYXRhLmxlbmd0aFxuICAgIHx8IHJlZnVuZHMuZGF0YS5yZWR1Y2UoKHN1bSwgcmVmdW5kKSA9PiBzdW0gKyByZWZ1bmQuYW1vdW50LCAwKSAhPT0gY2hhcmdlLmFtb3VudF9yZWZ1bmRlZFxuICAgIHx8IGNoYXJnZS5hbW91bnRfcmVmdW5kZWQgPiBjaGFyZ2UuYW1vdW50KSB7XG4gICAgcmV0dXJuIHtoZWxkOiAncHJvdmlkZXJfcmVmdW5kX2V2aWRlbmNlX2luY29tcGxldGUnfTtcbiAgfVxuICBjb25zdCBldmlkZW5jZTogQ3JtVmVyaWZpZWRGaW5hbmNpYWxQcm92aWRlckV2aWRlbmNlID0ge2Ftb3VudE1pbm9yOiBjaGFyZ2UuYW1vdW50LCBjaGFyZ2VJZDogY2hhcmdlLmlkLFxuICAgIGN1cnJlbmN5OiBzb3VyY2UuY3VycmVuY3ksIG9jY3VycmVkQXQ6IGNoYXJnZS5jcmVhdGVkICogMTAwMCwgcHJvdmlkZXI6ICdzdHJpcGUnLFxuICAgIHJlZnVuZHM6IHJlZnVuZHMuZGF0YS5tYXAoKHJlZnVuZCkgPT4gKHthbW91bnRNaW5vcjogcmVmdW5kLmFtb3VudCwgaWQ6IHJlZnVuZC5pZCxcbiAgICAgIG9jY3VycmVkQXQ6IHJlZnVuZC5jcmVhdGVkICogMTAwMH0pKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmlkLmxvY2FsZUNvbXBhcmUocmlnaHQuaWQpKSwgcmV2aXNpb246ICcnfTtcbiAgZXZpZGVuY2UucmV2aXNpb24gPSBjcm1DYW5vbmljYWxEaWdlc3QoZXZpZGVuY2UpO1xuICByZXR1cm4ge2V2aWRlbmNlfTtcbn07XG4iXSwibmFtZXMiOlsiY3JlYXRlSGFzaCIsImdldFN0cmlwZUNsaWVudCIsImNybUNhbm9uaWNhbERpZ2VzdCIsInZhbHVlIiwidXBkYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpZ2VzdCIsInN0YWdlcyIsImxvc3QiLCJuZXciLCJxdWFsaWZpZWQiLCJ3b24iLCJjcm1DYW5vbmljYWxIaXN0b3J5RXZlbnRzIiwicm93IiwiYXQiLCJhc3NvY2lhdGlvbiIsInNvdXJjZSIsInN0YXR1cyIsInN1cHByZXNzZWQiLCJkZWxldGVkIiwicmV2aXNpb24iLCJzb3VyY2VSZXZpc2lvbiIsImNhbm9uaWNhbENvbnNlbnQiLCJwdXJwb3NlIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJleHBpcmVzQXQiLCJldmVudHMiLCJoZWxkIiwiaW5jb21wbGV0ZSIsInRydW5jYXRlZCIsImhpc3RvcnkiLCJsZW5ndGgiLCJzb21lIiwiZXZlbnQiLCJpZCIsInRlc3QiLCJpc1NhZmVJbnRlZ2VyIiwiT2JqZWN0IiwiaGFzT3duIiwic3RhZ2UiLCJmaWx0ZXIiLCJtYXAiLCJjYW1wYWlnbklkIiwiZXZlbnRJZCIsImFwcElkIiwib3JnYW5pemF0aW9uSWQiLCJwcm9qZWN0SWQiLCJvY2N1cnJlZEF0IiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwicHJvZHVjdElkIiwidHlwZSIsInZlcnNpb24iLCJ1bmRlZmluZWQiLCJ2ZXJpZnlDcm1GaW5hbmNpYWxQcm92aWRlckV2aWRlbmNlIiwiY2xpZW50IiwibmF0aXZlUGF5bWVudEN1cnJlbmN5IiwiY3VycmVuY3kiLCJjaGFyZ2VJZCIsImN1c3RvbWVySWQiLCJzZXR0bGVtZW50UmVmZXJlbmNlIiwibmF0aXZlUGF5bWVudENoYXJnZUlkIiwibmF0aXZlUGF5bWVudFVzZXJJZCIsInVzZXJJZCIsIm5hdGl2ZVBheW1lbnRBbW91bnRNaW5vciIsImFtb3VudE1pbm9yIiwidG9VcHBlckNhc2UiLCJpbnZvaWNlU3RhdHVzIiwiaW52b2ljZVRvdGFsTWlub3IiLCJpbnZvaWNlSXNzdWVkQXQiLCJjaGFyZ2UiLCJjdXN0b21lciIsInJlZnVuZHMiLCJwcm92aWRlciIsIlByb21pc2UiLCJhbGwiLCJjaGFyZ2VzIiwicmV0cmlldmUiLCJjdXN0b21lcnMiLCJsaXN0IiwibGltaXQiLCJjaGFyZ2VDdXN0b21lcklkIiwibWV0YWRhdGEiLCJwYWlkIiwiY2FwdHVyZWQiLCJkaXNwdXRlZCIsImxpdmVtb2RlIiwiYW1vdW50IiwiYW1vdW50X2NhcHR1cmVkIiwiY3JlYXRlZCIsImhhc19tb3JlIiwiZGF0YSIsInJlZnVuZCIsIlNldCIsInNpemUiLCJyZWR1Y2UiLCJzdW0iLCJhbW91bnRfcmVmdW5kZWQiLCJldmlkZW5jZSIsInNvcnQiLCJsZWZ0IiwicmlnaHQiLCJsb2NhbGVDb21wYXJlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFRQSxVQUFVLFFBQU8sY0FBYztBQUV2QyxTQUFRQyxlQUFlLFFB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
@@ -0,0 +1,72 @@
1
+ import { useDb } from '../utils/arangodbUtils.js';
2
+ import { authorizeCrmExecutionGrant } from './crmExecution.js';
3
+ import type { ApiContext } from '../types/auth.types.js';
4
+ import type { CrmCheckoutRecoveryBinding } from './crmCheckoutRecoveryPolicy.js';
5
+ type Db = ReturnType<typeof useDb>;
6
+ type Grant = Awaited<ReturnType<typeof authorizeCrmExecutionGrant>>;
7
+ export interface CrmCheckoutRecoveryCandidate {
8
+ appId: string;
9
+ campaignId: string;
10
+ email: string;
11
+ expiresAt: string;
12
+ id: string;
13
+ observedAt: string;
14
+ organizationId: string;
15
+ projectId: string;
16
+ reason: 'verified_unrecovered_checkout';
17
+ recoveryLinkHash?: string;
18
+ revision: string;
19
+ sourceId: string;
20
+ targetId: string;
21
+ targetRevision: string;
22
+ }
23
+ interface Candidate extends CrmCheckoutRecoveryCandidate {
24
+ _key: string;
25
+ bindingId: string;
26
+ bindingRevision: string;
27
+ proofRevision: string;
28
+ }
29
+ /** Only the authenticated customer can record this independent purpose; administrators cannot imply consent. */
30
+ export declare const recordCrmCheckoutRecoveryConsent: (context: ApiContext, input: {
31
+ appId: string;
32
+ consent: boolean;
33
+ expectedUserRevision: string;
34
+ expiresAt: number;
35
+ }, now?: () => number) => Promise<boolean>;
36
+ /** Registration binds verified existing source identities; it neither grants consent nor sends a message. */
37
+ export declare const registerCrmCheckoutRecoveryBinding: (context: ApiContext, input: {
38
+ appId: string;
39
+ associationId: string;
40
+ checkoutId: string;
41
+ expectedAssociationRevision: string;
42
+ expectedUserRevision: string;
43
+ sourceId: string;
44
+ userId: string;
45
+ }, now?: () => number, request?: (url: string, params?: any, options?: import("@nlabs/rip-hunter").HunterOptionsType) => Promise<any>) => Promise<{
46
+ id: string;
47
+ status: 'registered';
48
+ }>;
49
+ /** Every review and execution repeats protected source and native identity checks. */
50
+ export declare const validateCrmCheckoutRecoveryCandidate: (db: Db, grant: Grant, value: CrmCheckoutRecoveryBinding, now?: () => number, query?: any, request?: (url: string, params?: any, options?: import("@nlabs/rip-hunter").HunterOptionsType) => Promise<any>, receiptId?: string) => Promise<Candidate & {
51
+ verifiedRecoveryUrl?: string;
52
+ }>;
53
+ export declare const generateCrmCheckoutRecoveryCandidates: (context: ApiContext, input: {
54
+ appId: string;
55
+ campaignId: string;
56
+ limit: number;
57
+ organizationId: string;
58
+ projectId: string;
59
+ sourceId: string;
60
+ }, now?: () => number, request?: (url: string, params?: any, options?: import("@nlabs/rip-hunter").HunterOptionsType) => Promise<any>) => Promise<{
61
+ appId: string;
62
+ campaignId: string;
63
+ candidates: CrmCheckoutRecoveryCandidate[];
64
+ generatedAt: string;
65
+ held: Record<string, number>;
66
+ organizationId: string;
67
+ projectId: string;
68
+ schemaVersion: string;
69
+ sourceId: string;
70
+ truncated: boolean;
71
+ }>;
72
+ export {};