@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,125 @@
1
+ /**
2
+ * Contrato canônico de canal do ecossistema — e-mail, WhatsApp, SMS e
3
+ * notificação interna sob a mesma interface.
4
+ *
5
+ * O ponto de desenho está no CONTEÚDO, não na interface. A abstração de canal
6
+ * que já existia na cobrança da SC (`collection/channel.ts`) carregava
7
+ * `subject` + `html` obrigatórios: um payload de e-mail com nome genérico. Um
8
+ * adapter de WhatsApp receberia HTML renderizado e teria de desmontá-lo de
9
+ * volta em texto, e um de SMS idem — o canal vazando para dentro do domínio
10
+ * pela porta do payload.
11
+ *
12
+ * Aqui o conteúdo é uma união discriminada, resolvida DEPOIS que o canal foi
13
+ * escolhido. Cada canal recebe o que sabe entregar, e o compilador recusa o
14
+ * resto.
15
+ */
16
+ import type { ChannelCapabilities } from './capabilities.js';
17
+ import type { CommunicationContext } from './context.js';
18
+ export type ChannelKey = 'email' | 'whatsapp' | 'sms' | 'notification';
19
+ export declare const CHANNEL_KEYS: readonly ChannelKey[];
20
+ /**
21
+ * Conteúdo por canal.
22
+ *
23
+ * `whatsapp_template` não é concessão à Meta — é o formato que QUALQUER
24
+ * provedor de WhatsApp Business exige fora da janela de 24h de conversa
25
+ * iniciada pelo cliente (Meta Cloud, Twilio, Zenvia, todos). Modelar isso como
26
+ * "texto livre" produziria código que passa em mock e é recusado em produção
27
+ * por toda a categoria de provider, não por um deles.
28
+ */
29
+ export type MessageContent = {
30
+ kind: 'email';
31
+ subject: string;
32
+ html: string;
33
+ text: string;
34
+ }
35
+ /** SMS e notificação interna: texto puro, sem formatação, sem anexo. */
36
+ | {
37
+ kind: 'text';
38
+ body: string;
39
+ }
40
+ /**
41
+ * WhatsApp fora da janela de sessão. `variables` é POSICIONAL por imposição
42
+ * do canal: o template aprovado declara `{{1}}`, `{{2}}` — os nomes vivem no
43
+ * produto, e a ordem é o contrato.
44
+ */
45
+ | {
46
+ kind: 'whatsapp_template';
47
+ templateName: string;
48
+ language: string;
49
+ variables: string[];
50
+ };
51
+ /** Quais conteúdos cada canal aceita. Consultado antes do envio, não dentro do adapter. */
52
+ export declare const CHANNEL_ACCEPTS: Record<ChannelKey, readonly MessageContent['kind'][]>;
53
+ export declare function channelAccepts(channel: ChannelKey, content: MessageContent): boolean;
54
+ export interface OutboundMessage {
55
+ ctx: CommunicationContext;
56
+ channel: ChannelKey;
57
+ /**
58
+ * Destinatário já normalizado para o canal: E.164 em WhatsApp/SMS, endereço
59
+ * em e-mail, id de usuário em notificação. Normalizar é responsabilidade do
60
+ * motor (`contacts/phone.ts`), nunca do adapter — dois adapters normalizando
61
+ * por conta própria é como o mesmo cliente recebe SMS e não recebe WhatsApp.
62
+ */
63
+ to: string;
64
+ content: MessageContent;
65
+ /** Composta pelo motor a partir do contexto. Ver `idempotency.ts`. */
66
+ idempotencyKey: string;
67
+ /** Rótulo do evento de negócio, para trilha e custo. Nunca PII. */
68
+ eventType: string;
69
+ }
70
+ /**
71
+ * Desfechos de entrega.
72
+ *
73
+ * Cinco, e não dois, porque cada um leva a uma decisão diferente do motor —
74
+ * colapsá-los em "deu certo / deu errado" faz o retry insistir no que nunca vai
75
+ * funcionar e desistir do que era só instabilidade.
76
+ *
77
+ * sent → o provider aceitou. NÃO é "chegou": ver `status.ts`.
78
+ * temporary → infraestrutura; vale tentar de novo
79
+ * permanent → destinatário/dado/template inválido; retry é desperdício
80
+ * opted_out → o destinatário recusou o canal. Não é falha e NUNCA é retry.
81
+ * unavailable → o canal não existe neste contexto; não conta como tentativa
82
+ */
83
+ export type DeliveryOutcomeKind = 'sent' | 'temporary' | 'permanent' | 'opted_out' | 'unavailable';
84
+ export interface DeliveryOutcome {
85
+ kind: DeliveryOutcomeKind;
86
+ /** Identificador da mensagem no provider. Nunca uma credencial. */
87
+ providerRef?: string;
88
+ /** Rótulo curto e estável para métrica. snake_case. Nunca PII, nunca segredo. */
89
+ code?: string;
90
+ /** Detalhe legível. Nunca PII, nunca segredo. */
91
+ detail?: string;
92
+ }
93
+ export interface CommunicationChannel {
94
+ key: ChannelKey;
95
+ /**
96
+ * Nome do provider por trás, para a trilha ("meta_cloud", "resend"). É
97
+ * metadado de operação; o consumidor não ramifica por ele — se ramificasse,
98
+ * trocar de provider viraria mudança de regra de negócio.
99
+ */
100
+ readonly providerName: string;
101
+ /**
102
+ * O que o provider por trás garante. **Obrigatório**, e sem `?`.
103
+ *
104
+ * A ausência de opcional é a decisão: enquanto a declaração pudesse faltar, o
105
+ * motor teria de assumir alguma coisa para o adapter calado — e qualquer
106
+ * suposição sobre garantia externa é uma suposição sobre se o cliente recebe a
107
+ * mesma mensagem duas vezes. Agora o compilador recusa o adapter que não
108
+ * declara. Ver `capabilities.ts`.
109
+ */
110
+ readonly capabilities: ChannelCapabilities;
111
+ /** Falso quando ESTE contexto não tem o canal configurado. */
112
+ isConfigured(ctx: CommunicationContext): boolean | Promise<boolean>;
113
+ send(message: OutboundMessage): Promise<DeliveryOutcome>;
114
+ }
115
+ /**
116
+ * Canal indisponível.
117
+ *
118
+ * Deliberadamente NÃO simula entrega. Um adapter que responde `sent` sem enviar
119
+ * transforma a trilha em ficção: o escritório vê "cobrado" e o cliente nunca
120
+ * recebeu nada. Herdado da abstração da SC, que já acertou isso.
121
+ */
122
+ export declare function unavailableChannel(key: ChannelKey, reason: string): CommunicationChannel;
123
+ export type ChannelRegistry = Partial<Record<ChannelKey, CommunicationChannel>>;
124
+ export declare function resolveChannel(registry: ChannelRegistry, key: ChannelKey): CommunicationChannel;
125
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/communication/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,cAAc,CAAC;AAEvE,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAAiD,CAAC;AAEhG;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChE,wEAAwE;GACtE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChC;;;;GAIG;GACD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE/F,2FAA2F;AAC3F,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,cAAc,CAAC,MAAM,CAAC,EAAE,CAKjF,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAEpF;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB;;;;;OAKG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,cAAc,CAAC;IACxB,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,CAAC;AAEnG,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,UAAU,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,8DAA8D;IAC9D,YAAY,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAQxF;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAEhF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,GAAG,oBAAoB,CAE/F"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Contrato canônico de canal do ecossistema — e-mail, WhatsApp, SMS e
3
+ * notificação interna sob a mesma interface.
4
+ *
5
+ * O ponto de desenho está no CONTEÚDO, não na interface. A abstração de canal
6
+ * que já existia na cobrança da SC (`collection/channel.ts`) carregava
7
+ * `subject` + `html` obrigatórios: um payload de e-mail com nome genérico. Um
8
+ * adapter de WhatsApp receberia HTML renderizado e teria de desmontá-lo de
9
+ * volta em texto, e um de SMS idem — o canal vazando para dentro do domínio
10
+ * pela porta do payload.
11
+ *
12
+ * Aqui o conteúdo é uma união discriminada, resolvida DEPOIS que o canal foi
13
+ * escolhido. Cada canal recebe o que sabe entregar, e o compilador recusa o
14
+ * resto.
15
+ */
16
+ import { NO_PROVIDER_GUARANTEES } from './capabilities.js';
17
+ export const CHANNEL_KEYS = ['email', 'whatsapp', 'sms', 'notification'];
18
+ /** Quais conteúdos cada canal aceita. Consultado antes do envio, não dentro do adapter. */
19
+ export const CHANNEL_ACCEPTS = {
20
+ email: ['email'],
21
+ whatsapp: ['whatsapp_template', 'text'],
22
+ sms: ['text'],
23
+ notification: ['text'],
24
+ };
25
+ export function channelAccepts(channel, content) {
26
+ return CHANNEL_ACCEPTS[channel].includes(content.kind);
27
+ }
28
+ /**
29
+ * Canal indisponível.
30
+ *
31
+ * Deliberadamente NÃO simula entrega. Um adapter que responde `sent` sem enviar
32
+ * transforma a trilha em ficção: o escritório vê "cobrado" e o cliente nunca
33
+ * recebeu nada. Herdado da abstração da SC, que já acertou isso.
34
+ */
35
+ export function unavailableChannel(key, reason) {
36
+ return {
37
+ key,
38
+ providerName: 'none',
39
+ capabilities: NO_PROVIDER_GUARANTEES,
40
+ isConfigured: () => false,
41
+ send: async () => ({ kind: 'unavailable', code: 'channel_not_configured', detail: reason }),
42
+ };
43
+ }
44
+ export function resolveChannel(registry, key) {
45
+ return registry[key] ?? unavailableChannel(key, `canal ${key} não registrado`);
46
+ }
47
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/communication/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAK3D,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAsBhG,2FAA2F;AAC3F,MAAM,CAAC,MAAM,eAAe,GAA0D;IACpF,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACvC,GAAG,EAAE,CAAC,MAAM,CAAC;IACb,YAAY,EAAE,CAAC,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAmB,EAAE,OAAuB;IACzE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAmED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAe,EAAE,MAAc;IAChE,OAAO;QACL,GAAG;QACH,YAAY,EAAE,MAAM;QACpB,YAAY,EAAE,sBAAsB;QACpC,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK;QACzB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;KAC5F,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,cAAc,CAAC,QAAyB,EAAE,GAAe;IACvE,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,368 @@
1
+ /**
2
+ * Reserva atômica do direito de enviar.
3
+ *
4
+ * O desenho anterior era, em substância:
5
+ *
6
+ * alreadySent(key) → adapter.send() → markSent(key)
7
+ *
8
+ * Três passos, e o intervalo entre o primeiro e o terceiro é uma janela aberta:
9
+ * dois workers que perguntam "já enviei?" ao mesmo tempo recebem "não" os dois,
10
+ * e os dois chamam o provider. O cliente recebe a mesma cobrança duas vezes. A
11
+ * marcação posterior não conserta nada — o dinheiro do envio já saiu, e a
12
+ * mensagem também.
13
+ *
14
+ * Aqui a ordem é outra:
15
+ *
16
+ * claim(key) → markProviderAttempt → [só o vencedor] send() → settle
17
+ *
18
+ * `claim` é uma operação ÚNICA e atômica no armazenamento: ou ela devolve a
19
+ * reserva, ou devolve o motivo de não ter devolvido. Não existe estado
20
+ * intermediário observável entre "verifiquei" e "reservei", porque não há dois
21
+ * momentos. Quem não ganhou a reserva não chama o provider — nem para "tentar de
22
+ * novo mais rápido".
23
+ *
24
+ * **A reserva vem ANTES do efeito externo, e essa é a regra inteira.** Qualquer
25
+ * proteção que aconteça depois de `send` é contabilidade do que já foi feito,
26
+ * não controle.
27
+ *
28
+ * ## O que a H2 acrescentou, e por quê
29
+ *
30
+ * A reserva tem prazo, porque processo morre segurando reserva e uma etapa calada
31
+ * para sempre é pior que uma duplicata rara. Mas retomar por prazo vencido, do
32
+ * jeito que estava, era retomar **às cegas**: o motor não tinha como distinguir
33
+ *
34
+ * (a) o titular anterior morreu ANTES de falar com o provider — nada saiu, e
35
+ * reenviar é obviamente certo;
36
+ * (b) o titular anterior morreu DEPOIS de falar com o provider — pode ter saído,
37
+ * e reenviar duplica.
38
+ *
39
+ * Os dois casos chegavam aqui com a mesma cara. `markProviderAttempt` é o que os
40
+ * separa: uma marca durável, gravada IMEDIATAMENTE antes da chamada externa, em
41
+ * fronteira própria. Quem retoma uma reserva que já tinha essa marca sabe que o
42
+ * desfecho é **desconhecido**, não "não enviado" — e desconhecido não autoriza
43
+ * reenvio cego.
44
+ *
45
+ * A marca é conservadora de propósito: gravar antes de chamar significa que um
46
+ * processo que morre entre a marca e a chamada é classificado como "pode ter
47
+ * enviado" quando não enviou. Erra para o lado de calar uma mensagem, nunca para
48
+ * o lado de mandar duas.
49
+ */
50
+ import type { ChannelKey } from './channel.js';
51
+ import type { CommunicationAuditSink, CommunicationEventKind } from './audit.js';
52
+ import type { CommunicationContext } from './context.js';
53
+ import type { SkipReason } from './policy.js';
54
+ import type { DeliveryStatus } from './status.js';
55
+ /** O que se quer reservar. A chave já vem composta pelo motor (`idempotency.ts`). */
56
+ export interface DispatchClaimRequest {
57
+ ctx: CommunicationContext;
58
+ channel: ChannelKey;
59
+ eventType: string;
60
+ subjectRef: string;
61
+ idempotencyKey: string;
62
+ /**
63
+ * Referência LÓGICA do destinatário. Nunca telefone, nunca e-mail.
64
+ *
65
+ * Vem no pedido de reserva — e não só na trilha do motor — porque a trilha do
66
+ * ciclo de vida do disparo passou a ser gravada AQUI, na mesma fronteira
67
+ * transacional da reserva. Ver a nota sobre durabilidade abaixo.
68
+ */
69
+ recipientRef: string;
70
+ }
71
+ /**
72
+ * A reserva concedida. Devolvida a `settle` para assentar o desfecho.
73
+ *
74
+ * `attempt` é o número da tentativa desta chave, contando a atual. Vale mais que
75
+ * um booleano: `attempt > 1` numa reserva concedida por EXPIRAÇÃO significa que
76
+ * um processo anterior morreu segurando o direito de enviar.
77
+ */
78
+ export interface DispatchClaimHandle {
79
+ /** Identidade da LINHA de reserva. Estável entre tentativas da mesma chave. */
80
+ claimId: string;
81
+ /**
82
+ * Identidade desta GERAÇÃO da reserva — o fencing token.
83
+ *
84
+ * Muda a cada concessão, inclusive quando a reserva é retomada de um titular
85
+ * vencido. É o que permite a `settle` recusar o zumbi: `claimId` sozinho não
86
+ * serve, porque a linha é a mesma para o titular vencido e para o atual, e um
87
+ * `WHERE` por `claimId` deixaria o processo que ressuscita assentar por cima de
88
+ * quem está enviando neste instante.
89
+ *
90
+ * Prazo NÃO é fencing. Um titular vencido que acorda continua com um relógio
91
+ * plausível na mão; o que o desqualifica é não ter a geração corrente.
92
+ */
93
+ claimToken: string;
94
+ idempotencyKey: string;
95
+ attempt: number;
96
+ /**
97
+ * A reserva foi tomada de um titular anterior cujo prazo venceu.
98
+ *
99
+ * Sozinho, NÃO decide nada — diz apenas que houve um titular que não assentou.
100
+ * A pergunta que decide é a próxima.
101
+ */
102
+ recoveredFromExpiredClaim: boolean;
103
+ /**
104
+ * O titular anterior chegou a chamar o provider.
105
+ *
106
+ * `true` significa desfecho **UNKNOWN**, não "não enviado": a mensagem pode ter
107
+ * saído. É a condição que o motor consulta antes de decidir se reenvia, e é o
108
+ * que separa recuperação segura de recuperação cega.
109
+ */
110
+ previousAttemptReachedProvider: boolean;
111
+ /**
112
+ * Há quanto tempo (ms) foi a PRIMEIRA chamada externa desta chave, se houve.
113
+ *
114
+ * A janela de idempotência do provider conta a partir dela, não da tentativa
115
+ * atual: uma chave que o provider já esqueceu não protege mais nada.
116
+ *
117
+ * Idade, e não instante, porque quem mede é quem guarda: o store SQL usa o
118
+ * relógio do banco, o de memória usa o dele. Devolver o instante obrigaria o
119
+ * motor a compará-lo com o relógio do PROCESSO, e dois relógios que não
120
+ * concordam decidem errado sobre reenviar ou não.
121
+ */
122
+ providerFirstAttemptAgeMs: number | null;
123
+ }
124
+ /**
125
+ * Por que a reserva não foi concedida.
126
+ *
127
+ * Cada motivo leva a uma leitura operacional diferente, e por isso nenhum deles
128
+ * é "não deu": `already_sent` é o sistema funcionando; `in_flight` é
129
+ * concorrência sendo absorvida; `permanently_failed` e `unknown_outcome` são
130
+ * coisas que precisam de humano — e por motivos opostos.
131
+ */
132
+ export type ClaimRefusal = 'already_sent' | 'in_flight' | 'permanently_failed'
133
+ /**
134
+ * A chave está parada em desfecho DESCONHECIDO: alguém chamou o provider e
135
+ * ninguém sabe o que aconteceu.
136
+ *
137
+ * Não é falha (pode ter dado certo) e não é sucesso (pode não ter saído). Fica
138
+ * travada de propósito: destravar sozinha seria escolher, no escuro, entre
139
+ * calar um aviso e mandar dois. Sai daqui por `resolveUnknownOutcome`.
140
+ */
141
+ | 'unknown_outcome';
142
+ export type ClaimResult = {
143
+ granted: true;
144
+ claim: DispatchClaimHandle;
145
+ } | {
146
+ granted: false;
147
+ reason: ClaimRefusal;
148
+ detail?: string;
149
+ };
150
+ /**
151
+ * Desfecho a assentar.
152
+ *
153
+ * `released` é o caso que não existia no desenho antigo e que a reserva torna
154
+ * obrigatório: reservei e NÃO enviei (dry-run, conteúdo recusado na borda). Sem
155
+ * ele a chave ficaria presa até o prazo vencer, e o ensaio calaria a etapa real.
156
+ *
157
+ * `unknown` é o da H2: reservei, descobri que o titular anterior pode ter enviado
158
+ * e NÃO tenho como garantir que um reenvio não duplica. Assentar como falha
159
+ * devolveria a chave e a próxima rodada duplicaria; assentar como enviada
160
+ * afirmaria uma entrega que ninguém viu.
161
+ */
162
+ export type ClaimSettlement = {
163
+ kind: 'sent';
164
+ providerRef?: string;
165
+ } | {
166
+ kind: 'failed';
167
+ permanent: boolean;
168
+ code?: string;
169
+ detail?: string;
170
+ } | {
171
+ kind: 'released';
172
+ reason: string;
173
+ } | {
174
+ kind: 'unknown';
175
+ code?: string;
176
+ detail?: string;
177
+ };
178
+ /**
179
+ * O evento de trilha que acompanha a transição.
180
+ *
181
+ * Vai JUNTO com o `settle`, na mesma gravação, e é isso que o torna durável.
182
+ * Ver a nota sobre fronteira transacional abaixo.
183
+ */
184
+ export interface DispatchLifecycleEvent {
185
+ kind: CommunicationEventKind;
186
+ providerRef?: string | null;
187
+ skipReason?: SkipReason | null;
188
+ status?: DeliveryStatus | null;
189
+ code?: string | null;
190
+ detail?: string | null;
191
+ }
192
+ /** Como um desfecho desconhecido foi resolvido por quem investigou. */
193
+ export type UnknownResolution = 'sent' | 'not_sent';
194
+ /**
195
+ * Veredicto do FENCING PRÉ-PROVIDER: quem chama ainda é o titular do direito de
196
+ * enviar, agora, no armazenamento?
197
+ *
198
+ * ## Por que isto existe
199
+ *
200
+ * `markProviderAttempt` devolvia `void`. A trava por geração estava no `WHERE` do
201
+ * `UPDATE` — e funcionava: a linha do zumbi não era atualizada. Mas o motor não
202
+ * tinha como saber disso. Gravava (ou não gravava) a marca e seguia direto para
203
+ * `adapter.send()`. O resultado é o que a terceira certificação encontrou:
204
+ *
205
+ * A perde a reserva por prazo → B a retoma e envia
206
+ * A acorda, "marca" a tentativa (nenhuma linha muda) → A envia também
207
+ *
208
+ * Duas chamadas ao provider para a mesma intenção, com a trava de fencing
209
+ * presente, correta e **muda**. Uma trava cujo resultado o chamador ignora não é
210
+ * trava: é um `UPDATE` que às vezes não faz nada.
211
+ *
212
+ * Por isso o retorno é uma união DISCRIMINADA, e não um booleano. `held` e `lost`
213
+ * já bastariam para abortar, mas colapsariam duas coisas que quem opera precisa
214
+ * distinguir: "outro worker está com a reserva" e "esta chave já foi assentada".
215
+ * A primeira é concorrência normal; a segunda é o motor sendo chamado sobre um
216
+ * disparo que acabou.
217
+ *
218
+ * ## O que NÃO está aqui, e por quê
219
+ *
220
+ * Não há membro `unknown`. Falha de GRAVAÇÃO da marca (banco fora, timeout) não
221
+ * é desfecho incerto: nada foi enviado ainda, porque a marca vem antes da
222
+ * chamada externa. Esse caso LANÇA — e é deliberado. Ver a nota em `engine.ts`
223
+ * sobre o `markProviderAttempt` ficar fora do `try` do adapter: deixar a exceção
224
+ * subir faz a reserva simplesmente expirar, e a retomada seguinte é segura
225
+ * justamente porque não existe marca nenhuma. Devolver `unknown` aqui travaria a
226
+ * chave por uma falha de banco num envio que nem começou.
227
+ */
228
+ export type ProviderAttemptFence =
229
+ /** A geração corrente é a de quem chamou. Autorizado a chamar o provider. */
230
+ {
231
+ authority: 'held';
232
+ }
233
+ /**
234
+ * A reserva mudou de mãos (prazo vencido e retomada por outro), ou a linha não
235
+ * existe mais. **Quem recebe isto não chama o provider.**
236
+ */
237
+ | {
238
+ authority: 'lost';
239
+ detail: string;
240
+ }
241
+ /**
242
+ * A chave já está assentada — `sent`, `failed_permanent`, `unknown_outcome`.
243
+ *
244
+ * Recorte próprio de `lost` porque a ação de quem investiga é outra: em `lost`
245
+ * há um titular novo trabalhando agora; aqui não há titular nenhum, e o disparo
246
+ * terminou.
247
+ */
248
+ | {
249
+ authority: 'already_final';
250
+ state: DispatchKeyState;
251
+ detail: string;
252
+ };
253
+ /** Estado de uma chave, para LEITURA pura. Nunca reserva nada. */
254
+ export type DispatchKeyState = 'none' | 'in_flight' | 'sent' | 'failed_retryable' | 'failed_permanent' | 'unknown_outcome';
255
+ /**
256
+ * Porta de reserva. Implementada pelo produto, sobre o armazenamento dele.
257
+ *
258
+ * O motor não sabe se é Postgres, Redis ou outra coisa; sabe que `claim` é
259
+ * atômico em relação a outros `claim` da mesma chave — **inclusive entre
260
+ * processos diferentes**. Uma implementação que só coordene dentro de um
261
+ * processo satisfaz a interface e não satisfaz o requisito: ver a nota em
262
+ * `createInMemoryDispatchClaimStore`.
263
+ *
264
+ * ## A trilha do ciclo de vida mora AQUI
265
+ *
266
+ * `dispatch_claimed`, `dispatch_sent`, `dispatch_failed` são gravados pelo store,
267
+ * na MESMA fronteira transacional da reserva — não pelo `audit` do motor.
268
+ *
269
+ * A razão é um defeito concreto que a certificação achou. O `audit` do motor
270
+ * escreve na transação de NEGÓCIO de quem chamou (a régua de cobrança roda o
271
+ * ciclo inteiro numa transação longa). A reserva, ao contrário, commita em
272
+ * transação própria e curta, porque precisa ficar visível a outros workers antes
273
+ * do fim do ciclo. Se a transação longa fizesse rollback DEPOIS de a mensagem
274
+ * sair, o resultado era:
275
+ *
276
+ * communication_dispatch.status = 'sent' (sobreviveu — a mensagem saiu)
277
+ * communication_event.dispatch_sent (sumiu — a narrativa foi desfeita)
278
+ *
279
+ * Um disparo enviado sem nenhuma linha explicando que foi enviado. Juntando a
280
+ * gravação do evento à gravação da reserva, as duas caem ou sobrevivem juntas —
281
+ * uma escrita, não duas. Não é outbox nem dual-write com compensação: é a mesma
282
+ * transação, que é o padrão mais simples que satisfaz a exigência.
283
+ *
284
+ * O que continua no `audit` do motor: `intent_created` e os pulos ANTERIORES à
285
+ * reserva. Esses descrevem decisões sem efeito externo nenhum — se a transação de
286
+ * negócio cair, nada saiu, e a narrativa não deve mesmo sobreviver.
287
+ */
288
+ export interface DispatchClaimStore {
289
+ /** Reserva e grava `dispatch_claimed` na mesma fronteira. */
290
+ claim(req: DispatchClaimRequest): Promise<ClaimResult>;
291
+ /**
292
+ * Marca, DURAVELMENTE, que a chamada externa vai acontecer agora — **e devolve
293
+ * se quem pediu ainda tem autoridade para fazê-la.**
294
+ *
295
+ * Chamada imediatamente antes de `adapter.send`, e não junto com o `claim`: se
296
+ * a marca viesse no `claim`, todo processo que morresse entre reservar e
297
+ * enviar travaria a chave num "desconhecido" que não existe.
298
+ *
299
+ * É a ÚLTIMA fronteira persistente antes do efeito externo, e por isso as duas
300
+ * coisas — marcar e verificar autoridade — são a MESMA operação, atômica. Um
301
+ * `peek` seguido de `send` reabriria a janela TOCTOU que a reserva existe para
302
+ * fechar: entre ler o estado e chamar o provider, a reserva pode trocar de
303
+ * mãos. Aqui não pode: ou o `UPDATE` casa a geração corrente e a marca fica
304
+ * gravada, ou ele não casa nada e o veredicto é `lost`.
305
+ *
306
+ * Implementações NÃO devem devolver `held` quando nenhuma linha foi atualizada.
307
+ * É esse "sucesso genérico" que a terceira certificação encontrou — ver
308
+ * `ProviderAttemptFence`.
309
+ */
310
+ markProviderAttempt(claim: DispatchClaimHandle): Promise<ProviderAttemptFence>;
311
+ /** Assenta o desfecho e grava o evento correspondente na mesma gravação. */
312
+ settle(claim: DispatchClaimHandle, outcome: ClaimSettlement, event: DispatchLifecycleEvent): Promise<void>;
313
+ /**
314
+ * Estado atual da chave, sem reservar.
315
+ *
316
+ * Existe para o dry-run: o ensaio precisa relatar "isto já saiu" com a mesma
317
+ * verdade da execução, e não pode fazê-lo tomando uma reserva — um ensaio que
318
+ * escreve não é ensaio.
319
+ */
320
+ peek(idempotencyKey: string): Promise<DispatchKeyState>;
321
+ /**
322
+ * Saída do estado desconhecido, por decisão de quem investigou.
323
+ *
324
+ * `sent` encerra a chave (a mensagem saiu; não reenviar). `not_sent` a devolve
325
+ * para retentável (não saiu; a próxima rodada pode enviar). É deliberadamente
326
+ * uma operação EXPLÍCITA: nenhum caminho automático adivinha o que aconteceu no
327
+ * provider, porque adivinhar aqui é escolher entre calar um aviso e cobrar duas
328
+ * vezes.
329
+ */
330
+ resolveUnknownOutcome(idempotencyKey: string, resolution: UnknownResolution, detail?: string): Promise<void>;
331
+ }
332
+ /** Prazo da reserva. Ver `createInMemoryDispatchClaimStore` para o raciocínio. */
333
+ export declare const DEFAULT_CLAIM_TTL_MS: number;
334
+ export interface InMemoryClaimStoreOptions {
335
+ ttlMs?: number;
336
+ now?: () => number;
337
+ /**
338
+ * Destino da trilha de ciclo de vida.
339
+ *
340
+ * Existe para que a implementação em memória tenha a MESMA fronteira que a
341
+ * SQL: lá o evento cai na transação da reserva, aqui ele cai no sink que o
342
+ * store recebeu — em nenhum dos dois casos ele depende da transação de negócio
343
+ * de quem chamou. Um store de teste que gravasse a trilha por outro caminho
344
+ * mediria uma propriedade diferente da que produção tem.
345
+ */
346
+ audit?: CommunicationAuditSink;
347
+ }
348
+ /**
349
+ * Reserva em memória — **um processo só**.
350
+ *
351
+ * Serve a testes e a consumidores que rodam em instância única. Não serve a
352
+ * produção com mais de um worker, e a limitação está aqui em vez de num
353
+ * comentário do consumidor porque é o consumidor que erra: "por enquanto é uma
354
+ * instância" é verdade até o dia do primeiro redeploy com sobreposição.
355
+ *
356
+ * É atômica dentro do processo porque a decisão inteira acontece sem `await` no
357
+ * meio — em JavaScript isso basta para que dois `dispatch` concorrentes não se
358
+ * intercalem no ponto de decisão. Essa propriedade é o que o teste de
359
+ * concorrência in-process exercita; a prova de múltiplos processos é do store
360
+ * SQL.
361
+ *
362
+ * O prazo (`ttlMs`) existe pela mesma razão do store SQL: processo que morre
363
+ * segurando reserva não pode calar a etapa para sempre. Dez minutos é muito
364
+ * maior que qualquer timeout de provider (o mais longo aqui é 10 s) e muito
365
+ * menor que o intervalo entre ciclos da régua (24 h).
366
+ */
367
+ export declare function createInMemoryDispatchClaimStore(options?: InMemoryClaimStoreOptions): DispatchClaimStore;
368
+ //# sourceMappingURL=claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/communication/claim.ts"],"names":[],"mappings":"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"}