@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.
- package/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +97 -0
- package/README.md +9 -2
- 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 +427 -48
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/company.js +36 -0
- package/dist/cjs/legal/company.js.map +1 -0
- package/dist/cjs/legal/documents.js +671 -0
- package/dist/cjs/legal/documents.js.map +1 -0
- package/dist/cjs/legal/index.js +15 -0
- package/dist/cjs/legal/index.js.map +1 -0
- package/dist/cjs/legal/types.js +34 -0
- package/dist/cjs/legal/types.js.map +1 -0
- 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 +113 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/company.d.ts +32 -0
- package/dist/legal/company.d.ts.map +1 -0
- package/dist/legal/company.js +33 -0
- package/dist/legal/company.js.map +1 -0
- package/dist/legal/documents.d.ts +30 -0
- package/dist/legal/documents.d.ts.map +1 -0
- package/dist/legal/documents.js +666 -0
- package/dist/legal/documents.js.map +1 -0
- package/dist/legal/index.d.ts +5 -0
- package/dist/legal/index.d.ts.map +1 -0
- package/dist/legal/index.js +4 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/legal/types.d.ts +145 -0
- package/dist/legal/types.d.ts.map +1 -0
- package/dist/legal/types.js +31 -0
- package/dist/legal/types.js.map +1 -0
- 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 +19 -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,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Adapter de e-mail — envelope do envio que o Office já usa.
|
|
4
|
+
*
|
|
5
|
+
* **Nenhum motor novo de e-mail.** Convites, ativação, recuperação de senha e a
|
|
6
|
+
* régua de cobrança já passam por `mail/resend.ts`. Este adapter apenas o expõe
|
|
7
|
+
* sob o contrato multicanal, para que o e-mail seja UM canal entre outros em vez
|
|
8
|
+
* de o caminho especial que todos os outros tentam imitar.
|
|
9
|
+
*
|
|
10
|
+
* A supressão em teste continua onde estava, no `sendEmail` do core: uma guarda
|
|
11
|
+
* que mora no adapter é uma guarda que o próximo adapter esquece.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.createEmailChannel = createEmailChannel;
|
|
15
|
+
const resend_js_1 = require("../../mail/resend.js");
|
|
16
|
+
const capabilities_js_1 = require("../capabilities.js");
|
|
17
|
+
/**
|
|
18
|
+
* O que o Resend garante, e o que este adapter exerce.
|
|
19
|
+
*
|
|
20
|
+
* `supportsProviderIdempotency` é `true` porque o adapter MANDA a chave, não
|
|
21
|
+
* porque a documentação do fornecedor a menciona: a declaração descreve o código
|
|
22
|
+
* daqui. Enquanto a chave não era repassada — o estado que a segunda
|
|
23
|
+
* certificação encontrou —, declarar `true` teria sido documentar uma proteção
|
|
24
|
+
* inexistente.
|
|
25
|
+
*
|
|
26
|
+
* Os outros três são `false` por ausência de integração, não por ausência do
|
|
27
|
+
* fornecedor. O Resend publica webhooks de entrega e relata abertura; nenhuma
|
|
28
|
+
* rota daqui os consome hoje (a rota de callback existente é da Meta). Declarar a
|
|
29
|
+
* capacidade do fornecedor em vez da capacidade do código produziria exatamente
|
|
30
|
+
* a divergência entre documento e runtime que reprovou a rodada anterior.
|
|
31
|
+
*/
|
|
32
|
+
const RESEND_CAPABILITIES = {
|
|
33
|
+
supportsProviderIdempotency: true,
|
|
34
|
+
providerIdempotencyWindowMs: capabilities_js_1.RESEND_IDEMPOTENCY_WINDOW_MS,
|
|
35
|
+
supportsMessageLookup: false,
|
|
36
|
+
supportsDeliveryWebhook: false,
|
|
37
|
+
supportsReadReceipt: false,
|
|
38
|
+
};
|
|
39
|
+
function createEmailChannel(config) {
|
|
40
|
+
return {
|
|
41
|
+
key: 'email',
|
|
42
|
+
providerName: 'resend',
|
|
43
|
+
capabilities: RESEND_CAPABILITIES,
|
|
44
|
+
isConfigured(_ctx) {
|
|
45
|
+
return config.account.status === 'active' && Boolean(config.account.senderId);
|
|
46
|
+
},
|
|
47
|
+
async send(message) {
|
|
48
|
+
if (message.content.kind !== 'email') {
|
|
49
|
+
return { kind: 'permanent', code: 'content_mismatch', detail: 'conteúdo não é e-mail' };
|
|
50
|
+
}
|
|
51
|
+
const apiKey = await config.resolveCredential(config.account.credentialRef);
|
|
52
|
+
if (!apiKey) {
|
|
53
|
+
// Ausência de credencial é canal indisponível, não falha de entrega: não
|
|
54
|
+
// gasta tentativa e não marca o cliente como problema de cadastro.
|
|
55
|
+
return { kind: 'unavailable', code: 'no_credential', detail: 'credencial ausente' };
|
|
56
|
+
}
|
|
57
|
+
const from = config.account.displayName
|
|
58
|
+
? `${config.account.displayName.replace(/["<>\\]/g, '').trim()} <${config.account.senderId}>`
|
|
59
|
+
: config.account.senderId;
|
|
60
|
+
const result = await (0, resend_js_1.sendEmailWithResult)(apiKey, {
|
|
61
|
+
from,
|
|
62
|
+
to: message.to,
|
|
63
|
+
subject: message.content.subject,
|
|
64
|
+
html: message.content.html,
|
|
65
|
+
text: message.content.text,
|
|
66
|
+
}, {
|
|
67
|
+
/*
|
|
68
|
+
* A chave do MOTOR, repassada ao provider.
|
|
69
|
+
*
|
|
70
|
+
* É a mesma em toda tentativa técnica do mesmo envio, porque é derivada
|
|
71
|
+
* da intenção (tenant, produto, marca, canal, evento, assunto, versão
|
|
72
|
+
* de template) e não da tentativa. Derivá-la aqui, ou embaralhá-la com
|
|
73
|
+
* um contador de retry, teria o mecanismo ligado e proteção nenhuma: o
|
|
74
|
+
* provider trataria cada retry como mensagem nova.
|
|
75
|
+
*
|
|
76
|
+
* Cabe no limite do provider por construção — a chave é um sha256 em
|
|
77
|
+
* hexadecimal, 64 caracteres, e o Resend aceita de 1 a 256.
|
|
78
|
+
*/
|
|
79
|
+
idempotencyKey: message.idempotencyKey,
|
|
80
|
+
fetchImpl: config.fetchImpl,
|
|
81
|
+
});
|
|
82
|
+
if (result.ok)
|
|
83
|
+
return { kind: 'sent', providerRef: result.providerRef };
|
|
84
|
+
/*
|
|
85
|
+
* `409` é o mecanismo de idempotência falando, e a leitura correta não é
|
|
86
|
+
* "falhou".
|
|
87
|
+
*
|
|
88
|
+
* `invalid_idempotent_request`: esta chave já foi usada nas últimas 24h com
|
|
89
|
+
* um corpo diferente. Ou seja — houve uma chamada anterior aceita para esta
|
|
90
|
+
* mesma intenção. A mensagem SAIU. Tratar como falha devolveria a chave e a
|
|
91
|
+
* próxima rodada mandaria a segunda cobrança, que é precisamente o que a
|
|
92
|
+
* chave existe para impedir.
|
|
93
|
+
*
|
|
94
|
+
* `concurrent_idempotent_requests`: outra chamada com a mesma chave está em
|
|
95
|
+
* curso agora. Não é nosso caso comum (a reserva interna já barra isso
|
|
96
|
+
* antes), mas se acontecer, quem está enviando é a outra chamada — e
|
|
97
|
+
* reenviar por cima é o mesmo erro.
|
|
98
|
+
*/
|
|
99
|
+
if (result.status === 409) {
|
|
100
|
+
return {
|
|
101
|
+
kind: 'sent',
|
|
102
|
+
code: 'provider_idempotent_replay',
|
|
103
|
+
detail: 'provider já havia aceito esta chave',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Chave fora do formato aceito é defeito de integração nosso, não do
|
|
107
|
+
// destinatário. `permanent` para não repetir a mesma chamada inválida em
|
|
108
|
+
// loop; o rótulo diz onde olhar.
|
|
109
|
+
if (result.errorCode === 'invalid_idempotency_key') {
|
|
110
|
+
return {
|
|
111
|
+
kind: 'permanent',
|
|
112
|
+
code: 'invalid_idempotency_key',
|
|
113
|
+
detail: 'chave de idempotência recusada pelo provider',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// Sem credencial o canal está indisponível, não falho: não gasta tentativa
|
|
117
|
+
// e não acusa o cadastro do cliente.
|
|
118
|
+
if (result.localReason === 'no_credential') {
|
|
119
|
+
return { kind: 'unavailable', code: 'no_credential', detail: 'credencial ausente' };
|
|
120
|
+
}
|
|
121
|
+
// O resto — recusa do provider, supressão em teste, falha de rede — é
|
|
122
|
+
// TEMPORÁRIO. Marcar permanente encerraria a cobrança por algo que pode ser
|
|
123
|
+
// infraestrutura, e desistir cedo demais é pior que tentar de novo.
|
|
124
|
+
return {
|
|
125
|
+
kind: 'temporary',
|
|
126
|
+
code: result.errorCode ?? result.localReason ?? 'not_confirmed',
|
|
127
|
+
detail: 'provider não confirmou o envio',
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../../src/communication/adapters/email.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AA8CH,gDAyGC;AArJD,oDAA2D;AAE3D,wDAAkE;AAKlE;;;;;;;;;;;;;;GAcG;AACH,MAAM,mBAAmB,GAAwB;IAC/C,2BAA2B,EAAE,IAAI;IACjC,2BAA2B,EAAE,8CAA4B;IACzD,qBAAqB,EAAE,KAAK;IAC5B,uBAAuB,EAAE,KAAK;IAC9B,mBAAmB,EAAE,KAAK;CAC3B,CAAC;AAgBF,SAAgB,kBAAkB,CAAC,MAA0B;IAC3D,OAAO;QACL,GAAG,EAAE,OAAO;QACZ,YAAY,EAAE,QAAQ;QACtB,YAAY,EAAE,mBAAmB;QAEjC,YAAY,CAAC,IAA0B;YACrC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChF,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAwB;YACjC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;YAC1F,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC5E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,yEAAyE;gBACzE,mEAAmE;gBACnE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YACtF,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW;gBACrC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG;gBAC7F,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAE5B,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAmB,EACtC,MAAM,EACN;gBACE,IAAI;gBACJ,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;gBAChC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;gBAC1B,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;aAC3B,EACD;gBACE;;;;;;;;;;;mBAWG;gBACH,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CACF,CAAC;YAEF,IAAI,MAAM,CAAC,EAAE;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;YAExE;;;;;;;;;;;;;;eAcG;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,OAAO;oBACL,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,4BAA4B;oBAClC,MAAM,EAAE,qCAAqC;iBAC9C,CAAC;YACJ,CAAC;YAED,qEAAqE;YACrE,yEAAyE;YACzE,iCAAiC;YACjC,IAAI,MAAM,CAAC,SAAS,KAAK,yBAAyB,EAAE,CAAC;gBACnD,OAAO;oBACL,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,yBAAyB;oBAC/B,MAAM,EAAE,8CAA8C;iBACvD,CAAC;YACJ,CAAC;YAED,2EAA2E;YAC3E,qCAAqC;YACrC,IAAI,MAAM,CAAC,WAAW,KAAK,eAAe,EAAE,CAAC;gBAC3C,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YACtF,CAAC;YAED,sEAAsE;YACtE,4EAA4E;YAC5E,oEAAoE;YACpE,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,IAAI,eAAe;gBAC/D,MAAM,EAAE,gCAAgC;aACzC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Adapter de SMS — provider-agnostic por construção.
|
|
4
|
+
*
|
|
5
|
+
* Nenhum provider está contratado, e este arquivo não escolhe um. Ele define o
|
|
6
|
+
* TRANSPORTE que qualquer provider precisa implementar e deixa a escolha para o
|
|
7
|
+
* dia em que houver decisão comercial — Twilio, Zenvia, Infobip, o que for.
|
|
8
|
+
*
|
|
9
|
+
* A separação entre "canal" e "transporte" existe porque SMS tem regras próprias
|
|
10
|
+
* que valem para TODOS os providers (segmentação por tamanho, remetente
|
|
11
|
+
* alfanumérico proibido no Brasil, ausência de status `read`) e que não deveriam
|
|
12
|
+
* ser reimplementadas por cada adapter concreto. O canal cuida disso; o
|
|
13
|
+
* transporte só entrega bytes.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.isGsm7 = isGsm7;
|
|
17
|
+
exports.countSegments = countSegments;
|
|
18
|
+
exports.createSmsChannel = createSmsChannel;
|
|
19
|
+
exports.createRecordingSmsTransport = createRecordingSmsTransport;
|
|
20
|
+
const capabilities_js_1 = require("../capabilities.js");
|
|
21
|
+
/**
|
|
22
|
+
* Limite de um segmento GSM-7. Acima disso a mensagem é dividida e **cobrada por
|
|
23
|
+
* segmento** — cada provider com sua própria contagem.
|
|
24
|
+
*
|
|
25
|
+
* Com qualquer caractere fora do alfabeto GSM-7 (o `ç` de "cobrança", o `ã` de
|
|
26
|
+
* "atenção", qualquer emoji) a codificação inteira vira UCS-2 e o limite cai
|
|
27
|
+
* para 70. É por isso que a contagem não pode ser um `length > 160` ingênuo: um
|
|
28
|
+
* texto de 150 caracteres com um acento custa três segmentos, não um.
|
|
29
|
+
*/
|
|
30
|
+
const GSM7_SINGLE = 160;
|
|
31
|
+
const GSM7_MULTI = 153;
|
|
32
|
+
const UCS2_SINGLE = 70;
|
|
33
|
+
const UCS2_MULTI = 67;
|
|
34
|
+
const GSM7_EXTRA = '^{}\\[~]|€';
|
|
35
|
+
const GSM7_BASE = '@£$¥èéùìòÇØøÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !"#¤%&\'()*+,-./0123456789:;<=>?' +
|
|
36
|
+
'¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà\n\r';
|
|
37
|
+
function isGsm7(text) {
|
|
38
|
+
for (const ch of text) {
|
|
39
|
+
if (!GSM7_BASE.includes(ch) && !GSM7_EXTRA.includes(ch))
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
/** Quantos segmentos este texto custa. É o que vira dinheiro na fatura. */
|
|
45
|
+
function countSegments(text) {
|
|
46
|
+
if (text.length === 0)
|
|
47
|
+
return 0;
|
|
48
|
+
const gsm = isGsm7(text);
|
|
49
|
+
// Caracteres da tabela estendida ocupam DOIS septetos.
|
|
50
|
+
const units = gsm
|
|
51
|
+
? [...text].reduce((n, ch) => n + (GSM7_EXTRA.includes(ch) ? 2 : 1), 0)
|
|
52
|
+
: [...text].length;
|
|
53
|
+
const single = gsm ? GSM7_SINGLE : UCS2_SINGLE;
|
|
54
|
+
const multi = gsm ? GSM7_MULTI : UCS2_MULTI;
|
|
55
|
+
return units <= single ? 1 : Math.ceil(units / multi);
|
|
56
|
+
}
|
|
57
|
+
function createSmsChannel(config) {
|
|
58
|
+
const maxSegments = config.maxSegments ?? 3;
|
|
59
|
+
return {
|
|
60
|
+
key: 'sms',
|
|
61
|
+
providerName: config.transport.name,
|
|
62
|
+
/*
|
|
63
|
+
* As garantias vêm do TRANSPORTE, e o default é nenhuma.
|
|
64
|
+
*
|
|
65
|
+
* Nenhum provider de SMS está contratado. A garantia de idempotência depende
|
|
66
|
+
* de qual for escolhido, e o canal não tem como saber antes — por isso ele
|
|
67
|
+
* não afirma nada por conta própria: quem implementar o transporte declara o
|
|
68
|
+
* que aquele provider realmente faz, e o silêncio significa ausência.
|
|
69
|
+
*
|
|
70
|
+
* Enquanto isso, o efeito no motor é o correto e conservador: uma reserva de
|
|
71
|
+
* SMS retomada de um titular que já falou com o provider para em
|
|
72
|
+
* `unknown_outcome` em vez de reenviar às cegas.
|
|
73
|
+
*/
|
|
74
|
+
capabilities: config.transport.capabilities ?? capabilities_js_1.NO_PROVIDER_GUARANTEES,
|
|
75
|
+
isConfigured(_ctx) {
|
|
76
|
+
return config.account.status === 'active' && Boolean(config.account.senderId);
|
|
77
|
+
},
|
|
78
|
+
async send(message) {
|
|
79
|
+
if (!config.liveSend) {
|
|
80
|
+
return {
|
|
81
|
+
kind: 'unavailable',
|
|
82
|
+
code: 'live_send_disabled',
|
|
83
|
+
detail: 'envio real de SMS não autorizado neste ambiente',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (message.content.kind !== 'text') {
|
|
87
|
+
return { kind: 'permanent', code: 'content_mismatch', detail: 'SMS aceita apenas texto' };
|
|
88
|
+
}
|
|
89
|
+
const segments = countSegments(message.content.body);
|
|
90
|
+
if (segments > maxSegments) {
|
|
91
|
+
return {
|
|
92
|
+
kind: 'permanent',
|
|
93
|
+
code: 'too_many_segments',
|
|
94
|
+
detail: `mensagem custaria ${segments} segmentos (teto ${maxSegments})`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const result = await config.transport.send({
|
|
98
|
+
to: message.to,
|
|
99
|
+
from: config.account.senderId,
|
|
100
|
+
body: message.content.body,
|
|
101
|
+
idempotencyKey: message.idempotencyKey,
|
|
102
|
+
});
|
|
103
|
+
if (result.ok)
|
|
104
|
+
return { kind: 'sent', providerRef: result.providerRef };
|
|
105
|
+
return { kind: result.kind, code: result.code, detail: result.detail };
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Transporte de ensaio — registra o que teria enviado e nunca alcança rede.
|
|
111
|
+
*
|
|
112
|
+
* Serve ao dry-run e aos testes, e é o que permite exercitar segmentação, custo
|
|
113
|
+
* e isolamento sem provider contratado. Não simula entrega para o motor: quem
|
|
114
|
+
* decide se houve envio é a trava `liveSend`, não este objeto.
|
|
115
|
+
*/
|
|
116
|
+
function createRecordingSmsTransport() {
|
|
117
|
+
const sent = [];
|
|
118
|
+
return {
|
|
119
|
+
name: 'recording',
|
|
120
|
+
sent,
|
|
121
|
+
async send(req) {
|
|
122
|
+
sent.push(req);
|
|
123
|
+
return { ok: true, providerRef: `rec_${sent.length}` };
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=sms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sms.js","sourceRoot":"","sources":["../../../../src/communication/adapters/sms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* O código de idioma como a Meta o escreve.
|
|
4
|
+
*
|
|
5
|
+
* ## O defeito que este módulo existe para não repetir
|
|
6
|
+
*
|
|
7
|
+
* O domínio fala BCP-47 (`pt-BR`), que é a forma correta para um catálogo de
|
|
8
|
+
* templates que um dia terá outros providers. A Meta escreve `pt_BR`, com
|
|
9
|
+
* underscore, e recusa qualquer outra grafia.
|
|
10
|
+
*
|
|
11
|
+
* Enquanto não havia um ponto único de tradução, as duas pontas escolheram
|
|
12
|
+
* convenções diferentes sozinhas: a submissão registrou o template como
|
|
13
|
+
* `pt_BR` e o despacho pediu `pt-BR`. O primeiro envio real do produto morreu
|
|
14
|
+
* exatamente aí, em 2026-09-01, com
|
|
15
|
+
* `(#132001) Template name does not exist in the translation` — uma mensagem
|
|
16
|
+
* que fala de tradução e parece falar de template inexistente.
|
|
17
|
+
*
|
|
18
|
+
* A conversão mora no ADAPTER porque é detalhe de provider, como o
|
|
19
|
+
* `UTILITY` maiúsculo de `whatsapp-templates.ts`. Colocá-la no catálogo faria o
|
|
20
|
+
* domínio carregar a grafia da Meta, e o próximo provider herdaria um `pt_BR`
|
|
21
|
+
* que não significa nada para ele.
|
|
22
|
+
*
|
|
23
|
+
* Este arquivo não fala com rede nenhuma — é tradução pura, e o guard de
|
|
24
|
+
* fronteira em `communication-provider-boundary.test.ts` exige que continue
|
|
25
|
+
* assim.
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.metaLanguageCode = metaLanguageCode;
|
|
29
|
+
/**
|
|
30
|
+
* `pt-BR` → `pt_BR`. Idempotente: o que já está na forma da Meta passa igual.
|
|
31
|
+
*
|
|
32
|
+
* Não valida: um idioma que a Meta não conhece é recusado por ela, com o código
|
|
33
|
+
* dela, e inventar uma lista aqui significaria mantê-la sincronizada com um
|
|
34
|
+
* catálogo que muda sem avisar.
|
|
35
|
+
*/
|
|
36
|
+
function metaLanguageCode(locale) {
|
|
37
|
+
return locale.replace(/-/g, '_');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=whatsapp-language.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp-language.js","sourceRoot":"","sources":["../../../../src/communication/adapters/whatsapp-language.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;;AASH,4CAEC;AATD;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gestão de template no WhatsApp — adapter da Meta Cloud API.
|
|
4
|
+
*
|
|
5
|
+
* Implementa `TemplateManagementProvider`. Todo o vocabulário da Meta mora
|
|
6
|
+
* aqui: `components`, `BODY`, `example.body_text`, categorias em maiúsculas,
|
|
7
|
+
* `POST /{waba-id}/message_templates`. O domínio não conhece nenhum deles.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createWhatsAppTemplateProvider = createWhatsAppTemplateProvider;
|
|
11
|
+
const graph_js_1 = require("../graph.js");
|
|
12
|
+
const whatsapp_language_js_1 = require("./whatsapp-language.js");
|
|
13
|
+
const TIMEOUT_MS = 20_000;
|
|
14
|
+
/** O domínio fala minúsculo; a Meta espera maiúsculo. A tradução mora aqui. */
|
|
15
|
+
const CATEGORY = {
|
|
16
|
+
utility: 'UTILITY',
|
|
17
|
+
marketing: 'MARKETING',
|
|
18
|
+
authentication: 'AUTHENTICATION',
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Classificação do erro da Meta.
|
|
22
|
+
*
|
|
23
|
+
* `duplicate_name` merece classe própria porque é o desfecho ESPERADO de uma
|
|
24
|
+
* resubmissão — quem chama trata como "já existe", relê e segue, em vez de
|
|
25
|
+
* tratar como falha e tentar de novo.
|
|
26
|
+
*/
|
|
27
|
+
function classify(status, code, subcode) {
|
|
28
|
+
if (code === 190 || code === 200 || code === 10 || code === 3)
|
|
29
|
+
return 'unauthorized';
|
|
30
|
+
// 2388023 / subcode 2388024: nome de template já em uso na conta.
|
|
31
|
+
if (code === 2388023 || subcode === 2388024)
|
|
32
|
+
return 'duplicate_name';
|
|
33
|
+
if (code === 4 || code === 80007 || status === 429)
|
|
34
|
+
return 'rate_limited';
|
|
35
|
+
if (status >= 500)
|
|
36
|
+
return 'network';
|
|
37
|
+
if (code === 100 || code === 132000)
|
|
38
|
+
return 'invalid_content';
|
|
39
|
+
return 'provider_error';
|
|
40
|
+
}
|
|
41
|
+
function createWhatsAppTemplateProvider(config) {
|
|
42
|
+
const doFetch = config.fetchImpl ?? fetch;
|
|
43
|
+
return {
|
|
44
|
+
channel: 'whatsapp',
|
|
45
|
+
async submit(submission) {
|
|
46
|
+
const body = {
|
|
47
|
+
name: submission.name,
|
|
48
|
+
language: (0, whatsapp_language_js_1.metaLanguageCode)(submission.language),
|
|
49
|
+
category: CATEGORY[submission.category],
|
|
50
|
+
components: [
|
|
51
|
+
{
|
|
52
|
+
type: 'BODY',
|
|
53
|
+
text: submission.bodyText,
|
|
54
|
+
// `body_text` é uma lista de listas: uma linha de exemplos por
|
|
55
|
+
// conjunto de variáveis do corpo. Omitido quando não há variável —
|
|
56
|
+
// um `example` vazio é recusado.
|
|
57
|
+
...(submission.bodyExample && submission.bodyExample.length > 0
|
|
58
|
+
? { example: { body_text: [submission.bodyExample] } }
|
|
59
|
+
: {}),
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
let res;
|
|
64
|
+
try {
|
|
65
|
+
res = await doFetch((0, graph_js_1.graphUrl)(`${encodeURIComponent(config.wabaId)}/message_templates`, config.env), {
|
|
66
|
+
method: 'POST',
|
|
67
|
+
headers: {
|
|
68
|
+
authorization: `Bearer ${config.accessToken}`,
|
|
69
|
+
'content-type': 'application/json',
|
|
70
|
+
},
|
|
71
|
+
body: JSON.stringify(body),
|
|
72
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Nada da exceção é propagado: em algumas implementações de `fetch` a
|
|
77
|
+
// mensagem inclui a URL, e a URL leva o token no header — mas o corpo
|
|
78
|
+
// do erro também pode ecoar cabeçalhos em proxies.
|
|
79
|
+
return { ok: false, reason: 'network' };
|
|
80
|
+
}
|
|
81
|
+
const payload = (await res.json().catch(() => null));
|
|
82
|
+
if (!res.ok) {
|
|
83
|
+
const err = (payload?.error ?? {});
|
|
84
|
+
return { ok: false, reason: classify(res.status, err.code, err.error_subcode) };
|
|
85
|
+
}
|
|
86
|
+
const id = payload?.id;
|
|
87
|
+
const status = payload?.status;
|
|
88
|
+
const category = payload?.category;
|
|
89
|
+
return {
|
|
90
|
+
ok: true,
|
|
91
|
+
...(typeof id === 'string' ? { providerRef: id } : {}),
|
|
92
|
+
// Sem `status` no corpo, o desfecho honesto é "submetido, revisão
|
|
93
|
+
// pendente" — e não inventar `APPROVED`.
|
|
94
|
+
status: typeof status === 'string' ? status : 'PENDING',
|
|
95
|
+
...(typeof category === 'string' ? { category } : {}),
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=whatsapp-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp-templates.js","sourceRoot":"","sources":["../../../../src/communication/adapters/whatsapp-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Adapter de WhatsApp — Meta Cloud API.
|
|
4
|
+
*
|
|
5
|
+
* O provider é escolha desta implementação, não do domínio: o consumidor pede
|
|
6
|
+
* `channel: 'whatsapp'` e nunca vê `wamid`, `phoneNumberId` nem código de erro
|
|
7
|
+
* da Meta. Trocar por Twilio ou Zenvia é escrever outro arquivo deste tamanho e
|
|
8
|
+
* registrar outro adapter — nenhuma linha de régua muda.
|
|
9
|
+
*
|
|
10
|
+
* **Trava de envio real.** Enquanto `liveSend` não for explicitamente ligado, o
|
|
11
|
+
* adapter recusa com `unavailable` ANTES de qualquer rede. A trava é do código,
|
|
12
|
+
* não do processo: uma frente que promete "não enviar mensagem real" e depende
|
|
13
|
+
* de ninguém chamar a função errada não prometeu nada.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.createWhatsAppChannel = createWhatsAppChannel;
|
|
17
|
+
const graph_js_1 = require("../graph.js");
|
|
18
|
+
const whatsapp_language_js_1 = require("./whatsapp-language.js");
|
|
19
|
+
/**
|
|
20
|
+
* O que a Meta Cloud API garante, e o que este adapter exerce.
|
|
21
|
+
*
|
|
22
|
+
* **Sem idempotência de provider.** A referência da Cloud API não documenta
|
|
23
|
+
* cabeçalho de idempotência nem parâmetro equivalente; o `wamid` é identificador
|
|
24
|
+
* de mensagem devolvido DEPOIS do aceite, que é outra coisa — ele não impede a
|
|
25
|
+
* segunda chamada de virar a segunda mensagem.
|
|
26
|
+
*
|
|
27
|
+
* A consequência prática está no motor, não aqui: uma reserva de WhatsApp retomada
|
|
28
|
+
* de um titular que já tinha chamado a Meta **não é reenviada**. Ela para em
|
|
29
|
+
* `unknown_outcome`, visível para quem opera. Inventar uma chave que a Meta não lê
|
|
30
|
+
* daria a aparência da proteção sem nada por trás — que é pior que não ter.
|
|
31
|
+
*
|
|
32
|
+
* `supportsDeliveryWebhook` é `true` porque a rota de callback da Meta existe e é
|
|
33
|
+
* exercida (`routes/communication-webhooks.ts`); `supportsReadReceipt` também,
|
|
34
|
+
* porque `read` é um dos status que ela trata.
|
|
35
|
+
*/
|
|
36
|
+
const META_CLOUD_CAPABILITIES = {
|
|
37
|
+
supportsProviderIdempotency: false,
|
|
38
|
+
supportsMessageLookup: false,
|
|
39
|
+
supportsDeliveryWebhook: true,
|
|
40
|
+
supportsReadReceipt: true,
|
|
41
|
+
};
|
|
42
|
+
/*
|
|
43
|
+
* A versão da Graph API mora em `../graph.ts`, e não aqui.
|
|
44
|
+
*
|
|
45
|
+
* Este arquivo declarava `v21.0` — de 2024-10, no fim da janela de dois anos em
|
|
46
|
+
* que a Meta mantém uma versão viva. Duas versões no mesmo runtime não falham
|
|
47
|
+
* quando divergem: falham quando a mais velha é desativada, e o sintoma é meio
|
|
48
|
+
* canal parado enquanto o resto funciona.
|
|
49
|
+
*/
|
|
50
|
+
const TIMEOUT_MS = 10_000;
|
|
51
|
+
/**
|
|
52
|
+
* Classificação dos códigos de erro da Meta.
|
|
53
|
+
*
|
|
54
|
+
* A distinção que mais importa não é temporário × permanente — é **problema do
|
|
55
|
+
* destinatário × problema nosso**. Um token expirado (190) devolvido como
|
|
56
|
+
* `permanent` marcaria o CLIENTE como contato inválido e o tiraria da régua para
|
|
57
|
+
* sempre, quando o defeito é uma credencial nossa que alguém precisa renovar.
|
|
58
|
+
* Por isso erro de configuração vira `unavailable`: não gasta tentativa, não
|
|
59
|
+
* acusa o cliente, e aparece na tela como pendência do escritório.
|
|
60
|
+
*/
|
|
61
|
+
function classify(code, subcode) {
|
|
62
|
+
// Credencial/permissão/configuração — nosso problema, não do destinatário.
|
|
63
|
+
if (code === 190 || code === 200 || code === 10 || code === 3)
|
|
64
|
+
return 'unavailable';
|
|
65
|
+
if (code === 100 && subcode === 33)
|
|
66
|
+
return 'unavailable';
|
|
67
|
+
// Limites de taxa — sempre vale tentar de novo.
|
|
68
|
+
if (code === 4 || code === 80007 || code === 130429 || code === 131048 || code === 131056) {
|
|
69
|
+
return 'temporary';
|
|
70
|
+
}
|
|
71
|
+
// Falhas internas da plataforma.
|
|
72
|
+
if (code === 1 || code === 2 || code === 131000)
|
|
73
|
+
return 'temporary';
|
|
74
|
+
// Destinatário: não tem WhatsApp, número inexistente, recusa de entrega.
|
|
75
|
+
if (code === 131026 || code === 131052 || code === 133010)
|
|
76
|
+
return 'permanent';
|
|
77
|
+
// Fora da janela de sessão sem template válido, e problemas de template.
|
|
78
|
+
if (code === 131047 || (code >= 132000 && code <= 132015))
|
|
79
|
+
return 'permanent';
|
|
80
|
+
// Parâmetro inválido é defeito de integração; retry repetiria o mesmo erro.
|
|
81
|
+
if (code === 100)
|
|
82
|
+
return 'permanent';
|
|
83
|
+
// Código desconhecido: `temporary`. Um erro novo da Meta tratado como
|
|
84
|
+
// permanente removeria o cliente da régua em definitivo por algo que ninguém
|
|
85
|
+
// ainda entendeu — o dano de tentar de novo é muito menor.
|
|
86
|
+
return 'temporary';
|
|
87
|
+
}
|
|
88
|
+
function createWhatsAppChannel(config) {
|
|
89
|
+
const doFetch = config.fetchImpl ?? fetch;
|
|
90
|
+
return {
|
|
91
|
+
key: 'whatsapp',
|
|
92
|
+
providerName: 'meta_cloud',
|
|
93
|
+
capabilities: META_CLOUD_CAPABILITIES,
|
|
94
|
+
isConfigured(_ctx) {
|
|
95
|
+
return (config.account.status === 'active' &&
|
|
96
|
+
Boolean(config.account.meta?.phoneNumberId) &&
|
|
97
|
+
Boolean(config.account.senderId));
|
|
98
|
+
},
|
|
99
|
+
async send(message) {
|
|
100
|
+
if (!config.liveSend) {
|
|
101
|
+
return {
|
|
102
|
+
kind: 'unavailable',
|
|
103
|
+
code: 'live_send_disabled',
|
|
104
|
+
detail: 'envio real de WhatsApp não autorizado neste ambiente',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const phoneNumberId = config.account.meta?.phoneNumberId;
|
|
108
|
+
if (!phoneNumberId) {
|
|
109
|
+
return {
|
|
110
|
+
kind: 'unavailable',
|
|
111
|
+
code: 'no_phone_number_id',
|
|
112
|
+
detail: 'conta sem phoneNumberId',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const token = await config.resolveCredential(config.account.credentialRef);
|
|
116
|
+
if (!token) {
|
|
117
|
+
return { kind: 'unavailable', code: 'no_credential', detail: 'credencial ausente' };
|
|
118
|
+
}
|
|
119
|
+
const body = buildBody(message);
|
|
120
|
+
if (!body) {
|
|
121
|
+
return {
|
|
122
|
+
kind: 'permanent',
|
|
123
|
+
code: 'content_mismatch',
|
|
124
|
+
detail: 'conteúdo inválido para WhatsApp',
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
let res;
|
|
128
|
+
try {
|
|
129
|
+
res = await doFetch((0, graph_js_1.graphUrl)(`${encodeURIComponent(phoneNumberId)}/messages`), {
|
|
130
|
+
method: 'POST',
|
|
131
|
+
headers: {
|
|
132
|
+
authorization: `Bearer ${token}`,
|
|
133
|
+
'content-type': 'application/json',
|
|
134
|
+
},
|
|
135
|
+
body: JSON.stringify(body),
|
|
136
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Timeout e falha de rede nunca carregam a causa real do lado do
|
|
141
|
+
// provider — e a mensagem da exceção pode conter a URL com credencial
|
|
142
|
+
// embutida em algumas implementações. Não propaga nada dela.
|
|
143
|
+
return { kind: 'temporary', code: 'network', detail: 'falha de rede ao chamar o provider' };
|
|
144
|
+
}
|
|
145
|
+
if (res.ok) {
|
|
146
|
+
const payload = (await res.json().catch(() => null));
|
|
147
|
+
const providerRef = payload?.messages?.[0]?.id;
|
|
148
|
+
// `sent` = a Meta aceitou. NÃO é entrega: quem afirma entrega é o
|
|
149
|
+
// webhook, depois. Ver `status.ts`.
|
|
150
|
+
return { kind: 'sent', providerRef };
|
|
151
|
+
}
|
|
152
|
+
const err = (await res
|
|
153
|
+
.json()
|
|
154
|
+
.then((b) => typeof b === 'object' && b !== null && 'error' in b
|
|
155
|
+
? (b.error ?? {})
|
|
156
|
+
: {})
|
|
157
|
+
.catch(() => ({})));
|
|
158
|
+
const code = err.code ?? res.status;
|
|
159
|
+
const kind = res.status >= 500 ? 'temporary' : classify(code, err.error_subcode);
|
|
160
|
+
return {
|
|
161
|
+
kind,
|
|
162
|
+
code: `meta_${code}`,
|
|
163
|
+
// Só a mensagem do provider, truncada. Nunca o corpo enviado (carrega as
|
|
164
|
+
// variáveis do template, que são PII) e nunca os headers.
|
|
165
|
+
detail: (err.message ?? `HTTP ${res.status}`).slice(0, 200),
|
|
166
|
+
};
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function buildBody(message) {
|
|
171
|
+
const to = message.to.replace(/^\+/, '');
|
|
172
|
+
if (message.content.kind === 'whatsapp_template') {
|
|
173
|
+
const { templateName, language, variables } = message.content;
|
|
174
|
+
return {
|
|
175
|
+
messaging_product: 'whatsapp',
|
|
176
|
+
recipient_type: 'individual',
|
|
177
|
+
to,
|
|
178
|
+
type: 'template',
|
|
179
|
+
template: {
|
|
180
|
+
name: templateName,
|
|
181
|
+
// A Meta escreve `pt_BR`; o domínio, `pt-BR`. A tradução é do adapter.
|
|
182
|
+
language: { code: (0, whatsapp_language_js_1.metaLanguageCode)(language) },
|
|
183
|
+
// `components` só entra quando há variável: um template sem parâmetro
|
|
184
|
+
// recebendo `parameters: []` é recusado pela Meta.
|
|
185
|
+
...(variables.length > 0
|
|
186
|
+
? {
|
|
187
|
+
components: [
|
|
188
|
+
{
|
|
189
|
+
type: 'body',
|
|
190
|
+
parameters: variables.map((text) => ({ type: 'text', text })),
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
}
|
|
194
|
+
: {}),
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
if (message.content.kind === 'text') {
|
|
199
|
+
// Texto livre só é aceito DENTRO da janela de 24h aberta pelo cliente. O
|
|
200
|
+
// motor não tem como saber se a janela está aberta — e por isso este caminho
|
|
201
|
+
// existe para resposta a conversa iniciada pelo cliente, nunca para
|
|
202
|
+
// cobrança ativa, que é sempre template.
|
|
203
|
+
return {
|
|
204
|
+
messaging_product: 'whatsapp',
|
|
205
|
+
recipient_type: 'individual',
|
|
206
|
+
to,
|
|
207
|
+
type: 'text',
|
|
208
|
+
text: { preview_url: false, body: message.content.body },
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=whatsapp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../../src/communication/adapters/whatsapp.ts"],"names":[],"mappings":"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"}
|