@baruk/core 0.3.0 → 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 (708) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +97 -0
  3. package/README.md +9 -2
  4. package/dist/auth/password-reset.d.ts +30 -1
  5. package/dist/auth/password-reset.d.ts.map +1 -1
  6. package/dist/auth/password-reset.js +139 -11
  7. package/dist/auth/password-reset.js.map +1 -1
  8. package/dist/auth/service.d.ts +39 -2
  9. package/dist/auth/service.d.ts.map +1 -1
  10. package/dist/auth/service.js +75 -10
  11. package/dist/auth/service.js.map +1 -1
  12. package/dist/billing/ar-repository.d.ts +334 -0
  13. package/dist/billing/ar-repository.d.ts.map +1 -0
  14. package/dist/billing/ar-repository.js +707 -0
  15. package/dist/billing/ar-repository.js.map +1 -0
  16. package/dist/billing/auto-generation.d.ts +87 -0
  17. package/dist/billing/auto-generation.d.ts.map +1 -0
  18. package/dist/billing/auto-generation.js +181 -0
  19. package/dist/billing/auto-generation.js.map +1 -0
  20. package/dist/billing/live-guard.d.ts +64 -0
  21. package/dist/billing/live-guard.d.ts.map +1 -0
  22. package/dist/billing/live-guard.js +68 -0
  23. package/dist/billing/live-guard.js.map +1 -0
  24. package/dist/billing/payment-means-catalog.d.ts +17 -0
  25. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  26. package/dist/billing/payment-means-catalog.js +21 -0
  27. package/dist/billing/payment-means-catalog.js.map +1 -0
  28. package/dist/billing/payment-means.d.ts +38 -0
  29. package/dist/billing/payment-means.d.ts.map +1 -0
  30. package/dist/billing/payment-means.js +29 -0
  31. package/dist/billing/payment-means.js.map +1 -0
  32. package/dist/billing/payment-rail.d.ts +118 -0
  33. package/dist/billing/payment-rail.d.ts.map +1 -0
  34. package/dist/billing/payment-rail.js +295 -0
  35. package/dist/billing/payment-rail.js.map +1 -0
  36. package/dist/billing/provider/asaas.d.ts +46 -1
  37. package/dist/billing/provider/asaas.d.ts.map +1 -1
  38. package/dist/billing/provider/asaas.js +194 -14
  39. package/dist/billing/provider/asaas.js.map +1 -1
  40. package/dist/billing/provider/manual.js +1 -1
  41. package/dist/billing/provider/manual.js.map +1 -1
  42. package/dist/billing/provider/types.d.ts +115 -8
  43. package/dist/billing/provider/types.d.ts.map +1 -1
  44. package/dist/billing/provider-account.d.ts +89 -0
  45. package/dist/billing/provider-account.d.ts.map +1 -0
  46. package/dist/billing/provider-account.js +161 -0
  47. package/dist/billing/provider-account.js.map +1 -0
  48. package/dist/billing/provider-onboarding.d.ts +67 -0
  49. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  50. package/dist/billing/provider-onboarding.js +234 -0
  51. package/dist/billing/provider-onboarding.js.map +1 -0
  52. package/dist/billing/receivable.d.ts +5 -1
  53. package/dist/billing/receivable.d.ts.map +1 -1
  54. package/dist/billing/reconcile.d.ts +58 -0
  55. package/dist/billing/reconcile.d.ts.map +1 -0
  56. package/dist/billing/reconcile.js +138 -0
  57. package/dist/billing/reconcile.js.map +1 -0
  58. package/dist/billing/repository.d.ts +90 -1
  59. package/dist/billing/repository.d.ts.map +1 -1
  60. package/dist/billing/repository.js +148 -19
  61. package/dist/billing/repository.js.map +1 -1
  62. package/dist/cjs/auth/password-reset.js +141 -11
  63. package/dist/cjs/auth/password-reset.js.map +1 -1
  64. package/dist/cjs/auth/service.js +75 -9
  65. package/dist/cjs/auth/service.js.map +1 -1
  66. package/dist/cjs/billing/ar-repository.js +728 -0
  67. package/dist/cjs/billing/ar-repository.js.map +1 -0
  68. package/dist/cjs/billing/auto-generation.js +186 -0
  69. package/dist/cjs/billing/auto-generation.js.map +1 -0
  70. package/dist/cjs/billing/live-guard.js +72 -0
  71. package/dist/cjs/billing/live-guard.js.map +1 -0
  72. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  73. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  74. package/dist/cjs/billing/payment-means.js +33 -0
  75. package/dist/cjs/billing/payment-means.js.map +1 -0
  76. package/dist/cjs/billing/payment-rail.js +301 -0
  77. package/dist/cjs/billing/payment-rail.js.map +1 -0
  78. package/dist/cjs/billing/provider/asaas.js +194 -14
  79. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  80. package/dist/cjs/billing/provider/manual.js +1 -1
  81. package/dist/cjs/billing/provider/manual.js.map +1 -1
  82. package/dist/cjs/billing/provider-account.js +170 -0
  83. package/dist/cjs/billing/provider-account.js.map +1 -0
  84. package/dist/cjs/billing/provider-onboarding.js +239 -0
  85. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  86. package/dist/cjs/billing/reconcile.js +143 -0
  87. package/dist/cjs/billing/reconcile.js.map +1 -0
  88. package/dist/cjs/billing/repository.js +150 -18
  89. package/dist/cjs/billing/repository.js.map +1 -1
  90. package/dist/cjs/clients/repository.js +96 -20
  91. package/dist/cjs/clients/repository.js.map +1 -1
  92. package/dist/cjs/collection/branding.js +140 -0
  93. package/dist/cjs/collection/branding.js.map +1 -0
  94. package/dist/cjs/collection/channel-accounts.js +137 -0
  95. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  96. package/dist/cjs/collection/channel.js +17 -0
  97. package/dist/cjs/collection/channel.js.map +1 -0
  98. package/dist/cjs/collection/communication-bridge.js +140 -0
  99. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  100. package/dist/cjs/collection/communication-runtime.js +193 -0
  101. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  102. package/dist/cjs/collection/consent-repository.js +84 -0
  103. package/dist/cjs/collection/consent-repository.js.map +1 -0
  104. package/dist/cjs/collection/copy.js +125 -0
  105. package/dist/cjs/collection/copy.js.map +1 -0
  106. package/dist/cjs/collection/delivery-callback.js +151 -0
  107. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  108. package/dist/cjs/collection/email-layout.js +252 -0
  109. package/dist/cjs/collection/email-layout.js.map +1 -0
  110. package/dist/cjs/collection/engine.js +414 -0
  111. package/dist/cjs/collection/engine.js.map +1 -0
  112. package/dist/cjs/collection/format.js +76 -0
  113. package/dist/cjs/collection/format.js.map +1 -0
  114. package/dist/cjs/collection/payment-block.js +3 -0
  115. package/dist/cjs/collection/payment-block.js.map +1 -0
  116. package/dist/cjs/collection/policy.js +147 -0
  117. package/dist/cjs/collection/policy.js.map +1 -0
  118. package/dist/cjs/collection/repository.js +260 -0
  119. package/dist/cjs/collection/repository.js.map +1 -0
  120. package/dist/cjs/collection/subject.js +104 -0
  121. package/dist/cjs/collection/subject.js.map +1 -0
  122. package/dist/cjs/collection/template-catalog.js +165 -0
  123. package/dist/cjs/collection/template-catalog.js.map +1 -0
  124. package/dist/cjs/collection/template.js +78 -0
  125. package/dist/cjs/collection/template.js.map +1 -0
  126. package/dist/cjs/communication/adapters/email.js +132 -0
  127. package/dist/cjs/communication/adapters/email.js.map +1 -0
  128. package/dist/cjs/communication/adapters/sms.js +127 -0
  129. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  130. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  131. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  132. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  133. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  134. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  135. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  136. package/dist/cjs/communication/audit.js +61 -0
  137. package/dist/cjs/communication/audit.js.map +1 -0
  138. package/dist/cjs/communication/capabilities.js +76 -0
  139. package/dist/cjs/communication/capabilities.js.map +1 -0
  140. package/dist/cjs/communication/channel.js +53 -0
  141. package/dist/cjs/communication/channel.js.map +1 -0
  142. package/dist/cjs/communication/claim.js +228 -0
  143. package/dist/cjs/communication/claim.js.map +1 -0
  144. package/dist/cjs/communication/consent.js +43 -0
  145. package/dist/cjs/communication/consent.js.map +1 -0
  146. package/dist/cjs/communication/context.js +45 -0
  147. package/dist/cjs/communication/context.js.map +1 -0
  148. package/dist/cjs/communication/credentials.js +121 -0
  149. package/dist/cjs/communication/credentials.js.map +1 -0
  150. package/dist/cjs/communication/dry-run-scenario.js +161 -0
  151. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  152. package/dist/cjs/communication/dry-run.js +97 -0
  153. package/dist/cjs/communication/dry-run.js.map +1 -0
  154. package/dist/cjs/communication/engine.js +483 -0
  155. package/dist/cjs/communication/engine.js.map +1 -0
  156. package/dist/cjs/communication/graph.js +50 -0
  157. package/dist/cjs/communication/graph.js.map +1 -0
  158. package/dist/cjs/communication/idempotency.js +26 -0
  159. package/dist/cjs/communication/idempotency.js.map +1 -0
  160. package/dist/cjs/communication/identity.js +110 -0
  161. package/dist/cjs/communication/identity.js.map +1 -0
  162. package/dist/cjs/communication/index.js +135 -0
  163. package/dist/cjs/communication/index.js.map +1 -0
  164. package/dist/cjs/communication/onboarding.js +297 -0
  165. package/dist/cjs/communication/onboarding.js.map +1 -0
  166. package/dist/cjs/communication/policy.js +16 -0
  167. package/dist/cjs/communication/policy.js.map +1 -0
  168. package/dist/cjs/communication/routing.js +77 -0
  169. package/dist/cjs/communication/routing.js.map +1 -0
  170. package/dist/cjs/communication/sender-profile.js +128 -0
  171. package/dist/cjs/communication/sender-profile.js.map +1 -0
  172. package/dist/cjs/communication/status.js +86 -0
  173. package/dist/cjs/communication/status.js.map +1 -0
  174. package/dist/cjs/communication/stores/onboarding.js +135 -0
  175. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  176. package/dist/cjs/communication/stores/postgres.js +458 -0
  177. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  178. package/dist/cjs/communication/stores/routing.js +334 -0
  179. package/dist/cjs/communication/stores/routing.js.map +1 -0
  180. package/dist/cjs/communication/stores/secrets.js +126 -0
  181. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  182. package/dist/cjs/communication/template-provider.js +22 -0
  183. package/dist/cjs/communication/template-provider.js.map +1 -0
  184. package/dist/cjs/communication/template.js +63 -0
  185. package/dist/cjs/communication/template.js.map +1 -0
  186. package/dist/cjs/communication/webhook-subscription.js +258 -0
  187. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  188. package/dist/cjs/communication/webhook.js +292 -0
  189. package/dist/cjs/communication/webhook.js.map +1 -0
  190. package/dist/cjs/competence/repository.js +309 -0
  191. package/dist/cjs/competence/repository.js.map +1 -0
  192. package/dist/cjs/contacts/phone.js +192 -0
  193. package/dist/cjs/contacts/phone.js.map +1 -0
  194. package/dist/cjs/db/seed-catalog.js +48 -0
  195. package/dist/cjs/db/seed-catalog.js.map +1 -0
  196. package/dist/cjs/db/seed.js +15 -7
  197. package/dist/cjs/db/seed.js.map +1 -1
  198. package/dist/cjs/documents/repository.js +244 -0
  199. package/dist/cjs/documents/repository.js.map +1 -0
  200. package/dist/cjs/documents/requests.js +136 -0
  201. package/dist/cjs/documents/requests.js.map +1 -0
  202. package/dist/cjs/index.js +427 -48
  203. package/dist/cjs/index.js.map +1 -1
  204. package/dist/cjs/legal/company.js +36 -0
  205. package/dist/cjs/legal/company.js.map +1 -0
  206. package/dist/cjs/legal/documents.js +671 -0
  207. package/dist/cjs/legal/documents.js.map +1 -0
  208. package/dist/cjs/legal/index.js +15 -0
  209. package/dist/cjs/legal/index.js.map +1 -0
  210. package/dist/cjs/legal/types.js +34 -0
  211. package/dist/cjs/legal/types.js.map +1 -0
  212. package/dist/cjs/mail/auth-templates.js +29 -0
  213. package/dist/cjs/mail/auth-templates.js.map +1 -0
  214. package/dist/cjs/mail/dedup-store.js +12 -51
  215. package/dist/cjs/mail/dedup-store.js.map +1 -1
  216. package/dist/cjs/mail/index.js +16 -4
  217. package/dist/cjs/mail/index.js.map +1 -1
  218. package/dist/cjs/mail/provider.js +12 -247
  219. package/dist/cjs/mail/provider.js.map +1 -1
  220. package/dist/cjs/mail/resend.js +14 -18
  221. package/dist/cjs/mail/resend.js.map +1 -1
  222. package/dist/cjs/mail/sender-resolver.js +12 -11
  223. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  224. package/dist/cjs/mail/template-renderer.js +11 -16
  225. package/dist/cjs/mail/template-renderer.js.map +1 -1
  226. package/dist/cjs/mail/transactional-outbound.js +117 -0
  227. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  228. package/dist/cjs/mail/types.js +8 -35
  229. package/dist/cjs/mail/types.js.map +1 -1
  230. package/dist/cjs/portal/provisioning.js +144 -0
  231. package/dist/cjs/portal/provisioning.js.map +1 -0
  232. package/dist/cjs/pricing-engine/canonical.js +42 -0
  233. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  234. package/dist/cjs/pricing-engine/errors.js +6 -1
  235. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  236. package/dist/cjs/pricing-engine/index.js +12 -1
  237. package/dist/cjs/pricing-engine/index.js.map +1 -1
  238. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  239. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  240. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  241. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  242. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  243. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  244. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  245. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  246. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  247. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  248. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  249. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  250. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  251. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  252. package/dist/cjs/rbac/authorize.js +28 -0
  253. package/dist/cjs/rbac/authorize.js.map +1 -1
  254. package/dist/cjs/rbac/catalog.js +67 -1
  255. package/dist/cjs/rbac/catalog.js.map +1 -1
  256. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  257. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  258. package/dist/cjs/rbac/workload.js +191 -0
  259. package/dist/cjs/rbac/workload.js.map +1 -0
  260. package/dist/cjs/storage/checksum.js +15 -0
  261. package/dist/cjs/storage/checksum.js.map +1 -0
  262. package/dist/cjs/storage/key.js +72 -0
  263. package/dist/cjs/storage/key.js.map +1 -0
  264. package/dist/cjs/storage/local.js +100 -0
  265. package/dist/cjs/storage/local.js.map +1 -0
  266. package/dist/cjs/storage/r2.js +181 -0
  267. package/dist/cjs/storage/r2.js.map +1 -0
  268. package/dist/cjs/storage/registry.js +41 -0
  269. package/dist/cjs/storage/registry.js.map +1 -0
  270. package/dist/cjs/storage/types.js +50 -0
  271. package/dist/cjs/storage/types.js.map +1 -0
  272. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  273. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  274. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  275. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  276. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  277. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  278. package/dist/cjs/subscription-billing/service.js +57 -8
  279. package/dist/cjs/subscription-billing/service.js.map +1 -1
  280. package/dist/cjs/subscription-billing/types.js.map +1 -1
  281. package/dist/cjs/tenancy/provisioning.js +32 -8
  282. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  283. package/dist/cjs/users/repository.js +119 -2
  284. package/dist/cjs/users/repository.js.map +1 -1
  285. package/dist/cjs/vault/repository.js +81 -0
  286. package/dist/cjs/vault/repository.js.map +1 -1
  287. package/dist/clients/repository.d.ts +42 -0
  288. package/dist/clients/repository.d.ts.map +1 -1
  289. package/dist/clients/repository.js +94 -21
  290. package/dist/clients/repository.js.map +1 -1
  291. package/dist/collection/branding.d.ts +72 -0
  292. package/dist/collection/branding.d.ts.map +1 -0
  293. package/dist/collection/branding.js +136 -0
  294. package/dist/collection/branding.js.map +1 -0
  295. package/dist/collection/channel-accounts.d.ts +57 -0
  296. package/dist/collection/channel-accounts.d.ts.map +1 -0
  297. package/dist/collection/channel-accounts.js +133 -0
  298. package/dist/collection/channel-accounts.js.map +1 -0
  299. package/dist/collection/channel.d.ts +24 -0
  300. package/dist/collection/channel.d.ts.map +1 -0
  301. package/dist/collection/channel.js +16 -0
  302. package/dist/collection/channel.js.map +1 -0
  303. package/dist/collection/communication-bridge.d.ts +66 -0
  304. package/dist/collection/communication-bridge.d.ts.map +1 -0
  305. package/dist/collection/communication-bridge.js +134 -0
  306. package/dist/collection/communication-bridge.js.map +1 -0
  307. package/dist/collection/communication-runtime.d.ts +95 -0
  308. package/dist/collection/communication-runtime.d.ts.map +1 -0
  309. package/dist/collection/communication-runtime.js +187 -0
  310. package/dist/collection/communication-runtime.js.map +1 -0
  311. package/dist/collection/consent-repository.d.ts +32 -0
  312. package/dist/collection/consent-repository.d.ts.map +1 -0
  313. package/dist/collection/consent-repository.js +79 -0
  314. package/dist/collection/consent-repository.js.map +1 -0
  315. package/dist/collection/copy.d.ts +50 -0
  316. package/dist/collection/copy.d.ts.map +1 -0
  317. package/dist/collection/copy.js +122 -0
  318. package/dist/collection/copy.js.map +1 -0
  319. package/dist/collection/delivery-callback.d.ts +49 -0
  320. package/dist/collection/delivery-callback.d.ts.map +1 -0
  321. package/dist/collection/delivery-callback.js +147 -0
  322. package/dist/collection/delivery-callback.js.map +1 -0
  323. package/dist/collection/email-layout.d.ts +45 -0
  324. package/dist/collection/email-layout.d.ts.map +1 -0
  325. package/dist/collection/email-layout.js +247 -0
  326. package/dist/collection/email-layout.js.map +1 -0
  327. package/dist/collection/engine.d.ts +177 -0
  328. package/dist/collection/engine.d.ts.map +1 -0
  329. package/dist/collection/engine.js +407 -0
  330. package/dist/collection/engine.js.map +1 -0
  331. package/dist/collection/format.d.ts +32 -0
  332. package/dist/collection/format.d.ts.map +1 -0
  333. package/dist/collection/format.js +70 -0
  334. package/dist/collection/format.js.map +1 -0
  335. package/dist/collection/payment-block.d.ts +24 -0
  336. package/dist/collection/payment-block.d.ts.map +1 -0
  337. package/dist/collection/payment-block.js +2 -0
  338. package/dist/collection/payment-block.js.map +1 -0
  339. package/dist/collection/policy.d.ts +53 -0
  340. package/dist/collection/policy.d.ts.map +1 -0
  341. package/dist/collection/policy.js +141 -0
  342. package/dist/collection/policy.js.map +1 -0
  343. package/dist/collection/repository.d.ts +129 -0
  344. package/dist/collection/repository.d.ts.map +1 -0
  345. package/dist/collection/repository.js +246 -0
  346. package/dist/collection/repository.js.map +1 -0
  347. package/dist/collection/subject.d.ts +66 -0
  348. package/dist/collection/subject.d.ts.map +1 -0
  349. package/dist/collection/subject.js +99 -0
  350. package/dist/collection/subject.js.map +1 -0
  351. package/dist/collection/template-catalog.d.ts +16 -0
  352. package/dist/collection/template-catalog.d.ts.map +1 -0
  353. package/dist/collection/template-catalog.js +162 -0
  354. package/dist/collection/template-catalog.js.map +1 -0
  355. package/dist/collection/template.d.ts +37 -0
  356. package/dist/collection/template.d.ts.map +1 -0
  357. package/dist/collection/template.js +73 -0
  358. package/dist/collection/template.js.map +1 -0
  359. package/dist/communication/adapters/email.d.ts +28 -0
  360. package/dist/communication/adapters/email.d.ts.map +1 -0
  361. package/dist/communication/adapters/email.js +129 -0
  362. package/dist/communication/adapters/email.js.map +1 -0
  363. package/dist/communication/adapters/sms.d.ts +95 -0
  364. package/dist/communication/adapters/sms.d.ts.map +1 -0
  365. package/dist/communication/adapters/sms.js +121 -0
  366. package/dist/communication/adapters/sms.js.map +1 -0
  367. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  368. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  369. package/dist/communication/adapters/whatsapp-language.js +36 -0
  370. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  371. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  372. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  373. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  374. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  375. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  376. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  377. package/dist/communication/adapters/whatsapp.js +210 -0
  378. package/dist/communication/adapters/whatsapp.js.map +1 -0
  379. package/dist/communication/audit.d.ts +105 -0
  380. package/dist/communication/audit.d.ts.map +1 -0
  381. package/dist/communication/audit.js +56 -0
  382. package/dist/communication/audit.js.map +1 -0
  383. package/dist/communication/capabilities.d.ts +88 -0
  384. package/dist/communication/capabilities.d.ts.map +1 -0
  385. package/dist/communication/capabilities.js +72 -0
  386. package/dist/communication/capabilities.js.map +1 -0
  387. package/dist/communication/channel.d.ts +125 -0
  388. package/dist/communication/channel.d.ts.map +1 -0
  389. package/dist/communication/channel.js +47 -0
  390. package/dist/communication/channel.js.map +1 -0
  391. package/dist/communication/claim.d.ts +368 -0
  392. package/dist/communication/claim.d.ts.map +1 -0
  393. package/dist/communication/claim.js +224 -0
  394. package/dist/communication/claim.js.map +1 -0
  395. package/dist/communication/consent.d.ts +65 -0
  396. package/dist/communication/consent.d.ts.map +1 -0
  397. package/dist/communication/consent.js +40 -0
  398. package/dist/communication/consent.js.map +1 -0
  399. package/dist/communication/context.d.ts +48 -0
  400. package/dist/communication/context.d.ts.map +1 -0
  401. package/dist/communication/context.js +41 -0
  402. package/dist/communication/context.js.map +1 -0
  403. package/dist/communication/credentials.d.ts +74 -0
  404. package/dist/communication/credentials.d.ts.map +1 -0
  405. package/dist/communication/credentials.js +115 -0
  406. package/dist/communication/credentials.js.map +1 -0
  407. package/dist/communication/dry-run-scenario.d.ts +37 -0
  408. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  409. package/dist/communication/dry-run-scenario.js +158 -0
  410. package/dist/communication/dry-run-scenario.js.map +1 -0
  411. package/dist/communication/dry-run.d.ts +40 -0
  412. package/dist/communication/dry-run.d.ts.map +1 -0
  413. package/dist/communication/dry-run.js +92 -0
  414. package/dist/communication/dry-run.js.map +1 -0
  415. package/dist/communication/engine.d.ts +153 -0
  416. package/dist/communication/engine.d.ts.map +1 -0
  417. package/dist/communication/engine.js +480 -0
  418. package/dist/communication/engine.js.map +1 -0
  419. package/dist/communication/graph.d.ts +38 -0
  420. package/dist/communication/graph.d.ts.map +1 -0
  421. package/dist/communication/graph.js +45 -0
  422. package/dist/communication/graph.js.map +1 -0
  423. package/dist/communication/idempotency.d.ts +33 -0
  424. package/dist/communication/idempotency.d.ts.map +1 -0
  425. package/dist/communication/idempotency.js +23 -0
  426. package/dist/communication/idempotency.js.map +1 -0
  427. package/dist/communication/identity.d.ts +127 -0
  428. package/dist/communication/identity.d.ts.map +1 -0
  429. package/dist/communication/identity.js +105 -0
  430. package/dist/communication/identity.js.map +1 -0
  431. package/dist/communication/index.d.ts +66 -0
  432. package/dist/communication/index.d.ts.map +1 -0
  433. package/dist/communication/index.js +42 -0
  434. package/dist/communication/index.js.map +1 -0
  435. package/dist/communication/onboarding.d.ts +223 -0
  436. package/dist/communication/onboarding.d.ts.map +1 -0
  437. package/dist/communication/onboarding.js +287 -0
  438. package/dist/communication/onboarding.js.map +1 -0
  439. package/dist/communication/policy.d.ts +99 -0
  440. package/dist/communication/policy.d.ts.map +1 -0
  441. package/dist/communication/policy.js +13 -0
  442. package/dist/communication/policy.js.map +1 -0
  443. package/dist/communication/routing.d.ts +99 -0
  444. package/dist/communication/routing.d.ts.map +1 -0
  445. package/dist/communication/routing.js +73 -0
  446. package/dist/communication/routing.js.map +1 -0
  447. package/dist/communication/sender-profile.d.ts +100 -0
  448. package/dist/communication/sender-profile.d.ts.map +1 -0
  449. package/dist/communication/sender-profile.js +123 -0
  450. package/dist/communication/sender-profile.js.map +1 -0
  451. package/dist/communication/status.d.ts +48 -0
  452. package/dist/communication/status.d.ts.map +1 -0
  453. package/dist/communication/status.js +79 -0
  454. package/dist/communication/status.js.map +1 -0
  455. package/dist/communication/stores/onboarding.d.ts +88 -0
  456. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  457. package/dist/communication/stores/onboarding.js +127 -0
  458. package/dist/communication/stores/onboarding.js.map +1 -0
  459. package/dist/communication/stores/postgres.d.ts +81 -0
  460. package/dist/communication/stores/postgres.d.ts.map +1 -0
  461. package/dist/communication/stores/postgres.js +453 -0
  462. package/dist/communication/stores/postgres.js.map +1 -0
  463. package/dist/communication/stores/routing.d.ts +169 -0
  464. package/dist/communication/stores/routing.d.ts.map +1 -0
  465. package/dist/communication/stores/routing.js +324 -0
  466. package/dist/communication/stores/routing.js.map +1 -0
  467. package/dist/communication/stores/secrets.d.ts +89 -0
  468. package/dist/communication/stores/secrets.d.ts.map +1 -0
  469. package/dist/communication/stores/secrets.js +122 -0
  470. package/dist/communication/stores/secrets.js.map +1 -0
  471. package/dist/communication/template-provider.d.ts +85 -0
  472. package/dist/communication/template-provider.d.ts.map +1 -0
  473. package/dist/communication/template-provider.js +21 -0
  474. package/dist/communication/template-provider.js.map +1 -0
  475. package/dist/communication/template.d.ts +87 -0
  476. package/dist/communication/template.d.ts.map +1 -0
  477. package/dist/communication/template.js +59 -0
  478. package/dist/communication/template.js.map +1 -0
  479. package/dist/communication/webhook-subscription.d.ts +156 -0
  480. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  481. package/dist/communication/webhook-subscription.js +252 -0
  482. package/dist/communication/webhook-subscription.js.map +1 -0
  483. package/dist/communication/webhook.d.ts +121 -0
  484. package/dist/communication/webhook.d.ts.map +1 -0
  485. package/dist/communication/webhook.js +283 -0
  486. package/dist/communication/webhook.js.map +1 -0
  487. package/dist/competence/repository.d.ts +147 -0
  488. package/dist/competence/repository.d.ts.map +1 -0
  489. package/dist/competence/repository.js +294 -0
  490. package/dist/competence/repository.js.map +1 -0
  491. package/dist/contacts/phone.d.ts +70 -0
  492. package/dist/contacts/phone.d.ts.map +1 -0
  493. package/dist/contacts/phone.js +186 -0
  494. package/dist/contacts/phone.js.map +1 -0
  495. package/dist/db/migrate.js +17 -11
  496. package/dist/db/migrate.js.map +1 -1
  497. package/dist/db/seed-catalog.d.ts +18 -0
  498. package/dist/db/seed-catalog.d.ts.map +1 -0
  499. package/dist/db/seed-catalog.js +45 -0
  500. package/dist/db/seed-catalog.js.map +1 -0
  501. package/dist/db/seed.js +16 -8
  502. package/dist/db/seed.js.map +1 -1
  503. package/dist/documents/repository.d.ts +97 -0
  504. package/dist/documents/repository.d.ts.map +1 -0
  505. package/dist/documents/repository.js +236 -0
  506. package/dist/documents/repository.js.map +1 -0
  507. package/dist/documents/requests.d.ts +73 -0
  508. package/dist/documents/requests.d.ts.map +1 -0
  509. package/dist/documents/requests.js +127 -0
  510. package/dist/documents/requests.js.map +1 -0
  511. package/dist/index.d.ts +113 -13
  512. package/dist/index.d.ts.map +1 -1
  513. package/dist/index.js +104 -8
  514. package/dist/index.js.map +1 -1
  515. package/dist/legal/company.d.ts +32 -0
  516. package/dist/legal/company.d.ts.map +1 -0
  517. package/dist/legal/company.js +33 -0
  518. package/dist/legal/company.js.map +1 -0
  519. package/dist/legal/documents.d.ts +30 -0
  520. package/dist/legal/documents.d.ts.map +1 -0
  521. package/dist/legal/documents.js +666 -0
  522. package/dist/legal/documents.js.map +1 -0
  523. package/dist/legal/index.d.ts +5 -0
  524. package/dist/legal/index.d.ts.map +1 -0
  525. package/dist/legal/index.js +4 -0
  526. package/dist/legal/index.js.map +1 -0
  527. package/dist/legal/types.d.ts +145 -0
  528. package/dist/legal/types.d.ts.map +1 -0
  529. package/dist/legal/types.js +31 -0
  530. package/dist/legal/types.js.map +1 -0
  531. package/dist/mail/auth-templates.d.ts +15 -0
  532. package/dist/mail/auth-templates.d.ts.map +1 -0
  533. package/dist/mail/auth-templates.js +26 -0
  534. package/dist/mail/auth-templates.js.map +1 -0
  535. package/dist/mail/dedup-store.d.ts +1 -24
  536. package/dist/mail/dedup-store.d.ts.map +1 -1
  537. package/dist/mail/dedup-store.js +9 -48
  538. package/dist/mail/dedup-store.js.map +1 -1
  539. package/dist/mail/index.d.ts +2 -1
  540. package/dist/mail/index.d.ts.map +1 -1
  541. package/dist/mail/index.js +13 -2
  542. package/dist/mail/index.js.map +1 -1
  543. package/dist/mail/provider.d.ts +2 -30
  544. package/dist/mail/provider.d.ts.map +1 -1
  545. package/dist/mail/provider.js +10 -246
  546. package/dist/mail/provider.js.map +1 -1
  547. package/dist/mail/resend.d.ts +2 -12
  548. package/dist/mail/resend.d.ts.map +1 -1
  549. package/dist/mail/resend.js +11 -17
  550. package/dist/mail/resend.js.map +1 -1
  551. package/dist/mail/sender-resolver.d.ts +1 -7
  552. package/dist/mail/sender-resolver.d.ts.map +1 -1
  553. package/dist/mail/sender-resolver.js +11 -10
  554. package/dist/mail/sender-resolver.js.map +1 -1
  555. package/dist/mail/template-renderer.d.ts +1 -9
  556. package/dist/mail/template-renderer.d.ts.map +1 -1
  557. package/dist/mail/template-renderer.js +10 -15
  558. package/dist/mail/template-renderer.js.map +1 -1
  559. package/dist/mail/transactional-outbound.d.ts +115 -0
  560. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  561. package/dist/mail/transactional-outbound.js +113 -0
  562. package/dist/mail/transactional-outbound.js.map +1 -0
  563. package/dist/mail/types.d.ts +2 -142
  564. package/dist/mail/types.d.ts.map +1 -1
  565. package/dist/mail/types.js +1 -33
  566. package/dist/mail/types.js.map +1 -1
  567. package/dist/portal/provisioning.d.ts +58 -0
  568. package/dist/portal/provisioning.d.ts.map +1 -0
  569. package/dist/portal/provisioning.js +139 -0
  570. package/dist/portal/provisioning.js.map +1 -0
  571. package/dist/pricing-engine/canonical.d.ts +14 -0
  572. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  573. package/dist/pricing-engine/canonical.js +39 -0
  574. package/dist/pricing-engine/canonical.js.map +1 -0
  575. package/dist/pricing-engine/errors.d.ts.map +1 -1
  576. package/dist/pricing-engine/errors.js +6 -1
  577. package/dist/pricing-engine/errors.js.map +1 -1
  578. package/dist/pricing-engine/index.d.ts +12 -2
  579. package/dist/pricing-engine/index.d.ts.map +1 -1
  580. package/dist/pricing-engine/index.js +6 -1
  581. package/dist/pricing-engine/index.js.map +1 -1
  582. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  583. package/dist/pricing-engine/pipeline.js +202 -28
  584. package/dist/pricing-engine/pipeline.js.map +1 -1
  585. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  586. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  587. package/dist/pricing-engine/shadow-adapter.js +75 -0
  588. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  589. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  590. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  591. package/dist/pricing-engine/shadow-diff.js +52 -0
  592. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  593. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  594. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  595. package/dist/pricing-engine/shadow-facade.js +82 -0
  596. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  597. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  598. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  599. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  600. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  601. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  602. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  603. package/dist/pricing-engine/shadow-metrics.js +31 -0
  604. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  605. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  606. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  607. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  608. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  609. package/dist/pricing-engine/types.d.ts +2 -0
  610. package/dist/pricing-engine/types.d.ts.map +1 -1
  611. package/dist/rbac/authorize.d.ts +12 -0
  612. package/dist/rbac/authorize.d.ts.map +1 -1
  613. package/dist/rbac/authorize.js +27 -0
  614. package/dist/rbac/authorize.js.map +1 -1
  615. package/dist/rbac/catalog.d.ts.map +1 -1
  616. package/dist/rbac/catalog.js +67 -1
  617. package/dist/rbac/catalog.js.map +1 -1
  618. package/dist/rbac/workload-provisioning.d.ts +66 -0
  619. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  620. package/dist/rbac/workload-provisioning.js +153 -0
  621. package/dist/rbac/workload-provisioning.js.map +1 -0
  622. package/dist/rbac/workload.d.ts +124 -0
  623. package/dist/rbac/workload.d.ts.map +1 -0
  624. package/dist/rbac/workload.js +184 -0
  625. package/dist/rbac/workload.js.map +1 -0
  626. package/dist/storage/checksum.d.ts +9 -0
  627. package/dist/storage/checksum.d.ts.map +1 -0
  628. package/dist/storage/checksum.js +12 -0
  629. package/dist/storage/checksum.js.map +1 -0
  630. package/dist/storage/key.d.ts +37 -0
  631. package/dist/storage/key.d.ts.map +1 -0
  632. package/dist/storage/key.js +67 -0
  633. package/dist/storage/key.js.map +1 -0
  634. package/dist/storage/local.d.ts +40 -0
  635. package/dist/storage/local.d.ts.map +1 -0
  636. package/dist/storage/local.js +96 -0
  637. package/dist/storage/local.js.map +1 -0
  638. package/dist/storage/r2.d.ts +43 -0
  639. package/dist/storage/r2.d.ts.map +1 -0
  640. package/dist/storage/r2.js +177 -0
  641. package/dist/storage/r2.js.map +1 -0
  642. package/dist/storage/registry.d.ts +23 -0
  643. package/dist/storage/registry.d.ts.map +1 -0
  644. package/dist/storage/registry.js +37 -0
  645. package/dist/storage/registry.js.map +1 -0
  646. package/dist/storage/types.d.ts +67 -0
  647. package/dist/storage/types.d.ts.map +1 -0
  648. package/dist/storage/types.js +45 -0
  649. package/dist/storage/types.js.map +1 -0
  650. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  651. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  652. package/dist/subscription-billing/provider/asaas.js +32 -7
  653. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  654. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  655. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  656. package/dist/subscription-billing/provider/disabled.js +8 -0
  657. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  658. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  659. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  660. package/dist/subscription-billing/provider/registry.js +17 -0
  661. package/dist/subscription-billing/provider/registry.js.map +1 -1
  662. package/dist/subscription-billing/service.d.ts +17 -1
  663. package/dist/subscription-billing/service.d.ts.map +1 -1
  664. package/dist/subscription-billing/service.js +57 -8
  665. package/dist/subscription-billing/service.js.map +1 -1
  666. package/dist/subscription-billing/types.d.ts +13 -0
  667. package/dist/subscription-billing/types.d.ts.map +1 -1
  668. package/dist/subscription-billing/types.js.map +1 -1
  669. package/dist/tenancy/provisioning.d.ts.map +1 -1
  670. package/dist/tenancy/provisioning.js +32 -8
  671. package/dist/tenancy/provisioning.js.map +1 -1
  672. package/dist/users/repository.d.ts +38 -0
  673. package/dist/users/repository.d.ts.map +1 -1
  674. package/dist/users/repository.js +118 -3
  675. package/dist/users/repository.js.map +1 -1
  676. package/dist/vault/repository.d.ts +67 -0
  677. package/dist/vault/repository.d.ts.map +1 -1
  678. package/dist/vault/repository.js +78 -0
  679. package/dist/vault/repository.js.map +1 -1
  680. package/package.json +19 -4
  681. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  682. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  683. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  684. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  685. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  686. package/src/db/migrations/0028_collection_engine.sql +94 -0
  687. package/src/db/migrations/0029_payment_rail.sql +107 -0
  688. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  689. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  690. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  691. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  692. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  693. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  694. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  695. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  696. package/src/db/migrations/0038_notification_channels.sql +175 -0
  697. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  698. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  699. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  700. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  701. package/src/db/migrations/0043_workload_identity.sql +105 -0
  702. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  703. package/dist/cjs/mail/resend-client.js +0 -103
  704. package/dist/cjs/mail/resend-client.js.map +0 -1
  705. package/dist/mail/resend-client.d.ts +0 -16
  706. package/dist/mail/resend-client.d.ts.map +0 -1
  707. package/dist/mail/resend-client.js +0 -100
  708. package/dist/mail/resend-client.js.map +0 -1
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Quem é o ASSUNTO de uma cobrança — e se existe um.
3
+ *
4
+ * ## O falso positivo que este módulo existe para matar
5
+ *
6
+ * O preflight de envio avulso respondia `eligible: true` medindo seis portas —
7
+ * identidade, credencial, destinatário, telefone, consentimento, template — e
8
+ * nenhuma delas pergunta **sobre o quê** a mensagem falaria. Um cliente sem
9
+ * recebível nenhum passava nas seis, e a rota de envio recusava logo depois por
10
+ * falta de valor e vencimento.
11
+ *
12
+ * Um preflight que aprova o que a execução recusa é pior que não ter preflight:
13
+ * ele desloca a descoberta do defeito para o momento do disparo, que é
14
+ * exatamente onde ninguém quer descobrir nada.
15
+ *
16
+ * ## Por que aqui, e não no handler
17
+ *
18
+ * "Este recebível está devido na etapa D+3 hoje?" é regra da RÉGUA. Ela já vive
19
+ * em `policy.ts` (`dueSteps`, `scheduledDateFor`) e em `engine.ts`
20
+ * (`isCollectible`), e é usada pelo ciclo automático. Reimplementar a mesma
21
+ * conta dentro de uma rota criaria a segunda derivação de sempre — as duas
22
+ * concordariam no dia da escrita e divergiriam na primeira mudança da régua,
23
+ * com o avulso mandando o que o ciclo não mandaria.
24
+ *
25
+ * Este módulo não decide política nova: ele **lê** a política vigente e responde
26
+ * quem ela alcança, sem escrever nada.
27
+ */
28
+ import { listReceivables } from '../billing/ar-repository.js';
29
+ import { dueSteps } from './policy.js';
30
+ import { getCollectionPolicy, handledStepKeys } from './repository.js';
31
+ /**
32
+ * Um recebível ainda merece cobrança?
33
+ *
34
+ * Cópia deliberada da regra de `engine.ts`, que era privada. Exportar de lá e
35
+ * importar aqui criaria ciclo (`engine` já importa deste módulo o suficiente);
36
+ * a duplicação é de UMA função pequena e está coberta pelo teste de
37
+ * equivalência em `collection-subject.test.ts`, que exercita as duas contra os
38
+ * mesmos casos.
39
+ */
40
+ export function isCollectibleSubject(r) {
41
+ if (r.status === 'paid' || r.status === 'canceled')
42
+ return false;
43
+ if (r.status === 'renegotiated' || r.status === 'written_off')
44
+ return false;
45
+ // Saldo zero sem status `paid` é quem já pagou e o status não foi reavaliado.
46
+ // Cobrar aqui é o pior erro operacional deste motor.
47
+ if (r.outstandingAmount <= 0)
48
+ return false;
49
+ if (!r.dueDate)
50
+ return false;
51
+ return true;
52
+ }
53
+ /**
54
+ * Os recebíveis do cliente que a etapa alcança HOJE.
55
+ *
56
+ * Vazio quer dizer "não há sobre o que cobrar nesta etapa", e é um desfecho
57
+ * legítimo — não um erro. Cabe a quem chama transformar isso em recusa.
58
+ *
59
+ * A ordem é a mesma da régua (vencimento mais antigo primeiro), para que o
60
+ * avulso e o ciclo escolham o mesmo quando houver mais de um.
61
+ */
62
+ export async function findEligibleSubjects(tx, q) {
63
+ const policy = q.policy ?? (await getCollectionPolicy(tx));
64
+ /*
65
+ * Nenhuma checagem própria de política ou de etapa aqui.
66
+ *
67
+ * A primeira versão tinha duas — "a régua está ativa" e "a etapa existe e
68
+ * está ativa" — e o teste de mutação derrubou as duas: removê-las não quebrava
69
+ * caso nenhum, porque `dueSteps` já decide exatamente isso. Guard que nenhum
70
+ * teste consegue distinguir não é guard: é uma segunda codificação da mesma
71
+ * regra, esperando para divergir da primeira.
72
+ *
73
+ * O que sobra deste módulo é o que ele de fato acrescenta: recortar por
74
+ * cliente, aplicar `isCollectibleSubject` e perguntar à régua. `dueSteps`
75
+ * continua sendo a única autoridade sobre quando uma etapa vence.
76
+ */
77
+ const { items } = await listReceivables(tx, { clientId: q.clientId, limit: 200 });
78
+ const elegiveis = [];
79
+ for (const r of items) {
80
+ if (!isCollectibleSubject(r))
81
+ continue;
82
+ const handled = await handledStepKeys(tx, r.id);
83
+ const due = dueSteps(policy, r.dueDate, q.today, handled);
84
+ if (due.some((d) => d.step.key === q.stepKey))
85
+ elegiveis.push(r);
86
+ }
87
+ return elegiveis;
88
+ }
89
+ /**
90
+ * O assunto que o envio avulso usaria, ou `null`.
91
+ *
92
+ * Quando há mais de um, o mais antigo — mesma preferência da régua. Escolher o
93
+ * mais recente faria a dívida velha envelhecer sem cobrança.
94
+ */
95
+ export async function resolveSubjectForStep(tx, q) {
96
+ const todos = await findEligibleSubjects(tx, q);
97
+ return todos[0] ?? null;
98
+ }
99
+ //# sourceMappingURL=subject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/collection/subject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,eAAe,EAA8B,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAwB;IAC3D,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC;IAC5E,8EAA8E;IAC9E,qDAAqD;IACrD,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAWD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAM,EACN,CAAuB;IAEvB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3D;;;;;;;;;;;;OAYG;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAElF,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAAE,SAAS;QACvC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAM,EACN,CAAuB;IAEvB,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Catálogo de templates da COBRANÇA — do produto, não do motor.
3
+ *
4
+ * O motor sabe resolver template (escopo, versão, aprovação); ele não conhece
5
+ * nenhum. Os textos e os nomes registrados no provider vivem aqui, ao lado da
6
+ * régua que os usa.
7
+ *
8
+ * O corpo dos e-mails continua vindo de `copy.ts`/`email-layout.ts`: este
9
+ * catálogo declara QUAL template vale para cada etapa e canal, e as variáveis
10
+ * que ele consome. Duplicar o texto aqui criaria duas fontes para a mesma
11
+ * mensagem, e a segunda ficaria para trás na primeira correção.
12
+ */
13
+ import type { Tx } from '../db/client.js';
14
+ import type { TemplateStore } from '../communication/index.js';
15
+ export declare function createCollectionTemplateStore(tx: Tx): TemplateStore;
16
+ //# sourceMappingURL=template-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-catalog.d.ts","sourceRoot":"","sources":["../../src/collection/template-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAA8B,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA6I3F,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,EAAE,GAAG,aAAa,CAsBnE"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Catálogo de templates da COBRANÇA — do produto, não do motor.
3
+ *
4
+ * O motor sabe resolver template (escopo, versão, aprovação); ele não conhece
5
+ * nenhum. Os textos e os nomes registrados no provider vivem aqui, ao lado da
6
+ * régua que os usa.
7
+ *
8
+ * O corpo dos e-mails continua vindo de `copy.ts`/`email-layout.ts`: este
9
+ * catálogo declara QUAL template vale para cada etapa e canal, e as variáveis
10
+ * que ele consome. Duplicar o texto aqui criaria duas fontes para a mesma
11
+ * mensagem, e a segunda ficaria para trás na primeira correção.
12
+ */
13
+ import { SC_PRODUCT } from './communication-bridge.js';
14
+ const LOCALE = 'pt-BR';
15
+ /**
16
+ * Variáveis da cobrança, na ordem em que os templates de WhatsApp as declaram.
17
+ *
18
+ * A ordem é contrato com o template aprovado no provider: `{{1}}` é o nome,
19
+ * `{{2}}` o valor, `{{3}}` o vencimento. Trocar a ordem aqui sem re-aprovar o
20
+ * template lá manda o valor no lugar do nome — e a Meta aceita, porque para ela
21
+ * são três strings.
22
+ */
23
+ const COLLECTION_VARS = ['clientName', 'amount', 'dueDate'];
24
+ /**
25
+ * Sufixo do nome REGISTRADO NO PROVIDER.
26
+ *
27
+ * Muda **somente** quando um template novo é submetido e aprovado do lado da
28
+ * Meta. Mexer aqui sem submeter faz o despacho pedir um nome que não existe — e
29
+ * a Meta responde `132001`, que fala de "translation" e manda quem investiga
30
+ * procurar no lugar errado.
31
+ */
32
+ const PROVIDER_TEMPLATE_SUFFIX = 'v1';
33
+ /**
34
+ * Revisão INTERNA do catálogo de WhatsApp. **Nunca chega ao provider.**
35
+ *
36
+ * Entra na chave de idempotência (`buildIdempotencyKey` recebe
37
+ * `templateVersion`), e é o único jeito legítimo de dizer "esta é outra
38
+ * tentativa lógica" sem tocar no template aprovado.
39
+ *
40
+ * ## Por que os dois existem separados
41
+ *
42
+ * Eram dois literais `'v1'` — um em `version`, outro dentro da interpolação de
43
+ * `providerTemplateName` —, independentes de fato e idênticos na aparência. A
44
+ * primeira pessoa que precisasse de uma chave nova bumparia o que estivesse
45
+ * mais à mão, e havia 50% de chance de o despacho passar a pedir
46
+ * `billing_dunning_dplus3_v2` à Meta, que não tem esse template.
47
+ *
48
+ * `v2` aqui porque a revisão `v1` foi consumida: em 2026-09-01 a primeira
49
+ * tentativa real assentou a chave como `failed_permanent`, e o motor recusa
50
+ * repetição sobre chave assentada — corretamente. O template aprovado continua
51
+ * sendo `billing_dunning_dplus3_v1`.
52
+ *
53
+ * E-mail e SMS **não** bumpam: os dois têm despacho real em produção, e mudar a
54
+ * versão deles reabriria chaves já assentadas de 89 avisos que já saíram.
55
+ */
56
+ const WHATSAPP_CATALOG_REVISION = 'v2';
57
+ /**
58
+ * E-mail: sempre disponível, porque o corpo é montado pelo produto.
59
+ *
60
+ * `approved` aqui não significa "aprovado por um provider" — e-mail não tem
61
+ * registro prévio. Significa "utilizável", que é o que o motor precisa saber.
62
+ */
63
+ function emailTemplate(eventType) {
64
+ return {
65
+ tenantId: null,
66
+ product: SC_PRODUCT,
67
+ brand: null,
68
+ channel: 'email',
69
+ eventType,
70
+ locale: LOCALE,
71
+ version: 'v1',
72
+ status: 'approved',
73
+ variables: [...COLLECTION_VARS],
74
+ };
75
+ }
76
+ /**
77
+ * WhatsApp: só existe se o escritório tiver registrado o template no provider.
78
+ *
79
+ * O nome segue o evento (`billing.dunning.dplus3` → `billing_dunning_dplus3_v1`)
80
+ * porque é a única convenção que não exige uma segunda tabela de-para que
81
+ * alguém precisaria manter sincronizada com o painel da Meta.
82
+ *
83
+ * **Não é declarado aprovado por padrão.** Um template que este código afirma
84
+ * existir e que ninguém registrou vira recusa do provider a cada etapa da régua
85
+ * — e a recusa chega como falha de entrega, sugerindo problema no cliente.
86
+ */
87
+ function whatsappTemplate(eventType, approved) {
88
+ return {
89
+ tenantId: null,
90
+ product: SC_PRODUCT,
91
+ brand: null,
92
+ channel: 'whatsapp',
93
+ eventType,
94
+ locale: LOCALE,
95
+ // Revisão interna — some antes da fronteira do provider.
96
+ version: WHATSAPP_CATALOG_REVISION,
97
+ status: approved ? 'approved' : 'pending_approval',
98
+ // Nome no provider — o sufixo é o do TEMPLATE APROVADO, não o da revisão.
99
+ providerTemplateName: `${eventType.replace(/\./g, '_')}_${PROVIDER_TEMPLATE_SUFFIX}`,
100
+ variables: [...COLLECTION_VARS],
101
+ };
102
+ }
103
+ function smsTemplate(eventType, approved) {
104
+ return {
105
+ tenantId: null,
106
+ product: SC_PRODUCT,
107
+ brand: null,
108
+ channel: 'sms',
109
+ eventType,
110
+ locale: LOCALE,
111
+ version: 'v1',
112
+ status: approved ? 'approved' : 'pending_approval',
113
+ variables: [...COLLECTION_VARS],
114
+ // Curto de propósito: cada segmento é cobrado, e o link é o que faz o
115
+ // cliente agir. Sem link, a mensagem só informa.
116
+ body: '{{clientName}}, consta {{amount}} com vencimento {{dueDate}}.',
117
+ };
118
+ }
119
+ /**
120
+ * Quais eventos o escritório tem registrados em cada canal.
121
+ *
122
+ * Vem de `tenant.settings.channels.<canal>.approvedEvents`. Ausente = nenhum, e
123
+ * o e-mail segue funcionando: ligar um canal novo nunca pode desligar o que já
124
+ * funcionava.
125
+ */
126
+ // `tenant` não tem RLS — é a tabela raiz, define a fronteira em vez de ser
127
+ // protegida por ela. Toda leitura dela exige a amarra explícita na GUC da
128
+ // sessão; sem isso, o `tenantId` do parâmetro é a única coisa que separa um
129
+ // escritório do outro, e um parâmetro não é uma fronteira.
130
+ async function approvedEvents(tx, tenantId, channel) {
131
+ const rows = await tx `
132
+ SELECT settings FROM tenant
133
+ WHERE id = ${tenantId}
134
+ AND id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
135
+ LIMIT 1
136
+ `;
137
+ const channels = (rows[0]?.settings?.channels ?? {});
138
+ const list = channels[channel]?.approvedEvents;
139
+ return new Set(Array.isArray(list) ? list.filter((v) => typeof v === 'string') : []);
140
+ }
141
+ export function createCollectionTemplateStore(tx) {
142
+ return {
143
+ async candidates(ctx, channel, eventType, locale) {
144
+ if (ctx.product !== SC_PRODUCT || locale !== LOCALE)
145
+ return [];
146
+ if (channel === 'email')
147
+ return [emailTemplate(eventType)];
148
+ if (channel === 'whatsapp') {
149
+ const approved = await approvedEvents(tx, ctx.tenantId, 'whatsapp');
150
+ return [whatsappTemplate(eventType, approved.has(eventType))];
151
+ }
152
+ if (channel === 'sms') {
153
+ const approved = await approvedEvents(tx, ctx.tenantId, 'sms');
154
+ return [smsTemplate(eventType, approved.has(eventType))];
155
+ }
156
+ // `notification` é evento interno e não passa pelo motor: a régua o
157
+ // resolve antes, escalando para a fila humana sem mensagem ao cliente.
158
+ return [];
159
+ },
160
+ };
161
+ }
162
+ //# sourceMappingURL=template-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-catalog.js","sourceRoot":"","sources":["../../src/collection/template-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { StepTone } from './policy.js';
2
+ /**
3
+ * Templates de cobrança.
4
+ *
5
+ * Substituição é por ALLOWLIST de variáveis, não por interpolação livre: o
6
+ * template vem de configuração de tenant, e um `${...}` avaliado seria execução
7
+ * arbitrária a partir de dado editável pelo usuário. Aqui, `{{x}}` só resolve se
8
+ * `x` estiver na lista; qualquer outra coisa fica literal e visível — falha à
9
+ * vista, nunca silenciosa.
10
+ */
11
+ export interface TemplateVars {
12
+ clientName: string;
13
+ officeName: string;
14
+ dueDate: string;
15
+ outstandingAmount: string;
16
+ reference: string;
17
+ }
18
+ export declare const TEMPLATE_VARIABLES: readonly (keyof TemplateVars)[];
19
+ export interface CollectionTemplate {
20
+ subject: string;
21
+ body: string;
22
+ }
23
+ /**
24
+ * Textos padrão por tom.
25
+ *
26
+ * Nenhum deles ameaça, cita medida judicial, negativação ou consequência legal.
27
+ * Cobrança automatizada que produz esse tipo de texto sem revisão humana é risco
28
+ * jurídico e de relacionamento — a etapa mais dura da régua padrão escala para
29
+ * uma pessoa em vez de escrever por conta própria.
30
+ */
31
+ declare const DEFAULT_TEMPLATES: Record<string, CollectionTemplate>;
32
+ /** Resolve o template; cai no padrão do tom quando o tenant não tem o seu. */
33
+ export declare function resolveTemplate(templateKey: string, tone: StepTone, overrides?: Record<string, CollectionTemplate>): CollectionTemplate;
34
+ /** Substitui `{{var}}` pelas variáveis da allowlist. O resto fica literal. */
35
+ export declare function renderTemplate(text: string, vars: TemplateVars): string;
36
+ export { DEFAULT_TEMPLATES };
37
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/collection/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;GAQG;AAEH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,MAAM,YAAY,CAAC,EAM7D,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAyCzD,CAAC;AAUF,8EAA8E;AAC9E,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,QAAQ,EACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC7C,kBAAkB,CAMpB;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAMvE;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,73 @@
1
+ export const TEMPLATE_VARIABLES = [
2
+ 'clientName',
3
+ 'officeName',
4
+ 'dueDate',
5
+ 'outstandingAmount',
6
+ 'reference',
7
+ ];
8
+ /**
9
+ * Textos padrão por tom.
10
+ *
11
+ * Nenhum deles ameaça, cita medida judicial, negativação ou consequência legal.
12
+ * Cobrança automatizada que produz esse tipo de texto sem revisão humana é risco
13
+ * jurídico e de relacionamento — a etapa mais dura da régua padrão escala para
14
+ * uma pessoa em vez de escrever por conta própria.
15
+ */
16
+ const DEFAULT_TEMPLATES = {
17
+ 'collection.reminder': {
18
+ subject: 'Lembrete: vencimento em {{dueDate}}',
19
+ body: 'Olá, {{clientName}}.\n\n' +
20
+ 'Passando para lembrar que o valor de {{outstandingAmount}} vence em {{dueDate}}.\n' +
21
+ 'Referência: {{reference}}.\n\n' +
22
+ 'Se já tiver pago, desconsidere esta mensagem.\n\n{{officeName}}',
23
+ },
24
+ 'collection.due': {
25
+ subject: 'Vence hoje: {{outstandingAmount}}',
26
+ body: 'Olá, {{clientName}}.\n\n' +
27
+ 'O valor de {{outstandingAmount}} vence hoje ({{dueDate}}).\n' +
28
+ 'Referência: {{reference}}.\n\n' +
29
+ 'Se já tiver pago, desconsidere esta mensagem.\n\n{{officeName}}',
30
+ },
31
+ 'collection.overdue_soft': {
32
+ subject: 'Pendência em aberto — {{reference}}',
33
+ body: 'Olá, {{clientName}}.\n\n' +
34
+ 'Consta em aberto o valor de {{outstandingAmount}}, com vencimento em {{dueDate}}.\n' +
35
+ 'Se o pagamento já foi feito, por favor nos avise para darmos baixa.\n\n' +
36
+ 'Qualquer dúvida, estamos à disposição.\n\n{{officeName}}',
37
+ },
38
+ 'collection.overdue': {
39
+ subject: 'Pendência em aberto desde {{dueDate}}',
40
+ body: 'Olá, {{clientName}}.\n\n' +
41
+ 'O valor de {{outstandingAmount}}, vencido em {{dueDate}}, segue em aberto.\n' +
42
+ 'Referência: {{reference}}.\n\n' +
43
+ 'Pedimos que entre em contato para regularizarmos ou combinarmos a melhor forma.\n\n' +
44
+ '{{officeName}}',
45
+ },
46
+ // Interno: nunca vai ao cliente. Ver a nota em `policy.ts`.
47
+ 'collection.escalate': {
48
+ subject: 'Cobrança escalada para atendimento humano — {{clientName}}',
49
+ body: 'A régua automática chegou ao fim para {{clientName}} ({{reference}}), com ' +
50
+ '{{outstandingAmount}} em aberto desde {{dueDate}}. A partir daqui a condução é humana.',
51
+ },
52
+ };
53
+ const TONE_FALLBACK = {
54
+ reminder: 'collection.reminder',
55
+ due_notice: 'collection.due',
56
+ friendly_collection: 'collection.overdue_soft',
57
+ overdue_collection: 'collection.overdue',
58
+ human_escalation: 'collection.escalate',
59
+ };
60
+ /** Resolve o template; cai no padrão do tom quando o tenant não tem o seu. */
61
+ export function resolveTemplate(templateKey, tone, overrides) {
62
+ return (overrides?.[templateKey] ??
63
+ DEFAULT_TEMPLATES[templateKey] ??
64
+ DEFAULT_TEMPLATES[TONE_FALLBACK[tone]]);
65
+ }
66
+ /** Substitui `{{var}}` pelas variáveis da allowlist. O resto fica literal. */
67
+ export function renderTemplate(text, vars) {
68
+ return text.replace(/\{\{\s*([a-zA-Z]+)\s*\}\}/g, (whole, name) => TEMPLATE_VARIABLES.includes(name)
69
+ ? String(vars[name] ?? '')
70
+ : whole);
71
+ }
72
+ export { DEFAULT_TEMPLATES };
73
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/collection/template.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,kBAAkB,GAAoC;IACjE,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,mBAAmB;IACnB,WAAW;CACZ,CAAC;AAOF;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAuC;IAC5D,qBAAqB,EAAE;QACrB,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EACF,0BAA0B;YAC1B,oFAAoF;YACpF,gCAAgC;YAChC,iEAAiE;KACpE;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,mCAAmC;QAC5C,IAAI,EACF,0BAA0B;YAC1B,8DAA8D;YAC9D,gCAAgC;YAChC,iEAAiE;KACpE;IACD,yBAAyB,EAAE;QACzB,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EACF,0BAA0B;YAC1B,qFAAqF;YACrF,yEAAyE;YACzE,0DAA0D;KAC7D;IACD,oBAAoB,EAAE;QACpB,OAAO,EAAE,uCAAuC;QAChD,IAAI,EACF,0BAA0B;YAC1B,8EAA8E;YAC9E,gCAAgC;YAChC,qFAAqF;YACrF,gBAAgB;KACnB;IACD,4DAA4D;IAC5D,qBAAqB,EAAE;QACrB,OAAO,EAAE,4DAA4D;QACrE,IAAI,EACF,4EAA4E;YAC5E,wFAAwF;KAC3F;CACF,CAAC;AAEF,MAAM,aAAa,GAA6B;IAC9C,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE,gBAAgB;IAC5B,mBAAmB,EAAE,yBAAyB;IAC9C,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,qBAAqB;CACxC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,IAAc,EACd,SAA8C;IAE9C,OAAO,CACL,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,iBAAiB,CAAC,WAAW,CAAC;QAC9B,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAE,CACxC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAkB;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACvE,kBAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAA0B,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC,CAAC,KAAK,CACV,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Adapter de e-mail — envelope do envio que o Office já usa.
3
+ *
4
+ * **Nenhum motor novo de e-mail.** Convites, ativação, recuperação de senha e a
5
+ * régua de cobrança já passam por `mail/resend.ts`. Este adapter apenas o expõe
6
+ * sob o contrato multicanal, para que o e-mail seja UM canal entre outros em vez
7
+ * de o caminho especial que todos os outros tentam imitar.
8
+ *
9
+ * A supressão em teste continua onde estava, no `sendEmail` do core: uma guarda
10
+ * que mora no adapter é uma guarda que o próximo adapter esquece.
11
+ */
12
+ import type { CommunicationChannel } from '../channel.js';
13
+ import type { ChannelAccount } from '../identity.js';
14
+ export interface EmailAdapterConfig {
15
+ /** Conta do tenant, resolvida ANTES pelo motor. Ver `identity.ts`. */
16
+ account: ChannelAccount;
17
+ /**
18
+ * Resolve o valor da credencial a partir da referência lógica.
19
+ *
20
+ * Recebe `account.credentialRef` e devolve o segredo. O segredo entra no
21
+ * adapter e morre nele: nunca é devolvido, logado nem anexado ao desfecho.
22
+ */
23
+ resolveCredential: (ref: string) => Promise<string | undefined>;
24
+ /** Injetável para teste. Nenhum teste deve alcançar a rede real. */
25
+ fetchImpl?: typeof fetch;
26
+ }
27
+ export declare function createEmailChannel(config: EmailAdapterConfig): CommunicationChannel;
28
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../src/communication/adapters/email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAoC,MAAM,eAAe,CAAC;AAE5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAyBrD,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,OAAO,EAAE,cAAc,CAAC;IACxB;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChE,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,oBAAoB,CAyGnF"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Adapter de e-mail — envelope do envio que o Office já usa.
3
+ *
4
+ * **Nenhum motor novo de e-mail.** Convites, ativação, recuperação de senha e a
5
+ * régua de cobrança já passam por `mail/resend.ts`. Este adapter apenas o expõe
6
+ * sob o contrato multicanal, para que o e-mail seja UM canal entre outros em vez
7
+ * de o caminho especial que todos os outros tentam imitar.
8
+ *
9
+ * A supressão em teste continua onde estava, no `sendEmail` do core: uma guarda
10
+ * que mora no adapter é uma guarda que o próximo adapter esquece.
11
+ */
12
+ import { sendEmailWithResult } from '../../mail/resend.js';
13
+ import { RESEND_IDEMPOTENCY_WINDOW_MS } from '../capabilities.js';
14
+ /**
15
+ * O que o Resend garante, e o que este adapter exerce.
16
+ *
17
+ * `supportsProviderIdempotency` é `true` porque o adapter MANDA a chave, não
18
+ * porque a documentação do fornecedor a menciona: a declaração descreve o código
19
+ * daqui. Enquanto a chave não era repassada — o estado que a segunda
20
+ * certificação encontrou —, declarar `true` teria sido documentar uma proteção
21
+ * inexistente.
22
+ *
23
+ * Os outros três são `false` por ausência de integração, não por ausência do
24
+ * fornecedor. O Resend publica webhooks de entrega e relata abertura; nenhuma
25
+ * rota daqui os consome hoje (a rota de callback existente é da Meta). Declarar a
26
+ * capacidade do fornecedor em vez da capacidade do código produziria exatamente
27
+ * a divergência entre documento e runtime que reprovou a rodada anterior.
28
+ */
29
+ const RESEND_CAPABILITIES = {
30
+ supportsProviderIdempotency: true,
31
+ providerIdempotencyWindowMs: RESEND_IDEMPOTENCY_WINDOW_MS,
32
+ supportsMessageLookup: false,
33
+ supportsDeliveryWebhook: false,
34
+ supportsReadReceipt: false,
35
+ };
36
+ export function createEmailChannel(config) {
37
+ return {
38
+ key: 'email',
39
+ providerName: 'resend',
40
+ capabilities: RESEND_CAPABILITIES,
41
+ isConfigured(_ctx) {
42
+ return config.account.status === 'active' && Boolean(config.account.senderId);
43
+ },
44
+ async send(message) {
45
+ if (message.content.kind !== 'email') {
46
+ return { kind: 'permanent', code: 'content_mismatch', detail: 'conteúdo não é e-mail' };
47
+ }
48
+ const apiKey = await config.resolveCredential(config.account.credentialRef);
49
+ if (!apiKey) {
50
+ // Ausência de credencial é canal indisponível, não falha de entrega: não
51
+ // gasta tentativa e não marca o cliente como problema de cadastro.
52
+ return { kind: 'unavailable', code: 'no_credential', detail: 'credencial ausente' };
53
+ }
54
+ const from = config.account.displayName
55
+ ? `${config.account.displayName.replace(/["<>\\]/g, '').trim()} <${config.account.senderId}>`
56
+ : config.account.senderId;
57
+ const result = await sendEmailWithResult(apiKey, {
58
+ from,
59
+ to: message.to,
60
+ subject: message.content.subject,
61
+ html: message.content.html,
62
+ text: message.content.text,
63
+ }, {
64
+ /*
65
+ * A chave do MOTOR, repassada ao provider.
66
+ *
67
+ * É a mesma em toda tentativa técnica do mesmo envio, porque é derivada
68
+ * da intenção (tenant, produto, marca, canal, evento, assunto, versão
69
+ * de template) e não da tentativa. Derivá-la aqui, ou embaralhá-la com
70
+ * um contador de retry, teria o mecanismo ligado e proteção nenhuma: o
71
+ * provider trataria cada retry como mensagem nova.
72
+ *
73
+ * Cabe no limite do provider por construção — a chave é um sha256 em
74
+ * hexadecimal, 64 caracteres, e o Resend aceita de 1 a 256.
75
+ */
76
+ idempotencyKey: message.idempotencyKey,
77
+ fetchImpl: config.fetchImpl,
78
+ });
79
+ if (result.ok)
80
+ return { kind: 'sent', providerRef: result.providerRef };
81
+ /*
82
+ * `409` é o mecanismo de idempotência falando, e a leitura correta não é
83
+ * "falhou".
84
+ *
85
+ * `invalid_idempotent_request`: esta chave já foi usada nas últimas 24h com
86
+ * um corpo diferente. Ou seja — houve uma chamada anterior aceita para esta
87
+ * mesma intenção. A mensagem SAIU. Tratar como falha devolveria a chave e a
88
+ * próxima rodada mandaria a segunda cobrança, que é precisamente o que a
89
+ * chave existe para impedir.
90
+ *
91
+ * `concurrent_idempotent_requests`: outra chamada com a mesma chave está em
92
+ * curso agora. Não é nosso caso comum (a reserva interna já barra isso
93
+ * antes), mas se acontecer, quem está enviando é a outra chamada — e
94
+ * reenviar por cima é o mesmo erro.
95
+ */
96
+ if (result.status === 409) {
97
+ return {
98
+ kind: 'sent',
99
+ code: 'provider_idempotent_replay',
100
+ detail: 'provider já havia aceito esta chave',
101
+ };
102
+ }
103
+ // Chave fora do formato aceito é defeito de integração nosso, não do
104
+ // destinatário. `permanent` para não repetir a mesma chamada inválida em
105
+ // loop; o rótulo diz onde olhar.
106
+ if (result.errorCode === 'invalid_idempotency_key') {
107
+ return {
108
+ kind: 'permanent',
109
+ code: 'invalid_idempotency_key',
110
+ detail: 'chave de idempotência recusada pelo provider',
111
+ };
112
+ }
113
+ // Sem credencial o canal está indisponível, não falho: não gasta tentativa
114
+ // e não acusa o cadastro do cliente.
115
+ if (result.localReason === 'no_credential') {
116
+ return { kind: 'unavailable', code: 'no_credential', detail: 'credencial ausente' };
117
+ }
118
+ // O resto — recusa do provider, supressão em teste, falha de rede — é
119
+ // TEMPORÁRIO. Marcar permanente encerraria a cobrança por algo que pode ser
120
+ // infraestrutura, e desistir cedo demais é pior que tentar de novo.
121
+ return {
122
+ kind: 'temporary',
123
+ code: result.errorCode ?? result.localReason ?? 'not_confirmed',
124
+ detail: 'provider não confirmou o envio',
125
+ };
126
+ },
127
+ };
128
+ }
129
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/communication/adapters/email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAKlE;;;;;;;;;;;;;;GAcG;AACH,MAAM,mBAAmB,GAAwB;IAC/C,2BAA2B,EAAE,IAAI;IACjC,2BAA2B,EAAE,4BAA4B;IACzD,qBAAqB,EAAE,KAAK;IAC5B,uBAAuB,EAAE,KAAK;IAC9B,mBAAmB,EAAE,KAAK;CAC3B,CAAC;AAgBF,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,OAAO;QACL,GAAG,EAAE,OAAO;QACZ,YAAY,EAAE,QAAQ;QACtB,YAAY,EAAE,mBAAmB;QAEjC,YAAY,CAAC,IAA0B;YACrC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChF,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAwB;YACjC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;YAC1F,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC5E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,yEAAyE;gBACzE,mEAAmE;gBACnE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YACtF,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW;gBACrC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG;gBAC7F,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAE5B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,MAAM,EACN;gBACE,IAAI;gBACJ,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;gBAChC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;gBAC1B,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;aAC3B,EACD;gBACE;;;;;;;;;;;mBAWG;gBACH,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CACF,CAAC;YAEF,IAAI,MAAM,CAAC,EAAE;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;YAExE;;;;;;;;;;;;;;eAcG;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,OAAO;oBACL,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,4BAA4B;oBAClC,MAAM,EAAE,qCAAqC;iBAC9C,CAAC;YACJ,CAAC;YAED,qEAAqE;YACrE,yEAAyE;YACzE,iCAAiC;YACjC,IAAI,MAAM,CAAC,SAAS,KAAK,yBAAyB,EAAE,CAAC;gBACnD,OAAO;oBACL,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,yBAAyB;oBAC/B,MAAM,EAAE,8CAA8C;iBACvD,CAAC;YACJ,CAAC;YAED,2EAA2E;YAC3E,qCAAqC;YACrC,IAAI,MAAM,CAAC,WAAW,KAAK,eAAe,EAAE,CAAC;gBAC3C,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YACtF,CAAC;YAED,sEAAsE;YACtE,4EAA4E;YAC5E,oEAAoE;YACpE,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,IAAI,eAAe;gBAC/D,MAAM,EAAE,gCAAgC;aACzC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}