@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/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing-webhook-event-router.backend.service.js","sourceRoot":"","sources":["../../../../../../src/billing/services/webhooks/billing-webhook-event-router.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Billing Webhook Event Router\n *\n * Routes incoming billing webhook events to the appropriate resource operations\n * on the correct polymorphic variants. Replaces the orchestrator's\n * handleProviderWebhook() dispatch.\n *\n * Flow:\n * BillingWebhookCapabilityHandler → routeEvent()\n * → resolveBillingVariants(execCtx) → deterministic variant derivation from scope\n * → per-event handler → servicesRegistry.create/update/list on variant\n * → feature sync where needed → via late-bound featureSyncService\n *\n * Uses the WEBHOOK_CALLBACK execution context from polymorphic scope resolution\n * (no internalCtx()). The context's operation (APPLICATION.READ) differs from the\n * target operations (SUBSCRIPTION.CREATE, etc.), but this is safe: doOperation()\n * corrects executionContext.operation to match the actual operation before any\n * pipeline logic (notifications, guidance, milestones) runs.\n *\n * @see billing-polymorphic-full-implementation.md §4.5\n */\n\nimport {\n type Product,\n type CreditPool,\n type BillingAccount,\n type BillingSubscriptionBase,\n CoreResourceType,\n CoreWebSocketEvent,\n ResourcePrimaryScope,\n SubscriptionStatus,\n ProductType,\n CreditPool_Operations,\n CoreResourceOperation,\n deriveTrustedSystemWritePreservedFields,\n} from '@wildo-ai/saas-models';\nimport type { ResourceType } from '@wildo-ai/saas-models';\nimport type {\n StandardBilling_WebhookEvent,\n StandardBilling_SubscriptionData,\n} from '@wildo-ai/external-connectors-models';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport type { ServicesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/services/services-registry-handler.backend.service';\nimport type { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport type { ServiceOptions } from '~wildo-backend-lib/base-classes/models/repositories.backend.schemas';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { WebSocketService } from '~wildo-backend-lib/requests/service/websocket.service';\nimport { getBillingProvider, getFeatureSyncService } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-implementations.backend';\nimport { type BillingResolvedVariants, resolveBillingVariants } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-impl-utils.backend';\nimport {\n BillingAccountEchoVerdict,\n BillingCheckoutMetadataOutcomeKind,\n compareEchoedBillingAccount,\n resolveCheckoutSessionMetadata,\n} from '~wildo-backend-lib/billing/services/billing-checkout-metadata.backend.utils';\n\n// ── Provider Status Mapping ─────────────────────────────────────────\n\nconst PROVIDER_STATUS_MAP: Record<string, SubscriptionStatus> = {\n active: SubscriptionStatus.ACTIVE,\n trialing: SubscriptionStatus.TRIALING,\n past_due: SubscriptionStatus.PAST_DUE,\n canceled: SubscriptionStatus.CANCELLED,\n cancelled: SubscriptionStatus.CANCELLED,\n unpaid: SubscriptionStatus.UNPAID,\n incomplete: SubscriptionStatus.INCOMPLETE,\n incomplete_expired: SubscriptionStatus.INCOMPLETE_EXPIRED,\n paused: SubscriptionStatus.PAUSED,\n};\n\nfunction mapProviderStatus(providerStatus: string): SubscriptionStatus {\n return PROVIDER_STATUS_MAP[providerStatus] ?? SubscriptionStatus.INCOMPLETE;\n}\n\n// ── Router ──────────────────────────────────────────────────────────\n\nexport class BillingWebhookEventRouterBackendService {\n /**\n * In-memory dedup guard for checkout sessions.\n * Prevents double top-ups on webhook retries within the same process.\n * Capped to prevent unbounded memory growth; oldest entries evicted on overflow.\n *\n * Limitation: process-local only — does not protect against retries delivered\n * to different instances in a multi-instance deployment. For production hardening,\n * replace with a shared store (Redis SET with TTL or MongoDB dedup collection).\n */\n private readonly processedCheckoutSessions = new Set<string>();\n private static readonly MAX_DEDUP_ENTRIES = 10_000;\n\n constructor(\n private readonly servicesRegistry: ServicesRegistryHandlerBackendService,\n private readonly resourcesRegistry: ResourcesRegistryBackendService,\n private readonly logger?: LoggerService,\n private readonly webSocketService?: WebSocketService,\n ) {}\n\n private log(level: 'debug' | 'warn' | 'error', message: string, context?: Record<string, unknown>): void {\n if (!this.logger) return;\n this.logger[level](`[BillingWebhookRouter] ${message}`, context);\n }\n\n /**\n * Write options for a webhook-driven resource write — re-attaches the fields the\n * client-shaped request DTO would otherwise silently DROP.\n *\n * ## Why every write here needs this\n *\n * The repository strict-parses every create/update against the operation's `requestDto`\n * (`RepositoriesRegistryHandlerBackendService.validateRequestData`), which removes\n * `.isBackendOnly()` fields — they must never arrive from an HTTP client. A webhook handler is\n * not an HTTP client: the provider ids ARE the payload's reason to exist, and they are exactly\n * the fields the strip removes.\n *\n * Without this, `providerInvoiceId` and `providerSubscriptionId` never reached the database.\n * Both are the lookup key their own handler uses to find an existing row\n * ({@link handleInvoiceEvent} upserts on `providerInvoiceId`,\n * {@link findSubscriptionByProviderId} on `providerSubscriptionId`), so the loss was\n * self-concealing: the row was written without the key, the next event could not find it, and\n * the retained financial record lost the only local mapping back to the provider.\n *\n * This is the same class of defect already fixed on the billing-ACCOUNT side, where\n * `providerCustomerId` survives only because a custom-implementation CREATE prefix injects it\n * and the framework auto-preserves prefix-injected fields. The webhook writes have no prefix.\n *\n * ## Why derived rather than a hardcoded list\n *\n * {@link deriveTrustedSystemWritePreservedFields} returns exactly the subset of the payload's\n * OWN keys that the strip would drop for a legitimate reason. A literal list would silently stop\n * covering a field the day someone adds one — the failure mode that produced this bug. Applied\n * uniformly to every write below (it returns an empty list when nothing needs re-attaching), so\n * a future backend-only field is covered without touching the call sites.\n *\n * ## Safety\n *\n * `deriveTrustedSystemWritePreservedFields` carries an anti-smuggling contract: never use it to\n * re-attach fields from an untrusted request. That holds here because the derivation runs over\n * the keys of a payload this file CONSTRUCTS from named literals — a provider event's contents\n * can supply values, never new keys — and because the webhook payload is signature-verified\n * upstream before any handler runs.\n *\n * The execution context is deliberately left alone. Routing these writes through\n * `createAsSystem`/`updateAsSystem` (which derive the same set internally) would additionally\n * swap the webhook's scoped context for a synthesised super-admin one, changing which scope FK\n * `enrichDataWithContext` injects. That convergence is worth doing, but it is a scope-semantics\n * change and not this fix.\n */\n private trustedWriteOptions(\n resourceType: ResourceType,\n payload: Record<string, unknown>,\n verb: CoreResourceOperation.CREATE | CoreResourceOperation.UPDATE,\n ): ServiceOptions {\n const { mainSchema } = this.resourcesRegistry.getResourceConfiguration(resourceType);\n return {\n preserveServerInjectedFields: deriveTrustedSystemWritePreservedFields(\n mainSchema,\n Object.keys(payload),\n verb,\n ),\n };\n }\n\n /**\n * Route a billing webhook event to the appropriate resource operation.\n */\n async routeEvent(\n event: StandardBilling_WebhookEvent,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const eventType = event.type as string;\n\n // APPLICATION-scoped events (product/price catalog events) have no entity scope.\n // They are handled by the product catalog sync service, not here.\n const variants = resolveBillingVariants(execCtx);\n if (!variants) {\n this.log('debug', 'No entity scope on execution context — skipping (APPLICATION-scoped event)', { eventType });\n return;\n }\n\n this.log('debug', 'Routing webhook event', { eventType, scope: variants.scopeKey, eventId: event.providerEventId });\n\n switch (eventType) {\n case 'subscription.created':\n await this.handleSubscriptionCreated(event, variants, execCtx);\n break;\n case 'subscription.updated':\n await this.handleSubscriptionUpdated(event, variants, execCtx);\n break;\n case 'subscription.deleted':\n await this.handleSubscriptionDeleted(event, variants, execCtx);\n break;\n case 'subscription.trial_will_end':\n this.log('debug', 'Trial will end notification (no-op)', { eventId: event.providerEventId });\n break;\n case 'invoice.paid':\n await this.handleInvoiceEvent(event, variants, execCtx, 'paid');\n break;\n case 'invoice.finalized':\n await this.handleInvoiceEvent(event, variants, execCtx, 'open');\n break;\n case 'invoice.payment_failed':\n await this.handleInvoiceEvent(event, variants, execCtx, 'failed');\n break;\n case 'checkout.session.completed':\n await this.handleCheckoutCompleted(event, variants, execCtx);\n break;\n case 'customer.updated':\n this.log('debug', 'Customer updated on provider (no local action)', { eventId: event.providerEventId });\n break;\n case 'customer.deleted':\n await this.handleCustomerDeleted(event, variants, execCtx);\n break;\n case 'coupon.created':\n case 'coupon.updated':\n case 'coupon.deleted':\n this.log('debug', 'Coupon event (coupons managed via Wildo promotion system)', { eventType, eventId: event.providerEventId });\n break;\n case 'customer.discount.created':\n case 'customer.discount.updated':\n case 'customer.discount.deleted':\n await this.handleCustomerDiscountEvent(event, variants, execCtx);\n break;\n case 'payment_method.attached':\n case 'payment_method.detached':\n this.log('debug', 'Payment method event (no local action)', { eventType });\n break;\n default:\n this.log('debug', 'Unknown webhook event type', { eventType });\n break;\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Subscription Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * SUBSCRIPTION_CREATED: Retrieve full sub data from provider, create local record.\n */\n private async handleSubscriptionCreated(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerSubscriptionId = data.id as string;\n if (!providerSubscriptionId) return;\n\n // Check if subscription already exists (idempotency)\n const existing = await this.findSubscriptionByProviderId(variants.subscription, execCtx, providerSubscriptionId);\n if (existing) {\n this.log('debug', 'Subscription already exists — syncing from provider', { providerSubscriptionId });\n await this.syncSubscriptionFromProvider(variants, execCtx, existing._id, providerSubscriptionId);\n // Feature sync fires automatically via post-operation hook on subscription update\n return;\n }\n\n // Resolve the billing account from PROVIDER-AUTHORITATIVE data (the customer on the event),\n // never from the event's metadata. This used to read `metadata.billingAccountId` FIRST and fall\n // back to the customer lookup — which made an echoed, caller-influenced value the primary source\n // for the FK that decides whose subscription (and therefore whose entitlements) this becomes.\n // The metadata value is now only ever a cross-check; see `billing-checkout-metadata.backend.utils.ts`.\n const metadata = data.metadata as Record<string, string> | undefined;\n const billingAccountId = await this.resolveBillingAccountId(variants, execCtx, data.customer as string);\n\n if (!billingAccountId) {\n this.log('warn', 'Cannot resolve billing account for subscription.created', { providerSubscriptionId });\n return;\n }\n\n const echo = compareEchoedBillingAccount(metadata, billingAccountId);\n if (echo.verdict === BillingAccountEchoVerdict.MISMATCHED) {\n this.log('error', 'Refusing subscription.created: echoed billing account disagrees with the provider customer', {\n providerSubscriptionId,\n declaredBillingAccountId: echo.declaredBillingAccountId,\n authoritativeBillingAccountId: billingAccountId,\n });\n return;\n }\n\n // Retrieve authoritative subscription data from provider\n const provider = getBillingProvider();\n const providerData = await provider.retrieveSubscription(providerSubscriptionId);\n\n // Resolve provider items to local product/price IDs\n const items = await this.resolveSubscriptionItems(providerData, providerSubscriptionId, execCtx);\n\n if (items.length === 0) {\n this.log('warn', 'Subscription has no resolvable items — skipping creation (product/price catalog may not be synced yet)', {\n providerSubscriptionId, billingAccountId,\n });\n return;\n }\n\n // Create local subscription\n const createData: Record<string, unknown> = {\n [variants.billingAccountFkField]: billingAccountId,\n providerSubscriptionId,\n status: mapProviderStatus(providerData.status as string),\n items,\n currentPeriodStart: providerData.currentPeriodStart,\n currentPeriodEnd: providerData.currentPeriodEnd,\n cancelAtPeriodEnd: providerData.cancelAtPeriodEnd,\n ...(providerData.discount ? {\n discount: {\n providerCouponId: providerData.discount.providerCouponId,\n percentOff: providerData.discount.percentOff,\n amountOff: providerData.discount.amountOff,\n currency: providerData.discount.currency,\n duration: providerData.discount.duration,\n durationInMonths: providerData.discount.durationInMonths,\n end: providerData.discount.end,\n },\n } : {}),\n };\n\n await this.servicesRegistry.create(\n variants.subscription, execCtx, createData,\n this.trustedWriteOptions(variants.subscription, createData, CoreResourceOperation.CREATE),\n );\n this.log('debug', 'Subscription created from webhook', { providerSubscriptionId, billingAccountId });\n // Feature sync fires automatically via post-operation hook on subscription create\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_SUBSCRIPTION_UPDATED, variants, billingAccountId, execCtx);\n }\n\n /**\n * SUBSCRIPTION_UPDATED: Find local sub, sync status/period from provider.\n * Items are NOT synced from webhooks — they are set at creation time and\n * maintained through explicit plan change operations.\n */\n private async handleSubscriptionUpdated(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerSubscriptionId = data.id as string;\n if (!providerSubscriptionId) return;\n\n const localSub = await this.findSubscriptionByProviderId(variants.subscription, execCtx, providerSubscriptionId);\n if (!localSub) {\n this.log('warn', 'Subscription not found for update webhook', { providerSubscriptionId });\n return;\n }\n\n await this.syncSubscriptionFromProvider(variants, execCtx, localSub._id, providerSubscriptionId);\n // Feature sync fires automatically via post-operation hook on subscription update\n const updatedBillingAccountId = localSub[variants.billingAccountFkField] as string;\n if (updatedBillingAccountId) {\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_SUBSCRIPTION_UPDATED, variants, updatedBillingAccountId, execCtx);\n }\n }\n\n /**\n * SUBSCRIPTION_DELETED: Mark as cancelled.\n */\n private async handleSubscriptionDeleted(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerSubscriptionId = data.id as string;\n if (!providerSubscriptionId) return;\n\n const localSub = await this.findSubscriptionByProviderId(variants.subscription, execCtx, providerSubscriptionId);\n if (!localSub) return;\n\n const cancelData: Record<string, unknown> = {\n status: SubscriptionStatus.CANCELLED,\n cancelledAt: new Date(),\n };\n await this.servicesRegistry.update(\n variants.subscription, execCtx, localSub._id, cancelData,\n this.trustedWriteOptions(variants.subscription, cancelData, CoreResourceOperation.UPDATE),\n );\n\n this.log('debug', 'Subscription marked as cancelled from webhook', { providerSubscriptionId });\n // Feature sync fires automatically via post-operation hook on subscription update\n const deletedBillingAccountId = localSub[variants.billingAccountFkField] as string;\n if (deletedBillingAccountId) {\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_SUBSCRIPTION_UPDATED, variants, deletedBillingAccountId, execCtx);\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Invoice Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * INVOICE_PAID / INVOICE_FINALIZED / INVOICE_PAYMENT_FAILED: Upsert invoice ref.\n */\n private async handleInvoiceEvent(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n outcome: 'paid' | 'open' | 'failed',\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerInvoiceId = data.id as string;\n const providerCustomerId = data.customer as string;\n if (!providerInvoiceId || !providerCustomerId) return;\n\n // Re-lookup billing account to get its _id\n const billingAccountId = await this.resolveBillingAccountId(variants, execCtx, providerCustomerId);\n if (!billingAccountId) {\n this.log('warn', 'Cannot resolve billing account for invoice event', { providerInvoiceId, providerCustomerId });\n return;\n }\n\n // Map outcome to invoice status — 'failed' is not a valid InvoiceStatus, map to uncollectible\n const invoiceStatus = outcome === 'failed' ? 'uncollectible' : outcome;\n\n // Convert provider amount to MoneyValue\n const rawAmount = data.amount_paid ?? data.total ?? 0;\n const amountInCents = typeof rawAmount === 'string' ? parseInt(rawAmount, 10) || 0 : Number(rawAmount) || 0;\n const currency = (data.currency as string) ?? 'usd';\n\n const invoiceData: Record<string, unknown> = {\n [variants.billingAccountFkField]: billingAccountId,\n providerInvoiceId,\n status: invoiceStatus,\n total: {\n amount: BigInt(amountInCents),\n currency,\n decimals: 2,\n },\n hostedInvoiceUrl: data.hosted_invoice_url as string | undefined,\n invoicePdfUrl: data.invoice_pdf as string | undefined,\n };\n\n // Upsert: LIST by providerInvoiceId → CREATE or UPDATE\n const existingInvoices = await this.servicesRegistry.list<{ _id: string }>(\n variants.invoiceRef, execCtx, { providerInvoiceId },\n ) as Array<{ _id: string }>;\n\n if (existingInvoices.length > 0) {\n await this.servicesRegistry.update(\n variants.invoiceRef, execCtx, existingInvoices[0]._id, invoiceData,\n this.trustedWriteOptions(variants.invoiceRef, invoiceData, CoreResourceOperation.UPDATE),\n );\n } else {\n await this.servicesRegistry.create(\n variants.invoiceRef, execCtx, invoiceData,\n this.trustedWriteOptions(variants.invoiceRef, invoiceData, CoreResourceOperation.CREATE),\n );\n }\n\n this.log('debug', 'Invoice ref upserted', { providerInvoiceId, outcome });\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Checkout Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * CHECKOUT_SESSION_COMPLETED: Handle credit pack top-ups.\n * For subscription products, SUBSCRIPTION_CREATED handles the subscription creation.\n *\n * ## This handler mints credits from provider-echoed metadata — treat that metadata as hostile\n *\n * The provider replays the checkout session's `metadata` map verbatim inside a GENUINELY SIGNED\n * event. The signature proves the provider sent it; it says nothing about who wrote it, and the\n * producing operation (`OPEN_CHECKOUT`) accepts caller-supplied metadata. This handler previously\n * read `metadata.billingAccountId` and `metadata.quantity` straight out of that map and called\n * `CreditPool_Operations.TOP_UP` with the result, which made a caller-controlled record the input\n * to a credit grant.\n *\n * Two rules now hold, and both are enforced in `billing-checkout-metadata.backend.utils.ts` rather\n * than inline, so a future handler cannot half-apply them:\n * - the account credited is derived from the event's provider CUSTOMER, exactly as\n * {@link handleInvoiceEvent} already did; the echoed account id can only agree or refuse;\n * - the quantity is strictly parsed and bounded. The previous expression\n * `(metadata.quantity ? Number(metadata.quantity) : undefined) ?? 1` yielded `NaN` for `\"abc\"`\n * (the `?? 1` fallback is dead — `NaN` is not nullish), `-5` for `\"-5\"`, and 1e9 for `\"1e9\"`.\n */\n private async handleCheckoutCompleted(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n // Idempotency: skip if this checkout session was already processed (webhook retry)\n const checkoutSessionId = (event.data as Record<string, unknown>).id as string | undefined;\n const dedupKey = checkoutSessionId ?? event.providerEventId;\n if (dedupKey && this.processedCheckoutSessions.has(dedupKey)) {\n this.log('debug', 'Skipping duplicate checkout.session.completed', { dedupKey });\n return;\n }\n\n const data = event.data as Record<string, unknown>;\n\n // Provider truth first: whose customer actually paid. Scope resolution already matched this\n // customer to a billing-account row (otherwise the event would have degraded to APPLICATION\n // scope and `routeEvent` would have returned before reaching any handler), so this lookup is\n // the same one that admitted the event — it is not an extra failure mode.\n const billingAccountId = await this.resolveBillingAccountId(variants, execCtx, data.customer as string);\n if (!billingAccountId) {\n this.log('warn', 'Cannot resolve billing account for checkout.session.completed', {\n dedupKey, providerCustomerId: data.customer,\n });\n return;\n }\n\n const outcome = resolveCheckoutSessionMetadata(data.metadata as Record<string, string> | undefined, billingAccountId);\n if (outcome.kind === BillingCheckoutMetadataOutcomeKind.NOT_FRAMEWORK_ORIGINATED) {\n // An ordinary session the framework did not open (provider dashboard, another integration).\n // Nothing to grant, and nothing suspicious about it.\n this.log('debug', 'Checkout completed without framework checkout metadata — nothing to grant', { dedupKey });\n return;\n }\n if (outcome.kind === BillingCheckoutMetadataOutcomeKind.REFUSED) {\n // A session that CLAIMS to be ours and is internally inconsistent. Distinct from the case\n // above on purpose: this is a tamper signal and must be loud, not a debug skip. Not marked as\n // deduplicated either — a refusal granted nothing, so a retry re-evaluates it.\n this.log('error', 'Refusing checkout.session.completed: framework metadata failed validation', {\n dedupKey, reason: outcome.reason, ...outcome.detail,\n });\n return;\n }\n\n const { productKey, quantity } = outcome;\n\n // Read product to check if it's a CREDIT_PACK\n const products = await this.servicesRegistry.list<Product>(\n CoreResourceType.PRODUCTS, execCtx, { key: productKey },\n ) as Product[];\n const product = products.length > 0 ? products[0] : null;\n\n if (product?.type === ProductType.CREDIT_PACK && product.purchaseConfig?.creditPoolKey) {\n const credits = (product.purchaseConfig.creditsPerUnit ?? 1) * quantity;\n const poolKey = product.purchaseConfig.creditPoolKey;\n\n // Find the credit pool, auto-create if first purchase\n let pools = await this.servicesRegistry.list<CreditPool>(\n variants.creditPool, execCtx,\n { [variants.billingAccountFkField]: billingAccountId, poolKey },\n ) as CreditPool[];\n\n if (pools.length === 0) {\n this.log('debug', 'Credit pool not found — auto-creating', { billingAccountId, poolKey });\n const poolData: Record<string, unknown> = {\n [variants.billingAccountFkField]: billingAccountId, poolKey, available: 0, totalPurchased: 0, totalConsumed: 0,\n };\n const created = await this.servicesRegistry.create(\n variants.creditPool, execCtx, poolData,\n this.trustedWriteOptions(variants.creditPool, poolData, CoreResourceOperation.CREATE),\n );\n if (created) {\n pools = [created as CreditPool];\n }\n }\n\n if (pools.length > 0) {\n const pool = pools[0];\n await this.servicesRegistry.executeCustomOperation(\n variants.creditPool,\n CreditPool_Operations.TOP_UP,\n execCtx,\n pool._id,\n { credits },\n );\n this.log('debug', 'Credit pack top-up completed via pipeline', {\n billingAccountId, poolKey, credits,\n });\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_CREDIT_POOL_UPDATED, variants, billingAccountId, execCtx);\n } else {\n this.log('error', 'Failed to auto-create credit pool for top-up', {\n billingAccountId, poolKey,\n });\n }\n }\n\n // Mark as processed for dedup\n if (dedupKey) {\n if (this.processedCheckoutSessions.size >= BillingWebhookEventRouterBackendService.MAX_DEDUP_ENTRIES) {\n const first = this.processedCheckoutSessions.values().next().value;\n if (first !== undefined) this.processedCheckoutSessions.delete(first);\n }\n this.processedCheckoutSessions.add(dedupKey);\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Customer Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * CUSTOMER_DELETED: Deactivate billing account, trigger feature sync.\n */\n private async handleCustomerDeleted(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerCustomerId = data.id as string;\n if (!providerCustomerId) return;\n\n // Find billing account by providerCustomerId in the derived variant\n const billingAccounts = await this.servicesRegistry.list<{ _id: string }>(\n variants.billingAccount, execCtx, { providerCustomerId },\n ) as Array<{ _id: string }>;\n\n if (billingAccounts.length === 0) {\n this.log('warn', 'Billing account not found for customer.deleted', { providerCustomerId });\n return;\n }\n\n const billingAccount = billingAccounts[0];\n const deactivateData: Record<string, unknown> = { isActive: false };\n await this.servicesRegistry.update(\n variants.billingAccount, execCtx, billingAccount._id, deactivateData,\n this.trustedWriteOptions(variants.billingAccount, deactivateData, CoreResourceOperation.UPDATE),\n );\n\n this.log('debug', 'Billing account deactivated from customer.deleted', { providerCustomerId });\n\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_ACCOUNT_CHANGED, variants, billingAccount._id, execCtx);\n\n // Remove all billing-derived features\n await this.safeFeatureSync(billingAccount._id, variants);\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Customer Discount Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * CUSTOMER_DISCOUNT_CREATED/UPDATED/DELETED: Re-sync the affected subscription\n * to pick up discount changes from the provider. The subscription.updated webhook\n * usually fires alongside these events, but this handler provides a safety net.\n */\n private async handleCustomerDiscountEvent(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const subscription = data.subscription as string | undefined;\n\n if (!subscription) {\n this.log('debug', 'Customer discount event without subscription reference', { eventType: event.type });\n return;\n }\n\n const localSub = await this.findSubscriptionByProviderId(variants.subscription, execCtx, subscription);\n if (!localSub) {\n this.log('debug', 'Subscription not found for discount event', { providerSubscriptionId: subscription });\n return;\n }\n\n await this.syncSubscriptionFromProvider(variants, execCtx, localSub._id, subscription);\n this.log('debug', 'Subscription re-synced after discount event', { eventType: event.type, providerSubscriptionId: subscription });\n\n const billingAccountId = localSub[variants.billingAccountFkField] as string;\n if (billingAccountId) {\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_SUBSCRIPTION_UPDATED, variants, billingAccountId, execCtx);\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Helpers\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Find a subscription by providerSubscriptionId in a specific variant collection.\n */\n private async findSubscriptionByProviderId(\n subscriptionVariant: string,\n execCtx: ExecutionContext<any>,\n providerSubscriptionId: string,\n ): Promise<(BillingSubscriptionBase & Record<string, unknown>) | null> {\n try {\n const items = await this.servicesRegistry.list<BillingSubscriptionBase>(\n subscriptionVariant, execCtx, { providerSubscriptionId },\n ) as Array<BillingSubscriptionBase & Record<string, unknown>>;\n return items.length > 0 ? items[0] : null;\n } catch (error) {\n this.log('error', 'Failed to find subscription by provider ID', {\n providerSubscriptionId, error: (error as Error).message,\n });\n return null;\n }\n }\n\n /**\n * Resolve billing account _id by providerCustomerId in the derived variant.\n * One scoped query — not a full polymorphic lookup.\n */\n private async resolveBillingAccountId(\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n providerCustomerId: string,\n ): Promise<string | null> {\n if (!providerCustomerId) return null;\n try {\n const accounts = await this.servicesRegistry.list<{ _id: string }>(\n variants.billingAccount, execCtx, { providerCustomerId },\n ) as Array<{ _id: string }>;\n return accounts.length > 0 ? accounts[0]._id : null;\n } catch (error) {\n this.log('error', 'Failed to resolve billing account by provider customer ID', {\n providerCustomerId, error: (error as Error).message,\n });\n return null;\n }\n }\n\n /**\n * Sync a local subscription's status and period from the authoritative provider state.\n * Items are NOT synced — they are set at creation time and maintained through\n * explicit plan change operations (CHANGE_PLAN, ADD_ADDON, REMOVE_ADDON).\n */\n private async syncSubscriptionFromProvider(\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n localSubId: string,\n providerSubscriptionId: string,\n ): Promise<void> {\n const provider = getBillingProvider();\n const providerData = await provider.retrieveSubscription(providerSubscriptionId);\n\n const updateData: Record<string, unknown> = {\n status: mapProviderStatus(providerData.status as string),\n currentPeriodStart: providerData.currentPeriodStart,\n currentPeriodEnd: providerData.currentPeriodEnd,\n cancelAtPeriodEnd: providerData.cancelAtPeriodEnd,\n };\n\n if (providerData.discount) {\n updateData.discount = {\n providerCouponId: providerData.discount.providerCouponId,\n percentOff: providerData.discount.percentOff,\n amountOff: providerData.discount.amountOff,\n currency: providerData.discount.currency,\n duration: providerData.discount.duration,\n durationInMonths: providerData.discount.durationInMonths,\n end: providerData.discount.end,\n };\n } else {\n updateData.discount = null;\n }\n\n await this.servicesRegistry.update(\n variants.subscription, execCtx, localSubId, updateData,\n this.trustedWriteOptions(variants.subscription, updateData, CoreResourceOperation.UPDATE),\n );\n }\n\n /**\n * Resolve provider subscription items to local schema format.\n * Each item must have a local `_id`, `productId`, `priceId` resolved\n * from the provider's product/price IDs via the synced catalog.\n */\n private async resolveSubscriptionItems(\n providerData: StandardBilling_SubscriptionData,\n providerSubscriptionId: string,\n execCtx: ExecutionContext<any>,\n ): Promise<Array<{ _id: string; productId: string; priceId: string; quantity: number; providerSubscriptionItemId?: string }>> {\n const items: Array<{ _id: string; productId: string; priceId: string; quantity: number; providerSubscriptionItemId?: string }> = [];\n\n for (let i = 0; i < (providerData.items ?? []).length; i++) {\n const providerItem = providerData.items[i];\n\n // Resolve local product by providerProductId\n let productId: string | undefined;\n try {\n const products = await this.servicesRegistry.list<{ _id: string }>(\n CoreResourceType.PRODUCTS, execCtx, { providerProductId: providerItem.providerProductId },\n ) as Array<{ _id: string }>;\n productId = products.length > 0 ? products[0]._id : undefined;\n } catch {\n this.log('warn', 'Failed to resolve product from provider ID', {\n providerProductId: providerItem.providerProductId, providerSubscriptionId,\n });\n }\n\n // Resolve local price by providerPriceId\n let priceId: string | undefined;\n try {\n const prices = await this.servicesRegistry.list<{ _id: string }>(\n CoreResourceType.PRICES, execCtx, { providerPriceId: providerItem.providerPriceId },\n ) as Array<{ _id: string }>;\n priceId = prices.length > 0 ? prices[0]._id : undefined;\n } catch {\n this.log('warn', 'Failed to resolve price from provider ID', {\n providerPriceId: providerItem.providerPriceId, providerSubscriptionId,\n });\n }\n\n if (productId && priceId) {\n const itemIdSuffix = providerItem.providerSubscriptionItemId ?? `idx_${i}`;\n items.push({\n _id: `${providerSubscriptionId}_${itemIdSuffix}`,\n productId,\n priceId,\n quantity: providerItem.quantity,\n providerSubscriptionItemId: providerItem.providerSubscriptionItemId,\n });\n } else {\n this.log('warn', 'Skipping subscription item — could not resolve local product/price', {\n index: i, providerSubscriptionId,\n providerProductId: providerItem.providerProductId,\n providerPriceId: providerItem.providerPriceId,\n });\n }\n }\n\n return items;\n }\n\n /**\n * Trigger feature sync, catching errors silently.\n * Passes variant context so feature sync queries the correct polymorphic collections.\n */\n private async safeFeatureSync(billingAccountId: string, variants: BillingResolvedVariants): Promise<void> {\n try {\n const featureSyncService = getFeatureSyncService();\n await featureSyncService.onSubscriptionChanged(billingAccountId, variants);\n } catch (error) {\n this.log('error', 'Feature sync failed after billing webhook change', {\n billingAccountId, error: (error as Error).message,\n });\n }\n }\n\n /**\n * Emit a billing WebSocket event for real-time frontend invalidation.\n * Reads the billing account to resolve the scope entity ID,\n * then dispatches to the correct scope room.\n */\n private async emitBillingEvent(\n eventType: CoreWebSocketEvent,\n variants: BillingResolvedVariants,\n billingAccountId: string,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n if (!this.webSocketService) return;\n\n try {\n const accounts = await this.servicesRegistry.list<BillingAccount>(\n variants.billingAccount, execCtx, { _id: billingAccountId },\n ) as BillingAccount[];\n\n const billingAccount = accounts.length > 0 ? accounts[0] : null;\n if (!billingAccount) return;\n\n const scopeEntityId = billingAccount[variants.scopeEntityDocField] as string;\n if (!scopeEntityId) return;\n\n const message = {\n type: eventType,\n payload: { scopeType: variants.scopeType, scopeEntityId, billingAccountId },\n timestamp: new Date(),\n };\n\n switch (variants.scopeType) {\n case ResourcePrimaryScope.ORGANIZATIONS:\n await this.webSocketService.sendToOrganization(scopeEntityId, message);\n break;\n case ResourcePrimaryScope.USER_SELF:\n await this.webSocketService.sendToUser(scopeEntityId, message);\n break;\n }\n\n this.log('debug', 'Billing WebSocket event emitted', { eventType, scopeType: variants.scopeType, scopeEntityId });\n } catch (error) {\n this.log('warn', 'Failed to emit billing WebSocket event', {\n eventType, billingAccountId, error: (error as Error).message,\n });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"billing-webhook-event-router.backend.service.js","sourceRoot":"","sources":["../../../../../../src/billing/services/webhooks/billing-webhook-event-router.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Billing Webhook Event Router\n *\n * Routes incoming billing webhook events to the appropriate resource operations\n * on the correct polymorphic variants. Replaces the orchestrator's\n * handleProviderWebhook() dispatch.\n *\n * Flow:\n * BillingWebhookCapabilityHandler → routeEvent()\n * → resolveBillingVariants(execCtx) → deterministic variant derivation from scope\n * → per-event handler → servicesRegistry.create/update/list on variant\n * → feature sync where needed → via late-bound featureSyncService\n *\n * Uses the WEBHOOK_CALLBACK execution context from polymorphic scope resolution\n * (no internalCtx()). The context's operation (APPLICATION.READ) differs from the\n * target operations (SUBSCRIPTION.CREATE, etc.), but this is safe: doOperation()\n * corrects executionContext.operation to match the actual operation before any\n * pipeline logic (notifications, guidance, milestones) runs.\n *\n * @see billing-polymorphic-full-implementation.md §4.5\n */\n\nimport {\n type Product,\n type CreditPool,\n type BillingAccount,\n type BillingSubscriptionBase,\n CoreResourceType,\n CoreWebSocketEvent,\n ResourcePrimaryScope,\n SubscriptionStatus,\n ProductType,\n CreditPool_Operations,\n CoreResourceOperation,\n ErrorType,\n deriveTrustedSystemWritePreservedFields,\n isWildoBackendError,\n} from '@wildo-ai/saas-models';\nimport { currencyMinorUnitDecimals } from '@wildo-ai/zod-decorators';\nimport type { ResourceType } from '@wildo-ai/saas-models';\nimport type {\n StandardBilling_WebhookEvent,\n StandardBilling_SubscriptionData,\n} from '@wildo-ai/external-connectors-models';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport type { ServicesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/services/services-registry-handler.backend.service';\nimport type { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport type { RepositoriesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/repositories/repositories-registry-handler.backend.service';\nimport type { ServiceOptions } from '~wildo-backend-lib/base-classes/models/repositories.backend.schemas';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { WebSocketService } from '~wildo-backend-lib/requests/service/websocket.service';\nimport { getBillingProvider, getFeatureSyncService } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-implementations.backend';\nimport { type BillingResolvedVariants, resolveBillingVariants } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-impl-utils.backend';\nimport {\n BillingAccountEchoVerdict,\n BillingCheckoutMetadataOutcomeKind,\n compareEchoedBillingAccount,\n resolveCheckoutSessionMetadata,\n} from '~wildo-backend-lib/billing/services/billing-checkout-metadata.backend.utils';\nimport {\n BILLING_PROVIDER_EVENT_SETTLEMENT_CLAIM_LEASE_MS,\n billingProviderEventSettlementId,\n type BillingProviderEventSettlement,\n} from '~wildo-backend-lib/billing/models/billing-provider-event-settlement.backend.schemas';\nimport { BackendResourceType } from '~wildo-backend-lib/resources/models/resources-types.backend.schemas';\n\n/**\n * What a durable settlement claim answered — a closed vocabulary with one named runtime source,\n * because each member routes to a different action on a MONEY path and an inline string union\n * could carry none of the reasoning below.\n */\nexport enum BillingSettlementClaim {\n /**\n * This handler holds the claim and is the one that must apply the event's effects. Either it\n * inserted the ledger row, or it took over a claim whose holder died more than\n * {@link BILLING_PROVIDER_EVENT_SETTLEMENT_CLAIM_LEASE_MS} ago.\n */\n OWNED = 'OWNED',\n /** The effects were already applied by an earlier delivery. Grant nothing. */\n ALREADY_APPLIED = 'ALREADY_APPLIED',\n /**\n * Another delivery — very likely on another replica — holds a FRESH claim and is applying the\n * effects right now. Grant nothing, and say nothing alarming: this is the ordinary shape of a\n * duplicate delivery arriving while the first is still in flight.\n */\n HELD_ELSEWHERE = 'HELD_ELSEWHERE',\n /**\n * The claim could not be taken at all — the ledger store refused, or the event carried no\n * identity to key one on. Grant nothing: a money write nobody can deduplicate is exactly what\n * this ledger exists to prevent.\n */\n UNAVAILABLE = 'UNAVAILABLE',\n}\n\n// ── Provider Status Mapping ─────────────────────────────────────────\n\nconst PROVIDER_STATUS_MAP: Record<string, SubscriptionStatus> = {\n active: SubscriptionStatus.ACTIVE,\n trialing: SubscriptionStatus.TRIALING,\n past_due: SubscriptionStatus.PAST_DUE,\n canceled: SubscriptionStatus.CANCELLED,\n cancelled: SubscriptionStatus.CANCELLED,\n unpaid: SubscriptionStatus.UNPAID,\n incomplete: SubscriptionStatus.INCOMPLETE,\n incomplete_expired: SubscriptionStatus.INCOMPLETE_EXPIRED,\n paused: SubscriptionStatus.PAUSED,\n};\n\nfunction mapProviderStatus(providerStatus: string): SubscriptionStatus {\n return PROVIDER_STATUS_MAP[providerStatus] ?? SubscriptionStatus.INCOMPLETE;\n}\n\n// ── Router ──────────────────────────────────────────────────────────\n\nexport class BillingWebhookEventRouterBackendService {\n constructor(\n private readonly servicesRegistry: ServicesRegistryHandlerBackendService,\n private readonly resourcesRegistry: ResourcesRegistryBackendService,\n private readonly logger: LoggerService | undefined,\n private readonly webSocketService: WebSocketService | undefined,\n /**\n * REQUIRED, and it was optional until the duplicate-suppression fix.\n *\n * It arrived for the promotion-redemption compare-and-swap (#518) and was declared optional on\n * a defensible argument: everything else this router does goes through the service tier, and a\n * purchase must not fail because a COUNTER could not be incremented.\n *\n * That argument does not survive this registry also carrying the durable settlement ledger.\n * Without it there is no idempotency for the credit-pool top-up at all, and the two ways of\n * degrading are both unacceptable rather than merely inconvenient: granting anyway double-grants\n * money on the next retry, and skipping loses a purchase the customer has already paid for.\n * Neither is a degradation a deployment should be allowed to reach by omitting a constructor\n * argument, so the argument is now required and every construction site — production and test —\n * has to say what backs the ledger.\n */\n private readonly repositoriesRegistry: RepositoriesRegistryHandlerBackendService,\n ) {}\n\n private log(level: 'debug' | 'warn' | 'error', message: string, context?: Record<string, unknown>): void {\n if (!this.logger) return;\n this.logger[level](`[BillingWebhookRouter] ${message}`, context);\n }\n\n /**\n * Write options for a webhook-driven resource write — re-attaches the fields the\n * client-shaped request DTO would otherwise silently DROP.\n *\n * ## Why every write here needs this\n *\n * The repository strict-parses every create/update against the operation's `requestDto`\n * (`RepositoriesRegistryHandlerBackendService.validateRequestData`), which removes\n * `.isBackendOnly()` fields — they must never arrive from an HTTP client. A webhook handler is\n * not an HTTP client: the provider ids ARE the payload's reason to exist, and they are exactly\n * the fields the strip removes.\n *\n * Without this, `providerInvoiceId` and `providerSubscriptionId` never reached the database.\n * Both are the lookup key their own handler uses to find an existing row\n * ({@link handleInvoiceEvent} upserts on `providerInvoiceId`,\n * {@link findSubscriptionByProviderId} on `providerSubscriptionId`), so the loss was\n * self-concealing: the row was written without the key, the next event could not find it, and\n * the retained financial record lost the only local mapping back to the provider.\n *\n * This is the same class of defect already fixed on the billing-ACCOUNT side, where\n * `providerCustomerId` survives only because a custom-implementation CREATE prefix injects it\n * and the framework auto-preserves prefix-injected fields. The webhook writes have no prefix.\n *\n * ## Why derived rather than a hardcoded list\n *\n * {@link deriveTrustedSystemWritePreservedFields} returns exactly the subset of the payload's\n * OWN keys that the strip would drop for a legitimate reason. A literal list would silently stop\n * covering a field the day someone adds one — the failure mode that produced this bug. Applied\n * uniformly to every write below (it returns an empty list when nothing needs re-attaching), so\n * a future backend-only field is covered without touching the call sites.\n *\n * ## Safety\n *\n * `deriveTrustedSystemWritePreservedFields` carries an anti-smuggling contract: never use it to\n * re-attach fields from an untrusted request. That holds here because the derivation runs over\n * the keys of a payload this file CONSTRUCTS from named literals — a provider event's contents\n * can supply values, never new keys — and because the webhook payload is signature-verified\n * upstream before any handler runs.\n *\n * The execution context is deliberately left alone. Routing these writes through\n * `createAsSystem`/`updateAsSystem` (which derive the same set internally) would additionally\n * swap the webhook's scoped context for a synthesised super-admin one, changing which scope FK\n * `enrichDataWithContext` injects. That convergence is worth doing, but it is a scope-semantics\n * change and not this fix.\n */\n private trustedWriteOptions(\n resourceType: ResourceType,\n payload: Record<string, unknown>,\n verb: CoreResourceOperation.CREATE | CoreResourceOperation.UPDATE,\n ): ServiceOptions {\n const { mainSchema } = this.resourcesRegistry.getResourceConfiguration(resourceType);\n return {\n preserveServerInjectedFields: deriveTrustedSystemWritePreservedFields(\n mainSchema,\n Object.keys(payload),\n verb,\n ),\n };\n }\n\n /**\n * Route a billing webhook event to the appropriate resource operation.\n */\n async routeEvent(\n event: StandardBilling_WebhookEvent,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const eventType = event.type as string;\n\n // APPLICATION-scoped events (product/price catalog events) have no entity scope.\n // They are handled by the product catalog sync service, not here.\n const variants = resolveBillingVariants(execCtx);\n if (!variants) {\n this.log('debug', 'No entity scope on execution context — skipping (APPLICATION-scoped event)', { eventType });\n return;\n }\n\n this.log('debug', 'Routing webhook event', { eventType, scope: variants.scopeKey, eventId: event.providerEventId });\n\n switch (eventType) {\n case 'subscription.created':\n await this.handleSubscriptionCreated(event, variants, execCtx);\n break;\n case 'subscription.updated':\n await this.handleSubscriptionUpdated(event, variants, execCtx);\n break;\n case 'subscription.deleted':\n await this.handleSubscriptionDeleted(event, variants, execCtx);\n break;\n case 'subscription.trial_will_end':\n this.log('debug', 'Trial will end notification (no-op)', { eventId: event.providerEventId });\n break;\n case 'invoice.paid':\n await this.handleInvoiceEvent(event, variants, execCtx, 'paid');\n break;\n case 'invoice.finalized':\n await this.handleInvoiceEvent(event, variants, execCtx, 'open');\n break;\n case 'invoice.payment_failed':\n await this.handleInvoiceEvent(event, variants, execCtx, 'failed');\n break;\n case 'checkout.session.completed':\n await this.handleCheckoutCompleted(event, variants, execCtx);\n break;\n case 'customer.updated':\n this.log('debug', 'Customer updated on provider (no local action)', { eventId: event.providerEventId });\n break;\n case 'customer.deleted':\n await this.handleCustomerDeleted(event, variants, execCtx);\n break;\n case 'coupon.created':\n case 'coupon.updated':\n case 'coupon.deleted':\n this.log('debug', 'Coupon event (coupons managed via Wildo promotion system)', { eventType, eventId: event.providerEventId });\n break;\n case 'customer.discount.created':\n case 'customer.discount.updated':\n case 'customer.discount.deleted':\n await this.handleCustomerDiscountEvent(event, variants, execCtx);\n break;\n case 'payment_method.attached':\n case 'payment_method.detached':\n this.log('debug', 'Payment method event (no local action)', { eventType });\n break;\n default:\n this.log('debug', 'Unknown webhook event type', { eventType });\n break;\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Subscription Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * SUBSCRIPTION_CREATED: Retrieve full sub data from provider, create local record.\n */\n private async handleSubscriptionCreated(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerSubscriptionId = data.id as string;\n if (!providerSubscriptionId) return;\n\n // Check if subscription already exists (idempotency)\n const existing = await this.findSubscriptionByProviderId(variants.subscription, execCtx, providerSubscriptionId);\n if (existing) {\n this.log('debug', 'Subscription already exists — syncing from provider', { providerSubscriptionId });\n await this.syncSubscriptionFromProvider(variants, execCtx, existing._id, providerSubscriptionId);\n // Feature sync fires automatically via post-operation hook on subscription update\n return;\n }\n\n // Resolve the billing account from PROVIDER-AUTHORITATIVE data (the customer on the event),\n // never from the event's metadata. This used to read `metadata.billingAccountId` FIRST and fall\n // back to the customer lookup — which made an echoed, caller-influenced value the primary source\n // for the FK that decides whose subscription (and therefore whose entitlements) this becomes.\n // The metadata value is now only ever a cross-check; see `billing-checkout-metadata.backend.utils.ts`.\n const metadata = data.metadata as Record<string, string> | undefined;\n const billingAccountId = await this.resolveBillingAccountId(variants, execCtx, data.customer as string);\n\n if (!billingAccountId) {\n this.log('warn', 'Cannot resolve billing account for subscription.created', { providerSubscriptionId });\n return;\n }\n\n const echo = compareEchoedBillingAccount(metadata, billingAccountId);\n if (echo.verdict === BillingAccountEchoVerdict.MISMATCHED) {\n this.log('error', 'Refusing subscription.created: echoed billing account disagrees with the provider customer', {\n providerSubscriptionId,\n declaredBillingAccountId: echo.declaredBillingAccountId,\n authoritativeBillingAccountId: billingAccountId,\n });\n return;\n }\n\n // Retrieve authoritative subscription data from provider\n const provider = getBillingProvider();\n const providerData = await provider.retrieveSubscription(providerSubscriptionId);\n\n // Resolve provider items to local product/price IDs\n const items = await this.resolveSubscriptionItems(providerData, providerSubscriptionId, execCtx);\n\n if (items.length === 0) {\n this.log('warn', 'Subscription has no resolvable items — skipping creation (product/price catalog may not be synced yet)', {\n providerSubscriptionId, billingAccountId,\n });\n return;\n }\n\n // Create local subscription\n const createData: Record<string, unknown> = {\n [variants.billingAccountFkField]: billingAccountId,\n providerSubscriptionId,\n status: mapProviderStatus(providerData.status as string),\n items,\n currentPeriodStart: providerData.currentPeriodStart,\n currentPeriodEnd: providerData.currentPeriodEnd,\n cancelAtPeriodEnd: providerData.cancelAtPeriodEnd,\n ...(providerData.discount ? {\n discount: {\n providerCouponId: providerData.discount.providerCouponId,\n percentOff: providerData.discount.percentOff,\n amountOff: providerData.discount.amountOff,\n currency: providerData.discount.currency,\n duration: providerData.discount.duration,\n durationInMonths: providerData.discount.durationInMonths,\n end: providerData.discount.end,\n },\n } : {}),\n };\n\n await this.servicesRegistry.create(\n variants.subscription, execCtx, createData,\n this.trustedWriteOptions(variants.subscription, createData, CoreResourceOperation.CREATE),\n );\n this.log('debug', 'Subscription created from webhook', { providerSubscriptionId, billingAccountId });\n // Feature sync fires automatically via post-operation hook on subscription create\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_SUBSCRIPTION_UPDATED, variants, billingAccountId, execCtx);\n }\n\n /**\n * SUBSCRIPTION_UPDATED: Find local sub, sync status/period from provider.\n * Items are NOT synced from webhooks — they are set at creation time and\n * maintained through explicit plan change operations.\n */\n private async handleSubscriptionUpdated(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerSubscriptionId = data.id as string;\n if (!providerSubscriptionId) return;\n\n const localSub = await this.findSubscriptionByProviderId(variants.subscription, execCtx, providerSubscriptionId);\n if (!localSub) {\n this.log('warn', 'Subscription not found for update webhook', { providerSubscriptionId });\n return;\n }\n\n await this.syncSubscriptionFromProvider(variants, execCtx, localSub._id, providerSubscriptionId);\n // Feature sync fires automatically via post-operation hook on subscription update\n const updatedBillingAccountId = localSub[variants.billingAccountFkField] as string;\n if (updatedBillingAccountId) {\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_SUBSCRIPTION_UPDATED, variants, updatedBillingAccountId, execCtx);\n }\n }\n\n /**\n * SUBSCRIPTION_DELETED: Mark as cancelled.\n */\n private async handleSubscriptionDeleted(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerSubscriptionId = data.id as string;\n if (!providerSubscriptionId) return;\n\n const localSub = await this.findSubscriptionByProviderId(variants.subscription, execCtx, providerSubscriptionId);\n if (!localSub) return;\n\n const cancelData: Record<string, unknown> = {\n status: SubscriptionStatus.CANCELLED,\n cancelledAt: new Date(),\n };\n await this.servicesRegistry.update(\n variants.subscription, execCtx, localSub._id, cancelData,\n this.trustedWriteOptions(variants.subscription, cancelData, CoreResourceOperation.UPDATE),\n );\n\n this.log('debug', 'Subscription marked as cancelled from webhook', { providerSubscriptionId });\n // Feature sync fires automatically via post-operation hook on subscription update\n const deletedBillingAccountId = localSub[variants.billingAccountFkField] as string;\n if (deletedBillingAccountId) {\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_SUBSCRIPTION_UPDATED, variants, deletedBillingAccountId, execCtx);\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Invoice Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * INVOICE_PAID / INVOICE_FINALIZED / INVOICE_PAYMENT_FAILED: Upsert invoice ref.\n */\n private async handleInvoiceEvent(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n outcome: 'paid' | 'open' | 'failed',\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerInvoiceId = data.id as string;\n const providerCustomerId = data.customer as string;\n if (!providerInvoiceId || !providerCustomerId) return;\n\n // Re-lookup billing account to get its _id\n const billingAccountId = await this.resolveBillingAccountId(variants, execCtx, providerCustomerId);\n if (!billingAccountId) {\n this.log('warn', 'Cannot resolve billing account for invoice event', { providerInvoiceId, providerCustomerId });\n return;\n }\n\n // Map outcome to invoice status — 'failed' is not a valid InvoiceStatus, map to uncollectible\n const invoiceStatus = outcome === 'failed' ? 'uncollectible' : outcome;\n\n // Convert provider amount to MoneyValue\n const rawAmount = data.amount_paid ?? data.total ?? 0;\n const amountInCents = typeof rawAmount === 'string' ? parseInt(rawAmount, 10) || 0 : Number(rawAmount) || 0;\n const currency = (data.currency as string) ?? 'usd';\n\n /*\n * The provider's amount is in the CURRENCY's smallest unit, so the scale is the currency's — not 2\n * (#515).\n *\n * `decimals: 2` was written here unconditionally, two lines below the event's own `currency`. For\n * a zero-decimal currency the provider's amount is already whole units, so recording it at scale 2\n * stored a JPY invoice at a HUNDREDTH of its value; for a three-decimal dinar it stored ten times\n * too much.\n *\n * An unresolvable currency falls back to 2 with a loud error rather than dropping the invoice: a\n * webhook is the provider telling us something happened, and refusing to record it loses the fact\n * as well as the amount. The error names the currency so the row can be corrected — and this is\n * the one place in the boundary that degrades rather than refuses, because it is the only one\n * where refusing destroys information we cannot ask for again.\n */\n const resolvedDecimals = currencyMinorUnitDecimals(currency.toUpperCase());\n if (resolvedDecimals === undefined) {\n this.logger.error('Invoice recorded at an ASSUMED scale: the provider currency has no resolvable minor unit', {\n providerInvoiceId,\n currency,\n assumedDecimals: 2,\n });\n }\n\n const invoiceData: Record<string, unknown> = {\n [variants.billingAccountFkField]: billingAccountId,\n providerInvoiceId,\n status: invoiceStatus,\n total: {\n amount: BigInt(amountInCents),\n currency,\n decimals: resolvedDecimals ?? 2,\n },\n hostedInvoiceUrl: data.hosted_invoice_url as string | undefined,\n invoicePdfUrl: data.invoice_pdf as string | undefined,\n };\n\n // Upsert: LIST by providerInvoiceId → CREATE or UPDATE\n const existingInvoices = await this.servicesRegistry.list<{ _id: string }>(\n variants.invoiceRef, execCtx, { providerInvoiceId },\n ) as Array<{ _id: string }>;\n\n if (existingInvoices.length > 0) {\n await this.servicesRegistry.update(\n variants.invoiceRef, execCtx, existingInvoices[0]._id, invoiceData,\n this.trustedWriteOptions(variants.invoiceRef, invoiceData, CoreResourceOperation.UPDATE),\n );\n } else {\n await this.servicesRegistry.create(\n variants.invoiceRef, execCtx, invoiceData,\n this.trustedWriteOptions(variants.invoiceRef, invoiceData, CoreResourceOperation.CREATE),\n );\n }\n\n this.log('debug', 'Invoice ref upserted', { providerInvoiceId, outcome });\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Checkout Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * CHECKOUT_SESSION_COMPLETED: Handle credit pack top-ups.\n * For subscription products, SUBSCRIPTION_CREATED handles the subscription creation.\n *\n * ## This handler mints credits from provider-echoed metadata — treat that metadata as hostile\n *\n * The provider replays the checkout session's `metadata` map verbatim inside a GENUINELY SIGNED\n * event. The signature proves the provider sent it; it says nothing about who wrote it, and the\n * producing operation (`OPEN_CHECKOUT`) accepts caller-supplied metadata. This handler previously\n * read `metadata.billingAccountId` and `metadata.quantity` straight out of that map and called\n * `CreditPool_Operations.TOP_UP` with the result, which made a caller-controlled record the input\n * to a credit grant.\n *\n * Two rules now hold, and both are enforced in `billing-checkout-metadata.backend.utils.ts` rather\n * than inline, so a future handler cannot half-apply them:\n * - the account credited is derived from the event's provider CUSTOMER, exactly as\n * {@link handleInvoiceEvent} already did; the echoed account id can only agree or refuse;\n * - the quantity is strictly parsed and bounded. The previous expression\n * `(metadata.quantity ? Number(metadata.quantity) : undefined) ?? 1` yielded `NaN` for `\"abc\"`\n * (the `?? 1` fallback is dead — `NaN` is not nullish), `-5` for `\"-5\"`, and 1e9 for `\"1e9\"`.\n */\n private async handleCheckoutCompleted(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const checkoutSessionId = (event.data as Record<string, unknown>).id as string | undefined;\n const dedupKey = checkoutSessionId ?? event.providerEventId;\n\n const data = event.data as Record<string, unknown>;\n\n // Provider truth first: whose customer actually paid. Scope resolution already matched this\n // customer to a billing-account row (otherwise the event would have degraded to APPLICATION\n // scope and `routeEvent` would have returned before reaching any handler), so this lookup is\n // the same one that admitted the event — it is not an extra failure mode.\n const billingAccountId = await this.resolveBillingAccountId(variants, execCtx, data.customer as string);\n if (!billingAccountId) {\n this.log('warn', 'Cannot resolve billing account for checkout.session.completed', {\n dedupKey, providerCustomerId: data.customer,\n });\n return;\n }\n\n const outcome = resolveCheckoutSessionMetadata(data.metadata as Record<string, string> | undefined, billingAccountId);\n if (outcome.kind === BillingCheckoutMetadataOutcomeKind.NOT_FRAMEWORK_ORIGINATED) {\n // An ordinary session the framework did not open (provider dashboard, another integration).\n // Nothing to grant, and nothing suspicious about it.\n this.log('debug', 'Checkout completed without framework checkout metadata — nothing to grant', { dedupKey });\n return;\n }\n if (outcome.kind === BillingCheckoutMetadataOutcomeKind.REFUSED) {\n // A session that CLAIMS to be ours and is internally inconsistent. Distinct from the case\n // above on purpose: this is a tamper signal and must be loud, not a debug skip. No settlement\n // claim is taken either — a refusal granted nothing, so a retry re-evaluates it.\n this.log('error', 'Refusing checkout.session.completed: framework metadata failed validation', {\n dedupKey, reason: outcome.reason, ...outcome.detail,\n });\n return;\n }\n\n const { productKey, quantity, promotionId } = outcome;\n\n /*\n * DURABLE duplicate suppression, taken HERE and not one line earlier.\n *\n * Everything above this point either granted nothing (a session the framework did not open, a\n * session whose metadata failed validation, a customer that resolves to no billing account) or\n * decided WHAT would be granted. None of it may be suppressed: a refusal must be re-evaluated\n * on the next delivery — that is what the REFUSED branch above says in so many words — and a\n * suppression taken before the refusal would freeze a tamper verdict into the ledger.\n *\n * Everything BELOW writes money: it counts a promotion redemption against its cap and tops up a\n * credit pool. Those are the writes the claim exists to make exactly-once.\n *\n * The two races answer differently, and both answers are deliberate:\n *\n * - **A retry that arrives AFTER the first finished** finds a row carrying `appliedAt` and is\n * ALREADY_APPLIED. Nothing is granted, and it is logged at debug because it is the ordinary,\n * expected shape of at-least-once delivery.\n * - **A retry that arrives WHILE the first is still in flight** — a genuinely concurrent\n * delivery, most often to another replica — loses the INSERT to the primary key and finds a\n * row with a fresh `claimedAt` and no `appliedAt`. It is HELD_ELSEWHERE and also grants\n * nothing. It does not wait, and it does not retry: the holder is milliseconds from\n * finishing, and if it instead DIES the provider's own retry schedule brings the event back\n * after the claim lease expires, at which point the takeover branch applies it. So a crashed\n * holder costs a delay, never the credits.\n */\n const settlement = await this.claimSettlement(dedupKey, event.type as string, execCtx);\n if (settlement.claim !== BillingSettlementClaim.OWNED) {\n this.log(\n settlement.claim === BillingSettlementClaim.UNAVAILABLE ? 'error' : 'debug',\n 'Granting nothing for checkout.session.completed — this delivery does not hold the settlement claim',\n { dedupKey, claim: settlement.claim },\n );\n return;\n }\n\n /*\n * COUNT the redemption, now that the purchase is real (#518).\n *\n * At checkout OPEN the code was validated — including against `maxRedemptions` — and nothing was\n * incremented, so a code used only through checkout stayed at zero redemptions forever and the cap\n * could be exceeded without limit. The separate `apply` verb counted one, at the moment a customer\n * TYPED a code, which is a different event from redeeming it; it no longer counts, so this is now\n * the ONE place a redemption is recorded.\n *\n * Counted at COMPLETION rather than at open, because a customer who opens a checkout and walks\n * away has redeemed nothing; incrementing at open would exhaust a limited code on abandoned\n * sessions and is the more expensive mistake of the two.\n *\n * Compare-and-swap against the cap: two sessions completing at once cannot both take the last\n * redemption. And it sits INSIDE the settlement claim, so a retried delivery cannot count a\n * second redemption for one purchase. A refusal here does NOT refuse the purchase — the\n * customer has already paid and the provider has already applied the discount, so the only honest\n * response is to grant what they bought and record loudly that the cap was passed.\n */\n if (promotionId) {\n await this.countPromotionRedemption(promotionId, execCtx, dedupKey);\n }\n\n // Read product to check if it's a CREDIT_PACK\n const products = await this.servicesRegistry.list<Product>(\n CoreResourceType.PRODUCTS, execCtx, { key: productKey },\n ) as Product[];\n const product = products.length > 0 ? products[0] : null;\n\n if (product?.type === ProductType.CREDIT_PACK && product.purchaseConfig?.creditPoolKey) {\n const credits = (product.purchaseConfig.creditsPerUnit ?? 1) * quantity;\n const poolKey = product.purchaseConfig.creditPoolKey;\n\n // Find the credit pool, auto-create if first purchase\n let pools = await this.servicesRegistry.list<CreditPool>(\n variants.creditPool, execCtx,\n { [variants.billingAccountFkField]: billingAccountId, poolKey },\n ) as CreditPool[];\n\n if (pools.length === 0) {\n this.log('debug', 'Credit pool not found — auto-creating', { billingAccountId, poolKey });\n const poolData: Record<string, unknown> = {\n [variants.billingAccountFkField]: billingAccountId, poolKey, available: 0, totalPurchased: 0, totalConsumed: 0,\n };\n const created = await this.servicesRegistry.create(\n variants.creditPool, execCtx, poolData,\n this.trustedWriteOptions(variants.creditPool, poolData, CoreResourceOperation.CREATE),\n );\n if (created) {\n pools = [created as CreditPool];\n }\n }\n\n if (pools.length > 0) {\n const pool = pools[0];\n await this.servicesRegistry.executeCustomOperation(\n variants.creditPool,\n CreditPool_Operations.TOP_UP,\n execCtx,\n pool._id,\n { credits },\n );\n this.log('debug', 'Credit pack top-up completed via pipeline', {\n billingAccountId, poolKey, credits,\n });\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_CREDIT_POOL_UPDATED, variants, billingAccountId, execCtx);\n } else {\n this.log('error', 'Failed to auto-create credit pool for top-up', {\n billingAccountId, poolKey,\n });\n }\n }\n\n await this.markSettlementApplied(settlement.settlementId, dedupKey);\n }\n\n /**\n * Take the DURABLE claim on one money-affecting provider event, or report who already holds it.\n *\n * ## Why the collision is an INSERT and not a read-then-write\n *\n * Two deliveries arriving together would both read \"not settled\" before either wrote, so the\n * suppression cannot be a check. It is a row whose PRIMARY KEY is derived from the event's own\n * identity: the second INSERT collides at the store, on the one constraint both adapters enforce\n * natively and identically. `insertDocumentForInfrastructure` translates that collision into a\n * classified `CONFLICT` on either arm — MongoDB from `E11000`, PostgreSQL from SQLSTATE `23505` —\n * so this branch is adapter-neutral rather than adapter-aware.\n *\n * ## Why anything that is NOT a conflict re-throws\n *\n * A store that is unreachable, a table that does not exist, a cast that failed: none of those\n * mean \"already settled\", and reading them as suppression would silently swallow a purchase. They\n * propagate, the webhook delivery fails, and the provider retries — which is the correct outcome\n * for a transient store failure and a loud one for a permanent misconfiguration.\n */\n private async claimSettlement(\n dedupKey: string | undefined,\n eventType: string,\n execCtx: ExecutionContext<any>,\n ): Promise<{ claim: BillingSettlementClaim; settlementId: string | null }> {\n if (!dedupKey) {\n /*\n * An event carrying neither a checkout-session id nor a provider event id. The standard\n * webhook contract types `providerEventId` as required, so reaching this is a malformed event\n * or a broken adapter rather than a provider behaviour.\n *\n * Refusing is the fail-CLOSED choice and it is taken knowingly: without an identity there is\n * nothing to key a claim on, so every redelivery of this same event would grant again, without\n * limit. A missed grant is recoverable by a human reading this error; an unbounded repeat of a\n * credit grant is not.\n */\n this.log('error', 'Checkout completion carries no identity to deduplicate on — refusing to grant', { eventType });\n return { claim: BillingSettlementClaim.UNAVAILABLE, settlementId: null };\n }\n\n const claimKey = `${eventType}:${dedupKey}`;\n const settlementId = billingProviderEventSettlementId(claimKey);\n const now = new Date();\n\n try {\n await this.repositoriesRegistry.insertDocumentForInfrastructure(\n BackendResourceType.BILLING_PROVIDER_EVENT_SETTLEMENTS as unknown as ResourceType,\n { _id: settlementId, claimKey, eventType, claimedAt: now },\n execCtx,\n );\n return { claim: BillingSettlementClaim.OWNED, settlementId };\n } catch (error) {\n if (!isWildoBackendError(error) || error.type !== ErrorType.CONFLICT) {\n this.log('error', 'Could not take the settlement claim for a completed checkout — refusing to grant', {\n claimKey, message: (error as Error).message,\n });\n return { claim: BillingSettlementClaim.UNAVAILABLE, settlementId: null };\n }\n }\n\n // The row exists. Whether it SETTLED is the next question, and only a row that did not may be\n // taken over — see the lease constant for why a takeover exists at all.\n const existing = await this.repositoriesRegistry.readUnscopedByKey<BillingProviderEventSettlement>(\n BackendResourceType.BILLING_PROVIDER_EVENT_SETTLEMENTS as unknown as ResourceType,\n { _id: settlementId },\n );\n\n if (existing?.appliedAt) return { claim: BillingSettlementClaim.ALREADY_APPLIED, settlementId };\n\n /*\n * Compare-and-swap the lease, never a read-then-write: several retries of an abandoned claim can\n * arrive together, and exactly one of them may take it. `appliedAt: { $exists: false }` is in\n * the FILTER rather than checked above for the same reason — the row may settle between the read\n * and this statement, and a filter that admitted a settled row would double-grant.\n *\n * `$exists` is the one presence predicate both adapters answer identically (MongoDB: the path is\n * absent; PostgreSQL: the column IS NULL) — which is why the ledger expresses \"not yet applied\"\n * as an absent value rather than as a status.\n */\n const takenOver = await this.repositoriesRegistry.atomicGuardedMutation(\n BackendResourceType.BILLING_PROVIDER_EVENT_SETTLEMENTS as unknown as ResourceType,\n {\n _id: settlementId,\n appliedAt: { $exists: false },\n claimedAt: { $lt: new Date(now.getTime() - BILLING_PROVIDER_EVENT_SETTLEMENT_CLAIM_LEASE_MS) },\n },\n { set: { claimedAt: now } },\n execCtx,\n );\n\n if (takenOver) {\n this.log('warn', 'Took over an ABANDONED settlement claim — a previous delivery claimed this event and never applied it', {\n claimKey, previousClaimedAt: existing?.claimedAt,\n });\n return { claim: BillingSettlementClaim.OWNED, settlementId };\n }\n\n return { claim: BillingSettlementClaim.HELD_ELSEWHERE, settlementId };\n }\n\n /**\n * Close the claim, so every later delivery of this event is ALREADY_APPLIED rather than a\n * candidate for takeover.\n *\n * Never throws: the grant has already landed, and turning a successful purchase into a failed\n * webhook delivery would make the provider retry an event whose effects are complete.\n *\n * The failure it logs is the residual this design keeps rather than removes, and it is stated\n * plainly because nothing else records it: if this single write is lost, the ledger row keeps an\n * open claim, and a redelivery arriving after the lease expires WILL grant a second time. That\n * window is one statement wide, and the alternative — marking applied BEFORE doing the work —\n * trades it for a strictly worse one, where a handler that dies mid-grant leaves a purchase\n * permanently unsettled and no retry can ever repair it.\n */\n private async markSettlementApplied(settlementId: string | null, dedupKey: string | undefined): Promise<void> {\n if (!settlementId) return;\n try {\n await this.repositoriesRegistry.atomicGuardedMutation(\n BackendResourceType.BILLING_PROVIDER_EVENT_SETTLEMENTS as unknown as ResourceType,\n { _id: settlementId },\n { set: { appliedAt: new Date() } },\n );\n } catch (error) {\n this.log('error', 'Settlement applied but NOT recorded as applied — a later retry of this event could grant a second time', {\n dedupKey, message: (error as Error).message,\n });\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Customer Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * CUSTOMER_DELETED: Deactivate billing account, trigger feature sync.\n */\n private async handleCustomerDeleted(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const providerCustomerId = data.id as string;\n if (!providerCustomerId) return;\n\n // Find billing account by providerCustomerId in the derived variant\n const billingAccounts = await this.servicesRegistry.list<{ _id: string }>(\n variants.billingAccount, execCtx, { providerCustomerId },\n ) as Array<{ _id: string }>;\n\n if (billingAccounts.length === 0) {\n this.log('warn', 'Billing account not found for customer.deleted', { providerCustomerId });\n return;\n }\n\n const billingAccount = billingAccounts[0];\n const deactivateData: Record<string, unknown> = { isActive: false };\n await this.servicesRegistry.update(\n variants.billingAccount, execCtx, billingAccount._id, deactivateData,\n this.trustedWriteOptions(variants.billingAccount, deactivateData, CoreResourceOperation.UPDATE),\n );\n\n this.log('debug', 'Billing account deactivated from customer.deleted', { providerCustomerId });\n\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_ACCOUNT_CHANGED, variants, billingAccount._id, execCtx);\n\n // Remove all billing-derived features\n await this.safeFeatureSync(billingAccount._id, variants);\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Customer Discount Events\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * CUSTOMER_DISCOUNT_CREATED/UPDATED/DELETED: Re-sync the affected subscription\n * to pick up discount changes from the provider. The subscription.updated webhook\n * usually fires alongside these events, but this handler provides a safety net.\n */\n private async handleCustomerDiscountEvent(\n event: StandardBilling_WebhookEvent,\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n const data = event.data as Record<string, unknown>;\n const subscription = data.subscription as string | undefined;\n\n if (!subscription) {\n this.log('debug', 'Customer discount event without subscription reference', { eventType: event.type });\n return;\n }\n\n const localSub = await this.findSubscriptionByProviderId(variants.subscription, execCtx, subscription);\n if (!localSub) {\n this.log('debug', 'Subscription not found for discount event', { providerSubscriptionId: subscription });\n return;\n }\n\n await this.syncSubscriptionFromProvider(variants, execCtx, localSub._id, subscription);\n this.log('debug', 'Subscription re-synced after discount event', { eventType: event.type, providerSubscriptionId: subscription });\n\n const billingAccountId = localSub[variants.billingAccountFkField] as string;\n if (billingAccountId) {\n await this.emitBillingEvent(CoreWebSocketEvent.BILLING_SUBSCRIPTION_UPDATED, variants, billingAccountId, execCtx);\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // Helpers\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Find a subscription by providerSubscriptionId in a specific variant collection.\n */\n /**\n * Increment a promotion's `timesRedeemed`, guarded against its own cap (#518).\n *\n * Never throws. It runs after the customer has paid and the provider has applied the discount, so\n * every failure mode — a missing row, a store error, a cap already reached — must leave the grant\n * alone and become a loud record instead. The cap being passed is a real operational event (a\n * promotion was honoured beyond its limit) and it is logged at ERROR for exactly that reason.\n */\n private async countPromotionRedemption(\n promotionId: string,\n execCtx: ExecutionContext<any>,\n dedupKey: string | undefined,\n ): Promise<void> {\n try {\n const promotion = await this.servicesRegistry.read<{ _id: string; maxRedemptions?: number | null }>(\n CoreResourceType.PROMOTIONS, execCtx, promotionId,\n );\n if (!promotion) {\n this.log('warn', 'Checkout completed carrying a promotion that no longer exists — redemption not counted', {\n dedupKey, promotionId,\n });\n return;\n }\n\n const capped = promotion.maxRedemptions !== null && promotion.maxRedemptions !== undefined;\n const counted = await this.repositoriesRegistry.atomicGuardedMutation(\n CoreResourceType.PROMOTIONS,\n capped ? { _id: promotionId, timesRedeemed: { $lt: promotion.maxRedemptions } } : { _id: promotionId },\n { increment: { timesRedeemed: 1 } },\n execCtx,\n );\n\n if (!counted && capped) {\n this.log('error', 'Promotion honoured BEYOND its redemption cap: the purchase completed and the count could not be incremented', {\n dedupKey, promotionId, maxRedemptions: promotion.maxRedemptions,\n });\n }\n } catch (error) {\n this.log('error', 'Failed to count a promotion redemption for a completed checkout', {\n dedupKey, promotionId, message: (error as Error).message,\n });\n }\n }\n\n private async findSubscriptionByProviderId(\n subscriptionVariant: string,\n execCtx: ExecutionContext<any>,\n providerSubscriptionId: string,\n ): Promise<(BillingSubscriptionBase & Record<string, unknown>) | null> {\n try {\n const items = await this.servicesRegistry.list<BillingSubscriptionBase>(\n subscriptionVariant, execCtx, { providerSubscriptionId },\n ) as Array<BillingSubscriptionBase & Record<string, unknown>>;\n return items.length > 0 ? items[0] : null;\n } catch (error) {\n this.log('error', 'Failed to find subscription by provider ID', {\n providerSubscriptionId, error: (error as Error).message,\n });\n return null;\n }\n }\n\n /**\n * Resolve billing account _id by providerCustomerId in the derived variant.\n * One scoped query — not a full polymorphic lookup.\n */\n private async resolveBillingAccountId(\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n providerCustomerId: string,\n ): Promise<string | null> {\n if (!providerCustomerId) return null;\n try {\n const accounts = await this.servicesRegistry.list<{ _id: string }>(\n variants.billingAccount, execCtx, { providerCustomerId },\n ) as Array<{ _id: string }>;\n return accounts.length > 0 ? accounts[0]._id : null;\n } catch (error) {\n this.log('error', 'Failed to resolve billing account by provider customer ID', {\n providerCustomerId, error: (error as Error).message,\n });\n return null;\n }\n }\n\n /**\n * Sync a local subscription's status and period from the authoritative provider state.\n * Items are NOT synced — they are set at creation time and maintained through\n * explicit plan change operations (CHANGE_PLAN, ADD_ADDON, REMOVE_ADDON).\n */\n private async syncSubscriptionFromProvider(\n variants: BillingResolvedVariants,\n execCtx: ExecutionContext<any>,\n localSubId: string,\n providerSubscriptionId: string,\n ): Promise<void> {\n const provider = getBillingProvider();\n const providerData = await provider.retrieveSubscription(providerSubscriptionId);\n\n const updateData: Record<string, unknown> = {\n status: mapProviderStatus(providerData.status as string),\n currentPeriodStart: providerData.currentPeriodStart,\n currentPeriodEnd: providerData.currentPeriodEnd,\n cancelAtPeriodEnd: providerData.cancelAtPeriodEnd,\n };\n\n if (providerData.discount) {\n updateData.discount = {\n providerCouponId: providerData.discount.providerCouponId,\n percentOff: providerData.discount.percentOff,\n amountOff: providerData.discount.amountOff,\n currency: providerData.discount.currency,\n duration: providerData.discount.duration,\n durationInMonths: providerData.discount.durationInMonths,\n end: providerData.discount.end,\n };\n } else {\n updateData.discount = null;\n }\n\n await this.servicesRegistry.update(\n variants.subscription, execCtx, localSubId, updateData,\n this.trustedWriteOptions(variants.subscription, updateData, CoreResourceOperation.UPDATE),\n );\n }\n\n /**\n * Resolve provider subscription items to local schema format.\n * Each item must have a local `_id`, `productId`, `priceId` resolved\n * from the provider's product/price IDs via the synced catalog.\n */\n private async resolveSubscriptionItems(\n providerData: StandardBilling_SubscriptionData,\n providerSubscriptionId: string,\n execCtx: ExecutionContext<any>,\n ): Promise<Array<{ _id: string; productId: string; priceId: string; quantity: number; providerSubscriptionItemId?: string }>> {\n const items: Array<{ _id: string; productId: string; priceId: string; quantity: number; providerSubscriptionItemId?: string }> = [];\n\n for (let i = 0; i < (providerData.items ?? []).length; i++) {\n const providerItem = providerData.items[i];\n\n // Resolve local product by providerProductId\n let productId: string | undefined;\n try {\n const products = await this.servicesRegistry.list<{ _id: string }>(\n CoreResourceType.PRODUCTS, execCtx, { providerProductId: providerItem.providerProductId },\n ) as Array<{ _id: string }>;\n productId = products.length > 0 ? products[0]._id : undefined;\n } catch {\n this.log('warn', 'Failed to resolve product from provider ID', {\n providerProductId: providerItem.providerProductId, providerSubscriptionId,\n });\n }\n\n // Resolve local price by providerPriceId\n let priceId: string | undefined;\n try {\n const prices = await this.servicesRegistry.list<{ _id: string }>(\n CoreResourceType.PRICES, execCtx, { providerPriceId: providerItem.providerPriceId },\n ) as Array<{ _id: string }>;\n priceId = prices.length > 0 ? prices[0]._id : undefined;\n } catch {\n this.log('warn', 'Failed to resolve price from provider ID', {\n providerPriceId: providerItem.providerPriceId, providerSubscriptionId,\n });\n }\n\n if (productId && priceId) {\n const itemIdSuffix = providerItem.providerSubscriptionItemId ?? `idx_${i}`;\n items.push({\n _id: `${providerSubscriptionId}_${itemIdSuffix}`,\n productId,\n priceId,\n quantity: providerItem.quantity,\n providerSubscriptionItemId: providerItem.providerSubscriptionItemId,\n });\n } else {\n this.log('warn', 'Skipping subscription item — could not resolve local product/price', {\n index: i, providerSubscriptionId,\n providerProductId: providerItem.providerProductId,\n providerPriceId: providerItem.providerPriceId,\n });\n }\n }\n\n return items;\n }\n\n /**\n * Trigger feature sync, catching errors silently.\n * Passes variant context so feature sync queries the correct polymorphic collections.\n */\n private async safeFeatureSync(billingAccountId: string, variants: BillingResolvedVariants): Promise<void> {\n try {\n const featureSyncService = getFeatureSyncService();\n await featureSyncService.onSubscriptionChanged(billingAccountId, variants);\n } catch (error) {\n this.log('error', 'Feature sync failed after billing webhook change', {\n billingAccountId, error: (error as Error).message,\n });\n }\n }\n\n /**\n * Emit a billing WebSocket event for real-time frontend invalidation.\n * Reads the billing account to resolve the scope entity ID,\n * then dispatches to the correct scope room.\n */\n private async emitBillingEvent(\n eventType: CoreWebSocketEvent,\n variants: BillingResolvedVariants,\n billingAccountId: string,\n execCtx: ExecutionContext<any>,\n ): Promise<void> {\n if (!this.webSocketService) return;\n\n try {\n const accounts = await this.servicesRegistry.list<BillingAccount>(\n variants.billingAccount, execCtx, { _id: billingAccountId },\n ) as BillingAccount[];\n\n const billingAccount = accounts.length > 0 ? accounts[0] : null;\n if (!billingAccount) return;\n\n const scopeEntityId = billingAccount[variants.scopeEntityDocField] as string;\n if (!scopeEntityId) return;\n\n const message = {\n type: eventType,\n payload: { scopeType: variants.scopeType, scopeEntityId, billingAccountId },\n timestamp: new Date(),\n };\n\n switch (variants.scopeType) {\n case ResourcePrimaryScope.ORGANIZATIONS:\n await this.webSocketService.sendToOrganization(scopeEntityId, message);\n break;\n case ResourcePrimaryScope.USER_SELF:\n await this.webSocketService.sendToUser(scopeEntityId, message);\n break;\n }\n\n this.log('debug', 'Billing WebSocket event emitted', { eventType, scopeType: variants.scopeType, scopeEntityId });\n } catch (error) {\n this.log('warn', 'Failed to emit billing WebSocket event', {\n eventType, billingAccountId, error: (error as Error).message,\n });\n }\n }\n}\n"]}
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
*
|
|
25
25
|
* @see billing-and-features-system.md §Testing Strategy (Mock billing provider)
|
|
26
26
|
*/
|
|
27
|
-
import { type StandardBilling_Interface, type StandardBilling_CreateCustomerRequest, type StandardBilling_CreateCustomerResponse, type StandardBilling_UpdateCustomerRequest, type StandardBilling_CustomerAddress, type StandardBilling_PaymentMethodSummary, type StandardBilling_SyncProductRequest, type StandardBilling_SyncProductResponse, type StandardBilling_SyncPriceRequest, type StandardBilling_SyncPriceResponse, type StandardBilling_CreateSubscriptionRequest, type StandardBilling_CreateSubscriptionResponse, type StandardBilling_UpdateSubscriptionRequest, type StandardBilling_CancelSubscriptionOptions, type StandardBilling_SubscriptionData, type StandardBilling_InvoicePreview, type StandardBilling_CreateCheckoutSessionRequest, type StandardBilling_CreateCheckoutSessionResponse, type StandardBilling_CreateCustomerPortalSessionResponse, type StandardBilling_ReportUsageRequest, type StandardBilling_WebhookEvent, type StandardBilling_CreateCouponRequest, type StandardBilling_CreateCouponResponse, type StandardBilling_CreatePromotionCodeResponse, StandardBilling_EventType, SubscriptionStatus } from '@wildo-ai/external-connectors-models';
|
|
27
|
+
import { type StandardBilling_Interface, type StandardBilling_CreateCustomerRequest, type StandardBilling_CreateCustomerResponse, type StandardBilling_UpdateCustomerRequest, type StandardBilling_CustomerAddress, type StandardBilling_PaymentMethodSummary, type StandardBilling_SyncProductRequest, type StandardBilling_SyncProductResponse, type StandardBilling_SyncPriceRequest, type StandardBilling_SyncPriceResponse, type StandardBilling_CreateSubscriptionRequest, type StandardBilling_CreateSubscriptionResponse, type StandardBilling_UpdateSubscriptionRequest, type StandardBilling_CancelSubscriptionOptions, type StandardBilling_SubscriptionData, type StandardBilling_InvoicePreview, type StandardBilling_InvoiceData, type StandardBilling_CreateCheckoutSessionRequest, type StandardBilling_CreateCheckoutSessionResponse, type StandardBilling_CreateCustomerPortalSessionResponse, type StandardBilling_ReportUsageRequest, type StandardBilling_WebhookEvent, type StandardBilling_CreateCouponRequest, type StandardBilling_CreateCouponResponse, type StandardBilling_CreatePromotionCodeResponse, StandardBilling_EventType, SubscriptionStatus, InvoiceStatus } from '@wildo-ai/external-connectors-models';
|
|
28
28
|
interface MockCustomer {
|
|
29
29
|
providerCustomerId: string;
|
|
30
30
|
name: string;
|
|
@@ -87,6 +87,21 @@ interface MockSubscription {
|
|
|
87
87
|
}>;
|
|
88
88
|
metadata?: Record<string, string>;
|
|
89
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* An invoice the provider holds. Seeded by {@link MockBillingProvider.seedInvoice} rather than
|
|
92
|
+
* produced by any call on the interface, because that is exactly how a real one arises: the
|
|
93
|
+
* provider raises invoices on its own schedule and Wildo only ever learns about them.
|
|
94
|
+
*/
|
|
95
|
+
interface MockInvoice {
|
|
96
|
+
providerInvoiceId: string;
|
|
97
|
+
providerCustomerId: string;
|
|
98
|
+
status: InvoiceStatus;
|
|
99
|
+
total: number;
|
|
100
|
+
currency: string;
|
|
101
|
+
hostedInvoiceUrl?: string;
|
|
102
|
+
invoicePdfUrl?: string;
|
|
103
|
+
createdAt: Date;
|
|
104
|
+
}
|
|
90
105
|
interface MockCoupon {
|
|
91
106
|
providerCouponId: string;
|
|
92
107
|
amountOff?: number;
|
|
@@ -116,6 +131,7 @@ export declare class MockBillingProvider implements StandardBilling_Interface {
|
|
|
116
131
|
readonly subscriptions: Map<string, MockSubscription>;
|
|
117
132
|
readonly coupons: Map<string, MockCoupon>;
|
|
118
133
|
readonly promotionCodes: Map<string, MockPromotionCode>;
|
|
134
|
+
readonly invoices: Map<string, MockInvoice>;
|
|
119
135
|
readonly usageRecords: Array<StandardBilling_ReportUsageRequest & {
|
|
120
136
|
recordedAt: Date;
|
|
121
137
|
}>;
|
|
@@ -139,6 +155,16 @@ export declare class MockBillingProvider implements StandardBilling_Interface {
|
|
|
139
155
|
simulateWebhook(type: StandardBilling_EventType, data: Record<string, unknown>): StandardBilling_WebhookEvent;
|
|
140
156
|
/** Get all simulated webhook events */
|
|
141
157
|
getSimulatedWebhooks(): StandardBilling_WebhookEvent[];
|
|
158
|
+
/**
|
|
159
|
+
* Put an invoice on the provider WITHOUT emitting the webhook that would normally announce it.
|
|
160
|
+
*
|
|
161
|
+
* That silence is the whole point: it reproduces the one condition the reconciliation sweep
|
|
162
|
+
* exists for — an invoice that exists at the provider and nowhere locally, because its delivery
|
|
163
|
+
* was lost. Seeding it alongside `simulateWebhook` would test the path that already works.
|
|
164
|
+
*/
|
|
165
|
+
seedInvoice(invoice: Omit<MockInvoice, 'createdAt'> & {
|
|
166
|
+
createdAt?: Date;
|
|
167
|
+
}): MockInvoice;
|
|
142
168
|
createCustomer(request: StandardBilling_CreateCustomerRequest): Promise<StandardBilling_CreateCustomerResponse>;
|
|
143
169
|
updateCustomer(providerCustomerId: string, request: StandardBilling_UpdateCustomerRequest): Promise<void>;
|
|
144
170
|
deleteCustomer(providerCustomerId: string): Promise<void>;
|
|
@@ -161,6 +187,9 @@ export declare class MockBillingProvider implements StandardBilling_Interface {
|
|
|
161
187
|
pauseSubscription(providerSubscriptionId: string): Promise<void>;
|
|
162
188
|
resumeSubscription(providerSubscriptionId: string): Promise<void>;
|
|
163
189
|
retrieveSubscription(providerSubscriptionId: string): Promise<StandardBilling_SubscriptionData>;
|
|
190
|
+
listInvoices(providerCustomerId: string, options?: {
|
|
191
|
+
limit?: number;
|
|
192
|
+
}): Promise<StandardBilling_InvoiceData[]>;
|
|
164
193
|
retrieveUpcomingInvoice(providerSubscriptionId: string, newPriceId?: string): Promise<StandardBilling_InvoicePreview>;
|
|
165
194
|
createCheckoutSession(request: StandardBilling_CreateCheckoutSessionRequest): Promise<StandardBilling_CreateCheckoutSessionResponse>;
|
|
166
195
|
createCustomerPortalSession(providerCustomerId: string, returnUrl: string): Promise<StandardBilling_CreateCustomerPortalSessionResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-billing-provider.d.ts","sourceRoot":"","sources":["../../../../../src/billing/testing/mock-billing-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,qCAAqC,EAC1C,KAAK,sCAAsC,EAC3C,KAAK,qCAAqC,EAC1C,KAAK,+BAA+B,EACpC,KAAK,oCAAoC,EACzC,KAAK,kCAAkC,EACvC,KAAK,mCAAmC,EACxC,KAAK,gCAAgC,EACrC,KAAK,iCAAiC,EACtC,KAAK,yCAAyC,EAC9C,KAAK,0CAA0C,EAC/C,KAAK,yCAAyC,EAC9C,KAAK,yCAAyC,EAC9C,KAAK,gCAAgC,EACrC,KAAK,8BAA8B,EACnC,KAAK,4CAA4C,EACjD,KAAK,6CAA6C,EAClD,KAAK,mDAAmD,EACxD,KAAK,kCAAkC,EACvC,KAAK,4BAA4B,EACjC,KAAK,mCAAmC,EACxC,KAAK,oCAAoC,EACzC,KAAK,2CAA2C,EAChD,yBAAyB,EACzB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"mock-billing-provider.d.ts","sourceRoot":"","sources":["../../../../../src/billing/testing/mock-billing-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ export class MockBillingProvider {
|
|
|
39
39
|
subscriptions = new Map();
|
|
40
40
|
coupons = new Map();
|
|
41
41
|
promotionCodes = new Map();
|
|
42
|
+
invoices = new Map();
|
|
42
43
|
usageRecords = [];
|
|
43
44
|
// ── Call tracking ──
|
|
44
45
|
callLog = [];
|
|
@@ -73,6 +74,7 @@ export class MockBillingProvider {
|
|
|
73
74
|
this.subscriptions.clear();
|
|
74
75
|
this.coupons.clear();
|
|
75
76
|
this.promotionCodes.clear();
|
|
77
|
+
this.invoices.clear();
|
|
76
78
|
this.usageRecords.length = 0;
|
|
77
79
|
this.callLog = [];
|
|
78
80
|
this.webhookEvents = [];
|
|
@@ -99,6 +101,18 @@ export class MockBillingProvider {
|
|
|
99
101
|
getSimulatedWebhooks() {
|
|
100
102
|
return [...this.webhookEvents];
|
|
101
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Put an invoice on the provider WITHOUT emitting the webhook that would normally announce it.
|
|
106
|
+
*
|
|
107
|
+
* That silence is the whole point: it reproduces the one condition the reconciliation sweep
|
|
108
|
+
* exists for — an invoice that exists at the provider and nowhere locally, because its delivery
|
|
109
|
+
* was lost. Seeding it alongside `simulateWebhook` would test the path that already works.
|
|
110
|
+
*/
|
|
111
|
+
seedInvoice(invoice) {
|
|
112
|
+
const stored = { ...invoice, createdAt: invoice.createdAt ?? new Date() };
|
|
113
|
+
this.invoices.set(stored.providerInvoiceId, stored);
|
|
114
|
+
return stored;
|
|
115
|
+
}
|
|
102
116
|
// ══════════════════════════════════════════════════════════════
|
|
103
117
|
// StandardBilling_Interface Implementation
|
|
104
118
|
// ══════════════════════════════════════════════════════════════
|
|
@@ -330,6 +344,17 @@ export class MockBillingProvider {
|
|
|
330
344
|
this.log('retrieveSubscription', [providerSubscriptionId], result);
|
|
331
345
|
return result;
|
|
332
346
|
}
|
|
347
|
+
async listInvoices(providerCustomerId, options) {
|
|
348
|
+
const result = [...this.invoices.values()]
|
|
349
|
+
.filter(invoice => invoice.providerCustomerId === providerCustomerId)
|
|
350
|
+
// Newest first, matching every real provider's default ordering — a sweep that asks for a
|
|
351
|
+
// bounded page and gets the OLDEST invoices would never see the recent one it is looking for.
|
|
352
|
+
.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
|
|
353
|
+
.slice(0, options?.limit ?? 20)
|
|
354
|
+
.map(invoice => ({ ...invoice }));
|
|
355
|
+
this.log('listInvoices', [providerCustomerId, options], result);
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
333
358
|
async retrieveUpcomingInvoice(providerSubscriptionId, newPriceId) {
|
|
334
359
|
const sub = this.subscriptions.get(providerSubscriptionId);
|
|
335
360
|
if (!sub)
|