@wildo-ai/saas-backend-lib 1.1.2 → 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.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +27 -6
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.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 +47 -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 +96 -29
- 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/infrastructure-tier-contract.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +9 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +49 -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 +171 -18
- 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.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +23 -3
- 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.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +20 -0
- 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-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 +529 -41
- 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 +48 -7
- 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 +225 -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 +340 -62
- 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 +244 -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 +386 -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 +6 -2
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +31 -9
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -1
- 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 +57 -1
- 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 +31 -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/models/app-config.backend.schemas.d.ts +142 -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 +33 -0
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.js +39 -1
- 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/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/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 +129 -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/external-data-pipeline-run.backend.service.d.ts +59 -2
- 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 +52 -17
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.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 +292 -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 +533 -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.map +1 -1
- package/dist/esm/files/controllers/file.controller.js +21 -13
- package/dist/esm/files/controllers/file.controller.js.map +1 -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 +39 -15
- package/dist/esm/files/handlers/resource-file-upload-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 +53 -2
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-upload-grant.backend.service.js +127 -3
- package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -1
- package/dist/esm/files/services/files.backend.service.d.ts +68 -0
- package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/files.backend.service.js +175 -5
- 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/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 +196 -40
- 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 +28 -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 +204 -18
- 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.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +8 -4
- 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 +11 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +31 -4
- 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 +78 -10
- package/dist/esm/inject/models/container.js.map +1 -1
- package/dist/esm/inject/models/service-types.d.ts +17 -3
- package/dist/esm/inject/models/service-types.d.ts.map +1 -1
- package/dist/esm/inject/models/service-types.js +19 -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 +20 -0
- package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +56 -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 +107 -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.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +22 -0
- 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 +99 -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 +422 -66
- 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 +46 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -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 +16 -6
- 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 +12 -12
- 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/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 +32 -8
- 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 +14 -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/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 +90 -6
- 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/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 +19 -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 +261 -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/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.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +68 -1
- 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-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 +17 -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 +49 -17
- 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/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/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 +74 -8
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js +175 -19
- 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/services/consumable-token.backend.service.d.ts +21 -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 +26 -16
- 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/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 +11 -9
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email-template-sandbox.backend.service.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email-template-sandbox.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Email Template Sandbox Backend Service\n *\n * Provides a secure execution environment for running compiled email templates.\n * Uses Node.js VM with restricted globals and a controlled require function.\n */\n\nimport { injectable, inject } from 'inversify';\nimport * as vm from 'vm';\nimport { ErrorType, ErrorCustomMessageReference } from '@wildo-ai/saas-models';\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';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SandboxExecutionResult {\n success: boolean;\n result?: unknown;\n error?: string;\n durationMs: number;\n}\n\nexport interface SandboxOptions {\n /** Timeout in milliseconds (default: 5000) */\n timeout?: number;\n /** Additional context to pass to the template */\n additionalContext?: Record<string, unknown>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CONSTANTS\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DEFAULT_TIMEOUT_MS = 5000;\n\n/**\n * Allowed modules that can be required in the sandbox\n */\nconst ALLOWED_MODULES = new Set([\n 'react',\n 'react-dom',\n '@react-email/components',\n '@react-email/render',\n '@wildo-ai/email-components',\n]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE\n// ─────────────────────────────────────────────────────────────────────────────\n\n@injectable()\nexport class EmailTemplateSandboxBackendService {\n private emailComponentsModule: unknown | null = null;\n\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 ) {\n this.logDebug = this.logger.debugByType('EmailTemplateSandboxBackendService');\n this.logger.setDebugTypeLogging('EmailTemplateSandboxBackendService', false);\n }\n\n /**\n * Execute a compiled module in the sandbox\n *\n * @param compiledCode - The compiled JavaScript code\n * @param context - The context to pass to the template\n * @param options - Execution options\n * @returns Execution result with the rendered output or error\n */\n async execute(\n compiledCode: string,\n context: Record<string, unknown>,\n options: SandboxOptions = {}\n ): Promise<SandboxExecutionResult> {\n const startTime = Date.now();\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n\n this.logDebug('Executing email template in sandbox', { timeout });\n\n try {\n // Create sandbox require function\n const sandboxRequire = this.createSandboxRequire();\n\n // Create sandbox globals\n const sandbox: vm.Context = {\n module: { exports: {} },\n exports: {},\n require: sandboxRequire,\n console: this.createSafeConsole(),\n // Pass context values\n __context: context,\n __brand: context.__brand || {},\n // Provide Buffer for any serialization needs\n Buffer: {\n from: Buffer.from.bind(Buffer),\n isBuffer: Buffer.isBuffer.bind(Buffer),\n },\n };\n\n // Add additional context if provided\n if (options.additionalContext) {\n Object.assign(sandbox, options.additionalContext);\n }\n\n // Create VM context\n vm.createContext(sandbox);\n\n // Wrap the code to capture the default export\n const wrappedCode = `\n (function(module, exports, require, __context, __brand) {\n ${compiledCode}\n return module.exports.default || module.exports;\n })(module, exports, require, __context, __brand);\n `;\n\n // Execute with timeout\n const script = new vm.Script(wrappedCode, {\n filename: 'email-template.js',\n });\n\n const result = script.runInContext(sandbox, {\n timeout,\n displayErrors: true,\n });\n\n const durationMs = Date.now() - startTime;\n this.logDebug('Sandbox execution completed', { durationMs });\n\n return {\n success: true,\n result,\n durationMs,\n };\n } catch (err) {\n const error = err as Error;\n const durationMs = Date.now() - startTime;\n\n this.logger.error('Sandbox execution failed', {\n error: error.message,\n durationMs,\n isTimeout: error.message.includes('Script execution timed out'),\n });\n\n return {\n success: false,\n error: error.message,\n durationMs,\n };\n }\n }\n\n /**\n * Create a safe require function that only allows specific modules\n */\n private createSandboxRequire(): (moduleName: string) => unknown {\n return (moduleName: string): unknown => {\n // Handle @wildo-ai/email-components specially - load our internal module\n if (moduleName === '@wildo-ai/email-components') {\n return this.getEmailComponentsModule();\n }\n\n // Check if module is in allowlist\n if (!ALLOWED_MODULES.has(moduleName)) {\n throw this.errorBuilder.buildError(ErrorType.VALIDATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.SERVICE_RESOURCE_VALIDATION_FAILED,\n context: { moduleName }, // diagnostic (log-only)\n });\n }\n\n // For allowed modules, use the real require\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(moduleName);\n };\n }\n\n /**\n * Get the email components module (lazy loaded)\n * Uses multiple resolution strategies for robustness across different build outputs\n */\n private getEmailComponentsModule(): unknown {\n if (!this.emailComponentsModule) {\n // Load our internal email components with multiple resolution strategies\n const resolutionStrategies = [\n // Strategy 1: Relative path from current file\n () => require('../components/email-components'),\n // Strategy 2: Absolute path using __dirname\n () => require(require('path').resolve(__dirname, '../components/email-components')),\n // Strategy 3: Try dist/esm path\n () => require(require('path').resolve(__dirname, '../../dist/esm/notifications/email/components/email-components')),\n // Strategy 4: Try dist/cjs path\n () => require(require('path').resolve(__dirname, '../../dist/cjs/notifications/email/components/email-components')),\n ];\n\n for (const strategy of resolutionStrategies) {\n try {\n this.emailComponentsModule = strategy();\n this.logDebug('Email components module loaded successfully');\n return this.emailComponentsModule;\n } catch {\n // Try next strategy\n }\n }\n\n this.logger.error('Failed to load email components module with any strategy');\n throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: { message: 'Email components module not available' },\n });\n }\n return this.emailComponentsModule;\n }\n\n /**\n * Create a safe console that logs through our logger\n */\n private createSafeConsole(): Partial<Console> {\n return {\n log: (...args: unknown[]) => {\n this.logger.debug('Template console.log', { args });\n },\n warn: (...args: unknown[]) => {\n this.logger.warn('Template console.warn', { args });\n },\n error: (...args: unknown[]) => {\n this.logger.error('Template console.error', { args });\n },\n info: (...args: unknown[]) => {\n this.logger.info('Template console.info', { args });\n },\n debug: (...args: unknown[]) => {\n this.logger.debug('Template console.debug', { args });\n },\n };\n }\n\n /**\n * Check if a module is allowed in the sandbox\n */\n isModuleAllowed(moduleName: string): boolean {\n return ALLOWED_MODULES.has(moduleName);\n }\n\n /**\n * Get list of allowed modules (for LLM context)\n */\n getAllowedModules(): string[] {\n return Array.from(ALLOWED_MODULES);\n }\n}\n"]}
|
package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-template-validator.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email-template-validator.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAMlG,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"email-template-validator.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email-template-validator.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAMlG,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,MAAM,EAqBlD,CAAC;AA0CF,qBACa,oCAAoC;IAIV,OAAO,CAAC,QAAQ,CAAC,MAAM;IAH5D,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;gBAG3B,MAAM,EAAE,aAAa;IAM3E;;;;;OAKG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyC/D;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAc9B;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAsBhC;;OAEG;YACW,WAAW;IAwCzB;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;CAG9B"}
|
|
@@ -32,7 +32,16 @@ export const EMAIL_TEMPLATE_ALLOWED_IMPORTS = [
|
|
|
32
32
|
// React Email core
|
|
33
33
|
'@react-email/components',
|
|
34
34
|
'@react-email/render',
|
|
35
|
-
// Our predefined email components
|
|
35
|
+
// Our predefined email components. Exported from the package root
|
|
36
|
+
// (`saas-backend-lib/src/index.ts`) so an application's authored template can import it —
|
|
37
|
+
// and it is why `InversifyContainer` is aliased there, to avoid the clash with React Email's
|
|
38
|
+
// own `Container` re-exported from this module.
|
|
39
|
+
//
|
|
40
|
+
// NOTE (#475, 2026-09-08): the email-template SANDBOX used to be the thing that resolved this
|
|
41
|
+
// specifier at runtime, and it was deleted as unreachable. Permitting the import here is
|
|
42
|
+
// therefore no longer backed by a loader inside the engine; an application template importing
|
|
43
|
+
// it resolves through its own bundler against the package root export. Keep the entry — the
|
|
44
|
+
// export is public API — but do not read it as evidence that the engine loads the module.
|
|
36
45
|
'@wildo-ai/email-components',
|
|
37
46
|
// App-owned runtime helpers used by the filesystem email template pattern
|
|
38
47
|
'@wildo-ai/saas-backend-lib',
|
package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-template-validator.backend.service.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email-template-validator.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;;;;;;;;;;;;;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAapF,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAa;IACtD,mBAAmB;IACnB,yBAAyB;IACzB,qBAAqB;IACrB,kCAAkC;IAClC,4BAA4B;IAC5B,0EAA0E;IAC1E,4BAA4B;IAC5B,sCAAsC;IACtC,UAAU;IACV,kBAAkB;IAClB,OAAO;CACR,CAAC;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAgD;IACtE,eAAe;IACf,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,kCAAkC,EAAE;IACzE,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,iCAAiC,EAAE;IACvE,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,kCAAkC,EAAE;IACtE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,iCAAiC,EAAE;IACpE,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,qCAAqC,EAAE;IAC5E,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,0BAA0B,EAAE;IAC9D,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,2BAA2B,EAAE;IAEhE,cAAc;IACd,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mCAAmC,EAAE;IACpE,EAAE,OAAO,EAAE,6BAA6B,EAAE,OAAO,EAAE,kCAAkC,EAAE;IAEvF,UAAU;IACV,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,4BAA4B,EAAE;IAC/D,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,6BAA6B,EAAE;IACjE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,2BAA2B,EAAE;IAC7D,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,qCAAqC,EAAE;IAC5E,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,+BAA+B,EAAE;IAE5E,iBAAiB;IACjB,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,uBAAuB,EAAE;IAC7D,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,uCAAuC,EAAE;IACjF,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,0CAA0C,EAAE;IACtF,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,2CAA2C,EAAE;IAExF,kBAAkB;IAClB,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,8BAA8B,EAAE;IACtE,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,uBAAuB,EAAE;IAC7D,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,wBAAwB,EAAE;CAChE,CAAC;AAEF,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAGzE,IAAM,oCAAoC,GAA1C,MAAM,oCAAoC;IAIO;IAH5C,QAAQ,CAA+D;IAEjF,YACsD,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;QAEzE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IACjF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,SAAiB;QAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,IAAI,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC;QAEtD,kCAAkC;QAClC,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QAEhC,sBAAsB;QACtB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAE7B,4DAA4D;QAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;QAE/B,4CAA4C;QAC5C,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAY,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9F,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,kCAAkC,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,SAAiB;QAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,kBAAkB,EAAE,CAAC;YACtD,oBAAoB;YACpB,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,SAAiB;QACvC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,0BAA0B;QAC1B,MAAM,WAAW,GAAG,sDAAsD,CAAC;QAC3E,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE5B,6BAA6B;YAC7B,MAAM,SAAS,GAAG,8BAA8B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBAChE,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;oBAC3B,OAAO,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClD,CAAC;gBAED,OAAO,UAAU,KAAK,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,gBAAgB,UAAU,sCAAsC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3H,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,wBAAwB,CAAC,SAAiB;QAChD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QAChF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,SAAiB;QACzC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,IAAI,CAAC;YACH,sBAAsB;YACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAExC,4DAA4D;YAC5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE;gBAChD,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,QAAQ;gBAChB,GAAG,EAAE,WAAW;gBAChB,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;YAEH,kCAAkC;YAClC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACtC,QAAQ,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,GAAG,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAgF,CAAC;YAE/F,uBAAuB;YACvB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,CAAC,GAAG,8BAA8B,CAAC,CAAC;IAC7C,CAAC;CACF,CAAA;AAnLY,oCAAoC;IADhD,UAAU,EAAE;IAKR,WAAA,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;;GAJzB,oCAAoC,CAmLhD","sourcesContent":["/**\n * Email Template Validator Backend Service\n *\n * Validates TSX email templates for security and correctness.\n * Checks for:\n * - Import allowlist compliance\n * - Forbidden patterns (Node.js APIs, dangerous code)\n * - Syntax validation via ESBuild\n */\n\nimport { injectable, inject } from 'inversify';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface TsxValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CONSTANTS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Allowed import paths for generated email templates\n * Templates can only import from these modules\n */\nexport const EMAIL_TEMPLATE_ALLOWED_IMPORTS: string[] = [\n // React Email core\n '@react-email/components',\n '@react-email/render',\n // Our predefined email components\n '@wildo-ai/email-components',\n // App-owned runtime helpers used by the filesystem email template pattern\n '@wildo-ai/saas-backend-lib',\n '~backend-api/engine/email/components',\n './labels',\n // React (limited)\n 'react',\n];\n\n/**\n * Forbidden patterns that indicate potentially dangerous code\n */\nconst FORBIDDEN_PATTERNS: Array<{ pattern: RegExp; message: string }> = [\n // Node.js APIs\n { pattern: /require\\s*\\(/g, message: 'Dynamic require() is not allowed' },\n { pattern: /import\\s*\\(/g, message: 'Dynamic import() is not allowed' },\n { pattern: /process\\./g, message: 'Access to process is not allowed' },\n { pattern: /global\\./g, message: 'Access to global is not allowed' },\n { pattern: /globalThis\\./g, message: 'Access to globalThis is not allowed' },\n { pattern: /__dirname/g, message: '__dirname is not allowed' },\n { pattern: /__filename/g, message: '__filename is not allowed' },\n\n // File system\n { pattern: /\\bfs\\b/g, message: 'File system access is not allowed' },\n { pattern: /\\bpath\\b\\.(?!join|resolve)/g, message: 'Path module access is restricted' },\n\n // Network\n { pattern: /\\bhttp\\b/g, message: 'HTTP module is not allowed' },\n { pattern: /\\bhttps\\b/g, message: 'HTTPS module is not allowed' },\n { pattern: /\\bnet\\b/g, message: 'Net module is not allowed' },\n { pattern: /\\bfetch\\s*\\(/g, message: 'fetch() is not allowed in templates' },\n { pattern: /\\bXMLHttpRequest\\b/g, message: 'XMLHttpRequest is not allowed' },\n\n // Code execution\n { pattern: /\\beval\\s*\\(/g, message: 'eval() is not allowed' },\n { pattern: /\\bFunction\\s*\\(/g, message: 'Function() constructor is not allowed' },\n { pattern: /\\bsetTimeout\\s*\\(/g, message: 'setTimeout() is not allowed in templates' },\n { pattern: /\\bsetInterval\\s*\\(/g, message: 'setInterval() is not allowed in templates' },\n\n // Child processes\n { pattern: /child_process/g, message: 'child_process is not allowed' },\n { pattern: /\\bexec\\s*\\(/g, message: 'exec() is not allowed' },\n { pattern: /\\bspawn\\s*\\(/g, message: 'spawn() is not allowed' },\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE\n// ─────────────────────────────────────────────────────────────────────────────\n\n@injectable()\nexport class EmailTemplateValidatorBackendService {\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n ) {\n this.logDebug = this.logger.debugByType('EmailTemplateValidatorBackendService');\n this.logger.setDebugTypeLogging('EmailTemplateValidatorBackendService', false);\n }\n\n /**\n * Validate a TSX template source\n *\n * @param tsxSource - The TSX template source code\n * @returns Validation result with errors and warnings\n */\n async validate(tsxSource: string): Promise<TsxValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n this.logDebug('Validating email template TSX source');\n\n // 1. Check for forbidden patterns\n const forbiddenErrors = this.checkForbiddenPatterns(tsxSource);\n errors.push(...forbiddenErrors);\n\n // 2. Validate imports\n const importErrors = this.validateImports(tsxSource);\n errors.push(...importErrors);\n\n // 3. Validate the filesystem email-template contract shape.\n const contractErrors = this.validateTemplateContract(tsxSource);\n errors.push(...contractErrors);\n\n // 4. Syntax check via ESBuild (basic parse)\n try {\n const syntaxResult = await this.checkSyntax(tsxSource);\n if (!syntaxResult.valid) {\n errors.push(...syntaxResult.errors);\n }\n warnings.push(...syntaxResult.warnings);\n } catch (err) {\n const error = err as Error;\n errors.push(`Syntax error: ${error.message}`);\n }\n\n const valid = errors.length === 0;\n\n if (!valid) {\n this.logger.warn('Email template validation failed', { errorCount: errors.length, errors });\n } else {\n this.logDebug('Email template validation passed', { warningCount: warnings.length });\n }\n\n return { valid, errors, warnings };\n }\n\n /**\n * Check for forbidden patterns in the source code\n */\n private checkForbiddenPatterns(tsxSource: string): string[] {\n const errors: string[] = [];\n\n for (const { pattern, message } of FORBIDDEN_PATTERNS) {\n // Reset regex state\n pattern.lastIndex = 0;\n if (pattern.test(tsxSource)) {\n errors.push(message);\n }\n }\n\n return errors;\n }\n\n /**\n * Validate that all imports are in the allowlist\n */\n private validateImports(tsxSource: string): string[] {\n const errors: string[] = [];\n\n // Match import statements\n const importRegex = /import\\s+(?:[\\w*{}\\s,]+\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n let match;\n\n while ((match = importRegex.exec(tsxSource)) !== null) {\n const importPath = match[1];\n\n // Check if import is allowed\n const isAllowed = EMAIL_TEMPLATE_ALLOWED_IMPORTS.some((allowed) => {\n if (allowed === './labels') {\n return /^\\.\\/labels\\.[^/'\"]+$/.test(importPath);\n }\n\n return importPath === allowed || importPath.startsWith(allowed + '/');\n });\n\n if (!isAllowed) {\n errors.push(`Import from '${importPath}' is not allowed. Allowed imports: ${EMAIL_TEMPLATE_ALLOWED_IMPORTS.join(', ')}`);\n }\n }\n\n return errors;\n }\n\n /**\n * Validate that the source looks like a default-exported EmailTemplateDefinition\n * object with the required `subject` and `body` members.\n */\n private validateTemplateContract(tsxSource: string): string[] {\n const errors: string[] = [];\n\n if (!/EmailTemplateDefinition(?:<[^>]+>)?/.test(tsxSource)) {\n errors.push('Generated template must reference EmailTemplateDefinition');\n }\n\n if (!/\\bsubject\\s*[:(]/.test(tsxSource)) {\n errors.push('Generated template must expose a subject member');\n }\n\n if (!/\\bbody\\s*[:(]/.test(tsxSource)) {\n errors.push('Generated template must expose a body member');\n }\n\n if (!/export\\s+default\\s+/.test(tsxSource)) {\n errors.push('Generated template must default-export the template definition');\n }\n\n return errors;\n }\n\n /**\n * Check syntax using ESBuild's parser\n */\n private async checkSyntax(tsxSource: string): Promise<{ valid: boolean; errors: string[]; warnings: string[] }> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n try {\n // Lazy import esbuild\n const esbuild = await import('esbuild');\n\n // Transform with TSX loader - this will catch syntax errors\n const result = await esbuild.transform(tsxSource, {\n loader: 'tsx',\n target: 'es2020',\n jsx: 'automatic',\n minify: false,\n });\n\n // Check for warnings from ESBuild\n if (result.warnings && result.warnings.length > 0) {\n for (const warning of result.warnings) {\n warnings.push(`Line ${warning.location?.line || '?'}: ${warning.text}`);\n }\n }\n\n return { valid: true, errors, warnings };\n } catch (err) {\n const error = err as Error & { errors?: Array<{ text: string; location?: { line: number } }> };\n\n // ESBuild error format\n if (error.errors && Array.isArray(error.errors)) {\n for (const e of error.errors) {\n errors.push(`Line ${e.location?.line || '?'}: ${e.text}`);\n }\n } else {\n errors.push(error.message);\n }\n\n return { valid: false, errors, warnings };\n }\n }\n\n /**\n * Get the list of allowed imports (for LLM context)\n */\n getAllowedImports(): string[] {\n return [...EMAIL_TEMPLATE_ALLOWED_IMPORTS];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"email-template-validator.backend.service.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email-template-validator.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Email Template Validator Backend Service\n *\n * Validates TSX email templates for security and correctness.\n * Checks for:\n * - Import allowlist compliance\n * - Forbidden patterns (Node.js APIs, dangerous code)\n * - Syntax validation via ESBuild\n */\n\nimport { injectable, inject } from 'inversify';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface TsxValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CONSTANTS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Allowed import paths for generated email templates\n * Templates can only import from these modules\n */\nexport const EMAIL_TEMPLATE_ALLOWED_IMPORTS: string[] = [\n // React Email core\n '@react-email/components',\n '@react-email/render',\n // Our predefined email components. Exported from the package root\n // (`saas-backend-lib/src/index.ts`) so an application's authored template can import it —\n // and it is why `InversifyContainer` is aliased there, to avoid the clash with React Email's\n // own `Container` re-exported from this module.\n //\n // NOTE (#475, 2026-09-08): the email-template SANDBOX used to be the thing that resolved this\n // specifier at runtime, and it was deleted as unreachable. Permitting the import here is\n // therefore no longer backed by a loader inside the engine; an application template importing\n // it resolves through its own bundler against the package root export. Keep the entry — the\n // export is public API — but do not read it as evidence that the engine loads the module.\n '@wildo-ai/email-components',\n // App-owned runtime helpers used by the filesystem email template pattern\n '@wildo-ai/saas-backend-lib',\n '~backend-api/engine/email/components',\n './labels',\n // React (limited)\n 'react',\n];\n\n/**\n * Forbidden patterns that indicate potentially dangerous code\n */\nconst FORBIDDEN_PATTERNS: Array<{ pattern: RegExp; message: string }> = [\n // Node.js APIs\n { pattern: /require\\s*\\(/g, message: 'Dynamic require() is not allowed' },\n { pattern: /import\\s*\\(/g, message: 'Dynamic import() is not allowed' },\n { pattern: /process\\./g, message: 'Access to process is not allowed' },\n { pattern: /global\\./g, message: 'Access to global is not allowed' },\n { pattern: /globalThis\\./g, message: 'Access to globalThis is not allowed' },\n { pattern: /__dirname/g, message: '__dirname is not allowed' },\n { pattern: /__filename/g, message: '__filename is not allowed' },\n\n // File system\n { pattern: /\\bfs\\b/g, message: 'File system access is not allowed' },\n { pattern: /\\bpath\\b\\.(?!join|resolve)/g, message: 'Path module access is restricted' },\n\n // Network\n { pattern: /\\bhttp\\b/g, message: 'HTTP module is not allowed' },\n { pattern: /\\bhttps\\b/g, message: 'HTTPS module is not allowed' },\n { pattern: /\\bnet\\b/g, message: 'Net module is not allowed' },\n { pattern: /\\bfetch\\s*\\(/g, message: 'fetch() is not allowed in templates' },\n { pattern: /\\bXMLHttpRequest\\b/g, message: 'XMLHttpRequest is not allowed' },\n\n // Code execution\n { pattern: /\\beval\\s*\\(/g, message: 'eval() is not allowed' },\n { pattern: /\\bFunction\\s*\\(/g, message: 'Function() constructor is not allowed' },\n { pattern: /\\bsetTimeout\\s*\\(/g, message: 'setTimeout() is not allowed in templates' },\n { pattern: /\\bsetInterval\\s*\\(/g, message: 'setInterval() is not allowed in templates' },\n\n // Child processes\n { pattern: /child_process/g, message: 'child_process is not allowed' },\n { pattern: /\\bexec\\s*\\(/g, message: 'exec() is not allowed' },\n { pattern: /\\bspawn\\s*\\(/g, message: 'spawn() is not allowed' },\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE\n// ─────────────────────────────────────────────────────────────────────────────\n\n@injectable()\nexport class EmailTemplateValidatorBackendService {\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n ) {\n this.logDebug = this.logger.debugByType('EmailTemplateValidatorBackendService');\n this.logger.setDebugTypeLogging('EmailTemplateValidatorBackendService', false);\n }\n\n /**\n * Validate a TSX template source\n *\n * @param tsxSource - The TSX template source code\n * @returns Validation result with errors and warnings\n */\n async validate(tsxSource: string): Promise<TsxValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n this.logDebug('Validating email template TSX source');\n\n // 1. Check for forbidden patterns\n const forbiddenErrors = this.checkForbiddenPatterns(tsxSource);\n errors.push(...forbiddenErrors);\n\n // 2. Validate imports\n const importErrors = this.validateImports(tsxSource);\n errors.push(...importErrors);\n\n // 3. Validate the filesystem email-template contract shape.\n const contractErrors = this.validateTemplateContract(tsxSource);\n errors.push(...contractErrors);\n\n // 4. Syntax check via ESBuild (basic parse)\n try {\n const syntaxResult = await this.checkSyntax(tsxSource);\n if (!syntaxResult.valid) {\n errors.push(...syntaxResult.errors);\n }\n warnings.push(...syntaxResult.warnings);\n } catch (err) {\n const error = err as Error;\n errors.push(`Syntax error: ${error.message}`);\n }\n\n const valid = errors.length === 0;\n\n if (!valid) {\n this.logger.warn('Email template validation failed', { errorCount: errors.length, errors });\n } else {\n this.logDebug('Email template validation passed', { warningCount: warnings.length });\n }\n\n return { valid, errors, warnings };\n }\n\n /**\n * Check for forbidden patterns in the source code\n */\n private checkForbiddenPatterns(tsxSource: string): string[] {\n const errors: string[] = [];\n\n for (const { pattern, message } of FORBIDDEN_PATTERNS) {\n // Reset regex state\n pattern.lastIndex = 0;\n if (pattern.test(tsxSource)) {\n errors.push(message);\n }\n }\n\n return errors;\n }\n\n /**\n * Validate that all imports are in the allowlist\n */\n private validateImports(tsxSource: string): string[] {\n const errors: string[] = [];\n\n // Match import statements\n const importRegex = /import\\s+(?:[\\w*{}\\s,]+\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n let match;\n\n while ((match = importRegex.exec(tsxSource)) !== null) {\n const importPath = match[1];\n\n // Check if import is allowed\n const isAllowed = EMAIL_TEMPLATE_ALLOWED_IMPORTS.some((allowed) => {\n if (allowed === './labels') {\n return /^\\.\\/labels\\.[^/'\"]+$/.test(importPath);\n }\n\n return importPath === allowed || importPath.startsWith(allowed + '/');\n });\n\n if (!isAllowed) {\n errors.push(`Import from '${importPath}' is not allowed. Allowed imports: ${EMAIL_TEMPLATE_ALLOWED_IMPORTS.join(', ')}`);\n }\n }\n\n return errors;\n }\n\n /**\n * Validate that the source looks like a default-exported EmailTemplateDefinition\n * object with the required `subject` and `body` members.\n */\n private validateTemplateContract(tsxSource: string): string[] {\n const errors: string[] = [];\n\n if (!/EmailTemplateDefinition(?:<[^>]+>)?/.test(tsxSource)) {\n errors.push('Generated template must reference EmailTemplateDefinition');\n }\n\n if (!/\\bsubject\\s*[:(]/.test(tsxSource)) {\n errors.push('Generated template must expose a subject member');\n }\n\n if (!/\\bbody\\s*[:(]/.test(tsxSource)) {\n errors.push('Generated template must expose a body member');\n }\n\n if (!/export\\s+default\\s+/.test(tsxSource)) {\n errors.push('Generated template must default-export the template definition');\n }\n\n return errors;\n }\n\n /**\n * Check syntax using ESBuild's parser\n */\n private async checkSyntax(tsxSource: string): Promise<{ valid: boolean; errors: string[]; warnings: string[] }> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n try {\n // Lazy import esbuild\n const esbuild = await import('esbuild');\n\n // Transform with TSX loader - this will catch syntax errors\n const result = await esbuild.transform(tsxSource, {\n loader: 'tsx',\n target: 'es2020',\n jsx: 'automatic',\n minify: false,\n });\n\n // Check for warnings from ESBuild\n if (result.warnings && result.warnings.length > 0) {\n for (const warning of result.warnings) {\n warnings.push(`Line ${warning.location?.line || '?'}: ${warning.text}`);\n }\n }\n\n return { valid: true, errors, warnings };\n } catch (err) {\n const error = err as Error & { errors?: Array<{ text: string; location?: { line: number } }> };\n\n // ESBuild error format\n if (error.errors && Array.isArray(error.errors)) {\n for (const e of error.errors) {\n errors.push(`Line ${e.location?.line || '?'}: ${e.text}`);\n }\n } else {\n errors.push(error.message);\n }\n\n return { valid: false, errors, warnings };\n }\n }\n\n /**\n * Get the list of allowed imports (for LLM context)\n */\n getAllowedImports(): string[] {\n return [...EMAIL_TEMPLATE_ALLOWED_IMPORTS];\n }\n}\n"]}
|
|
@@ -6,15 +6,46 @@
|
|
|
6
6
|
* - Context building
|
|
7
7
|
* - React Email rendering (subject fn + body fn → HTML/text)
|
|
8
8
|
* - Provider resolution and HTTP execution
|
|
9
|
+
*
|
|
10
|
+
* ## A sent email leaves LOG LINES and nothing else — by decision (#412, 2026-09-08)
|
|
11
|
+
*
|
|
12
|
+
* There is no persisted record of a sent email anywhere in the framework: no core resource, no
|
|
13
|
+
* delivery log, no per-tenant history. **"Did this customer receive it?" is answered with the email
|
|
14
|
+
* provider's own tooling, never with Wildo.** Say that to anyone who asks for it here, rather than
|
|
15
|
+
* treating the absence as a gap to be filled.
|
|
16
|
+
*
|
|
17
|
+
* It reads as an oversight because the sibling subsystem does the opposite: outbound M2M webhooks
|
|
18
|
+
* carry a persisted per-tenant delivery log (`ORGANIZATION_M2M_WEBHOOK_DELIVERY_LOG` and its
|
|
19
|
+
* application twin). The asymmetry is deliberate and the reason is not the table — it is that a
|
|
20
|
+
* persisted email record is a new per-user personal-data store carrying retention policy, privacy
|
|
21
|
+
* classification, subject-export and erasure obligations FOR MESSAGE CONTENT. A metadata-only
|
|
22
|
+
* variant (recipient, template, timestamp, provider id; no body) was on the table and declined too,
|
|
23
|
+
* because it carries the same set of obligations over a smaller payload.
|
|
24
|
+
*
|
|
25
|
+
* Reopening this is legitimate, and it starts with the obligations rather than with the schema.
|
|
9
26
|
*/
|
|
10
27
|
import type { LoggerService } from '../../../monitoring/logger/services/logger.service';
|
|
11
28
|
import type { ErrorBuilderBackendService } from '../../../errors/services/error-builder.backend.service';
|
|
12
29
|
import type { AppConfigurationService } from '../../../config/services/app-configuration.backend.service';
|
|
13
30
|
import type { ExternalProvidersRegistryBackendService } from '../../../external-providers/services/external-providers-registry.backend.service';
|
|
14
|
-
import type {
|
|
31
|
+
import type { FilesBackendService } from '../../../files/services/files.backend.service';
|
|
15
32
|
import type { EmailTemplateRegistryBackendService } from './email-template-registry.backend.service';
|
|
16
33
|
import { EmailTemplateContext, EmailTemplateType } from '@wildo-ai/saas-models';
|
|
17
34
|
import { AvailableLanguage } from '@wildo-ai/presets-components-models';
|
|
35
|
+
/**
|
|
36
|
+
* Total size ceiling for the attachments of ONE email, applied after the bytes are resolved (#429).
|
|
37
|
+
*
|
|
38
|
+
* 10 MB, deliberately below every provider ceiling this framework talks to — SendGrid 30 MB,
|
|
39
|
+
* Mailgun 25 MB, SES 40 MB on the raw message — so an over-size send is refused HERE, naming the
|
|
40
|
+
* files and the measured total, instead of at a vendor whose rejection an application cannot act
|
|
41
|
+
* on. Base64 also inflates the wire payload by roughly a third, so a limit set AT a provider's
|
|
42
|
+
* number would still fail there.
|
|
43
|
+
*
|
|
44
|
+
* A constant rather than a config key, until an application needs a different number: a configurable
|
|
45
|
+
* limit that nothing reads is the exact defect this issue closed, and adding the reader is the
|
|
46
|
+
* cheaper half of that change.
|
|
47
|
+
*/
|
|
48
|
+
export declare const OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT: number;
|
|
18
49
|
export interface EmailSendRequest {
|
|
19
50
|
/**
|
|
20
51
|
* Stable identity of one logical provider submission. A caller that can
|
|
@@ -78,11 +109,11 @@ export declare class EmailBackendService {
|
|
|
78
109
|
private readonly logger;
|
|
79
110
|
private readonly errorBuilder;
|
|
80
111
|
private readonly templateRegistry;
|
|
81
|
-
private readonly contextProviderRegistry;
|
|
82
112
|
private readonly configService;
|
|
83
113
|
private readonly externalProvidersRegistry;
|
|
114
|
+
private readonly filesService;
|
|
84
115
|
protected logDebug: (message: string, context?: Record<string, unknown>) => void;
|
|
85
|
-
constructor(logger: LoggerService, errorBuilder: ErrorBuilderBackendService, templateRegistry: EmailTemplateRegistryBackendService,
|
|
116
|
+
constructor(logger: LoggerService, errorBuilder: ErrorBuilderBackendService, templateRegistry: EmailTemplateRegistryBackendService, configService: AppConfigurationService, externalProvidersRegistry: ExternalProvidersRegistryBackendService, filesService: FilesBackendService | undefined);
|
|
86
117
|
/**
|
|
87
118
|
* Send an email using a file-based template definition.
|
|
88
119
|
*/
|
|
@@ -95,6 +126,32 @@ export declare class EmailBackendService {
|
|
|
95
126
|
private getFallbackLocale;
|
|
96
127
|
private getDesignTokens;
|
|
97
128
|
private resolveEmailProvider;
|
|
129
|
+
/**
|
|
130
|
+
* Resolve `attachmentFileIds` to the vendor-neutral `attachments` array several provider adapters
|
|
131
|
+
* already map (#429).
|
|
132
|
+
*
|
|
133
|
+
* Until this existed the field was declared and read by nothing, so a caller supplying an
|
|
134
|
+
* attachment got a successful send and an attachment-less email. Every refusal below therefore
|
|
135
|
+
* THROWS: a silent drop is the defect, and error handling that drops quietly is the same defect.
|
|
136
|
+
*
|
|
137
|
+
* ## The size cap is the framework's, not a provider's
|
|
138
|
+
*
|
|
139
|
+
* {@link OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT} is deliberately below every provider limit this
|
|
140
|
+
* framework talks to, so the refusal happens HERE — with the file ids and the measured total in
|
|
141
|
+
* the error — rather than at a vendor that answers with a rejected submission and a message the
|
|
142
|
+
* application cannot act on. It is a named constant rather than a config key on purpose: an
|
|
143
|
+
* authored limit nothing read is precisely the class of defect this issue came from, and a
|
|
144
|
+
* config surface can be added the day an application needs a different number.
|
|
145
|
+
*
|
|
146
|
+
* ## What is NOT checked here, and why
|
|
147
|
+
*
|
|
148
|
+
* The file TYPE. A file reaching this point has already passed upload-time validation and, where
|
|
149
|
+
* the field opts into scanning, the scanner — and the status gate inside
|
|
150
|
+
* `readFilesForOutboundAttachment` admits only what the download route would serve, which
|
|
151
|
+
* excludes INFECTED. Re-deciding admissible types at send time would be a second policy that can
|
|
152
|
+
* disagree with the first.
|
|
153
|
+
*/
|
|
154
|
+
private resolveAttachments;
|
|
98
155
|
private buildEmailRequest;
|
|
99
156
|
private executeProviderRequest;
|
|
100
157
|
private bestEffortParseResponseBody;
|
|
@@ -125,6 +182,5 @@ export declare class EmailBackendService {
|
|
|
125
182
|
* `providerId === '<literal>'` branches.
|
|
126
183
|
*/
|
|
127
184
|
private serializeProviderEmailPayload;
|
|
128
|
-
private createProviderUtils;
|
|
129
185
|
}
|
|
130
186
|
//# sourceMappingURL=email.backend.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email.backend.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"email.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email.backend.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,23 @@
|
|
|
6
6
|
* - Context building
|
|
7
7
|
* - React Email rendering (subject fn + body fn → HTML/text)
|
|
8
8
|
* - Provider resolution and HTTP execution
|
|
9
|
+
*
|
|
10
|
+
* ## A sent email leaves LOG LINES and nothing else — by decision (#412, 2026-09-08)
|
|
11
|
+
*
|
|
12
|
+
* There is no persisted record of a sent email anywhere in the framework: no core resource, no
|
|
13
|
+
* delivery log, no per-tenant history. **"Did this customer receive it?" is answered with the email
|
|
14
|
+
* provider's own tooling, never with Wildo.** Say that to anyone who asks for it here, rather than
|
|
15
|
+
* treating the absence as a gap to be filled.
|
|
16
|
+
*
|
|
17
|
+
* It reads as an oversight because the sibling subsystem does the opposite: outbound M2M webhooks
|
|
18
|
+
* carry a persisted per-tenant delivery log (`ORGANIZATION_M2M_WEBHOOK_DELIVERY_LOG` and its
|
|
19
|
+
* application twin). The asymmetry is deliberate and the reason is not the table — it is that a
|
|
20
|
+
* persisted email record is a new per-user personal-data store carrying retention policy, privacy
|
|
21
|
+
* classification, subject-export and erasure obligations FOR MESSAGE CONTENT. A metadata-only
|
|
22
|
+
* variant (recipient, template, timestamp, provider id; no body) was on the table and declined too,
|
|
23
|
+
* because it carries the same set of obligations over a smaller payload.
|
|
24
|
+
*
|
|
25
|
+
* Reopening this is legitimate, and it starts with the obligations rather than with the schema.
|
|
9
26
|
*/
|
|
10
27
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
11
28
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -19,7 +36,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
19
36
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
20
37
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
21
38
|
};
|
|
22
|
-
import { injectable, inject } from 'inversify';
|
|
39
|
+
import { injectable, inject, optional } from 'inversify';
|
|
23
40
|
import { render } from '@react-email/render';
|
|
24
41
|
import { randomUUID } from 'node:crypto';
|
|
25
42
|
import { SAAS_SERVICE_TYPES } from '../../../inject/models/service-types.js';
|
|
@@ -27,7 +44,7 @@ import { describeCaughtError } from '../../../errors/utils/error-log-level-class
|
|
|
27
44
|
import { getConfiguredFallbackLanguage, getConfiguredPrimaryLanguage, } from '../../../config/services/app-configuration.backend.utils.js';
|
|
28
45
|
import { buildEmailBrandTokensFromConfig } from '../../../notifications/email/utils/color-conversion.utils.js';
|
|
29
46
|
import { EmailTemplateType_ToEngineCapability, ErrorCustomMessageReference, ErrorType, isWildoBackendError, WildoHeaderKeys, } from '@wildo-ai/saas-models';
|
|
30
|
-
import { EmailProviderPayloadEncoding, EmailProviderSubmissionClassification, ExternalProvider_ExchangeProtocol_Kind, StandardEmail_SendRequestSchema, StandardEmail_SendResponseSchema, } from '@wildo-ai/external-connectors-models';
|
|
47
|
+
import { EmailProviderPayloadEncoding, EmailProviderSubmissionClassification, ExternalProvider_ExchangeProtocol_Kind, StandardEmail_SendRequestSchema, StandardEmail_SendResponseSchema, ProviderProtocolRuntimeKind, } from '@wildo-ai/external-connectors-models';
|
|
31
48
|
import { EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS, } from '../../../notifications/email/models/email-transport.backend.definitions.js';
|
|
32
49
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
33
50
|
// UTILITIES
|
|
@@ -36,6 +53,23 @@ function validateEmailAddresses(emails) {
|
|
|
36
53
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
37
54
|
return emails.filter(email => !emailRegex.test(email.trim()));
|
|
38
55
|
}
|
|
56
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
57
|
+
// TYPES
|
|
58
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
59
|
+
/**
|
|
60
|
+
* Total size ceiling for the attachments of ONE email, applied after the bytes are resolved (#429).
|
|
61
|
+
*
|
|
62
|
+
* 10 MB, deliberately below every provider ceiling this framework talks to — SendGrid 30 MB,
|
|
63
|
+
* Mailgun 25 MB, SES 40 MB on the raw message — so an over-size send is refused HERE, naming the
|
|
64
|
+
* files and the measured total, instead of at a vendor whose rejection an application cannot act
|
|
65
|
+
* on. Base64 also inflates the wire payload by roughly a third, so a limit set AT a provider's
|
|
66
|
+
* number would still fail there.
|
|
67
|
+
*
|
|
68
|
+
* A constant rather than a config key, until an application needs a different number: a configurable
|
|
69
|
+
* limit that nothing reads is the exact defect this issue closed, and adding the reader is the
|
|
70
|
+
* cheaper half of that change.
|
|
71
|
+
*/
|
|
72
|
+
export const OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT = 10 * 1024 * 1024;
|
|
39
73
|
export var EmailSubmissionOutcome;
|
|
40
74
|
(function (EmailSubmissionOutcome) {
|
|
41
75
|
EmailSubmissionOutcome["NOT_SUBMITTED"] = "not_submitted";
|
|
@@ -50,17 +84,17 @@ let EmailBackendService = class EmailBackendService {
|
|
|
50
84
|
logger;
|
|
51
85
|
errorBuilder;
|
|
52
86
|
templateRegistry;
|
|
53
|
-
contextProviderRegistry;
|
|
54
87
|
configService;
|
|
55
88
|
externalProvidersRegistry;
|
|
89
|
+
filesService;
|
|
56
90
|
logDebug;
|
|
57
|
-
constructor(logger, errorBuilder, templateRegistry,
|
|
91
|
+
constructor(logger, errorBuilder, templateRegistry, configService, externalProvidersRegistry, filesService) {
|
|
58
92
|
this.logger = logger;
|
|
59
93
|
this.errorBuilder = errorBuilder;
|
|
60
94
|
this.templateRegistry = templateRegistry;
|
|
61
|
-
this.contextProviderRegistry = contextProviderRegistry;
|
|
62
95
|
this.configService = configService;
|
|
63
96
|
this.externalProvidersRegistry = externalProvidersRegistry;
|
|
97
|
+
this.filesService = filesService;
|
|
64
98
|
this.logDebug = this.logger.debugByType('EmailBackendService');
|
|
65
99
|
this.logger.setDebugTypeLogging('EmailBackendService', false);
|
|
66
100
|
}
|
|
@@ -101,20 +135,13 @@ let EmailBackendService = class EmailBackendService {
|
|
|
101
135
|
const resolved = this.templateRegistry.resolve(request.templateRef, request.locale, defaultLocale, this.getFallbackLocale());
|
|
102
136
|
// 2. Get design tokens
|
|
103
137
|
const brandTokens = this.getDesignTokens();
|
|
104
|
-
// 3. Build
|
|
105
|
-
const additionalContext = await this.contextProviderRegistry.buildAdditionalContext({
|
|
106
|
-
templateRef: request.templateRef,
|
|
107
|
-
locale: request.locale,
|
|
108
|
-
baseContext: request.context,
|
|
109
|
-
}, this.createProviderUtils());
|
|
110
|
-
// 4. Build full context
|
|
138
|
+
// 3. Build full context
|
|
111
139
|
const fullContext = {
|
|
112
140
|
currentObject: request.context.currentObject,
|
|
113
141
|
objectContext: request.context.objectContext,
|
|
114
142
|
userContext: request.context.userContext,
|
|
115
143
|
additionalContext: {
|
|
116
144
|
...(request.context.additionalContext || {}),
|
|
117
|
-
...additionalContext,
|
|
118
145
|
},
|
|
119
146
|
};
|
|
120
147
|
// 5. Render subject and body from definition functions
|
|
@@ -127,8 +154,12 @@ let EmailBackendService = class EmailBackendService {
|
|
|
127
154
|
const emailType = resolved.definition.type ?? request.type;
|
|
128
155
|
const engineCapability = EmailTemplateType_ToEngineCapability[emailType];
|
|
129
156
|
const providerConfig = this.resolveEmailProvider(engineCapability);
|
|
157
|
+
// 6b. Resolve caller-supplied attachments to bytes (#429). Before the request is built,
|
|
158
|
+
// because a file that cannot be served must refuse the send rather than produce an email
|
|
159
|
+
// that silently lacks what the caller attached.
|
|
160
|
+
const attachments = await this.resolveAttachments(request);
|
|
130
161
|
// 7. Build email request
|
|
131
|
-
const emailRequest = this.buildEmailRequest(request, submissionId, { subject, bodyHtml, bodyText }, providerConfig, recipients);
|
|
162
|
+
const emailRequest = this.buildEmailRequest(request, submissionId, { subject, bodyHtml, bodyText }, providerConfig, recipients, attachments);
|
|
132
163
|
const providerRequest = providerConfig.delivery === 'network'
|
|
133
164
|
? providerConfig.buildSendRequest({
|
|
134
165
|
request: emailRequest,
|
|
@@ -252,7 +283,7 @@ let EmailBackendService = class EmailBackendService {
|
|
|
252
283
|
throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, { context: { message: `Email provider is disabled by external provider configuration: ${providerId}`, providerId, capability } });
|
|
253
284
|
}
|
|
254
285
|
const emailContract = this.externalProvidersRegistry.getProviderConfiguration(providerId, ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER)?.runtimeContract;
|
|
255
|
-
if (emailContract?.kind !==
|
|
286
|
+
if (emailContract?.kind !== ProviderProtocolRuntimeKind.EMAIL) {
|
|
256
287
|
throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, { context: { message: `No EMAIL_PROVIDER runtime contract found for provider: ${providerId}`, providerId, capability } });
|
|
257
288
|
}
|
|
258
289
|
const appConfig = this.configService.config;
|
|
@@ -305,7 +336,70 @@ let EmailBackendService = class EmailBackendService {
|
|
|
305
336
|
parseSendResponse: emailContract.parseSendResponse,
|
|
306
337
|
};
|
|
307
338
|
}
|
|
308
|
-
|
|
339
|
+
/**
|
|
340
|
+
* Resolve `attachmentFileIds` to the vendor-neutral `attachments` array several provider adapters
|
|
341
|
+
* already map (#429).
|
|
342
|
+
*
|
|
343
|
+
* Until this existed the field was declared and read by nothing, so a caller supplying an
|
|
344
|
+
* attachment got a successful send and an attachment-less email. Every refusal below therefore
|
|
345
|
+
* THROWS: a silent drop is the defect, and error handling that drops quietly is the same defect.
|
|
346
|
+
*
|
|
347
|
+
* ## The size cap is the framework's, not a provider's
|
|
348
|
+
*
|
|
349
|
+
* {@link OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT} is deliberately below every provider limit this
|
|
350
|
+
* framework talks to, so the refusal happens HERE — with the file ids and the measured total in
|
|
351
|
+
* the error — rather than at a vendor that answers with a rejected submission and a message the
|
|
352
|
+
* application cannot act on. It is a named constant rather than a config key on purpose: an
|
|
353
|
+
* authored limit nothing read is precisely the class of defect this issue came from, and a
|
|
354
|
+
* config surface can be added the day an application needs a different number.
|
|
355
|
+
*
|
|
356
|
+
* ## What is NOT checked here, and why
|
|
357
|
+
*
|
|
358
|
+
* The file TYPE. A file reaching this point has already passed upload-time validation and, where
|
|
359
|
+
* the field opts into scanning, the scanner — and the status gate inside
|
|
360
|
+
* `readFilesForOutboundAttachment` admits only what the download route would serve, which
|
|
361
|
+
* excludes INFECTED. Re-deciding admissible types at send time would be a second policy that can
|
|
362
|
+
* disagree with the first.
|
|
363
|
+
*/
|
|
364
|
+
async resolveAttachments(request) {
|
|
365
|
+
const fileIds = request.attachmentFileIds ?? [];
|
|
366
|
+
if (fileIds.length === 0) {
|
|
367
|
+
return [];
|
|
368
|
+
}
|
|
369
|
+
if (!this.filesService) {
|
|
370
|
+
throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {
|
|
371
|
+
customMessageReference: ErrorCustomMessageReference.CONFIGURATION,
|
|
372
|
+
context: {
|
|
373
|
+
message: 'Email attachments were requested but the files service is not bound',
|
|
374
|
+
attachmentCount: fileIds.length,
|
|
375
|
+
},
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
const resolved = await this.filesService.readFilesForOutboundAttachment(fileIds, {
|
|
379
|
+
applicationId: this.configService.applicationId ?? undefined,
|
|
380
|
+
// The tenancy confinement. An organization-scoped send reaches only that organization's
|
|
381
|
+
// files; a send without one reaches only application-scoped files.
|
|
382
|
+
...(request.organizationId ? { organizationId: request.organizationId } : {}),
|
|
383
|
+
});
|
|
384
|
+
const totalBytes = resolved.reduce((total, file) => total + file.bytes.byteLength, 0);
|
|
385
|
+
if (totalBytes > OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT) {
|
|
386
|
+
throw this.errorBuilder.buildError(ErrorType.VALIDATION, undefined, {
|
|
387
|
+
customMessageReference: ErrorCustomMessageReference.VALIDATION,
|
|
388
|
+
context: {
|
|
389
|
+
message: 'Email attachments exceed the outbound total-size limit',
|
|
390
|
+
totalBytes,
|
|
391
|
+
limitBytes: OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT,
|
|
392
|
+
fileIds: resolved.map((file) => file.fileId),
|
|
393
|
+
},
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
return resolved.map((file) => ({
|
|
397
|
+
filename: file.filename,
|
|
398
|
+
content: file.bytes.toString('base64'),
|
|
399
|
+
contentType: file.mimeType,
|
|
400
|
+
}));
|
|
401
|
+
}
|
|
402
|
+
buildEmailRequest(request, submissionId, rendered, providerConfig, recipients, attachments) {
|
|
309
403
|
const toAddresses = recipients.map(email => ({ email }));
|
|
310
404
|
// From-address precedence: per-send override → per-provider config
|
|
311
405
|
// (`providerConfigurations.<provider>.EMAIL_PROVIDER.fromAddress`) → the
|
|
@@ -330,6 +424,9 @@ let EmailBackendService = class EmailBackendService {
|
|
|
330
424
|
subject: rendered.subject,
|
|
331
425
|
html: rendered.bodyHtml,
|
|
332
426
|
text: rendered.bodyText,
|
|
427
|
+
// Omitted rather than sent empty: the field is optional on the vendor-neutral contract and
|
|
428
|
+
// several adapters branch on its presence.
|
|
429
|
+
...(attachments.length > 0 ? { attachments } : {}),
|
|
333
430
|
});
|
|
334
431
|
}
|
|
335
432
|
async executeProviderRequest(providerConfig, request, providerRequest, onTransportStart) {
|
|
@@ -349,6 +446,34 @@ let EmailBackendService = class EmailBackendService {
|
|
|
349
446
|
bcc: request.bcc?.map(recipient => recipient.email),
|
|
350
447
|
subject: request.subject,
|
|
351
448
|
textPreview: request.text?.slice(0, 2000),
|
|
449
|
+
/*
|
|
450
|
+
* DERIVED FACTS ABOUT THE HTML, never the HTML itself (#522).
|
|
451
|
+
*
|
|
452
|
+
* This provider is how a developer sees a local send, and it surfaced a TEXT preview only —
|
|
453
|
+
* so anything that exists only in the HTML was invisible here. A brand logo is an `<img>`,
|
|
454
|
+
* which is a fair part of why ninety-five templates rendered none without anyone noticing.
|
|
455
|
+
*
|
|
456
|
+
* The body is not logged. That is the same rule the attachment line below already follows —
|
|
457
|
+
* names, never the bytes — and a full HTML email in a log line would be both unreadable and
|
|
458
|
+
* a place for personal data to accumulate. `imageCount` is the smallest fact that tells the
|
|
459
|
+
* two cases apart, which is all the dev loop needs: 0 where a logo did not resolve, 1 where
|
|
460
|
+
* it did.
|
|
461
|
+
*
|
|
462
|
+
* Writing the rendered HTML to a FILE a developer can open is the better surface and is a
|
|
463
|
+
* real decision — where it lives, who removes it, and which environments produce it — so it
|
|
464
|
+
* is recorded rather than invented inside a provider branch.
|
|
465
|
+
*/
|
|
466
|
+
htmlBytes: request.html === undefined ? undefined : Buffer.byteLength(request.html, 'utf8'),
|
|
467
|
+
imageCount: request.html === undefined ? undefined : (request.html.match(/<img\b/gi) ?? []).length,
|
|
468
|
+
// Names only, never the bytes (#429). The log-delivery provider is how a developer sees a
|
|
469
|
+
// local send, so an attachment that resolved has to be visible here — otherwise the dev
|
|
470
|
+
// loop looks identical whether the resolution worked or silently produced nothing, which
|
|
471
|
+
// is the failure this whole path exists to remove.
|
|
472
|
+
attachments: request.attachments?.map((attachment) => ({
|
|
473
|
+
filename: attachment.filename,
|
|
474
|
+
contentType: attachment.contentType,
|
|
475
|
+
bytes: Buffer.from(attachment.content, 'base64').byteLength,
|
|
476
|
+
})),
|
|
352
477
|
});
|
|
353
478
|
return {
|
|
354
479
|
outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,
|
|
@@ -644,39 +769,16 @@ let EmailBackendService = class EmailBackendService {
|
|
|
644
769
|
? { ...payload, key: providerConfig.apiKey }
|
|
645
770
|
: payload);
|
|
646
771
|
}
|
|
647
|
-
// Per-provider payload building lives in the provider module's
|
|
648
|
-
// `runtimeContract.buildSendRequest` (one of the six EMAIL_PROVIDER
|
|
649
|
-
// backend modules). The email service no longer branches on provider id.
|
|
650
|
-
createProviderUtils() {
|
|
651
|
-
return {
|
|
652
|
-
getRepository: (resourceType) => {
|
|
653
|
-
throw new Error(`getRepository('${resourceType}') is not available in the email context provider. Inject repository data via additionalContext instead.`);
|
|
654
|
-
},
|
|
655
|
-
logger: {
|
|
656
|
-
debug: (message, meta) => this.logger.debug(message, meta),
|
|
657
|
-
info: (message, meta) => this.logger.info(message, meta),
|
|
658
|
-
warn: (message, meta) => this.logger.warn(message, meta),
|
|
659
|
-
error: (message, meta) => this.logger.error(message, meta),
|
|
660
|
-
},
|
|
661
|
-
errorBuilder: {
|
|
662
|
-
buildError: (type, message, details) => {
|
|
663
|
-
const err = new Error(message);
|
|
664
|
-
err.type = type;
|
|
665
|
-
err.details = details;
|
|
666
|
-
return err;
|
|
667
|
-
},
|
|
668
|
-
},
|
|
669
|
-
};
|
|
670
|
-
}
|
|
671
772
|
};
|
|
672
773
|
EmailBackendService = __decorate([
|
|
673
774
|
injectable(),
|
|
674
775
|
__param(0, inject(SAAS_SERVICE_TYPES.Logger)),
|
|
675
776
|
__param(1, inject(SAAS_SERVICE_TYPES.ErrorBuilderService)),
|
|
676
777
|
__param(2, inject(SAAS_SERVICE_TYPES.EmailTemplateRegistry)),
|
|
677
|
-
__param(3, inject(SAAS_SERVICE_TYPES.
|
|
678
|
-
__param(4, inject(SAAS_SERVICE_TYPES.
|
|
679
|
-
__param(5, inject(SAAS_SERVICE_TYPES.
|
|
778
|
+
__param(3, inject(SAAS_SERVICE_TYPES.AppConfigService)),
|
|
779
|
+
__param(4, inject(SAAS_SERVICE_TYPES.ExternalProvidersRegistryService)),
|
|
780
|
+
__param(5, inject(SAAS_SERVICE_TYPES.FilesBackendService)),
|
|
781
|
+
__param(5, optional()),
|
|
680
782
|
__metadata("design:paramtypes", [Function, Function, Function, Function, Function, Function])
|
|
681
783
|
], EmailBackendService);
|
|
682
784
|
export { EmailBackendService };
|