@baruk/core 0.3.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (696) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +85 -0
  3. package/dist/auth/password-reset.d.ts +30 -1
  4. package/dist/auth/password-reset.d.ts.map +1 -1
  5. package/dist/auth/password-reset.js +139 -11
  6. package/dist/auth/password-reset.js.map +1 -1
  7. package/dist/auth/service.d.ts +39 -2
  8. package/dist/auth/service.d.ts.map +1 -1
  9. package/dist/auth/service.js +75 -10
  10. package/dist/auth/service.js.map +1 -1
  11. package/dist/billing/ar-repository.d.ts +334 -0
  12. package/dist/billing/ar-repository.d.ts.map +1 -0
  13. package/dist/billing/ar-repository.js +707 -0
  14. package/dist/billing/ar-repository.js.map +1 -0
  15. package/dist/billing/auto-generation.d.ts +87 -0
  16. package/dist/billing/auto-generation.d.ts.map +1 -0
  17. package/dist/billing/auto-generation.js +181 -0
  18. package/dist/billing/auto-generation.js.map +1 -0
  19. package/dist/billing/live-guard.d.ts +64 -0
  20. package/dist/billing/live-guard.d.ts.map +1 -0
  21. package/dist/billing/live-guard.js +68 -0
  22. package/dist/billing/live-guard.js.map +1 -0
  23. package/dist/billing/payment-means-catalog.d.ts +17 -0
  24. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  25. package/dist/billing/payment-means-catalog.js +21 -0
  26. package/dist/billing/payment-means-catalog.js.map +1 -0
  27. package/dist/billing/payment-means.d.ts +38 -0
  28. package/dist/billing/payment-means.d.ts.map +1 -0
  29. package/dist/billing/payment-means.js +29 -0
  30. package/dist/billing/payment-means.js.map +1 -0
  31. package/dist/billing/payment-rail.d.ts +118 -0
  32. package/dist/billing/payment-rail.d.ts.map +1 -0
  33. package/dist/billing/payment-rail.js +295 -0
  34. package/dist/billing/payment-rail.js.map +1 -0
  35. package/dist/billing/provider/asaas.d.ts +46 -1
  36. package/dist/billing/provider/asaas.d.ts.map +1 -1
  37. package/dist/billing/provider/asaas.js +194 -14
  38. package/dist/billing/provider/asaas.js.map +1 -1
  39. package/dist/billing/provider/manual.js +1 -1
  40. package/dist/billing/provider/manual.js.map +1 -1
  41. package/dist/billing/provider/types.d.ts +115 -8
  42. package/dist/billing/provider/types.d.ts.map +1 -1
  43. package/dist/billing/provider-account.d.ts +89 -0
  44. package/dist/billing/provider-account.d.ts.map +1 -0
  45. package/dist/billing/provider-account.js +161 -0
  46. package/dist/billing/provider-account.js.map +1 -0
  47. package/dist/billing/provider-onboarding.d.ts +67 -0
  48. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  49. package/dist/billing/provider-onboarding.js +234 -0
  50. package/dist/billing/provider-onboarding.js.map +1 -0
  51. package/dist/billing/receivable.d.ts +5 -1
  52. package/dist/billing/receivable.d.ts.map +1 -1
  53. package/dist/billing/reconcile.d.ts +58 -0
  54. package/dist/billing/reconcile.d.ts.map +1 -0
  55. package/dist/billing/reconcile.js +138 -0
  56. package/dist/billing/reconcile.js.map +1 -0
  57. package/dist/billing/repository.d.ts +90 -1
  58. package/dist/billing/repository.d.ts.map +1 -1
  59. package/dist/billing/repository.js +148 -19
  60. package/dist/billing/repository.js.map +1 -1
  61. package/dist/cjs/auth/password-reset.js +141 -11
  62. package/dist/cjs/auth/password-reset.js.map +1 -1
  63. package/dist/cjs/auth/service.js +75 -9
  64. package/dist/cjs/auth/service.js.map +1 -1
  65. package/dist/cjs/billing/ar-repository.js +728 -0
  66. package/dist/cjs/billing/ar-repository.js.map +1 -0
  67. package/dist/cjs/billing/auto-generation.js +186 -0
  68. package/dist/cjs/billing/auto-generation.js.map +1 -0
  69. package/dist/cjs/billing/live-guard.js +72 -0
  70. package/dist/cjs/billing/live-guard.js.map +1 -0
  71. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  72. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  73. package/dist/cjs/billing/payment-means.js +33 -0
  74. package/dist/cjs/billing/payment-means.js.map +1 -0
  75. package/dist/cjs/billing/payment-rail.js +301 -0
  76. package/dist/cjs/billing/payment-rail.js.map +1 -0
  77. package/dist/cjs/billing/provider/asaas.js +194 -14
  78. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  79. package/dist/cjs/billing/provider/manual.js +1 -1
  80. package/dist/cjs/billing/provider/manual.js.map +1 -1
  81. package/dist/cjs/billing/provider-account.js +170 -0
  82. package/dist/cjs/billing/provider-account.js.map +1 -0
  83. package/dist/cjs/billing/provider-onboarding.js +239 -0
  84. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  85. package/dist/cjs/billing/reconcile.js +143 -0
  86. package/dist/cjs/billing/reconcile.js.map +1 -0
  87. package/dist/cjs/billing/repository.js +150 -18
  88. package/dist/cjs/billing/repository.js.map +1 -1
  89. package/dist/cjs/clients/repository.js +96 -20
  90. package/dist/cjs/clients/repository.js.map +1 -1
  91. package/dist/cjs/collection/branding.js +140 -0
  92. package/dist/cjs/collection/branding.js.map +1 -0
  93. package/dist/cjs/collection/channel-accounts.js +137 -0
  94. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  95. package/dist/cjs/collection/channel.js +17 -0
  96. package/dist/cjs/collection/channel.js.map +1 -0
  97. package/dist/cjs/collection/communication-bridge.js +140 -0
  98. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  99. package/dist/cjs/collection/communication-runtime.js +193 -0
  100. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  101. package/dist/cjs/collection/consent-repository.js +84 -0
  102. package/dist/cjs/collection/consent-repository.js.map +1 -0
  103. package/dist/cjs/collection/copy.js +125 -0
  104. package/dist/cjs/collection/copy.js.map +1 -0
  105. package/dist/cjs/collection/delivery-callback.js +151 -0
  106. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  107. package/dist/cjs/collection/email-layout.js +252 -0
  108. package/dist/cjs/collection/email-layout.js.map +1 -0
  109. package/dist/cjs/collection/engine.js +414 -0
  110. package/dist/cjs/collection/engine.js.map +1 -0
  111. package/dist/cjs/collection/format.js +76 -0
  112. package/dist/cjs/collection/format.js.map +1 -0
  113. package/dist/cjs/collection/payment-block.js +3 -0
  114. package/dist/cjs/collection/payment-block.js.map +1 -0
  115. package/dist/cjs/collection/policy.js +147 -0
  116. package/dist/cjs/collection/policy.js.map +1 -0
  117. package/dist/cjs/collection/repository.js +260 -0
  118. package/dist/cjs/collection/repository.js.map +1 -0
  119. package/dist/cjs/collection/subject.js +104 -0
  120. package/dist/cjs/collection/subject.js.map +1 -0
  121. package/dist/cjs/collection/template-catalog.js +165 -0
  122. package/dist/cjs/collection/template-catalog.js.map +1 -0
  123. package/dist/cjs/collection/template.js +78 -0
  124. package/dist/cjs/collection/template.js.map +1 -0
  125. package/dist/cjs/communication/adapters/email.js +132 -0
  126. package/dist/cjs/communication/adapters/email.js.map +1 -0
  127. package/dist/cjs/communication/adapters/sms.js +127 -0
  128. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  129. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  130. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  131. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  132. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  133. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  134. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  135. package/dist/cjs/communication/audit.js +61 -0
  136. package/dist/cjs/communication/audit.js.map +1 -0
  137. package/dist/cjs/communication/capabilities.js +76 -0
  138. package/dist/cjs/communication/capabilities.js.map +1 -0
  139. package/dist/cjs/communication/channel.js +53 -0
  140. package/dist/cjs/communication/channel.js.map +1 -0
  141. package/dist/cjs/communication/claim.js +228 -0
  142. package/dist/cjs/communication/claim.js.map +1 -0
  143. package/dist/cjs/communication/consent.js +43 -0
  144. package/dist/cjs/communication/consent.js.map +1 -0
  145. package/dist/cjs/communication/context.js +45 -0
  146. package/dist/cjs/communication/context.js.map +1 -0
  147. package/dist/cjs/communication/credentials.js +121 -0
  148. package/dist/cjs/communication/credentials.js.map +1 -0
  149. package/dist/cjs/communication/dry-run-scenario.js +161 -0
  150. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  151. package/dist/cjs/communication/dry-run.js +97 -0
  152. package/dist/cjs/communication/dry-run.js.map +1 -0
  153. package/dist/cjs/communication/engine.js +483 -0
  154. package/dist/cjs/communication/engine.js.map +1 -0
  155. package/dist/cjs/communication/graph.js +50 -0
  156. package/dist/cjs/communication/graph.js.map +1 -0
  157. package/dist/cjs/communication/idempotency.js +26 -0
  158. package/dist/cjs/communication/idempotency.js.map +1 -0
  159. package/dist/cjs/communication/identity.js +110 -0
  160. package/dist/cjs/communication/identity.js.map +1 -0
  161. package/dist/cjs/communication/index.js +135 -0
  162. package/dist/cjs/communication/index.js.map +1 -0
  163. package/dist/cjs/communication/onboarding.js +297 -0
  164. package/dist/cjs/communication/onboarding.js.map +1 -0
  165. package/dist/cjs/communication/policy.js +16 -0
  166. package/dist/cjs/communication/policy.js.map +1 -0
  167. package/dist/cjs/communication/routing.js +77 -0
  168. package/dist/cjs/communication/routing.js.map +1 -0
  169. package/dist/cjs/communication/sender-profile.js +128 -0
  170. package/dist/cjs/communication/sender-profile.js.map +1 -0
  171. package/dist/cjs/communication/status.js +86 -0
  172. package/dist/cjs/communication/status.js.map +1 -0
  173. package/dist/cjs/communication/stores/onboarding.js +135 -0
  174. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  175. package/dist/cjs/communication/stores/postgres.js +458 -0
  176. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  177. package/dist/cjs/communication/stores/routing.js +334 -0
  178. package/dist/cjs/communication/stores/routing.js.map +1 -0
  179. package/dist/cjs/communication/stores/secrets.js +126 -0
  180. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  181. package/dist/cjs/communication/template-provider.js +22 -0
  182. package/dist/cjs/communication/template-provider.js.map +1 -0
  183. package/dist/cjs/communication/template.js +63 -0
  184. package/dist/cjs/communication/template.js.map +1 -0
  185. package/dist/cjs/communication/webhook-subscription.js +258 -0
  186. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  187. package/dist/cjs/communication/webhook.js +292 -0
  188. package/dist/cjs/communication/webhook.js.map +1 -0
  189. package/dist/cjs/competence/repository.js +309 -0
  190. package/dist/cjs/competence/repository.js.map +1 -0
  191. package/dist/cjs/contacts/phone.js +192 -0
  192. package/dist/cjs/contacts/phone.js.map +1 -0
  193. package/dist/cjs/db/seed-catalog.js +48 -0
  194. package/dist/cjs/db/seed-catalog.js.map +1 -0
  195. package/dist/cjs/db/seed.js +15 -7
  196. package/dist/cjs/db/seed.js.map +1 -1
  197. package/dist/cjs/documents/repository.js +244 -0
  198. package/dist/cjs/documents/repository.js.map +1 -0
  199. package/dist/cjs/documents/requests.js +136 -0
  200. package/dist/cjs/documents/requests.js.map +1 -0
  201. package/dist/cjs/index.js +406 -39
  202. package/dist/cjs/index.js.map +1 -1
  203. package/dist/cjs/legal/documents.js +125 -3
  204. package/dist/cjs/legal/documents.js.map +1 -1
  205. package/dist/cjs/legal/types.js +1 -0
  206. package/dist/cjs/legal/types.js.map +1 -1
  207. package/dist/cjs/mail/auth-templates.js +29 -0
  208. package/dist/cjs/mail/auth-templates.js.map +1 -0
  209. package/dist/cjs/mail/dedup-store.js +12 -51
  210. package/dist/cjs/mail/dedup-store.js.map +1 -1
  211. package/dist/cjs/mail/index.js +16 -4
  212. package/dist/cjs/mail/index.js.map +1 -1
  213. package/dist/cjs/mail/provider.js +12 -247
  214. package/dist/cjs/mail/provider.js.map +1 -1
  215. package/dist/cjs/mail/resend.js +14 -18
  216. package/dist/cjs/mail/resend.js.map +1 -1
  217. package/dist/cjs/mail/sender-resolver.js +12 -11
  218. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  219. package/dist/cjs/mail/template-renderer.js +11 -16
  220. package/dist/cjs/mail/template-renderer.js.map +1 -1
  221. package/dist/cjs/mail/transactional-outbound.js +117 -0
  222. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  223. package/dist/cjs/mail/types.js +8 -35
  224. package/dist/cjs/mail/types.js.map +1 -1
  225. package/dist/cjs/portal/provisioning.js +144 -0
  226. package/dist/cjs/portal/provisioning.js.map +1 -0
  227. package/dist/cjs/pricing-engine/canonical.js +42 -0
  228. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  229. package/dist/cjs/pricing-engine/errors.js +6 -1
  230. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  231. package/dist/cjs/pricing-engine/index.js +12 -1
  232. package/dist/cjs/pricing-engine/index.js.map +1 -1
  233. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  234. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  235. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  236. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  237. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  238. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  239. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  240. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  241. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  242. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  243. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  244. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  245. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  246. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  247. package/dist/cjs/rbac/authorize.js +28 -0
  248. package/dist/cjs/rbac/authorize.js.map +1 -1
  249. package/dist/cjs/rbac/catalog.js +67 -1
  250. package/dist/cjs/rbac/catalog.js.map +1 -1
  251. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  252. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  253. package/dist/cjs/rbac/workload.js +191 -0
  254. package/dist/cjs/rbac/workload.js.map +1 -0
  255. package/dist/cjs/storage/checksum.js +15 -0
  256. package/dist/cjs/storage/checksum.js.map +1 -0
  257. package/dist/cjs/storage/key.js +72 -0
  258. package/dist/cjs/storage/key.js.map +1 -0
  259. package/dist/cjs/storage/local.js +100 -0
  260. package/dist/cjs/storage/local.js.map +1 -0
  261. package/dist/cjs/storage/r2.js +181 -0
  262. package/dist/cjs/storage/r2.js.map +1 -0
  263. package/dist/cjs/storage/registry.js +41 -0
  264. package/dist/cjs/storage/registry.js.map +1 -0
  265. package/dist/cjs/storage/types.js +50 -0
  266. package/dist/cjs/storage/types.js.map +1 -0
  267. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  268. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  269. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  270. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  271. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  272. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  273. package/dist/cjs/subscription-billing/service.js +57 -8
  274. package/dist/cjs/subscription-billing/service.js.map +1 -1
  275. package/dist/cjs/subscription-billing/types.js.map +1 -1
  276. package/dist/cjs/tenancy/provisioning.js +32 -8
  277. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  278. package/dist/cjs/users/repository.js +119 -2
  279. package/dist/cjs/users/repository.js.map +1 -1
  280. package/dist/cjs/vault/repository.js +81 -0
  281. package/dist/cjs/vault/repository.js.map +1 -1
  282. package/dist/clients/repository.d.ts +42 -0
  283. package/dist/clients/repository.d.ts.map +1 -1
  284. package/dist/clients/repository.js +94 -21
  285. package/dist/clients/repository.js.map +1 -1
  286. package/dist/collection/branding.d.ts +72 -0
  287. package/dist/collection/branding.d.ts.map +1 -0
  288. package/dist/collection/branding.js +136 -0
  289. package/dist/collection/branding.js.map +1 -0
  290. package/dist/collection/channel-accounts.d.ts +57 -0
  291. package/dist/collection/channel-accounts.d.ts.map +1 -0
  292. package/dist/collection/channel-accounts.js +133 -0
  293. package/dist/collection/channel-accounts.js.map +1 -0
  294. package/dist/collection/channel.d.ts +24 -0
  295. package/dist/collection/channel.d.ts.map +1 -0
  296. package/dist/collection/channel.js +16 -0
  297. package/dist/collection/channel.js.map +1 -0
  298. package/dist/collection/communication-bridge.d.ts +66 -0
  299. package/dist/collection/communication-bridge.d.ts.map +1 -0
  300. package/dist/collection/communication-bridge.js +134 -0
  301. package/dist/collection/communication-bridge.js.map +1 -0
  302. package/dist/collection/communication-runtime.d.ts +95 -0
  303. package/dist/collection/communication-runtime.d.ts.map +1 -0
  304. package/dist/collection/communication-runtime.js +187 -0
  305. package/dist/collection/communication-runtime.js.map +1 -0
  306. package/dist/collection/consent-repository.d.ts +32 -0
  307. package/dist/collection/consent-repository.d.ts.map +1 -0
  308. package/dist/collection/consent-repository.js +79 -0
  309. package/dist/collection/consent-repository.js.map +1 -0
  310. package/dist/collection/copy.d.ts +50 -0
  311. package/dist/collection/copy.d.ts.map +1 -0
  312. package/dist/collection/copy.js +122 -0
  313. package/dist/collection/copy.js.map +1 -0
  314. package/dist/collection/delivery-callback.d.ts +49 -0
  315. package/dist/collection/delivery-callback.d.ts.map +1 -0
  316. package/dist/collection/delivery-callback.js +147 -0
  317. package/dist/collection/delivery-callback.js.map +1 -0
  318. package/dist/collection/email-layout.d.ts +45 -0
  319. package/dist/collection/email-layout.d.ts.map +1 -0
  320. package/dist/collection/email-layout.js +247 -0
  321. package/dist/collection/email-layout.js.map +1 -0
  322. package/dist/collection/engine.d.ts +177 -0
  323. package/dist/collection/engine.d.ts.map +1 -0
  324. package/dist/collection/engine.js +407 -0
  325. package/dist/collection/engine.js.map +1 -0
  326. package/dist/collection/format.d.ts +32 -0
  327. package/dist/collection/format.d.ts.map +1 -0
  328. package/dist/collection/format.js +70 -0
  329. package/dist/collection/format.js.map +1 -0
  330. package/dist/collection/payment-block.d.ts +24 -0
  331. package/dist/collection/payment-block.d.ts.map +1 -0
  332. package/dist/collection/payment-block.js +2 -0
  333. package/dist/collection/payment-block.js.map +1 -0
  334. package/dist/collection/policy.d.ts +53 -0
  335. package/dist/collection/policy.d.ts.map +1 -0
  336. package/dist/collection/policy.js +141 -0
  337. package/dist/collection/policy.js.map +1 -0
  338. package/dist/collection/repository.d.ts +129 -0
  339. package/dist/collection/repository.d.ts.map +1 -0
  340. package/dist/collection/repository.js +246 -0
  341. package/dist/collection/repository.js.map +1 -0
  342. package/dist/collection/subject.d.ts +66 -0
  343. package/dist/collection/subject.d.ts.map +1 -0
  344. package/dist/collection/subject.js +99 -0
  345. package/dist/collection/subject.js.map +1 -0
  346. package/dist/collection/template-catalog.d.ts +16 -0
  347. package/dist/collection/template-catalog.d.ts.map +1 -0
  348. package/dist/collection/template-catalog.js +162 -0
  349. package/dist/collection/template-catalog.js.map +1 -0
  350. package/dist/collection/template.d.ts +37 -0
  351. package/dist/collection/template.d.ts.map +1 -0
  352. package/dist/collection/template.js +73 -0
  353. package/dist/collection/template.js.map +1 -0
  354. package/dist/communication/adapters/email.d.ts +28 -0
  355. package/dist/communication/adapters/email.d.ts.map +1 -0
  356. package/dist/communication/adapters/email.js +129 -0
  357. package/dist/communication/adapters/email.js.map +1 -0
  358. package/dist/communication/adapters/sms.d.ts +95 -0
  359. package/dist/communication/adapters/sms.d.ts.map +1 -0
  360. package/dist/communication/adapters/sms.js +121 -0
  361. package/dist/communication/adapters/sms.js.map +1 -0
  362. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  363. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  364. package/dist/communication/adapters/whatsapp-language.js +36 -0
  365. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  366. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  367. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  368. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  369. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  370. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  371. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  372. package/dist/communication/adapters/whatsapp.js +210 -0
  373. package/dist/communication/adapters/whatsapp.js.map +1 -0
  374. package/dist/communication/audit.d.ts +105 -0
  375. package/dist/communication/audit.d.ts.map +1 -0
  376. package/dist/communication/audit.js +56 -0
  377. package/dist/communication/audit.js.map +1 -0
  378. package/dist/communication/capabilities.d.ts +88 -0
  379. package/dist/communication/capabilities.d.ts.map +1 -0
  380. package/dist/communication/capabilities.js +72 -0
  381. package/dist/communication/capabilities.js.map +1 -0
  382. package/dist/communication/channel.d.ts +125 -0
  383. package/dist/communication/channel.d.ts.map +1 -0
  384. package/dist/communication/channel.js +47 -0
  385. package/dist/communication/channel.js.map +1 -0
  386. package/dist/communication/claim.d.ts +368 -0
  387. package/dist/communication/claim.d.ts.map +1 -0
  388. package/dist/communication/claim.js +224 -0
  389. package/dist/communication/claim.js.map +1 -0
  390. package/dist/communication/consent.d.ts +65 -0
  391. package/dist/communication/consent.d.ts.map +1 -0
  392. package/dist/communication/consent.js +40 -0
  393. package/dist/communication/consent.js.map +1 -0
  394. package/dist/communication/context.d.ts +48 -0
  395. package/dist/communication/context.d.ts.map +1 -0
  396. package/dist/communication/context.js +41 -0
  397. package/dist/communication/context.js.map +1 -0
  398. package/dist/communication/credentials.d.ts +74 -0
  399. package/dist/communication/credentials.d.ts.map +1 -0
  400. package/dist/communication/credentials.js +115 -0
  401. package/dist/communication/credentials.js.map +1 -0
  402. package/dist/communication/dry-run-scenario.d.ts +37 -0
  403. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  404. package/dist/communication/dry-run-scenario.js +158 -0
  405. package/dist/communication/dry-run-scenario.js.map +1 -0
  406. package/dist/communication/dry-run.d.ts +40 -0
  407. package/dist/communication/dry-run.d.ts.map +1 -0
  408. package/dist/communication/dry-run.js +92 -0
  409. package/dist/communication/dry-run.js.map +1 -0
  410. package/dist/communication/engine.d.ts +153 -0
  411. package/dist/communication/engine.d.ts.map +1 -0
  412. package/dist/communication/engine.js +480 -0
  413. package/dist/communication/engine.js.map +1 -0
  414. package/dist/communication/graph.d.ts +38 -0
  415. package/dist/communication/graph.d.ts.map +1 -0
  416. package/dist/communication/graph.js +45 -0
  417. package/dist/communication/graph.js.map +1 -0
  418. package/dist/communication/idempotency.d.ts +33 -0
  419. package/dist/communication/idempotency.d.ts.map +1 -0
  420. package/dist/communication/idempotency.js +23 -0
  421. package/dist/communication/idempotency.js.map +1 -0
  422. package/dist/communication/identity.d.ts +127 -0
  423. package/dist/communication/identity.d.ts.map +1 -0
  424. package/dist/communication/identity.js +105 -0
  425. package/dist/communication/identity.js.map +1 -0
  426. package/dist/communication/index.d.ts +66 -0
  427. package/dist/communication/index.d.ts.map +1 -0
  428. package/dist/communication/index.js +42 -0
  429. package/dist/communication/index.js.map +1 -0
  430. package/dist/communication/onboarding.d.ts +223 -0
  431. package/dist/communication/onboarding.d.ts.map +1 -0
  432. package/dist/communication/onboarding.js +287 -0
  433. package/dist/communication/onboarding.js.map +1 -0
  434. package/dist/communication/policy.d.ts +99 -0
  435. package/dist/communication/policy.d.ts.map +1 -0
  436. package/dist/communication/policy.js +13 -0
  437. package/dist/communication/policy.js.map +1 -0
  438. package/dist/communication/routing.d.ts +99 -0
  439. package/dist/communication/routing.d.ts.map +1 -0
  440. package/dist/communication/routing.js +73 -0
  441. package/dist/communication/routing.js.map +1 -0
  442. package/dist/communication/sender-profile.d.ts +100 -0
  443. package/dist/communication/sender-profile.d.ts.map +1 -0
  444. package/dist/communication/sender-profile.js +123 -0
  445. package/dist/communication/sender-profile.js.map +1 -0
  446. package/dist/communication/status.d.ts +48 -0
  447. package/dist/communication/status.d.ts.map +1 -0
  448. package/dist/communication/status.js +79 -0
  449. package/dist/communication/status.js.map +1 -0
  450. package/dist/communication/stores/onboarding.d.ts +88 -0
  451. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  452. package/dist/communication/stores/onboarding.js +127 -0
  453. package/dist/communication/stores/onboarding.js.map +1 -0
  454. package/dist/communication/stores/postgres.d.ts +81 -0
  455. package/dist/communication/stores/postgres.d.ts.map +1 -0
  456. package/dist/communication/stores/postgres.js +453 -0
  457. package/dist/communication/stores/postgres.js.map +1 -0
  458. package/dist/communication/stores/routing.d.ts +169 -0
  459. package/dist/communication/stores/routing.d.ts.map +1 -0
  460. package/dist/communication/stores/routing.js +324 -0
  461. package/dist/communication/stores/routing.js.map +1 -0
  462. package/dist/communication/stores/secrets.d.ts +89 -0
  463. package/dist/communication/stores/secrets.d.ts.map +1 -0
  464. package/dist/communication/stores/secrets.js +122 -0
  465. package/dist/communication/stores/secrets.js.map +1 -0
  466. package/dist/communication/template-provider.d.ts +85 -0
  467. package/dist/communication/template-provider.d.ts.map +1 -0
  468. package/dist/communication/template-provider.js +21 -0
  469. package/dist/communication/template-provider.js.map +1 -0
  470. package/dist/communication/template.d.ts +87 -0
  471. package/dist/communication/template.d.ts.map +1 -0
  472. package/dist/communication/template.js +59 -0
  473. package/dist/communication/template.js.map +1 -0
  474. package/dist/communication/webhook-subscription.d.ts +156 -0
  475. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  476. package/dist/communication/webhook-subscription.js +252 -0
  477. package/dist/communication/webhook-subscription.js.map +1 -0
  478. package/dist/communication/webhook.d.ts +121 -0
  479. package/dist/communication/webhook.d.ts.map +1 -0
  480. package/dist/communication/webhook.js +283 -0
  481. package/dist/communication/webhook.js.map +1 -0
  482. package/dist/competence/repository.d.ts +147 -0
  483. package/dist/competence/repository.d.ts.map +1 -0
  484. package/dist/competence/repository.js +294 -0
  485. package/dist/competence/repository.js.map +1 -0
  486. package/dist/contacts/phone.d.ts +70 -0
  487. package/dist/contacts/phone.d.ts.map +1 -0
  488. package/dist/contacts/phone.js +186 -0
  489. package/dist/contacts/phone.js.map +1 -0
  490. package/dist/db/migrate.js +17 -11
  491. package/dist/db/migrate.js.map +1 -1
  492. package/dist/db/seed-catalog.d.ts +18 -0
  493. package/dist/db/seed-catalog.d.ts.map +1 -0
  494. package/dist/db/seed-catalog.js +45 -0
  495. package/dist/db/seed-catalog.js.map +1 -0
  496. package/dist/db/seed.js +16 -8
  497. package/dist/db/seed.js.map +1 -1
  498. package/dist/documents/repository.d.ts +97 -0
  499. package/dist/documents/repository.d.ts.map +1 -0
  500. package/dist/documents/repository.js +236 -0
  501. package/dist/documents/repository.js.map +1 -0
  502. package/dist/documents/requests.d.ts +73 -0
  503. package/dist/documents/requests.d.ts.map +1 -0
  504. package/dist/documents/requests.js +127 -0
  505. package/dist/documents/requests.js.map +1 -0
  506. package/dist/index.d.ts +109 -13
  507. package/dist/index.d.ts.map +1 -1
  508. package/dist/index.js +100 -8
  509. package/dist/index.js.map +1 -1
  510. package/dist/legal/documents.d.ts.map +1 -1
  511. package/dist/legal/documents.js +125 -3
  512. package/dist/legal/documents.js.map +1 -1
  513. package/dist/legal/index.d.ts +1 -1
  514. package/dist/legal/index.d.ts.map +1 -1
  515. package/dist/legal/types.d.ts +32 -1
  516. package/dist/legal/types.d.ts.map +1 -1
  517. package/dist/legal/types.js +1 -0
  518. package/dist/legal/types.js.map +1 -1
  519. package/dist/mail/auth-templates.d.ts +15 -0
  520. package/dist/mail/auth-templates.d.ts.map +1 -0
  521. package/dist/mail/auth-templates.js +26 -0
  522. package/dist/mail/auth-templates.js.map +1 -0
  523. package/dist/mail/dedup-store.d.ts +1 -24
  524. package/dist/mail/dedup-store.d.ts.map +1 -1
  525. package/dist/mail/dedup-store.js +9 -48
  526. package/dist/mail/dedup-store.js.map +1 -1
  527. package/dist/mail/index.d.ts +2 -1
  528. package/dist/mail/index.d.ts.map +1 -1
  529. package/dist/mail/index.js +13 -2
  530. package/dist/mail/index.js.map +1 -1
  531. package/dist/mail/provider.d.ts +2 -30
  532. package/dist/mail/provider.d.ts.map +1 -1
  533. package/dist/mail/provider.js +10 -246
  534. package/dist/mail/provider.js.map +1 -1
  535. package/dist/mail/resend.d.ts +2 -12
  536. package/dist/mail/resend.d.ts.map +1 -1
  537. package/dist/mail/resend.js +11 -17
  538. package/dist/mail/resend.js.map +1 -1
  539. package/dist/mail/sender-resolver.d.ts +1 -7
  540. package/dist/mail/sender-resolver.d.ts.map +1 -1
  541. package/dist/mail/sender-resolver.js +11 -10
  542. package/dist/mail/sender-resolver.js.map +1 -1
  543. package/dist/mail/template-renderer.d.ts +1 -9
  544. package/dist/mail/template-renderer.d.ts.map +1 -1
  545. package/dist/mail/template-renderer.js +10 -15
  546. package/dist/mail/template-renderer.js.map +1 -1
  547. package/dist/mail/transactional-outbound.d.ts +115 -0
  548. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  549. package/dist/mail/transactional-outbound.js +113 -0
  550. package/dist/mail/transactional-outbound.js.map +1 -0
  551. package/dist/mail/types.d.ts +2 -142
  552. package/dist/mail/types.d.ts.map +1 -1
  553. package/dist/mail/types.js +1 -33
  554. package/dist/mail/types.js.map +1 -1
  555. package/dist/portal/provisioning.d.ts +58 -0
  556. package/dist/portal/provisioning.d.ts.map +1 -0
  557. package/dist/portal/provisioning.js +139 -0
  558. package/dist/portal/provisioning.js.map +1 -0
  559. package/dist/pricing-engine/canonical.d.ts +14 -0
  560. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  561. package/dist/pricing-engine/canonical.js +39 -0
  562. package/dist/pricing-engine/canonical.js.map +1 -0
  563. package/dist/pricing-engine/errors.d.ts.map +1 -1
  564. package/dist/pricing-engine/errors.js +6 -1
  565. package/dist/pricing-engine/errors.js.map +1 -1
  566. package/dist/pricing-engine/index.d.ts +12 -2
  567. package/dist/pricing-engine/index.d.ts.map +1 -1
  568. package/dist/pricing-engine/index.js +6 -1
  569. package/dist/pricing-engine/index.js.map +1 -1
  570. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  571. package/dist/pricing-engine/pipeline.js +202 -28
  572. package/dist/pricing-engine/pipeline.js.map +1 -1
  573. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  574. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  575. package/dist/pricing-engine/shadow-adapter.js +75 -0
  576. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  577. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  578. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  579. package/dist/pricing-engine/shadow-diff.js +52 -0
  580. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  581. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  582. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  583. package/dist/pricing-engine/shadow-facade.js +82 -0
  584. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  585. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  586. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  587. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  588. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  589. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  590. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  591. package/dist/pricing-engine/shadow-metrics.js +31 -0
  592. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  593. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  594. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  595. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  596. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  597. package/dist/pricing-engine/types.d.ts +2 -0
  598. package/dist/pricing-engine/types.d.ts.map +1 -1
  599. package/dist/rbac/authorize.d.ts +12 -0
  600. package/dist/rbac/authorize.d.ts.map +1 -1
  601. package/dist/rbac/authorize.js +27 -0
  602. package/dist/rbac/authorize.js.map +1 -1
  603. package/dist/rbac/catalog.d.ts.map +1 -1
  604. package/dist/rbac/catalog.js +67 -1
  605. package/dist/rbac/catalog.js.map +1 -1
  606. package/dist/rbac/workload-provisioning.d.ts +66 -0
  607. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  608. package/dist/rbac/workload-provisioning.js +153 -0
  609. package/dist/rbac/workload-provisioning.js.map +1 -0
  610. package/dist/rbac/workload.d.ts +124 -0
  611. package/dist/rbac/workload.d.ts.map +1 -0
  612. package/dist/rbac/workload.js +184 -0
  613. package/dist/rbac/workload.js.map +1 -0
  614. package/dist/storage/checksum.d.ts +9 -0
  615. package/dist/storage/checksum.d.ts.map +1 -0
  616. package/dist/storage/checksum.js +12 -0
  617. package/dist/storage/checksum.js.map +1 -0
  618. package/dist/storage/key.d.ts +37 -0
  619. package/dist/storage/key.d.ts.map +1 -0
  620. package/dist/storage/key.js +67 -0
  621. package/dist/storage/key.js.map +1 -0
  622. package/dist/storage/local.d.ts +40 -0
  623. package/dist/storage/local.d.ts.map +1 -0
  624. package/dist/storage/local.js +96 -0
  625. package/dist/storage/local.js.map +1 -0
  626. package/dist/storage/r2.d.ts +43 -0
  627. package/dist/storage/r2.d.ts.map +1 -0
  628. package/dist/storage/r2.js +177 -0
  629. package/dist/storage/r2.js.map +1 -0
  630. package/dist/storage/registry.d.ts +23 -0
  631. package/dist/storage/registry.d.ts.map +1 -0
  632. package/dist/storage/registry.js +37 -0
  633. package/dist/storage/registry.js.map +1 -0
  634. package/dist/storage/types.d.ts +67 -0
  635. package/dist/storage/types.d.ts.map +1 -0
  636. package/dist/storage/types.js +45 -0
  637. package/dist/storage/types.js.map +1 -0
  638. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  639. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  640. package/dist/subscription-billing/provider/asaas.js +32 -7
  641. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  642. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  643. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  644. package/dist/subscription-billing/provider/disabled.js +8 -0
  645. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  646. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  647. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  648. package/dist/subscription-billing/provider/registry.js +17 -0
  649. package/dist/subscription-billing/provider/registry.js.map +1 -1
  650. package/dist/subscription-billing/service.d.ts +17 -1
  651. package/dist/subscription-billing/service.d.ts.map +1 -1
  652. package/dist/subscription-billing/service.js +57 -8
  653. package/dist/subscription-billing/service.js.map +1 -1
  654. package/dist/subscription-billing/types.d.ts +13 -0
  655. package/dist/subscription-billing/types.d.ts.map +1 -1
  656. package/dist/subscription-billing/types.js.map +1 -1
  657. package/dist/tenancy/provisioning.d.ts.map +1 -1
  658. package/dist/tenancy/provisioning.js +32 -8
  659. package/dist/tenancy/provisioning.js.map +1 -1
  660. package/dist/users/repository.d.ts +38 -0
  661. package/dist/users/repository.d.ts.map +1 -1
  662. package/dist/users/repository.js +118 -3
  663. package/dist/users/repository.js.map +1 -1
  664. package/dist/vault/repository.d.ts +67 -0
  665. package/dist/vault/repository.d.ts.map +1 -1
  666. package/dist/vault/repository.js +78 -0
  667. package/dist/vault/repository.js.map +1 -1
  668. package/package.json +13 -4
  669. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  670. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  671. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  672. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  673. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  674. package/src/db/migrations/0028_collection_engine.sql +94 -0
  675. package/src/db/migrations/0029_payment_rail.sql +107 -0
  676. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  677. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  678. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  679. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  680. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  681. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  682. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  683. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  684. package/src/db/migrations/0038_notification_channels.sql +175 -0
  685. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  686. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  687. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  688. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  689. package/src/db/migrations/0043_workload_identity.sql +105 -0
  690. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  691. package/dist/cjs/mail/resend-client.js +0 -103
  692. package/dist/cjs/mail/resend-client.js.map +0 -1
  693. package/dist/mail/resend-client.d.ts +0 -16
  694. package/dist/mail/resend-client.d.ts.map +0 -1
  695. package/dist/mail/resend-client.js +0 -100
  696. package/dist/mail/resend-client.js.map +0 -1
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Perfil de remetente — de quem a mensagem PARECE ser.
3
+ *
4
+ * `identity.ts` responde "existe conta deste tenant para este canal?" e não tem
5
+ * fallback nenhum, de propósito. Este módulo responde a pergunta seguinte, que a
6
+ * operação real obriga a enfrentar: **e quando o tenant não configurou conta
7
+ * própria, mas o produto já entrega e-mail hoje?**
8
+ *
9
+ * A resposta preguiçosa é `?? contaDaPlataforma`, escrita dentro de um adapter.
10
+ * Foi assim no Manga Verde, e o custo é conhecido: reputação de domínio
11
+ * compartilhada em e-mail, e uma WABA respondendo pelo comportamento de outra
12
+ * marca em WhatsApp — com bloqueio que se propaga para todos os tenants do
13
+ * número.
14
+ *
15
+ * Aqui o fallback existe, mas com quatro amarras que o tornam outra coisa:
16
+ *
17
+ * 1. É DECLARADO pelo produto, canal a canal. Não há default implícito.
18
+ * 2. Nunca vale para canal de telefone. WhatsApp e SMS falham fechado, ponto.
19
+ * 3. A IDENTIDADE VISÍVEL continua sendo a do tenant que está enviando — o
20
+ * nome de exibição vem da marca dele. A SC nunca sai parecendo Manga Verde.
21
+ * 4. A origem é devolvida junto e vai para a trilha. "Saiu pelo remetente da
22
+ * plataforma" tem de ser uma coisa que o escritório consegue VER, não uma
23
+ * linha de código que ninguém lê.
24
+ */
25
+ import type { ChannelKey } from './channel.js';
26
+ import type { CommunicationContext } from './context.js';
27
+ import type { ChannelAccount, ChannelAccountStore } from './identity.js';
28
+ /**
29
+ * De onde veio a conta que vai assinar a mensagem.
30
+ *
31
+ * Duas palavras, e a diferença entre elas é a pergunta que o Codex fez e o
32
+ * código não sabia responder.
33
+ */
34
+ export type SenderOrigin = 'tenant' | 'platform_fallback';
35
+ export interface ResolvedSenderProfile {
36
+ account: ChannelAccount;
37
+ origin: SenderOrigin;
38
+ }
39
+ /**
40
+ * Fallback de plataforma, declarado pelo produto.
41
+ *
42
+ * `displayNameFor` recebe o contexto e devolve o nome exibido — é o que garante
43
+ * a amarra 3. Um fallback com nome fixo faria todo escritório assinar igual, que
44
+ * é o defeito que `senderFor` já tinha corrigido no caminho legado.
45
+ */
46
+ export interface PlatformSenderFallback {
47
+ senderId: string;
48
+ credentialRef: string;
49
+ displayNameFor: (ctx: CommunicationContext) => string | undefined;
50
+ }
51
+ export type SenderFallbackPolicy = Partial<Record<ChannelKey, PlatformSenderFallback>>;
52
+ export type SenderRejection = 'no_account' | 'fallback_forbidden_for_channel';
53
+ export type SenderResolution = {
54
+ ok: true;
55
+ profile: ResolvedSenderProfile;
56
+ } | {
57
+ ok: false;
58
+ reason: SenderRejection;
59
+ detail: string;
60
+ };
61
+ /**
62
+ * Resolve o remetente: conta do tenant primeiro, fallback declarado depois.
63
+ *
64
+ * A ordem não é preferência, é regra. A conta do tenant, quando existe, é a
65
+ * única que pode ser usada — mesmo que esteja `paused` ou com erro. Cair para a
66
+ * plataforma porque a conta PRÓPRIA está com problema seria o pior caso
67
+ * possível: o escritório que configurou a identidade dele passaria a enviar com
68
+ * a da plataforma, justamente quando alguém está mexendo na configuração.
69
+ */
70
+ export declare function resolveSenderProfile(store: ChannelAccountStore, ctx: CommunicationContext, channel: ChannelKey, fallback?: SenderFallbackPolicy): Promise<SenderResolution>;
71
+ /**
72
+ * Store de contas com o fallback do produto já aplicado.
73
+ *
74
+ * Existe porque o fallback tem de valer na RESOLUÇÃO DE IDENTIDADE, e não só na
75
+ * construção do adapter. Registrar o canal com a conta de fallback e deixar
76
+ * `deps.accounts` devolvendo `null` produz um motor que pula o canal com
77
+ * `no_identity` antes de chegar ao adapter — o canal existe, o remetente existe,
78
+ * e a mensagem não sai. O sintoma é mudo: a trilha diz "sem conta", que é
79
+ * exatamente o que quem configurou o fallback acredita ter resolvido.
80
+ *
81
+ * `identity.ts` continua sem fallback nenhum, e é o ponto: quem decide que a
82
+ * plataforma pode assinar por um tenant é o PRODUTO, declarando a política, e a
83
+ * decisão fica visível numa decoração explícita em vez de num `??` dentro do
84
+ * motor.
85
+ */
86
+ export declare function withSenderFallback(store: ChannelAccountStore, fallback: SenderFallbackPolicy): ChannelAccountStore;
87
+ /**
88
+ * Resolvedor de credencial preso a UMA conta.
89
+ *
90
+ * Envolve o resolvedor do processo e só deixa passar a referência que a conta
91
+ * resolvida declarou. Sem isto, o resolvedor injetado é uma função que traduz
92
+ * qualquer nome em qualquer segredo, e basta um adapter passar a referência
93
+ * errada — por bug, por conta trocada, por um `??` mal colocado — para um tenant
94
+ * enviar com a credencial de outro.
95
+ *
96
+ * A trava é barata e fecha a classe inteira: nenhuma referência que não seja a
97
+ * daquela conta resolve, por construção.
98
+ */
99
+ export declare function credentialResolverFor(account: ChannelAccount, resolve: (ref: string) => Promise<string | undefined>): (ref: string) => Promise<string | undefined>;
100
+ //# sourceMappingURL=sender-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender-profile.d.ts","sourceRoot":"","sources":["../../src/communication/sender-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS,CAAC;CACnE;AAYD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAEvF,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,gCAAgC,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GAC5C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,UAAU,EACnB,QAAQ,GAAE,oBAAyB,GAClC,OAAO,CAAC,gBAAgB,CAAC,CA2C3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,oBAAoB,GAC7B,mBAAmB,CAOrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GACpD,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE9C"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Perfil de remetente — de quem a mensagem PARECE ser.
3
+ *
4
+ * `identity.ts` responde "existe conta deste tenant para este canal?" e não tem
5
+ * fallback nenhum, de propósito. Este módulo responde a pergunta seguinte, que a
6
+ * operação real obriga a enfrentar: **e quando o tenant não configurou conta
7
+ * própria, mas o produto já entrega e-mail hoje?**
8
+ *
9
+ * A resposta preguiçosa é `?? contaDaPlataforma`, escrita dentro de um adapter.
10
+ * Foi assim no Manga Verde, e o custo é conhecido: reputação de domínio
11
+ * compartilhada em e-mail, e uma WABA respondendo pelo comportamento de outra
12
+ * marca em WhatsApp — com bloqueio que se propaga para todos os tenants do
13
+ * número.
14
+ *
15
+ * Aqui o fallback existe, mas com quatro amarras que o tornam outra coisa:
16
+ *
17
+ * 1. É DECLARADO pelo produto, canal a canal. Não há default implícito.
18
+ * 2. Nunca vale para canal de telefone. WhatsApp e SMS falham fechado, ponto.
19
+ * 3. A IDENTIDADE VISÍVEL continua sendo a do tenant que está enviando — o
20
+ * nome de exibição vem da marca dele. A SC nunca sai parecendo Manga Verde.
21
+ * 4. A origem é devolvida junto e vai para a trilha. "Saiu pelo remetente da
22
+ * plataforma" tem de ser uma coisa que o escritório consegue VER, não uma
23
+ * linha de código que ninguém lê.
24
+ */
25
+ /**
26
+ * Canais que NUNCA aceitam fallback de plataforma.
27
+ *
28
+ * Lista fechada no motor, e não configuração do produto, porque a consequência
29
+ * não é do produto: uma WABA bloqueada por comportamento de um tenant derruba
30
+ * todos os outros que compartilham o número. Não existe configuração que torne
31
+ * isso aceitável, então não existe configuração.
32
+ */
33
+ const FALLBACK_FORBIDDEN = ['whatsapp', 'sms'];
34
+ /**
35
+ * Resolve o remetente: conta do tenant primeiro, fallback declarado depois.
36
+ *
37
+ * A ordem não é preferência, é regra. A conta do tenant, quando existe, é a
38
+ * única que pode ser usada — mesmo que esteja `paused` ou com erro. Cair para a
39
+ * plataforma porque a conta PRÓPRIA está com problema seria o pior caso
40
+ * possível: o escritório que configurou a identidade dele passaria a enviar com
41
+ * a da plataforma, justamente quando alguém está mexendo na configuração.
42
+ */
43
+ export async function resolveSenderProfile(store, ctx, channel, fallback = {}) {
44
+ const own = await store.find(ctx, channel);
45
+ if (own)
46
+ return { ok: true, profile: { account: own, origin: 'tenant' } };
47
+ const declared = fallback[channel];
48
+ if (!declared) {
49
+ return {
50
+ ok: false,
51
+ reason: 'no_account',
52
+ detail: `sem conta de ${channel} para este tenant/produto e sem fallback declarado`,
53
+ };
54
+ }
55
+ if (FALLBACK_FORBIDDEN.includes(channel)) {
56
+ // Produto que declarou fallback para telefone cometeu um erro de
57
+ // configuração perigoso. Recusar em silêncio o esconderia; recusar com
58
+ // motivo próprio o expõe na trilha.
59
+ return {
60
+ ok: false,
61
+ reason: 'fallback_forbidden_for_channel',
62
+ detail: `fallback de plataforma é proibido em ${channel}`,
63
+ };
64
+ }
65
+ return {
66
+ ok: true,
67
+ profile: {
68
+ account: {
69
+ channel,
70
+ // O contexto pedido, SEMPRE. É o que faz `assertOwnership` continuar
71
+ // valendo e o que impede a conta de plataforma de carregar a marca de
72
+ // outro tenant para dentro de um envio deste.
73
+ tenantId: ctx.tenantId,
74
+ product: ctx.product,
75
+ brand: ctx.brand,
76
+ senderId: declared.senderId,
77
+ displayName: declared.displayNameFor(ctx),
78
+ credentialRef: declared.credentialRef,
79
+ status: 'active',
80
+ },
81
+ origin: 'platform_fallback',
82
+ },
83
+ };
84
+ }
85
+ /**
86
+ * Store de contas com o fallback do produto já aplicado.
87
+ *
88
+ * Existe porque o fallback tem de valer na RESOLUÇÃO DE IDENTIDADE, e não só na
89
+ * construção do adapter. Registrar o canal com a conta de fallback e deixar
90
+ * `deps.accounts` devolvendo `null` produz um motor que pula o canal com
91
+ * `no_identity` antes de chegar ao adapter — o canal existe, o remetente existe,
92
+ * e a mensagem não sai. O sintoma é mudo: a trilha diz "sem conta", que é
93
+ * exatamente o que quem configurou o fallback acredita ter resolvido.
94
+ *
95
+ * `identity.ts` continua sem fallback nenhum, e é o ponto: quem decide que a
96
+ * plataforma pode assinar por um tenant é o PRODUTO, declarando a política, e a
97
+ * decisão fica visível numa decoração explícita em vez de num `??` dentro do
98
+ * motor.
99
+ */
100
+ export function withSenderFallback(store, fallback) {
101
+ return {
102
+ async find(ctx, channel) {
103
+ const resolved = await resolveSenderProfile(store, ctx, channel, fallback);
104
+ return resolved.ok ? resolved.profile.account : null;
105
+ },
106
+ };
107
+ }
108
+ /**
109
+ * Resolvedor de credencial preso a UMA conta.
110
+ *
111
+ * Envolve o resolvedor do processo e só deixa passar a referência que a conta
112
+ * resolvida declarou. Sem isto, o resolvedor injetado é uma função que traduz
113
+ * qualquer nome em qualquer segredo, e basta um adapter passar a referência
114
+ * errada — por bug, por conta trocada, por um `??` mal colocado — para um tenant
115
+ * enviar com a credencial de outro.
116
+ *
117
+ * A trava é barata e fecha a classe inteira: nenhuma referência que não seja a
118
+ * daquela conta resolve, por construção.
119
+ */
120
+ export function credentialResolverFor(account, resolve) {
121
+ return async (ref) => (ref === account.credentialRef ? resolve(ref) : undefined);
122
+ }
123
+ //# sourceMappingURL=sender-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender-profile.js","sourceRoot":"","sources":["../../src/communication/sender-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAgCH;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAUtE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAA0B,EAC1B,GAAyB,EACzB,OAAmB,EACnB,WAAiC,EAAE;IAEnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;IAE1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,gBAAgB,OAAO,oDAAoD;SACpF,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,iEAAiE;QACjE,uEAAuE;QACvE,oCAAoC;QACpC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,gCAAgC;YACxC,MAAM,EAAE,wCAAwC,OAAO,EAAE;SAC1D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,OAAO;gBACP,qEAAqE;gBACrE,sEAAsE;gBACtE,8CAA8C;gBAC9C,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC;gBACzC,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,MAAM,EAAE,QAAQ;aACjB;YACD,MAAM,EAAE,mBAAmB;SAC5B;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA0B,EAC1B,QAA8B;IAE9B,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO;YACrB,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC3E,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAuB,EACvB,OAAqD;IAErD,OAAO,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Estados de entrega e classificação de falha.
3
+ *
4
+ * `sent` significa "o provider aceitou" — o único desfecho que o e-mail
5
+ * consegue afirmar. WhatsApp e SMS informam depois, por webhook, se a mensagem
6
+ * chegou ao aparelho, e só o WhatsApp informa se foi aberta.
7
+ *
8
+ * Colapsar "aceito" e "entregue" faria a tela afirmar entrega que ninguém
9
+ * confirmou — que é precisamente a pergunta do escritório quando o cliente diz
10
+ * "não recebi nada".
11
+ */
12
+ import type { ChannelKey, DeliveryOutcomeKind } from './channel.js';
13
+ export type DeliveryStatus = 'queued' | 'sent' | 'delivered' | 'read' | 'failed' | 'opted_out';
14
+ /**
15
+ * Até onde cada canal consegue informar.
16
+ *
17
+ * SMS nunca alcança `read`, e nenhum provider de SMS devolve isso — mapear um
18
+ * `delivered` de SMS para `read` "para uniformizar" produziria uma tela
19
+ * afirmando que o cliente LEU uma cobrança que ninguém sabe se ele leu. É a
20
+ * equivalência falsa que este mapa existe para impedir.
21
+ */
22
+ export declare const CHANNEL_REPORTS: Record<ChannelKey, readonly DeliveryStatus[]>;
23
+ /** O canal é capaz de relatar este estado? Consultado ANTES de gravar um webhook. */
24
+ export declare function channelReports(channel: ChannelKey, status: DeliveryStatus): boolean;
25
+ /**
26
+ * Aplica um estado novo sobre o atual.
27
+ *
28
+ * Webhooks chegam fora de ordem — `delivered` depois de `read` acontece, e
29
+ * aceitar cegamente faria a mensagem "desler". `failed` e `opted_out` são
30
+ * terminais e nunca são sobrescritos por progresso: um `delivered` que chega
31
+ * depois de uma falha registrada é ruído do provider, não correção.
32
+ */
33
+ export declare function advanceStatus(current: DeliveryStatus, incoming: DeliveryStatus): DeliveryStatus;
34
+ /**
35
+ * Erro permanente nunca deve ser retentado, por mais que o contador permita.
36
+ *
37
+ * `unavailable` e `opted_out` também retornam falso, mas por razão oposta: não
38
+ * são falhas de entrega, e não devem sequer consumir uma tentativa.
39
+ */
40
+ export declare function isRetryable(kind: DeliveryOutcomeKind): boolean;
41
+ /**
42
+ * Estado que o desfecho assenta, ou `null` quando não assenta nenhum.
43
+ *
44
+ * `temporary` não assenta: a ação continua agendada para nova tentativa.
45
+ * `unavailable` não é tentativa — não gasta retry e não marca falha de entrega.
46
+ */
47
+ export declare function statusForOutcome(kind: DeliveryOutcomeKind): DeliveryStatus | null;
48
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/communication/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE/F;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAKzE,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAEnF;AAYD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,GAAG,cAAc,CAG/F;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,cAAc,GAAG,IAAI,CAWjF"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Estados de entrega e classificação de falha.
3
+ *
4
+ * `sent` significa "o provider aceitou" — o único desfecho que o e-mail
5
+ * consegue afirmar. WhatsApp e SMS informam depois, por webhook, se a mensagem
6
+ * chegou ao aparelho, e só o WhatsApp informa se foi aberta.
7
+ *
8
+ * Colapsar "aceito" e "entregue" faria a tela afirmar entrega que ninguém
9
+ * confirmou — que é precisamente a pergunta do escritório quando o cliente diz
10
+ * "não recebi nada".
11
+ */
12
+ /**
13
+ * Até onde cada canal consegue informar.
14
+ *
15
+ * SMS nunca alcança `read`, e nenhum provider de SMS devolve isso — mapear um
16
+ * `delivered` de SMS para `read` "para uniformizar" produziria uma tela
17
+ * afirmando que o cliente LEU uma cobrança que ninguém sabe se ele leu. É a
18
+ * equivalência falsa que este mapa existe para impedir.
19
+ */
20
+ export const CHANNEL_REPORTS = {
21
+ email: ['queued', 'sent', 'failed'],
22
+ whatsapp: ['queued', 'sent', 'delivered', 'read', 'failed', 'opted_out'],
23
+ sms: ['queued', 'sent', 'delivered', 'failed', 'opted_out'],
24
+ notification: ['queued', 'sent', 'read', 'failed'],
25
+ };
26
+ /** O canal é capaz de relatar este estado? Consultado ANTES de gravar um webhook. */
27
+ export function channelReports(channel, status) {
28
+ return CHANNEL_REPORTS[channel].includes(status);
29
+ }
30
+ /** Ordem de progresso. Um webhook atrasado nunca deve REGREDIR o estado. */
31
+ const RANK = {
32
+ queued: 0,
33
+ sent: 1,
34
+ delivered: 2,
35
+ read: 3,
36
+ failed: 4,
37
+ opted_out: 5,
38
+ };
39
+ /**
40
+ * Aplica um estado novo sobre o atual.
41
+ *
42
+ * Webhooks chegam fora de ordem — `delivered` depois de `read` acontece, e
43
+ * aceitar cegamente faria a mensagem "desler". `failed` e `opted_out` são
44
+ * terminais e nunca são sobrescritos por progresso: um `delivered` que chega
45
+ * depois de uma falha registrada é ruído do provider, não correção.
46
+ */
47
+ export function advanceStatus(current, incoming) {
48
+ if (current === 'failed' || current === 'opted_out')
49
+ return current;
50
+ return RANK[incoming] > RANK[current] ? incoming : current;
51
+ }
52
+ /**
53
+ * Erro permanente nunca deve ser retentado, por mais que o contador permita.
54
+ *
55
+ * `unavailable` e `opted_out` também retornam falso, mas por razão oposta: não
56
+ * são falhas de entrega, e não devem sequer consumir uma tentativa.
57
+ */
58
+ export function isRetryable(kind) {
59
+ return kind === 'temporary';
60
+ }
61
+ /**
62
+ * Estado que o desfecho assenta, ou `null` quando não assenta nenhum.
63
+ *
64
+ * `temporary` não assenta: a ação continua agendada para nova tentativa.
65
+ * `unavailable` não é tentativa — não gasta retry e não marca falha de entrega.
66
+ */
67
+ export function statusForOutcome(kind) {
68
+ switch (kind) {
69
+ case 'sent':
70
+ return 'sent';
71
+ case 'opted_out':
72
+ return 'opted_out';
73
+ case 'permanent':
74
+ return 'failed';
75
+ default:
76
+ return null;
77
+ }
78
+ }
79
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/communication/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAkD;IAC5E,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;IACnC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC;IACxE,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC;IAC3D,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;CACnD,CAAC;AAEF,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,OAAmB,EAAE,MAAsB;IACxE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,4EAA4E;AAC5E,MAAM,IAAI,GAAmC;IAC3C,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,CAAC;CACb,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,OAAuB,EAAE,QAAwB;IAC7E,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC;IACpE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAyB;IACnD,OAAO,IAAI,KAAK,WAAW,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAyB;IACxD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Persistência da sessão de Embedded Signup (migração 0044).
3
+ *
4
+ * Duas operações, e a segunda é a que carrega toda a segurança do fluxo:
5
+ * `consumeOnboardingSession` é **atômica e única**. Ela não lê para depois
6
+ * decidir — ela escreve com a condição embutida, e quem não conseguir escrever
7
+ * não consumiu. Um `SELECT` seguido de `UPDATE` deixaria uma janela em que duas
8
+ * requisições simultâneas com o mesmo `state` passariam as duas, e o desfecho
9
+ * disso é dois vínculos criados para uma autorização só.
10
+ */
11
+ import type { Tx } from '../../db/client.js';
12
+ export interface OnboardingSession {
13
+ id: string;
14
+ tenantId: string;
15
+ product: string;
16
+ brand: string;
17
+ channel: 'whatsapp';
18
+ provider: 'meta_whatsapp';
19
+ status: 'pending' | 'consumed' | 'failed' | 'expired';
20
+ expiresAt: string;
21
+ createdAt: string;
22
+ wabaRef: string | null;
23
+ phoneRef: string | null;
24
+ failureCode: string | null;
25
+ }
26
+ /**
27
+ * Janela de vida da sessão.
28
+ *
29
+ * Curta porque o fluxo do Embedded Signup leva minutos, não horas, e uma janela
30
+ * generosa só amplia o intervalo em que um `state` capturado ainda vale. Longa o
31
+ * bastante para o cliente terminar a verificação do número, que é o passo lento.
32
+ */
33
+ export declare const ONBOARDING_SESSION_TTL_MS: number;
34
+ export interface OpenOnboardingSessionInput {
35
+ tenantId: string;
36
+ product: string;
37
+ brand: string;
38
+ stateHash: string;
39
+ createdBy?: string | null;
40
+ ttlMs?: number;
41
+ now?: Date;
42
+ }
43
+ /** Abre uma sessão `pending`. Roda dentro do contexto do tenant (RLS FORCE). */
44
+ export declare function openOnboardingSession(tx: Tx, input: OpenOnboardingSessionInput): Promise<OnboardingSession>;
45
+ export type ConsumeRejection =
46
+ /** Nenhuma sessão com este state neste tenant. Inclui o state de outro tenant. */
47
+ 'unknown_state'
48
+ /** Existe, mas já foi consumida, já falhou, ou a janela passou. */
49
+ | 'not_pending';
50
+ export type ConsumeResult = {
51
+ ok: true;
52
+ session: OnboardingSession;
53
+ } | {
54
+ ok: false;
55
+ reason: ConsumeRejection;
56
+ };
57
+ /**
58
+ * Consome o `state` — uma vez, e só se ainda estiver na janela.
59
+ *
60
+ * O `UPDATE ... WHERE status = 'pending' AND expires_at > now()` é a garantia:
61
+ * duas requisições concorrentes disputam a mesma linha e apenas uma vê
62
+ * `count = 1`. A segunda recebe `not_pending`, que é a verdade.
63
+ *
64
+ * A distinção entre `unknown_state` e `not_pending` fica no servidor e **não vai
65
+ * para a resposta HTTP**: dizer ao cliente qual das duas foi transformaria a
66
+ * rota num oráculo de "este state existe neste tenant".
67
+ */
68
+ export declare function consumeOnboardingSession(tx: Tx, input: {
69
+ state: string;
70
+ now?: Date;
71
+ }): Promise<ConsumeResult>;
72
+ /**
73
+ * Marca uma sessão já consumida como falha, com a CLASSE do erro.
74
+ *
75
+ * Chamada depois de o `state` ter sido consumido e a troca com a Meta ter
76
+ * falhado. O status não volta para `pending`: o `code` pode ter sido gasto na
77
+ * tentativa, e reabrir a sessão convidaria a uma segunda troca que a Meta
78
+ * recusaria por motivo diferente do real.
79
+ */
80
+ export declare function failOnboardingSession(tx: Tx, id: string, failureCode: string): Promise<void>;
81
+ /** Registra os identificadores devolvidos pelo fluxo. Não são segredo. */
82
+ export declare function recordOnboardingAssets(tx: Tx, id: string, refs: {
83
+ wabaRef?: string | null;
84
+ phoneRef?: string | null;
85
+ }): Promise<void>;
86
+ /** A última sessão do tenant neste canal — é o que a tela mostra. */
87
+ export declare function latestOnboardingSession(tx: Tx): Promise<OnboardingSession | null>;
88
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../../src/communication/stores/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAG7C,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAuCD;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AAExD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,gFAAgF;AAChF,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAc5B;AAED,MAAM,MAAM,gBAAgB;AAC1B,kFAAkF;AAChF,eAAe;AACjB,mEAAmE;GACjE,aAAa,CAAC;AAElB,MAAM,MAAM,aAAa,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAErF;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACnC,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,0EAA0E;AAC1E,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC1D,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,qEAAqE;AACrE,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CASvF"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Persistência da sessão de Embedded Signup (migração 0044).
3
+ *
4
+ * Duas operações, e a segunda é a que carrega toda a segurança do fluxo:
5
+ * `consumeOnboardingSession` é **atômica e única**. Ela não lê para depois
6
+ * decidir — ela escreve com a condição embutida, e quem não conseguir escrever
7
+ * não consumiu. Um `SELECT` seguido de `UPDATE` deixaria uma janela em que duas
8
+ * requisições simultâneas com o mesmo `state` passariam as duas, e o desfecho
9
+ * disso é dois vínculos criados para uma autorização só.
10
+ */
11
+ import { uuidv7 } from '@baruk/shared';
12
+ import { hashSignupState } from '../onboarding.js';
13
+ function mapSession(r) {
14
+ return {
15
+ id: r.id,
16
+ tenantId: r.tenant_id,
17
+ product: r.product,
18
+ brand: r.brand,
19
+ channel: r.channel,
20
+ provider: r.provider,
21
+ status: r.status,
22
+ expiresAt: r.expires_at.toISOString(),
23
+ createdAt: r.created_at.toISOString(),
24
+ wabaRef: r.waba_ref,
25
+ phoneRef: r.phone_ref,
26
+ failureCode: r.failure_code,
27
+ };
28
+ }
29
+ const COLUMNS = `
30
+ id, tenant_id, product, brand, channel, provider, status,
31
+ expires_at, created_at, waba_ref, phone_ref, failure_code
32
+ `;
33
+ /**
34
+ * Janela de vida da sessão.
35
+ *
36
+ * Curta porque o fluxo do Embedded Signup leva minutos, não horas, e uma janela
37
+ * generosa só amplia o intervalo em que um `state` capturado ainda vale. Longa o
38
+ * bastante para o cliente terminar a verificação do número, que é o passo lento.
39
+ */
40
+ export const ONBOARDING_SESSION_TTL_MS = 30 * 60 * 1000;
41
+ /** Abre uma sessão `pending`. Roda dentro do contexto do tenant (RLS FORCE). */
42
+ export async function openOnboardingSession(tx, input) {
43
+ const now = input.now ?? new Date();
44
+ const expiresAt = new Date(now.getTime() + (input.ttlMs ?? ONBOARDING_SESSION_TTL_MS));
45
+ const rows = await tx `
46
+ INSERT INTO channel_onboarding_session
47
+ (id, tenant_id, product, brand, channel, provider, state_hash, created_by, expires_at)
48
+ VALUES
49
+ (${uuidv7()}, ${input.tenantId}, ${input.product}, ${input.brand},
50
+ 'whatsapp', 'meta_whatsapp', ${input.stateHash}, ${input.createdBy ?? null},
51
+ ${expiresAt.toISOString()})
52
+ RETURNING ${tx.unsafe(COLUMNS)}
53
+ `;
54
+ return mapSession(rows[0]);
55
+ }
56
+ /**
57
+ * Consome o `state` — uma vez, e só se ainda estiver na janela.
58
+ *
59
+ * O `UPDATE ... WHERE status = 'pending' AND expires_at > now()` é a garantia:
60
+ * duas requisições concorrentes disputam a mesma linha e apenas uma vê
61
+ * `count = 1`. A segunda recebe `not_pending`, que é a verdade.
62
+ *
63
+ * A distinção entre `unknown_state` e `not_pending` fica no servidor e **não vai
64
+ * para a resposta HTTP**: dizer ao cliente qual das duas foi transformaria a
65
+ * rota num oráculo de "este state existe neste tenant".
66
+ */
67
+ export async function consumeOnboardingSession(tx, input) {
68
+ const state = input.state?.trim() ?? '';
69
+ if (!state)
70
+ return { ok: false, reason: 'unknown_state' };
71
+ const stateHash = hashSignupState(state);
72
+ const now = input.now ?? new Date();
73
+ const rows = await tx `
74
+ UPDATE channel_onboarding_session
75
+ SET status = 'consumed', consumed_at = ${now.toISOString()}, updated_at = now()
76
+ WHERE state_hash = ${stateHash}
77
+ AND status = 'pending'
78
+ AND expires_at > ${now.toISOString()}
79
+ RETURNING ${tx.unsafe(COLUMNS)}
80
+ `;
81
+ const row = rows[0];
82
+ if (row)
83
+ return { ok: true, session: mapSession(row) };
84
+ // Não conseguiu consumir. A linha existe (e não está mais elegível) ou nunca
85
+ // existiu neste tenant — a RLS já respondeu por essa segunda hipótese.
86
+ const existing = await tx `
87
+ SELECT id FROM channel_onboarding_session WHERE state_hash = ${stateHash} LIMIT 1
88
+ `;
89
+ return { ok: false, reason: existing[0] ? 'not_pending' : 'unknown_state' };
90
+ }
91
+ /**
92
+ * Marca uma sessão já consumida como falha, com a CLASSE do erro.
93
+ *
94
+ * Chamada depois de o `state` ter sido consumido e a troca com a Meta ter
95
+ * falhado. O status não volta para `pending`: o `code` pode ter sido gasto na
96
+ * tentativa, e reabrir a sessão convidaria a uma segunda troca que a Meta
97
+ * recusaria por motivo diferente do real.
98
+ */
99
+ export async function failOnboardingSession(tx, id, failureCode) {
100
+ await tx `
101
+ UPDATE channel_onboarding_session
102
+ SET status = 'failed', failure_code = ${failureCode.slice(0, 60)}, updated_at = now()
103
+ WHERE id = ${id}
104
+ `;
105
+ }
106
+ /** Registra os identificadores devolvidos pelo fluxo. Não são segredo. */
107
+ export async function recordOnboardingAssets(tx, id, refs) {
108
+ await tx `
109
+ UPDATE channel_onboarding_session
110
+ SET waba_ref = ${refs.wabaRef ?? null},
111
+ phone_ref = ${refs.phoneRef ?? null},
112
+ updated_at = now()
113
+ WHERE id = ${id}
114
+ `;
115
+ }
116
+ /** A última sessão do tenant neste canal — é o que a tela mostra. */
117
+ export async function latestOnboardingSession(tx) {
118
+ const rows = await tx `
119
+ SELECT ${tx.unsafe(COLUMNS)}
120
+ FROM channel_onboarding_session
121
+ WHERE channel = 'whatsapp'
122
+ ORDER BY created_at DESC
123
+ LIMIT 1
124
+ `;
125
+ return rows[0] ? mapSession(rows[0]) : null;
126
+ }
127
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../../src/communication/stores/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAgCnD,SAAS,UAAU,CAAC,CAAa;IAC/B,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,OAAO,EAAE,CAAC,CAAC,OAAqB;QAChC,QAAQ,EAAE,CAAC,CAAC,QAA2B;QACvC,MAAM,EAAE,CAAC,CAAC,MAAqC;QAC/C,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE,CAAC,CAAC,QAAQ;QACnB,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,WAAW,EAAE,CAAC,CAAC,YAAY;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAG;;;CAGf,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAYxD,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAM,EACN,KAAiC;IAEjC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAC,CAAC;IAEvF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAc;;;;SAI5B,MAAM,EAAE,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK;sCAChC,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,IAAI;SACxE,SAAS,CAAC,WAAW,EAAE;gBAChB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;GAC/B,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;AAC9B,CAAC;AAWD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,EAAM,EACN,KAAoC;IAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1D,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAc;;gDAEW,GAAG,CAAC,WAAW,EAAE;0BACvC,SAAS;;0BAET,GAAG,CAAC,WAAW,EAAE;gBAC3B,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;GAC/B,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAEvD,6EAA6E;IAC7E,uEAAuE;IACvE,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAkB;mEACsB,SAAS;GACzE,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;AAC9E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAM,EACN,EAAU,EACV,WAAmB;IAEnB,MAAM,EAAE,CAAA;;+CAEqC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;kBACrD,EAAE;GACjB,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAM,EACN,EAAU,EACV,IAA2D;IAE3D,MAAM,EAAE,CAAA;;wBAEc,IAAI,CAAC,OAAO,IAAI,IAAI;yBACnB,IAAI,CAAC,QAAQ,IAAI,IAAI;;kBAE5B,EAAE;GACjB,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAAM;IAClD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAc;aACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;;;;;GAK5B,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC"}