@baruk/core 0.3.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (708) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +97 -0
  3. package/README.md +9 -2
  4. package/dist/auth/password-reset.d.ts +30 -1
  5. package/dist/auth/password-reset.d.ts.map +1 -1
  6. package/dist/auth/password-reset.js +139 -11
  7. package/dist/auth/password-reset.js.map +1 -1
  8. package/dist/auth/service.d.ts +39 -2
  9. package/dist/auth/service.d.ts.map +1 -1
  10. package/dist/auth/service.js +75 -10
  11. package/dist/auth/service.js.map +1 -1
  12. package/dist/billing/ar-repository.d.ts +334 -0
  13. package/dist/billing/ar-repository.d.ts.map +1 -0
  14. package/dist/billing/ar-repository.js +707 -0
  15. package/dist/billing/ar-repository.js.map +1 -0
  16. package/dist/billing/auto-generation.d.ts +87 -0
  17. package/dist/billing/auto-generation.d.ts.map +1 -0
  18. package/dist/billing/auto-generation.js +181 -0
  19. package/dist/billing/auto-generation.js.map +1 -0
  20. package/dist/billing/live-guard.d.ts +64 -0
  21. package/dist/billing/live-guard.d.ts.map +1 -0
  22. package/dist/billing/live-guard.js +68 -0
  23. package/dist/billing/live-guard.js.map +1 -0
  24. package/dist/billing/payment-means-catalog.d.ts +17 -0
  25. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  26. package/dist/billing/payment-means-catalog.js +21 -0
  27. package/dist/billing/payment-means-catalog.js.map +1 -0
  28. package/dist/billing/payment-means.d.ts +38 -0
  29. package/dist/billing/payment-means.d.ts.map +1 -0
  30. package/dist/billing/payment-means.js +29 -0
  31. package/dist/billing/payment-means.js.map +1 -0
  32. package/dist/billing/payment-rail.d.ts +118 -0
  33. package/dist/billing/payment-rail.d.ts.map +1 -0
  34. package/dist/billing/payment-rail.js +295 -0
  35. package/dist/billing/payment-rail.js.map +1 -0
  36. package/dist/billing/provider/asaas.d.ts +46 -1
  37. package/dist/billing/provider/asaas.d.ts.map +1 -1
  38. package/dist/billing/provider/asaas.js +194 -14
  39. package/dist/billing/provider/asaas.js.map +1 -1
  40. package/dist/billing/provider/manual.js +1 -1
  41. package/dist/billing/provider/manual.js.map +1 -1
  42. package/dist/billing/provider/types.d.ts +115 -8
  43. package/dist/billing/provider/types.d.ts.map +1 -1
  44. package/dist/billing/provider-account.d.ts +89 -0
  45. package/dist/billing/provider-account.d.ts.map +1 -0
  46. package/dist/billing/provider-account.js +161 -0
  47. package/dist/billing/provider-account.js.map +1 -0
  48. package/dist/billing/provider-onboarding.d.ts +67 -0
  49. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  50. package/dist/billing/provider-onboarding.js +234 -0
  51. package/dist/billing/provider-onboarding.js.map +1 -0
  52. package/dist/billing/receivable.d.ts +5 -1
  53. package/dist/billing/receivable.d.ts.map +1 -1
  54. package/dist/billing/reconcile.d.ts +58 -0
  55. package/dist/billing/reconcile.d.ts.map +1 -0
  56. package/dist/billing/reconcile.js +138 -0
  57. package/dist/billing/reconcile.js.map +1 -0
  58. package/dist/billing/repository.d.ts +90 -1
  59. package/dist/billing/repository.d.ts.map +1 -1
  60. package/dist/billing/repository.js +148 -19
  61. package/dist/billing/repository.js.map +1 -1
  62. package/dist/cjs/auth/password-reset.js +141 -11
  63. package/dist/cjs/auth/password-reset.js.map +1 -1
  64. package/dist/cjs/auth/service.js +75 -9
  65. package/dist/cjs/auth/service.js.map +1 -1
  66. package/dist/cjs/billing/ar-repository.js +728 -0
  67. package/dist/cjs/billing/ar-repository.js.map +1 -0
  68. package/dist/cjs/billing/auto-generation.js +186 -0
  69. package/dist/cjs/billing/auto-generation.js.map +1 -0
  70. package/dist/cjs/billing/live-guard.js +72 -0
  71. package/dist/cjs/billing/live-guard.js.map +1 -0
  72. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  73. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  74. package/dist/cjs/billing/payment-means.js +33 -0
  75. package/dist/cjs/billing/payment-means.js.map +1 -0
  76. package/dist/cjs/billing/payment-rail.js +301 -0
  77. package/dist/cjs/billing/payment-rail.js.map +1 -0
  78. package/dist/cjs/billing/provider/asaas.js +194 -14
  79. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  80. package/dist/cjs/billing/provider/manual.js +1 -1
  81. package/dist/cjs/billing/provider/manual.js.map +1 -1
  82. package/dist/cjs/billing/provider-account.js +170 -0
  83. package/dist/cjs/billing/provider-account.js.map +1 -0
  84. package/dist/cjs/billing/provider-onboarding.js +239 -0
  85. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  86. package/dist/cjs/billing/reconcile.js +143 -0
  87. package/dist/cjs/billing/reconcile.js.map +1 -0
  88. package/dist/cjs/billing/repository.js +150 -18
  89. package/dist/cjs/billing/repository.js.map +1 -1
  90. package/dist/cjs/clients/repository.js +96 -20
  91. package/dist/cjs/clients/repository.js.map +1 -1
  92. package/dist/cjs/collection/branding.js +140 -0
  93. package/dist/cjs/collection/branding.js.map +1 -0
  94. package/dist/cjs/collection/channel-accounts.js +137 -0
  95. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  96. package/dist/cjs/collection/channel.js +17 -0
  97. package/dist/cjs/collection/channel.js.map +1 -0
  98. package/dist/cjs/collection/communication-bridge.js +140 -0
  99. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  100. package/dist/cjs/collection/communication-runtime.js +193 -0
  101. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  102. package/dist/cjs/collection/consent-repository.js +84 -0
  103. package/dist/cjs/collection/consent-repository.js.map +1 -0
  104. package/dist/cjs/collection/copy.js +125 -0
  105. package/dist/cjs/collection/copy.js.map +1 -0
  106. package/dist/cjs/collection/delivery-callback.js +151 -0
  107. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  108. package/dist/cjs/collection/email-layout.js +252 -0
  109. package/dist/cjs/collection/email-layout.js.map +1 -0
  110. package/dist/cjs/collection/engine.js +414 -0
  111. package/dist/cjs/collection/engine.js.map +1 -0
  112. package/dist/cjs/collection/format.js +76 -0
  113. package/dist/cjs/collection/format.js.map +1 -0
  114. package/dist/cjs/collection/payment-block.js +3 -0
  115. package/dist/cjs/collection/payment-block.js.map +1 -0
  116. package/dist/cjs/collection/policy.js +147 -0
  117. package/dist/cjs/collection/policy.js.map +1 -0
  118. package/dist/cjs/collection/repository.js +260 -0
  119. package/dist/cjs/collection/repository.js.map +1 -0
  120. package/dist/cjs/collection/subject.js +104 -0
  121. package/dist/cjs/collection/subject.js.map +1 -0
  122. package/dist/cjs/collection/template-catalog.js +165 -0
  123. package/dist/cjs/collection/template-catalog.js.map +1 -0
  124. package/dist/cjs/collection/template.js +78 -0
  125. package/dist/cjs/collection/template.js.map +1 -0
  126. package/dist/cjs/communication/adapters/email.js +132 -0
  127. package/dist/cjs/communication/adapters/email.js.map +1 -0
  128. package/dist/cjs/communication/adapters/sms.js +127 -0
  129. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  130. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  131. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  132. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  133. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  134. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  135. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  136. package/dist/cjs/communication/audit.js +61 -0
  137. package/dist/cjs/communication/audit.js.map +1 -0
  138. package/dist/cjs/communication/capabilities.js +76 -0
  139. package/dist/cjs/communication/capabilities.js.map +1 -0
  140. package/dist/cjs/communication/channel.js +53 -0
  141. package/dist/cjs/communication/channel.js.map +1 -0
  142. package/dist/cjs/communication/claim.js +228 -0
  143. package/dist/cjs/communication/claim.js.map +1 -0
  144. package/dist/cjs/communication/consent.js +43 -0
  145. package/dist/cjs/communication/consent.js.map +1 -0
  146. package/dist/cjs/communication/context.js +45 -0
  147. package/dist/cjs/communication/context.js.map +1 -0
  148. package/dist/cjs/communication/credentials.js +121 -0
  149. package/dist/cjs/communication/credentials.js.map +1 -0
  150. package/dist/cjs/communication/dry-run-scenario.js +161 -0
  151. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  152. package/dist/cjs/communication/dry-run.js +97 -0
  153. package/dist/cjs/communication/dry-run.js.map +1 -0
  154. package/dist/cjs/communication/engine.js +483 -0
  155. package/dist/cjs/communication/engine.js.map +1 -0
  156. package/dist/cjs/communication/graph.js +50 -0
  157. package/dist/cjs/communication/graph.js.map +1 -0
  158. package/dist/cjs/communication/idempotency.js +26 -0
  159. package/dist/cjs/communication/idempotency.js.map +1 -0
  160. package/dist/cjs/communication/identity.js +110 -0
  161. package/dist/cjs/communication/identity.js.map +1 -0
  162. package/dist/cjs/communication/index.js +135 -0
  163. package/dist/cjs/communication/index.js.map +1 -0
  164. package/dist/cjs/communication/onboarding.js +297 -0
  165. package/dist/cjs/communication/onboarding.js.map +1 -0
  166. package/dist/cjs/communication/policy.js +16 -0
  167. package/dist/cjs/communication/policy.js.map +1 -0
  168. package/dist/cjs/communication/routing.js +77 -0
  169. package/dist/cjs/communication/routing.js.map +1 -0
  170. package/dist/cjs/communication/sender-profile.js +128 -0
  171. package/dist/cjs/communication/sender-profile.js.map +1 -0
  172. package/dist/cjs/communication/status.js +86 -0
  173. package/dist/cjs/communication/status.js.map +1 -0
  174. package/dist/cjs/communication/stores/onboarding.js +135 -0
  175. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  176. package/dist/cjs/communication/stores/postgres.js +458 -0
  177. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  178. package/dist/cjs/communication/stores/routing.js +334 -0
  179. package/dist/cjs/communication/stores/routing.js.map +1 -0
  180. package/dist/cjs/communication/stores/secrets.js +126 -0
  181. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  182. package/dist/cjs/communication/template-provider.js +22 -0
  183. package/dist/cjs/communication/template-provider.js.map +1 -0
  184. package/dist/cjs/communication/template.js +63 -0
  185. package/dist/cjs/communication/template.js.map +1 -0
  186. package/dist/cjs/communication/webhook-subscription.js +258 -0
  187. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  188. package/dist/cjs/communication/webhook.js +292 -0
  189. package/dist/cjs/communication/webhook.js.map +1 -0
  190. package/dist/cjs/competence/repository.js +309 -0
  191. package/dist/cjs/competence/repository.js.map +1 -0
  192. package/dist/cjs/contacts/phone.js +192 -0
  193. package/dist/cjs/contacts/phone.js.map +1 -0
  194. package/dist/cjs/db/seed-catalog.js +48 -0
  195. package/dist/cjs/db/seed-catalog.js.map +1 -0
  196. package/dist/cjs/db/seed.js +15 -7
  197. package/dist/cjs/db/seed.js.map +1 -1
  198. package/dist/cjs/documents/repository.js +244 -0
  199. package/dist/cjs/documents/repository.js.map +1 -0
  200. package/dist/cjs/documents/requests.js +136 -0
  201. package/dist/cjs/documents/requests.js.map +1 -0
  202. package/dist/cjs/index.js +427 -48
  203. package/dist/cjs/index.js.map +1 -1
  204. package/dist/cjs/legal/company.js +36 -0
  205. package/dist/cjs/legal/company.js.map +1 -0
  206. package/dist/cjs/legal/documents.js +671 -0
  207. package/dist/cjs/legal/documents.js.map +1 -0
  208. package/dist/cjs/legal/index.js +15 -0
  209. package/dist/cjs/legal/index.js.map +1 -0
  210. package/dist/cjs/legal/types.js +34 -0
  211. package/dist/cjs/legal/types.js.map +1 -0
  212. package/dist/cjs/mail/auth-templates.js +29 -0
  213. package/dist/cjs/mail/auth-templates.js.map +1 -0
  214. package/dist/cjs/mail/dedup-store.js +12 -51
  215. package/dist/cjs/mail/dedup-store.js.map +1 -1
  216. package/dist/cjs/mail/index.js +16 -4
  217. package/dist/cjs/mail/index.js.map +1 -1
  218. package/dist/cjs/mail/provider.js +12 -247
  219. package/dist/cjs/mail/provider.js.map +1 -1
  220. package/dist/cjs/mail/resend.js +14 -18
  221. package/dist/cjs/mail/resend.js.map +1 -1
  222. package/dist/cjs/mail/sender-resolver.js +12 -11
  223. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  224. package/dist/cjs/mail/template-renderer.js +11 -16
  225. package/dist/cjs/mail/template-renderer.js.map +1 -1
  226. package/dist/cjs/mail/transactional-outbound.js +117 -0
  227. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  228. package/dist/cjs/mail/types.js +8 -35
  229. package/dist/cjs/mail/types.js.map +1 -1
  230. package/dist/cjs/portal/provisioning.js +144 -0
  231. package/dist/cjs/portal/provisioning.js.map +1 -0
  232. package/dist/cjs/pricing-engine/canonical.js +42 -0
  233. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  234. package/dist/cjs/pricing-engine/errors.js +6 -1
  235. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  236. package/dist/cjs/pricing-engine/index.js +12 -1
  237. package/dist/cjs/pricing-engine/index.js.map +1 -1
  238. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  239. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  240. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  241. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  242. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  243. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  244. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  245. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  246. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  247. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  248. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  249. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  250. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  251. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  252. package/dist/cjs/rbac/authorize.js +28 -0
  253. package/dist/cjs/rbac/authorize.js.map +1 -1
  254. package/dist/cjs/rbac/catalog.js +67 -1
  255. package/dist/cjs/rbac/catalog.js.map +1 -1
  256. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  257. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  258. package/dist/cjs/rbac/workload.js +191 -0
  259. package/dist/cjs/rbac/workload.js.map +1 -0
  260. package/dist/cjs/storage/checksum.js +15 -0
  261. package/dist/cjs/storage/checksum.js.map +1 -0
  262. package/dist/cjs/storage/key.js +72 -0
  263. package/dist/cjs/storage/key.js.map +1 -0
  264. package/dist/cjs/storage/local.js +100 -0
  265. package/dist/cjs/storage/local.js.map +1 -0
  266. package/dist/cjs/storage/r2.js +181 -0
  267. package/dist/cjs/storage/r2.js.map +1 -0
  268. package/dist/cjs/storage/registry.js +41 -0
  269. package/dist/cjs/storage/registry.js.map +1 -0
  270. package/dist/cjs/storage/types.js +50 -0
  271. package/dist/cjs/storage/types.js.map +1 -0
  272. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  273. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  274. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  275. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  276. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  277. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  278. package/dist/cjs/subscription-billing/service.js +57 -8
  279. package/dist/cjs/subscription-billing/service.js.map +1 -1
  280. package/dist/cjs/subscription-billing/types.js.map +1 -1
  281. package/dist/cjs/tenancy/provisioning.js +32 -8
  282. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  283. package/dist/cjs/users/repository.js +119 -2
  284. package/dist/cjs/users/repository.js.map +1 -1
  285. package/dist/cjs/vault/repository.js +81 -0
  286. package/dist/cjs/vault/repository.js.map +1 -1
  287. package/dist/clients/repository.d.ts +42 -0
  288. package/dist/clients/repository.d.ts.map +1 -1
  289. package/dist/clients/repository.js +94 -21
  290. package/dist/clients/repository.js.map +1 -1
  291. package/dist/collection/branding.d.ts +72 -0
  292. package/dist/collection/branding.d.ts.map +1 -0
  293. package/dist/collection/branding.js +136 -0
  294. package/dist/collection/branding.js.map +1 -0
  295. package/dist/collection/channel-accounts.d.ts +57 -0
  296. package/dist/collection/channel-accounts.d.ts.map +1 -0
  297. package/dist/collection/channel-accounts.js +133 -0
  298. package/dist/collection/channel-accounts.js.map +1 -0
  299. package/dist/collection/channel.d.ts +24 -0
  300. package/dist/collection/channel.d.ts.map +1 -0
  301. package/dist/collection/channel.js +16 -0
  302. package/dist/collection/channel.js.map +1 -0
  303. package/dist/collection/communication-bridge.d.ts +66 -0
  304. package/dist/collection/communication-bridge.d.ts.map +1 -0
  305. package/dist/collection/communication-bridge.js +134 -0
  306. package/dist/collection/communication-bridge.js.map +1 -0
  307. package/dist/collection/communication-runtime.d.ts +95 -0
  308. package/dist/collection/communication-runtime.d.ts.map +1 -0
  309. package/dist/collection/communication-runtime.js +187 -0
  310. package/dist/collection/communication-runtime.js.map +1 -0
  311. package/dist/collection/consent-repository.d.ts +32 -0
  312. package/dist/collection/consent-repository.d.ts.map +1 -0
  313. package/dist/collection/consent-repository.js +79 -0
  314. package/dist/collection/consent-repository.js.map +1 -0
  315. package/dist/collection/copy.d.ts +50 -0
  316. package/dist/collection/copy.d.ts.map +1 -0
  317. package/dist/collection/copy.js +122 -0
  318. package/dist/collection/copy.js.map +1 -0
  319. package/dist/collection/delivery-callback.d.ts +49 -0
  320. package/dist/collection/delivery-callback.d.ts.map +1 -0
  321. package/dist/collection/delivery-callback.js +147 -0
  322. package/dist/collection/delivery-callback.js.map +1 -0
  323. package/dist/collection/email-layout.d.ts +45 -0
  324. package/dist/collection/email-layout.d.ts.map +1 -0
  325. package/dist/collection/email-layout.js +247 -0
  326. package/dist/collection/email-layout.js.map +1 -0
  327. package/dist/collection/engine.d.ts +177 -0
  328. package/dist/collection/engine.d.ts.map +1 -0
  329. package/dist/collection/engine.js +407 -0
  330. package/dist/collection/engine.js.map +1 -0
  331. package/dist/collection/format.d.ts +32 -0
  332. package/dist/collection/format.d.ts.map +1 -0
  333. package/dist/collection/format.js +70 -0
  334. package/dist/collection/format.js.map +1 -0
  335. package/dist/collection/payment-block.d.ts +24 -0
  336. package/dist/collection/payment-block.d.ts.map +1 -0
  337. package/dist/collection/payment-block.js +2 -0
  338. package/dist/collection/payment-block.js.map +1 -0
  339. package/dist/collection/policy.d.ts +53 -0
  340. package/dist/collection/policy.d.ts.map +1 -0
  341. package/dist/collection/policy.js +141 -0
  342. package/dist/collection/policy.js.map +1 -0
  343. package/dist/collection/repository.d.ts +129 -0
  344. package/dist/collection/repository.d.ts.map +1 -0
  345. package/dist/collection/repository.js +246 -0
  346. package/dist/collection/repository.js.map +1 -0
  347. package/dist/collection/subject.d.ts +66 -0
  348. package/dist/collection/subject.d.ts.map +1 -0
  349. package/dist/collection/subject.js +99 -0
  350. package/dist/collection/subject.js.map +1 -0
  351. package/dist/collection/template-catalog.d.ts +16 -0
  352. package/dist/collection/template-catalog.d.ts.map +1 -0
  353. package/dist/collection/template-catalog.js +162 -0
  354. package/dist/collection/template-catalog.js.map +1 -0
  355. package/dist/collection/template.d.ts +37 -0
  356. package/dist/collection/template.d.ts.map +1 -0
  357. package/dist/collection/template.js +73 -0
  358. package/dist/collection/template.js.map +1 -0
  359. package/dist/communication/adapters/email.d.ts +28 -0
  360. package/dist/communication/adapters/email.d.ts.map +1 -0
  361. package/dist/communication/adapters/email.js +129 -0
  362. package/dist/communication/adapters/email.js.map +1 -0
  363. package/dist/communication/adapters/sms.d.ts +95 -0
  364. package/dist/communication/adapters/sms.d.ts.map +1 -0
  365. package/dist/communication/adapters/sms.js +121 -0
  366. package/dist/communication/adapters/sms.js.map +1 -0
  367. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  368. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  369. package/dist/communication/adapters/whatsapp-language.js +36 -0
  370. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  371. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  372. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  373. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  374. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  375. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  376. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  377. package/dist/communication/adapters/whatsapp.js +210 -0
  378. package/dist/communication/adapters/whatsapp.js.map +1 -0
  379. package/dist/communication/audit.d.ts +105 -0
  380. package/dist/communication/audit.d.ts.map +1 -0
  381. package/dist/communication/audit.js +56 -0
  382. package/dist/communication/audit.js.map +1 -0
  383. package/dist/communication/capabilities.d.ts +88 -0
  384. package/dist/communication/capabilities.d.ts.map +1 -0
  385. package/dist/communication/capabilities.js +72 -0
  386. package/dist/communication/capabilities.js.map +1 -0
  387. package/dist/communication/channel.d.ts +125 -0
  388. package/dist/communication/channel.d.ts.map +1 -0
  389. package/dist/communication/channel.js +47 -0
  390. package/dist/communication/channel.js.map +1 -0
  391. package/dist/communication/claim.d.ts +368 -0
  392. package/dist/communication/claim.d.ts.map +1 -0
  393. package/dist/communication/claim.js +224 -0
  394. package/dist/communication/claim.js.map +1 -0
  395. package/dist/communication/consent.d.ts +65 -0
  396. package/dist/communication/consent.d.ts.map +1 -0
  397. package/dist/communication/consent.js +40 -0
  398. package/dist/communication/consent.js.map +1 -0
  399. package/dist/communication/context.d.ts +48 -0
  400. package/dist/communication/context.d.ts.map +1 -0
  401. package/dist/communication/context.js +41 -0
  402. package/dist/communication/context.js.map +1 -0
  403. package/dist/communication/credentials.d.ts +74 -0
  404. package/dist/communication/credentials.d.ts.map +1 -0
  405. package/dist/communication/credentials.js +115 -0
  406. package/dist/communication/credentials.js.map +1 -0
  407. package/dist/communication/dry-run-scenario.d.ts +37 -0
  408. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  409. package/dist/communication/dry-run-scenario.js +158 -0
  410. package/dist/communication/dry-run-scenario.js.map +1 -0
  411. package/dist/communication/dry-run.d.ts +40 -0
  412. package/dist/communication/dry-run.d.ts.map +1 -0
  413. package/dist/communication/dry-run.js +92 -0
  414. package/dist/communication/dry-run.js.map +1 -0
  415. package/dist/communication/engine.d.ts +153 -0
  416. package/dist/communication/engine.d.ts.map +1 -0
  417. package/dist/communication/engine.js +480 -0
  418. package/dist/communication/engine.js.map +1 -0
  419. package/dist/communication/graph.d.ts +38 -0
  420. package/dist/communication/graph.d.ts.map +1 -0
  421. package/dist/communication/graph.js +45 -0
  422. package/dist/communication/graph.js.map +1 -0
  423. package/dist/communication/idempotency.d.ts +33 -0
  424. package/dist/communication/idempotency.d.ts.map +1 -0
  425. package/dist/communication/idempotency.js +23 -0
  426. package/dist/communication/idempotency.js.map +1 -0
  427. package/dist/communication/identity.d.ts +127 -0
  428. package/dist/communication/identity.d.ts.map +1 -0
  429. package/dist/communication/identity.js +105 -0
  430. package/dist/communication/identity.js.map +1 -0
  431. package/dist/communication/index.d.ts +66 -0
  432. package/dist/communication/index.d.ts.map +1 -0
  433. package/dist/communication/index.js +42 -0
  434. package/dist/communication/index.js.map +1 -0
  435. package/dist/communication/onboarding.d.ts +223 -0
  436. package/dist/communication/onboarding.d.ts.map +1 -0
  437. package/dist/communication/onboarding.js +287 -0
  438. package/dist/communication/onboarding.js.map +1 -0
  439. package/dist/communication/policy.d.ts +99 -0
  440. package/dist/communication/policy.d.ts.map +1 -0
  441. package/dist/communication/policy.js +13 -0
  442. package/dist/communication/policy.js.map +1 -0
  443. package/dist/communication/routing.d.ts +99 -0
  444. package/dist/communication/routing.d.ts.map +1 -0
  445. package/dist/communication/routing.js +73 -0
  446. package/dist/communication/routing.js.map +1 -0
  447. package/dist/communication/sender-profile.d.ts +100 -0
  448. package/dist/communication/sender-profile.d.ts.map +1 -0
  449. package/dist/communication/sender-profile.js +123 -0
  450. package/dist/communication/sender-profile.js.map +1 -0
  451. package/dist/communication/status.d.ts +48 -0
  452. package/dist/communication/status.d.ts.map +1 -0
  453. package/dist/communication/status.js +79 -0
  454. package/dist/communication/status.js.map +1 -0
  455. package/dist/communication/stores/onboarding.d.ts +88 -0
  456. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  457. package/dist/communication/stores/onboarding.js +127 -0
  458. package/dist/communication/stores/onboarding.js.map +1 -0
  459. package/dist/communication/stores/postgres.d.ts +81 -0
  460. package/dist/communication/stores/postgres.d.ts.map +1 -0
  461. package/dist/communication/stores/postgres.js +453 -0
  462. package/dist/communication/stores/postgres.js.map +1 -0
  463. package/dist/communication/stores/routing.d.ts +169 -0
  464. package/dist/communication/stores/routing.d.ts.map +1 -0
  465. package/dist/communication/stores/routing.js +324 -0
  466. package/dist/communication/stores/routing.js.map +1 -0
  467. package/dist/communication/stores/secrets.d.ts +89 -0
  468. package/dist/communication/stores/secrets.d.ts.map +1 -0
  469. package/dist/communication/stores/secrets.js +122 -0
  470. package/dist/communication/stores/secrets.js.map +1 -0
  471. package/dist/communication/template-provider.d.ts +85 -0
  472. package/dist/communication/template-provider.d.ts.map +1 -0
  473. package/dist/communication/template-provider.js +21 -0
  474. package/dist/communication/template-provider.js.map +1 -0
  475. package/dist/communication/template.d.ts +87 -0
  476. package/dist/communication/template.d.ts.map +1 -0
  477. package/dist/communication/template.js +59 -0
  478. package/dist/communication/template.js.map +1 -0
  479. package/dist/communication/webhook-subscription.d.ts +156 -0
  480. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  481. package/dist/communication/webhook-subscription.js +252 -0
  482. package/dist/communication/webhook-subscription.js.map +1 -0
  483. package/dist/communication/webhook.d.ts +121 -0
  484. package/dist/communication/webhook.d.ts.map +1 -0
  485. package/dist/communication/webhook.js +283 -0
  486. package/dist/communication/webhook.js.map +1 -0
  487. package/dist/competence/repository.d.ts +147 -0
  488. package/dist/competence/repository.d.ts.map +1 -0
  489. package/dist/competence/repository.js +294 -0
  490. package/dist/competence/repository.js.map +1 -0
  491. package/dist/contacts/phone.d.ts +70 -0
  492. package/dist/contacts/phone.d.ts.map +1 -0
  493. package/dist/contacts/phone.js +186 -0
  494. package/dist/contacts/phone.js.map +1 -0
  495. package/dist/db/migrate.js +17 -11
  496. package/dist/db/migrate.js.map +1 -1
  497. package/dist/db/seed-catalog.d.ts +18 -0
  498. package/dist/db/seed-catalog.d.ts.map +1 -0
  499. package/dist/db/seed-catalog.js +45 -0
  500. package/dist/db/seed-catalog.js.map +1 -0
  501. package/dist/db/seed.js +16 -8
  502. package/dist/db/seed.js.map +1 -1
  503. package/dist/documents/repository.d.ts +97 -0
  504. package/dist/documents/repository.d.ts.map +1 -0
  505. package/dist/documents/repository.js +236 -0
  506. package/dist/documents/repository.js.map +1 -0
  507. package/dist/documents/requests.d.ts +73 -0
  508. package/dist/documents/requests.d.ts.map +1 -0
  509. package/dist/documents/requests.js +127 -0
  510. package/dist/documents/requests.js.map +1 -0
  511. package/dist/index.d.ts +113 -13
  512. package/dist/index.d.ts.map +1 -1
  513. package/dist/index.js +104 -8
  514. package/dist/index.js.map +1 -1
  515. package/dist/legal/company.d.ts +32 -0
  516. package/dist/legal/company.d.ts.map +1 -0
  517. package/dist/legal/company.js +33 -0
  518. package/dist/legal/company.js.map +1 -0
  519. package/dist/legal/documents.d.ts +30 -0
  520. package/dist/legal/documents.d.ts.map +1 -0
  521. package/dist/legal/documents.js +666 -0
  522. package/dist/legal/documents.js.map +1 -0
  523. package/dist/legal/index.d.ts +5 -0
  524. package/dist/legal/index.d.ts.map +1 -0
  525. package/dist/legal/index.js +4 -0
  526. package/dist/legal/index.js.map +1 -0
  527. package/dist/legal/types.d.ts +145 -0
  528. package/dist/legal/types.d.ts.map +1 -0
  529. package/dist/legal/types.js +31 -0
  530. package/dist/legal/types.js.map +1 -0
  531. package/dist/mail/auth-templates.d.ts +15 -0
  532. package/dist/mail/auth-templates.d.ts.map +1 -0
  533. package/dist/mail/auth-templates.js +26 -0
  534. package/dist/mail/auth-templates.js.map +1 -0
  535. package/dist/mail/dedup-store.d.ts +1 -24
  536. package/dist/mail/dedup-store.d.ts.map +1 -1
  537. package/dist/mail/dedup-store.js +9 -48
  538. package/dist/mail/dedup-store.js.map +1 -1
  539. package/dist/mail/index.d.ts +2 -1
  540. package/dist/mail/index.d.ts.map +1 -1
  541. package/dist/mail/index.js +13 -2
  542. package/dist/mail/index.js.map +1 -1
  543. package/dist/mail/provider.d.ts +2 -30
  544. package/dist/mail/provider.d.ts.map +1 -1
  545. package/dist/mail/provider.js +10 -246
  546. package/dist/mail/provider.js.map +1 -1
  547. package/dist/mail/resend.d.ts +2 -12
  548. package/dist/mail/resend.d.ts.map +1 -1
  549. package/dist/mail/resend.js +11 -17
  550. package/dist/mail/resend.js.map +1 -1
  551. package/dist/mail/sender-resolver.d.ts +1 -7
  552. package/dist/mail/sender-resolver.d.ts.map +1 -1
  553. package/dist/mail/sender-resolver.js +11 -10
  554. package/dist/mail/sender-resolver.js.map +1 -1
  555. package/dist/mail/template-renderer.d.ts +1 -9
  556. package/dist/mail/template-renderer.d.ts.map +1 -1
  557. package/dist/mail/template-renderer.js +10 -15
  558. package/dist/mail/template-renderer.js.map +1 -1
  559. package/dist/mail/transactional-outbound.d.ts +115 -0
  560. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  561. package/dist/mail/transactional-outbound.js +113 -0
  562. package/dist/mail/transactional-outbound.js.map +1 -0
  563. package/dist/mail/types.d.ts +2 -142
  564. package/dist/mail/types.d.ts.map +1 -1
  565. package/dist/mail/types.js +1 -33
  566. package/dist/mail/types.js.map +1 -1
  567. package/dist/portal/provisioning.d.ts +58 -0
  568. package/dist/portal/provisioning.d.ts.map +1 -0
  569. package/dist/portal/provisioning.js +139 -0
  570. package/dist/portal/provisioning.js.map +1 -0
  571. package/dist/pricing-engine/canonical.d.ts +14 -0
  572. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  573. package/dist/pricing-engine/canonical.js +39 -0
  574. package/dist/pricing-engine/canonical.js.map +1 -0
  575. package/dist/pricing-engine/errors.d.ts.map +1 -1
  576. package/dist/pricing-engine/errors.js +6 -1
  577. package/dist/pricing-engine/errors.js.map +1 -1
  578. package/dist/pricing-engine/index.d.ts +12 -2
  579. package/dist/pricing-engine/index.d.ts.map +1 -1
  580. package/dist/pricing-engine/index.js +6 -1
  581. package/dist/pricing-engine/index.js.map +1 -1
  582. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  583. package/dist/pricing-engine/pipeline.js +202 -28
  584. package/dist/pricing-engine/pipeline.js.map +1 -1
  585. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  586. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  587. package/dist/pricing-engine/shadow-adapter.js +75 -0
  588. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  589. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  590. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  591. package/dist/pricing-engine/shadow-diff.js +52 -0
  592. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  593. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  594. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  595. package/dist/pricing-engine/shadow-facade.js +82 -0
  596. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  597. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  598. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  599. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  600. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  601. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  602. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  603. package/dist/pricing-engine/shadow-metrics.js +31 -0
  604. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  605. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  606. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  607. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  608. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  609. package/dist/pricing-engine/types.d.ts +2 -0
  610. package/dist/pricing-engine/types.d.ts.map +1 -1
  611. package/dist/rbac/authorize.d.ts +12 -0
  612. package/dist/rbac/authorize.d.ts.map +1 -1
  613. package/dist/rbac/authorize.js +27 -0
  614. package/dist/rbac/authorize.js.map +1 -1
  615. package/dist/rbac/catalog.d.ts.map +1 -1
  616. package/dist/rbac/catalog.js +67 -1
  617. package/dist/rbac/catalog.js.map +1 -1
  618. package/dist/rbac/workload-provisioning.d.ts +66 -0
  619. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  620. package/dist/rbac/workload-provisioning.js +153 -0
  621. package/dist/rbac/workload-provisioning.js.map +1 -0
  622. package/dist/rbac/workload.d.ts +124 -0
  623. package/dist/rbac/workload.d.ts.map +1 -0
  624. package/dist/rbac/workload.js +184 -0
  625. package/dist/rbac/workload.js.map +1 -0
  626. package/dist/storage/checksum.d.ts +9 -0
  627. package/dist/storage/checksum.d.ts.map +1 -0
  628. package/dist/storage/checksum.js +12 -0
  629. package/dist/storage/checksum.js.map +1 -0
  630. package/dist/storage/key.d.ts +37 -0
  631. package/dist/storage/key.d.ts.map +1 -0
  632. package/dist/storage/key.js +67 -0
  633. package/dist/storage/key.js.map +1 -0
  634. package/dist/storage/local.d.ts +40 -0
  635. package/dist/storage/local.d.ts.map +1 -0
  636. package/dist/storage/local.js +96 -0
  637. package/dist/storage/local.js.map +1 -0
  638. package/dist/storage/r2.d.ts +43 -0
  639. package/dist/storage/r2.d.ts.map +1 -0
  640. package/dist/storage/r2.js +177 -0
  641. package/dist/storage/r2.js.map +1 -0
  642. package/dist/storage/registry.d.ts +23 -0
  643. package/dist/storage/registry.d.ts.map +1 -0
  644. package/dist/storage/registry.js +37 -0
  645. package/dist/storage/registry.js.map +1 -0
  646. package/dist/storage/types.d.ts +67 -0
  647. package/dist/storage/types.d.ts.map +1 -0
  648. package/dist/storage/types.js +45 -0
  649. package/dist/storage/types.js.map +1 -0
  650. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  651. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  652. package/dist/subscription-billing/provider/asaas.js +32 -7
  653. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  654. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  655. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  656. package/dist/subscription-billing/provider/disabled.js +8 -0
  657. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  658. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  659. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  660. package/dist/subscription-billing/provider/registry.js +17 -0
  661. package/dist/subscription-billing/provider/registry.js.map +1 -1
  662. package/dist/subscription-billing/service.d.ts +17 -1
  663. package/dist/subscription-billing/service.d.ts.map +1 -1
  664. package/dist/subscription-billing/service.js +57 -8
  665. package/dist/subscription-billing/service.js.map +1 -1
  666. package/dist/subscription-billing/types.d.ts +13 -0
  667. package/dist/subscription-billing/types.d.ts.map +1 -1
  668. package/dist/subscription-billing/types.js.map +1 -1
  669. package/dist/tenancy/provisioning.d.ts.map +1 -1
  670. package/dist/tenancy/provisioning.js +32 -8
  671. package/dist/tenancy/provisioning.js.map +1 -1
  672. package/dist/users/repository.d.ts +38 -0
  673. package/dist/users/repository.d.ts.map +1 -1
  674. package/dist/users/repository.js +118 -3
  675. package/dist/users/repository.js.map +1 -1
  676. package/dist/vault/repository.d.ts +67 -0
  677. package/dist/vault/repository.d.ts.map +1 -1
  678. package/dist/vault/repository.js +78 -0
  679. package/dist/vault/repository.js.map +1 -1
  680. package/package.json +19 -4
  681. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  682. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  683. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  684. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  685. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  686. package/src/db/migrations/0028_collection_engine.sql +94 -0
  687. package/src/db/migrations/0029_payment_rail.sql +107 -0
  688. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  689. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  690. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  691. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  692. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  693. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  694. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  695. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  696. package/src/db/migrations/0038_notification_channels.sql +175 -0
  697. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  698. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  699. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  700. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  701. package/src/db/migrations/0043_workload_identity.sql +105 -0
  702. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  703. package/dist/cjs/mail/resend-client.js +0 -103
  704. package/dist/cjs/mail/resend-client.js.map +0 -1
  705. package/dist/mail/resend-client.d.ts +0 -16
  706. package/dist/mail/resend-client.d.ts.map +0 -1
  707. package/dist/mail/resend-client.js +0 -100
  708. package/dist/mail/resend-client.js.map +0 -1
