@wildo-ai/saas-backend-lib 1.1.1 → 1.1.3
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/dist/esm/applications/services/worker-remote-client-factory.backend.service.d.ts.map +1 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js +19 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js +4 -0
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts +35 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js +111 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts +50 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js +199 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts +111 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts.map +1 -1
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js +140 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts +14 -3
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +138 -24
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts +3 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js +8 -3
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts +11 -0
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js +11 -2
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts +124 -13
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +207 -21
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts +60 -8
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +174 -26
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +48 -4
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +102 -30
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts +89 -14
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js +84 -11
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js +16 -0
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts +20 -6
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +96 -32
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts +3 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js +32 -7
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts +8 -5
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +80 -0
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +298 -23
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts +71 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +85 -5
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts +21 -0
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +146 -4
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts +22 -0
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts +3 -26
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js +3 -68
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +4 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts +11 -0
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js +39 -5
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +181 -2
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +533 -43
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts +36 -3
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.js +70 -8
- package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts +28 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js +90 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts +44 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js +99 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts +91 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js +152 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +186 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +474 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts +100 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js +209 -6
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts +200 -4
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js +593 -64
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts +36 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js +83 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts +9 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js +11 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +54 -13
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +38 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +67 -2
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts +30 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js +43 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts +11 -3
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js +30 -16
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js +104 -25
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +18 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +106 -2
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts +52 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js +74 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -0
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts +104 -11
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +260 -26
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts +30 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.js +25 -0
- package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js +11 -4
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +263 -13
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +376 -58
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +264 -7
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +414 -5
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +16 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +140 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +65 -6
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +45 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts +5 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js +6 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.js +7 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.js.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.d.ts +146 -46
- package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.js +121 -12
- package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts +38 -15
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js +17 -2
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts +0 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.js +68 -76
- package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
- package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts +43 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.js +52 -3
- package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +25 -0
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js +41 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.d.ts +2 -2
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js +2 -2
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js.map +1 -1
- package/dist/esm/databases/models/filter.backend.schemas.js +2 -2
- package/dist/esm/databases/models/filter.backend.schemas.js.map +1 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js +20 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js +48 -0
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
- package/dist/esm/databases/services/redis.service.d.ts +27 -0
- package/dist/esm/databases/services/redis.service.d.ts.map +1 -1
- package/dist/esm/databases/services/redis.service.js +29 -0
- package/dist/esm/databases/services/redis.service.js.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
- package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.js +134 -8
- package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
- package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts +41 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js +40 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts +64 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js +193 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js.map +1 -0
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +72 -4
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +60 -19
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
- package/dist/esm/external-data/external-data-transform.backend.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-transform.backend.js +7 -1
- package/dist/esm/external-data/external-data-transform.backend.js.map +1 -1
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts +2 -0
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts.map +1 -1
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js +13 -0
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts +4 -2
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +256 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +333 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js +211 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts +45 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js +216 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js +78 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -0
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js +2 -2
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts +89 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js +164 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts +26 -27
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js +50 -64
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.js +3 -3
- package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.js +4 -4
- package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +306 -7
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +539 -45
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +25 -2
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
- package/dist/esm/files/controllers/file.controller.d.ts +24 -1
- package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
- package/dist/esm/files/controllers/file.controller.js +83 -11
- package/dist/esm/files/controllers/file.controller.js.map +1 -1
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts +17 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts.map +1 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js +1 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js.map +1 -0
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts +5 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +76 -13
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-operation-handler.backend.service.d.ts +18 -0
- package/dist/esm/files/services/file-operation-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-operation-handler.backend.service.js +36 -28
- package/dist/esm/files/services/file-operation-handler.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.d.ts +94 -9
- package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.js +197 -17
- package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts +60 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.js +167 -8
- package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +214 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.js +566 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -0
- package/dist/esm/files/services/files.backend.service.d.ts +87 -0
- package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/files.backend.service.js +252 -19
- package/dist/esm/files/services/files.backend.service.js.map +1 -1
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts +109 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js +123 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -0
- package/dist/esm/files/storage/file-storage-provider.types.d.ts +16 -10
- package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
- package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts +67 -8
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js +101 -28
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js +8 -55
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js +20 -0
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
- package/dist/esm/files/utils/file-uploader.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/file-uploader.utils.js +12 -0
- package/dist/esm/files/utils/file-uploader.utils.js.map +1 -1
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts +86 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js +288 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts +15 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js +76 -5
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js +6 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts +60 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js +63 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +200 -44
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts +0 -13
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js +14 -22
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts +8 -3
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js +25 -15
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts +13 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +88 -8
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +333 -31
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js +4 -2
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts +113 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js +62 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -0
- package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/actors-system.backend.service.js +0 -2
- package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts +107 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.js +519 -56
- package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +5 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +79 -16
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +34 -5
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js +154 -20
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.js +27 -23
- package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js +7 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts +90 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js +368 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts +151 -41
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +308 -143
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts +0 -207
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js +8 -243
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts +9 -14
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js +18 -89
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts +86 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js +155 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts +10 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js +55 -5
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
- package/dist/esm/index.d.ts +15 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +45 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/inject/models/container.d.ts.map +1 -1
- package/dist/esm/inject/models/container.js +82 -10
- package/dist/esm/inject/models/container.js.map +1 -1
- package/dist/esm/inject/models/service-types.d.ts +20 -3
- package/dist/esm/inject/models/service-types.d.ts.map +1 -1
- package/dist/esm/inject/models/service-types.js +21 -3
- package/dist/esm/inject/models/service-types.js.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.js +32 -4
- package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts +34 -0
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.js +42 -0
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.js.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +84 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.js +235 -11
- package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts +64 -2
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +152 -6
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js +49 -4
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts +66 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js +199 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts +149 -13
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js +411 -19
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts +11 -2
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts +28 -9
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js +30 -10
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
- package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.js +52 -11
- package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts +62 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js +78 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +309 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +385 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts +21 -0
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.js +38 -0
- package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -80
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -25
- package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -49
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -141
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -37
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -121
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts +66 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js +105 -10
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -58
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -223
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js +10 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.d.ts +60 -4
- package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.js +145 -43
- package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts +0 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
- package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +108 -13
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +432 -101
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +2 -2
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.js +5 -5
- package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +54 -7
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts +5 -5
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js +14 -13
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts +2 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +18 -8
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +20 -18
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts +16 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js +18 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js +63 -2
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js +4 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts +66 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js +257 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts +12 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js +47 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts +87 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts +31 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js +13 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts +19 -25
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js +33 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.js +1 -4
- package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.js +1 -4
- package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.js +1 -4
- package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts +8 -4
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.js +25 -17
- package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
- package/dist/esm/queue/queue.backend.service.d.ts +3 -3
- package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue.backend.service.js +26 -4
- package/dist/esm/queue/queue.backend.service.js.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts +2 -2
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js +18 -3
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts +50 -25
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js +147 -39
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
- package/dist/esm/requests/service/websocket.service.d.ts +9 -0
- package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
- package/dist/esm/requests/service/websocket.service.js +88 -15
- package/dist/esm/requests/service/websocket.service.js.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +16 -2
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.js +2 -0
- package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js +14 -0
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts +2 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.js +8 -0
- package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
- package/dist/esm/resources/services/resource-id.backend.service.js +3 -3
- package/dist/esm/resources/services/resource-id.backend.service.js.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts +60 -5
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.js +91 -7
- package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts +36 -3
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.js +32 -10
- package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.js +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
- package/dist/esm/runtime/services/execution-context-creator.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/execution-context-creator.backend.service.js +13 -7
- package/dist/esm/runtime/services/execution-context-creator.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts +51 -0
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.d.ts +26 -0
- package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.js +181 -1
- package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts +47 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.js +343 -77
- package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts +15 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js +28 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts +5 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js +24 -4
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +29 -4
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts +114 -0
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js +354 -3
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts +1 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js +22 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts +3 -23
- package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/jwt.backend.schemas.js +20 -45
- package/dist/esm/security/authentications/models/jwt.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts +0 -2
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js +23 -14
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts +0 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js +15 -12
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts +113 -3
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js +207 -30
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts +95 -2
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js +153 -9
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +190 -0
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +377 -53
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts +9 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +77 -2
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js +5 -3
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts +41 -0
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js +202 -23
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +42 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +34 -4
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts +29 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js +77 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +41 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +87 -4
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts +28 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +283 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts +35 -0
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js +111 -21
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts +14 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js +49 -8
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js +4 -0
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js +6 -0
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts +37 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js +51 -0
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts +41 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js +45 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts +116 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js +162 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -0
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js +24 -1
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js.map +1 -1
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts +20 -20
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js +27 -28
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +77 -3
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts +117 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js +104 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js.map +1 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +93 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js +95 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -0
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +124 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +142 -5
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +175 -14
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js +385 -49
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +6 -14
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +13 -22
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts +60 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js +79 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +161 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +512 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +59 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js +22 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts +44 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js +20 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +191 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +385 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts +41 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js +358 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts +160 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +266 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +111 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +107 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts +54 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +153 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +195 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +387 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts +45 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js +291 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +62 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js +29 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts +127 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js +277 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts +66 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js +75 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -0
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts +18 -1
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js +110 -74
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js.map +1 -1
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts +22 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts.map +1 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js +22 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js.map +1 -0
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts +17 -3
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js +12 -0
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +41 -3
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +83 -20
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
- package/dist/esm/security/jwt/services/jwt.backend.service.d.ts.map +1 -1
- package/dist/esm/security/jwt/services/jwt.backend.service.js +1 -18
- package/dist/esm/security/jwt/services/jwt.backend.service.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts +26 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js +43 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +8 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +49 -0
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.js +17 -5
- package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts +67 -29
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js +47 -25
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts +143 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js +258 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts +39 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js +159 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +17 -9
- package/dist/esm/.builder.pid +0 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.backend.service.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Email Backend Service\n *\n * Main service for sending emails. Orchestrates:\n * - File-based template resolution via EmailTemplateRegistryBackendService\n * - Context building\n * - React Email rendering (subject fn + body fn → HTML/text)\n * - Provider resolution and HTTP execution\n */\n\nimport { injectable, inject } from 'inversify';\nimport { render } from '@react-email/render';\nimport { randomUUID } from 'node:crypto';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport type { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport {\n getConfiguredFallbackLanguage,\n getConfiguredPrimaryLanguage,\n} from '~wildo-backend-lib/config/services/app-configuration.backend.utils';\nimport type { ExternalProvidersRegistryBackendService } from '~wildo-backend-lib/external-providers/services/external-providers-registry.backend.service';\nimport type { EmailContextProviderRegistryBackendService } from './email-context-provider-registry.backend.service';\nimport type { EmailTemplateRegistryBackendService } from './email-template-registry.backend.service';\nimport { buildEmailBrandTokensFromConfig, type EmailBrandTokens } from '~wildo-backend-lib/notifications/email/utils/color-conversion.utils';\nimport {\n EmailTemplateContext,\n EmailTemplateType_ToEngineCapability,\n EmailTemplateType,\n EngineCapability,\n ErrorCustomMessageReference,\n ErrorType,\n isWildoBackendError,\n WildoHeaderKeys,\n} from '@wildo-ai/saas-models';\nimport type {\n StandardEmail_SendRequest,\n StandardEmail_SendResponse,\n} from '@wildo-ai/external-connectors-models';\nimport {\n EmailProviderPayloadEncoding,\n EmailProviderSubmissionClassification,\n ExternalProvider_ExchangeProtocol_Kind,\n StandardEmail_SendRequestSchema,\n StandardEmail_SendResponseSchema,\n} from '@wildo-ai/external-connectors-models';\nimport type {\n EmailProviderSendRequest,\n EmailProviderSendResponseInput,\n} from '@wildo-ai/external-connectors-private/backend';\nimport { AvailableLanguage } from '@wildo-ai/presets-components-models';\nimport {\n EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS,\n} from '~wildo-backend-lib/notifications/email/models/email-transport.backend.definitions';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction validateEmailAddresses(emails: string[]): string[] {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emails.filter(email => !emailRegex.test(email.trim()));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface EmailSendRequest {\n /**\n * Stable identity of one logical provider submission. A caller that can\n * retry across process/job boundaries must persist and reuse this value.\n * Ephemeral callers may omit it and let the service allocate one.\n */\n submissionId?: string;\n /** Template reference (e.g., \"system.welcome_email\") */\n templateRef: string;\n /** Locale for template selection */\n locale: AvailableLanguage;\n /** Email type for provider routing */\n type: EmailTemplateType;\n /** Primary recipient email(s) */\n to: string | string[];\n /** CC recipients (optional) */\n cc?: string[];\n /** BCC recipients (optional) */\n bcc?: string[];\n /** Reply-to address (optional) */\n replyTo?: string;\n /** From address (optional - uses provider default if not specified) */\n from?: string;\n /** Context for template rendering */\n context: EmailTemplateContext;\n /** File IDs for attachments (optional) */\n attachmentFileIds?: string[];\n /** Organization ID for org-scoped templates (optional) */\n organizationId?: string;\n}\n\nexport enum EmailSubmissionOutcome {\n NOT_SUBMITTED = 'not_submitted',\n PROVIDER_ACCEPTED = 'provider_accepted',\n PROVIDER_REJECTED = 'provider_rejected',\n ACCEPTANCE_UNKNOWN = 'acceptance_unknown',\n}\n\nexport interface EmailSendResult {\n success: boolean;\n /**\n * Whether an at-least-once caller should retry. An acceptance-unknown retry\n * can duplicate an externally visible email; provider-native idempotency is\n * only an optional risk reduction.\n */\n retryable: boolean;\n submissionId: string;\n outcome: EmailSubmissionOutcome;\n /** All honest provider receipts. Empty means no receipt was returned. */\n providerMessageIds: string[];\n /** Provider confirmed that this logical submission was already accepted. */\n deduplicated?: boolean;\n rejectedRecipients?: Array<{ email: string; reason?: string }>;\n providerId?: string;\n error?: string;\n templateRef: string;\n recipientCount: number;\n}\n\n/**\n * Fields common to every resolved email provider regardless of delivery\n * mode. `from*` come from the app's `providerConfigurations` override, not\n * the runtime contract.\n */\ninterface EmailProviderConfig_Base {\n providerId: string;\n fromAddress?: string;\n fromName?: string;\n}\n\n/**\n * Network delivery — the resolved shape for every real provider (Resend,\n * SendGrid, …). Carries the composed endpoint, auth material, and the\n * provider-specific request builder/parser used by\n * `executeProviderRequest`'s `fetch` path.\n */\ninterface EmailProviderConfig_Network extends EmailProviderConfig_Base {\n delivery: 'network';\n apiKey: string;\n endpoint: string;\n authHeaderName: string;\n authPrefix?: string;\n authScheme?: 'api-key' | 'bearer' | 'basic';\n basicUsername?: string;\n domain?: string;\n /**\n * Wire encoding the provider expects for its request body. Every network\n * provider declares this on its runtime contract; there is no fallback\n * encoding at the consumer boundary.\n */\n payloadEncoding: EmailProviderPayloadEncoding;\n /**\n * Whether the provider expects the API key to be embedded in the JSON\n * payload body (Mailchimp's `key` field). Sourced from the provider\n * module's `runtimeContract.embedsApiKeyInBody`. Defaults to `false`.\n */\n embedsApiKeyInBody: boolean;\n /**\n * Per-provider send-payload builder. Sourced from the provider\n * module's `runtimeContract.buildSendRequest`. Receives the\n * normalized `StandardEmail_SendRequest` plus the optional\n * `configuredDomain` (Mailgun's `{domain}` token).\n */\n buildSendRequest: (\n input: { request: StandardEmail_SendRequest; configuredDomain?: string },\n ) => EmailProviderSendRequest;\n parseSendResponse: (\n input: EmailProviderSendResponseInput,\n ) => StandardEmail_SendResponse;\n}\n\n/**\n * Log delivery — the resolved shape for the dev `preview` provider. Carries\n * NO endpoint / apiKey / payload builder because it never opens a socket;\n * `executeProviderRequest` renders + logs the email without fabricating a\n * provider receipt. Discriminated from network on `delivery` so consumers branch\n * on the contract, never on the provider ref.\n */\ninterface EmailProviderConfig_Log extends EmailProviderConfig_Base {\n delivery: 'log';\n}\n\ntype EmailProviderConfig = EmailProviderConfig_Network | EmailProviderConfig_Log;\n\ntype EmailProviderExecutionResult =\n | {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED;\n response: StandardEmail_SendResponse;\n receiptParseError?: string;\n /**\n * The adapter explicitly classified the submission as accepted but\n * violated another response-contract invariant. Acceptance remains the\n * no-replay authority while the violation stays observable.\n */\n adapterContractViolation?: string;\n }\n | {\n outcome:\n | EmailSubmissionOutcome.PROVIDER_REJECTED\n | EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN;\n error: string;\n retryable: boolean;\n };\n\ninterface EmailAddress {\n email: string;\n name?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE\n// ─────────────────────────────────────────────────────────────────────────────\n\n@injectable()\nexport class EmailBackendService {\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.EmailTemplateRegistry) private readonly templateRegistry: EmailTemplateRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.EmailContextProviderRegistry) private readonly contextProviderRegistry: EmailContextProviderRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly configService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ExternalProvidersRegistryService) private readonly externalProvidersRegistry: ExternalProvidersRegistryBackendService,\n ) {\n this.logDebug = this.logger.debugByType('EmailBackendService');\n this.logger.setDebugTypeLogging('EmailBackendService', false);\n }\n\n /**\n * Send an email using a file-based template definition.\n */\n async send(request: EmailSendRequest): Promise<EmailSendResult> {\n const startTime = Date.now();\n const submissionId = request.submissionId ?? randomUUID();\n let providerTransportStarted = false;\n this.logger.info('Sending email', {\n templateRef: request.templateRef,\n submissionId,\n locale: request.locale,\n recipientCount: Array.isArray(request.to) ? request.to.length : 1,\n });\n\n try {\n // 0. Validate email addresses\n const recipients = Array.isArray(request.to) ? request.to : [request.to];\n const allEmails = [\n ...recipients,\n ...(request.cc || []),\n ...(request.bcc || []),\n ...(request.replyTo ? [request.replyTo] : []),\n ];\n\n const invalidEmails = validateEmailAddresses(allEmails);\n if (invalidEmails.length > 0) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.EMAIL_INVALID_ADDRESS_FORMAT,\n context: {\n // diagnostic (log-only)\n invalidEmails,\n },\n },\n );\n }\n\n // 1. Resolve template + labels from file-based registry\n const defaultLocale = this.getDefaultLocale();\n const resolved = this.templateRegistry.resolve(\n request.templateRef,\n request.locale,\n defaultLocale,\n this.getFallbackLocale(),\n );\n\n // 2. Get design tokens\n const brandTokens = this.getDesignTokens();\n\n // 3. Build additional context from providers\n const additionalContext = await this.contextProviderRegistry.buildAdditionalContext(\n {\n templateRef: request.templateRef,\n locale: request.locale,\n baseContext: request.context,\n },\n this.createProviderUtils(),\n );\n\n // 4. Build full context\n const fullContext: EmailTemplateContext = {\n currentObject: request.context.currentObject,\n objectContext: request.context.objectContext,\n userContext: request.context.userContext,\n additionalContext: {\n ...(request.context.additionalContext as Record<string, unknown> || {}),\n ...additionalContext,\n },\n };\n\n // 5. Render subject and body from definition functions\n const templateProps = { context: fullContext, brand: brandTokens, labels: resolved.labels };\n const subject = resolved.definition.subject(templateProps);\n const bodyElement = resolved.definition.body(templateProps);\n\n const bodyHtml = await render(bodyElement, { pretty: true });\n const bodyText = await render(bodyElement, { plainText: true });\n\n // 6. Resolve provider\n const emailType = resolved.definition.type ?? request.type;\n const engineCapability = EmailTemplateType_ToEngineCapability[emailType];\n const providerConfig = this.resolveEmailProvider(engineCapability);\n\n // 7. Build email request\n const emailRequest = this.buildEmailRequest(\n request,\n submissionId,\n { subject, bodyHtml, bodyText },\n providerConfig,\n recipients,\n );\n\n const providerRequest = providerConfig.delivery === 'network'\n ? providerConfig.buildSendRequest({\n request: emailRequest,\n configuredDomain: providerConfig.domain,\n })\n : undefined;\n\n // 8. Execute send via provider\n const execution = await this.executeProviderRequest(\n providerConfig,\n emailRequest,\n providerRequest,\n () => {\n providerTransportStarted = true;\n },\n );\n const durationMs = Date.now() - startTime;\n\n if (execution.outcome !== EmailSubmissionOutcome.PROVIDER_ACCEPTED) {\n this.logger.warn('Email provider did not confirm acceptance', {\n templateRef: request.templateRef,\n submissionId,\n outcome: execution.outcome,\n providerId: providerConfig.providerId,\n error: execution.error,\n durationMs,\n });\n return {\n success: false,\n retryable: execution.retryable,\n submissionId,\n outcome: execution.outcome,\n providerMessageIds: [],\n providerId: providerConfig.providerId,\n error: execution.error,\n templateRef: request.templateRef,\n recipientCount: recipients.length,\n };\n }\n\n const providerMessageIds = execution.response.providerMessageIds;\n this.logger.info('Email submission accepted', {\n templateRef: request.templateRef,\n submissionId,\n providerMessageIds,\n deduplicated: execution.response.deduplicated,\n providerReceiptMissing: providerMessageIds.length === 0,\n receiptParseError: execution.receiptParseError,\n adapterContractViolation: execution.adapterContractViolation,\n providerId: providerConfig.providerId,\n durationMs,\n });\n\n return {\n success: execution.response.success,\n retryable: false,\n submissionId,\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n providerMessageIds,\n deduplicated: execution.response.deduplicated,\n rejectedRecipients: execution.response.rejectedRecipients,\n providerId: providerConfig.providerId,\n error: execution.adapterContractViolation\n ?? (execution.response.success\n ? undefined\n : this.describeRejectedRecipients(\n execution.response.rejectedRecipients,\n )),\n templateRef: request.templateRef,\n recipientCount: recipients.length,\n };\n } catch (err) {\n const error = err as Error;\n const durationMs = Date.now() - startTime;\n\n this.logger.error('Email send failed', {\n templateRef: request.templateRef,\n errorMessage: error.message,\n durationMs,\n });\n\n if (isWildoBackendError(err) && (err.type === ErrorType.CONFIGURATION || err.type === ErrorType.VALIDATION)) {\n throw err;\n }\n\n return {\n success: false,\n retryable: true,\n submissionId,\n outcome: providerTransportStarted\n ? EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN\n : EmailSubmissionOutcome.NOT_SUBMITTED,\n providerMessageIds: [],\n error: error.message,\n templateRef: request.templateRef,\n recipientCount: Array.isArray(request.to) ? request.to.length : 1,\n };\n }\n }\n\n /**\n * Send email to multiple recipients individually (different context per recipient).\n */\n async sendToMultiple(requests: EmailSendRequest[]): Promise<EmailSendResult[]> {\n const results: EmailSendResult[] = [];\n for (const request of requests) {\n const result = await this.send(request);\n results.push(result);\n }\n return results;\n }\n\n private getDefaultLocale(): AvailableLanguage {\n return getConfiguredPrimaryLanguage(this.configService.config);\n }\n\n private getFallbackLocale(): AvailableLanguage {\n return getConfiguredFallbackLanguage(this.configService.config);\n }\n\n private getDesignTokens(): EmailBrandTokens {\n try {\n return buildEmailBrandTokensFromConfig(this.configService.config.email?.brandTokens);\n } catch (err) {\n this.logger.warn('Failed to extract design tokens, using defaults', {\n errorMessage: (err as Error).message,\n });\n return buildEmailBrandTokensFromConfig(undefined);\n }\n }\n\n private resolveEmailProvider(capability: EngineCapability): EmailProviderConfig {\n const providerId = this.externalProvidersRegistry.getPrimaryProviderForEngineCapability(capability);\n\n if (!providerId) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No email provider configured for capability: ${capability}`, capability } },\n );\n }\n\n if (!this.externalProvidersRegistry.isProviderEnabled(providerId, ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER)) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `Email provider is disabled by external provider configuration: ${providerId}`, providerId, capability } },\n );\n }\n\n const emailContract = this.externalProvidersRegistry.getProviderConfiguration(\n providerId,\n ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER,\n )?.runtimeContract;\n if (emailContract?.kind !== 'email') {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No EMAIL_PROVIDER runtime contract found for provider: ${providerId}`, providerId, capability } },\n );\n }\n\n const appConfig = this.configService.config as Record<string, unknown>;\n const providersConfig = appConfig?.providerConfigurations as Record<string, Record<string, {\n fromAddress?: string;\n fromName?: string;\n domain?: string;\n }> | undefined> | undefined;\n const providerConfig = providersConfig?.[providerId]?.[ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER];\n\n // Non-sending delivery (the dev `preview` provider): no endpoint, no\n // API key. Branch on the CONTRACT field — never the provider ref — so\n // this stays a first-class provider and passes the\n // no-provider-ref-branches guard; `executeProviderRequest` renders +\n // logs instead of opening a socket. Resolved BEFORE the API-key\n // requirement below so a log provider doesn't need a secret at all.\n if (emailContract.delivery === 'log') {\n return {\n providerId,\n delivery: 'log',\n fromAddress: providerConfig?.fromAddress,\n fromName: providerConfig?.fromName,\n };\n }\n\n // Network delivery — a live provider API key is required.\n const apiKey = this.externalProvidersRegistry.getProviderApiKey(\n providerId,\n ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER,\n );\n if (!apiKey) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No env-provided API key configured for provider: ${providerId}`, providerId, capability } },\n );\n }\n\n // Resolve the path-token domain (Mailgun) from the contract's declared\n // `sendEndpointPathTokens`. The branch is contract-driven, not ref-keyed:\n // any provider that declares the `'domain'` token gets the same treatment.\n const requiresDomainToken = emailContract.sendEndpointPathTokens?.includes('domain') === true;\n const configuredDomain = requiresDomainToken\n ? providerConfig?.domain ?? process.env[`${providerId.toUpperCase()}_DOMAIN`]\n : providerConfig?.domain;\n if (requiresDomainToken && !configuredDomain) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `Email provider '${providerId}' declares a {domain} send-endpoint token but no domain is configured.`, providerId } },\n );\n }\n\n return {\n providerId,\n delivery: 'network',\n apiKey,\n endpoint: this.composeEmailSendEndpoint(emailContract.baseUrl, emailContract.sendEndpointPath, configuredDomain),\n authHeaderName: emailContract.apiKey.headerName,\n authPrefix: emailContract.apiKey.prefix,\n authScheme: emailContract.apiKey.scheme,\n basicUsername: emailContract.apiKey.basicUsername,\n fromAddress: providerConfig?.fromAddress,\n fromName: providerConfig?.fromName,\n domain: configuredDomain,\n payloadEncoding: emailContract.payloadEncoding,\n embedsApiKeyInBody: emailContract.embedsApiKeyInBody === true,\n buildSendRequest: emailContract.buildSendRequest,\n parseSendResponse: emailContract.parseSendResponse,\n };\n }\n\n private buildEmailRequest(\n request: EmailSendRequest,\n submissionId: string,\n rendered: { subject: string; bodyHtml: string; bodyText: string },\n providerConfig: EmailProviderConfig,\n recipients: string[],\n ): StandardEmail_SendRequest {\n const toAddresses: EmailAddress[] = recipients.map(email => ({ email }));\n\n // From-address precedence: per-send override → per-provider config\n // (`providerConfigurations.<provider>.EMAIL_PROVIDER.fromAddress`) → the\n // app's global `email.from`. The latter is REQUIRED by\n // `AppConfiguration_Email_Schema`, so it is the normal source; the literal\n // fallback is a defensive last resort that should be unreachable once\n // config is initialized. Previously `email.from` was silently ignored —\n // the send fell back to the literal, producing an unverified/invalid\n // sender that providers reject.\n const configuredFrom = this.configService.config.email?.from;\n const from: EmailAddress = {\n email: request.from || providerConfig.fromAddress || configuredFrom || 'noreply@example.com',\n name: providerConfig.fromName,\n };\n\n return StandardEmail_SendRequestSchema.parse({\n submissionId,\n from,\n to: toAddresses,\n cc: request.cc?.map(email => ({ email })),\n bcc: request.bcc?.map(email => ({ email })),\n replyTo: request.replyTo ? { email: request.replyTo } : undefined,\n subject: rendered.subject,\n html: rendered.bodyHtml,\n text: rendered.bodyText,\n });\n }\n\n private async executeProviderRequest(\n providerConfig: EmailProviderConfig,\n request: StandardEmail_SendRequest,\n providerRequest?: EmailProviderSendRequest,\n onTransportStart?: () => void,\n ): Promise<EmailProviderExecutionResult> {\n // Log delivery (dev `preview` provider): the template is already\n // rendered — surface it in the logs (subject, recipients, body preview)\n // without inventing a provider receipt. No network I/O. Narrowing on the\n // contract-derived `delivery` field also gates the network-only fields\n // (`endpoint`, `buildSendRequest`, …) accessed below.\n if (providerConfig.delivery === 'log') {\n const recipients = request.to.map(recipient => recipient.email);\n this.logger.info('[email-preview] Email logged instead of sent (log-delivery provider)', {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n from: request.from?.email,\n to: recipients,\n cc: request.cc?.map(recipient => recipient.email),\n bcc: request.bcc?.map(recipient => recipient.email),\n subject: request.subject,\n textPreview: request.text?.slice(0, 2000),\n });\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n response: {\n success: true,\n classification: EmailProviderSubmissionClassification.ACCEPTED,\n providerMessageIds: [],\n },\n };\n }\n\n // Build the provider projection before transport so adapter failures are\n // distinguishable from acceptance-unknown network failures.\n if (!providerRequest) {\n throw new Error('Network email submission is missing its provider request');\n }\n const headers = {\n ...this.buildProviderEmailHeaders(providerConfig),\n ...providerRequest.transportHeaders,\n };\n const body = this.serializeProviderEmailPayload(\n providerConfig,\n providerRequest.payload,\n );\n\n const abortController = new AbortController();\n const timeoutHandle = setTimeout(\n () => abortController.abort(\n new Error(\n `Email provider request exceeded ${EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS}ms`,\n ),\n ),\n EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS,\n );\n let response: Response;\n try {\n onTransportStart?.();\n response = await fetch(providerConfig.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: abortController.signal,\n });\n } catch (error) {\n clearTimeout(timeoutHandle);\n // Once fetch starts, a transport exception gives no trustworthy evidence\n // about whether the provider received the bytes. At-least-once recovery\n // retries this outcome and accepts the possibility of a duplicate.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: describeCaughtError(error),\n retryable: true,\n };\n }\n\n try {\n let responseText = '';\n let responseReadError: string | undefined;\n try {\n responseText = await this.readResponseTextWithAbort(\n response,\n abortController.signal,\n );\n } catch (error) {\n // Keep the deadline active through response-body consumption so a\n // provider that returns headers but stalls its body cannot retain this\n // request indefinitely.\n responseReadError = describeCaughtError(error);\n } finally {\n clearTimeout(timeoutHandle);\n }\n\n const parserInput: EmailProviderSendResponseInput = {\n status: response.status,\n headers: this.responseHeadersToRecord(response.headers),\n body: this.bestEffortParseResponseBody(responseText),\n };\n\n let parsedResponse: StandardEmail_SendResponse | undefined;\n let parserFailure: string | undefined;\n let acceptedContractViolation: string | undefined;\n try {\n const providerParsedResponse = providerConfig.parseSendResponse(parserInput);\n const validatedResponse = StandardEmail_SendResponseSchema.safeParse(\n providerParsedResponse,\n );\n if (validatedResponse.success) {\n parsedResponse = validatedResponse.data;\n } else {\n parserFailure = `Provider response parser violated StandardEmail_SendResponse: ${validatedResponse.error.message}`;\n this.logger.error(\n 'Email provider response adapter contract violation',\n {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n httpStatus: response.status,\n validationError: validatedResponse.error.message,\n },\n );\n if (\n typeof providerParsedResponse === 'object'\n && providerParsedResponse !== null\n && providerParsedResponse.classification === EmailProviderSubmissionClassification.ACCEPTED\n ) {\n /**\n * `classification` is the adapter's provider-aware submission\n * authority. Once it explicitly says ACCEPTED, a malformed\n * receipt, retry hint, or convenience field must remain an\n * observable contract defect without authorizing a duplicate\n * at-least-once replay.\n */\n acceptedContractViolation = parserFailure;\n parsedResponse = {\n success: false,\n classification:\n EmailProviderSubmissionClassification.ACCEPTED,\n providerMessageIds: [],\n };\n }\n }\n } catch (error) {\n parserFailure = describeCaughtError(error);\n }\n\n if (parsedResponse) {\n if (\n parsedResponse.classification === EmailProviderSubmissionClassification.ACCEPTANCE_UNKNOWN\n ) {\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: parsedResponse.providerError\n ?? this.buildProviderHttpError(\n response.status,\n responseText,\n responseReadError,\n ),\n retryable: parsedResponse.retryable ?? true,\n };\n }\n\n if (\n parsedResponse.classification === EmailProviderSubmissionClassification.REJECTED\n ) {\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_REJECTED,\n error: parsedResponse.providerError\n ?? this.describeRejectedRecipients(\n parsedResponse.rejectedRecipients,\n ),\n retryable: parsedResponse.retryable\n ?? this.isRetryableDefiniteRejectionStatus(response.status),\n };\n }\n\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n response: parsedResponse,\n receiptParseError: responseReadError,\n adapterContractViolation: acceptedContractViolation,\n };\n }\n\n if (response.ok) {\n // HTTP 2xx alone is not universal acceptance evidence. Postmark and\n // Mailchimp, for example, can encode semantic rejection inside a 2xx\n // body. If the provider-owned classifier failed or violated its schema,\n // the only honest state is ambiguous acceptance.\n const classificationError = responseReadError\n ?? parserFailure\n ?? 'Provider response adapter returned no valid classification';\n this.logger.error(\n 'Email provider 2xx response could not be classified',\n {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n httpStatus: response.status,\n classificationError,\n },\n );\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: classificationError,\n retryable: true,\n };\n }\n\n const providerHttpError = this.buildProviderHttpError(\n response.status,\n responseText,\n responseReadError,\n );\n const genericError = parserFailure\n ? `${providerHttpError}; provider response parser failed: ${parserFailure}`\n : providerHttpError;\n if (\n response.status === 408\n || response.status === 409\n || response.status >= 500\n ) {\n // A timeout, conflict, or 5xx may be emitted after an upstream accepted\n // the request. Provider adapters can override this only when their body\n // contract provides stronger evidence.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: genericError,\n retryable: true,\n };\n }\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_REJECTED,\n error: genericError,\n retryable: this.isRetryableDefiniteRejectionStatus(response.status),\n };\n } catch (error) {\n clearTimeout(timeoutHandle);\n // Fetch already resolved, so even a local post-response bug cannot prove\n // that the provider did not accept the bytes. At-least-once recovery\n // retries and may duplicate the externally visible message.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: describeCaughtError(error),\n retryable: true,\n };\n }\n }\n\n private bestEffortParseResponseBody(responseText: string): unknown {\n if (responseText.trim().length === 0) return undefined;\n try {\n return JSON.parse(responseText) as unknown;\n } catch {\n return responseText;\n }\n }\n\n private buildProviderHttpError(\n status: number,\n responseText: string,\n responseFailure?: string,\n ): string {\n const responseDetail = responseFailure\n ? `response unavailable (${responseFailure})`\n : responseText.substring(0, 500);\n return `Email provider returned HTTP ${status}: ${responseDetail}`;\n }\n\n private isRetryableDefiniteRejectionStatus(status: number): boolean {\n return status === 425 || status === 429;\n }\n\n /**\n * Fetch implementations normally abort response-body reads with the request\n * signal, but mocks, polyfills, and some stream failures do not. Race the\n * body promise explicitly so the transport deadline covers both receipt\n * headers and body consumption and can never outlive the durable lease.\n */\n private async readResponseTextWithAbort(\n response: Response,\n signal: AbortSignal,\n ): Promise<string> {\n if (signal.aborted) {\n throw this.abortReasonToError(signal.reason);\n }\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n abortListener = () => reject(this.abortReasonToError(signal.reason));\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([response.text(), aborted]);\n } finally {\n if (abortListener) {\n signal.removeEventListener('abort', abortListener);\n }\n }\n }\n\n private abortReasonToError(reason: unknown): Error {\n return reason instanceof Error\n ? reason\n : new Error(\n typeof reason === 'string'\n ? reason\n : 'Email provider request was aborted',\n );\n }\n\n private describeRejectedRecipients(rejectedRecipients?: Array<{ email: string; reason?: string }>): string {\n if (!rejectedRecipients?.length) {\n return 'Email provider response explicitly rejected the submission';\n }\n return `Email provider rejected recipient(s): ${rejectedRecipients\n .map(({ email, reason }) => reason ? `${email} (${reason})` : email)\n .join(', ')}`;\n }\n\n private responseHeadersToRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key.toLowerCase()] = value;\n });\n return result;\n }\n\n /**\n * Compose the send-endpoint URL from the provider's runtime contract.\n * Substitutes the `{domain}` token (used by Mailgun) when present —\n * any provider that declares `sendEndpointPathTokens: ['domain']` gets\n * the same treatment.\n */\n private composeEmailSendEndpoint(\n baseUrl: string,\n sendEndpointPath: string,\n configuredDomain?: string,\n ): string {\n const path = sendEndpointPath.replace('{domain}', configuredDomain ?? '');\n return `${baseUrl}${path}`;\n }\n\n private buildProviderEmailHeaders(providerConfig: EmailProviderConfig_Network): Record<string, string> {\n const contentHeaders = providerConfig.payloadEncoding === EmailProviderPayloadEncoding.JSON\n ? { [WildoHeaderKeys.CONTENT_TYPE]: 'application/json' }\n : {};\n\n if (providerConfig.authScheme === 'basic') {\n const username = providerConfig.basicUsername ?? 'api';\n return {\n ...contentHeaders,\n [providerConfig.authHeaderName]: `Basic ${Buffer.from(`${username}:${providerConfig.apiKey}`).toString('base64')}`,\n };\n }\n\n const credential = providerConfig.authScheme === 'bearer'\n ? `Bearer ${providerConfig.apiKey}`\n : `${providerConfig.authPrefix ?? ''}${providerConfig.apiKey}`;\n\n return {\n ...contentHeaders,\n [providerConfig.authHeaderName]: credential,\n };\n }\n\n /**\n * Serialize the provider-specific payload into the wire encoding the\n * provider expects. Every branch is driven by the provider module's\n * runtime contract (`payloadEncoding`, `embedsApiKeyInBody`) — no\n * `providerId === '<literal>'` branches.\n */\n private serializeProviderEmailPayload(\n providerConfig: EmailProviderConfig_Network,\n payload: unknown,\n ): BodyInit {\n if (\n providerConfig.payloadEncoding === EmailProviderPayloadEncoding.MULTIPART_FORM_DATA\n ) {\n if (!(payload instanceof FormData)) {\n throw new Error(\n `Email provider '${providerConfig.providerId}' declared multipart-form-data but its request builder did not return FormData`,\n );\n }\n // The provider gateway owns multipart field names and binary parts.\n // Passing the FormData through also lets fetch generate the boundary;\n // buildProviderEmailHeaders intentionally omits Content-Type here.\n return payload;\n }\n\n return JSON.stringify(\n providerConfig.embedsApiKeyInBody\n ? { ...(payload as Record<string, unknown>), key: providerConfig.apiKey }\n : payload,\n );\n }\n\n // Per-provider payload building lives in the provider module's\n // `runtimeContract.buildSendRequest` (one of the six EMAIL_PROVIDER\n // backend modules). The email service no longer branches on provider id.\n\n private createProviderUtils() {\n return {\n getRepository: <T>(resourceType: string): T => {\n throw new Error(`getRepository('${resourceType}') is not available in the email context provider. Inject repository data via additionalContext instead.`);\n },\n logger: {\n debug: (message: string, meta?: Record<string, unknown>) =>\n this.logger.debug(message, meta),\n info: (message: string, meta?: Record<string, unknown>) =>\n this.logger.info(message, meta),\n warn: (message: string, meta?: Record<string, unknown>) =>\n this.logger.warn(message, meta),\n error: (message: string, meta?: Record<string, unknown>) =>\n this.logger.error(message, meta),\n },\n errorBuilder: {\n buildError: (type: string, message: string, details?: Record<string, unknown>) => {\n const err = new Error(message);\n (err as Error & { type: string; details: unknown }).type = type;\n (err as Error & { type: string; details: unknown }).details = details;\n return err;\n },\n },\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"email.backend.service.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Email Backend Service\n *\n * Main service for sending emails. Orchestrates:\n * - File-based template resolution via EmailTemplateRegistryBackendService\n * - Context building\n * - React Email rendering (subject fn + body fn → HTML/text)\n * - Provider resolution and HTTP execution\n *\n * ## A sent email leaves LOG LINES and nothing else — by decision (#412, 2026-09-08)\n *\n * There is no persisted record of a sent email anywhere in the framework: no core resource, no\n * delivery log, no per-tenant history. **\"Did this customer receive it?\" is answered with the email\n * provider's own tooling, never with Wildo.** Say that to anyone who asks for it here, rather than\n * treating the absence as a gap to be filled.\n *\n * It reads as an oversight because the sibling subsystem does the opposite: outbound M2M webhooks\n * carry a persisted per-tenant delivery log (`ORGANIZATION_M2M_WEBHOOK_DELIVERY_LOG` and its\n * application twin). The asymmetry is deliberate and the reason is not the table — it is that a\n * persisted email record is a new per-user personal-data store carrying retention policy, privacy\n * classification, subject-export and erasure obligations FOR MESSAGE CONTENT. A metadata-only\n * variant (recipient, template, timestamp, provider id; no body) was on the table and declined too,\n * because it carries the same set of obligations over a smaller payload.\n *\n * Reopening this is legitimate, and it starts with the obligations rather than with the schema.\n */\n\nimport { injectable, inject, optional } from 'inversify';\nimport { render } from '@react-email/render';\nimport { randomUUID } from 'node:crypto';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport type { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport {\n getConfiguredFallbackLanguage,\n getConfiguredPrimaryLanguage,\n} from '~wildo-backend-lib/config/services/app-configuration.backend.utils';\nimport type { ExternalProvidersRegistryBackendService } from '~wildo-backend-lib/external-providers/services/external-providers-registry.backend.service';\nimport type { FilesBackendService } from '~wildo-backend-lib/files/services/files.backend.service';\nimport type { EmailTemplateRegistryBackendService } from './email-template-registry.backend.service';\nimport { buildEmailBrandTokensFromConfig, type EmailBrandTokens } from '~wildo-backend-lib/notifications/email/utils/color-conversion.utils';\nimport {\n EmailTemplateContext,\n EmailTemplateType_ToEngineCapability,\n EmailTemplateType,\n EngineCapability,\n ErrorCustomMessageReference,\n ErrorType,\n isWildoBackendError,\n WildoHeaderKeys,\n} from '@wildo-ai/saas-models';\nimport type {\n StandardEmail_Attachment,\n StandardEmail_SendRequest,\n StandardEmail_SendResponse,\n} from '@wildo-ai/external-connectors-models';\nimport {\n EmailProviderPayloadEncoding,\n EmailProviderSubmissionClassification,\n ExternalProvider_ExchangeProtocol_Kind,\n StandardEmail_SendRequestSchema,\n StandardEmail_SendResponseSchema,\n ProviderProtocolRuntimeKind,\n} from '@wildo-ai/external-connectors-models';\nimport type {\n EmailProviderSendRequest,\n EmailProviderSendResponseInput,\n} from '@wildo-ai/external-connectors-private/backend';\nimport { AvailableLanguage } from '@wildo-ai/presets-components-models';\nimport {\n EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS,\n} from '~wildo-backend-lib/notifications/email/models/email-transport.backend.definitions';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction validateEmailAddresses(emails: string[]): string[] {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emails.filter(email => !emailRegex.test(email.trim()));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Total size ceiling for the attachments of ONE email, applied after the bytes are resolved (#429).\n *\n * 10 MB, deliberately below every provider ceiling this framework talks to — SendGrid 30 MB,\n * Mailgun 25 MB, SES 40 MB on the raw message — so an over-size send is refused HERE, naming the\n * files and the measured total, instead of at a vendor whose rejection an application cannot act\n * on. Base64 also inflates the wire payload by roughly a third, so a limit set AT a provider's\n * number would still fail there.\n *\n * A constant rather than a config key, until an application needs a different number: a configurable\n * limit that nothing reads is the exact defect this issue closed, and adding the reader is the\n * cheaper half of that change.\n */\nexport const OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT = 10 * 1024 * 1024;\n\nexport interface EmailSendRequest {\n /**\n * Stable identity of one logical provider submission. A caller that can\n * retry across process/job boundaries must persist and reuse this value.\n * Ephemeral callers may omit it and let the service allocate one.\n */\n submissionId?: string;\n /** Template reference (e.g., \"system.welcome_email\") */\n templateRef: string;\n /** Locale for template selection */\n locale: AvailableLanguage;\n /** Email type for provider routing */\n type: EmailTemplateType;\n /** Primary recipient email(s) */\n to: string | string[];\n /** CC recipients (optional) */\n cc?: string[];\n /** BCC recipients (optional) */\n bcc?: string[];\n /** Reply-to address (optional) */\n replyTo?: string;\n /** From address (optional - uses provider default if not specified) */\n from?: string;\n /** Context for template rendering */\n context: EmailTemplateContext;\n /** File IDs for attachments (optional) */\n attachmentFileIds?: string[];\n /** Organization ID for org-scoped templates (optional) */\n organizationId?: string;\n}\n\nexport enum EmailSubmissionOutcome {\n NOT_SUBMITTED = 'not_submitted',\n PROVIDER_ACCEPTED = 'provider_accepted',\n PROVIDER_REJECTED = 'provider_rejected',\n ACCEPTANCE_UNKNOWN = 'acceptance_unknown',\n}\n\nexport interface EmailSendResult {\n success: boolean;\n /**\n * Whether an at-least-once caller should retry. An acceptance-unknown retry\n * can duplicate an externally visible email; provider-native idempotency is\n * only an optional risk reduction.\n */\n retryable: boolean;\n submissionId: string;\n outcome: EmailSubmissionOutcome;\n /** All honest provider receipts. Empty means no receipt was returned. */\n providerMessageIds: string[];\n /** Provider confirmed that this logical submission was already accepted. */\n deduplicated?: boolean;\n rejectedRecipients?: Array<{ email: string; reason?: string }>;\n providerId?: string;\n error?: string;\n templateRef: string;\n recipientCount: number;\n}\n\n/**\n * Fields common to every resolved email provider regardless of delivery\n * mode. `from*` come from the app's `providerConfigurations` override, not\n * the runtime contract.\n */\ninterface EmailProviderConfig_Base {\n providerId: string;\n fromAddress?: string;\n fromName?: string;\n}\n\n/**\n * Network delivery — the resolved shape for every real provider (Resend,\n * SendGrid, …). Carries the composed endpoint, auth material, and the\n * provider-specific request builder/parser used by\n * `executeProviderRequest`'s `fetch` path.\n */\ninterface EmailProviderConfig_Network extends EmailProviderConfig_Base {\n delivery: 'network';\n apiKey: string;\n endpoint: string;\n authHeaderName: string;\n authPrefix?: string;\n authScheme?: 'api-key' | 'bearer' | 'basic';\n basicUsername?: string;\n domain?: string;\n /**\n * Wire encoding the provider expects for its request body. Every network\n * provider declares this on its runtime contract; there is no fallback\n * encoding at the consumer boundary.\n */\n payloadEncoding: EmailProviderPayloadEncoding;\n /**\n * Whether the provider expects the API key to be embedded in the JSON\n * payload body (Mailchimp's `key` field). Sourced from the provider\n * module's `runtimeContract.embedsApiKeyInBody`. Defaults to `false`.\n */\n embedsApiKeyInBody: boolean;\n /**\n * Per-provider send-payload builder. Sourced from the provider\n * module's `runtimeContract.buildSendRequest`. Receives the\n * normalized `StandardEmail_SendRequest` plus the optional\n * `configuredDomain` (Mailgun's `{domain}` token).\n */\n buildSendRequest: (\n input: { request: StandardEmail_SendRequest; configuredDomain?: string },\n ) => EmailProviderSendRequest;\n parseSendResponse: (\n input: EmailProviderSendResponseInput,\n ) => StandardEmail_SendResponse;\n}\n\n/**\n * Log delivery — the resolved shape for the dev `preview` provider. Carries\n * NO endpoint / apiKey / payload builder because it never opens a socket;\n * `executeProviderRequest` renders + logs the email without fabricating a\n * provider receipt. Discriminated from network on `delivery` so consumers branch\n * on the contract, never on the provider ref.\n */\ninterface EmailProviderConfig_Log extends EmailProviderConfig_Base {\n delivery: 'log';\n}\n\ntype EmailProviderConfig = EmailProviderConfig_Network | EmailProviderConfig_Log;\n\ntype EmailProviderExecutionResult =\n | {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED;\n response: StandardEmail_SendResponse;\n receiptParseError?: string;\n /**\n * The adapter explicitly classified the submission as accepted but\n * violated another response-contract invariant. Acceptance remains the\n * no-replay authority while the violation stays observable.\n */\n adapterContractViolation?: string;\n }\n | {\n outcome:\n | EmailSubmissionOutcome.PROVIDER_REJECTED\n | EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN;\n error: string;\n retryable: boolean;\n };\n\ninterface EmailAddress {\n email: string;\n name?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE\n// ─────────────────────────────────────────────────────────────────────────────\n\n@injectable()\nexport class EmailBackendService {\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.EmailTemplateRegistry) private readonly templateRegistry: EmailTemplateRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly configService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ExternalProvidersRegistryService) private readonly externalProvidersRegistry: ExternalProvidersRegistryBackendService,\n /*\n * Attachments (#429). Injected `@optional()` because a deployment that never attaches a file\n * should not fail to construct its email service, and because the resolution is reached only\n * when a caller supplies `attachmentFileIds` — an absent binding then refuses that one send\n * with a named error rather than silently dropping the attachment, which is the defect this\n * closes.\n */\n @inject(SAAS_SERVICE_TYPES.FilesBackendService) @optional() private readonly filesService: FilesBackendService | undefined,\n ) {\n this.logDebug = this.logger.debugByType('EmailBackendService');\n this.logger.setDebugTypeLogging('EmailBackendService', false);\n }\n\n /**\n * Send an email using a file-based template definition.\n */\n async send(request: EmailSendRequest): Promise<EmailSendResult> {\n const startTime = Date.now();\n const submissionId = request.submissionId ?? randomUUID();\n let providerTransportStarted = false;\n this.logger.info('Sending email', {\n templateRef: request.templateRef,\n submissionId,\n locale: request.locale,\n recipientCount: Array.isArray(request.to) ? request.to.length : 1,\n });\n\n try {\n // 0. Validate email addresses\n const recipients = Array.isArray(request.to) ? request.to : [request.to];\n const allEmails = [\n ...recipients,\n ...(request.cc || []),\n ...(request.bcc || []),\n ...(request.replyTo ? [request.replyTo] : []),\n ];\n\n const invalidEmails = validateEmailAddresses(allEmails);\n if (invalidEmails.length > 0) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.EMAIL_INVALID_ADDRESS_FORMAT,\n context: {\n // diagnostic (log-only)\n invalidEmails,\n },\n },\n );\n }\n\n // 1. Resolve template + labels from file-based registry\n const defaultLocale = this.getDefaultLocale();\n const resolved = this.templateRegistry.resolve(\n request.templateRef,\n request.locale,\n defaultLocale,\n this.getFallbackLocale(),\n );\n\n // 2. Get design tokens\n const brandTokens = this.getDesignTokens();\n\n // 3. Build full context\n const fullContext: EmailTemplateContext = {\n currentObject: request.context.currentObject,\n objectContext: request.context.objectContext,\n userContext: request.context.userContext,\n additionalContext: {\n ...(request.context.additionalContext as Record<string, unknown> || {}),\n },\n };\n\n // 5. Render subject and body from definition functions\n const templateProps = { context: fullContext, brand: brandTokens, labels: resolved.labels };\n const subject = resolved.definition.subject(templateProps);\n const bodyElement = resolved.definition.body(templateProps);\n\n const bodyHtml = await render(bodyElement, { pretty: true });\n const bodyText = await render(bodyElement, { plainText: true });\n\n // 6. Resolve provider\n const emailType = resolved.definition.type ?? request.type;\n const engineCapability = EmailTemplateType_ToEngineCapability[emailType];\n const providerConfig = this.resolveEmailProvider(engineCapability);\n\n // 6b. Resolve caller-supplied attachments to bytes (#429). Before the request is built,\n // because a file that cannot be served must refuse the send rather than produce an email\n // that silently lacks what the caller attached.\n const attachments = await this.resolveAttachments(request);\n\n // 7. Build email request\n const emailRequest = this.buildEmailRequest(\n request,\n submissionId,\n { subject, bodyHtml, bodyText },\n providerConfig,\n recipients,\n attachments,\n );\n\n const providerRequest = providerConfig.delivery === 'network'\n ? providerConfig.buildSendRequest({\n request: emailRequest,\n configuredDomain: providerConfig.domain,\n })\n : undefined;\n\n // 8. Execute send via provider\n const execution = await this.executeProviderRequest(\n providerConfig,\n emailRequest,\n providerRequest,\n () => {\n providerTransportStarted = true;\n },\n );\n const durationMs = Date.now() - startTime;\n\n if (execution.outcome !== EmailSubmissionOutcome.PROVIDER_ACCEPTED) {\n this.logger.warn('Email provider did not confirm acceptance', {\n templateRef: request.templateRef,\n submissionId,\n outcome: execution.outcome,\n providerId: providerConfig.providerId,\n error: execution.error,\n durationMs,\n });\n return {\n success: false,\n retryable: execution.retryable,\n submissionId,\n outcome: execution.outcome,\n providerMessageIds: [],\n providerId: providerConfig.providerId,\n error: execution.error,\n templateRef: request.templateRef,\n recipientCount: recipients.length,\n };\n }\n\n const providerMessageIds = execution.response.providerMessageIds;\n this.logger.info('Email submission accepted', {\n templateRef: request.templateRef,\n submissionId,\n providerMessageIds,\n deduplicated: execution.response.deduplicated,\n providerReceiptMissing: providerMessageIds.length === 0,\n receiptParseError: execution.receiptParseError,\n adapterContractViolation: execution.adapterContractViolation,\n providerId: providerConfig.providerId,\n durationMs,\n });\n\n return {\n success: execution.response.success,\n retryable: false,\n submissionId,\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n providerMessageIds,\n deduplicated: execution.response.deduplicated,\n rejectedRecipients: execution.response.rejectedRecipients,\n providerId: providerConfig.providerId,\n error: execution.adapterContractViolation\n ?? (execution.response.success\n ? undefined\n : this.describeRejectedRecipients(\n execution.response.rejectedRecipients,\n )),\n templateRef: request.templateRef,\n recipientCount: recipients.length,\n };\n } catch (err) {\n const error = err as Error;\n const durationMs = Date.now() - startTime;\n\n this.logger.error('Email send failed', {\n templateRef: request.templateRef,\n errorMessage: error.message,\n durationMs,\n });\n\n if (isWildoBackendError(err) && (err.type === ErrorType.CONFIGURATION || err.type === ErrorType.VALIDATION)) {\n throw err;\n }\n\n return {\n success: false,\n retryable: true,\n submissionId,\n outcome: providerTransportStarted\n ? EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN\n : EmailSubmissionOutcome.NOT_SUBMITTED,\n providerMessageIds: [],\n error: error.message,\n templateRef: request.templateRef,\n recipientCount: Array.isArray(request.to) ? request.to.length : 1,\n };\n }\n }\n\n /**\n * Send email to multiple recipients individually (different context per recipient).\n */\n async sendToMultiple(requests: EmailSendRequest[]): Promise<EmailSendResult[]> {\n const results: EmailSendResult[] = [];\n for (const request of requests) {\n const result = await this.send(request);\n results.push(result);\n }\n return results;\n }\n\n private getDefaultLocale(): AvailableLanguage {\n return getConfiguredPrimaryLanguage(this.configService.config);\n }\n\n private getFallbackLocale(): AvailableLanguage {\n return getConfiguredFallbackLanguage(this.configService.config);\n }\n\n private getDesignTokens(): EmailBrandTokens {\n try {\n return buildEmailBrandTokensFromConfig(this.configService.config.email?.brandTokens);\n } catch (err) {\n this.logger.warn('Failed to extract design tokens, using defaults', {\n errorMessage: (err as Error).message,\n });\n return buildEmailBrandTokensFromConfig(undefined);\n }\n }\n\n private resolveEmailProvider(capability: EngineCapability): EmailProviderConfig {\n const providerId = this.externalProvidersRegistry.getPrimaryProviderForEngineCapability(capability);\n\n if (!providerId) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No email provider configured for capability: ${capability}`, capability } },\n );\n }\n\n if (!this.externalProvidersRegistry.isProviderEnabled(providerId, ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER)) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `Email provider is disabled by external provider configuration: ${providerId}`, providerId, capability } },\n );\n }\n\n const emailContract = this.externalProvidersRegistry.getProviderConfiguration(\n providerId,\n ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER,\n )?.runtimeContract;\n if (emailContract?.kind !== ProviderProtocolRuntimeKind.EMAIL) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No EMAIL_PROVIDER runtime contract found for provider: ${providerId}`, providerId, capability } },\n );\n }\n\n const appConfig = this.configService.config as Record<string, unknown>;\n const providersConfig = appConfig?.providerConfigurations as Record<string, Record<string, {\n fromAddress?: string;\n fromName?: string;\n domain?: string;\n }> | undefined> | undefined;\n const providerConfig = providersConfig?.[providerId]?.[ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER];\n\n // Non-sending delivery (the dev `preview` provider): no endpoint, no\n // API key. Branch on the CONTRACT field — never the provider ref — so\n // this stays a first-class provider and passes the\n // no-provider-ref-branches guard; `executeProviderRequest` renders +\n // logs instead of opening a socket. Resolved BEFORE the API-key\n // requirement below so a log provider doesn't need a secret at all.\n if (emailContract.delivery === 'log') {\n return {\n providerId,\n delivery: 'log',\n fromAddress: providerConfig?.fromAddress,\n fromName: providerConfig?.fromName,\n };\n }\n\n // Network delivery — a live provider API key is required.\n const apiKey = this.externalProvidersRegistry.getProviderApiKey(\n providerId,\n ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER,\n );\n if (!apiKey) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No env-provided API key configured for provider: ${providerId}`, providerId, capability } },\n );\n }\n\n // Resolve the path-token domain (Mailgun) from the contract's declared\n // `sendEndpointPathTokens`. The branch is contract-driven, not ref-keyed:\n // any provider that declares the `'domain'` token gets the same treatment.\n const requiresDomainToken = emailContract.sendEndpointPathTokens?.includes('domain') === true;\n const configuredDomain = requiresDomainToken\n ? providerConfig?.domain ?? process.env[`${providerId.toUpperCase()}_DOMAIN`]\n : providerConfig?.domain;\n if (requiresDomainToken && !configuredDomain) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `Email provider '${providerId}' declares a {domain} send-endpoint token but no domain is configured.`, providerId } },\n );\n }\n\n return {\n providerId,\n delivery: 'network',\n apiKey,\n endpoint: this.composeEmailSendEndpoint(emailContract.baseUrl, emailContract.sendEndpointPath, configuredDomain),\n authHeaderName: emailContract.apiKey.headerName,\n authPrefix: emailContract.apiKey.prefix,\n authScheme: emailContract.apiKey.scheme,\n basicUsername: emailContract.apiKey.basicUsername,\n fromAddress: providerConfig?.fromAddress,\n fromName: providerConfig?.fromName,\n domain: configuredDomain,\n payloadEncoding: emailContract.payloadEncoding,\n embedsApiKeyInBody: emailContract.embedsApiKeyInBody === true,\n buildSendRequest: emailContract.buildSendRequest,\n parseSendResponse: emailContract.parseSendResponse,\n };\n }\n\n /**\n * Resolve `attachmentFileIds` to the vendor-neutral `attachments` array several provider adapters\n * already map (#429).\n *\n * Until this existed the field was declared and read by nothing, so a caller supplying an\n * attachment got a successful send and an attachment-less email. Every refusal below therefore\n * THROWS: a silent drop is the defect, and error handling that drops quietly is the same defect.\n *\n * ## The size cap is the framework's, not a provider's\n *\n * {@link OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT} is deliberately below every provider limit this\n * framework talks to, so the refusal happens HERE — with the file ids and the measured total in\n * the error — rather than at a vendor that answers with a rejected submission and a message the\n * application cannot act on. It is a named constant rather than a config key on purpose: an\n * authored limit nothing read is precisely the class of defect this issue came from, and a\n * config surface can be added the day an application needs a different number.\n *\n * ## What is NOT checked here, and why\n *\n * The file TYPE. A file reaching this point has already passed upload-time validation and, where\n * the field opts into scanning, the scanner — and the status gate inside\n * `readFilesForOutboundAttachment` admits only what the download route would serve, which\n * excludes INFECTED. Re-deciding admissible types at send time would be a second policy that can\n * disagree with the first.\n */\n private async resolveAttachments(request: EmailSendRequest): Promise<StandardEmail_Attachment[]> {\n const fileIds = request.attachmentFileIds ?? [];\n if (fileIds.length === 0) {\n return [];\n }\n\n if (!this.filesService) {\n throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message: 'Email attachments were requested but the files service is not bound',\n attachmentCount: fileIds.length,\n },\n });\n }\n\n const resolved = await this.filesService.readFilesForOutboundAttachment(fileIds, {\n applicationId: this.configService.applicationId ?? undefined,\n // The tenancy confinement. An organization-scoped send reaches only that organization's\n // files; a send without one reaches only application-scoped files.\n ...(request.organizationId ? { organizationId: request.organizationId } : {}),\n });\n\n const totalBytes = resolved.reduce((total, file) => total + file.bytes.byteLength, 0);\n if (totalBytes > OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT) {\n throw this.errorBuilder.buildError(ErrorType.VALIDATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.VALIDATION,\n context: {\n message: 'Email attachments exceed the outbound total-size limit',\n totalBytes,\n limitBytes: OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT,\n fileIds: resolved.map((file) => file.fileId),\n },\n });\n }\n\n return resolved.map((file) => ({\n filename: file.filename,\n content: file.bytes.toString('base64'),\n contentType: file.mimeType,\n }));\n }\n\n private buildEmailRequest(\n request: EmailSendRequest,\n submissionId: string,\n rendered: { subject: string; bodyHtml: string; bodyText: string },\n providerConfig: EmailProviderConfig,\n recipients: string[],\n attachments: StandardEmail_Attachment[],\n ): StandardEmail_SendRequest {\n const toAddresses: EmailAddress[] = recipients.map(email => ({ email }));\n\n // From-address precedence: per-send override → per-provider config\n // (`providerConfigurations.<provider>.EMAIL_PROVIDER.fromAddress`) → the\n // app's global `email.from`. The latter is REQUIRED by\n // `AppConfiguration_Email_Schema`, so it is the normal source; the literal\n // fallback is a defensive last resort that should be unreachable once\n // config is initialized. Previously `email.from` was silently ignored —\n // the send fell back to the literal, producing an unverified/invalid\n // sender that providers reject.\n const configuredFrom = this.configService.config.email?.from;\n const from: EmailAddress = {\n email: request.from || providerConfig.fromAddress || configuredFrom || 'noreply@example.com',\n name: providerConfig.fromName,\n };\n\n return StandardEmail_SendRequestSchema.parse({\n submissionId,\n from,\n to: toAddresses,\n cc: request.cc?.map(email => ({ email })),\n bcc: request.bcc?.map(email => ({ email })),\n replyTo: request.replyTo ? { email: request.replyTo } : undefined,\n subject: rendered.subject,\n html: rendered.bodyHtml,\n text: rendered.bodyText,\n // Omitted rather than sent empty: the field is optional on the vendor-neutral contract and\n // several adapters branch on its presence.\n ...(attachments.length > 0 ? { attachments } : {}),\n });\n }\n\n private async executeProviderRequest(\n providerConfig: EmailProviderConfig,\n request: StandardEmail_SendRequest,\n providerRequest?: EmailProviderSendRequest,\n onTransportStart?: () => void,\n ): Promise<EmailProviderExecutionResult> {\n // Log delivery (dev `preview` provider): the template is already\n // rendered — surface it in the logs (subject, recipients, body preview)\n // without inventing a provider receipt. No network I/O. Narrowing on the\n // contract-derived `delivery` field also gates the network-only fields\n // (`endpoint`, `buildSendRequest`, …) accessed below.\n if (providerConfig.delivery === 'log') {\n const recipients = request.to.map(recipient => recipient.email);\n this.logger.info('[email-preview] Email logged instead of sent (log-delivery provider)', {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n from: request.from?.email,\n to: recipients,\n cc: request.cc?.map(recipient => recipient.email),\n bcc: request.bcc?.map(recipient => recipient.email),\n subject: request.subject,\n textPreview: request.text?.slice(0, 2000),\n /*\n * DERIVED FACTS ABOUT THE HTML, never the HTML itself (#522).\n *\n * This provider is how a developer sees a local send, and it surfaced a TEXT preview only —\n * so anything that exists only in the HTML was invisible here. A brand logo is an `<img>`,\n * which is a fair part of why ninety-five templates rendered none without anyone noticing.\n *\n * The body is not logged. That is the same rule the attachment line below already follows —\n * names, never the bytes — and a full HTML email in a log line would be both unreadable and\n * a place for personal data to accumulate. `imageCount` is the smallest fact that tells the\n * two cases apart, which is all the dev loop needs: 0 where a logo did not resolve, 1 where\n * it did.\n *\n * Writing the rendered HTML to a FILE a developer can open is the better surface and is a\n * real decision — where it lives, who removes it, and which environments produce it — so it\n * is recorded rather than invented inside a provider branch.\n */\n htmlBytes: request.html === undefined ? undefined : Buffer.byteLength(request.html, 'utf8'),\n imageCount: request.html === undefined ? undefined : (request.html.match(/<img\\b/gi) ?? []).length,\n // Names only, never the bytes (#429). The log-delivery provider is how a developer sees a\n // local send, so an attachment that resolved has to be visible here — otherwise the dev\n // loop looks identical whether the resolution worked or silently produced nothing, which\n // is the failure this whole path exists to remove.\n attachments: request.attachments?.map((attachment) => ({\n filename: attachment.filename,\n contentType: attachment.contentType,\n bytes: Buffer.from(attachment.content, 'base64').byteLength,\n })),\n });\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n response: {\n success: true,\n classification: EmailProviderSubmissionClassification.ACCEPTED,\n providerMessageIds: [],\n },\n };\n }\n\n // Build the provider projection before transport so adapter failures are\n // distinguishable from acceptance-unknown network failures.\n if (!providerRequest) {\n throw new Error('Network email submission is missing its provider request');\n }\n const headers = {\n ...this.buildProviderEmailHeaders(providerConfig),\n ...providerRequest.transportHeaders,\n };\n const body = this.serializeProviderEmailPayload(\n providerConfig,\n providerRequest.payload,\n );\n\n const abortController = new AbortController();\n const timeoutHandle = setTimeout(\n () => abortController.abort(\n new Error(\n `Email provider request exceeded ${EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS}ms`,\n ),\n ),\n EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS,\n );\n let response: Response;\n try {\n onTransportStart?.();\n response = await fetch(providerConfig.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: abortController.signal,\n });\n } catch (error) {\n clearTimeout(timeoutHandle);\n // Once fetch starts, a transport exception gives no trustworthy evidence\n // about whether the provider received the bytes. At-least-once recovery\n // retries this outcome and accepts the possibility of a duplicate.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: describeCaughtError(error),\n retryable: true,\n };\n }\n\n try {\n let responseText = '';\n let responseReadError: string | undefined;\n try {\n responseText = await this.readResponseTextWithAbort(\n response,\n abortController.signal,\n );\n } catch (error) {\n // Keep the deadline active through response-body consumption so a\n // provider that returns headers but stalls its body cannot retain this\n // request indefinitely.\n responseReadError = describeCaughtError(error);\n } finally {\n clearTimeout(timeoutHandle);\n }\n\n const parserInput: EmailProviderSendResponseInput = {\n status: response.status,\n headers: this.responseHeadersToRecord(response.headers),\n body: this.bestEffortParseResponseBody(responseText),\n };\n\n let parsedResponse: StandardEmail_SendResponse | undefined;\n let parserFailure: string | undefined;\n let acceptedContractViolation: string | undefined;\n try {\n const providerParsedResponse = providerConfig.parseSendResponse(parserInput);\n const validatedResponse = StandardEmail_SendResponseSchema.safeParse(\n providerParsedResponse,\n );\n if (validatedResponse.success) {\n parsedResponse = validatedResponse.data;\n } else {\n parserFailure = `Provider response parser violated StandardEmail_SendResponse: ${validatedResponse.error.message}`;\n this.logger.error(\n 'Email provider response adapter contract violation',\n {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n httpStatus: response.status,\n validationError: validatedResponse.error.message,\n },\n );\n if (\n typeof providerParsedResponse === 'object'\n && providerParsedResponse !== null\n && providerParsedResponse.classification === EmailProviderSubmissionClassification.ACCEPTED\n ) {\n /**\n * `classification` is the adapter's provider-aware submission\n * authority. Once it explicitly says ACCEPTED, a malformed\n * receipt, retry hint, or convenience field must remain an\n * observable contract defect without authorizing a duplicate\n * at-least-once replay.\n */\n acceptedContractViolation = parserFailure;\n parsedResponse = {\n success: false,\n classification:\n EmailProviderSubmissionClassification.ACCEPTED,\n providerMessageIds: [],\n };\n }\n }\n } catch (error) {\n parserFailure = describeCaughtError(error);\n }\n\n if (parsedResponse) {\n if (\n parsedResponse.classification === EmailProviderSubmissionClassification.ACCEPTANCE_UNKNOWN\n ) {\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: parsedResponse.providerError\n ?? this.buildProviderHttpError(\n response.status,\n responseText,\n responseReadError,\n ),\n retryable: parsedResponse.retryable ?? true,\n };\n }\n\n if (\n parsedResponse.classification === EmailProviderSubmissionClassification.REJECTED\n ) {\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_REJECTED,\n error: parsedResponse.providerError\n ?? this.describeRejectedRecipients(\n parsedResponse.rejectedRecipients,\n ),\n retryable: parsedResponse.retryable\n ?? this.isRetryableDefiniteRejectionStatus(response.status),\n };\n }\n\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n response: parsedResponse,\n receiptParseError: responseReadError,\n adapterContractViolation: acceptedContractViolation,\n };\n }\n\n if (response.ok) {\n // HTTP 2xx alone is not universal acceptance evidence. Postmark and\n // Mailchimp, for example, can encode semantic rejection inside a 2xx\n // body. If the provider-owned classifier failed or violated its schema,\n // the only honest state is ambiguous acceptance.\n const classificationError = responseReadError\n ?? parserFailure\n ?? 'Provider response adapter returned no valid classification';\n this.logger.error(\n 'Email provider 2xx response could not be classified',\n {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n httpStatus: response.status,\n classificationError,\n },\n );\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: classificationError,\n retryable: true,\n };\n }\n\n const providerHttpError = this.buildProviderHttpError(\n response.status,\n responseText,\n responseReadError,\n );\n const genericError = parserFailure\n ? `${providerHttpError}; provider response parser failed: ${parserFailure}`\n : providerHttpError;\n if (\n response.status === 408\n || response.status === 409\n || response.status >= 500\n ) {\n // A timeout, conflict, or 5xx may be emitted after an upstream accepted\n // the request. Provider adapters can override this only when their body\n // contract provides stronger evidence.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: genericError,\n retryable: true,\n };\n }\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_REJECTED,\n error: genericError,\n retryable: this.isRetryableDefiniteRejectionStatus(response.status),\n };\n } catch (error) {\n clearTimeout(timeoutHandle);\n // Fetch already resolved, so even a local post-response bug cannot prove\n // that the provider did not accept the bytes. At-least-once recovery\n // retries and may duplicate the externally visible message.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: describeCaughtError(error),\n retryable: true,\n };\n }\n }\n\n private bestEffortParseResponseBody(responseText: string): unknown {\n if (responseText.trim().length === 0) return undefined;\n try {\n return JSON.parse(responseText) as unknown;\n } catch {\n return responseText;\n }\n }\n\n private buildProviderHttpError(\n status: number,\n responseText: string,\n responseFailure?: string,\n ): string {\n const responseDetail = responseFailure\n ? `response unavailable (${responseFailure})`\n : responseText.substring(0, 500);\n return `Email provider returned HTTP ${status}: ${responseDetail}`;\n }\n\n private isRetryableDefiniteRejectionStatus(status: number): boolean {\n return status === 425 || status === 429;\n }\n\n /**\n * Fetch implementations normally abort response-body reads with the request\n * signal, but mocks, polyfills, and some stream failures do not. Race the\n * body promise explicitly so the transport deadline covers both receipt\n * headers and body consumption and can never outlive the durable lease.\n */\n private async readResponseTextWithAbort(\n response: Response,\n signal: AbortSignal,\n ): Promise<string> {\n if (signal.aborted) {\n throw this.abortReasonToError(signal.reason);\n }\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n abortListener = () => reject(this.abortReasonToError(signal.reason));\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([response.text(), aborted]);\n } finally {\n if (abortListener) {\n signal.removeEventListener('abort', abortListener);\n }\n }\n }\n\n private abortReasonToError(reason: unknown): Error {\n return reason instanceof Error\n ? reason\n : new Error(\n typeof reason === 'string'\n ? reason\n : 'Email provider request was aborted',\n );\n }\n\n private describeRejectedRecipients(rejectedRecipients?: Array<{ email: string; reason?: string }>): string {\n if (!rejectedRecipients?.length) {\n return 'Email provider response explicitly rejected the submission';\n }\n return `Email provider rejected recipient(s): ${rejectedRecipients\n .map(({ email, reason }) => reason ? `${email} (${reason})` : email)\n .join(', ')}`;\n }\n\n private responseHeadersToRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key.toLowerCase()] = value;\n });\n return result;\n }\n\n /**\n * Compose the send-endpoint URL from the provider's runtime contract.\n * Substitutes the `{domain}` token (used by Mailgun) when present —\n * any provider that declares `sendEndpointPathTokens: ['domain']` gets\n * the same treatment.\n */\n private composeEmailSendEndpoint(\n baseUrl: string,\n sendEndpointPath: string,\n configuredDomain?: string,\n ): string {\n const path = sendEndpointPath.replace('{domain}', configuredDomain ?? '');\n return `${baseUrl}${path}`;\n }\n\n private buildProviderEmailHeaders(providerConfig: EmailProviderConfig_Network): Record<string, string> {\n const contentHeaders = providerConfig.payloadEncoding === EmailProviderPayloadEncoding.JSON\n ? { [WildoHeaderKeys.CONTENT_TYPE]: 'application/json' }\n : {};\n\n if (providerConfig.authScheme === 'basic') {\n const username = providerConfig.basicUsername ?? 'api';\n return {\n ...contentHeaders,\n [providerConfig.authHeaderName]: `Basic ${Buffer.from(`${username}:${providerConfig.apiKey}`).toString('base64')}`,\n };\n }\n\n const credential = providerConfig.authScheme === 'bearer'\n ? `Bearer ${providerConfig.apiKey}`\n : `${providerConfig.authPrefix ?? ''}${providerConfig.apiKey}`;\n\n return {\n ...contentHeaders,\n [providerConfig.authHeaderName]: credential,\n };\n }\n\n /**\n * Serialize the provider-specific payload into the wire encoding the\n * provider expects. Every branch is driven by the provider module's\n * runtime contract (`payloadEncoding`, `embedsApiKeyInBody`) — no\n * `providerId === '<literal>'` branches.\n */\n private serializeProviderEmailPayload(\n providerConfig: EmailProviderConfig_Network,\n payload: unknown,\n ): BodyInit {\n if (\n providerConfig.payloadEncoding === EmailProviderPayloadEncoding.MULTIPART_FORM_DATA\n ) {\n if (!(payload instanceof FormData)) {\n throw new Error(\n `Email provider '${providerConfig.providerId}' declared multipart-form-data but its request builder did not return FormData`,\n );\n }\n // The provider gateway owns multipart field names and binary parts.\n // Passing the FormData through also lets fetch generate the boundary;\n // buildProviderEmailHeaders intentionally omits Content-Type here.\n return payload;\n }\n\n return JSON.stringify(\n providerConfig.embedsApiKeyInBody\n ? { ...(payload as Record<string, unknown>), key: providerConfig.apiKey }\n : payload,\n );\n }\n\n // Per-provider payload building lives in the provider module's\n // `runtimeContract.buildSendRequest` (one of the six EMAIL_PROVIDER\n // backend modules). The email service no longer branches on provider id.\n\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-conversion.utils.d.ts","sourceRoot":"","sources":["../../../../../../src/notifications/email/utils/color-conversion.utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA4BrD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBhD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,gBAezC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,WAAW,CAAC,EAAE;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"color-conversion.utils.d.ts","sourceRoot":"","sources":["../../../../../../src/notifications/email/utils/color-conversion.utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA4BrD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBhD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,gBAezC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,WAAW,CAAC,EAAE;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CAGrB,GACA,gBAAgB,CAYlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-conversion.utils.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/utils/color-conversion.utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAS,MAAM,QAAQ,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;QAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,mDAAmD;YACnD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACjF,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,KAAK,GAAU;oBACnB,IAAI,EAAE,OAAO;oBACb,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACvB,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACvB,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACxB,CAAC;gBACF,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;YACvC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,iBAAiB;QACjB,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,GAAG,IAAI,SAAS,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,yDAAyD;QACzD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,cAAc;IACd,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ;IACR,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,GAAG,IAAI,SAAS,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAsBD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAqB;IAC3D,YAAY,EAAE,SAAS;IACvB,iBAAiB,EAAE,SAAS;IAC5B,cAAc,EAAE,SAAS;IACzB,eAAe,EAAE,SAAS;IAC1B,eAAe,EAAE,SAAS;IAC1B,UAAU,EAAE,SAAS;IACrB,eAAe,EAAE,SAAS;IAC1B,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,SAAS;IACvB,gBAAgB,EAAE,SAAS;IAC3B,YAAY,EAAE,QAAQ;IACtB,UAAU,EAAE,8BAA8B;IAC1C,iBAAiB,EAAE,8BAA8B;CAClD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAC7C,
|
|
1
|
+
{"version":3,"file":"color-conversion.utils.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/utils/color-conversion.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Color Conversion Utilities\n * \n * Utilities for converting colors between formats for email compatibility.\n * Email clients don't support OKLCH, so we need to convert to Hex.\n */\n\nimport { oklch, formatHex, Oklch } from 'culori';\n\n/**\n * Convert an OKLCH color string to Hex\n * \n * @param oklchColor - OKLCH color string (e.g., \"oklch(0.7 0.15 180)\")\n * @returns Hex color string (e.g., \"#4fa3a3\")\n */\nexport function oklchToHex(oklchColor: string): string {\n try {\n // Parse the OKLCH color\n const parsed = oklch(oklchColor);\n \n if (!parsed) {\n // If parsing fails, try to extract values manually\n const match = oklchColor.match(/oklch\\(\\s*([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\s*\\)/i);\n if (match) {\n const color: Oklch = {\n mode: 'oklch',\n l: parseFloat(match[1]),\n c: parseFloat(match[2]),\n h: parseFloat(match[3]),\n };\n return formatHex(color) || '#000000';\n }\n return '#000000';\n }\n \n // Convert to Hex\n const hex = formatHex(parsed);\n return hex || '#000000';\n } catch {\n // Silently return fallback - color conversion failures are non-critical\n // Caller can log if needed, but we return a safe default\n return '#000000';\n }\n}\n\n/**\n * Check if a color string is in OKLCH format\n */\nexport function isOklchColor(color: string): boolean {\n return color.toLowerCase().startsWith('oklch(');\n}\n\n/**\n * Convert any color to hex format\n * Handles OKLCH, rgb, hsl, and passes through hex\n */\nexport function toHexColor(color: string): string {\n if (!color) return '#000000';\n \n // Already hex\n if (color.startsWith('#')) {\n return color;\n }\n \n // OKLCH\n if (isOklchColor(color)) {\n return oklchToHex(color);\n }\n \n // Try culori for other formats\n try {\n const hex = formatHex(color);\n return hex || '#000000';\n } catch {\n return '#000000';\n }\n}\n\n/**\n * Email Brand Tokens structure (hex colors)\n */\nexport interface EmailBrandTokens {\n primaryColor: string;\n primaryForeground: string;\n secondaryColor: string;\n backgroundColor: string;\n foregroundColor: string;\n mutedColor: string;\n mutedForeground: string;\n borderColor: string;\n successColor: string;\n warningColor: string;\n destructiveColor: string;\n borderRadius: string;\n fontFamily: string;\n headingFontFamily?: string;\n}\n\n/**\n * Default email design tokens (fallback values)\n */\nexport const DEFAULT_EMAIL_DESIGN_TOKENS: EmailBrandTokens = {\n primaryColor: '#0066cc',\n primaryForeground: '#ffffff',\n secondaryColor: '#6c757d',\n backgroundColor: '#ffffff',\n foregroundColor: '#1a1a1a',\n mutedColor: '#f5f5f5',\n mutedForeground: '#6c757d',\n borderColor: '#e5e5e5',\n successColor: '#22c55e',\n warningColor: '#f59e0b',\n destructiveColor: '#ef4444',\n borderRadius: '0.5rem',\n fontFamily: 'Arial, Helvetica, sans-serif',\n headingFontFamily: 'Arial, Helvetica, sans-serif',\n};\n\n/**\n * Build full `EmailBrandTokens` from the simplified `email.brandTokens` config.\n * Merges provided values with `DEFAULT_EMAIL_DESIGN_TOKENS`.\n */\nexport function buildEmailBrandTokensFromConfig(\n brandTokens?: {\n primaryColor?: string;\n secondaryColor?: string;\n fontFamily?: string;\n // No `logoUrl`: it never had a destination here — `EmailBrandTokens` has no logo field — and the\n // logo is scope-resolved into `primaryScopeContext.logoUrl` instead. See the email config schema.\n },\n): EmailBrandTokens {\n if (!brandTokens) return { ...DEFAULT_EMAIL_DESIGN_TOKENS };\n\n return {\n ...DEFAULT_EMAIL_DESIGN_TOKENS,\n ...(brandTokens.primaryColor && { primaryColor: toHexColor(brandTokens.primaryColor) }),\n ...(brandTokens.secondaryColor && { secondaryColor: toHexColor(brandTokens.secondaryColor) }),\n ...(brandTokens.fontFamily && {\n fontFamily: brandTokens.fontFamily,\n headingFontFamily: brandTokens.fontFamily,\n }),\n };\n}\n"]}
|
|
@@ -5,16 +5,18 @@ import { ResourcesRegistryBackendService } from '../../resources/services/resour
|
|
|
5
5
|
import { ExecutionContextCreatorBackendService } from '../../runtime/services/execution-context-creator.backend.service';
|
|
6
6
|
import { ExecutionContext } from '../../runtime/models/execution-context.backend.schemas';
|
|
7
7
|
import { ResourceConfiguration_Operation } from '@wildo-ai/saas-models';
|
|
8
|
-
import {
|
|
8
|
+
import { NotificationBadgeOperation, NotificationBadgeDefinition, NotificationBadgeIdentifier, type NotificationScope } from '@wildo-ai/saas-models';
|
|
9
9
|
import { WebSocketService } from '../../requests/service/websocket.service';
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* -
|
|
14
|
-
*
|
|
11
|
+
* A parsed badge REFERENCE — one badge ROW, addressed as `<scope>:<scopeId>:<identifier>`.
|
|
12
|
+
*
|
|
13
|
+
* The FORMAT is not defined here. It lives once in `@wildo-ai/saas-models`
|
|
14
|
+
* (`buildNotificationBadgeReference` / `parseNotificationBadgeReference`) because the browser badge
|
|
15
|
+
* store parses the same string off the wire, and two hand-rolled `split(':')` implementations are
|
|
16
|
+
* how a producer and a consumer come to disagree about what the parts mean.
|
|
15
17
|
*/
|
|
16
18
|
export interface BadgeReference {
|
|
17
|
-
scope:
|
|
19
|
+
scope: NotificationScope;
|
|
18
20
|
scopeId: string;
|
|
19
21
|
identifier: NotificationBadgeIdentifier;
|
|
20
22
|
}
|
|
@@ -61,9 +63,13 @@ export declare class NotificationBadgeBackendService {
|
|
|
61
63
|
*/
|
|
62
64
|
private buildBadgeExecutionContext;
|
|
63
65
|
/**
|
|
64
|
-
* Build a badge reference string
|
|
66
|
+
* Build a badge reference string.
|
|
67
|
+
*
|
|
68
|
+
* Delegates to the shared builder rather than re-templating the format: the browser reduces this
|
|
69
|
+
* exact string to a badge KEY on arrival, so the producer and the consumer must be reading one
|
|
70
|
+
* definition of where the parts are.
|
|
65
71
|
*/
|
|
66
|
-
buildBadgeReference(scope:
|
|
72
|
+
buildBadgeReference(scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier): string;
|
|
67
73
|
/**
|
|
68
74
|
* Parse a badge reference string.
|
|
69
75
|
*
|
|
@@ -77,34 +83,133 @@ export declare class NotificationBadgeBackendService {
|
|
|
77
83
|
/**
|
|
78
84
|
* Get badge count for a specific identifier and scope
|
|
79
85
|
*/
|
|
80
|
-
getBadgeCount<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope:
|
|
86
|
+
getBadgeCount<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier): Promise<number>;
|
|
81
87
|
/**
|
|
82
88
|
* Get all badges for a specific scope
|
|
83
89
|
*/
|
|
84
|
-
getAllBadges<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope:
|
|
90
|
+
getAllBadges<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string): Promise<Array<{
|
|
85
91
|
identifier: string;
|
|
86
92
|
count: number;
|
|
87
93
|
}>>;
|
|
88
94
|
/**
|
|
89
|
-
* Execute a badge operation (increment, decrement, set, reset)
|
|
95
|
+
* Execute a badge operation (increment, decrement, set, reset).
|
|
96
|
+
*
|
|
97
|
+
* ## Two write shapes, because the vocabulary carries two kinds of change
|
|
98
|
+
*
|
|
99
|
+
* `SET` and `RESET` are ABSOLUTE: the value written does not depend on the value read, so a plain
|
|
100
|
+
* read-then-write is already correct — concurrent absolute writes are last-writer-wins, which is
|
|
101
|
+
* what "set it to N" means.
|
|
102
|
+
*
|
|
103
|
+
* `INCREMENT` and `DECREMENT` are RELATIVE, and that is where this method used to lose data. It
|
|
104
|
+
* read `count`, computed `count ± value` in JavaScript, and wrote the result back. Two operations
|
|
105
|
+
* committing concurrently both read the SAME previous value, so the second write overwrote the
|
|
106
|
+
* first and one increment vanished — with no error, no log, and a badge that is simply too low
|
|
107
|
+
* forever after (an EVENT_COUNTER badge is never re-derived; that is the whole distinction
|
|
108
|
+
* `NotificationBadgeSourceKind` draws, and it is why the drift is permanent here and self-healing
|
|
109
|
+
* on a DERIVED_QUERY badge).
|
|
110
|
+
*
|
|
111
|
+
* More checking cannot fix that — the two writers have nothing to collide on. So the relative arms
|
|
112
|
+
* now go through the adapter-neutral guarded mutation, where the STORE performs the arithmetic in
|
|
113
|
+
* one statement (`$inc` on MongoDB, `COALESCE(col, 0) + delta` on PostgreSQL) and the two writers
|
|
114
|
+
* collide on the row itself. See {@link applyRelativeCountChange}.
|
|
90
115
|
*/
|
|
91
|
-
executeBadgeOperation<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope:
|
|
116
|
+
executeBadgeOperation<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier, operation: NotificationBadgeOperation, value?: number): Promise<BadgeUpdateResult>;
|
|
117
|
+
/**
|
|
118
|
+
* Apply a RELATIVE change (`+value` / `-value`) to a badge counter without ever reading it into
|
|
119
|
+
* JavaScript first.
|
|
120
|
+
*
|
|
121
|
+
* ## The shape, and why it is a loop rather than a straight line
|
|
122
|
+
*
|
|
123
|
+
* A guarded mutation only mutates a row that ALREADY EXISTS — it returns `null` when its filter
|
|
124
|
+
* matched nothing, and it cannot insert. A badge row, meanwhile, is materialized lazily on its
|
|
125
|
+
* first write. So the write is "apply the delta; if there was no row, materialize one at ZERO and
|
|
126
|
+
* apply the delta to that".
|
|
127
|
+
*
|
|
128
|
+
* **Materializing at ZERO rather than at the target is the load-bearing detail.** Creating the row
|
|
129
|
+
* already carrying `value` would mean two racing first-increments each insert a row holding `1`,
|
|
130
|
+
* and one of the two increments is lost exactly as before — the defect would simply have moved
|
|
131
|
+
* from the update to the insert. Creating at zero and then letting BOTH callers apply their own
|
|
132
|
+
* delta through the atomic statement keeps every increment: the store matches one row for both,
|
|
133
|
+
* and it ends at 2.
|
|
134
|
+
*
|
|
135
|
+
* ## The residual, stated rather than hidden
|
|
136
|
+
*
|
|
137
|
+
* Two racing materializations can still leave a DUPLICATE badge row, because nothing in the schema
|
|
138
|
+
* makes `(scopeId, identifier)` unique — `identifier` carries `.isSummaryField()` and no
|
|
139
|
+
* `.isUnique()`, so the store has no constraint to refuse the second insert with. That duplicate
|
|
140
|
+
* hazard is older than this method and is not what this change is about: it costs a stray row,
|
|
141
|
+
* whereas the read-modify-write cost a permanently wrong number. Closing it means a unique index,
|
|
142
|
+
* which is an engine resource change owing a migration in every PostgreSQL-backed surface
|
|
143
|
+
* (`.claude/rules/engine-resource-changes-owe-migrations.md`) and belongs with the badge-identity
|
|
144
|
+
* work, not here.
|
|
145
|
+
*
|
|
146
|
+
* @returns the count before and after, as observed from the row the store returned.
|
|
147
|
+
*/
|
|
148
|
+
private applyRelativeCountChange;
|
|
149
|
+
/**
|
|
150
|
+
* ONE attempt at the atomic delta. Returns the before/after counts, or `null` when no row matched.
|
|
151
|
+
*
|
|
152
|
+
* ## The decrement floor lives in the FILTER, not in `Math.max`
|
|
153
|
+
*
|
|
154
|
+
* `Math.max(0, previousCount - value)` computes the floor from a value read moments earlier, which
|
|
155
|
+
* is the very read this change exists to remove. The floor is therefore expressed as a GUARD the
|
|
156
|
+
* store evaluates in the same statement as the write — `count: { $gte: magnitude }` — which is the
|
|
157
|
+
* idiom the promotion redemption counter uses for its `maxRedemptions` ceiling.
|
|
158
|
+
*
|
|
159
|
+
* That guard alone would REFUSE a decrement that cannot be taken in full, where the previous
|
|
160
|
+
* behaviour CLAMPED it to zero. Preserving the clamp needs a second statement, because neither
|
|
161
|
+
* adapter's neutral vocabulary can express "subtract, floored at zero" in one (there is no `$max`
|
|
162
|
+
* in `RepositoryGuardedMutation`, deliberately — an operator no adapter pair can honour identically
|
|
163
|
+
* does not get a name there). So a below-floor row is set to zero by a SECOND guarded statement,
|
|
164
|
+
* itself conditioned on the row still being below the floor. Each statement is atomic, and the
|
|
165
|
+
* pair is safe in every interleaving:
|
|
166
|
+
*
|
|
167
|
+
* - first matched → the count fell by exactly `magnitude`;
|
|
168
|
+
* - first missed, second matched → the count was below the floor at the moment of the write and is
|
|
169
|
+
* now zero, which is what `Math.max(0, count - value)` meant for that count;
|
|
170
|
+
* - both missed → either no row, or a concurrent INCREMENT crossed the floor between the two
|
|
171
|
+
* statements. The caller distinguishes those and retries rather than concluding.
|
|
172
|
+
*
|
|
173
|
+
* ## `updatedAt` is deliberately absent from the descriptor
|
|
174
|
+
*
|
|
175
|
+
* Both adapters bump it themselves — mongoose's `timestamps` hook on one, an explicit
|
|
176
|
+
* planned-column assignment inside `prepareGuardedUpdate` on the other. Passing it here would be a
|
|
177
|
+
* second authority for the same field, and the two would disagree the day either arm changes.
|
|
178
|
+
*/
|
|
179
|
+
private applyGuardedCountDelta;
|
|
180
|
+
/**
|
|
181
|
+
* Insert the badge row at ZERO so a subsequent atomic delta has something to mutate.
|
|
182
|
+
*
|
|
183
|
+
* Goes through the SERVICE tier (`repository.create` with the badge-scoped execution context)
|
|
184
|
+
* rather than a raw insert, so the row is schema-validated and gets its scope FK injected by
|
|
185
|
+
* context enrichment at birth — see {@link buildBadgeExecutionContext} for why the triggering
|
|
186
|
+
* operation's own context cannot serve here.
|
|
187
|
+
*/
|
|
188
|
+
private materializeZeroBadge;
|
|
189
|
+
/**
|
|
190
|
+
* Write an ABSOLUTE count (`SET` / `RESET`).
|
|
191
|
+
*
|
|
192
|
+
* The read here is NOT a read-modify-write: the value written is fixed by the caller, so a
|
|
193
|
+
* concurrent absolute write can only replace it wholesale, which is what an absolute write means.
|
|
194
|
+
* The read decides update-versus-insert and supplies the reported `previousCount`.
|
|
195
|
+
*/
|
|
196
|
+
private writeAbsoluteCount;
|
|
92
197
|
/**
|
|
93
198
|
* Increment a badge count
|
|
94
199
|
*/
|
|
95
|
-
increment<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope:
|
|
200
|
+
increment<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier, amount?: number): Promise<BadgeUpdateResult>;
|
|
96
201
|
/**
|
|
97
202
|
* Decrement a badge count
|
|
98
203
|
*/
|
|
99
|
-
decrement<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope:
|
|
204
|
+
decrement<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier, amount?: number): Promise<BadgeUpdateResult>;
|
|
100
205
|
/**
|
|
101
206
|
* Set a badge count to a specific value
|
|
102
207
|
*/
|
|
103
|
-
set<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope:
|
|
208
|
+
set<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier, value: number): Promise<BadgeUpdateResult>;
|
|
104
209
|
/**
|
|
105
210
|
* Reset a badge count to zero
|
|
106
211
|
*/
|
|
107
|
-
reset<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope:
|
|
212
|
+
reset<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier): Promise<BadgeUpdateResult>;
|
|
108
213
|
/**
|
|
109
214
|
* Recompute a DERIVED_QUERY badge and persist the result (R5).
|
|
110
215
|
*
|
|
@@ -133,9 +238,22 @@ export declare class NotificationBadgeBackendService {
|
|
|
133
238
|
organizationId?: string | null;
|
|
134
239
|
}): Promise<void>;
|
|
135
240
|
/**
|
|
136
|
-
* Find a badge by scope, scopeId, and identifier
|
|
241
|
+
* Find a badge by scope, scopeId, and identifier.
|
|
242
|
+
*
|
|
243
|
+
* `executionContext` is the CALLER's context and is deliberately not used for the read: a badge
|
|
244
|
+
* read runs on its own badge-resource-scoped context, exactly as a badge write does, because the
|
|
245
|
+
* triggering operation's context carries the wrong scope (see {@link buildBadgeExecutionContext}).
|
|
246
|
+
* The parameter is kept so the private read reads like every other method on this service.
|
|
137
247
|
*/
|
|
138
248
|
private findBadge;
|
|
249
|
+
/**
|
|
250
|
+
* The badge read itself, addressed only by identity.
|
|
251
|
+
*
|
|
252
|
+
* Split out of {@link findBadge} because the atomic write path has no caller execution context to
|
|
253
|
+
* pass — it is reconciling its own guarded statements, not serving a request — and inventing one
|
|
254
|
+
* to satisfy a parameter the read never consults would be ceremony.
|
|
255
|
+
*/
|
|
256
|
+
private findBadgeByIdentity;
|
|
139
257
|
/**
|
|
140
258
|
* Resolve the repository for a given badge scope.
|
|
141
259
|
*
|
|
@@ -152,11 +270,14 @@ export declare class NotificationBadgeBackendService {
|
|
|
152
270
|
*/
|
|
153
271
|
private resolveRepository;
|
|
154
272
|
/**
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
273
|
+
* Resolve the RESOURCE TYPE backing a badge scope — the same polymorphism dispatch
|
|
274
|
+
* {@link resolveRepository} performs, named separately because the atomic write path addresses the
|
|
275
|
+
* registry by resource type rather than by repository handle.
|
|
276
|
+
*
|
|
277
|
+
* One switch, two consumers: a second copy of this mapping is how a future third scope reaches one
|
|
278
|
+
* of them and not the other.
|
|
158
279
|
*/
|
|
159
|
-
private
|
|
280
|
+
private resolveResourceType;
|
|
160
281
|
/**
|
|
161
282
|
* Build filter for scope-specific queries.
|
|
162
283
|
*
|