@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,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter de SMS — provider-agnostic por construção.
|
|
3
|
+
*
|
|
4
|
+
* Nenhum provider está contratado, e este arquivo não escolhe um. Ele define o
|
|
5
|
+
* TRANSPORTE que qualquer provider precisa implementar e deixa a escolha para o
|
|
6
|
+
* dia em que houver decisão comercial — Twilio, Zenvia, Infobip, o que for.
|
|
7
|
+
*
|
|
8
|
+
* A separação entre "canal" e "transporte" existe porque SMS tem regras próprias
|
|
9
|
+
* que valem para TODOS os providers (segmentação por tamanho, remetente
|
|
10
|
+
* alfanumérico proibido no Brasil, ausência de status `read`) e que não deveriam
|
|
11
|
+
* ser reimplementadas por cada adapter concreto. O canal cuida disso; o
|
|
12
|
+
* transporte só entrega bytes.
|
|
13
|
+
*/
|
|
14
|
+
import type { ChannelCapabilities } from '../capabilities.js';
|
|
15
|
+
import type { CommunicationChannel } from '../channel.js';
|
|
16
|
+
import type { ChannelAccount } from '../identity.js';
|
|
17
|
+
export declare function isGsm7(text: string): boolean;
|
|
18
|
+
/** Quantos segmentos este texto custa. É o que vira dinheiro na fatura. */
|
|
19
|
+
export declare function countSegments(text: string): number;
|
|
20
|
+
export interface SmsSendRequest {
|
|
21
|
+
/** E.164. */
|
|
22
|
+
to: string;
|
|
23
|
+
/** Remetente conforme a conta do tenant. */
|
|
24
|
+
from: string;
|
|
25
|
+
body: string;
|
|
26
|
+
/**
|
|
27
|
+
* Chave do motor, a MESMA em toda tentativa técnica do mesmo envio.
|
|
28
|
+
*
|
|
29
|
+
* Repassada quando o provider tem idempotência nativa; ignorada quando não —
|
|
30
|
+
* e, nesse caso, o transporte deve declarar `capabilities` sem
|
|
31
|
+
* `supportsProviderIdempotency`, para que o motor não conte com uma proteção
|
|
32
|
+
* que ninguém está exercendo.
|
|
33
|
+
*/
|
|
34
|
+
idempotencyKey: string;
|
|
35
|
+
}
|
|
36
|
+
export type SmsTransportResult = {
|
|
37
|
+
ok: true;
|
|
38
|
+
providerRef?: string;
|
|
39
|
+
} | {
|
|
40
|
+
ok: false;
|
|
41
|
+
/** Rótulo estável, snake_case. Nunca a mensagem crua do provider. */
|
|
42
|
+
code: string;
|
|
43
|
+
/**
|
|
44
|
+
* O transporte classifica, porque só ele conhece a taxonomia do próprio
|
|
45
|
+
* provider. O canal não tenta adivinhar a partir de string de erro — ler
|
|
46
|
+
* mensagem de erro para decidir retry quebra na primeira vez que o
|
|
47
|
+
* provider reescreve o texto.
|
|
48
|
+
*/
|
|
49
|
+
kind: 'temporary' | 'permanent' | 'unavailable';
|
|
50
|
+
detail?: string;
|
|
51
|
+
};
|
|
52
|
+
/** O que um provider de SMS precisa implementar. Nada além disto. */
|
|
53
|
+
export interface SmsTransport {
|
|
54
|
+
readonly name: string;
|
|
55
|
+
/**
|
|
56
|
+
* O que ESTE provider garante. Ausente = nenhuma garantia externa.
|
|
57
|
+
*
|
|
58
|
+
* Opcional, ao contrário de `CommunicationChannel.capabilities`, e a diferença
|
|
59
|
+
* é deliberada: o canal é do motor e tem de declarar sempre; o transporte é do
|
|
60
|
+
* produto, e a omissão dele precisa cair no default seguro em vez de quebrar a
|
|
61
|
+
* compilação de quem já implementou um transporte.
|
|
62
|
+
*
|
|
63
|
+
* Enquanto nenhum provider de SMS estiver contratado, a única declaração
|
|
64
|
+
* honesta é a ausência — `PROVIDER_IDEMPOTENCY_STRATEGY = UNKNOWN_UNTIL_PROVIDER`.
|
|
65
|
+
*/
|
|
66
|
+
readonly capabilities?: ChannelCapabilities;
|
|
67
|
+
send(req: SmsSendRequest): Promise<SmsTransportResult>;
|
|
68
|
+
}
|
|
69
|
+
export interface SmsAdapterConfig {
|
|
70
|
+
account: ChannelAccount;
|
|
71
|
+
transport: SmsTransport;
|
|
72
|
+
/** Mesma trava do WhatsApp: sem autorização explícita, nada sai. */
|
|
73
|
+
liveSend?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Teto de segmentos por mensagem. Acima disso, recusa em vez de enviar.
|
|
76
|
+
*
|
|
77
|
+
* Não é limite técnico — é limite de CUSTO. Um template mal preenchido (uma
|
|
78
|
+
* variável que chega com um parágrafo em vez de um nome) vira uma mensagem de
|
|
79
|
+
* dez segmentos multiplicada pela carteira inteira, e a fatura é o primeiro
|
|
80
|
+
* lugar onde alguém repara.
|
|
81
|
+
*/
|
|
82
|
+
maxSegments?: number;
|
|
83
|
+
}
|
|
84
|
+
export declare function createSmsChannel(config: SmsAdapterConfig): CommunicationChannel;
|
|
85
|
+
/**
|
|
86
|
+
* Transporte de ensaio — registra o que teria enviado e nunca alcança rede.
|
|
87
|
+
*
|
|
88
|
+
* Serve ao dry-run e aos testes, e é o que permite exercitar segmentação, custo
|
|
89
|
+
* e isolamento sem provider contratado. Não simula entrega para o motor: quem
|
|
90
|
+
* decide se houve envio é a trava `liveSend`, não este objeto.
|
|
91
|
+
*/
|
|
92
|
+
export declare function createRecordingSmsTransport(): SmsTransport & {
|
|
93
|
+
sent: SmsSendRequest[];
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=sms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sms.d.ts","sourceRoot":"","sources":["../../../src/communication/adapters/sms.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,oBAAoB,EAAoC,MAAM,eAAe,CAAC;AAE5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAqBrD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK5C;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC;IACE,EAAE,EAAE,KAAK,CAAC;IACV,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,aAAa,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,qEAAqE;AACrE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,YAAY,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,oBAAoB,CAyD/E;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,IAAI,YAAY,GAAG;IAAE,IAAI,EAAE,cAAc,EAAE,CAAA;CAAE,CAUvF"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter de SMS — provider-agnostic por construção.
|
|
3
|
+
*
|
|
4
|
+
* Nenhum provider está contratado, e este arquivo não escolhe um. Ele define o
|
|
5
|
+
* TRANSPORTE que qualquer provider precisa implementar e deixa a escolha para o
|
|
6
|
+
* dia em que houver decisão comercial — Twilio, Zenvia, Infobip, o que for.
|
|
7
|
+
*
|
|
8
|
+
* A separação entre "canal" e "transporte" existe porque SMS tem regras próprias
|
|
9
|
+
* que valem para TODOS os providers (segmentação por tamanho, remetente
|
|
10
|
+
* alfanumérico proibido no Brasil, ausência de status `read`) e que não deveriam
|
|
11
|
+
* ser reimplementadas por cada adapter concreto. O canal cuida disso; o
|
|
12
|
+
* transporte só entrega bytes.
|
|
13
|
+
*/
|
|
14
|
+
import { NO_PROVIDER_GUARANTEES } from '../capabilities.js';
|
|
15
|
+
/**
|
|
16
|
+
* Limite de um segmento GSM-7. Acima disso a mensagem é dividida e **cobrada por
|
|
17
|
+
* segmento** — cada provider com sua própria contagem.
|
|
18
|
+
*
|
|
19
|
+
* Com qualquer caractere fora do alfabeto GSM-7 (o `ç` de "cobrança", o `ã` de
|
|
20
|
+
* "atenção", qualquer emoji) a codificação inteira vira UCS-2 e o limite cai
|
|
21
|
+
* para 70. É por isso que a contagem não pode ser um `length > 160` ingênuo: um
|
|
22
|
+
* texto de 150 caracteres com um acento custa três segmentos, não um.
|
|
23
|
+
*/
|
|
24
|
+
const GSM7_SINGLE = 160;
|
|
25
|
+
const GSM7_MULTI = 153;
|
|
26
|
+
const UCS2_SINGLE = 70;
|
|
27
|
+
const UCS2_MULTI = 67;
|
|
28
|
+
const GSM7_EXTRA = '^{}\\[~]|€';
|
|
29
|
+
const GSM7_BASE = '@£$¥èéùìòÇØøÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !"#¤%&\'()*+,-./0123456789:;<=>?' +
|
|
30
|
+
'¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà\n\r';
|
|
31
|
+
export function isGsm7(text) {
|
|
32
|
+
for (const ch of text) {
|
|
33
|
+
if (!GSM7_BASE.includes(ch) && !GSM7_EXTRA.includes(ch))
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
/** Quantos segmentos este texto custa. É o que vira dinheiro na fatura. */
|
|
39
|
+
export function countSegments(text) {
|
|
40
|
+
if (text.length === 0)
|
|
41
|
+
return 0;
|
|
42
|
+
const gsm = isGsm7(text);
|
|
43
|
+
// Caracteres da tabela estendida ocupam DOIS septetos.
|
|
44
|
+
const units = gsm
|
|
45
|
+
? [...text].reduce((n, ch) => n + (GSM7_EXTRA.includes(ch) ? 2 : 1), 0)
|
|
46
|
+
: [...text].length;
|
|
47
|
+
const single = gsm ? GSM7_SINGLE : UCS2_SINGLE;
|
|
48
|
+
const multi = gsm ? GSM7_MULTI : UCS2_MULTI;
|
|
49
|
+
return units <= single ? 1 : Math.ceil(units / multi);
|
|
50
|
+
}
|
|
51
|
+
export function createSmsChannel(config) {
|
|
52
|
+
const maxSegments = config.maxSegments ?? 3;
|
|
53
|
+
return {
|
|
54
|
+
key: 'sms',
|
|
55
|
+
providerName: config.transport.name,
|
|
56
|
+
/*
|
|
57
|
+
* As garantias vêm do TRANSPORTE, e o default é nenhuma.
|
|
58
|
+
*
|
|
59
|
+
* Nenhum provider de SMS está contratado. A garantia de idempotência depende
|
|
60
|
+
* de qual for escolhido, e o canal não tem como saber antes — por isso ele
|
|
61
|
+
* não afirma nada por conta própria: quem implementar o transporte declara o
|
|
62
|
+
* que aquele provider realmente faz, e o silêncio significa ausência.
|
|
63
|
+
*
|
|
64
|
+
* Enquanto isso, o efeito no motor é o correto e conservador: uma reserva de
|
|
65
|
+
* SMS retomada de um titular que já falou com o provider para em
|
|
66
|
+
* `unknown_outcome` em vez de reenviar às cegas.
|
|
67
|
+
*/
|
|
68
|
+
capabilities: config.transport.capabilities ?? NO_PROVIDER_GUARANTEES,
|
|
69
|
+
isConfigured(_ctx) {
|
|
70
|
+
return config.account.status === 'active' && Boolean(config.account.senderId);
|
|
71
|
+
},
|
|
72
|
+
async send(message) {
|
|
73
|
+
if (!config.liveSend) {
|
|
74
|
+
return {
|
|
75
|
+
kind: 'unavailable',
|
|
76
|
+
code: 'live_send_disabled',
|
|
77
|
+
detail: 'envio real de SMS não autorizado neste ambiente',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (message.content.kind !== 'text') {
|
|
81
|
+
return { kind: 'permanent', code: 'content_mismatch', detail: 'SMS aceita apenas texto' };
|
|
82
|
+
}
|
|
83
|
+
const segments = countSegments(message.content.body);
|
|
84
|
+
if (segments > maxSegments) {
|
|
85
|
+
return {
|
|
86
|
+
kind: 'permanent',
|
|
87
|
+
code: 'too_many_segments',
|
|
88
|
+
detail: `mensagem custaria ${segments} segmentos (teto ${maxSegments})`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const result = await config.transport.send({
|
|
92
|
+
to: message.to,
|
|
93
|
+
from: config.account.senderId,
|
|
94
|
+
body: message.content.body,
|
|
95
|
+
idempotencyKey: message.idempotencyKey,
|
|
96
|
+
});
|
|
97
|
+
if (result.ok)
|
|
98
|
+
return { kind: 'sent', providerRef: result.providerRef };
|
|
99
|
+
return { kind: result.kind, code: result.code, detail: result.detail };
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Transporte de ensaio — registra o que teria enviado e nunca alcança rede.
|
|
105
|
+
*
|
|
106
|
+
* Serve ao dry-run e aos testes, e é o que permite exercitar segmentação, custo
|
|
107
|
+
* e isolamento sem provider contratado. Não simula entrega para o motor: quem
|
|
108
|
+
* decide se houve envio é a trava `liveSend`, não este objeto.
|
|
109
|
+
*/
|
|
110
|
+
export function createRecordingSmsTransport() {
|
|
111
|
+
const sent = [];
|
|
112
|
+
return {
|
|
113
|
+
name: 'recording',
|
|
114
|
+
sent,
|
|
115
|
+
async send(req) {
|
|
116
|
+
sent.push(req);
|
|
117
|
+
return { ok: true, providerRef: `rec_${sent.length}` };
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# 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,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O código de idioma como a Meta o escreve.
|
|
3
|
+
*
|
|
4
|
+
* ## O defeito que este módulo existe para não repetir
|
|
5
|
+
*
|
|
6
|
+
* O domínio fala BCP-47 (`pt-BR`), que é a forma correta para um catálogo de
|
|
7
|
+
* templates que um dia terá outros providers. A Meta escreve `pt_BR`, com
|
|
8
|
+
* underscore, e recusa qualquer outra grafia.
|
|
9
|
+
*
|
|
10
|
+
* Enquanto não havia um ponto único de tradução, as duas pontas escolheram
|
|
11
|
+
* convenções diferentes sozinhas: a submissão registrou o template como
|
|
12
|
+
* `pt_BR` e o despacho pediu `pt-BR`. O primeiro envio real do produto morreu
|
|
13
|
+
* exatamente aí, em 2026-09-01, com
|
|
14
|
+
* `(#132001) Template name does not exist in the translation` — uma mensagem
|
|
15
|
+
* que fala de tradução e parece falar de template inexistente.
|
|
16
|
+
*
|
|
17
|
+
* A conversão mora no ADAPTER porque é detalhe de provider, como o
|
|
18
|
+
* `UTILITY` maiúsculo de `whatsapp-templates.ts`. Colocá-la no catálogo faria o
|
|
19
|
+
* domínio carregar a grafia da Meta, e o próximo provider herdaria um `pt_BR`
|
|
20
|
+
* que não significa nada para ele.
|
|
21
|
+
*
|
|
22
|
+
* Este arquivo não fala com rede nenhuma — é tradução pura, e o guard de
|
|
23
|
+
* fronteira em `communication-provider-boundary.test.ts` exige que continue
|
|
24
|
+
* assim.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* `pt-BR` → `pt_BR`. Idempotente: o que já está na forma da Meta passa igual.
|
|
28
|
+
*
|
|
29
|
+
* Não valida: um idioma que a Meta não conhece é recusado por ela, com o código
|
|
30
|
+
* dela, e inventar uma lista aqui significaria mantê-la sincronizada com um
|
|
31
|
+
* catálogo que muda sem avisar.
|
|
32
|
+
*/
|
|
33
|
+
export declare function metaLanguageCode(locale: string): string;
|
|
34
|
+
//# sourceMappingURL=whatsapp-language.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp-language.d.ts","sourceRoot":"","sources":["../../../src/communication/adapters/whatsapp-language.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O código de idioma como a Meta o escreve.
|
|
3
|
+
*
|
|
4
|
+
* ## O defeito que este módulo existe para não repetir
|
|
5
|
+
*
|
|
6
|
+
* O domínio fala BCP-47 (`pt-BR`), que é a forma correta para um catálogo de
|
|
7
|
+
* templates que um dia terá outros providers. A Meta escreve `pt_BR`, com
|
|
8
|
+
* underscore, e recusa qualquer outra grafia.
|
|
9
|
+
*
|
|
10
|
+
* Enquanto não havia um ponto único de tradução, as duas pontas escolheram
|
|
11
|
+
* convenções diferentes sozinhas: a submissão registrou o template como
|
|
12
|
+
* `pt_BR` e o despacho pediu `pt-BR`. O primeiro envio real do produto morreu
|
|
13
|
+
* exatamente aí, em 2026-09-01, com
|
|
14
|
+
* `(#132001) Template name does not exist in the translation` — uma mensagem
|
|
15
|
+
* que fala de tradução e parece falar de template inexistente.
|
|
16
|
+
*
|
|
17
|
+
* A conversão mora no ADAPTER porque é detalhe de provider, como o
|
|
18
|
+
* `UTILITY` maiúsculo de `whatsapp-templates.ts`. Colocá-la no catálogo faria o
|
|
19
|
+
* domínio carregar a grafia da Meta, e o próximo provider herdaria um `pt_BR`
|
|
20
|
+
* que não significa nada para ele.
|
|
21
|
+
*
|
|
22
|
+
* Este arquivo não fala com rede nenhuma — é tradução pura, e o guard de
|
|
23
|
+
* fronteira em `communication-provider-boundary.test.ts` exige que continue
|
|
24
|
+
* assim.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* `pt-BR` → `pt_BR`. Idempotente: o que já está na forma da Meta passa igual.
|
|
28
|
+
*
|
|
29
|
+
* Não valida: um idioma que a Meta não conhece é recusado por ela, com o código
|
|
30
|
+
* dela, e inventar uma lista aqui significaria mantê-la sincronizada com um
|
|
31
|
+
* catálogo que muda sem avisar.
|
|
32
|
+
*/
|
|
33
|
+
export function metaLanguageCode(locale) {
|
|
34
|
+
return locale.replace(/-/g, '_');
|
|
35
|
+
}
|
|
36
|
+
//# 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;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gestão de template no WhatsApp — adapter da Meta Cloud API.
|
|
3
|
+
*
|
|
4
|
+
* Implementa `TemplateManagementProvider`. Todo o vocabulário da Meta mora
|
|
5
|
+
* aqui: `components`, `BODY`, `example.body_text`, categorias em maiúsculas,
|
|
6
|
+
* `POST /{waba-id}/message_templates`. O domínio não conhece nenhum deles.
|
|
7
|
+
*/
|
|
8
|
+
import type { TemplateManagementProvider } from '../template-provider.js';
|
|
9
|
+
export interface WhatsAppTemplateAdapterConfig {
|
|
10
|
+
/** WABA do tenant. Identificador público, nunca segredo. */
|
|
11
|
+
wabaId: string;
|
|
12
|
+
accessToken: string;
|
|
13
|
+
/** Injetável para teste. **Nenhum teste deve alcançar a rede real.** */
|
|
14
|
+
fetchImpl?: typeof fetch;
|
|
15
|
+
env?: NodeJS.ProcessEnv;
|
|
16
|
+
}
|
|
17
|
+
export declare function createWhatsAppTemplateProvider(config: WhatsAppTemplateAdapterConfig): TemplateManagementProvider;
|
|
18
|
+
//# sourceMappingURL=whatsapp-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp-templates.d.ts","sourceRoot":"","sources":["../../../src/communication/adapters/whatsapp-templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAEV,0BAA0B,EAI3B,MAAM,yBAAyB,CAAC;AAIjC,MAAM,WAAW,6BAA6B;IAC5C,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AA0BD,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,6BAA6B,GACpC,0BAA0B,CAqE5B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gestão de template no WhatsApp — adapter da Meta Cloud API.
|
|
3
|
+
*
|
|
4
|
+
* Implementa `TemplateManagementProvider`. Todo o vocabulário da Meta mora
|
|
5
|
+
* aqui: `components`, `BODY`, `example.body_text`, categorias em maiúsculas,
|
|
6
|
+
* `POST /{waba-id}/message_templates`. O domínio não conhece nenhum deles.
|
|
7
|
+
*/
|
|
8
|
+
import { graphUrl } from '../graph.js';
|
|
9
|
+
import { metaLanguageCode } from './whatsapp-language.js';
|
|
10
|
+
const TIMEOUT_MS = 20_000;
|
|
11
|
+
/** O domínio fala minúsculo; a Meta espera maiúsculo. A tradução mora aqui. */
|
|
12
|
+
const CATEGORY = {
|
|
13
|
+
utility: 'UTILITY',
|
|
14
|
+
marketing: 'MARKETING',
|
|
15
|
+
authentication: 'AUTHENTICATION',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Classificação do erro da Meta.
|
|
19
|
+
*
|
|
20
|
+
* `duplicate_name` merece classe própria porque é o desfecho ESPERADO de uma
|
|
21
|
+
* resubmissão — quem chama trata como "já existe", relê e segue, em vez de
|
|
22
|
+
* tratar como falha e tentar de novo.
|
|
23
|
+
*/
|
|
24
|
+
function classify(status, code, subcode) {
|
|
25
|
+
if (code === 190 || code === 200 || code === 10 || code === 3)
|
|
26
|
+
return 'unauthorized';
|
|
27
|
+
// 2388023 / subcode 2388024: nome de template já em uso na conta.
|
|
28
|
+
if (code === 2388023 || subcode === 2388024)
|
|
29
|
+
return 'duplicate_name';
|
|
30
|
+
if (code === 4 || code === 80007 || status === 429)
|
|
31
|
+
return 'rate_limited';
|
|
32
|
+
if (status >= 500)
|
|
33
|
+
return 'network';
|
|
34
|
+
if (code === 100 || code === 132000)
|
|
35
|
+
return 'invalid_content';
|
|
36
|
+
return 'provider_error';
|
|
37
|
+
}
|
|
38
|
+
export function createWhatsAppTemplateProvider(config) {
|
|
39
|
+
const doFetch = config.fetchImpl ?? fetch;
|
|
40
|
+
return {
|
|
41
|
+
channel: 'whatsapp',
|
|
42
|
+
async submit(submission) {
|
|
43
|
+
const body = {
|
|
44
|
+
name: submission.name,
|
|
45
|
+
language: metaLanguageCode(submission.language),
|
|
46
|
+
category: CATEGORY[submission.category],
|
|
47
|
+
components: [
|
|
48
|
+
{
|
|
49
|
+
type: 'BODY',
|
|
50
|
+
text: submission.bodyText,
|
|
51
|
+
// `body_text` é uma lista de listas: uma linha de exemplos por
|
|
52
|
+
// conjunto de variáveis do corpo. Omitido quando não há variável —
|
|
53
|
+
// um `example` vazio é recusado.
|
|
54
|
+
...(submission.bodyExample && submission.bodyExample.length > 0
|
|
55
|
+
? { example: { body_text: [submission.bodyExample] } }
|
|
56
|
+
: {}),
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
let res;
|
|
61
|
+
try {
|
|
62
|
+
res = await doFetch(graphUrl(`${encodeURIComponent(config.wabaId)}/message_templates`, config.env), {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers: {
|
|
65
|
+
authorization: `Bearer ${config.accessToken}`,
|
|
66
|
+
'content-type': 'application/json',
|
|
67
|
+
},
|
|
68
|
+
body: JSON.stringify(body),
|
|
69
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Nada da exceção é propagado: em algumas implementações de `fetch` a
|
|
74
|
+
// mensagem inclui a URL, e a URL leva o token no header — mas o corpo
|
|
75
|
+
// do erro também pode ecoar cabeçalhos em proxies.
|
|
76
|
+
return { ok: false, reason: 'network' };
|
|
77
|
+
}
|
|
78
|
+
const payload = (await res.json().catch(() => null));
|
|
79
|
+
if (!res.ok) {
|
|
80
|
+
const err = (payload?.error ?? {});
|
|
81
|
+
return { ok: false, reason: classify(res.status, err.code, err.error_subcode) };
|
|
82
|
+
}
|
|
83
|
+
const id = payload?.id;
|
|
84
|
+
const status = payload?.status;
|
|
85
|
+
const category = payload?.category;
|
|
86
|
+
return {
|
|
87
|
+
ok: true,
|
|
88
|
+
...(typeof id === 'string' ? { providerRef: id } : {}),
|
|
89
|
+
// Sem `status` no corpo, o desfecho honesto é "submetido, revisão
|
|
90
|
+
// pendente" — e não inventar `APPROVED`.
|
|
91
|
+
status: typeof status === 'string' ? status : 'PENDING',
|
|
92
|
+
...(typeof category === 'string' ? { category } : {}),
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# 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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,UAAU,GAAG,MAAM,CAAC;AAW1B,+EAA+E;AAC/E,MAAM,QAAQ,GAAqC;IACjD,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,cAAc,EAAE,gBAAgB;CACjC,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAa,EAAE,OAAgB;IAC/D,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IACrF,kEAAkE;IAClE,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,gBAAgB,CAAC;IACrE,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAC1E,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,iBAAiB,CAAC;IAC9D,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,MAAqC;IAErC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;IAE1C,OAAO;QACL,OAAO,EAAE,UAAU;QAEnB,KAAK,CAAC,MAAM,CAAC,UAA8B;YACzC,MAAM,IAAI,GAAG;gBACX,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAC/C,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACvC,UAAU,EAAE;oBACV;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU,CAAC,QAAQ;wBACzB,+DAA+D;wBAC/D,mEAAmE;wBACnE,iCAAiC;wBACjC,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;4BAC7D,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE;4BACtD,CAAC,CAAC,EAAE,CAAC;qBACR;iBACF;aACF,CAAC;YAEF,IAAI,GAAa,CAAC;YAClB,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,OAAO,CACjB,QAAQ,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,GAAG,CAAC,EAC9E;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;wBAC7C,cAAc,EAAE,kBAAkB;qBACnC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;iBACxC,CACF,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,sEAAsE;gBACtE,sEAAsE;gBACtE,mDAAmD;gBACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAC1C,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAmC,CAAC;YAEvF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAGhC,CAAC;gBACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAClF,CAAC;YAED,MAAM,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;YAC/B,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;YACnC,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,GAAG,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,kEAAkE;gBAClE,yCAAyC;gBACzC,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBACvD,GAAG,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter de WhatsApp — Meta Cloud API.
|
|
3
|
+
*
|
|
4
|
+
* O provider é escolha desta implementação, não do domínio: o consumidor pede
|
|
5
|
+
* `channel: 'whatsapp'` e nunca vê `wamid`, `phoneNumberId` nem código de erro
|
|
6
|
+
* da Meta. Trocar por Twilio ou Zenvia é escrever outro arquivo deste tamanho e
|
|
7
|
+
* registrar outro adapter — nenhuma linha de régua muda.
|
|
8
|
+
*
|
|
9
|
+
* **Trava de envio real.** Enquanto `liveSend` não for explicitamente ligado, o
|
|
10
|
+
* adapter recusa com `unavailable` ANTES de qualquer rede. A trava é do código,
|
|
11
|
+
* não do processo: uma frente que promete "não enviar mensagem real" e depende
|
|
12
|
+
* de ninguém chamar a função errada não prometeu nada.
|
|
13
|
+
*/
|
|
14
|
+
import type { CommunicationChannel } from '../channel.js';
|
|
15
|
+
import type { ChannelAccount } from '../identity.js';
|
|
16
|
+
export interface WhatsAppAdapterConfig {
|
|
17
|
+
account: ChannelAccount;
|
|
18
|
+
resolveCredential: (ref: string) => Promise<string | undefined>;
|
|
19
|
+
/**
|
|
20
|
+
* Sem isto, nada sai. Ligar é um ato deliberado, feito uma vez, com
|
|
21
|
+
* autorização humana — e o padrão `false` significa que esquecer de ligar
|
|
22
|
+
* falha fechado, que é a direção certa para falhar.
|
|
23
|
+
*/
|
|
24
|
+
liveSend?: boolean;
|
|
25
|
+
/** Injetável para teste. Nenhum teste deve alcançar a rede real. */
|
|
26
|
+
fetchImpl?: typeof fetch;
|
|
27
|
+
}
|
|
28
|
+
export declare function createWhatsAppChannel(config: WhatsAppAdapterConfig): CommunicationChannel;
|
|
29
|
+
//# sourceMappingURL=whatsapp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp.d.ts","sourceRoot":"","sources":["../../../src/communication/adapters/whatsapp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAoC,MAAM,eAAe,CAAC;AAE5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAoCrD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,cAAc,CAAC;IACxB,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChE;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AA6CD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,oBAAoB,CAkGzF"}
|