@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,287 @@
1
+ /**
2
+ * Onboarding de conta de canal — Embedded Signup da Meta.
3
+ *
4
+ * Este módulo é a fronteira entre "o operador clicou em Conectar" e "existe um
5
+ * vínculo de canal com credencial no cofre". Ele não escreve no banco e não lê
6
+ * configuração: recebe o que precisa e devolve o que descobriu, para que o
7
+ * produto decida o que persistir.
8
+ *
9
+ * ── A regra que este arquivo existe para cumprir ────────────────────────────
10
+ *
11
+ * **Nenhum token é digitado por humano.** O caminho anterior — e o que ainda
12
+ * está no cofre desta casa, sob `PROPOSAL_COMM_WA_ACCESS_TOKEN` — é um token de
13
+ * USUÁRIO gerado no painel da Meta e colado numa variável de ambiente. Ele
14
+ * expirou em 2026-07-21 e derrubou o canal sem que nada avisasse, porque um
15
+ * token colado não tem dono, não tem renovação e não tem trilha: ninguém sabe
16
+ * quem o gerou nem quando ele morre.
17
+ *
18
+ * **Aquela credencial é de OUTRO app** — "Baruk Communication Sandbox", do motor
19
+ * de propostas — e **não deve ser reutilizada aqui em hipótese nenhuma**. O app
20
+ * canônico deste caminho é o "Baruk Comunicação". A distinção está escrita
21
+ * porque os dois têm nome parecido e a mesma cara no cofre, e reaproveitar o
22
+ * errado é a regressão mais barata de cometer nesta frente.
23
+ *
24
+ * O Embedded Signup devolve, para o servidor, um `code` trocável por um
25
+ * **business integration system user access token** — escopado ao cliente que
26
+ * autorizou, de vida longa, revogável por ele, e que nunca passa pelo teclado
27
+ * de ninguém.
28
+ *
29
+ * ── O que NÃO está aqui ─────────────────────────────────────────────────────
30
+ *
31
+ * O `client_secret` do App. Ele entra por parâmetro, vindo do ambiente do
32
+ * processo, e nunca é logado, devolvido nem embutido em mensagem de erro. Pelo
33
+ * mesmo motivo, nenhuma função deste arquivo devolve a mensagem de erro da
34
+ * Meta: ela carrega, com frequência, o nome e o identificador do negócio do
35
+ * cliente — que é PII de terceiro dentro de um log nosso.
36
+ */
37
+ import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
38
+ import { graphUrl } from './graph.js';
39
+ /**
40
+ * 32 bytes de aleatoriedade criptográfica.
41
+ *
42
+ * Não é um uuid de propósito: um uuidv7 carrega o instante de criação e é
43
+ * parcialmente previsível, e a única função deste valor é ser impossível de
44
+ * adivinhar.
45
+ */
46
+ export function createSignupState() {
47
+ const state = randomBytes(32).toString('base64url');
48
+ return { state, stateHash: hashSignupState(state) };
49
+ }
50
+ export function hashSignupState(state) {
51
+ return createHash('sha256').update(state, 'utf8').digest('hex');
52
+ }
53
+ /**
54
+ * Comparação de hashes em tempo constante.
55
+ *
56
+ * A busca no banco é por igualdade de índice e já vaza tempo por natureza; esta
57
+ * função existe para o segundo confronto, feito em memória depois da leitura,
58
+ * onde a comparação ingênua compara byte a byte e para no primeiro que difere.
59
+ */
60
+ export function sameStateHash(a, b) {
61
+ if (typeof a !== 'string' || typeof b !== 'string')
62
+ return false;
63
+ const ba = Buffer.from(a, 'utf8');
64
+ const bb = Buffer.from(b, 'utf8');
65
+ if (ba.length !== bb.length)
66
+ return false;
67
+ return timingSafeEqual(ba, bb);
68
+ }
69
+ const DEFAULT_TIMEOUT_MS = 15_000;
70
+ /**
71
+ * Traduz o erro da Meta para uma classe nossa.
72
+ *
73
+ * `100`/`191` sobre um `code` significam código gasto ou redirect divergente —
74
+ * os dois são "refaça o fluxo", não "conserte a configuração". `190` e `200`
75
+ * são credencial/permissão do App: refazer o fluxo não resolve nada, e mostrar
76
+ * "tente de novo" ao operador o faria repetir para sempre um passo que nunca
77
+ * vai funcionar.
78
+ */
79
+ function classifySignupError(status, err) {
80
+ const code = err?.code;
81
+ if (code === 190 || code === 200 || code === 10 || code === 3)
82
+ return 'unauthorized_app';
83
+ if (code === 100 || code === 191)
84
+ return 'invalid_code';
85
+ if (code === 4 || code === 17 || code === 80007 || code === 613)
86
+ return 'rate_limited';
87
+ if (status === 429)
88
+ return 'rate_limited';
89
+ if (status >= 500)
90
+ return 'network';
91
+ return 'provider_error';
92
+ }
93
+ /**
94
+ * Uma chamada à Graph API, com a resposta já reduzida a `ok`/classe de erro.
95
+ *
96
+ * Centraliza três cuidados que, escritos em cada chamada, um dia divergiriam:
97
+ * o timeout (uma chamada sem teto pendura o request do operador), o descarte
98
+ * total da exceção de rede (ela pode carregar a URL, e a URL de troca carrega
99
+ * o `client_secret` na query), e a leitura do corpo de erro sem propagá-lo.
100
+ */
101
+ async function graphCall(call, opts) {
102
+ const doFetch = opts.fetchImpl ?? fetch;
103
+ let res;
104
+ try {
105
+ res = await doFetch(call.url, {
106
+ method: call.method,
107
+ headers: {
108
+ ...(call.bearer ? { authorization: `Bearer ${call.bearer}` } : {}),
109
+ ...(call.body ? { 'content-type': 'application/json' } : {}),
110
+ },
111
+ ...(call.body ? { body: JSON.stringify(call.body) } : {}),
112
+ signal: AbortSignal.timeout(opts.timeoutMs ?? DEFAULT_TIMEOUT_MS),
113
+ });
114
+ }
115
+ catch {
116
+ // Nada da exceção é propagado. Em algumas implementações de `fetch` a
117
+ // mensagem inclui a URL — e a URL da troca de código carrega o segredo do
118
+ // App na query string.
119
+ return { ok: false, reason: 'network' };
120
+ }
121
+ const payload = (await res.json().catch(() => null));
122
+ if (!res.ok) {
123
+ const err = (payload?.error ?? null);
124
+ return { ok: false, reason: classifySignupError(res.status, err) };
125
+ }
126
+ return { ok: true, value: (payload ?? {}) };
127
+ }
128
+ /**
129
+ * Troca o `code` do Embedded Signup pelo token de negócio do cliente.
130
+ *
131
+ * **Server-to-server, sempre.** O `client_secret` do App não pode existir no
132
+ * navegador: quem o tiver consegue trocar códigos de qualquer cliente e falar
133
+ * pela conta dele. É por isso que o front devolve `code` e não token, e é por
134
+ * isso que esta função vive no servidor.
135
+ */
136
+ export async function exchangeSignupCode(input, opts = {}) {
137
+ const code = input.code?.trim() ?? '';
138
+ const appId = input.appId?.trim() ?? '';
139
+ const appSecret = typeof input.appSecret === 'string' ? input.appSecret : '';
140
+ if (!code || !appId || !appSecret)
141
+ return { ok: false, reason: 'unauthorized_app' };
142
+ const url = new URL(graphUrl('oauth/access_token', opts.env));
143
+ url.searchParams.set('client_id', appId);
144
+ url.searchParams.set('client_secret', appSecret);
145
+ url.searchParams.set('code', code);
146
+ const res = await graphCall({ url: url.toString(), method: 'GET' }, opts);
147
+ if (!res.ok)
148
+ return res;
149
+ const token = res.value.access_token;
150
+ // Resposta 200 sem token é resposta inválida, não sucesso vazio. Deixá-la
151
+ // passar gravaria uma credencial em branco no cofre e o canal falharia
152
+ // depois, longe daqui.
153
+ if (typeof token !== 'string' || token.length < 20) {
154
+ return { ok: false, reason: 'provider_error' };
155
+ }
156
+ return {
157
+ ok: true,
158
+ value: {
159
+ accessToken: token,
160
+ ...(typeof res.value.expires_in === 'number' && res.value.expires_in > 0
161
+ ? { expiresInSeconds: res.value.expires_in }
162
+ : {}),
163
+ },
164
+ };
165
+ }
166
+ /* ── 2. Assinatura do App na WABA do cliente ────────────────────────────── */
167
+ /**
168
+ * Assina o App do motor nos webhooks da WABA do cliente.
169
+ *
170
+ * Sem isto o vínculo existe, o envio funciona e **nenhum status volta**: a
171
+ * mensagem fica presa em `sent` para sempre e a tela do escritório não sabe
172
+ * dizer se o cliente recebeu. É a diferença entre um canal que funciona e um
173
+ * canal que parece funcionar.
174
+ *
175
+ * Idempotente do lado da Meta — assinar duas vezes não é erro.
176
+ */
177
+ export async function subscribeAppToWaba(input, opts = {}) {
178
+ const wabaId = input.wabaId?.trim() ?? '';
179
+ if (!wabaId)
180
+ return { ok: false, reason: 'provider_error' };
181
+ const res = await graphCall({
182
+ url: graphUrl(`${encodeURIComponent(wabaId)}/subscribed_apps`, opts.env),
183
+ method: 'POST',
184
+ bearer: input.accessToken,
185
+ }, opts);
186
+ if (!res.ok)
187
+ return res;
188
+ return { ok: true, value: { subscribed: res.value.success !== false } };
189
+ }
190
+ /**
191
+ * Estado do número, do ponto de vista da Meta.
192
+ *
193
+ * Leitura pura. É o que permite à tela dizer `attention_required` com um motivo
194
+ * — "número não verificado", "conta restrita" — em vez do genérico "erro", que
195
+ * obriga o escritório a abrir o painel da Meta para descobrir o quê.
196
+ */
197
+ export async function readPhoneNumber(input, opts = {}) {
198
+ const id = input.phoneNumberId?.trim() ?? '';
199
+ if (!id)
200
+ return { ok: false, reason: 'provider_error' };
201
+ const url = new URL(graphUrl(encodeURIComponent(id), opts.env));
202
+ url.searchParams.set('fields', 'display_phone_number,verified_name,code_verification_status,status,quality_rating,platform_type');
203
+ const res = await graphCall({ url: url.toString(), method: 'GET', bearer: input.accessToken }, opts);
204
+ if (!res.ok)
205
+ return res;
206
+ const v = res.value;
207
+ return {
208
+ ok: true,
209
+ value: {
210
+ ...(str(v.display_phone_number) ? { displayPhoneNumber: str(v.display_phone_number) } : {}),
211
+ ...(str(v.verified_name) ? { verifiedName: str(v.verified_name) } : {}),
212
+ ...(str(v.code_verification_status)
213
+ ? { codeVerificationStatus: str(v.code_verification_status) }
214
+ : {}),
215
+ ...(str(v.status) ? { status: str(v.status) } : {}),
216
+ ...(str(v.quality_rating) ? { qualityRating: str(v.quality_rating) } : {}),
217
+ ...(str(v.platform_type) ? { platformType: str(v.platform_type) } : {}),
218
+ },
219
+ };
220
+ }
221
+ /**
222
+ * Lista os templates da WABA do cliente. **Somente leitura.**
223
+ *
224
+ * Existe porque `approvedEvents` é uma lista mantida à mão em
225
+ * `tenant.settings`, e uma lista declarada por humano diverge da realidade da
226
+ * Meta no dia em que alguém aprova, pausa ou reprova um template lá. Um template
227
+ * marcado "aprovado" aqui e reprovado lá gasta a tentativa de envio e volta erro
228
+ * permanente — que a régua interpreta como problema do destinatário.
229
+ *
230
+ * Devolver a lista permite que a decisão de configurar `approvedEvents` seja
231
+ * tomada contra o que a Meta diz, e não contra o que alguém lembrou.
232
+ */
233
+ export async function listWabaTemplates(input, opts = {}) {
234
+ const wabaId = input.wabaId?.trim() ?? '';
235
+ if (!wabaId)
236
+ return { ok: false, reason: 'provider_error' };
237
+ const url = new URL(graphUrl(`${encodeURIComponent(wabaId)}/message_templates`, opts.env));
238
+ url.searchParams.set('fields', 'name,language,status,category');
239
+ url.searchParams.set('limit', '100');
240
+ const res = await graphCall({ url: url.toString(), method: 'GET', bearer: input.accessToken }, opts);
241
+ if (!res.ok)
242
+ return res;
243
+ const items = Array.isArray(res.value.data) ? res.value.data : [];
244
+ return {
245
+ ok: true,
246
+ // Só os quatro campos que interessam. O payload da Meta traz `components`
247
+ // com o TEXTO do template, e o texto de um template de cobrança carrega a
248
+ // forma como o escritório fala com o cliente — não precisa atravessar o
249
+ // domínio para responder "está aprovado?".
250
+ value: items.flatMap((t) => {
251
+ const name = str(t.name);
252
+ const language = str(t.language);
253
+ const status = str(t.status);
254
+ if (!name || !language || !status)
255
+ return [];
256
+ const category = str(t.category);
257
+ return [{ name, language, status, ...(category ? { category } : {}) }];
258
+ }),
259
+ };
260
+ }
261
+ /**
262
+ * Registra o número do cliente na Cloud API.
263
+ *
264
+ * Implementado e **não chamado** por nenhum caminho automático desta fase. O
265
+ * gate de autorização humana está no parâmetro, e não numa convenção de
266
+ * chamada: uma trava que depende de ninguém chamar a função errada não é trava.
267
+ */
268
+ export async function registerPhoneNumber(input, opts = {}) {
269
+ if (input.authorized !== true)
270
+ return { ok: false, reason: 'not_authorized' };
271
+ const pin = input.pin?.trim() ?? '';
272
+ if (!/^\d{6}$/.test(pin))
273
+ return { ok: false, reason: 'invalid_pin' };
274
+ const res = await graphCall({
275
+ url: graphUrl(`${encodeURIComponent(input.phoneNumberId)}/register`, opts.env),
276
+ method: 'POST',
277
+ bearer: input.accessToken,
278
+ body: { messaging_product: 'whatsapp', pin },
279
+ }, opts);
280
+ if (!res.ok)
281
+ return { ok: false, reason: res.reason };
282
+ return { ok: true };
283
+ }
284
+ function str(v) {
285
+ return typeof v === 'string' && v.trim().length > 0 ? v.trim().slice(0, 120) : undefined;
286
+ }
287
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/communication/onboarding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Política de canais — qual canal tentar, em que ordem, e quando desistir.
3
+ *
4
+ * A política é DADO do consumidor, nunca constante do motor. O adendo §12 é
5
+ * explícito: `D-3`, `D0`, `D+3` e a escolha de canal pertencem à régua da SC. O
6
+ * motor recebe uma intenção que já diz "tente WhatsApp, depois e-mail" e a
7
+ * executa; ele nunca decide que cobrança de contabilidade começa por WhatsApp.
8
+ */
9
+ import type { ChannelKey } from './channel.js';
10
+ export interface ChannelPolicy {
11
+ /**
12
+ * Canais em ordem de preferência. O primeiro que estiver utilizável ganha.
13
+ *
14
+ * Lista, e não canal único com `fallback` opcional, porque a segunda escolha
15
+ * também pode falhar — e a alternativa seria aninhar fallback dentro de
16
+ * fallback até alguém parar de aninhar no nível errado.
17
+ */
18
+ order: readonly ChannelKey[];
19
+ /**
20
+ * Continuar para o próximo canal depois de uma falha TEMPORÁRIA?
21
+ *
22
+ * Padrão `false`, e o padrão é o ponto: numa falha temporária a mensagem ainda
23
+ * pode sair no canal preferido na próxima tentativa. Cair para o próximo
24
+ * imediatamente entrega DOIS avisos ao cliente pelo preço de uma instabilidade
25
+ * de rede — e num aviso de cobrança isso não é redundância simpática, é o
26
+ * escritório parecendo insistente.
27
+ */
28
+ fallbackOnTemporary?: boolean;
29
+ }
30
+ /**
31
+ * Por que um canal foi pulado. Cada motivo leva a uma ação operacional diferente
32
+ * na tela da régua, e por isso nenhum deles é "erro".
33
+ */
34
+ export type SkipReason =
35
+ /** Canal não registrado no ambiente. */
36
+ 'channel_not_registered'
37
+ /** Sem conta/credencial deste tenant para o canal. */
38
+ | 'no_identity'
39
+ /** Destinatário sem endereço/telefone utilizável para este canal. */
40
+ | 'no_recipient'
41
+ /** Telefone presente mas inválido, ou fixo onde só celular serve. */
42
+ | 'invalid_recipient'
43
+ /** Opt-out registrado. */
44
+ | 'opted_out'
45
+ /** Sem permissão registrada e a política do produto é fail-safe. */
46
+ | 'consent_unknown'
47
+ /** Sem template aprovado para o evento neste canal. */
48
+ | 'no_template'
49
+ /** Já enviado — a reserva desta chave está assentada como entregue. */
50
+ | 'already_sent'
51
+ /**
52
+ * Outra execução está com a reserva desta chave AGORA.
53
+ *
54
+ * Distinto de `already_sent`: ali a mensagem saiu, aqui ela pode estar
55
+ * saindo neste instante em outro worker. Um só rótulo faria a trilha
56
+ * afirmar entrega que ninguém confirmou — e faria a régua parar de
57
+ * distinguir "o sistema funcionou" de "duas execuções disputaram".
58
+ */
59
+ | 'claim_in_flight'
60
+ /**
61
+ * Esta execução TINHA a reserva e a perdeu antes de chamar o provider.
62
+ *
63
+ * O caso concreto: o processo travou (GC longo, `SIGSTOP`, VM suspensa) por
64
+ * mais tempo que o prazo da reserva, outro worker a retomou, e o primeiro
65
+ * acordou achando que ainda era o titular. O fencing pré-provider o barra na
66
+ * última fronteira persistente, e este é o rótulo.
67
+ *
68
+ * Distinto de `claim_in_flight` em quem é o sujeito: ali a reserva NUNCA foi
69
+ * concedida a esta execução; aqui ela foi, e expirou no meio. A diferença
70
+ * importa para quem investiga — `claim_in_flight` em massa é concorrência
71
+ * saudável, `claim_lost` em massa é prazo curto demais para o tempo real de
72
+ * envio, ou instância sofrendo pausa.
73
+ */
74
+ | 'claim_lost'
75
+ /**
76
+ * A chave está assentada como falha permanente. Retentar repetiria o mesmo
77
+ * erro; o que falta é ação humana, não outra tentativa.
78
+ */
79
+ | 'permanently_failed'
80
+ /**
81
+ * O desfecho da tentativa anterior é DESCONHECIDO — alguém chamou o provider e
82
+ * morreu antes de assentar — e não há garantia externa que torne o reenvio
83
+ * seguro.
84
+ *
85
+ * Distinto de `permanently_failed` em tudo que importa para quem opera: ali a
86
+ * mensagem comprovadamente não saiu, aqui ninguém sabe. Um só rótulo mandaria
87
+ * o escritório reenviar o que talvez já tenha chegado.
88
+ */
89
+ | 'unknown_outcome';
90
+ /** Uma tentativa por canal, na ordem — o registro do que o motor fez e por quê. */
91
+ export interface ChannelAttempt {
92
+ channel: ChannelKey;
93
+ skipped?: SkipReason;
94
+ outcome?: 'sent' | 'temporary' | 'permanent' | 'opted_out' | 'unavailable';
95
+ providerRef?: string;
96
+ detail?: string;
97
+ }
98
+ export declare const DEFAULT_POLICY: ChannelPolicy;
99
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/communication/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7B;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,wCAAwC;AACtC,wBAAwB;AAC1B,sDAAsD;GACpD,aAAa;AACf,qEAAqE;GACnE,cAAc;AAChB,qEAAqE;GACnE,mBAAmB;AACrB,0BAA0B;GACxB,WAAW;AACb,oEAAoE;GAClE,iBAAiB;AACnB,uDAAuD;GACrD,aAAa;AACf,uEAAuE;GACrE,cAAc;AAChB;;;;;;;GAOG;GACD,iBAAiB;AACnB;;;;;;;;;;;;;GAaG;GACD,YAAY;AACd;;;GAGG;GACD,oBAAoB;AACtB;;;;;;;;GAQG;GACD,iBAAiB,CAAC;AAEtB,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,CAAC;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,cAAc,EAAE,aAG5B,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Política de canais — qual canal tentar, em que ordem, e quando desistir.
3
+ *
4
+ * A política é DADO do consumidor, nunca constante do motor. O adendo §12 é
5
+ * explícito: `D-3`, `D0`, `D+3` e a escolha de canal pertencem à régua da SC. O
6
+ * motor recebe uma intenção que já diz "tente WhatsApp, depois e-mail" e a
7
+ * executa; ele nunca decide que cobrança de contabilidade começa por WhatsApp.
8
+ */
9
+ export const DEFAULT_POLICY = {
10
+ order: ['email'],
11
+ fallbackOnTemporary: false,
12
+ };
13
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/communication/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA+FH,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,mBAAmB,EAAE,KAAK;CAC3B,CAAC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Roteamento de webhook de entrada — de quem é este evento?
3
+ *
4
+ * **Este módulo existe por causa da topologia do provider, não por gosto de
5
+ * abstração.** Sob um Meta App único do motor — que é a topologia oficial de
6
+ * Tech Provider —, a URL de callback e o verify token pertencem ao APP, não à
7
+ * conta do cliente. A Meta entrega os eventos de TODAS as WABAs assinadas no
8
+ * mesmo endereço, e não tem como saber o nosso `tenantId`.
9
+ *
10
+ * A rota anterior embutia `:tenantId` no path. Isso só funciona quando cada
11
+ * tenant tem o próprio App e o próprio webhook — uma topologia que a plataforma
12
+ * suporta, mas que não é a que o motor vai operar, e que não oferece
13
+ * coexistência com o WhatsApp Business App. Com um App só, o tenant tem de sair
14
+ * do PAYLOAD.
15
+ *
16
+ * O que decide é `metadata.phone_number_id`. O WABA (`entry.id`) é **conferência
17
+ * de coerência**, nunca segunda chave: um número que resolve para um registro
18
+ * cujo WABA discorda significa cadastro errado ou payload forjado, e os dois
19
+ * merecem recusa em vez de palpite. É a mesma conclusão a que o registry do
20
+ * Paid Media Engine já tinha chegado, e ela é reaproveitada aqui de propósito.
21
+ *
22
+ * Nunca decidem: telefone do remetente, nome do contato, texto da mensagem,
23
+ * nome de campanha. São entrada não autenticada ou ambígua — o mesmo telefone
24
+ * pode falar com dois tenants.
25
+ */
26
+ /** Provedores cujo webhook este módulo sabe rotear. */
27
+ export type RoutedProvider = 'meta_whatsapp';
28
+ /**
29
+ * A origem declarada por um evento de entrada.
30
+ *
31
+ * `providerAccountRef` é o identificador de ROTEAMENTO (na Meta,
32
+ * `phone_number_id`). `providerParentRef` é o agrupador (a WABA), usado só para
33
+ * conferir coerência.
34
+ */
35
+ export interface WebhookOrigin {
36
+ provider: RoutedProvider;
37
+ providerAccountRef: string;
38
+ providerParentRef?: string;
39
+ }
40
+ /**
41
+ * Vínculo entre uma conta do provider e um tenant/produto.
42
+ *
43
+ * **Sem segredo.** Só identificadores emitidos pelo provider e o dono. A
44
+ * credencial correspondente é resolvida depois, dentro do contexto do tenant,
45
+ * por referência lógica.
46
+ */
47
+ export interface ChannelRoute {
48
+ provider: RoutedProvider;
49
+ providerAccountRef: string;
50
+ providerParentRef?: string;
51
+ tenantId: string;
52
+ product: string;
53
+ brand: string;
54
+ bindingId: string;
55
+ }
56
+ /**
57
+ * Fonte de rotas.
58
+ *
59
+ * Consultada ANTES de existir contexto de tenant — é o que a distingue do
60
+ * `ChannelAccountStore`, que só responde dentro de um tenant já conhecido.
61
+ */
62
+ export interface ChannelRouteStore {
63
+ findByProviderAccount(provider: RoutedProvider, providerAccountRef: string): Promise<ChannelRoute | null>;
64
+ }
65
+ export type RouteRejection =
66
+ /** O payload não declarou de qual conta veio. */
67
+ 'missing_origin'
68
+ /** Nenhum tenant reivindicou esta conta. NUNCA vira tenant padrão. */
69
+ | 'unknown_account'
70
+ /** A conta existe, mas o agrupador declarado discorda do registrado. */
71
+ | 'parent_mismatch'
72
+ /** O vínculo existe e não está ativo. */
73
+ | 'not_active';
74
+ export type RouteResolution = {
75
+ ok: true;
76
+ route: ChannelRoute;
77
+ } | {
78
+ ok: false;
79
+ reason: RouteRejection;
80
+ detail: string;
81
+ };
82
+ /**
83
+ * Resolve a origem de um evento para um tenant.
84
+ *
85
+ * **Fail-closed por construção.** Não existe neste arquivo nenhum caminho que
86
+ * devolva uma rota que não tenha sido encontrada pela chave exata do provider:
87
+ * não há tenant padrão, não há "primeiro tenant", não há fallback por marca. Um
88
+ * número desconhecido resolve para recusa, e quem chama audita e para.
89
+ */
90
+ export declare function resolveRoute(store: ChannelRouteStore, origin: WebhookOrigin): Promise<RouteResolution>;
91
+ /**
92
+ * Duas origens são a mesma?
93
+ *
94
+ * Um POST da Meta pode trazer eventos de mais de uma conta. Agrupar por origem
95
+ * antes de abrir contexto de tenant é o que impede o evento de um escritório de
96
+ * ser aplicado dentro da transação de outro.
97
+ */
98
+ export declare function sameOrigin(a: WebhookOrigin, b: WebhookOrigin): boolean;
99
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/communication/routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,uDAAuD;AACvD,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qBAAqB,CACnB,QAAQ,EAAE,cAAc,EACxB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,cAAc;AACxB,iDAAiD;AAC/C,gBAAgB;AAClB,sEAAsE;GACpE,iBAAiB;AACnB,wEAAwE;GACtE,iBAAiB;AACnB,yCAAyC;GACvC,YAAY,CAAC;AAEjB,MAAM,MAAM,eAAe,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5F;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,eAAe,CAAC,CA+B1B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAMtE"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Roteamento de webhook de entrada — de quem é este evento?
3
+ *
4
+ * **Este módulo existe por causa da topologia do provider, não por gosto de
5
+ * abstração.** Sob um Meta App único do motor — que é a topologia oficial de
6
+ * Tech Provider —, a URL de callback e o verify token pertencem ao APP, não à
7
+ * conta do cliente. A Meta entrega os eventos de TODAS as WABAs assinadas no
8
+ * mesmo endereço, e não tem como saber o nosso `tenantId`.
9
+ *
10
+ * A rota anterior embutia `:tenantId` no path. Isso só funciona quando cada
11
+ * tenant tem o próprio App e o próprio webhook — uma topologia que a plataforma
12
+ * suporta, mas que não é a que o motor vai operar, e que não oferece
13
+ * coexistência com o WhatsApp Business App. Com um App só, o tenant tem de sair
14
+ * do PAYLOAD.
15
+ *
16
+ * O que decide é `metadata.phone_number_id`. O WABA (`entry.id`) é **conferência
17
+ * de coerência**, nunca segunda chave: um número que resolve para um registro
18
+ * cujo WABA discorda significa cadastro errado ou payload forjado, e os dois
19
+ * merecem recusa em vez de palpite. É a mesma conclusão a que o registry do
20
+ * Paid Media Engine já tinha chegado, e ela é reaproveitada aqui de propósito.
21
+ *
22
+ * Nunca decidem: telefone do remetente, nome do contato, texto da mensagem,
23
+ * nome de campanha. São entrada não autenticada ou ambígua — o mesmo telefone
24
+ * pode falar com dois tenants.
25
+ */
26
+ /**
27
+ * Resolve a origem de um evento para um tenant.
28
+ *
29
+ * **Fail-closed por construção.** Não existe neste arquivo nenhum caminho que
30
+ * devolva uma rota que não tenha sido encontrada pela chave exata do provider:
31
+ * não há tenant padrão, não há "primeiro tenant", não há fallback por marca. Um
32
+ * número desconhecido resolve para recusa, e quem chama audita e para.
33
+ */
34
+ export async function resolveRoute(store, origin) {
35
+ const accountRef = origin.providerAccountRef?.trim();
36
+ if (!accountRef) {
37
+ return { ok: false, reason: 'missing_origin', detail: 'evento sem conta de origem' };
38
+ }
39
+ const route = await store.findByProviderAccount(origin.provider, accountRef);
40
+ if (!route) {
41
+ return {
42
+ ok: false,
43
+ reason: 'unknown_account',
44
+ detail: `conta ${origin.provider} não vinculada a nenhum tenant`,
45
+ };
46
+ }
47
+ // Conferência de coerência — só quando os dois lados declaram o agrupador.
48
+ // Exigi-lo quando o payload não o traz recusaria evento legítimo; ignorá-lo
49
+ // quando ambos existem e discordam aceitaria cadastro corrompido.
50
+ if (origin.providerParentRef &&
51
+ route.providerParentRef &&
52
+ origin.providerParentRef !== route.providerParentRef) {
53
+ return {
54
+ ok: false,
55
+ reason: 'parent_mismatch',
56
+ detail: 'agrupador do evento discorda do vínculo registrado',
57
+ };
58
+ }
59
+ return { ok: true, route };
60
+ }
61
+ /**
62
+ * Duas origens são a mesma?
63
+ *
64
+ * Um POST da Meta pode trazer eventos de mais de uma conta. Agrupar por origem
65
+ * antes de abrir contexto de tenant é o que impede o evento de um escritório de
66
+ * ser aplicado dentro da transação de outro.
67
+ */
68
+ export function sameOrigin(a, b) {
69
+ return (a.provider === b.provider &&
70
+ a.providerAccountRef === b.providerAccountRef &&
71
+ (a.providerParentRef ?? '') === (b.providerParentRef ?? ''));
72
+ }
73
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/communication/routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AA6DH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAwB,EACxB,MAAqB;IAErB,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,SAAS,MAAM,CAAC,QAAQ,gCAAgC;SACjE,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,4EAA4E;IAC5E,kEAAkE;IAClE,IACE,MAAM,CAAC,iBAAiB;QACxB,KAAK,CAAC,iBAAiB;QACvB,MAAM,CAAC,iBAAiB,KAAK,KAAK,CAAC,iBAAiB,EACpD,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,oDAAoD;SAC7D,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,CAAgB,EAAE,CAAgB;IAC3D,OAAO,CACL,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;QACzB,CAAC,CAAC,kBAAkB,KAAK,CAAC,CAAC,kBAAkB;QAC7C,CAAC,CAAC,CAAC,iBAAiB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAC5D,CAAC;AACJ,CAAC"}