@baruk/core 0.3.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +85 -0
- package/dist/auth/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +39 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +75 -10
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +334 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +707 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +89 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +161 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +90 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +148 -19
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/auth/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +75 -9
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +728 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +170 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +150 -18
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/repository.js +96 -20
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +140 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +193 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +414 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +147 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +161 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +483 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- package/dist/cjs/competence/repository.js +309 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/index.js +406 -39
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +125 -3
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/types.js +1 -0
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +67 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +57 -8
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/users/repository.js +119 -2
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/repository.d.ts +42 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +94 -21
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +72 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +136 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- package/dist/collection/communication-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +95 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +187 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +177 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +407 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +53 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +141 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- package/dist/communication/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +158 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +153 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +480 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +99 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- package/dist/competence/repository.d.ts +147 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +294 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- package/dist/db/migrate.js +17 -11
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/index.d.ts +109 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +125 -3
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +1 -1
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/types.d.ts +32 -1
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js +1 -0
- package/dist/legal/types.js.map +1 -1
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +67 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +17 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +57 -8
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.js.map +1 -1
- package/dist/tenancy/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/users/repository.d.ts +38 -0
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +118 -3
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +13 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- package/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- 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"}
|