@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,113 @@
1
+ /**
2
+ * A porta ÚNICA de e-mail para os fluxos que não passam pelo motor multicanal.
3
+ *
4
+ * ## O bloqueador que este arquivo fecha
5
+ *
6
+ * `SINGLE_DISPATCH_AUTHORITY=FAIL`. O guard da rodada anterior varria só
7
+ * `packages/core/src` e não enxergava o que estava do lado de fora:
8
+ *
9
+ * apps/api/src/routes/admin.ts → sendEmail(process.env.RESEND_API_KEY, …)
10
+ * apps/api/src/routes/documents.ts → sendEmail(process.env.RESEND_API_KEY, …)
11
+ * apps/api/src/routes/auth.ts → sendEmail(process.env.RESEND_API_KEY, …)
12
+ * packages/core/src/subscription-billing/service.ts → sendEmail(cfg.resendApiKey, …)
13
+ *
14
+ * Quatro caminhos de APLICAÇÃO chamando o transporte direto, cada um lendo a
15
+ * credencial e o remetente por conta própria. Não é um cliente provider paralelo
16
+ * — é o mesmo transporte —, mas é código de domínio alcançando a borda de envio
17
+ * sem passar por autoridade nenhuma, que é o que o adendo §12 proíbe.
18
+ *
19
+ * ## O que ela NÃO é
20
+ *
21
+ * **Não é o motor multicanal, e não finge ser.** Convite, reconvite, acesso ao
22
+ * Portal e recuperação de senha são comunicação de IDENTIDADE: acontecem antes de
23
+ * existir cliente, antes de existir consentimento de contribuinte, e — no caso do
24
+ * `forgot-password` — antes de existir sessão de onde tirar um tenant. Passá-los
25
+ * pelo `dispatch` exigiria inventar `recipientRef`, `subjectRef`, template
26
+ * aprovado e conta de canal para cada um; a fase que fizer isso é própria, e
27
+ * `AUTH_EMAIL_NOT_ON_SHARED_ENGINE` fica registrada como dívida.
28
+ *
29
+ * O que ela é: um **adapter de entrada** (§13). Fluxo legado sem cliente provider
30
+ * próprio, com uma porta só, nominal e vigiada.
31
+ *
32
+ * ## O que ela acrescenta de verdade
33
+ *
34
+ * Uma barreira que só renomeia o caminho não é correção. Estes fluxos ganham,
35
+ * aqui, três coisas que nenhum deles tinha:
36
+ *
37
+ * 1. **Idempotência de provider.** Nenhum dos quatro mandava `Idempotency-Key`.
38
+ * Duplo-clique em "convidar" ou retry de cron produzia duas mensagens
39
+ * idênticas na caixa de quem recebe. A chave é derivada do CONTEÚDO (ver
40
+ * `identityFor`), então retry idêntico dedupe e reconvite legítimo — que
41
+ * carrega um token novo — passa.
42
+ * 2. **Um lugar só para a credencial.** `process.env.RESEND_API_KEY` deixa de
43
+ * ser lido em quatro arquivos. Quatro leituras é onde uma delas fica para
44
+ * trás no dia da rotação.
45
+ * 3. **Um alvo só para o guard.** O guard de fronteira global proíbe `sendEmail*`
46
+ * em todo o repositório exceto no transporte, nos adapters do motor e aqui.
47
+ */
48
+ import { createHash } from 'node:crypto';
49
+ import { sendEmailWithResult } from './resend.js';
50
+ /**
51
+ * A chave que o provider vai deduplicar.
52
+ *
53
+ * Derivada do CONTEÚDO — destinatário, assunto, remetente e corpo — e não de um
54
+ * identificador de negócio. A escolha decide o comportamento em produção:
55
+ *
56
+ * • retry idêntico (duplo-clique, reexecução de cron) produz a MESMA chave, e o
57
+ * Resend devolve a resposta original sem mandar a segunda mensagem;
58
+ * • reconvite legítimo carrega um token novo no corpo, logo uma chave nova, e
59
+ * sai normalmente.
60
+ *
61
+ * Derivar de `kind + destinatário` faria o oposto e seria pior que não ter chave:
62
+ * o reconvite legítimo seria silenciosamente descartado pelo provider dentro da
63
+ * janela de 24 h, e ninguém veria — a resposta de um replay é `200`.
64
+ *
65
+ * `sha256` hexadecimal, 64 caracteres, dentro do limite de 1 a 256 do provider.
66
+ */
67
+ function identityFor(req) {
68
+ /*
69
+ * Serializado como ARRAY, e não concatenado com um separador.
70
+ *
71
+ * Concatenar campos com um caractere qualquer é ambíguo: `to='a b'` com
72
+ * `from='c'` produz a mesma cadeia que `to='a'` com `from='b c'`, e duas
73
+ * mensagens diferentes ganhariam a mesma chave — o provider descartaria a
74
+ * segunda como replay. `JSON.stringify` de um array escapa os campos e o
75
+ * comprimento fica implícito na estrutura, então nenhum conteúdo consegue
76
+ * imitar a fronteira entre dois campos.
77
+ */
78
+ const material = JSON.stringify([
79
+ req.kind,
80
+ req.message.to,
81
+ req.message.from,
82
+ req.message.subject,
83
+ req.message.html,
84
+ req.message.text ?? null,
85
+ ]);
86
+ return createHash('sha256').update(material, 'utf8').digest('hex');
87
+ }
88
+ /**
89
+ * Envia, com o desfecho detalhado.
90
+ *
91
+ * Best-effort como sempre foi: devolve o resultado, nunca lança. Quem chama
92
+ * decide o que fazer — e continua podendo distinguir "o provider recusou" de "a
93
+ * mensagem saiu", que é a distinção que fez o Portal ficar meses sem acesso
94
+ * ativo quando ela não existia.
95
+ */
96
+ export async function sendTransactionalOutboundWithResult(req) {
97
+ return sendEmailWithResult(req.apiKey ?? process.env.RESEND_API_KEY, req.message, {
98
+ idempotencyKey: identityFor(req),
99
+ fetchImpl: req.fetchImpl,
100
+ });
101
+ }
102
+ /**
103
+ * Envia e devolve só se saiu.
104
+ *
105
+ * A forma que os quatro chamadores legados já usavam (`boolean`), preservada para
106
+ * que a consolidação não mude a resposta de nenhuma rota — nem o `201` do
107
+ * convite, nem o campo `invitationEmailSent` que a tela lê.
108
+ */
109
+ export async function sendTransactionalOutbound(req) {
110
+ const result = await sendTransactionalOutboundWithResult(req);
111
+ return result.ok;
112
+ }
113
+ //# sourceMappingURL=transactional-outbound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactional-outbound.js","sourceRoot":"","sources":["../../src/mail/transactional-outbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAA2C,MAAM,aAAa,CAAC;AAqD3F;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,WAAW,CAAC,GAA8B;IACjD;;;;;;;;;OASG;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9B,GAAG,CAAC,IAAI;QACR,GAAG,CAAC,OAAO,CAAC,EAAE;QACd,GAAG,CAAC,OAAO,CAAC,IAAI;QAChB,GAAG,CAAC,OAAO,CAAC,OAAO;QACnB,GAAG,CAAC,OAAO,CAAC,IAAI;QAChB,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI;KACzB,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,GAA8B;IAE9B,OAAO,mBAAmB,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,OAAO,EAAE;QAChF,cAAc,EAAE,WAAW,CAAC,GAAG,CAAC;QAChC,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,GAA8B;IAC5E,MAAM,MAAM,GAAG,MAAM,mCAAmC,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,EAAE,CAAC;AACnB,CAAC"}
@@ -1,143 +1,3 @@
1
- export type EmailAddress = string;
2
- /** "queued" não existe (RFC §4.1/§4.6 a capability é síncrona e 1:1; fila é responsabilidade do consumidor). */
3
- export type DeliveryStatus = 'sent' | 'failed' | 'skipped';
4
- /**
5
- * Códigos organizados por retryability (RFC §5), não por causa técnica:
6
- * - transitório (retry seguro): "timeout" | "provider-unavailable"
7
- * - permanente (retry nunca resolve): "invalid-recipient" | "provider-rejected"
8
- * - "unknown" trata-se como permanente por padrão
9
- */
10
- export type DeliveryErrorCode = 'timeout' | 'provider-unavailable' | 'invalid-recipient' | 'provider-rejected' | 'unknown';
11
- export interface DeliveryResult {
12
- status: DeliveryStatus;
13
- /** id retornado pelo provider (ex.: id do Resend), presente apenas quando status === 'sent'. */
14
- providerId?: string;
15
- /**
16
- * status === 'skipped' DEVE ser tratado pelo consumidor como "não entregue" (falha suave),
17
- * nunca como sucesso (RFC §5, R2).
18
- */
19
- error?: {
20
- code: DeliveryErrorCode;
21
- /** Nunca contém a credencial do provider (invariante, RFC §4.2). */
22
- message: string;
23
- };
24
- }
25
- export interface SendTransactionalEmailInput {
26
- to: EmailAddress;
27
- /** id resolvido pelo TemplateRenderer do consumidor (RFC §4.3). */
28
- template: string;
29
- data: Record<string, unknown>;
30
- /**
31
- * Dedup só se aplica quando fornecida explicitamente (RFC §4.2, G2).
32
- * Sem idempotencyKey, nenhuma deduplicação é feita.
33
- */
34
- idempotencyKey?: string;
35
- tag?: string;
36
- /** Maior precedência de resolução de remetente (RFC §4.5). */
37
- from?: EmailAddress;
38
- /** Usado pelo SenderResolver quando `from` não é fornecido (RFC §4.5). */
39
- brand?: string;
40
- replyTo?: EmailAddress;
41
- }
42
- export interface TransactionalEmailCapability {
43
- sendTransactionalEmail(input: SendTransactionalEmailInput): Promise<DeliveryResult>;
44
- }
45
- export interface RenderedEmail {
46
- subject: string;
47
- html: string;
48
- text?: string;
49
- }
50
- /** Ponto de extensão plugável — motor de template fica fora do core (RFC §4.3). */
51
- export interface TemplateRenderer {
52
- render(template: string, data: Record<string, unknown>): RenderedEmail;
53
- }
54
- /** Ponto de extensão plugável — resolução de remetente por marca/tenant (RFC §4.5). */
55
- export interface SenderResolver {
56
- resolveFrom(brand?: string | undefined): EmailAddress;
57
- }
58
- /** Ponto de extensão plugável — tracking/observação fica fora do core (RFC §4.8). */
59
- export interface DeliveryHook {
60
- beforeSend?(input: SendTransactionalEmailInput): SendTransactionalEmailInput;
61
- afterSend?(input: SendTransactionalEmailInput, result: DeliveryResult): void;
62
- }
63
- /**
64
- * "shared": store comum entre instâncias — garante o invariante de dedup de fato.
65
- * "in-memory": cache local por instância — best-effort, NÃO garante dedup sob múltiplas réplicas
66
- * (RFC §4.2 exige que essa distinção seja declarada explicitamente, não assumida).
67
- */
68
- export type DedupStoreMode = 'shared' | 'in-memory';
69
- export interface DedupEntry {
70
- result: DeliveryResult;
71
- expiresAt: number;
72
- }
73
- /**
74
- * Resultado de `DedupStore.reserve` (Bloqueador 2 — Auditoria Codex, RFC §4.2, refinado na
75
- * Certification Round 2 — 2026-07-21).
76
- * `acquired: true` — este chamador se tornou o dono do envio: deve enviar e, ao final,
77
- * chamar `set` com o resultado (sucesso ou falha) para liberar a reserva.
78
- * `acquired: false` — já existe uma entrada: `entry` traz o resultado assentado quando
79
- * disponível, ou `null` quando outra chamada está em andamento e ainda não terminou
80
- * (só pode ocorrer entre processos/réplicas diferentes — dentro do mesmo processo Node,
81
- * `reserve` nunca retorna `entry: null`, porque o Provider já resolve a coalescência
82
- * local antes de chegar a chamar `reserve` uma segunda vez para a mesma chave).
83
- *
84
- * **Contrato real do Provider canônico para `entry: null`** (Certification Round 2 —
85
- * antes desta versão, o Provider tratava esse caso como "pode enviar", o que reenviava
86
- * às cegas e quebrava o próprio invariante de dedup): o Provider aguarda de forma limitada
87
- * (`remoteReservationPollIntervalMs`/`remoteReservationMaxWaitMs`) por um resultado assentado
88
- * antes de decidir qualquer coisa; se o tempo se esgota, tenta assumir a reserva (presumindo-a
89
- * órfã) e, falhando isso também, devolve `DeliveryResult` `failed`/`provider-unavailable`
90
- * (retryable) em vez de enviar de novo. Uma implementação `mode: 'shared'` real precisa expirar
91
- * reservas órfãs via TTL no próprio store para que a segunda tentativa de `reserve` funcione.
92
- */
93
- export type DedupReservation = {
94
- acquired: true;
95
- } | {
96
- acquired: false;
97
- entry: DedupEntry | null;
98
- };
99
- export interface DedupStore {
100
- readonly mode: DedupStoreMode;
101
- /** DEVE retornar `null` para entradas já expiradas — o Provider não reconfere `expiresAt`. */
102
- get(key: string): Promise<DedupEntry | null> | DedupEntry | null;
103
- set(key: string, entry: DedupEntry): Promise<void> | void;
104
- /**
105
- * Operação atômica de "reservar ou ler" — é o mecanismo real de deduplicação sob
106
- * concorrência (Bloqueador 2). Implementações `mode: 'shared'` DEVEM usar um primitivo
107
- * atômico do próprio store (ex.: `SETNX`/Lua no Redis, `INSERT ... ON CONFLICT DO NOTHING`
108
- * no Postgres) para que a garantia valha entre processos/réplicas, não só dentro de um
109
- * processo Node. `InMemoryDedupStore` (`mode: 'in-memory'`) só garante atomicidade dentro
110
- * do mesmo processo — nunca prometa mais que isso para um store que não seja distribuído.
111
- */
112
- reserve(key: string, ttlMs: number): Promise<DedupReservation> | DedupReservation;
113
- }
114
- /**
115
- * Versão do contrato público desta capability (RFC-CAPABILITY-TRANSACTIONAL-EMAIL-001 §12, SemVer próprio
116
- * de capability — independente da versão do pacote `@baruk/core`, que versiona o motor inteiro, não uma
117
- * capability isolada). `0.2.1`: hardening pré-certificação (Capability Certification 001, Auditoria Codex)
118
- * — sanitização de segredos, dedup atômica, validação de endereço, exceções internas contidas. `0.2.2`:
119
- * hardening pós-Certification Round 2 — sanitização genérica estendida (URI-embedded credentials, token
120
- * estruturado, alta entropia) e coalescência distribuída real (espera limitada por reserva remota em
121
- * andamento, nunca reenvio às cegas). Nenhuma das duas mudou assinatura pública (patch, não minor/major).
122
- */
123
- export declare const TRANSACTIONAL_EMAIL_CONTRACT_VERSION = "0.2.2";
124
- /** Janela mínima de deduplicação exigida pela RFC §4.2 (24h) — implementações podem manter por mais tempo, nunca menos. */
125
- export declare const MIN_DEDUP_WINDOW_MS: number;
126
- /** Timeout padrão do Provider (RFC §5 — herdado empiricamente da implementação mais madura do inventário). */
127
- export declare const DEFAULT_TIMEOUT_MS = 12000;
128
- /**
129
- * Default de poll ao aguardar uma reserva remota em andamento num `DedupStore` `mode: 'shared'`
130
- * (Bloqueador 2 — Certification Round 2). Baixo o suficiente para não atrasar percebivelmente
131
- * o caso comum (reserva local, sem espera nenhuma).
132
- */
133
- export declare const DEFAULT_REMOTE_RESERVATION_POLL_INTERVAL_MS = 200;
134
- /**
135
- * Default de tempo máximo de espera por uma reserva remota antes de tentar assumi-la e,
136
- * falhando isso, devolver falha determinística retryable (Bloqueador 2 — Certification Round 2).
137
- * Maior que `DEFAULT_TIMEOUT_MS` — dá à instância dona tempo de terminar o próprio envio
138
- * (que pode levar até `DEFAULT_TIMEOUT_MS`) antes desta instância desistir de esperar.
139
- */
140
- export declare const DEFAULT_REMOTE_RESERVATION_MAX_WAIT_MS = 15000;
141
- /** Utilitário de conveniência para o consumidor decidir retry — não usado internamente pelo core (RFC §5). */
142
- export declare function isRetryableError(code: DeliveryErrorCode): boolean;
1
+ export type { EmailAddress, DeliveryStatus, DeliveryErrorCode, DeliveryResult, SendTransactionalEmailInput, TransactionalEmailCapability, RenderedEmail, TemplateRenderer, SenderResolver, DeliveryHook, DedupStoreMode, DedupEntry, DedupReservation, DedupStore, } from '@baruk/communication';
2
+ export { DEFAULT_TIMEOUT_MS, MIN_DEDUP_WINDOW_MS, TRANSACTIONAL_EMAIL_CONTRACT_VERSION, DEFAULT_REMOTE_RESERVATION_POLL_INTERVAL_MS, DEFAULT_REMOTE_RESERVATION_MAX_WAIT_MS, isRetryableError, } from '@baruk/communication';
143
3
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mail/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mail/types.ts"],"names":[],"mappings":"AAUA,YAAY,EACV,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,2BAA2B,EAC3B,4BAA4B,EAC5B,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oCAAoC,EACpC,2CAA2C,EAC3C,sCAAsC,EACtC,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
@@ -1,34 +1,2 @@
1
- // cap.communication.transactional-email contrato canônico (RFC-CAPABILITY-TRANSACTIONAL-EMAIL-001 v0.2).
2
- // Ver docs/governance/RFC-CAPABILITY-TRANSACTIONAL-EMAIL-001.md no repo baruk-ecosystem.
3
- /**
4
- * Versão do contrato público desta capability (RFC-CAPABILITY-TRANSACTIONAL-EMAIL-001 §12, SemVer próprio
5
- * de capability — independente da versão do pacote `@baruk/core`, que versiona o motor inteiro, não uma
6
- * capability isolada). `0.2.1`: hardening pré-certificação (Capability Certification 001, Auditoria Codex)
7
- * — sanitização de segredos, dedup atômica, validação de endereço, exceções internas contidas. `0.2.2`:
8
- * hardening pós-Certification Round 2 — sanitização genérica estendida (URI-embedded credentials, token
9
- * estruturado, alta entropia) e coalescência distribuída real (espera limitada por reserva remota em
10
- * andamento, nunca reenvio às cegas). Nenhuma das duas mudou assinatura pública (patch, não minor/major).
11
- */
12
- export const TRANSACTIONAL_EMAIL_CONTRACT_VERSION = '0.2.2';
13
- /** Janela mínima de deduplicação exigida pela RFC §4.2 (24h) — implementações podem manter por mais tempo, nunca menos. */
14
- export const MIN_DEDUP_WINDOW_MS = 24 * 60 * 60 * 1000;
15
- /** Timeout padrão do Provider (RFC §5 — herdado empiricamente da implementação mais madura do inventário). */
16
- export const DEFAULT_TIMEOUT_MS = 12_000;
17
- /**
18
- * Default de poll ao aguardar uma reserva remota em andamento num `DedupStore` `mode: 'shared'`
19
- * (Bloqueador 2 — Certification Round 2). Baixo o suficiente para não atrasar percebivelmente
20
- * o caso comum (reserva local, sem espera nenhuma).
21
- */
22
- export const DEFAULT_REMOTE_RESERVATION_POLL_INTERVAL_MS = 200;
23
- /**
24
- * Default de tempo máximo de espera por uma reserva remota antes de tentar assumi-la e,
25
- * falhando isso, devolver falha determinística retryable (Bloqueador 2 — Certification Round 2).
26
- * Maior que `DEFAULT_TIMEOUT_MS` — dá à instância dona tempo de terminar o próprio envio
27
- * (que pode levar até `DEFAULT_TIMEOUT_MS`) antes desta instância desistir de esperar.
28
- */
29
- export const DEFAULT_REMOTE_RESERVATION_MAX_WAIT_MS = 15_000;
30
- /** Utilitário de conveniência para o consumidor decidir retry — não usado internamente pelo core (RFC §5). */
31
- export function isRetryableError(code) {
32
- return code === 'timeout' || code === 'provider-unavailable';
33
- }
1
+ export { DEFAULT_TIMEOUT_MS, MIN_DEDUP_WINDOW_MS, TRANSACTIONAL_EMAIL_CONTRACT_VERSION, DEFAULT_REMOTE_RESERVATION_POLL_INTERVAL_MS, DEFAULT_REMOTE_RESERVATION_MAX_WAIT_MS, isRetryableError, } from '@baruk/communication';
34
2
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mail/types.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,yFAAyF;AA6HzF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,OAAO,CAAC;AAE5D,2HAA2H;AAC3H,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD,8GAA8G;AAC9G,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,2CAA2C,GAAG,GAAG,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,MAAM,CAAC;AAE7D,8GAA8G;AAC9G,MAAM,UAAU,gBAAgB,CAAC,IAAuB;IACtD,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,sBAAsB,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mail/types.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oCAAoC,EACpC,2CAA2C,EAC3C,sCAAsC,EACtC,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type { Tx } from '../db/client.js';
2
+ /**
3
+ * Provisionamento de usuário do Portal do Contribuinte.
4
+ *
5
+ * Fecha um gap que a Discovery encontrou e que tornava o Portal inoperável em
6
+ * produção: `inviteUser` grava `'staff'` literal, `POST /v1/users` não aceita
7
+ * `userType`, e `ensurePortalAccess` só era chamada por seeds e testes. Não
8
+ * existia caminho de produto para dar um único usuário ao Portal — só SQL
9
+ * manual.
10
+ *
11
+ * A diferença para `inviteUser` não é cosmética: além de `user_type`, um usuário
12
+ * de portal exige o vínculo em `client_portal_access`, que é o que a RLS usa
13
+ * para resolver `app.current_client`. Sem ele, o login funciona e o portal fica
14
+ * vazio.
15
+ */
16
+ export interface InvitePortalUserInput {
17
+ clientId: string;
18
+ email: string;
19
+ fullName: string;
20
+ invitedBy: string;
21
+ }
22
+ export interface InvitePortalUserResult {
23
+ userId: string;
24
+ email: string;
25
+ fullName: string;
26
+ clientId: string;
27
+ /**
28
+ * Emitido para usuário novo e para quem foi convidado e ainda não ativou
29
+ * (reenvio). Quem já ativou usa a própria senha e não recebe token — convite
30
+ * não é caminho para redefinir senha de conta ativa.
31
+ */
32
+ activationToken: string | null;
33
+ /** true quando o acesso já existia e nada foi criado. */
34
+ alreadyHadAccess: boolean;
35
+ /** true quando o convite reemitiu token para quem ainda não havia ativado. */
36
+ isReinvite: boolean;
37
+ }
38
+ export declare function invitePortalUser(tx: Tx, input: InvitePortalUserInput): Promise<InvitePortalUserResult>;
39
+ export interface PortalUserSummary {
40
+ userId: string;
41
+ email: string;
42
+ fullName: string;
43
+ status: string;
44
+ accessStatus: string;
45
+ lastLoginAt: string | null;
46
+ }
47
+ export declare function listPortalUsers(tx: Tx, clientId: string): Promise<PortalUserSummary[]>;
48
+ /**
49
+ * Revoga o acesso. Não apaga o usuário nem a trilha: quem enviou um documento
50
+ * continua identificável depois de perder o acesso — é justamente isso que
51
+ * torna a prova utilizável meses depois.
52
+ */
53
+ export declare function revokePortalAccess(tx: Tx, input: {
54
+ clientId: string;
55
+ userId: string;
56
+ revokedBy: string;
57
+ }): Promise<void>;
58
+ //# sourceMappingURL=provisioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioning.d.ts","sourceRoot":"","sources":["../../src/portal/provisioning.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAK1C;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,yDAAyD;IACzD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,UAAU,EAAE,OAAO,CAAC;CACrB;AAID,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CA+FjC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA0B5F;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC7D,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,139 @@
1
+ import { ConflictError, NotFoundError, uuidv7 } from '@baruk/shared';
2
+ import { appendAudit } from '../audit/audit.js';
3
+ import { createActivationToken } from '../auth/password-reset.js';
4
+ import { setUserRole } from '../users/repository.js';
5
+ const PORTAL_ROLE_KEY = 'client_titular';
6
+ export async function invitePortalUser(tx, input) {
7
+ const tenantId = await currentTenantId(tx);
8
+ // O cliente precisa existir NESTE tenant. A RLS já garantiria, mas uma
9
+ // mensagem clara vale mais que um erro de FK.
10
+ const client = await tx `
11
+ SELECT id FROM client WHERE id = ${input.clientId} AND deleted_at IS NULL
12
+ `;
13
+ if (!client[0])
14
+ throw new NotFoundError('Cliente não encontrado');
15
+ const existing = await tx `
16
+ SELECT id, full_name, user_type, status FROM "user"
17
+ WHERE email = ${input.email} AND deleted_at IS NULL
18
+ `;
19
+ let userId;
20
+ let fullName;
21
+ let isNewUser;
22
+ // Reconvidar quem ainda não ativou precisa emitir um token novo. Sem isto o
23
+ // usuário fica preso: o primeiro convite não chegou (ou expirou) e nenhum
24
+ // reenvio produz link, porque só o cadastro inicial emitia token.
25
+ let isPendingActivation = false;
26
+ if (existing[0]) {
27
+ // Um e-mail de staff não vira acesso de portal por convite. Os dois tipos
28
+ // têm superfícies e escopos distintos, e converter silenciosamente daria a
29
+ // um colaborador do escritório uma sessão de cliente.
30
+ if (existing[0].user_type !== 'client_portal') {
31
+ throw new ConflictError('Este e-mail já pertence a um usuário interno. Use um e-mail diferente para o acesso do cliente.');
32
+ }
33
+ userId = existing[0].id;
34
+ fullName = existing[0].full_name;
35
+ isNewUser = false;
36
+ // Só quem ainda não ativou recebe token novo. Emitir para um usuário já
37
+ // ativo transformaria o convite em redefinição de senha à revelia do
38
+ // cliente — quem convida não pode provocar isso.
39
+ isPendingActivation = existing[0].status === 'invited';
40
+ }
41
+ else {
42
+ userId = uuidv7();
43
+ fullName = input.fullName;
44
+ isNewUser = true;
45
+ await tx `
46
+ INSERT INTO "user" (id, email, full_name, user_type, status, auth_provider)
47
+ VALUES (${userId}, ${input.email}, ${input.fullName}, 'client_portal', 'invited', 'password')
48
+ `;
49
+ }
50
+ // Membership no tenant — sem ela o usuário não resolve tenant no login.
51
+ const membership = await tx `
52
+ SELECT id FROM membership
53
+ WHERE user_id = ${userId} AND tenant_id = ${tenantId} AND deleted_at IS NULL
54
+ `;
55
+ if (!membership[0]) {
56
+ await tx `
57
+ INSERT INTO membership (id, tenant_id, user_id, status, invited_by)
58
+ VALUES (${uuidv7()}, ${tenantId}, ${userId}, 'invited', ${input.invitedBy})
59
+ `;
60
+ await setUserRole(tx, userId, PORTAL_ROLE_KEY);
61
+ }
62
+ // O vínculo com o cliente. Idempotente: reconvidar não duplica.
63
+ const access = await tx `
64
+ INSERT INTO client_portal_access (id, tenant_id, user_id, client_id, status)
65
+ VALUES (${uuidv7()}, ${tenantId}, ${userId}, ${input.clientId}, 'active')
66
+ ON CONFLICT (tenant_id, user_id, client_id) DO UPDATE SET status = 'active'
67
+ RETURNING id
68
+ `;
69
+ let activationToken = null;
70
+ if (isNewUser || isPendingActivation) {
71
+ const activation = await createActivationToken(tx, { userId, tenantId });
72
+ activationToken = activation.token;
73
+ }
74
+ await appendAudit(tx, {
75
+ actorId: input.invitedBy,
76
+ action: 'portal_user_invited',
77
+ resourceType: 'client_portal_access',
78
+ resourceId: access[0].id,
79
+ // O token nunca entra na auditoria, nem em metadata: o registro é lido por
80
+ // gente que não deve poder assumir a conta do cliente.
81
+ metadata: { email: input.email, clientId: input.clientId, isNewUser, isPendingActivation },
82
+ });
83
+ return {
84
+ userId,
85
+ email: input.email,
86
+ fullName,
87
+ clientId: input.clientId,
88
+ activationToken,
89
+ alreadyHadAccess: !isNewUser && membership.length > 0,
90
+ isReinvite: isPendingActivation,
91
+ };
92
+ }
93
+ export async function listPortalUsers(tx, clientId) {
94
+ const rows = await tx `
95
+ SELECT u.id AS user_id, u.email, u.full_name, u.status,
96
+ cpa.status AS access_status, u.last_login_at
97
+ FROM client_portal_access cpa
98
+ JOIN "user" u ON u.id = cpa.user_id
99
+ WHERE cpa.client_id = ${clientId} AND u.deleted_at IS NULL
100
+ ORDER BY u.full_name
101
+ `;
102
+ return rows.map((r) => ({
103
+ userId: r.user_id,
104
+ email: r.email,
105
+ fullName: r.full_name,
106
+ status: r.status,
107
+ accessStatus: r.access_status,
108
+ lastLoginAt: r.last_login_at ? r.last_login_at.toISOString() : null,
109
+ }));
110
+ }
111
+ /**
112
+ * Revoga o acesso. Não apaga o usuário nem a trilha: quem enviou um documento
113
+ * continua identificável depois de perder o acesso — é justamente isso que
114
+ * torna a prova utilizável meses depois.
115
+ */
116
+ export async function revokePortalAccess(tx, input) {
117
+ const rows = await tx `
118
+ UPDATE client_portal_access
119
+ SET status = 'revoked'
120
+ WHERE client_id = ${input.clientId} AND user_id = ${input.userId} AND status = 'active'
121
+ RETURNING id
122
+ `;
123
+ if (!rows[0])
124
+ throw new NotFoundError('Acesso ativo não encontrado');
125
+ await appendAudit(tx, {
126
+ actorId: input.revokedBy,
127
+ action: 'portal_access_revoked',
128
+ resourceType: 'client_portal_access',
129
+ resourceId: rows[0].id,
130
+ metadata: { clientId: input.clientId, userId: input.userId },
131
+ });
132
+ }
133
+ async function currentTenantId(tx) {
134
+ const rows = await tx `
135
+ SELECT current_setting('app.current_tenant')::uuid AS tenant_id
136
+ `;
137
+ return rows[0].tenant_id;
138
+ }
139
+ //# sourceMappingURL=provisioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioning.js","sourceRoot":"","sources":["../../src/portal/provisioning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Serialização canônica (RFC-CAPABILITY-PRICING-ENGINE-001 §22.1 F2) — usada
3
+ * exclusivamente para compor o `fingerprint`/`quoteId` (nunca para persistir
4
+ * ou transportar dados). `JSON.stringify` cru depende da ordem de inserção
5
+ * das chaves do objeto — dois `PricingRequest` economicamente idênticos, mas
6
+ * construídos com `addonQuantities`/Records em ordem de chave diferente,
7
+ * produziam hashes diferentes antes deste módulo (achado do Design Review,
8
+ * §22.1). `canonicalize` ordena chaves recursivamente em qualquer nível de
9
+ * objeto/Record/Map aninhado — arrays preservam ordem (a ordem de array é
10
+ * semanticamente relevante quando existe; coleções sem ordem própria, como
11
+ * `bundleRules`, são pré-ordenadas pelo chamador antes de chegar aqui).
12
+ */
13
+ export declare function canonicalStringify(value: unknown): string;
14
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/pricing-engine/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAyBH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEzD"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Serialização canônica (RFC-CAPABILITY-PRICING-ENGINE-001 §22.1 F2) — usada
3
+ * exclusivamente para compor o `fingerprint`/`quoteId` (nunca para persistir
4
+ * ou transportar dados). `JSON.stringify` cru depende da ordem de inserção
5
+ * das chaves do objeto — dois `PricingRequest` economicamente idênticos, mas
6
+ * construídos com `addonQuantities`/Records em ordem de chave diferente,
7
+ * produziam hashes diferentes antes deste módulo (achado do Design Review,
8
+ * §22.1). `canonicalize` ordena chaves recursivamente em qualquer nível de
9
+ * objeto/Record/Map aninhado — arrays preservam ordem (a ordem de array é
10
+ * semanticamente relevante quando existe; coleções sem ordem própria, como
11
+ * `bundleRules`, são pré-ordenadas pelo chamador antes de chegar aqui).
12
+ */
13
+ function canonicalize(value) {
14
+ if (value instanceof Map) {
15
+ const entries = Array.from(value.entries())
16
+ .map(([k, v]) => [String(k), canonicalize(v)])
17
+ .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));
18
+ const record = {};
19
+ for (const [k, v] of entries)
20
+ record[k] = v;
21
+ return record;
22
+ }
23
+ if (Array.isArray(value)) {
24
+ return value.map(canonicalize);
25
+ }
26
+ if (value !== null && typeof value === 'object') {
27
+ const record = value;
28
+ const result = {};
29
+ for (const key of Object.keys(record).sort()) {
30
+ result[key] = canonicalize(record[key]);
31
+ }
32
+ return result;
33
+ }
34
+ return value;
35
+ }
36
+ export function canonicalStringify(value) {
37
+ return JSON.stringify(canonicalize(value));
38
+ }
39
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/pricing-engine/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAU,CAAC;aACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO;YAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/pricing-engine/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,gBAAgB,GACxB,2BAA2B,GAC3B,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,6BAA6B,GAC7B,oBAAoB,GACpB,qBAAqB,GACrB,wBAAwB,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,GAAG,sBAAsB,CAAC;AAqBnH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO;IAQ3E,MAAM,IAAI;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,UAAU,EAAE,iBAAiB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;CAGxG"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/pricing-engine/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,gBAAgB,GACxB,2BAA2B,GAC3B,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,6BAA6B,GAC7B,oBAAoB,GACpB,qBAAqB,GACrB,wBAAwB,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAC3B,YAAY,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,GAAG,sBAAsB,CAAC;AAqBrF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO;IAQ3E,MAAM,IAAI;QACR,IAAI,EAAE,gBAAgB,CAAC;QACvB,UAAU,EAAE,iBAAiB,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB;CAQF"}
@@ -38,7 +38,12 @@ export class PricingEngineError extends Error {
38
38
  this.ruleIds = ruleIds;
39
39
  }
