@wildo-ai/saas-backend-lib 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (853) hide show
  1. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.d.ts.map +1 -1
  2. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js +19 -1
  3. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js.map +1 -1
  4. package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
  5. package/dist/esm/base-classes/models/manual-controllers.backend.definition.js +4 -0
  6. package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
  7. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts +35 -0
  8. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts.map +1 -0
  9. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js +111 -0
  10. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js.map +1 -0
  11. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts +50 -0
  12. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts.map +1 -0
  13. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js +199 -0
  14. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js.map +1 -0
  15. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts +111 -0
  16. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts.map +1 -1
  17. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js +140 -0
  18. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js.map +1 -1
  19. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
  20. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +27 -6
  21. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
  22. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts +124 -13
  23. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
  24. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +207 -21
  25. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
  26. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts +60 -8
  27. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
  28. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +174 -26
  29. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
  30. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +47 -4
  31. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
  32. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +96 -29
  33. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
  34. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
  35. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
  36. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
  37. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
  38. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts +89 -14
  39. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
  40. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js +84 -11
  41. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
  42. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
  43. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +9 -1
  44. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
  45. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +49 -0
  46. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
  47. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +171 -18
  48. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
  49. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
  50. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +23 -3
  51. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
  52. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
  53. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +20 -0
  54. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
  55. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts +22 -0
  56. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
  57. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
  58. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
  59. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +4 -1
  60. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
  61. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts +11 -0
  62. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
  63. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js +39 -5
  64. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
  65. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +181 -2
  66. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
  67. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +529 -41
  68. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
  69. package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts +36 -3
  70. package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
  71. package/dist/esm/base-classes/services/services/system-access.backend.service.js +70 -8
  72. package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
  73. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts +28 -0
  74. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -0
  75. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js +90 -0
  76. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -0
  77. package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts +44 -0
  78. package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -0
  79. package/dist/esm/billing/batches/usage-flush.batch.backend.service.js +99 -0
  80. package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -0
  81. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts +91 -0
  82. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -0
  83. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js +152 -0
  84. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -0
  85. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +186 -0
  86. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -0
  87. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +474 -0
  88. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
  89. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts +100 -0
  90. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
  91. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js +209 -6
  92. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
  93. package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts +200 -4
  94. package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
  95. package/dist/esm/billing/services/back-office/usage-metering.backend.service.js +593 -64
  96. package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
  97. package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts +36 -0
  98. package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -0
  99. package/dist/esm/billing/services/billing-adapter-registry.backend.js +83 -0
  100. package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -0
  101. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts +9 -0
  102. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
  103. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js +11 -1
  104. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
  105. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
  106. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +48 -7
  107. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
  108. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +38 -1
  109. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
  110. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +67 -2
  111. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
  112. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts +30 -1
  113. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
  114. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js +43 -1
  115. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
  116. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts +11 -3
  117. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
  118. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js +30 -16
  119. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
  120. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
  121. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js +104 -25
  122. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
  123. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +18 -1
  124. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
  125. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +106 -2
  126. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
  127. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts +52 -0
  128. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -0
  129. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js +74 -0
  130. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -0
  131. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts +104 -11
  132. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
  133. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +260 -26
  134. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
  135. package/dist/esm/billing/testing/mock-billing-provider.d.ts +30 -1
  136. package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
  137. package/dist/esm/billing/testing/mock-billing-provider.js +25 -0
  138. package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
  139. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js +11 -4
  140. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
  141. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +225 -13
  142. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
  143. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +340 -62
  144. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
  145. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +244 -7
  146. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
  147. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +386 -5
  148. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
  149. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
  150. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
  151. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
  152. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +6 -2
  153. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -1
  154. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +31 -9
  155. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -1
  156. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
  157. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
  158. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +57 -1
  159. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
  160. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
  161. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
  162. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
  163. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
  164. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
  165. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +31 -0
  166. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
  167. package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts +5 -0
  168. package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
  169. package/dist/esm/config/bootstrap/application-runtime-profile.backend.js +6 -0
  170. package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
  171. package/dist/esm/config/models/app-config.backend.schemas.d.ts +142 -46
  172. package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
  173. package/dist/esm/config/models/app-config.backend.schemas.js +121 -12
  174. package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
  175. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts +38 -15
  176. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
  177. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js +17 -2
  178. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
  179. package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts +0 -1
  180. package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
  181. package/dist/esm/config/services/app-configuration-loader.backend.service.js +68 -76
  182. package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
  183. package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
  184. package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
  185. package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
  186. package/dist/esm/config/services/app-configuration.backend.utils.d.ts +33 -0
  187. package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
  188. package/dist/esm/config/services/app-configuration.backend.utils.js +39 -1
  189. package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
  190. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +25 -0
  191. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
  192. package/dist/esm/config/services/application-startup-config-validator.backend.service.js +41 -1
  193. package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
  194. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
  195. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js +48 -0
  196. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
  197. package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
  198. package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
  199. package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
  200. package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
  201. package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
  202. package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
  203. package/dist/esm/errors/services/error-handler.backend.service.js +129 -8
  204. package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
  205. package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
  206. package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
  207. package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
  208. package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
  209. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
  210. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
  211. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
  212. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
  213. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
  214. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
  215. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
  216. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
  217. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +59 -2
  218. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
  219. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +52 -17
  220. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
  221. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts +4 -2
  222. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
  223. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
  224. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +256 -0
  225. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -0
  226. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +333 -0
  227. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -0
  228. package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts +56 -0
  229. package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -0
  230. package/dist/esm/external-providers/operations/provider-operation-request.backend.js +211 -0
  231. package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -0
  232. package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts +45 -0
  233. package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -0
  234. package/dist/esm/external-providers/operations/provider-request-signing.backend.js +216 -0
  235. package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -0
  236. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts +56 -0
  237. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -0
  238. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js +78 -0
  239. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -0
  240. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts +1 -1
  241. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
  242. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js +2 -2
  243. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
  244. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts +89 -0
  245. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -0
  246. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js +164 -0
  247. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -0
  248. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts +26 -27
  249. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
  250. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js +50 -64
  251. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
  252. package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
  253. package/dist/esm/external-providers/services/document-extraction.backend.service.js +3 -3
  254. package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
  255. package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
  256. package/dist/esm/external-providers/services/embeddings.backend.service.js +4 -4
  257. package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
  258. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +292 -7
  259. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
  260. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +533 -45
  261. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
  262. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
  263. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +25 -2
  264. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
  265. package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
  266. package/dist/esm/files/controllers/file.controller.js +21 -13
  267. package/dist/esm/files/controllers/file.controller.js.map +1 -1
  268. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
  269. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +39 -15
  270. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
  271. package/dist/esm/files/services/file-scanning.backend.service.d.ts +94 -9
  272. package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
  273. package/dist/esm/files/services/file-scanning.backend.service.js +197 -17
  274. package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
  275. package/dist/esm/files/services/file-text-extraction.backend.service.d.ts +60 -1
  276. package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
  277. package/dist/esm/files/services/file-text-extraction.backend.service.js +167 -8
  278. package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
  279. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +53 -2
  280. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -1
  281. package/dist/esm/files/services/file-upload-grant.backend.service.js +127 -3
  282. package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -1
  283. package/dist/esm/files/services/files.backend.service.d.ts +68 -0
  284. package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
  285. package/dist/esm/files/services/files.backend.service.js +175 -5
  286. package/dist/esm/files/services/files.backend.service.js.map +1 -1
  287. package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts +109 -0
  288. package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -0
  289. package/dist/esm/files/storage/application-storage-key.backend.utils.js +123 -0
  290. package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -0
  291. package/dist/esm/files/storage/file-storage-provider.types.d.ts +16 -10
  292. package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
  293. package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
  294. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts +67 -8
  295. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
  296. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js +101 -28
  297. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
  298. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
  299. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js +8 -55
  300. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
  301. package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
  302. package/dist/esm/files/utils/file-field-schema-path.backend.utils.js +20 -0
  303. package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
  304. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts +86 -0
  305. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -0
  306. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js +288 -0
  307. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -0
  308. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts +15 -0
  309. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
  310. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js +76 -5
  311. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
  312. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
  313. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js +6 -1
  314. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
  315. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts +60 -0
  316. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
  317. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js +63 -0
  318. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
  319. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
  320. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
  321. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +196 -40
  322. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
  323. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
  324. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
  325. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
  326. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
  327. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
  328. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
  329. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
  330. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
  331. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
  332. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
  333. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
  334. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts +0 -13
  335. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
  336. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js +14 -22
  337. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
  338. package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts +8 -3
  339. package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
  340. package/dist/esm/flows-actors/models/core-facets.backend.definitions.js +25 -15
  341. package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
  342. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts +13 -1
  343. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
  344. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
  345. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +88 -8
  346. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
  347. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +333 -31
  348. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
  349. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
  350. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js +4 -2
  351. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
  352. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts +113 -0
  353. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -0
  354. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js +62 -0
  355. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -0
  356. package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
  357. package/dist/esm/flows-actors/services/actors-system.backend.service.js +0 -2
  358. package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
  359. package/dist/esm/flows-actors/services/agents.backend.service.d.ts +28 -1
  360. package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
  361. package/dist/esm/flows-actors/services/agents.backend.service.js +204 -18
  362. package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
  363. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +5 -1
  364. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
  365. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +79 -16
  366. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
  367. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +34 -5
  368. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
  369. package/dist/esm/flows-actors/services/flows-actors-registry.service.js +154 -20
  370. package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
  371. package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
  372. package/dist/esm/flows-actors/services/flows.backend.services.js +27 -23
  373. package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
  374. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
  375. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js +7 -1
  376. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
  377. package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts +90 -0
  378. package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -0
  379. package/dist/esm/flows-actors/services/mcp-client.backend.service.js +368 -0
  380. package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
  381. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
  382. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
  383. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
  384. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
  385. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
  386. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +8 -4
  387. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
  388. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts +0 -207
  389. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
  390. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js +8 -243
  391. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
  392. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
  393. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
  394. package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts +9 -14
  395. package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
  396. package/dist/esm/guidance/services/milestone-evaluator.backend.service.js +18 -89
  397. package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
  398. package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts +86 -0
  399. package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -0
  400. package/dist/esm/guidance/services/progression-state-store.backend.service.js +155 -0
  401. package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -0
  402. package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts +10 -0
  403. package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
  404. package/dist/esm/i18n/controllers/i18n-controller.backend.service.js +55 -5
  405. package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
  406. package/dist/esm/index.d.ts +11 -4
  407. package/dist/esm/index.d.ts.map +1 -1
  408. package/dist/esm/index.js +31 -4
  409. package/dist/esm/index.js.map +1 -1
  410. package/dist/esm/inject/models/container.d.ts.map +1 -1
  411. package/dist/esm/inject/models/container.js +78 -10
  412. package/dist/esm/inject/models/container.js.map +1 -1
  413. package/dist/esm/inject/models/service-types.d.ts +17 -3
  414. package/dist/esm/inject/models/service-types.d.ts.map +1 -1
  415. package/dist/esm/inject/models/service-types.js +19 -3
  416. package/dist/esm/inject/models/service-types.js.map +1 -1
  417. package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
  418. package/dist/esm/mcp/controllers/mcp.controller.js +20 -0
  419. package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
  420. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +56 -1
  421. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
  422. package/dist/esm/mcp/services/mcp-server.backend.service.js +107 -11
  423. package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
  424. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
  425. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +22 -0
  426. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
  427. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
  428. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js +49 -4
  429. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
  430. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts +66 -0
  431. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -0
  432. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js +199 -0
  433. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -0
  434. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts +149 -13
  435. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
  436. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js +411 -19
  437. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
  438. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts +11 -2
  439. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
  440. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
  441. package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts +28 -9
  442. package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
  443. package/dist/esm/monitoring/logger/models/logger.backend.schemas.js +30 -10
  444. package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
  445. package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
  446. package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
  447. package/dist/esm/monitoring/logger/services/logger.service.js +52 -11
  448. package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
  449. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts +62 -0
  450. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -0
  451. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js +78 -0
  452. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -0
  453. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +309 -0
  454. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -0
  455. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +385 -0
  456. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -0
  457. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +1 -0
  458. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
  459. package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
  460. package/dist/esm/monitoring/observability/services/metrics.service.d.ts +21 -0
  461. package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
  462. package/dist/esm/monitoring/observability/services/metrics.service.js +38 -0
  463. package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
  464. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -80
  465. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -1
  466. package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -25
  467. package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -1
  468. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -49
  469. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -1
  470. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -141
  471. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -1
  472. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -37
  473. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -1
  474. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -121
  475. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -1
  476. package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts +66 -1
  477. package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
  478. package/dist/esm/notifications/email/services/email-template-registry.backend.service.js +105 -10
  479. package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
  480. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -58
  481. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -1
  482. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -223
  483. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -1
  484. package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
  485. package/dist/esm/notifications/email/services/email-template-validator.backend.service.js +10 -1
  486. package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
  487. package/dist/esm/notifications/email/services/email.backend.service.d.ts +60 -4
  488. package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
  489. package/dist/esm/notifications/email/services/email.backend.service.js +145 -43
  490. package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
  491. package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts +0 -1
  492. package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
  493. package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
  494. package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
  495. package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
  496. package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
  497. package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
  498. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +99 -13
  499. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
  500. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +422 -66
  501. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
  502. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +2 -2
  503. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
  504. package/dist/esm/notifications/sms/services/sms.backend.service.js +5 -5
  505. package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
  506. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
  507. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
  508. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
  509. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
  510. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
  511. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
  512. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +46 -1
  513. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
  514. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
  515. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +16 -6
  516. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
  517. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
  518. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +12 -12
  519. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
  520. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts +16 -0
  521. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
  522. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js +18 -0
  523. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
  524. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts +2 -2
  525. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js +2 -2
  526. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
  527. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
  528. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js +63 -2
  529. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
  530. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts +66 -0
  531. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -0
  532. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js +257 -0
  533. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -0
  534. package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts +12 -0
  535. package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -0
  536. package/dist/esm/queue/adapters/queue-adapter.backend.binding.js +47 -0
  537. package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -0
  538. package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts +87 -0
  539. package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -0
  540. package/dist/esm/queue/adapters/queue-adapter.backend.interface.js +1 -0
  541. package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -0
  542. package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts +31 -0
  543. package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -0
  544. package/dist/esm/queue/adapters/queue-adapter.backend.options.js +13 -0
  545. package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -0
  546. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts +19 -25
  547. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
  548. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js +33 -0
  549. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
  550. package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts +2 -2
  551. package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
  552. package/dist/esm/queue/domain-queue-consumer.backend.service.js +1 -4
  553. package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
  554. package/dist/esm/queue/job-consumer.backend.service.d.ts +2 -2
  555. package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
  556. package/dist/esm/queue/job-consumer.backend.service.js +1 -4
  557. package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
  558. package/dist/esm/queue/job-executor.backend.service.d.ts +2 -2
  559. package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
  560. package/dist/esm/queue/job-executor.backend.service.js +1 -4
  561. package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
  562. package/dist/esm/queue/queue-monitoring.backend.service.d.ts +8 -4
  563. package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
  564. package/dist/esm/queue/queue-monitoring.backend.service.js +25 -17
  565. package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
  566. package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts +16 -1
  567. package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
  568. package/dist/esm/queue/queue-worker-initializer.backend.service.js +16 -1
  569. package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
  570. package/dist/esm/queue/queue.backend.service.d.ts +3 -3
  571. package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
  572. package/dist/esm/queue/queue.backend.service.js +26 -4
  573. package/dist/esm/queue/queue.backend.service.js.map +1 -1
  574. package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts +2 -2
  575. package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
  576. package/dist/esm/queue/worker-shutdown-manager.backend.service.js +18 -3
  577. package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
  578. package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts +50 -25
  579. package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
  580. package/dist/esm/rag/utils/rag-chunking.backend.utils.js +147 -39
  581. package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
  582. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts +12 -3
  583. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
  584. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js +12 -3
  585. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
  586. package/dist/esm/requests/service/websocket.service.d.ts +9 -0
  587. package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
  588. package/dist/esm/requests/service/websocket.service.js +32 -8
  589. package/dist/esm/requests/service/websocket.service.js.map +1 -1
  590. package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
  591. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +14 -2
  592. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
  593. package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
  594. package/dist/esm/resources/models/resources-operations.backend.definitions.js +2 -0
  595. package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
  596. package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
  597. package/dist/esm/resources/models/resources-relationships.backend.definitions.js +14 -0
  598. package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
  599. package/dist/esm/resources/models/resources-types.backend.schemas.d.ts +2 -1
  600. package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
  601. package/dist/esm/resources/models/resources-types.backend.schemas.js +8 -0
  602. package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
  603. package/dist/esm/resources/services/resources-registry.backend.service.d.ts +60 -5
  604. package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
  605. package/dist/esm/resources/services/resources-registry.backend.service.js +90 -6
  606. package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
  607. package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts +36 -3
  608. package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
  609. package/dist/esm/runtime/controllers/health-controller.backend.service.js +32 -10
  610. package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
  611. package/dist/esm/runtime/domain-module.backend.definitions.d.ts +24 -0
  612. package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
  613. package/dist/esm/runtime/domain-module.backend.definitions.js +24 -0
  614. package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
  615. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts +51 -0
  616. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
  617. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
  618. package/dist/esm/runtime/services/http-server.backend.service.d.ts +26 -0
  619. package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
  620. package/dist/esm/runtime/services/http-server.backend.service.js +181 -1
  621. package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
  622. package/dist/esm/runtime/services/start-application.backend.service.d.ts +19 -1
  623. package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
  624. package/dist/esm/runtime/services/start-application.backend.service.js +261 -77
  625. package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
  626. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts +15 -0
  627. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
  628. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js +28 -0
  629. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
  630. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts +5 -1
  631. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
  632. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js +24 -4
  633. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
  634. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
  635. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +29 -4
  636. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
  637. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts +114 -0
  638. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
  639. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js +354 -3
  640. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
  641. package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts +1 -0
  642. package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
  643. package/dist/esm/security/authentications/models/cimd.backend.schemas.js +22 -0
  644. package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
  645. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
  646. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
  647. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
  648. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts +0 -2
  649. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
  650. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js +23 -14
  651. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
  652. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts +0 -1
  653. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
  654. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js +15 -12
  655. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
  656. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts +113 -3
  657. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
  658. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js +207 -30
  659. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
  660. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts +95 -2
  661. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
  662. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js +153 -9
  663. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
  664. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +190 -0
  665. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
  666. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +377 -53
  667. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
  668. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
  669. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +68 -1
  670. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
  671. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts +41 -0
  672. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
  673. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js +202 -23
  674. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
  675. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
  676. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +42 -1
  677. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
  678. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
  679. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +34 -4
  680. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
  681. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts +29 -5
  682. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
  683. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js +77 -5
  684. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
  685. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +17 -1
  686. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
  687. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +49 -17
  688. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
  689. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
  690. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
  691. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
  692. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
  693. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
  694. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
  695. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
  696. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
  697. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
  698. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
  699. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
  700. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts +28 -0
  701. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -0
  702. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +283 -0
  703. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -0
  704. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts +4 -3
  705. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
  706. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js +4 -3
  707. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
  708. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts +35 -0
  709. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
  710. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js +111 -21
  711. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
  712. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts +14 -1
  713. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
  714. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js +49 -8
  715. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
  716. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
  717. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js +4 -0
  718. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
  719. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
  720. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js +6 -0
  721. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
  722. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts +37 -1
  723. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
  724. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js +51 -0
  725. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
  726. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts +41 -0
  727. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
  728. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js +45 -0
  729. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
  730. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts +116 -0
  731. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -0
  732. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js +162 -0
  733. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -0
  734. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts +20 -20
  735. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
  736. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js +27 -28
  737. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
  738. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
  739. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +77 -3
  740. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
  741. package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
  742. package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
  743. package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
  744. package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
  745. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +93 -0
  746. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -0
  747. package/dist/esm/security/authorizations/role-conferral.backend.utils.js +95 -0
  748. package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -0
  749. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +124 -1
  750. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
  751. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +142 -5
  752. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
  753. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +74 -8
  754. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
  755. package/dist/esm/security/authorizations/services/authorizations.backend.service.js +175 -19
  756. package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
  757. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +6 -14
  758. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
  759. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +13 -22
  760. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
  761. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts +60 -0
  762. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -0
  763. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js +79 -0
  764. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -0
  765. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +161 -0
  766. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -0
  767. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +512 -0
  768. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -0
  769. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +59 -0
  770. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -0
  771. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js +22 -0
  772. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -0
  773. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts +44 -0
  774. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -0
  775. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js +20 -0
  776. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -0
  777. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +191 -0
  778. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -0
  779. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +385 -0
  780. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -0
  781. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts +41 -0
  782. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
  783. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js +358 -0
  784. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -0
  785. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts +160 -0
  786. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -0
  787. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +266 -0
  788. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -0
  789. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +111 -0
  790. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -0
  791. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +107 -0
  792. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -0
  793. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts +54 -0
  794. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -0
  795. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +153 -0
  796. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -0
  797. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +195 -0
  798. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -0
  799. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +387 -0
  800. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -0
  801. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts +45 -0
  802. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
  803. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js +291 -0
  804. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -0
  805. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +62 -0
  806. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -0
  807. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js +29 -0
  808. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -0
  809. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts +127 -0
  810. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -0
  811. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js +277 -0
  812. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -0
  813. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts +66 -0
  814. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -0
  815. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js +75 -0
  816. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -0
  817. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +21 -3
  818. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
  819. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +26 -16
  820. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
  821. package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
  822. package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
  823. package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
  824. package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
  825. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts +26 -0
  826. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
  827. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js +43 -0
  828. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
  829. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +8 -1
  830. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
  831. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +49 -0
  832. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
  833. package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
  834. package/dist/esm/security/scim/controllers/scim.backend.controller.js +17 -5
  835. package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
  836. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts +67 -29
  837. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
  838. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js +47 -25
  839. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
  840. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts +10 -2
  841. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
  842. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js +10 -2
  843. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
  844. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts +143 -0
  845. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -0
  846. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js +258 -0
  847. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -0
  848. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts +39 -0
  849. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -0
  850. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js +159 -0
  851. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -0
  852. package/dist/tsconfig.build.tsbuildinfo +1 -1
  853. package/package.json +11 -9
