@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,81 @@
1
+ /**
2
+ * Reserva de envio e trilha, sobre PostgreSQL.
3
+ *
4
+ * O CONTRATO (`claim.ts`, `audit.ts`) é agnóstico de armazenamento. Esta é uma
5
+ * implementação — a que qualquer produto sobre o schema do Baruk usa —, e ela
6
+ * mora ao lado do contrato em vez de dentro do produto porque a atomicidade da
7
+ * reserva é propriedade do MOTOR: um produto que a reimplementasse por conta
8
+ * própria reintroduziria a janela que ela existe para fechar, e o defeito
9
+ * apareceria só sob concorrência real.
10
+ *
11
+ * **Cada operação abre a própria transação, curta, e commita.**
12
+ *
13
+ * Não é detalhe. A régua de cobrança roda o ciclo inteiro dentro de uma
14
+ * transação longa; se a reserva vivesse nela, ela só ficaria visível para os
15
+ * outros workers no COMMIT — ou seja, depois de todos os envios. Um segundo
16
+ * worker ficaria bloqueado no lock da linha durante o ciclo inteiro do primeiro,
17
+ * e um `statement_timeout` transformaria a proteção em falha de cobrança.
18
+ *
19
+ * Commitar a reserva de imediato tem a consequência certa também no caminho
20
+ * infeliz: se a transação da régua fizer rollback DEPOIS de a mensagem ter
21
+ * saído, a reserva permanece `sent` — porque a mensagem realmente saiu, e
22
+ * ressuscitar a chave junto com o rollback mandaria a cobrança de novo.
23
+ */
24
+ import type { Db, Tx } from '../../db/client.js';
25
+ import type { DispatchClaimStore } from '../claim.js';
26
+ import type { CommunicationAuditSink, CommunicationEvent } from '../audit.js';
27
+ export interface PostgresClaimStoreOptions {
28
+ /**
29
+ * Prazo da reserva. Dez minutos por padrão: muito maior que qualquer timeout
30
+ * de provider (o mais longo aqui é 10 s) e muito menor que o intervalo entre
31
+ * ciclos da régua (24 h). Encurtá-lo aumenta o risco de duplicata; alongá-lo
32
+ * aumenta o tempo em que uma etapa fica calada depois de um crash.
33
+ */
34
+ ttlMs?: number;
35
+ }
36
+ /**
37
+ * Store de reserva do tenant.
38
+ *
39
+ * Recebe o `Db` (pool), e não uma `Tx`, exatamente para poder abrir transação
40
+ * própria. Um store que recebesse `Tx` herdaria o tempo de vida da transação de
41
+ * quem chama — que é o defeito descrito no cabeçalho.
42
+ */
43
+ export declare function createPostgresDispatchClaimStore(db: Db, tenantId: string, options?: PostgresClaimStoreOptions): DispatchClaimStore;
44
+ /**
45
+ * Trilha sobre `communication_event`.
46
+ *
47
+ * Recebe `Tx` — e aqui a escolha é OPOSTA à da reserva, de propósito. A trilha
48
+ * descreve o que a transação de negócio fez; se ela commitasse à parte, um
49
+ * rollback deixaria eventos narrando um envio que o banco desfez. A reserva
50
+ * precisa sobreviver ao rollback (a mensagem saiu de verdade); a narrativa, não.
51
+ */
52
+ export declare function createPostgresAuditSink(tx: Tx, tenantId: string): CommunicationAuditSink;
53
+ export interface CommunicationTrailEntry {
54
+ id: string;
55
+ kind: CommunicationEvent['kind'];
56
+ channel: string | null;
57
+ eventType: string;
58
+ subjectRef: string | null;
59
+ recipientRef: string | null;
60
+ idempotencyKey: string | null;
61
+ providerRef: string | null;
62
+ skipReason: string | null;
63
+ status: string | null;
64
+ code: string | null;
65
+ detail: string | null;
66
+ attempt: number | null;
67
+ occurredAt: string;
68
+ }
69
+ export interface CommunicationTrailFilter {
70
+ subjectRef?: string;
71
+ recipientRef?: string;
72
+ idempotencyKey?: string;
73
+ kind?: CommunicationEvent['kind'];
74
+ limit?: number;
75
+ }
76
+ /**
77
+ * Leitura da trilha. É o que torna a auditoria CONSULTÁVEL — sem isto, o
78
+ * registro estruturado seria só uma tabela que ninguém abre.
79
+ */
80
+ export declare function listCommunicationTrail(tx: Tx, filter?: CommunicationTrailFilter): Promise<CommunicationTrailEntry[]>;
81
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../src/communication/stores/postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAIV,kBAAkB,EAMnB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAyC9E,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,yBAA8B,GACtC,kBAAkB,CA0YpB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAuBxF;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAgDpC"}
@@ -0,0 +1,453 @@
1
+ /**
2
+ * Reserva de envio e trilha, sobre PostgreSQL.
3
+ *
4
+ * O CONTRATO (`claim.ts`, `audit.ts`) é agnóstico de armazenamento. Esta é uma
5
+ * implementação — a que qualquer produto sobre o schema do Baruk usa —, e ela
6
+ * mora ao lado do contrato em vez de dentro do produto porque a atomicidade da
7
+ * reserva é propriedade do MOTOR: um produto que a reimplementasse por conta
8
+ * própria reintroduziria a janela que ela existe para fechar, e o defeito
9
+ * apareceria só sob concorrência real.
10
+ *
11
+ * **Cada operação abre a própria transação, curta, e commita.**
12
+ *
13
+ * Não é detalhe. A régua de cobrança roda o ciclo inteiro dentro de uma
14
+ * transação longa; se a reserva vivesse nela, ela só ficaria visível para os
15
+ * outros workers no COMMIT — ou seja, depois de todos os envios. Um segundo
16
+ * worker ficaria bloqueado no lock da linha durante o ciclo inteiro do primeiro,
17
+ * e um `statement_timeout` transformaria a proteção em falha de cobrança.
18
+ *
19
+ * Commitar a reserva de imediato tem a consequência certa também no caminho
20
+ * infeliz: se a transação da régua fizer rollback DEPOIS de a mensagem ter
21
+ * saído, a reserva permanece `sent` — porque a mensagem realmente saiu, e
22
+ * ressuscitar a chave junto com o rollback mandaria a cobrança de novo.
23
+ */
24
+ import { randomUUID } from 'node:crypto';
25
+ import { withContext } from '../../db/context.js';
26
+ import { DEFAULT_CLAIM_TTL_MS } from '../claim.js';
27
+ /** Truncagem única para tudo que é texto livre vindo de provider. */
28
+ const MAX_DETAIL = 300;
29
+ const trim = (v) => v === null || v === undefined ? null : v.slice(0, MAX_DETAIL);
30
+ /**
31
+ * Store de reserva do tenant.
32
+ *
33
+ * Recebe o `Db` (pool), e não uma `Tx`, exatamente para poder abrir transação
34
+ * própria. Um store que recebesse `Tx` herdaria o tempo de vida da transação de
35
+ * quem chama — que é o defeito descrito no cabeçalho.
36
+ */
37
+ export function createPostgresDispatchClaimStore(db, tenantId, options = {}) {
38
+ const ttlSeconds = Math.max(1, Math.round((options.ttlMs ?? DEFAULT_CLAIM_TTL_MS) / 1000));
39
+ /**
40
+ * Grava um evento de ciclo de vida na transação que estiver aberta.
41
+ *
42
+ * Recebe a `Tx` de quem chama — sempre a mesma transação curta da reserva.
43
+ * É isso, e só isso, que dá a garantia que a certificação exigiu: `sent` e
44
+ * `dispatch_sent` caem ou sobrevivem juntos, porque são uma escrita só.
45
+ */
46
+ const writeLifecycle = async (tx, ctx, event) => {
47
+ await tx `
48
+ INSERT INTO communication_event (
49
+ id, tenant_id, product, brand, kind, channel, event_type, subject_ref,
50
+ recipient_ref, idempotency_key, provider_ref, skip_reason, status,
51
+ code, detail, attempt
52
+ ) VALUES (
53
+ ${randomUUID()}, ${tenantId}, ${ctx.product}, ${ctx.brand},
54
+ ${event.kind}, ${ctx.channel}, ${ctx.eventType}, ${ctx.subjectRef},
55
+ ${ctx.recipientRef}, ${ctx.idempotencyKey}, ${event.providerRef ?? null},
56
+ ${event.skipReason ?? null}, ${event.status ?? null},
57
+ ${trim(event.code)}, ${trim(event.detail)}, ${ctx.attempt}
58
+ )
59
+ `;
60
+ };
61
+ /**
62
+ * Recupera o envelope da trilha a partir da própria linha de reserva.
63
+ *
64
+ * `settle` recebe só o handle; produto, marca, canal e destinatário vivem na
65
+ * linha. Ler dali, na mesma transação, evita ter de carregá-los no handle e
66
+ * evita que o motor possa passar um envelope divergente do que foi reservado —
67
+ * a trilha descreve o que o banco tem, não o que o chamador lembra.
68
+ */
69
+ const envelopeFor = async (tx, claimId) => {
70
+ const [row] = await tx `
71
+ SELECT product, brand, channel, event_type, subject_ref, recipient_ref,
72
+ idempotency_key, attempts
73
+ FROM communication_dispatch
74
+ WHERE id = ${claimId}
75
+ LIMIT 1
76
+ `;
77
+ if (!row)
78
+ return null;
79
+ return {
80
+ product: row.product,
81
+ brand: row.brand,
82
+ channel: row.channel,
83
+ eventType: row.event_type,
84
+ subjectRef: row.subject_ref,
85
+ recipientRef: row.recipient_ref,
86
+ idempotencyKey: row.idempotency_key,
87
+ attempt: row.attempts,
88
+ };
89
+ };
90
+ return {
91
+ async claim(req) {
92
+ if (req.ctx.tenantId !== tenantId) {
93
+ // O store é de UM tenant. Um pedido de outro contexto não é "não
94
+ // autorizado": é defeito de integração, e devolver `in_flight` o
95
+ // esconderia atrás de um motivo plausível.
96
+ throw new Error('claim pedido para tenant diferente do store');
97
+ }
98
+ return withContext(db, { tenantId }, async (tx) => {
99
+ /*
100
+ * A operação inteira em UMA instrução.
101
+ *
102
+ * `INSERT ... ON CONFLICT DO UPDATE ... WHERE` é atômico por
103
+ * construção: o segundo worker a chegar bloqueia no lock da linha em
104
+ * conflito até o primeiro commitar, e só então reavalia o `WHERE`. Se o
105
+ * primeiro deixou a linha `in_flight` dentro do prazo, o `WHERE` do
106
+ * segundo é falso, o UPDATE não acontece e o `RETURNING` volta vazio —
107
+ * que é a reserva negada.
108
+ *
109
+ * Escrever isto como SELECT + UPDATE, mesmo dentro de uma transação,
110
+ * reabriria a janela sob READ COMMITTED (o padrão): o SELECT de um não
111
+ * enxerga o INSERT não commitado do outro.
112
+ *
113
+ * No SET, `communication_dispatch.status` ainda é o valor ANTIGO — é
114
+ * assim que `recovered_from_expired` sabe que a reserva foi tomada de um
115
+ * titular vencido em vez de concedida sobre uma falha retentável.
116
+ *
117
+ * `unknown_outcome` não aparece no `WHERE`, e a ausência é a regra: uma
118
+ * chave cujo desfecho ninguém conhece não volta a ser reservável sozinha.
119
+ * Sai de lá por `resolveUnknownOutcome`, que é um ato explícito.
120
+ *
121
+ * `provider_attempts` e `provider_first_attempt_at` NÃO são tocados aqui.
122
+ * Por isso o `RETURNING` os devolve com o valor do titular anterior — que
123
+ * é exatamente a pergunta que o motor precisa responder antes de decidir
124
+ * se pode reenviar.
125
+ */
126
+ const rows = await tx `
127
+ INSERT INTO communication_dispatch (
128
+ id, tenant_id, product, brand, channel, event_type, subject_ref,
129
+ recipient_ref, idempotency_key, status, claim_id, claimed_at,
130
+ claim_expires_at, recovered_from_expired, attempts
131
+ ) VALUES (
132
+ ${randomUUID()}, ${tenantId}, ${req.ctx.product}, ${req.ctx.brand},
133
+ ${req.channel}, ${req.eventType}, ${req.subjectRef},
134
+ ${req.recipientRef}, ${req.idempotencyKey}, 'in_flight', ${randomUUID()},
135
+ now(), now() + make_interval(secs => ${ttlSeconds}), false, 1
136
+ )
137
+ ON CONFLICT (tenant_id, idempotency_key) DO UPDATE
138
+ SET status = 'in_flight',
139
+ claim_id = ${randomUUID()},
140
+ claimed_at = now(),
141
+ claim_expires_at = now() + make_interval(secs => ${ttlSeconds}),
142
+ recovered_from_expired = (communication_dispatch.status = 'in_flight'),
143
+ attempts = communication_dispatch.attempts + 1,
144
+ recipient_ref = ${req.recipientRef},
145
+ updated_at = now()
146
+ WHERE communication_dispatch.status = 'failed_retryable'
147
+ OR (communication_dispatch.status = 'in_flight'
148
+ AND communication_dispatch.claim_expires_at <= now())
149
+ RETURNING id, claim_id, attempts, recovered_from_expired, provider_attempts,
150
+ (EXTRACT(EPOCH FROM (now() - provider_first_attempt_at)) * 1000)::bigint
151
+ AS provider_first_attempt_age_ms
152
+ `;
153
+ const granted = rows[0];
154
+ if (granted) {
155
+ // Retomada de titular vencido que JÁ tinha falado com o provider é
156
+ // desfecho desconhecido. Retomada de quem morreu antes disso não é.
157
+ const previousReachedProvider = granted.recovered_from_expired && granted.provider_attempts > 0;
158
+ const claim = {
159
+ claimId: granted.id,
160
+ // A GERAÇÃO da reserva, não a linha. `id` é o mesmo para o titular
161
+ // vencido e para quem o substituiu; usá-lo como trava deixaria o
162
+ // zumbi assentar por cima de quem está enviando agora.
163
+ claimToken: granted.claim_id,
164
+ idempotencyKey: req.idempotencyKey,
165
+ attempt: granted.attempts,
166
+ recoveredFromExpiredClaim: granted.recovered_from_expired,
167
+ previousAttemptReachedProvider: previousReachedProvider,
168
+ providerFirstAttemptAgeMs: granted.provider_first_attempt_age_ms === null
169
+ ? null
170
+ : Number(granted.provider_first_attempt_age_ms),
171
+ };
172
+ await writeLifecycle(tx, {
173
+ product: req.ctx.product,
174
+ brand: req.ctx.brand,
175
+ channel: req.channel,
176
+ eventType: req.eventType,
177
+ subjectRef: req.subjectRef,
178
+ recipientRef: req.recipientRef,
179
+ idempotencyKey: req.idempotencyKey,
180
+ attempt: granted.attempts,
181
+ }, {
182
+ kind: 'dispatch_claimed',
183
+ code: previousReachedProvider
184
+ ? 'recovered_unknown_outcome'
185
+ : granted.recovered_from_expired
186
+ ? 'recovered_from_expired_claim'
187
+ : null,
188
+ });
189
+ return { granted: true, claim };
190
+ }
191
+ // Nada foi reservado. O motivo vem da linha que barrou — e cada motivo
192
+ // leva a uma leitura operacional diferente, então nenhum deles pode
193
+ // virar um "não deu" genérico.
194
+ const [current] = await tx `
195
+ SELECT status, (claim_expires_at <= now()) AS expired
196
+ FROM communication_dispatch
197
+ WHERE idempotency_key = ${req.idempotencyKey}
198
+ LIMIT 1
199
+ `;
200
+ if (!current) {
201
+ // Linha some entre o INSERT e o SELECT só se alguém a apagou. Não é
202
+ // reserva concedida, e afirmar `in_flight` seria inventar um titular.
203
+ return { granted: false, reason: 'in_flight', detail: 'estado da reserva indisponível' };
204
+ }
205
+ if (current.status === 'sent')
206
+ return { granted: false, reason: 'already_sent' };
207
+ if (current.status === 'failed_permanent') {
208
+ return { granted: false, reason: 'permanently_failed' };
209
+ }
210
+ if (current.status === 'unknown_outcome') {
211
+ return {
212
+ granted: false,
213
+ reason: 'unknown_outcome',
214
+ detail: 'desfecho da tentativa anterior é desconhecido',
215
+ };
216
+ }
217
+ return { granted: false, reason: 'in_flight' };
218
+ });
219
+ },
220
+ async markProviderAttempt(claim) {
221
+ return withContext(db, { tenantId }, async (tx) => {
222
+ /*
223
+ * Transação PRÓPRIA e commitada antes da chamada externa.
224
+ *
225
+ * Se esta gravação vivesse na transação de quem chama, ela ficaria
226
+ * invisível até o commit — e o processo que morre no meio é justamente o
227
+ * que nunca commita. A marca precisa sobreviver à morte do processo que
228
+ * a escreveu, senão ela não marca nada.
229
+ *
230
+ * `claim_id` na trava: só o titular da geração corrente marca tentativa.
231
+ * `status = 'in_flight'`: uma chave assentada não recebe marca nova nem
232
+ * quando a geração por acaso coincide (`settle` preserva o `claim_id`).
233
+ *
234
+ * **O `RETURNING` é a parte nova, e é o bloqueador inteiro.** A trava já
235
+ * estava aqui e já funcionava; o que faltava era o motor SABER que ela
236
+ * disparou. Sem `RETURNING`, `UPDATE` que casa zero linhas e `UPDATE` que
237
+ * casa uma são indistinguíveis para o chamador — e o chamador seguia
238
+ * para `adapter.send()` nos dois casos.
239
+ */
240
+ const fenced = await tx `
241
+ UPDATE communication_dispatch
242
+ SET provider_attempts = provider_attempts + 1,
243
+ provider_first_attempt_at = COALESCE(provider_first_attempt_at, now()),
244
+ provider_last_attempt_at = now(),
245
+ updated_at = now()
246
+ WHERE id = ${claim.claimId}
247
+ AND claim_id = ${claim.claimToken}
248
+ AND status = 'in_flight'
249
+ RETURNING id
250
+ `;
251
+ // Uma linha atualizada = a geração corrente é a de quem chamou.
252
+ if (fenced[0])
253
+ return { authority: 'held' };
254
+ /*
255
+ * Zero linhas. A DECISÃO já está tomada — foi o `UPDATE` que a tomou,
256
+ * atomicamente — e este `SELECT` serve só para o RÓTULO. Não há TOCTOU
257
+ * aqui: o que ele lê depois não pode reautorizar um envio que o `UPDATE`
258
+ * já recusou.
259
+ */
260
+ const [current] = await tx `
261
+ SELECT status, (claim_expires_at <= now()) AS expired
262
+ FROM communication_dispatch
263
+ WHERE id = ${claim.claimId}
264
+ LIMIT 1
265
+ `;
266
+ if (!current) {
267
+ return { authority: 'lost', detail: 'linha de reserva não existe mais' };
268
+ }
269
+ if (current.status !== 'in_flight') {
270
+ return {
271
+ authority: 'already_final',
272
+ state: current.status,
273
+ detail: `chave já assentada como ${current.status}`,
274
+ };
275
+ }
276
+ return { authority: 'lost', detail: 'reserva retomada por outra execução' };
277
+ });
278
+ },
279
+ async settle(claim, outcome, event) {
280
+ await withContext(db, { tenantId }, async (tx) => {
281
+ /*
282
+ * `WHERE claim_id = ...` é a trava que faz o titular vencido não poder
283
+ * assentar por cima de quem está enviando agora.
284
+ *
285
+ * Até a H2 a comparação era por `id` — o identificador da LINHA, que
286
+ * sobrevive intacto à retomada. Ou seja: a trava estava escrita no
287
+ * comentário e não no código, e o processo que ressuscitava depois do
288
+ * prazo assentava por cima do titular novo sem que nada reclamasse. O
289
+ * que desqualifica o zumbi é não ter a GERAÇÃO corrente, e é ela que
290
+ * entra no `WHERE`.
291
+ */
292
+ const status = outcome.kind === 'sent'
293
+ ? 'sent'
294
+ : outcome.kind === 'unknown'
295
+ ? 'unknown_outcome'
296
+ : outcome.kind === 'failed'
297
+ ? outcome.permanent
298
+ ? 'failed_permanent'
299
+ : 'failed_retryable'
300
+ : 'failed_retryable';
301
+ const code = outcome.kind === 'released'
302
+ ? outcome.reason
303
+ : outcome.kind === 'sent'
304
+ ? null
305
+ : (outcome.code ?? null);
306
+ const detail = outcome.kind === 'sent' || outcome.kind === 'released' ? null : outcome.detail;
307
+ const updated = await tx `
308
+ UPDATE communication_dispatch
309
+ SET status = ${status},
310
+ settled_at = now(),
311
+ sent_at = ${outcome.kind === 'sent' ? tx `now()` : tx `sent_at`},
312
+ provider_ref = ${outcome.kind === 'sent'
313
+ ? tx `COALESCE(${outcome.providerRef ?? null}, provider_ref)`
314
+ : tx `provider_ref`},
315
+ -- Enviado e desconhecido mantêm a reserva encerrada; os demais
316
+ -- devolvem a chave imediatamente. Esperar o prazo vencer num
317
+ -- motivo já conhecido calaria a etapa por dez minutos à toa.
318
+ claim_expires_at = ${outcome.kind === 'sent' ? tx `claim_expires_at` : tx `now()`},
319
+ last_code = ${trim(code)},
320
+ last_detail = ${trim(detail)},
321
+ updated_at = now()
322
+ WHERE id = ${claim.claimId} AND claim_id = ${claim.claimToken}
323
+ RETURNING id
324
+ `;
325
+ // Zumbi recusado: nenhuma linha mudou, e nenhum evento é gravado. Uma
326
+ // trilha escrita por quem perdeu o direito de agir descreveria um envio
327
+ // que o titular atual não fez.
328
+ if (!updated[0])
329
+ return;
330
+ const envelope = await envelopeFor(tx, claim.claimId);
331
+ if (envelope)
332
+ await writeLifecycle(tx, envelope, event);
333
+ });
334
+ },
335
+ async peek(idempotencyKey) {
336
+ return withContext(db, { tenantId }, async (tx) => {
337
+ const [row] = await tx `
338
+ SELECT status, (claim_expires_at <= now()) AS expired
339
+ FROM communication_dispatch
340
+ WHERE idempotency_key = ${idempotencyKey}
341
+ LIMIT 1
342
+ `;
343
+ if (!row)
344
+ return 'none';
345
+ // Reserva vencida não é "em andamento": ninguém está com ela. Relatar
346
+ // `in_flight` faria o ensaio anunciar um envio que já morreu.
347
+ if (row.status === 'in_flight')
348
+ return row.expired ? 'failed_retryable' : 'in_flight';
349
+ return row.status;
350
+ });
351
+ },
352
+ async resolveUnknownOutcome(idempotencyKey, resolution, detail) {
353
+ await withContext(db, { tenantId }, async (tx) => {
354
+ // Só sai de `unknown_outcome`. Aplicar isto sobre uma chave em outro
355
+ // estado seria uma via lateral para reabrir um envio já assentado — e a
356
+ // reserva deixaria de ser a única autoridade sobre o direito de enviar.
357
+ const [row] = await tx `
358
+ UPDATE communication_dispatch
359
+ SET status = ${resolution === 'sent' ? 'sent' : 'failed_retryable'},
360
+ sent_at = ${resolution === 'sent' ? tx `COALESCE(sent_at, now())` : tx `sent_at`},
361
+ settled_at = now(),
362
+ claim_expires_at = now(),
363
+ last_code = ${`unknown_resolved_${resolution}`},
364
+ last_detail = ${trim(detail)},
365
+ updated_at = now()
366
+ WHERE idempotency_key = ${idempotencyKey}
367
+ AND status = 'unknown_outcome'
368
+ RETURNING id
369
+ `;
370
+ if (!row)
371
+ return;
372
+ const envelope = await envelopeFor(tx, row.id);
373
+ if (envelope) {
374
+ await writeLifecycle(tx, envelope, {
375
+ kind: resolution === 'sent' ? 'dispatch_sent' : 'dispatch_failed',
376
+ status: resolution === 'sent' ? 'sent' : null,
377
+ code: `unknown_resolved_${resolution}`,
378
+ detail: detail ?? null,
379
+ });
380
+ }
381
+ });
382
+ },
383
+ };
384
+ }
385
+ /**
386
+ * Trilha sobre `communication_event`.
387
+ *
388
+ * Recebe `Tx` — e aqui a escolha é OPOSTA à da reserva, de propósito. A trilha
389
+ * descreve o que a transação de negócio fez; se ela commitasse à parte, um
390
+ * rollback deixaria eventos narrando um envio que o banco desfez. A reserva
391
+ * precisa sobreviver ao rollback (a mensagem saiu de verdade); a narrativa, não.
392
+ */
393
+ export function createPostgresAuditSink(tx, tenantId) {
394
+ return {
395
+ async record(event) {
396
+ // Contexto de outro tenant nunca vira linha deste. Silenciar seria pior
397
+ // que gravar errado, então a checagem existe e falha alto.
398
+ if (event.ctx.tenantId !== tenantId) {
399
+ throw new Error('evento de comunicação de tenant diferente do sink');
400
+ }
401
+ await tx `
402
+ INSERT INTO communication_event (
403
+ id, tenant_id, product, brand, kind, channel, event_type, subject_ref,
404
+ recipient_ref, idempotency_key, provider_ref, skip_reason, status,
405
+ code, detail, attempt
406
+ ) VALUES (
407
+ ${randomUUID()}, ${tenantId}, ${event.ctx.product}, ${event.ctx.brand},
408
+ ${event.kind}, ${event.channel}, ${event.eventType}, ${event.subjectRef},
409
+ ${event.recipientRef}, ${event.idempotencyKey}, ${event.providerRef ?? null},
410
+ ${event.skipReason ?? null}, ${event.status ?? null},
411
+ ${trim(event.code)}, ${trim(event.detail)}, ${event.attempt ?? null}
412
+ )
413
+ `;
414
+ },
415
+ };
416
+ }
417
+ /**
418
+ * Leitura da trilha. É o que torna a auditoria CONSULTÁVEL — sem isto, o
419
+ * registro estruturado seria só uma tabela que ninguém abre.
420
+ */
421
+ export async function listCommunicationTrail(tx, filter = {}) {
422
+ const limit = Math.min(Math.max(filter.limit ?? 100, 1), 500);
423
+ const rows = await tx `
424
+ SELECT id, kind, channel, event_type, subject_ref, recipient_ref,
425
+ idempotency_key, provider_ref, skip_reason, status, code, detail,
426
+ attempt, occurred_at
427
+ FROM communication_event
428
+ WHERE true
429
+ ${filter.subjectRef ? tx `AND subject_ref = ${filter.subjectRef}` : tx ``}
430
+ ${filter.recipientRef ? tx `AND recipient_ref = ${filter.recipientRef}` : tx ``}
431
+ ${filter.idempotencyKey ? tx `AND idempotency_key = ${filter.idempotencyKey}` : tx ``}
432
+ ${filter.kind ? tx `AND kind = ${filter.kind}` : tx ``}
433
+ ORDER BY occurred_at DESC, created_at DESC
434
+ LIMIT ${limit}
435
+ `;
436
+ return rows.map((r) => ({
437
+ id: r.id,
438
+ kind: r.kind,
439
+ channel: r.channel,
440
+ eventType: r.event_type,
441
+ subjectRef: r.subject_ref,
442
+ recipientRef: r.recipient_ref,
443
+ idempotencyKey: r.idempotency_key,
444
+ providerRef: r.provider_ref,
445
+ skipReason: r.skip_reason,
446
+ status: r.status,
447
+ code: r.code,
448
+ detail: r.detail,
449
+ attempt: r.attempt,
450
+ occurredAt: r.occurred_at.toISOString(),
451
+ }));
452
+ }
453
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../src/communication/stores/postgres.ts"],"names":[],"mappings":"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"}