@baruk/core 0.3.1 → 0.4.2

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 (696) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +85 -0
  3. package/dist/auth/password-reset.d.ts +30 -1
  4. package/dist/auth/password-reset.d.ts.map +1 -1
  5. package/dist/auth/password-reset.js +139 -11
  6. package/dist/auth/password-reset.js.map +1 -1
  7. package/dist/auth/service.d.ts +39 -2
  8. package/dist/auth/service.d.ts.map +1 -1
  9. package/dist/auth/service.js +75 -10
  10. package/dist/auth/service.js.map +1 -1
  11. package/dist/billing/ar-repository.d.ts +334 -0
  12. package/dist/billing/ar-repository.d.ts.map +1 -0
  13. package/dist/billing/ar-repository.js +707 -0
  14. package/dist/billing/ar-repository.js.map +1 -0
  15. package/dist/billing/auto-generation.d.ts +87 -0
  16. package/dist/billing/auto-generation.d.ts.map +1 -0
  17. package/dist/billing/auto-generation.js +181 -0
  18. package/dist/billing/auto-generation.js.map +1 -0
  19. package/dist/billing/live-guard.d.ts +64 -0
  20. package/dist/billing/live-guard.d.ts.map +1 -0
  21. package/dist/billing/live-guard.js +68 -0
  22. package/dist/billing/live-guard.js.map +1 -0
  23. package/dist/billing/payment-means-catalog.d.ts +17 -0
  24. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  25. package/dist/billing/payment-means-catalog.js +21 -0
  26. package/dist/billing/payment-means-catalog.js.map +1 -0
  27. package/dist/billing/payment-means.d.ts +38 -0
  28. package/dist/billing/payment-means.d.ts.map +1 -0
  29. package/dist/billing/payment-means.js +29 -0
  30. package/dist/billing/payment-means.js.map +1 -0
  31. package/dist/billing/payment-rail.d.ts +118 -0
  32. package/dist/billing/payment-rail.d.ts.map +1 -0
  33. package/dist/billing/payment-rail.js +295 -0
  34. package/dist/billing/payment-rail.js.map +1 -0
  35. package/dist/billing/provider/asaas.d.ts +46 -1
  36. package/dist/billing/provider/asaas.d.ts.map +1 -1
  37. package/dist/billing/provider/asaas.js +194 -14
  38. package/dist/billing/provider/asaas.js.map +1 -1
  39. package/dist/billing/provider/manual.js +1 -1
  40. package/dist/billing/provider/manual.js.map +1 -1
  41. package/dist/billing/provider/types.d.ts +115 -8
  42. package/dist/billing/provider/types.d.ts.map +1 -1
  43. package/dist/billing/provider-account.d.ts +89 -0
  44. package/dist/billing/provider-account.d.ts.map +1 -0
  45. package/dist/billing/provider-account.js +161 -0
  46. package/dist/billing/provider-account.js.map +1 -0
  47. package/dist/billing/provider-onboarding.d.ts +67 -0
  48. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  49. package/dist/billing/provider-onboarding.js +234 -0
  50. package/dist/billing/provider-onboarding.js.map +1 -0
  51. package/dist/billing/receivable.d.ts +5 -1
  52. package/dist/billing/receivable.d.ts.map +1 -1
  53. package/dist/billing/reconcile.d.ts +58 -0
  54. package/dist/billing/reconcile.d.ts.map +1 -0
  55. package/dist/billing/reconcile.js +138 -0
  56. package/dist/billing/reconcile.js.map +1 -0
  57. package/dist/billing/repository.d.ts +90 -1
  58. package/dist/billing/repository.d.ts.map +1 -1
  59. package/dist/billing/repository.js +148 -19
  60. package/dist/billing/repository.js.map +1 -1
  61. package/dist/cjs/auth/password-reset.js +141 -11
  62. package/dist/cjs/auth/password-reset.js.map +1 -1
  63. package/dist/cjs/auth/service.js +75 -9
  64. package/dist/cjs/auth/service.js.map +1 -1
  65. package/dist/cjs/billing/ar-repository.js +728 -0
  66. package/dist/cjs/billing/ar-repository.js.map +1 -0
  67. package/dist/cjs/billing/auto-generation.js +186 -0
  68. package/dist/cjs/billing/auto-generation.js.map +1 -0
  69. package/dist/cjs/billing/live-guard.js +72 -0
  70. package/dist/cjs/billing/live-guard.js.map +1 -0
  71. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  72. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  73. package/dist/cjs/billing/payment-means.js +33 -0
  74. package/dist/cjs/billing/payment-means.js.map +1 -0
  75. package/dist/cjs/billing/payment-rail.js +301 -0
  76. package/dist/cjs/billing/payment-rail.js.map +1 -0
  77. package/dist/cjs/billing/provider/asaas.js +194 -14
  78. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  79. package/dist/cjs/billing/provider/manual.js +1 -1
  80. package/dist/cjs/billing/provider/manual.js.map +1 -1
  81. package/dist/cjs/billing/provider-account.js +170 -0
  82. package/dist/cjs/billing/provider-account.js.map +1 -0
  83. package/dist/cjs/billing/provider-onboarding.js +239 -0
  84. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  85. package/dist/cjs/billing/reconcile.js +143 -0
  86. package/dist/cjs/billing/reconcile.js.map +1 -0
  87. package/dist/cjs/billing/repository.js +150 -18
  88. package/dist/cjs/billing/repository.js.map +1 -1
  89. package/dist/cjs/clients/repository.js +96 -20
  90. package/dist/cjs/clients/repository.js.map +1 -1
  91. package/dist/cjs/collection/branding.js +140 -0
  92. package/dist/cjs/collection/branding.js.map +1 -0
  93. package/dist/cjs/collection/channel-accounts.js +137 -0
  94. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  95. package/dist/cjs/collection/channel.js +17 -0
  96. package/dist/cjs/collection/channel.js.map +1 -0
  97. package/dist/cjs/collection/communication-bridge.js +140 -0
  98. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  99. package/dist/cjs/collection/communication-runtime.js +193 -0
  100. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  101. package/dist/cjs/collection/consent-repository.js +84 -0
  102. package/dist/cjs/collection/consent-repository.js.map +1 -0
  103. package/dist/cjs/collection/copy.js +125 -0
  104. package/dist/cjs/collection/copy.js.map +1 -0
  105. package/dist/cjs/collection/delivery-callback.js +151 -0
  106. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  107. package/dist/cjs/collection/email-layout.js +252 -0
  108. package/dist/cjs/collection/email-layout.js.map +1 -0
  109. package/dist/cjs/collection/engine.js +414 -0
  110. package/dist/cjs/collection/engine.js.map +1 -0
  111. package/dist/cjs/collection/format.js +76 -0
  112. package/dist/cjs/collection/format.js.map +1 -0
  113. package/dist/cjs/collection/payment-block.js +3 -0
  114. package/dist/cjs/collection/payment-block.js.map +1 -0
  115. package/dist/cjs/collection/policy.js +147 -0
  116. package/dist/cjs/collection/policy.js.map +1 -0
  117. package/dist/cjs/collection/repository.js +260 -0
  118. package/dist/cjs/collection/repository.js.map +1 -0
  119. package/dist/cjs/collection/subject.js +104 -0
  120. package/dist/cjs/collection/subject.js.map +1 -0
  121. package/dist/cjs/collection/template-catalog.js +165 -0
  122. package/dist/cjs/collection/template-catalog.js.map +1 -0
  123. package/dist/cjs/collection/template.js +78 -0
  124. package/dist/cjs/collection/template.js.map +1 -0
  125. package/dist/cjs/communication/adapters/email.js +132 -0
  126. package/dist/cjs/communication/adapters/email.js.map +1 -0
  127. package/dist/cjs/communication/adapters/sms.js +127 -0
  128. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  129. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  130. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  131. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  132. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  133. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  134. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  135. package/dist/cjs/communication/audit.js +61 -0
  136. package/dist/cjs/communication/audit.js.map +1 -0
  137. package/dist/cjs/communication/capabilities.js +76 -0
  138. package/dist/cjs/communication/capabilities.js.map +1 -0
  139. package/dist/cjs/communication/channel.js +53 -0
  140. package/dist/cjs/communication/channel.js.map +1 -0
  141. package/dist/cjs/communication/claim.js +228 -0
  142. package/dist/cjs/communication/claim.js.map +1 -0
  143. package/dist/cjs/communication/consent.js +43 -0
  144. package/dist/cjs/communication/consent.js.map +1 -0
  145. package/dist/cjs/communication/context.js +45 -0
  146. package/dist/cjs/communication/context.js.map +1 -0
  147. package/dist/cjs/communication/credentials.js +121 -0
  148. package/dist/cjs/communication/credentials.js.map +1 -0
  149. package/dist/cjs/communication/dry-run-scenario.js +161 -0
  150. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  151. package/dist/cjs/communication/dry-run.js +97 -0
  152. package/dist/cjs/communication/dry-run.js.map +1 -0
  153. package/dist/cjs/communication/engine.js +483 -0
  154. package/dist/cjs/communication/engine.js.map +1 -0
  155. package/dist/cjs/communication/graph.js +50 -0
  156. package/dist/cjs/communication/graph.js.map +1 -0
  157. package/dist/cjs/communication/idempotency.js +26 -0
  158. package/dist/cjs/communication/idempotency.js.map +1 -0
  159. package/dist/cjs/communication/identity.js +110 -0
  160. package/dist/cjs/communication/identity.js.map +1 -0
  161. package/dist/cjs/communication/index.js +135 -0
  162. package/dist/cjs/communication/index.js.map +1 -0
  163. package/dist/cjs/communication/onboarding.js +297 -0
  164. package/dist/cjs/communication/onboarding.js.map +1 -0
  165. package/dist/cjs/communication/policy.js +16 -0
  166. package/dist/cjs/communication/policy.js.map +1 -0
  167. package/dist/cjs/communication/routing.js +77 -0
  168. package/dist/cjs/communication/routing.js.map +1 -0
  169. package/dist/cjs/communication/sender-profile.js +128 -0
  170. package/dist/cjs/communication/sender-profile.js.map +1 -0
  171. package/dist/cjs/communication/status.js +86 -0
  172. package/dist/cjs/communication/status.js.map +1 -0
  173. package/dist/cjs/communication/stores/onboarding.js +135 -0
  174. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  175. package/dist/cjs/communication/stores/postgres.js +458 -0
  176. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  177. package/dist/cjs/communication/stores/routing.js +334 -0
  178. package/dist/cjs/communication/stores/routing.js.map +1 -0
  179. package/dist/cjs/communication/stores/secrets.js +126 -0
  180. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  181. package/dist/cjs/communication/template-provider.js +22 -0
  182. package/dist/cjs/communication/template-provider.js.map +1 -0
  183. package/dist/cjs/communication/template.js +63 -0
  184. package/dist/cjs/communication/template.js.map +1 -0
  185. package/dist/cjs/communication/webhook-subscription.js +258 -0
  186. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  187. package/dist/cjs/communication/webhook.js +292 -0
  188. package/dist/cjs/communication/webhook.js.map +1 -0
  189. package/dist/cjs/competence/repository.js +309 -0
  190. package/dist/cjs/competence/repository.js.map +1 -0
  191. package/dist/cjs/contacts/phone.js +192 -0
  192. package/dist/cjs/contacts/phone.js.map +1 -0
  193. package/dist/cjs/db/seed-catalog.js +48 -0
  194. package/dist/cjs/db/seed-catalog.js.map +1 -0
  195. package/dist/cjs/db/seed.js +15 -7
  196. package/dist/cjs/db/seed.js.map +1 -1
  197. package/dist/cjs/documents/repository.js +244 -0
  198. package/dist/cjs/documents/repository.js.map +1 -0
  199. package/dist/cjs/documents/requests.js +136 -0
  200. package/dist/cjs/documents/requests.js.map +1 -0
  201. package/dist/cjs/index.js +406 -39
  202. package/dist/cjs/index.js.map +1 -1
  203. package/dist/cjs/legal/documents.js +125 -3
  204. package/dist/cjs/legal/documents.js.map +1 -1
  205. package/dist/cjs/legal/types.js +1 -0
  206. package/dist/cjs/legal/types.js.map +1 -1
  207. package/dist/cjs/mail/auth-templates.js +29 -0
  208. package/dist/cjs/mail/auth-templates.js.map +1 -0
  209. package/dist/cjs/mail/dedup-store.js +12 -51
  210. package/dist/cjs/mail/dedup-store.js.map +1 -1
  211. package/dist/cjs/mail/index.js +16 -4
  212. package/dist/cjs/mail/index.js.map +1 -1
  213. package/dist/cjs/mail/provider.js +12 -247
  214. package/dist/cjs/mail/provider.js.map +1 -1
  215. package/dist/cjs/mail/resend.js +14 -18
  216. package/dist/cjs/mail/resend.js.map +1 -1
  217. package/dist/cjs/mail/sender-resolver.js +12 -11
  218. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  219. package/dist/cjs/mail/template-renderer.js +11 -16
  220. package/dist/cjs/mail/template-renderer.js.map +1 -1
  221. package/dist/cjs/mail/transactional-outbound.js +117 -0
  222. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  223. package/dist/cjs/mail/types.js +8 -35
  224. package/dist/cjs/mail/types.js.map +1 -1
  225. package/dist/cjs/portal/provisioning.js +144 -0
  226. package/dist/cjs/portal/provisioning.js.map +1 -0
  227. package/dist/cjs/pricing-engine/canonical.js +42 -0
  228. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  229. package/dist/cjs/pricing-engine/errors.js +6 -1
  230. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  231. package/dist/cjs/pricing-engine/index.js +12 -1
  232. package/dist/cjs/pricing-engine/index.js.map +1 -1
  233. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  234. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  235. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  236. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  237. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  238. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  239. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  240. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  241. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  242. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  243. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  244. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  245. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  246. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  247. package/dist/cjs/rbac/authorize.js +28 -0
  248. package/dist/cjs/rbac/authorize.js.map +1 -1
  249. package/dist/cjs/rbac/catalog.js +67 -1
  250. package/dist/cjs/rbac/catalog.js.map +1 -1
  251. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  252. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  253. package/dist/cjs/rbac/workload.js +191 -0
  254. package/dist/cjs/rbac/workload.js.map +1 -0
  255. package/dist/cjs/storage/checksum.js +15 -0
  256. package/dist/cjs/storage/checksum.js.map +1 -0
  257. package/dist/cjs/storage/key.js +72 -0
  258. package/dist/cjs/storage/key.js.map +1 -0
  259. package/dist/cjs/storage/local.js +100 -0
  260. package/dist/cjs/storage/local.js.map +1 -0
  261. package/dist/cjs/storage/r2.js +181 -0
  262. package/dist/cjs/storage/r2.js.map +1 -0
  263. package/dist/cjs/storage/registry.js +41 -0
  264. package/dist/cjs/storage/registry.js.map +1 -0
  265. package/dist/cjs/storage/types.js +50 -0
  266. package/dist/cjs/storage/types.js.map +1 -0
  267. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  268. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  269. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  270. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  271. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  272. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  273. package/dist/cjs/subscription-billing/service.js +57 -8
  274. package/dist/cjs/subscription-billing/service.js.map +1 -1
  275. package/dist/cjs/subscription-billing/types.js.map +1 -1
  276. package/dist/cjs/tenancy/provisioning.js +32 -8
  277. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  278. package/dist/cjs/users/repository.js +119 -2
  279. package/dist/cjs/users/repository.js.map +1 -1
  280. package/dist/cjs/vault/repository.js +81 -0
  281. package/dist/cjs/vault/repository.js.map +1 -1
  282. package/dist/clients/repository.d.ts +42 -0
  283. package/dist/clients/repository.d.ts.map +1 -1
  284. package/dist/clients/repository.js +94 -21
  285. package/dist/clients/repository.js.map +1 -1
  286. package/dist/collection/branding.d.ts +72 -0
  287. package/dist/collection/branding.d.ts.map +1 -0
  288. package/dist/collection/branding.js +136 -0
  289. package/dist/collection/branding.js.map +1 -0
  290. package/dist/collection/channel-accounts.d.ts +57 -0
  291. package/dist/collection/channel-accounts.d.ts.map +1 -0
  292. package/dist/collection/channel-accounts.js +133 -0
  293. package/dist/collection/channel-accounts.js.map +1 -0
  294. package/dist/collection/channel.d.ts +24 -0
  295. package/dist/collection/channel.d.ts.map +1 -0
  296. package/dist/collection/channel.js +16 -0
  297. package/dist/collection/channel.js.map +1 -0
  298. package/dist/collection/communication-bridge.d.ts +66 -0
  299. package/dist/collection/communication-bridge.d.ts.map +1 -0
  300. package/dist/collection/communication-bridge.js +134 -0
  301. package/dist/collection/communication-bridge.js.map +1 -0
  302. package/dist/collection/communication-runtime.d.ts +95 -0
  303. package/dist/collection/communication-runtime.d.ts.map +1 -0
  304. package/dist/collection/communication-runtime.js +187 -0
  305. package/dist/collection/communication-runtime.js.map +1 -0
  306. package/dist/collection/consent-repository.d.ts +32 -0
  307. package/dist/collection/consent-repository.d.ts.map +1 -0
  308. package/dist/collection/consent-repository.js +79 -0
  309. package/dist/collection/consent-repository.js.map +1 -0
  310. package/dist/collection/copy.d.ts +50 -0
  311. package/dist/collection/copy.d.ts.map +1 -0
  312. package/dist/collection/copy.js +122 -0
  313. package/dist/collection/copy.js.map +1 -0
  314. package/dist/collection/delivery-callback.d.ts +49 -0
  315. package/dist/collection/delivery-callback.d.ts.map +1 -0
  316. package/dist/collection/delivery-callback.js +147 -0
  317. package/dist/collection/delivery-callback.js.map +1 -0
  318. package/dist/collection/email-layout.d.ts +45 -0
  319. package/dist/collection/email-layout.d.ts.map +1 -0
  320. package/dist/collection/email-layout.js +247 -0
  321. package/dist/collection/email-layout.js.map +1 -0
  322. package/dist/collection/engine.d.ts +177 -0
  323. package/dist/collection/engine.d.ts.map +1 -0
  324. package/dist/collection/engine.js +407 -0
  325. package/dist/collection/engine.js.map +1 -0
  326. package/dist/collection/format.d.ts +32 -0
  327. package/dist/collection/format.d.ts.map +1 -0
  328. package/dist/collection/format.js +70 -0
  329. package/dist/collection/format.js.map +1 -0
  330. package/dist/collection/payment-block.d.ts +24 -0
  331. package/dist/collection/payment-block.d.ts.map +1 -0
  332. package/dist/collection/payment-block.js +2 -0
  333. package/dist/collection/payment-block.js.map +1 -0
  334. package/dist/collection/policy.d.ts +53 -0
  335. package/dist/collection/policy.d.ts.map +1 -0
  336. package/dist/collection/policy.js +141 -0
  337. package/dist/collection/policy.js.map +1 -0
  338. package/dist/collection/repository.d.ts +129 -0
  339. package/dist/collection/repository.d.ts.map +1 -0
  340. package/dist/collection/repository.js +246 -0
  341. package/dist/collection/repository.js.map +1 -0
  342. package/dist/collection/subject.d.ts +66 -0
  343. package/dist/collection/subject.d.ts.map +1 -0
  344. package/dist/collection/subject.js +99 -0
  345. package/dist/collection/subject.js.map +1 -0
  346. package/dist/collection/template-catalog.d.ts +16 -0
  347. package/dist/collection/template-catalog.d.ts.map +1 -0
  348. package/dist/collection/template-catalog.js +162 -0
  349. package/dist/collection/template-catalog.js.map +1 -0
  350. package/dist/collection/template.d.ts +37 -0
  351. package/dist/collection/template.d.ts.map +1 -0
  352. package/dist/collection/template.js +73 -0
  353. package/dist/collection/template.js.map +1 -0
  354. package/dist/communication/adapters/email.d.ts +28 -0
  355. package/dist/communication/adapters/email.d.ts.map +1 -0
  356. package/dist/communication/adapters/email.js +129 -0
  357. package/dist/communication/adapters/email.js.map +1 -0
  358. package/dist/communication/adapters/sms.d.ts +95 -0
  359. package/dist/communication/adapters/sms.d.ts.map +1 -0
  360. package/dist/communication/adapters/sms.js +121 -0
  361. package/dist/communication/adapters/sms.js.map +1 -0
  362. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  363. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  364. package/dist/communication/adapters/whatsapp-language.js +36 -0
  365. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  366. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  367. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  368. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  369. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  370. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  371. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  372. package/dist/communication/adapters/whatsapp.js +210 -0
  373. package/dist/communication/adapters/whatsapp.js.map +1 -0
  374. package/dist/communication/audit.d.ts +105 -0
  375. package/dist/communication/audit.d.ts.map +1 -0
  376. package/dist/communication/audit.js +56 -0
  377. package/dist/communication/audit.js.map +1 -0
  378. package/dist/communication/capabilities.d.ts +88 -0
  379. package/dist/communication/capabilities.d.ts.map +1 -0
  380. package/dist/communication/capabilities.js +72 -0
  381. package/dist/communication/capabilities.js.map +1 -0
  382. package/dist/communication/channel.d.ts +125 -0
  383. package/dist/communication/channel.d.ts.map +1 -0
  384. package/dist/communication/channel.js +47 -0
  385. package/dist/communication/channel.js.map +1 -0
  386. package/dist/communication/claim.d.ts +368 -0
  387. package/dist/communication/claim.d.ts.map +1 -0
  388. package/dist/communication/claim.js +224 -0
  389. package/dist/communication/claim.js.map +1 -0
  390. package/dist/communication/consent.d.ts +65 -0
  391. package/dist/communication/consent.d.ts.map +1 -0
  392. package/dist/communication/consent.js +40 -0
  393. package/dist/communication/consent.js.map +1 -0
  394. package/dist/communication/context.d.ts +48 -0
  395. package/dist/communication/context.d.ts.map +1 -0
  396. package/dist/communication/context.js +41 -0
  397. package/dist/communication/context.js.map +1 -0
  398. package/dist/communication/credentials.d.ts +74 -0
  399. package/dist/communication/credentials.d.ts.map +1 -0
  400. package/dist/communication/credentials.js +115 -0
  401. package/dist/communication/credentials.js.map +1 -0
  402. package/dist/communication/dry-run-scenario.d.ts +37 -0
  403. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  404. package/dist/communication/dry-run-scenario.js +158 -0
  405. package/dist/communication/dry-run-scenario.js.map +1 -0
  406. package/dist/communication/dry-run.d.ts +40 -0
  407. package/dist/communication/dry-run.d.ts.map +1 -0
  408. package/dist/communication/dry-run.js +92 -0
  409. package/dist/communication/dry-run.js.map +1 -0
  410. package/dist/communication/engine.d.ts +153 -0
  411. package/dist/communication/engine.d.ts.map +1 -0
  412. package/dist/communication/engine.js +480 -0
  413. package/dist/communication/engine.js.map +1 -0
  414. package/dist/communication/graph.d.ts +38 -0
  415. package/dist/communication/graph.d.ts.map +1 -0
  416. package/dist/communication/graph.js +45 -0
  417. package/dist/communication/graph.js.map +1 -0
  418. package/dist/communication/idempotency.d.ts +33 -0
  419. package/dist/communication/idempotency.d.ts.map +1 -0
  420. package/dist/communication/idempotency.js +23 -0
  421. package/dist/communication/idempotency.js.map +1 -0
  422. package/dist/communication/identity.d.ts +127 -0
  423. package/dist/communication/identity.d.ts.map +1 -0
  424. package/dist/communication/identity.js +105 -0
  425. package/dist/communication/identity.js.map +1 -0
  426. package/dist/communication/index.d.ts +66 -0
  427. package/dist/communication/index.d.ts.map +1 -0
  428. package/dist/communication/index.js +42 -0
  429. package/dist/communication/index.js.map +1 -0
  430. package/dist/communication/onboarding.d.ts +223 -0
  431. package/dist/communication/onboarding.d.ts.map +1 -0
  432. package/dist/communication/onboarding.js +287 -0
  433. package/dist/communication/onboarding.js.map +1 -0
  434. package/dist/communication/policy.d.ts +99 -0
  435. package/dist/communication/policy.d.ts.map +1 -0
  436. package/dist/communication/policy.js +13 -0
  437. package/dist/communication/policy.js.map +1 -0
  438. package/dist/communication/routing.d.ts +99 -0
  439. package/dist/communication/routing.d.ts.map +1 -0
  440. package/dist/communication/routing.js +73 -0
  441. package/dist/communication/routing.js.map +1 -0
  442. package/dist/communication/sender-profile.d.ts +100 -0
  443. package/dist/communication/sender-profile.d.ts.map +1 -0
  444. package/dist/communication/sender-profile.js +123 -0
  445. package/dist/communication/sender-profile.js.map +1 -0
  446. package/dist/communication/status.d.ts +48 -0
  447. package/dist/communication/status.d.ts.map +1 -0
  448. package/dist/communication/status.js +79 -0
  449. package/dist/communication/status.js.map +1 -0
  450. package/dist/communication/stores/onboarding.d.ts +88 -0
  451. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  452. package/dist/communication/stores/onboarding.js +127 -0
  453. package/dist/communication/stores/onboarding.js.map +1 -0
  454. package/dist/communication/stores/postgres.d.ts +81 -0
  455. package/dist/communication/stores/postgres.d.ts.map +1 -0
  456. package/dist/communication/stores/postgres.js +453 -0
  457. package/dist/communication/stores/postgres.js.map +1 -0
  458. package/dist/communication/stores/routing.d.ts +169 -0
  459. package/dist/communication/stores/routing.d.ts.map +1 -0
  460. package/dist/communication/stores/routing.js +324 -0
  461. package/dist/communication/stores/routing.js.map +1 -0
  462. package/dist/communication/stores/secrets.d.ts +89 -0
  463. package/dist/communication/stores/secrets.d.ts.map +1 -0
  464. package/dist/communication/stores/secrets.js +122 -0
  465. package/dist/communication/stores/secrets.js.map +1 -0
  466. package/dist/communication/template-provider.d.ts +85 -0
  467. package/dist/communication/template-provider.d.ts.map +1 -0
  468. package/dist/communication/template-provider.js +21 -0
  469. package/dist/communication/template-provider.js.map +1 -0
  470. package/dist/communication/template.d.ts +87 -0
  471. package/dist/communication/template.d.ts.map +1 -0
  472. package/dist/communication/template.js +59 -0
  473. package/dist/communication/template.js.map +1 -0
  474. package/dist/communication/webhook-subscription.d.ts +156 -0
  475. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  476. package/dist/communication/webhook-subscription.js +252 -0
  477. package/dist/communication/webhook-subscription.js.map +1 -0
  478. package/dist/communication/webhook.d.ts +121 -0
  479. package/dist/communication/webhook.d.ts.map +1 -0
  480. package/dist/communication/webhook.js +283 -0
  481. package/dist/communication/webhook.js.map +1 -0
  482. package/dist/competence/repository.d.ts +147 -0
  483. package/dist/competence/repository.d.ts.map +1 -0
  484. package/dist/competence/repository.js +294 -0
  485. package/dist/competence/repository.js.map +1 -0
  486. package/dist/contacts/phone.d.ts +70 -0
  487. package/dist/contacts/phone.d.ts.map +1 -0
  488. package/dist/contacts/phone.js +186 -0
  489. package/dist/contacts/phone.js.map +1 -0
  490. package/dist/db/migrate.js +17 -11
  491. package/dist/db/migrate.js.map +1 -1
  492. package/dist/db/seed-catalog.d.ts +18 -0
  493. package/dist/db/seed-catalog.d.ts.map +1 -0
  494. package/dist/db/seed-catalog.js +45 -0
  495. package/dist/db/seed-catalog.js.map +1 -0
  496. package/dist/db/seed.js +16 -8
  497. package/dist/db/seed.js.map +1 -1
  498. package/dist/documents/repository.d.ts +97 -0
  499. package/dist/documents/repository.d.ts.map +1 -0
  500. package/dist/documents/repository.js +236 -0
  501. package/dist/documents/repository.js.map +1 -0
  502. package/dist/documents/requests.d.ts +73 -0
  503. package/dist/documents/requests.d.ts.map +1 -0
  504. package/dist/documents/requests.js +127 -0
  505. package/dist/documents/requests.js.map +1 -0
  506. package/dist/index.d.ts +109 -13
  507. package/dist/index.d.ts.map +1 -1
  508. package/dist/index.js +100 -8
  509. package/dist/index.js.map +1 -1
  510. package/dist/legal/documents.d.ts.map +1 -1
  511. package/dist/legal/documents.js +125 -3
  512. package/dist/legal/documents.js.map +1 -1
  513. package/dist/legal/index.d.ts +1 -1
  514. package/dist/legal/index.d.ts.map +1 -1
  515. package/dist/legal/types.d.ts +32 -1
  516. package/dist/legal/types.d.ts.map +1 -1
  517. package/dist/legal/types.js +1 -0
  518. package/dist/legal/types.js.map +1 -1
  519. package/dist/mail/auth-templates.d.ts +15 -0
  520. package/dist/mail/auth-templates.d.ts.map +1 -0
  521. package/dist/mail/auth-templates.js +26 -0
  522. package/dist/mail/auth-templates.js.map +1 -0
  523. package/dist/mail/dedup-store.d.ts +1 -24
  524. package/dist/mail/dedup-store.d.ts.map +1 -1
  525. package/dist/mail/dedup-store.js +9 -48
  526. package/dist/mail/dedup-store.js.map +1 -1
  527. package/dist/mail/index.d.ts +2 -1
  528. package/dist/mail/index.d.ts.map +1 -1
  529. package/dist/mail/index.js +13 -2
  530. package/dist/mail/index.js.map +1 -1
  531. package/dist/mail/provider.d.ts +2 -30
  532. package/dist/mail/provider.d.ts.map +1 -1
  533. package/dist/mail/provider.js +10 -246
  534. package/dist/mail/provider.js.map +1 -1
  535. package/dist/mail/resend.d.ts +2 -12
  536. package/dist/mail/resend.d.ts.map +1 -1
  537. package/dist/mail/resend.js +11 -17
  538. package/dist/mail/resend.js.map +1 -1
  539. package/dist/mail/sender-resolver.d.ts +1 -7
  540. package/dist/mail/sender-resolver.d.ts.map +1 -1
  541. package/dist/mail/sender-resolver.js +11 -10
  542. package/dist/mail/sender-resolver.js.map +1 -1
  543. package/dist/mail/template-renderer.d.ts +1 -9
  544. package/dist/mail/template-renderer.d.ts.map +1 -1
  545. package/dist/mail/template-renderer.js +10 -15
  546. package/dist/mail/template-renderer.js.map +1 -1
  547. package/dist/mail/transactional-outbound.d.ts +115 -0
  548. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  549. package/dist/mail/transactional-outbound.js +113 -0
  550. package/dist/mail/transactional-outbound.js.map +1 -0
  551. package/dist/mail/types.d.ts +2 -142
  552. package/dist/mail/types.d.ts.map +1 -1
  553. package/dist/mail/types.js +1 -33
  554. package/dist/mail/types.js.map +1 -1
  555. package/dist/portal/provisioning.d.ts +58 -0
  556. package/dist/portal/provisioning.d.ts.map +1 -0
  557. package/dist/portal/provisioning.js +139 -0
  558. package/dist/portal/provisioning.js.map +1 -0
  559. package/dist/pricing-engine/canonical.d.ts +14 -0
  560. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  561. package/dist/pricing-engine/canonical.js +39 -0
  562. package/dist/pricing-engine/canonical.js.map +1 -0
  563. package/dist/pricing-engine/errors.d.ts.map +1 -1
  564. package/dist/pricing-engine/errors.js +6 -1
  565. package/dist/pricing-engine/errors.js.map +1 -1
  566. package/dist/pricing-engine/index.d.ts +12 -2
  567. package/dist/pricing-engine/index.d.ts.map +1 -1
  568. package/dist/pricing-engine/index.js +6 -1
  569. package/dist/pricing-engine/index.js.map +1 -1
  570. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  571. package/dist/pricing-engine/pipeline.js +202 -28
  572. package/dist/pricing-engine/pipeline.js.map +1 -1
  573. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  574. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  575. package/dist/pricing-engine/shadow-adapter.js +75 -0
  576. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  577. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  578. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  579. package/dist/pricing-engine/shadow-diff.js +52 -0
  580. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  581. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  582. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  583. package/dist/pricing-engine/shadow-facade.js +82 -0
  584. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  585. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  586. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  587. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  588. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  589. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  590. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  591. package/dist/pricing-engine/shadow-metrics.js +31 -0
  592. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  593. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  594. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  595. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  596. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  597. package/dist/pricing-engine/types.d.ts +2 -0
  598. package/dist/pricing-engine/types.d.ts.map +1 -1
  599. package/dist/rbac/authorize.d.ts +12 -0
  600. package/dist/rbac/authorize.d.ts.map +1 -1
  601. package/dist/rbac/authorize.js +27 -0
  602. package/dist/rbac/authorize.js.map +1 -1
  603. package/dist/rbac/catalog.d.ts.map +1 -1
  604. package/dist/rbac/catalog.js +67 -1
  605. package/dist/rbac/catalog.js.map +1 -1
  606. package/dist/rbac/workload-provisioning.d.ts +66 -0
  607. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  608. package/dist/rbac/workload-provisioning.js +153 -0
  609. package/dist/rbac/workload-provisioning.js.map +1 -0
  610. package/dist/rbac/workload.d.ts +124 -0
  611. package/dist/rbac/workload.d.ts.map +1 -0
  612. package/dist/rbac/workload.js +184 -0
  613. package/dist/rbac/workload.js.map +1 -0
  614. package/dist/storage/checksum.d.ts +9 -0
  615. package/dist/storage/checksum.d.ts.map +1 -0
  616. package/dist/storage/checksum.js +12 -0
  617. package/dist/storage/checksum.js.map +1 -0
  618. package/dist/storage/key.d.ts +37 -0
  619. package/dist/storage/key.d.ts.map +1 -0
  620. package/dist/storage/key.js +67 -0
  621. package/dist/storage/key.js.map +1 -0
  622. package/dist/storage/local.d.ts +40 -0
  623. package/dist/storage/local.d.ts.map +1 -0
  624. package/dist/storage/local.js +96 -0
  625. package/dist/storage/local.js.map +1 -0
  626. package/dist/storage/r2.d.ts +43 -0
  627. package/dist/storage/r2.d.ts.map +1 -0
  628. package/dist/storage/r2.js +177 -0
  629. package/dist/storage/r2.js.map +1 -0
  630. package/dist/storage/registry.d.ts +23 -0
  631. package/dist/storage/registry.d.ts.map +1 -0
  632. package/dist/storage/registry.js +37 -0
  633. package/dist/storage/registry.js.map +1 -0
  634. package/dist/storage/types.d.ts +67 -0
  635. package/dist/storage/types.d.ts.map +1 -0
  636. package/dist/storage/types.js +45 -0
  637. package/dist/storage/types.js.map +1 -0
  638. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  639. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  640. package/dist/subscription-billing/provider/asaas.js +32 -7
  641. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  642. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  643. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  644. package/dist/subscription-billing/provider/disabled.js +8 -0
  645. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  646. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  647. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  648. package/dist/subscription-billing/provider/registry.js +17 -0
  649. package/dist/subscription-billing/provider/registry.js.map +1 -1
  650. package/dist/subscription-billing/service.d.ts +17 -1
  651. package/dist/subscription-billing/service.d.ts.map +1 -1
  652. package/dist/subscription-billing/service.js +57 -8
  653. package/dist/subscription-billing/service.js.map +1 -1
  654. package/dist/subscription-billing/types.d.ts +13 -0
  655. package/dist/subscription-billing/types.d.ts.map +1 -1
  656. package/dist/subscription-billing/types.js.map +1 -1
  657. package/dist/tenancy/provisioning.d.ts.map +1 -1
  658. package/dist/tenancy/provisioning.js +32 -8
  659. package/dist/tenancy/provisioning.js.map +1 -1
  660. package/dist/users/repository.d.ts +38 -0
  661. package/dist/users/repository.d.ts.map +1 -1
  662. package/dist/users/repository.js +118 -3
  663. package/dist/users/repository.js.map +1 -1
  664. package/dist/vault/repository.d.ts +67 -0
  665. package/dist/vault/repository.d.ts.map +1 -1
  666. package/dist/vault/repository.js +78 -0
  667. package/dist/vault/repository.js.map +1 -1
  668. package/package.json +13 -4
  669. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  670. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  671. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  672. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  673. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  674. package/src/db/migrations/0028_collection_engine.sql +94 -0
  675. package/src/db/migrations/0029_payment_rail.sql +107 -0
  676. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  677. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  678. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  679. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  680. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  681. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  682. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  683. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  684. package/src/db/migrations/0038_notification_channels.sql +175 -0
  685. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  686. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  687. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  688. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  689. package/src/db/migrations/0043_workload_identity.sql +105 -0
  690. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  691. package/dist/cjs/mail/resend-client.js +0 -103
  692. package/dist/cjs/mail/resend-client.js.map +0 -1
  693. package/dist/mail/resend-client.d.ts +0 -16
  694. package/dist/mail/resend-client.d.ts.map +0 -1
  695. package/dist/mail/resend-client.js +0 -100
  696. package/dist/mail/resend-client.js.map +0 -1
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ /**
3
+ * Motor de comunicação compartilhado.
4
+ *
5
+ * INTENT → CONTEXT → POLICY → IDENTITY → CONSENT → RECIPIENT → TEMPLATE
6
+ * → CONTENT → CLAIM → [RECOVERY?] → FENCE → ADAPTER → SETTLE
7
+ *
8
+ * O consumidor declara a INTENÇÃO de negócio ("avisar este cliente sobre o
9
+ * recebível X, etapa D+3, preferindo WhatsApp"). O motor decide nada sobre o
10
+ * negócio e tudo sobre a entrega.
11
+ *
12
+ * Cada porta abaixo pode recusar, e **toda recusa tem motivo próprio**. Um motor
13
+ * que devolve "não enviado" sem dizer qual porta fechou obriga o escritório a
14
+ * adivinhar entre "o cliente pediu para não receber" e "ninguém cadastrou o
15
+ * telefone" — que exigem ações opostas de quem opera.
16
+ *
17
+ * **CLAIM é a penúltima porta, e é a mais importante.** Ela fica imediatamente
18
+ * antes do adapter porque é o único lugar onde uma reserva serve para alguma
19
+ * coisa: a proteção contra envio duplo tem de acontecer antes do efeito externo,
20
+ * nunca depois. Ver `claim.ts`.
21
+ *
22
+ * Entre CLAIM e ADAPTER existem duas etapas que a H2 acrescentou, e nenhuma das
23
+ * duas é opcional:
24
+ *
25
+ * RECOVERY quando a reserva foi retomada de um titular que já tinha falado com
26
+ * o provider, o desfecho anterior é DESCONHECIDO. O motor só reenvia
27
+ * se o adapter declarar idempotência de provider que ainda cubra a
28
+ * chave; sem isso, recusa e deixa a chave visível para quem opera.
29
+ * FENCE a marca durável de "vou chamar o provider agora", gravada antes da
30
+ * chamada — e, na MESMA operação, a prova de que quem vai chamar
31
+ * ainda é o titular da geração corrente. É ela que dá à próxima
32
+ * retomada como saber a diferença entre "morreu antes de enviar" e
33
+ * "morreu depois", e é ela que impede o titular vencido de alcançar
34
+ * o provider. Perdeu a autoridade, não chama: sem exceção.
35
+ *
36
+ * A trilha do CICLO DE VIDA do disparo (`dispatch_claimed`, `dispatch_sent`,
37
+ * `dispatch_failed`) é gravada pelo STORE, junto com a reserva, e não pelo
38
+ * `audit` daqui. A razão está em `claim.ts`: o `audit` do motor vive na transação
39
+ * de negócio de quem chamou, e um rollback dela apagava a narrativa de um envio
40
+ * que tinha acontecido de verdade.
41
+ */
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.dispatch = dispatch;
44
+ const channel_js_1 = require("./channel.js");
45
+ const audit_js_1 = require("./audit.js");
46
+ const capabilities_js_1 = require("./capabilities.js");
47
+ const context_js_1 = require("./context.js");
48
+ const consent_js_1 = require("./consent.js");
49
+ const idempotency_js_1 = require("./idempotency.js");
50
+ const identity_js_1 = require("./identity.js");
51
+ const policy_js_1 = require("./policy.js");
52
+ const template_js_1 = require("./template.js");
53
+ const phone_js_1 = require("../contacts/phone.js");
54
+ /** Pulo derivado de uma reserva negada. Cada um é um estado distinto do sistema. */
55
+ const SKIP_FOR_REFUSAL = {
56
+ already_sent: 'already_sent',
57
+ in_flight: 'claim_in_flight',
58
+ permanently_failed: 'permanently_failed',
59
+ unknown_outcome: 'unknown_outcome',
60
+ };
61
+ /**
62
+ * Como um veredicto de fencing perdido aparece na trilha.
63
+ *
64
+ * O rótulo não é decoração: é o que a tela da régua mostra a quem investiga, e
65
+ * cada um pede uma ação diferente. `claim_lost` é concorrência sendo absorvida
66
+ * (outro worker está com o disparo agora — nada a fazer). `already_sent` é o
67
+ * sistema tendo funcionado. `permanently_failed` e `unknown_outcome` são as duas
68
+ * que pedem humano, e por motivos opostos.
69
+ *
70
+ * Colapsar tudo em `claim_lost` mandaria o escritório procurar um worker
71
+ * concorrente que não existe quando o caso é uma chave já assentada.
72
+ */
73
+ function skipForLostAuthority(fence) {
74
+ if (fence.authority === 'lost')
75
+ return 'claim_lost';
76
+ if (fence.state === 'sent')
77
+ return 'already_sent';
78
+ if (fence.state === 'failed_permanent')
79
+ return 'permanently_failed';
80
+ if (fence.state === 'unknown_outcome')
81
+ return 'unknown_outcome';
82
+ // `none` / `failed_retryable` com a geração ainda casando não é estado
83
+ // alcançável pelo motor; se acontecer, é perda de autoridade e não um desfecho.
84
+ return 'claim_lost';
85
+ }
86
+ async function dispatch(intent, deps, options = {}) {
87
+ const attempts = [];
88
+ let providerSendCalls = 0;
89
+ const contextError = (0, context_js_1.validateContext)(intent.ctx);
90
+ if (contextError) {
91
+ // Nenhum envio sem contexto válido. Não há default, não há "assume o tenant
92
+ // da sessão": é a fronteira de isolamento, e ela falha fechada.
93
+ //
94
+ // A trilha também não é escrita: `appendAudit` deriva o tenant da sessão, e
95
+ // gravar um evento sob um contexto que o motor acabou de recusar seria
96
+ // registrar a linha no tenant errado.
97
+ return {
98
+ delivered: null,
99
+ attempts,
100
+ idempotencyKey: '',
101
+ invalidContext: contextError,
102
+ providerSendCalls,
103
+ };
104
+ }
105
+ const policy = intent.policy ?? policy_js_1.DEFAULT_POLICY;
106
+ const locale = intent.locale ?? 'pt-BR';
107
+ let lastKey = '';
108
+ const record = (event) => deps.audit.record({
109
+ ctx: intent.ctx,
110
+ channel: null,
111
+ eventType: intent.eventType,
112
+ subjectRef: intent.subjectRef,
113
+ recipientRef: intent.recipientRef,
114
+ idempotencyKey: null,
115
+ ...event,
116
+ });
117
+ await record({ kind: 'intent_created' });
118
+ for (const channel of policy.order) {
119
+ const skip = async (reason, detail, key) => {
120
+ attempts.push({ channel, skipped: reason, detail });
121
+ await record({
122
+ kind: (0, audit_js_1.eventKindForSkip)(reason),
123
+ channel,
124
+ skipReason: reason,
125
+ detail: detail ?? null,
126
+ idempotencyKey: key ?? null,
127
+ });
128
+ };
129
+ const adapter = (0, channel_js_1.resolveChannel)(deps.channels, channel);
130
+ if (!deps.channels[channel]) {
131
+ await skip('channel_not_registered', `canal ${channel} não registrado`);
132
+ continue;
133
+ }
134
+ const identity = await (0, identity_js_1.resolveIdentity)(deps.accounts, intent.ctx, channel);
135
+ if (!identity.ok) {
136
+ await skip('no_identity', identity.detail);
137
+ continue;
138
+ }
139
+ if (!(await adapter.isConfigured(intent.ctx))) {
140
+ await skip('no_identity', `adapter de ${channel} sem configuração utilizável`);
141
+ continue;
142
+ }
143
+ // Consentimento ANTES de resolver o destinatário. A ordem é deliberada: quem
144
+ // pediu para não receber não deve ter o telefone lido, e um opt-out não pode
145
+ // depender de o cadastro estar completo.
146
+ const consentRecord = await deps.consent.find(intent.recipientRef, channel);
147
+ const decision = (0, consent_js_1.evaluateConsent)(channel, consentRecord, deps.consentPolicy);
148
+ if (!decision.allowed) {
149
+ await skip(decision.reason, decision.detail);
150
+ continue;
151
+ }
152
+ const to = await deps.resolveRecipient(intent.recipientRef, channel);
153
+ if (!to) {
154
+ await skip('no_recipient', `sem contato de ${channel} cadastrado`);
155
+ continue;
156
+ }
157
+ // Validação de FORMA para canais de telefone, feita pelo motor.
158
+ //
159
+ // Fica aqui, e não em cada adapter, porque WhatsApp e SMS discordariam no
160
+ // primeiro caso de borda — e discordar significa uma mensagem chegar e a
161
+ // outra não, para o mesmo cliente, sem que nada explique por quê.
162
+ //
163
+ // "Sem telefone" e "telefone que não serve" são pulos DIFERENTES: o primeiro
164
+ // é campo em branco, o segundo é campo preenchido com um fixo (que o
165
+ // provider aceita, cobra e nunca entrega). Um só rótulo mandaria o
166
+ // escritório procurar o dado que já está lá.
167
+ if (channel === 'whatsapp' || channel === 'sms') {
168
+ const parsed = (0, phone_js_1.parseBrazilPhone)(to);
169
+ if (!(0, phone_js_1.isMessagingCapable)(parsed)) {
170
+ await skip('invalid_recipient', parsed.ok ? 'telefone não é celular' : `telefone inválido (${parsed.reason})`);
171
+ continue;
172
+ }
173
+ }
174
+ const tpl = await (0, template_js_1.resolveTemplate)(deps.templates, intent.ctx, channel, intent.eventType, locale);
175
+ if (!tpl.ok) {
176
+ await skip('no_template', tpl.detail);
177
+ continue;
178
+ }
179
+ const ordered = (0, template_js_1.orderVariables)(tpl.template, intent.variables);
180
+ if (!ordered.ok) {
181
+ await skip('no_template', `variáveis ausentes: ${ordered.missing.join(', ')}`);
182
+ continue;
183
+ }
184
+ const idempotencyKey = (0, idempotency_js_1.buildIdempotencyKey)({
185
+ ctx: intent.ctx,
186
+ channel,
187
+ eventType: intent.eventType,
188
+ subjectRef: intent.subjectRef,
189
+ templateVersion: tpl.template.version,
190
+ });
191
+ lastKey = idempotencyKey;
192
+ const content = deps.buildContent(channel, {
193
+ providerTemplateName: tpl.template.providerTemplateName,
194
+ body: tpl.template.body,
195
+ subject: tpl.template.subject,
196
+ locale,
197
+ }, ordered.ordered, intent.variables);
198
+ // Conteúdo montado ANTES da reserva, de propósito. Conteúdo que o canal não
199
+ // aceita é defeito de integração, e recusá-lo aqui evita reservar uma chave
200
+ // para um envio que nunca poderia acontecer — reserva tomada e devolvida é
201
+ // ruído na trilha de quem investiga.
202
+ if (!content || !(0, channel_js_1.channelAccepts)(channel, content)) {
203
+ await skip('no_template', `conteúdo incompatível com o canal ${channel}`, idempotencyKey);
204
+ continue;
205
+ }
206
+ if (options.dryRun) {
207
+ // Ensaio LÊ o estado da chave; nunca o toma. `peek` é a única consulta do
208
+ // motor que não reserva nada.
209
+ const state = await deps.claims.peek(idempotencyKey);
210
+ if (state === 'sent') {
211
+ await skip('already_sent', 'dry-run: já enviado', idempotencyKey);
212
+ return { delivered: null, attempts, idempotencyKey, providerSendCalls };
213
+ }
214
+ if (state === 'in_flight') {
215
+ await skip('claim_in_flight', 'dry-run: envio em andamento', idempotencyKey);
216
+ return { delivered: null, attempts, idempotencyKey, providerSendCalls };
217
+ }
218
+ if (state === 'unknown_outcome') {
219
+ // O ensaio relata o que a execução real faria, e a execução real recusa:
220
+ // ninguém sabe se a tentativa anterior saiu. Anunciar "enviaria" aqui
221
+ // faria o ensaio prometer o que a execução nega.
222
+ await skip('unknown_outcome', 'dry-run: desfecho anterior desconhecido', idempotencyKey);
223
+ return { delivered: null, attempts, idempotencyKey, providerSendCalls };
224
+ }
225
+ attempts.push({ channel, outcome: 'sent', detail: 'dry-run: não enviado' });
226
+ return { delivered: channel, attempts, idempotencyKey, providerSendCalls };
227
+ }
228
+ /* ── A porta que importa ──────────────────────────────────────────────
229
+ *
230
+ * Daqui até `settle` existe um e apenas um titular do direito de enviar.
231
+ * Nenhuma linha entre `claim` e `send` pode conter um `await` a algo que
232
+ * possa demorar indefinidamente — o prazo da reserva corre a partir daqui.
233
+ */
234
+ const claimResult = await deps.claims.claim({
235
+ ctx: intent.ctx,
236
+ channel,
237
+ eventType: intent.eventType,
238
+ subjectRef: intent.subjectRef,
239
+ idempotencyKey,
240
+ recipientRef: intent.recipientRef,
241
+ });
242
+ if (!claimResult.granted) {
243
+ const reason = SKIP_FOR_REFUSAL[claimResult.reason];
244
+ await skip(reason, claimResult.detail, idempotencyKey);
245
+ // Reserva negada é DESFECHO, não canal indisponível: seguir para o
246
+ // próximo canal entregaria por outra via o que já saiu (ou o que outro
247
+ // worker está entregando agora).
248
+ return { delivered: null, attempts, idempotencyKey, providerSendCalls };
249
+ }
250
+ const claim = claimResult.claim;
251
+ // `dispatch_claimed` é gravado pelo STORE, na mesma fronteira transacional
252
+ // da reserva. Gravá-lo aqui, pelo `audit` do motor, era o que permitia a um
253
+ // rollback da transação de negócio apagar a narrativa de um disparo que
254
+ // aconteceu de verdade. Ver a nota de durabilidade em `claim.ts`.
255
+ /* ── Desfecho DESCONHECIDO ────────────────────────────────────────────
256
+ *
257
+ * A reserva foi retomada de um titular que já tinha falado com o provider e
258
+ * morreu antes de assentar. A mensagem pode ter saído. Reenviar sem mais
259
+ * nada é a duplicata que a certificação apontou; declarar "não enviado" é
260
+ * inventar um fato.
261
+ *
262
+ * A única coisa que torna o reenvio seguro é uma garantia EXTERNA: a mesma
263
+ * chave, dentro da janela em que o provider ainda a reconhece, produz uma
264
+ * chamada que ele deduplica. Quem tem essa garantia é o adapter, e ele a
265
+ * declara — o motor lê a declaração e nunca pergunta qual é o provider.
266
+ */
267
+ if (claim.previousAttemptReachedProvider) {
268
+ const covered = (0, capabilities_js_1.providerIdempotencyCovers)(adapter.capabilities, claim.providerFirstAttemptAgeMs);
269
+ if (!covered) {
270
+ await deps.claims.settle(claim, {
271
+ kind: 'unknown',
272
+ code: 'unknown_outcome',
273
+ detail: 'tentativa anterior alcançou o provider e não assentou',
274
+ }, {
275
+ kind: 'dispatch_failed',
276
+ code: 'unknown_outcome',
277
+ detail: 'sem garantia de idempotência do provider para reenviar',
278
+ });
279
+ attempts.push({
280
+ channel,
281
+ skipped: 'unknown_outcome',
282
+ detail: 'desfecho anterior desconhecido e sem cobertura do provider',
283
+ });
284
+ // NÃO segue para o próximo canal. A mensagem pode ter saído por este; um
285
+ // fallback aqui entregaria duas vezes pelo caminho que o motor não
286
+ // consegue verificar.
287
+ return { delivered: null, attempts, idempotencyKey, providerSendCalls };
288
+ }
289
+ // Coberto: reenvia REUTILIZANDO a mesma `idempotencyKey`. A chave é
290
+ // derivada da intenção (`idempotency.ts`), não da tentativa — gerar uma
291
+ // nova aqui destruiria exatamente a proteção que se está invocando.
292
+ }
293
+ /* ── FENCING PRÉ-PROVIDER — a última fronteira antes do efeito externo ──
294
+ *
295
+ * Uma operação, duas responsabilidades inseparáveis:
296
+ *
297
+ * 1. marca DURAVELMENTE que a chamada externa vai acontecer agora — o que
298
+ * permite à próxima retomada saber que o desfecho é desconhecido em vez
299
+ * de assumir que nada saiu;
300
+ * 2. PROVA que quem está prestes a chamar o provider ainda é o titular da
301
+ * geração corrente da reserva.
302
+ *
303
+ * A segunda é o que a terceira certificação exigiu. Até aqui o motor gravava
304
+ * a marca e seguia para `adapter.send()` sem olhar o resultado. A trava por
305
+ * geração existia no `WHERE` do store e funcionava — nenhuma linha do zumbi
306
+ * era atualizada —, mas o motor não sabia disso, e um `UPDATE` cujo efeito o
307
+ * chamador ignora não protege nada:
308
+ *
309
+ * A perde a reserva por prazo → B a retoma e envia
310
+ * A acorda, "marca" (zero linhas) → A envia também
311
+ *
312
+ * Duas cobranças pela mesma intenção. **CLAIM_LOST ⇒ PROVIDER_CALL=false**,
313
+ * sem exceção — não há caso em que "tentar mesmo assim" seja preferível.
314
+ *
315
+ * Verificar aqui, e não com um `peek` antes, é o que fecha o TOCTOU: entre
316
+ * ler o estado e chamar o provider a reserva pode trocar de mãos. Marcar e
317
+ * verificar na MESMA instrução não deixa esse intervalo existir.
318
+ *
319
+ * FORA do `try` do adapter, de propósito. Se a GRAVAÇÃO falhar (banco fora,
320
+ * timeout), a exceção sobe: nada foi enviado, porque a marca vem antes da
321
+ * chamada. Cair no tratamento de exceção do adapter classificaria como "pode
322
+ * ter saído" um envio que nem começou, travando a chave por uma falha de
323
+ * banco. Deixando subir, a reserva expira e a retomada seguinte é segura —
324
+ * porque não há marca nenhuma.
325
+ */
326
+ const fence = await deps.claims.markProviderAttempt(claim);
327
+ if (fence.authority !== 'held') {
328
+ /*
329
+ * Perdeu a autoridade. Sai SEM chamar o adapter e SEM assentar.
330
+ *
331
+ * Não assentar é deliberado: `settle` recusaria de qualquer forma (a trava
332
+ * por geração é a mesma), mas pedir o assentamento afirmaria um desfecho
333
+ * sobre um disparo que pertence a outra execução. Quem tem a reserva agora
334
+ * é quem a assenta. A trilha desta execução registra o pulo, e só.
335
+ *
336
+ * Também NÃO segue para o próximo canal: o titular atual pode estar
337
+ * entregando por este exato canal neste instante, e um fallback aqui
338
+ * mandaria a segunda mensagem pela via que o motor não consegue verificar.
339
+ */
340
+ await skip(skipForLostAuthority(fence), fence.detail, idempotencyKey);
341
+ return { delivered: null, attempts, idempotencyKey, providerSendCalls };
342
+ }
343
+ let outcome;
344
+ try {
345
+ providerSendCalls += 1;
346
+ outcome = await adapter.send({
347
+ ctx: intent.ctx,
348
+ channel,
349
+ to,
350
+ content,
351
+ idempotencyKey,
352
+ eventType: intent.eventType,
353
+ });
354
+ }
355
+ catch (err) {
356
+ /*
357
+ * Adapter que LANÇA é o mesmo problema do titular que morre, sem precisar de
358
+ * crash nenhum: a chamada externa começou e o desfecho é DESCONHECIDO.
359
+ *
360
+ * O desenho anterior assentava falha retentável nos dois casos e explicava,
361
+ * num comentário, que "o motor escolhe não decidir sozinho". Mas devolver a
362
+ * chave É uma decisão — é decidir que nada saiu —, e num canal sem garantia
363
+ * externa a próxima rodada duplica.
364
+ *
365
+ * Agora a decisão é a mesma da retomada, e pelo mesmo critério: com
366
+ * cobertura de idempotência do provider, retentar é seguro (a chave é a
367
+ * mesma e ele deduplica); sem cobertura, a chave para em desconhecido.
368
+ *
369
+ * A marca já foi gravada antes da chamada, então `providerFirstAttemptAgeMs`
370
+ * responde pela tentativa ATUAL quando esta é a primeira — que é o que se
371
+ * quer: a janela do provider conta a partir do momento em que ele foi
372
+ * chamado.
373
+ */
374
+ const coveredOnThrow = (0, capabilities_js_1.providerIdempotencyCovers)(adapter.capabilities, claim.providerFirstAttemptAgeMs ?? 0);
375
+ if (coveredOnThrow) {
376
+ await deps.claims.settle(claim, {
377
+ kind: 'failed',
378
+ permanent: false,
379
+ code: 'adapter_threw',
380
+ detail: 'adapter lançou exceção',
381
+ }, {
382
+ kind: 'dispatch_failed',
383
+ code: 'adapter_threw',
384
+ detail: err instanceof Error ? err.name : null,
385
+ });
386
+ attempts.push({ channel, outcome: 'temporary', detail: 'adapter lançou exceção' });
387
+ }
388
+ else {
389
+ await deps.claims.settle(claim, {
390
+ kind: 'unknown',
391
+ code: 'adapter_threw',
392
+ detail: 'adapter lançou exceção depois de iniciar a chamada externa',
393
+ }, {
394
+ kind: 'dispatch_failed',
395
+ code: 'unknown_outcome',
396
+ detail: err instanceof Error ? err.name : null,
397
+ });
398
+ attempts.push({
399
+ channel,
400
+ skipped: 'unknown_outcome',
401
+ detail: 'adapter lançou exceção e o canal não tem garantia de idempotência',
402
+ });
403
+ }
404
+ return { delivered: null, attempts, idempotencyKey, providerSendCalls };
405
+ }
406
+ attempts.push({
407
+ channel,
408
+ outcome: outcome.kind,
409
+ providerRef: outcome.providerRef,
410
+ detail: outcome.detail,
411
+ });
412
+ if (outcome.kind === 'sent') {
413
+ await deps.claims.settle(claim, { kind: 'sent', providerRef: outcome.providerRef }, {
414
+ kind: 'dispatch_sent',
415
+ providerRef: outcome.providerRef ?? null,
416
+ status: 'sent',
417
+ code: outcome.code ?? null,
418
+ });
419
+ return {
420
+ delivered: channel,
421
+ providerRef: outcome.providerRef,
422
+ attempts,
423
+ idempotencyKey,
424
+ providerSendCalls,
425
+ recoveredFromExpiredClaim: claim.recoveredFromExpiredClaim,
426
+ providerIdempotentReplay: claim.previousAttemptReachedProvider,
427
+ };
428
+ }
429
+ if (outcome.kind === 'opted_out') {
430
+ // Opt-out descoberto no provider é terminal para esta chave E encerra
431
+ // tudo. Tentar outro canal depois de o destinatário ter recusado é
432
+ // contornar a recusa por outra porta.
433
+ await deps.claims.settle(claim, {
434
+ kind: 'failed',
435
+ permanent: true,
436
+ code: outcome.code,
437
+ detail: outcome.detail,
438
+ }, {
439
+ kind: 'opt_out',
440
+ code: outcome.code ?? null,
441
+ detail: outcome.detail ?? null,
442
+ status: 'opted_out',
443
+ });
444
+ return { delivered: null, attempts, idempotencyKey, providerSendCalls };
445
+ }
446
+ if (outcome.kind === 'unavailable') {
447
+ // Canal indisponível não é tentativa: a chave é DEVOLVIDA, e o próximo
448
+ // ciclo pode usá-la. Assentar falha aqui gastaria uma tentativa por um
449
+ // problema de ambiente que nada tem a ver com o destinatário.
450
+ await deps.claims.settle(claim, {
451
+ kind: 'released',
452
+ reason: outcome.code ?? 'channel_unavailable',
453
+ }, {
454
+ kind: 'dispatch_skipped',
455
+ skipReason: 'no_identity',
456
+ code: outcome.code ?? null,
457
+ detail: outcome.detail ?? null,
458
+ });
459
+ continue;
460
+ }
461
+ const permanent = outcome.kind === 'permanent';
462
+ await deps.claims.settle(claim, {
463
+ kind: 'failed',
464
+ permanent,
465
+ code: outcome.code,
466
+ detail: outcome.detail,
467
+ }, {
468
+ kind: 'dispatch_failed',
469
+ code: outcome.code ?? null,
470
+ detail: outcome.detail ?? null,
471
+ status: permanent ? 'failed' : null,
472
+ });
473
+ if (outcome.kind === 'temporary' && !policy.fallbackOnTemporary) {
474
+ return { delivered: null, attempts, idempotencyKey, providerSendCalls };
475
+ }
476
+ // Falha PERMANENTE segue para o próximo canal, e isso é deliberado: "este
477
+ // número não tem WhatsApp" é definitivo para o WhatsApp e não diz nada sobre
478
+ // o e-mail. A chave de reserva inclui o canal, então a etapa não corre risco
479
+ // de sair duas vezes pela mesma via — só de sair pela via que funciona.
480
+ }
481
+ return { delivered: null, attempts, idempotencyKey: lastKey, providerSendCalls };
482
+ }
483
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/communication/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /**
3
+ * Versão da Graph API usada por todo o código que fala com a Meta.
4
+ *
5
+ * **Uma constante, um lugar.** Antes disto o adapter de envio carregava a sua
6
+ * (`v21.0`, escrita em 2026-08) e qualquer caminho novo escreveria a dele. Duas
7
+ * versões no mesmo runtime não falham no dia em que divergem — falham no dia em
8
+ * que a mais velha é desativada, e aí o sintoma é meio sistema parado enquanto
9
+ * a outra metade funciona, que é o pior formato possível para diagnosticar.
10
+ *
11
+ * ── Por que a versão importa mais aqui do que em outras integrações ─────────
12
+ *
13
+ * A Meta desativa versões da Graph API por calendário, não por uso: cada uma
14
+ * vive cerca de dois anos e depois passa a responder erro. `v21.0` é de
15
+ * 2024-10 e está no fim dessa janela — mantê-la seria agendar uma parada de
16
+ * canal para uma data que ninguém anotou.
17
+ *
18
+ * O valor abaixo foi verificado contra a Graph API em 2026-08-30: `v26.0`
19
+ * responde, `v27.0` ainda não existe.
20
+ *
21
+ * ── Override por ambiente ───────────────────────────────────────────────────
22
+ *
23
+ * Existe para rollback sem release: se uma versão nova mudar um contrato que
24
+ * este código lê, voltar uma casa é uma variável de ambiente e um deploy, não
25
+ * uma correção de emergência no código.
26
+ *
27
+ * O formato é validado. Um valor livre entraria direto na URL — e uma env var
28
+ * mal digitada viraria um caminho arbitrário no host da Meta.
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.DEFAULT_GRAPH_API_VERSION = void 0;
32
+ exports.graphApiVersion = graphApiVersion;
33
+ exports.graphUrl = graphUrl;
34
+ exports.DEFAULT_GRAPH_API_VERSION = 'v26.0';
35
+ const VERSION_PATTERN = /^v\d{1,3}\.\d{1,2}$/;
36
+ /**
37
+ * Versão efetiva. Um valor inválido cai no default em vez de derrubar o
38
+ * processo: a alternativa é um erro de digitação numa env var parar o boot da
39
+ * API inteira, e a degradação correta aqui é ignorar a configuração ruim.
40
+ */
41
+ function graphApiVersion(env = process.env) {
42
+ const raw = env.WHATSAPP_GRAPH_API_VERSION?.trim();
43
+ return raw && VERSION_PATTERN.test(raw) ? raw : exports.DEFAULT_GRAPH_API_VERSION;
44
+ }
45
+ /** Base de URL da Graph API. Isolada para que nenhum chamador a monte na mão. */
46
+ function graphUrl(path, env) {
47
+ const clean = path.startsWith('/') ? path.slice(1) : path;
48
+ return `https://graph.facebook.com/${graphApiVersion(env)}/${clean}`;
49
+ }
50
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/communication/graph.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AAWH,0CAGC;AAGD,4BAGC;AAlBY,QAAA,yBAAyB,GAAG,OAAO,CAAC;AAEjD,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAE9C;;;;GAIG;AACH,SAAgB,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,GAAG,GAAG,GAAG,CAAC,0BAA0B,EAAE,IAAI,EAAE,CAAC;IACnD,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,iCAAyB,CAAC;AAC5E,CAAC;AAED,iFAAiF;AACjF,SAAgB,QAAQ,CAAC,IAAY,EAAE,GAAuB;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,OAAO,8BAA8B,eAAe,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;AACvE,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildIdempotencyKey = buildIdempotencyKey;
4
+ const node_crypto_1 = require("node:crypto");
5
+ /**
6
+ * Separador de campos: `US` (unit separator, `0x1F`).
7
+ *
8
+ * Escolhido por não ser digitável — com `:` ou `|`, um `subjectRef` que contenha
9
+ * o separador consegue forjar a chave de outro evento, e isso é colisão por
10
+ * construção, não por azar. Um id vindo de outro sistema pode conter qualquer
11
+ * pontuação; nenhum contém um caractere de controle.
12
+ */
13
+ const SEP = '\u001f';
14
+ function buildIdempotencyKey(input) {
15
+ const parts = [
16
+ input.ctx.tenantId,
17
+ input.ctx.product,
18
+ input.ctx.brand,
19
+ input.channel,
20
+ input.eventType,
21
+ input.subjectRef,
22
+ input.templateVersion ?? 'v0',
23
+ ];
24
+ return (0, node_crypto_1.createHash)('sha256').update(parts.join(SEP)).digest('hex');
25
+ }
26
+ //# sourceMappingURL=idempotency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../../src/communication/idempotency.ts"],"names":[],"mappings":";;AA4CA,kDAWC;AAvDD,6CAAyC;AAkCzC;;;;;;;GAOG;AACH,MAAM,GAAG,GAAG,QAAQ,CAAC;AAErB,SAAgB,mBAAmB,CAAC,KAAuB;IACzD,MAAM,KAAK,GAAG;QACZ,KAAK,CAAC,GAAG,CAAC,QAAQ;QAClB,KAAK,CAAC,GAAG,CAAC,OAAO;QACjB,KAAK,CAAC,GAAG,CAAC,KAAK;QACf,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,UAAU;QAChB,KAAK,CAAC,eAAe,IAAI,IAAI;KAC9B,CAAC;IACF,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC"}