@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,169 @@
1
+ /**
2
+ * Persistência do vínculo de canal e do índice de roteamento
3
+ * (migrações 0041 e 0042).
4
+ *
5
+ * Duas leituras, com fronteiras deliberadamente diferentes:
6
+ *
7
+ * - `createPostgresChannelBindingStore` responde "qual a conta DESTE tenant
8
+ * neste canal", dentro do contexto do tenant, sob RLS.
9
+ * - `createPostgresChannelRouteStore` responde "de quem é esta conta do
10
+ * provider", FORA de contexto de tenant, porque no momento em que o webhook
11
+ * chega ainda não se sabe qual é o tenant.
12
+ *
13
+ * A segunda é a única leitura do motor que roda sem `app.current_tenant` — e
14
+ * ela não lê a tabela. Passa por `channel_route_resolve`, uma função de sistema
15
+ * que exige a chave exata e devolve no máximo uma linha. A tabela em si voltou
16
+ * a ser fechada por tenant na 0042: sem GUC, `SELECT * FROM channel_route`
17
+ * devolve zero linhas.
18
+ */
19
+ import type { Tx } from '../../db/client.js';
20
+ import type { ChannelAccount, ChannelAccountStore } from '../identity.js';
21
+ import type { ChannelRoute, ChannelRouteStore, RoutedProvider } from '../routing.js';
22
+ /**
23
+ * Índice de roteamento — primeiro tempo da resolução.
24
+ *
25
+ * Devolve o MÍNIMO: quem é o dono. Produto e marca ficam de fora porque vivem
26
+ * em `channel_binding`, que é fechada por RLS e portanto ilegível neste momento
27
+ * — ainda não há tenant na sessão. Denormalizá-los aqui resolveria a consulta e
28
+ * colocaria "que produto este escritório assina" atrás da mesma função que
29
+ * responde sem contexto de tenant, o que é informação comercial em lugar
30
+ * errado.
31
+ *
32
+ * O segundo tempo é `completeRoute`, já dentro de `withContext`.
33
+ */
34
+ export declare function createPostgresChannelRouteStore(tx: Tx): ChannelRouteStore;
35
+ /**
36
+ * Completa a rota com produto e marca, JÁ dentro do contexto do tenant.
37
+ *
38
+ * Separado de propósito: a primeira consulta responde "de quem é", a segunda
39
+ * responde "o que é" — e a segunda roda sob a RLS de `channel_binding`, que é
40
+ * fechada.
41
+ *
42
+ * Três gates, e o terceiro estava faltando na primeira entrega. A revogação era
43
+ * conferida (`revoked_at IS NULL`) e o STATUS não — de modo que um vínculo
44
+ * `paused`, `error`, `pending_validation` ou `not_configured`, que ninguém
45
+ * revogou, continuava roteando. É a assimetria clássica: o caminho de saída
46
+ * consultava o status (`identity.ts` só envia por conta `active`) e o de
47
+ * entrada não, e uma conta pausada por suspeita de abuso seguia recebendo.
48
+ */
49
+ export declare function completeRoute(tx: Tx, route: ChannelRoute): Promise<ChannelRoute | null>;
50
+ /**
51
+ * Contas de canal a partir de `channel_binding`.
52
+ *
53
+ * Substitui, para os canais de telefone, a leitura de `tenant.settings.channels`
54
+ * — que continua existindo e continua servindo o e-mail e a configuração
55
+ * herdada. Não há fallback de um para o outro dentro desta função: quem compõe
56
+ * o runtime decide a ordem, e a decisão fica visível na composição em vez de
57
+ * escondida num `??`.
58
+ */
59
+ export declare function createPostgresChannelBindingStore(tx: Tx): ChannelAccountStore;
60
+ export interface RegisterBindingInput {
61
+ id: string;
62
+ tenantId: string;
63
+ product: string;
64
+ brand: string;
65
+ channel: 'whatsapp' | 'sms';
66
+ provider: RoutedProvider;
67
+ senderId: string;
68
+ displayName?: string | null;
69
+ /** NOME da credencial no Vault. Nunca o valor. */
70
+ credentialRef: string;
71
+ status?: ChannelAccount['status'];
72
+ /** `phone_number_id`. Registrá-lo é o que torna o vínculo roteável. */
73
+ providerAccountRef?: string | null;
74
+ /** WABA. */
75
+ providerParentRef?: string | null;
76
+ }
77
+ /**
78
+ * Registra ou atualiza um vínculo e sua rota. **Roda dentro do contexto do
79
+ * tenant** — as duas políticas de escrita exigem isso.
80
+ *
81
+ * O `INSERT` da rota falha por violação de chave primária quando outro tenant já
82
+ * reivindicou a mesma conta do provider. Isso é o comportamento desejado e é a
83
+ * razão de a chave ser global: o erro vem do banco, não de um `SELECT` prévio
84
+ * que a RLS teria feito voltar vazio.
85
+ *
86
+ * ── O guard de credencial ───────────────────────────────────────────────────
87
+ *
88
+ * `isAcceptableForNewBinding` existia e **não era chamado por ninguém**. Uma
89
+ * regra que só um teste unitário exercita não é enforcement: é documentação com
90
+ * sintaxe de TypeScript. O caminho real de criação aceitava, sem reclamar,
91
+ * `credentialRef: 'WHATSAPP_ACCESS_TOKEN'` — o token global que a fase inteira
92
+ * existe para eliminar.
93
+ *
94
+ * A checagem vem ANTES de qualquer escrita, e cobre criação e atualização pelo
95
+ * mesmo ponto porque este `INSERT ... ON CONFLICT DO UPDATE` É os dois. O banco
96
+ * repete a regra em `channel_binding_phone_credential_ref_chk` (migração 0042),
97
+ * para o caso de alguém alcançar a tabela por outro caminho: um `UPDATE` cru,
98
+ * uma importação, um script de migração de dados.
99
+ */
100
+ export declare function registerChannelBinding(tx: Tx, input: RegisterBindingInput): Promise<void>;
101
+ /**
102
+ * A conta do provider já pertence a outro vínculo.
103
+ *
104
+ * Erro de negócio, não de infraestrutura: dois escritórios não podem reivindicar
105
+ * o mesmo número. A mensagem não carrega o tenant dono — quem está tentando
106
+ * registrar não tem por que descobrir de quem é.
107
+ */
108
+ export declare class ChannelRouteConflictError extends Error {
109
+ readonly code = "channel_route_conflict";
110
+ constructor(provider: string, providerAccountRef: string);
111
+ }
112
+ /**
113
+ * A referência de credencial não é aceitável para este canal.
114
+ *
115
+ * O canal de telefone exige `vault://` — uma referência ao cofre do TENANT.
116
+ * Aceitar um nome de variável de ambiente significaria, na prática, que dois
117
+ * escritórios compartilham o mesmo token de WhatsApp: o bloqueio que um tomar
118
+ * cai sobre o outro, e a conversa de um aparece na conta do outro.
119
+ *
120
+ * A mensagem carrega o canal e **não** carrega a referência recusada. Quem
121
+ * cadastrou já sabe o que digitou; a mensagem viaja para log e para tela de
122
+ * erro, e uma referência colada ali é meio caminho para o valor aparecer junto
123
+ * na próxima vez que alguém "melhorar o diagnóstico".
124
+ */
125
+ export declare class CredentialRefNotAcceptableError extends Error {
126
+ readonly code = "credential_ref_not_acceptable";
127
+ readonly channel: string;
128
+ constructor(channel: string, _ref: string);
129
+ }
130
+ export interface ClaimChannelAccountInput extends Omit<RegisterBindingInput, 'id'> {
131
+ /** Sugerido quando não houver vínculo vivo para o contexto. */
132
+ id: string;
133
+ }
134
+ export interface ClaimedChannelAccount {
135
+ bindingId: string;
136
+ /** `true` quando reaproveitou o vínculo que já existia para o contexto. */
137
+ reused: boolean;
138
+ /** Rotas de contas ANTIGAS que deixaram de apontar para este vínculo. */
139
+ releasedRoutes: number;
140
+ }
141
+ /**
142
+ * Registra a conta de canal do contexto — criando o vínculo ou **substituindo o
143
+ * que já existe**.
144
+ *
145
+ * ## Por que `registerChannelBinding` sozinho não serve ao onboarding
146
+ *
147
+ * `channel_binding_context_uq` (0041) garante **um** vínculo vivo por
148
+ * (tenant, produto, marca, canal) — é o que faz `resolveIdentity` nunca ter de
149
+ * escolher entre dois. `registerChannelBinding` resolve conflito por `id`, e o
150
+ * `id` de um onboarding novo é novo: reconectar o WhatsApp de um escritório que
151
+ * já tinha um caía direto na violação do índice de contexto, como erro 500.
152
+ *
153
+ * Isso não é caso de laboratório. É o caminho de: trocar de número, refazer o
154
+ * signup depois de revogar o acesso, migrar a WABA de portfólio. O primeiro
155
+ * onboarding funcionava e o segundo derrubava a rota.
156
+ *
157
+ * ## As rotas órfãs, que são o risco silencioso
158
+ *
159
+ * Trocar o número deixaria a rota do número ANTIGO apontando para este mesmo
160
+ * vínculo — e o webhook do número que o escritório não usa mais continuaria
161
+ * sendo aceito e aplicado na trilha dele. Pior: aquele número fica preso a este
162
+ * tenant pela chave global de `channel_route`, e o escritório que o receber
163
+ * depois não consegue reivindicá-lo.
164
+ *
165
+ * Por isso a limpeza é parte da mesma operação, e não um passo que quem chama
166
+ * precisa lembrar de fazer.
167
+ */
168
+ export declare function claimChannelAccount(tx: Tx, input: ClaimChannelAccountInput): Promise<ClaimedChannelAccount>;
169
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../src/communication/stores/routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AASrF;;;;;;;;;;;GAWG;AACH,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,EAAE,GAAG,iBAAiB,CAqCzE;AAaD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAa7F;AAuBD;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAAC,EAAE,EAAE,EAAE,GAAG,mBAAmB,CAyC7E;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,UAAU,GAAG,KAAK,CAAC;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,YAAY;IACZ,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C/F;AAED;;;;;;GAMG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,4BAA4B;gBAC7B,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM;CAIzD;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,+BAAgC,SAAQ,KAAK;IACxD,QAAQ,CAAC,IAAI,mCAAmC;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAK1C;AAED,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC;IAChF,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAgChC"}
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Persistência do vínculo de canal e do índice de roteamento
3
+ * (migrações 0041 e 0042).
4
+ *
5
+ * Duas leituras, com fronteiras deliberadamente diferentes:
6
+ *
7
+ * - `createPostgresChannelBindingStore` responde "qual a conta DESTE tenant
8
+ * neste canal", dentro do contexto do tenant, sob RLS.
9
+ * - `createPostgresChannelRouteStore` responde "de quem é esta conta do
10
+ * provider", FORA de contexto de tenant, porque no momento em que o webhook
11
+ * chega ainda não se sabe qual é o tenant.
12
+ *
13
+ * A segunda é a única leitura do motor que roda sem `app.current_tenant` — e
14
+ * ela não lê a tabela. Passa por `channel_route_resolve`, uma função de sistema
15
+ * que exige a chave exata e devolve no máximo uma linha. A tabela em si voltou
16
+ * a ser fechada por tenant na 0042: sem GUC, `SELECT * FROM channel_route`
17
+ * devolve zero linhas.
18
+ */
19
+ import { isAcceptableForNewBinding } from '../credentials.js';
20
+ /**
21
+ * Índice de roteamento — primeiro tempo da resolução.
22
+ *
23
+ * Devolve o MÍNIMO: quem é o dono. Produto e marca ficam de fora porque vivem
24
+ * em `channel_binding`, que é fechada por RLS e portanto ilegível neste momento
25
+ * — ainda não há tenant na sessão. Denormalizá-los aqui resolveria a consulta e
26
+ * colocaria "que produto este escritório assina" atrás da mesma função que
27
+ * responde sem contexto de tenant, o que é informação comercial em lugar
28
+ * errado.
29
+ *
30
+ * O segundo tempo é `completeRoute`, já dentro de `withContext`.
31
+ */
32
+ export function createPostgresChannelRouteStore(tx) {
33
+ return {
34
+ async findByProviderAccount(provider, providerAccountRef) {
35
+ // `channel_route_resolve` (migração 0042), e não um `SELECT` na tabela.
36
+ //
37
+ // A 0041 abria a política de leitura quando não havia tenant na sessão,
38
+ // e essa abertura era o que fazia este `SELECT` funcionar. O preço era
39
+ // que QUALQUER consulta sem contexto — um script, um job, um caminho que
40
+ // esqueceu de abrir `withContext` — enxergava o mapa inteiro de
41
+ // (conta do provider → tenant) e podia listá-lo.
42
+ //
43
+ // A função de sistema entrega a mesma resposta sem o mesmo preço: exige a
44
+ // chave exata, devolve no máximo uma linha e não tem forma de ser
45
+ // chamada "sem argumento". A política da tabela voltou a ser fechada, e
46
+ // ninguém lê `channel_route` fora do próprio tenant.
47
+ const rows = await tx `
48
+ SELECT provider, provider_account_ref, provider_parent_ref, tenant_id, binding_id
49
+ FROM channel_route_resolve(${provider}, ${providerAccountRef})
50
+ `;
51
+ const row = rows[0];
52
+ if (!row)
53
+ return null;
54
+ return {
55
+ provider,
56
+ providerAccountRef: row.provider_account_ref,
57
+ ...(row.provider_parent_ref ? { providerParentRef: row.provider_parent_ref } : {}),
58
+ tenantId: row.tenant_id,
59
+ // Preenchidos por `completeRoute`, dentro do contexto do tenant.
60
+ product: '',
61
+ brand: '',
62
+ bindingId: row.binding_id,
63
+ };
64
+ },
65
+ };
66
+ }
67
+ /**
68
+ * O único estado de vínculo que autoriza tráfego.
69
+ *
70
+ * Lista de PERMISSÃO, e não de bloqueio. Uma lista de bloqueio
71
+ * (`status !== 'paused'`) autoriza por omissão: o dia em que a coluna ganhar
72
+ * `suspended`, `blocked` ou `migrating`, o estado novo nasce liberado e ninguém
73
+ * repara. Aqui um estado que ninguém escreveu aqui não passa, inclusive um
74
+ * valor que a aplicação não reconhece.
75
+ */
76
+ const ROUTABLE_STATUSES = new Set(['active']);
77
+ /**
78
+ * Completa a rota com produto e marca, JÁ dentro do contexto do tenant.
79
+ *
80
+ * Separado de propósito: a primeira consulta responde "de quem é", a segunda
81
+ * responde "o que é" — e a segunda roda sob a RLS de `channel_binding`, que é
82
+ * fechada.
83
+ *
84
+ * Três gates, e o terceiro estava faltando na primeira entrega. A revogação era
85
+ * conferida (`revoked_at IS NULL`) e o STATUS não — de modo que um vínculo
86
+ * `paused`, `error`, `pending_validation` ou `not_configured`, que ninguém
87
+ * revogou, continuava roteando. É a assimetria clássica: o caminho de saída
88
+ * consultava o status (`identity.ts` só envia por conta `active`) e o de
89
+ * entrada não, e uma conta pausada por suspeita de abuso seguia recebendo.
90
+ */
91
+ export async function completeRoute(tx, route) {
92
+ const rows = await tx `
93
+ SELECT product, brand, status
94
+ FROM channel_binding
95
+ WHERE id = ${route.bindingId}
96
+ AND tenant_id = ${route.tenantId}
97
+ AND revoked_at IS NULL
98
+ LIMIT 1
99
+ `;
100
+ const row = rows[0];
101
+ if (!row)
102
+ return null;
103
+ if (!ROUTABLE_STATUSES.has(row.status))
104
+ return null;
105
+ return { ...route, product: row.product, brand: row.brand };
106
+ }
107
+ const STATUSES = new Set([
108
+ 'not_configured',
109
+ 'pending_validation',
110
+ 'active',
111
+ 'paused',
112
+ 'error',
113
+ ]);
114
+ /**
115
+ * Contas de canal a partir de `channel_binding`.
116
+ *
117
+ * Substitui, para os canais de telefone, a leitura de `tenant.settings.channels`
118
+ * — que continua existindo e continua servindo o e-mail e a configuração
119
+ * herdada. Não há fallback de um para o outro dentro desta função: quem compõe
120
+ * o runtime decide a ordem, e a decisão fica visível na composição em vez de
121
+ * escondida num `??`.
122
+ */
123
+ export function createPostgresChannelBindingStore(tx) {
124
+ return {
125
+ async find(ctx, channel) {
126
+ const rows = await tx `
127
+ SELECT b.id, b.product, b.brand, b.channel, b.sender_id, b.display_name,
128
+ b.credential_ref, b.status,
129
+ r.provider_account_ref, r.provider_parent_ref
130
+ FROM channel_binding b
131
+ LEFT JOIN channel_route r
132
+ ON r.tenant_id = b.tenant_id AND r.binding_id = b.id
133
+ WHERE b.tenant_id = ${ctx.tenantId}
134
+ AND b.product = ${ctx.product}
135
+ AND b.brand = ${ctx.brand}
136
+ AND b.channel = ${channel}
137
+ AND b.revoked_at IS NULL
138
+ LIMIT 1
139
+ `;
140
+ const row = rows[0];
141
+ if (!row)
142
+ return null;
143
+ const meta = {};
144
+ if (row.provider_account_ref)
145
+ meta.phoneNumberId = row.provider_account_ref;
146
+ if (row.provider_parent_ref)
147
+ meta.wabaId = row.provider_parent_ref;
148
+ return {
149
+ channel,
150
+ tenantId: ctx.tenantId,
151
+ product: row.product,
152
+ brand: row.brand,
153
+ senderId: row.sender_id,
154
+ ...(row.display_name ? { displayName: row.display_name } : {}),
155
+ credentialRef: row.credential_ref,
156
+ // Estado desconhecido nunca vira `active`: configuração que ninguém
157
+ // reconhece não autoriza envio.
158
+ status: STATUSES.has(row.status)
159
+ ? row.status
160
+ : 'not_configured',
161
+ ...(Object.keys(meta).length > 0 ? { meta } : {}),
162
+ };
163
+ },
164
+ };
165
+ }
166
+ /**
167
+ * Registra ou atualiza um vínculo e sua rota. **Roda dentro do contexto do
168
+ * tenant** — as duas políticas de escrita exigem isso.
169
+ *
170
+ * O `INSERT` da rota falha por violação de chave primária quando outro tenant já
171
+ * reivindicou a mesma conta do provider. Isso é o comportamento desejado e é a
172
+ * razão de a chave ser global: o erro vem do banco, não de um `SELECT` prévio
173
+ * que a RLS teria feito voltar vazio.
174
+ *
175
+ * ── O guard de credencial ───────────────────────────────────────────────────
176
+ *
177
+ * `isAcceptableForNewBinding` existia e **não era chamado por ninguém**. Uma
178
+ * regra que só um teste unitário exercita não é enforcement: é documentação com
179
+ * sintaxe de TypeScript. O caminho real de criação aceitava, sem reclamar,
180
+ * `credentialRef: 'WHATSAPP_ACCESS_TOKEN'` — o token global que a fase inteira
181
+ * existe para eliminar.
182
+ *
183
+ * A checagem vem ANTES de qualquer escrita, e cobre criação e atualização pelo
184
+ * mesmo ponto porque este `INSERT ... ON CONFLICT DO UPDATE` É os dois. O banco
185
+ * repete a regra em `channel_binding_phone_credential_ref_chk` (migração 0042),
186
+ * para o caso de alguém alcançar a tabela por outro caminho: um `UPDATE` cru,
187
+ * uma importação, um script de migração de dados.
188
+ */
189
+ export async function registerChannelBinding(tx, input) {
190
+ if (!isAcceptableForNewBinding(input.channel, input.credentialRef)) {
191
+ throw new CredentialRefNotAcceptableError(input.channel, input.credentialRef);
192
+ }
193
+ await tx `
194
+ INSERT INTO channel_binding
195
+ (id, tenant_id, product, brand, channel, provider, sender_id, display_name,
196
+ credential_ref, status)
197
+ VALUES
198
+ (${input.id}, ${input.tenantId}, ${input.product}, ${input.brand}, ${input.channel},
199
+ ${input.provider}, ${input.senderId}, ${input.displayName ?? null},
200
+ ${input.credentialRef}, ${input.status ?? 'not_configured'})
201
+ ON CONFLICT (id) DO UPDATE SET
202
+ sender_id = EXCLUDED.sender_id,
203
+ display_name = EXCLUDED.display_name,
204
+ credential_ref = EXCLUDED.credential_ref,
205
+ status = EXCLUDED.status,
206
+ updated_at = now()
207
+ `;
208
+ if (!input.providerAccountRef)
209
+ return;
210
+ const claimed = await tx `
211
+ INSERT INTO channel_route
212
+ (provider, provider_account_ref, provider_parent_ref, tenant_id, binding_id)
213
+ VALUES
214
+ (${input.provider}, ${input.providerAccountRef}, ${input.providerParentRef ?? null},
215
+ ${input.tenantId}, ${input.id})
216
+ ON CONFLICT (provider, provider_account_ref) DO UPDATE SET
217
+ provider_parent_ref = EXCLUDED.provider_parent_ref,
218
+ updated_at = now()
219
+ WHERE channel_route.tenant_id = EXCLUDED.tenant_id
220
+ AND channel_route.binding_id = EXCLUDED.binding_id
221
+ RETURNING provider_account_ref
222
+ `;
223
+ // Zero linhas com `ON CONFLICT DO UPDATE` significa que o conflito existe e o
224
+ // `WHERE` recusou — ou seja, a conta já pertence a OUTRO vínculo. Deixar
225
+ // passar em silêncio é o pior desfecho possível: o registro pareceria ter
226
+ // funcionado e os webhooks continuariam indo para o dono anterior.
227
+ if (claimed.count === 0) {
228
+ throw new ChannelRouteConflictError(input.provider, input.providerAccountRef);
229
+ }
230
+ }
231
+ /**
232
+ * A conta do provider já pertence a outro vínculo.
233
+ *
234
+ * Erro de negócio, não de infraestrutura: dois escritórios não podem reivindicar
235
+ * o mesmo número. A mensagem não carrega o tenant dono — quem está tentando
236
+ * registrar não tem por que descobrir de quem é.
237
+ */
238
+ export class ChannelRouteConflictError extends Error {
239
+ code = 'channel_route_conflict';
240
+ constructor(provider, providerAccountRef) {
241
+ super(`conta ${provider}/${providerAccountRef} já vinculada a outro registro`);
242
+ this.name = 'ChannelRouteConflictError';
243
+ }
244
+ }
245
+ /**
246
+ * A referência de credencial não é aceitável para este canal.
247
+ *
248
+ * O canal de telefone exige `vault://` — uma referência ao cofre do TENANT.
249
+ * Aceitar um nome de variável de ambiente significaria, na prática, que dois
250
+ * escritórios compartilham o mesmo token de WhatsApp: o bloqueio que um tomar
251
+ * cai sobre o outro, e a conversa de um aparece na conta do outro.
252
+ *
253
+ * A mensagem carrega o canal e **não** carrega a referência recusada. Quem
254
+ * cadastrou já sabe o que digitou; a mensagem viaja para log e para tela de
255
+ * erro, e uma referência colada ali é meio caminho para o valor aparecer junto
256
+ * na próxima vez que alguém "melhorar o diagnóstico".
257
+ */
258
+ export class CredentialRefNotAcceptableError extends Error {
259
+ code = 'credential_ref_not_acceptable';
260
+ channel;
261
+ constructor(channel, _ref) {
262
+ super(`canal ${channel} exige referência de cofre (vault://) — referência recusada`);
263
+ this.name = 'CredentialRefNotAcceptableError';
264
+ this.channel = channel;
265
+ }
266
+ }
267
+ /**
268
+ * Registra a conta de canal do contexto — criando o vínculo ou **substituindo o
269
+ * que já existe**.
270
+ *
271
+ * ## Por que `registerChannelBinding` sozinho não serve ao onboarding
272
+ *
273
+ * `channel_binding_context_uq` (0041) garante **um** vínculo vivo por
274
+ * (tenant, produto, marca, canal) — é o que faz `resolveIdentity` nunca ter de
275
+ * escolher entre dois. `registerChannelBinding` resolve conflito por `id`, e o
276
+ * `id` de um onboarding novo é novo: reconectar o WhatsApp de um escritório que
277
+ * já tinha um caía direto na violação do índice de contexto, como erro 500.
278
+ *
279
+ * Isso não é caso de laboratório. É o caminho de: trocar de número, refazer o
280
+ * signup depois de revogar o acesso, migrar a WABA de portfólio. O primeiro
281
+ * onboarding funcionava e o segundo derrubava a rota.
282
+ *
283
+ * ## As rotas órfãs, que são o risco silencioso
284
+ *
285
+ * Trocar o número deixaria a rota do número ANTIGO apontando para este mesmo
286
+ * vínculo — e o webhook do número que o escritório não usa mais continuaria
287
+ * sendo aceito e aplicado na trilha dele. Pior: aquele número fica preso a este
288
+ * tenant pela chave global de `channel_route`, e o escritório que o receber
289
+ * depois não consegue reivindicá-lo.
290
+ *
291
+ * Por isso a limpeza é parte da mesma operação, e não um passo que quem chama
292
+ * precisa lembrar de fazer.
293
+ */
294
+ export async function claimChannelAccount(tx, input) {
295
+ const existing = await tx `
296
+ SELECT id FROM channel_binding
297
+ WHERE tenant_id = ${input.tenantId}
298
+ AND product = ${input.product}
299
+ AND brand = ${input.brand}
300
+ AND channel = ${input.channel}
301
+ AND revoked_at IS NULL
302
+ LIMIT 1
303
+ `;
304
+ const bindingId = existing[0]?.id ?? input.id;
305
+ await registerChannelBinding(tx, { ...input, id: bindingId });
306
+ // Só depois de a rota nova estar reivindicada. Apagar antes deixaria o
307
+ // vínculo sem rota nenhuma se o `INSERT` seguinte falhasse por conflito — e o
308
+ // canal do escritório pararia de receber callbacks por causa da tentativa
309
+ // frustrada de outro.
310
+ const released = input.providerAccountRef
311
+ ? await tx `
312
+ DELETE FROM channel_route
313
+ WHERE tenant_id = ${input.tenantId}
314
+ AND binding_id = ${bindingId}
315
+ AND provider_account_ref <> ${input.providerAccountRef}
316
+ `
317
+ : { count: 0 };
318
+ return {
319
+ bindingId,
320
+ reused: Boolean(existing[0]),
321
+ releasedRoutes: released.count,
322
+ };
323
+ }
324
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/communication/stores/routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAW9D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,+BAA+B,CAAC,EAAM;IACpD,OAAO;QACL,KAAK,CAAC,qBAAqB,CACzB,QAAwB,EACxB,kBAA0B;YAE1B,wEAAwE;YACxE,EAAE;YACF,wEAAwE;YACxE,uEAAuE;YACvE,yEAAyE;YACzE,gEAAgE;YAChE,iDAAiD;YACjD,EAAE;YACF,0EAA0E;YAC1E,kEAAkE;YAClE,wEAAwE;YACxE,qDAAqD;YACrD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAY;;uCAEA,QAAQ,KAAK,kBAAkB;OAC/D,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YAEtB,OAAO;gBACL,QAAQ;gBACR,kBAAkB,EAAE,GAAG,CAAC,oBAAoB;gBAC5C,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,QAAQ,EAAE,GAAG,CAAC,SAAS;gBACvB,iEAAiE;gBACjE,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,GAAG,CAAC,UAAU;aAC1B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEnE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAM,EAAE,KAAmB;IAC7D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAsD;;;kBAG3D,KAAK,CAAC,SAAS;yBACR,KAAK,CAAC,QAAQ;;;GAGpC,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;AAC9D,CAAC;AAeD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,gBAAgB;IAChB,oBAAoB;IACpB,QAAQ;IACR,QAAQ;IACR,OAAO;CACC,CAAC,CAAC;AAEZ;;;;;;;;GAQG;AACH,MAAM,UAAU,iCAAiC,CAAC,EAAM;IACtD,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAmB;YACjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAc;;;;;;;+BAOV,GAAG,CAAC,QAAQ;+BACZ,GAAG,CAAC,OAAO;+BACX,GAAG,CAAC,KAAK;+BACT,OAAO;;;OAG/B,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YAEtB,MAAM,IAAI,GAA2B,EAAE,CAAC;YACxC,IAAI,GAAG,CAAC,oBAAoB;gBAAE,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,oBAAoB,CAAC;YAC5E,IAAI,GAAG,CAAC,mBAAmB;gBAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC;YAEnE,OAAO;gBACL,OAAO;gBACP,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,QAAQ,EAAE,GAAG,CAAC,SAAS;gBACvB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,aAAa,EAAE,GAAG,CAAC,cAAc;gBACjC,oEAAoE;gBACpE,gCAAgC;gBAChC,MAAM,EAAG,QAAgC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;oBACvD,CAAC,CAAE,GAAG,CAAC,MAAmC;oBAC1C,CAAC,CAAC,gBAAgB;gBACpB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAoBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAAM,EAAE,KAA2B;IAC9E,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,+BAA+B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,EAAE,CAAA;;;;;SAKD,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO;SAC/E,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,WAAW,IAAI,IAAI;SAC/D,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM,IAAI,gBAAgB;;;;;;;GAO9D,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,kBAAkB;QAAE,OAAO;IAEtC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAA;;;;SAIjB,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,kBAAkB,KAAK,KAAK,CAAC,iBAAiB,IAAI,IAAI;SAC/E,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,EAAE;;;;;;;GAOjC,CAAC;IAEF,8EAA8E;IAC9E,yEAAyE;IACzE,0EAA0E;IAC1E,mEAAmE;IACnE,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,yBAAyB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,wBAAwB,CAAC;IACzC,YAAY,QAAgB,EAAE,kBAA0B;QACtD,KAAK,CAAC,SAAS,QAAQ,IAAI,kBAAkB,gCAAgC,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IAC/C,IAAI,GAAG,+BAA+B,CAAC;IACvC,OAAO,CAAS;IACzB,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,SAAS,OAAO,6DAA6D,CAAC,CAAC;QACrF,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAM,EACN,KAA+B;IAE/B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAkB;;yBAEpB,KAAK,CAAC,QAAQ;yBACd,KAAK,CAAC,OAAO;yBACb,KAAK,CAAC,KAAK;yBACX,KAAK,CAAC,OAAO;;;GAGnC,CAAC;IACF,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;IAE9C,MAAM,sBAAsB,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAE9D,uEAAuE;IACvE,8EAA8E;IAC9E,0EAA0E;IAC1E,sBAAsB;IACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,kBAAkB;QACvC,CAAC,CAAC,MAAM,EAAE,CAAA;;6BAEe,KAAK,CAAC,QAAQ;8BACb,SAAS;yCACE,KAAK,CAAC,kBAAkB;OAC1D;QACH,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAEjB,OAAO;QACL,SAAS;QACT,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,cAAc,EAAE,QAAQ,CAAC,KAAK;KAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `TenantSecretStore` sobre o Vault Engine — agora atrás de autorização real.
3
+ *
4
+ * `credentials.ts` já declarava a interface e já dizia por que o valor teria
5
+ * de vir do cofre (migração 0012), mas nenhum arquivo do repositório a
6
+ * implementava: `createChannelCredentialResolver` só era chamado em teste, e
7
+ * os três call sites de produção (`collection-cron.ts`, `routes/collections.ts`)
8
+ * seguiam presos a `environmentCredentialResolver()`. Uma referência
9
+ * `vault://...` resolvia para `undefined` em produção — não por bug, por
10
+ * ausência: o fio entre o cofre e o motor nunca foi ligado.
11
+ *
12
+ * Este módulo é esse fio. Não é um segundo cofre — reaproveita
13
+ * `vault/repository.ts` inteiro (RLS FORCE, AAD por tenant, envelope
14
+ * AES-256-GCM) e acrescenta só o que o motor precisava e o Vault não tinha:
15
+ * ler por NOME em vez de `id` (`revealSecretByName`).
16
+ *
17
+ * **O que mudou no lote C1A.1.** A primeira versão aceitava um
18
+ * `SecretAccessGrant` montado pelo CHAMADOR: `principal` e `reason` eram
19
+ * strings, e qualquer módulo interno podia declará-las e pedir decifração.
20
+ * Isso registrava quem disse ser — não provava quem era. Agora o store exige
21
+ * uma `WorkloadIdentity` autenticada (`rbac/workload.ts`), e cada `reveal()`
22
+ * consulta o banco, DENTRO da mesma transação, para saber se aquele principal
23
+ * tem `vault.credential.decrypt` NAQUELE tenant, para AQUELE propósito e sobre
24
+ * AQUELE nome de credencial. O grant deixou de ser declaração e virou linha em
25
+ * tabela que o papel da aplicação não consegue escrever.
26
+ *
27
+ * O `SecretAccessGrant` permanece — como REGISTRO DE AUDITORIA derivado da
28
+ * decisão, não como entrada. É o que vai para o `audit_log`.
29
+ */
30
+ import type { Db } from '../../db/client.js';
31
+ import { type WorkloadIdentity, type WorkloadPurpose } from '../../rbac/workload.js';
32
+ import type { Keyring } from '../../vault/crypto.js';
33
+ import type { TenantSecretStore } from '../credentials.js';
34
+ /**
35
+ * Por que este workload pode pedir decifração. Vocabulário fechado, o mesmo do
36
+ * CHECK de `service_principal_grant.purpose` — o propósito não é um rótulo de
37
+ * log, é uma das quatro dimensões que a autorização exige casar.
38
+ */
39
+ export type SecretAccessReason = WorkloadPurpose;
40
+ /** A permissão do catálogo RBAC exigida para decifrar. Uma só, específica. */
41
+ export declare const VAULT_DECRYPT_PERMISSION = "vault.credential.decrypt";
42
+ /**
43
+ * Registro de auditoria de um acesso a segredo.
44
+ *
45
+ * **Não é mais um parâmetro.** É produzido AQUI, a partir da identidade
46
+ * autenticada e da decisão do banco, e existe para a trilha. Um chamador não
47
+ * consegue mais fabricá-lo para se autorizar — no máximo consegue ler o que
48
+ * ficou registrado.
49
+ */
50
+ export interface SecretAccessGrant {
51
+ reason: SecretAccessReason;
52
+ /** `principalKey` autenticado — nunca uma string escolhida pelo chamador. */
53
+ principal: string;
54
+ principalId: string;
55
+ /** Id da linha de `service_principal_grant` que autorizou. `null` quando negado. */
56
+ grantId: string | null;
57
+ issuedAt: Date;
58
+ expiresAt: Date;
59
+ }
60
+ export interface TenantSecretStoreOptions {
61
+ /** Propósito desta composição. Precisa casar com um grant no banco. */
62
+ purpose: SecretAccessReason;
63
+ /** Correlação com a execução (job/request). Vai para a trilha; nunca é segredo. */
64
+ correlationId?: string;
65
+ }
66
+ /**
67
+ * `TenantSecretStore` sobre o Vault Engine.
68
+ *
69
+ * `reveal(tenantId, name)` recebe `tenantId` POR CHAMADA — o store é
70
+ * construído uma vez, no processo, e serve qualquer tenant que o motor
71
+ * resolver depois. É o mesmo desenho de `createChannelCredentialResolver`:
72
+ * quem sabe o tenant é o CHAMADOR, nunca o store. Mas saber o tenant não
73
+ * autoriza: cada chamada é decidida contra os grants DAQUELE tenant.
74
+ *
75
+ * Deny-by-default em toda borda:
76
+ * - identidade não emitida por `authenticateWorkload` → lança na CONSTRUÇÃO
77
+ * - `tenantId`/`name` vazios → nega sem tocar o banco
78
+ * - sessão expirada → nega, audita `denied`
79
+ * - principal revogado/desabilitado → nega, audita `denied`
80
+ * - sem grant casando tenant+permissão+propósito+recurso → nega, audita `denied`
81
+ * - nome inexistente/revogado/de outro tenant → nega (RLS filtra a linha)
82
+ * - vencida (`expires_at`) → nega, NUNCA decifra
83
+ * - erro de infraestrutura → propaga (não é "ausência"; é falha)
84
+ *
85
+ * Toda chamada que chega ao banco grava uma linha em `audit_log` —
86
+ * sucesso, ausência ou negação. O reveal nunca é silencioso.
87
+ */
88
+ export declare function createPostgresTenantSecretStore(db: Db, keyring: Keyring, identity: WorkloadIdentity, options: TenantSecretStoreOptions): TenantSecretStore;
89
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/communication/stores/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,EAAE,EAAM,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAEjD,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,uEAAuE;IACvE,OAAO,EAAE,kBAAkB,CAAC;IAC5B,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,+BAA+B,CAC7C,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,wBAAwB,GAChC,iBAAiB,CA2EnB"}