40
40
  toJSON() {
41
- return { code: this.code, errorClass: this.errorClass, message: this.message, ruleIds: this.ruleIds };
41
+ return {
42
+ code: this.code,
43
+ errorClass: this.errorClass,
44
+ message: this.message,
45
+ ruleIds: this.ruleIds,
46
+ };
42
47
  }
43
48
  }
44
49
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/pricing-engine/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6BH,MAAM,WAAW,GAAgD;IAC/D,2BAA2B,EAAE,eAAe;IAC5C,iBAAiB,EAAE,YAAY;IAC/B,kBAAkB,EAAE,YAAY;IAChC,mBAAmB,EAAE,WAAW;IAChC,mBAAmB,EAAE,UAAU;IAC/B,gBAAgB,EAAE,eAAe;IACjC,uBAAuB,EAAE,WAAW;IACpC,gBAAgB,EAAE,YAAY;IAC9B,gBAAgB,EAAE,sBAAsB;IACxC,qBAAqB,EAAE,YAAY;IACnC,mBAAmB,EAAE,UAAU;IAC/B,mBAAmB,EAAE,YAAY;IACjC,6BAA6B,EAAE,eAAe;IAC9C,oBAAoB,EAAE,eAAe;IACrC,qBAAqB,EAAE,WAAW;IAClC,wBAAwB,EAAE,YAAY;CACvC,CAAC;AAEF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAmB;IACvB,UAAU,CAAoB;IACvC,2EAA2E;IAClE,OAAO,CAAW;IAE3B,YAAY,IAAsB,EAAE,OAAe,EAAE,UAAoB,EAAE;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACxG,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/pricing-engine/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8BH,MAAM,WAAW,GAAgD;IAC/D,2BAA2B,EAAE,eAAe;IAC5C,iBAAiB,EAAE,YAAY;IAC/B,kBAAkB,EAAE,YAAY;IAChC,mBAAmB,EAAE,WAAW;IAChC,mBAAmB,EAAE,UAAU;IAC/B,gBAAgB,EAAE,eAAe;IACjC,uBAAuB,EAAE,WAAW;IACpC,gBAAgB,EAAE,YAAY;IAC9B,gBAAgB,EAAE,sBAAsB;IACxC,qBAAqB,EAAE,YAAY;IACnC,mBAAmB,EAAE,UAAU;IAC/B,mBAAmB,EAAE,YAAY;IACjC,6BAA6B,EAAE,eAAe;IAC9C,oBAAoB,EAAE,eAAe;IACrC,qBAAqB,EAAE,WAAW;IAClC,wBAAwB,EAAE,YAAY;CACvC,CAAC;AAEF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAmB;IACvB,UAAU,CAAoB;IACvC,2EAA2E;IAClE,OAAO,CAAW;IAE3B,YAAY,IAAsB,EAAE,OAAe,EAAE,UAAoB,EAAE;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM;QAMJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;CACF"}