@wildo-ai/saas-backend-lib 1.1.1 β 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.d.ts.map +1 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js +19 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js +4 -0
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts +35 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js +111 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts +50 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js +199 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts +111 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts.map +1 -1
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js +140 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts +14 -3
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +138 -24
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts +3 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js +8 -3
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts +11 -0
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js +11 -2
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts +124 -13
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +207 -21
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts +60 -8
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +174 -26
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +48 -4
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +102 -30
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts +89 -14
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js +84 -11
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js +16 -0
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts +20 -6
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +96 -32
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts +3 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js +32 -7
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts +8 -5
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +80 -0
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +298 -23
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts +71 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +85 -5
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts +21 -0
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +146 -4
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts +22 -0
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts +3 -26
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js +3 -68
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +4 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts +11 -0
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js +39 -5
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +181 -2
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +533 -43
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts +36 -3
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.js +70 -8
- package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts +28 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js +90 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts +44 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js +99 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts +91 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js +152 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +186 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +474 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts +100 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js +209 -6
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts +200 -4
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js +593 -64
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts +36 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js +83 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts +9 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js +11 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +54 -13
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +38 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +67 -2
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts +30 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js +43 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts +11 -3
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js +30 -16
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js +104 -25
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +18 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +106 -2
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts +52 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js +74 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -0
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts +104 -11
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +260 -26
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts +30 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.js +25 -0
- package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js +11 -4
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +263 -13
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +376 -58
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +264 -7
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +414 -5
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +16 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +140 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +65 -6
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +45 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts +5 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js +6 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.js +7 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.js.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.d.ts +146 -46
- package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.js +121 -12
- package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts +38 -15
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js +17 -2
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts +0 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.js +68 -76
- package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
- package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts +43 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.js +52 -3
- package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +25 -0
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js +41 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.d.ts +2 -2
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js +2 -2
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js.map +1 -1
- package/dist/esm/databases/models/filter.backend.schemas.js +2 -2
- package/dist/esm/databases/models/filter.backend.schemas.js.map +1 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js +20 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js +48 -0
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
- package/dist/esm/databases/services/redis.service.d.ts +27 -0
- package/dist/esm/databases/services/redis.service.d.ts.map +1 -1
- package/dist/esm/databases/services/redis.service.js +29 -0
- package/dist/esm/databases/services/redis.service.js.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
- package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.js +134 -8
- package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
- package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts +41 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js +40 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts +64 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js +193 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js.map +1 -0
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +72 -4
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +60 -19
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
- package/dist/esm/external-data/external-data-transform.backend.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-transform.backend.js +7 -1
- package/dist/esm/external-data/external-data-transform.backend.js.map +1 -1
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts +2 -0
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts.map +1 -1
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js +13 -0
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts +4 -2
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +256 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +333 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js +211 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts +45 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js +216 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js +78 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -0
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js +2 -2
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts +89 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js +164 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts +26 -27
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js +50 -64
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.js +3 -3
- package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.js +4 -4
- package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +306 -7
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +539 -45
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +25 -2
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
- package/dist/esm/files/controllers/file.controller.d.ts +24 -1
- package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
- package/dist/esm/files/controllers/file.controller.js +83 -11
- package/dist/esm/files/controllers/file.controller.js.map +1 -1
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts +17 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts.map +1 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js +1 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js.map +1 -0
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts +5 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +76 -13
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-operation-handler.backend.service.d.ts +18 -0
- package/dist/esm/files/services/file-operation-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-operation-handler.backend.service.js +36 -28
- package/dist/esm/files/services/file-operation-handler.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.d.ts +94 -9
- package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.js +197 -17
- package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts +60 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.js +167 -8
- package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +214 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.js +566 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -0
- package/dist/esm/files/services/files.backend.service.d.ts +87 -0
- package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/files.backend.service.js +252 -19
- package/dist/esm/files/services/files.backend.service.js.map +1 -1
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts +109 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js +123 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -0
- package/dist/esm/files/storage/file-storage-provider.types.d.ts +16 -10
- package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
- package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts +67 -8
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js +101 -28
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js +8 -55
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js +20 -0
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
- package/dist/esm/files/utils/file-uploader.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/file-uploader.utils.js +12 -0
- package/dist/esm/files/utils/file-uploader.utils.js.map +1 -1
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts +86 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js +288 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts +15 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js +76 -5
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js +6 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts +60 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js +63 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +200 -44
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts +0 -13
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js +14 -22
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts +8 -3
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js +25 -15
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts +13 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +88 -8
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +333 -31
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js +4 -2
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts +113 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js +62 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -0
- package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/actors-system.backend.service.js +0 -2
- package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts +107 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.js +519 -56
- package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +5 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +79 -16
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +34 -5
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js +154 -20
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.js +27 -23
- package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js +7 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts +90 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js +368 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts +151 -41
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +308 -143
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts +0 -207
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js +8 -243
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts +9 -14
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js +18 -89
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts +86 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js +155 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts +10 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js +55 -5
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
- package/dist/esm/index.d.ts +15 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +45 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/inject/models/container.d.ts.map +1 -1
- package/dist/esm/inject/models/container.js +82 -10
- package/dist/esm/inject/models/container.js.map +1 -1
- package/dist/esm/inject/models/service-types.d.ts +20 -3
- package/dist/esm/inject/models/service-types.d.ts.map +1 -1
- package/dist/esm/inject/models/service-types.js +21 -3
- package/dist/esm/inject/models/service-types.js.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.js +32 -4
- package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts +34 -0
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.js +42 -0
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.js.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +84 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.js +235 -11
- package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts +64 -2
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +152 -6
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js +49 -4
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts +66 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js +199 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts +149 -13
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js +411 -19
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts +11 -2
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts +28 -9
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js +30 -10
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
- package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.js +52 -11
- package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts +62 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js +78 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +309 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +385 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts +21 -0
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.js +38 -0
- package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -80
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -25
- package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -49
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -141
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -37
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -121
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts +66 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js +105 -10
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -58
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -223
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js +10 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.d.ts +60 -4
- package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.js +145 -43
- package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts +0 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
- package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +108 -13
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +432 -101
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +2 -2
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.js +5 -5
- package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +54 -7
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts +5 -5
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js +14 -13
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts +2 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +18 -8
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +20 -18
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts +16 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js +18 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js +63 -2
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js +4 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts +66 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js +257 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts +12 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js +47 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts +87 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts +31 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js +13 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts +19 -25
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js +33 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.js +1 -4
- package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.js +1 -4
- package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.js +1 -4
- package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts +8 -4
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.js +25 -17
- package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
- package/dist/esm/queue/queue.backend.service.d.ts +3 -3
- package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue.backend.service.js +26 -4
- package/dist/esm/queue/queue.backend.service.js.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts +2 -2
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js +18 -3
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts +50 -25
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js +147 -39
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
- package/dist/esm/requests/service/websocket.service.d.ts +9 -0
- package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
- package/dist/esm/requests/service/websocket.service.js +88 -15
- package/dist/esm/requests/service/websocket.service.js.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +16 -2
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.js +2 -0
- package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js +14 -0
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts +2 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.js +8 -0
- package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
- package/dist/esm/resources/services/resource-id.backend.service.js +3 -3
- package/dist/esm/resources/services/resource-id.backend.service.js.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts +60 -5
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.js +91 -7
- package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts +36 -3
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.js +32 -10
- package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.js +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
- package/dist/esm/runtime/services/execution-context-creator.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/execution-context-creator.backend.service.js +13 -7
- package/dist/esm/runtime/services/execution-context-creator.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts +51 -0
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.d.ts +26 -0
- package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.js +181 -1
- package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts +47 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.js +343 -77
- package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts +15 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js +28 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts +5 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js +24 -4
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +29 -4
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts +114 -0
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js +354 -3
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts +1 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js +22 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts +3 -23
- package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/jwt.backend.schemas.js +20 -45
- package/dist/esm/security/authentications/models/jwt.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts +0 -2
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js +23 -14
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts +0 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js +15 -12
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts +113 -3
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js +207 -30
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts +95 -2
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js +153 -9
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +190 -0
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +377 -53
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts +9 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +77 -2
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js +5 -3
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts +41 -0
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js +202 -23
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +42 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +34 -4
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts +29 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js +77 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +41 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +87 -4
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts +28 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +283 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts +35 -0
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js +111 -21
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts +14 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js +49 -8
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js +4 -0
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js +6 -0
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts +37 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js +51 -0
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts +41 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js +45 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts +116 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js +162 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -0
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js +24 -1
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js.map +1 -1
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts +20 -20
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js +27 -28
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +77 -3
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts +117 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js +104 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js.map +1 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +93 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js +95 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -0
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +124 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +142 -5
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +175 -14
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js +385 -49
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +6 -14
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +13 -22
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts +60 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js +79 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +161 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +512 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +59 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js +22 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts +44 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js +20 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +191 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +385 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts +41 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js +358 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts +160 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +266 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +111 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +107 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts +54 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +153 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +195 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +387 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts +45 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js +291 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +62 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js +29 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts +127 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js +277 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts +66 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js +75 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -0
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts +18 -1
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js +110 -74
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js.map +1 -1
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts +22 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts.map +1 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js +22 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js.map +1 -0
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts +17 -3
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js +12 -0
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +41 -3
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +83 -20
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
- package/dist/esm/security/jwt/services/jwt.backend.service.d.ts.map +1 -1
- package/dist/esm/security/jwt/services/jwt.backend.service.js +1 -18
- package/dist/esm/security/jwt/services/jwt.backend.service.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts +26 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js +43 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +8 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +49 -0
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.js +17 -5
- package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts +67 -29
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js +47 -25
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts +143 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js +258 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts +39 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js +159 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +17 -9
- package/dist/esm/.builder.pid +0 -9
package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siem-webhook-delivery.backend.service.js","sourceRoot":"","sources":["../../../../../../src/compliance/audit-trails/services/siem-webhook-delivery.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SIEM Webhook Delivery Backend Service\n *\n * Layer 3 of the three-layer audit event pipeline (Step 18).\n * Purpose-built for delivering security audit events to customer SIEM endpoints.\n * NOT a generic M2M webhook sender.\n *\n * Responsibilities:\n * - HTTP POST to webhook URL with configured auth\n * - HMAC-SHA256 signature for hmac_sha256 auth method\n * - Exponential backoff retries\n * - Circuit breaker after N consecutive failures per org\n * - CEF/LEEF format conversion (when eventFormat !== json_structured)\n * - Idempotency via eventId\n */\n\nimport 'reflect-metadata';\nimport { inject, injectable } from 'inversify';\nimport { createHmac, createHash, createCipheriv, createDecipheriv, randomBytes } from 'crypto';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { AuditEventDispatcherBackendService } from './audit-event-dispatcher.backend.service';\nimport { RepositoriesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/repositories/repositories-registry-handler.backend.service';\nimport { ExecutionContextCreatorBackendService } from '~wildo-backend-lib/runtime/services/execution-context-creator.backend.service';\nimport {\n type SecurityAuditEventEnvelope,\n type SiemExportConfigBase,\n type ResourceType,\n CoreResourceType,\n CoreResourceOperation,\n CORE_APP_ROLES,\n ResourcePrimaryScope,\n WildoHeaderKeys,\n SiemDeliveryDlqStatus,\n SIEMEventFormat,\n AuthScopeType,\n coreResourceShared_FieldIdentifier,\n} from '@wildo-ai/saas-models';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport {\n CEF_PROJECTION,\n LEEF_PROJECTION,\n cefAgentSeverityHeaderValue,\n SiemFieldProjectionKind,\n type SiemProjectionContext,\n type SiemProjectionContract,\n} from './utils/siem-projection-contract.backend.utils';\nimport { buildOcsfEvent } from './utils/siem-ocsf-projection.backend.utils';\nimport {\n CEF_HEADER_MAX_CHARACTERS,\n CEF_MAX_CHARACTERS,\n LEEF_HEADER_MAX_CHARACTERS,\n LEEF_MAX_CHARACTERS,\n LEEF_TAB_DELIMITER_HEADER_VALUE,\n type CefWireKey,\n type LeefWireKey,\n} from './utils/siem-dictionary.backend.utils';\nimport {\n describeCaughtError,\n projectCaughtErrorLogFields,\n} from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\n\n/** Circuit breaker state per organization */\ninterface CircuitBreakerState {\n consecutiveFailures: number;\n lastFailureAt: Date | null;\n circuitOpenUntil: Date | null;\n}\n\n/** Payload shape enqueued by AuditEventDispatcherBackendService */\nexport interface SIEMDeliveryJobPayload {\n envelope: SecurityAuditEventEnvelope;\n envelopeHmac?: string; // F6: HMAC integrity signature\n organizationId: string;\n /**\n * Delivery scope. Defaults to {@link AuthScopeType.ORGANIZATION}. The worker is scope-generic (the\n * circuit-breaker key, DLQ variant, and scope FK all derive from it), but `'application'`\n * is currently produced ONLY by the SIEM-DLQ retry custom-impl β there is no first-time\n * app-scoped producer, so the APPLICATION path is reserved / dormant. See\n * `AuditEventDispatcherBackendService.dispatchToOrganizationAuditSinks`.\n */\n scopeType?: AuthScopeType;\n scopeId?: string;\n siemConfig: {\n webhookUrl: string;\n authMethod: string;\n authCredential?: string;\n authHeaderName?: string;\n eventFormat: string;\n customHeaders?: Record<string, string>;\n delivery: {\n batchSize: number;\n batchWindowSeconds: number;\n retryAttempts: number;\n retryBackoffSeconds: number;\n timeoutSeconds: number;\n };\n };\n}\n\n/** Default circuit breaker threshold */\nconst CIRCUIT_BREAKER_THRESHOLD = 5;\n/** Circuit breaker cooldown (ms) */\nconst CIRCUIT_BREAKER_COOLDOWN_MS = 5 * 60 * 1000; // 5 minutes\n/** Prefix for encrypted credentials (H6) */\nconst ENCRYPTED_CREDENTIAL_PREFIX = 'encrypted:aes-256-gcm:';\n/** HKDF-like domain separator for SIEM encryption key derivation */\nconst SIEM_KEY_DOMAIN = 'wildo:siem:credential:v1';\n/**\n * Appended when the `eventData` detail bag is truncated, so the loss is VISIBLE to the receiver\n * rather than silent. A SOC that sees a JSON fragment ending mid-object cannot tell a truncation\n * from a serializer bug; this marker makes the difference explicit on the wire.\n */\nconst SIEM_EVENT_DATA_TRUNCATION_MARKER = '...[truncated]';\n/**\n * Maximum characters of serialized `eventData` carried in the single CEF/LEEF detail field,\n * INCLUDING {@link SIEM_EVENT_DATA_TRUNCATION_MARKER} when truncation occurs β the emitted value\n * never exceeds this bound.\n *\n * This is the CEF extension dictionary's own published length for `msg`, not a Wildo-invented\n * policy. LEEF publishes no per-attribute ceiling, so the same bound is applied there for\n * cross-format consistency: an unbounded detail bag is the realistic way a CEF/LEEF line grows\n * large enough for a receiver to reject it, which would fail the delivery into the DLQ.\n *\n * spec-cite: Implementing ArcSight CEF v26, Oct 2023 β ArcSight Extension Dictionary, \"CEF Key\n * Names for Event Producers\", `msg` row: full name `message`, data type `String`, length `1023`,\n * \"An arbitrary message giving more details about the event.\"\n *\n * The bound is applied to the ESCAPED value, i.e. to what actually goes on the wire. An earlier\n * revision bounded the value BEFORE escaping, on the reading that the ceiling describes the field's\n * CONTENT and escape sequences are transport encoding a receiver strips before it ever sees the\n * field. That reading is defensible and the document does not settle it β which is precisely why the\n * post-escape bound is the one to hold: escaping only ever expands (`=` β `\\=`, `\\` β `\\\\`), so a\n * value within the ceiling once encoded is necessarily within it once decoded. Bounding the encoded\n * form satisfies BOTH readings; bounding the decoded form satisfies only one, and an escape-heavy\n * bag sitting at the ceiling would have gone out over-long under the other.\n */\nconst SIEM_EVENT_DATA_DETAIL_MAX_CHARS = 1023;\n\n// The per-key ceilings and the `devTimeFormat` pattern used to live here as hand-kept constants\n// beside the formatter. They now live in the dictionary spine (`siem-dictionary.backend.utils.ts`),\n// DERIVED from the transcribed rows, because a ceiling maintained next to a key list is the same\n// artefact as the key list itself: adding a key and forgetting its published maximum was possible\n// right up until the derivation existed.\n//\n// Line comments, not a JSDoc block β a `/** */` here would attach to the class below it.\n\n@injectable()\nexport class SIEMWebhookDeliveryBackendService {\n private readonly logDebug: (message: string, context?: Record<string, unknown>) => void;\n private readonly circuitBreakers: Map<string, CircuitBreakerState> = new Map();\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly appConfigService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.AuditEventDispatcherService) private readonly auditEventDispatcher: AuditEventDispatcherBackendService,\n @inject(SAAS_SERVICE_TYPES.RepositoriesRegistryHandlerService) private readonly repositoriesRegistry: RepositoriesRegistryHandlerBackendService,\n @inject(SAAS_SERVICE_TYPES.ExecutionContextCreatorBackendService) private readonly executionContextCreator: ExecutionContextCreatorBackendService,\n ) {\n this.logDebug = this.logger.debugByType('SIEMWebhookDeliveryBackendService');\n this.logger.setDebugTypeLogging('SIEMWebhookDeliveryBackendService', false);\n }\n\n /**\n * Process a SIEM delivery job from the queue.\n * Called by the job consumer when a `siem.webhook-delivery` batch job is dequeued.\n */\n public async processDelivery(payload: SIEMDeliveryJobPayload): Promise<void> {\n const { envelope, envelopeHmac, organizationId, siemConfig } = payload;\n const scopeType = payload.scopeType ?? AuthScopeType.ORGANIZATION;\n const scopeId = payload.scopeId ?? organizationId;\n const circuitKey = `${scopeType}:${scopeId}`;\n\n // F6: Verify envelope integrity before processing\n if (envelopeHmac) {\n if (!this.auditEventDispatcher.verifyEnvelopeHmac(envelope, envelopeHmac)) {\n this.logger.error?.('SIEM envelope HMAC verification failed β possible tampering', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n });\n await this._enqueueToDLQ(payload, 'hmac_verification_failed');\n return;\n }\n }\n\n // Circuit breaker check β M11: DLQ instead of silent drop\n if (this._isCircuitOpen(circuitKey)) {\n this.logDebug('Circuit breaker open for scope, sending to DLQ', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n });\n await this._enqueueToDLQ(payload, 'circuit_breaker_open');\n return;\n }\n\n // Format the body\n const body = this._formatBody(envelope, siemConfig.eventFormat);\n\n // Build headers\n const headers = this._buildHeaders(body, siemConfig);\n\n // Attempt delivery with retries\n const maxRetries = siemConfig.delivery.retryAttempts;\n const baseBackoffMs = siemConfig.delivery.retryBackoffSeconds * 1000;\n const timeoutMs = siemConfig.delivery.timeoutSeconds * 1000;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n await this._sendHttpPost(siemConfig.webhookUrl, body, headers, timeoutMs);\n\n this._recordSuccess(circuitKey);\n\n this.logDebug('SIEM webhook delivered successfully', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n attempt,\n });\n return;\n } catch (error) {\n const isLastAttempt = attempt === maxRetries;\n\n if (isLastAttempt) {\n this._recordFailure(circuitKey);\n\n this.logger.error?.('SIEM webhook delivery failed after all retries', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n attempts: attempt + 1,\n ...projectCaughtErrorLogFields(error),\n });\n\n // `describeCaughtError`, not an `instanceof Error` ternary: this string is\n // PERSISTED as the DLQ record's failure reason, and a `WildoError_Backend`\n // is a plain object β the ternary would store `'[object Object]'` for every\n // structured fault, making the DLQ untriageable.\n await this._enqueueToDLQ(payload, 'retries_exhausted', describeCaughtError(error));\n } else {\n const backoffMs = baseBackoffMs * Math.pow(2, attempt);\n this.logDebug('SIEM webhook delivery failed, retrying', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n attempt,\n nextRetryMs: backoffMs,\n });\n await this._sleep(backoffMs);\n }\n }\n }\n }\n\n /**\n * Format the event body based on the configured event format.\n *\n * `json_structured` ships the envelope verbatim. CEF and LEEF are flat, single-line `key=value`\n * grammars, so they project the envelope in two tiers: the standard/indexed keys each grammar\n * defines (`cat`, `outcome`, `src`, β¦), followed by the free-form `eventData` bag serialized\n * into that grammar's single detail field. Every envelope field therefore reaches all three\n * formats; only the ENCODING differs.\n */\n private _formatBody(envelope: SecurityAuditEventEnvelope, eventFormat: string): string {\n switch (eventFormat) {\n case SIEMEventFormat.CEF:\n return this._formatAsCEF(envelope);\n case SIEMEventFormat.LEEF:\n return this._formatAsLEEF(envelope);\n case SIEMEventFormat.OCSF:\n // OCSF is JSON, so there is no escaping/bounding layer here β the projection returns a\n // document and the only transport concern is serialisation.\n return JSON.stringify(buildOcsfEvent(envelope));\n case SIEMEventFormat.JSON_STRUCTURED:\n default:\n return JSON.stringify(envelope);\n }\n }\n\n /**\n * Format event as CEF (Common Event Format).\n * CEF:Version|Device Vendor|Device Product|Device Version|Signature ID|Name|Severity|Extension\n */\n private _formatAsCEF(envelope: SecurityAuditEventEnvelope): string {\n const cefSeverity = cefAgentSeverityHeaderValue(envelope.severity);\n const ext = (value: string): string => this._escapeCEFExtensionValue(value);\n const header = (field: string, value: string): string => this._emitBoundedHeaderField(field, value, CEF_HEADER_MAX_CHARACTERS);\n const eventDataDetail = this._serializeEventDataDetail(envelope, ext);\n // CEF extensions are SPACE-delimited, so that is what `join` means for this grammar.\n const pair = (key: CefWireKey, value: string): string => this._emitPair(key, value, ext, CEF_MAX_CHARACTERS);\n const join = (...fragments: readonly string[]): string => fragments.join(' ');\n\n // Driven by CEF_PROJECTION, so a field cannot be dropped by being forgotten β the contract is\n // exhaustive over the envelope type and declaration order is wire order. The per-field reasoning,\n // citations and the csN-budget decision all live there, next to the mapping they justify.\n const extensions = this._renderProjection(CEF_PROJECTION, envelope, { pair, join, eventDataDetail })\n .join(' ');\n\n // Header fields 5 and 6 are DIFFERENT questions and used to receive the same answer. Field 5,\n // `Device Event Class ID`, is the stable signature a QID/correlation rule keys on β `eventType` is\n // exactly that. Field 6, `Name`, is documented as \"a human-readable and understandable description\n // of the event\", so `user_account_locked` twice gave a SOC a machine token in the column its\n // console renders as the event title.\n // spec-cite: Implementing ArcSight CEF v26, Oct 2023 β \"Header Field Definitions\", `deviceEventClassId`\n // row (\"a unique identifier for each event-type β¦ also known as Signature ID\") and `name` row\n // (String, 512): \"a string representing a human-readable and understandable description of the event.\"\n return `CEF:0|${header('deviceVendor', 'Wildo')}|${header('deviceProduct', 'SecurityAudit')}|${header('deviceVersion', envelope.sourceVersion)}|${header('deviceEventClassId', envelope.eventType)}|${header('name', this._humanizeEventType(envelope.eventType))}|${cefSeverity}|${extensions}`;\n }\n\n /**\n * Format event as LEEF (Log Event Extended Format β IBM QRadar).\n * LEEF:Version|Vendor|Product|Version|EventID|Extension\n *\n * The serialized `eventData` bag rides a custom `eventData` attribute. It is deliberately NOT\n * called `msg` as in the CEF projection: `msg` earns that name in CEF by being a dictionary key\n * with a defined meaning, whereas LEEF publishes no such key β borrowing CEF's vocabulary here\n * would imply a standard attribute that does not exist. Each grammar gets the name that is\n * correct within it.\n * spec-cite: N/A β `eventData` is a Wildo-chosen custom attribute name, not a LEEF-defined key.\n */\n private _formatAsLEEF(envelope: SecurityAuditEventEnvelope): string {\n const val = (value: string): string => this._escapeLEEFValue(value);\n const header = (field: string, value: string): string => this._emitBoundedHeaderField(field, value, LEEF_HEADER_MAX_CHARACTERS);\n const eventDataDetail = this._serializeEventDataDetail(envelope, val);\n // LEEF attributes are TAB-delimited (we emit no `DelimiterCharacter`), so that is `join` here.\n const pair = (key: LeefWireKey, value: string): string => this._emitPair(key, value, val, LEEF_MAX_CHARACTERS);\n const join = (...fragments: readonly string[]): string => fragments.join('\\t');\n\n // Driven by LEEF_PROJECTION. LEEF reaches ALL 27 envelope fields because a LEEF custom key stays\n // searchable in QRadar, where a CEF custom extension does not β see the contract for the citation.\n //\n // `sev`, `devTime` and `devTimeFormat` are rendered BY the contract now. They used to be appended\n // here, which looked like a formatter detail and was a hole: a key emitted outside `pair` skips\n // its published ceiling, the duplicate-key check, and the declared-vs-emitted test β and `sev`\n // is precisely a key with a published constraint (`1-10`).\n const extensions = this._renderProjection(LEEF_PROJECTION, envelope, { pair, join, eventDataDetail })\n .join('\\t');\n\n // Six header fields, not five. The sixth is the attribute DelimiterCharacter, which every\n // LEEF 2.0 example in the guide carries and ours omitted β see LEEF_TAB_DELIMITER_HEADER_VALUE:\n // a parser splitting a 2.0 header into six fields was consuming our first attribute as it.\n // Vendor and Product go through `header()` too, though they are constants that need neither\n // escaping nor bounding. The point is that EVERY header field goes through the one door, so\n // \"is this field covered?\" is answerable by looking rather than by reasoning about each value β\n // the same reason `rt` was routed through `pair` even though digits never change.\n return `LEEF:2.0|${header('vendor', 'Wildo')}|${header('product', 'SecurityAudit')}|${header('productVersion', envelope.sourceVersion)}|${header('eventId', envelope.eventType)}|${LEEF_TAB_DELIMITER_HEADER_VALUE}|${extensions}`;\n }\n\n /**\n * Serialize `envelope.eventData` into the single detail field that CEF (`msg`) and LEEF\n * (`eventData`) each carry, or `undefined` when there is nothing worth saying β the caller's\n * `.filter(Boolean)` then drops the key entirely instead of emitting an empty one.\n *\n * Without this, CEF/LEEF subscribers received ONLY the curated standard keys while\n * `json_structured` subscribers received the whole bag: a silent capability gap between\n * formats, not a deliberate reduction.\n *\n * REJECTED ALTERNATIVE β flattening each `eventData` entry into its own extension key\n * (`lockoutDuration=15`, `sessionId=β¦`). It reads better as SIEM columns, but it is unsound\n * here. `eventData` is an OPEN, app-extensible bag whose keys routinely collide both with the\n * CEF/LEEF dictionaries and with the envelope fields already projected above it: the\n * `USER_LOGIN_FAILED` bag alone carries `failureReason`, `ipAddress` and `email`, which the\n * dispatcher has already promoted onto the envelope and which this formatter already emits as\n * `reason`, `src` and `suser`. Flattening would therefore put `src=` on the line TWICE and leave\n * which one wins to the receiver's parser. Nested objects and arrays have no flat\n * representation either. One JSON field keeps the standard keys authoritative AND the bag\n * lossless, at the cost of a second parse step on the receiving end.\n *\n * The returned JSON is escaped by the CALLER for its grammar, so a backslash ends up encoded\n * twice β once by `JSON.stringify`, once by the CEF/LEEF escaper. That is correct and\n * required: a receiver un-escapes the wire grammar first, then parses the JSON.\n */\n private _serializeEventDataDetail(\n envelope: SecurityAuditEventEnvelope,\n escapeForGrammar: (value: string) => string,\n ): string | undefined {\n // Defensive: the envelope TYPE requires `eventData`, but this formatter also runs over\n // envelopes replayed from the DLQ, where a stored bag can be absent or malformed. An\n // unguarded `Object.keys(undefined)` here would throw inside delivery.\n const eventData: unknown = envelope.eventData;\n if (!eventData || typeof eventData !== 'object' || Object.keys(eventData).length === 0) {\n return undefined;\n }\n\n let serialized: string;\n try {\n serialized = JSON.stringify(eventData);\n } catch {\n // A circular / unserializable bag must not fail the whole delivery β the standard keys\n // above it are still valuable to a SOC, so drop only the detail field.\n this.logDebug('SIEM eventData detail omitted β bag is not JSON-serializable', {\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n });\n return undefined;\n }\n\n // `JSON.stringify` returns `undefined` for a value it cannot represent at all; the guard\n // above makes that unreachable for a non-empty plain object, but a `toJSON()` returning\n // `undefined` would still land here.\n if (!serialized) return undefined;\n\n if (escapeForGrammar(serialized).length <= SIEM_EVENT_DATA_DETAIL_MAX_CHARS) return serialized;\n\n // Largest prefix whose ESCAPED form, marker included, still fits. A prefix length cannot be\n // computed arithmetically because expansion depends on which characters the prefix contains,\n // and it is not uniform across the two grammars (CEF escapes `=`, LEEF does not). Binary search\n // costs O(log n) escape passes and is exact; a fixed safety margin would be a guess that is\n // simultaneously too small for a delimiter-dense bag and wasteful for an ordinary one.\n let fits = 0;\n let tooLong = serialized.length;\n while (fits < tooLong) {\n const candidate = Math.ceil((fits + tooLong) / 2);\n if (escapeForGrammar(this._truncateDetail(serialized, candidate)).length <= SIEM_EVENT_DATA_DETAIL_MAX_CHARS) {\n fits = candidate;\n } else {\n tooLong = candidate - 1;\n }\n }\n const truncated = this._truncateDetail(serialized, fits);\n\n this.logDebug('SIEM eventData detail truncated to the CEF/LEEF detail-field ceiling', {\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n originalLength: serialized.length,\n emittedLength: truncated.length,\n escapedLength: escapeForGrammar(truncated).length,\n maxChars: SIEM_EVENT_DATA_DETAIL_MAX_CHARS,\n });\n return truncated;\n }\n\n /**\n * Cut `serialized` to `length` UTF-16 units and append the truncation marker.\n *\n * The marker is counted INSIDE the ceiling by the caller's search, not appended beyond it β a\n * bound that its own truncation overshoots is not a bound. A cut landing between the halves of a\n * surrogate pair would emit a lone surrogate, which `JSON.parse` on the receiving end rejects with\n * a different error than the truncation it actually is, so the trailing half-pair is dropped.\n */\n private _truncateDetail(serialized: string, length: number): string {\n const cut = serialized.slice(0, length);\n const last = cut.charCodeAt(cut.length - 1);\n const endsOnHighSurrogate = last >= 0xd800 && last <= 0xdbff;\n return `${endsOnHighSurrogate ? cut.slice(0, -1) : cut}${SIEM_EVENT_DATA_TRUNCATION_MARKER}`;\n }\n\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n // Wire-format escaping\n //\n // CEF and LEEF are single-line, delimiter-separated grammars with NO quoting construct: a\n // delimiter appearing raw inside a value does not produce a malformed record that a parser\n // rejects β it produces a WELL-FORMED record with silently wrong fields. That failure mode is\n // why these helpers exist and why EVERY interpolated string value goes through one of them\n // rather than only the fields believed to be risky today. `outcomeReason` in particular is free\n // text sourced from `eventData.failureReason` / `eventData.reason`, so it is the first projected\n // field with no vocabulary constraining its characters.\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n /**\n * Escape a value for a CEF *extension* (`key=value`) slot.\n *\n * The extension is a space-separated `key=value` list whose parser delimits on the next\n * `<key>=`, so per the CEF standard:\n * - `\\` becomes `\\\\` β it is the escape character itself, which is why it MUST be replaced\n * first; doing it later would re-escape the backslashes introduced by the rules below.\n * - `=` becomes `\\=` β an unescaped `=` is read as the start of the next key/value pair.\n * - CR/LF become the two-character sequences `\\r` / `\\n` β a real newline terminates the\n * record and truncates every remaining field.\n *\n * Spaces are deliberately NOT escaped: the grammar permits them inside extension values (a\n * value is delimited by the next `<key>=`, not by whitespace).\n * spec-cite: Implementing ArcSight CEF v26, Oct 2023 β \"Character Encoding\" / the extension\n * escaping rules for pipe, backslash and equals in the Extension field.\n */\n private _escapeCEFExtensionValue(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/=/g, '\\\\=')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n');\n }\n\n /**\n * Escape a value for a LEEF attribute slot.\n *\n * LEEF pairs are TAB-delimited, so a literal tab fabricates an extra attribute and a newline\n * terminates the record; both are encoded as their escape sequences (`\\` first, for the same\n * reason as above). `=` needs NO escaping here β a LEEF parser splits each pair on its FIRST\n * `=`, so subsequent `=` characters remain part of the value.\n * spec-cite: N/A β LEEF publishes no escaping table for attribute values; these rules are\n * derived from its tab-delimited, newline-terminated record structure, which is why the `=`\n * asymmetry with CEF above is deliberate rather than an oversight.\n */\n private _escapeLEEFValue(value: string): string {\n // β οΈ `|` and `^` are deliberately NOT escaped, and the reasoning is the point rather than the\n // conclusion. The guide's best practices say to AVOID them in keys and values β it defines no\n // escape for them, because LEEF 2.0's answer is the header's `DelimiterCharacter`, which lets a\n // producer CHOOSE the attribute delimiter (caret is a documented choice). Inventing `\\|` would\n // therefore corrupt the value at every conformant receiver, which is strictly worse than the\n // mis-parse it guards against β and that mis-parse needs a non-conformant parser splitting the\n // whole line on `|`, since the header ends at its fifth. We emit no `DelimiterCharacter`, so the\n // delimiter is TAB and a caret in a value is inert. If a `DelimiterCharacter` is ever emitted,\n // THAT character becomes escapable-or-forbidden and this decision must be re-taken.\n // spec-cite: IBM QRadar LEEF Version 2 (Β© IBM 2013, 2016) β \"Best practices Guidelines for LEEF\n // events\": \"Use alphanumeric (A-Z, a-z, and 0-9) characters, but avoid tab, pipe, or caret\n // delimiters in your event payload keys and values\"; Table 2, `Delimiter Character` row.\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n');\n }\n\n /**\n * Escape a value for a CEF or LEEF *header* slot (the `|`-delimited prefix shared by both\n * grammars).\n *\n * A literal `|` would fabricate a header field and shift every subsequent one β including the\n * severity and the entire extension β so it is escaped as `\\|`. Headers cannot span lines at\n * all (there is no multi-line encoding for them, unlike extension values), so newlines are\n * folded to a space rather than escaped.\n *\n * Applied defensively: `sourceVersion` is read straight from the `APP_VERSION` environment\n * variable and `eventType` is app-extensible, so neither is guaranteed delimiter-free.\n */\n private _escapeSIEMHeaderField(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\|/g, '\\\\|')\n // Any CR or LF, in any combination β not just `\\r?\\n`. A LONE `\\r` slipped through that form,\n // and a bare CR terminates a record for readers that treat it as a line ending.\n .replace(/[\\r\\n]+/g, ' ');\n }\n\n /**\n * Render a projection contract into its emitted fragments, in declaration order.\n *\n * Only `extension` entries produce wire output. `header` entries are carried by the caller's header\n * construction and `not-projected` entries deliberately produce nothing β both exist in the contract\n * so that COVERAGE is a property of the type rather than of anyone's memory.\n */\n private _renderProjection<K extends string>(\n contract: SiemProjectionContract<SecurityAuditEventEnvelope, K>,\n envelope: SecurityAuditEventEnvelope,\n context: SiemProjectionContext<K>,\n ): string[] {\n const fragments: string[] = [];\n for (const projection of Object.values(contract)) {\n if (projection.kind !== SiemFieldProjectionKind.EXTENSION) continue;\n const fragment = projection.render(envelope, context);\n if (fragment) fragments.push(fragment);\n }\n return fragments;\n }\n\n /**\n * Emit one `key=value` pair, escaped for its grammar and bounded by the key's PUBLISHED ceiling.\n *\n * The bound is measured on the ESCAPED value for the same reason as the detail bag: escaping only\n * expands, so bounding the encoded form is the only bound that holds under both readings of what a\n * published length governs. A key absent from `maxByKey` has no published limit and is emitted\n * whole β the table never invents one.\n *\n * Truncation is LOUD. Losing the tail of an id or an email is a data defect, not a formatting\n * detail, and the receiver cannot tell a truncated value from a short one.\n */\n private _emitPair<K extends string>(\n key: K,\n rawValue: string,\n escapeForGrammar: (value: string) => string,\n maxByKey: Readonly<Record<string, number>>,\n ): string {\n return `${key}=${this._boundToPublishedLength(key, rawValue, escapeForGrammar, maxByKey[key])}`;\n }\n\n /**\n * Escape a value and bound the ESCAPED result at its published ceiling, or emit it whole when the\n * document publishes none.\n *\n * Shared by the extension path ({@link _emitPair}) and the header path\n * ({@link _emitBoundedHeaderField}) because both answer the same question and only one of them used\n * to. Header fields never passed through `_emitPair`, so every published header size β most\n * pointedly `deviceVersion`'s 31 characters, which carries `APP_VERSION` β was unenforced while the\n * extension ceilings were being carefully derived from the dictionary one layer away. Two code\n * paths for one rule is how that happened; there is one now.\n *\n * The bound is measured on the escaped form for the reason given at\n * {@link SIEM_EVENT_DATA_DETAIL_MAX_CHARS}: escaping only expands, so a value within the ceiling\n * once encoded is within it once decoded, which satisfies both readings of what a published length\n * governs. Truncation is LOUD β losing the tail of a version or an id is a data defect, and the\n * receiver cannot tell a truncated value from a short one.\n */\n private _boundToPublishedLength(\n fieldName: string,\n rawValue: string,\n escapeForGrammar: (value: string) => string,\n max: number | undefined,\n ): string {\n const escaped = escapeForGrammar(rawValue);\n if (max === undefined || escaped.length <= max) return escaped;\n\n let fits = 0;\n let tooLong = rawValue.length;\n while (fits < tooLong) {\n const candidate = Math.ceil((fits + tooLong) / 2);\n if (escapeForGrammar(rawValue.slice(0, candidate)).length <= max) fits = candidate;\n else tooLong = candidate - 1;\n }\n const cut = rawValue.slice(0, fits);\n const lastCode = cut.charCodeAt(cut.length - 1);\n const kept = lastCode >= 0xd800 && lastCode <= 0xdbff ? cut.slice(0, -1) : cut;\n\n this.logger.warn?.('SIEM field truncated to its published ceiling', {\n key: fieldName,\n maxChars: max,\n originalLength: rawValue.length,\n emittedLength: kept.length,\n });\n return escapeForGrammar(kept);\n }\n\n /**\n * Emit one `|`-delimited header field, escaped for the shared header grammar and bounded by the\n * size its document publishes for THAT slot.\n *\n * A header field cannot be dropped when it misbehaves β an omitted field shifts every field after\n * it and silently re-interprets the whole record β so the only available degradation is truncation.\n */\n private _emitBoundedHeaderField(\n fieldName: string,\n rawValue: string,\n maxByField: Readonly<Record<string, number>>,\n ): string {\n return this._boundToPublishedLength(\n fieldName,\n rawValue,\n (value) => this._escapeSIEMHeaderField(value),\n maxByField[fieldName],\n );\n }\n\n /**\n * `user_account_locked` β `User account locked`, for CEF's human-readable `Name` header field.\n *\n * Derived rather than authored: the envelope carries no display label, and inventing a lookup table\n * would be a second vocabulary to keep in sync with `CoreAuditableEventType` β the drift shape this\n * codebase keeps paying for. A derivation cannot go stale.\n *\n * Deliberately NOT applied to `Device Event Class ID`, which must stay the machine token: a\n * correlation rule keyed on a prettified string would break the moment the prettifier changed.\n */\n private _humanizeEventType(eventType: string): string {\n const words = eventType.replace(/[_-]+/g, ' ').trim();\n return words ? `${words.charAt(0).toUpperCase()}${words.slice(1)}` : eventType;\n }\n\n /**\n * Build HTTP headers for the SIEM webhook request.\n */\n private _buildHeaders(\n body: string,\n siemConfig: SIEMDeliveryJobPayload['siemConfig'],\n ): Record<string, string> {\n const headers: Record<string, string> = {\n // Second reader of `eventFormat` in this file (the first is `_formatBody`). Both route\n // through the SIEMEventFormat vocabulary so a future format value cannot be added to the\n // switch and silently forgotten here, where the wrong Content-Type makes a receiver reject\n // an otherwise well-formed body.\n // OCSF is JSON too, so the test is \"is this a TEXT grammar\", not \"is it json_structured\".\n // Reading it the other way would have shipped OCSF as `text/plain` β a well-formed body a\n // receiver may refuse to parse, which is this workstream's signature failure shape.\n [WildoHeaderKeys.CONTENT_TYPE]: siemConfig.eventFormat === SIEMEventFormat.CEF || siemConfig.eventFormat === SIEMEventFormat.LEEF\n ? 'text/plain'\n : 'application/json',\n };\n\n // Apply custom headers first (auth headers override if needed)\n if (siemConfig.customHeaders) {\n Object.assign(headers, siemConfig.customHeaders);\n }\n\n // H6: Resolve (decrypt) the credential before use\n const resolvedCredential = this._resolveCredential(siemConfig.authCredential);\n\n // Apply auth method\n switch (siemConfig.authMethod) {\n case 'bearer_token':\n if (resolvedCredential) {\n headers[WildoHeaderKeys.AUTHORIZATION] = `Bearer ${resolvedCredential}`;\n }\n break;\n\n case 'api_key_header': {\n const headerName = siemConfig.authHeaderName || WildoHeaderKeys.API_KEY;\n if (resolvedCredential) {\n headers[headerName] = resolvedCredential;\n }\n break;\n }\n\n case 'hmac_sha256':\n if (resolvedCredential) {\n const hmac = createHmac('sha256', resolvedCredential)\n .update(body)\n .digest('hex');\n headers[WildoHeaderKeys.X_SIGNATURE_256] = `sha256=${hmac}`;\n }\n break;\n\n case 'none':\n default:\n break;\n }\n\n return headers;\n }\n\n /**\n * Send HTTP POST to the SIEM webhook endpoint.\n */\n private async _sendHttpPost(\n url: string,\n body: string,\n headers: Record<string, string>,\n timeoutMs: number,\n ): Promise<void> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const responseText = await response.text().catch(() => '');\n throw new Error(\n `SIEM webhook returned HTTP ${response.status}: ${responseText.slice(0, 200)}`\n );\n }\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n // Circuit Breaker\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n private _isCircuitOpen(circuitKey: string): boolean {\n const state = this.circuitBreakers.get(circuitKey);\n if (!state || !state.circuitOpenUntil) return false;\n\n if (new Date() > state.circuitOpenUntil) {\n state.circuitOpenUntil = null;\n return false;\n }\n\n return true;\n }\n\n private _recordSuccess(circuitKey: string): void {\n this.circuitBreakers.delete(circuitKey);\n }\n\n private _recordFailure(circuitKey: string): void {\n let state = this.circuitBreakers.get(circuitKey);\n if (!state) {\n state = { consecutiveFailures: 0, lastFailureAt: null, circuitOpenUntil: null };\n this.circuitBreakers.set(circuitKey, state);\n }\n\n state.consecutiveFailures++;\n state.lastFailureAt = new Date();\n\n if (state.consecutiveFailures >= CIRCUIT_BREAKER_THRESHOLD) {\n state.circuitOpenUntil = new Date(Date.now() + CIRCUIT_BREAKER_COOLDOWN_MS);\n this.logger.warn('SIEM circuit breaker opened', {\n circuitKey,\n consecutiveFailures: state.consecutiveFailures,\n cooldownMs: CIRCUIT_BREAKER_COOLDOWN_MS,\n });\n }\n }\n\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n // M11: Dead Letter Queue\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n /**\n * Persist failed SIEM delivery events to a MongoDB-backed DLQ resource\n * instead of silently dropping them. DLQ entries conform to SiemDeliveryDlqBase\n * and are queryable/retryable through the standard resource engine.\n */\n private async _enqueueToDLQ(\n payload: SIEMDeliveryJobPayload,\n failureReason: string,\n errorMessage?: string,\n ): Promise<void> {\n const scopeType = payload.scopeType ?? AuthScopeType.ORGANIZATION;\n const scopeId = payload.scopeId ?? payload.organizationId;\n try {\n const dlqResourceType = scopeType === AuthScopeType.APPLICATION\n ? CoreResourceType.APPLICATION_SIEM_DELIVERY_DLQ\n : CoreResourceType.ORGANIZATION_SIEM_DELIVERY_DLQ;\n // Polymorphic scope FK field name: `organizationId` for the ORG variant,\n // `applicationId` for the APP variant (the polymorphism engine's per-variant column).\n const scopeFieldIdentifier = scopeType === AuthScopeType.APPLICATION\n ? coreResourceShared_FieldIdentifier[CoreResourceType.APPLICATION]\n : coreResourceShared_FieldIdentifier[CoreResourceType.ORGANIZATIONS];\n\n const ec = await this._getDlqExecutionContext(dlqResourceType, scopeFieldIdentifier, scopeId);\n const dlqRepo = this.repositoriesRegistry.getRepositoryOrThrow(dlqResourceType);\n\n const dlqEntry = {\n // The polymorphic scope FK (organizationId / applicationId) is NOT on\n // SiemDeliveryDlqBaseSchema β the polymorphism engine appends it per variant as an\n // excludeFromCreate, context-injected column. Its AUTHORITATIVE write comes from\n // `enrichDataWithContext` reading it off the EC's context map (seeded in\n // `_getDlqExecutionContext`), because the strict CREATE-DTO strips this field from\n // the payload. We ALSO set it here β mirroring the M2M webhook-delivery-log sibling\n // (`buildScopeFkInjection`) β so both delivery-failure paths read identically; it is\n // harmless (stripped, then re-injected by enrichment) rather than the source of truth.\n [scopeFieldIdentifier]: scopeId,\n eventId: payload.envelope.eventId,\n eventPayload: payload.envelope,\n failureReason: `${failureReason}${errorMessage ? `: ${errorMessage}` : ''}`,\n failureCount: 1,\n lastAttemptAt: new Date(),\n nextRetryAt: failureReason === 'retries_exhausted' ? undefined : new Date(Date.now() + 5 * 60 * 1000),\n status: failureReason === 'retries_exhausted' ? SiemDeliveryDlqStatus.EXHAUSTED : SiemDeliveryDlqStatus.PENDING_RETRY,\n };\n\n await dlqRepo.create(ec, dlqEntry);\n\n this.logger.warn('SIEM delivery event persisted to DLQ', {\n scopeType,\n scopeId,\n eventId: payload.envelope.eventId,\n eventType: payload.envelope.eventType,\n failureReason,\n });\n } catch (dlqError) {\n this.logger.error?.('Failed to enqueue SIEM event to DLQ', {\n scopeType,\n scopeId,\n eventId: payload.envelope.eventId,\n ...projectCaughtErrorLogFields(dlqError),\n });\n }\n }\n\n /**\n * Create a REPOSITORY-DIRECT internal ExecutionContext for the DLQ create.\n *\n * SIEM delivery runs in an async queue worker with no user EC, so this synthesises a\n * system super-admin context via `createForInternalRepositoryOperation` β the blessed seam\n * for repository-tier internal writes (shared with FILES / JOB_* / notification-badge) that\n * resolves the DLQ's `REPOSITORY_ONLY` CREATE variant. It also uses the CORRECT polymorphic\n * `dlqResourceType` (the prior hand-rolled path hardcoded the ORG variant even for APP-scoped\n * deliveries).\n *\n * CRITICAL β the scope-FK injection channel: the DLQ's scope FK (organizationId /\n * applicationId) is an excludeFromCreate, context-injected column the polymorphism engine\n * appends per variant; the strict CREATE-DTO strips it from the payload, so it is persisted\n * ONLY by `enrichDataWithContext` reading it off THIS context map. An earlier version passed\n * an EMPTY map β the required scope FK was never injected β Mongoose \"organizationId: Path\n * required\" β every retries-exhausted SIEM delivery was silently lost instead of\n * dead-lettered. An INTERNALLY_INITIATED EC fail-closed rejects org/user identity on\n * `initiatorIds`, so the context map is the ONLY correct channel for the ORGANIZATION scope FK.\n */\n private async _getDlqExecutionContext(\n dlqResourceType: ResourceType,\n scopeFieldIdentifier: string,\n scopeId: string,\n ): Promise<ExecutionContext<any>> {\n return this.executionContextCreator.createForInternalRepositoryOperation({\n resourceType: dlqResourceType,\n operationIdentifier: CoreResourceOperation.CREATE,\n contextResourcesFieldIdentifier: new Map([[scopeFieldIdentifier, scopeId]]),\n initiatorIds: null,\n initiatorRoles: [\n { roles: [CORE_APP_ROLES.APP_ADMIN_SUPER_ADMIN], relatedPrimaryScope: ResourcePrimaryScope.APPLICATION },\n ],\n });\n }\n\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n // H6: SIEM Credential Encryption/Decryption\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n /**\n * Derive a 32-byte AES-256 key from the app's session encryption key\n * using a domain-specific separator to avoid key reuse.\n */\n private _deriveSIEMEncryptionKey(): Buffer {\n const baseKey = this.appConfigService.secrets.security.session.encryptionKey;\n return createHash('sha256')\n .update(`${SIEM_KEY_DOMAIN}:${baseKey}`)\n .digest();\n }\n\n /**\n * H6: Resolve a credential value β decrypts if encrypted, returns as-is if plaintext.\n * Encrypted format: `encrypted:aes-256-gcm:{iv_hex}:{authTag_hex}:{ciphertext_hex}`\n */\n private _resolveCredential(credential: string | undefined): string | undefined {\n if (!credential) return undefined;\n\n if (!credential.startsWith(ENCRYPTED_CREDENTIAL_PREFIX)) {\n // Plaintext credential β log a warning for security awareness\n this.logDebug('SIEM credential is plaintext (not encrypted at rest). Consider re-saving via admin API to encrypt.');\n return credential;\n }\n\n try {\n const payload = credential.slice(ENCRYPTED_CREDENTIAL_PREFIX.length);\n const [ivHex, authTagHex, ciphertextHex] = payload.split(':');\n if (!ivHex || !authTagHex || !ciphertextHex) {\n throw new Error('Invalid encrypted credential format');\n }\n\n const key = this._deriveSIEMEncryptionKey();\n const iv = Buffer.from(ivHex, 'hex');\n const authTag = Buffer.from(authTagHex, 'hex');\n const ciphertext = Buffer.from(ciphertextHex, 'hex');\n\n const decipher = createDecipheriv('aes-256-gcm', key, iv);\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return decrypted.toString('utf8');\n } catch (error) {\n this.logger.error?.(\n 'Failed to decrypt SIEM credential',\n projectCaughtErrorLogFields(error),\n );\n return undefined;\n }\n }\n\n /**\n * H6: Encrypt a plaintext credential for storage.\n * Returns the encrypted string in format: `encrypted:aes-256-gcm:{iv}:{authTag}:{ciphertext}`\n *\n * Called by admin API when saving SIEM configuration.\n */\n public encryptCredential(plaintext: string): string {\n const key = this._deriveSIEMEncryptionKey();\n const iv = randomBytes(12); // 96-bit IV for GCM\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n\n const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n return `${ENCRYPTED_CREDENTIAL_PREFIX}${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted.toString('hex')}`;\n }\n\n /**\n * Sleep utility for exponential backoff.\n */\n private _sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"siem-webhook-delivery.backend.service.js","sourceRoot":"","sources":["../../../../../../src/compliance/audit-trails/services/siem-webhook-delivery.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;;;;;;;;;;;;;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sEAAsE,CAAC;AAC/G,OAAO,EAAE,kCAAkC,EAAE,MAAM,0CAA0C,CAAC;AAC9F,OAAO,EAAE,yCAAyC,EAAE,MAAM,qGAAqG,CAAC;AAChK,OAAO,EAAE,qCAAqC,EAAE,MAAM,+EAA+E,CAAC;AACtI,OAAO,EAIL,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,kCAAkC,EAClC,kCAAkC,EAClC,gCAAgC,GACjC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,cAAc,EACd,eAAe,EACf,2BAA2B,EAC3B,uBAAuB,GAGxB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,kBAAkB,EAClB,0BAA0B,EAC1B,mBAAmB,EACnB,+BAA+B,GAGhC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,8EAA8E,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sEAAsE,CAAC;AAwC3G;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,kCAAkC,CAAC,8BAA8B,CAAC;AACpG,MAAM,2BAA2B,GAAG,gCAAgC,CAAC;AACrE,4CAA4C;AAC5C,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AAC7D,oEAAoE;AACpE,MAAM,eAAe,GAAG,0BAA0B,CAAC;AACnD;;;;GAIG;AACH,MAAM,iCAAiC,GAAG,gBAAgB,CAAC;AAC3D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,gCAAgC,GAAG,IAAI,CAAC;AAE9C,gGAAgG;AAChG,oGAAoG;AACpG,iGAAiG;AACjG,kGAAkG;AAClG,yCAAyC;AACzC,EAAE;AACF,yFAAyF;AAGlF,IAAM,iCAAiC,GAAvC,MAAM,iCAAiC;IAKU;IACU;IACW;IACO;IACG;IARpE,QAAQ,CAA+D;IACvE,eAAe,GAAqC,IAAI,GAAG,EAAE,CAAC;IAE/E,YACsD,MAAqB,EACX,gBAAyC,EAC9B,oBAAwD,EACjD,oBAA+D,EAC5D,uBAA8D;QAJ7F,WAAM,GAAN,MAAM,CAAe;QACX,qBAAgB,GAAhB,gBAAgB,CAAyB;QAC9B,yBAAoB,GAApB,oBAAoB,CAAoC;QACjD,yBAAoB,GAApB,oBAAoB,CAA2C;QAC5D,4BAAuB,GAAvB,uBAAuB,CAAuC;QAEjJ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC;QAC7E,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,eAAe,CAAC,OAA+B;QAC1D,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QACvE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,aAAa,CAAC,YAAY,CAAC;QAClE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC;QAClD,MAAM,UAAU,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;QAE7C,kDAAkD;QAClD,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;gBAC1E,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,6DAA6D,EAAE;oBACjF,SAAS;oBACT,OAAO;oBACP,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;iBAC9B,CAAC,CAAC;gBACH,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,gDAAgD,EAAE;gBAC9D,SAAS;gBACT,OAAO;gBACP,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAEhE,gBAAgB;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAErD,gCAAgC;QAChC,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrD,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACrE,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC;QAE5D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;gBAE1E,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBAEhC,IAAI,CAAC,QAAQ,CAAC,qCAAqC,EAAE;oBACnD,SAAS;oBACT,OAAO;oBACP,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,OAAO;iBACR,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,aAAa,GAAG,OAAO,KAAK,UAAU,CAAC;gBAE7C,IAAI,aAAa,EAAE,CAAC;oBAClB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;oBAEhC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,gDAAgD,EAAE;wBACpE,SAAS;wBACT,OAAO;wBACP,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;wBAC7B,QAAQ,EAAE,OAAO,GAAG,CAAC;wBACrB,GAAG,2BAA2B,CAAC,KAAK,CAAC;qBACtC,CAAC,CAAC;oBAEH,2EAA2E;oBAC3E,2EAA2E;oBAC3E,4EAA4E;oBAC5E,iDAAiD;oBACjD,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrF,CAAC;qBAAM,CAAC;oBACN,MAAM,SAAS,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBACvD,IAAI,CAAC,QAAQ,CAAC,wCAAwC,EAAE;wBACtD,SAAS;wBACT,OAAO;wBACP,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,OAAO;wBACP,WAAW,EAAE,SAAS;qBACvB,CAAC,CAAC;oBACH,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,WAAW,CAAC,QAAoC,EAAE,WAAmB;QAC3E,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,eAAe,CAAC,GAAG;gBACtB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrC,KAAK,eAAe,CAAC,IAAI;gBACvB,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACtC,KAAK,eAAe,CAAC,IAAI;gBACvB,uFAAuF;gBACvF,4DAA4D;gBAC5D,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClD,KAAK,eAAe,CAAC,eAAe,CAAC;YACrC;gBACE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,YAAY,CAAC,QAAoC;QACvD,MAAM,WAAW,GAAG,2BAA2B,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAC/H,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtE,qFAAqF;QACrF,MAAM,IAAI,GAAG,CAAC,GAAe,EAAE,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC7G,MAAM,IAAI,GAAG,CAAC,GAAG,SAA4B,EAAU,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE9E,8FAA8F;QAC9F,kGAAkG;QAClG,0FAA0F;QAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;aACjG,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,8FAA8F;QAC9F,mGAAmG;QACnG,mGAAmG;QACnG,6FAA6F;QAC7F,sCAAsC;QACtC,wGAAwG;QACxG,8FAA8F;QAC9F,uGAAuG;QACvG,OAAO,SAAS,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,oBAAoB,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;IACnS,CAAC;IAED;;;;;;;;;;OAUG;IACK,aAAa,CAAC,QAAoC;QACxD,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,0BAA0B,CAAC,CAAC;QAChI,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtE,+FAA+F;QAC/F,MAAM,IAAI,GAAG,CAAC,GAAgB,EAAE,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAC/G,MAAM,IAAI,GAAG,CAAC,GAAG,SAA4B,EAAU,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/E,iGAAiG;QACjG,mGAAmG;QACnG,EAAE;QACF,kGAAkG;QAClG,gGAAgG;QAChG,+FAA+F;QAC/F,2DAA2D;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;aAClG,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,0FAA0F;QAC1F,gGAAgG;QAChG,2FAA2F;QAC3F,4FAA4F;QAC5F,4FAA4F;QAC5F,gGAAgG;QAChG,kFAAkF;QAClF,OAAO,YAAY,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,+BAA+B,IAAI,UAAU,EAAE,CAAC;IACrO,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACK,yBAAyB,CAC/B,QAAoC,EACpC,gBAA2C;QAE3C,uFAAuF;QACvF,qFAAqF;QACrF,uEAAuE;QACvE,MAAM,SAAS,GAAY,QAAQ,CAAC,SAAS,CAAC;QAC9C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,uFAAuF;YACvF,uEAAuE;YACvE,IAAI,CAAC,QAAQ,CAAC,8DAA8D,EAAE;gBAC5E,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;aAC9B,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,yFAAyF;QACzF,wFAAwF;QACxF,qCAAqC;QACrC,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAElC,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,gCAAgC;YAAE,OAAO,UAAU,CAAC;QAE/F,4FAA4F;QAC5F,6FAA6F;QAC7F,gGAAgG;QAChG,4FAA4F;QAC5F,uFAAuF;QACvF,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC;QAChC,OAAO,IAAI,GAAG,OAAO,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,gCAAgC,EAAE,CAAC;gBAC7G,IAAI,GAAG,SAAS,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEzD,IAAI,CAAC,QAAQ,CAAC,sEAAsE,EAAE;YACpF,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,cAAc,EAAE,UAAU,CAAC,MAAM;YACjC,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,aAAa,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC,MAAM;YACjD,QAAQ,EAAE,gCAAgC;SAC3C,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACK,eAAe,CAAC,UAAkB,EAAE,MAAc;QACxD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,mBAAmB,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAC7D,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,iCAAiC,EAAE,CAAC;IAC/F,CAAC;IAED,gEAAgE;IAChE,uBAAuB;IACvB,EAAE;IACF,0FAA0F;IAC1F,2FAA2F;IAC3F,8FAA8F;IAC9F,2FAA2F;IAC3F,gGAAgG;IAChG,iGAAiG;IACjG,wDAAwD;IACxD,gEAAgE;IAEhE;;;;;;;;;;;;;;;OAeG;IACK,wBAAwB,CAAC,KAAa;QAC5C,OAAO,KAAK;aACT,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;OAUG;IACK,gBAAgB,CAAC,KAAa;QACpC,8FAA8F;QAC9F,8FAA8F;QAC9F,gGAAgG;QAChG,+FAA+F;QAC/F,6FAA6F;QAC7F,+FAA+F;QAC/F,iGAAiG;QACjG,+FAA+F;QAC/F,oFAAoF;QACpF,gGAAgG;QAChG,2FAA2F;QAC3F,yFAAyF;QACzF,OAAO,KAAK;aACT,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;aACtB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;OAWG;IACK,sBAAsB,CAAC,KAAa;QAC1C,OAAO,KAAK;aACT,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;aACtB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;YACtB,8FAA8F;YAC9F,gFAAgF;aAC/E,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB,CACvB,QAA+D,EAC/D,QAAoC,EACpC,OAAiC;QAEjC,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,IAAI,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;gBAAE,SAAS;YACpE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtD,IAAI,QAAQ;gBAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;;OAUG;IACK,SAAS,CACf,GAAM,EACN,QAAgB,EAChB,gBAA2C,EAC3C,QAA0C;QAE1C,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAClG,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,uBAAuB,CAC7B,SAAiB,EACjB,QAAgB,EAChB,gBAA2C,EAC3C,GAAuB;QAEvB,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG;YAAE,OAAO,OAAO,CAAC;QAE/D,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC9B,OAAO,IAAI,GAAG,OAAO,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG;gBAAE,IAAI,GAAG,SAAS,CAAC;;gBAC9E,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,QAAQ,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE/E,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,+CAA+C,EAAE;YAClE,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE,GAAG;YACb,cAAc,EAAE,QAAQ,CAAC,MAAM;YAC/B,aAAa,EAAE,IAAI,CAAC,MAAM;SAC3B,CAAC,CAAC;QACH,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACK,uBAAuB,CAC7B,SAAiB,EACjB,QAAgB,EAChB,UAA4C;QAE5C,OAAO,IAAI,CAAC,uBAAuB,CACjC,SAAS,EACT,QAAQ,EACR,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAC7C,UAAU,CAAC,SAAS,CAAC,CACtB,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACK,kBAAkB,CAAC,SAAiB;QAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,CAAC;IAED;;OAEG;IACK,aAAa,CACnB,IAAY,EACZ,UAAgD;QAEhD,MAAM,OAAO,GAA2B;YACtC,uFAAuF;YACvF,yFAAyF;YACzF,2FAA2F;YAC3F,iCAAiC;YACjC,0FAA0F;YAC1F,0FAA0F;YAC1F,oFAAoF;YACpF,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,WAAW,KAAK,eAAe,CAAC,GAAG,IAAI,UAAU,CAAC,WAAW,KAAK,eAAe,CAAC,IAAI;gBAC/H,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,kBAAkB;SACvB,CAAC;QAEF,+DAA+D;QAC/D,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC;QAED,kDAAkD;QAClD,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAE9E,oBAAoB;QACpB,QAAQ,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9B,KAAK,cAAc;gBACjB,IAAI,kBAAkB,EAAE,CAAC;oBACvB,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,UAAU,kBAAkB,EAAE,CAAC;gBAC1E,CAAC;gBACD,MAAM;YAER,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,IAAI,eAAe,CAAC,OAAO,CAAC;gBACxE,IAAI,kBAAkB,EAAE,CAAC;oBACvB,OAAO,CAAC,UAAU,CAAC,GAAG,kBAAkB,CAAC;gBAC3C,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,aAAa;gBAChB,IAAI,kBAAkB,EAAE,CAAC;oBACvB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,kBAAkB,CAAC;yBAClD,MAAM,CAAC,IAAI,CAAC;yBACZ,MAAM,CAAC,KAAK,CAAC,CAAC;oBACjB,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,EAAE,CAAC;gBAC9D,CAAC;gBACD,MAAM;YAER,KAAK,MAAM,CAAC;YACZ;gBACE,MAAM;QACV,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACK,KAAK,CAAC,aAAa,CACzB,GAAW,EACX,IAAY,EACZ,OAA+B,EAC/B,SAAiB;QAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAElE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE;gBAC9C,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB;;;;;;;;mBAQG;gBACH,iBAAiB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;gBACtC,qBAAqB,EAAE,IAAI,CAAC,+BAA+B,EAAE;aAC9D,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC3D,MAAM,IAAI,KAAK,CACb,8BAA8B,QAAQ,CAAC,MAAM,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC/E,CAAC;YACJ,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACK,+BAA+B;QACrC,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,iCAAiC,KAAK,IAAI,CAAC;IAC9F,CAAC;IAED,gEAAgE;IAChE,kBAAkB;IAClB,gEAAgE;IAExD,cAAc,CAAC,UAAkB;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,gBAAgB;YAAE,OAAO,KAAK,CAAC;QAEpD,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;YACxC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,cAAc,CAAC,UAAkB;QACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAEO,cAAc,CAAC,UAAkB;QACvC,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,mBAAmB,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;YAChF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC5B,KAAK,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;QAEjC,IAAI,KAAK,CAAC,mBAAmB,IAAI,yBAAyB,EAAE,CAAC;YAC3D,KAAK,CAAC,gBAAgB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,2BAA2B,CAAC,CAAC;YAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAC9C,UAAU;gBACV,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;gBAC9C,UAAU,EAAE,2BAA2B;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,yBAAyB;IACzB,gEAAgE;IAEhE;;;;OAIG;IACK,KAAK,CAAC,aAAa,CACzB,OAA+B,EAC/B,aAAqB,EACrB,YAAqB;QAErB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,aAAa,CAAC,YAAY,CAAC;QAClE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,SAAS,KAAK,aAAa,CAAC,WAAW;gBAC7D,CAAC,CAAC,gBAAgB,CAAC,6BAA6B;gBAChD,CAAC,CAAC,gBAAgB,CAAC,8BAA8B,CAAC;YACpD,yEAAyE;YACzE,sFAAsF;YACtF,MAAM,oBAAoB,GAAG,SAAS,KAAK,aAAa,CAAC,WAAW;gBAClE,CAAC,CAAC,kCAAkC,CAAC,gBAAgB,CAAC,WAAW,CAAC;gBAClE,CAAC,CAAC,kCAAkC,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;YAEvE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,eAAe,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;YAEhF,MAAM,QAAQ,GAAG;gBACf,sEAAsE;gBACtE,mFAAmF;gBACnF,iFAAiF;gBACjF,yEAAyE;gBACzE,mFAAmF;gBACnF,oFAAoF;gBACpF,qFAAqF;gBACrF,uFAAuF;gBACvF,CAAC,oBAAoB,CAAC,EAAE,OAAO;gBAC/B,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;gBACjC,YAAY,EAAE,OAAO,CAAC,QAAQ;gBAC9B,aAAa,EAAE,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC3E,YAAY,EAAE,CAAC;gBACf,aAAa,EAAE,IAAI,IAAI,EAAE;gBACzB,WAAW,EAAE,aAAa,KAAK,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;gBACrG,MAAM,EAAE,aAAa,KAAK,mBAAmB,CAAC,CAAC,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,aAAa;aACtH,CAAC;YAEF,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAEnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBACvD,SAAS;gBACT,OAAO;gBACP,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;gBACjC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS;gBACrC,aAAa;aACd,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,qCAAqC,EAAE;gBACzD,SAAS;gBACT,OAAO;gBACP,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;gBACjC,GAAG,2BAA2B,CAAC,QAAQ,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACK,KAAK,CAAC,uBAAuB,CACnC,eAA6B,EAC7B,oBAA4B,EAC5B,OAAe;QAEf,OAAO,IAAI,CAAC,uBAAuB,CAAC,oCAAoC,CAAC;YACvE,YAAY,EAAE,eAAe;YAC7B,mBAAmB,EAAE,qBAAqB,CAAC,MAAM;YACjD,+BAA+B,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3E,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE;gBACd,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,qBAAqB,CAAC,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,WAAW,EAAE;aACzG;SACF,CAAC,CAAC;IACL,CAAC;IAED,gEAAgE;IAChE,4CAA4C;IAC5C,gEAAgE;IAEhE;;;OAGG;IACK,wBAAwB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7E,OAAO,UAAU,CAAC,QAAQ,CAAC;aACxB,MAAM,CAAC,GAAG,eAAe,IAAI,OAAO,EAAE,CAAC;aACvC,MAAM,EAAE,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,UAA8B;QACvD,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAElC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;YACxD,8DAA8D;YAC9D,IAAI,CAAC,QAAQ,CAAC,oGAAoG,CAAC,CAAC;YACpH,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;YACrE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAErD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC1D,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACjF,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CACjB,mCAAmC,EACnC,2BAA2B,CAAC,KAAK,CAAC,CACnC,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,iBAAiB,CAAC,SAAiB;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB;QAChD,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAEtD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAEpC,OAAO,GAAG,2BAA2B,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACvH,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,EAAU;QACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;CACF,CAAA;AAh3BY,iCAAiC;IAD7C,UAAU,EAAE;IAMR,WAAA,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACjC,WAAA,MAAM,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAA;IAC3C,WAAA,MAAM,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,CAAA;IACtD,WAAA,MAAM,CAAC,kBAAkB,CAAC,kCAAkC,CAAC,CAAA;IAC7D,WAAA,MAAM,CAAC,kBAAkB,CAAC,qCAAqC,CAAC,CAAA;qCAJL,aAAa;QACO,uBAAuB;QACR,kCAAkC;QAC3B,yCAAyC;QACnC,qCAAqC;GATxI,iCAAiC,CAg3B7C","sourcesContent":["/**\n * SIEM Webhook Delivery Backend Service\n *\n * Layer 3 of the three-layer audit event pipeline (Step 18).\n * Purpose-built for delivering security audit events to customer SIEM endpoints.\n * NOT a generic M2M webhook sender.\n *\n * Responsibilities:\n * - HTTP POST to webhook URL with configured auth\n * - HMAC-SHA256 signature for hmac_sha256 auth method\n * - Exponential backoff retries\n * - Circuit breaker after N consecutive failures per org\n * - CEF/LEEF format conversion (when eventFormat !== json_structured)\n * - Idempotency via eventId\n */\n\nimport 'reflect-metadata';\nimport { inject, injectable } from 'inversify';\nimport { createHmac, createHash, createCipheriv, createDecipheriv, randomBytes } from 'crypto';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { AuditEventDispatcherBackendService } from './audit-event-dispatcher.backend.service';\nimport { RepositoriesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/repositories/repositories-registry-handler.backend.service';\nimport { ExecutionContextCreatorBackendService } from '~wildo-backend-lib/runtime/services/execution-context-creator.backend.service';\nimport {\n type SecurityAuditEventEnvelope,\n type SiemExportConfigBase,\n type ResourceType,\n CoreResourceType,\n CoreResourceOperation,\n CORE_APP_ROLES,\n ResourcePrimaryScope,\n WildoHeaderKeys,\n SiemDeliveryDlqStatus,\n SIEMEventFormat,\n AuthScopeType,\n coreResourceShared_FieldIdentifier,\n SIEM_DELIVERY_RELIABILITY_CONTRACT,\n SIEM_CIRCUIT_BREAKER_COOLDOWN_MS,\n} from '@wildo-ai/saas-models';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport {\n CEF_PROJECTION,\n LEEF_PROJECTION,\n cefAgentSeverityHeaderValue,\n SiemFieldProjectionKind,\n type SiemProjectionContext,\n type SiemProjectionContract,\n} from './utils/siem-projection-contract.backend.utils';\nimport { buildOcsfEvent } from './utils/siem-ocsf-projection.backend.utils';\nimport {\n CEF_HEADER_MAX_CHARACTERS,\n CEF_MAX_CHARACTERS,\n LEEF_HEADER_MAX_CHARACTERS,\n LEEF_MAX_CHARACTERS,\n LEEF_TAB_DELIMITER_HEADER_VALUE,\n type CefWireKey,\n type LeefWireKey,\n} from './utils/siem-dictionary.backend.utils';\nimport {\n describeCaughtError,\n projectCaughtErrorLogFields,\n} from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { pinnedOutboundFetch } from '~wildo-backend-lib/security/ssrf/pinned-outbound-fetch.backend.utils';\n\n/** Circuit breaker state per organization */\ninterface CircuitBreakerState {\n consecutiveFailures: number;\n lastFailureAt: Date | null;\n circuitOpenUntil: Date | null;\n}\n\n/** Payload shape enqueued by AuditEventDispatcherBackendService */\nexport interface SIEMDeliveryJobPayload {\n envelope: SecurityAuditEventEnvelope;\n envelopeHmac?: string; // F6: HMAC integrity signature\n organizationId: string;\n /**\n * Delivery scope. Defaults to {@link AuthScopeType.ORGANIZATION}. The worker is scope-generic (the\n * circuit-breaker key, DLQ variant, and scope FK all derive from it), but `'application'`\n * is currently produced ONLY by the SIEM-DLQ retry custom-impl β there is no first-time\n * app-scoped producer, so the APPLICATION path is reserved / dormant. See\n * `AuditEventDispatcherBackendService.dispatchToOrganizationAuditSinks`.\n */\n scopeType?: AuthScopeType;\n scopeId?: string;\n siemConfig: {\n webhookUrl: string;\n authMethod: string;\n authCredential?: string;\n authHeaderName?: string;\n eventFormat: string;\n customHeaders?: Record<string, string>;\n delivery: {\n batchSize: number;\n batchWindowSeconds: number;\n retryAttempts: number;\n retryBackoffSeconds: number;\n timeoutSeconds: number;\n };\n };\n}\n\n/**\n * Circuit-breaker bounds come from `SIEM_DELIVERY_RELIABILITY_CONTRACT`, which the customer\n * documentation also projects: what an operator is told about a paused destination is what this\n * service applies.\n */\nconst CIRCUIT_BREAKER_THRESHOLD = SIEM_DELIVERY_RELIABILITY_CONTRACT.circuitBreakerFailureThreshold;\nconst CIRCUIT_BREAKER_COOLDOWN_MS = SIEM_CIRCUIT_BREAKER_COOLDOWN_MS;\n/** Prefix for encrypted credentials (H6) */\nconst ENCRYPTED_CREDENTIAL_PREFIX = 'encrypted:aes-256-gcm:';\n/** HKDF-like domain separator for SIEM encryption key derivation */\nconst SIEM_KEY_DOMAIN = 'wildo:siem:credential:v1';\n/**\n * Appended when the `eventData` detail bag is truncated, so the loss is VISIBLE to the receiver\n * rather than silent. A SOC that sees a JSON fragment ending mid-object cannot tell a truncation\n * from a serializer bug; this marker makes the difference explicit on the wire.\n */\nconst SIEM_EVENT_DATA_TRUNCATION_MARKER = '...[truncated]';\n/**\n * Maximum characters of serialized `eventData` carried in the single CEF/LEEF detail field,\n * INCLUDING {@link SIEM_EVENT_DATA_TRUNCATION_MARKER} when truncation occurs β the emitted value\n * never exceeds this bound.\n *\n * This is the CEF extension dictionary's own published length for `msg`, not a Wildo-invented\n * policy. LEEF publishes no per-attribute ceiling, so the same bound is applied there for\n * cross-format consistency: an unbounded detail bag is the realistic way a CEF/LEEF line grows\n * large enough for a receiver to reject it, which would fail the delivery into the DLQ.\n *\n * spec-cite: Implementing ArcSight CEF v26, Oct 2023 β ArcSight Extension Dictionary, \"CEF Key\n * Names for Event Producers\", `msg` row: full name `message`, data type `String`, length `1023`,\n * \"An arbitrary message giving more details about the event.\"\n *\n * The bound is applied to the ESCAPED value, i.e. to what actually goes on the wire. An earlier\n * revision bounded the value BEFORE escaping, on the reading that the ceiling describes the field's\n * CONTENT and escape sequences are transport encoding a receiver strips before it ever sees the\n * field. That reading is defensible and the document does not settle it β which is precisely why the\n * post-escape bound is the one to hold: escaping only ever expands (`=` β `\\=`, `\\` β `\\\\`), so a\n * value within the ceiling once encoded is necessarily within it once decoded. Bounding the encoded\n * form satisfies BOTH readings; bounding the decoded form satisfies only one, and an escape-heavy\n * bag sitting at the ceiling would have gone out over-long under the other.\n */\nconst SIEM_EVENT_DATA_DETAIL_MAX_CHARS = 1023;\n\n// The per-key ceilings and the `devTimeFormat` pattern used to live here as hand-kept constants\n// beside the formatter. They now live in the dictionary spine (`siem-dictionary.backend.utils.ts`),\n// DERIVED from the transcribed rows, because a ceiling maintained next to a key list is the same\n// artefact as the key list itself: adding a key and forgetting its published maximum was possible\n// right up until the derivation existed.\n//\n// Line comments, not a JSDoc block β a `/** */` here would attach to the class below it.\n\n@injectable()\nexport class SIEMWebhookDeliveryBackendService {\n private readonly logDebug: (message: string, context?: Record<string, unknown>) => void;\n private readonly circuitBreakers: Map<string, CircuitBreakerState> = new Map();\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly appConfigService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.AuditEventDispatcherService) private readonly auditEventDispatcher: AuditEventDispatcherBackendService,\n @inject(SAAS_SERVICE_TYPES.RepositoriesRegistryHandlerService) private readonly repositoriesRegistry: RepositoriesRegistryHandlerBackendService,\n @inject(SAAS_SERVICE_TYPES.ExecutionContextCreatorBackendService) private readonly executionContextCreator: ExecutionContextCreatorBackendService,\n ) {\n this.logDebug = this.logger.debugByType('SIEMWebhookDeliveryBackendService');\n this.logger.setDebugTypeLogging('SIEMWebhookDeliveryBackendService', false);\n }\n\n /**\n * Process a SIEM delivery job from the queue.\n * Called by the job consumer when a `siem.webhook-delivery` batch job is dequeued.\n */\n public async processDelivery(payload: SIEMDeliveryJobPayload): Promise<void> {\n const { envelope, envelopeHmac, organizationId, siemConfig } = payload;\n const scopeType = payload.scopeType ?? AuthScopeType.ORGANIZATION;\n const scopeId = payload.scopeId ?? organizationId;\n const circuitKey = `${scopeType}:${scopeId}`;\n\n // F6: Verify envelope integrity before processing\n if (envelopeHmac) {\n if (!this.auditEventDispatcher.verifyEnvelopeHmac(envelope, envelopeHmac)) {\n this.logger.error?.('SIEM envelope HMAC verification failed β possible tampering', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n });\n await this._enqueueToDLQ(payload, 'hmac_verification_failed');\n return;\n }\n }\n\n // Circuit breaker check β M11: DLQ instead of silent drop\n if (this._isCircuitOpen(circuitKey)) {\n this.logDebug('Circuit breaker open for scope, sending to DLQ', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n });\n await this._enqueueToDLQ(payload, 'circuit_breaker_open');\n return;\n }\n\n // Format the body\n const body = this._formatBody(envelope, siemConfig.eventFormat);\n\n // Build headers\n const headers = this._buildHeaders(body, siemConfig);\n\n // Attempt delivery with retries\n const maxRetries = siemConfig.delivery.retryAttempts;\n const baseBackoffMs = siemConfig.delivery.retryBackoffSeconds * 1000;\n const timeoutMs = siemConfig.delivery.timeoutSeconds * 1000;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n await this._sendHttpPost(siemConfig.webhookUrl, body, headers, timeoutMs);\n\n this._recordSuccess(circuitKey);\n\n this.logDebug('SIEM webhook delivered successfully', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n attempt,\n });\n return;\n } catch (error) {\n const isLastAttempt = attempt === maxRetries;\n\n if (isLastAttempt) {\n this._recordFailure(circuitKey);\n\n this.logger.error?.('SIEM webhook delivery failed after all retries', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n attempts: attempt + 1,\n ...projectCaughtErrorLogFields(error),\n });\n\n // `describeCaughtError`, not an `instanceof Error` ternary: this string is\n // PERSISTED as the DLQ record's failure reason, and a `WildoError_Backend`\n // is a plain object β the ternary would store `'[object Object]'` for every\n // structured fault, making the DLQ untriageable.\n await this._enqueueToDLQ(payload, 'retries_exhausted', describeCaughtError(error));\n } else {\n const backoffMs = baseBackoffMs * Math.pow(2, attempt);\n this.logDebug('SIEM webhook delivery failed, retrying', {\n scopeType,\n scopeId,\n eventId: envelope.eventId,\n attempt,\n nextRetryMs: backoffMs,\n });\n await this._sleep(backoffMs);\n }\n }\n }\n }\n\n /**\n * Format the event body based on the configured event format.\n *\n * `json_structured` ships the envelope verbatim. CEF and LEEF are flat, single-line `key=value`\n * grammars, so they project the envelope in two tiers: the standard/indexed keys each grammar\n * defines (`cat`, `outcome`, `src`, β¦), followed by the free-form `eventData` bag serialized\n * into that grammar's single detail field. Every envelope field therefore reaches all three\n * formats; only the ENCODING differs.\n */\n private _formatBody(envelope: SecurityAuditEventEnvelope, eventFormat: string): string {\n switch (eventFormat) {\n case SIEMEventFormat.CEF:\n return this._formatAsCEF(envelope);\n case SIEMEventFormat.LEEF:\n return this._formatAsLEEF(envelope);\n case SIEMEventFormat.OCSF:\n // OCSF is JSON, so there is no escaping/bounding layer here β the projection returns a\n // document and the only transport concern is serialisation.\n return JSON.stringify(buildOcsfEvent(envelope));\n case SIEMEventFormat.JSON_STRUCTURED:\n default:\n return JSON.stringify(envelope);\n }\n }\n\n /**\n * Format event as CEF (Common Event Format).\n * CEF:Version|Device Vendor|Device Product|Device Version|Signature ID|Name|Severity|Extension\n */\n private _formatAsCEF(envelope: SecurityAuditEventEnvelope): string {\n const cefSeverity = cefAgentSeverityHeaderValue(envelope.severity);\n const ext = (value: string): string => this._escapeCEFExtensionValue(value);\n const header = (field: string, value: string): string => this._emitBoundedHeaderField(field, value, CEF_HEADER_MAX_CHARACTERS);\n const eventDataDetail = this._serializeEventDataDetail(envelope, ext);\n // CEF extensions are SPACE-delimited, so that is what `join` means for this grammar.\n const pair = (key: CefWireKey, value: string): string => this._emitPair(key, value, ext, CEF_MAX_CHARACTERS);\n const join = (...fragments: readonly string[]): string => fragments.join(' ');\n\n // Driven by CEF_PROJECTION, so a field cannot be dropped by being forgotten β the contract is\n // exhaustive over the envelope type and declaration order is wire order. The per-field reasoning,\n // citations and the csN-budget decision all live there, next to the mapping they justify.\n const extensions = this._renderProjection(CEF_PROJECTION, envelope, { pair, join, eventDataDetail })\n .join(' ');\n\n // Header fields 5 and 6 are DIFFERENT questions and used to receive the same answer. Field 5,\n // `Device Event Class ID`, is the stable signature a QID/correlation rule keys on β `eventType` is\n // exactly that. Field 6, `Name`, is documented as \"a human-readable and understandable description\n // of the event\", so `user_account_locked` twice gave a SOC a machine token in the column its\n // console renders as the event title.\n // spec-cite: Implementing ArcSight CEF v26, Oct 2023 β \"Header Field Definitions\", `deviceEventClassId`\n // row (\"a unique identifier for each event-type β¦ also known as Signature ID\") and `name` row\n // (String, 512): \"a string representing a human-readable and understandable description of the event.\"\n return `CEF:0|${header('deviceVendor', 'Wildo')}|${header('deviceProduct', 'SecurityAudit')}|${header('deviceVersion', envelope.sourceVersion)}|${header('deviceEventClassId', envelope.eventType)}|${header('name', this._humanizeEventType(envelope.eventType))}|${cefSeverity}|${extensions}`;\n }\n\n /**\n * Format event as LEEF (Log Event Extended Format β IBM QRadar).\n * LEEF:Version|Vendor|Product|Version|EventID|Extension\n *\n * The serialized `eventData` bag rides a custom `eventData` attribute. It is deliberately NOT\n * called `msg` as in the CEF projection: `msg` earns that name in CEF by being a dictionary key\n * with a defined meaning, whereas LEEF publishes no such key β borrowing CEF's vocabulary here\n * would imply a standard attribute that does not exist. Each grammar gets the name that is\n * correct within it.\n * spec-cite: N/A β `eventData` is a Wildo-chosen custom attribute name, not a LEEF-defined key.\n */\n private _formatAsLEEF(envelope: SecurityAuditEventEnvelope): string {\n const val = (value: string): string => this._escapeLEEFValue(value);\n const header = (field: string, value: string): string => this._emitBoundedHeaderField(field, value, LEEF_HEADER_MAX_CHARACTERS);\n const eventDataDetail = this._serializeEventDataDetail(envelope, val);\n // LEEF attributes are TAB-delimited (we emit no `DelimiterCharacter`), so that is `join` here.\n const pair = (key: LeefWireKey, value: string): string => this._emitPair(key, value, val, LEEF_MAX_CHARACTERS);\n const join = (...fragments: readonly string[]): string => fragments.join('\\t');\n\n // Driven by LEEF_PROJECTION. LEEF reaches ALL 27 envelope fields because a LEEF custom key stays\n // searchable in QRadar, where a CEF custom extension does not β see the contract for the citation.\n //\n // `sev`, `devTime` and `devTimeFormat` are rendered BY the contract now. They used to be appended\n // here, which looked like a formatter detail and was a hole: a key emitted outside `pair` skips\n // its published ceiling, the duplicate-key check, and the declared-vs-emitted test β and `sev`\n // is precisely a key with a published constraint (`1-10`).\n const extensions = this._renderProjection(LEEF_PROJECTION, envelope, { pair, join, eventDataDetail })\n .join('\\t');\n\n // Six header fields, not five. The sixth is the attribute DelimiterCharacter, which every\n // LEEF 2.0 example in the guide carries and ours omitted β see LEEF_TAB_DELIMITER_HEADER_VALUE:\n // a parser splitting a 2.0 header into six fields was consuming our first attribute as it.\n // Vendor and Product go through `header()` too, though they are constants that need neither\n // escaping nor bounding. The point is that EVERY header field goes through the one door, so\n // \"is this field covered?\" is answerable by looking rather than by reasoning about each value β\n // the same reason `rt` was routed through `pair` even though digits never change.\n return `LEEF:2.0|${header('vendor', 'Wildo')}|${header('product', 'SecurityAudit')}|${header('productVersion', envelope.sourceVersion)}|${header('eventId', envelope.eventType)}|${LEEF_TAB_DELIMITER_HEADER_VALUE}|${extensions}`;\n }\n\n /**\n * Serialize `envelope.eventData` into the single detail field that CEF (`msg`) and LEEF\n * (`eventData`) each carry, or `undefined` when there is nothing worth saying β the caller's\n * `.filter(Boolean)` then drops the key entirely instead of emitting an empty one.\n *\n * Without this, CEF/LEEF subscribers received ONLY the curated standard keys while\n * `json_structured` subscribers received the whole bag: a silent capability gap between\n * formats, not a deliberate reduction.\n *\n * REJECTED ALTERNATIVE β flattening each `eventData` entry into its own extension key\n * (`lockoutDuration=15`, `sessionId=β¦`). It reads better as SIEM columns, but it is unsound\n * here. `eventData` is an OPEN, app-extensible bag whose keys routinely collide both with the\n * CEF/LEEF dictionaries and with the envelope fields already projected above it: the\n * `USER_LOGIN_FAILED` bag alone carries `failureReason`, `ipAddress` and `email`, which the\n * dispatcher has already promoted onto the envelope and which this formatter already emits as\n * `reason`, `src` and `suser`. Flattening would therefore put `src=` on the line TWICE and leave\n * which one wins to the receiver's parser. Nested objects and arrays have no flat\n * representation either. One JSON field keeps the standard keys authoritative AND the bag\n * lossless, at the cost of a second parse step on the receiving end.\n *\n * The returned JSON is escaped by the CALLER for its grammar, so a backslash ends up encoded\n * twice β once by `JSON.stringify`, once by the CEF/LEEF escaper. That is correct and\n * required: a receiver un-escapes the wire grammar first, then parses the JSON.\n */\n private _serializeEventDataDetail(\n envelope: SecurityAuditEventEnvelope,\n escapeForGrammar: (value: string) => string,\n ): string | undefined {\n // Defensive: the envelope TYPE requires `eventData`, but this formatter also runs over\n // envelopes replayed from the DLQ, where a stored bag can be absent or malformed. An\n // unguarded `Object.keys(undefined)` here would throw inside delivery.\n const eventData: unknown = envelope.eventData;\n if (!eventData || typeof eventData !== 'object' || Object.keys(eventData).length === 0) {\n return undefined;\n }\n\n let serialized: string;\n try {\n serialized = JSON.stringify(eventData);\n } catch {\n // A circular / unserializable bag must not fail the whole delivery β the standard keys\n // above it are still valuable to a SOC, so drop only the detail field.\n this.logDebug('SIEM eventData detail omitted β bag is not JSON-serializable', {\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n });\n return undefined;\n }\n\n // `JSON.stringify` returns `undefined` for a value it cannot represent at all; the guard\n // above makes that unreachable for a non-empty plain object, but a `toJSON()` returning\n // `undefined` would still land here.\n if (!serialized) return undefined;\n\n if (escapeForGrammar(serialized).length <= SIEM_EVENT_DATA_DETAIL_MAX_CHARS) return serialized;\n\n // Largest prefix whose ESCAPED form, marker included, still fits. A prefix length cannot be\n // computed arithmetically because expansion depends on which characters the prefix contains,\n // and it is not uniform across the two grammars (CEF escapes `=`, LEEF does not). Binary search\n // costs O(log n) escape passes and is exact; a fixed safety margin would be a guess that is\n // simultaneously too small for a delimiter-dense bag and wasteful for an ordinary one.\n let fits = 0;\n let tooLong = serialized.length;\n while (fits < tooLong) {\n const candidate = Math.ceil((fits + tooLong) / 2);\n if (escapeForGrammar(this._truncateDetail(serialized, candidate)).length <= SIEM_EVENT_DATA_DETAIL_MAX_CHARS) {\n fits = candidate;\n } else {\n tooLong = candidate - 1;\n }\n }\n const truncated = this._truncateDetail(serialized, fits);\n\n this.logDebug('SIEM eventData detail truncated to the CEF/LEEF detail-field ceiling', {\n eventId: envelope.eventId,\n eventType: envelope.eventType,\n originalLength: serialized.length,\n emittedLength: truncated.length,\n escapedLength: escapeForGrammar(truncated).length,\n maxChars: SIEM_EVENT_DATA_DETAIL_MAX_CHARS,\n });\n return truncated;\n }\n\n /**\n * Cut `serialized` to `length` UTF-16 units and append the truncation marker.\n *\n * The marker is counted INSIDE the ceiling by the caller's search, not appended beyond it β a\n * bound that its own truncation overshoots is not a bound. A cut landing between the halves of a\n * surrogate pair would emit a lone surrogate, which `JSON.parse` on the receiving end rejects with\n * a different error than the truncation it actually is, so the trailing half-pair is dropped.\n */\n private _truncateDetail(serialized: string, length: number): string {\n const cut = serialized.slice(0, length);\n const last = cut.charCodeAt(cut.length - 1);\n const endsOnHighSurrogate = last >= 0xd800 && last <= 0xdbff;\n return `${endsOnHighSurrogate ? cut.slice(0, -1) : cut}${SIEM_EVENT_DATA_TRUNCATION_MARKER}`;\n }\n\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n // Wire-format escaping\n //\n // CEF and LEEF are single-line, delimiter-separated grammars with NO quoting construct: a\n // delimiter appearing raw inside a value does not produce a malformed record that a parser\n // rejects β it produces a WELL-FORMED record with silently wrong fields. That failure mode is\n // why these helpers exist and why EVERY interpolated string value goes through one of them\n // rather than only the fields believed to be risky today. `outcomeReason` in particular is free\n // text sourced from `eventData.failureReason` / `eventData.reason`, so it is the first projected\n // field with no vocabulary constraining its characters.\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n /**\n * Escape a value for a CEF *extension* (`key=value`) slot.\n *\n * The extension is a space-separated `key=value` list whose parser delimits on the next\n * `<key>=`, so per the CEF standard:\n * - `\\` becomes `\\\\` β it is the escape character itself, which is why it MUST be replaced\n * first; doing it later would re-escape the backslashes introduced by the rules below.\n * - `=` becomes `\\=` β an unescaped `=` is read as the start of the next key/value pair.\n * - CR/LF become the two-character sequences `\\r` / `\\n` β a real newline terminates the\n * record and truncates every remaining field.\n *\n * Spaces are deliberately NOT escaped: the grammar permits them inside extension values (a\n * value is delimited by the next `<key>=`, not by whitespace).\n * spec-cite: Implementing ArcSight CEF v26, Oct 2023 β \"Character Encoding\" / the extension\n * escaping rules for pipe, backslash and equals in the Extension field.\n */\n private _escapeCEFExtensionValue(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/=/g, '\\\\=')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n');\n }\n\n /**\n * Escape a value for a LEEF attribute slot.\n *\n * LEEF pairs are TAB-delimited, so a literal tab fabricates an extra attribute and a newline\n * terminates the record; both are encoded as their escape sequences (`\\` first, for the same\n * reason as above). `=` needs NO escaping here β a LEEF parser splits each pair on its FIRST\n * `=`, so subsequent `=` characters remain part of the value.\n * spec-cite: N/A β LEEF publishes no escaping table for attribute values; these rules are\n * derived from its tab-delimited, newline-terminated record structure, which is why the `=`\n * asymmetry with CEF above is deliberate rather than an oversight.\n */\n private _escapeLEEFValue(value: string): string {\n // β οΈ `|` and `^` are deliberately NOT escaped, and the reasoning is the point rather than the\n // conclusion. The guide's best practices say to AVOID them in keys and values β it defines no\n // escape for them, because LEEF 2.0's answer is the header's `DelimiterCharacter`, which lets a\n // producer CHOOSE the attribute delimiter (caret is a documented choice). Inventing `\\|` would\n // therefore corrupt the value at every conformant receiver, which is strictly worse than the\n // mis-parse it guards against β and that mis-parse needs a non-conformant parser splitting the\n // whole line on `|`, since the header ends at its fifth. We emit no `DelimiterCharacter`, so the\n // delimiter is TAB and a caret in a value is inert. If a `DelimiterCharacter` is ever emitted,\n // THAT character becomes escapable-or-forbidden and this decision must be re-taken.\n // spec-cite: IBM QRadar LEEF Version 2 (Β© IBM 2013, 2016) β \"Best practices Guidelines for LEEF\n // events\": \"Use alphanumeric (A-Z, a-z, and 0-9) characters, but avoid tab, pipe, or caret\n // delimiters in your event payload keys and values\"; Table 2, `Delimiter Character` row.\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n');\n }\n\n /**\n * Escape a value for a CEF or LEEF *header* slot (the `|`-delimited prefix shared by both\n * grammars).\n *\n * A literal `|` would fabricate a header field and shift every subsequent one β including the\n * severity and the entire extension β so it is escaped as `\\|`. Headers cannot span lines at\n * all (there is no multi-line encoding for them, unlike extension values), so newlines are\n * folded to a space rather than escaped.\n *\n * Applied defensively: `sourceVersion` is read straight from the `APP_VERSION` environment\n * variable and `eventType` is app-extensible, so neither is guaranteed delimiter-free.\n */\n private _escapeSIEMHeaderField(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\|/g, '\\\\|')\n // Any CR or LF, in any combination β not just `\\r?\\n`. A LONE `\\r` slipped through that form,\n // and a bare CR terminates a record for readers that treat it as a line ending.\n .replace(/[\\r\\n]+/g, ' ');\n }\n\n /**\n * Render a projection contract into its emitted fragments, in declaration order.\n *\n * Only `extension` entries produce wire output. `header` entries are carried by the caller's header\n * construction and `not-projected` entries deliberately produce nothing β both exist in the contract\n * so that COVERAGE is a property of the type rather than of anyone's memory.\n */\n private _renderProjection<K extends string>(\n contract: SiemProjectionContract<SecurityAuditEventEnvelope, K>,\n envelope: SecurityAuditEventEnvelope,\n context: SiemProjectionContext<K>,\n ): string[] {\n const fragments: string[] = [];\n for (const projection of Object.values(contract)) {\n if (projection.kind !== SiemFieldProjectionKind.EXTENSION) continue;\n const fragment = projection.render(envelope, context);\n if (fragment) fragments.push(fragment);\n }\n return fragments;\n }\n\n /**\n * Emit one `key=value` pair, escaped for its grammar and bounded by the key's PUBLISHED ceiling.\n *\n * The bound is measured on the ESCAPED value for the same reason as the detail bag: escaping only\n * expands, so bounding the encoded form is the only bound that holds under both readings of what a\n * published length governs. A key absent from `maxByKey` has no published limit and is emitted\n * whole β the table never invents one.\n *\n * Truncation is LOUD. Losing the tail of an id or an email is a data defect, not a formatting\n * detail, and the receiver cannot tell a truncated value from a short one.\n */\n private _emitPair<K extends string>(\n key: K,\n rawValue: string,\n escapeForGrammar: (value: string) => string,\n maxByKey: Readonly<Record<string, number>>,\n ): string {\n return `${key}=${this._boundToPublishedLength(key, rawValue, escapeForGrammar, maxByKey[key])}`;\n }\n\n /**\n * Escape a value and bound the ESCAPED result at its published ceiling, or emit it whole when the\n * document publishes none.\n *\n * Shared by the extension path ({@link _emitPair}) and the header path\n * ({@link _emitBoundedHeaderField}) because both answer the same question and only one of them used\n * to. Header fields never passed through `_emitPair`, so every published header size β most\n * pointedly `deviceVersion`'s 31 characters, which carries `APP_VERSION` β was unenforced while the\n * extension ceilings were being carefully derived from the dictionary one layer away. Two code\n * paths for one rule is how that happened; there is one now.\n *\n * The bound is measured on the escaped form for the reason given at\n * {@link SIEM_EVENT_DATA_DETAIL_MAX_CHARS}: escaping only expands, so a value within the ceiling\n * once encoded is within it once decoded, which satisfies both readings of what a published length\n * governs. Truncation is LOUD β losing the tail of a version or an id is a data defect, and the\n * receiver cannot tell a truncated value from a short one.\n */\n private _boundToPublishedLength(\n fieldName: string,\n rawValue: string,\n escapeForGrammar: (value: string) => string,\n max: number | undefined,\n ): string {\n const escaped = escapeForGrammar(rawValue);\n if (max === undefined || escaped.length <= max) return escaped;\n\n let fits = 0;\n let tooLong = rawValue.length;\n while (fits < tooLong) {\n const candidate = Math.ceil((fits + tooLong) / 2);\n if (escapeForGrammar(rawValue.slice(0, candidate)).length <= max) fits = candidate;\n else tooLong = candidate - 1;\n }\n const cut = rawValue.slice(0, fits);\n const lastCode = cut.charCodeAt(cut.length - 1);\n const kept = lastCode >= 0xd800 && lastCode <= 0xdbff ? cut.slice(0, -1) : cut;\n\n this.logger.warn?.('SIEM field truncated to its published ceiling', {\n key: fieldName,\n maxChars: max,\n originalLength: rawValue.length,\n emittedLength: kept.length,\n });\n return escapeForGrammar(kept);\n }\n\n /**\n * Emit one `|`-delimited header field, escaped for the shared header grammar and bounded by the\n * size its document publishes for THAT slot.\n *\n * A header field cannot be dropped when it misbehaves β an omitted field shifts every field after\n * it and silently re-interprets the whole record β so the only available degradation is truncation.\n */\n private _emitBoundedHeaderField(\n fieldName: string,\n rawValue: string,\n maxByField: Readonly<Record<string, number>>,\n ): string {\n return this._boundToPublishedLength(\n fieldName,\n rawValue,\n (value) => this._escapeSIEMHeaderField(value),\n maxByField[fieldName],\n );\n }\n\n /**\n * `user_account_locked` β `User account locked`, for CEF's human-readable `Name` header field.\n *\n * Derived rather than authored: the envelope carries no display label, and inventing a lookup table\n * would be a second vocabulary to keep in sync with `CoreAuditableEventType` β the drift shape this\n * codebase keeps paying for. A derivation cannot go stale.\n *\n * Deliberately NOT applied to `Device Event Class ID`, which must stay the machine token: a\n * correlation rule keyed on a prettified string would break the moment the prettifier changed.\n */\n private _humanizeEventType(eventType: string): string {\n const words = eventType.replace(/[_-]+/g, ' ').trim();\n return words ? `${words.charAt(0).toUpperCase()}${words.slice(1)}` : eventType;\n }\n\n /**\n * Build HTTP headers for the SIEM webhook request.\n */\n private _buildHeaders(\n body: string,\n siemConfig: SIEMDeliveryJobPayload['siemConfig'],\n ): Record<string, string> {\n const headers: Record<string, string> = {\n // Second reader of `eventFormat` in this file (the first is `_formatBody`). Both route\n // through the SIEMEventFormat vocabulary so a future format value cannot be added to the\n // switch and silently forgotten here, where the wrong Content-Type makes a receiver reject\n // an otherwise well-formed body.\n // OCSF is JSON too, so the test is \"is this a TEXT grammar\", not \"is it json_structured\".\n // Reading it the other way would have shipped OCSF as `text/plain` β a well-formed body a\n // receiver may refuse to parse, which is this workstream's signature failure shape.\n [WildoHeaderKeys.CONTENT_TYPE]: siemConfig.eventFormat === SIEMEventFormat.CEF || siemConfig.eventFormat === SIEMEventFormat.LEEF\n ? 'text/plain'\n : 'application/json',\n };\n\n // Apply custom headers first (auth headers override if needed)\n if (siemConfig.customHeaders) {\n Object.assign(headers, siemConfig.customHeaders);\n }\n\n // H6: Resolve (decrypt) the credential before use\n const resolvedCredential = this._resolveCredential(siemConfig.authCredential);\n\n // Apply auth method\n switch (siemConfig.authMethod) {\n case 'bearer_token':\n if (resolvedCredential) {\n headers[WildoHeaderKeys.AUTHORIZATION] = `Bearer ${resolvedCredential}`;\n }\n break;\n\n case 'api_key_header': {\n const headerName = siemConfig.authHeaderName || WildoHeaderKeys.API_KEY;\n if (resolvedCredential) {\n headers[headerName] = resolvedCredential;\n }\n break;\n }\n\n case 'hmac_sha256':\n if (resolvedCredential) {\n const hmac = createHmac('sha256', resolvedCredential)\n .update(body)\n .digest('hex');\n headers[WildoHeaderKeys.X_SIGNATURE_256] = `sha256=${hmac}`;\n }\n break;\n\n case 'none':\n default:\n break;\n }\n\n return headers;\n }\n\n /**\n * Send HTTP POST to the SIEM webhook endpoint.\n *\n * ## Why this is not a plain `fetch`\n *\n * `webhookUrl` is TENANT-authored: an organization administrator types it, and this worker POSTs\n * to it holding the deployment's own network position. That is the fifth of the five outbound\n * target classes `security/ssrf/outbound-target-guard.backend.utils.ts` was written for β its\n * header names \"SIEM collectors\" explicitly β and it was the one class that never called it. A\n * `webhookUrl` of `http://169.254.169.254/latest/meta-data/iam/security-credentials/` was\n * delivered to, with the tenant's own auth headers attached, and the response body came back\n * inside the thrown error's message.\n *\n * {@link pinnedOutboundFetch} closes three separate holes here, not one:\n *\n * 1. **No classification at all.** The shape check now refuses a literal internal address and a\n * reserved special-use hostname before anything leaves the process.\n * 2. **Check-then-connect.** The address is classified inside the connection's `lookup` hook, so a\n * name that answers public to a validator and private to the socket never gets one.\n * 3. **Redirects.** The old call omitted `redirect: 'error'`, so even a perfect check would have\n * been walked past by a collector answering `302 Location: http://169.254.169.254/`. This\n * client cannot follow a redirect at all β a 302 arrives as a 302 and fails the `ok` test\n * below, landing in the retry/DLQ path like any other bad response.\n *\n * ## The behaviour change, stated rather than discovered\n *\n * A collector that today answers a redirect stops being followed and starts failing. That is\n * deliberate: a redirect is precisely how the guard is bypassed, and a SIEM endpoint that needs\n * one should be reconfigured to its final address. A collector on a PRIVATE network keeps working\n * only when the operator has declared\n * `auditTrail.allowPrivateNetworkSiemCollectors` β see {@link _admitsPrivateNetworkCollectors}.\n */\n private async _sendHttpPost(\n url: string,\n body: string,\n headers: Record<string, string>,\n timeoutMs: number,\n ): Promise<void> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await pinnedOutboundFetch(url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n /**\n * BOTH schemes, unlike CIMD's https-only policy, and the asymmetry is deliberate rather than\n * an oversight. `webhookUrl` is authored configuration that predates this guard and `http:`\n * collectors exist in the field on trusted internal networks; refusing plaintext here would\n * silently stop delivering security events for those deployments, which is a worse security\n * outcome than the transport weakness it would remove. Narrowing this to `https:` is a\n * separate, operator-visible decision with its own migration β not a side effect of adding\n * an SSRF guard.\n */\n admittedProtocols: ['https:', 'http:'],\n admitPrivateAddresses: this._admitsPrivateNetworkCollectors(),\n });\n\n if (!response.ok) {\n const responseText = await response.text().catch(() => '');\n throw new Error(\n `SIEM webhook returned HTTP ${response.status}: ${responseText.slice(0, 200)}`\n );\n }\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Has the DEPLOYMENT OPERATOR declared that SIEM collectors may sit on a private network?\n *\n * Read from the application configuration, never from the SIEM config row. The row is authored by\n * an organization administrator β the same party that supplies the URL β so a flag there would let\n * the attacker disarm the guard aimed at them. The operator declares the network posture; the\n * tenant chooses a destination within it.\n *\n * Absent reads as `false`. The field is deliberately un-defaulted in\n * {@link AuditTrailConfigSchema} so that an application which never authored the block gets the\n * refusing posture by doing nothing.\n */\n private _admitsPrivateNetworkCollectors(): boolean {\n return this.appConfigService.config?.auditTrail?.allowPrivateNetworkSiemCollectors === true;\n }\n\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n // Circuit Breaker\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n private _isCircuitOpen(circuitKey: string): boolean {\n const state = this.circuitBreakers.get(circuitKey);\n if (!state || !state.circuitOpenUntil) return false;\n\n if (new Date() > state.circuitOpenUntil) {\n state.circuitOpenUntil = null;\n return false;\n }\n\n return true;\n }\n\n private _recordSuccess(circuitKey: string): void {\n this.circuitBreakers.delete(circuitKey);\n }\n\n private _recordFailure(circuitKey: string): void {\n let state = this.circuitBreakers.get(circuitKey);\n if (!state) {\n state = { consecutiveFailures: 0, lastFailureAt: null, circuitOpenUntil: null };\n this.circuitBreakers.set(circuitKey, state);\n }\n\n state.consecutiveFailures++;\n state.lastFailureAt = new Date();\n\n if (state.consecutiveFailures >= CIRCUIT_BREAKER_THRESHOLD) {\n state.circuitOpenUntil = new Date(Date.now() + CIRCUIT_BREAKER_COOLDOWN_MS);\n this.logger.warn('SIEM circuit breaker opened', {\n circuitKey,\n consecutiveFailures: state.consecutiveFailures,\n cooldownMs: CIRCUIT_BREAKER_COOLDOWN_MS,\n });\n }\n }\n\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n // M11: Dead Letter Queue\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n /**\n * Persist failed SIEM delivery events to a MongoDB-backed DLQ resource\n * instead of silently dropping them. DLQ entries conform to SiemDeliveryDlqBase\n * and are queryable/retryable through the standard resource engine.\n */\n private async _enqueueToDLQ(\n payload: SIEMDeliveryJobPayload,\n failureReason: string,\n errorMessage?: string,\n ): Promise<void> {\n const scopeType = payload.scopeType ?? AuthScopeType.ORGANIZATION;\n const scopeId = payload.scopeId ?? payload.organizationId;\n try {\n const dlqResourceType = scopeType === AuthScopeType.APPLICATION\n ? CoreResourceType.APPLICATION_SIEM_DELIVERY_DLQ\n : CoreResourceType.ORGANIZATION_SIEM_DELIVERY_DLQ;\n // Polymorphic scope FK field name: `organizationId` for the ORG variant,\n // `applicationId` for the APP variant (the polymorphism engine's per-variant column).\n const scopeFieldIdentifier = scopeType === AuthScopeType.APPLICATION\n ? coreResourceShared_FieldIdentifier[CoreResourceType.APPLICATION]\n : coreResourceShared_FieldIdentifier[CoreResourceType.ORGANIZATIONS];\n\n const ec = await this._getDlqExecutionContext(dlqResourceType, scopeFieldIdentifier, scopeId);\n const dlqRepo = this.repositoriesRegistry.getRepositoryOrThrow(dlqResourceType);\n\n const dlqEntry = {\n // The polymorphic scope FK (organizationId / applicationId) is NOT on\n // SiemDeliveryDlqBaseSchema β the polymorphism engine appends it per variant as an\n // excludeFromCreate, context-injected column. Its AUTHORITATIVE write comes from\n // `enrichDataWithContext` reading it off the EC's context map (seeded in\n // `_getDlqExecutionContext`), because the strict CREATE-DTO strips this field from\n // the payload. We ALSO set it here β mirroring the M2M webhook-delivery-log sibling\n // (`buildScopeFkInjection`) β so both delivery-failure paths read identically; it is\n // harmless (stripped, then re-injected by enrichment) rather than the source of truth.\n [scopeFieldIdentifier]: scopeId,\n eventId: payload.envelope.eventId,\n eventPayload: payload.envelope,\n failureReason: `${failureReason}${errorMessage ? `: ${errorMessage}` : ''}`,\n failureCount: 1,\n lastAttemptAt: new Date(),\n nextRetryAt: failureReason === 'retries_exhausted' ? undefined : new Date(Date.now() + 5 * 60 * 1000),\n status: failureReason === 'retries_exhausted' ? SiemDeliveryDlqStatus.EXHAUSTED : SiemDeliveryDlqStatus.PENDING_RETRY,\n };\n\n await dlqRepo.create(ec, dlqEntry);\n\n this.logger.warn('SIEM delivery event persisted to DLQ', {\n scopeType,\n scopeId,\n eventId: payload.envelope.eventId,\n eventType: payload.envelope.eventType,\n failureReason,\n });\n } catch (dlqError) {\n this.logger.error?.('Failed to enqueue SIEM event to DLQ', {\n scopeType,\n scopeId,\n eventId: payload.envelope.eventId,\n ...projectCaughtErrorLogFields(dlqError),\n });\n }\n }\n\n /**\n * Create a REPOSITORY-DIRECT internal ExecutionContext for the DLQ create.\n *\n * SIEM delivery runs in an async queue worker with no user EC, so this synthesises a\n * system super-admin context via `createForInternalRepositoryOperation` β the blessed seam\n * for repository-tier internal writes (shared with FILES / JOB_* / notification-badge) that\n * resolves the DLQ's `REPOSITORY_ONLY` CREATE variant. It also uses the CORRECT polymorphic\n * `dlqResourceType` (the prior hand-rolled path hardcoded the ORG variant even for APP-scoped\n * deliveries).\n *\n * CRITICAL β the scope-FK injection channel: the DLQ's scope FK (organizationId /\n * applicationId) is an excludeFromCreate, context-injected column the polymorphism engine\n * appends per variant; the strict CREATE-DTO strips it from the payload, so it is persisted\n * ONLY by `enrichDataWithContext` reading it off THIS context map. An earlier version passed\n * an EMPTY map β the required scope FK was never injected β Mongoose \"organizationId: Path\n * required\" β every retries-exhausted SIEM delivery was silently lost instead of\n * dead-lettered. An INTERNALLY_INITIATED EC fail-closed rejects org/user identity on\n * `initiatorIds`, so the context map is the ONLY correct channel for the ORGANIZATION scope FK.\n */\n private async _getDlqExecutionContext(\n dlqResourceType: ResourceType,\n scopeFieldIdentifier: string,\n scopeId: string,\n ): Promise<ExecutionContext<any>> {\n return this.executionContextCreator.createForInternalRepositoryOperation({\n resourceType: dlqResourceType,\n operationIdentifier: CoreResourceOperation.CREATE,\n contextResourcesFieldIdentifier: new Map([[scopeFieldIdentifier, scopeId]]),\n initiatorIds: null,\n initiatorRoles: [\n { roles: [CORE_APP_ROLES.APP_ADMIN_SUPER_ADMIN], relatedPrimaryScope: ResourcePrimaryScope.APPLICATION },\n ],\n });\n }\n\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n // H6: SIEM Credential Encryption/Decryption\n // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n /**\n * Derive a 32-byte AES-256 key from the app's session encryption key\n * using a domain-specific separator to avoid key reuse.\n */\n private _deriveSIEMEncryptionKey(): Buffer {\n const baseKey = this.appConfigService.secrets.security.session.encryptionKey;\n return createHash('sha256')\n .update(`${SIEM_KEY_DOMAIN}:${baseKey}`)\n .digest();\n }\n\n /**\n * H6: Resolve a credential value β decrypts if encrypted, returns as-is if plaintext.\n * Encrypted format: `encrypted:aes-256-gcm:{iv_hex}:{authTag_hex}:{ciphertext_hex}`\n */\n private _resolveCredential(credential: string | undefined): string | undefined {\n if (!credential) return undefined;\n\n if (!credential.startsWith(ENCRYPTED_CREDENTIAL_PREFIX)) {\n // Plaintext credential β log a warning for security awareness\n this.logDebug('SIEM credential is plaintext (not encrypted at rest). Consider re-saving via admin API to encrypt.');\n return credential;\n }\n\n try {\n const payload = credential.slice(ENCRYPTED_CREDENTIAL_PREFIX.length);\n const [ivHex, authTagHex, ciphertextHex] = payload.split(':');\n if (!ivHex || !authTagHex || !ciphertextHex) {\n throw new Error('Invalid encrypted credential format');\n }\n\n const key = this._deriveSIEMEncryptionKey();\n const iv = Buffer.from(ivHex, 'hex');\n const authTag = Buffer.from(authTagHex, 'hex');\n const ciphertext = Buffer.from(ciphertextHex, 'hex');\n\n const decipher = createDecipheriv('aes-256-gcm', key, iv);\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return decrypted.toString('utf8');\n } catch (error) {\n this.logger.error?.(\n 'Failed to decrypt SIEM credential',\n projectCaughtErrorLogFields(error),\n );\n return undefined;\n }\n }\n\n /**\n * H6: Encrypt a plaintext credential for storage.\n * Returns the encrypted string in format: `encrypted:aes-256-gcm:{iv}:{authTag}:{ciphertext}`\n *\n * Called by admin API when saving SIEM configuration.\n */\n public encryptCredential(plaintext: string): string {\n const key = this._deriveSIEMEncryptionKey();\n const iv = randomBytes(12); // 96-bit IV for GCM\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n\n const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n return `${ENCRYPTED_CREDENTIAL_PREFIX}${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted.toString('hex')}`;\n }\n\n /**\n * Sleep utility for exponential backoff.\n */\n private _sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* # A leased, stale-while-revalidate, single-flight cache for values read on the AUDIT EMISSION PATH
|
|
3
|
+
*
|
|
4
|
+
* The audit dispatcher holds two per-organization caches β the SIEM export config that decides WHERE
|
|
5
|
+
* an event is routed, and the organization name that decorates the envelope. Both were hand-rolled
|
|
6
|
+
* `Map`s with a 5-minute wall-clock TTL, a copy-pasted FIFO eviction block, and a blocking re-read on
|
|
7
|
+
* expiry. This is the one place those mechanics live now, so a property fixed here is fixed for both
|
|
8
|
+
* β the shape `.claude/rules/invariant-call-site-enumeration.md` exists to force.
|
|
9
|
+
*
|
|
10
|
+
* ## The governing constraint: emission must never fail, and never block, the thing it observes
|
|
11
|
+
*
|
|
12
|
+
* `AuditEventDispatcherBackendService` runs detached (`audit-logs.backend.service.ts:349` calls it
|
|
13
|
+
* without `await`, with a `.catch`), and its whole contract is that a routing failure is logged and
|
|
14
|
+
* never thrown onto the business operation. Every property below follows from that:
|
|
15
|
+
*
|
|
16
|
+
* | Property | Why it is required here specifically |
|
|
17
|
+
* |---|---|
|
|
18
|
+
* | **Stale-while-revalidate** | Past the lease the CACHED value is returned immediately and the re-read runs off the caller's path. Staleness is tolerable (a config changes monthly); a stall is not. It is also what makes a SHORT lease affordable: shortening it now costs read volume only, never latency. |
|
|
19
|
+
* | **Single flight** | A burst of events for one organization must produce ONE read, not one per event. Without it a cold organization under load fires N concurrent reads β and for the SIEM config each of those reads emits its own `system_context_read` audit row and can race the lazy default-row materialisation. |
|
|
20
|
+
* | **Generation-guarded write-back** | An {@link invalidate} that lands WHILE a refresh is in flight must win. Without the guard the in-flight read β started before the write committed β writes the pre-write value back over the invalidation, so the invalidation silently does nothing in exactly the case it exists for. |
|
|
21
|
+
* | **Backoff on failure** | A failed refresh stamps the next attempt one lease ahead rather than retrying per event. A broken repository must not turn into a read storm that scales with audit volume. |
|
|
22
|
+
* | **LRU, not FIFO, eviction** | The evicted entry is the least recently USED. The previous FIFO block (labelled "simple LRU approximation", which it was not) evicted by insertion order, so the busiest organization β inserted first, refreshed in place, never re-inserted β was the first one thrown out and forced back onto a blocking cold read. |
|
|
23
|
+
*
|
|
24
|
+
* ## What it deliberately does NOT do
|
|
25
|
+
*
|
|
26
|
+
* - **It does not live in a shared store.** Putting the VALUE in Redis would make routing depend on a
|
|
27
|
+
* store that can be unavailable, and would put a network round trip on the emission path. Cross-replica
|
|
28
|
+
* convergence is carried instead by a published invalidation (see the dispatcher's
|
|
29
|
+
* `_publishSiemConfigInvalidation`) plus the lease β neither of which the emission path touches.
|
|
30
|
+
* - **It does not expire entries out of the map.** An entry is refreshed in place, never dropped on age,
|
|
31
|
+
* so a warm organization never pays a blocking read again. Only {@link invalidate} and LRU pressure
|
|
32
|
+
* remove an entry.
|
|
33
|
+
* - **It caches negative results.** `null` / `undefined` is a value like any other. The alternative β
|
|
34
|
+
* re-reading on every event for a key with no row β is unbounded read amplification precisely for the
|
|
35
|
+
* keys that are cheapest to get wrong, and it is the shape the org-name cache had before this.
|
|
36
|
+
*
|
|
37
|
+
* ## Precondition on the loader, which is a real constraint and not boilerplate
|
|
38
|
+
*
|
|
39
|
+
* A caller that JOINS an in-flight load receives the value **the first caller's loader produced**. So
|
|
40
|
+
* every loader passed for one key must be equally privileged: a per-request loader whose visibility
|
|
41
|
+
* varies with the caller would leak one caller's view to another. Both current call sites satisfy this
|
|
42
|
+
* because the execution context they close over is the audit service's freshly-synthesised super-admin
|
|
43
|
+
* APPLICATION-scoped temp context (`audit-logs.backend.service.ts:284`, handed to the dispatcher at
|
|
44
|
+
* `:349`) β identical in privilege for every dispatch. **State the equivalent before adding a third.**
|
|
45
|
+
*/
|
|
46
|
+
/** Construction options. `refreshAfterMs` is the guarantee the owning subsystem states publicly β see each call site. */
|
|
47
|
+
export interface LeasedValueCacheOptions {
|
|
48
|
+
/** How long a value is served without a re-read. The convergence bound for any change no invalidation reaches. */
|
|
49
|
+
readonly refreshAfterMs: number;
|
|
50
|
+
/** Hard ceiling on resident keys; the least recently used is evicted on overflow. */
|
|
51
|
+
readonly maxEntries: number;
|
|
52
|
+
/**
|
|
53
|
+
* Reported when a BACKGROUND refresh throws. The cache keeps serving the previous value and backs off
|
|
54
|
+
* one lease. Optional, but omitting it makes a persistently unreadable source silent, which is the
|
|
55
|
+
* failure this whole subsystem exists to make visible β pass one.
|
|
56
|
+
*/
|
|
57
|
+
readonly onRefreshFailure?: (key: string, error: unknown) => void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A per-key leased cache. See the module header for the design and its constraints.
|
|
61
|
+
*
|
|
62
|
+
* @typeParam T The cached value. Nullable members are cached like any other value, deliberately.
|
|
63
|
+
*/
|
|
64
|
+
export declare class LeasedValueCache<T> {
|
|
65
|
+
private readonly options;
|
|
66
|
+
private readonly entries;
|
|
67
|
+
/** In-flight loads/refreshes, keyed identically. Present β a read is already on the wire for that key. */
|
|
68
|
+
private readonly inFlight;
|
|
69
|
+
/** Monotonic per-key generation. A key absent here has never been invalidated. */
|
|
70
|
+
private readonly generations;
|
|
71
|
+
constructor(options: LeasedValueCacheOptions);
|
|
72
|
+
/**
|
|
73
|
+
* Serve `key`, loading it when there is nothing to serve.
|
|
74
|
+
*
|
|
75
|
+
* Rejects ONLY when a COLD load rejects β there is no cached value to fall back to, so the caller has
|
|
76
|
+
* to decide. Once a value exists this never rejects and never blocks: a stale entry is returned as it
|
|
77
|
+
* stands and the refresh runs detached.
|
|
78
|
+
*
|
|
79
|
+
* @param load Reads the current value. Must satisfy the loader precondition in the module header.
|
|
80
|
+
*/
|
|
81
|
+
get(key: string, load: () => Promise<T>): Promise<T>;
|
|
82
|
+
/**
|
|
83
|
+
* Drop `key`, so the next {@link get} performs a blocking read.
|
|
84
|
+
*
|
|
85
|
+
* Synchronous, infallible and idempotent β a caller needs no error handling, which is why the write-path
|
|
86
|
+
* hook can invoke it inside a postfix handler without a try/catch.
|
|
87
|
+
*
|
|
88
|
+
* Bumping the generation is the load-bearing half: it makes any refresh already on the wire discard its
|
|
89
|
+
* result instead of writing the pre-invalidation value back. Deleting the entry alone would leave the
|
|
90
|
+
* invalidation defeated by a read that started microseconds earlier.
|
|
91
|
+
*/
|
|
92
|
+
invalidate(key: string): void;
|
|
93
|
+
/** Resident key count. A test and diagnostics seam; nothing branches on it in production. */
|
|
94
|
+
size(): number;
|
|
95
|
+
/** Drop everything, including generation history. Test isolation only. */
|
|
96
|
+
clear(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Await every load currently on the wire.
|
|
99
|
+
*
|
|
100
|
+
* A TEST seam: stale-while-revalidate means a refresh outlives the `get` that started it, so a pin that
|
|
101
|
+
* asserts on the refreshed value has no other deterministic join point. Never called from production
|
|
102
|
+
* code β production must never wait for a refresh, which is the entire point of the design.
|
|
103
|
+
*/
|
|
104
|
+
settle(): Promise<void>;
|
|
105
|
+
/** Start (or join) the single in-flight read for `key`, writing the result back under generation guard. */
|
|
106
|
+
private startLoad;
|
|
107
|
+
/** Insert or replace, evicting the least recently used key first when at capacity. */
|
|
108
|
+
private store;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=leased-value-cache.backend.utils.d.ts.map
|
package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leased-value-cache.backend.utils.d.ts","sourceRoot":"","sources":["../../../../../../../src/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AASH,yHAAyH;AACzH,MAAM,WAAW,uBAAuB;IACtC,kHAAkH;IAClH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,qFAAqF;IACrF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACnE;AAED;;;;GAIG;AACH,qBAAa,gBAAgB,CAAC,CAAC;IAOjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,0GAA0G;IAC1G,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,kFAAkF;IAClF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;gBAE5B,OAAO,EAAE,uBAAuB;IAE7D;;;;;;;;OAQG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA+BjE;;;;;;;;;OASG;IACI,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKpC,6FAA6F;IACtF,IAAI,IAAI,MAAM;IAIrB,0EAA0E;IACnE,KAAK,IAAI,IAAI;IAMpB;;;;;;OAMG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAMpC,2GAA2G;IAC3G,OAAO,CAAC,SAAS;IAsCjB,sFAAsF;IACtF,OAAO,CAAC,KAAK;CAqBd"}
|