@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql-schema-plan-diff.backend.js","sourceRoot":"","sources":["../../../../../src/databases/services/postgresql-schema-plan-diff.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The schema-plan DIFFER — pure comparison of two lockfile states into a typed change set.\n *\n * ## What this is and is not\n *\n * `diffSchemaPlanLockfiles(previous, next)` answers ONE question: what physical changes separate\n * the accepted schema from the current one. It renders no SQL, touches no database, and decides no\n * policy beyond the RISK classification each change carries. Generation (Phase 2) consumes its\n * output; `wildo db diff` prints it; `--check` fails CI when it is non-empty.\n *\n * ## Why index changes are DROP+ADD pairs rather than a \"changed\" member\n *\n * Physically, every index-semantics change (nulls distinctness, a `skipRowsMissing` predicate, the\n * retention scope) IS a drop and a recreate — PostgreSQL cannot alter an index's predicate in\n * place. Modelling them as pairs keeps the vocabulary honest to what a migration must actually do,\n * and it falls out of identity: an index's IDENTITY here includes its semantics, so a semantics\n * change makes the old identity disappear and a new one appear. (This deviates from the plan's\n * first-draft vocabulary, which sketched a `CHANGE_UNIQUE_SEMANTICS` member — recorded in the plan's\n * decision log.)\n *\n * `CHANGE_COLUMN_TYPE` stays a single member because it is the one change that is genuinely an\n * in-place `ALTER … USING` with data flowing through the cast — a pair would misrepresent it as\n * data loss.\n *\n * ## The variantConfig moves\n *\n * A column that disappears while joining the variant-swept set has NOT been deleted — its values\n * move INTO the `variantConfig` jsonb blob (and mirrored for the way out). The bare physical diff\n * reads as ADD/DROP_COLUMN, and acting on that read silently loses the data inside the blob. The\n * swept set travels in the lockfile precisely so this classification is a set lookup here rather\n * than an unanswerable question at generation time.\n */\n\nimport type { SchemaPlanLockfile, SerializedColumnPlan, SerializedTablePlan } from '~wildo-backend-lib/databases/services/postgresql-schema-plan-lockfile.backend';\n\n/**\n * The closed change vocabulary. Every member is a physical statement about the schema; the enum is\n * where per-member meaning lives (repo rule: closed semantic vocabularies get one named runtime\n * source).\n */\nexport enum SchemaPlanChangeType {\n ADD_TABLE = 'ADD_TABLE',\n /** The whole table, and everything in it. Always {@link SchemaPlanChangeRisk.DESTRUCTIVE}. */\n DROP_TABLE = 'DROP_TABLE',\n ADD_COLUMN = 'ADD_COLUMN',\n /** A column with (potential) data. Always DESTRUCTIVE — the differ cannot see whether rows exist. */\n DROP_COLUMN = 'DROP_COLUMN',\n /**\n * In-place `ALTER … TYPE … USING`. REQUIRES_DATA_MIGRATION: the `USING` expression is where\n * truncation and coercion live, and no diff can author it — a human writes it in the draft.\n */\n CHANGE_COLUMN_TYPE = 'CHANGE_COLUMN_TYPE',\n /**\n * The column's PRIMARY-KEY role changed. Physically enormous (constraint rebuild, every FK that\n * references it); practically forbidden without a hand-authored plan, hence\n * REQUIRES_DATA_MIGRATION rather than a bare pair of index changes.\n */\n CHANGE_PRIMARY_KEY = 'CHANGE_PRIMARY_KEY',\n /**\n * The table had NO primary key at all, and a column now becomes it.\n *\n * Deliberately NOT {@link CHANGE_PRIMARY_KEY}: nothing can reference a constraint that does not\n * exist, so there is no rebuild, no dependent foreign key, and no other column losing the role.\n * The statement is fully derivable from the plan, so the generator RENDERS it.\n *\n * The distinction was measured on 2026-08-28. Three tables (`consumabletokens`, `jobexecutions`,\n * `jobpayloadstorage`) shipped with a bare `\"_id\" text` — the adapter-parity hole since fixed in\n * `zod-to-sql-hybrid-schema.planner.ts` — and the blanket refusal meant a whole migration had to\n * be hand-authored, including the unrelated `ADD_TABLE` travelling with it, for SQL the renderer\n * could have written. A refusal calibrated for the dangerous case was paid for by the safe one.\n *\n * SAFE by the vocabulary above: it loses nothing. It may still FAIL loudly on a table already\n * holding NULL or duplicate values in that column — the same trade {@link ADD_UNIQUE_INDEX}\n * makes, and precisely the state the missing constraint had been permitting.\n */\n ADD_PRIMARY_KEY = 'ADD_PRIMARY_KEY',\n /**\n * NOT a drop: the field's values move INTO the `variantConfig` jsonb blob. The generated draft\n * must inject each row's column value into the blob BEFORE the column goes away.\n */\n FIELD_MOVED_INTO_VARIANT_CONFIG = 'FIELD_MOVED_INTO_VARIANT_CONFIG',\n /** The mirror: values must be extracted from the blob into the new column. */\n FIELD_MOVED_OUT_OF_VARIANT_CONFIG = 'FIELD_MOVED_OUT_OF_VARIANT_CONFIG',\n /** May FAIL on existing duplicates — stated in the detail; still SAFE (fails loudly, loses nothing). */\n ADD_UNIQUE_INDEX = 'ADD_UNIQUE_INDEX',\n DROP_UNIQUE_INDEX = 'DROP_UNIQUE_INDEX',\n ADD_INDEX = 'ADD_INDEX',\n DROP_INDEX = 'DROP_INDEX',\n /**\n * The column's `DEFAULT` was added, removed, or changed.\n *\n * SAFE: `ALTER COLUMN … SET/DROP DEFAULT` is a catalog-only change that rewrites no rows and\n * cannot fail on existing data. It is deliberately NOT retro-active — existing rows keep whatever\n * they already hold, including the NULLs written before the default existed. A migration that\n * also wants to backfill those rows must say so itself; inferring an `UPDATE` from a default\n * change would silently rewrite data the differ cannot see.\n */\n CHANGE_COLUMN_DEFAULT = 'CHANGE_COLUMN_DEFAULT',\n /** Renders as a column comment + drives the retention sweep; physical enough to be tracked. */\n ADD_TTL_POLICY = 'ADD_TTL_POLICY',\n DROP_TTL_POLICY = 'DROP_TTL_POLICY',\n CHANGE_TTL_POLICY = 'CHANGE_TTL_POLICY',\n}\n\n/**\n * @wildo_source:part:start application.database.migration-change-risk facet:layer:backend facet:family:database facet:audience:app-developer\n *\n * What a change can COST, not how likely it is to fail.\n *\n * - SAFE: loses no data. May still fail loudly at apply time (a unique index over duplicates) —\n * loud failure is acceptable, silent loss is not, and the vocabulary encodes exactly that line.\n * - DESTRUCTIVE: removes data. The runner refuses these without the file-level acknowledgement\n * (`-- wildo:acknowledge-destructive`), per K5/Phase 3′.\n * - REQUIRES_DATA_MIGRATION: correct only if data MOVES — a human must author the movement in the\n * generated draft before first apply.\n */\nexport enum SchemaPlanChangeRisk {\n SAFE = 'SAFE',\n DESTRUCTIVE = 'DESTRUCTIVE',\n REQUIRES_DATA_MIGRATION = 'REQUIRES_DATA_MIGRATION',\n}\n/**\n * @wildo_source:part:end application.database.migration-change-risk\n *\n * These three words are what `wildo db diff` prints beside every change and what the generated\n * `migration.sql` writes above every statement, so an application developer reads them constantly.\n * They also decide what tooling will do UNATTENDED: `wildo local dev` reconciles an all-SAFE change\n * set on its own, and stops for anything else — because a DESTRUCTIVE statement removes rows and a\n * REQUIRES_DATA_MIGRATION statement is a generated SKELETON whose correctness is a judgement about\n * data no differ can see.\n */\n\nexport interface SchemaPlanChange {\n changeType: SchemaPlanChangeType;\n risk: SchemaPlanChangeRisk;\n tableName: string;\n /** The column, the index's column list, or the TTL field — what the change is ABOUT. */\n subject: string;\n /** One human sentence with the before→after facts a reviewer needs. */\n detail: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Index identity\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface UniqueIndexIdentity {\n columns: readonly string[];\n nullsAreDistinct: boolean;\n skipRowsMissing: readonly string[];\n retentionScoped: boolean;\n}\n\n/**\n * Everything that changes what the index MEANS is part of its identity — which is what turns a\n * semantics change into a drop+add pair (see the header). The retention scope is table-level in the\n * plan but per-index in the physical schema (every unique index carries the predicate), so it joins\n * each identity here and a table-level flip correctly fans out into one pair per unique index.\n */\nfunction uniqueIndexIdentityKey(identity: UniqueIndexIdentity): string {\n return [\n identity.columns.join(','),\n `nullsDistinct:${identity.nullsAreDistinct}`,\n `skip:${[...identity.skipRowsMissing].sort().join(',')}`,\n `retentionScoped:${identity.retentionScoped}`,\n ].join('|');\n}\n\nfunction collectUniqueIndexIdentities(table: SerializedTablePlan): Map<string, UniqueIndexIdentity> {\n const retentionScoped = table.uniquenessExcludesErasureRetainedRows === true;\n const identities = new Map<string, UniqueIndexIdentity>();\n for (const [name, column] of Object.entries(table.columns)) {\n if (!column.unique) continue;\n const identity: UniqueIndexIdentity = {\n columns: [name],\n nullsAreDistinct: column.unique.nullsAreDistinct,\n skipRowsMissing: [],\n retentionScoped,\n };\n identities.set(uniqueIndexIdentityKey(identity), identity);\n }\n for (const constraint of table.compositeUniqueConstraints ?? []) {\n const identity: UniqueIndexIdentity = {\n columns: constraint.fields,\n // Composite constraints always render NULLS NOT DISTINCT (the ORGANIZATION_UNITS lesson).\n nullsAreDistinct: false,\n skipRowsMissing: constraint.skipRowsMissing ?? [],\n retentionScoped,\n };\n identities.set(uniqueIndexIdentityKey(identity), identity);\n }\n return identities;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// The diff\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction diffTable(tableName: string, previous: SerializedTablePlan, next: SerializedTablePlan): SchemaPlanChange[] {\n const changes: SchemaPlanChange[] = [];\n const previousSwept = new Set(previous.variantSweptFields ?? []);\n /**\n * Asked of the WHOLE table, not of the column, because that is what separates an ADD from a MOVE.\n * A column gaining the role while some other column held it is a rebuild every reference leans\n * on; a column gaining it while the table had none is additive, and the two must not share a\n * change type — see {@link SchemaPlanChangeType.ADD_PRIMARY_KEY}.\n */\n const previousHadPrimaryKey = Object.values(previous.columns).some((column) => column.isPrimaryKey === true);\n const nextSwept = new Set(next.variantSweptFields ?? []);\n const columnNames = [...new Set([...Object.keys(previous.columns), ...Object.keys(next.columns)])].sort();\n\n for (const name of columnNames) {\n const before: SerializedColumnPlan | undefined = previous.columns[name];\n const after: SerializedColumnPlan | undefined = next.columns[name];\n\n if (before && !after) {\n if (nextSwept.has(name)) {\n changes.push({\n changeType: SchemaPlanChangeType.FIELD_MOVED_INTO_VARIANT_CONFIG,\n risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,\n tableName,\n subject: name,\n detail: `\"${name}\" is now variant-only: its values must be INJECTED into the \"variantConfig\" jsonb blob before the column is dropped — a bare drop silently loses them.`,\n });\n } else {\n changes.push({\n changeType: SchemaPlanChangeType.DROP_COLUMN,\n risk: SchemaPlanChangeRisk.DESTRUCTIVE,\n tableName,\n subject: name,\n detail: `column \"${name}\" (${before.sqlType}) is no longer planned; dropping it destroys whatever rows hold there.`,\n });\n }\n continue;\n }\n if (!before && after) {\n if (previousSwept.has(name)) {\n changes.push({\n changeType: SchemaPlanChangeType.FIELD_MOVED_OUT_OF_VARIANT_CONFIG,\n risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,\n tableName,\n subject: name,\n detail: `\"${name}\" was variant-only: existing values live inside the \"variantConfig\" jsonb blob and must be EXTRACTED into the new \"${after.sqlType}\" column, or every pre-existing row reads NULL.`,\n });\n } else {\n changes.push({\n changeType: SchemaPlanChangeType.ADD_COLUMN,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: name,\n detail: `new column \"${name}\" ${after.sqlType}.`,\n });\n }\n continue;\n }\n if (!before || !after) continue;\n\n if (before.sqlType !== after.sqlType) {\n changes.push({\n changeType: SchemaPlanChangeType.CHANGE_COLUMN_TYPE,\n risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,\n tableName,\n subject: name,\n detail: `\"${name}\" ${before.sqlType} → ${after.sqlType}; the USING expression decides what existing values become, and only a human can decide it.`,\n });\n }\n if ((before.defaultClause ?? '') !== (after.defaultClause ?? '')) {\n const describe = (clause: string | undefined): string =>\n clause ? clause.replace(/^ default /, '') : 'none';\n changes.push({\n changeType: SchemaPlanChangeType.CHANGE_COLUMN_DEFAULT,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: name,\n detail:\n `\"${name}\" default ${describe(before.defaultClause)} → ${describe(after.defaultClause)}; `\n + 'applies to NEW rows only — existing rows keep the values they already hold.',\n });\n }\n if ((before.isPrimaryKey === true) !== (after.isPrimaryKey === true)) {\n changes.push(after.isPrimaryKey === true && !previousHadPrimaryKey\n ? {\n changeType: SchemaPlanChangeType.ADD_PRIMARY_KEY,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: name,\n detail: `\"${name}\" becomes the primary key of a table that had none — additive, so nothing references the constraint being built. May FAIL on rows already holding a NULL or duplicate \"${name}\", which is the state its absence permitted.`,\n }\n : {\n changeType: SchemaPlanChangeType.CHANGE_PRIMARY_KEY,\n risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,\n tableName,\n subject: name,\n detail: `\"${name}\" ${after.isPrimaryKey ? 'becomes' : 'stops being'} the primary key — a constraint rebuild that touches every reference to this table; hand-author the plan.`,\n });\n }\n if ((before.hasIndex === true) !== (after.hasIndex === true)) {\n changes.push(after.hasIndex\n ? { changeType: SchemaPlanChangeType.ADD_INDEX, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: name, detail: `plain index on \"${name}\".` }\n : { changeType: SchemaPlanChangeType.DROP_INDEX, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: name, detail: `plain index on \"${name}\" is no longer planned.` });\n }\n }\n\n // Unique indexes — identity-keyed, so a semantics change appears as its own drop+add pair.\n const previousUnique = collectUniqueIndexIdentities(previous);\n const nextUnique = collectUniqueIndexIdentities(next);\n for (const [key, identity] of [...previousUnique].sort(([a], [b]) => a.localeCompare(b))) {\n if (nextUnique.has(key)) continue;\n changes.push({\n changeType: SchemaPlanChangeType.DROP_UNIQUE_INDEX,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: identity.columns.join(', '),\n detail: `unique index on (${identity.columns.join(', ')}) [nullsDistinct=${identity.nullsAreDistinct}, skip=[${identity.skipRowsMissing.join(', ')}], retentionScoped=${identity.retentionScoped}] is gone or changed semantics.`,\n });\n }\n for (const [key, identity] of [...nextUnique].sort(([a], [b]) => a.localeCompare(b))) {\n if (previousUnique.has(key)) continue;\n changes.push({\n changeType: SchemaPlanChangeType.ADD_UNIQUE_INDEX,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: identity.columns.join(', '),\n detail: `unique index on (${identity.columns.join(', ')}) [nullsDistinct=${identity.nullsAreDistinct}, skip=[${identity.skipRowsMissing.join(', ')}], retentionScoped=${identity.retentionScoped}]; applying FAILS LOUDLY if existing rows already violate it — resolve duplicates first.`,\n });\n }\n\n // TTL policies, keyed by field.\n const previousTtl = new Map((previous.ttlPolicies ?? []).map((policy) => [policy.fieldName, policy.expireAfterSeconds]));\n const nextTtl = new Map((next.ttlPolicies ?? []).map((policy) => [policy.fieldName, policy.expireAfterSeconds]));\n for (const [fieldName, seconds] of [...previousTtl].sort(([a], [b]) => a.localeCompare(b))) {\n if (!nextTtl.has(fieldName)) {\n changes.push({ changeType: SchemaPlanChangeType.DROP_TTL_POLICY, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: fieldName, detail: `rows no longer expire via \"${fieldName}\" (${seconds}s).` });\n } else if (nextTtl.get(fieldName) !== seconds) {\n changes.push({ changeType: SchemaPlanChangeType.CHANGE_TTL_POLICY, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: fieldName, detail: `retention window on \"${fieldName}\": ${seconds}s → ${nextTtl.get(fieldName)}s.` });\n }\n }\n for (const [fieldName, seconds] of [...nextTtl].sort(([a], [b]) => a.localeCompare(b))) {\n if (!previousTtl.has(fieldName)) {\n changes.push({ changeType: SchemaPlanChangeType.ADD_TTL_POLICY, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: fieldName, detail: `rows expire ${seconds === 0 ? `when \"${fieldName}\" passes` : `${seconds}s after \"${fieldName}\"`} (enforced by the framework sweep).` });\n }\n }\n\n return changes;\n}\n\n/**\n * Compare two lockfiles. Pure and deterministic: same inputs, same output, in a stable order\n * (tables sorted, columns sorted, index identities sorted) — determinism is what makes the output\n * reviewable and the `--check` comparison meaningful.\n *\n * The planner-contract version is deliberately NOT compared here: a mismatch is not a schema\n * change, it is a different STATE with its own workflow (Phase 4). Callers check it before diffing.\n */\nexport function diffSchemaPlanLockfiles(previous: SchemaPlanLockfile, next: SchemaPlanLockfile): SchemaPlanChange[] {\n const changes: SchemaPlanChange[] = [];\n const tableNames = [...new Set([...Object.keys(previous.tables), ...Object.keys(next.tables)])].sort();\n\n for (const tableName of tableNames) {\n const before = previous.tables[tableName];\n const after = next.tables[tableName];\n if (before && !after) {\n changes.push({\n changeType: SchemaPlanChangeType.DROP_TABLE,\n risk: SchemaPlanChangeRisk.DESTRUCTIVE,\n tableName,\n subject: tableName,\n detail: `table \"${tableName}\" (${Object.keys(before.columns).length} columns) is no longer planned; dropping it destroys every row.`,\n });\n continue;\n }\n if (!before && after) {\n changes.push({\n changeType: SchemaPlanChangeType.ADD_TABLE,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: tableName,\n detail: `new table \"${tableName}\" (${Object.keys(after.columns).length} columns).`,\n });\n continue;\n }\n if (before && after) changes.push(...diffTable(tableName, before, after));\n }\n\n return changes;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"postgresql-schema-plan-diff.backend.js","sourceRoot":"","sources":["../../../../../src/databases/services/postgresql-schema-plan-diff.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The schema-plan DIFFER — pure comparison of two lockfile states into a typed change set.\n *\n * ## What this is and is not\n *\n * `diffSchemaPlanLockfiles(previous, next)` answers ONE question: what physical changes separate\n * the accepted schema from the current one. It renders no SQL, touches no database, and decides no\n * policy beyond the RISK classification each change carries. Generation (Phase 2) consumes its\n * output; `wildo db diff` prints it; `--check` fails CI when it is non-empty.\n *\n * ## Why index changes are DROP+ADD pairs rather than a \"changed\" member\n *\n * Physically, every index-semantics change (nulls distinctness, a `skipRowsMissing` predicate, the\n * retention scope) IS a drop and a recreate — PostgreSQL cannot alter an index's predicate in\n * place. Modelling them as pairs keeps the vocabulary honest to what a migration must actually do,\n * and it falls out of identity: an index's IDENTITY here includes its semantics, so a semantics\n * change makes the old identity disappear and a new one appear. (This deviates from the plan's\n * first-draft vocabulary, which sketched a `CHANGE_UNIQUE_SEMANTICS` member — recorded in the plan's\n * decision log.)\n *\n * `CHANGE_COLUMN_TYPE` stays a single member because it is the one change that is genuinely an\n * in-place `ALTER … USING` with data flowing through the cast — a pair would misrepresent it as\n * data loss.\n *\n * ## The variantConfig moves\n *\n * A column that disappears while joining the variant-swept set has NOT been deleted — its values\n * move INTO the `variantConfig` jsonb blob (and mirrored for the way out). The bare physical diff\n * reads as ADD/DROP_COLUMN, and acting on that read silently loses the data inside the blob. The\n * swept set travels in the lockfile precisely so this classification is a set lookup here rather\n * than an unanswerable question at generation time.\n */\n\nimport type { SchemaPlanLockfile, SerializedColumnPlan, SerializedTablePlan } from '~wildo-backend-lib/databases/services/postgresql-schema-plan-lockfile.backend';\n\n/**\n * The closed change vocabulary. Every member is a physical statement about the schema; the enum is\n * where per-member meaning lives (repo rule: closed semantic vocabularies get one named runtime\n * source).\n */\nexport enum SchemaPlanChangeType {\n ADD_TABLE = 'ADD_TABLE',\n /** The whole table, and everything in it. Always {@link SchemaPlanChangeRisk.DESTRUCTIVE}. */\n DROP_TABLE = 'DROP_TABLE',\n ADD_COLUMN = 'ADD_COLUMN',\n /** A column with (potential) data. Always DESTRUCTIVE — the differ cannot see whether rows exist. */\n DROP_COLUMN = 'DROP_COLUMN',\n /**\n * In-place `ALTER … TYPE … USING`. REQUIRES_DATA_MIGRATION: the `USING` expression is where\n * truncation and coercion live, and no diff can author it — a human writes it in the draft.\n */\n CHANGE_COLUMN_TYPE = 'CHANGE_COLUMN_TYPE',\n /**\n * The column's PRIMARY-KEY role changed. Physically enormous (constraint rebuild, every FK that\n * references it); practically forbidden without a hand-authored plan, hence\n * REQUIRES_DATA_MIGRATION rather than a bare pair of index changes.\n */\n CHANGE_PRIMARY_KEY = 'CHANGE_PRIMARY_KEY',\n /**\n * The table had NO primary key at all, and a column now becomes it.\n *\n * Deliberately NOT {@link CHANGE_PRIMARY_KEY}: nothing can reference a constraint that does not\n * exist, so there is no rebuild, no dependent foreign key, and no other column losing the role.\n * The statement is fully derivable from the plan, so the generator RENDERS it.\n *\n * The distinction was measured on 2026-08-28. Three tables (`consumabletokens`, `jobexecutions`,\n * `jobpayloadstorage`) shipped with a bare `\"_id\" text` — the adapter-parity hole since fixed in\n * `zod-to-sql-hybrid-schema.planner.ts` — and the blanket refusal meant a whole migration had to\n * be hand-authored, including the unrelated `ADD_TABLE` travelling with it, for SQL the renderer\n * could have written. A refusal calibrated for the dangerous case was paid for by the safe one.\n *\n * SAFE by the vocabulary above: it loses nothing. It may still FAIL loudly on a table already\n * holding NULL or duplicate values in that column — the same trade {@link ADD_UNIQUE_INDEX}\n * makes, and precisely the state the missing constraint had been permitting.\n */\n ADD_PRIMARY_KEY = 'ADD_PRIMARY_KEY',\n /**\n * NOT a drop: the field's values move INTO the `variantConfig` jsonb blob. The generated draft\n * must inject each row's column value into the blob BEFORE the column goes away.\n */\n FIELD_MOVED_INTO_VARIANT_CONFIG = 'FIELD_MOVED_INTO_VARIANT_CONFIG',\n /** The mirror: values must be extracted from the blob into the new column. */\n FIELD_MOVED_OUT_OF_VARIANT_CONFIG = 'FIELD_MOVED_OUT_OF_VARIANT_CONFIG',\n /** May FAIL on existing duplicates — stated in the detail; still SAFE (fails loudly, loses nothing). */\n ADD_UNIQUE_INDEX = 'ADD_UNIQUE_INDEX',\n DROP_UNIQUE_INDEX = 'DROP_UNIQUE_INDEX',\n ADD_INDEX = 'ADD_INDEX',\n DROP_INDEX = 'DROP_INDEX',\n /**\n * The column's `DEFAULT` was added, removed, or changed.\n *\n * SAFE: `ALTER COLUMN … SET/DROP DEFAULT` is a catalog-only change that rewrites no rows and\n * cannot fail on existing data. It is deliberately NOT retro-active — existing rows keep whatever\n * they already hold, including the NULLs written before the default existed. A migration that\n * also wants to backfill those rows must say so itself; inferring an `UPDATE` from a default\n * change would silently rewrite data the differ cannot see.\n */\n CHANGE_COLUMN_DEFAULT = 'CHANGE_COLUMN_DEFAULT',\n /** Renders as a column comment + drives the retention sweep; physical enough to be tracked. */\n ADD_TTL_POLICY = 'ADD_TTL_POLICY',\n DROP_TTL_POLICY = 'DROP_TTL_POLICY',\n CHANGE_TTL_POLICY = 'CHANGE_TTL_POLICY',\n}\n\n/**\n * @wildo_source:part:start application.database.migration-change-risk facet:layer:backend facet:family:database facet:audience:app-developer\n *\n * What a change can COST, not how likely it is to fail.\n *\n * - SAFE: loses no data. May still fail loudly at apply time (a unique index over duplicates) —\n * loud failure is acceptable, silent loss is not, and the vocabulary encodes exactly that line.\n * - DESTRUCTIVE: removes data. The runner refuses these without the file-level acknowledgement\n * (`-- wildo:acknowledge-destructive`), per K5/Phase 3′.\n * - REQUIRES_DATA_MIGRATION: correct only if data MOVES — a human must author the movement in the\n * generated draft before first apply.\n */\nexport enum SchemaPlanChangeRisk {\n SAFE = 'SAFE',\n DESTRUCTIVE = 'DESTRUCTIVE',\n REQUIRES_DATA_MIGRATION = 'REQUIRES_DATA_MIGRATION',\n}\n/**\n * @wildo_source:part:end application.database.migration-change-risk\n *\n * These three words are what `wildo db diff` prints beside every change and what the generated\n * `migration.sql` writes above every statement, so an application developer reads them constantly.\n * They also decide what tooling will do UNATTENDED: `wildo local dev` reconciles an all-SAFE change\n * set on its own, and stops for anything else — because a DESTRUCTIVE statement removes rows and a\n * REQUIRES_DATA_MIGRATION statement is a generated SKELETON whose correctness is a judgement about\n * data no differ can see.\n */\n\nexport interface SchemaPlanChange {\n changeType: SchemaPlanChangeType;\n risk: SchemaPlanChangeRisk;\n tableName: string;\n /** The column, the index's column list, or the TTL field — what the change is ABOUT. */\n subject: string;\n /** One human sentence with the before→after facts a reviewer needs. */\n detail: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Index identity\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface UniqueIndexIdentity {\n columns: readonly string[];\n nullsAreDistinct: boolean;\n skipRowsMissing: readonly string[];\n retentionScoped: boolean;\n}\n\n/**\n * Everything that changes what the index MEANS is part of its identity — which is what turns a\n * semantics change into a drop+add pair (see the header). The retention scope is table-level in the\n * plan but per-index in the physical schema (every unique index carries the predicate), so it joins\n * each identity here and a table-level flip correctly fans out into one pair per unique index.\n */\nfunction uniqueIndexIdentityKey(identity: UniqueIndexIdentity): string {\n return [\n identity.columns.join(','),\n `nullsDistinct:${identity.nullsAreDistinct}`,\n `skip:${[...identity.skipRowsMissing].sort().join(',')}`,\n `retentionScoped:${identity.retentionScoped}`,\n ].join('|');\n}\n\nfunction collectUniqueIndexIdentities(table: SerializedTablePlan): Map<string, UniqueIndexIdentity> {\n const retentionScoped = table.uniquenessExcludesErasureRetainedRows === true;\n const identities = new Map<string, UniqueIndexIdentity>();\n for (const [name, column] of Object.entries(table.columns)) {\n if (!column.unique) continue;\n const identity: UniqueIndexIdentity = {\n columns: [name],\n nullsAreDistinct: column.unique.nullsAreDistinct,\n skipRowsMissing: [],\n retentionScoped,\n };\n identities.set(uniqueIndexIdentityKey(identity), identity);\n }\n for (const constraint of table.compositeUniqueConstraints ?? []) {\n const identity: UniqueIndexIdentity = {\n columns: constraint.fields,\n // Composite constraints always render NULLS NOT DISTINCT (the ORGANIZATION_UNITS lesson).\n nullsAreDistinct: false,\n skipRowsMissing: constraint.skipRowsMissing ?? [],\n retentionScoped,\n };\n identities.set(uniqueIndexIdentityKey(identity), identity);\n }\n return identities;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// The diff\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction diffTable(tableName: string, previous: SerializedTablePlan, next: SerializedTablePlan): SchemaPlanChange[] {\n const changes: SchemaPlanChange[] = [];\n const previousSwept = new Set(previous.variantSweptFields ?? []);\n /**\n * Asked of the WHOLE table, not of the column, because that is what separates an ADD from a MOVE.\n * A column gaining the role while some other column held it is a rebuild every reference leans\n * on; a column gaining it while the table had none is additive, and the two must not share a\n * change type — see {@link SchemaPlanChangeType.ADD_PRIMARY_KEY}.\n */\n const previousHadPrimaryKey = Object.values(previous.columns).some((column) => column.isPrimaryKey === true);\n const nextSwept = new Set(next.variantSweptFields ?? []);\n const columnNames = [...new Set([...Object.keys(previous.columns), ...Object.keys(next.columns)])].sort();\n\n for (const name of columnNames) {\n const before: SerializedColumnPlan | undefined = previous.columns[name];\n const after: SerializedColumnPlan | undefined = next.columns[name];\n\n if (before && !after) {\n if (nextSwept.has(name)) {\n changes.push({\n changeType: SchemaPlanChangeType.FIELD_MOVED_INTO_VARIANT_CONFIG,\n risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,\n tableName,\n subject: name,\n detail: `\"${name}\" is now variant-only: its values must be INJECTED into the \"variantConfig\" jsonb blob before the column is dropped — a bare drop silently loses them.`,\n });\n } else {\n changes.push({\n changeType: SchemaPlanChangeType.DROP_COLUMN,\n risk: SchemaPlanChangeRisk.DESTRUCTIVE,\n tableName,\n subject: name,\n detail: `column \"${name}\" (${before.sqlType}) is no longer planned; dropping it destroys whatever rows hold there.`,\n });\n }\n continue;\n }\n if (!before && after) {\n if (previousSwept.has(name)) {\n changes.push({\n changeType: SchemaPlanChangeType.FIELD_MOVED_OUT_OF_VARIANT_CONFIG,\n risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,\n tableName,\n subject: name,\n detail: `\"${name}\" was variant-only: existing values live inside the \"variantConfig\" jsonb blob and must be EXTRACTED into the new \"${after.sqlType}\" column, or every pre-existing row reads NULL.`,\n });\n } else {\n changes.push({\n changeType: SchemaPlanChangeType.ADD_COLUMN,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: name,\n detail: `new column \"${name}\" ${after.sqlType}.`,\n });\n }\n /*\n * A column ARRIVES with the properties it was declared with (#505).\n *\n * Everything below this point compares `before` against `after`, so it is reachable only for a\n * column that already existed — and a NEW column `continue`s past all of it. That silently made\n * `.isDBIndexed()` a no-op on any field added to an EXISTING table: the differ emitted\n * `ADD_COLUMN` alone, so the database permanently lacked an index the schema declared.\n *\n * The initial-schema path was never affected, which is why this survived: `CREATE TABLE`\n * renders every declared index, so the planner plainly knows how. What it did not do was carry\n * the declaration through the DELTA path.\n *\n * Worse than the missing index was the silence around it. `db diff --check` compares the plan\n * to the lockfile, and BOTH record `hasIndex: true` — the lockfile is written from the same\n * plan — so the check was wrong in the same direction as the thing it checks and reported IN\n * SYNC over a database missing the index. Measured 2026-09-08 on two `oauthClients` tables: the\n * application generator emitted 4 statements, the platform generator 8, from one schema.\n *\n * The primary-key case is included on the same reasoning rather than on symmetry: a new column\n * declared `isPrimaryKey` on a table that has none is additive and renderable, and skipping it\n * left exactly the same gap one property over.\n */\n if (after.hasIndex === true) {\n changes.push({\n changeType: SchemaPlanChangeType.ADD_INDEX,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: name,\n detail: `plain index on the new column \"${name}\".`,\n });\n }\n if (after.isPrimaryKey === true) {\n changes.push(previousHadPrimaryKey\n ? {\n changeType: SchemaPlanChangeType.CHANGE_PRIMARY_KEY,\n risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,\n tableName,\n subject: name,\n 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.`,\n }\n : {\n changeType: SchemaPlanChangeType.ADD_PRIMARY_KEY,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: name,\n 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.`,\n });\n }\n continue;\n }\n if (!before || !after) continue;\n\n if (before.sqlType !== after.sqlType) {\n changes.push({\n changeType: SchemaPlanChangeType.CHANGE_COLUMN_TYPE,\n risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,\n tableName,\n subject: name,\n detail: `\"${name}\" ${before.sqlType} → ${after.sqlType}; the USING expression decides what existing values become, and only a human can decide it.`,\n });\n }\n if ((before.defaultClause ?? '') !== (after.defaultClause ?? '')) {\n const describe = (clause: string | undefined): string =>\n clause ? clause.replace(/^ default /, '') : 'none';\n changes.push({\n changeType: SchemaPlanChangeType.CHANGE_COLUMN_DEFAULT,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: name,\n detail:\n `\"${name}\" default ${describe(before.defaultClause)} → ${describe(after.defaultClause)}; `\n + 'applies to NEW rows only — existing rows keep the values they already hold.',\n });\n }\n if ((before.isPrimaryKey === true) !== (after.isPrimaryKey === true)) {\n changes.push(after.isPrimaryKey === true && !previousHadPrimaryKey\n ? {\n changeType: SchemaPlanChangeType.ADD_PRIMARY_KEY,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: name,\n detail: `\"${name}\" becomes the primary key of a table that had none — additive, so nothing references the constraint being built. May FAIL on rows already holding a NULL or duplicate \"${name}\", which is the state its absence permitted.`,\n }\n : {\n changeType: SchemaPlanChangeType.CHANGE_PRIMARY_KEY,\n risk: SchemaPlanChangeRisk.REQUIRES_DATA_MIGRATION,\n tableName,\n subject: name,\n detail: `\"${name}\" ${after.isPrimaryKey ? 'becomes' : 'stops being'} the primary key — a constraint rebuild that touches every reference to this table; hand-author the plan.`,\n });\n }\n if ((before.hasIndex === true) !== (after.hasIndex === true)) {\n changes.push(after.hasIndex\n ? { changeType: SchemaPlanChangeType.ADD_INDEX, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: name, detail: `plain index on \"${name}\".` }\n : { changeType: SchemaPlanChangeType.DROP_INDEX, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: name, detail: `plain index on \"${name}\" is no longer planned.` });\n }\n }\n\n // Unique indexes — identity-keyed, so a semantics change appears as its own drop+add pair.\n const previousUnique = collectUniqueIndexIdentities(previous);\n const nextUnique = collectUniqueIndexIdentities(next);\n for (const [key, identity] of [...previousUnique].sort(([a], [b]) => a.localeCompare(b))) {\n if (nextUnique.has(key)) continue;\n changes.push({\n changeType: SchemaPlanChangeType.DROP_UNIQUE_INDEX,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: identity.columns.join(', '),\n detail: `unique index on (${identity.columns.join(', ')}) [nullsDistinct=${identity.nullsAreDistinct}, skip=[${identity.skipRowsMissing.join(', ')}], retentionScoped=${identity.retentionScoped}] is gone or changed semantics.`,\n });\n }\n for (const [key, identity] of [...nextUnique].sort(([a], [b]) => a.localeCompare(b))) {\n if (previousUnique.has(key)) continue;\n changes.push({\n changeType: SchemaPlanChangeType.ADD_UNIQUE_INDEX,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: identity.columns.join(', '),\n detail: `unique index on (${identity.columns.join(', ')}) [nullsDistinct=${identity.nullsAreDistinct}, skip=[${identity.skipRowsMissing.join(', ')}], retentionScoped=${identity.retentionScoped}]; applying FAILS LOUDLY if existing rows already violate it — resolve duplicates first.`,\n });\n }\n\n // TTL policies, keyed by field.\n const previousTtl = new Map((previous.ttlPolicies ?? []).map((policy) => [policy.fieldName, policy.expireAfterSeconds]));\n const nextTtl = new Map((next.ttlPolicies ?? []).map((policy) => [policy.fieldName, policy.expireAfterSeconds]));\n for (const [fieldName, seconds] of [...previousTtl].sort(([a], [b]) => a.localeCompare(b))) {\n if (!nextTtl.has(fieldName)) {\n changes.push({ changeType: SchemaPlanChangeType.DROP_TTL_POLICY, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: fieldName, detail: `rows no longer expire via \"${fieldName}\" (${seconds}s).` });\n } else if (nextTtl.get(fieldName) !== seconds) {\n changes.push({ changeType: SchemaPlanChangeType.CHANGE_TTL_POLICY, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: fieldName, detail: `retention window on \"${fieldName}\": ${seconds}s → ${nextTtl.get(fieldName)}s.` });\n }\n }\n for (const [fieldName, seconds] of [...nextTtl].sort(([a], [b]) => a.localeCompare(b))) {\n if (!previousTtl.has(fieldName)) {\n changes.push({ changeType: SchemaPlanChangeType.ADD_TTL_POLICY, risk: SchemaPlanChangeRisk.SAFE, tableName, subject: fieldName, detail: `rows expire ${seconds === 0 ? `when \"${fieldName}\" passes` : `${seconds}s after \"${fieldName}\"`} (enforced by the framework sweep).` });\n }\n }\n\n return changes;\n}\n\n/**\n * Compare two lockfiles. Pure and deterministic: same inputs, same output, in a stable order\n * (tables sorted, columns sorted, index identities sorted) — determinism is what makes the output\n * reviewable and the `--check` comparison meaningful.\n *\n * The planner-contract version is deliberately NOT compared here: a mismatch is not a schema\n * change, it is a different STATE with its own workflow (Phase 4). Callers check it before diffing.\n */\nexport function diffSchemaPlanLockfiles(previous: SchemaPlanLockfile, next: SchemaPlanLockfile): SchemaPlanChange[] {\n const changes: SchemaPlanChange[] = [];\n const tableNames = [...new Set([...Object.keys(previous.tables), ...Object.keys(next.tables)])].sort();\n\n for (const tableName of tableNames) {\n const before = previous.tables[tableName];\n const after = next.tables[tableName];\n if (before && !after) {\n changes.push({\n changeType: SchemaPlanChangeType.DROP_TABLE,\n risk: SchemaPlanChangeRisk.DESTRUCTIVE,\n tableName,\n subject: tableName,\n detail: `table \"${tableName}\" (${Object.keys(before.columns).length} columns) is no longer planned; dropping it destroys every row.`,\n });\n continue;\n }\n if (!before && after) {\n changes.push({\n changeType: SchemaPlanChangeType.ADD_TABLE,\n risk: SchemaPlanChangeRisk.SAFE,\n tableName,\n subject: tableName,\n detail: `new table \"${tableName}\" (${Object.keys(after.columns).length} columns).`,\n });\n continue;\n }\n if (before && after) changes.push(...diffTable(tableName, before, after));\n }\n\n return changes;\n}\n"]}
|
|
@@ -107,8 +107,35 @@ export declare class RedisService {
|
|
|
107
107
|
disconnect(): Promise<void>;
|
|
108
108
|
/**
|
|
109
109
|
* Get Redis client
|
|
110
|
+
*
|
|
111
|
+
* Returns the client OBJECT, which may exist without being usable — see
|
|
112
|
+
* {@link getReadyClient}, which is what almost every caller actually wants.
|
|
110
113
|
*/
|
|
111
114
|
getClient(): RedisClientType | null;
|
|
115
|
+
/**
|
|
116
|
+
* The Redis client, but only while it can actually serve a command.
|
|
117
|
+
*
|
|
118
|
+
* ## Why this exists as its own accessor
|
|
119
|
+
*
|
|
120
|
+
* `getClient()` answers the client OBJECT. A client that was constructed but never connected — the
|
|
121
|
+
* normal state wherever Redis is not configured — is TRUTHY, so `if (client)` reads as "Redis is
|
|
122
|
+
* available" and the next command throws `The client is closed`.
|
|
123
|
+
*
|
|
124
|
+
* That is not hypothetical and it was not one site. Every caller in this package guarded on
|
|
125
|
+
* truthiness alone, so on the dev companion — which logs `Redis not properly configured … using
|
|
126
|
+
* memory adapter` at boot — the WebSocket disconnect handler warned on EVERY socket close, filling
|
|
127
|
+
* the warning channel with a condition nobody can act on (issue #242). The same shape sat in the
|
|
128
|
+
* A2A cancellation service, where each site ALREADY had a considered fallback for a null client and
|
|
129
|
+
* simply never reached it.
|
|
130
|
+
*
|
|
131
|
+
* Returning `null` for a not-ready client means every one of those existing fallbacks — "cross-pod
|
|
132
|
+
* cancellation is disabled", "fail safe toward alive", "the lease mechanism is not writable" — now
|
|
133
|
+
* fires for an unusable client exactly as it does for an absent one, which is what each of them
|
|
134
|
+
* already meant.
|
|
135
|
+
*
|
|
136
|
+
* A caller that genuinely wants the object regardless of state keeps {@link getClient}.
|
|
137
|
+
*/
|
|
138
|
+
getReadyClient(): RedisClientType | null;
|
|
112
139
|
/**
|
|
113
140
|
* Get the canonical app-level Redis key namespace prefix (Slice 3.6
|
|
114
141
|
* + 2026-05-26 ACL-alignment fix).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.service.d.ts","sourceRoot":"","sources":["../../../../../src/databases/services/redis.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,eAAe,EAAsB,MAAM,OAAO,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sEAAsE,CAAC;AAC/G,OAAO,EAAE,0BAA0B,EAAE,MAAM,kEAAkE,CAAC;AAK9G,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,qBACa,YAAY;IAsCc,OAAO,CAAC,MAAM;IACJ,OAAO,CAAC,aAAa;IAClB,OAAO,CAAC,YAAY;IAvCtE,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAEjF;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,SAAS,CAAc;gBAGc,MAAM,EAAE,aAAa,EACX,aAAa,EAAE,uBAAuB,EACnC,YAAY,EAAE,0BAA0B;IAMlG;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,2BAA2B;IA6BnC;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAwIhD;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWxC
|
|
1
|
+
{"version":3,"file":"redis.service.d.ts","sourceRoot":"","sources":["../../../../../src/databases/services/redis.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -248,10 +248,39 @@ let RedisService = class RedisService {
|
|
|
248
248
|
}
|
|
249
249
|
/**
|
|
250
250
|
* Get Redis client
|
|
251
|
+
*
|
|
252
|
+
* Returns the client OBJECT, which may exist without being usable — see
|
|
253
|
+
* {@link getReadyClient}, which is what almost every caller actually wants.
|
|
251
254
|
*/
|
|
252
255
|
getClient() {
|
|
253
256
|
return this.client;
|
|
254
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* The Redis client, but only while it can actually serve a command.
|
|
260
|
+
*
|
|
261
|
+
* ## Why this exists as its own accessor
|
|
262
|
+
*
|
|
263
|
+
* `getClient()` answers the client OBJECT. A client that was constructed but never connected — the
|
|
264
|
+
* normal state wherever Redis is not configured — is TRUTHY, so `if (client)` reads as "Redis is
|
|
265
|
+
* available" and the next command throws `The client is closed`.
|
|
266
|
+
*
|
|
267
|
+
* That is not hypothetical and it was not one site. Every caller in this package guarded on
|
|
268
|
+
* truthiness alone, so on the dev companion — which logs `Redis not properly configured … using
|
|
269
|
+
* memory adapter` at boot — the WebSocket disconnect handler warned on EVERY socket close, filling
|
|
270
|
+
* the warning channel with a condition nobody can act on (issue #242). The same shape sat in the
|
|
271
|
+
* A2A cancellation service, where each site ALREADY had a considered fallback for a null client and
|
|
272
|
+
* simply never reached it.
|
|
273
|
+
*
|
|
274
|
+
* Returning `null` for a not-ready client means every one of those existing fallbacks — "cross-pod
|
|
275
|
+
* cancellation is disabled", "fail safe toward alive", "the lease mechanism is not writable" — now
|
|
276
|
+
* fires for an unusable client exactly as it does for an absent one, which is what each of them
|
|
277
|
+
* already meant.
|
|
278
|
+
*
|
|
279
|
+
* A caller that genuinely wants the object regardless of state keeps {@link getClient}.
|
|
280
|
+
*/
|
|
281
|
+
getReadyClient() {
|
|
282
|
+
return this.client?.isReady ? this.client : null;
|
|
283
|
+
}
|
|
255
284
|
/**
|
|
256
285
|
* Get the canonical app-level Redis key namespace prefix (Slice 3.6
|
|
257
286
|
* + 2026-05-26 ACL-alignment fix).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../../../../../src/databases/services/redis.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { injectable, inject } from 'inversify';\nimport { createClient, RedisClientType, RedisClientOptions } from 'redis';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError, projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { defaultDatabaseConfig } from '~wildo-backend-lib/databases/models/databases.backend.schemas';\nimport { ErrorType, ErrorCustomMessageReference } from '@wildo-ai/saas-models';\n\nexport interface RedisHealthCheck {\n status: 'healthy' | 'unhealthy' | 'connecting';\n latency?: number;\n error?: string;\n memory: {\n used: number;\n peak: number;\n };\n}\n\nexport interface CacheOptions {\n ttl?: number; // Time to live in seconds\n organizationId?: string; // For multi-tenant caching\n}\n\nexport interface SessionData {\n userId: string;\n organizationId: string;\n role: string;\n permissions: string[];\n loginTime: number;\n lastActivity: number;\n}\n\n/**\n * Redis Service\n *\n * Handles Redis operations for:\n * - Caching (application data, API responses)\n * - Session management\n * - Real-time data storage\n * - Multi-tenant data isolation\n * - Rate limiting data\n */\n@injectable()\nexport class RedisService {\n private client: RedisClientType | null = null;\n private isConnecting: boolean = false;\n private connectionRetries: number = 0;\n private readonly maxRetries: number = 5;\n private readonly retryDelay: number = 3000; // 3 seconds\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n /**\n * Canonical app-level Redis key namespace (Slice 3.6).\n *\n * Sourced from `REDIS_KEY_PREFIX` env (originating from\n * `wildo.saas.config.dataServices.redis.keyPrefix`), surfaced via\n * `appConfigService.config.database.redis.keyPrefix`. Every key the\n * service writes becomes `${appPrefix}org:${orgId}:${key}` or\n * `${appPrefix}global:${key}`.\n *\n * REPLACE semantics: this supersedes the legacy\n * `secrets.database.redis.username`-derived prefix (Slice 3.6 audit\n * decision — single source of truth = `wildo.saas.config.dataServices`).\n * The Redis ACL username remains the auth identity but no longer drives\n * key namespacing.\n *\n * When the app does not author `dataServices.redis.keyPrefix`, the\n * runtime computes `<appSlug>:` as the slug-derived default\n * (ACL-alignment fix, 2026-05-26). The historical literal default\n * `'saas:'` was removed because it was global across every\n * un-authored app and DID NOT align with the per-app ACL grant\n * `~<appSlug>:*` — every Redis op returned `NOPERM` until the\n * schema and the ACL agreed on the slug-derived namespace.\n *\n * ACL invariant (enforced in `connect()`): when an authored value\n * is present, it MUST start with `<appSlug>:` so the ACL grant\n * remains a superset of the keys the backend writes.\n */\n private appPrefix: string = '';\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private configService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) private errorBuilder: ErrorBuilderBackendService\n ) {\n this.logDebug = this.logger.debugByType('RedisService');\n this.logger.setDebugTypeLogging('RedisService', false);\n }\n\n /**\n * Compute the canonical app-level Redis key namespace and validate it\n * against the slug-rooted ACL contract. Run as a connection PRECONDITION\n * (before the retry block) so invalid config fails loud, not silently.\n *\n * Source order (Slice 3.6 + ACL-alignment fix 2026-05-26):\n * 1. `config.database.redis.keyPrefix` — the SaaS app's authored value\n * (from `wildo.saas.config.dataServices.redis.keyPrefix`, threaded\n * via the `REDIS_KEY_PREFIX` env). Empty string is preserved as an\n * explicit no-prefix opt-out (tests / no-prefix workloads).\n * 2. `<appSlug>:` — slug-derived default when unauthored. REPLACES the\n * historical literal `'saas:'` default, which was global across every\n * un-authored app and did NOT match the per-app ACL grant\n * `~<appSlug>:*` (apps-manager scoped the ACL to the slug; the\n * backend wrote `saas:<key>` → every op `NOPERM`).\n *\n * Slice 3 deep-review L-9: sourced from `config.database.redis.keyPrefix`\n * directly (NOT the `{ ...defaults, ...config, ...secrets }` merged blob),\n * so a stray `keyPrefix` in the secrets payload can't shadow the\n * non-secret app config.\n *\n * ACL invariant: an authored `keyPrefix` MUST start with `<appSlug>:` so\n * the `~<appSlug>:*` grant covers every key the backend writes.\n */\n private computeAndValidateAppPrefix(): void {\n const config = this.configService.config;\n const appSlug = this.configService.appSlug;\n const slugDerivedDefault = `${appSlug}:`;\n const authoredKeyPrefix = config.database.redis?.keyPrefix;\n this.appPrefix = authoredKeyPrefix !== undefined\n ? authoredKeyPrefix\n : slugDerivedDefault;\n\n if (this.appPrefix && !this.appPrefix.startsWith(`${appSlug}:`)) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message:\n `dataServices.redis.keyPrefix '${this.appPrefix}' must start with '${appSlug}:' `\n + 'so the per-app ACL grant `~<appSlug>:*` covers it. '\n + `Either omit the field (default '${slugDerivedDefault}' applies) `\n + `or change the authored value to '${slugDerivedDefault}<suffix>'.`,\n authoredKeyPrefix: this.appPrefix,\n appSlug,\n },\n },\n );\n }\n }\n\n /**\n * Connect to Redis\n */\n public async connect(): Promise<RedisClientType> {\n if (this.client && this.client.isReady) {\n return this.client;\n }\n\n if (this.isConnecting) {\n // Wait for existing connection attempt\n return new Promise((resolve, reject) => {\n const checkConnection = () => {\n if (this.client && this.client.isReady) {\n resolve(this.client);\n } else if (!this.isConnecting) {\n reject(new Error('Connection attempt failed'));\n } else {\n setTimeout(checkConnection, 100);\n }\n };\n checkConnection();\n });\n }\n\n this.isConnecting = true;\n\n // Compute + validate the app-level Redis key namespace as a CONFIG\n // PRECONDITION — BEFORE the connection retry block. A keyPrefix that\n // doesn't satisfy the slug-rooted ACL contract is invalid config, not a\n // transient connection failure: it must throw immediately (with its\n // actionable message) and NOT be swallowed by the catch's retry loop.\n // (Once the client connects once and `isReady` flips true, a retry\n // would re-enter connect(), hit the `client.isReady` early-return, and\n // resolve — masking the invalid config.)\n this.computeAndValidateAppPrefix();\n\n try {\n const config = this.configService.config;\n const secrets = this.configService.secrets;\n const redisDefaultConfig = defaultDatabaseConfig.redis;\n\n const redisConfig = {\n ...redisDefaultConfig,\n ...config.database.redis,\n ...secrets.database.redis\n };\n\n if (!redisConfig) {\n const error = this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_INITIALIZATION_FAILED }\n );\n throw error;\n }\n\n const redisUrl = `redis://${redisConfig.host}:${redisConfig.port}`;\n\n this.logDebug('Connecting to Redis', {\n url: this.maskConnectionString(redisUrl)\n });\n\n // Redis options for SaaS multi-tenant architecture\n // Include username for ACL authentication (required when using app-specific credentials)\n const redisOptions: RedisClientOptions = {\n socket: {\n host: redisConfig.host,\n port: redisConfig.port,\n connectTimeout: redisConfig.connectTimeout || 10000,\n // `connect()` already owns a finite five-attempt policy below. If\n // node-redis also reconnects internally, its first promise can stay\n // pending forever and the service-owned retry budget never advances.\n reconnectStrategy: false,\n },\n username: redisConfig.username,\n password: redisConfig.password,\n database: redisConfig.db\n };\n\n this.client = createClient(redisOptions) as RedisClientType;\n\n // Setup event handlers\n this.setupEventHandlers(this.client, 'main');\n\n // Wait for connection to be ready\n await this.client.connect();\n\n // `this.appPrefix` was already computed + validated as a config\n // precondition before the retry block (see\n // `computeAndValidateAppPrefix`). It is intentionally NOT recomputed\n // here: doing so post-connect put the validation inside the retry\n // catch, where — once the client connected and `isReady` flipped true\n // — a retry would hit the `client.isReady` early-return at the top of\n // connect() and resolve, masking an invalid keyPrefix. Config\n // validation belongs before the connection, not after it.\n\n this.connectionRetries = 0;\n this.isConnecting = false;\n\n this.logDebug('Redis connected successfully', {\n isReady: this.client.isReady,\n isOpen: this.client.isOpen,\n appPrefix: this.appPrefix || '(none)'\n });\n\n return this.client;\n\n } catch (error) {\n this.isConnecting = false;\n this.connectionRetries++;\n\n this.logger.error('Redis connection failed', {\n ...projectCaughtErrorLogFields(error),\n retries: this.connectionRetries,\n maxRetries: this.maxRetries\n });\n\n if (this.connectionRetries < this.maxRetries) {\n this.logDebug(`Retrying Redis connection in ${this.retryDelay}ms...`);\n await this.delay(this.retryDelay);\n return await this.connect();\n } else {\n const connectionError = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED,\n context: {\n retries: this.connectionRetries,\n maxRetries: this.maxRetries,\n originalError: describeCaughtError(error)\n }\n }\n );\n throw connectionError;\n }\n }\n }\n\n /**\n * Disconnect from Redis\n */\n public async disconnect(): Promise<void> {\n this.logDebug('Disconnecting from Redis');\n\n if (this.client) {\n await this.client.quit();\n this.client = null;\n }\n\n this.logDebug('Redis disconnected successfully');\n }\n\n /**\n * Get Redis client\n */\n public getClient(): RedisClientType | null {\n return this.client;\n }\n\n /**\n * Get the canonical app-level Redis key namespace prefix (Slice 3.6\n * + 2026-05-26 ACL-alignment fix).\n *\n * Returns the value of `wildo.saas.config.dataServices.redis.keyPrefix`\n * (e.g., `\"wonder-todos:\"`), surfaced via the `REDIS_KEY_PREFIX` env\n * variable into `config.database.redis.keyPrefix`. When the field is\n * not authored, falls back to `<appSlug>:` (e.g.,\n * `\"wonder-todos:\"` for app `wonder-todos`) — the slug-derived\n * default that aligns with the per-app ACL grant `~<appSlug>:*`.\n *\n * **Slice 3 deep-review L-9 (2026-04-13) — sourcing precedence.** The\n * authoritative source is `config.database.redis.keyPrefix`, NOT the\n * merged `redisConfig.keyPrefix` blob constructed in `connect()`. The\n * connection-options blob spreads `secrets.database.redis` on top of\n * `config.database.redis`, which would let a stray `keyPrefix` in the\n * secrets payload silently shadow the authored config value. The\n * namespace prefix is non-secret authored config, so `connect()`\n * intentionally reads it directly from `config.database.redis?.keyPrefix\n * ?? \\`${configService.appSlug}:\\`` and stores it on `this.appPrefix`\n * before the merged blob is built. Pinned by the L-9 regression test\n * in `redis.service.test.ts`.\n *\n * Used by `WebSocketService` and any other service that must construct\n * Redis keys outside `set/get/del` (e.g., `eval()`, pub/sub channel\n * names, scan patterns) so they share the same namespace as\n * `createTenantKey()`.\n */\n public getAppPrefix(): string {\n return this.appPrefix;\n }\n\n /**\n * Check Redis health\n */\n public async healthCheck(): Promise<RedisHealthCheck> {\n try {\n if (!this.client || !this.client.isReady) {\n return {\n status: 'unhealthy',\n error: 'No active connection',\n memory: { used: 0, peak: 0 }\n };\n }\n\n const startTime = Date.now();\n\n // Perform ping operation\n await this.client.ping();\n\n const latency = Date.now() - startTime;\n\n // Get memory info\n const info = await this.client.info('memory');\n const memoryUsed = this.parseInfoValue(info, 'used_memory');\n const memoryPeak = this.parseInfoValue(info, 'used_memory_peak');\n\n return {\n status: 'healthy',\n latency,\n memory: {\n used: memoryUsed,\n peak: memoryPeak\n }\n };\n\n } catch (error) {\n this.logger.error('Redis health check failed', {\n ...projectCaughtErrorLogFields(error)\n });\n\n return {\n status: 'unhealthy',\n error: describeCaughtError(error),\n memory: { used: 0, peak: 0 }\n };\n }\n }\n\n /**\n * Cache operations with multi-tenant support\n */\n public async set(\n key: string,\n value: any,\n options: CacheOptions = {}\n ): Promise<void> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const tenantKey = this.createTenantKey(key, options.organizationId);\n const serializedValue = JSON.stringify(value);\n\n if (options.ttl) {\n await this.client.setEx(tenantKey, options.ttl, serializedValue);\n } else {\n await this.client.set(tenantKey, serializedValue);\n }\n\n this.logDebug('Cache set', { key: tenantKey, ttl: options.ttl });\n }\n\n public async get<T = any>(\n key: string,\n organizationId?: string\n ): Promise<T | null> {\n if (!this.client) {\n return null;\n }\n\n const tenantKey = this.createTenantKey(key, organizationId);\n const value = await this.client.get(tenantKey);\n\n if (value === null) {\n return null;\n }\n\n try {\n return JSON.parse(value as string) as T;\n } catch (error) {\n this.logger.error('Failed to parse cached value', {\n key: tenantKey,\n ...projectCaughtErrorLogFields(error)\n });\n return null;\n }\n }\n\n /**\n * Atomically read a value and delete it in one round-trip (Redis native\n * `GETDEL`, available since Redis 6.2).\n *\n * Symmetric with {@link set} / {@link get}: applies the SAME multi-tenant\n * key scoping AND the SAME `JSON.parse` deserialization, so a value written\n * with `set()` round-trips correctly. Reach for this on single-use tokens —\n * WebAuthn challenges, one-time codes — where the read must consume the\n * value atomically (no get-then-del race, no replay of a still-present\n * token).\n *\n * Do NOT hand-roll this with `eval()` + a raw `GET`/`DEL` Lua script: the\n * raw `eval` path returns the stored bytes verbatim and bypasses the\n * `JSON.parse` that `set()`'s `JSON.stringify` requires, so the caller gets\n * a value wrapped in literal quote characters (`\"\\\"abc\\\"\"` instead of\n * `abc`). That asymmetry silently broke passkey enrollment until this\n * method centralized the contract.\n *\n * Returns `null` if the key is absent (or the stored value can't be parsed).\n */\n public async getDel<T = any>(\n key: string,\n organizationId?: string\n ): Promise<T | null> {\n if (!this.client) {\n return null;\n }\n\n const tenantKey = this.createTenantKey(key, organizationId);\n const value = await this.client.getDel(tenantKey);\n\n if (value === null) {\n return null;\n }\n\n try {\n return JSON.parse(value as string) as T;\n } catch (error) {\n this.logger.error('Failed to parse cached value', {\n key: tenantKey,\n ...projectCaughtErrorLogFields(error)\n });\n return null;\n }\n }\n\n public async del(key: string, organizationId?: string): Promise<void> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const tenantKey = this.createTenantKey(key, organizationId);\n await this.client.del(tenantKey);\n\n this.logDebug('Cache deleted', { key: tenantKey });\n }\n\n public async exists(key: string, organizationId?: string): Promise<boolean> {\n if (!this.client) {\n return false;\n }\n\n const tenantKey = this.createTenantKey(key, organizationId);\n const result = await this.client.exists(tenantKey);\n return result === 1;\n }\n\n /**\n * Session management\n */\n public async setSession(\n sessionId: string,\n sessionData: SessionData,\n ttl: number = 86400\n ): Promise<void> {\n const key = `session:${sessionId}`;\n await this.set(key, sessionData, { ttl });\n }\n\n public async getSession(sessionId: string): Promise<SessionData | null> {\n const key = `session:${sessionId}`;\n return await this.get<SessionData>(key);\n }\n\n public async deleteSession(sessionId: string): Promise<void> {\n const key = `session:${sessionId}`;\n await this.del(key);\n }\n\n public async updateSessionActivity(sessionId: string): Promise<void> {\n const session = await this.getSession(sessionId);\n if (session) {\n session.lastActivity = Date.now();\n await this.setSession(sessionId, session);\n }\n }\n\n /**\n * Build a fully-qualified Redis key with app prefix and tenant scope.\n * Use this when constructing keys for `eval()` Lua scripts so they match\n * the keys produced by `set()`/`get()`/`del()`.\n */\n public buildKey(key: string, organizationId?: string): string {\n return this.createTenantKey(key, organizationId);\n }\n\n /**\n * Execute a Lua script atomically on the Redis server.\n * Used for atomic read-modify-write operations (e.g., session updates with version checks).\n *\n * IMPORTANT: Keys passed here must be fully-qualified (use `buildKey()` to construct them).\n * Unlike `set()`/`get()`, this method does NOT apply `createTenantKey()` automatically.\n */\n public async eval(script: string, keys: string[], args: string[]): Promise<any> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n return this.client.eval(script, { keys, arguments: args });\n }\n\n /**\n * Rate limiting support\n */\n public async incrementRateLimit(\n identifier: string,\n windowSeconds: number,\n organizationId?: string\n ): Promise<number> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const key = this.createTenantKey(`rate_limit:${identifier}`, organizationId);\n\n const current = await this.client.eval(\n `\n local current = redis.call('INCR', KEYS[1])\n local ttl = redis.call('TTL', KEYS[1])\n if ttl < 0 then\n redis.call('EXPIRE', KEYS[1], tonumber(ARGV[1]))\n end\n return current\n `,\n {\n keys: [key],\n arguments: [String(windowSeconds)],\n },\n );\n return typeof current === 'number' ? current : Number(current);\n }\n\n /**\n * Get the current rate limit count for a given identifier without incrementing.\n * Uses the same key format as incrementRateLimit() — callers should NOT manually\n * prepend \"rate_limit:\" since this method does it internally.\n */\n public async getRateLimitCount(\n identifier: string,\n organizationId?: string,\n ): Promise<number> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const key = this.createTenantKey(`rate_limit:${identifier}`, organizationId);\n const value = await this.client.get(key);\n if (value === null || typeof value !== 'string') return 0;\n\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? 0 : parsed;\n }\n\n public async getRateLimitTtl(\n identifier: string,\n organizationId?: string,\n ): Promise<number> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const key = this.createTenantKey(`rate_limit:${identifier}`, organizationId);\n const ttl = await this.client.ttl(key);\n return ttl > 0 ? ttl : 0;\n }\n\n /**\n * Create tenant-scoped key with app prefix for ACL isolation.\n *\n * Key format: {appPrefix}{scope}:{key}\n * - appPrefix: canonical app namespace from\n * `wildo.saas.config.dataServices.redis.keyPrefix` (Slice 3.6),\n * surfaced via `REDIS_KEY_PREFIX` env (e.g., `\"wonder-todos:\"`)\n * - scope: \"org:{orgId}\" for org-scoped data, \"global\" for app-global data\n * - key: the actual key name\n *\n * Examples:\n * - \"wonder-todos:org:abc123:cache:users\"\n * - \"wonder-todos:global:session:xyz789\"\n */\n private createTenantKey(key: string, organizationId?: string): string {\n if (organizationId) {\n return `${this.appPrefix}org:${organizationId}:${key}`;\n }\n return `${this.appPrefix}global:${key}`;\n }\n\n /**\n * Setup Redis event handlers\n */\n private setupEventHandlers(client: RedisClientType, clientType: string): void {\n client.on('connect', () => {\n this.logDebug(`Redis ${clientType} client connecting`);\n });\n\n client.on('ready', () => {\n this.logDebug(`Redis ${clientType} client ready`);\n });\n\n client.on('error', (error) => {\n this.logger.error(`Redis ${clientType} client error`, {\n error: error.message\n });\n });\n\n client.on('close', () => {\n this.logger.warn(`Redis ${clientType} client connection closed`);\n });\n\n client.on('reconnecting', () => {\n this.logDebug(`Redis ${clientType} client reconnecting`);\n });\n }\n\n /**\n * Parse value from Redis INFO command output\n */\n private parseInfoValue(info: string, key: string): number {\n const regex = new RegExp(`${key}:(\\\\d+)`);\n const match = info.match(regex);\n return match ? parseInt(match[1]) : 0;\n }\n\n /**\n * Mask sensitive parts of connection string for logging\n */\n private maskConnectionString(url: string): string {\n try {\n const redisUrl = new URL(url);\n if (redisUrl.password) {\n redisUrl.password = '***';\n }\n return redisUrl.toString();\n } catch {\n return url.replace(/:([^@]+)@/, ':***@');\n }\n }\n\n /**\n * Delay utility for connection retries\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../../../../../src/databases/services/redis.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { injectable, inject } from 'inversify';\nimport { createClient, RedisClientType, RedisClientOptions } from 'redis';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError, projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { defaultDatabaseConfig } from '~wildo-backend-lib/databases/models/databases.backend.schemas';\nimport { ErrorType, ErrorCustomMessageReference } from '@wildo-ai/saas-models';\n\nexport interface RedisHealthCheck {\n status: 'healthy' | 'unhealthy' | 'connecting';\n latency?: number;\n error?: string;\n memory: {\n used: number;\n peak: number;\n };\n}\n\nexport interface CacheOptions {\n ttl?: number; // Time to live in seconds\n organizationId?: string; // For multi-tenant caching\n}\n\nexport interface SessionData {\n userId: string;\n organizationId: string;\n role: string;\n permissions: string[];\n loginTime: number;\n lastActivity: number;\n}\n\n/**\n * Redis Service\n *\n * Handles Redis operations for:\n * - Caching (application data, API responses)\n * - Session management\n * - Real-time data storage\n * - Multi-tenant data isolation\n * - Rate limiting data\n */\n@injectable()\nexport class RedisService {\n private client: RedisClientType | null = null;\n private isConnecting: boolean = false;\n private connectionRetries: number = 0;\n private readonly maxRetries: number = 5;\n private readonly retryDelay: number = 3000; // 3 seconds\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n /**\n * Canonical app-level Redis key namespace (Slice 3.6).\n *\n * Sourced from `REDIS_KEY_PREFIX` env (originating from\n * `wildo.saas.config.dataServices.redis.keyPrefix`), surfaced via\n * `appConfigService.config.database.redis.keyPrefix`. Every key the\n * service writes becomes `${appPrefix}org:${orgId}:${key}` or\n * `${appPrefix}global:${key}`.\n *\n * REPLACE semantics: this supersedes the legacy\n * `secrets.database.redis.username`-derived prefix (Slice 3.6 audit\n * decision — single source of truth = `wildo.saas.config.dataServices`).\n * The Redis ACL username remains the auth identity but no longer drives\n * key namespacing.\n *\n * When the app does not author `dataServices.redis.keyPrefix`, the\n * runtime computes `<appSlug>:` as the slug-derived default\n * (ACL-alignment fix, 2026-05-26). The historical literal default\n * `'saas:'` was removed because it was global across every\n * un-authored app and DID NOT align with the per-app ACL grant\n * `~<appSlug>:*` — every Redis op returned `NOPERM` until the\n * schema and the ACL agreed on the slug-derived namespace.\n *\n * ACL invariant (enforced in `connect()`): when an authored value\n * is present, it MUST start with `<appSlug>:` so the ACL grant\n * remains a superset of the keys the backend writes.\n */\n private appPrefix: string = '';\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private configService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) private errorBuilder: ErrorBuilderBackendService\n ) {\n this.logDebug = this.logger.debugByType('RedisService');\n this.logger.setDebugTypeLogging('RedisService', false);\n }\n\n /**\n * Compute the canonical app-level Redis key namespace and validate it\n * against the slug-rooted ACL contract. Run as a connection PRECONDITION\n * (before the retry block) so invalid config fails loud, not silently.\n *\n * Source order (Slice 3.6 + ACL-alignment fix 2026-05-26):\n * 1. `config.database.redis.keyPrefix` — the SaaS app's authored value\n * (from `wildo.saas.config.dataServices.redis.keyPrefix`, threaded\n * via the `REDIS_KEY_PREFIX` env). Empty string is preserved as an\n * explicit no-prefix opt-out (tests / no-prefix workloads).\n * 2. `<appSlug>:` — slug-derived default when unauthored. REPLACES the\n * historical literal `'saas:'` default, which was global across every\n * un-authored app and did NOT match the per-app ACL grant\n * `~<appSlug>:*` (apps-manager scoped the ACL to the slug; the\n * backend wrote `saas:<key>` → every op `NOPERM`).\n *\n * Slice 3 deep-review L-9: sourced from `config.database.redis.keyPrefix`\n * directly (NOT the `{ ...defaults, ...config, ...secrets }` merged blob),\n * so a stray `keyPrefix` in the secrets payload can't shadow the\n * non-secret app config.\n *\n * ACL invariant: an authored `keyPrefix` MUST start with `<appSlug>:` so\n * the `~<appSlug>:*` grant covers every key the backend writes.\n */\n private computeAndValidateAppPrefix(): void {\n const config = this.configService.config;\n const appSlug = this.configService.appSlug;\n const slugDerivedDefault = `${appSlug}:`;\n const authoredKeyPrefix = config.database.redis?.keyPrefix;\n this.appPrefix = authoredKeyPrefix !== undefined\n ? authoredKeyPrefix\n : slugDerivedDefault;\n\n if (this.appPrefix && !this.appPrefix.startsWith(`${appSlug}:`)) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message:\n `dataServices.redis.keyPrefix '${this.appPrefix}' must start with '${appSlug}:' `\n + 'so the per-app ACL grant `~<appSlug>:*` covers it. '\n + `Either omit the field (default '${slugDerivedDefault}' applies) `\n + `or change the authored value to '${slugDerivedDefault}<suffix>'.`,\n authoredKeyPrefix: this.appPrefix,\n appSlug,\n },\n },\n );\n }\n }\n\n /**\n * Connect to Redis\n */\n public async connect(): Promise<RedisClientType> {\n if (this.client && this.client.isReady) {\n return this.client;\n }\n\n if (this.isConnecting) {\n // Wait for existing connection attempt\n return new Promise((resolve, reject) => {\n const checkConnection = () => {\n if (this.client && this.client.isReady) {\n resolve(this.client);\n } else if (!this.isConnecting) {\n reject(new Error('Connection attempt failed'));\n } else {\n setTimeout(checkConnection, 100);\n }\n };\n checkConnection();\n });\n }\n\n this.isConnecting = true;\n\n // Compute + validate the app-level Redis key namespace as a CONFIG\n // PRECONDITION — BEFORE the connection retry block. A keyPrefix that\n // doesn't satisfy the slug-rooted ACL contract is invalid config, not a\n // transient connection failure: it must throw immediately (with its\n // actionable message) and NOT be swallowed by the catch's retry loop.\n // (Once the client connects once and `isReady` flips true, a retry\n // would re-enter connect(), hit the `client.isReady` early-return, and\n // resolve — masking the invalid config.)\n this.computeAndValidateAppPrefix();\n\n try {\n const config = this.configService.config;\n const secrets = this.configService.secrets;\n const redisDefaultConfig = defaultDatabaseConfig.redis;\n\n const redisConfig = {\n ...redisDefaultConfig,\n ...config.database.redis,\n ...secrets.database.redis\n };\n\n if (!redisConfig) {\n const error = this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_INITIALIZATION_FAILED }\n );\n throw error;\n }\n\n const redisUrl = `redis://${redisConfig.host}:${redisConfig.port}`;\n\n this.logDebug('Connecting to Redis', {\n url: this.maskConnectionString(redisUrl)\n });\n\n // Redis options for SaaS multi-tenant architecture\n // Include username for ACL authentication (required when using app-specific credentials)\n const redisOptions: RedisClientOptions = {\n socket: {\n host: redisConfig.host,\n port: redisConfig.port,\n connectTimeout: redisConfig.connectTimeout || 10000,\n // `connect()` already owns a finite five-attempt policy below. If\n // node-redis also reconnects internally, its first promise can stay\n // pending forever and the service-owned retry budget never advances.\n reconnectStrategy: false,\n },\n username: redisConfig.username,\n password: redisConfig.password,\n database: redisConfig.db\n };\n\n this.client = createClient(redisOptions) as RedisClientType;\n\n // Setup event handlers\n this.setupEventHandlers(this.client, 'main');\n\n // Wait for connection to be ready\n await this.client.connect();\n\n // `this.appPrefix` was already computed + validated as a config\n // precondition before the retry block (see\n // `computeAndValidateAppPrefix`). It is intentionally NOT recomputed\n // here: doing so post-connect put the validation inside the retry\n // catch, where — once the client connected and `isReady` flipped true\n // — a retry would hit the `client.isReady` early-return at the top of\n // connect() and resolve, masking an invalid keyPrefix. Config\n // validation belongs before the connection, not after it.\n\n this.connectionRetries = 0;\n this.isConnecting = false;\n\n this.logDebug('Redis connected successfully', {\n isReady: this.client.isReady,\n isOpen: this.client.isOpen,\n appPrefix: this.appPrefix || '(none)'\n });\n\n return this.client;\n\n } catch (error) {\n this.isConnecting = false;\n this.connectionRetries++;\n\n this.logger.error('Redis connection failed', {\n ...projectCaughtErrorLogFields(error),\n retries: this.connectionRetries,\n maxRetries: this.maxRetries\n });\n\n if (this.connectionRetries < this.maxRetries) {\n this.logDebug(`Retrying Redis connection in ${this.retryDelay}ms...`);\n await this.delay(this.retryDelay);\n return await this.connect();\n } else {\n const connectionError = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED,\n context: {\n retries: this.connectionRetries,\n maxRetries: this.maxRetries,\n originalError: describeCaughtError(error)\n }\n }\n );\n throw connectionError;\n }\n }\n }\n\n /**\n * Disconnect from Redis\n */\n public async disconnect(): Promise<void> {\n this.logDebug('Disconnecting from Redis');\n\n if (this.client) {\n await this.client.quit();\n this.client = null;\n }\n\n this.logDebug('Redis disconnected successfully');\n }\n\n /**\n * Get Redis client\n *\n * Returns the client OBJECT, which may exist without being usable — see\n * {@link getReadyClient}, which is what almost every caller actually wants.\n */\n public getClient(): RedisClientType | null {\n return this.client;\n }\n\n /**\n * The Redis client, but only while it can actually serve a command.\n *\n * ## Why this exists as its own accessor\n *\n * `getClient()` answers the client OBJECT. A client that was constructed but never connected — the\n * normal state wherever Redis is not configured — is TRUTHY, so `if (client)` reads as \"Redis is\n * available\" and the next command throws `The client is closed`.\n *\n * That is not hypothetical and it was not one site. Every caller in this package guarded on\n * truthiness alone, so on the dev companion — which logs `Redis not properly configured … using\n * memory adapter` at boot — the WebSocket disconnect handler warned on EVERY socket close, filling\n * the warning channel with a condition nobody can act on (issue #242). The same shape sat in the\n * A2A cancellation service, where each site ALREADY had a considered fallback for a null client and\n * simply never reached it.\n *\n * Returning `null` for a not-ready client means every one of those existing fallbacks — \"cross-pod\n * cancellation is disabled\", \"fail safe toward alive\", \"the lease mechanism is not writable\" — now\n * fires for an unusable client exactly as it does for an absent one, which is what each of them\n * already meant.\n *\n * A caller that genuinely wants the object regardless of state keeps {@link getClient}.\n */\n public getReadyClient(): RedisClientType | null {\n return this.client?.isReady ? this.client : null;\n }\n\n /**\n * Get the canonical app-level Redis key namespace prefix (Slice 3.6\n * + 2026-05-26 ACL-alignment fix).\n *\n * Returns the value of `wildo.saas.config.dataServices.redis.keyPrefix`\n * (e.g., `\"wonder-todos:\"`), surfaced via the `REDIS_KEY_PREFIX` env\n * variable into `config.database.redis.keyPrefix`. When the field is\n * not authored, falls back to `<appSlug>:` (e.g.,\n * `\"wonder-todos:\"` for app `wonder-todos`) — the slug-derived\n * default that aligns with the per-app ACL grant `~<appSlug>:*`.\n *\n * **Slice 3 deep-review L-9 (2026-04-13) — sourcing precedence.** The\n * authoritative source is `config.database.redis.keyPrefix`, NOT the\n * merged `redisConfig.keyPrefix` blob constructed in `connect()`. The\n * connection-options blob spreads `secrets.database.redis` on top of\n * `config.database.redis`, which would let a stray `keyPrefix` in the\n * secrets payload silently shadow the authored config value. The\n * namespace prefix is non-secret authored config, so `connect()`\n * intentionally reads it directly from `config.database.redis?.keyPrefix\n * ?? \\`${configService.appSlug}:\\`` and stores it on `this.appPrefix`\n * before the merged blob is built. Pinned by the L-9 regression test\n * in `redis.service.test.ts`.\n *\n * Used by `WebSocketService` and any other service that must construct\n * Redis keys outside `set/get/del` (e.g., `eval()`, pub/sub channel\n * names, scan patterns) so they share the same namespace as\n * `createTenantKey()`.\n */\n public getAppPrefix(): string {\n return this.appPrefix;\n }\n\n /**\n * Check Redis health\n */\n public async healthCheck(): Promise<RedisHealthCheck> {\n try {\n if (!this.client || !this.client.isReady) {\n return {\n status: 'unhealthy',\n error: 'No active connection',\n memory: { used: 0, peak: 0 }\n };\n }\n\n const startTime = Date.now();\n\n // Perform ping operation\n await this.client.ping();\n\n const latency = Date.now() - startTime;\n\n // Get memory info\n const info = await this.client.info('memory');\n const memoryUsed = this.parseInfoValue(info, 'used_memory');\n const memoryPeak = this.parseInfoValue(info, 'used_memory_peak');\n\n return {\n status: 'healthy',\n latency,\n memory: {\n used: memoryUsed,\n peak: memoryPeak\n }\n };\n\n } catch (error) {\n this.logger.error('Redis health check failed', {\n ...projectCaughtErrorLogFields(error)\n });\n\n return {\n status: 'unhealthy',\n error: describeCaughtError(error),\n memory: { used: 0, peak: 0 }\n };\n }\n }\n\n /**\n * Cache operations with multi-tenant support\n */\n public async set(\n key: string,\n value: any,\n options: CacheOptions = {}\n ): Promise<void> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const tenantKey = this.createTenantKey(key, options.organizationId);\n const serializedValue = JSON.stringify(value);\n\n if (options.ttl) {\n await this.client.setEx(tenantKey, options.ttl, serializedValue);\n } else {\n await this.client.set(tenantKey, serializedValue);\n }\n\n this.logDebug('Cache set', { key: tenantKey, ttl: options.ttl });\n }\n\n public async get<T = any>(\n key: string,\n organizationId?: string\n ): Promise<T | null> {\n if (!this.client) {\n return null;\n }\n\n const tenantKey = this.createTenantKey(key, organizationId);\n const value = await this.client.get(tenantKey);\n\n if (value === null) {\n return null;\n }\n\n try {\n return JSON.parse(value as string) as T;\n } catch (error) {\n this.logger.error('Failed to parse cached value', {\n key: tenantKey,\n ...projectCaughtErrorLogFields(error)\n });\n return null;\n }\n }\n\n /**\n * Atomically read a value and delete it in one round-trip (Redis native\n * `GETDEL`, available since Redis 6.2).\n *\n * Symmetric with {@link set} / {@link get}: applies the SAME multi-tenant\n * key scoping AND the SAME `JSON.parse` deserialization, so a value written\n * with `set()` round-trips correctly. Reach for this on single-use tokens —\n * WebAuthn challenges, one-time codes — where the read must consume the\n * value atomically (no get-then-del race, no replay of a still-present\n * token).\n *\n * Do NOT hand-roll this with `eval()` + a raw `GET`/`DEL` Lua script: the\n * raw `eval` path returns the stored bytes verbatim and bypasses the\n * `JSON.parse` that `set()`'s `JSON.stringify` requires, so the caller gets\n * a value wrapped in literal quote characters (`\"\\\"abc\\\"\"` instead of\n * `abc`). That asymmetry silently broke passkey enrollment until this\n * method centralized the contract.\n *\n * Returns `null` if the key is absent (or the stored value can't be parsed).\n */\n public async getDel<T = any>(\n key: string,\n organizationId?: string\n ): Promise<T | null> {\n if (!this.client) {\n return null;\n }\n\n const tenantKey = this.createTenantKey(key, organizationId);\n const value = await this.client.getDel(tenantKey);\n\n if (value === null) {\n return null;\n }\n\n try {\n return JSON.parse(value as string) as T;\n } catch (error) {\n this.logger.error('Failed to parse cached value', {\n key: tenantKey,\n ...projectCaughtErrorLogFields(error)\n });\n return null;\n }\n }\n\n public async del(key: string, organizationId?: string): Promise<void> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const tenantKey = this.createTenantKey(key, organizationId);\n await this.client.del(tenantKey);\n\n this.logDebug('Cache deleted', { key: tenantKey });\n }\n\n public async exists(key: string, organizationId?: string): Promise<boolean> {\n if (!this.client) {\n return false;\n }\n\n const tenantKey = this.createTenantKey(key, organizationId);\n const result = await this.client.exists(tenantKey);\n return result === 1;\n }\n\n /**\n * Session management\n */\n public async setSession(\n sessionId: string,\n sessionData: SessionData,\n ttl: number = 86400\n ): Promise<void> {\n const key = `session:${sessionId}`;\n await this.set(key, sessionData, { ttl });\n }\n\n public async getSession(sessionId: string): Promise<SessionData | null> {\n const key = `session:${sessionId}`;\n return await this.get<SessionData>(key);\n }\n\n public async deleteSession(sessionId: string): Promise<void> {\n const key = `session:${sessionId}`;\n await this.del(key);\n }\n\n public async updateSessionActivity(sessionId: string): Promise<void> {\n const session = await this.getSession(sessionId);\n if (session) {\n session.lastActivity = Date.now();\n await this.setSession(sessionId, session);\n }\n }\n\n /**\n * Build a fully-qualified Redis key with app prefix and tenant scope.\n * Use this when constructing keys for `eval()` Lua scripts so they match\n * the keys produced by `set()`/`get()`/`del()`.\n */\n public buildKey(key: string, organizationId?: string): string {\n return this.createTenantKey(key, organizationId);\n }\n\n /**\n * Execute a Lua script atomically on the Redis server.\n * Used for atomic read-modify-write operations (e.g., session updates with version checks).\n *\n * IMPORTANT: Keys passed here must be fully-qualified (use `buildKey()` to construct them).\n * Unlike `set()`/`get()`, this method does NOT apply `createTenantKey()` automatically.\n */\n public async eval(script: string, keys: string[], args: string[]): Promise<any> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n return this.client.eval(script, { keys, arguments: args });\n }\n\n /**\n * Rate limiting support\n */\n public async incrementRateLimit(\n identifier: string,\n windowSeconds: number,\n organizationId?: string\n ): Promise<number> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const key = this.createTenantKey(`rate_limit:${identifier}`, organizationId);\n\n const current = await this.client.eval(\n `\n local current = redis.call('INCR', KEYS[1])\n local ttl = redis.call('TTL', KEYS[1])\n if ttl < 0 then\n redis.call('EXPIRE', KEYS[1], tonumber(ARGV[1]))\n end\n return current\n `,\n {\n keys: [key],\n arguments: [String(windowSeconds)],\n },\n );\n return typeof current === 'number' ? current : Number(current);\n }\n\n /**\n * Get the current rate limit count for a given identifier without incrementing.\n * Uses the same key format as incrementRateLimit() — callers should NOT manually\n * prepend \"rate_limit:\" since this method does it internally.\n */\n public async getRateLimitCount(\n identifier: string,\n organizationId?: string,\n ): Promise<number> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const key = this.createTenantKey(`rate_limit:${identifier}`, organizationId);\n const value = await this.client.get(key);\n if (value === null || typeof value !== 'string') return 0;\n\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? 0 : parsed;\n }\n\n public async getRateLimitTtl(\n identifier: string,\n organizationId?: string,\n ): Promise<number> {\n if (!this.client) {\n const error = this.errorBuilder.buildError(\n ErrorType.DATABASE,\n undefined,\n { customMessageReference: ErrorCustomMessageReference.REDIS_CONNECTION_FAILED }\n );\n throw error;\n }\n\n const key = this.createTenantKey(`rate_limit:${identifier}`, organizationId);\n const ttl = await this.client.ttl(key);\n return ttl > 0 ? ttl : 0;\n }\n\n /**\n * Create tenant-scoped key with app prefix for ACL isolation.\n *\n * Key format: {appPrefix}{scope}:{key}\n * - appPrefix: canonical app namespace from\n * `wildo.saas.config.dataServices.redis.keyPrefix` (Slice 3.6),\n * surfaced via `REDIS_KEY_PREFIX` env (e.g., `\"wonder-todos:\"`)\n * - scope: \"org:{orgId}\" for org-scoped data, \"global\" for app-global data\n * - key: the actual key name\n *\n * Examples:\n * - \"wonder-todos:org:abc123:cache:users\"\n * - \"wonder-todos:global:session:xyz789\"\n */\n private createTenantKey(key: string, organizationId?: string): string {\n if (organizationId) {\n return `${this.appPrefix}org:${organizationId}:${key}`;\n }\n return `${this.appPrefix}global:${key}`;\n }\n\n /**\n * Setup Redis event handlers\n */\n private setupEventHandlers(client: RedisClientType, clientType: string): void {\n client.on('connect', () => {\n this.logDebug(`Redis ${clientType} client connecting`);\n });\n\n client.on('ready', () => {\n this.logDebug(`Redis ${clientType} client ready`);\n });\n\n client.on('error', (error) => {\n this.logger.error(`Redis ${clientType} client error`, {\n error: error.message\n });\n });\n\n client.on('close', () => {\n this.logger.warn(`Redis ${clientType} client connection closed`);\n });\n\n client.on('reconnecting', () => {\n this.logDebug(`Redis ${clientType} client reconnecting`);\n });\n }\n\n /**\n * Parse value from Redis INFO command output\n */\n private parseInfoValue(info: string, key: string): number {\n const regex = new RegExp(`${key}:(\\\\d+)`);\n const match = info.match(regex);\n return match ? parseInt(match[1]) : 0;\n }\n\n /**\n * Mask sensitive parts of connection string for logging\n */\n private maskConnectionString(url: string): string {\n try {\n const redisUrl = new URL(url);\n if (redisUrl.password) {\n redisUrl.password = '***';\n }\n return redisUrl.toString();\n } catch {\n return url.replace(/:([^@]+)@/, ':***@');\n }\n }\n\n /**\n * Delay utility for connection retries\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"]}
|
|
@@ -46,7 +46,18 @@ export declare class ErrorBuilderBackendService {
|
|
|
46
46
|
*/
|
|
47
47
|
private extractFieldLevelValidationDetail;
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
49
|
+
* @wildo_source:part:start saas.backend.error-builder.user-guidance facet:layer:backend facet:audience:app-developer
|
|
50
|
+
*
|
|
51
|
+
* Build an error with contextual user guidance.
|
|
52
|
+
*
|
|
53
|
+
* Reach for this instead of a bare `buildError` whenever the person who hits the failure could DO
|
|
54
|
+
* something about it. A typed error tells a caller what went wrong; guidance tells a human what to
|
|
55
|
+
* do next, and the frontend renders it from `ErrorResponse.error.userGuidance`.
|
|
56
|
+
*
|
|
57
|
+
* ⚠️ **Prefer `buildErrorWithGuidanceKey`.** The strings you pass here are rendered verbatim, so a
|
|
58
|
+
* guidance written this way is English forever — the key variant resolves labels under
|
|
59
|
+
* `errors_guidance.{guidanceKey}.{field}` and is translated like every other user-facing string.
|
|
60
|
+
* Use the raw form only for a failure no user will read, or as the fallback beneath a key.
|
|
50
61
|
*
|
|
51
62
|
* The guidance is attached to the error and will be included in the
|
|
52
63
|
* `ErrorResponse.error.userGuidance` field for the frontend to render.
|
|
@@ -88,6 +99,7 @@ export declare class ErrorBuilderBackendService {
|
|
|
88
99
|
context?: Record<string, any>;
|
|
89
100
|
stack?: string;
|
|
90
101
|
}): WildoError_Backend;
|
|
102
|
+
/** @wildo_source:part:end saas.backend.error-builder.user-guidance */
|
|
91
103
|
wildoErrorToSimpleString(wildoError: any): string;
|
|
92
104
|
/**
|
|
93
105
|
* Sanitize an error for client-facing HTTP responses.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-builder.backend.service.d.ts","sourceRoot":"","sources":["../../../../../src/errors/services/error-builder.backend.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,kBAAkB,EAElB,kBAAkB,EAClB,2BAA2B,EAM3B,iBAAiB,EAElB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;AAGvG,OAAO,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAI7F;;;GAGG;AACH,qBACa,0BAA0B;IAKA,OAAO,CAAC,MAAM;IAJnD,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;gBAIpC,MAAM,EAAE,aAAa;IAMlE;;OAEG;IACI,UAAU,CACf,SAAS,EAAE,SAAS,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,EACxC,OAAO,GAAE;QACP,sBAAsB,CAAC,EAAE,2BAA2B,CAAC;QACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,sBAAsB,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;KACnD,GACL,kBAAkB;IAkDd,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,OAAO,GAAE;QAC/F,sBAAsB,CAAC,EAAE,2BAA2B,CAAC;QACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,sBAAsB,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;KACnD,GAAG,kBAAkB;IAsE3B;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,iCAAiC;IA6CzC
|
|
1
|
+
{"version":3,"file":"error-builder.backend.service.d.ts","sourceRoot":"","sources":["../../../../../src/errors/services/error-builder.backend.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,kBAAkB,EAElB,kBAAkB,EAClB,2BAA2B,EAM3B,iBAAiB,EAElB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;AAGvG,OAAO,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAI7F;;;GAGG;AACH,qBACa,0BAA0B;IAKA,OAAO,CAAC,MAAM;IAJnD,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;gBAIpC,MAAM,EAAE,aAAa;IAMlE;;OAEG;IACI,UAAU,CACf,SAAS,EAAE,SAAS,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,EACxC,OAAO,GAAE;QACP,sBAAsB,CAAC,EAAE,2BAA2B,CAAC;QACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,sBAAsB,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;KACnD,GACL,kBAAkB;IAkDd,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,OAAO,GAAE;QAC/F,sBAAsB,CAAC,EAAE,2BAA2B,CAAC;QACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,sBAAsB,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;KACnD,GAAG,kBAAkB;IAsE3B;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,iCAAiC;IA6CzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACI,sBAAsB,CAC3B,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,SAAS,EACnD,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE;QACP,sBAAsB,CAAC,EAAE,2BAA2B,CAAC;QACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GACL,kBAAkB;IAMrB;;;;;;;;;;;OAWG;IACI,yBAAyB,CAC9B,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,SAAS,EACnD,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAM,EACrD,OAAO,GAAE;QACP,sBAAsB,CAAC,EAAE,2BAA2B,CAAC;QACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GACL,kBAAkB;IAGrB,sEAAsE;IAE/D,wBAAwB,CAAC,UAAU,EAAE,GAAG,GAAG,MAAM;IAcxD;;;;;;;;OAQG;IACI,sBAAsB,CAAC,UAAU,EAAE,kBAAkB,GAAG,kBAAkB;YA2FnE,qBAAqB;IA4CnC;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;;OAGG;IACI,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS;CA+EnD"}
|
|
@@ -190,7 +190,18 @@ let ErrorBuilderBackendService = class ErrorBuilderBackendService {
|
|
|
190
190
|
return undefined;
|
|
191
191
|
}
|
|
192
192
|
/**
|
|
193
|
-
*
|
|
193
|
+
* @wildo_source:part:start saas.backend.error-builder.user-guidance facet:layer:backend facet:audience:app-developer
|
|
194
|
+
*
|
|
195
|
+
* Build an error with contextual user guidance.
|
|
196
|
+
*
|
|
197
|
+
* Reach for this instead of a bare `buildError` whenever the person who hits the failure could DO
|
|
198
|
+
* something about it. A typed error tells a caller what went wrong; guidance tells a human what to
|
|
199
|
+
* do next, and the frontend renders it from `ErrorResponse.error.userGuidance`.
|
|
200
|
+
*
|
|
201
|
+
* ⚠️ **Prefer `buildErrorWithGuidanceKey`.** The strings you pass here are rendered verbatim, so a
|
|
202
|
+
* guidance written this way is English forever — the key variant resolves labels under
|
|
203
|
+
* `errors_guidance.{guidanceKey}.{field}` and is translated like every other user-facing string.
|
|
204
|
+
* Use the raw form only for a failure no user will read, or as the fallback beneath a key.
|
|
194
205
|
*
|
|
195
206
|
* The guidance is attached to the error and will be included in the
|
|
196
207
|
* `ErrorResponse.error.userGuidance` field for the frontend to render.
|
|
@@ -230,6 +241,7 @@ let ErrorBuilderBackendService = class ErrorBuilderBackendService {
|
|
|
230
241
|
buildErrorWithGuidanceKey(errorType, executionContext, guidanceKey, guidance = {}, options = {}) {
|
|
231
242
|
return this.buildErrorWithGuidance(errorType, executionContext, { ...guidance, guidanceKey }, options);
|
|
232
243
|
}
|
|
244
|
+
/** @wildo_source:part:end saas.backend.error-builder.user-guidance */
|
|
233
245
|
wildoErrorToSimpleString(wildoError) {
|
|
234
246
|
const isWildoError = wildoError && typeof wildoError === 'object' && 'statusCode' in wildoError && 'backendActions' in wildoError;
|
|
235
247
|
if (!isWildoError) {
|