@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,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perfil de remetente — de quem a mensagem PARECE ser.
|
|
3
|
+
*
|
|
4
|
+
* `identity.ts` responde "existe conta deste tenant para este canal?" e não tem
|
|
5
|
+
* fallback nenhum, de propósito. Este módulo responde a pergunta seguinte, que a
|
|
6
|
+
* operação real obriga a enfrentar: **e quando o tenant não configurou conta
|
|
7
|
+
* própria, mas o produto já entrega e-mail hoje?**
|
|
8
|
+
*
|
|
9
|
+
* A resposta preguiçosa é `?? contaDaPlataforma`, escrita dentro de um adapter.
|
|
10
|
+
* Foi assim no Manga Verde, e o custo é conhecido: reputação de domínio
|
|
11
|
+
* compartilhada em e-mail, e uma WABA respondendo pelo comportamento de outra
|
|
12
|
+
* marca em WhatsApp — com bloqueio que se propaga para todos os tenants do
|
|
13
|
+
* número.
|
|
14
|
+
*
|
|
15
|
+
* Aqui o fallback existe, mas com quatro amarras que o tornam outra coisa:
|
|
16
|
+
*
|
|
17
|
+
* 1. É DECLARADO pelo produto, canal a canal. Não há default implícito.
|
|
18
|
+
* 2. Nunca vale para canal de telefone. WhatsApp e SMS falham fechado, ponto.
|
|
19
|
+
* 3. A IDENTIDADE VISÍVEL continua sendo a do tenant que está enviando — o
|
|
20
|
+
* nome de exibição vem da marca dele. A SC nunca sai parecendo Manga Verde.
|
|
21
|
+
* 4. A origem é devolvida junto e vai para a trilha. "Saiu pelo remetente da
|
|
22
|
+
* plataforma" tem de ser uma coisa que o escritório consegue VER, não uma
|
|
23
|
+
* linha de código que ninguém lê.
|
|
24
|
+
*/
|
|
25
|
+
import type { ChannelKey } from './channel.js';
|
|
26
|
+
import type { CommunicationContext } from './context.js';
|
|
27
|
+
import type { ChannelAccount, ChannelAccountStore } from './identity.js';
|
|
28
|
+
/**
|
|
29
|
+
* De onde veio a conta que vai assinar a mensagem.
|
|
30
|
+
*
|
|
31
|
+
* Duas palavras, e a diferença entre elas é a pergunta que o Codex fez e o
|
|
32
|
+
* código não sabia responder.
|
|
33
|
+
*/
|
|
34
|
+
export type SenderOrigin = 'tenant' | 'platform_fallback';
|
|
35
|
+
export interface ResolvedSenderProfile {
|
|
36
|
+
account: ChannelAccount;
|
|
37
|
+
origin: SenderOrigin;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Fallback de plataforma, declarado pelo produto.
|
|
41
|
+
*
|
|
42
|
+
* `displayNameFor` recebe o contexto e devolve o nome exibido — é o que garante
|
|
43
|
+
* a amarra 3. Um fallback com nome fixo faria todo escritório assinar igual, que
|
|
44
|
+
* é o defeito que `senderFor` já tinha corrigido no caminho legado.
|
|
45
|
+
*/
|
|
46
|
+
export interface PlatformSenderFallback {
|
|
47
|
+
senderId: string;
|
|
48
|
+
credentialRef: string;
|
|
49
|
+
displayNameFor: (ctx: CommunicationContext) => string | undefined;
|
|
50
|
+
}
|
|
51
|
+
export type SenderFallbackPolicy = Partial<Record<ChannelKey, PlatformSenderFallback>>;
|
|
52
|
+
export type SenderRejection = 'no_account' | 'fallback_forbidden_for_channel';
|
|
53
|
+
export type SenderResolution = {
|
|
54
|
+
ok: true;
|
|
55
|
+
profile: ResolvedSenderProfile;
|
|
56
|
+
} | {
|
|
57
|
+
ok: false;
|
|
58
|
+
reason: SenderRejection;
|
|
59
|
+
detail: string;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Resolve o remetente: conta do tenant primeiro, fallback declarado depois.
|
|
63
|
+
*
|
|
64
|
+
* A ordem não é preferência, é regra. A conta do tenant, quando existe, é a
|
|
65
|
+
* única que pode ser usada — mesmo que esteja `paused` ou com erro. Cair para a
|
|
66
|
+
* plataforma porque a conta PRÓPRIA está com problema seria o pior caso
|
|
67
|
+
* possível: o escritório que configurou a identidade dele passaria a enviar com
|
|
68
|
+
* a da plataforma, justamente quando alguém está mexendo na configuração.
|
|
69
|
+
*/
|
|
70
|
+
export declare function resolveSenderProfile(store: ChannelAccountStore, ctx: CommunicationContext, channel: ChannelKey, fallback?: SenderFallbackPolicy): Promise<SenderResolution>;
|
|
71
|
+
/**
|
|
72
|
+
* Store de contas com o fallback do produto já aplicado.
|
|
73
|
+
*
|
|
74
|
+
* Existe porque o fallback tem de valer na RESOLUÇÃO DE IDENTIDADE, e não só na
|
|
75
|
+
* construção do adapter. Registrar o canal com a conta de fallback e deixar
|
|
76
|
+
* `deps.accounts` devolvendo `null` produz um motor que pula o canal com
|
|
77
|
+
* `no_identity` antes de chegar ao adapter — o canal existe, o remetente existe,
|
|
78
|
+
* e a mensagem não sai. O sintoma é mudo: a trilha diz "sem conta", que é
|
|
79
|
+
* exatamente o que quem configurou o fallback acredita ter resolvido.
|
|
80
|
+
*
|
|
81
|
+
* `identity.ts` continua sem fallback nenhum, e é o ponto: quem decide que a
|
|
82
|
+
* plataforma pode assinar por um tenant é o PRODUTO, declarando a política, e a
|
|
83
|
+
* decisão fica visível numa decoração explícita em vez de num `??` dentro do
|
|
84
|
+
* motor.
|
|
85
|
+
*/
|
|
86
|
+
export declare function withSenderFallback(store: ChannelAccountStore, fallback: SenderFallbackPolicy): ChannelAccountStore;
|
|
87
|
+
/**
|
|
88
|
+
* Resolvedor de credencial preso a UMA conta.
|
|
89
|
+
*
|
|
90
|
+
* Envolve o resolvedor do processo e só deixa passar a referência que a conta
|
|
91
|
+
* resolvida declarou. Sem isto, o resolvedor injetado é uma função que traduz
|
|
92
|
+
* qualquer nome em qualquer segredo, e basta um adapter passar a referência
|
|
93
|
+
* errada — por bug, por conta trocada, por um `??` mal colocado — para um tenant
|
|
94
|
+
* enviar com a credencial de outro.
|
|
95
|
+
*
|
|
96
|
+
* A trava é barata e fecha a classe inteira: nenhuma referência que não seja a
|
|
97
|
+
* daquela conta resolve, por construção.
|
|
98
|
+
*/
|
|
99
|
+
export declare function credentialResolverFor(account: ChannelAccount, resolve: (ref: string) => Promise<string | undefined>): (ref: string) => Promise<string | undefined>;
|
|
100
|
+
//# sourceMappingURL=sender-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender-profile.d.ts","sourceRoot":"","sources":["../../src/communication/sender-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS,CAAC;CACnE;AAYD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAEvF,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,gCAAgC,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GAC5C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,UAAU,EACnB,QAAQ,GAAE,oBAAyB,GAClC,OAAO,CAAC,gBAAgB,CAAC,CA2C3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,oBAAoB,GAC7B,mBAAmB,CAOrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GACpD,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE9C"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perfil de remetente — de quem a mensagem PARECE ser.
|
|
3
|
+
*
|
|
4
|
+
* `identity.ts` responde "existe conta deste tenant para este canal?" e não tem
|
|
5
|
+
* fallback nenhum, de propósito. Este módulo responde a pergunta seguinte, que a
|
|
6
|
+
* operação real obriga a enfrentar: **e quando o tenant não configurou conta
|
|
7
|
+
* própria, mas o produto já entrega e-mail hoje?**
|
|
8
|
+
*
|
|
9
|
+
* A resposta preguiçosa é `?? contaDaPlataforma`, escrita dentro de um adapter.
|
|
10
|
+
* Foi assim no Manga Verde, e o custo é conhecido: reputação de domínio
|
|
11
|
+
* compartilhada em e-mail, e uma WABA respondendo pelo comportamento de outra
|
|
12
|
+
* marca em WhatsApp — com bloqueio que se propaga para todos os tenants do
|
|
13
|
+
* número.
|
|
14
|
+
*
|
|
15
|
+
* Aqui o fallback existe, mas com quatro amarras que o tornam outra coisa:
|
|
16
|
+
*
|
|
17
|
+
* 1. É DECLARADO pelo produto, canal a canal. Não há default implícito.
|
|
18
|
+
* 2. Nunca vale para canal de telefone. WhatsApp e SMS falham fechado, ponto.
|
|
19
|
+
* 3. A IDENTIDADE VISÍVEL continua sendo a do tenant que está enviando — o
|
|
20
|
+
* nome de exibição vem da marca dele. A SC nunca sai parecendo Manga Verde.
|
|
21
|
+
* 4. A origem é devolvida junto e vai para a trilha. "Saiu pelo remetente da
|
|
22
|
+
* plataforma" tem de ser uma coisa que o escritório consegue VER, não uma
|
|
23
|
+
* linha de código que ninguém lê.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Canais que NUNCA aceitam fallback de plataforma.
|
|
27
|
+
*
|
|
28
|
+
* Lista fechada no motor, e não configuração do produto, porque a consequência
|
|
29
|
+
* não é do produto: uma WABA bloqueada por comportamento de um tenant derruba
|
|
30
|
+
* todos os outros que compartilham o número. Não existe configuração que torne
|
|
31
|
+
* isso aceitável, então não existe configuração.
|
|
32
|
+
*/
|
|
33
|
+
const FALLBACK_FORBIDDEN = ['whatsapp', 'sms'];
|
|
34
|
+
/**
|
|
35
|
+
* Resolve o remetente: conta do tenant primeiro, fallback declarado depois.
|
|
36
|
+
*
|
|
37
|
+
* A ordem não é preferência, é regra. A conta do tenant, quando existe, é a
|
|
38
|
+
* única que pode ser usada — mesmo que esteja `paused` ou com erro. Cair para a
|
|
39
|
+
* plataforma porque a conta PRÓPRIA está com problema seria o pior caso
|
|
40
|
+
* possível: o escritório que configurou a identidade dele passaria a enviar com
|
|
41
|
+
* a da plataforma, justamente quando alguém está mexendo na configuração.
|
|
42
|
+
*/
|
|
43
|
+
export async function resolveSenderProfile(store, ctx, channel, fallback = {}) {
|
|
44
|
+
const own = await store.find(ctx, channel);
|
|
45
|
+
if (own)
|
|
46
|
+
return { ok: true, profile: { account: own, origin: 'tenant' } };
|
|
47
|
+
const declared = fallback[channel];
|
|
48
|
+
if (!declared) {
|
|
49
|
+
return {
|
|
50
|
+
ok: false,
|
|
51
|
+
reason: 'no_account',
|
|
52
|
+
detail: `sem conta de ${channel} para este tenant/produto e sem fallback declarado`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (FALLBACK_FORBIDDEN.includes(channel)) {
|
|
56
|
+
// Produto que declarou fallback para telefone cometeu um erro de
|
|
57
|
+
// configuração perigoso. Recusar em silêncio o esconderia; recusar com
|
|
58
|
+
// motivo próprio o expõe na trilha.
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
reason: 'fallback_forbidden_for_channel',
|
|
62
|
+
detail: `fallback de plataforma é proibido em ${channel}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
ok: true,
|
|
67
|
+
profile: {
|
|
68
|
+
account: {
|
|
69
|
+
channel,
|
|
70
|
+
// O contexto pedido, SEMPRE. É o que faz `assertOwnership` continuar
|
|
71
|
+
// valendo e o que impede a conta de plataforma de carregar a marca de
|
|
72
|
+
// outro tenant para dentro de um envio deste.
|
|
73
|
+
tenantId: ctx.tenantId,
|
|
74
|
+
product: ctx.product,
|
|
75
|
+
brand: ctx.brand,
|
|
76
|
+
senderId: declared.senderId,
|
|
77
|
+
displayName: declared.displayNameFor(ctx),
|
|
78
|
+
credentialRef: declared.credentialRef,
|
|
79
|
+
status: 'active',
|
|
80
|
+
},
|
|
81
|
+
origin: 'platform_fallback',
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Store de contas com o fallback do produto já aplicado.
|
|
87
|
+
*
|
|
88
|
+
* Existe porque o fallback tem de valer na RESOLUÇÃO DE IDENTIDADE, e não só na
|
|
89
|
+
* construção do adapter. Registrar o canal com a conta de fallback e deixar
|
|
90
|
+
* `deps.accounts` devolvendo `null` produz um motor que pula o canal com
|
|
91
|
+
* `no_identity` antes de chegar ao adapter — o canal existe, o remetente existe,
|
|
92
|
+
* e a mensagem não sai. O sintoma é mudo: a trilha diz "sem conta", que é
|
|
93
|
+
* exatamente o que quem configurou o fallback acredita ter resolvido.
|
|
94
|
+
*
|
|
95
|
+
* `identity.ts` continua sem fallback nenhum, e é o ponto: quem decide que a
|
|
96
|
+
* plataforma pode assinar por um tenant é o PRODUTO, declarando a política, e a
|
|
97
|
+
* decisão fica visível numa decoração explícita em vez de num `??` dentro do
|
|
98
|
+
* motor.
|
|
99
|
+
*/
|
|
100
|
+
export function withSenderFallback(store, fallback) {
|
|
101
|
+
return {
|
|
102
|
+
async find(ctx, channel) {
|
|
103
|
+
const resolved = await resolveSenderProfile(store, ctx, channel, fallback);
|
|
104
|
+
return resolved.ok ? resolved.profile.account : null;
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolvedor de credencial preso a UMA conta.
|
|
110
|
+
*
|
|
111
|
+
* Envolve o resolvedor do processo e só deixa passar a referência que a conta
|
|
112
|
+
* resolvida declarou. Sem isto, o resolvedor injetado é uma função que traduz
|
|
113
|
+
* qualquer nome em qualquer segredo, e basta um adapter passar a referência
|
|
114
|
+
* errada — por bug, por conta trocada, por um `??` mal colocado — para um tenant
|
|
115
|
+
* enviar com a credencial de outro.
|
|
116
|
+
*
|
|
117
|
+
* A trava é barata e fecha a classe inteira: nenhuma referência que não seja a
|
|
118
|
+
* daquela conta resolve, por construção.
|
|
119
|
+
*/
|
|
120
|
+
export function credentialResolverFor(account, resolve) {
|
|
121
|
+
return async (ref) => (ref === account.credentialRef ? resolve(ref) : undefined);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=sender-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender-profile.js","sourceRoot":"","sources":["../../src/communication/sender-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAgCH;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAUtE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAA0B,EAC1B,GAAyB,EACzB,OAAmB,EACnB,WAAiC,EAAE;IAEnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;IAE1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,gBAAgB,OAAO,oDAAoD;SACpF,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,iEAAiE;QACjE,uEAAuE;QACvE,oCAAoC;QACpC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,gCAAgC;YACxC,MAAM,EAAE,wCAAwC,OAAO,EAAE;SAC1D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,OAAO;gBACP,qEAAqE;gBACrE,sEAAsE;gBACtE,8CAA8C;gBAC9C,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC;gBACzC,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,MAAM,EAAE,QAAQ;aACjB;YACD,MAAM,EAAE,mBAAmB;SAC5B;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA0B,EAC1B,QAA8B;IAE9B,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO;YACrB,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC3E,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAuB,EACvB,OAAqD;IAErD,OAAO,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estados de entrega e classificação de falha.
|
|
3
|
+
*
|
|
4
|
+
* `sent` significa "o provider aceitou" — o único desfecho que o e-mail
|
|
5
|
+
* consegue afirmar. WhatsApp e SMS informam depois, por webhook, se a mensagem
|
|
6
|
+
* chegou ao aparelho, e só o WhatsApp informa se foi aberta.
|
|
7
|
+
*
|
|
8
|
+
* Colapsar "aceito" e "entregue" faria a tela afirmar entrega que ninguém
|
|
9
|
+
* confirmou — que é precisamente a pergunta do escritório quando o cliente diz
|
|
10
|
+
* "não recebi nada".
|
|
11
|
+
*/
|
|
12
|
+
import type { ChannelKey, DeliveryOutcomeKind } from './channel.js';
|
|
13
|
+
export type DeliveryStatus = 'queued' | 'sent' | 'delivered' | 'read' | 'failed' | 'opted_out';
|
|
14
|
+
/**
|
|
15
|
+
* Até onde cada canal consegue informar.
|
|
16
|
+
*
|
|
17
|
+
* SMS nunca alcança `read`, e nenhum provider de SMS devolve isso — mapear um
|
|
18
|
+
* `delivered` de SMS para `read` "para uniformizar" produziria uma tela
|
|
19
|
+
* afirmando que o cliente LEU uma cobrança que ninguém sabe se ele leu. É a
|
|
20
|
+
* equivalência falsa que este mapa existe para impedir.
|
|
21
|
+
*/
|
|
22
|
+
export declare const CHANNEL_REPORTS: Record<ChannelKey, readonly DeliveryStatus[]>;
|
|
23
|
+
/** O canal é capaz de relatar este estado? Consultado ANTES de gravar um webhook. */
|
|
24
|
+
export declare function channelReports(channel: ChannelKey, status: DeliveryStatus): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Aplica um estado novo sobre o atual.
|
|
27
|
+
*
|
|
28
|
+
* Webhooks chegam fora de ordem — `delivered` depois de `read` acontece, e
|
|
29
|
+
* aceitar cegamente faria a mensagem "desler". `failed` e `opted_out` são
|
|
30
|
+
* terminais e nunca são sobrescritos por progresso: um `delivered` que chega
|
|
31
|
+
* depois de uma falha registrada é ruído do provider, não correção.
|
|
32
|
+
*/
|
|
33
|
+
export declare function advanceStatus(current: DeliveryStatus, incoming: DeliveryStatus): DeliveryStatus;
|
|
34
|
+
/**
|
|
35
|
+
* Erro permanente nunca deve ser retentado, por mais que o contador permita.
|
|
36
|
+
*
|
|
37
|
+
* `unavailable` e `opted_out` também retornam falso, mas por razão oposta: não
|
|
38
|
+
* são falhas de entrega, e não devem sequer consumir uma tentativa.
|
|
39
|
+
*/
|
|
40
|
+
export declare function isRetryable(kind: DeliveryOutcomeKind): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Estado que o desfecho assenta, ou `null` quando não assenta nenhum.
|
|
43
|
+
*
|
|
44
|
+
* `temporary` não assenta: a ação continua agendada para nova tentativa.
|
|
45
|
+
* `unavailable` não é tentativa — não gasta retry e não marca falha de entrega.
|
|
46
|
+
*/
|
|
47
|
+
export declare function statusForOutcome(kind: DeliveryOutcomeKind): DeliveryStatus | null;
|
|
48
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/communication/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE/F;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAKzE,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAEnF;AAYD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,GAAG,cAAc,CAG/F;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,cAAc,GAAG,IAAI,CAWjF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estados de entrega e classificação de falha.
|
|
3
|
+
*
|
|
4
|
+
* `sent` significa "o provider aceitou" — o único desfecho que o e-mail
|
|
5
|
+
* consegue afirmar. WhatsApp e SMS informam depois, por webhook, se a mensagem
|
|
6
|
+
* chegou ao aparelho, e só o WhatsApp informa se foi aberta.
|
|
7
|
+
*
|
|
8
|
+
* Colapsar "aceito" e "entregue" faria a tela afirmar entrega que ninguém
|
|
9
|
+
* confirmou — que é precisamente a pergunta do escritório quando o cliente diz
|
|
10
|
+
* "não recebi nada".
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Até onde cada canal consegue informar.
|
|
14
|
+
*
|
|
15
|
+
* SMS nunca alcança `read`, e nenhum provider de SMS devolve isso — mapear um
|
|
16
|
+
* `delivered` de SMS para `read` "para uniformizar" produziria uma tela
|
|
17
|
+
* afirmando que o cliente LEU uma cobrança que ninguém sabe se ele leu. É a
|
|
18
|
+
* equivalência falsa que este mapa existe para impedir.
|
|
19
|
+
*/
|
|
20
|
+
export const CHANNEL_REPORTS = {
|
|
21
|
+
email: ['queued', 'sent', 'failed'],
|
|
22
|
+
whatsapp: ['queued', 'sent', 'delivered', 'read', 'failed', 'opted_out'],
|
|
23
|
+
sms: ['queued', 'sent', 'delivered', 'failed', 'opted_out'],
|
|
24
|
+
notification: ['queued', 'sent', 'read', 'failed'],
|
|
25
|
+
};
|
|
26
|
+
/** O canal é capaz de relatar este estado? Consultado ANTES de gravar um webhook. */
|
|
27
|
+
export function channelReports(channel, status) {
|
|
28
|
+
return CHANNEL_REPORTS[channel].includes(status);
|
|
29
|
+
}
|
|
30
|
+
/** Ordem de progresso. Um webhook atrasado nunca deve REGREDIR o estado. */
|
|
31
|
+
const RANK = {
|
|
32
|
+
queued: 0,
|
|
33
|
+
sent: 1,
|
|
34
|
+
delivered: 2,
|
|
35
|
+
read: 3,
|
|
36
|
+
failed: 4,
|
|
37
|
+
opted_out: 5,
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Aplica um estado novo sobre o atual.
|
|
41
|
+
*
|
|
42
|
+
* Webhooks chegam fora de ordem — `delivered` depois de `read` acontece, e
|
|
43
|
+
* aceitar cegamente faria a mensagem "desler". `failed` e `opted_out` são
|
|
44
|
+
* terminais e nunca são sobrescritos por progresso: um `delivered` que chega
|
|
45
|
+
* depois de uma falha registrada é ruído do provider, não correção.
|
|
46
|
+
*/
|
|
47
|
+
export function advanceStatus(current, incoming) {
|
|
48
|
+
if (current === 'failed' || current === 'opted_out')
|
|
49
|
+
return current;
|
|
50
|
+
return RANK[incoming] > RANK[current] ? incoming : current;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Erro permanente nunca deve ser retentado, por mais que o contador permita.
|
|
54
|
+
*
|
|
55
|
+
* `unavailable` e `opted_out` também retornam falso, mas por razão oposta: não
|
|
56
|
+
* são falhas de entrega, e não devem sequer consumir uma tentativa.
|
|
57
|
+
*/
|
|
58
|
+
export function isRetryable(kind) {
|
|
59
|
+
return kind === 'temporary';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Estado que o desfecho assenta, ou `null` quando não assenta nenhum.
|
|
63
|
+
*
|
|
64
|
+
* `temporary` não assenta: a ação continua agendada para nova tentativa.
|
|
65
|
+
* `unavailable` não é tentativa — não gasta retry e não marca falha de entrega.
|
|
66
|
+
*/
|
|
67
|
+
export function statusForOutcome(kind) {
|
|
68
|
+
switch (kind) {
|
|
69
|
+
case 'sent':
|
|
70
|
+
return 'sent';
|
|
71
|
+
case 'opted_out':
|
|
72
|
+
return 'opted_out';
|
|
73
|
+
case 'permanent':
|
|
74
|
+
return 'failed';
|
|
75
|
+
default:
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/communication/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAkD;IAC5E,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;IACnC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC;IACxE,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC;IAC3D,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;CACnD,CAAC;AAEF,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,OAAmB,EAAE,MAAsB;IACxE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,4EAA4E;AAC5E,MAAM,IAAI,GAAmC;IAC3C,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,CAAC;CACb,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,OAAuB,EAAE,QAAwB;IAC7E,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC;IACpE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAyB;IACnD,OAAO,IAAI,KAAK,WAAW,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAyB;IACxD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistência da sessão de Embedded Signup (migração 0044).
|
|
3
|
+
*
|
|
4
|
+
* Duas operações, e a segunda é a que carrega toda a segurança do fluxo:
|
|
5
|
+
* `consumeOnboardingSession` é **atômica e única**. Ela não lê para depois
|
|
6
|
+
* decidir — ela escreve com a condição embutida, e quem não conseguir escrever
|
|
7
|
+
* não consumiu. Um `SELECT` seguido de `UPDATE` deixaria uma janela em que duas
|
|
8
|
+
* requisições simultâneas com o mesmo `state` passariam as duas, e o desfecho
|
|
9
|
+
* disso é dois vínculos criados para uma autorização só.
|
|
10
|
+
*/
|
|
11
|
+
import type { Tx } from '../../db/client.js';
|
|
12
|
+
export interface OnboardingSession {
|
|
13
|
+
id: string;
|
|
14
|
+
tenantId: string;
|
|
15
|
+
product: string;
|
|
16
|
+
brand: string;
|
|
17
|
+
channel: 'whatsapp';
|
|
18
|
+
provider: 'meta_whatsapp';
|
|
19
|
+
status: 'pending' | 'consumed' | 'failed' | 'expired';
|
|
20
|
+
expiresAt: string;
|
|
21
|
+
createdAt: string;
|
|
22
|
+
wabaRef: string | null;
|
|
23
|
+
phoneRef: string | null;
|
|
24
|
+
failureCode: string | null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Janela de vida da sessão.
|
|
28
|
+
*
|
|
29
|
+
* Curta porque o fluxo do Embedded Signup leva minutos, não horas, e uma janela
|
|
30
|
+
* generosa só amplia o intervalo em que um `state` capturado ainda vale. Longa o
|
|
31
|
+
* bastante para o cliente terminar a verificação do número, que é o passo lento.
|
|
32
|
+
*/
|
|
33
|
+
export declare const ONBOARDING_SESSION_TTL_MS: number;
|
|
34
|
+
export interface OpenOnboardingSessionInput {
|
|
35
|
+
tenantId: string;
|
|
36
|
+
product: string;
|
|
37
|
+
brand: string;
|
|
38
|
+
stateHash: string;
|
|
39
|
+
createdBy?: string | null;
|
|
40
|
+
ttlMs?: number;
|
|
41
|
+
now?: Date;
|
|
42
|
+
}
|
|
43
|
+
/** Abre uma sessão `pending`. Roda dentro do contexto do tenant (RLS FORCE). */
|
|
44
|
+
export declare function openOnboardingSession(tx: Tx, input: OpenOnboardingSessionInput): Promise<OnboardingSession>;
|
|
45
|
+
export type ConsumeRejection =
|
|
46
|
+
/** Nenhuma sessão com este state neste tenant. Inclui o state de outro tenant. */
|
|
47
|
+
'unknown_state'
|
|
48
|
+
/** Existe, mas já foi consumida, já falhou, ou a janela passou. */
|
|
49
|
+
| 'not_pending';
|
|
50
|
+
export type ConsumeResult = {
|
|
51
|
+
ok: true;
|
|
52
|
+
session: OnboardingSession;
|
|
53
|
+
} | {
|
|
54
|
+
ok: false;
|
|
55
|
+
reason: ConsumeRejection;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Consome o `state` — uma vez, e só se ainda estiver na janela.
|
|
59
|
+
*
|
|
60
|
+
* O `UPDATE ... WHERE status = 'pending' AND expires_at > now()` é a garantia:
|
|
61
|
+
* duas requisições concorrentes disputam a mesma linha e apenas uma vê
|
|
62
|
+
* `count = 1`. A segunda recebe `not_pending`, que é a verdade.
|
|
63
|
+
*
|
|
64
|
+
* A distinção entre `unknown_state` e `not_pending` fica no servidor e **não vai
|
|
65
|
+
* para a resposta HTTP**: dizer ao cliente qual das duas foi transformaria a
|
|
66
|
+
* rota num oráculo de "este state existe neste tenant".
|
|
67
|
+
*/
|
|
68
|
+
export declare function consumeOnboardingSession(tx: Tx, input: {
|
|
69
|
+
state: string;
|
|
70
|
+
now?: Date;
|
|
71
|
+
}): Promise<ConsumeResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Marca uma sessão já consumida como falha, com a CLASSE do erro.
|
|
74
|
+
*
|
|
75
|
+
* Chamada depois de o `state` ter sido consumido e a troca com a Meta ter
|
|
76
|
+
* falhado. O status não volta para `pending`: o `code` pode ter sido gasto na
|
|
77
|
+
* tentativa, e reabrir a sessão convidaria a uma segunda troca que a Meta
|
|
78
|
+
* recusaria por motivo diferente do real.
|
|
79
|
+
*/
|
|
80
|
+
export declare function failOnboardingSession(tx: Tx, id: string, failureCode: string): Promise<void>;
|
|
81
|
+
/** Registra os identificadores devolvidos pelo fluxo. Não são segredo. */
|
|
82
|
+
export declare function recordOnboardingAssets(tx: Tx, id: string, refs: {
|
|
83
|
+
wabaRef?: string | null;
|
|
84
|
+
phoneRef?: string | null;
|
|
85
|
+
}): Promise<void>;
|
|
86
|
+
/** A última sessão do tenant neste canal — é o que a tela mostra. */
|
|
87
|
+
export declare function latestOnboardingSession(tx: Tx): Promise<OnboardingSession | null>;
|
|
88
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../../src/communication/stores/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAG7C,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAuCD;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AAExD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,gFAAgF;AAChF,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAc5B;AAED,MAAM,MAAM,gBAAgB;AAC1B,kFAAkF;AAChF,eAAe;AACjB,mEAAmE;GACjE,aAAa,CAAC;AAElB,MAAM,MAAM,aAAa,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAErF;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACnC,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,0EAA0E;AAC1E,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC1D,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,qEAAqE;AACrE,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CASvF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistência da sessão de Embedded Signup (migração 0044).
|
|
3
|
+
*
|
|
4
|
+
* Duas operações, e a segunda é a que carrega toda a segurança do fluxo:
|
|
5
|
+
* `consumeOnboardingSession` é **atômica e única**. Ela não lê para depois
|
|
6
|
+
* decidir — ela escreve com a condição embutida, e quem não conseguir escrever
|
|
7
|
+
* não consumiu. Um `SELECT` seguido de `UPDATE` deixaria uma janela em que duas
|
|
8
|
+
* requisições simultâneas com o mesmo `state` passariam as duas, e o desfecho
|
|
9
|
+
* disso é dois vínculos criados para uma autorização só.
|
|
10
|
+
*/
|
|
11
|
+
import { uuidv7 } from '@baruk/shared';
|
|
12
|
+
import { hashSignupState } from '../onboarding.js';
|
|
13
|
+
function mapSession(r) {
|
|
14
|
+
return {
|
|
15
|
+
id: r.id,
|
|
16
|
+
tenantId: r.tenant_id,
|
|
17
|
+
product: r.product,
|
|
18
|
+
brand: r.brand,
|
|
19
|
+
channel: r.channel,
|
|
20
|
+
provider: r.provider,
|
|
21
|
+
status: r.status,
|
|
22
|
+
expiresAt: r.expires_at.toISOString(),
|
|
23
|
+
createdAt: r.created_at.toISOString(),
|
|
24
|
+
wabaRef: r.waba_ref,
|
|
25
|
+
phoneRef: r.phone_ref,
|
|
26
|
+
failureCode: r.failure_code,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const COLUMNS = `
|
|
30
|
+
id, tenant_id, product, brand, channel, provider, status,
|
|
31
|
+
expires_at, created_at, waba_ref, phone_ref, failure_code
|
|
32
|
+
`;
|
|
33
|
+
/**
|
|
34
|
+
* Janela de vida da sessão.
|
|
35
|
+
*
|
|
36
|
+
* Curta porque o fluxo do Embedded Signup leva minutos, não horas, e uma janela
|
|
37
|
+
* generosa só amplia o intervalo em que um `state` capturado ainda vale. Longa o
|
|
38
|
+
* bastante para o cliente terminar a verificação do número, que é o passo lento.
|
|
39
|
+
*/
|
|
40
|
+
export const ONBOARDING_SESSION_TTL_MS = 30 * 60 * 1000;
|
|
41
|
+
/** Abre uma sessão `pending`. Roda dentro do contexto do tenant (RLS FORCE). */
|
|
42
|
+
export async function openOnboardingSession(tx, input) {
|
|
43
|
+
const now = input.now ?? new Date();
|
|
44
|
+
const expiresAt = new Date(now.getTime() + (input.ttlMs ?? ONBOARDING_SESSION_TTL_MS));
|
|
45
|
+
const rows = await tx `
|
|
46
|
+
INSERT INTO channel_onboarding_session
|
|
47
|
+
(id, tenant_id, product, brand, channel, provider, state_hash, created_by, expires_at)
|
|
48
|
+
VALUES
|
|
49
|
+
(${uuidv7()}, ${input.tenantId}, ${input.product}, ${input.brand},
|
|
50
|
+
'whatsapp', 'meta_whatsapp', ${input.stateHash}, ${input.createdBy ?? null},
|
|
51
|
+
${expiresAt.toISOString()})
|
|
52
|
+
RETURNING ${tx.unsafe(COLUMNS)}
|
|
53
|
+
`;
|
|
54
|
+
return mapSession(rows[0]);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Consome o `state` — uma vez, e só se ainda estiver na janela.
|
|
58
|
+
*
|
|
59
|
+
* O `UPDATE ... WHERE status = 'pending' AND expires_at > now()` é a garantia:
|
|
60
|
+
* duas requisições concorrentes disputam a mesma linha e apenas uma vê
|
|
61
|
+
* `count = 1`. A segunda recebe `not_pending`, que é a verdade.
|
|
62
|
+
*
|
|
63
|
+
* A distinção entre `unknown_state` e `not_pending` fica no servidor e **não vai
|
|
64
|
+
* para a resposta HTTP**: dizer ao cliente qual das duas foi transformaria a
|
|
65
|
+
* rota num oráculo de "este state existe neste tenant".
|
|
66
|
+
*/
|
|
67
|
+
export async function consumeOnboardingSession(tx, input) {
|
|
68
|
+
const state = input.state?.trim() ?? '';
|
|
69
|
+
if (!state)
|
|
70
|
+
return { ok: false, reason: 'unknown_state' };
|
|
71
|
+
const stateHash = hashSignupState(state);
|
|
72
|
+
const now = input.now ?? new Date();
|
|
73
|
+
const rows = await tx `
|
|
74
|
+
UPDATE channel_onboarding_session
|
|
75
|
+
SET status = 'consumed', consumed_at = ${now.toISOString()}, updated_at = now()
|
|
76
|
+
WHERE state_hash = ${stateHash}
|
|
77
|
+
AND status = 'pending'
|
|
78
|
+
AND expires_at > ${now.toISOString()}
|
|
79
|
+
RETURNING ${tx.unsafe(COLUMNS)}
|
|
80
|
+
`;
|
|
81
|
+
const row = rows[0];
|
|
82
|
+
if (row)
|
|
83
|
+
return { ok: true, session: mapSession(row) };
|
|
84
|
+
// Não conseguiu consumir. A linha existe (e não está mais elegível) ou nunca
|
|
85
|
+
// existiu neste tenant — a RLS já respondeu por essa segunda hipótese.
|
|
86
|
+
const existing = await tx `
|
|
87
|
+
SELECT id FROM channel_onboarding_session WHERE state_hash = ${stateHash} LIMIT 1
|
|
88
|
+
`;
|
|
89
|
+
return { ok: false, reason: existing[0] ? 'not_pending' : 'unknown_state' };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Marca uma sessão já consumida como falha, com a CLASSE do erro.
|
|
93
|
+
*
|
|
94
|
+
* Chamada depois de o `state` ter sido consumido e a troca com a Meta ter
|
|
95
|
+
* falhado. O status não volta para `pending`: o `code` pode ter sido gasto na
|
|
96
|
+
* tentativa, e reabrir a sessão convidaria a uma segunda troca que a Meta
|
|
97
|
+
* recusaria por motivo diferente do real.
|
|
98
|
+
*/
|
|
99
|
+
export async function failOnboardingSession(tx, id, failureCode) {
|
|
100
|
+
await tx `
|
|
101
|
+
UPDATE channel_onboarding_session
|
|
102
|
+
SET status = 'failed', failure_code = ${failureCode.slice(0, 60)}, updated_at = now()
|
|
103
|
+
WHERE id = ${id}
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
/** Registra os identificadores devolvidos pelo fluxo. Não são segredo. */
|
|
107
|
+
export async function recordOnboardingAssets(tx, id, refs) {
|
|
108
|
+
await tx `
|
|
109
|
+
UPDATE channel_onboarding_session
|
|
110
|
+
SET waba_ref = ${refs.wabaRef ?? null},
|
|
111
|
+
phone_ref = ${refs.phoneRef ?? null},
|
|
112
|
+
updated_at = now()
|
|
113
|
+
WHERE id = ${id}
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
116
|
+
/** A última sessão do tenant neste canal — é o que a tela mostra. */
|
|
117
|
+
export async function latestOnboardingSession(tx) {
|
|
118
|
+
const rows = await tx `
|
|
119
|
+
SELECT ${tx.unsafe(COLUMNS)}
|
|
120
|
+
FROM channel_onboarding_session
|
|
121
|
+
WHERE channel = 'whatsapp'
|
|
122
|
+
ORDER BY created_at DESC
|
|
123
|
+
LIMIT 1
|
|
124
|
+
`;
|
|
125
|
+
return rows[0] ? mapSession(rows[0]) : null;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../../src/communication/stores/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAgCnD,SAAS,UAAU,CAAC,CAAa;IAC/B,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,OAAO,EAAE,CAAC,CAAC,OAAqB;QAChC,QAAQ,EAAE,CAAC,CAAC,QAA2B;QACvC,MAAM,EAAE,CAAC,CAAC,MAAqC;QAC/C,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE,CAAC,CAAC,QAAQ;QACnB,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,WAAW,EAAE,CAAC,CAAC,YAAY;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAG;;;CAGf,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAYxD,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAM,EACN,KAAiC;IAEjC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAC,CAAC;IAEvF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAc;;;;SAI5B,MAAM,EAAE,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK;sCAChC,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,IAAI;SACxE,SAAS,CAAC,WAAW,EAAE;gBAChB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;GAC/B,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;AAC9B,CAAC;AAWD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,EAAM,EACN,KAAoC;IAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1D,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAc;;gDAEW,GAAG,CAAC,WAAW,EAAE;0BACvC,SAAS;;0BAET,GAAG,CAAC,WAAW,EAAE;gBAC3B,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;GAC/B,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAEvD,6EAA6E;IAC7E,uEAAuE;IACvE,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAkB;mEACsB,SAAS;GACzE,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;AAC9E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAM,EACN,EAAU,EACV,WAAmB;IAEnB,MAAM,EAAE,CAAA;;+CAEqC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;kBACrD,EAAE;GACjB,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAM,EACN,EAAU,EACV,IAA2D;IAE3D,MAAM,EAAE,CAAA;;wBAEc,IAAI,CAAC,OAAO,IAAI,IAAI;yBACnB,IAAI,CAAC,QAAQ,IAAI,IAAI;;kBAE5B,EAAE;GACjB,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAAM;IAClD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAc;aACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;;;;;GAK5B,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC"}
|