@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,191 @@
1
+ "use strict";
2
+ /**
3
+ * Identidade e autorização de workload NÃO-HUMANO.
4
+ *
5
+ * O RBAC de `authorize.ts` responde "este USUÁRIO pode?". Nenhuma linha do
6
+ * repositório respondia "este PROCESSO pode?" — e a diferença não é
7
+ * acadêmica: o `TenantSecretStore` do lote C1A aceitava um `SecretAccessGrant`
8
+ * montado pelo próprio chamador. `principal`, `reason` e as datas eram strings
9
+ * e `Date`s sintaticamente válidas; qualquer módulo interno com acesso ao
10
+ * arquivo podia declará-las e pedir decifração. Isso é ATRIBUIÇÃO — serve para
11
+ * a trilha de auditoria e não serve como fronteira de segurança.
12
+ *
13
+ * Este módulo troca a declaração por três coisas que o chamador não consegue
14
+ * fabricar sozinho:
15
+ *
16
+ * 1. **Autenticação.** O workload apresenta um segredo próprio, verificado
17
+ * contra `service_principal.secret_hash` (scrypt, o mesmo `verifyPassword`
18
+ * da senha humana). Sem o segredo, não há identidade — e o segredo vive no
19
+ * ambiente do deploy que roda AQUELE workload, não no código.
20
+ *
21
+ * 2. **Autorização fora do controlado.** A permissão vem de linhas em
22
+ * `service_principal_grant`, e `baruk_app` tem apenas SELECT nessas tabelas
23
+ * (`db/migrate.ts` §3). O processo que consome a autorização não consegue
24
+ * escrevê-la: não é uma regra de tipo, é um privilégio do Postgres.
25
+ *
26
+ * 3. **Verificação por CHAMADA, dentro da transação.** A decisão não é
27
+ * memorizada na composição. Revogar um principal ou um grant passa a valer
28
+ * na próxima chamada, sem esperar o processo reiniciar.
29
+ *
30
+ * O objeto `WorkloadIdentity` é apenas o transporte da identidade JÁ
31
+ * autenticada. Ele é marcado com um símbolo privado deste módulo e registrado
32
+ * num `WeakSet` privado: um objeto estruturalmente idêntico, montado à mão em
33
+ * outro arquivo, é recusado. Mas a marca não é a fronteira — é a tranca da
34
+ * porta interna. A fronteira é o par (segredo, linha no banco).
35
+ */
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.WORKLOAD_PURPOSES = void 0;
38
+ exports.authenticateWorkload = authenticateWorkload;
39
+ exports.isMintedWorkloadIdentity = isMintedWorkloadIdentity;
40
+ exports.assertMintedWorkloadIdentity = assertMintedWorkloadIdentity;
41
+ exports.authorizeWorkload = authorizeWorkload;
42
+ const shared_1 = require("@baruk/shared");
43
+ const password_js_1 = require("../auth/password.js");
44
+ exports.WORKLOAD_PURPOSES = [
45
+ 'channel_dispatch',
46
+ 'onboarding_seal',
47
+ 'health_probe',
48
+ ];
49
+ /**
50
+ * Marca privada. Não é exportada — logo, nenhum arquivo fora daqui consegue
51
+ * escrever esta propriedade de forma tipada, e `MINTED` recusa o objeto
52
+ * estruturalmente idêntico em tempo de execução.
53
+ */
54
+ const WORKLOAD_BRAND = Symbol('baruk.workload-identity');
55
+ const MINTED = new WeakSet();
56
+ /** Sessão padrão: 1h. Um cron diário reautentica a cada execução; um worker, de hora em hora. */
57
+ const DEFAULT_TTL_MS = 60 * 60 * 1000;
58
+ /** Teto duro. Uma sessão de dias equivaleria a não ter janela nenhuma. */
59
+ const MAX_TTL_MS = 12 * 60 * 60 * 1000;
60
+ /**
61
+ * Hash descartável com o mesmo custo de um real. Existe para que "principal
62
+ * inexistente" e "segredo errado" levem o mesmo tempo — sem isso, a latência
63
+ * enumera quais principals existem.
64
+ */
65
+ const DUMMY_HASH = `scrypt$16384$8$1$${'A'.repeat(22)}==$${'a'.repeat(86)}==`;
66
+ /**
67
+ * Autentica um workload e emite a identidade da sessão.
68
+ *
69
+ * **Chame na RAIZ DE COMPOSIÇÃO** — o `main()` do cron, o bootstrap do worker,
70
+ * a borda de request já autenticada — e propague a identidade. Nenhum módulo de
71
+ * domínio deve chamar isto: quem PRECISA do segredo nunca deve ser quem
72
+ * declara ter direito a ele.
73
+ *
74
+ * Falha FECHADA e ruidosa: `UnauthorizedError`. Um workload que não autentica
75
+ * deve parar no boot, com o erro visível, não seguir e falhar seis passos
76
+ * depois como "canal indisponível".
77
+ *
78
+ * Roda FORA de contexto de tenant: `service_principal` é global, como `"user"`.
79
+ * A amarração ao tenant é da autorização (`authorizeWorkload`), não da identidade.
80
+ */
81
+ async function authenticateWorkload(db, input) {
82
+ const key = input?.key?.trim() ?? '';
83
+ const secret = typeof input?.secret === 'string' ? input.secret : '';
84
+ if (!key)
85
+ throw new shared_1.ValidationError('key do service principal é obrigatória.');
86
+ if (!secret)
87
+ throw new shared_1.ValidationError('secret do service principal é obrigatório.');
88
+ const ttl = input.ttlMs ?? DEFAULT_TTL_MS;
89
+ if (!Number.isFinite(ttl) || ttl <= 0 || ttl > MAX_TTL_MS) {
90
+ throw new shared_1.ValidationError(`ttlMs fora da janela permitida (1..${MAX_TTL_MS}).`);
91
+ }
92
+ const rows = await db `
93
+ SELECT id, key, status, secret_hash
94
+ FROM service_principal
95
+ WHERE lower(key) = lower(${key}) AND deleted_at IS NULL
96
+ `;
97
+ const row = rows[0];
98
+ // Verifica SEMPRE — inclusive contra o hash descartável quando não há linha.
99
+ const matches = (0, password_js_1.verifyPassword)(secret, row?.secret_hash ?? DUMMY_HASH);
100
+ if (!row || row.status !== 'active' || !matches) {
101
+ throw new shared_1.UnauthorizedError('Workload não autenticado.');
102
+ }
103
+ const issuedAt = input.now ?? new Date();
104
+ const identity = {
105
+ principalId: row.id,
106
+ principalKey: row.key,
107
+ issuedAt,
108
+ expiresAt: new Date(issuedAt.getTime() + ttl),
109
+ [WORKLOAD_BRAND]: true,
110
+ };
111
+ MINTED.add(identity);
112
+ return identity;
113
+ }
114
+ /** O objeto veio de `authenticateWorkload`? Recusa qualquer imitação estrutural. */
115
+ function isMintedWorkloadIdentity(value) {
116
+ return typeof value === 'object' && value !== null && MINTED.has(value);
117
+ }
118
+ /**
119
+ * Falha fechada quando a identidade não foi emitida aqui. Chamado por TODO
120
+ * consumidor antes de qualquer trabalho — um `ForbiddenError` no primeiro
121
+ * passo é a diferença entre uma tentativa recusada e um segredo entregue.
122
+ */
123
+ function assertMintedWorkloadIdentity(value) {
124
+ if (!isMintedWorkloadIdentity(value)) {
125
+ throw new shared_1.ForbiddenError('WorkloadIdentity não emitida por authenticateWorkload — identidade forjada recusada.');
126
+ }
127
+ }
128
+ /**
129
+ * Decide se ESTE principal pode exercer ESTA permissão, NESTE tenant, para
130
+ * ESTE propósito, sobre ESTE recurso. Quatro dimensões conjuntivas.
131
+ *
132
+ * A quarta é o que fecha confused deputy: um workload legitimamente autorizado
133
+ * no tenant A a despachar canal não decifra a chave do gateway de pagamento do
134
+ * tenant A só porque um `credentialRef` vindo de input pediu. A autorização do
135
+ * workload nunca vira autorização para qualquer recurso que o input nomear.
136
+ *
137
+ * **DEVE rodar dentro de `withContext(db, { tenantId })`** — a RLS FORCE de
138
+ * `service_principal_grant` é a segunda camada; o predicado explícito de
139
+ * `tenant_id` é a primeira. As duas dizem a mesma coisa de propósito: nenhuma
140
+ * das duas sozinha é o desenho.
141
+ */
142
+ async function authorizeWorkload(tx, identity, req) {
143
+ assertMintedWorkloadIdentity(identity);
144
+ const tenantId = req?.tenantId?.trim() ?? '';
145
+ const permission = req?.permission?.trim() ?? '';
146
+ const resource = req?.resource?.trim() ?? '';
147
+ const purpose = req?.purpose;
148
+ if (!tenantId || !permission || !resource || !exports.WORKLOAD_PURPOSES.includes(purpose)) {
149
+ return { allowed: false, denyReason: 'invalid_request' };
150
+ }
151
+ const now = req.now ?? new Date();
152
+ if (now.getTime() >= identity.expiresAt.getTime() ||
153
+ now.getTime() < identity.issuedAt.getTime()) {
154
+ return { allowed: false, denyReason: 'identity_expired' };
155
+ }
156
+ // Revogação vale AGORA, não no próximo boot: relê o principal a cada chamada.
157
+ const principal = await tx `
158
+ SELECT id FROM service_principal
159
+ WHERE id = ${identity.principalId} AND status = 'active' AND deleted_at IS NULL
160
+ `;
161
+ if (!principal[0]) {
162
+ return { allowed: false, denyReason: 'principal_unknown_or_disabled' };
163
+ }
164
+ // `left(...)` em vez de LIKE: o valor do prefixo é literal, e `_`/`%` são
165
+ // caracteres comuns em nome de credencial (`RESEND_API_KEY`). Um LIKE aqui
166
+ // transformaria um nome legítimo em curinga.
167
+ const grants = await tx `
168
+ SELECT id FROM service_principal_grant
169
+ WHERE tenant_id = ${tenantId}
170
+ AND principal_id = ${identity.principalId}
171
+ AND permission_key = ${permission}
172
+ AND purpose = ${purpose}
173
+ AND revoked_at IS NULL
174
+ AND deleted_at IS NULL
175
+ AND (expires_at IS NULL OR expires_at > ${now})
176
+ AND (
177
+ (resource_kind = 'exact' AND lower(resource_value) = lower(${resource}))
178
+ OR (
179
+ resource_kind = 'prefix'
180
+ AND left(lower(${resource}), length(lower(resource_value))) = lower(resource_value)
181
+ )
182
+ )
183
+ LIMIT 1
184
+ `;
185
+ const grant = grants[0];
186
+ if (!grant) {
187
+ return { allowed: false, denyReason: 'no_matching_grant' };
188
+ }
189
+ return { allowed: true, grantId: grant.id };
190
+ }
191
+ //# sourceMappingURL=workload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workload.js","sourceRoot":"","sources":["../../../src/rbac/workload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sha256Hex = sha256Hex;
4
+ const node_crypto_1 = require("node:crypto");
5
+ /**
6
+ * SHA-256 em hex minúsculo — a forma exigida pelo CHECK de `blob.checksum_sha256`.
7
+ *
8
+ * É o identificador de conteúdo que sustenta duas coisas na ADR 0007: a
9
+ * deduplicação por tenant e a prova de que a versão baixada é byte-idêntica à
10
+ * que foi enviada.
11
+ */
12
+ function sha256Hex(data) {
13
+ return (0, node_crypto_1.createHash)('sha256').update(data).digest('hex');
14
+ }
15
+ //# sourceMappingURL=checksum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../../src/storage/checksum.ts"],"names":[],"mappings":";;AASA,8BAEC;AAXD,6CAAyC;AAEzC;;;;;;GAMG;AACH,SAAgB,SAAS,CAAC,IAAgB;IACxC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildStorageKey = buildStorageKey;
4
+ exports.sanitizeSegment = sanitizeSegment;
5
+ exports.sanitizeFilename = sanitizeFilename;
6
+ const node_crypto_1 = require("node:crypto");
7
+ /**
8
+ * Construção da chave de objeto (ADR 0007 D7).
9
+ *
10
+ * Formato:
11
+ * {tenant_id}/{client_id}/{yyyy}/{mm}/{category}/{document_id}/{version}-{rand}
12
+ *
13
+ * Três propriedades que a forma garante:
14
+ *
15
+ * 1. **Tenant no primeiro segmento** — a fronteira fica legível no próprio
16
+ * bucket e permite política de acesso por prefixo no provedor.
17
+ * 2. **Não previsível** — o sufixo aleatório impede que alguém que conheça os
18
+ * ids enumere objetos. A URL assinada já expira, mas defesa em profundidade
19
+ * custa 8 bytes.
20
+ * 3. **Sem nome de arquivo do cliente** — o `original_filename` vive na tabela
21
+ * `document_version`, nunca na chave. Nome vindo do cliente não é identidade
22
+ * de objeto e é o vetor clássico de path traversal.
23
+ */
24
+ function buildStorageKey(input) {
25
+ const { tenantId, clientId, documentId, versionNo } = input;
26
+ // Competência dá a partição temporal quando existe; senão, a data corrente.
27
+ // O formato YYYY-MM já é validado no banco, então o split é seguro.
28
+ let yyyy;
29
+ let mm;
30
+ if (input.competenceLabel && /^\d{4}-\d{2}$/.test(input.competenceLabel)) {
31
+ [yyyy, mm] = input.competenceLabel.split('-');
32
+ }
33
+ else {
34
+ const now = new Date();
35
+ yyyy = String(now.getUTCFullYear());
36
+ mm = String(now.getUTCMonth() + 1).padStart(2, '0');
37
+ }
38
+ const category = sanitizeSegment(input.categoryKey ?? 'geral');
39
+ const rand = (0, node_crypto_1.randomBytes)(8).toString('hex');
40
+ return `${tenantId}/${clientId}/${yyyy}/${mm}/${category}/${documentId}/${versionNo}-${rand}`;
41
+ }
42
+ /**
43
+ * Reduz um segmento a `[a-z0-9_-]`. Qualquer outra coisa — inclusive `.` e `/` —
44
+ * é descartada, o que torna `../` impossível de construir por aqui.
45
+ */
46
+ function sanitizeSegment(value) {
47
+ const cleaned = value
48
+ .toLowerCase()
49
+ .normalize('NFD')
50
+ .replace(/[\u0300-\u036f]/g, '')
51
+ .replace(/[^a-z0-9_-]/g, '-')
52
+ .replace(/-+/g, '-')
53
+ .replace(/^-|-$/g, '')
54
+ .slice(0, 48);
55
+ return cleaned.length > 0 ? cleaned : 'geral';
56
+ }
57
+ /**
58
+ * Higieniza o nome exibido ao usuário. Não participa da chave de storage — é só
59
+ * o rótulo guardado em `document_version.original_filename` e devolvido no
60
+ * download. Remove diretório, controla o comprimento e recusa nome vazio.
61
+ */
62
+ function sanitizeFilename(value) {
63
+ const base = value.split(/[\\/]/).pop() ?? '';
64
+ const cleaned = base
65
+ // eslint-disable-next-line no-control-regex
66
+ .replace(/[\u0000-\u001f\u007f]/g, '')
67
+ .replace(/^\.+/, '')
68
+ .trim()
69
+ .slice(0, 180);
70
+ return cleaned.length > 0 ? cleaned : 'arquivo';
71
+ }
72
+ //# sourceMappingURL=key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.js","sourceRoot":"","sources":["../../../src/storage/key.ts"],"names":[],"mappings":";;AAmBA,0CA0BC;AAMD,0CAUC;AAOD,4CASC;AA7ED,6CAA0C;AAE1C;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,eAAe,CAAC,KAO/B;IACC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE5D,4EAA4E;IAC5E,oEAAoE;IACpE,IAAI,IAAY,CAAC;IACjB,IAAI,EAAU,CAAC;IACf,IAAI,KAAK,CAAC,eAAe,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QACzE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QACpC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAA,yBAAW,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,OAAO,GAAG,QAAQ,IAAI,QAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,QAAQ,IAAI,UAAU,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;AAChG,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,KAAa;IAC3C,MAAM,OAAO,GAAG,KAAK;SAClB,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI;QAClB,4CAA4C;SAC3C,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC;SACrC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE;SACN,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalStorageProvider = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_path_1 = require("node:path");
7
+ const types_js_1 = require("./types.js");
8
+ const checksum_js_1 = require("./checksum.js");
9
+ /**
10
+ * Provider de sistema de arquivos — o default seguro (ADR 0007 D4).
11
+ *
12
+ * Usado em desenvolvimento e em toda a suíte de testes: nenhum teste depende de
13
+ * R2 real, o que mantém o CI offline e determinístico.
14
+ *
15
+ * A "URL assinada" aqui é um caminho relativo da própria API com token HMAC e
16
+ * expiração — mesma semântica do presigned do R2 (link temporário, sem
17
+ * credencial embutida), servido pelo backend em vez do provedor.
18
+ */
19
+ class LocalStorageProvider {
20
+ key = 'local';
21
+ root;
22
+ signingSecret;
23
+ constructor(options) {
24
+ this.root = (0, node_path_1.resolve)(options.rootDir);
25
+ this.signingSecret = options.signingSecret;
26
+ }
27
+ /**
28
+ * Resolve a chave para um caminho absoluto e recusa qualquer coisa que escape
29
+ * da raiz. A chave já é construída por `buildStorageKey`, mas este guard não
30
+ * confia nisso: um provider de storage é o último lugar onde se deve supor
31
+ * que a entrada é boa.
32
+ */
33
+ pathFor(key) {
34
+ if (key.includes('\0'))
35
+ throw new types_js_1.StorageError('chave inválida', 'invalid');
36
+ const target = (0, node_path_1.resolve)((0, node_path_1.join)(this.root, (0, node_path_1.normalize)(key)));
37
+ if (target !== this.root && !target.startsWith(this.root + node_path_1.sep)) {
38
+ throw new types_js_1.StorageError('chave fora da raiz de storage', 'invalid');
39
+ }
40
+ return target;
41
+ }
42
+ async put(input) {
43
+ const target = this.pathFor(input.key);
44
+ await (0, promises_1.mkdir)((0, node_path_1.dirname)(target), { recursive: true });
45
+ await (0, promises_1.writeFile)(target, input.body);
46
+ return {
47
+ key: input.key,
48
+ checksumSha256: (0, checksum_js_1.sha256Hex)(input.body),
49
+ sizeBytes: input.body.byteLength,
50
+ };
51
+ }
52
+ async getSignedUrl(key, options) {
53
+ const ttl = options?.expiresInSeconds ?? types_js_1.DEFAULT_SIGNED_URL_TTL_SECONDS;
54
+ const expiresAt = Math.floor(Date.now() / 1000) + ttl;
55
+ const signature = this.sign(key, expiresAt);
56
+ const params = new URLSearchParams({ key, expires: String(expiresAt), sig: signature });
57
+ if (options?.downloadFilename)
58
+ params.set('filename', options.downloadFilename);
59
+ return `/v1/documents/blob?${params.toString()}`;
60
+ }
61
+ async head(key) {
62
+ try {
63
+ const info = await (0, promises_1.stat)(this.pathFor(key));
64
+ return { exists: true, sizeBytes: info.size };
65
+ }
66
+ catch {
67
+ return { exists: false };
68
+ }
69
+ }
70
+ async delete(key) {
71
+ await (0, promises_1.rm)(this.pathFor(key), { force: true });
72
+ }
73
+ /** Lê o objeto. Só o LocalStorageProvider expõe isso — o R2 serve direto. */
74
+ async read(key) {
75
+ try {
76
+ return new Uint8Array(await (0, promises_1.readFile)(this.pathFor(key)));
77
+ }
78
+ catch {
79
+ throw new types_js_1.StorageError('objeto não encontrado', 'not-found');
80
+ }
81
+ }
82
+ sign(key, expiresAt) {
83
+ return (0, node_crypto_1.createHmac)('sha256', this.signingSecret).update(`${key}:${expiresAt}`).digest('hex');
84
+ }
85
+ /**
86
+ * Valida assinatura e expiração. Comparação em tempo constante — um HMAC
87
+ * comparado com `===` vaza o prefixo correto byte a byte.
88
+ */
89
+ verifySignature(key, expiresAt, signature) {
90
+ if (!Number.isFinite(expiresAt) || expiresAt < Math.floor(Date.now() / 1000))
91
+ return false;
92
+ const expected = Buffer.from(this.sign(key, expiresAt), 'utf8');
93
+ const received = Buffer.from(signature, 'utf8');
94
+ if (expected.length !== received.length)
95
+ return false;
96
+ return (0, node_crypto_1.timingSafeEqual)(expected, received);
97
+ }
98
+ }
99
+ exports.LocalStorageProvider = LocalStorageProvider;
100
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/storage/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.R2StorageProvider = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const types_js_1 = require("./types.js");
6
+ const checksum_js_1 = require("./checksum.js");
7
+ const SERVICE = 's3';
8
+ const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD';
9
+ class R2StorageProvider {
10
+ key = 'r2';
11
+ cfg;
12
+ fetchImpl;
13
+ host;
14
+ constructor(config) {
15
+ if (!config.accountId || !config.accessKeyId || !config.secretAccessKey || !config.bucket) {
16
+ throw new types_js_1.StorageError('configuração R2 incompleta', 'invalid');
17
+ }
18
+ this.cfg = {
19
+ accountId: config.accountId,
20
+ accessKeyId: config.accessKeyId,
21
+ secretAccessKey: config.secretAccessKey,
22
+ bucket: config.bucket,
23
+ region: config.region ?? 'auto',
24
+ };
25
+ this.fetchImpl = config.fetchImpl ?? fetch;
26
+ this.host = `${this.cfg.accountId}.r2.cloudflarestorage.com`;
27
+ }
28
+ objectUrl(key) {
29
+ return `https://${this.host}/${this.cfg.bucket}/${encodeKey(key)}`;
30
+ }
31
+ async put(input) {
32
+ const url = this.objectUrl(input.key);
33
+ const payloadHash = (0, node_crypto_1.createHash)('sha256').update(input.body).digest('hex');
34
+ const headers = this.signedHeaders('PUT', new URL(url), payloadHash, {
35
+ 'content-type': input.contentType,
36
+ 'content-length': String(input.body.byteLength),
37
+ });
38
+ const res = await this.fetchImpl(url, {
39
+ method: 'PUT',
40
+ headers,
41
+ body: input.body,
42
+ signal: AbortSignal.timeout(30_000),
43
+ });
44
+ if (!res.ok) {
45
+ throw new types_js_1.StorageError(`R2 recusou o upload (HTTP ${res.status})`, res.status === 403 ? 'denied' : 'unavailable');
46
+ }
47
+ return {
48
+ key: input.key,
49
+ checksumSha256: (0, checksum_js_1.sha256Hex)(input.body),
50
+ sizeBytes: input.body.byteLength,
51
+ };
52
+ }
53
+ /**
54
+ * Presigned GET por query string (SigV4). O link carrega a assinatura e a
55
+ * expiração — nunca a credencial.
56
+ */
57
+ async getSignedUrl(key, options) {
58
+ const expires = Math.min(options?.expiresInSeconds ?? types_js_1.DEFAULT_SIGNED_URL_TTL_SECONDS, 604_800);
59
+ const url = new URL(this.objectUrl(key));
60
+ const { amzDate, dateStamp } = timestamps();
61
+ const credentialScope = `${dateStamp}/${this.cfg.region}/${SERVICE}/aws4_request`;
62
+ url.searchParams.set('X-Amz-Algorithm', 'AWS4-HMAC-SHA256');
63
+ url.searchParams.set('X-Amz-Credential', `${this.cfg.accessKeyId}/${credentialScope}`);
64
+ url.searchParams.set('X-Amz-Date', amzDate);
65
+ url.searchParams.set('X-Amz-Expires', String(expires));
66
+ url.searchParams.set('X-Amz-SignedHeaders', 'host');
67
+ if (options?.downloadFilename) {
68
+ url.searchParams.set('response-content-disposition', `attachment; filename="${options.downloadFilename.replace(/"/g, '')}"`);
69
+ }
70
+ const canonicalRequest = [
71
+ 'GET',
72
+ url.pathname,
73
+ canonicalQuery(url.searchParams),
74
+ `host:${this.host}\n`,
75
+ 'host',
76
+ UNSIGNED_PAYLOAD,
77
+ ].join('\n');
78
+ const signature = this.calculateSignature(canonicalRequest, amzDate, dateStamp, credentialScope);
79
+ url.searchParams.set('X-Amz-Signature', signature);
80
+ return url.toString();
81
+ }
82
+ async head(key) {
83
+ const url = this.objectUrl(key);
84
+ const headers = this.signedHeaders('HEAD', new URL(url), UNSIGNED_PAYLOAD, {});
85
+ const res = await this.fetchImpl(url, {
86
+ method: 'HEAD',
87
+ headers,
88
+ signal: AbortSignal.timeout(15_000),
89
+ });
90
+ if (res.status === 404)
91
+ return { exists: false };
92
+ if (!res.ok)
93
+ throw new types_js_1.StorageError(`R2 head falhou (HTTP ${res.status})`, 'unavailable');
94
+ const len = res.headers.get('content-length');
95
+ return {
96
+ exists: true,
97
+ sizeBytes: len ? Number(len) : undefined,
98
+ contentType: res.headers.get('content-type') ?? undefined,
99
+ };
100
+ }
101
+ async delete(key) {
102
+ const url = this.objectUrl(key);
103
+ const headers = this.signedHeaders('DELETE', new URL(url), UNSIGNED_PAYLOAD, {});
104
+ const res = await this.fetchImpl(url, {
105
+ method: 'DELETE',
106
+ headers,
107
+ signal: AbortSignal.timeout(15_000),
108
+ });
109
+ if (!res.ok && res.status !== 404) {
110
+ throw new types_js_1.StorageError(`R2 delete falhou (HTTP ${res.status})`, 'unavailable');
111
+ }
112
+ }
113
+ signedHeaders(method, url, payloadHash, extra) {
114
+ const { amzDate, dateStamp } = timestamps();
115
+ const credentialScope = `${dateStamp}/${this.cfg.region}/${SERVICE}/aws4_request`;
116
+ const headers = {
117
+ host: this.host,
118
+ 'x-amz-content-sha256': payloadHash,
119
+ 'x-amz-date': amzDate,
120
+ ...extra,
121
+ };
122
+ const sortedKeys = Object.keys(headers)
123
+ .map((k) => k.toLowerCase())
124
+ .sort();
125
+ const canonicalHeaders = sortedKeys.map((k) => `${k}:${headers[k].trim()}\n`).join('');
126
+ const signedHeaderList = sortedKeys.join(';');
127
+ const canonicalRequest = [
128
+ method,
129
+ url.pathname,
130
+ canonicalQuery(url.searchParams),
131
+ canonicalHeaders,
132
+ signedHeaderList,
133
+ payloadHash,
134
+ ].join('\n');
135
+ const signature = this.calculateSignature(canonicalRequest, amzDate, dateStamp, credentialScope);
136
+ return {
137
+ ...headers,
138
+ authorization: `AWS4-HMAC-SHA256 Credential=${this.cfg.accessKeyId}/${credentialScope}, ` +
139
+ `SignedHeaders=${signedHeaderList}, Signature=${signature}`,
140
+ };
141
+ }
142
+ calculateSignature(canonicalRequest, amzDate, dateStamp, credentialScope) {
143
+ const stringToSign = [
144
+ 'AWS4-HMAC-SHA256',
145
+ amzDate,
146
+ credentialScope,
147
+ (0, node_crypto_1.createHash)('sha256').update(canonicalRequest).digest('hex'),
148
+ ].join('\n');
149
+ const kDate = (0, node_crypto_1.createHmac)('sha256', `AWS4${this.cfg.secretAccessKey}`)
150
+ .update(dateStamp)
151
+ .digest();
152
+ const kRegion = (0, node_crypto_1.createHmac)('sha256', kDate).update(this.cfg.region).digest();
153
+ const kService = (0, node_crypto_1.createHmac)('sha256', kRegion).update(SERVICE).digest();
154
+ const kSigning = (0, node_crypto_1.createHmac)('sha256', kService).update('aws4_request').digest();
155
+ return (0, node_crypto_1.createHmac)('sha256', kSigning).update(stringToSign).digest('hex');
156
+ }
157
+ }
158
+ exports.R2StorageProvider = R2StorageProvider;
159
+ function timestamps() {
160
+ const amzDate = new Date().toISOString().replace(/[:-]|\.\d{3}/g, '');
161
+ return { amzDate, dateStamp: amzDate.slice(0, 8) };
162
+ }
163
+ /** Cada segmento é codificado; a barra separadora, não. */
164
+ function encodeKey(key) {
165
+ return key.split('/').map(encodeURIComponent).join('/');
166
+ }
167
+ /** SigV4 exige query ordenada e RFC3986-encoded. */
168
+ function canonicalQuery(params) {
169
+ const pairs = [];
170
+ params.forEach((value, name) => {
171
+ if (name === 'X-Amz-Signature')
172
+ return;
173
+ pairs.push([name, value]);
174
+ });
175
+ pairs.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
176
+ return pairs.map(([k, v]) => `${rfc3986(k)}=${rfc3986(v)}`).join('&');
177
+ }
178
+ function rfc3986(value) {
179
+ return encodeURIComponent(value).replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
180
+ }
181
+ //# sourceMappingURL=r2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.js","sourceRoot":"","sources":["../../../src/storage/r2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveStorageProvider = resolveStorageProvider;
4
+ exports.availableStorageProviders = availableStorageProviders;
5
+ const local_js_1 = require("./local.js");
6
+ const r2_js_1 = require("./r2.js");
7
+ const types_js_1 = require("./types.js");
8
+ function resolveStorageProvider(config = {}) {
9
+ const key = (config.provider ?? 'local').toLowerCase();
10
+ if (key === 'r2') {
11
+ const missing = [
12
+ ['DOCUMENTS_R2_ACCOUNT_ID', config.r2AccountId],
13
+ ['DOCUMENTS_R2_ACCESS_KEY_ID', config.r2AccessKeyId],
14
+ ['DOCUMENTS_R2_SECRET_ACCESS_KEY', config.r2SecretAccessKey],
15
+ ['DOCUMENTS_R2_BUCKET', config.r2Bucket],
16
+ ]
17
+ .filter(([, value]) => !value)
18
+ .map(([name]) => name);
19
+ if (missing.length > 0) {
20
+ // A mensagem nomeia as variáveis ausentes e nunca o valor de nenhuma.
21
+ throw new types_js_1.StorageError(`storage r2 selecionado mas a configuração está incompleta: ${missing.join(', ')}`, 'invalid');
22
+ }
23
+ return new r2_js_1.R2StorageProvider({
24
+ accountId: config.r2AccountId,
25
+ accessKeyId: config.r2AccessKeyId,
26
+ secretAccessKey: config.r2SecretAccessKey,
27
+ bucket: config.r2Bucket,
28
+ });
29
+ }
30
+ if (key === 'local') {
31
+ return new local_js_1.LocalStorageProvider({
32
+ rootDir: config.localRootDir ?? '.storage',
33
+ signingSecret: config.localSigningSecret ?? 'dev-only-signing-secret',
34
+ });
35
+ }
36
+ throw new types_js_1.StorageError(`storage provider desconhecido: ${key}`, 'invalid');
37
+ }
38
+ function availableStorageProviders() {
39
+ return ['local', 'r2'];
40
+ }
41
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/storage/registry.ts"],"names":[],"mappings":";;AAyBA,wDAuCC;AAED,8DAEC;AApED,yCAAkD;AAClD,mCAA4C;AAC5C,yCAAgE;AAuBhE,SAAgB,sBAAsB,CAAC,SAAwB,EAAE;IAC/D,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAEvD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,OAAO,GACX;YACE,CAAC,yBAAyB,EAAE,MAAM,CAAC,WAAW,CAAC;YAC/C,CAAC,4BAA4B,EAAE,MAAM,CAAC,aAAa,CAAC;YACpD,CAAC,gCAAgC,EAAE,MAAM,CAAC,iBAAiB,CAAC;YAC5D,CAAC,qBAAqB,EAAE,MAAM,CAAC,QAAQ,CAAC;SAE3C;aACE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC;aAC7B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAEzB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,sEAAsE;YACtE,MAAM,IAAI,uBAAY,CACpB,8DAA8D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAClF,SAAS,CACV,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,yBAAiB,CAAC;YAC3B,SAAS,EAAE,MAAM,CAAC,WAAY;YAC9B,WAAW,EAAE,MAAM,CAAC,aAAc;YAClC,eAAe,EAAE,MAAM,CAAC,iBAAkB;YAC1C,MAAM,EAAE,MAAM,CAAC,QAAS;SACzB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,+BAAoB,CAAC;YAC9B,OAAO,EAAE,MAAM,CAAC,YAAY,IAAI,UAAU;YAC1C,aAAa,EAAE,MAAM,CAAC,kBAAkB,IAAI,yBAAyB;SACtE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,uBAAY,CAAC,kCAAkC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,yBAAyB;IACvC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACzB,CAAC"}