@wildo-ai/saas-backend-lib 1.1.1 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.d.ts.map +1 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js +19 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js +4 -0
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts +35 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js +111 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts +50 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js +199 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts +111 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts.map +1 -1
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js +140 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts +14 -3
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +138 -24
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts +3 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js +8 -3
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts +11 -0
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js +11 -2
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts +124 -13
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +207 -21
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts +60 -8
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +174 -26
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +48 -4
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +102 -30
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts +89 -14
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js +84 -11
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js +16 -0
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts +20 -6
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +96 -32
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts +3 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js +32 -7
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts +8 -5
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +80 -0
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +298 -23
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts +71 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +85 -5
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts +21 -0
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +146 -4
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts +22 -0
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts +3 -26
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js +3 -68
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +4 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts +11 -0
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js +39 -5
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +181 -2
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +533 -43
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts +36 -3
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.js +70 -8
- package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts +28 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js +90 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts +44 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js +99 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts +91 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js +152 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +186 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +474 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts +100 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js +209 -6
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts +200 -4
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js +593 -64
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts +36 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js +83 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts +9 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js +11 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +54 -13
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +38 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +67 -2
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts +30 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js +43 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts +11 -3
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js +30 -16
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js +104 -25
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +18 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +106 -2
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts +52 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js +74 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -0
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts +104 -11
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +260 -26
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts +30 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.js +25 -0
- package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js +11 -4
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +263 -13
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +376 -58
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +264 -7
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +414 -5
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +16 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +140 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +65 -6
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +45 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts +5 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js +6 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.js +7 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.js.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.d.ts +146 -46
- package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.js +121 -12
- package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts +38 -15
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js +17 -2
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts +0 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.js +68 -76
- package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
- package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts +43 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.js +52 -3
- package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +25 -0
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js +41 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.d.ts +2 -2
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js +2 -2
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js.map +1 -1
- package/dist/esm/databases/models/filter.backend.schemas.js +2 -2
- package/dist/esm/databases/models/filter.backend.schemas.js.map +1 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js +20 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js +48 -0
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
- package/dist/esm/databases/services/redis.service.d.ts +27 -0
- package/dist/esm/databases/services/redis.service.d.ts.map +1 -1
- package/dist/esm/databases/services/redis.service.js +29 -0
- package/dist/esm/databases/services/redis.service.js.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
- package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.js +134 -8
- package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
- package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts +41 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js +40 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts +64 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js +193 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js.map +1 -0
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +72 -4
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +60 -19
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
- package/dist/esm/external-data/external-data-transform.backend.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-transform.backend.js +7 -1
- package/dist/esm/external-data/external-data-transform.backend.js.map +1 -1
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts +2 -0
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts.map +1 -1
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js +13 -0
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts +4 -2
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +256 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +333 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js +211 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts +45 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js +216 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js +78 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -0
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js +2 -2
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts +89 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js +164 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts +26 -27
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js +50 -64
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.js +3 -3
- package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.js +4 -4
- package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +306 -7
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +539 -45
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +25 -2
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
- package/dist/esm/files/controllers/file.controller.d.ts +24 -1
- package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
- package/dist/esm/files/controllers/file.controller.js +83 -11
- package/dist/esm/files/controllers/file.controller.js.map +1 -1
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts +17 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts.map +1 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js +1 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js.map +1 -0
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts +5 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +76 -13
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-operation-handler.backend.service.d.ts +18 -0
- package/dist/esm/files/services/file-operation-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-operation-handler.backend.service.js +36 -28
- package/dist/esm/files/services/file-operation-handler.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.d.ts +94 -9
- package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.js +197 -17
- package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts +60 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.js +167 -8
- package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +214 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.js +566 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -0
- package/dist/esm/files/services/files.backend.service.d.ts +87 -0
- package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/files.backend.service.js +252 -19
- package/dist/esm/files/services/files.backend.service.js.map +1 -1
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts +109 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js +123 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -0
- package/dist/esm/files/storage/file-storage-provider.types.d.ts +16 -10
- package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
- package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts +67 -8
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js +101 -28
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js +8 -55
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js +20 -0
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
- package/dist/esm/files/utils/file-uploader.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/file-uploader.utils.js +12 -0
- package/dist/esm/files/utils/file-uploader.utils.js.map +1 -1
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts +86 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js +288 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts +15 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js +76 -5
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js +6 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts +60 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js +63 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +200 -44
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts +0 -13
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js +14 -22
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts +8 -3
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js +25 -15
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts +13 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +88 -8
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +333 -31
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js +4 -2
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts +113 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js +62 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -0
- package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/actors-system.backend.service.js +0 -2
- package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts +107 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.js +519 -56
- package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +5 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +79 -16
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +34 -5
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js +154 -20
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.js +27 -23
- package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js +7 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts +90 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js +368 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts +151 -41
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +308 -143
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts +0 -207
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js +8 -243
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts +9 -14
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js +18 -89
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts +86 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js +155 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts +10 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js +55 -5
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
- package/dist/esm/index.d.ts +15 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +45 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/inject/models/container.d.ts.map +1 -1
- package/dist/esm/inject/models/container.js +82 -10
- package/dist/esm/inject/models/container.js.map +1 -1
- package/dist/esm/inject/models/service-types.d.ts +20 -3
- package/dist/esm/inject/models/service-types.d.ts.map +1 -1
- package/dist/esm/inject/models/service-types.js +21 -3
- package/dist/esm/inject/models/service-types.js.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.js +32 -4
- package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts +34 -0
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.js +42 -0
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.js.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +84 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.js +235 -11
- package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts +64 -2
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +152 -6
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js +49 -4
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts +66 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js +199 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts +149 -13
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js +411 -19
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts +11 -2
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts +28 -9
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js +30 -10
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
- package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.js +52 -11
- package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts +62 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js +78 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +309 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +385 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts +21 -0
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.js +38 -0
- package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -80
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -25
- package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -49
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -141
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -37
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -121
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts +66 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js +105 -10
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -58
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -223
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js +10 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.d.ts +60 -4
- package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.js +145 -43
- package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts +0 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
- package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +108 -13
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +432 -101
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +2 -2
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.js +5 -5
- package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +54 -7
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts +5 -5
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js +14 -13
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts +2 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +18 -8
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +20 -18
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts +16 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js +18 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js +63 -2
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js +4 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts +66 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js +257 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts +12 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js +47 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts +87 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts +31 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js +13 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts +19 -25
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js +33 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.js +1 -4
- package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.js +1 -4
- package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.js +1 -4
- package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts +8 -4
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.js +25 -17
- package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
- package/dist/esm/queue/queue.backend.service.d.ts +3 -3
- package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue.backend.service.js +26 -4
- package/dist/esm/queue/queue.backend.service.js.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts +2 -2
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js +18 -3
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts +50 -25
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js +147 -39
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
- package/dist/esm/requests/service/websocket.service.d.ts +9 -0
- package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
- package/dist/esm/requests/service/websocket.service.js +88 -15
- package/dist/esm/requests/service/websocket.service.js.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +16 -2
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.js +2 -0
- package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js +14 -0
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts +2 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.js +8 -0
- package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
- package/dist/esm/resources/services/resource-id.backend.service.js +3 -3
- package/dist/esm/resources/services/resource-id.backend.service.js.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts +60 -5
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.js +91 -7
- package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts +36 -3
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.js +32 -10
- package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.js +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
- package/dist/esm/runtime/services/execution-context-creator.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/execution-context-creator.backend.service.js +13 -7
- package/dist/esm/runtime/services/execution-context-creator.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts +51 -0
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.d.ts +26 -0
- package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.js +181 -1
- package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts +47 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.js +343 -77
- package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts +15 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js +28 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts +5 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js +24 -4
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +29 -4
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts +114 -0
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js +354 -3
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts +1 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js +22 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts +3 -23
- package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/jwt.backend.schemas.js +20 -45
- package/dist/esm/security/authentications/models/jwt.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts +0 -2
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js +23 -14
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts +0 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js +15 -12
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts +113 -3
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js +207 -30
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts +95 -2
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js +153 -9
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +190 -0
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +377 -53
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts +9 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +77 -2
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js +5 -3
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts +41 -0
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js +202 -23
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +42 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +34 -4
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts +29 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js +77 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +41 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +87 -4
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts +28 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +283 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts +35 -0
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js +111 -21
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts +14 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js +49 -8
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js +4 -0
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js +6 -0
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts +37 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js +51 -0
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts +41 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js +45 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts +116 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js +162 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -0
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js +24 -1
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js.map +1 -1
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts +20 -20
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js +27 -28
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +77 -3
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts +117 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js +104 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js.map +1 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +93 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js +95 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -0
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +124 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +142 -5
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +175 -14
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js +385 -49
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +6 -14
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +13 -22
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts +60 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js +79 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +161 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +512 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +59 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js +22 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts +44 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js +20 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +191 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +385 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts +41 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js +358 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts +160 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +266 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +111 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +107 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts +54 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +153 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +195 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +387 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts +45 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js +291 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +62 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js +29 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts +127 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js +277 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts +66 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js +75 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -0
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts +18 -1
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js +110 -74
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js.map +1 -1
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts +22 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts.map +1 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js +22 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js.map +1 -0
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts +17 -3
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js +12 -0
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +41 -3
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +83 -20
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
- package/dist/esm/security/jwt/services/jwt.backend.service.d.ts.map +1 -1
- package/dist/esm/security/jwt/services/jwt.backend.service.js +1 -18
- package/dist/esm/security/jwt/services/jwt.backend.service.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts +26 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js +43 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +8 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +49 -0
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.js +17 -5
- package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts +67 -29
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js +47 -25
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts +143 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js +258 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts +39 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js +159 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +17 -9
- package/dist/esm/.builder.pid +0 -9
|
@@ -69,7 +69,7 @@ import type { DataSeedScopeResolverRegistryBackendService } from '../../../data-
|
|
|
69
69
|
import { DataSeedScopeIterationStrategy } from '../../../data-seeding/models/data-seed.shared.schemas';
|
|
70
70
|
/**
|
|
71
71
|
* Page size for resource-table walks. Matches the schema cap on
|
|
72
|
-
* `
|
|
72
|
+
* `Resources_PaginationRequestSchema.limit` (`max(100)`), which is the largest
|
|
73
73
|
* value `repo.list({ paginated: true })` will accept. Going larger would be
|
|
74
74
|
* silently rejected by the pagination Zod parse.
|
|
75
75
|
*/
|
|
@@ -159,7 +159,7 @@ export declare function iterateGlobal(): AsyncGenerator<DataSeedScopeIterationIt
|
|
|
159
159
|
* the `DataSeedScopeIterationItem` union and instead consumes the bare
|
|
160
160
|
* `{ relatedId }` form directly.
|
|
161
161
|
*
|
|
162
|
-
* Pagination is page-based (matches the `
|
|
162
|
+
* Pagination is page-based (matches the `Resources_PaginationRequestSchema`
|
|
163
163
|
* `{ page, limit }` shape) — NOT skip-based. A page slip caused by
|
|
164
164
|
* concurrent inserts/deletes is acceptable for cron seeding (the next tick
|
|
165
165
|
* picks up the missed row); cursor-based stable pagination would add
|
|
@@ -69,7 +69,7 @@ import { DataSeedScopeIterationStrategy } from '../../../data-seeding/models/dat
|
|
|
69
69
|
// --------------------------------------------------------------------------
|
|
70
70
|
/**
|
|
71
71
|
* Page size for resource-table walks. Matches the schema cap on
|
|
72
|
-
* `
|
|
72
|
+
* `Resources_PaginationRequestSchema.limit` (`max(100)`), which is the largest
|
|
73
73
|
* value `repo.list({ paginated: true })` will accept. Going larger would be
|
|
74
74
|
* silently rejected by the pagination Zod parse.
|
|
75
75
|
*/
|
|
@@ -106,7 +106,7 @@ export async function* iterateGlobal() {
|
|
|
106
106
|
* the `DataSeedScopeIterationItem` union and instead consumes the bare
|
|
107
107
|
* `{ relatedId }` form directly.
|
|
108
108
|
*
|
|
109
|
-
* Pagination is page-based (matches the `
|
|
109
|
+
* Pagination is page-based (matches the `Resources_PaginationRequestSchema`
|
|
110
110
|
* `{ page, limit }` shape) — NOT skip-based. A page slip caused by
|
|
111
111
|
* concurrent inserts/deletes is acceptable for cron seeding (the next tick
|
|
112
112
|
* picks up the missed row); cursor-based stable pagination would add
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-seed-scope-iteration.shared.utils.js","sourceRoot":"","sources":["../../../../../../src/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAMH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,iEAAiE,CAAC;AAEjH,6EAA6E;AAC7E,WAAW;AACX,6EAA6E;AAE7E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4CAA4C,GAAG,GAAG,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,2CAA2C,GAAG,IAAI,CAAC;AA2EhE,6EAA6E;AAC7E,yBAAyB;AACzB,6EAA6E;AAE7E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,aAAa;IAClC,MAAM,EAAE,IAAI,EAAE,8BAA8B,CAAC,MAAM,EAAE,CAAC;AACxD,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,oBAAoB,CACzC,YAAoB,EACpB,SAAgC,EAChC,IAAwC,EACxC,UAAyC,EAAE;IAE3C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,4CAA4C,CAAC;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,2CAA2C,CAAC;IAEjF,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAE1E,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,OAAO,OAAO,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC5B,SAAS,EACT,EAAE,EACF,EAAE,SAAS,EAAE,IAAa,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CACtE,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAC/B,CAAC;QAED,kEAAkE;QAClE,oDAAoD;QACpD,kEAAkE;QAClE,iEAAiE;QACjE,iEAAiE;QACjE,+DAA+D;QAC/D,iEAAiE;QACjE,8DAA8D;QAC9D,kEAAkE;QAClE,0DAA0D;QAC1D,mBAAmB;QACnB,MAAM,kBAAkB,GAAI,MAA8D,EAAE,UAAU,EAAE,UAAU,CAAC;QACnH,IAAI,OAAO,kBAAkB,KAAK,QAAQ,IAAI,kBAAkB,GAAG,CAAC,IAAI,IAAI,IAAI,kBAAkB,EAAE,CAAC;YACnG,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;QAC7C,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC;IAED,IAAI,OAAO,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,wCAAwC,QAAQ,aAAa,YAAY,4BAA4B,EACrG,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CACtC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,sBAAsB,CAC3C,SAAgC,EAChC,IAAwC,EACxC,UAAyC,EAAE;IAE3C,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,WAAqB,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAChH,MAAM;YACJ,IAAI,EAAE,8BAA8B,CAAC,gBAAgB;YACrD,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,uBAAuB,CAC5C,SAAgC,EAChC,IAAwC,EACxC,UAAyC,EAAE;IAE3C,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,aAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAClH,MAAM;YACJ,IAAI,EAAE,8BAA8B,CAAC,iBAAiB;YACtD,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,SAAgC,EAChC,IAAwC,EACxC,UAAyC,EAAE;IAE3C,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,KAAe,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAC1G,MAAM;YACJ,IAAI,EAAE,8BAA8B,CAAC,SAAS;YAC9C,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,qBAAqB,CAC1C,iBAAyB,EACzB,SAAgC,EAChC,IAA+D;IAE/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IACpF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM;YACJ,IAAI,EAAE,8BAA8B,CAAC,eAAe;YACpD,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,aAAa;AACb,6EAA6E;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,YAAY,CAAC,KAM5B;IACC,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAExE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,8BAA8B,CAAC,MAAM;YACxC,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CACb,wEAAwE,iBAAiB,mHAAmH,CAC7M,CAAC;YACJ,CAAC;YACD,OAAO,aAAa,EAAE,CAAC;QAEzB,KAAK,8BAA8B,CAAC,gBAAgB;YAClD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CACb,kFAAkF,iBAAiB,KAAK,CACzG,CAAC;YACJ,CAAC;YACD,OAAO,sBAAsB,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAE1D,KAAK,8BAA8B,CAAC,iBAAiB;YACnD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CACb,mFAAmF,iBAAiB,KAAK,CAC1G,CAAC;YACJ,CAAC;YACD,OAAO,uBAAuB,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAE3D,KAAK,8BAA8B,CAAC,SAAS;YAC3C,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CACb,2EAA2E,iBAAiB,KAAK,CAClG,CAAC;YACJ,CAAC;YACD,OAAO,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEnD,KAAK,8BAA8B,CAAC,eAAe;YACjD,IAAI,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CACb,8LAA8L,CAC/L,CAAC;YACJ,CAAC;YACD,OAAO,qBAAqB,CAAC,iBAAiB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC;AACH,CAAC","sourcesContent":["/**\n * `data-seed-scope-iteration` — pure async-iterator helpers that translate a\n * {@link DataSeedScopeIterationStrategy} into a stream of `relatedId`s to\n * dispatch a seed against.\n *\n * Phase 7 / Item 47 (cron scheduler) — Slice 4. Designed to be reusable by\n * Item 51 (multi-tenant UPGRADE/SYNC for the synchronous Level-A path), so\n * lives under `shared/` rather than under `services/engines/`.\n *\n * --------------------------------------------------------------------------\n * Why iterators, not realized arrays\n * --------------------------------------------------------------------------\n * Cron seeds will be scheduled across potentially-large core-resource tables\n * (every `applications`, every `users`, every `organizations`). Buffering an\n * entire tenant table into memory before dispatching the first seed run\n * would (a) blow heap on large fleets, (b) push first-run latency to the end\n * of the page-walk, (c) lose the natural per-row failure-isolation boundary\n * the cron batch needs (Slice 5, N6 / Q5=E2 — one row's failure must NOT\n * stop the next row).\n *\n * `AsyncIterable<{ relatedId }>` matches the `for await (const item of …)`\n * loop the cron's `doHandle` body wants and lets the underlying paginator\n * fetch one page at a time on demand.\n *\n * --------------------------------------------------------------------------\n * Discriminated `kind` — why it travels with each item\n * --------------------------------------------------------------------------\n * The cron batch needs to know which scope-kind the iterator produced so it\n * can build the correct {@link DataSeedScopeArg} for `runManual` (different\n * `kind`s carry different anchor fields downstream). Putting the\n * discriminator on each yielded item — instead of returning a tuple of\n * `(kind, AsyncIterable<{ relatedId }>)` — keeps the cron's per-row branch\n * collapsed into a single `switch (item.kind)` and means the iterator can,\n * in a future slice, mix kinds (e.g. a custom resolver that yields both\n * org-anchored and user-anchored rows) without breaking the contract.\n *\n * --------------------------------------------------------------------------\n * Pagination cap\n * --------------------------------------------------------------------------\n * Each per-resource walker (`iterateAllOfResource`) runs a defensive\n * `MAX_PAGES` ceiling — same defence-in-depth pattern as\n * `dormancy-detection.batch.backend.service.ts`'s `MAX_PAGES = 50`, but\n * raised to {@link DEFAULT_DATA_SEED_SCOPE_ITERATION_MAX_PAGES} (1000) here\n * because cron iteration is read-only (no in-walk state mutation removes\n * rows) and large fleets can legitimately reach 100k+ rows. Hitting the cap\n * triggers a `logger.warn` and ends the iteration cleanly — never a throw,\n * because Slice 5's per-iteration error containment expects the iterator to\n * always close.\n *\n * --------------------------------------------------------------------------\n * Why `parentCtx` is `ExecutionContext<any>`\n * --------------------------------------------------------------------------\n * The cron batch builds the parent context via\n * `ExecutionContextCreatorBackendService.createForInternalSystemOperation`\n * (super-admin authority, `INTERNALLY_INITIATED_REQUEST` initiator). The\n * helpers don't narrow further because:\n * - `repo.list(executionContext, …)` accepts `ExecutionContext<any>`;\n * - `DataSeedScopeResolver` was deliberately typed against the same\n * `ExecutionContext<any>` (Slice 3) so resolvers can do arbitrary\n * repository reads.\n * Narrowing to a custom `DataSeedingCronExecutionContext` brand here would\n * force every test to construct that brand without buying any safety the\n * Slice-3 design didn't already cover.\n */\n\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { RepositoriesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/repositories/repositories-registry-handler.backend.service';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport type { DataSeedScopeResolverRegistryBackendService } from '~wildo-backend-lib/data-seeding/services/data-seed-scope-resolver-registry.backend.service';\nimport { CoreResourceType } from '@wildo-ai/saas-models';\nimport { DataSeedScopeIterationStrategy } from '~wildo-backend-lib/data-seeding/models/data-seed.shared.schemas';\n\n// --------------------------------------------------------------------------\n// Defaults\n// --------------------------------------------------------------------------\n\n/**\n * Page size for resource-table walks. Matches the schema cap on\n * `Resouces_PaginationRequestSchema.limit` (`max(100)`), which is the largest\n * value `repo.list({ paginated: true })` will accept. Going larger would be\n * silently rejected by the pagination Zod parse.\n */\nexport const DEFAULT_DATA_SEED_SCOPE_ITERATION_BATCH_SIZE = 100;\n\n/**\n * Defence-in-depth ceiling for `iterateAllOfResource`. Sized to allow 100k\n * rows at the default batch size while still bounding a runaway iterator\n * (e.g. a misbehaving paginator that always returns `data.length === limit`\n * regardless of progress). Hitting the cap is a warning, not an error — the\n * iterator simply ends and the cron emits a partial-iteration report.\n */\nexport const DEFAULT_DATA_SEED_SCOPE_ITERATION_MAX_PAGES = 1000;\n\n// --------------------------------------------------------------------------\n// Yielded shape\n// --------------------------------------------------------------------------\n\n/**\n * One emitted iteration item. Discriminated by `kind` so the cron batch's\n * per-row dispatch loop can `switch (item.kind)` without re-correlating\n * against the originating strategy.\n *\n * `GLOBAL` carries no `relatedId` — the seed dispatches once with\n * `scope: { kind: GLOBAL }` and there is no per-row anchor to attach.\n * Modeling this as a separate union variant (vs `relatedId: null`) means\n * downstream consumers cannot accidentally treat the global tick as a\n * row-anchored dispatch — TypeScript's exhaustiveness check forces them to\n * branch.\n */\nexport type DataSeedScopeIterationItem =\n | { readonly kind: DataSeedScopeIterationStrategy.GLOBAL }\n | {\n readonly kind: DataSeedScopeIterationStrategy.ALL_APPLICATIONS;\n readonly relatedId: string;\n }\n | {\n readonly kind: DataSeedScopeIterationStrategy.ALL_ORGANIZATIONS;\n readonly relatedId: string;\n }\n | {\n readonly kind: DataSeedScopeIterationStrategy.ALL_USERS;\n readonly relatedId: string;\n }\n | {\n readonly kind: DataSeedScopeIterationStrategy.CUSTOM_RESOLVER;\n readonly relatedId: string;\n };\n\n// --------------------------------------------------------------------------\n// Dependency bundles\n// --------------------------------------------------------------------------\n\n/**\n * Dependencies the resource-walker iterators need. Bundled into a single\n * object so test harnesses construct one fixture and reuse it across all\n * three `ALL_*` strategies, and so future additions (e.g. a metrics emitter)\n * don't ripple through every per-strategy call site.\n */\nexport interface DataSeedScopeResourceIterationDeps {\n readonly repositoriesRegistry: RepositoriesRegistryHandlerBackendService;\n readonly logger: LoggerService;\n}\n\n/**\n * Dependencies the {@link iterateScope} dispatcher needs. Superset of\n * {@link DataSeedScopeResourceIterationDeps} — adds the resolver registry\n * for the `CUSTOM_RESOLVER` branch. The dispatcher accepts the broader\n * shape so callers (e.g. the Slice-5 batch) build one deps object regardless\n * of which strategy a given seed declares.\n */\nexport interface DataSeedScopeIterationDeps extends DataSeedScopeResourceIterationDeps {\n readonly scopeResolverRegistry: DataSeedScopeResolverRegistryBackendService;\n}\n\n/**\n * Per-call options shared by the `ALL_*` resource walkers.\n *\n * `batchSize` and `maxPages` default to the module-level constants; tests\n * override them to keep fixtures small without losing the production\n * default-path coverage.\n */\nexport interface DataSeedScopeIterationOptions {\n readonly batchSize?: number;\n readonly maxPages?: number;\n}\n\n// --------------------------------------------------------------------------\n// Per-strategy iterators\n// --------------------------------------------------------------------------\n\n/**\n * Yield the single `GLOBAL` sentinel.\n *\n * Modeled as an async iterator (not a `[item]` literal) so the cron batch\n * can `for await (const item of iterateScope(...))` for every strategy\n * uniformly — strategy-specific branching at the call site would defeat the\n * dispatcher's purpose.\n */\nexport async function* iterateGlobal(): AsyncGenerator<DataSeedScopeIterationItem> {\n yield { kind: DataSeedScopeIterationStrategy.GLOBAL };\n}\n\n/**\n * Generic page-walker over a single core resource. Used by the three\n * `ALL_*` strategy iterators below.\n *\n * Yields `{ relatedId }` (no `kind`) — the caller wraps each item with the\n * appropriate `kind` discriminator. This separation means the walker stays\n * reusable for Item 51's tenant-aware UPGRADE/SYNC path, which doesn't fit\n * the `DataSeedScopeIterationItem` union and instead consumes the bare\n * `{ relatedId }` form directly.\n *\n * Pagination is page-based (matches the `Resouces_PaginationRequestSchema`\n * `{ page, limit }` shape) — NOT skip-based. A page slip caused by\n * concurrent inserts/deletes is acceptable for cron seeding (the next tick\n * picks up the missed row); cursor-based stable pagination would add\n * complexity for a cost the cron use-case doesn't pay.\n *\n * Defensive `MAX_PAGES` ceiling guards against a misbehaving paginator that\n * never empties — see module header. Hitting the cap is a `logger.warn`,\n * not a throw, so the cron's per-seed iteration always closes cleanly.\n */\nexport async function* iterateAllOfResource(\n resourceType: string,\n parentCtx: ExecutionContext<any>,\n deps: DataSeedScopeResourceIterationDeps,\n options: DataSeedScopeIterationOptions = {},\n): AsyncGenerator<{ readonly relatedId: string }> {\n const batchSize = options.batchSize ?? DEFAULT_DATA_SEED_SCOPE_ITERATION_BATCH_SIZE;\n const maxPages = options.maxPages ?? DEFAULT_DATA_SEED_SCOPE_ITERATION_MAX_PAGES;\n\n const repo = deps.repositoriesRegistry.getRepositoryOrThrow(resourceType);\n\n let page = 1;\n let hasMore = true;\n\n while (hasMore && page <= maxPages) {\n const result = await repo.list<{ _id: string }>(\n parentCtx,\n {},\n { paginated: true as const, listOptions: { page, limit: batchSize } },\n );\n\n for (const row of result.data) {\n yield { relatedId: row._id };\n }\n\n // Audit L3-2 (post-Phase-7 close-out): defence-in-depth `hasMore`\n // computation. The primary signal is the historical\n // `data.length === batchSize` heuristic (works when the paginator\n // returns short pages reliably). Where a `pagination.totalPages`\n // value is also reported, we cross-check it: if the current page\n // index is at-or-past `totalPages`, we trust the paginator and\n // stop, even if the last page happened to be exactly `batchSize`\n // long. This catches the \"buggy paginator that always returns\n // length === limit\" failure mode the SKILL/docs claim is enforced\n // here, and it short-circuits the MAX_PAGES walk on small\n // resource tables.\n const reportedTotalPages = (result as unknown as { pagination?: { totalPages?: number } })?.pagination?.totalPages;\n if (typeof reportedTotalPages === 'number' && reportedTotalPages > 0 && page >= reportedTotalPages) {\n hasMore = false;\n } else {\n hasMore = result.data.length === batchSize;\n }\n page++;\n }\n\n if (hasMore && page > maxPages) {\n deps.logger.warn(\n `iterateAllOfResource: hit MAX_PAGES (${maxPages}) cap on '${resourceType}' — iteration ended early.`,\n { resourceType, maxPages, batchSize },\n );\n }\n}\n\n/**\n * Walk every `applications` row, yielding one item per `_id`. Thin wrapper\n * over {@link iterateAllOfResource} that attaches the\n * `ALL_APPLICATIONS` discriminator.\n */\nexport async function* iterateAllApplications(\n parentCtx: ExecutionContext<any>,\n deps: DataSeedScopeResourceIterationDeps,\n options: DataSeedScopeIterationOptions = {},\n): AsyncGenerator<DataSeedScopeIterationItem> {\n for await (const item of iterateAllOfResource(CoreResourceType.APPLICATION as string, parentCtx, deps, options)) {\n yield {\n kind: DataSeedScopeIterationStrategy.ALL_APPLICATIONS,\n relatedId: item.relatedId,\n };\n }\n}\n\n/**\n * Walk every `organizations` row, yielding one item per `_id`. Thin\n * wrapper over {@link iterateAllOfResource} that attaches the\n * `ALL_ORGANIZATIONS` discriminator.\n */\nexport async function* iterateAllOrganizations(\n parentCtx: ExecutionContext<any>,\n deps: DataSeedScopeResourceIterationDeps,\n options: DataSeedScopeIterationOptions = {},\n): AsyncGenerator<DataSeedScopeIterationItem> {\n for await (const item of iterateAllOfResource(CoreResourceType.ORGANIZATIONS as string, parentCtx, deps, options)) {\n yield {\n kind: DataSeedScopeIterationStrategy.ALL_ORGANIZATIONS,\n relatedId: item.relatedId,\n };\n }\n}\n\n/**\n * Walk every `users` row, yielding one item per `_id`. Thin wrapper over\n * {@link iterateAllOfResource} that attaches the `ALL_USERS`\n * discriminator.\n */\nexport async function* iterateAllUsers(\n parentCtx: ExecutionContext<any>,\n deps: DataSeedScopeResourceIterationDeps,\n options: DataSeedScopeIterationOptions = {},\n): AsyncGenerator<DataSeedScopeIterationItem> {\n for await (const item of iterateAllOfResource(CoreResourceType.USERS as string, parentCtx, deps, options)) {\n yield {\n kind: DataSeedScopeIterationStrategy.ALL_USERS,\n relatedId: item.relatedId,\n };\n }\n}\n\n/**\n * Resolve the registered scope resolver for `customResolverKey` and yield\n * each `{ relatedId }` row it produces, tagged with the\n * `CUSTOM_RESOLVER` discriminator.\n *\n * The resolver lookup goes through\n * {@link DataSeedScopeResolverRegistryBackendService.resolve} — a missing\n * key throws `ErrorType.CONFIGURATION` from the registry (Slice 3\n * contract); a resolver-internal throw bubbles up unchanged. Slice 5's\n * per-iteration `try/catch` is the containment layer (N6 / Q5=E2) — the\n * iterator deliberately does NOT catch, so the cron can record the failing\n * `seedKey` in `report.failedSeedKeys` and continue with the next seed.\n */\nexport async function* iterateCustomResolver(\n customResolverKey: string,\n parentCtx: ExecutionContext<any>,\n deps: Pick<DataSeedScopeIterationDeps, 'scopeResolverRegistry'>,\n): AsyncGenerator<DataSeedScopeIterationItem> {\n const rows = await deps.scopeResolverRegistry.resolve(customResolverKey, parentCtx);\n for (const row of rows) {\n yield {\n kind: DataSeedScopeIterationStrategy.CUSTOM_RESOLVER,\n relatedId: row.relatedId,\n };\n }\n}\n\n// --------------------------------------------------------------------------\n// Dispatcher\n// --------------------------------------------------------------------------\n\n/**\n * Single entry-point the cron batch (Slice 5) calls per `(seed, tick)` pair.\n * Routes to the appropriate per-strategy iterator and yields a uniform\n * {@link DataSeedScopeIterationItem} stream regardless of `strategy`.\n *\n * Contract:\n * - `strategy === GLOBAL` — yields exactly one item; `customResolverKey`\n * MUST be `undefined` (the schema layer enforces this; we re-check\n * defensively at the dispatcher to fail loudly if a malformed seed\n * bypasses validation).\n * - `strategy === ALL_*` — pages the corresponding core resource;\n * `customResolverKey` MUST be `undefined`.\n * - `strategy === CUSTOM_RESOLVER` — `customResolverKey` is REQUIRED;\n * delegates to the resolver registry.\n *\n * The defensive `customResolverKey` re-checks throw `Error` (not a\n * structured `WildoBackendError`) because reaching them means a Zod-layer\n * invariant has already been violated upstream — we want the loudest\n * possible failure mode (with a stack trace pointing into the dispatcher),\n * not a soft framework-error path that operators might mistake for a\n * recoverable misconfiguration.\n *\n * Returns `AsyncGenerator` (concrete type, not `AsyncIterable`) so the\n * cron batch can also call `.return()` for early termination if a future\n * slice adds a per-tick deadline — `AsyncIterable` doesn't expose that\n * affordance.\n */\nexport function iterateScope(input: {\n readonly strategy: DataSeedScopeIterationStrategy;\n readonly customResolverKey?: string;\n readonly parentCtx: ExecutionContext<any>;\n readonly deps: DataSeedScopeIterationDeps;\n readonly options?: DataSeedScopeIterationOptions;\n}): AsyncGenerator<DataSeedScopeIterationItem> {\n const { strategy, customResolverKey, parentCtx, deps, options } = input;\n\n switch (strategy) {\n case DataSeedScopeIterationStrategy.GLOBAL:\n if (customResolverKey !== undefined) {\n throw new Error(\n `iterateScope: strategy=GLOBAL must not carry customResolverKey (got '${customResolverKey}'). The schema layer should reject this — reaching here means a malformed DataSeedDefinition bypassed validation.`,\n );\n }\n return iterateGlobal();\n\n case DataSeedScopeIterationStrategy.ALL_APPLICATIONS:\n if (customResolverKey !== undefined) {\n throw new Error(\n `iterateScope: strategy=ALL_APPLICATIONS must not carry customResolverKey (got '${customResolverKey}').`,\n );\n }\n return iterateAllApplications(parentCtx, deps, options);\n\n case DataSeedScopeIterationStrategy.ALL_ORGANIZATIONS:\n if (customResolverKey !== undefined) {\n throw new Error(\n `iterateScope: strategy=ALL_ORGANIZATIONS must not carry customResolverKey (got '${customResolverKey}').`,\n );\n }\n return iterateAllOrganizations(parentCtx, deps, options);\n\n case DataSeedScopeIterationStrategy.ALL_USERS:\n if (customResolverKey !== undefined) {\n throw new Error(\n `iterateScope: strategy=ALL_USERS must not carry customResolverKey (got '${customResolverKey}').`,\n );\n }\n return iterateAllUsers(parentCtx, deps, options);\n\n case DataSeedScopeIterationStrategy.CUSTOM_RESOLVER:\n if (customResolverKey === undefined || customResolverKey.length === 0) {\n throw new Error(\n `iterateScope: strategy=CUSTOM_RESOLVER requires a non-empty customResolverKey. The schema layer should reject this — reaching here means a malformed DataSeedDefinition bypassed validation.`,\n );\n }\n return iterateCustomResolver(customResolverKey, parentCtx, deps);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-seed-scope-iteration.shared.utils.js","sourceRoot":"","sources":["../../../../../../src/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `data-seed-scope-iteration` — pure async-iterator helpers that translate a\n * {@link DataSeedScopeIterationStrategy} into a stream of `relatedId`s to\n * dispatch a seed against.\n *\n * Phase 7 / Item 47 (cron scheduler) — Slice 4. Designed to be reusable by\n * Item 51 (multi-tenant UPGRADE/SYNC for the synchronous Level-A path), so\n * lives under `shared/` rather than under `services/engines/`.\n *\n * --------------------------------------------------------------------------\n * Why iterators, not realized arrays\n * --------------------------------------------------------------------------\n * Cron seeds will be scheduled across potentially-large core-resource tables\n * (every `applications`, every `users`, every `organizations`). Buffering an\n * entire tenant table into memory before dispatching the first seed run\n * would (a) blow heap on large fleets, (b) push first-run latency to the end\n * of the page-walk, (c) lose the natural per-row failure-isolation boundary\n * the cron batch needs (Slice 5, N6 / Q5=E2 — one row's failure must NOT\n * stop the next row).\n *\n * `AsyncIterable<{ relatedId }>` matches the `for await (const item of …)`\n * loop the cron's `doHandle` body wants and lets the underlying paginator\n * fetch one page at a time on demand.\n *\n * --------------------------------------------------------------------------\n * Discriminated `kind` — why it travels with each item\n * --------------------------------------------------------------------------\n * The cron batch needs to know which scope-kind the iterator produced so it\n * can build the correct {@link DataSeedScopeArg} for `runManual` (different\n * `kind`s carry different anchor fields downstream). Putting the\n * discriminator on each yielded item — instead of returning a tuple of\n * `(kind, AsyncIterable<{ relatedId }>)` — keeps the cron's per-row branch\n * collapsed into a single `switch (item.kind)` and means the iterator can,\n * in a future slice, mix kinds (e.g. a custom resolver that yields both\n * org-anchored and user-anchored rows) without breaking the contract.\n *\n * --------------------------------------------------------------------------\n * Pagination cap\n * --------------------------------------------------------------------------\n * Each per-resource walker (`iterateAllOfResource`) runs a defensive\n * `MAX_PAGES` ceiling — same defence-in-depth pattern as\n * `dormancy-detection.batch.backend.service.ts`'s `MAX_PAGES = 50`, but\n * raised to {@link DEFAULT_DATA_SEED_SCOPE_ITERATION_MAX_PAGES} (1000) here\n * because cron iteration is read-only (no in-walk state mutation removes\n * rows) and large fleets can legitimately reach 100k+ rows. Hitting the cap\n * triggers a `logger.warn` and ends the iteration cleanly — never a throw,\n * because Slice 5's per-iteration error containment expects the iterator to\n * always close.\n *\n * --------------------------------------------------------------------------\n * Why `parentCtx` is `ExecutionContext<any>`\n * --------------------------------------------------------------------------\n * The cron batch builds the parent context via\n * `ExecutionContextCreatorBackendService.createForInternalSystemOperation`\n * (super-admin authority, `INTERNALLY_INITIATED_REQUEST` initiator). The\n * helpers don't narrow further because:\n * - `repo.list(executionContext, …)` accepts `ExecutionContext<any>`;\n * - `DataSeedScopeResolver` was deliberately typed against the same\n * `ExecutionContext<any>` (Slice 3) so resolvers can do arbitrary\n * repository reads.\n * Narrowing to a custom `DataSeedingCronExecutionContext` brand here would\n * force every test to construct that brand without buying any safety the\n * Slice-3 design didn't already cover.\n */\n\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { RepositoriesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/repositories/repositories-registry-handler.backend.service';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport type { DataSeedScopeResolverRegistryBackendService } from '~wildo-backend-lib/data-seeding/services/data-seed-scope-resolver-registry.backend.service';\nimport { CoreResourceType } from '@wildo-ai/saas-models';\nimport { DataSeedScopeIterationStrategy } from '~wildo-backend-lib/data-seeding/models/data-seed.shared.schemas';\n\n// --------------------------------------------------------------------------\n// Defaults\n// --------------------------------------------------------------------------\n\n/**\n * Page size for resource-table walks. Matches the schema cap on\n * `Resources_PaginationRequestSchema.limit` (`max(100)`), which is the largest\n * value `repo.list({ paginated: true })` will accept. Going larger would be\n * silently rejected by the pagination Zod parse.\n */\nexport const DEFAULT_DATA_SEED_SCOPE_ITERATION_BATCH_SIZE = 100;\n\n/**\n * Defence-in-depth ceiling for `iterateAllOfResource`. Sized to allow 100k\n * rows at the default batch size while still bounding a runaway iterator\n * (e.g. a misbehaving paginator that always returns `data.length === limit`\n * regardless of progress). Hitting the cap is a warning, not an error — the\n * iterator simply ends and the cron emits a partial-iteration report.\n */\nexport const DEFAULT_DATA_SEED_SCOPE_ITERATION_MAX_PAGES = 1000;\n\n// --------------------------------------------------------------------------\n// Yielded shape\n// --------------------------------------------------------------------------\n\n/**\n * One emitted iteration item. Discriminated by `kind` so the cron batch's\n * per-row dispatch loop can `switch (item.kind)` without re-correlating\n * against the originating strategy.\n *\n * `GLOBAL` carries no `relatedId` — the seed dispatches once with\n * `scope: { kind: GLOBAL }` and there is no per-row anchor to attach.\n * Modeling this as a separate union variant (vs `relatedId: null`) means\n * downstream consumers cannot accidentally treat the global tick as a\n * row-anchored dispatch — TypeScript's exhaustiveness check forces them to\n * branch.\n */\nexport type DataSeedScopeIterationItem =\n | { readonly kind: DataSeedScopeIterationStrategy.GLOBAL }\n | {\n readonly kind: DataSeedScopeIterationStrategy.ALL_APPLICATIONS;\n readonly relatedId: string;\n }\n | {\n readonly kind: DataSeedScopeIterationStrategy.ALL_ORGANIZATIONS;\n readonly relatedId: string;\n }\n | {\n readonly kind: DataSeedScopeIterationStrategy.ALL_USERS;\n readonly relatedId: string;\n }\n | {\n readonly kind: DataSeedScopeIterationStrategy.CUSTOM_RESOLVER;\n readonly relatedId: string;\n };\n\n// --------------------------------------------------------------------------\n// Dependency bundles\n// --------------------------------------------------------------------------\n\n/**\n * Dependencies the resource-walker iterators need. Bundled into a single\n * object so test harnesses construct one fixture and reuse it across all\n * three `ALL_*` strategies, and so future additions (e.g. a metrics emitter)\n * don't ripple through every per-strategy call site.\n */\nexport interface DataSeedScopeResourceIterationDeps {\n readonly repositoriesRegistry: RepositoriesRegistryHandlerBackendService;\n readonly logger: LoggerService;\n}\n\n/**\n * Dependencies the {@link iterateScope} dispatcher needs. Superset of\n * {@link DataSeedScopeResourceIterationDeps} — adds the resolver registry\n * for the `CUSTOM_RESOLVER` branch. The dispatcher accepts the broader\n * shape so callers (e.g. the Slice-5 batch) build one deps object regardless\n * of which strategy a given seed declares.\n */\nexport interface DataSeedScopeIterationDeps extends DataSeedScopeResourceIterationDeps {\n readonly scopeResolverRegistry: DataSeedScopeResolverRegistryBackendService;\n}\n\n/**\n * Per-call options shared by the `ALL_*` resource walkers.\n *\n * `batchSize` and `maxPages` default to the module-level constants; tests\n * override them to keep fixtures small without losing the production\n * default-path coverage.\n */\nexport interface DataSeedScopeIterationOptions {\n readonly batchSize?: number;\n readonly maxPages?: number;\n}\n\n// --------------------------------------------------------------------------\n// Per-strategy iterators\n// --------------------------------------------------------------------------\n\n/**\n * Yield the single `GLOBAL` sentinel.\n *\n * Modeled as an async iterator (not a `[item]` literal) so the cron batch\n * can `for await (const item of iterateScope(...))` for every strategy\n * uniformly — strategy-specific branching at the call site would defeat the\n * dispatcher's purpose.\n */\nexport async function* iterateGlobal(): AsyncGenerator<DataSeedScopeIterationItem> {\n yield { kind: DataSeedScopeIterationStrategy.GLOBAL };\n}\n\n/**\n * Generic page-walker over a single core resource. Used by the three\n * `ALL_*` strategy iterators below.\n *\n * Yields `{ relatedId }` (no `kind`) — the caller wraps each item with the\n * appropriate `kind` discriminator. This separation means the walker stays\n * reusable for Item 51's tenant-aware UPGRADE/SYNC path, which doesn't fit\n * the `DataSeedScopeIterationItem` union and instead consumes the bare\n * `{ relatedId }` form directly.\n *\n * Pagination is page-based (matches the `Resources_PaginationRequestSchema`\n * `{ page, limit }` shape) — NOT skip-based. A page slip caused by\n * concurrent inserts/deletes is acceptable for cron seeding (the next tick\n * picks up the missed row); cursor-based stable pagination would add\n * complexity for a cost the cron use-case doesn't pay.\n *\n * Defensive `MAX_PAGES` ceiling guards against a misbehaving paginator that\n * never empties — see module header. Hitting the cap is a `logger.warn`,\n * not a throw, so the cron's per-seed iteration always closes cleanly.\n */\nexport async function* iterateAllOfResource(\n resourceType: string,\n parentCtx: ExecutionContext<any>,\n deps: DataSeedScopeResourceIterationDeps,\n options: DataSeedScopeIterationOptions = {},\n): AsyncGenerator<{ readonly relatedId: string }> {\n const batchSize = options.batchSize ?? DEFAULT_DATA_SEED_SCOPE_ITERATION_BATCH_SIZE;\n const maxPages = options.maxPages ?? DEFAULT_DATA_SEED_SCOPE_ITERATION_MAX_PAGES;\n\n const repo = deps.repositoriesRegistry.getRepositoryOrThrow(resourceType);\n\n let page = 1;\n let hasMore = true;\n\n while (hasMore && page <= maxPages) {\n const result = await repo.list<{ _id: string }>(\n parentCtx,\n {},\n { paginated: true as const, listOptions: { page, limit: batchSize } },\n );\n\n for (const row of result.data) {\n yield { relatedId: row._id };\n }\n\n // Audit L3-2 (post-Phase-7 close-out): defence-in-depth `hasMore`\n // computation. The primary signal is the historical\n // `data.length === batchSize` heuristic (works when the paginator\n // returns short pages reliably). Where a `pagination.totalPages`\n // value is also reported, we cross-check it: if the current page\n // index is at-or-past `totalPages`, we trust the paginator and\n // stop, even if the last page happened to be exactly `batchSize`\n // long. This catches the \"buggy paginator that always returns\n // length === limit\" failure mode the SKILL/docs claim is enforced\n // here, and it short-circuits the MAX_PAGES walk on small\n // resource tables.\n const reportedTotalPages = (result as unknown as { pagination?: { totalPages?: number } })?.pagination?.totalPages;\n if (typeof reportedTotalPages === 'number' && reportedTotalPages > 0 && page >= reportedTotalPages) {\n hasMore = false;\n } else {\n hasMore = result.data.length === batchSize;\n }\n page++;\n }\n\n if (hasMore && page > maxPages) {\n deps.logger.warn(\n `iterateAllOfResource: hit MAX_PAGES (${maxPages}) cap on '${resourceType}' — iteration ended early.`,\n { resourceType, maxPages, batchSize },\n );\n }\n}\n\n/**\n * Walk every `applications` row, yielding one item per `_id`. Thin wrapper\n * over {@link iterateAllOfResource} that attaches the\n * `ALL_APPLICATIONS` discriminator.\n */\nexport async function* iterateAllApplications(\n parentCtx: ExecutionContext<any>,\n deps: DataSeedScopeResourceIterationDeps,\n options: DataSeedScopeIterationOptions = {},\n): AsyncGenerator<DataSeedScopeIterationItem> {\n for await (const item of iterateAllOfResource(CoreResourceType.APPLICATION as string, parentCtx, deps, options)) {\n yield {\n kind: DataSeedScopeIterationStrategy.ALL_APPLICATIONS,\n relatedId: item.relatedId,\n };\n }\n}\n\n/**\n * Walk every `organizations` row, yielding one item per `_id`. Thin\n * wrapper over {@link iterateAllOfResource} that attaches the\n * `ALL_ORGANIZATIONS` discriminator.\n */\nexport async function* iterateAllOrganizations(\n parentCtx: ExecutionContext<any>,\n deps: DataSeedScopeResourceIterationDeps,\n options: DataSeedScopeIterationOptions = {},\n): AsyncGenerator<DataSeedScopeIterationItem> {\n for await (const item of iterateAllOfResource(CoreResourceType.ORGANIZATIONS as string, parentCtx, deps, options)) {\n yield {\n kind: DataSeedScopeIterationStrategy.ALL_ORGANIZATIONS,\n relatedId: item.relatedId,\n };\n }\n}\n\n/**\n * Walk every `users` row, yielding one item per `_id`. Thin wrapper over\n * {@link iterateAllOfResource} that attaches the `ALL_USERS`\n * discriminator.\n */\nexport async function* iterateAllUsers(\n parentCtx: ExecutionContext<any>,\n deps: DataSeedScopeResourceIterationDeps,\n options: DataSeedScopeIterationOptions = {},\n): AsyncGenerator<DataSeedScopeIterationItem> {\n for await (const item of iterateAllOfResource(CoreResourceType.USERS as string, parentCtx, deps, options)) {\n yield {\n kind: DataSeedScopeIterationStrategy.ALL_USERS,\n relatedId: item.relatedId,\n };\n }\n}\n\n/**\n * Resolve the registered scope resolver for `customResolverKey` and yield\n * each `{ relatedId }` row it produces, tagged with the\n * `CUSTOM_RESOLVER` discriminator.\n *\n * The resolver lookup goes through\n * {@link DataSeedScopeResolverRegistryBackendService.resolve} — a missing\n * key throws `ErrorType.CONFIGURATION` from the registry (Slice 3\n * contract); a resolver-internal throw bubbles up unchanged. Slice 5's\n * per-iteration `try/catch` is the containment layer (N6 / Q5=E2) — the\n * iterator deliberately does NOT catch, so the cron can record the failing\n * `seedKey` in `report.failedSeedKeys` and continue with the next seed.\n */\nexport async function* iterateCustomResolver(\n customResolverKey: string,\n parentCtx: ExecutionContext<any>,\n deps: Pick<DataSeedScopeIterationDeps, 'scopeResolverRegistry'>,\n): AsyncGenerator<DataSeedScopeIterationItem> {\n const rows = await deps.scopeResolverRegistry.resolve(customResolverKey, parentCtx);\n for (const row of rows) {\n yield {\n kind: DataSeedScopeIterationStrategy.CUSTOM_RESOLVER,\n relatedId: row.relatedId,\n };\n }\n}\n\n// --------------------------------------------------------------------------\n// Dispatcher\n// --------------------------------------------------------------------------\n\n/**\n * Single entry-point the cron batch (Slice 5) calls per `(seed, tick)` pair.\n * Routes to the appropriate per-strategy iterator and yields a uniform\n * {@link DataSeedScopeIterationItem} stream regardless of `strategy`.\n *\n * Contract:\n * - `strategy === GLOBAL` — yields exactly one item; `customResolverKey`\n * MUST be `undefined` (the schema layer enforces this; we re-check\n * defensively at the dispatcher to fail loudly if a malformed seed\n * bypasses validation).\n * - `strategy === ALL_*` — pages the corresponding core resource;\n * `customResolverKey` MUST be `undefined`.\n * - `strategy === CUSTOM_RESOLVER` — `customResolverKey` is REQUIRED;\n * delegates to the resolver registry.\n *\n * The defensive `customResolverKey` re-checks throw `Error` (not a\n * structured `WildoBackendError`) because reaching them means a Zod-layer\n * invariant has already been violated upstream — we want the loudest\n * possible failure mode (with a stack trace pointing into the dispatcher),\n * not a soft framework-error path that operators might mistake for a\n * recoverable misconfiguration.\n *\n * Returns `AsyncGenerator` (concrete type, not `AsyncIterable`) so the\n * cron batch can also call `.return()` for early termination if a future\n * slice adds a per-tick deadline — `AsyncIterable` doesn't expose that\n * affordance.\n */\nexport function iterateScope(input: {\n readonly strategy: DataSeedScopeIterationStrategy;\n readonly customResolverKey?: string;\n readonly parentCtx: ExecutionContext<any>;\n readonly deps: DataSeedScopeIterationDeps;\n readonly options?: DataSeedScopeIterationOptions;\n}): AsyncGenerator<DataSeedScopeIterationItem> {\n const { strategy, customResolverKey, parentCtx, deps, options } = input;\n\n switch (strategy) {\n case DataSeedScopeIterationStrategy.GLOBAL:\n if (customResolverKey !== undefined) {\n throw new Error(\n `iterateScope: strategy=GLOBAL must not carry customResolverKey (got '${customResolverKey}'). The schema layer should reject this — reaching here means a malformed DataSeedDefinition bypassed validation.`,\n );\n }\n return iterateGlobal();\n\n case DataSeedScopeIterationStrategy.ALL_APPLICATIONS:\n if (customResolverKey !== undefined) {\n throw new Error(\n `iterateScope: strategy=ALL_APPLICATIONS must not carry customResolverKey (got '${customResolverKey}').`,\n );\n }\n return iterateAllApplications(parentCtx, deps, options);\n\n case DataSeedScopeIterationStrategy.ALL_ORGANIZATIONS:\n if (customResolverKey !== undefined) {\n throw new Error(\n `iterateScope: strategy=ALL_ORGANIZATIONS must not carry customResolverKey (got '${customResolverKey}').`,\n );\n }\n return iterateAllOrganizations(parentCtx, deps, options);\n\n case DataSeedScopeIterationStrategy.ALL_USERS:\n if (customResolverKey !== undefined) {\n throw new Error(\n `iterateScope: strategy=ALL_USERS must not carry customResolverKey (got '${customResolverKey}').`,\n );\n }\n return iterateAllUsers(parentCtx, deps, options);\n\n case DataSeedScopeIterationStrategy.CUSTOM_RESOLVER:\n if (customResolverKey === undefined || customResolverKey.length === 0) {\n throw new Error(\n `iterateScope: strategy=CUSTOM_RESOLVER requires a non-empty customResolverKey. The schema layer should reject this — reaching here means a malformed DataSeedDefinition bypassed validation.`,\n );\n }\n return iterateCustomResolver(customResolverKey, parentCtx, deps);\n }\n}\n"]}
|
|
@@ -29,14 +29,14 @@ export const MONGODB_ONLY_OPERATORS = [
|
|
|
29
29
|
// ============================================================================
|
|
30
30
|
/**
|
|
31
31
|
* The sub-keys of the canonical date-range filter vocabulary
|
|
32
|
-
* (`
|
|
32
|
+
* (`Resources_Filter_DateRangeSchema` in `@wildo-ai/saas-models` → `{ startDate?, endDate? }`).
|
|
33
33
|
*/
|
|
34
34
|
const DATE_RANGE_SUBKEYS = ['startDate', 'endDate'];
|
|
35
35
|
/**
|
|
36
36
|
* A date-range filter VALUE is a PLAIN object whose keys are a non-empty subset of
|
|
37
37
|
* `{ startDate, endDate }`. This is the shape the collection-query controller reconstructs for a
|
|
38
38
|
* `z.date()` filter field (the resources-config factory auto-converts such a field to
|
|
39
|
-
* `
|
|
39
|
+
* `Resources_Filter_DateRangeSchema`). A scalar, an operator object (`$`-prefixed keys), a `Date`,
|
|
40
40
|
* an ObjectId, or any class instance is deliberately NOT a range — only a plain `{}` literal carries
|
|
41
41
|
* the vocabulary, so this cannot misfire on an operator condition or a persisted value.
|
|
42
42
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.backend.schemas.js","sourceRoot":"","sources":["../../../../../src/databases/models/filter.backend.schemas.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Database-agnostic Filter Types\n * \n * Provides abstract filter types and operator definitions for cross-database\n * query filtering (MongoDB, PostgreSQL).\n * \n * @see PostgreSQLFilterBackendService for the conversion implementation\n */\n\n// ============================================================================\n// Filter Types (Database-Agnostic)\n// ============================================================================\n\n/**\n * Database-agnostic filter type.\n * \n * Uses MongoDB FilterQuery-style syntax at the interface level.\n * SQL repository converts internally using a FilterQuery → SQL predicate builder.\n * \n * ## Supported Filter Operators (Cross-Database)\n * \n * The following operators are guaranteed to work with both MongoDB and PostgreSQL:\n * \n * **Comparison Operators:**\n * - `$eq` - Equal to (also implicit: `{ field: value }`)\n * - `$ne` - Not equal to\n * - `$gt` - Greater than\n * - `$gte` - Greater than or equal\n * - `$lt` - Less than\n * - `$lte` - Less than or equal\n * - `$in` - In array of values\n * - `$nin` - Not in array of values\n * \n * **Logical Operators:**\n * - `$and` - Logical AND (array of conditions)\n * - `$or` - Logical OR (array of conditions)\n * - `$not` - Logical NOT (single condition)\n * \n * **String Operators:**\n * - `$regex` - Regular expression match (with `$options: 'i'` for case-insensitive)\n * - `$startsWith` - Starts with (custom, converted to `LIKE 'value%'` in SQL)\n * - `$endsWith` - Ends with (custom, converted to `LIKE '%value'` in SQL)\n * - `$contains` - Contains substring (custom, converted to `LIKE '%value%'` in SQL)\n * \n * **Null Operators:**\n * - `$exists` - Field exists (true) or is null (false)\n * \n * ## Unsupported Operators (MongoDB-only)\n * \n * The following operators are NOT supported cross-database and will throw errors\n * if used with PostgreSQL resources:\n * \n * - `$where` - JavaScript expression evaluation\n * - `$expr` - Aggregation expression\n * - `$jsonSchema` - JSON schema validation\n * - `$elemMatch` - Complex array element matching (simple cases may work)\n * - `$all` - Array contains all\n * - `$size` - Array size\n * - `$type` - BSON type check\n * - `$mod` - Modulo\n * - `$text` - Text search (use full-text search instead)\n * - Geospatial operators (`$near`, `$geoWithin`, etc.)\n * \n * ## Escape Hatch\n * \n * For database-specific queries, use `$raw`:\n * ```typescript\n * { $raw: { sql: 'jsonb_path_exists(metadata, $1)', params: ['$.\\\"nested\\\"'] } }\n * ```\n */\nexport type ResourceFilter = Record<string, unknown>;\n\n/**\n * Supported comparison operators for cross-database filters\n */\nexport const SUPPORTED_FILTER_OPERATORS = [\n '$eq', '$ne', '$gt', '$gte', '$lt', '$lte', '$in', '$nin',\n '$and', '$or', '$not',\n '$regex', '$startsWith', '$endsWith', '$contains',\n '$exists',\n '$raw', // Escape hatch for database-specific queries\n] as const;\n\n/**\n * Operators that are MongoDB-only and will throw errors with PostgreSQL\n */\nexport const MONGODB_ONLY_OPERATORS = [\n '$where', '$expr', '$jsonSchema', '$elemMatch', '$all', '$size',\n '$type', '$mod', '$text', '$near', '$geoWithin', '$geoIntersects',\n '$nearSphere', '$centerSphere', '$geometry', '$minDistance', '$maxDistance',\n] as const;\n\n/**\n * Type for supported filter operator keys\n */\nexport type SupportedFilterOperator = typeof SUPPORTED_FILTER_OPERATORS[number];\n\n/**\n * Type for MongoDB-only operator keys\n */\nexport type MongoDBOnlyOperator = typeof MONGODB_ONLY_OPERATORS[number];\n\n// ============================================================================\n// Date-range filter normalization (cross-database)\n// ============================================================================\n\n/**\n * The sub-keys of the canonical date-range filter vocabulary\n * (`
|
|
1
|
+
{"version":3,"file":"filter.backend.schemas.js","sourceRoot":"","sources":["../../../../../src/databases/models/filter.backend.schemas.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Database-agnostic Filter Types\n * \n * Provides abstract filter types and operator definitions for cross-database\n * query filtering (MongoDB, PostgreSQL).\n * \n * @see PostgreSQLFilterBackendService for the conversion implementation\n */\n\n// ============================================================================\n// Filter Types (Database-Agnostic)\n// ============================================================================\n\n/**\n * Database-agnostic filter type.\n * \n * Uses MongoDB FilterQuery-style syntax at the interface level.\n * SQL repository converts internally using a FilterQuery → SQL predicate builder.\n * \n * ## Supported Filter Operators (Cross-Database)\n * \n * The following operators are guaranteed to work with both MongoDB and PostgreSQL:\n * \n * **Comparison Operators:**\n * - `$eq` - Equal to (also implicit: `{ field: value }`)\n * - `$ne` - Not equal to\n * - `$gt` - Greater than\n * - `$gte` - Greater than or equal\n * - `$lt` - Less than\n * - `$lte` - Less than or equal\n * - `$in` - In array of values\n * - `$nin` - Not in array of values\n * \n * **Logical Operators:**\n * - `$and` - Logical AND (array of conditions)\n * - `$or` - Logical OR (array of conditions)\n * - `$not` - Logical NOT (single condition)\n * \n * **String Operators:**\n * - `$regex` - Regular expression match (with `$options: 'i'` for case-insensitive)\n * - `$startsWith` - Starts with (custom, converted to `LIKE 'value%'` in SQL)\n * - `$endsWith` - Ends with (custom, converted to `LIKE '%value'` in SQL)\n * - `$contains` - Contains substring (custom, converted to `LIKE '%value%'` in SQL)\n * \n * **Null Operators:**\n * - `$exists` - Field exists (true) or is null (false)\n * \n * ## Unsupported Operators (MongoDB-only)\n * \n * The following operators are NOT supported cross-database and will throw errors\n * if used with PostgreSQL resources:\n * \n * - `$where` - JavaScript expression evaluation\n * - `$expr` - Aggregation expression\n * - `$jsonSchema` - JSON schema validation\n * - `$elemMatch` - Complex array element matching (simple cases may work)\n * - `$all` - Array contains all\n * - `$size` - Array size\n * - `$type` - BSON type check\n * - `$mod` - Modulo\n * - `$text` - Text search (use full-text search instead)\n * - Geospatial operators (`$near`, `$geoWithin`, etc.)\n * \n * ## Escape Hatch\n * \n * For database-specific queries, use `$raw`:\n * ```typescript\n * { $raw: { sql: 'jsonb_path_exists(metadata, $1)', params: ['$.\\\"nested\\\"'] } }\n * ```\n */\nexport type ResourceFilter = Record<string, unknown>;\n\n/**\n * Supported comparison operators for cross-database filters\n */\nexport const SUPPORTED_FILTER_OPERATORS = [\n '$eq', '$ne', '$gt', '$gte', '$lt', '$lte', '$in', '$nin',\n '$and', '$or', '$not',\n '$regex', '$startsWith', '$endsWith', '$contains',\n '$exists',\n '$raw', // Escape hatch for database-specific queries\n] as const;\n\n/**\n * Operators that are MongoDB-only and will throw errors with PostgreSQL\n */\nexport const MONGODB_ONLY_OPERATORS = [\n '$where', '$expr', '$jsonSchema', '$elemMatch', '$all', '$size',\n '$type', '$mod', '$text', '$near', '$geoWithin', '$geoIntersects',\n '$nearSphere', '$centerSphere', '$geometry', '$minDistance', '$maxDistance',\n] as const;\n\n/**\n * Type for supported filter operator keys\n */\nexport type SupportedFilterOperator = typeof SUPPORTED_FILTER_OPERATORS[number];\n\n/**\n * Type for MongoDB-only operator keys\n */\nexport type MongoDBOnlyOperator = typeof MONGODB_ONLY_OPERATORS[number];\n\n// ============================================================================\n// Date-range filter normalization (cross-database)\n// ============================================================================\n\n/**\n * The sub-keys of the canonical date-range filter vocabulary\n * (`Resources_Filter_DateRangeSchema` in `@wildo-ai/saas-models` → `{ startDate?, endDate? }`).\n */\nconst DATE_RANGE_SUBKEYS: readonly string[] = ['startDate', 'endDate'];\n\n/**\n * A date-range filter VALUE is a PLAIN object whose keys are a non-empty subset of\n * `{ startDate, endDate }`. This is the shape the collection-query controller reconstructs for a\n * `z.date()` filter field (the resources-config factory auto-converts such a field to\n * `Resources_Filter_DateRangeSchema`). A scalar, an operator object (`$`-prefixed keys), a `Date`,\n * an ObjectId, or any class instance is deliberately NOT a range — only a plain `{}` literal carries\n * the vocabulary, so this cannot misfire on an operator condition or a persisted value.\n */\nfunction isDateRangeFilterValue(value: unknown): value is { startDate?: unknown; endDate?: unknown } {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) return false; // reject Date/ObjectId/class instances\n const keys = Object.keys(value as object);\n return keys.length > 0 && keys.every((k) => DATE_RANGE_SUBKEYS.includes(k));\n}\n\n/**\n * Translate the canonical date-range filter vocabulary (`{ startDate?, endDate? }`) into the\n * cross-database comparison-operator form (`{ $gte?, $lte? }`), which mongoose consumes natively and\n * `PostgreSQLFilterBackendService.buildWhereExpression` already compiles. WITHOUT this, a\n * `createdAt: { startDate, endDate }` filter reaches mongoose and fails with a `CastError` (the whole\n * object is cast to a Date), and PG treats it as a nested-path equality — i.e. the date-range filter\n * that the OpenAPI/controller layers reconstruct is silently unusable on every generic resource\n * (only the audit-logs custom-impl translated it by hand).\n *\n * Both bounds are optional (open-ended ranges), so an absent bound is omitted. Recurses through\n * `$and`/`$or`/`$nor` so a SEARCH filter wrapped in a logical operator is covered. Returns a NEW\n * object (no mutation of the caller's filter); non-range values pass through untouched, so it is a\n * safe no-op on read/update/delete filters that carry no range vocabulary.\n */\nexport function normalizeDateRangeFilters<T>(filter: T): T {\n if (!filter || typeof filter !== 'object') return filter;\n if (Array.isArray(filter)) return filter.map((entry) => normalizeDateRangeFilters(entry)) as unknown as T;\n const proto = Object.getPrototypeOf(filter);\n if (proto !== Object.prototype && proto !== null) return filter; // never rewrite a Date/ObjectId/class instance\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(filter as Record<string, unknown>)) {\n if ((key === '$and' || key === '$or' || key === '$nor') && Array.isArray(value)) {\n out[key] = value.map((sub) => normalizeDateRangeFilters(sub));\n } else if (isDateRangeFilterValue(value)) {\n const range: Record<string, unknown> = {};\n if (value.startDate !== undefined) range.$gte = value.startDate;\n if (value.endDate !== undefined) range.$lte = value.endDate;\n // An all-undefined range object carries no bound → drop the key rather than emit `{}` (which\n // would be a match-nothing/degenerate condition).\n if (Object.keys(range).length > 0) out[key] = range;\n } else {\n out[key] = value;\n }\n }\n return out as T;\n}\n"]}
|
package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregation-authorization.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/services/aggregation/aggregation-authorization.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;oEAaoE;AAKpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAClG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kEAAkE,CAAC;AACnH,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,0EAA0E,CAAC;AAChI,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,oFAAoF,CAAC;AACvI,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;
|
|
1
|
+
{"version":3,"file":"aggregation-authorization.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/services/aggregation/aggregation-authorization.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;oEAaoE;AAKpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAClG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kEAAkE,CAAC;AACnH,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,0EAA0E,CAAC;AAChI,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,oFAAoF,CAAC;AACvI,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;AAY5G,OAAO,EAIL,KAAK,yBAAyB,EAC/B,MAAM,wEAAwE,CAAC;AAEhF,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4DAA4D,CAAC;AAYjG,kDAAkD;AAClD,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,gBAAgB,CAAC;IACxB,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,qFAAqF;AACrF,MAAM,WAAW,8BAA8B;IAC7C,yEAAyE;IACzE,cAAc,EAAE,cAAc,CAAC;CAChC;AAOD,qBACa,sCAAsC;IAEZ,OAAO,CAAC,QAAQ,CAAC,MAAM;IACV,OAAO,CAAC,QAAQ,CAAC,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACnC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAHpC,MAAM,EAAE,aAAa,EACR,YAAY,EAAE,0BAA0B,EACpC,gBAAgB,EAAE,+BAA+B,EACnD,qBAAqB,EAAE,4BAA4B;IAGxH;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,6BAA6B,GAAG,8BAA8B;IAwC/E;;;;;;;;;;;;;;;;;;;OAmBG;IACI,qCAAqC,CAC1C,qBAAqB,EAAE,yBAAyB,GAAG,SAAS,EAC5D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,GACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAe1B,OAAO,CAAC,eAAe;IA8FvB,OAAO,CAAC,kBAAkB;IAiE1B,OAAO,CAAC,qBAAqB;IAmE7B,OAAO,CAAC,yBAAyB;IA2BjC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAuCzB,OAAO,CAAC,iBAAiB;IAWzB;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,+BAA+B;IAgBvC;;;;;;;;;OASG;IACH,OAAO,CAAC,wBAAwB;IAiDhC,OAAO,CAAC,2CAA2C;CA8CpD"}
|
package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js
CHANGED
|
@@ -26,7 +26,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
26
26
|
};
|
|
27
27
|
import { injectable, inject } from 'inversify';
|
|
28
28
|
import { SAAS_SERVICE_TYPES } from '../../../inject/models/service-types.js';
|
|
29
|
-
import { ErrorType, ErrorCustomMessageReference, CoreResourceOperation, ResourcePrimaryScope, ComparisonOperator, ContextFilterSource, isOrganizationWideRoleInfo, } from '@wildo-ai/saas-models';
|
|
29
|
+
import { ErrorType, ErrorCustomMessageReference, CoreResourceOperation, ResourcePrimaryScope, ComparisonOperator, ContextFilterSource, isOrganizationWideRoleInfo, requiredRolesDeclarePublicAccess, } from '@wildo-ai/saas-models';
|
|
30
30
|
import { isRetentionGovernedResource, isRetentionHideSuppressedForReadOnlyPipeline, withRetentionHideApplied, } from '../../../compliance/privacy/retention-hide-predicate.backend.js';
|
|
31
31
|
import { getZodObjectShape, unwrapSchema, getZodType } from '@wildo-ai/zod-decorators';
|
|
32
32
|
/** Map ComparisonOperator to MongoDB filter operators */
|
|
@@ -130,6 +130,25 @@ let AggregationAuthorizationBackendService = class AggregationAuthorizationBacke
|
|
|
130
130
|
customMessageReference: ErrorCustomMessageReference.AGGREGATION_ACCESS_DENIED,
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
|
+
/*
|
|
134
|
+
* The THIRD role gate that must honour `APP_PUBLIC`, and the one furthest from the authorizer.
|
|
135
|
+
*
|
|
136
|
+
* A chart over a resource whose LIST declares `APP_PUBLIC` asks the same question
|
|
137
|
+
* `validateOperationRoles` asks, by a different mechanism — so before this line it produced the
|
|
138
|
+
* same wrong answer: the LIST itself answered 200 to an authenticated caller (once the
|
|
139
|
+
* authorizer's gate was fixed) while a chart built on that very LIST kept refusing them.
|
|
140
|
+
*
|
|
141
|
+
* Read from `effectiveRoles`, not `listRoles`, so a chart that narrows deliberately still
|
|
142
|
+
* narrows: a public LIST with `chartRoles: [ORG_ADMIN]` intersects to `[ORG_ADMIN]`, carries no
|
|
143
|
+
* public sentinel, and is gated exactly as its author declared. Only a required set that STILL
|
|
144
|
+
* declares public access after the narrowing admits everyone.
|
|
145
|
+
*
|
|
146
|
+
* The scope-filter injection below is untouched — this relaxes who may ASK, never which rows the
|
|
147
|
+
* aggregation reads.
|
|
148
|
+
*/
|
|
149
|
+
if (requiredRolesDeclarePublicAccess(effectiveRoles)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
133
152
|
// Check if the user satisfies at least one effective role — honouring the
|
|
134
153
|
// ROLE HIERARCHY, exactly like the canonical `validateOperationRoles`. A raw
|
|
135
154
|
// `includes` check (the previous behaviour) wrongly denied an ORG_ADMIN a chart
|
package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregation-authorization.backend.service.js","sourceRoot":"","sources":["../../../../../../src/databases/services/aggregation/aggregation-authorization.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;oEAaoE;;;;;;;;;;;;;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAMpF,OAAO,EACL,SAAS,EACT,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,2BAA2B,EAC3B,4CAA4C,EAC5C,wBAAwB,GAEzB,MAAM,wEAAwE,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAIvF,yDAAyD;AACzD,MAAM,iBAAiB,GAA2B;IAChD,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,KAAK;IAC9B,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,KAAK;IAC9B,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,KAAK;IAC9B,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM;IAChC,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,KAAK;IAC9B,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM;CACjC,CAAC;AA0BK,IAAM,sCAAsC,GAA5C,MAAM,sCAAsC;IAEK;IACa;IACI;IACF;IAJrE,YACsD,MAAqB,EACR,YAAwC,EACpC,gBAAiD,EACnD,qBAAmD;QAHlE,WAAM,GAAN,MAAM,CAAe;QACR,iBAAY,GAAZ,YAAY,CAA4B;QACpC,qBAAgB,GAAhB,gBAAgB,CAAiC;QACnD,0BAAqB,GAArB,qBAAqB,CAA8B;IACrH,CAAC;IAEJ;;;;;;OAMG;IACH,SAAS,CAAC,KAAoC;QAC5C,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;QAEjF,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QAEtG,8CAA8C;QAC9C,MAAM,MAAM,GAA4B,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAErE,+EAA+E;QAC/E,6EAA6E;QAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,oBAA4C,EAAE,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAE1J,oEAAoE;QACpE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;QAE3F,6BAA6B;QAC7B,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,qBAAqB,CACxB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,gBAAgB,EACtB,gBAAgB,EAChB,SAAS,IAAI,EAAE,EACf,cAAc,IAAI,EAAE,EACpB,MAAM,EACN,UAAU,CACX,CAAC;QACJ,CAAC;QAED,+FAA+F;QAC/F,iGAAiG;QACjG,yEAAyE;QACzE,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,qCAAqC,CACxD,cAAc,EACd,MAAM,EACN,gBAAgB,CACC;SACpB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACI,qCAAqC,CAC1C,qBAA4D,EAC5D,MAA+B,EAC/B,gBAAwC;QAExC,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACxD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,4CAA4C,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnE,+FAA+F;YAC/F,gGAAgG;YAChG,oGAAoG;YACpG,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,8DAA8D;IAEtD,eAAe,CACrB,YAAoB,EACpB,MAAW,EACX,gBAAuC,EACvC,UAAqB;QAErB,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,sCAAsC;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oDAAoD,YAAY,GAAG,CAAC,CAAC;YACtF,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,aAAa,EACvB,gBAAgB,EAChB;gBACE,sBAAsB,EAAE,2BAA2B,CAAC,yBAAyB;gBAC7E,OAAO,EAAE,EAAE,YAAY,EAAE;aAC1B,CACF,CAAC;QACJ,CAAC;QAED,2DAA2D;QAC3D,MAAM,cAAc,GAAG,UAAU;YAC/B,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,aAAa,EACvB,gBAAgB,EAChB;gBACE,sBAAsB,EAAE,2BAA2B,CAAC,yBAAyB;aAC9E,CACF,CAAC;QACJ,CAAC;QAED,0EAA0E;QAC1E,6EAA6E;QAC7E,gFAAgF;QAChF,wEAAwE;QACxE,8EAA8E;QAC9E,8EAA8E;QAC9E,8EAA8E;QAC9E,MAAM,aAAa,GAAG,MAAM,CAAC,oBAA4C,CAAC;QAC1E,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACrF,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEzD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,aAAa,EAAE,CAAC;YAC5C,6EAA6E;YAC7E,2EAA2E;YAC3E,kCAAkC;YAClC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,IAAa,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC1F,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAExE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wDAAwD,YAAY,mBAAmB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3K,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,aAAa,EACvB,gBAAgB,EAChB;gBACE,sBAAsB,EAAE,2BAA2B,CAAC,yBAAyB;gBAC7E,OAAO,EAAE,EAAE,YAAY,EAAE;aAC1B,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8DAA8D;IAEtD,kBAAkB,CACxB,KAA2B,EAC3B,YAAoB,EACpB,gBAAuC,EACvC,MAA+B;QAE/B,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC;gBACxC,MAAM,KAAK,GAAG,gBAAgB,CAAC,cAAc,CAAC;gBAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,aAAa,EACvB,gBAAgB,EAChB;wBACE,sBAAsB,EAAE,2BAA2B,CAAC,4BAA4B;wBAChF,OAAO,EAAE;4BACP,wBAAwB;4BACxB,YAAY;yBACb;qBACF,CACF,CAAC;gBACJ,CAAC;gBACD,2EAA2E;gBAC3E,MAAM,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;gBACjC,OAAO,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,KAAK,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpC,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;gBACvC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,aAAa,EACvB,gBAAgB,EAChB;wBACE,sBAAsB,EAAE,2BAA2B,CAAC,4BAA4B;wBAChF,OAAO,EAAE;4BACP,wBAAwB;4BACxB,YAAY;yBACb;qBACF,CACF,CAAC;gBACJ,CAAC;gBACD,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;gBAC1B,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,KAAK,oBAAoB,CAAC,WAAW;gBACnC,uCAAuC;gBACvC,OAAO,EAAE,CAAC;YACZ;gBACE,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,aAAa,EACvB,gBAAgB,EAChB;oBACE,sBAAsB,EAAE,2BAA2B,CAAC,4BAA4B;oBAChF,OAAO,EAAE;wBACP,wBAAwB;wBACxB,YAAY;wBACZ,KAAK;qBACN;iBACF,CACF,CAAC;QACN,CAAC;IACH,CAAC;IAED,8DAA8D;IAEtD,qBAAqB,CAC3B,cAA+B,EAC/B,YAAoB,EACpB,gBAAuC,EACvC,SAAiC,EACjC,cAAuC,EACvC,MAA+B,EAC/B,UAAiC;QAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEpD,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,CAAC,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;YACtG,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC1D,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,aAAa,EACvB,gBAAgB,EAChB;oBACE,sBAAsB,EAAE,2BAA2B,CAAC,4BAA4B;oBAChF,OAAO,EAAE;wBACP,wBAAwB;wBACxB,YAAY;wBACZ,KAAK,EAAE,EAAE,CAAC,KAAK;wBACf,MAAM,EAAE,EAAE,CAAC,MAAM;wBACjB,WAAW,EAAE,EAAE,CAAC,WAAW;qBAC5B;iBACF,CACF,CAAC;YACJ,CAAC;YAED,0CAA0C;YAC1C,MAAM,YAAY,GAAG,MAAM;gBACzB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;gBACzD,CAAC,CAAC,aAAa,CAAC;YAElB,gCAAgC;YAChC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,IAAI,kBAAkB,CAAC,EAAE,CAAC;YAEtD,IAAI,CAAC,2CAA2C,CAAC;gBAC/C,YAAY;gBACZ,gBAAgB;gBAChB,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,QAAQ;gBACR,YAAY;gBACZ,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;YAEH,IAAI,QAAQ,KAAK,kBAAkB,CAAC,EAAE,EAAE,CAAC;gBACvC,sCAAsC;gBACtC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,mDAAmD;gBACnD,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;oBAClC,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACzE,sFAAsF;wBACrF,QAAoC,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC;oBAChE,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;oBACjD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,yBAAyB,CAC/B,EAAiB,EACjB,gBAAuC,EACvC,SAAiC,EACjC,cAAuC;QAEvC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,mBAAmB,CAAC,YAAY;gBACnC,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,gBAAgB,CAAC,YAAoB,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAE7G,KAAK,mBAAmB,CAAC,oBAAoB;gBAC3C,OAAO,gBAAgB,CAAC,cAAc,CAAC;YAEzC,KAAK,mBAAmB,CAAC,SAAS;gBAChC,OAAO,SAAS,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;YAE/C,KAAK,mBAAmB,CAAC,eAAe;gBACtC,OAAO,cAAc,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;YAEpD;gBACE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4DAA4D,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3F,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;IAED,8DAA8D;IAE9D;;;OAGG;IACK,iBAAiB,CAAC,KAAc,EAAE,SAAiB,EAAE,MAAoB;QAC/E,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAE5D,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAE/B,iDAAiD;QACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEtC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5C,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,KAAK,gBAAgB,SAAS,GAAG,CAAC,CAAC;oBACrG,OAAO,KAAK,CAAC,CAAC,8CAA8C;gBAC9D,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mDAAmD,KAAK,gBAAgB,SAAS,GAAG,CAAC,CAAC;oBACvG,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC;YACD,KAAK,SAAS;gBACZ,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;YAC3C;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED,8DAA8D;IAEtD,iBAAiB,CAAC,YAAoB;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;YAC5E,OAAO,MAAM,CAAC,UAA0B,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,8DAA8D;IAE9D;;;;;;;;OAQG;IACK,qBAAqB,CAAC,MAAW;QACvC,4EAA4E;QAC5E,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;YAAE,OAAO,SAAS,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CACnC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,mBAAmB,KAAK,qBAAqB,CAAC,IAAI,IAAI,EAAE,CAAC,kBAAkB,KAAK,IAAI,CACrG,CAAC;QACF,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAE9B,4CAA4C;QAC5C,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,+BAA+B,CAAC,YAAoB,EAAE,gBAAuC;QACnG,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,YAAY,yBAAyB,CAAC,CAAC;YAC/F,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,SAAS,EACnB,gBAAgB,EAChB;gBACE,sBAAsB,EAAE,2BAA2B,CAAC,SAAS;gBAC7D,OAAO,EAAE,EAAE,YAAY,EAAE;aAC1B,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACK,wBAAwB,CAC9B,aAAmC,EACnC,gBAAuC;QAEvC,MAAM,SAAS,GAAG,gBAAgB,CAAC,cAAc,CAAC;QAClD,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QAEvD,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,cAAc,CAAC;QAC7D,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAC7C,MAAM,QAAQ,GAAyD,EAAE,CAAC;QAE1E,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,2FAA2F;YAC3F,2FAA2F;YAC3F,4FAA4F;YAC5F,iFAAiF;YACjF,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpC,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GACd,EAAE,CAAC,mBAAmB,KAAK,oBAAoB,CAAC,WAAW;mBACxD,CACD,aAAa,KAAK,oBAAoB,CAAC,aAAa;uBACjD,EAAE,CAAC,mBAAmB,KAAK,oBAAoB,CAAC,aAAa;uBAC7D,EAAE,CAAC,iBAAiB,KAAK,oBAAoB,CACjD;mBACE,CACD,aAAa,KAAK,oBAAoB,CAAC,SAAS;uBAC7C,EAAE,CAAC,mBAAmB,KAAK,oBAAoB,CAAC,SAAS;uBACzD,EAAE,CAAC,iBAAiB,KAAK,YAAY,CACzC,CAAC;YAEJ,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,2CAA2C,CAAC,MAQnD;QACC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,kBAAkB,CAAC,EAAE,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC;YACzF,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,aAAa,EACvB,MAAM,CAAC,gBAAgB,EACvB;gBACE,sBAAsB,EAAE,2BAA2B,CAAC,0BAA0B;gBAC9E,OAAO,EAAE;oBACP,wBAAwB;oBACxB,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB;aACF,CACF,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,aAAa,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAChC,SAAS,CAAC,aAAa,EACvB,MAAM,CAAC,gBAAgB,EACvB;gBACE,sBAAsB,EAAE,2BAA2B,CAAC,0BAA0B;gBAC9E,OAAO,EAAE;oBACP,wBAAwB;oBACxB,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB;aACF,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CAEF,CAAA;AAhhBY,sCAAsC;IADlD,UAAU,EAAE;IAGR,WAAA,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACjC,WAAA,MAAM,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAA;IAC9C,WAAA,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAA;IAClD,WAAA,MAAM,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAA;;GALxC,sCAAsC,CAghBlD","sourcesContent":["/** ──────────────────────────────────────────────────────────────\n * AggregationAuthorizationBackendService\n *\n * Handles authorization for aggregation queries:\n * 1. LIST role check — user must have LIST permission on main resource\n * 2. Scope filter injection — ORGANIZATIONS, USER_SELF, APPLICATION\n * 3. Context filter resolution — parentResource, urlParam, currentUser, currentOrganization\n * 4. Optional chart-level role narrowing\n *\n * Ref: Authorization model → L996-1024\n * Ref: Scope-based injection → L1004-1007\n * Ref: Context filter examples → L1053-1074\n * Ref: Type coercion → L1074\n * ────────────────────────────────────────────────────────────── */\n\nimport { injectable, inject } from 'inversify';\nimport type { z } from 'zod';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport type { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport type { AuthorizationsBackendService } from '~wildo-backend-lib/security/authorizations/services/authorizations.backend.service';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport {\n ErrorType,\n ErrorCustomMessageReference,\n CoreResourceOperation,\n ResourcePrimaryScope,\n ComparisonOperator,\n ContextFilterSource,\n isOrganizationWideRoleInfo,\n} from '@wildo-ai/saas-models';\nimport type { Roles, ResourceType } from '@wildo-ai/saas-models';\nimport {\n isRetentionGovernedResource,\n isRetentionHideSuppressedForReadOnlyPipeline,\n withRetentionHideApplied,\n type RetentionGovernanceSignal,\n} from '~wildo-backend-lib/compliance/privacy/retention-hide-predicate.backend';\nimport { getZodObjectShape, unwrapSchema, getZodType } from '@wildo-ai/zod-decorators';\nimport type { AggregationQuery, ContextFilter } from '@wildo-ai/saas-models';\nimport type { ResourceFilter } from '~wildo-backend-lib/databases/models/filter.backend.schemas';\n\n/** Map ComparisonOperator to MongoDB filter operators */\nconst OPERATOR_TO_MONGO: Record<string, string> = {\n [ComparisonOperator.EQ]: '$eq',\n [ComparisonOperator.NE]: '$ne',\n [ComparisonOperator.GT]: '$gt',\n [ComparisonOperator.GTE]: '$gte',\n [ComparisonOperator.LT]: '$lt',\n [ComparisonOperator.LTE]: '$lte',\n};\n\n/** Input required by the authorization service */\nexport interface AggregationAuthorizationInput {\n query: AggregationQuery;\n executionContext: ExecutionContext<any>;\n /** Optional chart-level role restriction (narrows LIST roles) */\n chartRoles?: string[];\n /** URL param values (for context filter resolution) */\n urlParams?: Record<string, string>;\n /** Parent resource context (for context filter resolution) */\n parentResource?: Record<string, unknown>;\n}\n\n/** Output from authorization — the augmented filter to merge into the aggregation */\nexport interface AggregationAuthorizationResult {\n /** Combined filter (static filters + scope filters + context filters) */\n resolvedFilter: ResourceFilter;\n}\n\ninterface ScopeLockDescriptor {\n field: 'organizationId' | 'userId';\n value: string;\n}\n\n@injectable()\nexport class AggregationAuthorizationBackendService {\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.ResourceRegistryService) private readonly resourceRegistry: ResourcesRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.AuthorizationsService) private readonly authorizationsService: AuthorizationsBackendService,\n ) {}\n\n /**\n * Authorize an aggregation query:\n * 1. Check user has LIST role on mainResourceType\n * 2. Inject scope filters based on ResourcePrimaryScope\n * 3. Resolve context filters\n * 4. Merge everything into a single filter object\n */\n authorize(input: AggregationAuthorizationInput): AggregationAuthorizationResult {\n const { query, executionContext, chartRoles, urlParams, parentResource } = input;\n\n const resourceConfig = this.getResourceConfigurationOrThrow(query.mainResourceType, executionContext);\n\n // 1. Start with static filters from the query\n const filter: Record<string, unknown> = { ...(query.filters || {}) };\n\n // 2. Inject scope-based filters before the role check so missing/unknown scope\n // fails with the real authorization reason instead of a generic role denial.\n const scopeLocks = this.injectScopeFilters(resourceConfig.resourcePrimaryScope as ResourcePrimaryScope, query.mainResourceType, executionContext, filter);\n\n // 3. LIST role check against the active application/org/user scope.\n this.checkListAccess(query.mainResourceType, resourceConfig, executionContext, chartRoles);\n\n // 4. Resolve context filters\n if (query.contextFilters && query.contextFilters.length > 0) {\n this.resolveContextFilters(\n query.contextFilters,\n query.mainResourceType,\n executionContext,\n urlParams || {},\n parentResource || {},\n filter,\n scopeLocks,\n );\n }\n\n // 5. Retention hide (gate G-AGG). Applied LAST so it cannot be overwritten by a static/context\n // filter resolved above, and inside `authorize` so it covers BOTH the main resource and every\n // joined resource (each join is authorized through this same method).\n return {\n resolvedFilter: this.applyRetentionHideToAggregationFilter(\n resourceConfig,\n filter,\n executionContext,\n ) as ResourceFilter,\n };\n }\n\n /**\n * Hide impersonalized-and-retained rows from an aggregation (gate **G-AGG**).\n *\n * The charts/analytics path builds its own `$match` from the authorization result and NEVER passes\n * through `buildContextualFilter`, so without this a RETAINED row still contributes to every chart,\n * KPI tile and export — leaking, in aggregate form, records that are individually unreadable. A\n * count or a sum over a hidden row is still disclosure.\n *\n * THE single authority for the aggregation side, deliberately public: the query service reuses it\n * for the `skipAuthorization` bypass branch, so skipping AUTHORIZATION can never mean skipping\n * RETENTION (mirrors the repository chokepoint, where the hide is applied before the\n * `excludeContextualFilter` early-return for exactly this reason).\n *\n * FAIL-CLOSED: assigned at the TOP LEVEL, overwriting any caller-supplied `retentionStatus` — a\n * chart's static `filters` are author-controlled and must not be able to re-select retained rows.\n *\n * Suppressed ONLY by the audited see-through EC flag (M5b). No read-op scoping is needed here, and\n * its absence is structural rather than incidental: an aggregation compiles to a read-only pipeline\n * and has no write path, so a see-through EC reaching this code can never mutate a retained row.\n */\n public applyRetentionHideToAggregationFilter(\n resourceConfiguration: RetentionGovernanceSignal | undefined,\n filter: Record<string, unknown>,\n executionContext?: ExecutionContext<any>,\n ): Record<string, unknown> {\n if (!isRetentionGovernedResource(resourceConfiguration)) {\n return filter;\n }\n if (isRetentionHideSuppressedForReadOnlyPipeline(executionContext)) {\n // Audited compliance reveal — the caller has already passed the `seeRetained` fail-closed gate\n // and supplied a human + reason, so retained rows are legitimately in scope for this aggregate.\n // Returning the filter UNTOUCHED is what lets an auditor's own `retentionStatus` predicate survive.\n return filter;\n }\n return withRetentionHideApplied(filter);\n }\n\n // ── LIST Role Check ────────────────────────────────────────\n\n private checkListAccess(\n resourceType: string,\n config: any,\n executionContext: ExecutionContext<any>,\n chartRoles?: string[],\n ): void {\n // Find the LIST operation's roles\n const listRoles = this.getListOperationRoles(config);\n if (!listRoles) {\n // No LIST operation configured → deny\n this.logger.warn(`AggregationAuthorization: no LIST operation for '${resourceType}'`);\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_ACCESS_DENIED,\n context: { resourceType },\n },\n );\n }\n\n // If chart restricts roles further, narrow the allowed set\n const effectiveRoles = chartRoles\n ? listRoles.filter(r => chartRoles.includes(r))\n : listRoles;\n\n if (effectiveRoles.length === 0) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_ACCESS_DENIED,\n },\n );\n }\n\n // Check if the user satisfies at least one effective role — honouring the\n // ROLE HIERARCHY, exactly like the canonical `validateOperationRoles`. A raw\n // `includes` check (the previous behaviour) wrongly denied an ORG_ADMIN a chart\n // gated on ORG_MEMBER, because admin's *inherited* membership was never\n // expanded. We keep the scope-filtering (only the active org's / user's roles\n // count — a deliberate aggregation tightening) and expand each scope-filtered\n // role through ITS scope's hierarchy via the live (custom-aware) role config.\n const resourceScope = config.resourcePrimaryScope as ResourcePrimaryScope;\n const relevantRoles = this.collectRelevantUserRoles(resourceScope, executionContext);\n const userRoles = relevantRoles.map(entry => entry.role);\n\n const satisfiedRoles = new Set<string>();\n for (const { role, scope } of relevantRoles) {\n // Always include the role itself (preserves the prior direct-match behaviour\n // even for a required role that is absent from the hierarchy config), then\n // add every ancestor it inherits.\n satisfiedRoles.add(role);\n for (const inherited of this.authorizationsService.getRoleHierarchy(role as Roles, scope)) {\n satisfiedRoles.add(inherited);\n }\n }\n const hasAccess = effectiveRoles.some(role => satisfiedRoles.has(role));\n\n if (!hasAccess) {\n this.logger.warn(`AggregationAuthorization: user lacks LIST access on '${resourceType}'. User roles: [${userRoles.join(', ')}], required: [${effectiveRoles.join(', ')}]`);\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_ACCESS_DENIED,\n context: { resourceType },\n },\n );\n }\n }\n\n // ── Scope Filter Injection ─────────────────────────────────\n\n private injectScopeFilters(\n scope: ResourcePrimaryScope,\n resourceType: string,\n executionContext: ExecutionContext<any>,\n filter: Record<string, unknown>,\n ): ScopeLockDescriptor[] {\n switch (scope) {\n case ResourcePrimaryScope.ORGANIZATIONS: {\n const orgId = executionContext.organizationId;\n if (!orgId) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_UNRESOLVED,\n context: {\n // diagnostic (log-only)\n resourceType,\n },\n },\n );\n }\n // Always enforce scope — override any pre-existing value to prevent bypass\n filter['organizationId'] = orgId;\n return [{ field: 'organizationId', value: orgId }];\n }\n case ResourcePrimaryScope.USER_SELF: {\n const userId = executionContext.userId;\n if (!userId) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_UNRESOLVED,\n context: {\n // diagnostic (log-only)\n resourceType,\n },\n },\n );\n }\n filter['userId'] = userId;\n return [{ field: 'userId', value: userId }];\n }\n case ResourcePrimaryScope.APPLICATION:\n // No scope filter needed — admin-level\n return [];\n default:\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_UNRESOLVED,\n context: {\n // diagnostic (log-only)\n resourceType,\n scope,\n },\n },\n );\n }\n }\n\n // ── Context Filter Resolution ──────────────────────────────\n\n private resolveContextFilters(\n contextFilters: ContextFilter[],\n resourceType: string,\n executionContext: ExecutionContext<any>,\n urlParams: Record<string, string>,\n parentResource: Record<string, unknown>,\n filter: Record<string, unknown>,\n scopeLocks: ScopeLockDescriptor[],\n ): void {\n const schema = this.resolveMainSchema(resourceType);\n\n for (const cf of contextFilters) {\n const resolvedValue = this.resolveContextFilterValue(cf, executionContext, urlParams, parentResource);\n if (resolvedValue === undefined || resolvedValue === null) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_UNRESOLVED,\n context: {\n // diagnostic (log-only)\n resourceType,\n field: cf.field,\n source: cf.source,\n sourceField: cf.sourceField,\n },\n },\n );\n }\n\n // Coerce value to the target field's type\n const coercedValue = schema\n ? this.coerceToFieldType(resolvedValue, cf.field, schema)\n : resolvedValue;\n\n // Apply to filter with operator\n const operator = cf.operator || ComparisonOperator.EQ;\n\n this.assertContextFilterDoesNotOverrideScopeLock({\n resourceType,\n executionContext,\n field: cf.field,\n operator,\n coercedValue,\n filter,\n scopeLocks,\n });\n\n if (operator === ComparisonOperator.EQ) {\n // Simple equality — direct assignment\n filter[cf.field] = coercedValue;\n } else {\n // Operator-based — use MongoDB-style nested object\n const mongoOp = OPERATOR_TO_MONGO[operator];\n if (mongoOp) {\n const existing = filter[cf.field];\n if (existing && typeof existing === 'object' && !Array.isArray(existing)) {\n // Merge with existing operator filters on same field (e.g., gte + lte for date range)\n (existing as Record<string, unknown>)[mongoOp] = coercedValue;\n } else {\n filter[cf.field] = { [mongoOp]: coercedValue };\n }\n }\n }\n }\n }\n\n private resolveContextFilterValue(\n cf: ContextFilter,\n executionContext: ExecutionContext<any>,\n urlParams: Record<string, string>,\n parentResource: Record<string, unknown>,\n ): unknown {\n switch (cf.source) {\n case ContextFilterSource.CURRENT_USER:\n return cf.sourceField ? (executionContext.initiatorIds as any)?.[cf.sourceField] : executionContext.userId;\n\n case ContextFilterSource.CURRENT_ORGANIZATION:\n return executionContext.organizationId;\n\n case ContextFilterSource.URL_PARAM:\n return urlParams[cf.sourceField ?? cf.field];\n\n case ContextFilterSource.PARENT_RESOURCE:\n return parentResource[cf.sourceField ?? cf.field];\n\n default:\n this.logger.warn(`AggregationAuthorization: unknown context filter source '${cf.source}'`);\n return undefined;\n }\n }\n\n // ── Type coercion ──────────────────────────────────────────\n\n /**\n * Coerce a resolved value (typically a string from URL params) to the\n * target field's Zod type: string → as-is, date → Date, number → Number.\n */\n private coerceToFieldType(value: unknown, fieldName: string, schema: z.ZodTypeAny): unknown {\n const shape = getZodObjectShape(schema);\n if (!shape || Object.keys(shape).length === 0) return value;\n\n const fieldSchema = shape[fieldName];\n if (!fieldSchema) return value;\n\n // Unwrap optional/nullable to find the core type\n const coreType = unwrapSchema(fieldSchema);\n const typeName = getZodType(coreType);\n\n if (typeof value !== 'string') return value;\n\n switch (typeName) {\n case 'date': {\n const date = new Date(value);\n if (isNaN(date.getTime())) {\n this.logger.warn(`AggregationAuthorization: invalid date value '${value}' for field '${fieldName}'`);\n return value; // Fall back to string — let MongoDB handle it\n }\n return date;\n }\n case 'number': {\n const num = Number(value);\n if (isNaN(num)) {\n this.logger.warn(`AggregationAuthorization: invalid number value '${value}' for field '${fieldName}'`);\n return value;\n }\n return num;\n }\n case 'boolean':\n return value === 'true' || value === '1';\n default:\n return value;\n }\n }\n\n // ── Schema Resolution ──────────────────────────────────────\n\n private resolveMainSchema(resourceType: string): z.ZodTypeAny | undefined {\n try {\n const config = this.resourceRegistry.getResourceConfiguration(resourceType);\n return config.mainSchema as z.ZodTypeAny;\n } catch {\n return undefined;\n }\n }\n\n // ── Helpers ────────────────────────────────────────────────\n\n /**\n * Extract the allowed role strings from the default LIST operation on a resource config.\n *\n * Resource configs expose `operations` as an array of\n * `{ operationIdentifier: string; isOperationDefault: boolean; roles?: (string|object)[] }`.\n * We use `any` here because the resource-registry returns a dynamic config object\n * whose internal shape depends on the app's resource definitions. The function\n * is defensive: it gracefully returns `undefined` if the structure doesn't match.\n */\n private getListOperationRoles(config: any): string[] | undefined {\n // operations is an array — use .find() to locate the LIST default operation\n if (!config.operations || !Array.isArray(config.operations)) return undefined;\n\n const listOp = config.operations.find(\n (op: any) => op.operationIdentifier === CoreResourceOperation.LIST && op.isOperationDefault === true,\n );\n if (!listOp) return undefined;\n\n // roles is directly on the operation object\n if (listOp.roles && Array.isArray(listOp.roles)) {\n return listOp.roles.map((r: any) => typeof r === 'string' ? r : String(r));\n }\n\n return undefined;\n }\n\n private getResourceConfigurationOrThrow(resourceType: string, executionContext: ExecutionContext<any>): any {\n try {\n return this.resourceRegistry.getResourceConfiguration(resourceType);\n } catch {\n this.logger.warn(`AggregationAuthorization: resource '${resourceType}' not found in registry`);\n throw this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.NOT_FOUND,\n context: { resourceType },\n },\n );\n }\n }\n\n /**\n * Collect the user's roles RELEVANT to a chart over a resource of `resourceScope`,\n * each paired with the scope it was granted in so the caller can expand it through\n * the correct (app vs org) role hierarchy.\n *\n * Relevance (the deliberate aggregation tightening): application-scope roles always\n * count; organization-scope roles count only for the ACTIVE organization; user-self\n * roles count only for the active user. A role granted in some OTHER org must never\n * authorize a chart scoped to the active org.\n */\n private collectRelevantUserRoles(\n resourceScope: ResourcePrimaryScope,\n executionContext: ExecutionContext<any>,\n ): Array<{ role: string; scope: ResourcePrimaryScope }> {\n const roleInfos = executionContext.initiatorRoles;\n if (!roleInfos || !Array.isArray(roleInfos)) return [];\n\n const activeOrganizationId = executionContext.organizationId;\n const activeUserId = executionContext.userId;\n const relevant: Array<{ role: string; scope: ResourcePrimaryScope }> = [];\n\n for (const ri of roleInfos) {\n if (!ri.roles || !Array.isArray(ri.roles)) {\n continue;\n }\n\n // ORGANIZATION-WIDE GRANTS ONLY. Aggregation asks a scope-level question (\"may this caller\n // aggregate over this resource?\"), and a unit-scoped role answers a strictly narrower one.\n // Admitting it here would let a single unit's grant authorize a tenant-wide rollup — and an\n // aggregate leaks the rows it summarises, so this is a read-boundary escalation.\n if (!isOrganizationWideRoleInfo(ri)) {\n continue;\n }\n\n const isRelevant =\n ri.relatedPrimaryScope === ResourcePrimaryScope.APPLICATION\n || (\n resourceScope === ResourcePrimaryScope.ORGANIZATIONS\n && ri.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS\n && ri.relatedResourceId === activeOrganizationId\n )\n || (\n resourceScope === ResourcePrimaryScope.USER_SELF\n && ri.relatedPrimaryScope === ResourcePrimaryScope.USER_SELF\n && ri.relatedResourceId === activeUserId\n );\n\n if (!isRelevant) {\n continue;\n }\n\n for (const role of ri.roles) {\n relevant.push({ role, scope: ri.relatedPrimaryScope });\n }\n }\n\n return relevant;\n }\n\n private assertContextFilterDoesNotOverrideScopeLock(params: {\n resourceType: string;\n executionContext: ExecutionContext<any>;\n field: string;\n operator: ComparisonOperator;\n coercedValue: unknown;\n filter: Record<string, unknown>;\n scopeLocks: ScopeLockDescriptor[];\n }): void {\n const scopeLock = params.scopeLocks.find((lock) => lock.field === params.field);\n if (!scopeLock) {\n return;\n }\n\n if (params.operator !== ComparisonOperator.EQ || params.coercedValue !== scopeLock.value) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n params.executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_CONFLICT,\n context: {\n // diagnostic (log-only)\n resourceType: params.resourceType,\n field: params.field,\n },\n },\n );\n }\n\n const existingValue = params.filter[params.field];\n if (existingValue !== scopeLock.value) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n params.executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_CONFLICT,\n context: {\n // diagnostic (log-only)\n resourceType: params.resourceType,\n field: params.field,\n },\n },\n );\n }\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"aggregation-authorization.backend.service.js","sourceRoot":"","sources":["../../../../../../src/databases/services/aggregation/aggregation-authorization.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/** ──────────────────────────────────────────────────────────────\n * AggregationAuthorizationBackendService\n *\n * Handles authorization for aggregation queries:\n * 1. LIST role check — user must have LIST permission on main resource\n * 2. Scope filter injection — ORGANIZATIONS, USER_SELF, APPLICATION\n * 3. Context filter resolution — parentResource, urlParam, currentUser, currentOrganization\n * 4. Optional chart-level role narrowing\n *\n * Ref: Authorization model → L996-1024\n * Ref: Scope-based injection → L1004-1007\n * Ref: Context filter examples → L1053-1074\n * Ref: Type coercion → L1074\n * ────────────────────────────────────────────────────────────── */\n\nimport { injectable, inject } from 'inversify';\nimport type { z } from 'zod';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport type { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport type { AuthorizationsBackendService } from '~wildo-backend-lib/security/authorizations/services/authorizations.backend.service';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport {\n ErrorType,\n ErrorCustomMessageReference,\n CoreResourceOperation,\n ResourcePrimaryScope,\n ComparisonOperator,\n ContextFilterSource,\n isOrganizationWideRoleInfo,\n requiredRolesDeclarePublicAccess,\n} from '@wildo-ai/saas-models';\nimport type { Roles, ResourceType } from '@wildo-ai/saas-models';\nimport {\n isRetentionGovernedResource,\n isRetentionHideSuppressedForReadOnlyPipeline,\n withRetentionHideApplied,\n type RetentionGovernanceSignal,\n} from '~wildo-backend-lib/compliance/privacy/retention-hide-predicate.backend';\nimport { getZodObjectShape, unwrapSchema, getZodType } from '@wildo-ai/zod-decorators';\nimport type { AggregationQuery, ContextFilter } from '@wildo-ai/saas-models';\nimport type { ResourceFilter } from '~wildo-backend-lib/databases/models/filter.backend.schemas';\n\n/** Map ComparisonOperator to MongoDB filter operators */\nconst OPERATOR_TO_MONGO: Record<string, string> = {\n [ComparisonOperator.EQ]: '$eq',\n [ComparisonOperator.NE]: '$ne',\n [ComparisonOperator.GT]: '$gt',\n [ComparisonOperator.GTE]: '$gte',\n [ComparisonOperator.LT]: '$lt',\n [ComparisonOperator.LTE]: '$lte',\n};\n\n/** Input required by the authorization service */\nexport interface AggregationAuthorizationInput {\n query: AggregationQuery;\n executionContext: ExecutionContext<any>;\n /** Optional chart-level role restriction (narrows LIST roles) */\n chartRoles?: string[];\n /** URL param values (for context filter resolution) */\n urlParams?: Record<string, string>;\n /** Parent resource context (for context filter resolution) */\n parentResource?: Record<string, unknown>;\n}\n\n/** Output from authorization — the augmented filter to merge into the aggregation */\nexport interface AggregationAuthorizationResult {\n /** Combined filter (static filters + scope filters + context filters) */\n resolvedFilter: ResourceFilter;\n}\n\ninterface ScopeLockDescriptor {\n field: 'organizationId' | 'userId';\n value: string;\n}\n\n@injectable()\nexport class AggregationAuthorizationBackendService {\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.ResourceRegistryService) private readonly resourceRegistry: ResourcesRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.AuthorizationsService) private readonly authorizationsService: AuthorizationsBackendService,\n ) {}\n\n /**\n * Authorize an aggregation query:\n * 1. Check user has LIST role on mainResourceType\n * 2. Inject scope filters based on ResourcePrimaryScope\n * 3. Resolve context filters\n * 4. Merge everything into a single filter object\n */\n authorize(input: AggregationAuthorizationInput): AggregationAuthorizationResult {\n const { query, executionContext, chartRoles, urlParams, parentResource } = input;\n\n const resourceConfig = this.getResourceConfigurationOrThrow(query.mainResourceType, executionContext);\n\n // 1. Start with static filters from the query\n const filter: Record<string, unknown> = { ...(query.filters || {}) };\n\n // 2. Inject scope-based filters before the role check so missing/unknown scope\n // fails with the real authorization reason instead of a generic role denial.\n const scopeLocks = this.injectScopeFilters(resourceConfig.resourcePrimaryScope as ResourcePrimaryScope, query.mainResourceType, executionContext, filter);\n\n // 3. LIST role check against the active application/org/user scope.\n this.checkListAccess(query.mainResourceType, resourceConfig, executionContext, chartRoles);\n\n // 4. Resolve context filters\n if (query.contextFilters && query.contextFilters.length > 0) {\n this.resolveContextFilters(\n query.contextFilters,\n query.mainResourceType,\n executionContext,\n urlParams || {},\n parentResource || {},\n filter,\n scopeLocks,\n );\n }\n\n // 5. Retention hide (gate G-AGG). Applied LAST so it cannot be overwritten by a static/context\n // filter resolved above, and inside `authorize` so it covers BOTH the main resource and every\n // joined resource (each join is authorized through this same method).\n return {\n resolvedFilter: this.applyRetentionHideToAggregationFilter(\n resourceConfig,\n filter,\n executionContext,\n ) as ResourceFilter,\n };\n }\n\n /**\n * Hide impersonalized-and-retained rows from an aggregation (gate **G-AGG**).\n *\n * The charts/analytics path builds its own `$match` from the authorization result and NEVER passes\n * through `buildContextualFilter`, so without this a RETAINED row still contributes to every chart,\n * KPI tile and export — leaking, in aggregate form, records that are individually unreadable. A\n * count or a sum over a hidden row is still disclosure.\n *\n * THE single authority for the aggregation side, deliberately public: the query service reuses it\n * for the `skipAuthorization` bypass branch, so skipping AUTHORIZATION can never mean skipping\n * RETENTION (mirrors the repository chokepoint, where the hide is applied before the\n * `excludeContextualFilter` early-return for exactly this reason).\n *\n * FAIL-CLOSED: assigned at the TOP LEVEL, overwriting any caller-supplied `retentionStatus` — a\n * chart's static `filters` are author-controlled and must not be able to re-select retained rows.\n *\n * Suppressed ONLY by the audited see-through EC flag (M5b). No read-op scoping is needed here, and\n * its absence is structural rather than incidental: an aggregation compiles to a read-only pipeline\n * and has no write path, so a see-through EC reaching this code can never mutate a retained row.\n */\n public applyRetentionHideToAggregationFilter(\n resourceConfiguration: RetentionGovernanceSignal | undefined,\n filter: Record<string, unknown>,\n executionContext?: ExecutionContext<any>,\n ): Record<string, unknown> {\n if (!isRetentionGovernedResource(resourceConfiguration)) {\n return filter;\n }\n if (isRetentionHideSuppressedForReadOnlyPipeline(executionContext)) {\n // Audited compliance reveal — the caller has already passed the `seeRetained` fail-closed gate\n // and supplied a human + reason, so retained rows are legitimately in scope for this aggregate.\n // Returning the filter UNTOUCHED is what lets an auditor's own `retentionStatus` predicate survive.\n return filter;\n }\n return withRetentionHideApplied(filter);\n }\n\n // ── LIST Role Check ────────────────────────────────────────\n\n private checkListAccess(\n resourceType: string,\n config: any,\n executionContext: ExecutionContext<any>,\n chartRoles?: string[],\n ): void {\n // Find the LIST operation's roles\n const listRoles = this.getListOperationRoles(config);\n if (!listRoles) {\n // No LIST operation configured → deny\n this.logger.warn(`AggregationAuthorization: no LIST operation for '${resourceType}'`);\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_ACCESS_DENIED,\n context: { resourceType },\n },\n );\n }\n\n // If chart restricts roles further, narrow the allowed set\n const effectiveRoles = chartRoles\n ? listRoles.filter(r => chartRoles.includes(r))\n : listRoles;\n\n if (effectiveRoles.length === 0) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_ACCESS_DENIED,\n },\n );\n }\n\n /*\n * The THIRD role gate that must honour `APP_PUBLIC`, and the one furthest from the authorizer.\n *\n * A chart over a resource whose LIST declares `APP_PUBLIC` asks the same question\n * `validateOperationRoles` asks, by a different mechanism — so before this line it produced the\n * same wrong answer: the LIST itself answered 200 to an authenticated caller (once the\n * authorizer's gate was fixed) while a chart built on that very LIST kept refusing them.\n *\n * Read from `effectiveRoles`, not `listRoles`, so a chart that narrows deliberately still\n * narrows: a public LIST with `chartRoles: [ORG_ADMIN]` intersects to `[ORG_ADMIN]`, carries no\n * public sentinel, and is gated exactly as its author declared. Only a required set that STILL\n * declares public access after the narrowing admits everyone.\n *\n * The scope-filter injection below is untouched — this relaxes who may ASK, never which rows the\n * aggregation reads.\n */\n if (requiredRolesDeclarePublicAccess(effectiveRoles)) {\n return;\n }\n\n // Check if the user satisfies at least one effective role — honouring the\n // ROLE HIERARCHY, exactly like the canonical `validateOperationRoles`. A raw\n // `includes` check (the previous behaviour) wrongly denied an ORG_ADMIN a chart\n // gated on ORG_MEMBER, because admin's *inherited* membership was never\n // expanded. We keep the scope-filtering (only the active org's / user's roles\n // count — a deliberate aggregation tightening) and expand each scope-filtered\n // role through ITS scope's hierarchy via the live (custom-aware) role config.\n const resourceScope = config.resourcePrimaryScope as ResourcePrimaryScope;\n const relevantRoles = this.collectRelevantUserRoles(resourceScope, executionContext);\n const userRoles = relevantRoles.map(entry => entry.role);\n\n const satisfiedRoles = new Set<string>();\n for (const { role, scope } of relevantRoles) {\n // Always include the role itself (preserves the prior direct-match behaviour\n // even for a required role that is absent from the hierarchy config), then\n // add every ancestor it inherits.\n satisfiedRoles.add(role);\n for (const inherited of this.authorizationsService.getRoleHierarchy(role as Roles, scope)) {\n satisfiedRoles.add(inherited);\n }\n }\n const hasAccess = effectiveRoles.some(role => satisfiedRoles.has(role));\n\n if (!hasAccess) {\n this.logger.warn(`AggregationAuthorization: user lacks LIST access on '${resourceType}'. User roles: [${userRoles.join(', ')}], required: [${effectiveRoles.join(', ')}]`);\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_ACCESS_DENIED,\n context: { resourceType },\n },\n );\n }\n }\n\n // ── Scope Filter Injection ─────────────────────────────────\n\n private injectScopeFilters(\n scope: ResourcePrimaryScope,\n resourceType: string,\n executionContext: ExecutionContext<any>,\n filter: Record<string, unknown>,\n ): ScopeLockDescriptor[] {\n switch (scope) {\n case ResourcePrimaryScope.ORGANIZATIONS: {\n const orgId = executionContext.organizationId;\n if (!orgId) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_UNRESOLVED,\n context: {\n // diagnostic (log-only)\n resourceType,\n },\n },\n );\n }\n // Always enforce scope — override any pre-existing value to prevent bypass\n filter['organizationId'] = orgId;\n return [{ field: 'organizationId', value: orgId }];\n }\n case ResourcePrimaryScope.USER_SELF: {\n const userId = executionContext.userId;\n if (!userId) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_UNRESOLVED,\n context: {\n // diagnostic (log-only)\n resourceType,\n },\n },\n );\n }\n filter['userId'] = userId;\n return [{ field: 'userId', value: userId }];\n }\n case ResourcePrimaryScope.APPLICATION:\n // No scope filter needed — admin-level\n return [];\n default:\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_UNRESOLVED,\n context: {\n // diagnostic (log-only)\n resourceType,\n scope,\n },\n },\n );\n }\n }\n\n // ── Context Filter Resolution ──────────────────────────────\n\n private resolveContextFilters(\n contextFilters: ContextFilter[],\n resourceType: string,\n executionContext: ExecutionContext<any>,\n urlParams: Record<string, string>,\n parentResource: Record<string, unknown>,\n filter: Record<string, unknown>,\n scopeLocks: ScopeLockDescriptor[],\n ): void {\n const schema = this.resolveMainSchema(resourceType);\n\n for (const cf of contextFilters) {\n const resolvedValue = this.resolveContextFilterValue(cf, executionContext, urlParams, parentResource);\n if (resolvedValue === undefined || resolvedValue === null) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_UNRESOLVED,\n context: {\n // diagnostic (log-only)\n resourceType,\n field: cf.field,\n source: cf.source,\n sourceField: cf.sourceField,\n },\n },\n );\n }\n\n // Coerce value to the target field's type\n const coercedValue = schema\n ? this.coerceToFieldType(resolvedValue, cf.field, schema)\n : resolvedValue;\n\n // Apply to filter with operator\n const operator = cf.operator || ComparisonOperator.EQ;\n\n this.assertContextFilterDoesNotOverrideScopeLock({\n resourceType,\n executionContext,\n field: cf.field,\n operator,\n coercedValue,\n filter,\n scopeLocks,\n });\n\n if (operator === ComparisonOperator.EQ) {\n // Simple equality — direct assignment\n filter[cf.field] = coercedValue;\n } else {\n // Operator-based — use MongoDB-style nested object\n const mongoOp = OPERATOR_TO_MONGO[operator];\n if (mongoOp) {\n const existing = filter[cf.field];\n if (existing && typeof existing === 'object' && !Array.isArray(existing)) {\n // Merge with existing operator filters on same field (e.g., gte + lte for date range)\n (existing as Record<string, unknown>)[mongoOp] = coercedValue;\n } else {\n filter[cf.field] = { [mongoOp]: coercedValue };\n }\n }\n }\n }\n }\n\n private resolveContextFilterValue(\n cf: ContextFilter,\n executionContext: ExecutionContext<any>,\n urlParams: Record<string, string>,\n parentResource: Record<string, unknown>,\n ): unknown {\n switch (cf.source) {\n case ContextFilterSource.CURRENT_USER:\n return cf.sourceField ? (executionContext.initiatorIds as any)?.[cf.sourceField] : executionContext.userId;\n\n case ContextFilterSource.CURRENT_ORGANIZATION:\n return executionContext.organizationId;\n\n case ContextFilterSource.URL_PARAM:\n return urlParams[cf.sourceField ?? cf.field];\n\n case ContextFilterSource.PARENT_RESOURCE:\n return parentResource[cf.sourceField ?? cf.field];\n\n default:\n this.logger.warn(`AggregationAuthorization: unknown context filter source '${cf.source}'`);\n return undefined;\n }\n }\n\n // ── Type coercion ──────────────────────────────────────────\n\n /**\n * Coerce a resolved value (typically a string from URL params) to the\n * target field's Zod type: string → as-is, date → Date, number → Number.\n */\n private coerceToFieldType(value: unknown, fieldName: string, schema: z.ZodTypeAny): unknown {\n const shape = getZodObjectShape(schema);\n if (!shape || Object.keys(shape).length === 0) return value;\n\n const fieldSchema = shape[fieldName];\n if (!fieldSchema) return value;\n\n // Unwrap optional/nullable to find the core type\n const coreType = unwrapSchema(fieldSchema);\n const typeName = getZodType(coreType);\n\n if (typeof value !== 'string') return value;\n\n switch (typeName) {\n case 'date': {\n const date = new Date(value);\n if (isNaN(date.getTime())) {\n this.logger.warn(`AggregationAuthorization: invalid date value '${value}' for field '${fieldName}'`);\n return value; // Fall back to string — let MongoDB handle it\n }\n return date;\n }\n case 'number': {\n const num = Number(value);\n if (isNaN(num)) {\n this.logger.warn(`AggregationAuthorization: invalid number value '${value}' for field '${fieldName}'`);\n return value;\n }\n return num;\n }\n case 'boolean':\n return value === 'true' || value === '1';\n default:\n return value;\n }\n }\n\n // ── Schema Resolution ──────────────────────────────────────\n\n private resolveMainSchema(resourceType: string): z.ZodTypeAny | undefined {\n try {\n const config = this.resourceRegistry.getResourceConfiguration(resourceType);\n return config.mainSchema as z.ZodTypeAny;\n } catch {\n return undefined;\n }\n }\n\n // ── Helpers ────────────────────────────────────────────────\n\n /**\n * Extract the allowed role strings from the default LIST operation on a resource config.\n *\n * Resource configs expose `operations` as an array of\n * `{ operationIdentifier: string; isOperationDefault: boolean; roles?: (string|object)[] }`.\n * We use `any` here because the resource-registry returns a dynamic config object\n * whose internal shape depends on the app's resource definitions. The function\n * is defensive: it gracefully returns `undefined` if the structure doesn't match.\n */\n private getListOperationRoles(config: any): string[] | undefined {\n // operations is an array — use .find() to locate the LIST default operation\n if (!config.operations || !Array.isArray(config.operations)) return undefined;\n\n const listOp = config.operations.find(\n (op: any) => op.operationIdentifier === CoreResourceOperation.LIST && op.isOperationDefault === true,\n );\n if (!listOp) return undefined;\n\n // roles is directly on the operation object\n if (listOp.roles && Array.isArray(listOp.roles)) {\n return listOp.roles.map((r: any) => typeof r === 'string' ? r : String(r));\n }\n\n return undefined;\n }\n\n private getResourceConfigurationOrThrow(resourceType: string, executionContext: ExecutionContext<any>): any {\n try {\n return this.resourceRegistry.getResourceConfiguration(resourceType);\n } catch {\n this.logger.warn(`AggregationAuthorization: resource '${resourceType}' not found in registry`);\n throw this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.NOT_FOUND,\n context: { resourceType },\n },\n );\n }\n }\n\n /**\n * Collect the user's roles RELEVANT to a chart over a resource of `resourceScope`,\n * each paired with the scope it was granted in so the caller can expand it through\n * the correct (app vs org) role hierarchy.\n *\n * Relevance (the deliberate aggregation tightening): application-scope roles always\n * count; organization-scope roles count only for the ACTIVE organization; user-self\n * roles count only for the active user. A role granted in some OTHER org must never\n * authorize a chart scoped to the active org.\n */\n private collectRelevantUserRoles(\n resourceScope: ResourcePrimaryScope,\n executionContext: ExecutionContext<any>,\n ): Array<{ role: string; scope: ResourcePrimaryScope }> {\n const roleInfos = executionContext.initiatorRoles;\n if (!roleInfos || !Array.isArray(roleInfos)) return [];\n\n const activeOrganizationId = executionContext.organizationId;\n const activeUserId = executionContext.userId;\n const relevant: Array<{ role: string; scope: ResourcePrimaryScope }> = [];\n\n for (const ri of roleInfos) {\n if (!ri.roles || !Array.isArray(ri.roles)) {\n continue;\n }\n\n // ORGANIZATION-WIDE GRANTS ONLY. Aggregation asks a scope-level question (\"may this caller\n // aggregate over this resource?\"), and a unit-scoped role answers a strictly narrower one.\n // Admitting it here would let a single unit's grant authorize a tenant-wide rollup — and an\n // aggregate leaks the rows it summarises, so this is a read-boundary escalation.\n if (!isOrganizationWideRoleInfo(ri)) {\n continue;\n }\n\n const isRelevant =\n ri.relatedPrimaryScope === ResourcePrimaryScope.APPLICATION\n || (\n resourceScope === ResourcePrimaryScope.ORGANIZATIONS\n && ri.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS\n && ri.relatedResourceId === activeOrganizationId\n )\n || (\n resourceScope === ResourcePrimaryScope.USER_SELF\n && ri.relatedPrimaryScope === ResourcePrimaryScope.USER_SELF\n && ri.relatedResourceId === activeUserId\n );\n\n if (!isRelevant) {\n continue;\n }\n\n for (const role of ri.roles) {\n relevant.push({ role, scope: ri.relatedPrimaryScope });\n }\n }\n\n return relevant;\n }\n\n private assertContextFilterDoesNotOverrideScopeLock(params: {\n resourceType: string;\n executionContext: ExecutionContext<any>;\n field: string;\n operator: ComparisonOperator;\n coercedValue: unknown;\n filter: Record<string, unknown>;\n scopeLocks: ScopeLockDescriptor[];\n }): void {\n const scopeLock = params.scopeLocks.find((lock) => lock.field === params.field);\n if (!scopeLock) {\n return;\n }\n\n if (params.operator !== ComparisonOperator.EQ || params.coercedValue !== scopeLock.value) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n params.executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_CONFLICT,\n context: {\n // diagnostic (log-only)\n resourceType: params.resourceType,\n field: params.field,\n },\n },\n );\n }\n\n const existingValue = params.filter[params.field];\n if (existingValue !== scopeLock.value) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n params.executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.AGGREGATION_SCOPE_CONFLICT,\n context: {\n // diagnostic (log-only)\n resourceType: params.resourceType,\n field: params.field,\n },\n },\n );\n }\n }\n\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql-schema-plan-diff.backend.d.ts","sourceRoot":"","sources":["../../../../../src/databases/services/postgresql-schema-plan-diff.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAA6C,MAAM,+EAA+E,CAAC;AAEnK;;;;GAIG;AACH,oBAAY,oBAAoB;IAC9B,SAAS,cAAc;IACvB,8FAA8F;IAC9F,UAAU,eAAe;IACzB,UAAU,eAAe;IACzB,qGAAqG;IACrG,WAAW,gBAAgB;IAC3B;;;OAGG;IACH,kBAAkB,uBAAuB;IACzC;;;;OAIG;IACH,kBAAkB,uBAAuB;IACzC;;;;;;;;;;;;;;;;OAgBG;IACH,eAAe,oBAAoB;IACnC;;;OAGG;IACH,+BAA+B,oCAAoC;IACnE,8EAA8E;IAC9E,iCAAiC,sCAAsC;IACvE,wGAAwG;IACxG,gBAAgB,qBAAqB;IACrC,iBAAiB,sBAAsB;IACvC,SAAS,cAAc;IACvB,UAAU,eAAe;IACzB;;;;;;;;OAQG;IACH,qBAAqB,0BAA0B;IAC/C,+FAA+F;IAC/F,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,iBAAiB,sBAAsB;CACxC;AAED;;;;;;;;;;;GAWG;AACH,oBAAY,oBAAoB;IAC9B,IAAI,SAAS;IACb,WAAW,gBAAgB;IAC3B,uBAAuB,4BAA4B;CACpD;AACD;;;;;;;;;GASG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,oBAAoB,CAAC;IACjC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"postgresql-schema-plan-diff.backend.d.ts","sourceRoot":"","sources":["../../../../../src/databases/services/postgresql-schema-plan-diff.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAA6C,MAAM,+EAA+E,CAAC;AAEnK;;;;GAIG;AACH,oBAAY,oBAAoB;IAC9B,SAAS,cAAc;IACvB,8FAA8F;IAC9F,UAAU,eAAe;IACzB,UAAU,eAAe;IACzB,qGAAqG;IACrG,WAAW,gBAAgB;IAC3B;;;OAGG;IACH,kBAAkB,uBAAuB;IACzC;;;;OAIG;IACH,kBAAkB,uBAAuB;IACzC;;;;;;;;;;;;;;;;OAgBG;IACH,eAAe,oBAAoB;IACnC;;;OAGG;IACH,+BAA+B,oCAAoC;IACnE,8EAA8E;IAC9E,iCAAiC,sCAAsC;IACvE,wGAAwG;IACxG,gBAAgB,qBAAqB;IACrC,iBAAiB,sBAAsB;IACvC,SAAS,cAAc;IACvB,UAAU,eAAe;IACzB;;;;;;;;OAQG;IACH,qBAAqB,0BAA0B;IAC/C,+FAA+F;IAC/F,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,iBAAiB,sBAAsB;CACxC;AAED;;;;;;;;;;;GAWG;AACH,oBAAY,oBAAoB;IAC9B,IAAI,SAAS;IACb,WAAW,gBAAgB;IAC3B,uBAAuB,4BAA4B;CACpD;AACD;;;;;;;;;GASG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,oBAAoB,CAAC;IACjC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;CAChB;AA8PD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,GAAG,gBAAgB,EAAE,CA+BlH"}
|
|
@@ -215,6 +215,54 @@ function diffTable(tableName, previous, next) {
|
|
|
215
215
|
detail: `new column "${name}" ${after.sqlType}.`,
|
|
216
216
|
});
|
|
217
217
|
}
|
|
218
|
+
/*
|
|
219
|
+
* A column ARRIVES with the properties it was declared with (#505).
|
|
220
|
+
*
|
|
221
|
+
* Everything below this point compares `before` against `after`, so it is reachable only for a
|
|
222
|
+
* column that already existed — and a NEW column `continue`s past all of it. That silently made
|
|
223
|
+
* `.isDBIndexed()` a no-op on any field added to an EXISTING table: the differ emitted
|
|
224
|
+
* `ADD_COLUMN` alone, so the database permanently lacked an index the schema declared.
|
|
225
|
+
*
|
|
226
|
+
* The initial-schema path was never affected, which is why this survived: `CREATE TABLE`
|
|
227
|
+
* renders every declared index, so the planner plainly knows how. What it did not do was carry
|
|
228
|
+
* the declaration through the DELTA path.
|
|
229
|
+
*
|
|
230
|
+
* Worse than the missing index was the silence around it. `db diff --check` compares the plan
|
|
231
|
+
* to the lockfile, and BOTH record `hasIndex: true` — the lockfile is written from the same
|
|
232
|
+
* plan — so the check was wrong in the same direction as the thing it checks and reported IN
|
|
233
|
+
* SYNC over a database missing the index. Measured 2026-09-08 on two `oauthClients` tables: the
|
|
234
|
+
* application generator emitted 4 statements, the platform generator 8, from one schema.
|
|
235
|
+
*
|
|
236
|
+
* The primary-key case is included on the same reasoning rather than on symmetry: a new column
|
|
237
|
+
* declared `isPrimaryKey` on a table that has none is additive and renderable, and skipping it
|
|
238
|
+
* left exactly the same gap one property over.
|
|
239
|
+
*/
|
|
240
|
+
if (after.hasIndex === true) {
|
|
241
|
+
changes.push({
|
|
242
|
+
changeType: SchemaPlanChangeType.ADD_INDEX,
|
|
243
|
+
risk: SchemaPlanChangeRisk.SAFE,
|
|
244
|
+
tableName,
|
|
245
|
+
subject: name,
|
|
246
|
+
detail: `plain index on the new column "${name}".`,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
if (after.isPrimaryKey === true) {
|
|
250
|
+
changes.push(previousHadPrimaryKey
|
|
251
|
+
? {
|
|
252
|
+
changeType: SchemaPlanChangeType.CHANGE_PRIMARY_KEY,
|
|
253
|
+
risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,
|
|
254
|
+
tableName,
|
|
255
|
+
subject: name,
|
|
256
|
+
detail: `the new column "${name}" is declared the primary key of a table that already has one — a constraint rebuild that touches every reference to this table; hand-author the plan.`,
|
|
257
|
+
}
|
|
258
|
+
: {
|
|
259
|
+
changeType: SchemaPlanChangeType.ADD_PRIMARY_KEY,
|
|
260
|
+
risk: SchemaPlanChangeRisk.SAFE,
|
|
261
|
+
tableName,
|
|
262
|
+
subject: name,
|
|
263
|
+
detail: `the new column "${name}" becomes the primary key of a table that had none. Additive, so nothing references the constraint being built — but it WILL fail on any existing row, since a column that has just arrived holds NULL in every one of them.`,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
218
266
|
continue;
|
|
219
267
|
}
|
|
220
268
|
if (!before || !after)
|