@wildo-ai/saas-backend-lib 1.1.2 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.d.ts.map +1 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js +19 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js +4 -0
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts +35 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js +111 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts +50 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js +199 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts +111 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts.map +1 -1
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js +140 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +27 -6
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts +124 -13
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +207 -21
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts +60 -8
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +174 -26
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +47 -4
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +96 -29
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts +89 -14
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js +84 -11
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +9 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +49 -0
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +171 -18
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +23 -3
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +20 -0
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts +22 -0
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +4 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts +11 -0
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js +39 -5
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +181 -2
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +529 -41
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts +36 -3
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.js +70 -8
- package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts +28 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js +90 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts +44 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js +99 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts +91 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js +152 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +186 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +474 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts +100 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js +209 -6
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts +200 -4
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js +593 -64
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts +36 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js +83 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts +9 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js +11 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +48 -7
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +38 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +67 -2
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts +30 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js +43 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts +11 -3
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js +30 -16
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js +104 -25
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +18 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +106 -2
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts +52 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js +74 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -0
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts +104 -11
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +260 -26
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts +30 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.js +25 -0
- package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js +11 -4
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +225 -13
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +340 -62
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +244 -7
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +386 -5
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +6 -2
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +31 -9
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +57 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +31 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts +5 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js +6 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.d.ts +142 -46
- package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.js +121 -12
- package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts +38 -15
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js +17 -2
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts +0 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.js +68 -76
- package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
- package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts +33 -0
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.js +39 -1
- package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +25 -0
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js +41 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js +48 -0
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
- package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.js +129 -8
- package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
- package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +59 -2
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +52 -17
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts +4 -2
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +256 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +333 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js +211 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts +45 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js +216 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js +78 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -0
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js +2 -2
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts +89 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js +164 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts +26 -27
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js +50 -64
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.js +3 -3
- package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.js +4 -4
- package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +292 -7
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +533 -45
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +25 -2
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
- package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
- package/dist/esm/files/controllers/file.controller.js +21 -13
- package/dist/esm/files/controllers/file.controller.js.map +1 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +39 -15
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.d.ts +94 -9
- package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.js +197 -17
- package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts +60 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.js +167 -8
- package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +53 -2
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-upload-grant.backend.service.js +127 -3
- package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -1
- package/dist/esm/files/services/files.backend.service.d.ts +68 -0
- package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/files.backend.service.js +175 -5
- package/dist/esm/files/services/files.backend.service.js.map +1 -1
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts +109 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js +123 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -0
- package/dist/esm/files/storage/file-storage-provider.types.d.ts +16 -10
- package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
- package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts +67 -8
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js +101 -28
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js +8 -55
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js +20 -0
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts +86 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js +288 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts +15 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js +76 -5
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js +6 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts +60 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js +63 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +196 -40
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts +0 -13
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js +14 -22
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts +8 -3
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js +25 -15
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts +13 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +88 -8
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +333 -31
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js +4 -2
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts +113 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js +62 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -0
- package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/actors-system.backend.service.js +0 -2
- package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts +28 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.js +204 -18
- package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +5 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +79 -16
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +34 -5
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js +154 -20
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.js +27 -23
- package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js +7 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts +90 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js +368 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +8 -4
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts +0 -207
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js +8 -243
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts +9 -14
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js +18 -89
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts +86 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js +155 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts +10 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js +55 -5
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
- package/dist/esm/index.d.ts +11 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +31 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/inject/models/container.d.ts.map +1 -1
- package/dist/esm/inject/models/container.js +78 -10
- package/dist/esm/inject/models/container.js.map +1 -1
- package/dist/esm/inject/models/service-types.d.ts +17 -3
- package/dist/esm/inject/models/service-types.d.ts.map +1 -1
- package/dist/esm/inject/models/service-types.js +19 -3
- package/dist/esm/inject/models/service-types.js.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.js +20 -0
- package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +56 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.js +107 -11
- package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +22 -0
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js +49 -4
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts +66 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js +199 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts +149 -13
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js +411 -19
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts +11 -2
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts +28 -9
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js +30 -10
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
- package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.js +52 -11
- package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts +62 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js +78 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +309 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +385 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts +21 -0
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.js +38 -0
- package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -80
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -25
- package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -49
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -141
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -37
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -121
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts +66 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js +105 -10
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -58
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -223
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js +10 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.d.ts +60 -4
- package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.js +145 -43
- package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts +0 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
- package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +99 -13
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +422 -66
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +2 -2
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.js +5 -5
- package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +46 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +16 -6
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +12 -12
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts +16 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js +18 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js +63 -2
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts +66 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js +257 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts +12 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js +47 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts +87 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts +31 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js +13 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts +19 -25
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js +33 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.js +1 -4
- package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.js +1 -4
- package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.js +1 -4
- package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts +8 -4
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.js +25 -17
- package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
- package/dist/esm/queue/queue.backend.service.d.ts +3 -3
- package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue.backend.service.js +26 -4
- package/dist/esm/queue/queue.backend.service.js.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts +2 -2
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js +18 -3
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts +50 -25
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js +147 -39
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
- package/dist/esm/requests/service/websocket.service.d.ts +9 -0
- package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
- package/dist/esm/requests/service/websocket.service.js +32 -8
- package/dist/esm/requests/service/websocket.service.js.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +14 -2
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.js +2 -0
- package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js +14 -0
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts +2 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.js +8 -0
- package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts +60 -5
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.js +90 -6
- package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts +36 -3
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.js +32 -10
- package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.js +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts +51 -0
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.d.ts +26 -0
- package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.js +181 -1
- package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts +19 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.js +261 -77
- package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts +15 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js +28 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts +5 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js +24 -4
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +29 -4
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts +114 -0
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js +354 -3
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts +1 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js +22 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts +0 -2
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js +23 -14
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts +0 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js +15 -12
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts +113 -3
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js +207 -30
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts +95 -2
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js +153 -9
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +190 -0
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +377 -53
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +68 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts +41 -0
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js +202 -23
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +42 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +34 -4
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts +29 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js +77 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +17 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +49 -17
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts +28 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +283 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts +35 -0
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js +111 -21
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts +14 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js +49 -8
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js +4 -0
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js +6 -0
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts +37 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js +51 -0
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts +41 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js +45 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts +116 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js +162 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -0
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts +20 -20
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js +27 -28
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +77 -3
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +93 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js +95 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -0
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +124 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +142 -5
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +74 -8
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js +175 -19
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +6 -14
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +13 -22
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts +60 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js +79 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +161 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +512 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +59 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js +22 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts +44 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js +20 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +191 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +385 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts +41 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js +358 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts +160 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +266 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +111 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +107 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts +54 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +153 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +195 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +387 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts +45 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js +291 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +62 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js +29 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts +127 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js +277 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts +66 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js +75 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -0
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +21 -3
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +26 -16
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts +26 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js +43 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +8 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +49 -0
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.js +17 -5
- package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts +67 -29
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js +47 -25
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts +143 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js +258 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts +39 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js +159 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +11 -9
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Flow:
|
|
8
8
|
* 1. Operation hook calls recordUsage() after successful operation
|
|
9
|
-
* 2. Usage records are stored in DB (
|
|
9
|
+
* 2. Usage records are stored in DB (flushState: pending)
|
|
10
10
|
* 3. Periodic flush (cron) aggregates and reports to provider
|
|
11
11
|
* 4. Provider bills at the end of the billing period
|
|
12
12
|
*
|
|
@@ -24,16 +24,39 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
24
24
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
25
25
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
26
26
|
};
|
|
27
|
+
var UsageMeteringBackendService_1;
|
|
27
28
|
import { injectable, inject } from 'inversify';
|
|
28
|
-
import {
|
|
29
|
+
import { createHash } from 'node:crypto';
|
|
30
|
+
import { UsageSourceType, UsageRecordFlushState, UsageRecordUnreportableReason, ProductType, SubscriptionStatus, MeteringAggregationWindow, CoreResourceType, CoreResourceOperation, } from '@wildo-ai/saas-models';
|
|
29
31
|
import { AbstractBillingBackendService } from '../../../billing/services/back-office/abstract-billing.backend.service.js';
|
|
30
|
-
import { BILLING_SCOPE_TO_VARIANTS } from '../../../billing/services/custom-impl/billing-custom-impl-utils.backend.js';
|
|
32
|
+
import { BILLING_SCOPE_TO_VARIANTS, resolveBillingVariants } from '../../../billing/services/custom-impl/billing-custom-impl-utils.backend.js';
|
|
31
33
|
import { SAAS_SERVICE_TYPES } from '../../../inject/models/service-types.js';
|
|
32
34
|
// =====================================================
|
|
33
35
|
// Service
|
|
34
36
|
// =====================================================
|
|
35
37
|
let UsageMeteringBackendService = class UsageMeteringBackendService extends AbstractBillingBackendService {
|
|
38
|
+
static { UsageMeteringBackendService_1 = this; }
|
|
36
39
|
repositoriesRegistry;
|
|
40
|
+
/**
|
|
41
|
+
* How many rows one LIST page fetches while draining the pending set.
|
|
42
|
+
*
|
|
43
|
+
* A page size, never a cap: the drain pages until exhausted. It exists because a single query for an
|
|
44
|
+
* unbounded set is the shape that produced the `limit: 10000` this replaced.
|
|
45
|
+
*/
|
|
46
|
+
static FLUSH_PAGE_SIZE = 500;
|
|
47
|
+
/**
|
|
48
|
+
* The runaway guard, in PAGES. Reaching it aborts the scope and reports nothing — see
|
|
49
|
+
* `listAllUnreportedRecords` for why a partial flush is worse than none.
|
|
50
|
+
*
|
|
51
|
+
* 2,000 pages is a million pending rows. That is not a busy hour, it is a flush that has not run for
|
|
52
|
+
* a long time, and the right response is a person rather than a bigger number.
|
|
53
|
+
*/
|
|
54
|
+
static MAX_FLUSH_PAGES = 2_000;
|
|
55
|
+
/** First retry delay; each subsequent one multiplies by the product's `backoffMultiplier`. */
|
|
56
|
+
static RETRY_BASE_DELAY_MS = 250;
|
|
57
|
+
/** Per-run caches, held only for the duration of one `flushToProvider`. `null` means "looked up, absent". */
|
|
58
|
+
flushProductCache;
|
|
59
|
+
flushPeriodCache;
|
|
37
60
|
constructor(logger, servicesRegistry, executionContextCreator, resourcesRegistry, errorBuilder, repositoriesRegistry) {
|
|
38
61
|
super(logger, servicesRegistry, executionContextCreator, resourcesRegistry, errorBuilder);
|
|
39
62
|
this.repositoriesRegistry = repositoriesRegistry;
|
|
@@ -55,6 +78,15 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
|
|
|
55
78
|
* Stores locally — NOT reported to provider immediately.
|
|
56
79
|
*
|
|
57
80
|
* @param variants — resolved billing polymorphic variants for the target scope
|
|
81
|
+
* @returns whether a usage row was actually written.
|
|
82
|
+
*
|
|
83
|
+
* The return type was `void` until 2026-09-08 (#415), which was harmless only while nothing called
|
|
84
|
+
* this: the method DECLINES silently when the account holds no active metered subscription, so a
|
|
85
|
+
* caller could not distinguish "recorded" from "declined". The first real caller then reported the
|
|
86
|
+
* quantity it had ASKED for whichever happened — an operational counter claiming usage that was
|
|
87
|
+
* never written, the same shape as the discarded `modifiedCount` this file already fixed once in
|
|
88
|
+
* the flush. Caught by a pin rather than by a reading, which is the argument for writing the
|
|
89
|
+
* refusal cases as carefully as the success ones.
|
|
58
90
|
*/
|
|
59
91
|
async recordUsage(variants, billingAccountId, productKey, quantity, options) {
|
|
60
92
|
this.logDebug('Recording usage', { billingAccountId, productKey, quantity, scope: variants.scopeType });
|
|
@@ -65,7 +97,7 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
|
|
|
65
97
|
productKey,
|
|
66
98
|
scope: variants.scopeType,
|
|
67
99
|
});
|
|
68
|
-
return;
|
|
100
|
+
return false;
|
|
69
101
|
}
|
|
70
102
|
const ctx = await this.internalCtx(variants.usageRecord, CoreResourceOperation.CREATE);
|
|
71
103
|
await this.servicesRegistry.create(variants.usageRecord, ctx, {
|
|
@@ -74,9 +106,109 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
|
|
|
74
106
|
quantity,
|
|
75
107
|
timestamp: new Date(),
|
|
76
108
|
source: options?.source,
|
|
77
|
-
|
|
109
|
+
flushState: UsageRecordFlushState.PENDING,
|
|
78
110
|
metadata: options?.metadata,
|
|
79
111
|
});
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Record usage declared by an OPERATION, resolving the scope, the billing account and the quantity
|
|
116
|
+
* from the operation's own execution context and result (#415).
|
|
117
|
+
*
|
|
118
|
+
* This is the caller `recordUsage` never had. Until it existed, a product could be declared METERED,
|
|
119
|
+
* priced and synced to the provider while nothing in the framework ever wrote a usage row — the
|
|
120
|
+
* only way to meter was to reach into this service by hand from a custom implementation, which is a
|
|
121
|
+
* workaround rather than an authoring surface.
|
|
122
|
+
*
|
|
123
|
+
* **Never throws.** It runs after a write has already committed, so a failure here must not turn a
|
|
124
|
+
* successful operation into an error the caller sees. Every refusal is a warning naming the product
|
|
125
|
+
* and the reason, because an unrecorded unit is revenue that will not be billed and the log line is
|
|
126
|
+
* the only thing that will ever say so.
|
|
127
|
+
*
|
|
128
|
+
* @returns the quantity recorded, or 0 when nothing was recorded — so a caller can log the outcome
|
|
129
|
+
* rather than assume it.
|
|
130
|
+
*/
|
|
131
|
+
async recordDeclaredOperationUsage(declaration, executionContext, operationResult) {
|
|
132
|
+
try {
|
|
133
|
+
const variants = resolveBillingVariants(executionContext);
|
|
134
|
+
if (!variants) {
|
|
135
|
+
this.logger.warn('Declared metered usage not recorded: no billing scope on the execution context', {
|
|
136
|
+
productKey: declaration.productKey,
|
|
137
|
+
});
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
const quantity = this.resolveDeclaredQuantity(declaration, operationResult);
|
|
141
|
+
if (quantity === undefined)
|
|
142
|
+
return 0;
|
|
143
|
+
// Zero is a legitimate outcome of a result-derived quantity — an export of nothing — and
|
|
144
|
+
// reporting it would be a meter event carrying no usage.
|
|
145
|
+
if (quantity === 0)
|
|
146
|
+
return 0;
|
|
147
|
+
const billingAccountId = await this.resolveBillingAccountIdForScope(variants, executionContext);
|
|
148
|
+
if (!billingAccountId) {
|
|
149
|
+
this.logger.warn('Declared metered usage not recorded: no billing account for this scope', {
|
|
150
|
+
productKey: declaration.productKey,
|
|
151
|
+
scope: variants.scopeType,
|
|
152
|
+
});
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
// Honour what `recordUsage` REPORTS rather than what was asked for: it declines silently when
|
|
156
|
+
// the account holds no active metered subscription, and returning the requested quantity there
|
|
157
|
+
// would make the hook's own log claim usage that was never written.
|
|
158
|
+
const recorded = await this.recordUsage(variants, billingAccountId, declaration.productKey, quantity, {
|
|
159
|
+
source: {
|
|
160
|
+
// OPERATION, and this declaration is what that member was always for: usage generated by a
|
|
161
|
+
// resource operation succeeding, as opposed to a periodic RESOURCE_COUNT or a CUSTOM
|
|
162
|
+
// recording an application makes for itself.
|
|
163
|
+
type: UsageSourceType.OPERATION,
|
|
164
|
+
resourceType: String(executionContext.operation?.resourceIdentifier ?? ''),
|
|
165
|
+
operationIdentifier: String(executionContext.operation?.operationIdentifier ?? ''),
|
|
166
|
+
description: 'Declared on the operation configuration',
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
return recorded ? quantity : 0;
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
this.logger.error('Failed to record declared metered usage', {
|
|
173
|
+
productKey: declaration.productKey,
|
|
174
|
+
message: error.message,
|
|
175
|
+
});
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* The declared quantity: fixed, or read from the written row.
|
|
181
|
+
*
|
|
182
|
+
* A `quantityFromResultField` that does not resolve to a finite non-negative number records NOTHING
|
|
183
|
+
* and warns, rather than falling back to 1. Silently billing the wrong amount is worse than billing
|
|
184
|
+
* nothing and saying so — a fallback here would be a wrong number nobody could distinguish from a
|
|
185
|
+
* right one.
|
|
186
|
+
*/
|
|
187
|
+
resolveDeclaredQuantity(declaration, operationResult) {
|
|
188
|
+
if (declaration.quantityFromResultField === undefined) {
|
|
189
|
+
return declaration.quantity ?? 1;
|
|
190
|
+
}
|
|
191
|
+
const raw = declaration.quantityFromResultField
|
|
192
|
+
.split('.')
|
|
193
|
+
.reduce((value, segment) => (value !== null && typeof value === 'object' ? value[segment] : undefined), operationResult);
|
|
194
|
+
if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 0) {
|
|
195
|
+
this.logger.warn('Declared metered usage not recorded: quantity field did not resolve to a usable number', {
|
|
196
|
+
productKey: declaration.productKey,
|
|
197
|
+
quantityFromResultField: declaration.quantityFromResultField,
|
|
198
|
+
resolvedType: typeof raw,
|
|
199
|
+
});
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
return raw;
|
|
203
|
+
}
|
|
204
|
+
/** The scope's billing account, addressed by the scope entity rather than by an id the caller supplies. */
|
|
205
|
+
async resolveBillingAccountIdForScope(variants, executionContext) {
|
|
206
|
+
const scopeEntityId = executionContext[variants.scopeKey];
|
|
207
|
+
if (!scopeEntityId)
|
|
208
|
+
return undefined;
|
|
209
|
+
const ctx = await this.internalCtx(variants.billingAccount, CoreResourceOperation.LIST);
|
|
210
|
+
const accounts = await this.servicesRegistry.list(variants.billingAccount, ctx, { [variants.scopeEntityDocField]: scopeEntityId }, { page: 1, limit: 1 });
|
|
211
|
+
return accounts[0]?._id;
|
|
80
212
|
}
|
|
81
213
|
/**
|
|
82
214
|
* Get usage summary for a billing account.
|
|
@@ -95,6 +227,12 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
|
|
|
95
227
|
}),
|
|
96
228
|
};
|
|
97
229
|
const ctx = await this.internalCtx(variants.usageRecord, CoreResourceOperation.LIST);
|
|
230
|
+
/*
|
|
231
|
+
* A SUMMARY read, and its cap is honest about being one: `getUsage` answers "roughly how much has
|
|
232
|
+
* this account used", for a dashboard. It is not the billing path — `flushToProvider` drains the
|
|
233
|
+
* pending set by paging and never truncates, because money depends on it. Keeping a cap here and
|
|
234
|
+
* removing it there is the distinction, not an inconsistency.
|
|
235
|
+
*/
|
|
98
236
|
const records = await this.servicesRegistry.list(variants.usageRecord, ctx, filters, { limit: 10000 });
|
|
99
237
|
// Aggregate by product key
|
|
100
238
|
const usage = {};
|
|
@@ -112,15 +250,23 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
|
|
|
112
250
|
*/
|
|
113
251
|
async flushToProvider() {
|
|
114
252
|
if (!this.billingProvider) {
|
|
115
|
-
return { totalRecords: 0, reported: 0, failed: 0, errors: ['Provider not initialized'] };
|
|
253
|
+
return { totalRecords: 0, reported: 0, failed: 0, unreportable: 0, errors: ['Provider not initialized'], quantityRecorded: 0, quantityReported: 0, quantityUnreportable: 0 };
|
|
116
254
|
}
|
|
117
255
|
this.logDebug('Starting usage flush to provider');
|
|
118
256
|
const result = {
|
|
119
257
|
totalRecords: 0,
|
|
120
258
|
reported: 0,
|
|
121
259
|
failed: 0,
|
|
260
|
+
unreportable: 0,
|
|
122
261
|
errors: [],
|
|
262
|
+
quantityRecorded: 0,
|
|
263
|
+
quantityReported: 0,
|
|
264
|
+
quantityUnreportable: 0,
|
|
123
265
|
};
|
|
266
|
+
// Per-run caches. A flush touches the same handful of products and subscriptions repeatedly, and
|
|
267
|
+
// both lookups are needed PER GROUP; without these the policy read alone is one query per group.
|
|
268
|
+
this.flushProductCache = new Map();
|
|
269
|
+
this.flushPeriodCache = new Map();
|
|
124
270
|
// Process each billing scope independently — usage records live in per-scope collections
|
|
125
271
|
for (const [scopeKey, scopeData] of Object.entries(BILLING_SCOPE_TO_VARIANTS)) {
|
|
126
272
|
const variants = { scopeKey, ...scopeData };
|
|
@@ -131,6 +277,34 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
|
|
|
131
277
|
result.errors.push(`Flush error for scope ${variants.scopeType}: ${error.message}`);
|
|
132
278
|
}
|
|
133
279
|
}
|
|
280
|
+
/*
|
|
281
|
+
* The reconciliation check, stated as an ERROR rather than left to a reader of two numbers.
|
|
282
|
+
* Anything not reported is money not billed, and the run is the only moment at which the two
|
|
283
|
+
* quantities are both known.
|
|
284
|
+
*/
|
|
285
|
+
/*
|
|
286
|
+
* Unreportable quantity is stated on its OWN line, and always — it is not an anomaly to be
|
|
287
|
+
* inferred from a mismatch. This is usage a customer generated and will never be billed for,
|
|
288
|
+
* which somebody may want to write off, invoice out of band, or simply know about. It appears
|
|
289
|
+
* exactly once per row, on the run that made the determination, because the row leaves the
|
|
290
|
+
* pending set at the same moment (#512).
|
|
291
|
+
*/
|
|
292
|
+
if (result.quantityUnreportable > 0) {
|
|
293
|
+
result.errors.push(`UNREPORTABLE USAGE — ${result.quantityUnreportable} unit(s) across ${result.unreportable} record(s) were ` +
|
|
294
|
+
`permanently abandoned this run and will never be billed. The per-group lines above name the billing ` +
|
|
295
|
+
`accounts and the reason. Those rows are now marked unreportable and will not be selected again, so ` +
|
|
296
|
+
`THIS IS THE ONLY RUN THAT WILL REPORT THEM.`);
|
|
297
|
+
}
|
|
298
|
+
const quantityAccountedFor = result.quantityReported + result.quantityUnreportable;
|
|
299
|
+
if (quantityAccountedFor !== result.quantityRecorded) {
|
|
300
|
+
const shortfall = result.quantityRecorded - quantityAccountedFor;
|
|
301
|
+
result.errors.push(`RECONCILIATION MISMATCH — ${result.quantityRecorded} unit(s) of usage were pending, ` +
|
|
302
|
+
`${result.quantityReported} were reported to the provider and ${result.quantityUnreportable} were ` +
|
|
303
|
+
`determined unreportable (${shortfall > 0 ? `${shortfall} NEITHER billed nor accounted for` : `${-shortfall} billed in EXCESS`}). ` +
|
|
304
|
+
`The per-group errors above name which groups; every row left pending stays selectable by the next run.`);
|
|
305
|
+
}
|
|
306
|
+
this.flushProductCache = undefined;
|
|
307
|
+
this.flushPeriodCache = undefined;
|
|
134
308
|
this.logDebug('Usage flush complete', { ...result });
|
|
135
309
|
return result;
|
|
136
310
|
}
|
|
@@ -138,83 +312,383 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
|
|
|
138
312
|
// Private — Flush per scope
|
|
139
313
|
// ════════════════════════════════════════════════════════════
|
|
140
314
|
async flushScopeToProvider(variants, result) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
315
|
+
const pending = await this.listAllUnreportedRecords(variants, result);
|
|
316
|
+
if (pending.length === 0)
|
|
317
|
+
return;
|
|
318
|
+
const records = await this.selectDueRecords(pending);
|
|
144
319
|
result.totalRecords += records.length;
|
|
320
|
+
for (const record of records)
|
|
321
|
+
result.quantityRecorded += record.quantity;
|
|
145
322
|
if (records.length === 0)
|
|
146
323
|
return;
|
|
147
|
-
|
|
324
|
+
const groups = await this.buildFlushGroups(variants, records);
|
|
325
|
+
for (const group of groups) {
|
|
326
|
+
await this.reportGroup(variants, group, result);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Page through EVERY unreported row in this scope.
|
|
331
|
+
*
|
|
332
|
+
* The whole set is read before anything is reported, because aggregation is defined over the whole
|
|
333
|
+
* pending set and a page is not a meaningful unit of it.
|
|
334
|
+
*
|
|
335
|
+
* This replaced a single `{ limit: 10000 }` (#415). That cap did not fail when it was reached — it
|
|
336
|
+
* returned the first ten thousand rows and the run looked healthy, so the eleven-thousandth unit of
|
|
337
|
+
* usage was simply never billed and nothing anywhere said so. A cap that is reached is money not
|
|
338
|
+
* billed; the only honest cap is one that REFUSES.
|
|
339
|
+
*/
|
|
340
|
+
async listAllUnreportedRecords(variants, result) {
|
|
341
|
+
const listCtx = await this.internalCtx(variants.usageRecord, CoreResourceOperation.LIST);
|
|
342
|
+
const collected = [];
|
|
343
|
+
for (let page = 1; page <= UsageMeteringBackendService_1.MAX_FLUSH_PAGES; page += 1) {
|
|
344
|
+
const pageRecords = await this.servicesRegistry.list(variants.usageRecord, listCtx, { flushState: UsageRecordFlushState.PENDING }, { page, limit: UsageMeteringBackendService_1.FLUSH_PAGE_SIZE });
|
|
345
|
+
collected.push(...pageRecords);
|
|
346
|
+
if (pageRecords.length < UsageMeteringBackendService_1.FLUSH_PAGE_SIZE)
|
|
347
|
+
return collected;
|
|
348
|
+
}
|
|
349
|
+
/*
|
|
350
|
+
* The runaway guard, and it reports NOTHING rather than reporting what it has. A partial flush
|
|
351
|
+
* would mark those rows reported and leave the rest for a next run that would hit the same wall,
|
|
352
|
+
* so the backlog would never drain while every run looked partially successful. Refusing keeps
|
|
353
|
+
* every row selectable and puts a human in front of the reason.
|
|
354
|
+
*/
|
|
355
|
+
result.errors.push(`FLUSH ABORTED for scope ${variants.scopeType}: more than ` +
|
|
356
|
+
`${UsageMeteringBackendService_1.MAX_FLUSH_PAGES * UsageMeteringBackendService_1.FLUSH_PAGE_SIZE} unreported usage rows. ` +
|
|
357
|
+
`Nothing was reported for this scope — every row remains pending. This is a backlog, not a spike: ` +
|
|
358
|
+
`investigate why the scheduled flush stopped running before draining it.`);
|
|
359
|
+
return [];
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Keep only the rows whose PRODUCT is due to be flushed, per its authored `flushIntervalMinutes`
|
|
363
|
+
* (#415).
|
|
364
|
+
*
|
|
365
|
+
* The field means "usage for this product should reach the provider within N minutes of being
|
|
366
|
+
* recorded", so a product is due when its OLDEST pending row has waited that long. Derived from the
|
|
367
|
+
* rows already in hand — no last-flush timestamp is stored anywhere, because storing one would be a
|
|
368
|
+
* second source of truth for something the rows already say, and one that can go stale.
|
|
369
|
+
*
|
|
370
|
+
* The batch runs on a cadence at least as fast as the shortest interval any product can author; this
|
|
371
|
+
* is what turns one shared schedule into per-product intervals. A product authoring 1440 accumulates
|
|
372
|
+
* for a day and produces one provider event instead of 288, which is what its author asked for.
|
|
373
|
+
*
|
|
374
|
+
* Note the ASYMMETRY, and it is deliberate: waiting is per product, but once ONE product is due its
|
|
375
|
+
* rows go now rather than at the next tick. Reporting sooner than authored is never wrong; later is.
|
|
376
|
+
*/
|
|
377
|
+
async selectDueRecords(records) {
|
|
378
|
+
const oldestByProduct = new Map();
|
|
379
|
+
for (const record of records) {
|
|
380
|
+
const at = (record.timestamp instanceof Date ? record.timestamp : new Date(record.timestamp)).getTime();
|
|
381
|
+
const seen = oldestByProduct.get(record.productKey);
|
|
382
|
+
if (seen === undefined || at < seen)
|
|
383
|
+
oldestByProduct.set(record.productKey, at);
|
|
384
|
+
}
|
|
385
|
+
const now = Date.now();
|
|
386
|
+
const dueProducts = new Set();
|
|
387
|
+
for (const [productKey, oldest] of oldestByProduct) {
|
|
388
|
+
const policy = await this.resolveMeteringPolicy(productKey);
|
|
389
|
+
const intervalMinutes = policy?.flushIntervalMinutes;
|
|
390
|
+
// No authored policy means no authored patience: flush it on this tick, which is what every
|
|
391
|
+
// product did before the field was read.
|
|
392
|
+
if (intervalMinutes === undefined || now - oldest >= intervalMinutes * 60_000) {
|
|
393
|
+
dueProducts.add(productKey);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return records.filter((record) => dueProducts.has(record.productKey));
|
|
397
|
+
}
|
|
398
|
+
// ════════════════════════════════════════════════════════════
|
|
399
|
+
// Private — Grouping (the authored metering policy is READ here)
|
|
400
|
+
// ════════════════════════════════════════════════════════════
|
|
401
|
+
/**
|
|
402
|
+
* Turn pending rows into the groups that will each become one provider meter event, honouring the
|
|
403
|
+
* product's authored `metering` policy (#415).
|
|
404
|
+
*
|
|
405
|
+
* Until this existed the policy block was declared, defaulted, documented and read by NOTHING: every
|
|
406
|
+
* row was merged by (account, product) whatever the product said, so `preFlushAggregation: false`
|
|
407
|
+
* was unrepresentable and `aggregationWindow` chose between two behaviours that were the same one.
|
|
408
|
+
* Its own JSDoc said so and asked that the gap stay visible, which is why this comment says what
|
|
409
|
+
* replaced it.
|
|
410
|
+
*
|
|
411
|
+
* The policy is per PRODUCT, so two products flushing in the same run are grouped by their own
|
|
412
|
+
* rules — that is why the policy is resolved inside the loop rather than once for the run.
|
|
413
|
+
*/
|
|
414
|
+
async buildFlushGroups(variants, records) {
|
|
148
415
|
const billingAccountFk = variants.billingAccountFkField;
|
|
149
|
-
const
|
|
150
|
-
const
|
|
416
|
+
const grouped = new Map();
|
|
417
|
+
const ungrouped = [];
|
|
151
418
|
for (const record of records) {
|
|
152
|
-
const
|
|
153
|
-
const
|
|
419
|
+
const billingAccountId = record[billingAccountFk];
|
|
420
|
+
const timestamp = record.timestamp instanceof Date ? record.timestamp : new Date(record.timestamp);
|
|
421
|
+
const policy = await this.resolveMeteringPolicy(record.productKey);
|
|
422
|
+
/*
|
|
423
|
+
* `preFlushAggregation: false` means exactly what it says: report each row on its own. It is the
|
|
424
|
+
* shape a product picks when the provider must see every event — because the provider's own
|
|
425
|
+
* aggregation differs from a sum, or because each event carries a distinct instant. Merging
|
|
426
|
+
* locally destroys both, irreversibly, before the provider ever sees them.
|
|
427
|
+
*/
|
|
428
|
+
if (policy?.preFlushAggregation === false) {
|
|
429
|
+
ungrouped.push({
|
|
430
|
+
billingAccountId,
|
|
431
|
+
productKey: record.productKey,
|
|
432
|
+
quantity: record.quantity,
|
|
433
|
+
recordIds: [record._id],
|
|
434
|
+
latestTimestamp: timestamp,
|
|
435
|
+
});
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
/*
|
|
439
|
+
* `PER_BILLING_PERIOD` splits a group at a billing-period boundary. It is not a preference: a
|
|
440
|
+
* merged group carries ONE timestamp, and the provider assigns a meter event to the period that
|
|
441
|
+
* timestamp falls in — so merging across a boundary bills a whole period's usage into the wrong
|
|
442
|
+
* period. `PER_FLUSH` merges everything pending, which is right when a product's periods do not
|
|
443
|
+
* matter to how it is priced.
|
|
444
|
+
*/
|
|
445
|
+
const periodStart = policy?.aggregationWindow === MeteringAggregationWindow.PER_BILLING_PERIOD
|
|
446
|
+
? await this.resolvePeriodStartFor(variants, billingAccountId, record.productKey, timestamp)
|
|
447
|
+
: undefined;
|
|
448
|
+
const key = `${billingAccountId}::${record.productKey}::${periodStart?.toISOString() ?? 'all'}`;
|
|
449
|
+
const existing = grouped.get(key);
|
|
154
450
|
if (existing) {
|
|
155
451
|
existing.quantity += record.quantity;
|
|
156
452
|
existing.recordIds.push(record._id);
|
|
453
|
+
if (timestamp > existing.latestTimestamp)
|
|
454
|
+
existing.latestTimestamp = timestamp;
|
|
157
455
|
}
|
|
158
456
|
else {
|
|
159
|
-
|
|
160
|
-
billingAccountId
|
|
457
|
+
grouped.set(key, {
|
|
458
|
+
billingAccountId,
|
|
161
459
|
productKey: record.productKey,
|
|
162
460
|
quantity: record.quantity,
|
|
163
461
|
recordIds: [record._id],
|
|
462
|
+
latestTimestamp: timestamp,
|
|
463
|
+
periodStart,
|
|
164
464
|
});
|
|
165
465
|
}
|
|
166
466
|
}
|
|
167
|
-
|
|
168
|
-
|
|
467
|
+
return [...grouped.values(), ...ungrouped];
|
|
468
|
+
}
|
|
469
|
+
// ════════════════════════════════════════════════════════════
|
|
470
|
+
// Private — Reporting one group
|
|
471
|
+
// ════════════════════════════════════════════════════════════
|
|
472
|
+
async reportGroup(variants, group, result) {
|
|
473
|
+
try {
|
|
474
|
+
const { accountExists, providerCustomerId } = await this.resolveProviderCustomer(variants, group.billingAccountId);
|
|
475
|
+
/*
|
|
476
|
+
* The billing account is GONE — permanent, and the reason the rows get a terminal state
|
|
477
|
+
* instead of another failure count (#512). Usage rows are RETAINED when their subject is
|
|
478
|
+
* erased, so this is a designed outcome rather than corruption; what was not designed was the
|
|
479
|
+
* flush treating it as retryable, which re-selected the same rows on every five-minute run,
|
|
480
|
+
* failed identically, and grew an error backlog no operator action could drain.
|
|
481
|
+
*/
|
|
482
|
+
if (!accountExists) {
|
|
483
|
+
result.errors.push(`UNREPORTABLE — billing account ${group.billingAccountId} no longer exists (scope: ${variants.scopeType}), so ` +
|
|
484
|
+
`${group.quantity} unit(s) of ${group.productKey} usage across ${group.recordIds.length} record(s) can never be ` +
|
|
485
|
+
`reported. The rows are RETAINED for the tax/audit obligation and are being marked unreportable so the flush ` +
|
|
486
|
+
`stops re-selecting them.`);
|
|
487
|
+
await this.markGroupUnreportable(variants, group, UsageRecordUnreportableReason.BILLING_ACCOUNT_DELETED, result);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
/*
|
|
491
|
+
* The account exists but has no provider customer yet — TRANSIENT. Provisioning may still
|
|
492
|
+
* complete, so the rows stay pending and this stays a failure. Do not be tempted to reuse the
|
|
493
|
+
* terminal state here: it would abandon billable usage the moment a flush overtook an
|
|
494
|
+
* in-progress customer creation.
|
|
495
|
+
*/
|
|
496
|
+
if (!providerCustomerId) {
|
|
497
|
+
result.errors.push(`No provider customer ID for billing account ${group.billingAccountId} (scope: ${variants.scopeType})`);
|
|
498
|
+
result.failed += group.recordIds.length;
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
const policy = await this.resolveMeteringPolicy(group.productKey);
|
|
502
|
+
/*
|
|
503
|
+
* The meterEventName is derived from the product key.
|
|
504
|
+
* Convention: product key IS the meter event name (configured when creating the meter in Stripe).
|
|
505
|
+
*
|
|
506
|
+
* `timestamp` and `identifier` were BOTH omitted until 2026-09-08 (#415), and each omission was
|
|
507
|
+
* its own defect:
|
|
508
|
+
*
|
|
509
|
+
* - Without a timestamp the provider stamps the event with the moment the FLUSH ran, so usage
|
|
510
|
+
* recorded before a period boundary and flushed after it is billed to the wrong period. Every
|
|
511
|
+
* metered product was exposed to that, on every run that crossed a boundary.
|
|
512
|
+
* - Without an identifier a re-report is a SECOND charge. The whole duplicate-charge apparatus
|
|
513
|
+
* below exists because of that, and an identifier is the provider's own answer to it: a meter
|
|
514
|
+
* event carrying one that has already been seen is discarded. So a re-report of an identical
|
|
515
|
+
* group is now a no-op at the provider rather than money moving twice — which is a far better
|
|
516
|
+
* property than detecting the risk after the fact.
|
|
517
|
+
*
|
|
518
|
+
* The identifier is DERIVED FROM THE ROWS, not from the attempt, so a retry of the same group
|
|
519
|
+
* sends the same identifier while a genuinely different group cannot collide with it.
|
|
520
|
+
*/
|
|
521
|
+
await this.reportWithRetry(policy, {
|
|
522
|
+
meterEventName: group.productKey,
|
|
523
|
+
providerCustomerId,
|
|
524
|
+
value: group.quantity,
|
|
525
|
+
timestamp: group.latestTimestamp,
|
|
526
|
+
identifier: this.buildUsageEventIdentifier(variants, group),
|
|
527
|
+
});
|
|
528
|
+
// Bulk-mark all records in this group as reported (single DB call).
|
|
529
|
+
//
|
|
530
|
+
// The `reportUsage` above ALREADY moved money — it is not retryable-for-free. The marking is
|
|
531
|
+
// what stops the next sweep from re-reporting the same usage, because the sweep selects on
|
|
532
|
+
// `flushState: pending`. So a PARTIAL marking is a duplicate-charge condition: any record
|
|
533
|
+
// that stayed unmarked will be picked up again and billed to the customer a second time.
|
|
534
|
+
//
|
|
535
|
+
// Honour `modifiedCount` rather than assuming success. Previously the return value was
|
|
536
|
+
// discarded and `result.reported` was incremented by the full group size, which made a partial
|
|
537
|
+
// marking both invisible and unfalsifiable — the operational counter reported success for
|
|
538
|
+
// records that were about to be re-billed.
|
|
539
|
+
const markedCount = await this.repositoriesRegistry.bulkUpdateForInfrastructure(variants.usageRecord, { _id: { $in: group.recordIds } },
|
|
540
|
+
// The adapter-neutral guarded-mutation descriptor. This was `{ $set: … }` — raw MongoDB —
|
|
541
|
+
// until `bulkUpdateForInfrastructure` became adapter-neutral; on a PostgreSQL-backed usage
|
|
542
|
+
// record the old path threw before marking anything, which is the duplicate-charge
|
|
543
|
+
// condition the block below exists to detect.
|
|
544
|
+
{ set: { flushState: UsageRecordFlushState.REPORTED, reportedAt: new Date() } });
|
|
545
|
+
// Reported is reported: the provider has the quantity whatever the marking did.
|
|
546
|
+
result.quantityReported += group.quantity;
|
|
547
|
+
const unmarkedCount = group.recordIds.length - markedCount;
|
|
548
|
+
if (unmarkedCount > 0) {
|
|
549
|
+
/*
|
|
550
|
+
* Still loud, and still not a "retry me" — but no longer a duplicate CHARGE, because the
|
|
551
|
+
* identifier above makes the provider discard a repeat of this exact group. What survives is a
|
|
552
|
+
* repeat of a DIFFERENT group: the next sweep re-selects the unmarked rows, and if new usage
|
|
553
|
+
* has arrived meanwhile it aggregates them together into a group with a different identifier,
|
|
554
|
+
* which the provider will accept. So this is still an operator's problem, one step less severe.
|
|
555
|
+
*/
|
|
556
|
+
result.errors.push(`PARTIAL MARKING — ${group.billingAccountId}/${group.productKey} (scope: ${variants.scopeType}): ` +
|
|
557
|
+
`usage of ${group.quantity} was REPORTED to the provider, but only ${markedCount}/${group.recordIds.length} ` +
|
|
558
|
+
`records could be marked as reported. A re-report of this exact group is idempotent at the provider ` +
|
|
559
|
+
`(same event identifier), but the next sweep may aggregate the ${unmarkedCount} unmarked record(s) with ` +
|
|
560
|
+
`NEW usage into a different group, which would be accepted and double-count them. Mark them manually.`);
|
|
561
|
+
result.failed += unmarkedCount;
|
|
562
|
+
}
|
|
563
|
+
result.reported += markedCount;
|
|
564
|
+
}
|
|
565
|
+
catch (error) {
|
|
566
|
+
result.errors.push(`${group.billingAccountId}/${group.productKey} (scope: ${variants.scopeType}): ${error.message}`);
|
|
567
|
+
result.failed += group.recordIds.length;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Report one meter event, honouring the product's authored `retryPolicy` (#415).
|
|
572
|
+
*
|
|
573
|
+
* `maxRetries` and `backoffMultiplier` were authored, defaulted and read by nothing — a provider
|
|
574
|
+
* blip failed the whole group and left it for the next scheduled run, which on a 60-minute schedule
|
|
575
|
+
* is an hour of unbilled usage for a fault that would have cleared in a second.
|
|
576
|
+
*
|
|
577
|
+
* The retry is SAFE only because of the idempotency identifier the caller supplies: a retry after a
|
|
578
|
+
* response that was lost in transit re-sends the same identifier, and the provider discards it. Retry
|
|
579
|
+
* without that is how a timeout becomes a double charge, which is why the two landed together.
|
|
580
|
+
*/
|
|
581
|
+
async reportWithRetry(policy, request) {
|
|
582
|
+
const maxRetries = Math.max(0, policy?.retryPolicy?.maxRetries ?? 0);
|
|
583
|
+
const backoffMultiplier = policy?.retryPolicy?.backoffMultiplier ?? 2;
|
|
584
|
+
let attempt = 0;
|
|
585
|
+
for (;;) {
|
|
169
586
|
try {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
value: group.quantity,
|
|
587
|
+
await this.billingProvider.reportUsage(request);
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
catch (error) {
|
|
591
|
+
if (attempt >= maxRetries)
|
|
592
|
+
throw error;
|
|
593
|
+
const delayMs = UsageMeteringBackendService_1.RETRY_BASE_DELAY_MS * Math.pow(backoffMultiplier, attempt);
|
|
594
|
+
this.logger.warn('Usage report failed, retrying', {
|
|
595
|
+
meterEventName: request.meterEventName,
|
|
596
|
+
attempt: attempt + 1,
|
|
597
|
+
maxRetries,
|
|
598
|
+
delayMs,
|
|
183
599
|
});
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
600
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
601
|
+
attempt += 1;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* A stable, bounded idempotency key for one meter event.
|
|
607
|
+
*
|
|
608
|
+
* Derived from the ROWS the event carries — sorted, so ordering cannot change it — and hashed, so a
|
|
609
|
+
* group of ten thousand rows produces the same short key as a group of one. Two different groups
|
|
610
|
+
* cannot collide; the same group retried, or re-reported after a partial marking, produces the same
|
|
611
|
+
* key and the provider discards the repeat.
|
|
612
|
+
*/
|
|
613
|
+
buildUsageEventIdentifier(variants, group) {
|
|
614
|
+
const material = [
|
|
615
|
+
variants.scopeType,
|
|
616
|
+
group.billingAccountId,
|
|
617
|
+
group.productKey,
|
|
618
|
+
...[...group.recordIds].sort(),
|
|
619
|
+
].join('|');
|
|
620
|
+
return `wildo-usage-${createHash('sha256').update(material).digest('hex').slice(0, 32)}`;
|
|
621
|
+
}
|
|
622
|
+
// ════════════════════════════════════════════════════════════
|
|
623
|
+
// Private — Policy and period resolution (per-run cached)
|
|
624
|
+
// ════════════════════════════════════════════════════════════
|
|
625
|
+
/** The product's authored metering policy, or `undefined` when it authored none. */
|
|
626
|
+
async resolveMeteringPolicy(productKey) {
|
|
627
|
+
const cached = this.flushProductCache?.get(productKey);
|
|
628
|
+
if (cached !== undefined)
|
|
629
|
+
return cached ?? undefined;
|
|
630
|
+
const ctx = await this.internalCtx(CoreResourceType.PRODUCTS, CoreResourceOperation.LIST);
|
|
631
|
+
let policy;
|
|
632
|
+
try {
|
|
633
|
+
const products = await this.servicesRegistry.list(CoreResourceType.PRODUCTS, ctx, { key: productKey }, { page: 1, limit: 1 });
|
|
634
|
+
policy = products[0]?.behaviorPolicy?.metering;
|
|
635
|
+
}
|
|
636
|
+
catch (error) {
|
|
637
|
+
// A policy that cannot be read is not a reason to stop billing: fall through to the merged
|
|
638
|
+
// default, which is what every product got before the policy was read at all.
|
|
639
|
+
this.logger.warn('Failed to read metering policy; flushing this product with default aggregation', {
|
|
640
|
+
productKey,
|
|
641
|
+
message: error.message,
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
this.flushProductCache?.set(productKey, policy ?? null);
|
|
645
|
+
return policy;
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* The start of the billing period containing `timestamp`, for `PER_BILLING_PERIOD` grouping.
|
|
649
|
+
*
|
|
650
|
+
* Derived from the subscription's own `currentPeriodStart` / `currentPeriodEnd` — real data, not a
|
|
651
|
+
* calendar rule invented here — stepping backwards by the period's own length for usage older than
|
|
652
|
+
* the current period. Returns `undefined` when no subscription can be resolved, which merges the
|
|
653
|
+
* rows exactly as `PER_FLUSH` would: an unknown boundary must not silently invent one.
|
|
654
|
+
*/
|
|
655
|
+
async resolvePeriodStartFor(variants, billingAccountId, productKey, timestamp) {
|
|
656
|
+
const cacheKey = `${variants.scopeType}::${billingAccountId}`;
|
|
657
|
+
let boundaries = this.flushPeriodCache?.get(cacheKey);
|
|
658
|
+
if (boundaries === undefined) {
|
|
659
|
+
boundaries = null;
|
|
660
|
+
const ctx = await this.internalCtx(variants.subscription, CoreResourceOperation.LIST);
|
|
661
|
+
try {
|
|
662
|
+
const subscriptions = await this.servicesRegistry.list(variants.subscription, ctx, {
|
|
663
|
+
[variants.billingAccountFkField]: billingAccountId,
|
|
664
|
+
status: { $in: [SubscriptionStatus.ACTIVE, SubscriptionStatus.TRIALING] },
|
|
665
|
+
});
|
|
666
|
+
const subscription = subscriptions[0];
|
|
667
|
+
if (subscription?.currentPeriodStart && subscription?.currentPeriodEnd) {
|
|
668
|
+
boundaries = {
|
|
669
|
+
start: new Date(subscription.currentPeriodStart),
|
|
670
|
+
end: new Date(subscription.currentPeriodEnd),
|
|
671
|
+
};
|
|
210
672
|
}
|
|
211
|
-
result.reported += markedCount;
|
|
212
673
|
}
|
|
213
674
|
catch (error) {
|
|
214
|
-
|
|
215
|
-
|
|
675
|
+
this.logger.warn('Failed to resolve billing period for per-period aggregation; merging as PER_FLUSH', {
|
|
676
|
+
billingAccountId, productKey, message: error.message,
|
|
677
|
+
});
|
|
216
678
|
}
|
|
679
|
+
this.flushPeriodCache?.set(cacheKey, boundaries);
|
|
217
680
|
}
|
|
681
|
+
if (!boundaries)
|
|
682
|
+
return undefined;
|
|
683
|
+
const periodLengthMs = boundaries.end.getTime() - boundaries.start.getTime();
|
|
684
|
+
if (periodLengthMs <= 0)
|
|
685
|
+
return boundaries.start;
|
|
686
|
+
// Step backwards whole periods until the timestamp is inside one. Usage newer than the current
|
|
687
|
+
// period end belongs to the current period — the subscription simply has not rolled over yet.
|
|
688
|
+
let start = boundaries.start.getTime();
|
|
689
|
+
while (timestamp.getTime() < start)
|
|
690
|
+
start -= periodLengthMs;
|
|
691
|
+
return new Date(start);
|
|
218
692
|
}
|
|
219
693
|
// ════════════════════════════════════════════════════════════
|
|
220
694
|
// Private — Resolution
|
|
@@ -258,19 +732,74 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
|
|
|
258
732
|
}
|
|
259
733
|
return false;
|
|
260
734
|
}
|
|
261
|
-
|
|
735
|
+
/**
|
|
736
|
+
* Resolve the provider customer for a billing account, distinguishing the two ways it can fail.
|
|
737
|
+
*
|
|
738
|
+
* This used to return `string | null`, and that single `null` fused a PERMANENT condition with a
|
|
739
|
+
* TRANSIENT one (#512):
|
|
740
|
+
*
|
|
741
|
+
* - the account row is GONE — legitimately reachable, because usage rows are RETAINED when their
|
|
742
|
+
* subject is erased, so a deleted account leaves rows behind. Nothing will ever restore the
|
|
743
|
+
* mapping, and a flush that keeps retrying is building a backlog it cannot drain;
|
|
744
|
+
* - the account EXISTS but carries no `providerCustomerId` yet — provisioning may still complete,
|
|
745
|
+
* and abandoning those rows would throw away billable usage.
|
|
746
|
+
*
|
|
747
|
+
* They lead to opposite actions, so the caller must be able to tell them apart. Two plain fields
|
|
748
|
+
* rather than a discriminated union deliberately: `engine/tsconfig.common.json` sets
|
|
749
|
+
* `strict: false`, under which narrowing a union on a boolean-literal discriminant does not work,
|
|
750
|
+
* and a caller that cannot narrow reads the wrong field with no diagnostic.
|
|
751
|
+
*
|
|
752
|
+
* A read that THROWS is treated as transient — `degradeOrRethrow` has already decided the error is
|
|
753
|
+
* survivable, and a storage failure says nothing about whether the row exists.
|
|
754
|
+
*/
|
|
755
|
+
async resolveProviderCustomer(variants, billingAccountId) {
|
|
262
756
|
const readCtx = await this.internalCtx(variants.billingAccount, CoreResourceOperation.READ);
|
|
263
757
|
try {
|
|
264
758
|
const billingAccount = await this.servicesRegistry.read(variants.billingAccount, readCtx, billingAccountId);
|
|
265
|
-
|
|
759
|
+
if (!billingAccount)
|
|
760
|
+
return { accountExists: false, providerCustomerId: null };
|
|
761
|
+
return { accountExists: true, providerCustomerId: billingAccount.providerCustomerId ?? null };
|
|
266
762
|
}
|
|
267
763
|
catch (error) {
|
|
268
764
|
this.degradeOrRethrow(error, 'Failed to resolve provider customer ID', { billingAccountId, scope: variants.scopeType });
|
|
269
765
|
}
|
|
270
|
-
return null;
|
|
766
|
+
return { accountExists: true, providerCustomerId: null };
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* Move a group's rows to the terminal `unreportable` state so the flush stops re-selecting them.
|
|
770
|
+
*
|
|
771
|
+
* NO money moved and none ever will, which is why this is its own state rather than a convenient
|
|
772
|
+
* `reported: true`. The reason and the instant are written beside it, because the row is a
|
|
773
|
+
* RETAINED financial record and the next reader of it — an auditor, an operator reconciling a
|
|
774
|
+
* period — needs to know why a measured quantity was never billed.
|
|
775
|
+
*
|
|
776
|
+
* A marking that does not fully land is reported and NOT retried here: the rows that stayed
|
|
777
|
+
* pending are simply selected again next run, which is harmless (unlike the reported case, where
|
|
778
|
+
* a partial marking risks double-billing). The counters follow what the write actually did.
|
|
779
|
+
*/
|
|
780
|
+
async markGroupUnreportable(variants, group, reason, result) {
|
|
781
|
+
const markedCount = await this.repositoriesRegistry.bulkUpdateForInfrastructure(variants.usageRecord, { _id: { $in: group.recordIds } }, { set: { flushState: UsageRecordFlushState.UNREPORTABLE, unreportableReason: reason, unreportableAt: new Date() } });
|
|
782
|
+
result.unreportable += markedCount;
|
|
783
|
+
result.quantityUnreportable += markedCount === group.recordIds.length
|
|
784
|
+
? group.quantity
|
|
785
|
+
: 0;
|
|
786
|
+
const unmarkedCount = group.recordIds.length - markedCount;
|
|
787
|
+
if (unmarkedCount > 0) {
|
|
788
|
+
/*
|
|
789
|
+
* The quantity is credited only on a COMPLETE marking, above. A group's quantity is an
|
|
790
|
+
* aggregate over its rows and this class does not carry per-row quantities into the group, so
|
|
791
|
+
* a partial marking cannot be apportioned — and guessing would corrupt the reconciliation
|
|
792
|
+
* identity in the direction that hides unbilled usage. The rows that stayed pending will be
|
|
793
|
+
* re-selected, re-grouped and accounted for then.
|
|
794
|
+
*/
|
|
795
|
+
result.errors.push(`PARTIAL UNREPORTABLE MARKING — ${group.billingAccountId}/${group.productKey} (scope: ${variants.scopeType}): ` +
|
|
796
|
+
`only ${markedCount}/${group.recordIds.length} record(s) could be marked unreportable. The ${unmarkedCount} ` +
|
|
797
|
+
`unmarked record(s) stay pending and will be re-selected next run; no usage was reported to the provider.`);
|
|
798
|
+
result.failed += unmarkedCount;
|
|
799
|
+
}
|
|
271
800
|
}
|
|
272
801
|
};
|
|
273
|
-
UsageMeteringBackendService = __decorate([
|
|
802
|
+
UsageMeteringBackendService = UsageMeteringBackendService_1 = __decorate([
|
|
274
803
|
injectable(),
|
|
275
804
|
__param(0, inject(SAAS_SERVICE_TYPES.Logger)),
|
|
276
805
|
__param(1, inject(SAAS_SERVICE_TYPES.ServicesRegistryHandlerService)),
|