@wildo-ai/saas-backend-lib 1.1.2 → 1.1.4
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/__tests__/fixture-deep-partial.d.ts.map +1 -1
- package/dist/esm/__tests__/integration/redis-integration-gate.d.ts.map +1 -1
- package/dist/esm/__tests__/setup.d.ts.map +1 -1
- package/dist/esm/__tests__/test-container.d.ts.map +1 -1
- package/dist/esm/applications/models/applications.backend.schemas.d.ts.map +1 -1
- package/dist/esm/applications/seeds/application-metadata-defaults.seeds.d.ts.map +1 -1
- 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/models/repositories.backend.schemas.d.ts.map +1 -1
- package/dist/esm/base-classes/services/__tests__/mock-resource-operation-helper.service.d.ts +1 -1
- package/dist/esm/base-classes/services/__tests__/mock-resource-operation-helper.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/batches/batches-cronjobs-custom-execution.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/batches/batches-cronjobs-executor.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/batches/batches-cronjobs-resource-execution.backend.service.d.ts.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 +210 -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/batches/resource-retention-sweep.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/batches/suspension-reactivation-sweep.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/abstract-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +27 -6
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/utils/audit-access-fields.backend.utils.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/utils/operation-response-serializer.backend.utils.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/validate-field-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/__tests__/method-span-scan.guard-helpers.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/__tests__/mock-repositories-registry-handler.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-filter-translation.backend.d.ts.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 +220 -25
- 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-query.backend.d.ts.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 +191 -26
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +47 -4
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +96 -29
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-row-projection.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-subject-erasure-effect.backend.d.ts.map +1 -1
- 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/odoo-jsonrpc-compiler.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/rest-json-query-compiler.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +9 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts.map +1 -1
- 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/postgresql-resource-repository.backend.service.d.ts +106 -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 +266 -20
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +23 -3
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-guarded-mutation.backend.types.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts +5 -2
- 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 +34 -3
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-version-metadata.backend.utils.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/resource-write-integrity.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/seed-row-default-materialization.backend.d.ts +72 -0
- package/dist/esm/base-classes/services/repositories/seed-row-default-materialization.backend.d.ts.map +1 -0
- package/dist/esm/base-classes/services/repositories/seed-row-default-materialization.backend.js +88 -0
- package/dist/esm/base-classes/services/repositories/seed-row-default-materialization.backend.js.map +1 -0
- package/dist/esm/base-classes/services/repositories/unique-constraint-conflict-reference.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/resource-operations-helper.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/__tests__/mock-services-registry-handler.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/__tests__/mock-system-access.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/read-only-field-change.backend.utils.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-audit-emission.backend.utils.d.ts.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-custom-implementation-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation.factory.backend.d.ts.map +1 -1
- 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-server-injected-fields.backend.utils.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-transaction-persistence.backend.utils.d.ts.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 +571 -45
- 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/base-classes/utils/backend-type-utils.d.ts.map +1 -1
- package/dist/esm/base-classes/utils/single-subject-addressing.backend.utils.d.ts.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/abstract-billing.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/billing-feature-sync.backend.service.d.ts.map +1 -1
- 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 +475 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
- package/dist/esm/billing/services/back-office/billing-state.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/billing-state.backend.service.js +11 -1
- package/dist/esm/billing/services/back-office/billing-state.backend.service.js.map +1 -1
- package/dist/esm/billing/services/back-office/billing-subject-erasure-effect.backend.d.ts.map +1 -1
- 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/billing.utils.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +48 -7
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +70 -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 +98 -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/credit-pool.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.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 +21 -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 +109 -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-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/webhooks/billing-webhook-capability-handler.backend.service.d.ts.map +1 -1
- 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 +310 -29
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
- package/dist/esm/billing/testing/billing-test-fixtures.d.ts.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/charts/controllers/chart.backend.controller.d.ts.map +1 -1
- package/dist/esm/charts/services/chart-registry.backend.service.d.ts +80 -7
- package/dist/esm/charts/services/chart-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/charts/services/chart-registry.backend.service.js +115 -8
- package/dist/esm/charts/services/chart-registry.backend.service.js.map +1 -1
- package/dist/esm/companion-exports.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-logs.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.d.ts.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/batches/immudb-audit-reconcile.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/batches/siem-webhook-delivery.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/__tests__/mock-audit-logs.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +225 -13
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +340 -62
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +350 -10
- 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 +562 -10
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +6 -2
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +31 -9
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +57 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +52 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-class-mapping.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/siem-dictionary.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/siem-ocsf-projection.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/siem-projection-contract.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/utils/audit-actor.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/utils/layer2-audit-provider-boot-diagnostic.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/index.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/retention-hide-predicate.backend.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/services/subject-erasure-external-effects.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/services/subject-session-revocation.backend.service.d.ts.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/bootstrap/minion-initialization-projection.backend.d.ts.map +1 -1
- package/dist/esm/config/bootstrap/runtime-principal-attestation.backend.service.d.ts.map +1 -1
- package/dist/esm/config/bootstrap/runtime-principal-attestation.backend.service.js +3 -0
- package/dist/esm/config/bootstrap/runtime-principal-attestation.backend.service.js.map +1 -1
- package/dist/esm/config/bootstrap/runtime-principal.backend.service.d.ts.map +1 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/config/models/app-config-secrets.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/app-config.backend-authored.definitions.d.ts.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.d.ts +145 -49
- 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/app-env-config.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/apps-manager-transport.backend.definitions.d.ts +36 -0
- package/dist/esm/config/models/apps-manager-transport.backend.definitions.d.ts.map +1 -0
- package/dist/esm/config/models/apps-manager-transport.backend.definitions.js +36 -0
- package/dist/esm/config/models/apps-manager-transport.backend.definitions.js.map +1 -0
- package/dist/esm/config/models/config-mutation-boundary.utils.d.ts.map +1 -1
- package/dist/esm/config/models/postgresql-env-config.backend.schemas.d.ts.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/models/runtime-topology.backend.contracts.d.ts.map +1 -1
- package/dist/esm/config/services/__tests__/mock-app-configuration.service.d.ts.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 +71 -76
- package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
- package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts +33 -0
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.js +39 -1
- package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +37 -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 +69 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
- package/dist/esm/data-seeding/batches/data-seeding-run-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/batches/data-seeding-scheduled-rerun.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/controllers/data-seeding-admin.backend.contracts.d.ts.map +1 -1
- package/dist/esm/data-seeding/controllers/data-seeding-admin.backend.controller.d.ts.map +1 -1
- package/dist/esm/data-seeding/data-seeding-models.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/business-key-resolver.shared.utils.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/data-seed-execution-context.shared.types.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/data-seed-migrator-runner.shared.utils.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/data-seed-reconciler.shared.utils.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/data-seed-row-metadata.shared.schemas.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/data-seed-row-metadata.shared.utils.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/data-seed-run.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/data-seed-run.shared.schemas.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/data-seed-trigger-mode-matrix.shared.utils.d.ts.map +1 -1
- package/dist/esm/data-seeding/models/data-seed.shared.schemas.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/data-seed-application-bootstrap.backend.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/data-seed-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/data-seed-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/data-seed-scope-resolver-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/engines/additive-seed-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/engines/lazy-seed-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/engines/manual-seed-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/engines/sync-seed-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/engines/upgrade-seed-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-business-key.shared.utils.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-error.shared.utils.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-run-counters.shared.types.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-run-ledger.backend.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-scope-anchor.shared.types.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.d.ts.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-scope-resolution.backend.d.ts.map +1 -1
- package/dist/esm/databases/models/aggregation.backend.schemas.d.ts.map +1 -1
- package/dist/esm/databases/models/databases.backend.schemas.d.ts.map +1 -1
- package/dist/esm/databases/models/filter.backend.schemas.d.ts.map +1 -1
- package/dist/esm/databases/models/resolve-persistence-adapter.backend.utils.d.ts.map +1 -1
- package/dist/esm/databases/models/sql.backend.schemas.d.ts.map +1 -1
- package/dist/esm/databases/models/transaction.shared.schemas.d.ts.map +1 -1
- package/dist/esm/databases/services/__tests__/mock-mongo-transaction-registry.service.d.ts.map +1 -1
- package/dist/esm/databases/services/__tests__/mock-mongodb.service.d.ts.map +1 -1
- package/dist/esm/databases/services/__tests__/mock-mongoose-model.service.d.ts.map +1 -1
- package/dist/esm/databases/services/__tests__/mock-redis.service.d.ts.map +1 -1
- package/dist/esm/databases/services/__tests__/mock-zod-mongoose-schema-convertor.service.d.ts.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-query.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/aggregation/computed-measure-evaluator.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/aggregation/field-access-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/aggregation/time-series-densifier.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/aggregation/topn-processor.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/aggregation/window-function-processor.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/db-utils.d.ts.map +1 -1
- package/dist/esm/databases/services/mongo-aggregation.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/mongodb.service.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-aggregation.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-database.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-development-provisioning.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-filter.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-migration-runner.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-ddl.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-migration-sql.backend.d.ts.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/postgresql-schema-plan-lockfile.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/redis.service.d.ts.map +1 -1
- package/dist/esm/databases/services/resource-persistence-unit-of-work.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/schema-planning-standalone.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/zod-to-mongoose-schema-convertor.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/zod-to-sql-hybrid-schema.planner.d.ts.map +1 -1
- package/dist/esm/databases/utils/postgresql-identifier.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/services/__tests__/mock-error-builder.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
- package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.js +129 -8
- package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
- package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
- package/dist/esm/external-data/batches/external-data-pipeline-scheduled-run.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts.map +1 -1
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-extraction-source.backend.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-models.exports.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +59 -2
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +52 -17
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
- package/dist/esm/external-data/external-data-transform.backend.d.ts.map +1 -1
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/models/external-providers.backend.schemas.d.ts.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 +306 -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 +379 -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 +235 -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 +81 -34
- 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 +181 -100
- 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-api-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +413 -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 +684 -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 +15 -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 +84 -5
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
- package/dist/esm/features/controllers/features.backend.controller.d.ts.map +1 -1
- package/dist/esm/features/services/__tests__/mock-feature-definition-registry.service.d.ts.map +1 -1
- package/dist/esm/features/services/__tests__/mock-feature-resolution.service.d.ts.map +1 -1
- package/dist/esm/features/services/application-features-admin-write-path.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/features/services/feature-definition-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/features/services/feature-gate.backend.service.d.ts.map +1 -1
- package/dist/esm/features/services/feature-resolution.backend.service.d.ts.map +1 -1
- package/dist/esm/features/services/organization-features-admin-write-path.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/features/services/scope-feature-ledger-relationship.backend.utils.d.ts.map +1 -1
- package/dist/esm/features/services/scope-features-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/features/testing/feature-test-utils.d.ts.map +1 -1
- package/dist/esm/files/batches/files-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/files/constraints/file-analyzers.types.d.ts.map +1 -1
- package/dist/esm/files/constraints/file-constraint-resolver-chain.backend.service.d.ts.map +1 -1
- package/dist/esm/files/constraints/file-constraint.types.d.ts.map +1 -1
- package/dist/esm/files/constraints/file-validation.backend.service.d.ts.map +1 -1
- package/dist/esm/files/constraints/resource-field-constraint-resolver.backend.service.d.ts.map +1 -1
- package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
- package/dist/esm/files/controllers/file.controller.js +21 -13
- package/dist/esm/files/controllers/file.controller.js.map +1 -1
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts.map +1 -1
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js.map +1 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts +37 -0
- 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 +260 -36
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
- package/dist/esm/files/scanning/clamav-scanner.backend.service.d.ts.map +1 -1
- package/dist/esm/files/scanning/file-scan.types.d.ts.map +1 -1
- package/dist/esm/files/scanning/yara-scanner.backend.service.d.ts.map +1 -1
- package/dist/esm/files/scanning/yara-scanner.backend.service.js +20 -2
- package/dist/esm/files/scanning/yara-scanner.backend.service.js.map +1 -1
- package/dist/esm/files/services/__tests__/mock-file-field-detection.service.d.ts.map +1 -1
- package/dist/esm/files/services/__tests__/mock-file-operation-handler.service.d.ts.map +1 -1
- package/dist/esm/files/services/__tests__/mock-file-repository.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-field-detection.backend.service.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/esm/files/services/file-population.backend.service.d.ts.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 +202 -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 +175 -13
- package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +53 -2
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-upload-grant.backend.service.js +127 -3
- package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -1
- package/dist/esm/files/services/files.backend.service.d.ts +68 -0
- package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/files.backend.service.js +177 -5
- package/dist/esm/files/services/files.backend.service.js.map +1 -1
- package/dist/esm/files/services/rag-source-field-detection.backend.service.d.ts.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-path-resolver.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/file-storage-provider.types.d.ts +52 -11
- 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/file-storage-router.backend.service.d.ts +21 -3
- package/dist/esm/files/storage/file-storage-router.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/file-storage-router.backend.service.js +38 -5
- package/dist/esm/files/storage/file-storage-router.backend.service.js.map +1 -1
- package/dist/esm/files/storage/google-drive-storage-provider.backend.service.d.ts +87 -0
- package/dist/esm/files/storage/google-drive-storage-provider.backend.service.d.ts.map +1 -0
- package/dist/esm/files/storage/google-drive-storage-provider.backend.service.js +340 -0
- package/dist/esm/files/storage/google-drive-storage-provider.backend.service.js.map +1 -0
- 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/storage-credential-provider.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/storage/storage-platform-sts-credential-resolver.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/storage/storage-sts-credential-resolver.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/storage/storage-sts-credential-resolver.backend.utils.js +10 -3
- package/dist/esm/files/storage/storage-sts-credential-resolver.backend.utils.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-upload.utils.d.ts.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.map +1 -1
- package/dist/esm/files/utils/file-validation.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/image-derivation.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/image-thumbnail.backend.utils.d.ts.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/files/utils/rag-source-field-schema-path.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/storage-application-identity.backend.utils.d.ts.map +1 -1
- 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/batches/a2a-push-delivery.batch.backend.service.d.ts.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-dialect.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a-push-notification-delivery.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a-push-notification.backend.schemas.d.ts.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-push-delivery-log.repository.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-push-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +196 -40
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/controllers/flows-actors.controller.d.ts.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/agent-facets.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/agents.backend.definitions.d.ts.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.definitions.d.ts.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 +179 -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 +436 -34
- 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/__tests__/fixtures/meta-workflow-evaluation-treatment.test-fixture.d.ts.map +1 -1
- 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/agent-call-trace-sink.backend.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/agent-facets.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts +132 -6
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.js +467 -49
- package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/context-curation.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +50 -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 +270 -20
- 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 +371 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
- package/dist/esm/flows-actors/services/mcp-credential-resolver.backend.service.d.ts +99 -0
- package/dist/esm/flows-actors/services/mcp-credential-resolver.backend.service.d.ts.map +1 -0
- package/dist/esm/flows-actors/services/mcp-credential-resolver.backend.service.js +155 -0
- package/dist/esm/flows-actors/services/mcp-credential-resolver.backend.service.js.map +1 -0
- package/dist/esm/flows-actors/services/meta-workflow-evaluation-treatment-compiler.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/meta-workflow-standard-action-contracts.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/meta-workflow-standard-evaluation-contracts.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/meta-workflow-structured-artifact-action-compiler.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +17 -4
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/bounded-subprocess.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/flows-actors-frontend-extractor.utils.d.ts.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/flows-actors/utils/prompt-ir-adapters.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/tool-approval-modification.backend.utils.d.ts +77 -0
- package/dist/esm/flows-actors/utils/tool-approval-modification.backend.utils.d.ts.map +1 -0
- package/dist/esm/flows-actors/utils/tool-approval-modification.backend.utils.js +164 -0
- package/dist/esm/flows-actors/utils/tool-approval-modification.backend.utils.js.map +1 -0
- package/dist/esm/flows-actors/utils/tool-approval-signing.backend.utils.d.ts +48 -0
- package/dist/esm/flows-actors/utils/tool-approval-signing.backend.utils.d.ts.map +1 -0
- package/dist/esm/flows-actors/utils/tool-approval-signing.backend.utils.js +101 -0
- package/dist/esm/flows-actors/utils/tool-approval-signing.backend.utils.js.map +1 -0
- package/dist/esm/guidance/batches/dormancy-detection.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/guidance/services/guidance-trigger-evaluator.backend.service.d.ts.map +1 -1
- package/dist/esm/guidance/services/lifecycle-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/guidance/services/lifecycle-evaluator.backend.service.d.ts.map +1 -1
- package/dist/esm/guidance/services/lifecycle-scope-id.backend.utils.d.ts.map +1 -1
- package/dist/esm/guidance/services/milestone-condition-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/guidance/services/milestone-definition-registry.backend.service.d.ts.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/guidance/services/scoped-state-read-custom-implementations.backend.d.ts.map +1 -1
- 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/i18n/services/i18n.backend.service.d.ts.map +1 -1
- package/dist/esm/index.d.ts +11 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +31 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/inject/models/container.d.ts +10 -0
- package/dist/esm/inject/models/container.d.ts.map +1 -1
- package/dist/esm/inject/models/container.js +126 -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 +22 -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 +70 -3
- package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
- package/dist/esm/mcp/models/mcp-protocol.backend.schemas.d.ts.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.js.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +56 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.js +107 -11
- package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +22 -0
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
- package/dist/esm/mcp/services/resource-server-instances-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/utils/zod-to-mcp-json-schema.backend.utils.d.ts.map +1 -1
- package/dist/esm/meta-workflow-runtime.exports.d.ts.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/__tests__/mock-logger.service.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.d.ts +24 -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/logger/utils/log-value-normalization.backend.utils.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +313 -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 +389 -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/otel-preload.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/otel-sdk-global-handle.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/services/__tests__/mock-metrics.service.d.ts.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/monitoring/observability/services/observability.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/components/email-components.d.ts.map +1 -1
- package/dist/esm/notifications/email/models/email-template-definition.d.ts.map +1 -1
- package/dist/esm/notifications/email/models/email-transport.backend.definitions.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-batch-send.batch.backend.service.d.ts.map +1 -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-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 +102 -5
- package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.js +222 -70
- 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/email/utils/interpolate-email-label.utils.d.ts.map +1 -1
- package/dist/esm/notifications/email/utils/zod-to-typescript.utils.d.ts.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
- package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +99 -13
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +422 -66
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/notifications/sms/models/sms-transport.backend.definitions.d.ts +32 -0
- package/dist/esm/notifications/sms/models/sms-transport.backend.definitions.d.ts.map +1 -0
- package/dist/esm/notifications/sms/models/sms-transport.backend.definitions.js +32 -0
- package/dist/esm/notifications/sms/models/sms-transport.backend.definitions.js.map +1 -0
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +64 -10
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.js +277 -82
- package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +46 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +16 -6
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/m2m-webhook-delivery-log.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/m2m-webhook-delivery-log.repository.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/m2m-webhook-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-public-key.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +12 -12
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/services/polymorphic-lookup.backend.service.d.ts.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-member-invitation-sweep.batch.backend.service.d.ts.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.d.ts.map +1 -1
- 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/authority-change-audit.backend.utils.d.ts.map +1 -1
- package/dist/esm/organizations/services/invitation-acceptance.backend.utils.d.ts.map +1 -1
- package/dist/esm/organizations/services/org-creation-on-registration.backend.utils.d.ts.map +1 -1
- package/dist/esm/organizations/services/org-member-roles-validation.backend.utils.d.ts.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-deletion-audit.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-member-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-onboarding-operation.backend.utils.d.ts.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-member-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/scim-provisioning-gate.backend.utils.d.ts.map +1 -1
- package/dist/esm/organizations/services/user-org-type-grant.backend.utils.d.ts.map +1 -1
- package/dist/esm/organizations/services/user-type-revocation-on-org-leave.backend.utils.d.ts.map +1 -1
- package/dist/esm/pdf-templates/__tests__/fixtures/tiny-pdf-template.fixture.d.ts.map +1 -1
- package/dist/esm/pdf-templates/models/pdf-template-binding.d.ts.map +1 -1
- package/dist/esm/pdf-templates/models/pdf-template-definition.d.ts.map +1 -1
- package/dist/esm/pdf-templates/services/pdf-generated-file-writer.backend.service.d.ts.map +1 -1
- package/dist/esm/pdf-templates/services/pdf-generation-orchestrator.backend.service.d.ts.map +1 -1
- package/dist/esm/pdf-templates/services/pdf-renderer.backend.service.d.ts.map +1 -1
- package/dist/esm/pdf-templates/services/pdf-template-binding.backend.service.d.ts.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/apps-crontabs-manager.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/cron-job-sync.backend.service.d.ts.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-completion-registry.backend.service.d.ts.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/job-payload-storage.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-status-tracking.backend.service.d.ts.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/scheduled-message-verifier.backend.service.d.ts.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/batches/rag-embedding-drain.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/rag/batches/rag-reconciliation-sweep.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/rag/models/rag-chunk-store.backend.types.d.ts.map +1 -1
- package/dist/esm/rag/models/rag-retrieval.backend.types.d.ts.map +1 -1
- package/dist/esm/rag/services/mongodb-rag-chunk-store.backend.service.d.ts.map +1 -1
- package/dist/esm/rag/services/postgresql-rag-chunk-store.backend.service.d.ts.map +1 -1
- package/dist/esm/rag/services/rag-chunk-collection.mongodb-ddl.backend.d.ts.map +1 -1
- package/dist/esm/rag/services/rag-chunk-retrieval.mongodb-query.backend.d.ts.map +1 -1
- package/dist/esm/rag/services/rag-chunk-retrieval.postgresql-query.backend.d.ts.map +1 -1
- package/dist/esm/rag/services/rag-chunk-store.backend.service.d.ts.map +1 -1
- package/dist/esm/rag/services/rag-chunk-table.postgresql-ddl.backend.d.ts.map +1 -1
- package/dist/esm/rag/services/rag-ingestion.backend.service.d.ts.map +1 -1
- package/dist/esm/rag/services/rag-retrieval.backend.service.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-chunk-fusion.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-chunk-removal.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-chunk-row-shaping.backend.utils.d.ts.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/rag/utils/rag-ingestion-trigger.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-retrieval-scope.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-source-field-value.backend.utils.d.ts.map +1 -1
- package/dist/esm/requests/models/api-routes.backend.defintions.d.ts.map +1 -1
- package/dist/esm/requests/models/requests.backend.schemas.d.ts.map +1 -1
- package/dist/esm/requests/service/platform-mutualized-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/requests/service/platform-requests.backend.utils.d.ts.map +1 -1
- package/dist/esm/requests/service/remote-client-base.backend.service.d.ts.map +1 -1
- package/dist/esm/requests/service/serverless-services-handler.backend.service.d.ts.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 +81 -9
- package/dist/esm/requests/service/websocket.service.js.map +1 -1
- package/dist/esm/resources/backend-resource-registry.exports.d.ts.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/index.d.ts.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/models/resources.backend.schemas.d.ts.map +1 -1
- package/dist/esm/resources/models/virtual-fields.backend.types.d.ts.map +1 -1
- package/dist/esm/resources/services/__tests__/mock-resources-registry.service.d.ts.map +1 -1
- package/dist/esm/resources/services/resource-context.backend.service.d.ts.map +1 -1
- package/dist/esm/resources/services/resource-id.backend.service.d.ts.map +1 -1
- package/dist/esm/resources/services/resource-population.backend.service.d.ts +17 -2
- package/dist/esm/resources/services/resource-population.backend.service.d.ts.map +1 -1
- package/dist/esm/resources/services/resource-population.backend.service.js +74 -18
- package/dist/esm/resources/services/resource-population.backend.service.js.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts +83 -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 +121 -6
- package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
- package/dist/esm/resources/services/virtual-fields.backend.service.d.ts.map +1 -1
- package/dist/esm/resources/utils/resource-retention.backend.utils.d.ts.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/models/execution-context.backend.schemas.d.ts.map +1 -1
- package/dist/esm/runtime/models/request-context.als.backend.d.ts.map +1 -1
- package/dist/esm/runtime/models/runtime.backend.schemas.d.ts.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.map +1 -1
- package/dist/esm/runtime/services/execution-context-handler.backend.service.d.ts.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 +191 -1
- package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts +19 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.js +287 -89
- package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/utils/oauth-body-cap.backend.utils.d.ts.map +1 -1
- package/dist/esm/runtime/testing/execution-context-test-fixtures.d.ts.map +1 -1
- package/dist/esm/runtime/testing/mock-execution-context-creator.service.d.ts.map +1 -1
- package/dist/esm/runtime/utils/application-startup-config-access.backend.utils.d.ts.map +1 -1
- package/dist/esm/runtime/utils/feature-gated-core-resource-exclusions.backend.utils.d.ts.map +1 -1
- package/dist/esm/runtime/utils/request-client-ip.utils.d.ts.map +1 -1
- package/dist/esm/runtime/utils/scan-default-exports.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-key-generation.backend.utils.d.ts.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/auth-method-management-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts +22 -0
- 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 +113 -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/auth-constants.backend.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/authentications.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/authorization-client.backend.schemas.d.ts.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/federated-auth-transport.backend.definitions.d.ts +37 -0
- package/dist/esm/security/authentications/models/federated-auth-transport.backend.definitions.d.ts.map +1 -0
- package/dist/esm/security/authentications/models/federated-auth-transport.backend.definitions.js +37 -0
- package/dist/esm/security/authentications/models/federated-auth-transport.backend.definitions.js.map +1 -0
- package/dist/esm/security/authentications/models/identity-persistence-boundaries.backend.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +30 -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/models/saml-authentication.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/sso-connection.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/user-authorization-version.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/seeds/enterprise-config-defaults.seeds.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/__tests__/mock-auth-execution-context-factory.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/__tests__/mock-auth-token-issuer.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/__tests__/oauth-provider-audit-spies.mock.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/__tests__/mock-domain-to-org-lookup.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/__tests__/mock-enterprise-user-provisioning.service.d.ts.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/admin-config/oidc-discovery.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/oidc-discovery.backend.service.js +2 -1
- package/dist/esm/security/authentications/services/admin-config/oidc-discovery.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +197 -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 +384 -53
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-credential-verifier.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-execution-context-factory.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +68 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-password-reset.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-phone-verification.backend.service.d.ts.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 +97 -0
- 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 +260 -27
- 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 +14 -0
- 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 +70 -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/saml-assertion-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/saml-authentication.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/saml-metadata.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/saml-replay-guard.backend.service.d.ts.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-session-store.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +17 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +49 -17
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/scim-tokens.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/siem-delivery-dlq.custom-impl.backend.service.d.ts.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 +339 -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/custom-impls/sso-connection.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-connection.custom-impl.backend.service.js +11 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-connection.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/email-verification-initiator.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/machine-token-issuer.backend.service.d.ts.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/oidc-user-claims.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/resolve-active-member-orgs.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/__tests__/mock-auth-user-lookup.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-controller.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-credential-ops.backend.service.d.ts.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-response-helper.backend.service.d.ts.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/concurrent-session-eviction.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/ensure-user-profile.backend.utils.d.ts.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/services/utils/machine-auth-rate-limit.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/pkce.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/saml-java-availability.d.ts.map +1 -1
- package/dist/esm/security/authentications/utils/application-auth-policy-audit.backend.utils.d.ts.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/authentications/utils/one-off-session-lifetime.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/utils/social-oauth2-purpose.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/access-grant-decision.factory.backend.d.ts +59 -0
- package/dist/esm/security/authorizations/access-grant-decision.factory.backend.d.ts.map +1 -0
- package/dist/esm/security/authorizations/access-grant-decision.factory.backend.js +111 -0
- package/dist/esm/security/authorizations/access-grant-decision.factory.backend.js.map +1 -0
- package/dist/esm/security/authorizations/access-grant-lifecycle-audit.backend.d.ts +57 -0
- package/dist/esm/security/authorizations/access-grant-lifecycle-audit.backend.d.ts.map +1 -0
- package/dist/esm/security/authorizations/access-grant-lifecycle-audit.backend.js +133 -0
- package/dist/esm/security/authorizations/access-grant-lifecycle-audit.backend.js.map +1 -0
- package/dist/esm/security/authorizations/application-access-grant-custom-implementation.backend.service.d.ts +41 -0
- package/dist/esm/security/authorizations/application-access-grant-custom-implementation.backend.service.d.ts.map +1 -0
- package/dist/esm/security/authorizations/application-access-grant-custom-implementation.backend.service.js +157 -0
- package/dist/esm/security/authorizations/application-access-grant-custom-implementation.backend.service.js.map +1 -0
- package/dist/esm/security/authorizations/application-wide-read-admission.backend.d.ts +84 -0
- package/dist/esm/security/authorizations/application-wide-read-admission.backend.d.ts.map +1 -0
- package/dist/esm/security/authorizations/application-wide-read-admission.backend.js +99 -0
- package/dist/esm/security/authorizations/application-wide-read-admission.backend.js.map +1 -0
- package/dist/esm/security/authorizations/authorization-denial-audit.backend.utils.d.ts.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/junction-scope-resolution.backend.d.ts.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/organization-unit-narrowing-enforcement.backend.d.ts.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 +37 -124
- 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.map +1 -1
- package/dist/esm/security/authorizations/relationship-foreign-key-filter.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +133 -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 +137 -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 +134 -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 +152 -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 +146 -8
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js +328 -29
- 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 +299 -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 +953 -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 +99 -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 +210 -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 +423 -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 +282 -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 +125 -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 +123 -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 +214 -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 +430 -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 +98 -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/connected-accounts/utils/user-delegated-access-token-slot.backend.utils.d.ts +34 -0
- package/dist/esm/security/connected-accounts/utils/user-delegated-access-token-slot.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/user-delegated-access-token-slot.backend.utils.js +39 -0
- package/dist/esm/security/connected-accounts/utils/user-delegated-access-token-slot.backend.utils.js.map +1 -0
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts.map +1 -1
- 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.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/models/index.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/services/__tests__/mock-consumable-token.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +21 -3
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +26 -16
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
- package/dist/esm/security/jwt/services/auth-jwt-guard.backend.service.d.ts.map +1 -1
- package/dist/esm/security/jwt/services/jwt.backend.service.d.ts.map +1 -1
- package/dist/esm/security/jwt/services/wildo-worker-bootstrap-client.backend.service.d.ts +13 -0
- package/dist/esm/security/jwt/services/wildo-worker-bootstrap-client.backend.service.d.ts.map +1 -1
- package/dist/esm/security/jwt/services/wildo-worker-bootstrap-client.backend.service.js +14 -0
- package/dist/esm/security/jwt/services/wildo-worker-bootstrap-client.backend.service.js.map +1 -1
- package/dist/esm/security/jwt/utils/jwt-verification-error-classification.backend.utils.d.ts.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/outbound/outbound-request-deadline.backend.utils.d.ts +39 -0
- package/dist/esm/security/outbound/outbound-request-deadline.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/outbound/outbound-request-deadline.backend.utils.js +60 -0
- package/dist/esm/security/outbound/outbound-request-deadline.backend.utils.js.map +1 -0
- package/dist/esm/security/outbound/outbound-request-headers.backend.utils.d.ts +66 -0
- package/dist/esm/security/outbound/outbound-request-headers.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/outbound/outbound-request-headers.backend.utils.js +75 -0
- package/dist/esm/security/outbound/outbound-request-headers.backend.utils.js.map +1 -0
- 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/scim/utils/scim-attribute-path-resolver.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/scim/utils/scim-filter-parser.d.ts.map +1 -1
- package/dist/esm/security/scim/utils/scim-response-formatter.d.ts.map +1 -1
- package/dist/esm/security/session-invalidation-fence.backend.utils.d.ts.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/security/token-invalidation-fence.backend.utils.d.ts.map +1 -1
- package/dist/esm/testing.d.ts.map +1 -1
- package/dist/esm/users/services/inbound-contact-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/users/services/user-deletion-audit.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/users/services/user-force-password-reset.custom-impl.backend.service.d.ts.map +1 -1
- 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/esm/users/services/user-role-administration.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/users/services/user-self-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/users/services/user-super-admin-floor.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +11 -9
- package/dist/esm/external-providers/services/flow-actor-design.backend.service.d.ts +0 -45
- package/dist/esm/external-providers/services/flow-actor-design.backend.service.d.ts.map +0 -1
- package/dist/esm/external-providers/services/flow-actor-design.backend.service.js +0 -22
- package/dist/esm/external-providers/services/flow-actor-design.backend.service.js.map +0 -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-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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.service.js","sourceRoot":"","sources":["../../../../../src/requests/service/websocket.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { injectable, inject, Container } from 'inversify';\nimport { Server as HttpServer } from 'http';\nimport { Server as SocketIOServer, Socket } from 'socket.io';\nimport { createAdapter } from '@socket.io/redis-adapter';\nimport { createClient } from 'redis';\nimport { z } from 'zod';\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 { RedisService } from '~wildo-backend-lib/databases/services/redis.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { runInFreshRequestContextIfAbsent } from '~wildo-backend-lib/runtime/models/request-context.als.backend';\nimport {\n ErrorCustomMessageReference,\n ErrorType,\n ExecutionContext_ExecutionType,\n ResourcePrimaryScope,\n CoreResourceOperation,\n CoreResourceType,\n ARRAY_RESPONSE_OPERATIONS,\n DataMode,\n ResourceConfiguration_Operation,\n OPERATION_VARIANT_KEY,\n ResourcesConfigOperationsDtosBuilderUtils,\n ResourcesConfig_OperationPathUtils,\n ResourceOperationsUtils,\n WildoHeaderKeys,\n ResourceOperationVariantType,\n isWildoBackendError,\n} from '@wildo-ai/saas-models';\nimport {\n ExecutionContextCreatorBackendService,\n} from '~wildo-backend-lib/runtime/services/execution-context-creator.backend.service';\nimport { AuthorizationsBackendService } from '~wildo-backend-lib/security/authorizations/services/authorizations.backend.service';\nimport { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport { NotificationBadgeBackendService } from '~wildo-backend-lib/notifications/services/notification-badge.backend.service';\nimport {\n WS_ResourceSubscribePayload,\n WS_ResourceEditingPayload,\n WS_ResourceCustomEventPayload,\n WS_ResourceUpdatedPayload,\n WS_ResourceDeletedPayload,\n WS_ResourceRoomStatePayload,\n WS_ResourceSyncUpdatedPayload,\n WS_ResourceUpdateNotificationPayload,\n WS_ResourceSubscribePayloadSchema,\n WS_ResourceEditingPayloadSchema,\n WS_ResourceCustomEventPayloadSchema,\n WS_UserNotificationPayload,\n NotificationLevel,\n NotificationDisplayTarget,\n ResourceAction,\n buildResourceRoomName,\n buildScopeRoomName,\n ResourceScopeRoomKey,\n buildUserRoomName,\n buildOrganizationRoomName,\n buildOrganizationRoleRoomName,\n buildAppRoleRoomName,\n parseOrganizationRoomName,\n WebSocketRoomPrefix,\n CoreWebSocketEvent,\n CoreWebSocketConnectionErrorCode,\n CORE_APP_ROLES,\n WebSocketResourceDeliveryTarget,\n WS_FlowsActorsStartPayloadSchema,\n WS_FlowsActorsApprovalResponsePayloadSchema,\n} from '@wildo-ai/saas-models';\nimport { SocketAuthResult } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport type { ConversationalExecutionBackendService, FlowsActorsExecutionEmitter } from '~wildo-backend-lib/flows-actors/services/conversational-execution.backend.service';\nimport { logWildoBackendErrorAtClassifiedSeverity, projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { relaxAbuseThrottleMaxForEnvironment } from '~wildo-backend-lib/errors/utils/rate-limit-environment-relaxation.backend.utils';\n\nexport interface WebSocketConfig {\n cors: {\n origin: string | string[];\n credentials: boolean;\n };\n transports: ('websocket' | 'polling')[];\n pingTimeout: number;\n pingInterval: number;\n maxHttpBufferSize: number;\n allowEIO3: boolean;\n}\n\ntype WebSocketResourceRoomEmitPayload =\n | WS_ResourceUpdatedPayload\n | WS_ResourceDeletedPayload\n | WS_ResourceRoomStatePayload;\n\nfunction subscriptionMatchesOrganization(\n subscription: SocketTrackedResourceSubscription,\n organizationId: string,\n): boolean {\n if (subscription.scopeId === organizationId) {\n return true;\n }\n\n return Object.values(subscription.contextResourceIdentifiers ?? {}).includes(organizationId);\n}\n\nexport interface WebSocketMessage {\n type: string;\n payload: any;\n timestamp: Date;\n userId?: string;\n organizationId?: string;\n targetUsers?: string[];\n targetRoles?: string[];\n}\n\nexport interface RoomInfo {\n name: string;\n organizationId: string;\n type: 'organization' | 'user' | 'role' | 'custom' | 'resource';\n members: Set<string>;\n metadata?: Record<string, any>;\n}\n\ntype SocketTrackedResourceSubscription = WS_ResourceSubscribePayload & {\n roomName: string;\n};\n\n/**\n * Rate limiting configuration (Redis-synchronized)\n */\nexport interface RateLimitConfig {\n /** Maximum events per window */\n maxEvents: number;\n /** Window size in seconds */\n windowSeconds: number;\n}\n\n/**\n * Default rate limits per event type\n */\n/**\n * Idle-activity timeout for a WebSocket connection. A socket with NO inbound client activity for this\n * long is force-disconnected. Two reasons: (1) it BOUNDS the window during which a revoked-but-still-open\n * socket keeps receiving data — a connection authenticates ONCE at handshake and reuses those roles for\n * its whole life, never re-checking the token-invalidation fence mid-stream (issue #15 item 10), so a\n * logout / SLO / suspension does not tear an already-open socket down; and (2) it reaps\n * abandoned/backgrounded connections that still answer Socket.IO pings (the ping heartbeat, `pingTimeout`,\n * only detects a GONE client, not an INACTIVE one). 30 min matches the common session-idle bar.\n *\n * \"Activity\" is inbound app-level events (`socket.onAny`), NOT Socket.IO pings and NOT server→client\n * pushes — a purely passive subscriber that receives pushes but sends nothing is treated as idle BY\n * DESIGN (a walked-away session). A product needing longer-lived passive subscriptions must raise this\n * bound or have the client send a periodic app-level keepalive.\n */\nconst WEBSOCKET_IDLE_TIMEOUT_MS = 30 * 60 * 1000;\n\n/** How often the idle sweep runs. Coarser than the timeout — a socket is reaped within one interval of crossing it. */\nconst WEBSOCKET_IDLE_SWEEP_INTERVAL_MS = 60 * 1000;\n\n/** A connected socket, annotated with the last inbound-activity timestamp the idle sweep reads (mirrors the existing `(socket as any).auth` pattern, but typed). */\ntype SocketWithActivity = Socket & { lastActivityAt?: number };\n\nconst DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n // Resource subscription: 20 per 10 seconds (allow rapid page navigation)\n [CoreWebSocketEvent.RESOURCE_SUBSCRIBE]: { maxEvents: 20, windowSeconds: 10 },\n [CoreWebSocketEvent.RESOURCE_UNSUBSCRIBE]: { maxEvents: 20, windowSeconds: 10 },\n\n // Editing events: 10 per minute (reasonable for form editing)\n [CoreWebSocketEvent.RESOURCE_EDITING_START]: { maxEvents: 10, windowSeconds: 60 },\n [CoreWebSocketEvent.RESOURCE_EDITING_END]: { maxEvents: 10, windowSeconds: 60 },\n\n // Custom events: 30 per second (for real-time collaboration like cursor moves)\n [CoreWebSocketEvent.RESOURCE_CUSTOM]: { maxEvents: 30, windowSeconds: 1 },\n\n // Badge requests: 10 per second\n [CoreWebSocketEvent.BADGE_GET]: { maxEvents: 10, windowSeconds: 1 },\n [CoreWebSocketEvent.BADGE_GET_ALL]: { maxEvents: 5, windowSeconds: 1 },\n\n // Auth/system events: 5 per minute\n [CoreWebSocketEvent.AUTH_REFRESH]: { maxEvents: 5, windowSeconds: 60 },\n [CoreWebSocketEvent.ORGANIZATION_SWITCH]: { maxEvents: 10, windowSeconds: 60 },\n\n // Flows-actors conversation: a turn per few seconds is plenty; keep it modest\n // since each start triggers an LLM invocation. Approval responses are rarer.\n [CoreWebSocketEvent.FLOWS_ACTORS_START]: { maxEvents: 20, windowSeconds: 60 },\n [CoreWebSocketEvent.FLOWS_ACTORS_APPROVAL_RESPONSE]: { maxEvents: 30, windowSeconds: 60 },\n\n // Default for unlisted events: 100 per minute\n 'default': { maxEvents: 100, windowSeconds: 60 },\n};\n\n/**\n * WebSocket Service\n *\n * Provides real-time communication for SaaS applications:\n * - Multi-tenant socket management with identity-based rooms\n * - Resource-centric rooms for collaboration (editing, locking, custom events)\n * - Role-based message broadcasting\n * - Redis adapter for horizontal scaling\n * - JWT authentication reusing ExecutionContextCreatorBackendService\n * - Authorization reusing AuthorizationsBackendService\n */\n@injectable()\nexport class WebSocketService {\n private io: SocketIOServer | null = null;\n\n /**\n * Tracks emit attempts made while {@link io} is `null`.\n *\n * `io === null` is an EXPECTED, supported state, not an error:\n * - during startup, before {@link initialize} runs (Step 6 / HTTP init) —\n * system bootstrap + data-seed writes flow through the unconditional\n * post-write resource-room dispatch contract before any client can\n * connect, so their emits legitimately have no server yet; and\n * - permanently for platform/internal services with no frontend URLs\n * (the \"disabled mode\" branch in {@link initialize}), whose public emit\n * methods are documented to \"safely no-op\".\n *\n * A per-call `WARN` in either case produced a startup log flood (one line\n * per seeded resource). Instead we emit a SINGLE aggregated `WARN` on the\n * first skip per lifecycle and count the rest; {@link initialize} then\n * reconciles the total (so a genuine \"should have been up\" ordering\n * regression is still surfaced once, not hidden). The flag re-arms on a\n * fresh {@link initialize}/shutdown cycle.\n */\n private unavailableEmitSkips = 0;\n private hasWarnedIoUnavailable = false;\n\n private userSockets: Map<string, Set<string>> = new Map(); // userId -> socketIds\n private rooms: Map<string, RoomInfo> = new Map();\n private organizationSockets: Map<string, Set<string>> = new Map(); // orgId -> socketIds\n\n // NEW: Track authenticated sockets and editing state\n private authenticatedSockets: Map<string, SocketAuthResult> = new Map(); // socketId -> auth info\n private idleSweepInterval: ReturnType<typeof setInterval> | null = null; // periodic idle-socket reaper (see WEBSOCKET_IDLE_TIMEOUT_MS)\n private resourceEditingState: Map<string, Set<string>> = new Map(); // resource room -> editing userIds\n private resourceSubscriptionsBySocket: Map<string, Map<string, SocketTrackedResourceSubscription>> = new Map();\n\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\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 @inject(SAAS_SERVICE_TYPES.RedisService) private redisService: RedisService,\n // Dependencies for factorized authentication/authorization\n @inject(SAAS_SERVICE_TYPES.ExecutionContextCreatorBackendService) private executionContextCreator: ExecutionContextCreatorBackendService,\n @inject(SAAS_SERVICE_TYPES.AuthorizationsService) private authorizationsService: AuthorizationsBackendService,\n @inject(SAAS_SERVICE_TYPES.ResourceRegistryService) private resourcesRegistry: ResourcesRegistryBackendService,\n // Container for lazy resolution of NotificationBadgeService to break circular dependency\n @inject('Container') private container: Container,\n ) {\n this.logDebug = this.logger.debugByType('WebSocketService');\n this.logger.setDebugTypeLogging('WebSocketService', false);\n }\n\n /**\n * Lazy getter for NotificationBadgeService to break circular dependency\n * NotificationBadgeService depends on WebSocketService, so we resolve it lazily\n */\n private getBadgeService(): NotificationBadgeBackendService {\n return this.container.get<NotificationBadgeBackendService>(SAAS_SERVICE_TYPES.NotificationBadgeService);\n }\n\n /**\n * Lazy getter for the flows-actors conversational runtime. Resolved on demand\n * (like the badge service) so the WebSocket hub never participates in a\n * constructor-injection cycle with the flows-actors / system-access graph.\n */\n private getConversationalExecutionService(): ConversationalExecutionBackendService {\n return this.container.get<ConversationalExecutionBackendService>(SAAS_SERVICE_TYPES.ConversationalExecutionBackendService);\n }\n\n private getSocketAuth(socket: Socket): SocketAuthResult {\n return (socket as any).auth as SocketAuthResult;\n }\n\n private hasOrganizationAccess(auth: SocketAuthResult, organizationId: string): boolean {\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n return false;\n }\n\n return auth.initiatorRoles.some((roleInfo) =>\n roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS\n && roleInfo.relatedResourceId === organizationId,\n );\n }\n\n private trackSocketResourceSubscription(\n socketId: string,\n subscription: SocketTrackedResourceSubscription,\n ): void {\n const subscriptions = this.resourceSubscriptionsBySocket.get(socketId) ?? new Map<string, SocketTrackedResourceSubscription>();\n subscriptions.set(subscription.roomName, subscription);\n this.resourceSubscriptionsBySocket.set(socketId, subscriptions);\n }\n\n private untrackSocketResourceSubscription(socketId: string, roomName: string): void {\n const subscriptions = this.resourceSubscriptionsBySocket.get(socketId);\n if (!subscriptions) {\n return;\n }\n\n subscriptions.delete(roomName);\n if (subscriptions.size === 0) {\n this.resourceSubscriptionsBySocket.delete(socketId);\n }\n }\n\n private async revokeTrackedResourceSubscription(params: {\n socket: Socket;\n auth: SocketAuthResult;\n subscription: SocketTrackedResourceSubscription;\n reason: 'auth_refresh' | 'organization_switch';\n }): Promise<void> {\n const { socket, auth, subscription, reason } = params;\n\n await socket.leave(subscription.roomName);\n\n if (subscription.resourceId && auth.initiatorIds?.userId) {\n await this.trackEditingState(\n subscription.resourceType,\n subscription.resourceId,\n auth.initiatorIds.userId,\n 'end',\n );\n\n this.io?.to(subscription.roomName).emit(CoreWebSocketEvent.RESOURCE_EDITING_END, {\n resourceType: subscription.resourceType,\n resourceId: subscription.resourceId,\n initiatorUserId: auth.initiatorIds.userId,\n reason,\n timestamp: new Date(),\n } satisfies WS_ResourceEditingPayload);\n }\n\n this.untrackSocketResourceSubscription(socket.id, subscription.roomName);\n }\n\n private async revalidateTrackedResourceSubscriptions(\n socket: Socket,\n auth: SocketAuthResult,\n ): Promise<void> {\n const subscriptions = Array.from(this.resourceSubscriptionsBySocket.get(socket.id)?.values() ?? []);\n for (const subscription of subscriptions) {\n try {\n if (subscription.resourceId) {\n await this.verifyResourceAccess(\n socket,\n auth,\n subscription.resourceType,\n subscription.resourceId,\n subscription.contextResourceIdentifiers,\n );\n } else if (subscription.scopeKey && subscription.scopeId) {\n await this.verifyScopeAccess(\n auth,\n subscription.resourceType,\n subscription.scopeKey,\n subscription.scopeId,\n subscription.contextResourceIdentifiers,\n );\n } else {\n throw new Error('Tracked resource subscription is missing routing identifiers');\n }\n } catch {\n await this.revokeTrackedResourceSubscription({\n socket,\n auth,\n subscription,\n reason: 'auth_refresh',\n });\n }\n }\n }\n\n /**\n * Initialize WebSocket server\n *\n * For platform services that don't serve frontends (e.g., crontabs-batches-manager),\n * WebSocket initialization is skipped since they only receive internal backend requests.\n */\n public async initialize(httpServer: HttpServer): Promise<void> {\n const corsOrigins = this.getCorsOrigins();\n\n // If no frontend URLs are configured, skip WebSocket initialization entirely\n // This is expected for platform services that only receive backend-to-backend requests\n // and don't need real-time WebSocket communication with browsers\n if (corsOrigins.length === 0) {\n this.logger.info('📝 No frontend URLs configured - skipping WebSocket initialization (platform/internal service mode)', {\n availableEndpoints: Object.keys(this.configService.config?.runtime?.endPoints || {}),\n note: 'This is expected for platform services that only receive backend-to-backend requests'\n });\n\n // Mark as \"initialized\" but in disabled mode - all public methods will safely no-op\n this.io = null;\n return;\n }\n\n const config: WebSocketConfig = {\n cors: {\n origin: corsOrigins,\n credentials: true\n },\n transports: ['websocket', 'polling'],\n pingTimeout: 60000,\n pingInterval: 25000,\n maxHttpBufferSize: 1e6,\n allowEIO3: true\n };\n\n this.io = new SocketIOServer(httpServer, config);\n this.startIdleSocketSweep();\n\n // Reconcile any emits that were skipped before the server existed. These\n // are expected for startup bootstrap/seed writes (no client can be\n // connected yet), so this is INFO-level closure, not an error — but we\n // surface the total once so a genuinely mis-ordered emit path is still\n // visible rather than silently swallowed.\n if (this.unavailableEmitSkips > 0) {\n this.logger.info('WebSocket initialized after emits were skipped during startup', {\n skippedEmits: this.unavailableEmitSkips,\n note: 'Expected for pre-initialization bootstrap/seed writes, which have no connected clients.',\n });\n }\n this.unavailableEmitSkips = 0;\n this.hasWarnedIoUnavailable = false;\n\n // Setup Redis adapter for horizontal scaling\n await this.setupRedisAdapter();\n\n // Setup authentication middleware (FACTORIZED with HTTP)\n this.setupAuthentication();\n\n // Setup rate limiting middleware (Redis-synchronized across pods)\n this.setupRateLimiting();\n\n // Setup connection handling (identity-based rooms)\n this.setupConnectionHandling();\n\n this.logDebug('WebSocket service initialized', {\n cors: config.cors.origin,\n transports: config.transports\n });\n }\n\n /**\n * Record an emit attempt made while the WebSocket server is not available\n * (`io === null`) and decide how loudly to report it.\n *\n * The first skip per lifecycle logs a single aggregated `WARN`; every\n * subsequent skip is `DEBUG` only, and the running total is reconciled by\n * {@link initialize}. This keeps `io === null` a \"safely no-op\" state (its\n * documented contract) without flooding the log with one `WARN` per\n * bootstrap/seed write, while still surfacing the condition once.\n *\n * @param reason - Human-readable emit surface (e.g. `'resource room'`) for\n * the log line.\n */\n private noteUnavailableEmit(reason: string): void {\n this.unavailableEmitSkips++;\n if (!this.hasWarnedIoUnavailable) {\n this.hasWarnedIoUnavailable = true;\n this.logger.warn('WebSocket not initialized — emits are skipped until initialization', {\n reason,\n note: 'Expected during startup (before HTTP/WS init) and for frontend-less platform services. Further skips are logged at debug; the total is reconciled when the server initializes.',\n });\n return;\n }\n this.logDebug('WebSocket not initialized, skipping emit', { reason });\n }\n\n // =====================================================\n // PUBLIC MESSAGING METHODS\n // =====================================================\n\n /**\n * Send message to specific user (with cross-pod support via Redis adapter)\n */\n /**\n * Build the on-the-wire payload for a room emit.\n *\n * The Socket.IO event name already carries the message `type`, and the flat\n * per-event payload schemas the client validates against (see\n * `WebSocketEventSchemas` in `@wildo-ai/saas-models`) are self-contained:\n * they describe the payload directly, NOT the backend `WebSocketMessage`\n * transport envelope. Emitting the whole envelope (`{ type, payload, userId,\n * organizationId, ... }`) nests the real fields one level too deep under\n * `payload`, so the client ingress boundary sees every required field as\n * `undefined` and drops the event as invalid.\n *\n * We therefore emit the flat `message.payload` and stamp a fresh emit-time\n * `timestamp` (present on every flat payload schema). Envelope routing\n * metadata (`userId`, `organizationId`, `targetUsers`, `targetRoles`) is\n * server-side room-selection input only and is intentionally not forwarded\n * to the client — the client validation strips unknown keys anyway.\n *\n * This mirrors `emitToResourceRoom`, which has always emitted the flat\n * payload rather than the envelope.\n */\n private buildRoomEmitPayload(message: WebSocketMessage): Record<string, unknown> {\n return {\n ...(message.payload as Record<string, unknown>),\n timestamp: new Date(),\n };\n }\n\n public async sendToUser(userId: string, message: WebSocketMessage): Promise<boolean> {\n if (!this.io) {\n this.noteUnavailableEmit('user message');\n return false;\n }\n\n const roomName = buildUserRoomName(userId);\n this.io.to(roomName).emit(message.type, this.buildRoomEmitPayload(message));\n\n this.logDebug('Message sent to user', {\n userId: userId.substring(0, 8) + '...',\n messageType: message.type,\n });\n\n return true;\n }\n\n /**\n * Send a direct notification to a specific user.\n *\n * This is a convenience method for sending user notifications that are not\n * tied to resource operations (e.g., \"Your export is ready\", \"Payment received\").\n *\n * @param userId - The user ID to notify\n * @param notification - Notification configuration\n * @param notification.type - Notification level (info, success, warning, error)\n * @param notification.identifier - i18n identifier for message lookup\n * @param notification.message - Direct message (fallback if identifier not found)\n * @param notification.title - Optional notification title\n * @param notification.data - Additional context data\n * @param notification.displayTarget - Where to display (toast, center, or both)\n * @param notification.organizationId - Organization context (optional)\n *\n * @example\n * // Notify user about export completion\n * await webSocketService.notifyUser(userId, {\n * type: NotificationLevel.SUCCESS,\n * identifier: 'export.completed',\n * data: { fileName: 'report.pdf', downloadUrl: '/files/123' },\n * });\n *\n * @example\n * // Notify user with direct message\n * await webSocketService.notifyUser(userId, {\n * type: NotificationLevel.INFO,\n * message: 'Your session will expire in 5 minutes',\n * displayTarget: NotificationDisplayTarget.TOAST,\n * });\n */\n public async notifyUser(\n userId: string,\n notification: {\n type: NotificationLevel;\n identifier?: string;\n message?: string;\n title?: string;\n data?: Record<string, unknown>;\n displayTarget?: NotificationDisplayTarget;\n organizationId?: string;\n }\n ): Promise<boolean> {\n const payload: WS_UserNotificationPayload = {\n notificationLevel: notification.type,\n identifier: notification.identifier,\n message: notification.message,\n title: notification.title,\n data: notification.data,\n displayTarget: notification.displayTarget ?? NotificationDisplayTarget.BOTH,\n organizationId: notification.organizationId,\n timestamp: new Date(),\n };\n\n const wsMessage: WebSocketMessage = {\n type: CoreWebSocketEvent.USER_NOTIFICATION,\n payload,\n timestamp: new Date(),\n userId,\n organizationId: notification.organizationId,\n };\n\n return this.sendToUser(userId, wsMessage);\n }\n\n /**\n * Send a direct notification to all users in an organization.\n *\n * @param organizationId - The organization ID\n * @param notification - Notification configuration (same as notifyUser)\n * @param excludeUsers - Optional list of user IDs to exclude\n */\n public async notifyOrganization(\n organizationId: string,\n notification: {\n type: NotificationLevel;\n identifier?: string;\n message?: string;\n title?: string;\n data?: Record<string, unknown>;\n displayTarget?: NotificationDisplayTarget;\n },\n excludeUsers?: string[]\n ): Promise<number> {\n const payload: WS_UserNotificationPayload = {\n notificationLevel: notification.type,\n identifier: notification.identifier,\n message: notification.message,\n title: notification.title,\n data: notification.data,\n displayTarget: notification.displayTarget ?? NotificationDisplayTarget.BOTH,\n organizationId,\n timestamp: new Date(),\n };\n\n const wsMessage: WebSocketMessage = {\n type: CoreWebSocketEvent.USER_NOTIFICATION,\n payload,\n timestamp: new Date(),\n organizationId,\n };\n\n return this.sendToOrganization(organizationId, wsMessage, excludeUsers);\n }\n\n /**\n * Send message to organization (with cross-pod support via Redis adapter)\n */\n public async sendToOrganization(\n organizationId: string,\n message: WebSocketMessage,\n excludeUsers?: string[]\n ): Promise<number> {\n const roomName = buildOrganizationRoomName(organizationId);\n const messageWithTimestamp = this.buildRoomEmitPayload(message);\n\n if (!this.io) {\n this.noteUnavailableEmit('organization message');\n return 0;\n }\n\n if (excludeUsers && excludeUsers.length > 0) {\n // For cross-pod compatibility with Redis adapter:\n // 1. Send to the org room (reaches all pods)\n // 2. Exclude users by emitting to their user rooms with a \"skip\" flag\n //\n // Alternative approach: Use Socket.IO's except() which works with Redis adapter\n const excludeRooms = excludeUsers.map(userId => buildUserRoomName(userId));\n let broadcast = this.io.to(roomName);\n for (const excludeRoom of excludeRooms) {\n broadcast = broadcast.except(excludeRoom);\n }\n broadcast.emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message sent to organization with exclusions', {\n organizationId: organizationId.substring(0, 8) + '...',\n messageType: message.type,\n excludedUsers: excludeUsers.length,\n });\n\n // Return approximate count (exact count not available with except())\n return 1;\n } else {\n this.io.to(roomName).emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message sent to organization', {\n organizationId: organizationId.substring(0, 8) + '...',\n messageType: message.type,\n });\n\n return 1;\n }\n }\n\n /**\n * Send message to users with specific role within an organization\n */\n public async sendToRole(\n organizationId: string,\n role: string,\n message: WebSocketMessage\n ): Promise<number> {\n const roomName = buildOrganizationRoleRoomName(organizationId, role);\n const messageWithTimestamp = this.buildRoomEmitPayload(message);\n\n if (!this.io) {\n this.noteUnavailableEmit('organization-role message');\n return 0;\n }\n\n const sentCount = (await this.io.in(roomName).fetchSockets()).length;\n this.io.to(roomName).emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message sent to role', {\n organizationId: organizationId.substring(0, 8) + '...',\n role,\n messageType: message.type,\n sentCount\n });\n\n return sentCount;\n }\n\n /**\n * Send message to users with application-level role (admin dashboard users).\n *\n * Application-level roles are not scoped to an organization - they are global\n * admin roles like super admins, support staff, billing admins, etc.\n *\n * Users with app-level roles join app role rooms (via buildAppRoleRoomName) on connection.\n *\n * @param role - The application-level role (e.g., 'admin', 'super_admin', 'support')\n * @param message - The WebSocket message to send\n * @returns Number of sockets the message was sent to\n *\n * @example\n * // Notify all application administrators\n * await webSocketService.sendToAppRole(CORE_APP_ROLES.APP_ADMIN_SUPER_ADMIN, {\n * type: CoreWebSocketEvent.USER_NOTIFICATION,\n * payload: { notificationLevel: NotificationLevel.WARNING, message: 'New user signup requires review' },\n * timestamp: new Date(),\n * });\n */\n public async sendToAppRole(\n role: string,\n message: WebSocketMessage\n ): Promise<number> {\n const roomName = buildAppRoleRoomName(role);\n const messageWithTimestamp = this.buildRoomEmitPayload(message);\n\n if (!this.io) {\n this.noteUnavailableEmit('app-role message');\n return 0;\n }\n\n const sentCount = (await this.io.in(roomName).fetchSockets()).length;\n this.io.to(roomName).emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message sent to app role', {\n role,\n messageType: message.type,\n sentCount\n });\n\n return sentCount;\n }\n\n /**\n * Send a direct notification to users with a specific application-level role.\n *\n * Convenience method for sending admin notifications.\n *\n * @param role - The application-level role\n * @param notification - Notification configuration\n *\n * @example\n * // Notify support staff about a new ticket\n * await webSocketService.notifyAppRole(CORE_APP_ROLES.APP_ADMIN_SUPER_ADMIN, {\n * type: NotificationLevel.INFO,\n * identifier: 'support.new_ticket',\n * data: { ticketId: '123', subject: 'Help needed' },\n * });\n */\n public async notifyAppRole(\n role: string,\n notification: {\n type: NotificationLevel;\n identifier?: string;\n message?: string;\n title?: string;\n data?: Record<string, unknown>;\n displayTarget?: NotificationDisplayTarget;\n }\n ): Promise<number> {\n const payload: WS_UserNotificationPayload = {\n notificationLevel: notification.type,\n identifier: notification.identifier,\n message: notification.message,\n title: notification.title,\n data: notification.data,\n displayTarget: notification.displayTarget ?? NotificationDisplayTarget.BOTH,\n timestamp: new Date(),\n };\n\n const wsMessage: WebSocketMessage = {\n type: CoreWebSocketEvent.USER_NOTIFICATION,\n payload,\n timestamp: new Date(),\n };\n\n return this.sendToAppRole(role, wsMessage);\n }\n\n /**\n * Broadcast message to all connected users\n */\n public async broadcast(message: WebSocketMessage): Promise<number> {\n if (!this.io) {\n this.noteUnavailableEmit('broadcast');\n return 0;\n }\n\n const messageWithTimestamp = this.buildRoomEmitPayload(message);\n\n const sockets = await this.io.fetchSockets();\n this.io.emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message broadcasted', {\n messageType: message.type,\n connectedSockets: sockets.length\n });\n\n return sockets.length;\n }\n\n // =====================================================\n // RESOURCE ROOM PUBLIC METHODS (for NotificationDispatcher)\n // =====================================================\n\n /**\n * Extract DataMode from a websocket payload.\n * Defaults to RAW for websocket messages when no explicit data mode is present.\n */\n private extractDataMode(payload?: { dataMode?: DataMode | 'raw' | 'summary' | 'context' | string }): DataMode {\n return ResourceOperationsUtils.extractDataMode(payload, undefined, DataMode.RAW);\n }\n\n /**\n * Select the appropriate response DTO based on DataMode.\n * Similar to controller-resource.backend.service.ts\n */\n private selectResponseDto(\n operation: ResourceConfiguration_Operation<any, any, any> | null,\n dataMode?: DataMode\n ): z.ZodTypeAny | undefined {\n if (!operation) {\n return undefined;\n }\n return ResourcesConfigOperationsDtosBuilderUtils.selectResponseDto(operation, dataMode) || undefined;\n }\n\n /**\n * Validate and transform websocket resource data before sending it.\n * Similar to controller-resource.backend.service.ts sendResponse() method.\n *\n * This method validates resource data against the appropriate DTO and transforms dates.\n * It is used for sync-grade replay payloads and for custom websocket events that\n * choose to carry resource-shaped data.\n *\n * @param resourceData - The resource data to validate (if present in payload)\n * @param resourceType - Resource type\n * @param operationIdentifier - Operation identifier (optional)\n * @param dataMode - Data mode (defaults to RAW)\n * @returns Validated and transformed resource data, or false when validation cannot proceed\n */\n /**\n * Resolve the operation whose response DTO will shape resource data emitted\n * through a websocket room.\n *\n * **Security invariant — canonical-default-only shaping.** The data shape gate\n * MUST mirror the subscription auth gate. Socket-room subscription is\n * authorized against the unique default URL-bearing READ operation\n * (`resolveSocketAuthorizationDefaultOperation`, post OPU-19/OPU-25).\n * Therefore data emitted through that subscription MUST be shaped against the\n * SAME operation's DTOs — never against a keyed/non-default READ variant\n * whose `initiatorInfos` may carry stricter or laxer role guards than the\n * default. Any mismatch between the two gates is a leak surface\n * (default-authorized subscriber receives data shaped by a stricter variant,\n * or vice versa).\n *\n * Resolution strategy:\n * 1. If `operationPathKey` is supplied AND it resolves to the unique\n * default READ operation, use it directly. This is the fast path for\n * sync-replay payloads where the dispatcher already named the canonical\n * operation.\n * 2. Otherwise, fall back to `getOperationPathDefault(resourceType, READ)`\n * — the canonical default URL-bearing READ. Any non-default keyed\n * variant supplied via `operationPathKey` is ignored (with a debug log)\n * and the default is used instead. This fail-closed behavior mirrors\n * OPU-36 (`websocket-resource-validation.frontend.service.ts`).\n *\n * Returns `null` only when the registry has no canonical default READ for\n * this resource type, in which case the caller emits notification-grade\n * metadata only (no replay data).\n *\n * See `.claude/plans/variant-authorization-audit.md` (F-2) and\n * `.claude/plans/resource-operation-variant-union-audit.md` (OPU-19, OPU-25,\n * OPU-36).\n */\n private resolveOperationForWebSocketValidation(params: {\n resourceType: string;\n operationIdentifier?: string;\n operationPathKey?: string;\n dataMode: DataMode;\n }) {\n try {\n if (params.operationPathKey) {\n const operationPath = ResourcesConfig_OperationPathUtils.parseOperationPathKey(params.operationPathKey);\n const operationFromPath = this.resourcesRegistry.getOperationFromPath(operationPath);\n const effectiveOperation = operationFromPath\n ? ResourceOperationsUtils.getCoreResourceOperationFromOperation(operationFromPath)\n : undefined;\n // Accept the path-key resolution ONLY when it points to the canonical\n // default READ. Any other shape (non-READ core, keyed READ variant,\n // non-default READ) falls through to the canonical default lookup\n // below — keeping the data-shape gate aligned with the auth gate.\n if (\n operationFromPath\n && effectiveOperation === CoreResourceOperation.READ\n && operationFromPath.isOperationDefault === true\n ) {\n return operationFromPath;\n }\n if (operationFromPath) {\n this.logDebug('Ignoring non-canonical-default-READ websocket validation operation path; falling back to canonical default READ', {\n resourceType: params.resourceType,\n operationPathKey: params.operationPathKey,\n effectiveOperation,\n isOperationDefault: operationFromPath.isOperationDefault,\n variantKey: operationFromPath.variantKey,\n });\n }\n }\n\n // Internal-only resources (e.g. `userCredentials`, updated during passkey\n // / TOTP enrollment) deliberately declare NO canonical default READ. That\n // is an EXPECTED outcome for this best-effort probe — emit\n // notification-grade metadata only. Check existence with the non-throwing\n // predicate first so we never call `getOperationPathDefault`, whose miss\n // path BUILDS an alert-grade RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND\n // (the error's construction fires LOG/ALERT/RECORD_METRICS/TRACE as a side\n // effect, surfacing a spurious FATAL before this method's catch could\n // downgrade it to null). No default READ also means socket subscription is\n // impossible for the resource — subscription auth resolves against the\n // same canonical default READ — so there is genuinely nothing to shape.\n if (!this.resourcesRegistry.hasOperationPathDefault(params.resourceType, CoreResourceOperation.READ)) {\n this.logDebug('No canonical default READ for websocket validation; emitting metadata only', {\n resourceType: params.resourceType,\n operationIdentifier: params.operationIdentifier,\n operationPathKey: params.operationPathKey,\n dataMode: params.dataMode,\n });\n return null;\n }\n\n const operationPath = this.resourcesRegistry.getOperationPathDefault(\n params.resourceType,\n CoreResourceOperation.READ,\n );\n return this.resourcesRegistry.getOperationFromPath(operationPath);\n } catch (error) {\n this.logger.warn('WebSocket resource data validation lookup failed', {\n resourceType: params.resourceType,\n operationIdentifier: params.operationIdentifier,\n operationPathKey: params.operationPathKey,\n dataMode: params.dataMode,\n ...projectCaughtErrorLogFields(error),\n });\n return null;\n }\n }\n\n /**\n * Validate and transform resource data emitted through a websocket room.\n *\n * Always shapes against the resource's **canonical default READ** DTO — see\n * `resolveOperationForWebSocketValidation` for the security invariant. There\n * is intentionally no per-variant shaping mode: socket subscriptions are\n * authorized against the canonical default READ, so emitted data must be\n * shaped against the same operation. A previous `validationTarget:\n * 'operation-response'` mode was removed in this commit because it would\n * have allowed non-canonical DTO shaping without a paired re-authorization\n * gate (OPU-19 dual-hazard surface).\n */\n private validateAndTransformResourceData(\n resourceData: any,\n resourceType: string,\n operationIdentifier?: string,\n dataMode: DataMode = DataMode.RAW,\n operationPathKey?: string,\n ): { success: true; data: unknown } | { success: false } {\n // If no resource data provided, signal the caller to emit metadata only.\n if (!resourceData || typeof resourceData !== 'object') {\n return { success: false };\n }\n\n const operation = this.resolveOperationForWebSocketValidation({\n resourceType,\n operationIdentifier,\n operationPathKey,\n dataMode,\n });\n if (!operation) {\n return { success: false };\n }\n\n // Select appropriate DTO based on DataMode\n const selectedDto = this.selectResponseDto(operation, dataMode);\n\n if (!selectedDto) {\n return { success: false };\n }\n\n try {\n // Transform dates from Date objects to ISO strings before validation\n let transformedData = resourceData;\n transformedData = ResourcesConfigOperationsDtosBuilderUtils.transformResponseDates(\n resourceData,\n selectedDto\n );\n\n // Validate response against the selected DTO as a runtime safety net\n // Handle array responses (LIST, CREATE_MANY, etc.)\n const effectiveOperation = operation.resourceOperationLike || operation.operationIdentifier;\n const isArrayOperation = ARRAY_RESPONSE_OPERATIONS.includes(effectiveOperation as any);\n\n if (isArrayOperation && Array.isArray(transformedData)) {\n // For array operations, validate each item individually\n return {\n success: true,\n data: transformedData.map(item => selectedDto.parse(item)),\n };\n } else {\n // For single-item operations, validate directly\n return {\n success: true,\n data: selectedDto.parse(transformedData),\n };\n }\n } catch (error) {\n this.logger.warn('WebSocket resource data validation failed', {\n resourceType,\n operationIdentifier,\n dataMode,\n ...projectCaughtErrorLogFields(error),\n resourceDataKeys: typeof resourceData === 'object' ? Object.keys(resourceData) : 'not-object'\n });\n return { success: false };\n }\n }\n\n private stripScopeNotificationReplayFields(\n payload: WS_ResourceUpdateNotificationPayload,\n ): WS_ResourceUpdateNotificationPayload {\n const {\n resourceData: _resourceData,\n fieldMeta: _fieldMeta,\n version: _version,\n dataMode: _dataMode,\n ...notificationPayload\n } = payload;\n return notificationPayload;\n }\n\n private validateAndTransformSyncReplayData(params: {\n resourceData: unknown;\n resourceType: string;\n operationPathKey?: string;\n dataMode?: DataMode;\n }): { success: true; data: unknown } | { success: false } {\n const dataMode = params.dataMode ?? DataMode.RAW;\n\n if (!params.resourceData || typeof params.resourceData !== 'object') {\n this.logger.warn('WebSocket sync replay payload is missing resource data', {\n resourceType: params.resourceType,\n dataMode,\n });\n return { success: false };\n }\n\n const readOperation = this.resolveOperationForWebSocketValidation({\n resourceType: params.resourceType,\n operationPathKey: params.operationPathKey,\n dataMode,\n });\n if (!readOperation) {\n return { success: false };\n }\n const selectedDto = this.selectResponseDto(readOperation, dataMode);\n\n if (!selectedDto) {\n this.logger.warn('WebSocket sync replay payload missing canonical READ DTO', {\n resourceType: params.resourceType,\n dataMode,\n });\n return { success: false };\n }\n\n try {\n const transformedData = ResourcesConfigOperationsDtosBuilderUtils.transformResponseDates(\n params.resourceData,\n selectedDto,\n );\n return {\n success: true,\n data: selectedDto.parse(transformedData),\n };\n } catch (error) {\n this.logger.warn('WebSocket sync replay validation failed', {\n resourceType: params.resourceType,\n dataMode,\n ...projectCaughtErrorLogFields(error),\n resourceDataKeys: typeof params.resourceData === 'object' ? Object.keys(params.resourceData as Record<string, unknown>) : 'not-object',\n });\n return { success: false };\n }\n }\n\n /**\n * Emit to a specific resource room (path-independent)\n * Called by NotificationDispatcherService after CRUD operations\n *\n * Resource-room sync payloads now validate replay-grade resource data when it\n * is present in the payload.\n *\n * @param resourceType - Resource type\n * @param resourceId - Resource ID\n * @param event - WebSocket event name\n * @param payload - Resource-room payload. Sync-grade update payloads carry authoritative\n * `version` + `resourceData`; delete/state payloads intentionally do not.\n *\n * @example\n * // Send notification-grade metadata only\n * websocketService.emitToResourceRoom('users', 'userId123', CoreWebSocketEvent.RESOURCE_UPDATED, {\n * resourceType: 'users',\n * resourceId: 'userId123',\n * contextResourceIdentifiers: {},\n * action: ResourceAction.UPDATED,\n * operationIdentifier: CoreResourceOperation.UPDATE\n * });\n *\n * @example\n * // Send synchronization-grade replay data for RESOURCE_ROOM_SYNC\n * websocketService.emitToResourceRoom('users', 'userId123', CoreWebSocketEvent.RESOURCE_UPDATED, {\n * resourceType: 'users',\n * resourceId: 'userId123',\n * contextResourceIdentifiers: {},\n * action: ResourceAction.UPDATED,\n * operationIdentifier: CoreResourceOperation.UPDATE,\n * resourceData: updatedUserObject, // Full resource object\n * dataMode: DataMode.RAW // or DataMode.SUMMARY, DataMode.CONTEXT\n * });\n */\n public emitToResourceRoom(\n resourceType: string,\n resourceId: string,\n event: string,\n payload: WebSocketResourceRoomEmitPayload\n ): boolean {\n if (!this.io) {\n this.noteUnavailableEmit('resource room');\n return false;\n }\n\n // Only sync-grade resource-room payloads are allowed to act like\n // authoritative replay input for clients. Notification-grade room payloads\n // still emit, but they do not go through the stricter canonical replay gate.\n const shouldValidateSyncReplay = payload.deliveryTarget === WebSocketResourceDeliveryTarget.RESOURCE_ROOM_SYNC\n && 'resourceData' in payload;\n let payloadToEmit: WebSocketResourceRoomEmitPayload = payload;\n let dataMode: DataMode = DataMode.RAW;\n\n if (shouldValidateSyncReplay) {\n dataMode = this.extractDataMode({ dataMode: payload.dataMode });\n const validation = this.validateAndTransformSyncReplayData({\n resourceData: payload.resourceData,\n resourceType,\n operationPathKey: payload.operationPathKey,\n dataMode,\n });\n if (!validation.success) {\n this.logDebug('Skipped resource-room emit: sync replay payload failed canonical validation', {\n resourceType,\n resourceId,\n event,\n deliveryTarget: payload.deliveryTarget,\n });\n return false;\n }\n payloadToEmit = {\n ...payload,\n resourceData: validation.data as Record<string, unknown>,\n };\n }\n\n const roomName = buildResourceRoomName(resourceType, resourceId);\n this.io.to(roomName).emit(event, payloadToEmit);\n\n this.logDebug('Emitted to resource room', {\n roomName,\n event,\n dataMode: shouldValidateSyncReplay ? dataMode : undefined,\n hasResourceData: shouldValidateSyncReplay,\n deliveryTarget: payload.deliveryTarget,\n });\n return true;\n }\n\n /**\n * Helper method to send resource data via WebSocket with automatic validation.\n *\n * This is a convenience method that prepares a payload with resource data and sends it\n * to a resource room. Use this when you want to send authoritative resource objects via\n * WebSocket.\n *\n * @param resourceType - Resource type\n * @param resourceId - Resource ID\n * @param event - WebSocket event name (e.g., CoreWebSocketEvent.RESOURCE_UPDATED)\n * @param action - Resource action (ResourceAction.CREATED, UPDATED, DELETED)\n * @param resourceData - The resource data object to send (will be validated and transformed)\n * @param options - Optional configuration\n * @param options.operationIdentifier - Operation identifier (e.g., CoreResourceOperation.UPDATE)\n * @param options.dataMode - Data mode (defaults to RAW)\n * @param options.contextResourceIdentifiers - Context resource identifiers\n * @param options.affectedIds - Array of affected resource IDs\n * @param options.initiatorUserId - User ID of the initiator\n *\n * @example\n * // Send updated user resource\n * await websocketService.sendResourceData(\n * 'users',\n * 'userId123',\n * CoreWebSocketEvent.RESOURCE_UPDATED,\n * ResourceAction.UPDATED,\n * updatedUserObject,\n * {\n * operationIdentifier: CoreResourceOperation.UPDATE,\n * dataMode: DataMode.RAW,\n * contextResourceIdentifiers: {},\n * initiatorUserId: 'currentUserId'\n * }\n * );\n *\n * @example\n * // Send created resource with summary data\n * await websocketService.sendResourceData(\n * 'todos',\n * 'todoId456',\n * CoreWebSocketEvent.RESOURCE_UPDATED,\n * ResourceAction.CREATED,\n * newTodoObject,\n * {\n * operationIdentifier: CoreResourceOperation.CREATE,\n * dataMode: DataMode.SUMMARY, // Use summary for list refreshes\n * contextResourceIdentifiers: { organizationId: 'org123' },\n * initiatorUserId: 'currentUserId'\n * }\n * );\n */\n public sendResourceData(\n resourceType: string,\n resourceId: string,\n event: string,\n action: ResourceAction,\n resourceData: any,\n options: {\n operationIdentifier?: string;\n dataMode?: DataMode | string;\n contextResourceIdentifiers?: Record<string, string>;\n affectedIds?: string[];\n initiatorUserId?: string;\n version?: number;\n } = {}\n ): void {\n const {\n operationIdentifier,\n dataMode = DataMode.RAW,\n contextResourceIdentifiers = {},\n affectedIds,\n initiatorUserId,\n version,\n } = options;\n\n // Convert DataMode enum to string for schema compatibility\n const effectiveDataMode = typeof dataMode === 'string'\n ? ResourceOperationsUtils.normalizeDataModeString(dataMode) || DataMode.RAW\n : dataMode || DataMode.RAW;\n const dataModeString = ResourceOperationsUtils.dataModeToString(effectiveDataMode);\n const resolvedVersion = version ?? (\n resourceData && typeof resourceData === 'object'\n ? (resourceData as Record<string, unknown>)._version as number | undefined\n : undefined\n );\n\n if (action !== ResourceAction.DELETED && resolvedVersion == null) {\n this.logger.warn('sendResourceData skipped sync payload without authoritative version', {\n resourceType,\n resourceId,\n event,\n action,\n });\n return;\n }\n\n const payload: WS_ResourceSyncUpdatedPayload | WS_ResourceDeletedPayload = action === ResourceAction.DELETED\n ? {\n deliveryTarget: WebSocketResourceDeliveryTarget.RESOURCE_ROOM_SYNC,\n resourceType,\n resourceId,\n contextResourceIdentifiers,\n action: ResourceAction.DELETED,\n operationIdentifier: operationIdentifier ?? CoreResourceOperation.DELETE,\n affectedIds,\n initiatorUserId,\n timestamp: new Date(),\n }\n : {\n deliveryTarget: WebSocketResourceDeliveryTarget.RESOURCE_ROOM_SYNC,\n resourceType,\n resourceId,\n contextResourceIdentifiers,\n action,\n operationIdentifier: operationIdentifier ?? CoreResourceOperation.UPDATE,\n resourceData,\n dataMode: dataModeString,\n affectedIds,\n initiatorUserId,\n timestamp: new Date(),\n version: resolvedVersion,\n };\n\n this.emitToResourceRoom(resourceType, resourceId, event, payload);\n }\n\n /**\n * Emit to scope rooms (collections) for list refresh\n * Called by NotificationDispatcherService after CRUD operations\n *\n * Scope-room payloads validate resource-shaped data when it is present in the\n * payload, while still treating these emissions as notification-grade rather\n * than replay-grade sync.\n *\n * @param resourceType - Resource type\n * @param scopes - Array of scope rooms to emit to\n * @param event - WebSocket event name\n * @param payload - Payload with optional resourceData and dataMode\n *\n * @example\n * // Send notification-grade metadata for list refresh\n * websocketService.emitToScopeRooms('users', [{ scopeKey: 'organization', scopeId: 'org123' }],\n * CoreWebSocketEvent.RESOURCE_UPDATED, { ... });\n *\n * @example\n * // Send optional summary data for list refresh\n * websocketService.emitToScopeRooms('users', [{ scopeKey: 'organization', scopeId: 'org123' }],\n * CoreWebSocketEvent.RESOURCE_UPDATED, {\n * ...metadata,\n * resourceData: updatedUserObject,\n * dataMode: DataMode.SUMMARY // Use SUMMARY for list refreshes\n * });\n */\n public emitToScopeRooms(\n resourceType: string,\n scopes: Array<{ scopeKey: string; scopeId: string }>,\n event: string,\n payload: WS_ResourceUpdateNotificationPayload\n ): void {\n if (!this.io) return;\n\n // Extract DataMode and validate resource data if present\n const dataMode = this.extractDataMode({ dataMode: payload.dataMode });\n let validatedPayload = { ...payload };\n const resourceData = payload.resourceData;\n\n // Scope-room payloads stay notification-grade. If DTO shaping fails, strip\n // replay-like fields rather than emitting non-canonical bodies; list\n // invalidation is still useful even when authoritative replay truth is not.\n if (resourceData) {\n const validation = this.validateAndTransformResourceData(\n resourceData,\n resourceType,\n undefined,\n dataMode,\n );\n\n if (validation.success) {\n validatedPayload = {\n ...validatedPayload,\n resourceData: validation.data,\n };\n } else {\n validatedPayload = this.stripScopeNotificationReplayFields(validatedPayload);\n }\n }\n\n for (const scope of scopes) {\n const roomName = buildScopeRoomName(resourceType, scope.scopeKey, scope.scopeId);\n this.io.to(roomName).emit(event, validatedPayload);\n }\n\n this.logDebug('Emitted to scope rooms', {\n resourceType,\n scopeCount: scopes.length,\n event,\n dataMode,\n hasResourceData: !!resourceData,\n deliveryTarget: payload.deliveryTarget,\n });\n }\n\n /**\n * Get all users currently editing a resource\n */\n public async getResourceEditingUsers(resourceType: string, resourceId: string): Promise<string[]> {\n const prefix = this.redisService.getAppPrefix();\n const key = `${prefix}editing:${resourceType}:${resourceId}`;\n const redisClient = this.redisService.getReadyClient();\n\n if (!redisClient) {\n return Array.from(this.resourceEditingState.get(key) || []);\n }\n\n try {\n const editing = await redisClient.hGetAll(key);\n return Object.keys(editing);\n } catch {\n return Array.from(this.resourceEditingState.get(key) || []);\n }\n }\n\n // =====================================================\n // ROOM MANAGEMENT\n // =====================================================\n\n /**\n * Create custom room\n */\n public async createRoom(\n roomName: string,\n organizationId: string,\n type: RoomInfo['type'] = 'custom',\n metadata?: Record<string, any>\n ): Promise<void> {\n const room: RoomInfo = {\n name: roomName,\n organizationId,\n type,\n members: new Set(),\n metadata\n };\n\n this.rooms.set(roomName, room);\n\n this.logDebug('Room created', {\n roomName,\n organizationId: organizationId.substring(0, 8) + '...',\n type,\n });\n }\n\n /**\n * Join user to room\n */\n public async joinRoom(userId: string, roomName: string): Promise<boolean> {\n const socketIds = this.userSockets.get(userId);\n const room = this.rooms.get(roomName);\n\n if (!socketIds || !room || !this.io) {\n return false;\n }\n\n room.members.add(userId);\n\n for (const socketId of socketIds) {\n const socket = this.io.sockets.sockets.get(socketId);\n if (socket) {\n await socket.join(roomName);\n }\n }\n\n this.logDebug('User joined room', { userId: userId.substring(0, 8) + '...', roomName });\n return true;\n }\n\n /**\n * Remove user from room\n */\n public async leaveRoom(userId: string, roomName: string): Promise<boolean> {\n const socketIds = this.userSockets.get(userId);\n const room = this.rooms.get(roomName);\n\n if (!socketIds || !room || !this.io) {\n return false;\n }\n\n room.members.delete(userId);\n\n for (const socketId of socketIds) {\n const socket = this.io.sockets.sockets.get(socketId);\n if (socket) {\n await socket.leave(roomName);\n }\n }\n\n this.logDebug('User left room', { userId: userId.substring(0, 8) + '...', roomName });\n return true;\n }\n\n // =====================================================\n // STATUS METHODS\n // =====================================================\n\n public getConnectedUsersCount(): number {\n return this.authenticatedSockets.size;\n }\n\n public getOrganizationUsersCount(organizationId: string): number {\n const socketIds = this.organizationSockets.get(organizationId);\n return socketIds ? socketIds.size : 0;\n }\n\n public isUserConnected(userId: string): boolean {\n const socketIds = this.userSockets.get(userId);\n return socketIds ? socketIds.size > 0 : false;\n }\n\n public getRoomInfo(roomName: string): RoomInfo | undefined {\n return this.rooms.get(roomName);\n }\n\n // =====================================================\n // PRIVATE SETUP METHODS\n // =====================================================\n\n /**\n * Get CORS origins from app-config runtime endpoints\n */\n private getCorsOrigins(): string[] {\n // Config must be initialized - this is ensured by the initialization order:\n // 1. AppsUpdaterConfigService fetches config from apps-manager\n // 2. Standard AppConfigurationService is initialized with that config\n // 3. HTTP server starts, which initializes WebSocket\n // If config is not initialized here, it's a programming error - fail fast\n if (!this.configService.isInitialized()) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.APP_CONFIGURATION_NOT_INITIALIZED,\n context: {\n message: 'Application configuration not initialized : use config before using the service',\n service: 'WebSocketService',\n operation: 'getCorsOrigins'\n }\n }\n );\n }\n\n const config = this.configService.config;\n const frontendServices = Object.keys(config.frontendServices ?? {});\n\n return frontendServices.map((frontendServiceName) => {\n const url = config.runtime?.endPoints?.[frontendServiceName]?.publicUrl;\n if (!url) {\n throw new Error(\n `Missing runtime.endPoints.${frontendServiceName}.publicUrl for declared frontend service \"${frontendServiceName}\". ` +\n 'WebSocket CORS cannot be derived from an incomplete runtime topology.',\n );\n }\n return url;\n });\n }\n\n /**\n * Setup Redis adapter for horizontal scaling across Kubernetes pods\n */\n private async setupRedisAdapter(): Promise<void> {\n try {\n if (!this.io) {\n throw new Error('Socket.IO server not initialized');\n }\n\n // Check if config is initialized before accessing\n if (!this.configService.isInitialized()) {\n this.logger.warn('App config not initialized, using memory adapter (single instance only)');\n return;\n }\n const appConfig = this.configService.config;\n const appSecrets = this.configService.secrets;\n\n if (!appConfig.database.redis) {\n this.logger.warn('Redis not configured, using memory adapter (single instance only)');\n return;\n }\n\n const redisHost = appConfig.database.redis.host;\n const redisPort = appConfig.database.redis.port || 6379;\n const redisPassword = appSecrets?.database?.redis?.password;\n const redisUsername = appSecrets?.database?.redis?.username;\n\n if (!redisHost || redisHost.includes('localhost')) {\n this.logger.warn('Redis not properly configured for production, using memory adapter (single instance only)');\n return;\n }\n\n // Build Redis client options (same pattern as RedisService)\n // Include username for ACL authentication (required when using app-specific credentials)\n const redisOptions: Parameters<typeof createClient>[0] = {\n socket: {\n host: redisHost,\n port: redisPort,\n connectTimeout: 10000\n },\n username: redisUsername,\n password: redisPassword,\n };\n\n const pubClient = createClient(redisOptions);\n const subClient = pubClient.duplicate();\n\n // CRITICAL: Attach error handlers BEFORE connect to prevent \"missing 'error' handler\" warnings\n // These handlers prevent unhandled errors from crashing the process during Redis restarts\n pubClient.on('error', (error) => {\n this.logger.error('Socket.IO Redis pubClient error', {\n ...projectCaughtErrorLogFields(error)\n });\n });\n subClient.on('error', (error) => {\n this.logger.error('Socket.IO Redis subClient error', {\n ...projectCaughtErrorLogFields(error)\n });\n });\n\n // Reconnection handlers for visibility\n pubClient.on('reconnecting', () => {\n this.logDebug('Socket.IO Redis pubClient reconnecting...');\n });\n subClient.on('reconnecting', () => {\n this.logDebug('Socket.IO Redis subClient reconnecting...');\n });\n\n await Promise.all([\n pubClient.connect(),\n subClient.connect()\n ]);\n\n // SECURITY FIX: Use tenant-specific channel prefix for Socket.IO adapter\n // This ensures each tenant's Socket.IO messages are isolated to their own channels\n // ACL pattern &{username}#* will only allow access to channels with this prefix\n const channelPrefix = redisUsername || 'default';\n this.io.adapter(createAdapter(pubClient, subClient, { key: channelPrefix }));\n\n this.logDebug('Socket.IO Redis adapter configured for horizontal scaling', {\n redisHost,\n redisPort,\n channelPrefix,\n scalingEnabled: true,\n environment: process.env.APPLICATION_ENV || 'development'\n });\n\n } catch (error: unknown) {\n this.logger.error('Failed to setup Redis adapter, falling back to memory adapter', {\n ...projectCaughtErrorLogFields(error),\n });\n this.logger.warn('Using memory adapter - horizontal scaling will not work across pods');\n }\n }\n\n /**\n * Setup authentication middleware\n * FACTORIZED: Uses ExecutionContextCreatorBackendService for JWT validation\n */\n private setupAuthentication(): void {\n if (!this.io) return;\n\n this.io.use(async (socket, next) => {\n // The HANDSHAKE runs in its own frame. This middleware is registered BEFORE the one that frames\n // per-message traffic, so without this every socket authentication — including its classified\n // failure logging and the AUTHENTICATION_FAILED rejection — was emitted with no correlationId.\n // A rejected handshake is exactly the event an investigator wants to correlate, so leaving the\n // seam unframed lost attribution on the highest-value socket records.\n await runInFreshRequestContextIfAbsent(async () => {\n try {\n const token = socket.handshake.auth.token ||\n socket.handshake.headers.authorization?.replace('Bearer ', '');\n\n let authResult: SocketAuthResult;\n\n if (!token) {\n // No token = public connection (allowed but limited)\n authResult = this.executionContextCreator.getPublicSocketAuth();\n this.logDebug('Public socket connection (no token)');\n } else {\n // Active-organization selector from the handshake. The server validates it\n // against the user's verified memberships before seeding\n // initiatorIds.organizationId (see resolveSocketActiveOrganizationId); a\n // stale/non-member value is ignored, never trusted, so it cannot widen scope.\n const requestedOrganizationId = typeof socket.handshake.auth?.organizationId === 'string'\n ? socket.handshake.auth.organizationId\n : undefined;\n authResult = await this.executionContextCreator.authenticateSocketConnection(token, requestedOrganizationId);\n\n // W7.3b: Capture consumable token from handshake auth or headers\n const consumableToken = socket.handshake.auth?.consumableToken\n || socket.handshake.headers?.[WildoHeaderKeys.CONSUMABLE_TOKEN];\n if (consumableToken && typeof consumableToken === 'string') {\n authResult.consumableTokenValue = consumableToken;\n }\n\n this.logDebug('Authenticated socket connection', {\n executionType: authResult.executionType,\n userId: authResult.initiatorIds?.userId?.substring(0, 8) + '...',\n rolesCount: authResult.initiatorRoles.length,\n hasConsumableToken: !!authResult.consumableTokenValue,\n });\n }\n\n (socket as any).auth = authResult;\n next();\n\n } catch (error) {\n // Websocket connection auth is a non-HTTP boundary (no downstream\n // `expressErrorHandler`), so the classified line must be emitted here.\n // The classifier maps an expected self-healing condition (expired\n // access token the client will refresh) to `debug` automatically, so no\n // manual severity split is needed.\n if (isWildoBackendError(error)) {\n logWildoBackendErrorAtClassifiedSeverity(\n this.logger,\n 'WebSocket authentication failed',\n error,\n { socketId: socket.id },\n );\n } else {\n this.logger.warn('WebSocket authentication failed', {\n socketId: socket.id,\n ...projectCaughtErrorLogFields(error),\n });\n }\n // Attach a machine-readable code to the handshake rejection. Socket.IO\n // forwards `err.data` verbatim to the client's `connect_error` handler,\n // so the frontend can tell an AUTH rejection (self-healable — refresh\n // the access token and reconnect) apart from a transport failure WITHOUT\n // matching on this human-readable message string. This is what lets a\n // backgrounded/unfocused tab renew its token and keep its socket alive\n // across access-token expiry, instead of replaying the expired token\n // until the user refocuses and HTTP traffic triggers a reactive refresh.\n const authError: Error & { data?: unknown } = new Error('Authentication failed');\n authError.data = { code: CoreWebSocketConnectionErrorCode.AUTHENTICATION_FAILED };\n next(authError);\n }\n });\n });\n }\n\n /**\n * Setup rate limiting middleware\n * Uses Redis for cross-pod synchronization of rate limit counters\n */\n private setupRateLimiting(): void {\n if (!this.io) return;\n\n // Intercept all incoming events with rate limiting\n this.io.use(async (socket, next) => {\n // Override socket.on to wrap event handlers with rate limiting\n const originalOn = socket.on.bind(socket);\n\n (socket as any).on = (event: string, handler: (...args: any[]) => void) => {\n // Internal Socket.IO events skip RATE LIMITING — they are lifecycle signals, not user-driven\n // traffic, so throttling them would be meaningless. They do NOT skip the request frame: a\n // `disconnect` runs real cleanup (room teardown, presence, any audit that follows), and an\n // unframed cleanup produces log lines and audit rows with no correlationId. Framing here rather\n // than leaving the branch bare is what keeps \"every socket seam is attributable\" true — the two\n // concerns (throttle vs attribute) were previously coupled only because they shared this wrapper.\n if (event.startsWith('$') || ['connect', 'disconnect', 'error'].includes(event)) {\n return originalOn(event, async (...args: any[]) => {\n await runInFreshRequestContextIfAbsent(() => handler(...args), {\n clientInstanceId: typeof socket.handshake.auth?.clientInstanceId === 'string'\n ? socket.handshake.auth.clientInstanceId\n : undefined,\n frontendServiceName: typeof socket.handshake.auth?.frontendServiceName === 'string'\n ? socket.handshake.auth.frontendServiceName\n : undefined,\n });\n });\n }\n\n // Wrap handler with rate limiting check\n return originalOn(event, async (...args: any[]) => {\n const auth = (socket as any).auth as SocketAuthResult;\n const identifier = auth.initiatorIds?.userId || socket.id;\n\n const allowed = await this.checkRateLimit(identifier, event, auth.initiatorIds?.organizationId);\n if (!allowed) {\n // Rate limit exceeded - emit error and skip handler\n socket.emit(CoreWebSocketEvent.SYSTEM_ERROR, {\n code: 'RATE_LIMIT_EXCEEDED',\n message: `Too many ${event} requests. Please slow down.`,\n details: { event }\n });\n this.logDebug('Rate limit exceeded', {\n identifier: identifier.substring(0, 8),\n event\n });\n return;\n }\n\n // Phase 1 — enter a fresh request-context frame per socket event so its logs, EC, and audit\n // rows carry ONE correlation id. Each socket message is a distinct operation.\n // Phase 5b — carry the CONNECTION's client-install id (sent once in the handshake `auth`\n // payload, since a socket has no per-message headers) onto every message's frame, so socket\n // -originated audit rows attribute to the same install as this client's HTTP rows. Admission\n // is still decided by the ingest policy inside `buildRequestContextFrame` — an application\n // that did not opt in records nothing here either.\n runInFreshRequestContextIfAbsent(() => handler(...args), {\n clientInstanceId: typeof socket.handshake.auth?.clientInstanceId === 'string'\n ? socket.handshake.auth.clientInstanceId\n : undefined,\n // Origin SURFACE, carried for the same reason and from the same handshake. Without it,\n // socket-originated audit rows would record WHICH INSTALL but not WHICH SURFACE, while\n // HTTP rows record both — an asymmetry with no rationale behind it.\n frontendServiceName: typeof socket.handshake.auth?.frontendServiceName === 'string'\n ? socket.handshake.auth.frontendServiceName\n : undefined,\n });\n });\n };\n\n next();\n });\n }\n\n /**\n * Check rate limit for an event using Redis\n * Returns true if allowed, false if rate limited\n *\n * Uses fixed-window Redis INCR and EXPIRE counters.\n */\n private async checkRateLimit(\n identifier: string,\n event: string,\n organizationId?: string,\n ): Promise<boolean> {\n const config = DEFAULT_RATE_LIMITS[event] || DEFAULT_RATE_LIMITS['default'];\n // Non-production relaxation of the per-event ceiling (shared seam — see\n // `rate-limit-environment-relaxation.backend.utils`). The counter still increments\n // through the real Redis path in every environment, so a key/TTL regression still\n // reproduces locally; only the ceiling moves.\n const effectiveMaxEvents = relaxAbuseThrottleMaxForEnvironment(config.maxEvents, this.configService.applicationEnv);\n\n try {\n const count = await this.redisService.incrementRateLimit(\n `ws:${identifier}:${event}`,\n config.windowSeconds,\n organizationId,\n );\n return count <= effectiveMaxEvents;\n\n } catch (error) {\n // WebSocket event floods are interactive traffic; fail closed when the\n // shared counter cannot be checked instead of silently bypassing quotas.\n this.logger.warn('Rate limit check failed, blocking request', {\n identifier: identifier.substring(0, 8),\n event,\n ...projectCaughtErrorLogFields(error),\n });\n return false;\n }\n }\n\n /**\n * Setup connection handling\n * Joins user to identity-based rooms based on their roles and IDs\n * Sets up resource room handlers for collaboration\n */\n private setupConnectionHandling(): void {\n if (!this.io) return;\n\n this.io.on('connection', (socket: Socket) => {\n const auth = (socket as any).auth as SocketAuthResult;\n\n // Track authenticated socket\n this.authenticatedSockets.set(socket.id, auth);\n\n // Idle-activity tracking: stamp connect time, then bump on every inbound app-level event. The\n // idle sweep force-disconnects a socket with no inbound activity for WEBSOCKET_IDLE_TIMEOUT_MS.\n // `onAny` fires for app events only — NOT Socket.IO pings and NOT server→client pushes — so a\n // purely passive subscriber is treated as idle by design (see WEBSOCKET_IDLE_TIMEOUT_MS).\n (socket as SocketWithActivity).lastActivityAt = Date.now();\n socket.onAny(() => { (socket as SocketWithActivity).lastActivityAt = Date.now(); });\n\n // === IDENTITY-BASED ROOM ASSIGNMENT ===\n\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n // Public users only join public room\n socket.join(WebSocketRoomPrefix.PUBLIC);\n this.logDebug('Public socket connected', { socketId: socket.id });\n\n // Still setup disconnect handler\n socket.on('disconnect', () => {\n this.handleSocketDisconnection(socket.id, this.getSocketAuth(socket));\n });\n return;\n }\n\n // User: Join organization-based rooms from their roles\n for (const roleInfo of auth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS && roleInfo.relatedResourceId) {\n const orgId = roleInfo.relatedResourceId;\n\n // Organization room (receives all org-wide notifications)\n socket.join(buildOrganizationRoomName(orgId));\n\n // Track organization sockets\n if (!this.organizationSockets.has(orgId)) {\n this.organizationSockets.set(orgId, new Set());\n }\n this.organizationSockets.get(orgId)!.add(socket.id);\n\n // Role-specific rooms (for role-targeted notifications)\n for (const role of roleInfo.roles || []) {\n socket.join(buildOrganizationRoleRoomName(orgId, role));\n }\n }\n\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.APPLICATION && roleInfo.relatedResourceId) {\n // App-level role room (for app admins, super admins)\n for (const role of roleInfo.roles || []) {\n socket.join(buildAppRoleRoomName(role));\n }\n }\n }\n\n // User-specific room (for direct messages, personal notifications)\n if (auth.initiatorIds?.userId) {\n socket.join(buildUserRoomName(auth.initiatorIds.userId));\n\n // Track user sockets for multi-tab support\n if (!this.userSockets.has(auth.initiatorIds.userId)) {\n this.userSockets.set(auth.initiatorIds.userId, new Set());\n }\n this.userSockets.get(auth.initiatorIds.userId)!.add(socket.id);\n }\n\n this.logDebug('Socket connected with identity rooms', {\n socketId: socket.id,\n executionType: auth.executionType,\n userId: auth.initiatorIds?.userId?.substring(0, 8),\n organizationRoles: auth.initiatorRoles.filter(r => r.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS).length\n });\n\n // === RESOURCE ROOM HANDLERS (for collaboration) ===\n this.setupResourceRoomHandlers(socket);\n\n // === BADGE HANDLERS ===\n this.setupBadgeHandlers(socket);\n\n // === BADGE SEED (compute-on-connect) ===\n // Fire-and-forget: recompute/emit the connecting user's badges so the client\n // paints current counts on first render (derived badges especially, which\n // otherwise read 0 until the next source mutation). Never blocks the handler.\n void this.seedBadgesOnConnect(auth);\n\n // === SYSTEM EVENT HANDLERS ===\n this.setupSystemEventHandlers(socket);\n\n // === FLOWS-ACTORS CONVERSATION HANDLERS ===\n this.setupFlowsActorsHandlers(socket);\n\n // === DISCONNECTION HANDLING ===\n socket.on('disconnect', () => {\n this.handleSocketDisconnection(socket.id, this.getSocketAuth(socket));\n });\n });\n }\n\n /**\n * Setup handlers for resource-centric rooms (collaboration, editing locks, custom events)\n * These rooms are path-independent - same resource = same room regardless of access path\n */\n private setupResourceRoomHandlers(socket: Socket): void {\n\n // === SUBSCRIBE TO RESOURCE ROOM ===\n socket.on(CoreWebSocketEvent.RESOURCE_SUBSCRIBE, async (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceSubscribePayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n socket.emit(CoreWebSocketEvent.RESOURCE_SUBSCRIBED, {\n roomName: '',\n success: false,\n error: `Invalid payload: ${parseResult.error.issues[0]?.message || 'validation failed'}`\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId, scopeKey, scopeId, contextResourceIdentifiers } = payload;\n\n // Validate contextResourceIdentifiers has at least one entry\n if (!contextResourceIdentifiers || Object.keys(contextResourceIdentifiers).length === 0) {\n socket.emit(CoreWebSocketEvent.RESOURCE_SUBSCRIBED, {\n roomName: '',\n success: false,\n error: 'contextResourceIdentifiers is required for authorization'\n });\n return;\n }\n\n try {\n const auth = this.getSocketAuth(socket);\n // Verify READ access using full context (organization, parent resources, etc.)\n if (resourceId) {\n await this.verifyResourceAccess(socket, auth, resourceType, resourceId, contextResourceIdentifiers);\n } else if (scopeKey && scopeId) {\n // For collection subscription, verify context access\n await this.verifyScopeAccess(auth, resourceType, scopeKey, scopeId, contextResourceIdentifiers);\n } else {\n throw this.errorBuilder.buildError(ErrorType.VALIDATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.SERVICE_RESOURCE_VALIDATION_FAILED,\n context: { operation: 'resourceSubscribe' }, // diagnostic (log-only)\n });\n }\n\n // Build room name\n const roomName = resourceId\n ? buildResourceRoomName(resourceType, resourceId)\n : buildScopeRoomName(resourceType, scopeKey!, scopeId!);\n\n socket.join(roomName);\n this.trackSocketResourceSubscription(socket.id, {\n ...payload,\n roomName,\n });\n\n // Get current editing users for this resource (if subscribing to specific resource)\n let editingUsers: string[] = [];\n if (resourceId) {\n editingUsers = await this.getResourceEditingUsers(resourceType, resourceId);\n }\n\n socket.emit(CoreWebSocketEvent.RESOURCE_SUBSCRIBED, {\n roomName,\n success: true,\n editingUsers, // Include current editing users in subscription confirmation\n });\n\n this.logDebug('Socket subscribed to resource room', {\n socketId: socket.id,\n roomName,\n userId: auth.initiatorIds?.userId?.substring(0, 8),\n contextKeys: Object.keys(contextResourceIdentifiers),\n editingUsersCount: editingUsers.length\n });\n\n } catch (error) {\n // Resource-subscribe is a non-HTTP boundary — emit the classified line\n // here (an authorization/scope failure would otherwise be invisible in\n // the logs now that errors no longer self-log at construction).\n if (isWildoBackendError(error)) {\n logWildoBackendErrorAtClassifiedSeverity(\n this.logger,\n 'WebSocket resource subscription failed',\n error,\n { socketId: socket.id, resourceType, resourceId, scopeKey, scopeId },\n );\n } else {\n this.logger.warn('WebSocket resource subscription failed', {\n socketId: socket.id,\n resourceType,\n ...projectCaughtErrorLogFields(error),\n });\n }\n const roomName = resourceId\n ? buildResourceRoomName(resourceType, resourceId)\n : buildScopeRoomName(resourceType, scopeKey || '', scopeId || '');\n socket.emit(CoreWebSocketEvent.RESOURCE_SUBSCRIBED, {\n roomName,\n success: false,\n error: error instanceof Error ? error.message : 'Access denied'\n });\n }\n });\n\n // === UNSUBSCRIBE FROM RESOURCE ROOM ===\n socket.on(CoreWebSocketEvent.RESOURCE_UNSUBSCRIBE, (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceSubscribePayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n socket.emit(CoreWebSocketEvent.RESOURCE_UNSUBSCRIBED, {\n roomName: '',\n success: false,\n error: `Invalid payload: ${parseResult.error.issues[0]?.message || 'validation failed'}`\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId, scopeKey, scopeId } = payload;\n\n const roomName = resourceId\n ? buildResourceRoomName(resourceType, resourceId)\n : buildScopeRoomName(resourceType, scopeKey!, scopeId!);\n\n socket.leave(roomName);\n this.untrackSocketResourceSubscription(socket.id, roomName);\n socket.emit(CoreWebSocketEvent.RESOURCE_UNSUBSCRIBED, { roomName, success: true });\n\n this.logDebug('Socket unsubscribed from resource room', { socketId: socket.id, roomName });\n });\n\n // === START EDITING (LOCK) ===\n socket.on(CoreWebSocketEvent.RESOURCE_EDITING_START, async (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceEditingPayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_ERROR, {\n resourceType: '',\n resourceId: '',\n success: false,\n error: `Invalid payload: ${parseResult.error.issues[0]?.message || 'validation failed'}`\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId, contextResourceIdentifiers } = payload;\n const auth = this.getSocketAuth(socket);\n const userId = auth.initiatorIds?.userId;\n\n if (!userId) {\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_ERROR, {\n resourceType,\n resourceId,\n success: false,\n error: 'Authentication required for editing'\n });\n return;\n }\n\n // Validate contextResourceIdentifiers is provided\n if (!contextResourceIdentifiers || Object.keys(contextResourceIdentifiers).length === 0) {\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_ERROR, {\n resourceType,\n resourceId,\n success: false,\n error: 'contextResourceIdentifiers is required for authorization'\n });\n return;\n }\n\n try {\n // Verify user has WRITE access to edit this resource (using UPDATE operation)\n await this.verifyResourceAccessForEdit(socket, auth, resourceType, resourceId, contextResourceIdentifiers);\n\n const roomName = buildResourceRoomName(resourceType, resourceId);\n\n // Track editing state in memory + Redis for cross-pod sync\n await this.trackEditingState(resourceType, resourceId, userId, 'start');\n\n // Broadcast to room (exclude sender) - don't include contextResourceIdentifiers in broadcast\n const eventPayload: WS_ResourceEditingPayload = {\n resourceType,\n resourceId,\n initiatorUserId: userId,\n timestamp: new Date(),\n };\n socket.to(roomName).emit(CoreWebSocketEvent.RESOURCE_EDITING_START, eventPayload);\n\n // Confirm to sender\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_STARTED, { resourceType, resourceId, success: true });\n\n this.logDebug('User started editing resource', {\n userId: userId.substring(0, 8),\n resourceType,\n resourceId: resourceId.substring(0, 8)\n });\n\n } catch (error) {\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_ERROR, {\n resourceType,\n resourceId,\n success: false,\n error: 'Access denied'\n });\n }\n });\n\n // === STOP EDITING (UNLOCK) ===\n socket.on(CoreWebSocketEvent.RESOURCE_EDITING_END, async (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceEditingPayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n // Silent fail for editing end (not critical)\n this.logDebug('Invalid editing end payload', {\n error: parseResult.error.issues[0]?.message\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId } = payload;\n const auth = this.getSocketAuth(socket);\n const userId = auth.initiatorIds?.userId;\n\n if (!userId) return;\n\n const roomName = buildResourceRoomName(resourceType, resourceId);\n\n // Clear editing state\n await this.trackEditingState(resourceType, resourceId, userId, 'end');\n\n // Broadcast to room (exclude sender)\n const eventPayload: WS_ResourceEditingPayload = {\n resourceType,\n resourceId,\n initiatorUserId: userId,\n timestamp: new Date(),\n };\n socket.to(roomName).emit(CoreWebSocketEvent.RESOURCE_EDITING_END, eventPayload);\n\n this.logDebug('User stopped editing resource', {\n userId: userId.substring(0, 8),\n resourceType,\n resourceId: resourceId.substring(0, 8)\n });\n });\n\n // === CUSTOM COLLABORATION EVENT ===\n socket.on(CoreWebSocketEvent.RESOURCE_CUSTOM, async (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceCustomEventPayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n socket.emit(CoreWebSocketEvent.RESOURCE_CUSTOM_ERROR, {\n eventName: '',\n error: `Invalid payload: ${parseResult.error.issues[0]?.message || 'validation failed'}`\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId, eventName, data, includeSelf, contextResourceIdentifiers } = payload;\n const auth = this.getSocketAuth(socket);\n const userId = auth.initiatorIds?.userId;\n\n // Validate contextResourceIdentifiers is provided\n if (!contextResourceIdentifiers || Object.keys(contextResourceIdentifiers).length === 0) {\n socket.emit(CoreWebSocketEvent.RESOURCE_CUSTOM_ERROR, { eventName, error: 'contextResourceIdentifiers is required' });\n return;\n }\n\n try {\n // Verify READ access (custom events require at least read access)\n await this.verifyResourceAccess(socket, auth, resourceType, resourceId, contextResourceIdentifiers);\n\n const roomName = buildResourceRoomName(resourceType, resourceId);\n\n // Build outgoing event payload (don't include contextResourceIdentifiers in broadcast)\n const eventPayload: WS_ResourceCustomEventPayload = {\n resourceType,\n resourceId,\n eventName,\n data,\n initiatorUserId: userId,\n timestamp: new Date(),\n // Include resourceData and dataMode if present in the incoming payload\n resourceData: payload.resourceData,\n dataMode: payload.dataMode,\n };\n\n // Validate and transform resource data if present\n if (payload.resourceData) {\n const dataMode = this.extractDataMode(payload);\n const validation = this.validateAndTransformResourceData(\n payload.resourceData,\n resourceType,\n undefined, // Custom events don't have operationIdentifier\n dataMode,\n );\n if (validation.success) {\n eventPayload.resourceData = validation.data;\n } else {\n delete eventPayload.resourceData;\n delete eventPayload.dataMode;\n }\n }\n\n // Broadcast to room (include or exclude sender based on flag)\n if (includeSelf) {\n this.io!.to(roomName).emit(CoreWebSocketEvent.RESOURCE_CUSTOM, eventPayload);\n } else {\n socket.to(roomName).emit(CoreWebSocketEvent.RESOURCE_CUSTOM, eventPayload);\n }\n\n } catch (error) {\n socket.emit(CoreWebSocketEvent.RESOURCE_CUSTOM_ERROR, { eventName, error: 'Access denied' });\n }\n });\n }\n\n /**\n * Setup system event handlers (auth refresh, organization switch)\n */\n private setupSystemEventHandlers(socket: Socket): void {\n // Token refresh handling\n socket.on(CoreWebSocketEvent.AUTH_REFRESH, async (payload: { token: string }) => {\n try {\n const oldAuth = (socket as any).auth as SocketAuthResult;\n const newAuth = await this.executionContextCreator.authenticateSocketConnection(payload.token);\n\n // W7.3b: Carry forward consumable token across auth refreshes\n if (oldAuth.consumableTokenValue) {\n newAuth.consumableTokenValue = oldAuth.consumableTokenValue;\n }\n\n // Preserve the connection's active organization across token refresh when it\n // is still a valid membership. `newAuth` is re-resolved without the original\n // handshake selector, so a multi-org connection would otherwise lose its\n // pinned org (and single-org inference would silently re-pick the sole org).\n if (\n oldAuth.initiatorIds?.organizationId\n && newAuth.initiatorIds\n && this.hasOrganizationAccess(newAuth, oldAuth.initiatorIds.organizationId)\n ) {\n newAuth.initiatorIds.organizationId = oldAuth.initiatorIds.organizationId;\n }\n\n (socket as any).auth = newAuth;\n this.authenticatedSockets.set(socket.id, newAuth);\n\n // Re-assign identity rooms based on new auth\n await this.reassignIdentityRooms(socket, oldAuth, newAuth);\n await this.revalidateTrackedResourceSubscriptions(socket, newAuth);\n\n socket.emit(CoreWebSocketEvent.SYSTEM_TOKEN_REFRESHED, { success: true });\n\n this.logDebug('Socket auth refreshed and rooms reassigned', {\n socketId: socket.id,\n userId: newAuth.initiatorIds?.userId?.substring(0, 8),\n newRolesCount: newAuth.initiatorRoles.length\n });\n } catch (error) {\n // Non-HTTP boundary — classified line emitted here; the classifier maps\n // an expired access token to `debug` automatically.\n if (isWildoBackendError(error)) {\n logWildoBackendErrorAtClassifiedSeverity(\n this.logger,\n 'WebSocket auth refresh failed',\n error,\n { socketId: socket.id },\n );\n } else {\n this.logger.warn('WebSocket auth refresh failed', {\n socketId: socket.id,\n ...projectCaughtErrorLogFields(error),\n });\n }\n socket.emit(CoreWebSocketEvent.SYSTEM_ERROR, {\n code: 'AUTH_REFRESH_FAILED',\n message: isWildoBackendError(error)\n ? error.customMessageReference\n : (error instanceof Error ? error.message : 'Token refresh failed'),\n });\n }\n });\n\n // Organization switch handling\n socket.on(CoreWebSocketEvent.ORGANIZATION_SWITCH, async (payload: { organizationId: string; previousOrganizationId?: string }) => {\n const auth = this.getSocketAuth(socket);\n\n if (!this.hasOrganizationAccess(auth, payload.organizationId)) {\n socket.emit(CoreWebSocketEvent.SYSTEM_ERROR, {\n code: 'ORGANIZATION_SWITCH_FORBIDDEN',\n message: 'Access denied to the requested organization',\n });\n return;\n }\n\n // Record the now-active organization on the connection identity (membership was\n // just verified above) so org-scoped resource authorization — which reads\n // initiatorIds.organizationId — reflects the switch. `auth` is the same object\n // reference held in `authenticatedSockets`, so this updates both.\n if (auth.initiatorIds) {\n auth.initiatorIds.organizationId = payload.organizationId;\n }\n\n // Leave old organization rooms if specified\n if (payload.previousOrganizationId) {\n socket.leave(buildOrganizationRoomName(payload.previousOrganizationId));\n this.organizationSockets.get(payload.previousOrganizationId)?.delete(socket.id);\n if (this.organizationSockets.get(payload.previousOrganizationId)?.size === 0) {\n this.organizationSockets.delete(payload.previousOrganizationId);\n }\n // Leave role rooms too\n for (const roleInfo of auth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS &&\n roleInfo.relatedResourceId === payload.previousOrganizationId) {\n for (const role of roleInfo.roles || []) {\n socket.leave(buildOrganizationRoleRoomName(payload.previousOrganizationId, role));\n }\n }\n }\n\n const trackedSubscriptions = Array.from(this.resourceSubscriptionsBySocket.get(socket.id)?.values() ?? []);\n for (const subscription of trackedSubscriptions) {\n if (!subscriptionMatchesOrganization(subscription, payload.previousOrganizationId)) {\n continue;\n }\n await this.revokeTrackedResourceSubscription({\n socket,\n auth,\n subscription,\n reason: 'organization_switch',\n });\n }\n }\n\n // Join new organization rooms\n socket.join(buildOrganizationRoomName(payload.organizationId));\n if (!this.organizationSockets.has(payload.organizationId)) {\n this.organizationSockets.set(payload.organizationId, new Set());\n }\n this.organizationSockets.get(payload.organizationId)!.add(socket.id);\n\n // Find roles for the new organization and join role rooms\n for (const roleInfo of auth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS &&\n roleInfo.relatedResourceId === payload.organizationId) {\n for (const role of roleInfo.roles || []) {\n socket.join(buildOrganizationRoleRoomName(payload.organizationId, role));\n }\n }\n }\n\n this.logDebug('Organization switched', {\n socketId: socket.id,\n previousOrganizationId: payload.previousOrganizationId?.substring(0, 8),\n newOrganizationId: payload.organizationId.substring(0, 8)\n });\n });\n }\n\n /**\n * Reassign identity-based rooms when auth is refreshed\n * Handles role changes, organization membership changes, etc.\n */\n private async reassignIdentityRooms(\n socket: Socket,\n oldAuth: SocketAuthResult,\n newAuth: SocketAuthResult\n ): Promise<void> {\n // === LEAVE OLD ROOMS ===\n\n // Leave old user room if user ID changed (unlikely but possible)\n if (oldAuth.initiatorIds?.userId && oldAuth.initiatorIds.userId !== newAuth.initiatorIds?.userId) {\n socket.leave(buildUserRoomName(oldAuth.initiatorIds.userId));\n // Update user sockets tracking\n this.userSockets.get(oldAuth.initiatorIds.userId)?.delete(socket.id);\n }\n\n // Build sets of old and new organization rooms for comparison\n const oldOrgRooms = new Set<string>();\n const oldRoleRooms = new Set<string>();\n for (const roleInfo of oldAuth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS && roleInfo.relatedResourceId) {\n oldOrgRooms.add(buildOrganizationRoomName(roleInfo.relatedResourceId));\n for (const role of roleInfo.roles || []) {\n oldRoleRooms.add(buildOrganizationRoleRoomName(roleInfo.relatedResourceId, role));\n }\n }\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.APPLICATION) {\n for (const role of roleInfo.roles || []) {\n oldRoleRooms.add(buildAppRoleRoomName(role));\n }\n }\n }\n\n const newOrgRooms = new Set<string>();\n const newRoleRooms = new Set<string>();\n for (const roleInfo of newAuth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS && roleInfo.relatedResourceId) {\n newOrgRooms.add(buildOrganizationRoomName(roleInfo.relatedResourceId));\n for (const role of roleInfo.roles || []) {\n newRoleRooms.add(buildOrganizationRoleRoomName(roleInfo.relatedResourceId, role));\n }\n }\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.APPLICATION) {\n for (const role of roleInfo.roles || []) {\n newRoleRooms.add(buildAppRoleRoomName(role));\n }\n }\n }\n\n // Leave org rooms that are no longer in new auth\n for (const room of oldOrgRooms) {\n if (!newOrgRooms.has(room)) {\n socket.leave(room);\n // Update organization sockets tracking\n const orgId = parseOrganizationRoomName(room);\n if (orgId) {\n this.organizationSockets.get(orgId)?.delete(socket.id);\n }\n }\n }\n\n // Leave role rooms that are no longer in new auth\n for (const room of oldRoleRooms) {\n if (!newRoleRooms.has(room)) {\n socket.leave(room);\n }\n }\n\n // Leave public room if was public but now authenticated\n if (oldAuth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION &&\n newAuth.executionType !== ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n socket.leave(WebSocketRoomPrefix.PUBLIC);\n }\n\n // === JOIN NEW ROOMS ===\n\n // Join new user room\n if (newAuth.initiatorIds?.userId) {\n socket.join(buildUserRoomName(newAuth.initiatorIds.userId));\n if (!this.userSockets.has(newAuth.initiatorIds.userId)) {\n this.userSockets.set(newAuth.initiatorIds.userId, new Set());\n }\n this.userSockets.get(newAuth.initiatorIds.userId)!.add(socket.id);\n }\n\n // Join new org rooms\n for (const room of newOrgRooms) {\n if (!oldOrgRooms.has(room)) {\n socket.join(room);\n const orgId = parseOrganizationRoomName(room);\n if (orgId) {\n if (!this.organizationSockets.has(orgId)) {\n this.organizationSockets.set(orgId, new Set());\n }\n this.organizationSockets.get(orgId)!.add(socket.id);\n }\n }\n }\n\n // Join new role rooms\n for (const room of newRoleRooms) {\n if (!oldRoleRooms.has(room)) {\n socket.join(room);\n }\n }\n\n // Join public room if now public\n if (newAuth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n socket.join(WebSocketRoomPrefix.PUBLIC);\n }\n }\n\n /**\n * Setup flows-actors conversation handlers (`flows-actors:start`,\n * `flows-actors:approval-response`).\n *\n * Validates the inbound payload, resolves the connecting user's identity from\n * the validated socket auth, builds an emitter bound to that user's room (so\n * all their tabs receive the stream), and delegates to the conversational\n * runtime. Every server→client event (started / message / status / completed /\n * error) flows back through the emitter; synchronous validation/auth failures\n * reply on the socket directly.\n */\n private setupFlowsActorsHandlers(socket: Socket): void {\n socket.on(CoreWebSocketEvent.FLOWS_ACTORS_START, async (rawPayload: unknown) => {\n const parsed = WS_FlowsActorsStartPayloadSchema.safeParse(rawPayload);\n if (!parsed.success) {\n this.emitFlowsActorsInvalidPayload(socket, rawPayload, parsed.error.issues[0]?.message);\n return;\n }\n const auth = this.getSocketAuth(socket);\n const initiator = auth?.initiatorIds;\n if (!initiator?.userId || auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n socket.emit(CoreWebSocketEvent.FLOWS_ACTORS_ERROR, {\n systemRef: parsed.data.systemRef,\n executionId: parsed.data.executionId ?? '',\n errorCode: 'UNAUTHENTICATED',\n errorMessage: 'Authentication is required to start a conversation.',\n recoverable: false,\n });\n return;\n }\n const userId = initiator.userId;\n const emitter: FlowsActorsExecutionEmitter = (event, payload) => {\n if (!this.io) return;\n this.io.to(buildUserRoomName(userId)).emit(event, payload);\n };\n // N/A on `resourceServerInstanceRef`: the WebSocket surface serves no A2A agent, so the\n // conversation records the default-agent sentinel. Written HERE, not only on the parameter\n // declaration — the two sites that lost this axis (finding A-1) carried no comment at all,\n // and an unmarked omission is indistinguishable from an oversight.\n await this.getConversationalExecutionService().startConversationalExecution({\n systemRef: parsed.data.systemRef,\n executionId: parsed.data.executionId,\n initialInput: parsed.data.initialInput,\n initiator,\n auth,\n // The WS chat channel is user-scoped (results stream to the user's room) →\n // the conversation is owned by the user variant (userFlowActorExecutions).\n scopeContext: { userId },\n emitter,\n });\n });\n\n socket.on(CoreWebSocketEvent.FLOWS_ACTORS_APPROVAL_RESPONSE, async (rawPayload: unknown) => {\n const parsed = WS_FlowsActorsApprovalResponsePayloadSchema.safeParse(rawPayload);\n if (!parsed.success) {\n this.emitFlowsActorsInvalidPayload(socket, rawPayload, parsed.error.issues[0]?.message);\n return;\n }\n const auth = this.getSocketAuth(socket);\n const initiator = auth?.initiatorIds;\n if (!initiator?.userId) return;\n await this.getConversationalExecutionService().respondToApproval({\n systemRef: parsed.data.systemRef,\n executionId: parsed.data.executionId,\n approvalId: parsed.data.approvalId,\n approved: parsed.data.approved,\n scopeContext: { userId: initiator.userId },\n // The APPROVER's verified auth. The resumed turn executes the gated tool, and it must do so\n // with a real identity — without this the agent resolves no tools at all and the approval\n // completes having done nothing. Passing the socket's own auth (never anything from the\n // payload) also means approving cannot reach past what the approver could already do.\n auth,\n // Threaded, never defaulted here. Defaulting is what made a named-instance approval\n // unresumable: the resume filtered on the DEFAULT sentinel while the paused execution had\n // been written with the named ref, so the read matched nothing and returned silently.\n resourceServerInstanceRef: parsed.data.resourceServerInstanceRef,\n });\n });\n }\n\n /** Reply on the initiating socket with a `FLOWS_ACTORS_ERROR` for a malformed inbound payload. */\n private emitFlowsActorsInvalidPayload(socket: Socket, rawPayload: unknown, issue?: string): void {\n const raw = (rawPayload ?? {}) as Record<string, unknown>;\n socket.emit(CoreWebSocketEvent.FLOWS_ACTORS_ERROR, {\n systemRef: typeof raw.systemRef === 'string' ? raw.systemRef : '',\n executionId: typeof raw.executionId === 'string' ? raw.executionId : '',\n errorCode: 'INVALID_PAYLOAD',\n errorMessage: `Invalid flows-actors payload: ${issue ?? 'validation failed'}`,\n recoverable: false,\n });\n }\n\n /**\n * Setup badge handlers (badge:get, badge:get-all)\n * Enables frontend useBadge and useUserBadges hooks\n */\n /**\n * Seed the connecting user's notification badges (compute-on-connect, R6a).\n *\n * Builds an execution context from the VALIDATED socket auth (the user's own\n * authenticated identity — not a system-privileged context) and asks the badge\n * service to recompute derived badges + re-emit event badges for the socket's\n * scope. Scope is pinned to `auth.initiatorIds` (server-validated), so no\n * cross-tenant read is possible. Fire-and-forget; failures are logged only.\n */\n private async seedBadgesOnConnect(auth: SocketAuthResult): Promise<void> {\n try {\n // The badge service builds its own scope-correct execution contexts for\n // each badge's source count + badge write, so the seed only needs a\n // resolvable internal context to pass through. Use a repository-direct\n // internal EC — NOT the socket-auth `APPLICATION.READ` EC, whose internal\n // reuse threw \"Cannot read properties of undefined (reading 'operations')\".\n // Scope stays pinned to the server-validated `auth.initiatorIds`.\n const executionContext = await this.executionContextCreator.createForInternalRepositoryOperation({\n resourceType: CoreResourceType.USER_NOTIFICATION_BADGES,\n operationIdentifier: CoreResourceOperation.CREATE,\n });\n await this.getBadgeService().syncBadgesForConnection(executionContext, auth.initiatorIds ?? {});\n } catch (error) {\n this.logger.warn('Failed to seed badges on connect', {\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n\n private setupBadgeHandlers(socket: Socket): void {\n // badge:get - Get single badge count\n socket.on(CoreWebSocketEvent.BADGE_GET, async (\n payload: { identifier: string; scope: string; scopeId: string },\n callback?: (response: { count: number }) => void\n ) => {\n if (!callback) return;\n\n try {\n const auth = this.getSocketAuth(socket);\n // Verify user has access to this scope\n if (!this.verifyBadgeScopeAccess(auth, payload.scope as ResourcePrimaryScope, payload.scopeId)) {\n callback({ count: 0 });\n return;\n }\n\n // Build a minimal execution context for the badge service\n const appReadOp = this.resourcesRegistry.getOperationFromPath(\n this.resourcesRegistry.getOperationPathDefault('APPLICATION', CoreResourceOperation.READ)\n );\n if (!appReadOp) {\n callback({ count: 0 });\n return;\n }\n\n const executionContext = await this.executionContextCreator.buildContextFromSocketAuth(\n auth,\n appReadOp,\n {}\n );\n\n const count = await this.getBadgeService().getBadgeCount(\n executionContext,\n payload.scope as ResourcePrimaryScope,\n payload.scopeId,\n payload.identifier as any\n );\n\n callback({ count });\n } catch (error) {\n this.logger.warn('Failed to get badge count', {\n ...projectCaughtErrorLogFields(error)\n });\n callback({ count: 0 });\n }\n });\n\n // badge:get-all - Get all badges for a scope\n socket.on(CoreWebSocketEvent.BADGE_GET_ALL, async (\n payload: { scope: string; scopeId: string },\n callback?: (response: Array<{ identifier: string; count: number }>) => void\n ) => {\n if (!callback) return;\n\n try {\n const auth = this.getSocketAuth(socket);\n // Verify user has access to this scope\n if (!this.verifyBadgeScopeAccess(auth, payload.scope as ResourcePrimaryScope, payload.scopeId)) {\n callback([]);\n return;\n }\n\n // Build a minimal execution context for the badge service\n const appReadOp = this.resourcesRegistry.getOperationFromPath(\n this.resourcesRegistry.getOperationPathDefault('APPLICATION', CoreResourceOperation.READ)\n );\n if (!appReadOp) {\n callback([]);\n return;\n }\n\n const executionContext = await this.executionContextCreator.buildContextFromSocketAuth(\n auth,\n appReadOp,\n {}\n );\n\n const badges = await this.getBadgeService().getAllBadges(\n executionContext,\n payload.scope as ResourcePrimaryScope,\n payload.scopeId\n );\n\n callback(badges);\n } catch (error) {\n this.logger.warn('Failed to get all badges', {\n ...projectCaughtErrorLogFields(error)\n });\n callback([]);\n }\n });\n }\n\n /**\n * Verify user has access to a badge scope\n */\n private verifyBadgeScopeAccess(\n auth: SocketAuthResult,\n scope: ResourcePrimaryScope,\n scopeId: string\n ): boolean {\n // Public users cannot access badges\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n return false;\n }\n\n switch (scope) {\n case ResourcePrimaryScope.USER_SELF:\n // User can only access their own badges\n return auth.initiatorIds?.userId === scopeId;\n\n case ResourcePrimaryScope.ORGANIZATIONS:\n // User must be member of the organization\n return auth.initiatorRoles.some(\n r => r.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS &&\n r.relatedResourceId === scopeId\n );\n\n case ResourcePrimaryScope.APPLICATION:\n // Application-level badges - check if user has any app roles\n return auth.initiatorRoles.some(\n r => r.relatedPrimaryScope === ResourcePrimaryScope.APPLICATION\n );\n\n default:\n return false;\n }\n }\n\n // =====================================================\n // AUTHORIZATION HELPERS (FACTORIZED with HTTP)\n // =====================================================\n\n /**\n * Verify user has READ access to a specific resource\n *\n * REUSES: AuthorizationsBackendService.authorizeInController()\n * This is the EXACT same method used by HTTP controllers\n */\n private async verifyResourceAccess(\n socket: Socket,\n auth: SocketAuthResult,\n resourceType: string,\n resourceId: string,\n contextResourceIdentifiers: Record<string, string>\n ): Promise<void> {\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { resourceType, resourceId }, // diagnostic (log-only)\n });\n }\n\n await this.authorizeSocketResourceAgainstDefaultOperation(\n auth,\n resourceType,\n resourceId,\n contextResourceIdentifiers,\n CoreResourceOperation.READ,\n );\n }\n\n /**\n * Verify user has WRITE access to edit a resource (for editing lock)\n *\n * REUSES: AuthorizationsBackendService.authorizeInController() with UPDATE operation\n */\n private async verifyResourceAccessForEdit(\n socket: Socket,\n auth: SocketAuthResult,\n resourceType: string,\n resourceId: string,\n contextResourceIdentifiers: Record<string, string>\n ): Promise<void> {\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { resourceType, resourceId }, // diagnostic (log-only)\n });\n }\n\n await this.authorizeSocketResourceAgainstDefaultOperation(\n auth,\n resourceType,\n resourceId,\n contextResourceIdentifiers,\n CoreResourceOperation.UPDATE,\n );\n }\n\n /**\n * Verify user has access to a scope (for collection subscriptions)\n *\n * REUSES: Role-based check for organization scope, or AuthorizationsBackendService for parent resources\n */\n private async verifyScopeAccess(\n auth: SocketAuthResult,\n /**\n * The resource whose collection is being subscribed to.\n *\n * Needed because APPLICATION scope authorizes THIS resource rather than the scope — see the\n * branch below. The other scopes do not read it, and that asymmetry is the point.\n */\n resourceType: string,\n scopeKey: string,\n scopeId: string,\n contextResourceIdentifiers: Record<string, string>\n ): Promise<void> {\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { scopeKey, scopeId }, // diagnostic (log-only)\n });\n }\n\n const normalizedScopeKey = scopeKey.trim().toLowerCase();\n\n // For organization scope, just check user has role in that org\n if (normalizedScopeKey === 'org' || normalizedScopeKey === 'organization' || normalizedScopeKey === 'organizationid') {\n const hasOrgAccess = auth.initiatorRoles.some(\n r => r.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS &&\n r.relatedResourceId === scopeId\n );\n if (!hasOrgAccess) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { scopeId, scopeKey }, // diagnostic (log-only)\n });\n }\n return;\n }\n\n /*\n * APPLICATION scope authorizes the SUBSCRIBED resource, never the scope (issue #247).\n *\n * `applicationId` is a single constant per backend, so an `app` room discriminates NOTHING —\n * every authenticated caller is \"in\" it. That is precisely why it cannot be used as an\n * authorization proxy the way the two scopes above are: `org` is checked against the caller's own\n * role entries for that tenant, and a parent scope authorizes a specific parent row. Both stand\n * for \"may you see things under here\"; a constant stands for nothing.\n *\n * The tempting fix is to let this fall through to the parent branch below, since\n * `PRIMARY_SCOPE_TO_CORE_RESOURCE_TYPE` already maps APPLICATION to the `applications` resource\n * and `mapScopeKeyToResourceType` only misses it because it searches for the field identifier\n * `appId` while the real one is `applicationId`. It looks like completing an oversight. It is a\n * disclosure: READ on the `applications` row is granted to ORG_MEMBER (\"Org members can view\n * applications\"), while TEN of the eleven APPLICATION-scoped resource configs require\n * APP_ADMIN_SUPER_ADMIN — SSO connections and config, SIEM export config and DLQ, SCIM\n * provisioning, webhook config, M2M delivery logs, flows/actors task and execution. Routing\n * through the parent would hand every org member notification streams naming rows of all of them.\n *\n * So the rule this branch enforces, and which the two above satisfy only incidentally: **a scope\n * room may never grant more than a READ of what it notifies about.** Here that is asked directly,\n * on ROLES alone, because a scope subscription addresses no row.\n *\n * The PUBLIC guard at the top of this method is defence in depth rather than the primary gate: a\n * public socket joins only the public room and returns before `setupResourceRoomHandlers` ever\n * registers, so it has no `resource:subscribe` listener at all. This method is still reachable for\n * a public principal through the tracked-subscription REPLAY on auth refresh, which is why the\n * guard stays.\n */\n if (normalizedScopeKey === ResourceScopeRoomKey.APPLICATION) {\n const readOperation = this.resolveSocketAuthorizationDefaultOperation(\n resourceType,\n CoreResourceOperation.READ,\n );\n if (!readOperation) {\n throw this.errorBuilder.buildError(ErrorType.NOT_FOUND, undefined, {\n customMessageReference: ErrorCustomMessageReference.RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND,\n context: { resourceType, scopeKey, operation: CoreResourceOperation.READ },\n });\n }\n const applicationScopeContext = await this.executionContextCreator.buildContextFromSocketAuth(\n auth,\n readOperation,\n contextResourceIdentifiers,\n );\n await this.authorizationsService.authorizeOperationRolesOnly(readOperation, applicationScopeContext);\n this.logDebug('Socket application-scope authorization succeeded', { resourceType, scopeId });\n return;\n }\n\n // For other scopes (e.g., todolist), verify READ access to the parent resource\n const parentResourceType = this.mapScopeKeyToResourceType(scopeKey);\n if (!parentResourceType) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { scopeId, scopeKey }, // diagnostic (log-only)\n });\n }\n\n const scopeResourceId = contextResourceIdentifiers[`${scopeKey}Id`]\n || contextResourceIdentifiers[`${normalizedScopeKey}Id`]\n || contextResourceIdentifiers[scopeKey]\n || contextResourceIdentifiers[normalizedScopeKey]\n || scopeId;\n await this.authorizeSocketResourceAgainstDefaultOperation(\n auth,\n parentResourceType,\n scopeResourceId,\n contextResourceIdentifiers,\n CoreResourceOperation.READ,\n { scopeKey },\n );\n }\n\n /**\n * Resolve the unique default URL-bearing operation that gates socket-room\n * subscription/edit-lock authorization for a given core operation.\n *\n * **Scope.** This helper governs websocket-only authorization — socket-room\n * subscription, edit-lock acquisition, scope-collection subscription. It is\n * NOT called from HTTP request handling; HTTP controllers authorize against\n * the *specific* variant the URL targets (after `dataMode` resolution),\n * because HTTP requests bind to a single operation. Websocket subscriptions\n * are a *broad listening contract* — they cannot bind to one variant — so\n * the canonical default URL-bearing operation is the only honest gate.\n *\n * **Invariant — exactly one default URL-bearing non-bulk operation.** Returns\n * the single matching operation, or `null` when the resource registers no\n * such operation. Throws `CONFIGURATION` when more than one is registered;\n * ambiguity must be authored away, not silently resolved by array order.\n * Mirrors the OPU-19 / OPU-25 unique-default discipline applied across\n * aggregation authorization, repositories registry, and the notifications\n * dispatcher.\n *\n * **Filter rules** — keep only operations that:\n * - have the requested core operation (READ or UPDATE),\n * - are the operation default (`isOperationDefault === true`),\n * - are non-bulk,\n * - are URL-bearing (`API_CALL` or `API_CALL_WITH_CALLBACK`),\n * - declare at least one initiator (`initiatorInfos.length > 0`).\n *\n * Non-default keyed variants, bulk variants, internal/repository-only\n * variants, and operations without initiators are excluded by design — see\n * `.claude/plans/variant-authorization-audit.md` (F-2) and\n * `.claude/plans/resource-operation-variant-union-audit.md` (OPU-19, OPU-25).\n */\n private resolveSocketAuthorizationDefaultOperation(\n resourceType: string,\n coreOperation: CoreResourceOperation.READ | CoreResourceOperation.UPDATE,\n ): ResourceConfiguration_Operation<any, any, any> | null {\n const registry = this.resourcesRegistry.getResourcesRegistry();\n const resourceConfiguration = registry.resourceConfigurations[resourceType];\n\n if (!resourceConfiguration) {\n throw this.errorBuilder.buildError(ErrorType.NOT_FOUND, undefined, {\n customMessageReference: ErrorCustomMessageReference.RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND,\n context: { resourceType, operation: coreOperation },\n });\n }\n\n const candidateOperations = resourceConfiguration.operations.filter((operation) => (\n ResourceOperationsUtils.getCoreResourceOperationFromOperation(operation) === coreOperation\n && operation.isOperationDefault === true\n && !('isBulkOperation' in operation && operation.isBulkOperation === true)\n && (\n operation.variantType === ResourceOperationVariantType.API_CALL\n || operation.variantType === ResourceOperationVariantType.API_CALL_WITH_CALLBACK\n )\n && 'initiatorInfos' in operation\n && Array.isArray(operation.initiatorInfos)\n && operation.initiatorInfos.length > 0\n ));\n\n // Prefer the canonical core operation over custom ops that merely alias it via\n // `resourceOperationLike`. A socket subscription binds to the resource's\n // canonical READ/UPDATE; a READ-like custom op (e.g. an `export_*` operation\n // that declares `resourceOperationLike: READ` and is itself `isOperationDefault`)\n // is NOT the subscription gate and must not render the default ambiguous. When\n // the literal core operation is present among the candidates it wins; otherwise\n // we keep the full set — a resource that exposes the core op only via an alias\n // stays resolvable, and a genuinely ambiguous alias-only config still fails\n // closed below. (Root cause of `userSelfPreferences` READ throwing with two\n // api_call candidates: core `read` + a since-removed `export_preferences`\n // aliased to READ. That operation was deleted on 2026-08-01 as a routed no-op,\n // so this specific collision can no longer occur — but the guard is general and\n // stays: any custom op aliasing a core verb while `isOperationDefault` recreates it.)\n const canonicalCandidates = candidateOperations.filter(\n (operation) => operation.operationIdentifier === coreOperation,\n );\n const effectiveCandidates = canonicalCandidates.length > 0 ? canonicalCandidates : candidateOperations;\n\n if (effectiveCandidates.length > 1) {\n // DEBUG (2026-06-19): enriched candidate descriptor to diagnose the\n // `userSelfPreferences` READ two-candidate throw. The prior descriptor only\n // logged `{ variantType, variantKey }`, which rendered both candidates as an\n // identical `{ variantType: 'api_call' }` and hid the real cause: a custom op\n // (the since-removed `export_preferences`) that aliases READ via `resourceOperationLike`\n // and is independently `isOperationDefault`, so it co-qualifies with the\n // canonical core READ. Surfacing operationIdentifier + resourceOperationLike\n // names the ambiguity directly in the 500 context.\n const candidateVariants = effectiveCandidates.map((operation) => ({\n operationIdentifier: operation.operationIdentifier,\n resourceOperationLike: 'resourceOperationLike' in operation ? operation.resourceOperationLike : undefined,\n variantType: operation.variantType,\n variantKey: operation.variantKey,\n isOperationDefault: operation.isOperationDefault,\n isBulkOperation: 'isBulkOperation' in operation ? operation.isBulkOperation : undefined,\n initiatorCount: 'initiatorInfos' in operation && Array.isArray(operation.initiatorInfos)\n ? operation.initiatorInfos.length\n : undefined,\n }));\n this.logDebug('Ambiguous socket authorization operation candidates', {\n resourceType,\n coreOperation,\n candidateVariants,\n });\n throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND,\n context: {\n resourceType,\n operation: coreOperation,\n candidateVariants,\n message: 'Socket authorization requires exactly one default non-bulk URL-bearing operation candidate.',\n },\n });\n }\n\n return effectiveCandidates[0] ?? null;\n }\n\n /**\n * Authorize a websocket caller against the resource's canonical default\n * URL-bearing operation.\n *\n * Resolves the unique default operation via\n * `resolveSocketAuthorizationDefaultOperation` (which fails closed on\n * multi-default), then runs the standard `authorizeInController` check. The\n * helper does **not** iterate variants — non-default keyed variants are\n * structurally excluded by the resolver because their `initiatorInfos` may\n * carry stricter or laxer role guards than the canonical default, and a\n * socket subscription cannot bind to a single variant.\n *\n * Errors propagate verbatim:\n * - `AUTHORIZATION` from the canonical default → re-thrown unchanged so\n * the caller can react to denial.\n * - `NOT_FOUND` if the resource has no canonical default operation.\n * - `CONFIGURATION` if the resource registers more than one default.\n * - any other error (transport, registry) propagates unchanged.\n *\n * See `.claude/plans/variant-authorization-audit.md` (F-2) and\n * `.claude/plans/resource-operation-variant-union-audit.md` (OPU-19, OPU-25,\n * OPU-36).\n */\n private async authorizeSocketResourceAgainstDefaultOperation(\n auth: SocketAuthResult,\n resourceType: string,\n resourceId: string,\n contextResourceIdentifiers: Record<string, string>,\n coreOperation: CoreResourceOperation.READ | CoreResourceOperation.UPDATE,\n extraContext?: Record<string, unknown>,\n ): Promise<void> {\n const operation = this.resolveSocketAuthorizationDefaultOperation(resourceType, coreOperation);\n if (!operation) {\n throw this.errorBuilder.buildError(ErrorType.NOT_FOUND, undefined, {\n customMessageReference: ErrorCustomMessageReference.RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND,\n context: { resourceType, operation: coreOperation, ...extraContext },\n });\n }\n\n const executionContext = await this.executionContextCreator.buildContextFromSocketAuth(\n auth,\n operation,\n contextResourceIdentifiers,\n );\n\n await this.authorizationsService.authorizeInController(resourceId, executionContext);\n\n this.logDebug('Socket authorization succeeded', {\n resourceType,\n resourceId,\n coreOperation,\n variantKey: operation.variantKey,\n isOperationDefault: operation.isOperationDefault,\n ...extraContext,\n });\n }\n\n /**\n * Map scope key to parent resource type using the resources registry\n *\n * Scope keys follow the pattern: fieldIdentifier without 'Id' suffix\n * E.g., 'todolist' → find resource with fieldIdentifier 'todolistId' → TODOLISTS\n *\n * Uses the registry's resource configurations to dynamically resolve\n * without hardcoded mappings.\n */\n private mapScopeKeyToResourceType(scopeKey: string): string | null {\n // Build the expected field identifier\n const fieldIdentifierVariants = [\n `${scopeKey}Id`, // todolist → todolistId\n `${scopeKey.toLowerCase()}Id`, // TodoList → todolistid (case insensitive)\n ];\n\n // Search through all resource configurations\n const registry = this.resourcesRegistry.getResourcesRegistry();\n const resourceTypes = Object.keys(registry.resourceConfigurations);\n\n for (const resourceType of resourceTypes) {\n const config = registry.resourceConfigurations[resourceType];\n const configFieldId = config.resourceFieldIdentifier?.toLowerCase();\n\n for (const variant of fieldIdentifierVariants) {\n if (configFieldId === variant.toLowerCase()) {\n return resourceType;\n }\n }\n }\n\n // Also check if scopeKey is itself a resource type (direct match)\n if (registry.resourceConfigurations[scopeKey]) {\n return scopeKey;\n }\n\n // Check for case-insensitive resource type match\n const lowerScopeKey = scopeKey.toLowerCase();\n for (const resourceType of resourceTypes) {\n if (resourceType.toLowerCase() === lowerScopeKey) {\n return resourceType;\n }\n }\n\n this.logDebug('Could not map scope key to resource type', { scopeKey });\n return null;\n }\n\n // =====================================================\n // EDITING STATE TRACKING (Redis-backed for multi-pod)\n // =====================================================\n\n /**\n * Track editing state in Redis for cross-pod synchronization\n */\n private async trackEditingState(\n resourceType: string,\n resourceId: string,\n userId: string,\n action: 'start' | 'end'\n ): Promise<void> {\n const prefix = this.redisService.getAppPrefix();\n const key = `${prefix}editing:${resourceType}:${resourceId}`;\n const redisClient = this.redisService.getReadyClient();\n\n if (!redisClient) {\n // Fallback to in-memory if Redis unavailable\n if (action === 'start') {\n if (!this.resourceEditingState.has(key)) {\n this.resourceEditingState.set(key, new Set());\n }\n this.resourceEditingState.get(key)!.add(userId);\n } else {\n this.resourceEditingState.get(key)?.delete(userId);\n }\n return;\n }\n\n try {\n if (action === 'start') {\n await redisClient.hSet(key, userId, new Date().toISOString());\n await redisClient.expire(key, 3600); // 1 hour TTL (cleanup stale locks)\n } else {\n await redisClient.hDel(key, userId);\n }\n } catch (error) {\n this.logger.warn('Failed to track editing state in Redis', {\n ...projectCaughtErrorLogFields(error),\n resourceType,\n resourceId: resourceId.substring(0, 8)\n });\n }\n }\n\n /**\n * Cleanup editing states when user disconnects\n * Cleans both in-memory state AND Redis for immediate consistency across pods\n *\n * CROSS-POD SUPPORT: Uses Redis SCAN to find all editing keys across all pods\n * where this user is editing, ensuring complete cleanup.\n */\n private async cleanupEditingStatesForUser(userId: string): Promise<void> {\n if (!userId) return;\n\n const redisClient = this.redisService.getReadyClient();\n\n // Cleanup in-memory state on this pod\n for (const [key, users] of this.resourceEditingState.entries()) {\n if (users.has(userId)) {\n users.delete(userId);\n }\n }\n\n // Cross-pod cleanup: SCAN Redis for all editing:* keys where this user is editing\n if (redisClient) {\n try {\n await this.cleanupUserEditingStatesFromRedis(redisClient, userId);\n } catch (error) {\n this.logger.warn('Failed to cleanup Redis editing states on disconnect', {\n userId: userId.substring(0, 8),\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n }\n\n /**\n * SCAN Redis for all editing:* keys and remove the user from each\n * Also broadcasts editing:end to affected resource rooms\n *\n * Key format: {appPrefix}editing:{resourceType}:{resourceId}\n * Example: \"wildo-ai-app_local:editing:users:user456\"\n */\n private async cleanupUserEditingStatesFromRedis(\n redisClient: ReturnType<typeof this.redisService.getClient>,\n userId: string\n ): Promise<void> {\n if (!redisClient) return;\n\n let cursor: string = '0';\n const cleanedResources: Array<{ resourceType: string; resourceId: string }> = [];\n const prefix = this.redisService.getAppPrefix();\n\n // SCAN for all editing:* keys scoped to this application\n do {\n const result = await redisClient.scan(cursor, {\n MATCH: `${prefix}editing:*`,\n COUNT: 100, // Process in batches\n });\n\n cursor = result.cursor;\n const keys = result.keys;\n\n // Check each key for this user and remove if present\n for (const key of keys) {\n try {\n // Check if user is in this hash\n const exists = await redisClient.hExists(key, userId);\n if (exists) {\n // Remove user from this editing state\n await redisClient.hDel(key, userId);\n\n // Parse key to get resource info\n // Key format: {prefix}editing:{resourceType}:{resourceId}\n // Remove prefix first, then parse\n const keyWithoutPrefix = prefix && key.startsWith(prefix)\n ? key.slice(prefix.length)\n : key;\n const parts = keyWithoutPrefix.split(':');\n\n // parts[0] = \"editing\", parts[1] = resourceType, parts[2] = resourceId\n if (parts.length >= 3 && parts[0] === 'editing') {\n cleanedResources.push({\n resourceType: parts[1],\n resourceId: parts[2],\n });\n }\n }\n } catch (error) {\n this.logger.warn('Failed to check/delete editing state for key', {\n key,\n userId: userId.substring(0, 8),\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n } while (cursor !== '0');\n\n // Broadcast editing:end to all affected resource rooms\n for (const resource of cleanedResources) {\n const roomName = buildResourceRoomName(resource.resourceType, resource.resourceId);\n this.io?.to(roomName).emit(CoreWebSocketEvent.RESOURCE_EDITING_END, {\n resourceType: resource.resourceType,\n resourceId: resource.resourceId,\n initiatorUserId: userId,\n reason: 'disconnect',\n timestamp: new Date(),\n });\n }\n\n if (cleanedResources.length > 0) {\n this.logDebug('Cleaned up editing states for disconnected user', {\n userId: userId.substring(0, 8),\n cleanedCount: cleanedResources.length,\n });\n }\n }\n\n // =====================================================\n // DISCONNECTION HANDLING\n // =====================================================\n\n /**\n * Handle socket disconnection - cleanup state and notify rooms\n */\n private handleSocketDisconnection(socketId: string, auth: SocketAuthResult): void {\n // Remove from authenticated sockets\n this.authenticatedSockets.delete(socketId);\n this.resourceSubscriptionsBySocket.delete(socketId);\n\n const userId = auth.initiatorIds?.userId;\n\n if (userId) {\n // Remove from user sockets tracking\n const userSocketIds = this.userSockets.get(userId);\n if (userSocketIds) {\n userSocketIds.delete(socketId);\n if (userSocketIds.size === 0) {\n this.userSockets.delete(userId);\n\n // User completely disconnected - cleanup editing states\n this.cleanupEditingStatesForUser(userId);\n }\n }\n }\n\n // Remove from organization sockets\n for (const roleInfo of auth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS && roleInfo.relatedResourceId) {\n const orgSocketIds = this.organizationSockets.get(roleInfo.relatedResourceId);\n if (orgSocketIds) {\n orgSocketIds.delete(socketId);\n if (orgSocketIds.size === 0) {\n this.organizationSockets.delete(roleInfo.relatedResourceId);\n }\n }\n }\n }\n\n this.logDebug('Socket disconnected', {\n socketId,\n userId: userId?.substring(0, 8),\n remainingConnections: this.authenticatedSockets.size\n });\n }\n\n // =====================================================\n // CLEANUP\n // =====================================================\n\n /**\n * Cleanup resources\n */\n /**\n * Start the periodic idle-socket sweep. `.unref()` so this timer never keeps the process alive on its\n * own. Idempotent — a second call while a sweep is armed is a no-op.\n */\n private startIdleSocketSweep(): void {\n if (this.idleSweepInterval) return;\n this.idleSweepInterval = setInterval(() => this.sweepIdleSockets(), WEBSOCKET_IDLE_SWEEP_INTERVAL_MS);\n this.idleSweepInterval.unref?.();\n }\n\n /**\n * Force-disconnect every connection idle beyond {@link WEBSOCKET_IDLE_TIMEOUT_MS}. `disconnect(true)`\n * closes the underlying transport (not just the Socket.IO layer), and the socket's existing\n * `disconnect` handler runs the room/presence/editing-state cleanup. `lastActivityAt` is stamped at\n * connect and bumped by the `onAny` listener in the connection handler.\n */\n private sweepIdleSockets(): void {\n if (!this.io) return;\n const now = Date.now();\n for (const socket of this.io.sockets.sockets.values()) {\n const lastActivityAt = (socket as SocketWithActivity).lastActivityAt;\n if (lastActivityAt !== undefined && now - lastActivityAt > WEBSOCKET_IDLE_TIMEOUT_MS) {\n this.logDebug('Reaping idle WebSocket connection', { socketId: socket.id, idleMs: now - lastActivityAt });\n socket.disconnect(true);\n }\n }\n }\n\n public async cleanup(): Promise<void> {\n try {\n if (this.idleSweepInterval) {\n clearInterval(this.idleSweepInterval);\n this.idleSweepInterval = null;\n }\n if (this.io) {\n this.io.close();\n this.io = null;\n }\n\n this.authenticatedSockets.clear();\n this.userSockets.clear();\n this.organizationSockets.clear();\n this.rooms.clear();\n this.resourceEditingState.clear();\n this.resourceSubscriptionsBySocket.clear();\n\n this.logDebug('WebSocket service cleanup completed');\n\n } catch (error: unknown) {\n this.logger.error('Error during WebSocket cleanup', { ...projectCaughtErrorLogFields(error) });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"websocket.service.js","sourceRoot":"","sources":["../../../../src/requests/service/websocket.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { injectable, inject, Container } from 'inversify';\nimport { Server as HttpServer } from 'http';\nimport { Server as SocketIOServer, Socket } from 'socket.io';\nimport { createAdapter } from '@socket.io/redis-adapter';\nimport { createClient } from 'redis';\nimport { z } from 'zod';\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 { RedisService } from '~wildo-backend-lib/databases/services/redis.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { runInFreshRequestContextIfAbsent } from '~wildo-backend-lib/runtime/models/request-context.als.backend';\nimport {\n ErrorCustomMessageReference,\n ErrorType,\n ExecutionContext_ExecutionType,\n ResourcePrimaryScope,\n isSupportedNotificationBadgeScope,\n type NotificationScope,\n CoreResourceOperation,\n CoreResourceType,\n ARRAY_RESPONSE_OPERATIONS,\n DataMode,\n ResourceConfiguration_Operation,\n OPERATION_VARIANT_KEY,\n ResourcesConfigOperationsDtosBuilderUtils,\n ResourcesConfig_OperationPathUtils,\n ResourceOperationsUtils,\n WildoHeaderKeys,\n ResourceOperationVariantType,\n isWildoBackendError,\n} from '@wildo-ai/saas-models';\nimport {\n ExecutionContextCreatorBackendService,\n} from '~wildo-backend-lib/runtime/services/execution-context-creator.backend.service';\nimport { AuthorizationsBackendService } from '~wildo-backend-lib/security/authorizations/services/authorizations.backend.service';\nimport { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport { NotificationBadgeBackendService } from '~wildo-backend-lib/notifications/services/notification-badge.backend.service';\nimport {\n WS_ResourceSubscribePayload,\n WS_ResourceEditingPayload,\n WS_ResourceCustomEventPayload,\n WS_ResourceUpdatedPayload,\n WS_ResourceDeletedPayload,\n WS_ResourceRoomStatePayload,\n WS_ResourceSyncUpdatedPayload,\n WS_ResourceUpdateNotificationPayload,\n WS_ResourceSubscribePayloadSchema,\n WS_ResourceEditingPayloadSchema,\n WS_ResourceCustomEventPayloadSchema,\n WS_UserNotificationPayload,\n NotificationLevel,\n NotificationDisplayTarget,\n ResourceAction,\n buildResourceRoomName,\n buildScopeRoomName,\n ResourceScopeRoomKey,\n buildUserRoomName,\n buildOrganizationRoomName,\n buildOrganizationRoleRoomName,\n buildAppRoleRoomName,\n parseOrganizationRoomName,\n WebSocketRoomPrefix,\n CoreWebSocketEvent,\n CoreWebSocketConnectionErrorCode,\n CORE_APP_ROLES,\n WebSocketResourceDeliveryTarget,\n WS_FlowsActorsStartPayloadSchema,\n WS_FlowsActorsApprovalResponsePayloadSchema,\n} from '@wildo-ai/saas-models';\nimport { SocketAuthResult } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport type { ConversationalExecutionBackendService, FlowsActorsExecutionEmitter } from '~wildo-backend-lib/flows-actors/services/conversational-execution.backend.service';\nimport { logWildoBackendErrorAtClassifiedSeverity, projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { relaxAbuseThrottleMaxForEnvironment } from '~wildo-backend-lib/errors/utils/rate-limit-environment-relaxation.backend.utils';\n\nexport interface WebSocketConfig {\n cors: {\n origin: string | string[];\n credentials: boolean;\n };\n transports: ('websocket' | 'polling')[];\n pingTimeout: number;\n pingInterval: number;\n maxHttpBufferSize: number;\n allowEIO3: boolean;\n}\n\ntype WebSocketResourceRoomEmitPayload =\n | WS_ResourceUpdatedPayload\n | WS_ResourceDeletedPayload\n | WS_ResourceRoomStatePayload;\n\nfunction subscriptionMatchesOrganization(\n subscription: SocketTrackedResourceSubscription,\n organizationId: string,\n): boolean {\n if (subscription.scopeId === organizationId) {\n return true;\n }\n\n return Object.values(subscription.contextResourceIdentifiers ?? {}).includes(organizationId);\n}\n\nexport interface WebSocketMessage {\n type: string;\n payload: any;\n timestamp: Date;\n userId?: string;\n organizationId?: string;\n targetUsers?: string[];\n targetRoles?: string[];\n}\n\nexport interface RoomInfo {\n name: string;\n organizationId: string;\n type: 'organization' | 'user' | 'role' | 'custom' | 'resource';\n members: Set<string>;\n metadata?: Record<string, any>;\n}\n\ntype SocketTrackedResourceSubscription = WS_ResourceSubscribePayload & {\n roomName: string;\n};\n\n/**\n * Rate limiting configuration (Redis-synchronized)\n */\nexport interface RateLimitConfig {\n /** Maximum events per window */\n maxEvents: number;\n /** Window size in seconds */\n windowSeconds: number;\n}\n\n/**\n * Default rate limits per event type\n */\n/**\n * Idle-activity timeout for a WebSocket connection. A socket with NO inbound client activity for this\n * long is force-disconnected. Two reasons: (1) it BOUNDS the window during which a revoked-but-still-open\n * socket keeps receiving data — a connection authenticates ONCE at handshake and reuses those roles for\n * its whole life, never re-checking the token-invalidation fence mid-stream (issue #15 item 10), so a\n * logout / SLO / suspension does not tear an already-open socket down; and (2) it reaps\n * abandoned/backgrounded connections that still answer Socket.IO pings (the ping heartbeat, `pingTimeout`,\n * only detects a GONE client, not an INACTIVE one). 30 min matches the common session-idle bar.\n *\n * \"Activity\" is inbound app-level events (`socket.onAny`), NOT Socket.IO pings and NOT server→client\n * pushes — a purely passive subscriber that receives pushes but sends nothing is treated as idle BY\n * DESIGN (a walked-away session). A product needing longer-lived passive subscriptions must raise this\n * bound or have the client send a periodic app-level keepalive.\n */\nconst WEBSOCKET_IDLE_TIMEOUT_MS = 30 * 60 * 1000;\n\n/** How often the idle sweep runs. Coarser than the timeout — a socket is reaped within one interval of crossing it. */\nconst WEBSOCKET_IDLE_SWEEP_INTERVAL_MS = 60 * 1000;\n\n/** A connected socket, annotated with the last inbound-activity timestamp the idle sweep reads (mirrors the existing `(socket as any).auth` pattern, but typed). */\ntype SocketWithActivity = Socket & { lastActivityAt?: number };\n\nconst DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n // Resource subscription: 20 per 10 seconds (allow rapid page navigation)\n [CoreWebSocketEvent.RESOURCE_SUBSCRIBE]: { maxEvents: 20, windowSeconds: 10 },\n [CoreWebSocketEvent.RESOURCE_UNSUBSCRIBE]: { maxEvents: 20, windowSeconds: 10 },\n\n // Editing events: 10 per minute (reasonable for form editing)\n [CoreWebSocketEvent.RESOURCE_EDITING_START]: { maxEvents: 10, windowSeconds: 60 },\n [CoreWebSocketEvent.RESOURCE_EDITING_END]: { maxEvents: 10, windowSeconds: 60 },\n\n // Custom events: 30 per second (for real-time collaboration like cursor moves)\n [CoreWebSocketEvent.RESOURCE_CUSTOM]: { maxEvents: 30, windowSeconds: 1 },\n\n // Badge requests: 10 per second\n [CoreWebSocketEvent.BADGE_GET]: { maxEvents: 10, windowSeconds: 1 },\n [CoreWebSocketEvent.BADGE_GET_ALL]: { maxEvents: 5, windowSeconds: 1 },\n\n // Auth/system events: 5 per minute\n [CoreWebSocketEvent.AUTH_REFRESH]: { maxEvents: 5, windowSeconds: 60 },\n [CoreWebSocketEvent.ORGANIZATION_SWITCH]: { maxEvents: 10, windowSeconds: 60 },\n\n // Flows-actors conversation: a turn per few seconds is plenty; keep it modest\n // since each start triggers an LLM invocation. Approval responses are rarer.\n [CoreWebSocketEvent.FLOWS_ACTORS_START]: { maxEvents: 20, windowSeconds: 60 },\n [CoreWebSocketEvent.FLOWS_ACTORS_APPROVAL_RESPONSE]: { maxEvents: 30, windowSeconds: 60 },\n\n // Default for unlisted events: 100 per minute\n 'default': { maxEvents: 100, windowSeconds: 60 },\n};\n\n/**\n * WebSocket Service\n *\n * Provides real-time communication for SaaS applications:\n * - Multi-tenant socket management with identity-based rooms\n * - Resource-centric rooms for collaboration (editing, locking, custom events)\n * - Role-based message broadcasting\n * - Redis adapter for horizontal scaling\n * - JWT authentication reusing ExecutionContextCreatorBackendService\n * - Authorization reusing AuthorizationsBackendService\n */\n@injectable()\nexport class WebSocketService {\n private io: SocketIOServer | null = null;\n\n /**\n * Tracks emit attempts made while {@link io} is `null`.\n *\n * `io === null` is an EXPECTED, supported state, not an error:\n * - during startup, before {@link initialize} runs (Step 6 / HTTP init) —\n * system bootstrap + data-seed writes flow through the unconditional\n * post-write resource-room dispatch contract before any client can\n * connect, so their emits legitimately have no server yet; and\n * - permanently for platform/internal services with no frontend URLs\n * (the \"disabled mode\" branch in {@link initialize}), whose public emit\n * methods are documented to \"safely no-op\".\n *\n * A per-call `WARN` in either case produced a startup log flood (one line\n * per seeded resource). Instead we emit a SINGLE aggregated `WARN` on the\n * first skip per lifecycle and count the rest; {@link initialize} then\n * reconciles the total (so a genuine \"should have been up\" ordering\n * regression is still surfaced once, not hidden). The flag re-arms on a\n * fresh {@link initialize}/shutdown cycle.\n */\n private unavailableEmitSkips = 0;\n private hasWarnedIoUnavailable = false;\n\n private userSockets: Map<string, Set<string>> = new Map(); // userId -> socketIds\n private rooms: Map<string, RoomInfo> = new Map();\n private organizationSockets: Map<string, Set<string>> = new Map(); // orgId -> socketIds\n\n // NEW: Track authenticated sockets and editing state\n private authenticatedSockets: Map<string, SocketAuthResult> = new Map(); // socketId -> auth info\n private idleSweepInterval: ReturnType<typeof setInterval> | null = null; // periodic idle-socket reaper (see WEBSOCKET_IDLE_TIMEOUT_MS)\n private resourceEditingState: Map<string, Set<string>> = new Map(); // resource room -> editing userIds\n private resourceSubscriptionsBySocket: Map<string, Map<string, SocketTrackedResourceSubscription>> = new Map();\n\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\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 @inject(SAAS_SERVICE_TYPES.RedisService) private redisService: RedisService,\n // Dependencies for factorized authentication/authorization\n @inject(SAAS_SERVICE_TYPES.ExecutionContextCreatorBackendService) private executionContextCreator: ExecutionContextCreatorBackendService,\n @inject(SAAS_SERVICE_TYPES.AuthorizationsService) private authorizationsService: AuthorizationsBackendService,\n @inject(SAAS_SERVICE_TYPES.ResourceRegistryService) private resourcesRegistry: ResourcesRegistryBackendService,\n // Container for lazy resolution of NotificationBadgeService to break circular dependency\n @inject('Container') private container: Container,\n ) {\n this.logDebug = this.logger.debugByType('WebSocketService');\n this.logger.setDebugTypeLogging('WebSocketService', false);\n }\n\n /**\n * Lazy getter for NotificationBadgeService to break circular dependency\n * NotificationBadgeService depends on WebSocketService, so we resolve it lazily\n */\n private getBadgeService(): NotificationBadgeBackendService {\n return this.container.get<NotificationBadgeBackendService>(SAAS_SERVICE_TYPES.NotificationBadgeService);\n }\n\n /**\n * Lazy getter for the flows-actors conversational runtime. Resolved on demand\n * (like the badge service) so the WebSocket hub never participates in a\n * constructor-injection cycle with the flows-actors / system-access graph.\n */\n private getConversationalExecutionService(): ConversationalExecutionBackendService {\n return this.container.get<ConversationalExecutionBackendService>(SAAS_SERVICE_TYPES.ConversationalExecutionBackendService);\n }\n\n private getSocketAuth(socket: Socket): SocketAuthResult {\n return (socket as any).auth as SocketAuthResult;\n }\n\n private hasOrganizationAccess(auth: SocketAuthResult, organizationId: string): boolean {\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n return false;\n }\n\n return auth.initiatorRoles.some((roleInfo) =>\n roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS\n && roleInfo.relatedResourceId === organizationId,\n );\n }\n\n private trackSocketResourceSubscription(\n socketId: string,\n subscription: SocketTrackedResourceSubscription,\n ): void {\n const subscriptions = this.resourceSubscriptionsBySocket.get(socketId) ?? new Map<string, SocketTrackedResourceSubscription>();\n subscriptions.set(subscription.roomName, subscription);\n this.resourceSubscriptionsBySocket.set(socketId, subscriptions);\n }\n\n private untrackSocketResourceSubscription(socketId: string, roomName: string): void {\n const subscriptions = this.resourceSubscriptionsBySocket.get(socketId);\n if (!subscriptions) {\n return;\n }\n\n subscriptions.delete(roomName);\n if (subscriptions.size === 0) {\n this.resourceSubscriptionsBySocket.delete(socketId);\n }\n }\n\n private async revokeTrackedResourceSubscription(params: {\n socket: Socket;\n auth: SocketAuthResult;\n subscription: SocketTrackedResourceSubscription;\n reason: 'auth_refresh' | 'organization_switch';\n }): Promise<void> {\n const { socket, auth, subscription, reason } = params;\n\n await socket.leave(subscription.roomName);\n\n if (subscription.resourceId && auth.initiatorIds?.userId) {\n await this.trackEditingState(\n subscription.resourceType,\n subscription.resourceId,\n auth.initiatorIds.userId,\n 'end',\n );\n\n this.io?.to(subscription.roomName).emit(CoreWebSocketEvent.RESOURCE_EDITING_END, {\n resourceType: subscription.resourceType,\n resourceId: subscription.resourceId,\n initiatorUserId: auth.initiatorIds.userId,\n reason,\n timestamp: new Date(),\n } satisfies WS_ResourceEditingPayload);\n }\n\n this.untrackSocketResourceSubscription(socket.id, subscription.roomName);\n }\n\n private async revalidateTrackedResourceSubscriptions(\n socket: Socket,\n auth: SocketAuthResult,\n ): Promise<void> {\n const subscriptions = Array.from(this.resourceSubscriptionsBySocket.get(socket.id)?.values() ?? []);\n for (const subscription of subscriptions) {\n try {\n if (subscription.resourceId) {\n await this.verifyResourceAccess(\n socket,\n auth,\n subscription.resourceType,\n subscription.resourceId,\n subscription.contextResourceIdentifiers,\n );\n } else if (subscription.scopeKey && subscription.scopeId) {\n await this.verifyScopeAccess(\n auth,\n subscription.resourceType,\n subscription.scopeKey,\n subscription.scopeId,\n subscription.contextResourceIdentifiers,\n );\n } else {\n throw new Error('Tracked resource subscription is missing routing identifiers');\n }\n } catch {\n await this.revokeTrackedResourceSubscription({\n socket,\n auth,\n subscription,\n reason: 'auth_refresh',\n });\n }\n }\n }\n\n /**\n * Initialize WebSocket server\n *\n * For platform services that don't serve frontends (e.g., crontabs-batches-manager),\n * WebSocket initialization is skipped since they only receive internal backend requests.\n */\n public async initialize(httpServer: HttpServer): Promise<void> {\n const corsOrigins = this.getCorsOrigins();\n\n // If no frontend URLs are configured, skip WebSocket initialization entirely\n // This is expected for platform services that only receive backend-to-backend requests\n // and don't need real-time WebSocket communication with browsers\n if (corsOrigins.length === 0) {\n this.logger.info('📝 No frontend URLs configured - skipping WebSocket initialization (platform/internal service mode)', {\n availableEndpoints: Object.keys(this.configService.config?.runtime?.endPoints || {}),\n note: 'This is expected for platform services that only receive backend-to-backend requests'\n });\n\n // Mark as \"initialized\" but in disabled mode - all public methods will safely no-op\n this.io = null;\n return;\n }\n\n const config: WebSocketConfig = {\n cors: {\n origin: corsOrigins,\n credentials: true\n },\n transports: ['websocket', 'polling'],\n pingTimeout: 60000,\n pingInterval: 25000,\n maxHttpBufferSize: 1e6,\n allowEIO3: true\n };\n\n this.io = new SocketIOServer(httpServer, config);\n this.startIdleSocketSweep();\n\n // Reconcile any emits that were skipped before the server existed. These\n // are expected for startup bootstrap/seed writes (no client can be\n // connected yet), so this is INFO-level closure, not an error — but we\n // surface the total once so a genuinely mis-ordered emit path is still\n // visible rather than silently swallowed.\n if (this.unavailableEmitSkips > 0) {\n this.logger.info('WebSocket initialized after emits were skipped during startup', {\n skippedEmits: this.unavailableEmitSkips,\n note: 'Expected for pre-initialization bootstrap/seed writes, which have no connected clients.',\n });\n }\n this.unavailableEmitSkips = 0;\n this.hasWarnedIoUnavailable = false;\n\n // Setup Redis adapter for horizontal scaling\n await this.setupRedisAdapter();\n\n // Setup authentication middleware (FACTORIZED with HTTP)\n this.setupAuthentication();\n\n // Setup rate limiting middleware (Redis-synchronized across pods)\n this.setupRateLimiting();\n\n // Setup connection handling (identity-based rooms)\n this.setupConnectionHandling();\n\n this.logDebug('WebSocket service initialized', {\n cors: config.cors.origin,\n transports: config.transports\n });\n }\n\n /**\n * Record an emit attempt made while the WebSocket server is not available\n * (`io === null`) and decide how loudly to report it.\n *\n * The first skip per lifecycle logs a single aggregated `WARN`; every\n * subsequent skip is `DEBUG` only, and the running total is reconciled by\n * {@link initialize}. This keeps `io === null` a \"safely no-op\" state (its\n * documented contract) without flooding the log with one `WARN` per\n * bootstrap/seed write, while still surfacing the condition once.\n *\n * @param reason - Human-readable emit surface (e.g. `'resource room'`) for\n * the log line.\n */\n private noteUnavailableEmit(reason: string): void {\n this.unavailableEmitSkips++;\n if (!this.hasWarnedIoUnavailable) {\n this.hasWarnedIoUnavailable = true;\n this.logger.warn('WebSocket not initialized — emits are skipped until initialization', {\n reason,\n note: 'Expected during startup (before HTTP/WS init) and for frontend-less platform services. Further skips are logged at debug; the total is reconciled when the server initializes.',\n });\n return;\n }\n this.logDebug('WebSocket not initialized, skipping emit', { reason });\n }\n\n // =====================================================\n // PUBLIC MESSAGING METHODS\n // =====================================================\n\n /**\n * Send message to specific user (with cross-pod support via Redis adapter)\n */\n /**\n * Build the on-the-wire payload for a room emit.\n *\n * The Socket.IO event name already carries the message `type`, and the flat\n * per-event payload schemas the client validates against (see\n * `WebSocketEventSchemas` in `@wildo-ai/saas-models`) are self-contained:\n * they describe the payload directly, NOT the backend `WebSocketMessage`\n * transport envelope. Emitting the whole envelope (`{ type, payload, userId,\n * organizationId, ... }`) nests the real fields one level too deep under\n * `payload`, so the client ingress boundary sees every required field as\n * `undefined` and drops the event as invalid.\n *\n * We therefore emit the flat `message.payload` and stamp a fresh emit-time\n * `timestamp` (present on every flat payload schema). Envelope routing\n * metadata (`userId`, `organizationId`, `targetUsers`, `targetRoles`) is\n * server-side room-selection input only and is intentionally not forwarded\n * to the client — the client validation strips unknown keys anyway.\n *\n * This mirrors `emitToResourceRoom`, which has always emitted the flat\n * payload rather than the envelope.\n */\n private buildRoomEmitPayload(message: WebSocketMessage): Record<string, unknown> {\n return {\n ...(message.payload as Record<string, unknown>),\n timestamp: new Date(),\n };\n }\n\n public async sendToUser(userId: string, message: WebSocketMessage): Promise<boolean> {\n if (!this.io) {\n this.noteUnavailableEmit('user message');\n return false;\n }\n\n const roomName = buildUserRoomName(userId);\n this.io.to(roomName).emit(message.type, this.buildRoomEmitPayload(message));\n\n this.logDebug('Message sent to user', {\n userId: userId.substring(0, 8) + '...',\n messageType: message.type,\n });\n\n return true;\n }\n\n /**\n * Send a direct notification to a specific user.\n *\n * This is a convenience method for sending user notifications that are not\n * tied to resource operations (e.g., \"Your export is ready\", \"Payment received\").\n *\n * @param userId - The user ID to notify\n * @param notification - Notification configuration\n * @param notification.type - Notification level (info, success, warning, error)\n * @param notification.identifier - i18n identifier for message lookup\n * @param notification.message - Direct message (fallback if identifier not found)\n * @param notification.title - Optional notification title\n * @param notification.data - Additional context data\n * @param notification.displayTarget - Where to display (toast, center, or both)\n * @param notification.organizationId - Organization context (optional)\n *\n * @example\n * // Notify user about export completion\n * await webSocketService.notifyUser(userId, {\n * type: NotificationLevel.SUCCESS,\n * identifier: 'export.completed',\n * data: { fileName: 'report.pdf', downloadUrl: '/files/123' },\n * });\n *\n * @example\n * // Notify user with direct message\n * await webSocketService.notifyUser(userId, {\n * type: NotificationLevel.INFO,\n * message: 'Your session will expire in 5 minutes',\n * displayTarget: NotificationDisplayTarget.TOAST,\n * });\n */\n public async notifyUser(\n userId: string,\n notification: {\n type: NotificationLevel;\n identifier?: string;\n message?: string;\n title?: string;\n data?: Record<string, unknown>;\n displayTarget?: NotificationDisplayTarget;\n organizationId?: string;\n }\n ): Promise<boolean> {\n const payload: WS_UserNotificationPayload = {\n notificationLevel: notification.type,\n identifier: notification.identifier,\n message: notification.message,\n title: notification.title,\n data: notification.data,\n displayTarget: notification.displayTarget ?? NotificationDisplayTarget.BOTH,\n organizationId: notification.organizationId,\n timestamp: new Date(),\n };\n\n const wsMessage: WebSocketMessage = {\n type: CoreWebSocketEvent.USER_NOTIFICATION,\n payload,\n timestamp: new Date(),\n userId,\n organizationId: notification.organizationId,\n };\n\n return this.sendToUser(userId, wsMessage);\n }\n\n /**\n * Send a direct notification to all users in an organization.\n *\n * @param organizationId - The organization ID\n * @param notification - Notification configuration (same as notifyUser)\n * @param excludeUsers - Optional list of user IDs to exclude\n */\n public async notifyOrganization(\n organizationId: string,\n notification: {\n type: NotificationLevel;\n identifier?: string;\n message?: string;\n title?: string;\n data?: Record<string, unknown>;\n displayTarget?: NotificationDisplayTarget;\n },\n excludeUsers?: string[]\n ): Promise<number> {\n const payload: WS_UserNotificationPayload = {\n notificationLevel: notification.type,\n identifier: notification.identifier,\n message: notification.message,\n title: notification.title,\n data: notification.data,\n displayTarget: notification.displayTarget ?? NotificationDisplayTarget.BOTH,\n organizationId,\n timestamp: new Date(),\n };\n\n const wsMessage: WebSocketMessage = {\n type: CoreWebSocketEvent.USER_NOTIFICATION,\n payload,\n timestamp: new Date(),\n organizationId,\n };\n\n return this.sendToOrganization(organizationId, wsMessage, excludeUsers);\n }\n\n /**\n * Send message to organization (with cross-pod support via Redis adapter)\n */\n public async sendToOrganization(\n organizationId: string,\n message: WebSocketMessage,\n excludeUsers?: string[]\n ): Promise<number> {\n const roomName = buildOrganizationRoomName(organizationId);\n const messageWithTimestamp = this.buildRoomEmitPayload(message);\n\n if (!this.io) {\n this.noteUnavailableEmit('organization message');\n return 0;\n }\n\n if (excludeUsers && excludeUsers.length > 0) {\n // For cross-pod compatibility with Redis adapter:\n // 1. Send to the org room (reaches all pods)\n // 2. Exclude users by emitting to their user rooms with a \"skip\" flag\n //\n // Alternative approach: Use Socket.IO's except() which works with Redis adapter\n const excludeRooms = excludeUsers.map(userId => buildUserRoomName(userId));\n let broadcast = this.io.to(roomName);\n for (const excludeRoom of excludeRooms) {\n broadcast = broadcast.except(excludeRoom);\n }\n broadcast.emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message sent to organization with exclusions', {\n organizationId: organizationId.substring(0, 8) + '...',\n messageType: message.type,\n excludedUsers: excludeUsers.length,\n });\n\n // Return approximate count (exact count not available with except())\n return 1;\n } else {\n this.io.to(roomName).emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message sent to organization', {\n organizationId: organizationId.substring(0, 8) + '...',\n messageType: message.type,\n });\n\n return 1;\n }\n }\n\n /**\n * Send message to users with specific role within an organization\n */\n public async sendToRole(\n organizationId: string,\n role: string,\n message: WebSocketMessage\n ): Promise<number> {\n const roomName = buildOrganizationRoleRoomName(organizationId, role);\n const messageWithTimestamp = this.buildRoomEmitPayload(message);\n\n if (!this.io) {\n this.noteUnavailableEmit('organization-role message');\n return 0;\n }\n\n const sentCount = (await this.io.in(roomName).fetchSockets()).length;\n this.io.to(roomName).emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message sent to role', {\n organizationId: organizationId.substring(0, 8) + '...',\n role,\n messageType: message.type,\n sentCount\n });\n\n return sentCount;\n }\n\n /**\n * Send message to users with application-level role (admin dashboard users).\n *\n * Application-level roles are not scoped to an organization - they are global\n * admin roles like super admins, support staff, billing admins, etc.\n *\n * Users with app-level roles join app role rooms (via buildAppRoleRoomName) on connection.\n *\n * @param role - The application-level role (e.g., 'admin', 'super_admin', 'support')\n * @param message - The WebSocket message to send\n * @returns Number of sockets the message was sent to\n *\n * @example\n * // Notify all application administrators\n * await webSocketService.sendToAppRole(CORE_APP_ROLES.APP_ADMIN_SUPER_ADMIN, {\n * type: CoreWebSocketEvent.USER_NOTIFICATION,\n * payload: { notificationLevel: NotificationLevel.WARNING, message: 'New user signup requires review' },\n * timestamp: new Date(),\n * });\n */\n public async sendToAppRole(\n role: string,\n message: WebSocketMessage\n ): Promise<number> {\n const roomName = buildAppRoleRoomName(role);\n const messageWithTimestamp = this.buildRoomEmitPayload(message);\n\n if (!this.io) {\n this.noteUnavailableEmit('app-role message');\n return 0;\n }\n\n const sentCount = (await this.io.in(roomName).fetchSockets()).length;\n this.io.to(roomName).emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message sent to app role', {\n role,\n messageType: message.type,\n sentCount\n });\n\n return sentCount;\n }\n\n /**\n * Send a direct notification to users with a specific application-level role.\n *\n * Convenience method for sending admin notifications.\n *\n * @param role - The application-level role\n * @param notification - Notification configuration\n *\n * @example\n * // Notify support staff about a new ticket\n * await webSocketService.notifyAppRole(CORE_APP_ROLES.APP_ADMIN_SUPER_ADMIN, {\n * type: NotificationLevel.INFO,\n * identifier: 'support.new_ticket',\n * data: { ticketId: '123', subject: 'Help needed' },\n * });\n */\n public async notifyAppRole(\n role: string,\n notification: {\n type: NotificationLevel;\n identifier?: string;\n message?: string;\n title?: string;\n data?: Record<string, unknown>;\n displayTarget?: NotificationDisplayTarget;\n }\n ): Promise<number> {\n const payload: WS_UserNotificationPayload = {\n notificationLevel: notification.type,\n identifier: notification.identifier,\n message: notification.message,\n title: notification.title,\n data: notification.data,\n displayTarget: notification.displayTarget ?? NotificationDisplayTarget.BOTH,\n timestamp: new Date(),\n };\n\n const wsMessage: WebSocketMessage = {\n type: CoreWebSocketEvent.USER_NOTIFICATION,\n payload,\n timestamp: new Date(),\n };\n\n return this.sendToAppRole(role, wsMessage);\n }\n\n /**\n * Broadcast message to all connected users\n */\n public async broadcast(message: WebSocketMessage): Promise<number> {\n if (!this.io) {\n this.noteUnavailableEmit('broadcast');\n return 0;\n }\n\n const messageWithTimestamp = this.buildRoomEmitPayload(message);\n\n const sockets = await this.io.fetchSockets();\n this.io.emit(message.type, messageWithTimestamp);\n\n this.logDebug('Message broadcasted', {\n messageType: message.type,\n connectedSockets: sockets.length\n });\n\n return sockets.length;\n }\n\n // =====================================================\n // RESOURCE ROOM PUBLIC METHODS (for NotificationDispatcher)\n // =====================================================\n\n /**\n * Extract DataMode from a websocket payload.\n * Defaults to RAW for websocket messages when no explicit data mode is present.\n */\n private extractDataMode(payload?: { dataMode?: DataMode | 'raw' | 'summary' | 'context' | string }): DataMode {\n return ResourceOperationsUtils.extractDataMode(payload, undefined, DataMode.RAW);\n }\n\n /**\n * Select the appropriate response DTO based on DataMode.\n * Similar to controller-resource.backend.service.ts\n */\n private selectResponseDto(\n operation: ResourceConfiguration_Operation<any, any, any> | null,\n dataMode?: DataMode\n ): z.ZodTypeAny | undefined {\n if (!operation) {\n return undefined;\n }\n return ResourcesConfigOperationsDtosBuilderUtils.selectResponseDto(operation, dataMode) || undefined;\n }\n\n /**\n * Validate and transform websocket resource data before sending it.\n * Similar to controller-resource.backend.service.ts sendResponse() method.\n *\n * This method validates resource data against the appropriate DTO and transforms dates.\n * It is used for sync-grade replay payloads and for custom websocket events that\n * choose to carry resource-shaped data.\n *\n * @param resourceData - The resource data to validate (if present in payload)\n * @param resourceType - Resource type\n * @param operationIdentifier - Operation identifier (optional)\n * @param dataMode - Data mode (defaults to RAW)\n * @returns Validated and transformed resource data, or false when validation cannot proceed\n */\n /**\n * Resolve the operation whose response DTO will shape resource data emitted\n * through a websocket room.\n *\n * **Security invariant — canonical-default-only shaping.** The data shape gate\n * MUST mirror the subscription auth gate. Socket-room subscription is\n * authorized against the unique default URL-bearing READ operation\n * (`resolveSocketAuthorizationDefaultOperation`, post OPU-19/OPU-25).\n * Therefore data emitted through that subscription MUST be shaped against the\n * SAME operation's DTOs — never against a keyed/non-default READ variant\n * whose `initiatorInfos` may carry stricter or laxer role guards than the\n * default. Any mismatch between the two gates is a leak surface\n * (default-authorized subscriber receives data shaped by a stricter variant,\n * or vice versa).\n *\n * Resolution strategy:\n * 1. If `operationPathKey` is supplied AND it resolves to the unique\n * default READ operation, use it directly. This is the fast path for\n * sync-replay payloads where the dispatcher already named the canonical\n * operation.\n * 2. Otherwise, fall back to `getOperationPathDefault(resourceType, READ)`\n * — the canonical default URL-bearing READ. Any non-default keyed\n * variant supplied via `operationPathKey` is ignored (with a debug log)\n * and the default is used instead. This fail-closed behavior mirrors\n * OPU-36 (`websocket-resource-validation.frontend.service.ts`).\n *\n * Returns `null` only when the registry has no canonical default READ for\n * this resource type, in which case the caller emits notification-grade\n * metadata only (no replay data).\n *\n * See `.claude/plans/variant-authorization-audit.md` (F-2) and\n * `.claude/plans/resource-operation-variant-union-audit.md` (OPU-19, OPU-25,\n * OPU-36).\n */\n private resolveOperationForWebSocketValidation(params: {\n resourceType: string;\n operationIdentifier?: string;\n operationPathKey?: string;\n dataMode: DataMode;\n }) {\n try {\n if (params.operationPathKey) {\n const operationPath = ResourcesConfig_OperationPathUtils.parseOperationPathKey(params.operationPathKey);\n const operationFromPath = this.resourcesRegistry.getOperationFromPath(operationPath);\n const effectiveOperation = operationFromPath\n ? ResourceOperationsUtils.getCoreResourceOperationFromOperation(operationFromPath)\n : undefined;\n // Accept the path-key resolution ONLY when it points to the canonical\n // default READ. Any other shape (non-READ core, keyed READ variant,\n // non-default READ) falls through to the canonical default lookup\n // below — keeping the data-shape gate aligned with the auth gate.\n if (\n operationFromPath\n && effectiveOperation === CoreResourceOperation.READ\n && operationFromPath.isOperationDefault === true\n ) {\n return operationFromPath;\n }\n if (operationFromPath) {\n this.logDebug('Ignoring non-canonical-default-READ websocket validation operation path; falling back to canonical default READ', {\n resourceType: params.resourceType,\n operationPathKey: params.operationPathKey,\n effectiveOperation,\n isOperationDefault: operationFromPath.isOperationDefault,\n variantKey: operationFromPath.variantKey,\n });\n }\n }\n\n // Internal-only resources (e.g. `userCredentials`, updated during passkey\n // / TOTP enrollment) deliberately declare NO canonical default READ. That\n // is an EXPECTED outcome for this best-effort probe — emit\n // notification-grade metadata only. Check existence with the non-throwing\n // predicate first so we never call `getOperationPathDefault`, whose miss\n // path BUILDS an alert-grade RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND\n // (the error's construction fires LOG/ALERT/RECORD_METRICS/TRACE as a side\n // effect, surfacing a spurious FATAL before this method's catch could\n // downgrade it to null). No default READ also means socket subscription is\n // impossible for the resource — subscription auth resolves against the\n // same canonical default READ — so there is genuinely nothing to shape.\n if (!this.resourcesRegistry.hasOperationPathDefault(params.resourceType, CoreResourceOperation.READ)) {\n this.logDebug('No canonical default READ for websocket validation; emitting metadata only', {\n resourceType: params.resourceType,\n operationIdentifier: params.operationIdentifier,\n operationPathKey: params.operationPathKey,\n dataMode: params.dataMode,\n });\n return null;\n }\n\n const operationPath = this.resourcesRegistry.getOperationPathDefault(\n params.resourceType,\n CoreResourceOperation.READ,\n );\n return this.resourcesRegistry.getOperationFromPath(operationPath);\n } catch (error) {\n this.logger.warn('WebSocket resource data validation lookup failed', {\n resourceType: params.resourceType,\n operationIdentifier: params.operationIdentifier,\n operationPathKey: params.operationPathKey,\n dataMode: params.dataMode,\n ...projectCaughtErrorLogFields(error),\n });\n return null;\n }\n }\n\n /**\n * Validate and transform resource data emitted through a websocket room.\n *\n * Always shapes against the resource's **canonical default READ** DTO — see\n * `resolveOperationForWebSocketValidation` for the security invariant. There\n * is intentionally no per-variant shaping mode: socket subscriptions are\n * authorized against the canonical default READ, so emitted data must be\n * shaped against the same operation. A previous `validationTarget:\n * 'operation-response'` mode was removed in this commit because it would\n * have allowed non-canonical DTO shaping without a paired re-authorization\n * gate (OPU-19 dual-hazard surface).\n */\n private validateAndTransformResourceData(\n resourceData: any,\n resourceType: string,\n operationIdentifier?: string,\n dataMode: DataMode = DataMode.RAW,\n operationPathKey?: string,\n ): { success: true; data: unknown } | { success: false } {\n // If no resource data provided, signal the caller to emit metadata only.\n if (!resourceData || typeof resourceData !== 'object') {\n return { success: false };\n }\n\n const operation = this.resolveOperationForWebSocketValidation({\n resourceType,\n operationIdentifier,\n operationPathKey,\n dataMode,\n });\n if (!operation) {\n return { success: false };\n }\n\n // Select appropriate DTO based on DataMode\n const selectedDto = this.selectResponseDto(operation, dataMode);\n\n if (!selectedDto) {\n return { success: false };\n }\n\n try {\n // Transform dates from Date objects to ISO strings before validation\n let transformedData = resourceData;\n transformedData = ResourcesConfigOperationsDtosBuilderUtils.transformResponseDates(\n resourceData,\n selectedDto\n );\n\n // Validate response against the selected DTO as a runtime safety net\n // Handle array responses (LIST, CREATE_MANY, etc.)\n const effectiveOperation = operation.resourceOperationLike || operation.operationIdentifier;\n const isArrayOperation = ARRAY_RESPONSE_OPERATIONS.includes(effectiveOperation as any);\n\n if (isArrayOperation && Array.isArray(transformedData)) {\n // For array operations, validate each item individually\n return {\n success: true,\n data: transformedData.map(item => selectedDto.parse(item)),\n };\n } else {\n // For single-item operations, validate directly\n return {\n success: true,\n data: selectedDto.parse(transformedData),\n };\n }\n } catch (error) {\n this.logger.warn('WebSocket resource data validation failed', {\n resourceType,\n operationIdentifier,\n dataMode,\n ...projectCaughtErrorLogFields(error),\n resourceDataKeys: typeof resourceData === 'object' ? Object.keys(resourceData) : 'not-object'\n });\n return { success: false };\n }\n }\n\n private stripScopeNotificationReplayFields(\n payload: WS_ResourceUpdateNotificationPayload,\n ): WS_ResourceUpdateNotificationPayload {\n const {\n resourceData: _resourceData,\n fieldMeta: _fieldMeta,\n version: _version,\n dataMode: _dataMode,\n ...notificationPayload\n } = payload;\n return notificationPayload;\n }\n\n private validateAndTransformSyncReplayData(params: {\n resourceData: unknown;\n resourceType: string;\n operationPathKey?: string;\n dataMode?: DataMode;\n }): { success: true; data: unknown } | { success: false } {\n const dataMode = params.dataMode ?? DataMode.RAW;\n\n if (!params.resourceData || typeof params.resourceData !== 'object') {\n this.logger.warn('WebSocket sync replay payload is missing resource data', {\n resourceType: params.resourceType,\n dataMode,\n });\n return { success: false };\n }\n\n const readOperation = this.resolveOperationForWebSocketValidation({\n resourceType: params.resourceType,\n operationPathKey: params.operationPathKey,\n dataMode,\n });\n if (!readOperation) {\n return { success: false };\n }\n const selectedDto = this.selectResponseDto(readOperation, dataMode);\n\n if (!selectedDto) {\n this.logger.warn('WebSocket sync replay payload missing canonical READ DTO', {\n resourceType: params.resourceType,\n dataMode,\n });\n return { success: false };\n }\n\n try {\n const transformedData = ResourcesConfigOperationsDtosBuilderUtils.transformResponseDates(\n params.resourceData,\n selectedDto,\n );\n return {\n success: true,\n data: selectedDto.parse(transformedData),\n };\n } catch (error) {\n this.logger.warn('WebSocket sync replay validation failed', {\n resourceType: params.resourceType,\n dataMode,\n ...projectCaughtErrorLogFields(error),\n resourceDataKeys: typeof params.resourceData === 'object' ? Object.keys(params.resourceData as Record<string, unknown>) : 'not-object',\n });\n return { success: false };\n }\n }\n\n /**\n * Emit to a specific resource room (path-independent)\n * Called by NotificationDispatcherService after CRUD operations\n *\n * Resource-room sync payloads now validate replay-grade resource data when it\n * is present in the payload.\n *\n * @param resourceType - Resource type\n * @param resourceId - Resource ID\n * @param event - WebSocket event name\n * @param payload - Resource-room payload. Sync-grade update payloads carry authoritative\n * `version` + `resourceData`; delete/state payloads intentionally do not.\n *\n * @example\n * // Send notification-grade metadata only\n * websocketService.emitToResourceRoom('users', 'userId123', CoreWebSocketEvent.RESOURCE_UPDATED, {\n * resourceType: 'users',\n * resourceId: 'userId123',\n * contextResourceIdentifiers: {},\n * action: ResourceAction.UPDATED,\n * operationIdentifier: CoreResourceOperation.UPDATE\n * });\n *\n * @example\n * // Send synchronization-grade replay data for RESOURCE_ROOM_SYNC\n * websocketService.emitToResourceRoom('users', 'userId123', CoreWebSocketEvent.RESOURCE_UPDATED, {\n * resourceType: 'users',\n * resourceId: 'userId123',\n * contextResourceIdentifiers: {},\n * action: ResourceAction.UPDATED,\n * operationIdentifier: CoreResourceOperation.UPDATE,\n * resourceData: updatedUserObject, // Full resource object\n * dataMode: DataMode.RAW // or DataMode.SUMMARY, DataMode.CONTEXT\n * });\n */\n public emitToResourceRoom(\n resourceType: string,\n resourceId: string,\n event: string,\n payload: WebSocketResourceRoomEmitPayload\n ): boolean {\n if (!this.io) {\n this.noteUnavailableEmit('resource room');\n return false;\n }\n\n // Only sync-grade resource-room payloads are allowed to act like\n // authoritative replay input for clients. Notification-grade room payloads\n // still emit, but they do not go through the stricter canonical replay gate.\n const shouldValidateSyncReplay = payload.deliveryTarget === WebSocketResourceDeliveryTarget.RESOURCE_ROOM_SYNC\n && 'resourceData' in payload;\n let payloadToEmit: WebSocketResourceRoomEmitPayload = payload;\n let dataMode: DataMode = DataMode.RAW;\n\n if (shouldValidateSyncReplay) {\n dataMode = this.extractDataMode({ dataMode: payload.dataMode });\n const validation = this.validateAndTransformSyncReplayData({\n resourceData: payload.resourceData,\n resourceType,\n operationPathKey: payload.operationPathKey,\n dataMode,\n });\n if (!validation.success) {\n this.logDebug('Skipped resource-room emit: sync replay payload failed canonical validation', {\n resourceType,\n resourceId,\n event,\n deliveryTarget: payload.deliveryTarget,\n });\n return false;\n }\n payloadToEmit = {\n ...payload,\n resourceData: validation.data as Record<string, unknown>,\n };\n }\n\n const roomName = buildResourceRoomName(resourceType, resourceId);\n this.io.to(roomName).emit(event, payloadToEmit);\n\n this.logDebug('Emitted to resource room', {\n roomName,\n event,\n dataMode: shouldValidateSyncReplay ? dataMode : undefined,\n hasResourceData: shouldValidateSyncReplay,\n deliveryTarget: payload.deliveryTarget,\n });\n return true;\n }\n\n /**\n * Helper method to send resource data via WebSocket with automatic validation.\n *\n * This is a convenience method that prepares a payload with resource data and sends it\n * to a resource room. Use this when you want to send authoritative resource objects via\n * WebSocket.\n *\n * @param resourceType - Resource type\n * @param resourceId - Resource ID\n * @param event - WebSocket event name (e.g., CoreWebSocketEvent.RESOURCE_UPDATED)\n * @param action - Resource action (ResourceAction.CREATED, UPDATED, DELETED)\n * @param resourceData - The resource data object to send (will be validated and transformed)\n * @param options - Optional configuration\n * @param options.operationIdentifier - Operation identifier (e.g., CoreResourceOperation.UPDATE)\n * @param options.dataMode - Data mode (defaults to RAW)\n * @param options.contextResourceIdentifiers - Context resource identifiers\n * @param options.affectedIds - Array of affected resource IDs\n * @param options.initiatorUserId - User ID of the initiator\n *\n * @example\n * // Send updated user resource\n * await websocketService.sendResourceData(\n * 'users',\n * 'userId123',\n * CoreWebSocketEvent.RESOURCE_UPDATED,\n * ResourceAction.UPDATED,\n * updatedUserObject,\n * {\n * operationIdentifier: CoreResourceOperation.UPDATE,\n * dataMode: DataMode.RAW,\n * contextResourceIdentifiers: {},\n * initiatorUserId: 'currentUserId'\n * }\n * );\n *\n * @example\n * // Send created resource with summary data\n * await websocketService.sendResourceData(\n * 'todos',\n * 'todoId456',\n * CoreWebSocketEvent.RESOURCE_UPDATED,\n * ResourceAction.CREATED,\n * newTodoObject,\n * {\n * operationIdentifier: CoreResourceOperation.CREATE,\n * dataMode: DataMode.SUMMARY, // Use summary for list refreshes\n * contextResourceIdentifiers: { organizationId: 'org123' },\n * initiatorUserId: 'currentUserId'\n * }\n * );\n */\n public sendResourceData(\n resourceType: string,\n resourceId: string,\n event: string,\n action: ResourceAction,\n resourceData: any,\n options: {\n operationIdentifier?: string;\n dataMode?: DataMode | string;\n contextResourceIdentifiers?: Record<string, string>;\n affectedIds?: string[];\n initiatorUserId?: string;\n version?: number;\n } = {}\n ): void {\n const {\n operationIdentifier,\n dataMode = DataMode.RAW,\n contextResourceIdentifiers = {},\n affectedIds,\n initiatorUserId,\n version,\n } = options;\n\n // Convert DataMode enum to string for schema compatibility\n const effectiveDataMode = typeof dataMode === 'string'\n ? ResourceOperationsUtils.normalizeDataModeString(dataMode) || DataMode.RAW\n : dataMode || DataMode.RAW;\n const dataModeString = ResourceOperationsUtils.dataModeToString(effectiveDataMode);\n const resolvedVersion = version ?? (\n resourceData && typeof resourceData === 'object'\n ? (resourceData as Record<string, unknown>)._version as number | undefined\n : undefined\n );\n\n if (action !== ResourceAction.DELETED && resolvedVersion == null) {\n this.logger.warn('sendResourceData skipped sync payload without authoritative version', {\n resourceType,\n resourceId,\n event,\n action,\n });\n return;\n }\n\n const payload: WS_ResourceSyncUpdatedPayload | WS_ResourceDeletedPayload = action === ResourceAction.DELETED\n ? {\n deliveryTarget: WebSocketResourceDeliveryTarget.RESOURCE_ROOM_SYNC,\n resourceType,\n resourceId,\n contextResourceIdentifiers,\n action: ResourceAction.DELETED,\n operationIdentifier: operationIdentifier ?? CoreResourceOperation.DELETE,\n affectedIds,\n initiatorUserId,\n timestamp: new Date(),\n }\n : {\n deliveryTarget: WebSocketResourceDeliveryTarget.RESOURCE_ROOM_SYNC,\n resourceType,\n resourceId,\n contextResourceIdentifiers,\n action,\n operationIdentifier: operationIdentifier ?? CoreResourceOperation.UPDATE,\n resourceData,\n dataMode: dataModeString,\n affectedIds,\n initiatorUserId,\n timestamp: new Date(),\n version: resolvedVersion,\n };\n\n this.emitToResourceRoom(resourceType, resourceId, event, payload);\n }\n\n /**\n * Emit to scope rooms (collections) for list refresh\n * Called by NotificationDispatcherService after CRUD operations\n *\n * Scope-room payloads validate resource-shaped data when it is present in the\n * payload, while still treating these emissions as notification-grade rather\n * than replay-grade sync.\n *\n * @param resourceType - Resource type\n * @param scopes - Array of scope rooms to emit to\n * @param event - WebSocket event name\n * @param payload - Payload with optional resourceData and dataMode\n *\n * @example\n * // Send notification-grade metadata for list refresh\n * websocketService.emitToScopeRooms('users', [{ scopeKey: 'organization', scopeId: 'org123' }],\n * CoreWebSocketEvent.RESOURCE_UPDATED, { ... });\n *\n * @example\n * // Send optional summary data for list refresh\n * websocketService.emitToScopeRooms('users', [{ scopeKey: 'organization', scopeId: 'org123' }],\n * CoreWebSocketEvent.RESOURCE_UPDATED, {\n * ...metadata,\n * resourceData: updatedUserObject,\n * dataMode: DataMode.SUMMARY // Use SUMMARY for list refreshes\n * });\n */\n public emitToScopeRooms(\n resourceType: string,\n scopes: Array<{ scopeKey: string; scopeId: string }>,\n event: string,\n payload: WS_ResourceUpdateNotificationPayload\n ): void {\n if (!this.io) return;\n\n // Extract DataMode and validate resource data if present\n const dataMode = this.extractDataMode({ dataMode: payload.dataMode });\n let validatedPayload = { ...payload };\n const resourceData = payload.resourceData;\n\n // Scope-room payloads stay notification-grade. If DTO shaping fails, strip\n // replay-like fields rather than emitting non-canonical bodies; list\n // invalidation is still useful even when authoritative replay truth is not.\n if (resourceData) {\n const validation = this.validateAndTransformResourceData(\n resourceData,\n resourceType,\n undefined,\n dataMode,\n );\n\n if (validation.success) {\n validatedPayload = {\n ...validatedPayload,\n resourceData: validation.data,\n };\n } else {\n validatedPayload = this.stripScopeNotificationReplayFields(validatedPayload);\n }\n }\n\n for (const scope of scopes) {\n const roomName = buildScopeRoomName(resourceType, scope.scopeKey, scope.scopeId);\n this.io.to(roomName).emit(event, validatedPayload);\n }\n\n this.logDebug('Emitted to scope rooms', {\n resourceType,\n scopeCount: scopes.length,\n event,\n dataMode,\n hasResourceData: !!resourceData,\n deliveryTarget: payload.deliveryTarget,\n });\n }\n\n /**\n * Get all users currently editing a resource\n */\n public async getResourceEditingUsers(resourceType: string, resourceId: string): Promise<string[]> {\n const prefix = this.redisService.getAppPrefix();\n const key = `${prefix}editing:${resourceType}:${resourceId}`;\n const redisClient = this.redisService.getReadyClient();\n\n if (!redisClient) {\n return Array.from(this.resourceEditingState.get(key) || []);\n }\n\n try {\n const editing = await redisClient.hGetAll(key);\n return Object.keys(editing);\n } catch {\n return Array.from(this.resourceEditingState.get(key) || []);\n }\n }\n\n // =====================================================\n // ROOM MANAGEMENT\n // =====================================================\n\n /**\n * Create custom room\n */\n public async createRoom(\n roomName: string,\n organizationId: string,\n type: RoomInfo['type'] = 'custom',\n metadata?: Record<string, any>\n ): Promise<void> {\n const room: RoomInfo = {\n name: roomName,\n organizationId,\n type,\n members: new Set(),\n metadata\n };\n\n this.rooms.set(roomName, room);\n\n this.logDebug('Room created', {\n roomName,\n organizationId: organizationId.substring(0, 8) + '...',\n type,\n });\n }\n\n /**\n * Join user to room\n */\n public async joinRoom(userId: string, roomName: string): Promise<boolean> {\n const socketIds = this.userSockets.get(userId);\n const room = this.rooms.get(roomName);\n\n if (!socketIds || !room || !this.io) {\n return false;\n }\n\n room.members.add(userId);\n\n for (const socketId of socketIds) {\n const socket = this.io.sockets.sockets.get(socketId);\n if (socket) {\n await socket.join(roomName);\n }\n }\n\n this.logDebug('User joined room', { userId: userId.substring(0, 8) + '...', roomName });\n return true;\n }\n\n /**\n * Remove user from room\n */\n public async leaveRoom(userId: string, roomName: string): Promise<boolean> {\n const socketIds = this.userSockets.get(userId);\n const room = this.rooms.get(roomName);\n\n if (!socketIds || !room || !this.io) {\n return false;\n }\n\n room.members.delete(userId);\n\n for (const socketId of socketIds) {\n const socket = this.io.sockets.sockets.get(socketId);\n if (socket) {\n await socket.leave(roomName);\n }\n }\n\n this.logDebug('User left room', { userId: userId.substring(0, 8) + '...', roomName });\n return true;\n }\n\n // =====================================================\n // STATUS METHODS\n // =====================================================\n\n public getConnectedUsersCount(): number {\n return this.authenticatedSockets.size;\n }\n\n public getOrganizationUsersCount(organizationId: string): number {\n const socketIds = this.organizationSockets.get(organizationId);\n return socketIds ? socketIds.size : 0;\n }\n\n public isUserConnected(userId: string): boolean {\n const socketIds = this.userSockets.get(userId);\n return socketIds ? socketIds.size > 0 : false;\n }\n\n public getRoomInfo(roomName: string): RoomInfo | undefined {\n return this.rooms.get(roomName);\n }\n\n // =====================================================\n // PRIVATE SETUP METHODS\n // =====================================================\n\n /**\n * Get CORS origins from app-config runtime endpoints\n */\n private getCorsOrigins(): string[] {\n // Config must be initialized - this is ensured by the initialization order:\n // 1. AppsUpdaterConfigService fetches config from apps-manager\n // 2. Standard AppConfigurationService is initialized with that config\n // 3. HTTP server starts, which initializes WebSocket\n // If config is not initialized here, it's a programming error - fail fast\n if (!this.configService.isInitialized()) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.APP_CONFIGURATION_NOT_INITIALIZED,\n context: {\n message: 'Application configuration not initialized : use config before using the service',\n service: 'WebSocketService',\n operation: 'getCorsOrigins'\n }\n }\n );\n }\n\n const config = this.configService.config;\n const frontendServices = Object.keys(config.frontendServices ?? {});\n\n return frontendServices.map((frontendServiceName) => {\n const url = config.runtime?.endPoints?.[frontendServiceName]?.publicUrl;\n if (!url) {\n throw new Error(\n `Missing runtime.endPoints.${frontendServiceName}.publicUrl for declared frontend service \"${frontendServiceName}\". ` +\n 'WebSocket CORS cannot be derived from an incomplete runtime topology.',\n );\n }\n return url;\n });\n }\n\n /**\n * Setup Redis adapter for horizontal scaling across Kubernetes pods\n */\n private async setupRedisAdapter(): Promise<void> {\n try {\n if (!this.io) {\n throw new Error('Socket.IO server not initialized');\n }\n\n // Check if config is initialized before accessing\n if (!this.configService.isInitialized()) {\n this.logger.warn('App config not initialized, using memory adapter (single instance only)');\n return;\n }\n const appConfig = this.configService.config;\n const appSecrets = this.configService.secrets;\n\n if (!appConfig.database.redis) {\n this.logger.warn('Redis not configured, using memory adapter (single instance only)');\n return;\n }\n\n const redisHost = appConfig.database.redis.host;\n const redisPort = appConfig.database.redis.port || 6379;\n const redisPassword = appSecrets?.database?.redis?.password;\n const redisUsername = appSecrets?.database?.redis?.username;\n\n if (!redisHost || redisHost.includes('localhost')) {\n this.logger.warn('Redis not properly configured for production, using memory adapter (single instance only)');\n return;\n }\n\n // Build Redis client options (same pattern as RedisService)\n // Include username for ACL authentication (required when using app-specific credentials)\n const redisOptions: Parameters<typeof createClient>[0] = {\n socket: {\n host: redisHost,\n port: redisPort,\n connectTimeout: 10000\n },\n username: redisUsername,\n password: redisPassword,\n };\n\n const pubClient = createClient(redisOptions);\n const subClient = pubClient.duplicate();\n\n // CRITICAL: Attach error handlers BEFORE connect to prevent \"missing 'error' handler\" warnings\n // These handlers prevent unhandled errors from crashing the process during Redis restarts\n pubClient.on('error', (error) => {\n this.logger.error('Socket.IO Redis pubClient error', {\n ...projectCaughtErrorLogFields(error)\n });\n });\n subClient.on('error', (error) => {\n this.logger.error('Socket.IO Redis subClient error', {\n ...projectCaughtErrorLogFields(error)\n });\n });\n\n // Reconnection handlers for visibility\n pubClient.on('reconnecting', () => {\n this.logDebug('Socket.IO Redis pubClient reconnecting...');\n });\n subClient.on('reconnecting', () => {\n this.logDebug('Socket.IO Redis subClient reconnecting...');\n });\n\n await Promise.all([\n pubClient.connect(),\n subClient.connect()\n ]);\n\n // SECURITY FIX: Use tenant-specific channel prefix for Socket.IO adapter\n // This ensures each tenant's Socket.IO messages are isolated to their own channels\n // ACL pattern &{username}#* will only allow access to channels with this prefix\n const channelPrefix = redisUsername || 'default';\n this.io.adapter(createAdapter(pubClient, subClient, { key: channelPrefix }));\n\n this.logDebug('Socket.IO Redis adapter configured for horizontal scaling', {\n redisHost,\n redisPort,\n channelPrefix,\n scalingEnabled: true,\n environment: process.env.APPLICATION_ENV || 'development'\n });\n\n } catch (error: unknown) {\n this.logger.error('Failed to setup Redis adapter, falling back to memory adapter', {\n ...projectCaughtErrorLogFields(error),\n });\n this.logger.warn('Using memory adapter - horizontal scaling will not work across pods');\n }\n }\n\n /**\n * Setup authentication middleware\n * FACTORIZED: Uses ExecutionContextCreatorBackendService for JWT validation\n */\n private setupAuthentication(): void {\n if (!this.io) return;\n\n this.io.use(async (socket, next) => {\n // The HANDSHAKE runs in its own frame. This middleware is registered BEFORE the one that frames\n // per-message traffic, so without this every socket authentication — including its classified\n // failure logging and the AUTHENTICATION_FAILED rejection — was emitted with no correlationId.\n // A rejected handshake is exactly the event an investigator wants to correlate, so leaving the\n // seam unframed lost attribution on the highest-value socket records.\n await runInFreshRequestContextIfAbsent(async () => {\n try {\n const token = socket.handshake.auth.token ||\n socket.handshake.headers.authorization?.replace('Bearer ', '');\n\n let authResult: SocketAuthResult;\n\n if (!token) {\n // No token = public connection (allowed but limited)\n authResult = this.executionContextCreator.getPublicSocketAuth();\n this.logDebug('Public socket connection (no token)');\n } else {\n // Active-organization selector from the handshake. The server validates it\n // against the user's verified memberships before seeding\n // initiatorIds.organizationId (see resolveSocketActiveOrganizationId); a\n // stale/non-member value is ignored, never trusted, so it cannot widen scope.\n const requestedOrganizationId = typeof socket.handshake.auth?.organizationId === 'string'\n ? socket.handshake.auth.organizationId\n : undefined;\n authResult = await this.executionContextCreator.authenticateSocketConnection(token, requestedOrganizationId);\n\n // W7.3b: Capture consumable token from handshake auth or headers\n const consumableToken = socket.handshake.auth?.consumableToken\n || socket.handshake.headers?.[WildoHeaderKeys.CONSUMABLE_TOKEN];\n if (consumableToken && typeof consumableToken === 'string') {\n authResult.consumableTokenValue = consumableToken;\n }\n\n this.logDebug('Authenticated socket connection', {\n executionType: authResult.executionType,\n userId: authResult.initiatorIds?.userId?.substring(0, 8) + '...',\n rolesCount: authResult.initiatorRoles.length,\n hasConsumableToken: !!authResult.consumableTokenValue,\n });\n }\n\n (socket as any).auth = authResult;\n next();\n\n } catch (error) {\n // Websocket connection auth is a non-HTTP boundary (no downstream\n // `expressErrorHandler`), so the classified line must be emitted here.\n // The classifier maps an expected self-healing condition (expired\n // access token the client will refresh) to `debug` automatically, so no\n // manual severity split is needed.\n if (isWildoBackendError(error)) {\n logWildoBackendErrorAtClassifiedSeverity(\n this.logger,\n 'WebSocket authentication failed',\n error,\n { socketId: socket.id },\n );\n } else {\n this.logger.warn('WebSocket authentication failed', {\n socketId: socket.id,\n ...projectCaughtErrorLogFields(error),\n });\n }\n // Attach a machine-readable code to the handshake rejection. Socket.IO\n // forwards `err.data` verbatim to the client's `connect_error` handler,\n // so the frontend can tell an AUTH rejection (self-healable — refresh\n // the access token and reconnect) apart from a transport failure WITHOUT\n // matching on this human-readable message string. This is what lets a\n // backgrounded/unfocused tab renew its token and keep its socket alive\n // across access-token expiry, instead of replaying the expired token\n // until the user refocuses and HTTP traffic triggers a reactive refresh.\n const authError: Error & { data?: unknown } = new Error('Authentication failed');\n authError.data = { code: CoreWebSocketConnectionErrorCode.AUTHENTICATION_FAILED };\n next(authError);\n }\n });\n });\n }\n\n /**\n * Setup rate limiting middleware\n * Uses Redis for cross-pod synchronization of rate limit counters\n */\n private setupRateLimiting(): void {\n if (!this.io) return;\n\n // Intercept all incoming events with rate limiting\n this.io.use(async (socket, next) => {\n // Override socket.on to wrap event handlers with rate limiting\n const originalOn = socket.on.bind(socket);\n\n (socket as any).on = (event: string, handler: (...args: any[]) => void) => {\n // Internal Socket.IO events skip RATE LIMITING — they are lifecycle signals, not user-driven\n // traffic, so throttling them would be meaningless. They do NOT skip the request frame: a\n // `disconnect` runs real cleanup (room teardown, presence, any audit that follows), and an\n // unframed cleanup produces log lines and audit rows with no correlationId. Framing here rather\n // than leaving the branch bare is what keeps \"every socket seam is attributable\" true — the two\n // concerns (throttle vs attribute) were previously coupled only because they shared this wrapper.\n if (event.startsWith('$') || ['connect', 'disconnect', 'error'].includes(event)) {\n return originalOn(event, async (...args: any[]) => {\n await runInFreshRequestContextIfAbsent(() => handler(...args), {\n clientInstanceId: typeof socket.handshake.auth?.clientInstanceId === 'string'\n ? socket.handshake.auth.clientInstanceId\n : undefined,\n frontendServiceName: typeof socket.handshake.auth?.frontendServiceName === 'string'\n ? socket.handshake.auth.frontendServiceName\n : undefined,\n });\n });\n }\n\n // Wrap handler with rate limiting check\n return originalOn(event, async (...args: any[]) => {\n const auth = (socket as any).auth as SocketAuthResult;\n const identifier = auth.initiatorIds?.userId || socket.id;\n\n const allowed = await this.checkRateLimit(identifier, event, auth.initiatorIds?.organizationId);\n if (!allowed) {\n // Rate limit exceeded - emit error and skip handler\n socket.emit(CoreWebSocketEvent.SYSTEM_ERROR, {\n code: 'RATE_LIMIT_EXCEEDED',\n message: `Too many ${event} requests. Please slow down.`,\n details: { event }\n });\n this.logDebug('Rate limit exceeded', {\n identifier: identifier.substring(0, 8),\n event\n });\n return;\n }\n\n // Phase 1 — enter a fresh request-context frame per socket event so its logs, EC, and audit\n // rows carry ONE correlation id. Each socket message is a distinct operation.\n // Phase 5b — carry the CONNECTION's client-install id (sent once in the handshake `auth`\n // payload, since a socket has no per-message headers) onto every message's frame, so socket\n // -originated audit rows attribute to the same install as this client's HTTP rows. Admission\n // is still decided by the ingest policy inside `buildRequestContextFrame` — an application\n // that did not opt in records nothing here either.\n runInFreshRequestContextIfAbsent(() => handler(...args), {\n clientInstanceId: typeof socket.handshake.auth?.clientInstanceId === 'string'\n ? socket.handshake.auth.clientInstanceId\n : undefined,\n // Origin SURFACE, carried for the same reason and from the same handshake. Without it,\n // socket-originated audit rows would record WHICH INSTALL but not WHICH SURFACE, while\n // HTTP rows record both — an asymmetry with no rationale behind it.\n frontendServiceName: typeof socket.handshake.auth?.frontendServiceName === 'string'\n ? socket.handshake.auth.frontendServiceName\n : undefined,\n });\n });\n };\n\n next();\n });\n }\n\n /**\n * Check rate limit for an event using Redis\n * Returns true if allowed, false if rate limited\n *\n * Uses fixed-window Redis INCR and EXPIRE counters.\n */\n private async checkRateLimit(\n identifier: string,\n event: string,\n organizationId?: string,\n ): Promise<boolean> {\n const config = DEFAULT_RATE_LIMITS[event] || DEFAULT_RATE_LIMITS['default'];\n // Non-production relaxation of the per-event ceiling (shared seam — see\n // `rate-limit-environment-relaxation.backend.utils`). The counter still increments\n // through the real Redis path in every environment, so a key/TTL regression still\n // reproduces locally; only the ceiling moves.\n const effectiveMaxEvents = relaxAbuseThrottleMaxForEnvironment(config.maxEvents, this.configService.applicationEnv);\n\n try {\n const count = await this.redisService.incrementRateLimit(\n `ws:${identifier}:${event}`,\n config.windowSeconds,\n organizationId,\n );\n return count <= effectiveMaxEvents;\n\n } catch (error) {\n // WebSocket event floods are interactive traffic; fail closed when the\n // shared counter cannot be checked instead of silently bypassing quotas.\n this.logger.warn('Rate limit check failed, blocking request', {\n identifier: identifier.substring(0, 8),\n event,\n ...projectCaughtErrorLogFields(error),\n });\n return false;\n }\n }\n\n /**\n * Setup connection handling\n * Joins user to identity-based rooms based on their roles and IDs\n * Sets up resource room handlers for collaboration\n */\n private setupConnectionHandling(): void {\n if (!this.io) return;\n\n this.io.on('connection', (socket: Socket) => {\n const auth = (socket as any).auth as SocketAuthResult;\n\n // Track authenticated socket\n this.authenticatedSockets.set(socket.id, auth);\n\n // Idle-activity tracking: stamp connect time, then bump on every inbound app-level event. The\n // idle sweep force-disconnects a socket with no inbound activity for WEBSOCKET_IDLE_TIMEOUT_MS.\n // `onAny` fires for app events only — NOT Socket.IO pings and NOT server→client pushes — so a\n // purely passive subscriber is treated as idle by design (see WEBSOCKET_IDLE_TIMEOUT_MS).\n (socket as SocketWithActivity).lastActivityAt = Date.now();\n socket.onAny(() => { (socket as SocketWithActivity).lastActivityAt = Date.now(); });\n\n // === IDENTITY-BASED ROOM ASSIGNMENT ===\n\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n // Public users only join public room\n socket.join(WebSocketRoomPrefix.PUBLIC);\n this.logDebug('Public socket connected', { socketId: socket.id });\n\n // Still setup disconnect handler\n socket.on('disconnect', () => {\n this.handleSocketDisconnection(socket.id, this.getSocketAuth(socket));\n });\n return;\n }\n\n // User: Join organization-based rooms from their roles\n for (const roleInfo of auth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS && roleInfo.relatedResourceId) {\n const orgId = roleInfo.relatedResourceId;\n\n // Organization room (receives all org-wide notifications)\n socket.join(buildOrganizationRoomName(orgId));\n\n // Track organization sockets\n if (!this.organizationSockets.has(orgId)) {\n this.organizationSockets.set(orgId, new Set());\n }\n this.organizationSockets.get(orgId)!.add(socket.id);\n\n // Role-specific rooms (for role-targeted notifications)\n for (const role of roleInfo.roles || []) {\n socket.join(buildOrganizationRoleRoomName(orgId, role));\n }\n }\n\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.APPLICATION && roleInfo.relatedResourceId) {\n // App-level role room (for app admins, super admins)\n for (const role of roleInfo.roles || []) {\n socket.join(buildAppRoleRoomName(role));\n }\n }\n }\n\n // User-specific room (for direct messages, personal notifications)\n if (auth.initiatorIds?.userId) {\n socket.join(buildUserRoomName(auth.initiatorIds.userId));\n\n // Track user sockets for multi-tab support\n if (!this.userSockets.has(auth.initiatorIds.userId)) {\n this.userSockets.set(auth.initiatorIds.userId, new Set());\n }\n this.userSockets.get(auth.initiatorIds.userId)!.add(socket.id);\n }\n\n this.logDebug('Socket connected with identity rooms', {\n socketId: socket.id,\n executionType: auth.executionType,\n userId: auth.initiatorIds?.userId?.substring(0, 8),\n organizationRoles: auth.initiatorRoles.filter(r => r.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS).length\n });\n\n // === RESOURCE ROOM HANDLERS (for collaboration) ===\n this.setupResourceRoomHandlers(socket);\n\n // === BADGE HANDLERS ===\n this.setupBadgeHandlers(socket);\n\n // === BADGE SEED (compute-on-connect) ===\n // Fire-and-forget: recompute/emit the connecting user's badges so the client\n // paints current counts on first render (derived badges especially, which\n // otherwise read 0 until the next source mutation). Never blocks the handler.\n void this.seedBadgesOnConnect(auth);\n\n // === SYSTEM EVENT HANDLERS ===\n this.setupSystemEventHandlers(socket);\n\n // === FLOWS-ACTORS CONVERSATION HANDLERS ===\n this.setupFlowsActorsHandlers(socket);\n\n // === DISCONNECTION HANDLING ===\n socket.on('disconnect', () => {\n this.handleSocketDisconnection(socket.id, this.getSocketAuth(socket));\n });\n });\n }\n\n /**\n * Setup handlers for resource-centric rooms (collaboration, editing locks, custom events)\n * These rooms are path-independent - same resource = same room regardless of access path\n */\n private setupResourceRoomHandlers(socket: Socket): void {\n\n // === SUBSCRIBE TO RESOURCE ROOM ===\n socket.on(CoreWebSocketEvent.RESOURCE_SUBSCRIBE, async (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceSubscribePayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n socket.emit(CoreWebSocketEvent.RESOURCE_SUBSCRIBED, {\n roomName: '',\n success: false,\n error: `Invalid payload: ${parseResult.error.issues[0]?.message || 'validation failed'}`\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId, scopeKey, scopeId, contextResourceIdentifiers } = payload;\n\n // Validate contextResourceIdentifiers has at least one entry\n if (!contextResourceIdentifiers || Object.keys(contextResourceIdentifiers).length === 0) {\n socket.emit(CoreWebSocketEvent.RESOURCE_SUBSCRIBED, {\n roomName: '',\n success: false,\n error: 'contextResourceIdentifiers is required for authorization'\n });\n return;\n }\n\n try {\n const auth = this.getSocketAuth(socket);\n // Verify READ access using full context (organization, parent resources, etc.)\n if (resourceId) {\n await this.verifyResourceAccess(socket, auth, resourceType, resourceId, contextResourceIdentifiers);\n } else if (scopeKey && scopeId) {\n // For collection subscription, verify context access\n await this.verifyScopeAccess(auth, resourceType, scopeKey, scopeId, contextResourceIdentifiers);\n } else {\n throw this.errorBuilder.buildError(ErrorType.VALIDATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.SERVICE_RESOURCE_VALIDATION_FAILED,\n context: { operation: 'resourceSubscribe' }, // diagnostic (log-only)\n });\n }\n\n // Build room name\n const roomName = resourceId\n ? buildResourceRoomName(resourceType, resourceId)\n : buildScopeRoomName(resourceType, scopeKey!, scopeId!);\n\n socket.join(roomName);\n this.trackSocketResourceSubscription(socket.id, {\n ...payload,\n roomName,\n });\n\n // Get current editing users for this resource (if subscribing to specific resource)\n let editingUsers: string[] = [];\n if (resourceId) {\n editingUsers = await this.getResourceEditingUsers(resourceType, resourceId);\n }\n\n socket.emit(CoreWebSocketEvent.RESOURCE_SUBSCRIBED, {\n roomName,\n success: true,\n editingUsers, // Include current editing users in subscription confirmation\n });\n\n this.logDebug('Socket subscribed to resource room', {\n socketId: socket.id,\n roomName,\n userId: auth.initiatorIds?.userId?.substring(0, 8),\n contextKeys: Object.keys(contextResourceIdentifiers),\n editingUsersCount: editingUsers.length\n });\n\n } catch (error) {\n // Resource-subscribe is a non-HTTP boundary — emit the classified line\n // here (an authorization/scope failure would otherwise be invisible in\n // the logs now that errors no longer self-log at construction).\n if (isWildoBackendError(error)) {\n logWildoBackendErrorAtClassifiedSeverity(\n this.logger,\n 'WebSocket resource subscription failed',\n error,\n { socketId: socket.id, resourceType, resourceId, scopeKey, scopeId },\n );\n } else {\n this.logger.warn('WebSocket resource subscription failed', {\n socketId: socket.id,\n resourceType,\n ...projectCaughtErrorLogFields(error),\n });\n }\n const roomName = resourceId\n ? buildResourceRoomName(resourceType, resourceId)\n : buildScopeRoomName(resourceType, scopeKey || '', scopeId || '');\n socket.emit(CoreWebSocketEvent.RESOURCE_SUBSCRIBED, {\n roomName,\n success: false,\n error: error instanceof Error ? error.message : 'Access denied'\n });\n }\n });\n\n // === UNSUBSCRIBE FROM RESOURCE ROOM ===\n socket.on(CoreWebSocketEvent.RESOURCE_UNSUBSCRIBE, (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceSubscribePayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n socket.emit(CoreWebSocketEvent.RESOURCE_UNSUBSCRIBED, {\n roomName: '',\n success: false,\n error: `Invalid payload: ${parseResult.error.issues[0]?.message || 'validation failed'}`\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId, scopeKey, scopeId } = payload;\n\n const roomName = resourceId\n ? buildResourceRoomName(resourceType, resourceId)\n : buildScopeRoomName(resourceType, scopeKey!, scopeId!);\n\n socket.leave(roomName);\n this.untrackSocketResourceSubscription(socket.id, roomName);\n socket.emit(CoreWebSocketEvent.RESOURCE_UNSUBSCRIBED, { roomName, success: true });\n\n this.logDebug('Socket unsubscribed from resource room', { socketId: socket.id, roomName });\n });\n\n // === START EDITING (LOCK) ===\n socket.on(CoreWebSocketEvent.RESOURCE_EDITING_START, async (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceEditingPayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_ERROR, {\n resourceType: '',\n resourceId: '',\n success: false,\n error: `Invalid payload: ${parseResult.error.issues[0]?.message || 'validation failed'}`\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId, contextResourceIdentifiers } = payload;\n const auth = this.getSocketAuth(socket);\n const userId = auth.initiatorIds?.userId;\n\n if (!userId) {\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_ERROR, {\n resourceType,\n resourceId,\n success: false,\n error: 'Authentication required for editing'\n });\n return;\n }\n\n // Validate contextResourceIdentifiers is provided\n if (!contextResourceIdentifiers || Object.keys(contextResourceIdentifiers).length === 0) {\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_ERROR, {\n resourceType,\n resourceId,\n success: false,\n error: 'contextResourceIdentifiers is required for authorization'\n });\n return;\n }\n\n try {\n // Verify user has WRITE access to edit this resource (using UPDATE operation)\n await this.verifyResourceAccessForEdit(socket, auth, resourceType, resourceId, contextResourceIdentifiers);\n\n const roomName = buildResourceRoomName(resourceType, resourceId);\n\n // Track editing state in memory + Redis for cross-pod sync\n await this.trackEditingState(resourceType, resourceId, userId, 'start');\n\n // Broadcast to room (exclude sender) - don't include contextResourceIdentifiers in broadcast\n const eventPayload: WS_ResourceEditingPayload = {\n resourceType,\n resourceId,\n initiatorUserId: userId,\n timestamp: new Date(),\n };\n socket.to(roomName).emit(CoreWebSocketEvent.RESOURCE_EDITING_START, eventPayload);\n\n // Confirm to sender\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_STARTED, { resourceType, resourceId, success: true });\n\n this.logDebug('User started editing resource', {\n userId: userId.substring(0, 8),\n resourceType,\n resourceId: resourceId.substring(0, 8)\n });\n\n } catch (error) {\n socket.emit(CoreWebSocketEvent.RESOURCE_EDITING_ERROR, {\n resourceType,\n resourceId,\n success: false,\n error: 'Access denied'\n });\n }\n });\n\n // === STOP EDITING (UNLOCK) ===\n socket.on(CoreWebSocketEvent.RESOURCE_EDITING_END, async (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceEditingPayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n // Silent fail for editing end (not critical)\n this.logDebug('Invalid editing end payload', {\n error: parseResult.error.issues[0]?.message\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId } = payload;\n const auth = this.getSocketAuth(socket);\n const userId = auth.initiatorIds?.userId;\n\n if (!userId) return;\n\n const roomName = buildResourceRoomName(resourceType, resourceId);\n\n // Clear editing state\n await this.trackEditingState(resourceType, resourceId, userId, 'end');\n\n // Broadcast to room (exclude sender)\n const eventPayload: WS_ResourceEditingPayload = {\n resourceType,\n resourceId,\n initiatorUserId: userId,\n timestamp: new Date(),\n };\n socket.to(roomName).emit(CoreWebSocketEvent.RESOURCE_EDITING_END, eventPayload);\n\n this.logDebug('User stopped editing resource', {\n userId: userId.substring(0, 8),\n resourceType,\n resourceId: resourceId.substring(0, 8)\n });\n });\n\n // === CUSTOM COLLABORATION EVENT ===\n socket.on(CoreWebSocketEvent.RESOURCE_CUSTOM, async (rawPayload: unknown) => {\n // Runtime validation using Zod schema\n const parseResult = WS_ResourceCustomEventPayloadSchema.safeParse(rawPayload);\n if (!parseResult.success) {\n socket.emit(CoreWebSocketEvent.RESOURCE_CUSTOM_ERROR, {\n eventName: '',\n error: `Invalid payload: ${parseResult.error.issues[0]?.message || 'validation failed'}`\n });\n return;\n }\n\n const payload = parseResult.data;\n const { resourceType, resourceId, eventName, data, includeSelf, contextResourceIdentifiers } = payload;\n const auth = this.getSocketAuth(socket);\n const userId = auth.initiatorIds?.userId;\n\n // Validate contextResourceIdentifiers is provided\n if (!contextResourceIdentifiers || Object.keys(contextResourceIdentifiers).length === 0) {\n socket.emit(CoreWebSocketEvent.RESOURCE_CUSTOM_ERROR, { eventName, error: 'contextResourceIdentifiers is required' });\n return;\n }\n\n try {\n // Verify READ access (custom events require at least read access)\n await this.verifyResourceAccess(socket, auth, resourceType, resourceId, contextResourceIdentifiers);\n\n const roomName = buildResourceRoomName(resourceType, resourceId);\n\n // Build outgoing event payload (don't include contextResourceIdentifiers in broadcast)\n const eventPayload: WS_ResourceCustomEventPayload = {\n resourceType,\n resourceId,\n eventName,\n data,\n initiatorUserId: userId,\n timestamp: new Date(),\n // Include resourceData and dataMode if present in the incoming payload\n resourceData: payload.resourceData,\n dataMode: payload.dataMode,\n };\n\n // Validate and transform resource data if present\n if (payload.resourceData) {\n const dataMode = this.extractDataMode(payload);\n const validation = this.validateAndTransformResourceData(\n payload.resourceData,\n resourceType,\n undefined, // Custom events don't have operationIdentifier\n dataMode,\n );\n if (validation.success) {\n eventPayload.resourceData = validation.data;\n } else {\n delete eventPayload.resourceData;\n delete eventPayload.dataMode;\n }\n }\n\n // Broadcast to room (include or exclude sender based on flag)\n if (includeSelf) {\n this.io!.to(roomName).emit(CoreWebSocketEvent.RESOURCE_CUSTOM, eventPayload);\n } else {\n socket.to(roomName).emit(CoreWebSocketEvent.RESOURCE_CUSTOM, eventPayload);\n }\n\n } catch (error) {\n socket.emit(CoreWebSocketEvent.RESOURCE_CUSTOM_ERROR, { eventName, error: 'Access denied' });\n }\n });\n }\n\n /**\n * Setup system event handlers (auth refresh, organization switch)\n */\n private setupSystemEventHandlers(socket: Socket): void {\n // Token refresh handling\n socket.on(CoreWebSocketEvent.AUTH_REFRESH, async (payload: { token: string }) => {\n try {\n const oldAuth = (socket as any).auth as SocketAuthResult;\n const newAuth = await this.executionContextCreator.authenticateSocketConnection(payload.token);\n\n // W7.3b: Carry forward consumable token across auth refreshes\n if (oldAuth.consumableTokenValue) {\n newAuth.consumableTokenValue = oldAuth.consumableTokenValue;\n }\n\n // Preserve the connection's active organization across token refresh when it\n // is still a valid membership. `newAuth` is re-resolved without the original\n // handshake selector, so a multi-org connection would otherwise lose its\n // pinned org (and single-org inference would silently re-pick the sole org).\n if (\n oldAuth.initiatorIds?.organizationId\n && newAuth.initiatorIds\n && this.hasOrganizationAccess(newAuth, oldAuth.initiatorIds.organizationId)\n ) {\n newAuth.initiatorIds.organizationId = oldAuth.initiatorIds.organizationId;\n }\n\n (socket as any).auth = newAuth;\n this.authenticatedSockets.set(socket.id, newAuth);\n\n // Re-assign identity rooms based on new auth\n await this.reassignIdentityRooms(socket, oldAuth, newAuth);\n await this.revalidateTrackedResourceSubscriptions(socket, newAuth);\n\n socket.emit(CoreWebSocketEvent.SYSTEM_TOKEN_REFRESHED, { success: true });\n\n this.logDebug('Socket auth refreshed and rooms reassigned', {\n socketId: socket.id,\n userId: newAuth.initiatorIds?.userId?.substring(0, 8),\n newRolesCount: newAuth.initiatorRoles.length\n });\n } catch (error) {\n // Non-HTTP boundary — classified line emitted here; the classifier maps\n // an expired access token to `debug` automatically.\n if (isWildoBackendError(error)) {\n logWildoBackendErrorAtClassifiedSeverity(\n this.logger,\n 'WebSocket auth refresh failed',\n error,\n { socketId: socket.id },\n );\n } else {\n this.logger.warn('WebSocket auth refresh failed', {\n socketId: socket.id,\n ...projectCaughtErrorLogFields(error),\n });\n }\n socket.emit(CoreWebSocketEvent.SYSTEM_ERROR, {\n code: 'AUTH_REFRESH_FAILED',\n message: isWildoBackendError(error)\n ? error.customMessageReference\n : (error instanceof Error ? error.message : 'Token refresh failed'),\n });\n }\n });\n\n // Organization switch handling\n socket.on(CoreWebSocketEvent.ORGANIZATION_SWITCH, async (payload: { organizationId: string; previousOrganizationId?: string }) => {\n const auth = this.getSocketAuth(socket);\n\n if (!this.hasOrganizationAccess(auth, payload.organizationId)) {\n socket.emit(CoreWebSocketEvent.SYSTEM_ERROR, {\n code: 'ORGANIZATION_SWITCH_FORBIDDEN',\n message: 'Access denied to the requested organization',\n });\n return;\n }\n\n // Record the now-active organization on the connection identity (membership was\n // just verified above) so org-scoped resource authorization — which reads\n // initiatorIds.organizationId — reflects the switch. `auth` is the same object\n // reference held in `authenticatedSockets`, so this updates both.\n if (auth.initiatorIds) {\n auth.initiatorIds.organizationId = payload.organizationId;\n }\n\n // Leave old organization rooms if specified\n if (payload.previousOrganizationId) {\n socket.leave(buildOrganizationRoomName(payload.previousOrganizationId));\n this.organizationSockets.get(payload.previousOrganizationId)?.delete(socket.id);\n if (this.organizationSockets.get(payload.previousOrganizationId)?.size === 0) {\n this.organizationSockets.delete(payload.previousOrganizationId);\n }\n // Leave role rooms too\n for (const roleInfo of auth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS &&\n roleInfo.relatedResourceId === payload.previousOrganizationId) {\n for (const role of roleInfo.roles || []) {\n socket.leave(buildOrganizationRoleRoomName(payload.previousOrganizationId, role));\n }\n }\n }\n\n const trackedSubscriptions = Array.from(this.resourceSubscriptionsBySocket.get(socket.id)?.values() ?? []);\n for (const subscription of trackedSubscriptions) {\n if (!subscriptionMatchesOrganization(subscription, payload.previousOrganizationId)) {\n continue;\n }\n await this.revokeTrackedResourceSubscription({\n socket,\n auth,\n subscription,\n reason: 'organization_switch',\n });\n }\n }\n\n // Join new organization rooms\n socket.join(buildOrganizationRoomName(payload.organizationId));\n if (!this.organizationSockets.has(payload.organizationId)) {\n this.organizationSockets.set(payload.organizationId, new Set());\n }\n this.organizationSockets.get(payload.organizationId)!.add(socket.id);\n\n // Find roles for the new organization and join role rooms\n for (const roleInfo of auth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS &&\n roleInfo.relatedResourceId === payload.organizationId) {\n for (const role of roleInfo.roles || []) {\n socket.join(buildOrganizationRoleRoomName(payload.organizationId, role));\n }\n }\n }\n\n this.logDebug('Organization switched', {\n socketId: socket.id,\n previousOrganizationId: payload.previousOrganizationId?.substring(0, 8),\n newOrganizationId: payload.organizationId.substring(0, 8)\n });\n });\n }\n\n /**\n * Reassign identity-based rooms when auth is refreshed\n * Handles role changes, organization membership changes, etc.\n */\n private async reassignIdentityRooms(\n socket: Socket,\n oldAuth: SocketAuthResult,\n newAuth: SocketAuthResult\n ): Promise<void> {\n // === LEAVE OLD ROOMS ===\n\n // Leave old user room if user ID changed (unlikely but possible)\n if (oldAuth.initiatorIds?.userId && oldAuth.initiatorIds.userId !== newAuth.initiatorIds?.userId) {\n socket.leave(buildUserRoomName(oldAuth.initiatorIds.userId));\n // Update user sockets tracking\n this.userSockets.get(oldAuth.initiatorIds.userId)?.delete(socket.id);\n }\n\n // Build sets of old and new organization rooms for comparison\n const oldOrgRooms = new Set<string>();\n const oldRoleRooms = new Set<string>();\n for (const roleInfo of oldAuth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS && roleInfo.relatedResourceId) {\n oldOrgRooms.add(buildOrganizationRoomName(roleInfo.relatedResourceId));\n for (const role of roleInfo.roles || []) {\n oldRoleRooms.add(buildOrganizationRoleRoomName(roleInfo.relatedResourceId, role));\n }\n }\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.APPLICATION) {\n for (const role of roleInfo.roles || []) {\n oldRoleRooms.add(buildAppRoleRoomName(role));\n }\n }\n }\n\n const newOrgRooms = new Set<string>();\n const newRoleRooms = new Set<string>();\n for (const roleInfo of newAuth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS && roleInfo.relatedResourceId) {\n newOrgRooms.add(buildOrganizationRoomName(roleInfo.relatedResourceId));\n for (const role of roleInfo.roles || []) {\n newRoleRooms.add(buildOrganizationRoleRoomName(roleInfo.relatedResourceId, role));\n }\n }\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.APPLICATION) {\n for (const role of roleInfo.roles || []) {\n newRoleRooms.add(buildAppRoleRoomName(role));\n }\n }\n }\n\n // Leave org rooms that are no longer in new auth\n for (const room of oldOrgRooms) {\n if (!newOrgRooms.has(room)) {\n socket.leave(room);\n // Update organization sockets tracking\n const orgId = parseOrganizationRoomName(room);\n if (orgId) {\n this.organizationSockets.get(orgId)?.delete(socket.id);\n }\n }\n }\n\n // Leave role rooms that are no longer in new auth\n for (const room of oldRoleRooms) {\n if (!newRoleRooms.has(room)) {\n socket.leave(room);\n }\n }\n\n // Leave public room if was public but now authenticated\n if (oldAuth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION &&\n newAuth.executionType !== ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n socket.leave(WebSocketRoomPrefix.PUBLIC);\n }\n\n // === JOIN NEW ROOMS ===\n\n // Join new user room\n if (newAuth.initiatorIds?.userId) {\n socket.join(buildUserRoomName(newAuth.initiatorIds.userId));\n if (!this.userSockets.has(newAuth.initiatorIds.userId)) {\n this.userSockets.set(newAuth.initiatorIds.userId, new Set());\n }\n this.userSockets.get(newAuth.initiatorIds.userId)!.add(socket.id);\n }\n\n // Join new org rooms\n for (const room of newOrgRooms) {\n if (!oldOrgRooms.has(room)) {\n socket.join(room);\n const orgId = parseOrganizationRoomName(room);\n if (orgId) {\n if (!this.organizationSockets.has(orgId)) {\n this.organizationSockets.set(orgId, new Set());\n }\n this.organizationSockets.get(orgId)!.add(socket.id);\n }\n }\n }\n\n // Join new role rooms\n for (const room of newRoleRooms) {\n if (!oldRoleRooms.has(room)) {\n socket.join(room);\n }\n }\n\n // Join public room if now public\n if (newAuth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n socket.join(WebSocketRoomPrefix.PUBLIC);\n }\n }\n\n /**\n * Setup flows-actors conversation handlers (`flows-actors:start`,\n * `flows-actors:approval-response`).\n *\n * Validates the inbound payload, resolves the connecting user's identity from\n * the validated socket auth, builds an emitter bound to that user's room (so\n * all their tabs receive the stream), and delegates to the conversational\n * runtime. Every server→client event (started / message / status / completed /\n * error) flows back through the emitter; synchronous validation/auth failures\n * reply on the socket directly.\n */\n private setupFlowsActorsHandlers(socket: Socket): void {\n socket.on(CoreWebSocketEvent.FLOWS_ACTORS_START, async (rawPayload: unknown) => {\n const parsed = WS_FlowsActorsStartPayloadSchema.safeParse(rawPayload);\n if (!parsed.success) {\n this.emitFlowsActorsInvalidPayload(socket, rawPayload, parsed.error.issues[0]?.message);\n return;\n }\n const auth = this.getSocketAuth(socket);\n const initiator = auth?.initiatorIds;\n if (!initiator?.userId || auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n socket.emit(CoreWebSocketEvent.FLOWS_ACTORS_ERROR, {\n systemRef: parsed.data.systemRef,\n executionId: parsed.data.executionId ?? '',\n errorCode: 'UNAUTHENTICATED',\n errorMessage: 'Authentication is required to start a conversation.',\n recoverable: false,\n });\n return;\n }\n const userId = initiator.userId;\n const emitter: FlowsActorsExecutionEmitter = (event, payload) => {\n if (!this.io) return;\n this.io.to(buildUserRoomName(userId)).emit(event, payload);\n };\n // N/A on `resourceServerInstanceRef`: the WebSocket surface serves no A2A agent, so the\n // conversation records the default-agent sentinel. Written HERE, not only on the parameter\n // declaration — the two sites that lost this axis (finding A-1) carried no comment at all,\n // and an unmarked omission is indistinguishable from an oversight.\n await this.getConversationalExecutionService().startConversationalExecution({\n systemRef: parsed.data.systemRef,\n executionId: parsed.data.executionId,\n initialInput: parsed.data.initialInput,\n initiator,\n auth,\n // The WS chat channel is user-scoped (results stream to the user's room) →\n // the conversation is owned by the user variant (userFlowActorExecutions).\n scopeContext: { userId },\n emitter,\n });\n });\n\n socket.on(CoreWebSocketEvent.FLOWS_ACTORS_APPROVAL_RESPONSE, async (rawPayload: unknown) => {\n const parsed = WS_FlowsActorsApprovalResponsePayloadSchema.safeParse(rawPayload);\n if (!parsed.success) {\n this.emitFlowsActorsInvalidPayload(socket, rawPayload, parsed.error.issues[0]?.message);\n return;\n }\n const auth = this.getSocketAuth(socket);\n const initiator = auth?.initiatorIds;\n if (!initiator?.userId) return;\n const approverUserId = initiator.userId;\n await this.getConversationalExecutionService().respondToApproval({\n systemRef: parsed.data.systemRef,\n executionId: parsed.data.executionId,\n approvalId: parsed.data.approvalId,\n approved: parsed.data.approved,\n scopeContext: { userId: approverUserId },\n /*\n * The channel back to the approver — and until now this handler passed NONE.\n *\n * `resumeAfterApproval` streams the resumed reply and its final message through\n * `params.emitter?.(…)`, and its own comments say so (\"the agent's reply was emitted to the\n * live socket\"). At the only production call site there was no emitter, so every one of\n * those calls was a no-op: a person approved a tool call and their screen showed nothing\n * until they reloaded, which read as a resume that had not happened.\n *\n * It became load-bearing rather than merely missing with approve-with-modifications (#566):\n * an edit the server REFUSES has to reach the human who made it, or the surface has\n * collected a change and dropped it — the exact outcome #537 refused to ship.\n *\n * Same construction as the START handler above: the initiating user's own room, bound to\n * the SERVER-VALIDATED id, never anything from the payload.\n */\n emitter: (event, payload) => {\n if (!this.io) return;\n this.io.to(buildUserRoomName(approverUserId)).emit(event, payload);\n },\n /*\n * The arguments the approver AUTHORED, when they edited the proposed call (#566).\n *\n * Forwarded rather than interpreted: this handler cannot know the tool's `inputSchema`, and\n * the browser's validation is a convenience. The server re-validates against the tool's own\n * schema, re-signs the approval over the modified input, and refuses back through the\n * emitter above with the pause left standing — so a rejected edit costs an error message\n * rather than the turn.\n */\n modifiedToolArgs: parsed.data.modifiedToolArgs,\n // The APPROVER's verified auth. The resumed turn executes the gated tool, and it must do so\n // with a real identity — without this the agent resolves no tools at all and the approval\n // completes having done nothing. Passing the socket's own auth (never anything from the\n // payload) also means approving cannot reach past what the approver could already do.\n auth,\n // Threaded, never defaulted here. Defaulting is what made a named-instance approval\n // unresumable: the resume filtered on the DEFAULT sentinel while the paused execution had\n // been written with the named ref, so the read matched nothing and returned silently.\n resourceServerInstanceRef: parsed.data.resourceServerInstanceRef,\n /*\n * The approver's own words, forwarded to the model — and until 2026-09-09 they were not.\n *\n * `comment` is offered by the approval surface, sent by the browser and validated by the\n * payload schema; this handler parsed it and passed everything EXCEPT it, so `reason` was\n * always `undefined` and the text a person typed to explain their decision reached nothing.\n * The UI collected it, the wire carried it, and it was dropped one function short of the\n * `tool-approval-response` that would have shown it to the agent.\n *\n * That is the same defect #537 refused to ship for a MODIFIED ARGUMENT — a surface that\n * collects a change and silently discards it — already live for the field beside it. It\n * matters most on a DENIAL: denying resumes the turn so the model can respond, and \"no,\n * send it to finance instead\" is the difference between the agent re-proposing something\n * useful and answering that it cannot proceed.\n */\n reason: parsed.data.comment,\n });\n });\n }\n\n /** Reply on the initiating socket with a `FLOWS_ACTORS_ERROR` for a malformed inbound payload. */\n private emitFlowsActorsInvalidPayload(socket: Socket, rawPayload: unknown, issue?: string): void {\n const raw = (rawPayload ?? {}) as Record<string, unknown>;\n socket.emit(CoreWebSocketEvent.FLOWS_ACTORS_ERROR, {\n systemRef: typeof raw.systemRef === 'string' ? raw.systemRef : '',\n executionId: typeof raw.executionId === 'string' ? raw.executionId : '',\n errorCode: 'INVALID_PAYLOAD',\n errorMessage: `Invalid flows-actors payload: ${issue ?? 'validation failed'}`,\n recoverable: false,\n });\n }\n\n /**\n * Setup badge handlers (badge:get, badge:get-all)\n * Enables frontend useBadge and useUserBadges hooks\n */\n /**\n * Seed the connecting user's notification badges (compute-on-connect, R6a).\n *\n * Builds an execution context from the VALIDATED socket auth (the user's own\n * authenticated identity — not a system-privileged context) and asks the badge\n * service to recompute derived badges + re-emit event badges for the socket's\n * scope. Scope is pinned to `auth.initiatorIds` (server-validated), so no\n * cross-tenant read is possible. Fire-and-forget; failures are logged only.\n */\n private async seedBadgesOnConnect(auth: SocketAuthResult): Promise<void> {\n try {\n // The badge service builds its own scope-correct execution contexts for\n // each badge's source count + badge write, so the seed only needs a\n // resolvable internal context to pass through. Use a repository-direct\n // internal EC — NOT the socket-auth `APPLICATION.READ` EC, whose internal\n // reuse threw \"Cannot read properties of undefined (reading 'operations')\".\n // Scope stays pinned to the server-validated `auth.initiatorIds`.\n const executionContext = await this.executionContextCreator.createForInternalRepositoryOperation({\n resourceType: CoreResourceType.USER_NOTIFICATION_BADGES,\n operationIdentifier: CoreResourceOperation.CREATE,\n });\n await this.getBadgeService().syncBadgesForConnection(executionContext, auth.initiatorIds ?? {});\n } catch (error) {\n this.logger.warn('Failed to seed badges on connect', {\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n\n private setupBadgeHandlers(socket: Socket): void {\n // badge:get - Get single badge count\n socket.on(CoreWebSocketEvent.BADGE_GET, async (\n payload: { identifier: string; scope: string; scopeId: string },\n callback?: (response: { count: number }) => void\n ) => {\n if (!callback) return;\n\n try {\n const auth = this.getSocketAuth(socket);\n /**\n * `payload.scope` is CLIENT-supplied. It used to be cast (`as ResourcePrimaryScope`) and\n * handed straight to the access check and the badge service, so a scope no resource type\n * backs — `application`, dropped by the polymorphism refactor — reached both and was\n * answered with a silent zero. Parse it instead: an unsupported scope is refused here, and\n * what continues is a value the badge service's own two-scope contract can accept.\n */\n if (!isSupportedNotificationBadgeScope(payload.scope)) {\n callback({ count: 0 });\n return;\n }\n const badgeScope = payload.scope;\n // Verify user has access to this scope\n if (!this.verifyBadgeScopeAccess(auth, badgeScope, payload.scopeId)) {\n callback({ count: 0 });\n return;\n }\n\n // Build a minimal execution context for the badge service\n const appReadOp = this.resourcesRegistry.getOperationFromPath(\n this.resourcesRegistry.getOperationPathDefault('APPLICATION', CoreResourceOperation.READ)\n );\n if (!appReadOp) {\n callback({ count: 0 });\n return;\n }\n\n const executionContext = await this.executionContextCreator.buildContextFromSocketAuth(\n auth,\n appReadOp,\n {}\n );\n\n const count = await this.getBadgeService().getBadgeCount(\n executionContext,\n badgeScope,\n payload.scopeId,\n payload.identifier\n );\n\n callback({ count });\n } catch (error) {\n this.logger.warn('Failed to get badge count', {\n ...projectCaughtErrorLogFields(error)\n });\n callback({ count: 0 });\n }\n });\n\n // badge:get-all - Get all badges for a scope\n socket.on(CoreWebSocketEvent.BADGE_GET_ALL, async (\n payload: { scope: string; scopeId: string },\n callback?: (response: Array<{ identifier: string; count: number }>) => void\n ) => {\n if (!callback) return;\n\n try {\n const auth = this.getSocketAuth(socket);\n // Same parse-don't-cast as `badge:get` above — see the comment there.\n if (!isSupportedNotificationBadgeScope(payload.scope)) {\n callback([]);\n return;\n }\n const badgeScope = payload.scope;\n // Verify user has access to this scope\n if (!this.verifyBadgeScopeAccess(auth, badgeScope, payload.scopeId)) {\n callback([]);\n return;\n }\n\n // Build a minimal execution context for the badge service\n const appReadOp = this.resourcesRegistry.getOperationFromPath(\n this.resourcesRegistry.getOperationPathDefault('APPLICATION', CoreResourceOperation.READ)\n );\n if (!appReadOp) {\n callback([]);\n return;\n }\n\n const executionContext = await this.executionContextCreator.buildContextFromSocketAuth(\n auth,\n appReadOp,\n {}\n );\n\n const badges = await this.getBadgeService().getAllBadges(\n executionContext,\n badgeScope,\n payload.scopeId\n );\n\n callback(badges);\n } catch (error) {\n this.logger.warn('Failed to get all badges', {\n ...projectCaughtErrorLogFields(error)\n });\n callback([]);\n }\n });\n }\n\n /**\n * Verify user has access to a badge scope\n */\n /**\n * May this socket read badges at `(scope, scopeId)`?\n *\n * Typed `NotificationScope` rather than `ResourcePrimaryScope` because only two scopes have a\n * badge resource behind them. The removed third arm granted access to \"application-level badges\"\n * on the strength of holding any application role — a survivor of the polymorphism refactor that\n * dropped the APPLICATION variant, so it authorized reads of badges that cannot exist. Callers\n * now refuse an unsupported scope before they get here.\n */\n private verifyBadgeScopeAccess(\n auth: SocketAuthResult,\n scope: NotificationScope,\n scopeId: string\n ): boolean {\n // Public users cannot access badges\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n return false;\n }\n\n switch (scope) {\n case ResourcePrimaryScope.USER_SELF:\n // User can only access their own badges\n return auth.initiatorIds?.userId === scopeId;\n\n case ResourcePrimaryScope.ORGANIZATIONS:\n // User must be member of the organization\n return auth.initiatorRoles.some(\n r => r.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS &&\n r.relatedResourceId === scopeId\n );\n\n default:\n return false;\n }\n }\n\n // =====================================================\n // AUTHORIZATION HELPERS (FACTORIZED with HTTP)\n // =====================================================\n\n /**\n * Verify user has READ access to a specific resource\n *\n * REUSES: AuthorizationsBackendService.authorizeInController()\n * This is the EXACT same method used by HTTP controllers\n */\n private async verifyResourceAccess(\n socket: Socket,\n auth: SocketAuthResult,\n resourceType: string,\n resourceId: string,\n contextResourceIdentifiers: Record<string, string>\n ): Promise<void> {\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { resourceType, resourceId }, // diagnostic (log-only)\n });\n }\n\n await this.authorizeSocketResourceAgainstDefaultOperation(\n auth,\n resourceType,\n resourceId,\n contextResourceIdentifiers,\n CoreResourceOperation.READ,\n );\n }\n\n /**\n * Verify user has WRITE access to edit a resource (for editing lock)\n *\n * REUSES: AuthorizationsBackendService.authorizeInController() with UPDATE operation\n */\n private async verifyResourceAccessForEdit(\n socket: Socket,\n auth: SocketAuthResult,\n resourceType: string,\n resourceId: string,\n contextResourceIdentifiers: Record<string, string>\n ): Promise<void> {\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { resourceType, resourceId }, // diagnostic (log-only)\n });\n }\n\n await this.authorizeSocketResourceAgainstDefaultOperation(\n auth,\n resourceType,\n resourceId,\n contextResourceIdentifiers,\n CoreResourceOperation.UPDATE,\n );\n }\n\n /**\n * Verify user has access to a scope (for collection subscriptions)\n *\n * REUSES: Role-based check for organization scope, or AuthorizationsBackendService for parent resources\n */\n private async verifyScopeAccess(\n auth: SocketAuthResult,\n /**\n * The resource whose collection is being subscribed to.\n *\n * Needed because APPLICATION scope authorizes THIS resource rather than the scope — see the\n * branch below. The other scopes do not read it, and that asymmetry is the point.\n */\n resourceType: string,\n scopeKey: string,\n scopeId: string,\n contextResourceIdentifiers: Record<string, string>\n ): Promise<void> {\n if (auth.executionType === ExecutionContext_ExecutionType.PUBLIC_EXECUTION) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { scopeKey, scopeId }, // diagnostic (log-only)\n });\n }\n\n const normalizedScopeKey = scopeKey.trim().toLowerCase();\n\n // For organization scope, just check user has role in that org\n if (normalizedScopeKey === 'org' || normalizedScopeKey === 'organization' || normalizedScopeKey === 'organizationid') {\n const hasOrgAccess = auth.initiatorRoles.some(\n r => r.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS &&\n r.relatedResourceId === scopeId\n );\n if (!hasOrgAccess) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { scopeId, scopeKey }, // diagnostic (log-only)\n });\n }\n return;\n }\n\n /*\n * APPLICATION scope authorizes the SUBSCRIBED resource, never the scope (issue #247).\n *\n * `applicationId` is a single constant per backend, so an `app` room discriminates NOTHING —\n * every authenticated caller is \"in\" it. That is precisely why it cannot be used as an\n * authorization proxy the way the two scopes above are: `org` is checked against the caller's own\n * role entries for that tenant, and a parent scope authorizes a specific parent row. Both stand\n * for \"may you see things under here\"; a constant stands for nothing.\n *\n * The tempting fix is to let this fall through to the parent branch below, since\n * `PRIMARY_SCOPE_TO_CORE_RESOURCE_TYPE` already maps APPLICATION to the `applications` resource\n * and `mapScopeKeyToResourceType` only misses it because it searches for the field identifier\n * `appId` while the real one is `applicationId`. It looks like completing an oversight. It is a\n * disclosure: READ on the `applications` row is granted to ORG_MEMBER (\"Org members can view\n * applications\"), while TEN of the eleven APPLICATION-scoped resource configs require\n * APP_ADMIN_SUPER_ADMIN — SSO connections and config, SIEM export config and DLQ, SCIM\n * provisioning, webhook config, M2M delivery logs, flows/actors task and execution. Routing\n * through the parent would hand every org member notification streams naming rows of all of them.\n *\n * So the rule this branch enforces, and which the two above satisfy only incidentally: **a scope\n * room may never grant more than a READ of what it notifies about.** Here that is asked directly,\n * on ROLES alone, because a scope subscription addresses no row.\n *\n * The PUBLIC guard at the top of this method is defence in depth rather than the primary gate: a\n * public socket joins only the public room and returns before `setupResourceRoomHandlers` ever\n * registers, so it has no `resource:subscribe` listener at all. This method is still reachable for\n * a public principal through the tracked-subscription REPLAY on auth refresh, which is why the\n * guard stays.\n */\n if (normalizedScopeKey === ResourceScopeRoomKey.APPLICATION) {\n const readOperation = this.resolveSocketAuthorizationDefaultOperation(\n resourceType,\n CoreResourceOperation.READ,\n );\n if (!readOperation) {\n throw this.errorBuilder.buildError(ErrorType.NOT_FOUND, undefined, {\n customMessageReference: ErrorCustomMessageReference.RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND,\n context: { resourceType, scopeKey, operation: CoreResourceOperation.READ },\n });\n }\n const applicationScopeContext = await this.executionContextCreator.buildContextFromSocketAuth(\n auth,\n readOperation,\n contextResourceIdentifiers,\n );\n await this.authorizationsService.authorizeOperationRolesOnly(readOperation, applicationScopeContext);\n this.logDebug('Socket application-scope authorization succeeded', { resourceType, scopeId });\n return;\n }\n\n // For other scopes (e.g., todolist), verify READ access to the parent resource\n const parentResourceType = this.mapScopeKeyToResourceType(scopeKey);\n if (!parentResourceType) {\n throw this.errorBuilder.buildError(ErrorType.AUTHORIZATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.AUTHORIZATIONS_ACCESS_DENIED,\n context: { scopeId, scopeKey }, // diagnostic (log-only)\n });\n }\n\n const scopeResourceId = contextResourceIdentifiers[`${scopeKey}Id`]\n || contextResourceIdentifiers[`${normalizedScopeKey}Id`]\n || contextResourceIdentifiers[scopeKey]\n || contextResourceIdentifiers[normalizedScopeKey]\n || scopeId;\n await this.authorizeSocketResourceAgainstDefaultOperation(\n auth,\n parentResourceType,\n scopeResourceId,\n contextResourceIdentifiers,\n CoreResourceOperation.READ,\n { scopeKey },\n );\n }\n\n /**\n * Resolve the unique default URL-bearing operation that gates socket-room\n * subscription/edit-lock authorization for a given core operation.\n *\n * **Scope.** This helper governs websocket-only authorization — socket-room\n * subscription, edit-lock acquisition, scope-collection subscription. It is\n * NOT called from HTTP request handling; HTTP controllers authorize against\n * the *specific* variant the URL targets (after `dataMode` resolution),\n * because HTTP requests bind to a single operation. Websocket subscriptions\n * are a *broad listening contract* — they cannot bind to one variant — so\n * the canonical default URL-bearing operation is the only honest gate.\n *\n * **Invariant — exactly one default URL-bearing non-bulk operation.** Returns\n * the single matching operation, or `null` when the resource registers no\n * such operation. Throws `CONFIGURATION` when more than one is registered;\n * ambiguity must be authored away, not silently resolved by array order.\n * Mirrors the OPU-19 / OPU-25 unique-default discipline applied across\n * aggregation authorization, repositories registry, and the notifications\n * dispatcher.\n *\n * **Filter rules** — keep only operations that:\n * - have the requested core operation (READ or UPDATE),\n * - are the operation default (`isOperationDefault === true`),\n * - are non-bulk,\n * - are URL-bearing (`API_CALL` or `API_CALL_WITH_CALLBACK`),\n * - declare at least one initiator (`initiatorInfos.length > 0`).\n *\n * Non-default keyed variants, bulk variants, internal/repository-only\n * variants, and operations without initiators are excluded by design — see\n * `.claude/plans/variant-authorization-audit.md` (F-2) and\n * `.claude/plans/resource-operation-variant-union-audit.md` (OPU-19, OPU-25).\n */\n private resolveSocketAuthorizationDefaultOperation(\n resourceType: string,\n coreOperation: CoreResourceOperation.READ | CoreResourceOperation.UPDATE,\n ): ResourceConfiguration_Operation<any, any, any> | null {\n const registry = this.resourcesRegistry.getResourcesRegistry();\n const resourceConfiguration = registry.resourceConfigurations[resourceType];\n\n if (!resourceConfiguration) {\n throw this.errorBuilder.buildError(ErrorType.NOT_FOUND, undefined, {\n customMessageReference: ErrorCustomMessageReference.RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND,\n context: { resourceType, operation: coreOperation },\n });\n }\n\n const candidateOperations = resourceConfiguration.operations.filter((operation) => (\n ResourceOperationsUtils.getCoreResourceOperationFromOperation(operation) === coreOperation\n && operation.isOperationDefault === true\n && !('isBulkOperation' in operation && operation.isBulkOperation === true)\n && (\n operation.variantType === ResourceOperationVariantType.API_CALL\n || operation.variantType === ResourceOperationVariantType.API_CALL_WITH_CALLBACK\n )\n && 'initiatorInfos' in operation\n && Array.isArray(operation.initiatorInfos)\n && operation.initiatorInfos.length > 0\n ));\n\n // Prefer the canonical core operation over custom ops that merely alias it via\n // `resourceOperationLike`. A socket subscription binds to the resource's\n // canonical READ/UPDATE; a READ-like custom op (e.g. an `export_*` operation\n // that declares `resourceOperationLike: READ` and is itself `isOperationDefault`)\n // is NOT the subscription gate and must not render the default ambiguous. When\n // the literal core operation is present among the candidates it wins; otherwise\n // we keep the full set — a resource that exposes the core op only via an alias\n // stays resolvable, and a genuinely ambiguous alias-only config still fails\n // closed below. (Root cause of `userSelfPreferences` READ throwing with two\n // api_call candidates: core `read` + a since-removed `export_preferences`\n // aliased to READ. That operation was deleted on 2026-08-01 as a routed no-op,\n // so this specific collision can no longer occur — but the guard is general and\n // stays: any custom op aliasing a core verb while `isOperationDefault` recreates it.)\n const canonicalCandidates = candidateOperations.filter(\n (operation) => operation.operationIdentifier === coreOperation,\n );\n const effectiveCandidates = canonicalCandidates.length > 0 ? canonicalCandidates : candidateOperations;\n\n if (effectiveCandidates.length > 1) {\n // DEBUG (2026-06-19): enriched candidate descriptor to diagnose the\n // `userSelfPreferences` READ two-candidate throw. The prior descriptor only\n // logged `{ variantType, variantKey }`, which rendered both candidates as an\n // identical `{ variantType: 'api_call' }` and hid the real cause: a custom op\n // (the since-removed `export_preferences`) that aliases READ via `resourceOperationLike`\n // and is independently `isOperationDefault`, so it co-qualifies with the\n // canonical core READ. Surfacing operationIdentifier + resourceOperationLike\n // names the ambiguity directly in the 500 context.\n const candidateVariants = effectiveCandidates.map((operation) => ({\n operationIdentifier: operation.operationIdentifier,\n resourceOperationLike: 'resourceOperationLike' in operation ? operation.resourceOperationLike : undefined,\n variantType: operation.variantType,\n variantKey: operation.variantKey,\n isOperationDefault: operation.isOperationDefault,\n isBulkOperation: 'isBulkOperation' in operation ? operation.isBulkOperation : undefined,\n initiatorCount: 'initiatorInfos' in operation && Array.isArray(operation.initiatorInfos)\n ? operation.initiatorInfos.length\n : undefined,\n }));\n this.logDebug('Ambiguous socket authorization operation candidates', {\n resourceType,\n coreOperation,\n candidateVariants,\n });\n throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND,\n context: {\n resourceType,\n operation: coreOperation,\n candidateVariants,\n message: 'Socket authorization requires exactly one default non-bulk URL-bearing operation candidate.',\n },\n });\n }\n\n return effectiveCandidates[0] ?? null;\n }\n\n /**\n * Authorize a websocket caller against the resource's canonical default\n * URL-bearing operation.\n *\n * Resolves the unique default operation via\n * `resolveSocketAuthorizationDefaultOperation` (which fails closed on\n * multi-default), then runs the standard `authorizeInController` check. The\n * helper does **not** iterate variants — non-default keyed variants are\n * structurally excluded by the resolver because their `initiatorInfos` may\n * carry stricter or laxer role guards than the canonical default, and a\n * socket subscription cannot bind to a single variant.\n *\n * Errors propagate verbatim:\n * - `AUTHORIZATION` from the canonical default → re-thrown unchanged so\n * the caller can react to denial.\n * - `NOT_FOUND` if the resource has no canonical default operation.\n * - `CONFIGURATION` if the resource registers more than one default.\n * - any other error (transport, registry) propagates unchanged.\n *\n * See `.claude/plans/variant-authorization-audit.md` (F-2) and\n * `.claude/plans/resource-operation-variant-union-audit.md` (OPU-19, OPU-25,\n * OPU-36).\n */\n private async authorizeSocketResourceAgainstDefaultOperation(\n auth: SocketAuthResult,\n resourceType: string,\n resourceId: string,\n contextResourceIdentifiers: Record<string, string>,\n coreOperation: CoreResourceOperation.READ | CoreResourceOperation.UPDATE,\n extraContext?: Record<string, unknown>,\n ): Promise<void> {\n const operation = this.resolveSocketAuthorizationDefaultOperation(resourceType, coreOperation);\n if (!operation) {\n throw this.errorBuilder.buildError(ErrorType.NOT_FOUND, undefined, {\n customMessageReference: ErrorCustomMessageReference.RESOURCES_REGISTRY_OPERATION_PATH_NOT_FOUND,\n context: { resourceType, operation: coreOperation, ...extraContext },\n });\n }\n\n const executionContext = await this.executionContextCreator.buildContextFromSocketAuth(\n auth,\n operation,\n contextResourceIdentifiers,\n );\n\n await this.authorizationsService.authorizeInController(resourceId, executionContext);\n\n this.logDebug('Socket authorization succeeded', {\n resourceType,\n resourceId,\n coreOperation,\n variantKey: operation.variantKey,\n isOperationDefault: operation.isOperationDefault,\n ...extraContext,\n });\n }\n\n /**\n * Map scope key to parent resource type using the resources registry\n *\n * Scope keys follow the pattern: fieldIdentifier without 'Id' suffix\n * E.g., 'todolist' → find resource with fieldIdentifier 'todolistId' → TODOLISTS\n *\n * Uses the registry's resource configurations to dynamically resolve\n * without hardcoded mappings.\n */\n private mapScopeKeyToResourceType(scopeKey: string): string | null {\n // Build the expected field identifier\n const fieldIdentifierVariants = [\n `${scopeKey}Id`, // todolist → todolistId\n `${scopeKey.toLowerCase()}Id`, // TodoList → todolistid (case insensitive)\n ];\n\n // Search through all resource configurations\n const registry = this.resourcesRegistry.getResourcesRegistry();\n const resourceTypes = Object.keys(registry.resourceConfigurations);\n\n for (const resourceType of resourceTypes) {\n const config = registry.resourceConfigurations[resourceType];\n const configFieldId = config.resourceFieldIdentifier?.toLowerCase();\n\n for (const variant of fieldIdentifierVariants) {\n if (configFieldId === variant.toLowerCase()) {\n return resourceType;\n }\n }\n }\n\n // Also check if scopeKey is itself a resource type (direct match)\n if (registry.resourceConfigurations[scopeKey]) {\n return scopeKey;\n }\n\n // Check for case-insensitive resource type match\n const lowerScopeKey = scopeKey.toLowerCase();\n for (const resourceType of resourceTypes) {\n if (resourceType.toLowerCase() === lowerScopeKey) {\n return resourceType;\n }\n }\n\n this.logDebug('Could not map scope key to resource type', { scopeKey });\n return null;\n }\n\n // =====================================================\n // EDITING STATE TRACKING (Redis-backed for multi-pod)\n // =====================================================\n\n /**\n * Track editing state in Redis for cross-pod synchronization\n */\n private async trackEditingState(\n resourceType: string,\n resourceId: string,\n userId: string,\n action: 'start' | 'end'\n ): Promise<void> {\n const prefix = this.redisService.getAppPrefix();\n const key = `${prefix}editing:${resourceType}:${resourceId}`;\n const redisClient = this.redisService.getReadyClient();\n\n if (!redisClient) {\n // Fallback to in-memory if Redis unavailable\n if (action === 'start') {\n if (!this.resourceEditingState.has(key)) {\n this.resourceEditingState.set(key, new Set());\n }\n this.resourceEditingState.get(key)!.add(userId);\n } else {\n this.resourceEditingState.get(key)?.delete(userId);\n }\n return;\n }\n\n try {\n if (action === 'start') {\n await redisClient.hSet(key, userId, new Date().toISOString());\n await redisClient.expire(key, 3600); // 1 hour TTL (cleanup stale locks)\n } else {\n await redisClient.hDel(key, userId);\n }\n } catch (error) {\n this.logger.warn('Failed to track editing state in Redis', {\n ...projectCaughtErrorLogFields(error),\n resourceType,\n resourceId: resourceId.substring(0, 8)\n });\n }\n }\n\n /**\n * Cleanup editing states when user disconnects\n * Cleans both in-memory state AND Redis for immediate consistency across pods\n *\n * CROSS-POD SUPPORT: Uses Redis SCAN to find all editing keys across all pods\n * where this user is editing, ensuring complete cleanup.\n */\n private async cleanupEditingStatesForUser(userId: string): Promise<void> {\n if (!userId) return;\n\n const redisClient = this.redisService.getReadyClient();\n\n // Cleanup in-memory state on this pod\n for (const [key, users] of this.resourceEditingState.entries()) {\n if (users.has(userId)) {\n users.delete(userId);\n }\n }\n\n // Cross-pod cleanup: SCAN Redis for all editing:* keys where this user is editing\n if (redisClient) {\n try {\n await this.cleanupUserEditingStatesFromRedis(redisClient, userId);\n } catch (error) {\n this.logger.warn('Failed to cleanup Redis editing states on disconnect', {\n userId: userId.substring(0, 8),\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n }\n\n /**\n * SCAN Redis for all editing:* keys and remove the user from each\n * Also broadcasts editing:end to affected resource rooms\n *\n * Key format: {appPrefix}editing:{resourceType}:{resourceId}\n * Example: \"wildo-ai-app_local:editing:users:user456\"\n */\n private async cleanupUserEditingStatesFromRedis(\n redisClient: ReturnType<typeof this.redisService.getClient>,\n userId: string\n ): Promise<void> {\n if (!redisClient) return;\n\n let cursor: string = '0';\n const cleanedResources: Array<{ resourceType: string; resourceId: string }> = [];\n const prefix = this.redisService.getAppPrefix();\n\n // SCAN for all editing:* keys scoped to this application\n do {\n const result = await redisClient.scan(cursor, {\n MATCH: `${prefix}editing:*`,\n COUNT: 100, // Process in batches\n });\n\n cursor = result.cursor;\n const keys = result.keys;\n\n // Check each key for this user and remove if present\n for (const key of keys) {\n try {\n // Check if user is in this hash\n const exists = await redisClient.hExists(key, userId);\n if (exists) {\n // Remove user from this editing state\n await redisClient.hDel(key, userId);\n\n // Parse key to get resource info\n // Key format: {prefix}editing:{resourceType}:{resourceId}\n // Remove prefix first, then parse\n const keyWithoutPrefix = prefix && key.startsWith(prefix)\n ? key.slice(prefix.length)\n : key;\n const parts = keyWithoutPrefix.split(':');\n\n // parts[0] = \"editing\", parts[1] = resourceType, parts[2] = resourceId\n if (parts.length >= 3 && parts[0] === 'editing') {\n cleanedResources.push({\n resourceType: parts[1],\n resourceId: parts[2],\n });\n }\n }\n } catch (error) {\n this.logger.warn('Failed to check/delete editing state for key', {\n key,\n userId: userId.substring(0, 8),\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n } while (cursor !== '0');\n\n // Broadcast editing:end to all affected resource rooms\n for (const resource of cleanedResources) {\n const roomName = buildResourceRoomName(resource.resourceType, resource.resourceId);\n this.io?.to(roomName).emit(CoreWebSocketEvent.RESOURCE_EDITING_END, {\n resourceType: resource.resourceType,\n resourceId: resource.resourceId,\n initiatorUserId: userId,\n reason: 'disconnect',\n timestamp: new Date(),\n });\n }\n\n if (cleanedResources.length > 0) {\n this.logDebug('Cleaned up editing states for disconnected user', {\n userId: userId.substring(0, 8),\n cleanedCount: cleanedResources.length,\n });\n }\n }\n\n // =====================================================\n // DISCONNECTION HANDLING\n // =====================================================\n\n /**\n * Handle socket disconnection - cleanup state and notify rooms\n */\n private handleSocketDisconnection(socketId: string, auth: SocketAuthResult): void {\n // Remove from authenticated sockets\n this.authenticatedSockets.delete(socketId);\n this.resourceSubscriptionsBySocket.delete(socketId);\n\n const userId = auth.initiatorIds?.userId;\n\n if (userId) {\n // Remove from user sockets tracking\n const userSocketIds = this.userSockets.get(userId);\n if (userSocketIds) {\n userSocketIds.delete(socketId);\n if (userSocketIds.size === 0) {\n this.userSockets.delete(userId);\n\n // User completely disconnected - cleanup editing states\n this.cleanupEditingStatesForUser(userId);\n }\n }\n }\n\n // Remove from organization sockets\n for (const roleInfo of auth.initiatorRoles) {\n if (roleInfo.relatedPrimaryScope === ResourcePrimaryScope.ORGANIZATIONS && roleInfo.relatedResourceId) {\n const orgSocketIds = this.organizationSockets.get(roleInfo.relatedResourceId);\n if (orgSocketIds) {\n orgSocketIds.delete(socketId);\n if (orgSocketIds.size === 0) {\n this.organizationSockets.delete(roleInfo.relatedResourceId);\n }\n }\n }\n }\n\n this.logDebug('Socket disconnected', {\n socketId,\n userId: userId?.substring(0, 8),\n remainingConnections: this.authenticatedSockets.size\n });\n }\n\n // =====================================================\n // CLEANUP\n // =====================================================\n\n /**\n * Cleanup resources\n */\n /**\n * Start the periodic idle-socket sweep. `.unref()` so this timer never keeps the process alive on its\n * own. Idempotent — a second call while a sweep is armed is a no-op.\n */\n private startIdleSocketSweep(): void {\n if (this.idleSweepInterval) return;\n this.idleSweepInterval = setInterval(() => this.sweepIdleSockets(), WEBSOCKET_IDLE_SWEEP_INTERVAL_MS);\n this.idleSweepInterval.unref?.();\n }\n\n /**\n * Force-disconnect every connection idle beyond {@link WEBSOCKET_IDLE_TIMEOUT_MS}. `disconnect(true)`\n * closes the underlying transport (not just the Socket.IO layer), and the socket's existing\n * `disconnect` handler runs the room/presence/editing-state cleanup. `lastActivityAt` is stamped at\n * connect and bumped by the `onAny` listener in the connection handler.\n */\n private sweepIdleSockets(): void {\n if (!this.io) return;\n const now = Date.now();\n for (const socket of this.io.sockets.sockets.values()) {\n const lastActivityAt = (socket as SocketWithActivity).lastActivityAt;\n if (lastActivityAt !== undefined && now - lastActivityAt > WEBSOCKET_IDLE_TIMEOUT_MS) {\n this.logDebug('Reaping idle WebSocket connection', { socketId: socket.id, idleMs: now - lastActivityAt });\n socket.disconnect(true);\n }\n }\n }\n\n public async cleanup(): Promise<void> {\n try {\n if (this.idleSweepInterval) {\n clearInterval(this.idleSweepInterval);\n this.idleSweepInterval = null;\n }\n if (this.io) {\n this.io.close();\n this.io = null;\n }\n\n this.authenticatedSockets.clear();\n this.userSockets.clear();\n this.organizationSockets.clear();\n this.rooms.clear();\n this.resourceEditingState.clear();\n this.resourceSubscriptionsBySocket.clear();\n\n this.logDebug('WebSocket service cleanup completed');\n\n } catch (error: unknown) {\n this.logger.error('Error during WebSocket cleanup', { ...projectCaughtErrorLogFields(error) });\n }\n }\n}\n"]}
|