@@ -0,0 +1,122 @@
1
+ /**
2
+ * `TenantSecretStore` sobre o Vault Engine — agora atrás de autorização real.
3
+ *
4
+ * `credentials.ts` já declarava a interface e já dizia por que o valor teria
5
+ * de vir do cofre (migração 0012), mas nenhum arquivo do repositório a
6
+ * implementava: `createChannelCredentialResolver` só era chamado em teste, e
7
+ * os três call sites de produção (`collection-cron.ts`, `routes/collections.ts`)
8
+ * seguiam presos a `environmentCredentialResolver()`. Uma referência
9
+ * `vault://...` resolvia para `undefined` em produção — não por bug, por
10
+ * ausência: o fio entre o cofre e o motor nunca foi ligado.
11
+ *
12
+ * Este módulo é esse fio. Não é um segundo cofre — reaproveita
13
+ * `vault/repository.ts` inteiro (RLS FORCE, AAD por tenant, envelope
14
+ * AES-256-GCM) e acrescenta só o que o motor precisava e o Vault não tinha:
15
+ * ler por NOME em vez de `id` (`revealSecretByName`).
16
+ *
17
+ * **O que mudou no lote C1A.1.** A primeira versão aceitava um
18
+ * `SecretAccessGrant` montado pelo CHAMADOR: `principal` e `reason` eram
19
+ * strings, e qualquer módulo interno podia declará-las e pedir decifração.
20
+ * Isso registrava quem disse ser — não provava quem era. Agora o store exige
21
+ * uma `WorkloadIdentity` autenticada (`rbac/workload.ts`), e cada `reveal()`
22
+ * consulta o banco, DENTRO da mesma transação, para saber se aquele principal
23
+ * tem `vault.credential.decrypt` NAQUELE tenant, para AQUELE propósito e sobre
24
+ * AQUELE nome de credencial. O grant deixou de ser declaração e virou linha em
25
+ * tabela que o papel da aplicação não consegue escrever.
26
+ *
27
+ * O `SecretAccessGrant` permanece — como REGISTRO DE AUDITORIA derivado da
28
+ * decisão, não como entrada. É o que vai para o `audit_log`.
29
+ */
30
+ import { appendAudit } from '../../audit/audit.js';
31
+ import { withContext } from '../../db/context.js';
32
+ import { assertMintedWorkloadIdentity, authorizeWorkload, } from '../../rbac/workload.js';
33
+ import { revealSecretByName } from '../../vault/repository.js';
34
+ /** A permissão do catálogo RBAC exigida para decifrar. Uma só, específica. */
35
+ export const VAULT_DECRYPT_PERMISSION = 'vault.credential.decrypt';
36
+ const ACTOR_TYPE = 'automation';
37
+ /**
38
+ * `TenantSecretStore` sobre o Vault Engine.
39
+ *
40
+ * `reveal(tenantId, name)` recebe `tenantId` POR CHAMADA — o store é
41
+ * construído uma vez, no processo, e serve qualquer tenant que o motor
42
+ * resolver depois. É o mesmo desenho de `createChannelCredentialResolver`:
43
+ * quem sabe o tenant é o CHAMADOR, nunca o store. Mas saber o tenant não
44
+ * autoriza: cada chamada é decidida contra os grants DAQUELE tenant.
45
+ *
46
+ * Deny-by-default em toda borda:
47
+ * - identidade não emitida por `authenticateWorkload` → lança na CONSTRUÇÃO
48
+ * - `tenantId`/`name` vazios → nega sem tocar o banco
49
+ * - sessão expirada → nega, audita `denied`
50
+ * - principal revogado/desabilitado → nega, audita `denied`
51
+ * - sem grant casando tenant+permissão+propósito+recurso → nega, audita `denied`
52
+ * - nome inexistente/revogado/de outro tenant → nega (RLS filtra a linha)
53
+ * - vencida (`expires_at`) → nega, NUNCA decifra
54
+ * - erro de infraestrutura → propaga (não é "ausência"; é falha)
55
+ *
56
+ * Toda chamada que chega ao banco grava uma linha em `audit_log` —
57
+ * sucesso, ausência ou negação. O reveal nunca é silencioso.
58
+ */
59
+ export function createPostgresTenantSecretStore(db, keyring, identity, options) {
60
+ // Identidade forjada não passa da construção. Um `ForbiddenError` no boot é
61
+ // muito melhor que um `undefined` na primeira tentativa de envio.
62
+ assertMintedWorkloadIdentity(identity);
63
+ const purpose = options?.purpose;
64
+ const correlationId = options?.correlationId ?? null;
65
+ const auditBase = (grantId, denyReason) => ({
66
+ purpose,
67
+ principal: identity.principalKey,
68
+ principalId: identity.principalId,
69
+ permission: VAULT_DECRYPT_PERMISSION,
70
+ grantId,
71
+ correlationId,
72
+ ...(denyReason ? { denyReason } : {}),
73
+ });
74
+ return {
75
+ async reveal(tenantId, name) {
76
+ const trimmedTenant = tenantId?.trim() ?? '';
77
+ const trimmedName = name?.trim() ?? '';
78
+ // Contexto insuficiente: nem abre transação. Não há tenant para auditar
79
+ // contra, e um GUC vazio não é "nenhum tenant" — é erro de outra camada.
80
+ if (!trimmedTenant || !trimmedName)
81
+ return undefined;
82
+ return withContext(db, { tenantId: trimmedTenant }, async (tx) => {
83
+ const audit = async (result, grantId, denyReason, resourceId) => {
84
+ await appendAudit(tx, {
85
+ actorType: ACTOR_TYPE,
86
+ // `audit_log.actor_id` tem FK para `"user"(id)` — um principal de
87
+ // workload não é usuário e não cabe ali. A identidade vai em
88
+ // `metadata.principalId`, que é um uuid, não um segredo.
89
+ actorId: null,
90
+ action: 'vault.reveal',
91
+ resourceType: 'vault_credential',
92
+ ...(resourceId ? { resourceId } : {}),
93
+ result,
94
+ metadata: { name: trimmedName, ...auditBase(grantId, denyReason) },
95
+ });
96
+ };
97
+ const decision = await authorizeWorkload(tx, identity, {
98
+ tenantId: trimmedTenant,
99
+ permission: VAULT_DECRYPT_PERMISSION,
100
+ purpose,
101
+ resource: trimmedName,
102
+ });
103
+ if (!decision.allowed) {
104
+ await audit('denied', null, decision.denyReason);
105
+ return undefined;
106
+ }
107
+ const found = await revealSecretByName(tx, keyring, trimmedTenant, trimmedName);
108
+ if (!found) {
109
+ await audit('failure', decision.grantId, 'not_found_or_revoked');
110
+ return undefined;
111
+ }
112
+ if (found.status === 'expired') {
113
+ await audit('failure', decision.grantId, 'expired', found.meta.id);
114
+ return undefined;
115
+ }
116
+ await audit('success', decision.grantId, undefined, found.meta.id);
117
+ return found.secret;
118
+ });
119
+ },
120
+ };
121
+ }
122
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/communication/stores/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,GAIlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAW/D,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AA4BnE,MAAM,UAAU,GAAc,YAAY,CAAC;AAI3C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,+BAA+B,CAC7C,EAAM,EACN,OAAgB,EAChB,QAA0B,EAC1B,OAAiC;IAEjC,4EAA4E;IAC5E,kEAAkE;IAClE,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;IACjC,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,IAAI,CAAC;IAErD,MAAM,SAAS,GAAG,CAAC,OAAsB,EAAE,UAAwC,EAAE,EAAE,CAAC,CAAC;QACvF,OAAO;QACP,SAAS,EAAE,QAAQ,CAAC,YAAY;QAChC,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,UAAU,EAAE,wBAAwB;QACpC,OAAO;QACP,aAAa;QACb,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,IAAY;YACzC,MAAM,aAAa,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACvC,wEAAwE;YACxE,yEAAyE;YACzE,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW;gBAAE,OAAO,SAAS,CAAC;YAErD,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,EAAM,EAAE,EAAE;gBACnE,MAAM,KAAK,GAAG,KAAK,EACjB,MAAe,EACf,OAAsB,EACtB,UAAmB,EACnB,UAAmB,EACnB,EAAE;oBACF,MAAM,WAAW,CAAC,EAAE,EAAE;wBACpB,SAAS,EAAE,UAAU;wBACrB,kEAAkE;wBAClE,6DAA6D;wBAC7D,yDAAyD;wBACzD,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,cAAc;wBACtB,YAAY,EAAE,kBAAkB;wBAChC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrC,MAAM;wBACN,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE;qBACnE,CAAC,CAAC;gBACL,CAAC,CAAC;gBAEF,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,QAAQ,EAAE;oBACrD,QAAQ,EAAE,aAAa;oBACvB,UAAU,EAAE,wBAAwB;oBACpC,OAAO;oBACP,QAAQ,EAAE,WAAW;iBACtB,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACjD,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;gBAEhF,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;oBACjE,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnE,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACnE,OAAO,KAAK,CAAC,MAAM,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Submissão de template de mensagem — contrato do DOMÍNIO.
3
+ *
4
+ * ## Por que existe separado do adapter
5
+ *
6
+ * Canais que exigem template aprovado não são exclusividade do WhatsApp: RCS e
7
+ * boa parte dos provedores de SMS transacional pedem o mesmo. O que o domínio
8
+ * precisa expressar é a INTENÇÃO — "submeter este texto, com estas variáveis,
9
+ * nesta categoria, para aprovação" — e não `POST /{waba-id}/message_templates`.
10
+ *
11
+ * Nada aqui menciona Meta, WABA ou Graph API. Trocar de provider é escrever
12
+ * outro adapter; nenhuma linha de catálogo, régua ou motor muda.
13
+ *
14
+ * ## O que o domínio NÃO decide
15
+ *
16
+ * O texto. Ele vem do consumidor, porque a forma como um escritório fala com o
17
+ * cliente é dele — o motor guarda e resolve templates, e não contém nenhum
18
+ * (adendo §14).
19
+ */
20
+ import type { ChannelKey } from './channel.js';
21
+ /**
22
+ * Categoria da mensagem, no vocabulário do domínio.
23
+ *
24
+ * Minúsculas de propósito: o adapter traduz para o que o provider espera. Um
25
+ * enum já no formato da Meta faria o domínio carregar a convenção dela.
26
+ *
27
+ * A distinção é material e não estética: `utility` é transacional, decorre de
28
+ * relação contratual e custa menos; `marketing` exige opt-in de outra natureza.
29
+ * Classificar errado é problema de conformidade, não de campo.
30
+ */
31
+ export type TemplateCategory = 'utility' | 'marketing' | 'authentication';
32
+ export interface TemplateSubmission {
33
+ /** Nome técnico. Estável — entra no envio e não pode mudar depois de aprovado. */
34
+ name: string;
35
+ /** Código de idioma no formato do provider (`pt_BR`). */
36
+ language: string;
37
+ category: TemplateCategory;
38
+ /**
39
+ * Corpo com marcadores posicionais `{{1}}`, `{{2}}`… A ordem é contrato com
40
+ * quem renderiza: trocar duas variáveis sem re-submeter manda o valor no
41
+ * lugar do nome, e o provider aceita — para ele são strings.
42
+ */
43
+ bodyText: string;
44
+ /**
45
+ * Um exemplo por variável, na mesma ordem.
46
+ *
47
+ * Não é enfeite: revisor humano reprova template cujo exemplo não deixa claro
48
+ * o que cada marcador recebe. Exemplos NUNCA devem conter dado real de
49
+ * cliente — vão para a fila de revisão de um terceiro.
50
+ */
51
+ bodyExample?: string[];
52
+ }
53
+ export type TemplateSubmissionRejection =
54
+ /** Nome já usado nesta conta. */
55
+ 'duplicate_name'
56
+ /** Conteúdo recusado pelas regras do provider. */
57
+ | 'invalid_content'
58
+ /** Credencial/permissão nossa. */
59
+ | 'unauthorized'
60
+ /** Limite de taxa. */
61
+ | 'rate_limited' | 'network' | 'provider_error';
62
+ export type TemplateSubmissionResult = {
63
+ ok: true;
64
+ /** Identificador do template no provider. Não é segredo. */
65
+ providerRef?: string;
66
+ /** Estado no momento da submissão — quase sempre pendente de revisão. */
67
+ status: string;
68
+ category?: string;
69
+ } | {
70
+ ok: false;
71
+ reason: TemplateSubmissionRejection;
72
+ };
73
+ /**
74
+ * Porta de gestão de template, implementada por adapter de canal.
75
+ *
76
+ * `submit` é a única operação de ESCRITA aqui, e ela é deliberadamente estreita:
77
+ * não expõe edição nem remoção. Apagar um template aprovado quebra todo envio
78
+ * que o referencia, e essa não é uma capacidade que uma rota administrativa
79
+ * deva ganhar de graça.
80
+ */
81
+ export interface TemplateManagementProvider {
82
+ readonly channel: ChannelKey;
83
+ submit(submission: TemplateSubmission): Promise<TemplateSubmissionResult>;
84
+ }
85
+ //# sourceMappingURL=template-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-provider.d.ts","sourceRoot":"","sources":["../../src/communication/template-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAE1E,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,2BAA2B;AACrC,iCAAiC;AAC/B,gBAAgB;AAClB,kDAAkD;GAChD,iBAAiB;AACnB,kCAAkC;GAChC,cAAc;AAChB,sBAAsB;GACpB,cAAc,GACd,SAAS,GACT,gBAAgB,CAAC;AAErB,MAAM,MAAM,wBAAwB,GAChC;IACE,EAAE,EAAE,IAAI,CAAC;IACT,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,2BAA2B,CAAA;CAAE,CAAC;AAEvD;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,MAAM,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC3E"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Submissão de template de mensagem — contrato do DOMÍNIO.
3
+ *
4
+ * ## Por que existe separado do adapter
5
+ *
6
+ * Canais que exigem template aprovado não são exclusividade do WhatsApp: RCS e
7
+ * boa parte dos provedores de SMS transacional pedem o mesmo. O que o domínio
8
+ * precisa expressar é a INTENÇÃO — "submeter este texto, com estas variáveis,
9
+ * nesta categoria, para aprovação" — e não `POST /{waba-id}/message_templates`.
10
+ *
11
+ * Nada aqui menciona Meta, WABA ou Graph API. Trocar de provider é escrever
12
+ * outro adapter; nenhuma linha de catálogo, régua ou motor muda.
13
+ *
14
+ * ## O que o domínio NÃO decide
15
+ *
16
+ * O texto. Ele vem do consumidor, porque a forma como um escritório fala com o
17
+ * cliente é dele — o motor guarda e resolve templates, e não contém nenhum
18
+ * (adendo §14).
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=template-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-provider.js","sourceRoot":"","sources":["../../src/communication/template-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Modelo de template do motor compartilhado.
3
+ *
4
+ * O motor guarda e resolve templates. Ele **não contém nenhum**: nenhuma string
5
+ * de cobrança da SC, nenhum texto de assinatura da Dental. O catálogo é dado do
6
+ * consumidor, e é assim que "motor compartilhado" não vira "monolito central
7
+ * cheio de regra de negócio alheia" (adendo §14).
8
+ *
9
+ * O que o motor sabe é o que todo canal precisa que alguém saiba: qual template
10
+ * vale para este contexto, nesta versão, neste idioma, e se ele está aprovado.
11
+ */
12
+ import type { ChannelKey } from './channel.js';
13
+ import type { CommunicationContext } from './context.js';
14
+ /**
15
+ * `approved` é exigência real do canal, não burocracia interna: WhatsApp fora da
16
+ * janela de 24h só aceita template previamente aprovado pelo provedor. Um
17
+ * template `draft` que chega ao adapter é recusado pelo provider com erro
18
+ * permanente — e é muito melhor recusá-lo aqui, com um motivo legível, do que
19
+ * gastar a tentativa para descobrir lá.
20
+ */
21
+ export type TemplateStatus = 'draft' | 'pending_approval' | 'approved' | 'rejected' | 'retired';
22
+ export interface TemplateKey {
23
+ /** Escopo. `tenantId` nulo = template do produto, válido para todos os tenants dele. */
24
+ tenantId: string | null;
25
+ product: string;
26
+ /** Marca. Nulo = vale para qualquer marca do produto. */
27
+ brand: string | null;
28
+ channel: ChannelKey;
29
+ /** Evento de negócio: `billing.dunning.d3`, `subscription.payment_due`. */
30
+ eventType: string;
31
+ locale: string;
32
+ }
33
+ export interface TemplateRecord extends TemplateKey {
34
+ /** Estável dentro do escopo. É o que entra na chave de idempotência. */
35
+ version: string;
36
+ status: TemplateStatus;
37
+ /**
38
+ * Nome do template DO LADO DO PROVIDER, quando o canal exige registro prévio.
39
+ *
40
+ * Só o WhatsApp usa hoje. Vive aqui, e não no adapter, porque o mesmo evento
41
+ * pode estar registrado com nomes diferentes em providers diferentes — e
42
+ * descobrir isso no adapter significaria o adapter conhecendo o catálogo.
43
+ */
44
+ providerTemplateName?: string;
45
+ /** Variáveis que o template espera, na ORDEM em que o canal as substitui. */
46
+ variables: readonly string[];
47
+ /** Corpo, para canais de texto livre. Ausente quando o provider é o dono do corpo. */
48
+ body?: string;
49
+ subject?: string;
50
+ }
51
+ export type TemplateRejection = 'not_found' | 'not_approved' | 'variable_mismatch';
52
+ export type TemplateResolution = {
53
+ ok: true;
54
+ template: TemplateRecord;
55
+ } | {
56
+ ok: false;
57
+ reason: TemplateRejection;
58
+ detail: string;
59
+ };
60
+ export interface TemplateStore {
61
+ /** Todos os candidatos para o evento/canal, em qualquer escopo. */
62
+ candidates(ctx: CommunicationContext, channel: ChannelKey, eventType: string, locale: string): Promise<TemplateRecord[]>;
63
+ }
64
+ /**
65
+ * Resolve o template mais específico e aprovado.
66
+ *
67
+ * Um candidato de escopo mais específico porém NÃO aprovado não silencia os
68
+ * menos específicos — cair para o padrão do produto é melhor que não enviar. Mas
69
+ * também não é escolhido: enviar um rascunho seria pior que os dois.
70
+ */
71
+ export declare function resolveTemplate(store: TemplateStore, ctx: CommunicationContext, channel: ChannelKey, eventType: string, locale: string): Promise<TemplateResolution>;
72
+ /**
73
+ * Ordena as variáveis do consumidor na ordem que o template declara.
74
+ *
75
+ * Devolve falha quando falta alguma, em vez de substituir por vazio. Um template
76
+ * de cobrança com o valor em branco — "consta em aberto o valor de ." — chega ao
77
+ * cliente parecendo defeito do escritório, e o WhatsApp recusa a mensagem de
78
+ * qualquer forma quando um parâmetro posicional vem vazio.
79
+ */
80
+ export declare function orderVariables(template: TemplateRecord, values: Record<string, string>): {
81
+ ok: true;
82
+ ordered: string[];
83
+ } | {
84
+ ok: false;
85
+ missing: string[];
86
+ };
87
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/communication/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,kBAAkB,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAEhG,MAAM,WAAW,WAAW;IAC1B,wFAAwF;IACxF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6EAA6E;IAC7E,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAEnF,MAAM,MAAM,kBAAkB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,UAAU,CACR,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC9B;AAaD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,CAAC,CAiB7B;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAMpE"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Modelo de template do motor compartilhado.
3
+ *
4
+ * O motor guarda e resolve templates. Ele **não contém nenhum**: nenhuma string
5
+ * de cobrança da SC, nenhum texto de assinatura da Dental. O catálogo é dado do
6
+ * consumidor, e é assim que "motor compartilhado" não vira "monolito central
7
+ * cheio de regra de negócio alheia" (adendo §14).
8
+ *
9
+ * O que o motor sabe é o que todo canal precisa que alguém saiba: qual template
10
+ * vale para este contexto, nesta versão, neste idioma, e se ele está aprovado.
11
+ */
12
+ /**
13
+ * Especificidade do escopo — maior vence.
14
+ *
15
+ * Tenant+marca (3) > tenant (2) > marca do produto (1) > produto (0). Um
16
+ * escritório que personalizou o próprio texto não pode ser sobrescrito pelo
17
+ * padrão do produto só porque o padrão foi atualizado depois.
18
+ */
19
+ function specificity(t) {
20
+ return (t.tenantId ? 2 : 0) + (t.brand ? 1 : 0);
21
+ }
22
+ /**
23
+ * Resolve o template mais específico e aprovado.
24
+ *
25
+ * Um candidato de escopo mais específico porém NÃO aprovado não silencia os
26
+ * menos específicos — cair para o padrão do produto é melhor que não enviar. Mas
27
+ * também não é escolhido: enviar um rascunho seria pior que os dois.
28
+ */
29
+ export async function resolveTemplate(store, ctx, channel, eventType, locale) {
30
+ const all = await store.candidates(ctx, channel, eventType, locale);
31
+ if (all.length === 0) {
32
+ return { ok: false, reason: 'not_found', detail: `sem template para ${eventType}/${channel}` };
33
+ }
34
+ const approved = all.filter((t) => t.status === 'approved');
35
+ if (approved.length === 0) {
36
+ return {
37
+ ok: false,
38
+ reason: 'not_approved',
39
+ detail: `template de ${eventType}/${channel} existe mas não está aprovado`,
40
+ };
41
+ }
42
+ const best = approved.reduce((a, b) => (specificity(b) > specificity(a) ? b : a));
43
+ return { ok: true, template: best };
44
+ }
45
+ /**
46
+ * Ordena as variáveis do consumidor na ordem que o template declara.
47
+ *
48
+ * Devolve falha quando falta alguma, em vez de substituir por vazio. Um template
49
+ * de cobrança com o valor em branco — "consta em aberto o valor de ." — chega ao
50
+ * cliente parecendo defeito do escritório, e o WhatsApp recusa a mensagem de
51
+ * qualquer forma quando um parâmetro posicional vem vazio.
52
+ */
53
+ export function orderVariables(template, values) {
54
+ const missing = template.variables.filter((name) => values[name] === undefined || values[name] === '');
55
+ if (missing.length > 0)
56
+ return { ok: false, missing: [...missing] };
57
+ return { ok: true, ordered: template.variables.map((name) => values[name]) };
58
+ }
59
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/communication/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA4DH;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,CAAiB;IACpC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAoB,EACpB,GAAyB,EACzB,OAAmB,EACnB,SAAiB,EACjB,MAAc;IAEd,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACpE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,qBAAqB,SAAS,IAAI,OAAO,EAAE,EAAE,CAAC;IACjG,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAC5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,eAAe,SAAS,IAAI,OAAO,+BAA+B;SAC3E,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAwB,EACxB,MAA8B;IAE9B,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CACvC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAC5D,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,EAAE,CAAC;AAChF,CAAC"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Diagnóstico da ASSINATURA de webhooks — por que o status não chega.
3
+ *
4
+ * ## O que este módulo responde
5
+ *
6
+ * Uma mensagem aceita pela Meta não produz `delivered` sozinha: o status volta
7
+ * por webhook, e o webhook depende de duas coisas que vivem em lugares
8
+ * DIFERENTES e são configuradas por caminhos diferentes:
9
+ *
10
+ * 1. **A WABA assina o app.** `POST {waba}/subscribed_apps` — feito pelo
11
+ * Embedded Signup, no código (`subscribeAppToWaba`).
12
+ * 2. **O app assina o objeto e declara para onde entregar.**
13
+ * `{app}/subscriptions` com `object=whatsapp_business_account`,
14
+ * `callback_url`, `verify_token` e os `fields` (`messages`) — configurado
15
+ * no painel do app, uma vez, e NUNCA automatizado nesta casa.
16
+ *
17
+ * Ter (1) e não ter (2) produz exatamente o sintoma observado em 2026-09-01: a
18
+ * Meta aceita a mensagem, devolve `wamid`, e não chama ninguém. Do lado de cá
19
+ * não há erro nenhum para ver — o silêncio é a única evidência, e silêncio não
20
+ * aponta causa.
21
+ *
22
+ * ## Por que é leitura pura
23
+ *
24
+ * Este módulo não corrige nada. Corrigir a assinatura do app é mutação externa
25
+ * que muda para onde a Meta entrega os eventos de TODAS as WABAs do app — não é
26
+ * coisa que uma rota de diagnóstico deva poder fazer por engano.
27
+ *
28
+ * ## Sobre o token de app
29
+ *
30
+ * `{app_id}|{app_secret}` é a forma que a Graph API aceita para chamadas em
31
+ * nome do app. O segredo entra na composição do token e **não sai deste
32
+ * módulo**: nem no retorno, nem em erro, nem em log. As respostas carregam só
33
+ * `callback_url` (que é público, é o nosso endpoint), os campos assinados e o
34
+ * estado — nunca o `verify_token`, que a Graph tampouco devolve.
35
+ */
36
+ import type { GraphClientOptions } from './onboarding.js';
37
+ /** Um app assinante de uma WABA, como a Meta o descreve. */
38
+ export interface SubscribedApp {
39
+ id: string;
40
+ name?: string;
41
+ }
42
+ /** Uma assinatura de objeto no nível do APP. */
43
+ export interface AppSubscription {
44
+ object: string;
45
+ callbackUrl?: string;
46
+ active?: boolean;
47
+ /** Campos assinados: `messages`, `message_template_status_update`, etc. */
48
+ fields: string[];
49
+ }
50
+ /** Vocabulário fechado do domínio. A mensagem do provider nunca sai daqui. */
51
+ export type SubscriptionRejection = 'unauthorized' | 'not_found' | 'network' | 'provider_error';
52
+ export type SubscriptionProbe<T> = {
53
+ ok: true;
54
+ value: T;
55
+ } | {
56
+ ok: false;
57
+ reason: SubscriptionRejection;
58
+ };
59
+ /**
60
+ * Quais apps a WABA assina — `GET {waba}/subscribed_apps`.
61
+ *
62
+ * Usa o token de NEGÓCIO do tenant (o mesmo do despacho): é a WABA do cliente,
63
+ * e quem tem direito a lê-la é quem tem a credencial dela.
64
+ */
65
+ export declare function readWabaSubscribedApps(input: {
66
+ wabaId: string;
67
+ accessToken: string;
68
+ }, opts?: GraphClientOptions): Promise<SubscriptionProbe<SubscribedApp[]>>;
69
+ /**
70
+ * O que o APP assina, e para onde entrega — `GET {app}/subscriptions`.
71
+ *
72
+ * Exige token de APP. O segredo é consumido aqui e não atravessa a fronteira:
73
+ * o retorno tem `callback_url`, campos e estado, nada mais.
74
+ */
75
+ export declare function readAppSubscriptions(input: {
76
+ appId: string;
77
+ appSecret: string;
78
+ }, opts?: GraphClientOptions): Promise<SubscriptionProbe<AppSubscription[]>>;
79
+ /**
80
+ * Pede à Meta que ENTREGUE um evento de amostra no callback do app.
81
+ *
82
+ * `POST {app}/subscriptions_sample` — o mesmo botão "Testar" do painel de
83
+ * Webhooks, pela API. **Não manda mensagem de WhatsApp para ninguém**: a Meta
84
+ * monta um payload sintético do campo pedido e o entrega no `callback_url` já
85
+ * configurado, assinado como um evento real.
86
+ *
87
+ * ## Por que isto vale mais que olhar a configuração
88
+ *
89
+ * A leitura acima diz que a configuração ESTÁ certa. Não diz que a entrega
90
+ * ACONTECE. São afirmações diferentes, e a segunda é a que interessa quando o
91
+ * sintoma é silêncio: se a amostra chega, o caminho
92
+ * `Meta → nosso endpoint → assinatura` está provado e a causa é upstream — a
93
+ * Meta não está GERANDO status para este app. Se a amostra não chega, o
94
+ * problema é o caminho, e a configuração correta era uma pista falsa.
95
+ *
96
+ * É a única sonda que discrimina as duas sem gastar uma mensagem real.
97
+ *
98
+ * ## Não altera nada
99
+ *
100
+ * Não cria, não muda e não remove assinatura. O único efeito externo é uma
101
+ * requisição HTTP que a Meta faz ao nosso próprio endpoint público.
102
+ */
103
+ export declare function sendWebhookTestEvent(input: {
104
+ appId: string;
105
+ appSecret: string;
106
+ object?: string;
107
+ field?: string;
108
+ }, opts?: GraphClientOptions): Promise<SubscriptionProbe<{
109
+ requested: true;
110
+ }>>;
111
+ /**
112
+ * Configurações administrativas do app, como a Meta as tem hoje.
113
+ *
114
+ * ## Para que serve
115
+ *
116
+ * As URLs legais, os domínios e os e-mails do app são o que a análise da Meta
117
+ * confere primeiro — e são exatamente o tipo de campo que alguém "lembra" de ter
118
+ * configurado. Ler antes de mexer é o que separa corrigir de sobrescrever.
119
+ *
120
+ * ## O que NÃO vem aqui
121
+ *
122
+ * O modo do app (desenvolvimento × ativo) e o nível de acesso de cada permissão
123
+ * **não são expostos** por esta borda da Graph API. Devolver `null` para eles é
124
+ * dizer a verdade: quem precisar deles tem de olhar o painel. Inventar um campo
125
+ * derivado — "se tem X então está publicado" — produziria uma matriz de
126
+ * prontidão que parece completa e não é.
127
+ */
128
+ export interface AppSettings {
129
+ id: string;
130
+ name?: string;
131
+ category?: string;
132
+ privacyPolicyUrl?: string;
133
+ termsOfServiceUrl?: string;
134
+ /** Instruções de exclusão. A Meta aceita URL OU callback; são campos distintos. */
135
+ dataDeletionInstructionsUrl?: string;
136
+ deauthCallbackUrl?: string;
137
+ appDomains: string[];
138
+ contactEmail?: string;
139
+ /** Onde a Meta manda aviso administrativo. Distinto do contato público. */
140
+ notificationEmail?: string;
141
+ iconUrl?: string;
142
+ link?: string;
143
+ /**
144
+ * Campos que esta credencial não conseguiu ler.
145
+ *
146
+ * Ausente da resposta ≠ ausente na Meta. A distinção decide se alguém precisa
147
+ * ir ao painel conferir — e sem ela um campo restrito viraria "não
148
+ * configurado" numa matriz de prontidão.
149
+ */
150
+ unreadableFields: string[];
151
+ }
152
+ export declare function readAppSettings(input: {
153
+ appId: string;
154
+ appSecret: string;
155
+ }, opts?: GraphClientOptions): Promise<SubscriptionProbe<AppSettings>>;
156
+ //# sourceMappingURL=webhook-subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-subscription.d.ts","sourceRoot":"","sources":["../../src/communication/webhook-subscription.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,8EAA8E;AAC9E,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,gBAAgB,CAAC;AAEhG,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAqCxE;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAC9C,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC,CAiB7C;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC3C,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,eAAe,EAAE,CAAC,CAAC,CAiC/C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5E,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,iBAAiB,CAAC;IAAE,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,CA+BjD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mFAAmF;IACnF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAwBD,wBAAsB,eAAe,CACnC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC3C,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAuDzC"}