@@ -1 +1 @@
1
- {"version":3,"file":"auth-user-lookup.backend.service.js","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/utils/auth-user-lookup.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport { injectable, inject } from 'inversify';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { ServicesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/services/services-registry-handler.backend.service';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { CoreResourceType, UserStatus, resolveAuthConfig, disableDirectoryIncompatibleMethods } from '@wildo-ai/saas-models';\nimport type { User, UserPreferences, UserTypeAuthPolicy, OrgTypeAuthOverrides, AuthMethodsMap } from '@wildo-ai/saas-models';\nimport { isOrgActivelyDirectoryManaged } from '~wildo-backend-lib/organizations/services/scim-provisioning-gate.backend.utils';\nimport { projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { resolveActiveMemberOrgIds } from '~wildo-backend-lib/security/authentications/services/resolve-active-member-orgs.backend.utils';\nimport type { FeatureResolutionBackendService } from '~wildo-backend-lib/features/services/feature-resolution.backend.service';\nimport type { SystemAccessBackendService } from '~wildo-backend-lib/base-classes/services/services/system-access.backend.service';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport type { ServiceOptions } from '~wildo-backend-lib/base-classes/models/repositories.backend.schemas';\nimport {\n resolveAuthPolicyForOrganizationType,\n} from './auth-policy-resolution.backend.utils';\n\n/**\n * User lookup helpers extracted from controller private methods.\n * Provides email-based lookups for Users and effective auth policy resolution\n * with org override merging (W5.8 / AUTH-14).\n */\n@injectable()\nexport class AuthUserLookupBackendService {\n private readonly logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ServicesRegistryHandlerService) private readonly servicesRegistryHandler: ServicesRegistryHandlerBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly appConfigService: AppConfigurationService,\n // AUTH-24: resolve per-org directory-management posture (DIRECTORY_PROVISIONING feature + a live SCIM\n // token) to derive local first-factor credential methods OFF the effective policy for a managed user.\n @inject(SAAS_SERVICE_TYPES.FeatureResolutionService) private readonly featureResolution: FeatureResolutionBackendService,\n @inject(SAAS_SERVICE_TYPES.SystemAccessService) private readonly systemAccessService: SystemAccessBackendService,\n ) {\n this.logDebug = this.logger.debugByType('AuthUserLookup');\n this.logger.setDebugTypeLogging('AuthUserLookup', false);\n }\n\n /**\n * Find a user by email address (ACTIVE only).\n * Returns null if not found — used by password reset which must not leak info.\n */\n async findUserByEmail(ec: ExecutionContext<any>, email: string): Promise<User | null> {\n return this.servicesRegistryHandler.read<User>(CoreResourceType.USERS, ec, { email: email.toLowerCase(), status: UserStatus.ACTIVE });\n }\n\n /**\n * Find a user by email address (any status).\n * Used by registration to check email uniqueness across ALL statuses.\n */\n async findAnyUserByEmail(\n ec: ExecutionContext<any>,\n email: string,\n serviceOptions?: ServiceOptions,\n ): Promise<User | null> {\n return this.servicesRegistryHandler.read<User>(\n CoreResourceType.USERS,\n ec,\n { email: email.toLowerCase() },\n serviceOptions,\n );\n }\n\n /**\n * Look up a user's email for audit/display purposes.\n * Returns empty string if not found.\n */\n async getUserEmail(ec: ExecutionContext<any>, userId: string): Promise<string> {\n const user = await this.servicesRegistryHandler.read<{ _id: string; email: string }>(CoreResourceType.USERS, ec, { _id: userId });\n return user?.email ?? '';\n }\n\n async findUserById(ec: ExecutionContext<any>, userId: string): Promise<User | null> {\n return this.servicesRegistryHandler.read<User>(CoreResourceType.USERS, ec, { _id: userId });\n }\n\n async findUserPreferencesByUserId(ec: ExecutionContext<any>, userId: string): Promise<UserPreferences | null> {\n return this.servicesRegistryHandler.read<UserPreferences>(CoreResourceType.USER_PREFERENCES, ec, { userId });\n }\n\n /**\n * AUTH-14 / W5.8: Resolve effective auth policy with org override merging.\n *\n * 1. Gets the raw UserTypeAuthPolicy from config\n * 2. Fetches user's active org memberships\n * 3. For each org, reads the org to get its type\n * 4. Collects authOverrides from organizationTypes[orgType]\n * 5. Calls resolveAuthConfig to merge (most-restrictive-wins)\n * 6. Returns the full UserTypeAuthPolicy with overridable fields merged\n *\n * Fields affected by org overrides: authMethodsEnabled, mfaPolicy, passwordPolicy.\n * All other fields (sessionDurationMinutes, lockoutPolicy, registration, etc.)\n * come from the raw user-type policy unchanged.\n */\n async resolveEffectiveAuthPolicy(\n // `_ec` is intentionally unused: AUTH-24 moved membership/org/link resolution to the SYSTEM door\n // (see the body), which builds its own context — a login/session EC carries no trusted org scope.\n // Kept in the signature for call-site stability and parity with the other lookups on this service.\n _ec: ExecutionContext<any>,\n userId: string,\n userType: string,\n ): Promise<UserTypeAuthPolicy | null> {\n const rawPolicy = this.appConfigService.getUserTypeAuthPolicy(userType);\n if (!rawPolicy) return null;\n\n try {\n // Resolve the user's ACTIVE org memberships via the SYSTEM door, NOT an ec-scoped read. A login/session\n // is globally org-agnostic and its EC carries NO trusted org scope, so an ec-scoped ORGANIZATION_MEMBERS\n // list surfaces only the user's PRIMARY-org membership and silently MISSES a CROSS-org membership (e.g.\n // one a SCIM push just added) — which would defeat the user-global closure below (a user password-logs-in\n // fine because the resolver never sees the managed org they were just provisioned into). See the incident\n // note in `resolveActiveMemberOrgIds` — the same reason per-org audit routing must read the junction as\n // system. That canonical resolver (`listAsSystem`, self-referential audit suppressed) is reused here.\n const activeOrgIds = await resolveActiveMemberOrgIds(this.systemAccessService, userId);\n\n if (activeOrgIds.length === 0) return rawPolicy;\n\n const organizationTypes = this.appConfigService.config.organizationTypes ?? {};\n const orgOverrides: OrgTypeAuthOverrides[] = [];\n // AUTH-24: also detect whether ANY of the user's ACTIVE orgs is ACTIVELY directory-managed\n // (DIRECTORY_PROVISIONING feature + a live SCIM token). If so, the effective policy must forbid\n // local first-factor credentials (PASSWORD / PASSKEY / MAGIC_LINK / SMS_OTP — see\n // `DIRECTORY_INCOMPATIBLE_LOCAL_AUTH_METHODS`) — they bypass the IdP and would\n // survive deprovisioning. Because this resolves across ALL the user's orgs, ONE managed org disables\n // them GLOBALLY for the user (the user-global closure); keying on CURRENT posture also covers a\n // credential set before the org became managed (the activation window). See\n // `.claude/plans/auth-24-credential-lifecycle.md`.\n let anyDirectoryManaged = false;\n\n for (const organizationId of activeOrgIds) {\n try {\n // System read: the org is one of the user's memberships resolved as system above, and may be a\n // CROSS-org the login EC cannot see — so read it the same way. `ORGANIZATIONS` opts into\n // `systemAccessPolicy.read`; the self-referential auth-policy resolution suppresses its own audit.\n const org = await this.systemAccessService.readAsSystem<{ _id: string; type?: string }>(\n CoreResourceType.ORGANIZATIONS, organizationId, { suppressSystemAudit: true },\n );\n if (org?.type && organizationTypes[org.type]?.authOverrides) {\n orgOverrides.push(organizationTypes[org.type].authOverrides!);\n }\n } catch {\n // Org read failure is non-fatal — skip this org's overrides\n }\n if (!anyDirectoryManaged) {\n try {\n const orgIsManaged = await isOrgActivelyDirectoryManaged({\n organizationId,\n featureResolution: this.featureResolution,\n systemAccessService: this.systemAccessService,\n });\n // PROVISIONED-ONLY (user decision 2026-07-21): the derivation applies only to a user the IdP\n // actually PROVISIONED — evidenced by a USER_IDENTITY_LINKS row for THIS org (written by the SCIM\n // push / SSO-JIT). The owner/admin who joined via local registration/invite has NO link and keeps\n // a break-glass credential. Aligns Part 1 with Part 3 (reconciliation only fires on the SCIM push,\n // which also writes the link). See `.claude/plans/auth-24-credential-lifecycle.md`.\n if (orgIsManaged) {\n const identityLink = await this.systemAccessService.readAsSystem<{ _id: string }>(\n CoreResourceType.USER_IDENTITY_LINKS, { userId, organizationId }, { suppressSystemAudit: true },\n );\n if (identityLink) anyDirectoryManaged = true;\n }\n } catch {\n // Posture / identity-link read failure is non-fatal for THIS org — leave the flag as-is. Login\n // must not hard-fail on a transient read; the invite-accept MUTATION path stays the fail-closed\n // gate for credential CREATION, and reconciliation (AUTH-24 part 3) is the durable backstop.\n }\n }\n }\n\n // No overrides AND not directory-managed → nothing derived; return the raw user-type policy.\n if (orgOverrides.length === 0 && !anyDirectoryManaged) return rawPolicy;\n\n // Base effective config: org-merged (most-restrictive) when overrides exist, else the raw policy.\n let effectiveMethods: AuthMethodsMap;\n let effectiveMfa = rawPolicy.mfaPolicy;\n let effectivePassword = rawPolicy.passwordPolicy;\n if (orgOverrides.length > 0) {\n const authConfig = this.appConfigService.config.auth;\n const resolved = resolveAuthConfig({\n userTypeAuth: rawPolicy,\n orgOverrides,\n orgAuthMethodPolicy: authConfig.orgAuthMethodPolicy,\n expandableOrgMethods: authConfig.expandableOrgMethods,\n });\n effectiveMethods = resolved.authMethodsEnabled;\n effectiveMfa = resolved.mfaPolicy;\n effectivePassword = resolved.passwordPolicy;\n } else {\n effectiveMethods = rawPolicy.authMethodsEnabled as AuthMethodsMap;\n }\n\n // AUTH-24 derivation: posture wins over authored config (same most-restrictive direction as the\n // org-override merge) — force the local first-factor methods OFF for a directory-managed user.\n const authMethodsEnabled = anyDirectoryManaged\n ? disableDirectoryIncompatibleMethods(effectiveMethods)\n : effectiveMethods;\n\n return {\n ...rawPolicy,\n authMethodsEnabled: authMethodsEnabled as UserTypeAuthPolicy['authMethodsEnabled'],\n mfaPolicy: effectiveMfa,\n passwordPolicy: effectivePassword,\n };\n } catch (error) {\n this.logDebug('AUTH-14: Org override resolution failed, falling back to raw user-type policy', {\n userId: userId.substring(0, 8) + '...',\n userType,\n ...projectCaughtErrorLogFields(error),\n });\n return rawPolicy;\n }\n }\n\n /**\n * Org-TYPE-keyed effective auth-policy resolution — PURE (no DB, no EC).\n *\n * For surfaces that must know an organization's available auth methods WITHOUT\n * an authenticated user AND WITHOUT reading the ORGANIZATIONS resource. The\n * canonical caller is the public invitation-accept screen, which runs under an\n * unauthenticated `APP_PUBLIC` pre-auth EC that CANNOT read ORGANIZATIONS (its\n * READ ACL is ORG_MEMBER / super-admin). An earlier org-ID-keyed variant read\n * ORGANIZATIONS internally and fail-closed silently under that EC, dropping the\n * org's auth overrides — so this takes the `orgType` the caller has already\n * resolved via the system-access door and does zero I/O.\n *\n * Resolves the effective policy for a hypothetical member of `userType` in an\n * organization of type `orgType`: `organizationTypes[orgType].authOverrides`\n * merged through the SAME pure `resolveAuthConfig` core (most-restrictive-wins)\n * used by the user-keyed path. Single-org, so no multi-org intersection — but the\n * per-org RESTRICT_ONLY / EXPAND_WITHIN_SET / UNRESTRICTED policy still applies.\n *\n * Fail-open to the raw user-type policy when `orgType` is absent or its type\n * declares no overrides. Returns `null` only when the user type has no policy at\n * all (unknown user type).\n */\n resolveAuthPolicyForOrgType(\n userType: string,\n orgType: string | undefined,\n ): UserTypeAuthPolicy | null {\n return resolveAuthPolicyForOrganizationType(\n this.appConfigService.config,\n userType,\n orgType,\n this.appConfigService.getUserTypeAuthPolicy(userType),\n );\n }\n}\n"]}
1
+ {"version":3,"file":"auth-user-lookup.backend.service.js","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/utils/auth-user-lookup.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport { injectable, inject } from 'inversify';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { ServicesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/services/services-registry-handler.backend.service';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { CoreResourceType, UserStatus, resolveAuthConfig, disableDirectoryIncompatibleMethods } from '@wildo-ai/saas-models';\nimport type { User, UserPreferences, UserTypeAuthPolicy, OrgTypeAuthOverrides, AuthMethodsMap } from '@wildo-ai/saas-models';\nimport { isOrgActivelyDirectoryManaged } from '~wildo-backend-lib/organizations/services/scim-provisioning-gate.backend.utils';\nimport { projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { resolveActiveMemberOrgIds } from '~wildo-backend-lib/security/authentications/services/resolve-active-member-orgs.backend.utils';\nimport type { FeatureResolutionBackendService } from '~wildo-backend-lib/features/services/feature-resolution.backend.service';\nimport type { SystemAccessBackendService } from '~wildo-backend-lib/base-classes/services/services/system-access.backend.service';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport type { ServiceOptions } from '~wildo-backend-lib/base-classes/models/repositories.backend.schemas';\nimport {\n resolveAuthPolicyForOrganizationType,\n} from './auth-policy-resolution.backend.utils';\n\n/**\n * User lookup helpers extracted from controller private methods.\n * Provides email-based lookups for Users and effective auth policy resolution\n * with org override merging (W5.8 / AUTH-14).\n */\n@injectable()\nexport class AuthUserLookupBackendService {\n private readonly logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ServicesRegistryHandlerService) private readonly servicesRegistryHandler: ServicesRegistryHandlerBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly appConfigService: AppConfigurationService,\n // AUTH-24: resolve per-org directory-management posture (DIRECTORY_PROVISIONING feature + a live SCIM\n // token) to derive local first-factor credential methods OFF the effective policy for a managed user.\n @inject(SAAS_SERVICE_TYPES.FeatureResolutionService) private readonly featureResolution: FeatureResolutionBackendService,\n @inject(SAAS_SERVICE_TYPES.SystemAccessService) private readonly systemAccessService: SystemAccessBackendService,\n ) {\n this.logDebug = this.logger.debugByType('AuthUserLookup');\n this.logger.setDebugTypeLogging('AuthUserLookup', false);\n }\n\n /**\n * Find a user by email address (ACTIVE only).\n * Returns null if not found — used by password reset which must not leak info.\n */\n async findUserByEmail(ec: ExecutionContext<any>, email: string): Promise<User | null> {\n return this.servicesRegistryHandler.read<User>(CoreResourceType.USERS, ec, { email: email.toLowerCase(), status: UserStatus.ACTIVE });\n }\n\n /**\n * Find a user by email address (any status).\n * Used by registration to check email uniqueness across ALL statuses.\n */\n async findAnyUserByEmail(\n ec: ExecutionContext<any>,\n email: string,\n serviceOptions?: ServiceOptions,\n ): Promise<User | null> {\n return this.servicesRegistryHandler.read<User>(\n CoreResourceType.USERS,\n ec,\n { email: email.toLowerCase() },\n serviceOptions,\n );\n }\n\n /**\n * Look up a user's email for audit/display purposes.\n * Returns empty string if not found.\n */\n async getUserEmail(ec: ExecutionContext<any>, userId: string): Promise<string> {\n const user = await this.servicesRegistryHandler.read<{ _id: string; email: string }>(CoreResourceType.USERS, ec, { _id: userId });\n return user?.email ?? '';\n }\n\n async findUserById(ec: ExecutionContext<any>, userId: string): Promise<User | null> {\n return this.servicesRegistryHandler.read<User>(CoreResourceType.USERS, ec, { _id: userId });\n }\n\n async findUserPreferencesByUserId(ec: ExecutionContext<any>, userId: string): Promise<UserPreferences | null> {\n return this.servicesRegistryHandler.read<UserPreferences>(CoreResourceType.USER_PREFERENCES, ec, { userId });\n }\n\n /**\n * AUTH-14 / W5.8: Resolve effective auth policy with org override merging.\n *\n * 1. Gets the raw UserTypeAuthPolicy from config\n * 2. Fetches user's active org memberships\n * 3. For each org, reads the org to get its type\n * 4. Collects authOverrides from organizationTypes[orgType]\n * 5. Calls resolveAuthConfig to merge (most-restrictive-wins)\n * 6. Returns the full UserTypeAuthPolicy with overridable fields merged\n *\n * Fields affected by org overrides: authMethodsEnabled, mfaPolicy, passwordPolicy.\n * All other fields (sessionDurationMinutes, lockoutPolicy, registration, etc.)\n * come from the raw user-type policy unchanged.\n */\n async resolveEffectiveAuthPolicy(\n // `_ec` is intentionally unused: AUTH-24 moved membership/org/link resolution to the SYSTEM door\n // (see the body), which builds its own context — a login/session EC carries no trusted org scope.\n // Kept in the signature for call-site stability and parity with the other lookups on this service.\n _ec: ExecutionContext<any>,\n userId: string,\n userType: string,\n ): Promise<UserTypeAuthPolicy | null> {\n const rawPolicy = this.appConfigService.getUserTypeAuthPolicy(userType);\n if (!rawPolicy) return null;\n\n try {\n // Resolve the user's ACTIVE org memberships via the SYSTEM door, NOT an ec-scoped read. A login/session\n // is globally org-agnostic and its EC carries NO trusted org scope, so an ec-scoped ORGANIZATION_MEMBERS\n // list surfaces only the user's PRIMARY-org membership and silently MISSES a CROSS-org membership (e.g.\n // one a SCIM push just added) — which would defeat the user-global closure below (a user password-logs-in\n // fine because the resolver never sees the managed org they were just provisioned into). See the incident\n // note in `resolveActiveMemberOrgIds` — the same reason per-org audit routing must read the junction as\n // system. That canonical resolver (`listAsSystem`, self-referential audit suppressed) is reused here.\n const activeOrgIds = await resolveActiveMemberOrgIds(this.systemAccessService, userId);\n\n if (activeOrgIds.length === 0) return rawPolicy;\n\n const organizationTypes = this.appConfigService.config.organizationTypes ?? {};\n const orgOverrides: OrgTypeAuthOverrides[] = [];\n // AUTH-24: also detect whether ANY of the user's ACTIVE orgs is ACTIVELY directory-managed\n // (DIRECTORY_PROVISIONING feature + a live SCIM token). If so, the effective policy must forbid\n // local first-factor credentials (PASSWORD / PASSKEY / MAGIC_LINK / SMS_OTP — see\n // `DIRECTORY_INCOMPATIBLE_LOCAL_AUTH_METHODS`) — they bypass the IdP and would\n // survive deprovisioning. Because this resolves across ALL the user's orgs, ONE managed org disables\n // them GLOBALLY for the user (the user-global closure); keying on CURRENT posture also covers a\n // credential set before the org became managed (the activation window). See\n // `.claude/plans/auth-24-credential-lifecycle.md`.\n let anyDirectoryManaged = false;\n\n for (const organizationId of activeOrgIds) {\n try {\n // System read: the org is one of the user's memberships resolved as system above, and may be a\n // CROSS-org the login EC cannot see — so read it the same way. `ORGANIZATIONS` opts into\n // `systemAccessPolicy.read`; the self-referential auth-policy resolution suppresses its own audit.\n const org = await this.systemAccessService.readAsSystem<{ _id: string; type?: string }>(\n CoreResourceType.ORGANIZATIONS, organizationId, { suppressSystemAudit: true },\n );\n if (org?.type && organizationTypes[org.type]?.authOverrides) {\n orgOverrides.push(organizationTypes[org.type].authOverrides!);\n }\n } catch {\n // Org read failure is non-fatal — skip this org's overrides\n }\n if (!anyDirectoryManaged) {\n try {\n const orgIsManaged = await isOrgActivelyDirectoryManaged({\n organizationId,\n featureResolution: this.featureResolution,\n systemAccessService: this.systemAccessService,\n });\n // PROVISIONED-ONLY (user decision 2026-07-21): the derivation applies only to a user the IdP\n // actually PROVISIONED — evidenced by a USER_IDENTITY_LINKS row for THIS org (written by the SCIM\n // push / SSO-JIT). The owner/admin who joined via local registration/invite has NO link and keeps\n // a break-glass credential. Aligns Part 1 with Part 3 (reconciliation only fires on the SCIM push,\n // which also writes the link). See `.claude/plans/auth-24-credential-lifecycle.md`.\n if (orgIsManaged) {\n const identityLink = await this.systemAccessService.readAsSystem<{ _id: string }>(\n CoreResourceType.USER_IDENTITY_LINKS, { userId, organizationId }, { suppressSystemAudit: true },\n );\n if (identityLink) anyDirectoryManaged = true;\n }\n } catch {\n // Posture / identity-link read failure is non-fatal for THIS org — leave the flag as-is. Login\n // must not hard-fail on a transient read; the invite-accept MUTATION path stays the fail-closed\n // gate for credential CREATION, and reconciliation (AUTH-24 part 3) is the durable backstop.\n }\n }\n }\n\n // No overrides AND not directory-managed → nothing derived; return the raw user-type policy.\n if (orgOverrides.length === 0 && !anyDirectoryManaged) return rawPolicy;\n\n // Base effective config: org-merged (most-restrictive) when overrides exist, else the raw policy.\n let effectiveMethods: AuthMethodsMap;\n let effectiveMfa = rawPolicy.mfaPolicy;\n let effectivePassword = rawPolicy.passwordPolicy;\n // #527 — the fourth overridable axis. Declared beside its three siblings because this resolver\n // and the pure org-type one are TWO sites of one invariant, and the merge must not be applied\n // at only one of them.\n let effectiveStepUp = rawPolicy.stepUpAuth;\n if (orgOverrides.length > 0) {\n const authConfig = this.appConfigService.config.auth;\n const resolved = resolveAuthConfig({\n userTypeAuth: rawPolicy,\n orgOverrides,\n orgAuthMethodPolicy: authConfig.orgAuthMethodPolicy,\n expandableOrgMethods: authConfig.expandableOrgMethods,\n });\n effectiveMethods = resolved.authMethodsEnabled;\n effectiveMfa = resolved.mfaPolicy;\n effectivePassword = resolved.passwordPolicy;\n effectiveStepUp = resolved.stepUpAuth;\n } else {\n effectiveMethods = rawPolicy.authMethodsEnabled as AuthMethodsMap;\n }\n\n // AUTH-24 derivation: posture wins over authored config (same most-restrictive direction as the\n // org-override merge) — force the local first-factor methods OFF for a directory-managed user.\n const authMethodsEnabled = anyDirectoryManaged\n ? disableDirectoryIncompatibleMethods(effectiveMethods)\n : effectiveMethods;\n\n return {\n ...rawPolicy,\n authMethodsEnabled: authMethodsEnabled as UserTypeAuthPolicy['authMethodsEnabled'],\n mfaPolicy: effectiveMfa,\n passwordPolicy: effectivePassword,\n stepUpAuth: effectiveStepUp,\n };\n } catch (error) {\n this.logDebug('AUTH-14: Org override resolution failed, falling back to raw user-type policy', {\n userId: userId.substring(0, 8) + '...',\n userType,\n ...projectCaughtErrorLogFields(error),\n });\n return rawPolicy;\n }\n }\n\n /**\n * Org-TYPE-keyed effective auth-policy resolution — PURE (no DB, no EC).\n *\n * For surfaces that must know an organization's available auth methods WITHOUT\n * an authenticated user AND WITHOUT reading the ORGANIZATIONS resource. The\n * canonical caller is the public invitation-accept screen, which runs under an\n * unauthenticated `APP_PUBLIC` pre-auth EC that CANNOT read ORGANIZATIONS (its\n * READ ACL is ORG_MEMBER / super-admin). An earlier org-ID-keyed variant read\n * ORGANIZATIONS internally and fail-closed silently under that EC, dropping the\n * org's auth overrides — so this takes the `orgType` the caller has already\n * resolved via the system-access door and does zero I/O.\n *\n * Resolves the effective policy for a hypothetical member of `userType` in an\n * organization of type `orgType`: `organizationTypes[orgType].authOverrides`\n * merged through the SAME pure `resolveAuthConfig` core (most-restrictive-wins)\n * used by the user-keyed path. Single-org, so no multi-org intersection — but the\n * per-org RESTRICT_ONLY / EXPAND_WITHIN_SET / UNRESTRICTED policy still applies.\n *\n * Fail-open to the raw user-type policy when `orgType` is absent or its type\n * declares no overrides. Returns `null` only when the user type has no policy at\n * all (unknown user type).\n */\n resolveAuthPolicyForOrgType(\n userType: string,\n orgType: string | undefined,\n ): UserTypeAuthPolicy | null {\n return resolveAuthPolicyForOrganizationType(\n this.appConfigService.config,\n userType,\n orgType,\n this.appConfigService.getUserTypeAuthPolicy(userType),\n );\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ResourceServerKind, RuntimeEnvironment } from '@wildo-ai/saas-models';
1
+ import type { ExecutionContext_InitiatorIds, ResourceServerKind, RuntimeEnvironment } from '@wildo-ai/saas-models';
2
2
  import type { RedisService } from '../../../../databases/services/redis.service';
3
3
  import type { LoggerService } from '../../../../monitoring/logger/services/logger.service';
4
4
  import type { SocketAuthResult } from '../../../../runtime/models/execution-context.backend.schemas';
@@ -68,6 +68,42 @@ export type ExternalTurnRateDecision = {
68
68
  * owner id, so the caller treats `undefined` as "cannot throttle → proceed", fail-open).
69
69
  */
70
70
  export declare function resolvePrincipalRateKey(auth: SocketAuthResult): string | undefined;
71
+ /**
72
+ * Derive the counting subject for an operation's OWN declared `rateLimit` policy on a
73
+ * credentialed agent plane (today: MCP `tools/call`). Sits beside
74
+ * {@link resolvePrincipalRateKey} on purpose — the two answer the same question for two
75
+ * different guards, and the ONE thing a reader must not have to reconstruct is why they
76
+ * answer it differently.
77
+ *
78
+ * ## The precedence differs from {@link resolvePrincipalRateKey}, and that is the decision
79
+ *
80
+ * `resolvePrincipalRateKey` deliberately keys the framework's blanket abuse throttle on the
81
+ * principal's OWNER (`user` → `org` → `app`). That is right for a spend guard: the thing being
82
+ * protected is the tenant's shared upstream quota, so every credential the tenant issued should
83
+ * saturate ONE bucket and a tenant cannot buy more headroom by minting more clients.
84
+ *
85
+ * An AUTHORED per-endpoint `rateLimit` is a different statement. Over HTTP it is enforced
86
+ * per SOURCE IP — one caller, one budget — so `requestsPerMinute: 5` has never meant "5/min
87
+ * for the whole tenant"; it means "5/min per client, and N clients get N × 5". The faithful
88
+ * translation onto a plane whose callers are credentials rather than sockets is therefore the
89
+ * CREDENTIAL: two agents an organization runs against the same tool are two clients, exactly as
90
+ * two browsers on two IPs are. Keying this guard on the org instead would silently make the
91
+ * SAME declared number roughly N times stricter over MCP than over REST for any tenant running
92
+ * more than one agent — the "throttles a whole tenant on one agent's traffic" failure — and an
93
+ * application author reading `requestsPerMinute: 5` has no way to discover that.
94
+ *
95
+ * Hence: credential first, then the delegated user, then the owning scope as a last resort.
96
+ * The scope fallback is defensive only — an authenticated MCP caller is either a machine (which
97
+ * always carries `machineCredential`) or user-delegated (which always carries `userId`).
98
+ *
99
+ * Every branch reads a SERVER-VERIFIED field of the execution context. Nothing here may ever be
100
+ * sourced from tool arguments or any other model-supplied value, or the throttle becomes
101
+ * opt-out by an attacker choosing a fresh bucket per call.
102
+ *
103
+ * @returns `undefined` when no identity field is present (see the call site for what that means
104
+ * there — this function does not decide the posture, it only reports that it cannot key).
105
+ */
106
+ export declare function resolveDeclaredPolicySubjectKey(initiatorIds: ExecutionContext_InitiatorIds | null | undefined): string | undefined;
71
107
  /**
72
108
  * Increment and evaluate the per-principal counter for one external turn/call. Call this
73
109
  * AFTER authentication and BEFORE the expensive dispatch (LLM turn / resource op). Returns
@@ -1 +1 @@
1
- {"version":3,"file":"external-turn-rate-limit.backend.utils.d.ts","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/utils/external-turn-rate-limit.backend.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAClG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;AAI5G;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,8GAA8G;AAC9G,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,mEAAmE;AACnE,eAAO,MAAM,qCAAqC,KAAK,CAAC;AAExD,4FAA4F;AAC5F,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,mEAAmE;AACnE,eAAO,MAAM,qCAAqC,KAAK,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAOlF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE;IAAE,YAAY,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,EAC3D,MAAM,EAAE;IACN,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,kBAAkB,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,kBAAkB,CAAC;CACpC,GACA,OAAO,CAAC,wBAAwB,CAAC,CA2BnC"}
1
+ {"version":3,"file":"external-turn-rate-limit.backend.utils.d.ts","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/utils/external-turn-rate-limit.backend.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAClG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;AAI5G;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,8GAA8G;AAC9G,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,mEAAmE;AACnE,eAAO,MAAM,qCAAqC,KAAK,CAAC;AAExD,4FAA4F;AAC5F,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,mEAAmE;AACnE,eAAO,MAAM,qCAAqC,KAAK,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAOlF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,6BAA6B,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUlI;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE;IAAE,YAAY,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,EAC3D,MAAM,EAAE;IACN,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,kBAAkB,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,kBAAkB,CAAC;CACpC,GACA,OAAO,CAAC,wBAAwB,CAAC,CA2BnC"}
@@ -63,6 +63,57 @@ export function resolvePrincipalRateKey(auth) {
63
63
  return `app:${ids.applicationId}`;
64
64
  return undefined;
65
65
  }
66
+ /**
67
+ * Derive the counting subject for an operation's OWN declared `rateLimit` policy on a
68
+ * credentialed agent plane (today: MCP `tools/call`). Sits beside
69
+ * {@link resolvePrincipalRateKey} on purpose — the two answer the same question for two
70
+ * different guards, and the ONE thing a reader must not have to reconstruct is why they
71
+ * answer it differently.
72
+ *
73
+ * ## The precedence differs from {@link resolvePrincipalRateKey}, and that is the decision
74
+ *
75
+ * `resolvePrincipalRateKey` deliberately keys the framework's blanket abuse throttle on the
76
+ * principal's OWNER (`user` → `org` → `app`). That is right for a spend guard: the thing being
77
+ * protected is the tenant's shared upstream quota, so every credential the tenant issued should
78
+ * saturate ONE bucket and a tenant cannot buy more headroom by minting more clients.
79
+ *
80
+ * An AUTHORED per-endpoint `rateLimit` is a different statement. Over HTTP it is enforced
81
+ * per SOURCE IP — one caller, one budget — so `requestsPerMinute: 5` has never meant "5/min
82
+ * for the whole tenant"; it means "5/min per client, and N clients get N × 5". The faithful
83
+ * translation onto a plane whose callers are credentials rather than sockets is therefore the
84
+ * CREDENTIAL: two agents an organization runs against the same tool are two clients, exactly as
85
+ * two browsers on two IPs are. Keying this guard on the org instead would silently make the
86
+ * SAME declared number roughly N times stricter over MCP than over REST for any tenant running
87
+ * more than one agent — the "throttles a whole tenant on one agent's traffic" failure — and an
88
+ * application author reading `requestsPerMinute: 5` has no way to discover that.
89
+ *
90
+ * Hence: credential first, then the delegated user, then the owning scope as a last resort.
91
+ * The scope fallback is defensive only — an authenticated MCP caller is either a machine (which
92
+ * always carries `machineCredential`) or user-delegated (which always carries `userId`).
93
+ *
94
+ * Every branch reads a SERVER-VERIFIED field of the execution context. Nothing here may ever be
95
+ * sourced from tool arguments or any other model-supplied value, or the throttle becomes
96
+ * opt-out by an attacker choosing a fresh bucket per call.
97
+ *
98
+ * @returns `undefined` when no identity field is present (see the call site for what that means
99
+ * there — this function does not decide the posture, it only reports that it cannot key).
100
+ */
101
+ export function resolveDeclaredPolicySubjectKey(initiatorIds) {
102
+ if (!initiatorIds)
103
+ return undefined;
104
+ const credential = initiatorIds.machineCredential;
105
+ // The auth method rides the key because the two credential kinds are separate id spaces
106
+ // (an ApiKey row id and an OAuthClient row id could collide) — never as a policy axis.
107
+ if (credential?.credentialId)
108
+ return `cred:${credential.authMethod}:${credential.credentialId}`;
109
+ if (initiatorIds.userId)
110
+ return `user:${initiatorIds.userId}`;
111
+ if (initiatorIds.organizationId)
112
+ return `org:${initiatorIds.organizationId}`;
113
+ if (initiatorIds.applicationId)
114
+ return `app:${initiatorIds.applicationId}`;
115
+ return undefined;
116
+ }
66
117
  /**
67
118
  * Increment and evaluate the per-principal counter for one external turn/call. Call this
68
119
  * AFTER authentication and BEFORE the expensive dispatch (LLM turn / resource op). Returns
@@ -1 +1 @@
1
- {"version":3,"file":"external-turn-rate-limit.backend.utils.js","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/utils/external-turn-rate-limit.backend.utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,2BAA2B,EAAE,MAAM,8EAA8E,CAAC;AAC3H,OAAO,EAAE,mCAAmC,EAAE,MAAM,iFAAiF,CAAC;AAEtI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,8GAA8G;AAC9G,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAC7C,mEAAmE;AACnE,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AAExD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,mEAAmE;AACnE,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AAcxD;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAsB;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5C,IAAI,GAAG,CAAC,cAAc;QAAE,OAAO,OAAO,GAAG,CAAC,cAAc,EAAE,CAAC;IAC3D,IAAI,GAAG,CAAC,aAAa;QAAE,OAAO,OAAO,GAAG,CAAC,aAAa,EAAE,CAAC;IACzD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAA2D,EAC3D,MAMC;IAED,MAAM,UAAU,GAAG,iBAAiB,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;IACnF,MAAM,qBAAqB,GAAG,mCAAmC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAC9G,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3F,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC;YAClC,mFAAmF;YACnF,IAAI,iBAAiB,GAAG,MAAM,CAAC,aAAa,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;gBAChE,IAAI,GAAG,GAAG,CAAC;oBAAE,iBAAiB,GAAG,GAAG,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,uFAAuF;YACzF,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,iBAAiB,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iFAAiF;QACjF,iFAAiF;QACjF,kDAAkD;QAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iGAAiG,EAAE;YAClH,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,GAAG,2BAA2B,CAAC,KAAK,CAAC;SACtC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;AACH,CAAC","sourcesContent":["import type { ResourceServerKind, RuntimeEnvironment } from '@wildo-ai/saas-models';\nimport type { RedisService } from '~wildo-backend-lib/databases/services/redis.service';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { SocketAuthResult } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport { 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\n/**\n * Per-PRINCIPAL success-path throttle for the external agent transports (A2A / MCP).\n *\n * ## Why this exists, and how it differs from the auth guard next door\n *\n * `machine-auth-rate-limit.backend.utils.ts` is a **failure-keyed** brute-force guard —\n * it only counts REJECTED secret/token presentations, keyed on the source IP, and it\n * deliberately does NOT throttle a valid token (a signature-gated token cannot be\n * guessed). That leaves a real exposure this util closes: an authenticated caller\n * holding ONE valid credential can drive UNBOUNDED work on the credentialed endpoints —\n * for A2A, unbounded LLM turns (direct spend + noisy-neighbor exhaustion of the app's\n * shared upstream model quota); for MCP, unbounded resource-operation dispatch (DB load).\n * There is no app-level global HTTP limiter on these routes, so the only cap is the one\n * added here.\n *\n * This guard is therefore the mirror image of the auth guard:\n * - **Success-keyed, per PRINCIPAL** — every ACCEPTED turn/call increments a counter keyed\n * on the authenticated principal (`userId` \\| `organizationId` \\| `applicationId`), never\n * on a caller/LLM-supplied value. Keying on the principal (not the IP) caps the actual\n * spend axis: the credential. (The FAILURE path already feeds a per-IP counter.)\n * - **Fixed window, increment-then-compare** — the Nth call's atomic `INCR` returns N; once\n * N exceeds the cap the caller is throttled for the remainder of the window. A throttled\n * attempt still consumed its `INCR`, which is intentional: a burst of rejected attempts\n * keeps the abuser saturated rather than clearing the window.\n * - **Fails OPEN on a limiter outage** — a Redis failure must never break the external\n * endpoint. This is an ABUSE-throttle, not a billing boundary; consistency with the\n * sibling auth limiter. (The future per-tenant SPEND budget is a billing boundary and\n * will fail CLOSED instead — do not copy this fail-open policy there.)\n *\n * ## Distinct caps per surface (semantic precision)\n *\n * A2A `message/send` runs an LLM agent turn; MCP `tools/call` dispatches a CRUD resource\n * operation — NOT an LLM call. Their abuse profiles differ (model spend vs DB load), so the\n * two surfaces carry distinct caps rather than one merged number. All caps are framework\n * defaults, tunable later (a per-tenant budget / app-config surface is the follow-on).\n */\n\n/** Max A2A agent turns (`message/send` + `message/stream`) per principal per window (LLM spend — tighter). */\nexport const A2A_EXTERNAL_TURN_RATE_MAX = 30;\n/** Rolling window (seconds) for the A2A per-principal turn cap. */\nexport const A2A_EXTERNAL_TURN_RATE_WINDOW_SECONDS = 60;\n\n/** Max MCP `tools/call` dispatches per principal per window (resource-op load — looser). */\nexport const MCP_EXTERNAL_CALL_RATE_MAX = 120;\n/** Rolling window (seconds) for the MCP per-principal call cap. */\nexport const MCP_EXTERNAL_CALL_RATE_WINDOW_SECONDS = 60;\n\n/**\n * Outcome of a per-principal throttle check. STRING discriminant (`kind`) because this\n * package compiles with `strictNullChecks` off, under which boolean-literal discriminated\n * unions do not narrow reliably (same rationale as the A2A/MCP transport result types).\n * Returned rather than thrown so the caller can emit a controlled transport response\n * (HTTP 429 + `Retry-After`) instead of routing a `RATE_LIMIT` error through the generic\n * async error handler.\n */\nexport type ExternalTurnRateDecision =\n | { kind: 'ok' }\n | { kind: 'rate_limited'; retryAfterSeconds: number };\n\n/**\n * Derive the stable throttle key for an authenticated principal from its server-verified\n * identity. A user-delegated principal carries a `userId`; a machine principal carries\n * exactly one of `organizationId` / `applicationId`. Returns `undefined` for an unkeyable\n * principal (defensive — auth already fails closed for a principal with no resolvable\n * owner id, so the caller treats `undefined` as \"cannot throttle → proceed\", fail-open).\n */\nexport function resolvePrincipalRateKey(auth: SocketAuthResult): string | undefined {\n const ids = auth.initiatorIds;\n if (!ids) return undefined;\n if (ids.userId) return `user:${ids.userId}`;\n if (ids.organizationId) return `org:${ids.organizationId}`;\n if (ids.applicationId) return `app:${ids.applicationId}`;\n return undefined;\n}\n\n/**\n * Increment and evaluate the per-principal counter for one external turn/call. Call this\n * AFTER authentication and BEFORE the expensive dispatch (LLM turn / resource op). Returns\n * `{ kind: 'rate_limited', retryAfterSeconds }` once the principal exceeds `maxPerWindow`\n * in the window, otherwise `{ kind: 'ok' }`. Fails OPEN (returns `ok`) on any Redis error.\n *\n * `params.applicationEnv` scales `maxPerWindow` in DEVELOPMENT/TEST through the shared\n * relaxation seam, so an e2e suite driving many A2A turns or MCP calls under one\n * provisioned principal is not throttled by a production-authored spend guard.\n * `STAGING`/`PRODUCTION` enforce the caller's number exactly.\n */\nexport async function assertExternalTurnWithinRate(\n deps: { redisService: RedisService; logger: LoggerService },\n params: {\n principalKey: string;\n resourceServer: ResourceServerKind;\n maxPerWindow: number;\n windowSeconds: number;\n applicationEnv: RuntimeEnvironment;\n },\n): Promise<ExternalTurnRateDecision> {\n const identifier = `external_turn:${params.resourceServer}:${params.principalKey}`;\n const effectiveMaxPerWindow = relaxAbuseThrottleMaxForEnvironment(params.maxPerWindow, params.applicationEnv);\n try {\n const count = await deps.redisService.incrementRateLimit(identifier, params.windowSeconds);\n if (count > effectiveMaxPerWindow) {\n // Prefer the live TTL for an accurate `Retry-After`; fall back to the full window.\n let retryAfterSeconds = params.windowSeconds;\n try {\n const ttl = await deps.redisService.getRateLimitTtl(identifier);\n if (ttl > 0) retryAfterSeconds = ttl;\n } catch {\n // Keep the window fallback — a TTL read failure must not upgrade this to a hard error.\n }\n return { kind: 'rate_limited', retryAfterSeconds };\n }\n return { kind: 'ok' };\n } catch (error) {\n // Fail OPEN: a limiter outage must never break the external endpoint. This is an\n // abuse-throttle, not a billing boundary — the per-tenant spend budget (a later,\n // separate concern) is the one that fails closed.\n deps.logger.warn('[external-turn-rate-limit] throttle check skipped (rate-limit store unavailable) — failing open', {\n resourceServer: params.resourceServer,\n ...projectCaughtErrorLogFields(error),\n });\n return { kind: 'ok' };\n }\n}\n"]}
1
+ {"version":3,"file":"external-turn-rate-limit.backend.utils.js","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/utils/external-turn-rate-limit.backend.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExecutionContext_InitiatorIds, ResourceServerKind, RuntimeEnvironment } from '@wildo-ai/saas-models';\nimport type { RedisService } from '~wildo-backend-lib/databases/services/redis.service';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { SocketAuthResult } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport { 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\n/**\n * Per-PRINCIPAL success-path throttle for the external agent transports (A2A / MCP).\n *\n * ## Why this exists, and how it differs from the auth guard next door\n *\n * `machine-auth-rate-limit.backend.utils.ts` is a **failure-keyed** brute-force guard —\n * it only counts REJECTED secret/token presentations, keyed on the source IP, and it\n * deliberately does NOT throttle a valid token (a signature-gated token cannot be\n * guessed). That leaves a real exposure this util closes: an authenticated caller\n * holding ONE valid credential can drive UNBOUNDED work on the credentialed endpoints —\n * for A2A, unbounded LLM turns (direct spend + noisy-neighbor exhaustion of the app's\n * shared upstream model quota); for MCP, unbounded resource-operation dispatch (DB load).\n * There is no app-level global HTTP limiter on these routes, so the only cap is the one\n * added here.\n *\n * This guard is therefore the mirror image of the auth guard:\n * - **Success-keyed, per PRINCIPAL** — every ACCEPTED turn/call increments a counter keyed\n * on the authenticated principal (`userId` \\| `organizationId` \\| `applicationId`), never\n * on a caller/LLM-supplied value. Keying on the principal (not the IP) caps the actual\n * spend axis: the credential. (The FAILURE path already feeds a per-IP counter.)\n * - **Fixed window, increment-then-compare** — the Nth call's atomic `INCR` returns N; once\n * N exceeds the cap the caller is throttled for the remainder of the window. A throttled\n * attempt still consumed its `INCR`, which is intentional: a burst of rejected attempts\n * keeps the abuser saturated rather than clearing the window.\n * - **Fails OPEN on a limiter outage** — a Redis failure must never break the external\n * endpoint. This is an ABUSE-throttle, not a billing boundary; consistency with the\n * sibling auth limiter. (The future per-tenant SPEND budget is a billing boundary and\n * will fail CLOSED instead — do not copy this fail-open policy there.)\n *\n * ## Distinct caps per surface (semantic precision)\n *\n * A2A `message/send` runs an LLM agent turn; MCP `tools/call` dispatches a CRUD resource\n * operation — NOT an LLM call. Their abuse profiles differ (model spend vs DB load), so the\n * two surfaces carry distinct caps rather than one merged number. All caps are framework\n * defaults, tunable later (a per-tenant budget / app-config surface is the follow-on).\n */\n\n/** Max A2A agent turns (`message/send` + `message/stream`) per principal per window (LLM spend — tighter). */\nexport const A2A_EXTERNAL_TURN_RATE_MAX = 30;\n/** Rolling window (seconds) for the A2A per-principal turn cap. */\nexport const A2A_EXTERNAL_TURN_RATE_WINDOW_SECONDS = 60;\n\n/** Max MCP `tools/call` dispatches per principal per window (resource-op load — looser). */\nexport const MCP_EXTERNAL_CALL_RATE_MAX = 120;\n/** Rolling window (seconds) for the MCP per-principal call cap. */\nexport const MCP_EXTERNAL_CALL_RATE_WINDOW_SECONDS = 60;\n\n/**\n * Outcome of a per-principal throttle check. STRING discriminant (`kind`) because this\n * package compiles with `strictNullChecks` off, under which boolean-literal discriminated\n * unions do not narrow reliably (same rationale as the A2A/MCP transport result types).\n * Returned rather than thrown so the caller can emit a controlled transport response\n * (HTTP 429 + `Retry-After`) instead of routing a `RATE_LIMIT` error through the generic\n * async error handler.\n */\nexport type ExternalTurnRateDecision =\n | { kind: 'ok' }\n | { kind: 'rate_limited'; retryAfterSeconds: number };\n\n/**\n * Derive the stable throttle key for an authenticated principal from its server-verified\n * identity. A user-delegated principal carries a `userId`; a machine principal carries\n * exactly one of `organizationId` / `applicationId`. Returns `undefined` for an unkeyable\n * principal (defensive — auth already fails closed for a principal with no resolvable\n * owner id, so the caller treats `undefined` as \"cannot throttle → proceed\", fail-open).\n */\nexport function resolvePrincipalRateKey(auth: SocketAuthResult): string | undefined {\n const ids = auth.initiatorIds;\n if (!ids) return undefined;\n if (ids.userId) return `user:${ids.userId}`;\n if (ids.organizationId) return `org:${ids.organizationId}`;\n if (ids.applicationId) return `app:${ids.applicationId}`;\n return undefined;\n}\n\n/**\n * Derive the counting subject for an operation's OWN declared `rateLimit` policy on a\n * credentialed agent plane (today: MCP `tools/call`). Sits beside\n * {@link resolvePrincipalRateKey} on purpose — the two answer the same question for two\n * different guards, and the ONE thing a reader must not have to reconstruct is why they\n * answer it differently.\n *\n * ## The precedence differs from {@link resolvePrincipalRateKey}, and that is the decision\n *\n * `resolvePrincipalRateKey` deliberately keys the framework's blanket abuse throttle on the\n * principal's OWNER (`user` → `org` → `app`). That is right for a spend guard: the thing being\n * protected is the tenant's shared upstream quota, so every credential the tenant issued should\n * saturate ONE bucket and a tenant cannot buy more headroom by minting more clients.\n *\n * An AUTHORED per-endpoint `rateLimit` is a different statement. Over HTTP it is enforced\n * per SOURCE IP — one caller, one budget — so `requestsPerMinute: 5` has never meant \"5/min\n * for the whole tenant\"; it means \"5/min per client, and N clients get N × 5\". The faithful\n * translation onto a plane whose callers are credentials rather than sockets is therefore the\n * CREDENTIAL: two agents an organization runs against the same tool are two clients, exactly as\n * two browsers on two IPs are. Keying this guard on the org instead would silently make the\n * SAME declared number roughly N times stricter over MCP than over REST for any tenant running\n * more than one agent — the \"throttles a whole tenant on one agent's traffic\" failure — and an\n * application author reading `requestsPerMinute: 5` has no way to discover that.\n *\n * Hence: credential first, then the delegated user, then the owning scope as a last resort.\n * The scope fallback is defensive only — an authenticated MCP caller is either a machine (which\n * always carries `machineCredential`) or user-delegated (which always carries `userId`).\n *\n * Every branch reads a SERVER-VERIFIED field of the execution context. Nothing here may ever be\n * sourced from tool arguments or any other model-supplied value, or the throttle becomes\n * opt-out by an attacker choosing a fresh bucket per call.\n *\n * @returns `undefined` when no identity field is present (see the call site for what that means\n * there — this function does not decide the posture, it only reports that it cannot key).\n */\nexport function resolveDeclaredPolicySubjectKey(initiatorIds: ExecutionContext_InitiatorIds | null | undefined): string | undefined {\n if (!initiatorIds) return undefined;\n const credential = initiatorIds.machineCredential;\n // The auth method rides the key because the two credential kinds are separate id spaces\n // (an ApiKey row id and an OAuthClient row id could collide) — never as a policy axis.\n if (credential?.credentialId) return `cred:${credential.authMethod}:${credential.credentialId}`;\n if (initiatorIds.userId) return `user:${initiatorIds.userId}`;\n if (initiatorIds.organizationId) return `org:${initiatorIds.organizationId}`;\n if (initiatorIds.applicationId) return `app:${initiatorIds.applicationId}`;\n return undefined;\n}\n\n/**\n * Increment and evaluate the per-principal counter for one external turn/call. Call this\n * AFTER authentication and BEFORE the expensive dispatch (LLM turn / resource op). Returns\n * `{ kind: 'rate_limited', retryAfterSeconds }` once the principal exceeds `maxPerWindow`\n * in the window, otherwise `{ kind: 'ok' }`. Fails OPEN (returns `ok`) on any Redis error.\n *\n * `params.applicationEnv` scales `maxPerWindow` in DEVELOPMENT/TEST through the shared\n * relaxation seam, so an e2e suite driving many A2A turns or MCP calls under one\n * provisioned principal is not throttled by a production-authored spend guard.\n * `STAGING`/`PRODUCTION` enforce the caller's number exactly.\n */\nexport async function assertExternalTurnWithinRate(\n deps: { redisService: RedisService; logger: LoggerService },\n params: {\n principalKey: string;\n resourceServer: ResourceServerKind;\n maxPerWindow: number;\n windowSeconds: number;\n applicationEnv: RuntimeEnvironment;\n },\n): Promise<ExternalTurnRateDecision> {\n const identifier = `external_turn:${params.resourceServer}:${params.principalKey}`;\n const effectiveMaxPerWindow = relaxAbuseThrottleMaxForEnvironment(params.maxPerWindow, params.applicationEnv);\n try {\n const count = await deps.redisService.incrementRateLimit(identifier, params.windowSeconds);\n if (count > effectiveMaxPerWindow) {\n // Prefer the live TTL for an accurate `Retry-After`; fall back to the full window.\n let retryAfterSeconds = params.windowSeconds;\n try {\n const ttl = await deps.redisService.getRateLimitTtl(identifier);\n if (ttl > 0) retryAfterSeconds = ttl;\n } catch {\n // Keep the window fallback — a TTL read failure must not upgrade this to a hard error.\n }\n return { kind: 'rate_limited', retryAfterSeconds };\n }\n return { kind: 'ok' };\n } catch (error) {\n // Fail OPEN: a limiter outage must never break the external endpoint. This is an\n // abuse-throttle, not a billing boundary — the per-tenant spend budget (a later,\n // separate concern) is the one that fails closed.\n deps.logger.warn('[external-turn-rate-limit] throttle check skipped (rate-limit store unavailable) — failing open', {\n resourceServer: params.resourceServer,\n ...projectCaughtErrorLogFields(error),\n });\n return { kind: 'ok' };\n }\n}\n"]}
@@ -3,9 +3,50 @@ interface EnterpriseSsoEnforcementLike {
3
3
  requireSSO?: boolean | undefined;
4
4
  allowPasswordFallback?: boolean | undefined;
5
5
  }
6
+ /** The break-glass half of a tenant's SSO policy, taken structurally so a partial config fits. */
7
+ export interface EmergencyAccessLike {
8
+ enabled?: boolean | undefined;
9
+ breakGlassAccounts?: readonly string[] | undefined;
10
+ }
6
11
  interface DomainOrgLookupLike {
7
12
  enforcement?: EnterpriseSsoEnforcementLike | undefined;
13
+ ssoConfig?: {
14
+ emergencyAccess?: EmergencyAccessLike | undefined;
15
+ } | undefined;
8
16
  }
17
+ /**
18
+ * Does this tenant have break-glass accounts that could actually be used?
19
+ *
20
+ * `enabled` alone grants nothing: the LIST is what confers the bypass, so an empty list with the
21
+ * switch on is the same as no break-glass at all. Written as one predicate because both the offered
22
+ * methods and the enforcement gate must agree about it — if they disagree, either the accounts
23
+ * cannot reach a password field or everyone else can.
24
+ */
25
+ export declare function tenantHasUsableBreakGlassAccounts(domainOrgLookup?: DomainOrgLookupLike | null | undefined): boolean;
26
+ /**
27
+ * Is this address one of the tenant's named break-glass accounts?
28
+ *
29
+ * Compared case-insensitively on the address, because that is how the operator authored it and how
30
+ * the caller typed it. The CALLER's claim is never the input — every call site passes the address of
31
+ * a user whose credential has already been verified.
32
+ */
33
+ export declare function isBreakGlassAccount(emergencyAccess: EmergencyAccessLike | undefined | null, email: string | undefined | null): boolean;
34
+ /**
35
+ * Must this tenant's sign-in page offer ONLY enterprise methods?
36
+ *
37
+ * ## Why break-glass answers this for the whole tenant rather than per account
38
+ *
39
+ * A tenant with named break-glass accounts keeps its password field — for EVERY address at the
40
+ * domain, not for the listed ones. This is the enumeration-safety decision (#481/#423): the offered
41
+ * method list is built before anything is authenticated, from an email hint, so narrowing it for
42
+ * the listed accounts would make the sign-in page an oracle for who they are. A break-glass list is
43
+ * a small, high-value target; publishing its membership to anyone who can type an address is worse
44
+ * than the outage it protects against.
45
+ *
46
+ * What refuses everyone else is the enforcement gate, AFTER the password is verified. So the cost
47
+ * of this is a password field that only the listed accounts can use, and the benefit is that
48
+ * nothing about the response says which those are.
49
+ */
9
50
  export declare function requiresEnterpriseSsoOnly(domainOrgLookup?: DomainOrgLookupLike | null | undefined): boolean;
10
51
  export declare function restrictFirstFactorMethodsForEnterpriseSso(methods: ReadonlyArray<AvailableMethod>, domainOrgLookup?: DomainOrgLookupLike | null | undefined): AvailableMethod[];
11
52
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"enterprise-sso-enforcement.backend.utils.d.ts","sourceRoot":"","sources":["../../../../../../src/security/authentications/utils/enterprise-sso-enforcement.backend.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEzE,UAAU,4BAA4B;IACpC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7C;AAED,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;CACxD;AAED,wBAAgB,yBAAyB,CACvC,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GACvD,OAAO,CAGT;AAED,wBAAgB,0CAA0C,CACxD,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,EACvC,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GACvD,eAAe,EAAE,CAUnB"}
1
+ {"version":3,"file":"enterprise-sso-enforcement.backend.utils.d.ts","sourceRoot":"","sources":["../../../../../../src/security/authentications/utils/enterprise-sso-enforcement.backend.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEzE,UAAU,4BAA4B;IACpC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7C;AAED,kGAAkG;AAClG,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACpD;AAED,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IACvD,SAAS,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;CAC/E;AAED;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC/C,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GACvD,OAAO,CAIT;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,mBAAmB,GAAG,SAAS,GAAG,IAAI,EACvD,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC/B,OAAO,CAMT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CACvC,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GACvD,OAAO,CAMT;AAED,wBAAgB,0CAA0C,CACxD,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,EACvC,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GACvD,eAAe,EAAE,CAUnB"}
@@ -1,5 +1,50 @@
1
1
  import { AuthMethod } from '@wildo-ai/saas-models';
2
+ /**
3
+ * Does this tenant have break-glass accounts that could actually be used?
4
+ *
5
+ * `enabled` alone grants nothing: the LIST is what confers the bypass, so an empty list with the
6
+ * switch on is the same as no break-glass at all. Written as one predicate because both the offered
7
+ * methods and the enforcement gate must agree about it — if they disagree, either the accounts
8
+ * cannot reach a password field or everyone else can.
9
+ */
10
+ export function tenantHasUsableBreakGlassAccounts(domainOrgLookup) {
11
+ const emergencyAccess = domainOrgLookup?.ssoConfig?.emergencyAccess;
12
+ return emergencyAccess?.enabled === true
13
+ && (emergencyAccess.breakGlassAccounts?.length ?? 0) > 0;
14
+ }
15
+ /**
16
+ * Is this address one of the tenant's named break-glass accounts?
17
+ *
18
+ * Compared case-insensitively on the address, because that is how the operator authored it and how
19
+ * the caller typed it. The CALLER's claim is never the input — every call site passes the address of
20
+ * a user whose credential has already been verified.
21
+ */
22
+ export function isBreakGlassAccount(emergencyAccess, email) {
23
+ if (emergencyAccess?.enabled !== true || !email)
24
+ return false;
25
+ const normalized = email.trim().toLowerCase();
26
+ return (emergencyAccess.breakGlassAccounts ?? []).some((account) => account.trim().toLowerCase() === normalized);
27
+ }
28
+ /**
29
+ * Must this tenant's sign-in page offer ONLY enterprise methods?
30
+ *
31
+ * ## Why break-glass answers this for the whole tenant rather than per account
32
+ *
33
+ * A tenant with named break-glass accounts keeps its password field — for EVERY address at the
34
+ * domain, not for the listed ones. This is the enumeration-safety decision (#481/#423): the offered
35
+ * method list is built before anything is authenticated, from an email hint, so narrowing it for
36
+ * the listed accounts would make the sign-in page an oracle for who they are. A break-glass list is
37
+ * a small, high-value target; publishing its membership to anyone who can type an address is worse
38
+ * than the outage it protects against.
39
+ *
40
+ * What refuses everyone else is the enforcement gate, AFTER the password is verified. So the cost
41
+ * of this is a password field that only the listed accounts can use, and the benefit is that
42
+ * nothing about the response says which those are.
43
+ */
2
44
  export function requiresEnterpriseSsoOnly(domainOrgLookup) {
45
+ if (tenantHasUsableBreakGlassAccounts(domainOrgLookup)) {
46
+ return false;
47
+ }
3
48
  return domainOrgLookup?.enforcement?.requireSSO === true
4
49
  && domainOrgLookup.enforcement.allowPasswordFallback !== true;
5
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"enterprise-sso-enforcement.backend.utils.js","sourceRoot":"","sources":["../../../../../../src/security/authentications/utils/enterprise-sso-enforcement.backend.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwB,MAAM,uBAAuB,CAAC;AAWzE,MAAM,UAAU,yBAAyB,CACvC,eAAwD;IAExD,OAAO,eAAe,EAAE,WAAW,EAAE,UAAU,KAAK,IAAI;WACnD,eAAe,CAAC,WAAW,CAAC,qBAAqB,KAAK,IAAI,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,0CAA0C,CACxD,OAAuC,EACvC,eAAwD;IAExD,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,kBAAkB;WAC5C,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,QAAQ,CAC3C,CAAC;AACJ,CAAC","sourcesContent":["import { AuthMethod, type AvailableMethod } from '@wildo-ai/saas-models';\n\ninterface EnterpriseSsoEnforcementLike {\n requireSSO?: boolean | undefined;\n allowPasswordFallback?: boolean | undefined;\n}\n\ninterface DomainOrgLookupLike {\n enforcement?: EnterpriseSsoEnforcementLike | undefined;\n}\n\nexport function requiresEnterpriseSsoOnly(\n domainOrgLookup?: DomainOrgLookupLike | null | undefined,\n): boolean {\n return domainOrgLookup?.enforcement?.requireSSO === true\n && domainOrgLookup.enforcement.allowPasswordFallback !== true;\n}\n\nexport function restrictFirstFactorMethodsForEnterpriseSso(\n methods: ReadonlyArray<AvailableMethod>,\n domainOrgLookup?: DomainOrgLookupLike | null | undefined,\n): AvailableMethod[] {\n if (!requiresEnterpriseSsoOnly(domainOrgLookup)) {\n return [...methods];\n }\n\n return methods.filter(\n (method) =>\n method.method === AuthMethod.ORG_OPENID_CONNECT\n || method.method === AuthMethod.ORG_SAML,\n );\n}\n"]}
1
+ {"version":3,"file":"enterprise-sso-enforcement.backend.utils.js","sourceRoot":"","sources":["../../../../../../src/security/authentications/utils/enterprise-sso-enforcement.backend.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwB,MAAM,uBAAuB,CAAC;AAkBzE;;;;;;;GAOG;AACH,MAAM,UAAU,iCAAiC,CAC/C,eAAwD;IAExD,MAAM,eAAe,GAAG,eAAe,EAAE,SAAS,EAAE,eAAe,CAAC;IACpE,OAAO,eAAe,EAAE,OAAO,KAAK,IAAI;WACnC,CAAC,eAAe,CAAC,kBAAkB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,eAAuD,EACvD,KAAgC;IAEhC,IAAI,eAAe,EAAE,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,OAAO,CAAC,eAAe,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,IAAI,CACpD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU,CACzD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,yBAAyB,CACvC,eAAwD;IAExD,IAAI,iCAAiC,CAAC,eAAe,CAAC,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,eAAe,EAAE,WAAW,EAAE,UAAU,KAAK,IAAI;WACnD,eAAe,CAAC,WAAW,CAAC,qBAAqB,KAAK,IAAI,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,0CAA0C,CACxD,OAAuC,EACvC,eAAwD;IAExD,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,kBAAkB;WAC5C,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,QAAQ,CAC3C,CAAC;AACJ,CAAC","sourcesContent":["import { AuthMethod, type AvailableMethod } from '@wildo-ai/saas-models';\n\ninterface EnterpriseSsoEnforcementLike {\n requireSSO?: boolean | undefined;\n allowPasswordFallback?: boolean | undefined;\n}\n\n/** The break-glass half of a tenant's SSO policy, taken structurally so a partial config fits. */\nexport interface EmergencyAccessLike {\n enabled?: boolean | undefined;\n breakGlassAccounts?: readonly string[] | undefined;\n}\n\ninterface DomainOrgLookupLike {\n enforcement?: EnterpriseSsoEnforcementLike | undefined;\n ssoConfig?: { emergencyAccess?: EmergencyAccessLike | undefined } | undefined;\n}\n\n/**\n * Does this tenant have break-glass accounts that could actually be used?\n *\n * `enabled` alone grants nothing: the LIST is what confers the bypass, so an empty list with the\n * switch on is the same as no break-glass at all. Written as one predicate because both the offered\n * methods and the enforcement gate must agree about it — if they disagree, either the accounts\n * cannot reach a password field or everyone else can.\n */\nexport function tenantHasUsableBreakGlassAccounts(\n domainOrgLookup?: DomainOrgLookupLike | null | undefined,\n): boolean {\n const emergencyAccess = domainOrgLookup?.ssoConfig?.emergencyAccess;\n return emergencyAccess?.enabled === true\n && (emergencyAccess.breakGlassAccounts?.length ?? 0) > 0;\n}\n\n/**\n * Is this address one of the tenant's named break-glass accounts?\n *\n * Compared case-insensitively on the address, because that is how the operator authored it and how\n * the caller typed it. The CALLER's claim is never the input — every call site passes the address of\n * a user whose credential has already been verified.\n */\nexport function isBreakGlassAccount(\n emergencyAccess: EmergencyAccessLike | undefined | null,\n email: string | undefined | null,\n): boolean {\n if (emergencyAccess?.enabled !== true || !email) return false;\n const normalized = email.trim().toLowerCase();\n return (emergencyAccess.breakGlassAccounts ?? []).some(\n (account) => account.trim().toLowerCase() === normalized,\n );\n}\n\n/**\n * Must this tenant's sign-in page offer ONLY enterprise methods?\n *\n * ## Why break-glass answers this for the whole tenant rather than per account\n *\n * A tenant with named break-glass accounts keeps its password field — for EVERY address at the\n * domain, not for the listed ones. This is the enumeration-safety decision (#481/#423): the offered\n * method list is built before anything is authenticated, from an email hint, so narrowing it for\n * the listed accounts would make the sign-in page an oracle for who they are. A break-glass list is\n * a small, high-value target; publishing its membership to anyone who can type an address is worse\n * than the outage it protects against.\n *\n * What refuses everyone else is the enforcement gate, AFTER the password is verified. So the cost\n * of this is a password field that only the listed accounts can use, and the benefit is that\n * nothing about the response says which those are.\n */\nexport function requiresEnterpriseSsoOnly(\n domainOrgLookup?: DomainOrgLookupLike | null | undefined,\n): boolean {\n if (tenantHasUsableBreakGlassAccounts(domainOrgLookup)) {\n return false;\n }\n return domainOrgLookup?.enforcement?.requireSSO === true\n && domainOrgLookup.enforcement.allowPasswordFallback !== true;\n}\n\nexport function restrictFirstFactorMethodsForEnterpriseSso(\n methods: ReadonlyArray<AvailableMethod>,\n domainOrgLookup?: DomainOrgLookupLike | null | undefined,\n): AvailableMethod[] {\n if (!requiresEnterpriseSsoOnly(domainOrgLookup)) {\n return [...methods];\n }\n\n return methods.filter(\n (method) =>\n method.method === AuthMethod.ORG_OPENID_CONNECT\n || method.method === AuthMethod.ORG_SAML,\n );\n}\n"]}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * # Cross-tenant READ observation — the half `authorizeOrganizations` structurally cannot see
3
+ *
4
+ * assurance-control: WILDO.ACCESS.CROSS_TENANT_ADMINISTRATION — a declared read across the tenant
5
+ * boundary leaves evidence, per tenant reached.
6
+ * assurance-control: WILDO.ACCESS.AUTHORIZATION_DECISION_AUDIT
7
+ *
8
+ * ## The gap this closes
9
+ *
10
+ * `CROSS_TENANT_ADMINISTRATIVE_ACCESS` is emitted from `authorizeOrganizations`, which runs on
11
+ * ORGANIZATIONS-scoped resources: it fetches a row, resolves the tenant that row belongs to, and
12
+ * records the crossing when the caller holds no organization-wide entry for it.
13
+ *
14
+ * An APPLICATION-scoped resource never traverses that path — there is no organization in its route
15
+ * and no per-row tenant gate — so a door that returns rows CARRYING an `organizationId` reaches
16
+ * every tenant with nothing written down. That is the same invariant applied at some of its sites
17
+ * (`.claude/rules/invariant-call-site-enumeration.md`), and the missing site is the one that hurts
18
+ * most: `APPLICATION_AUDIT_LOGS` is the operator's cross-tenant view of the audit trail itself, and
19
+ * the trail is the worst possible surface on which to make an operator read invisible
20
+ * (`.claude/rules/administrative-continuity-floors.md`).
21
+ *
22
+ * Measured 2026-09-09 over the real core registry: exactly FIVE resources are APPLICATION-scoped and
23
+ * declare a top-level `organizationId` — `applicationAuditLogs`, `auditLogs`, `consumableTokens`,
24
+ * `files` and `jobExecutions`. This is a small, enumerable population, not a framework-wide sweep.
25
+ *
26
+ * ## Why only a DECLARED crossing is observed
27
+ *
28
+ * `admissionDeclared: false` on that event means an ATTEMPTED crossing that no variant asked for,
29
+ * **and which was refused** — that is what its own field JSDoc says, and what a reviewer reads it
30
+ * as. A read here SUCCEEDS, so emitting `false` for an undeclared door would put a false sentence in
31
+ * the trail: it would describe a completed disclosure as a blocked attempt. Deriving the field from
32
+ * anywhere other than the variant's own flag would be a second derivation of one predicate, which is
33
+ * how a gate and its trail start disagreeing.
34
+ *
35
+ * So the enrolment rule is exact, and it is one act: **declaring
36
+ * `admitsCrossTenantPlatformAdministration` on a read variant is what puts that read in the trail.**
37
+ * The four sibling resources declare no crossing and are therefore unchanged. An UNDECLARED
38
+ * application-scoped door that returns foreign rows is a different defect — an undeclared crossing —
39
+ * and the answer to it is a declaration or a confinement, never an audit row that misdescribes
40
+ * itself.
41
+ *
42
+ * ## Why ORGANIZATIONS-scoped resources are excluded
43
+ *
44
+ * They already emit, from `authorizeOrganizations`, on the same event. Observing them here as well
45
+ * would double-record every declared crossing on `organizations` and `platformAccessGrants` — and a
46
+ * duplicated crossing is worse than a missing one, because a reviewer counting operator reaches
47
+ * would over-count without any way to tell.
48
+ *
49
+ * ## Why membership comes from ROLE ENTRIES
50
+ *
51
+ * The same reason its three siblings give: `initiatorIds.organizationId` names the one tenant the
52
+ * request is acting in, which cannot answer "is this caller a member of the tenant THIS ROW belongs
53
+ * to" for a result set spanning many. Role entries are the one input a request cannot author for
54
+ * itself. {@link resolveCallerOrganizationIds} is reused rather than re-derived so this observation
55
+ * and the confinement authorities can never disagree about who is a member.
56
+ */
57
+ import { CoreResourceOperation } from '@wildo-ai/saas-models';
58
+ import { type ScopeRootCollectionConfinementSignal } from '../../security/authorizations/scope-root-collection-confinement.backend';
59
+ /**
60
+ * The EXECUTED operation variant — the one whose declaration decides enrolment.
61
+ *
62
+ * Passed explicitly rather than read off `executionContext.operation`, and that is a correctness
63
+ * requirement rather than a style choice. A resource authors ONE variant per operation and the
64
+ * config factory derives `summary` and `context` variants from it, so "the operation" is ambiguous
65
+ * unless the executed one is named; `authorizations.backend.service` already hedges by consulting
66
+ * BOTH the passed operation and the context's, which is the tell that the context's copy cannot be
67
+ * relied on. Taking it here means the enrolment decision and the `admissionDeclared` the emitter
68
+ * writes are read from the SAME object and cannot disagree — the failure this repository keeps
69
+ * paying for when one predicate is derived twice.
70
+ */
71
+ export interface CrossTenantReadObservationOperation {
72
+ readonly admitsCrossTenantPlatformAdministration?: boolean;
73
+ }
74
+ /** What this authority needs from the resource configuration. Deliberately narrow, like its siblings. */
75
+ export interface CrossTenantReadObservationResource {
76
+ readonly resourceIdentifier?: string;
77
+ readonly resourcePrimaryScope?: string;
78
+ }
79
+ /** One tenant reached by a single read, with the rows of that tenant it returned. */
80
+ export interface CrossTenantReadCrossing {
81
+ readonly targetOrganizationId: string;
82
+ readonly targetResourceIds: string[];
83
+ }
84
+ /**
85
+ * Is this read enrolled in the crossing trail at all?
86
+ *
87
+ * Separated from the row walk so the decision can be pinned on its own, and so a caller pays nothing
88
+ * for a read that is not enrolled — which is every read of all but a handful of resources.
89
+ */
90
+ export declare function isObservedCrossTenantRead(params: {
91
+ readonly executionContext: ScopeRootCollectionConfinementSignal;
92
+ readonly operation: CrossTenantReadObservationOperation | undefined;
93
+ readonly resourceConfiguration: CrossTenantReadObservationResource;
94
+ readonly executedCoreOperation: CoreResourceOperation | undefined;
95
+ }): boolean;
96
+ /**
97
+ * The distinct tenants a read reached into, and which of their rows it returned.
98
+ *
99
+ * Returns EMPTY when the read is not enrolled, when no returned row carries a tenant, or when every
100
+ * tenant reached is one the caller belongs to. Grouping by tenant rather than emitting per row is
101
+ * what bounds the trail: one operator read produces one row per TENANT reached, not one per record,
102
+ * and the audit row's own `organizationId` is then that tenant's — which is what makes the crossing
103
+ * visible in the reached tenant's own organization-scoped viewer, rather than only to the operator.
104
+ *
105
+ * `rows` accepts whatever the read returned — one object, an array, or nothing — because the three
106
+ * seams that call this differ in shape and normalising at each of them is how one of them would come
107
+ * to normalise differently.
108
+ */
109
+ export declare function collectCrossTenantReadCrossings(params: {
110
+ readonly executionContext: ScopeRootCollectionConfinementSignal;
111
+ readonly operation: CrossTenantReadObservationOperation | undefined;
112
+ readonly resourceConfiguration: CrossTenantReadObservationResource;
113
+ readonly executedCoreOperation: CoreResourceOperation | undefined;
114
+ readonly rows: unknown;
115
+ }): CrossTenantReadCrossing[];
116
+ //# sourceMappingURL=cross-tenant-read-observation.backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-tenant-read-observation.backend.d.ts","sourceRoot":"","sources":["../../../../../src/security/authorizations/cross-tenant-read-observation.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EACL,qBAAqB,EAGtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAEL,KAAK,oCAAoC,EAC1C,MAAM,sFAAsF,CAAC;AAoC9F;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,uCAAuC,CAAC,EAAE,OAAO,CAAC;CAC5D;AAED,yGAAyG;AACzG,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,qFAAqF;AACrF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,QAAQ,CAAC,gBAAgB,EAAE,oCAAoC,CAAC;IAChE,QAAQ,CAAC,SAAS,EAAE,mCAAmC,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,qBAAqB,EAAE,kCAAkC,CAAC;IACnE,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,GAAG,SAAS,CAAC;CACnE,GAAG,OAAO,CAUV;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,QAAQ,CAAC,gBAAgB,EAAE,oCAAoC,CAAC;IAChE,QAAQ,CAAC,SAAS,EAAE,mCAAmC,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,qBAAqB,EAAE,kCAAkC,CAAC;IACnE,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAClE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,GAAG,uBAAuB,EAAE,CAiC5B"}