@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":"wildo-managed-storage-provider.backend.service.js","sourceRoot":"","sources":["../../../../../src/files/storage/wildo-managed-storage-provider.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Wildo-Managed Storage Provider\n *\n * Default IFileStorageProvider implementation backed by MinIO/S3.\n * All file operations go through z_file() declarations and the unified\n * IFileStorageProvider interface.\n *\n * Two inputs, from two different places, and the split is deliberate:\n * - TOPOLOGY (endpoint, port, ssl, bucket, key prefix) comes from resolved\n * application configuration (`storage.managed`), which the configuration\n * loader seeds from the environment.\n * - CREDENTIALS are short-lived, prefix-confined STS sessions fetched from\n * apps-manager per use. They never appear in configuration or in the\n * environment.\n */\n\nimport { injectable, inject, optional } from 'inversify';\nimport { Readable } from 'stream';\nimport { Client, ClientOptions } from 'minio';\nimport { ErrorType, ErrorCustomMessageReference, WildoHeaderKeys, isWildoBackendError } from '@wildo-ai/saas-models';\nimport { FileStorageAccepted } from '@wildo-ai/zod-decorators';\nimport { INFRA_DEFAULT_PORTS, STORAGE_DEFAULTS } from '@wildo-ai/platform-config-lib';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport type { AppConfiguration_Storage_ManagedConnection } from '~wildo-backend-lib/config/models/app-config.backend.schemas';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport { validateAppId, validateContentType, validateFileId, validateSize, validateStream, resolveConfiguredMaxFileSize } from '~wildo-backend-lib/files/utils/file-validation.utils';\nimport { API_ROUTES_BACKEND_DEFINITIONS } from '~wildo-backend-lib/requests/models/api-routes.backend.defintions';\nimport { resolveSharedPersistenceCollectionName } from '@wildo-ai/saas-models';\nimport { ResourcePrimaryScope } from '@wildo-ai/saas-models';\nimport type { FileScopeIdentifiers, ResourceType } from '@wildo-ai/saas-models';\n\n/**\n * The key segment for a blob with no resource type.\n *\n * A literal rather than a resource name, and prefixed with `_` so it can never collide with a\n * value `resolveSharedPersistenceCollectionName` produces — that function returns collection\n * names, which never start with an underscore.\n */\nconst UNLINKED_STORAGE_SEGMENT = '_unlinked';\n\n/**\n * The `<scope>/<scopeId>` segments of an object key.\n *\n * This is what makes ONE TENANT's blobs a prefix. Without it every organization's files of a given\n * resource share a single prefix, so erasure, orphan sweeps and \"who owns this object\" all become\n * per-row database work instead of prefix operations — and no per-tenant confinement is expressible\n * at all. (That was the state until 2026-08-14: the approved shape carried these segments and the\n * first implementation dropped them.)\n *\n * Always emits BOTH segments, including for APPLICATION scope where the id repeats the one already\n * in the prefix. The redundancy is deliberate: one key shape, no branch, nothing that can produce a\n * second layout. A parser can always take the last three segments as scope/scopeId/fileId.\n */\nfunction resolveScopeSegments(scope: FileScopeIdentifiers | undefined, applicationId: string): { scope: string; scopeId: string } {\n // The SEGMENT IS the enum value — `ResourcePrimaryScope.ORGANIZATIONS === 'organizations'`. Using\n // the enum directly keeps one vocabulary: a parallel string table here would be a second source\n // that silently drifts the day a scope is added or renamed.\n if (scope?.primaryScope === ResourcePrimaryScope.ORGANIZATIONS && scope.organizationId) {\n return { scope: ResourcePrimaryScope.ORGANIZATIONS, scopeId: scope.organizationId };\n }\n if (scope?.primaryScope === ResourcePrimaryScope.USER_SELF && scope.userId) {\n return { scope: ResourcePrimaryScope.USER_SELF, scopeId: scope.userId };\n }\n // APPLICATION scope, or a scope whose id is missing — fall back to the application. Never throw:\n // a key must always be derivable, and an application-scoped key is the correct conservative answer\n // (it is the narrowest scope every file provably has).\n return { scope: ResourcePrimaryScope.APPLICATION, scopeId: applicationId };\n}\nimport { StorageCredentialProvider } from '~wildo-backend-lib/files/storage/storage-credential-provider.backend.utils';\nimport type { ResolvedStorageCredentials, StorageCredentialResolver } from '~wildo-backend-lib/files/storage/storage-credential-provider.backend.utils';\nimport { createStsStorageCredentialResolver } from '~wildo-backend-lib/files/storage/storage-sts-credential-resolver.backend.utils';\nimport { resolveStorageApplicationIdentity } from '~wildo-backend-lib/files/utils/storage-application-identity.backend.utils';\nimport type {\n IFileStorageProvider,\n StorageUploadResult,\n StorageUploadOptions,\n StorageDownloadResult,\n StorageFileMetadata,\n StorageProviderHealthResult,\n StoredFileStorageTarget,\n} from './file-storage-provider.types';\n\nconst DEFAULT_STORAGE_REGION = 'us-east-1';\n\n/**\n * S3's maximum object size for a SINGLE `PutObject` request, and therefore the\n * largest object this provider can store under a prefix-confined credential.\n *\n * ## Why a prefix-confined credential cannot use multipart at all\n *\n * The minio client's multipart path opens with `findUploadId()`, which issues\n * **ListMultipartUploads** — a BUCKET-level operation authorised by\n * `s3:ListBucketMultipartUploads`. That action is not in the session policy, so\n * every upload large enough to take the multipart branch is refused\n * `AccessDenied` before a single byte is sent. Measured against live MinIO:\n * `CreateMultipartUpload` is allowed (it maps to `s3:PutObject`), while\n * `findUploadId` and `AbortMultipartUpload` are both refused.\n *\n * Granting the missing action is NOT an option, and not merely on preference —\n * MinIO rejects the policy outright: `s3:ListBucketMultipartUploads` does not\n * accept the `s3:prefix` condition key\n * (`InvalidParameterValue: unsupported condition keys '[s3:prefix]'`). The only\n * way to grant it is an UNCONDITIONED bucket-wide statement, which would expose\n * every other application's in-flight upload keys — the same tenant-structure\n * leak the conditioned `s3:ListBucket` exists to prevent.\n *\n * So the multipart branch is avoided rather than authorised: {@link PART_SIZE_BYTES}\n * is set high enough that no object this provider accepts can reach it, and\n * anything above this ceiling is refused here with a precise error rather than\n * an opaque `AccessDenied` from the store.\n *\n * See `.claude/plans/object-storage-root-credential-distribution.md` (F-D).\n */\nconst MAX_SINGLE_PUT_OBJECT_SIZE_BYTES = 5 * 1024 * 1024 * 1024;\n\n/**\n * Forces every upload onto the single-`PutObject` path — see\n * {@link MAX_SINGLE_PUT_OBJECT_SIZE_BYTES} for why multipart is unreachable.\n *\n * The client branches on `size <= partSize`, so pinning this to the single-PUT\n * ceiling makes the branch unreachable for any object the provider accepts.\n *\n * It costs no additional memory: the single-PUT path buffers `size` bytes, which\n * is bounded by the application's own configured `storage.maxFileSize`, not by\n * this value. What it does mean is that an upload is fully buffered rather than\n * streamed in chunks — acceptable at the 100 MB default ceiling, and the reason\n * `storage.maxFileSize` is the knob that governs storage memory pressure.\n */\nconst PART_SIZE_BYTES = MAX_SINGLE_PUT_OBJECT_SIZE_BYTES;\n\n/**\n * The S3/MinIO error CODE, when the thrown value carries one.\n *\n * Preferred over message matching everywhere in this file. The minio client sets\n * `code` (e.g. `AccessDenied`, `NoSuchKey`, `ExpiredToken`) on its errors, and a\n * code is a stable contract where a message is prose the SDK may reword between\n * releases. F-D is the concrete cost of getting this wrong: a real `AccessDenied`\n * whose message did not contain the expected substring was classified as a\n * generic connectivity failure, so the log blamed credentials and the actual\n * cause — an unauthorised HeadBucket probe — stayed invisible.\n *\n * Returns `undefined` for a plain `Error`, which is the signal for callers to\n * fall back to substring matching rather than mis-classify.\n */\nfunction resolveStorageErrorCode(error: unknown): string | undefined {\n const code = (error as { code?: unknown })?.code;\n return typeof code === 'string' && code.length > 0 ? code : undefined;\n}\n\n@injectable()\nexport class WildoManagedStorageProvider implements IFileStorageProvider {\n readonly providerId = FileStorageAccepted.WILDO_MANAGED;\n private client: Client | null = null;\n /**\n * Access key the cached {@link client} was built with. A storage client binds\n * its credentials at construction, so once those credentials can EXPIRE the\n * client must be rebuilt when they change — caching it unconditionally (as this\n * did while the credential was the never-changing root key) would keep using a\n * dead session until the process restarted.\n */\n private clientAccessKey: string | undefined;\n /**\n * Renews credentials before they expire. Today it is fed the long-lived env\n * credential, so behaviour is unchanged; the point of the seam is that\n * `getClient()` no longer assumes the credential is immutable, which is what\n * short-lived prefix-confined STS credentials require.\n * See `.claude/plans/object-storage-root-credential-distribution.md`.\n */\n private credentialProvider: StorageCredentialProvider | null = null;\n /**\n * The object store's topology (endpoint, port, ssl, bucket, key prefix), read\n * from resolved application configuration on every use.\n *\n * ## Why configuration and not `process.env`\n *\n * Topology is platform-injected material, exactly like `database.mongodb.host`,\n * and configuration is where platform-injected material belongs: it is the one\n * seam that can later be served over the wire instead of baked into a `.env`\n * file. The environment is still the SOURCE — `buildStorageTopologyFromEnvironment`\n * reads it — but it is read once, at configuration construction, rather than by\n * each consumer.\n *\n * Resolved lazily on every use rather than captured at construction. The bucket\n * used to be a class field initializer, evaluated during DI wiring — before\n * application configuration exists — which is precisely why a construction-time\n * capture cannot be the source here.\n * See `.claude/plans/application-runtime-topology-delivery.md`.\n *\n * Returns `undefined` when no managed store is configured; callers fail with a\n * precise CONFIGURATION error rather than inventing a default, because a\n * plausible default would make an unconfigured runtime look configured and fail\n * later at an object operation.\n */\n private get managedConnection(): AppConfiguration_Storage_ManagedConnection | undefined {\n return this.appConfigService.config.storage?.managed;\n }\n\n /**\n * The bucket. Not optional in practice: reached only from paths that have\n * already resolved a client, and therefore already proved a managed\n * connection exists. The fallback exists so an error-formatting path\n * (`convertStorageError`) can name the bucket without being able to throw a\n * second error while reporting the first.\n */\n private get bucketName(): string {\n return this.managedConnection?.bucket ?? STORAGE_DEFAULTS.BUCKET;\n }\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger)\n private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService)\n private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService)\n private readonly appConfigService: AppConfigurationService,\n /**\n * OPTIONAL override for how credentials are obtained — appended LAST so no\n * existing construction site shifts.\n *\n * Unbound (the common case) the provider fetches sessions from apps-manager\n * over HTTP. A runtime CO-LOCATED with the issuer binds an in-process resolver\n * instead: same broker, same prefix-confined session policy, same short-lived\n * credential — no network hop, and therefore no dependency on a listener that\n * may not exist yet.\n *\n * Optional deliberately, and the default is the SAFE case: omitting it yields\n * the ordinary remote fetch. Only the co-located runtime opts out, and it must\n * do so explicitly.\n */\n @inject(SAAS_SERVICE_TYPES.StorageCredentialResolver) @optional()\n private readonly credentialResolverOverride?: StorageCredentialResolver,\n ) {}\n\n /**\n * ⚠️ Deliberately does NOT test `STORAGE_ACCESS_KEY` / `STORAGE_SECRET_KEY`.\n *\n * Those are the root credential this provider stopped consuming, and Step 2 of\n * the storage plan removes them from generated env entirely. Leaving them in\n * this predicate would mean storage silently reports itself UNCONFIGURED the\n * moment they are removed — the file feature would disable itself with no\n * error, which is far worse than failing loudly.\n *\n * What storage now needs is the endpoint plus the bootstrap contract by which\n * credentials are fetched.\n *\n * The endpoint and the caller's own identity come from CONFIGURATION; the two\n * apps-manager REACHABILITY values stay in the ENVIRONMENT, deliberately — a URL\n * and a secret are what a process needs before it can fetch anything at all,\n * configuration included, so they cannot themselves be delivered as\n * configuration.\n *\n * ## Why identity is NOT `process.env.APPLICATION_ID`\n *\n * It used to be, while the object-key builder read\n * `appConfigService.applicationId` — two sources for one concept. They agree for\n * an application (the loader seeds config from that env var) and they do NOT\n * agree for a platform service, which resolves its identity locally and has no\n * `APPLICATION_ID` in env at all. That split is F-G: every platform service\n * reported storage UNCONFIGURED on the env conjunct, the router skipped it in\n * silence, and module-registry publish has been dead since. Reading the same\n * source the operation addresses removes the disagreement by construction —\n * and it needs no new environment variable, so nothing changes at env-generation\n * time. See `.claude/plans/object-storage-root-credential-distribution.md`.\n *\n * Reading configuration here can throw `app_configuration_not_initialized`, and\n * that is left unsoftened on purpose: answering `false` for \"configuration is\n * not loaded yet\" is indistinguishable from \"this application has no file\n * feature\", and the router would SKIP the provider in silence. Every caller was\n * enumerated and runs after configuration init.\n */\n isConfigured(): boolean {\n return !!this.managedConnection?.endpoint && this.hasUsableCredentialSource();\n }\n\n /**\n * Whether SOME credential source can serve this runtime.\n *\n * The split matters: the four-var bootstrap contract is a property of the HTTP\n * resolver, not of storage. Testing it unconditionally made the predicate ask\n * \"can I reach apps-manager?\" of a runtime that does not need to — which is how\n * a co-located runtime with a perfectly good in-process source would still\n * report UNCONFIGURED and be skipped by the router.\n */\n private hasUsableCredentialSource(): boolean {\n // An injected resolver IS the source; it needs nothing from the environment.\n if (this.credentialResolverOverride) return true;\n\n return !!process.env.PLATFORM_APPS_MANAGER_URL\n && !!process.env.PLATFORM_APPLICATION_PRIMARY_SECRET\n // ⚠️ REVERTED 2026-08-12, and the env read is LOAD-BEARING here — do not\n // \"clean it up\" to the configuration identity without reading this first.\n //\n // Identity was briefly taken from configuration, to close the dual-source\n // split described on the resolver. That is the right end state and it caused\n // an OUTAGE, because it made this predicate true for PLATFORM services — and\n // apps-manager is the STS ISSUER. It then fetched its own storage credentials\n // from itself, over HTTP, BEFORE its own listener existed: a guaranteed\n // `ECONNREFUSED`, not a race. `healthCheck()` never retried, so storage stayed\n // unhealthy for the process lifetime and `/health/ready` answered 503 forever\n // — the exact state the comment there warns about.\n //\n // Absence of `APPLICATION_ID` in a platform env is therefore doing real work\n // today: it is what keeps a platform service out of a client relationship with\n // itself. Single-sourcing the identity is safe only once (a) the platform-plane\n // STS door exists and (b) the issuer is excluded from being its own client.\n // Until then this stays an env read. See F-G in\n // `.claude/plans/object-storage-root-credential-distribution.md`.\n && !!process.env.APPLICATION_ID;\n }\n\n /**\n * The credential source, built lazily so env is read at first use rather than\n * at construction — preserving the pre-existing behaviour that tests and\n * dynamic relayers rely on to re-use one instance under different env contexts.\n *\n * Credentials come from apps-manager as short-lived, prefix-confined STS\n * sessions. The env resolver that preceded this was DELETED rather than kept as\n * a fallback: a fallback would fire on any transient apps-manager hiccup,\n * succeed with the ROOT credential, and leave no signal that the confinement\n * had been bypassed.\n */\n private getCredentialProvider(): StorageCredentialProvider {\n if (this.credentialProvider) return this.credentialProvider;\n\n this.credentialProvider = new StorageCredentialProvider(\n this.credentialResolverOverride\n // Identity from CONFIGURATION, single-sourced with the object-key builder\n // (`resolveStorageApplicationIdentity`) rather than re-read from env.\n ?? createStsStorageCredentialResolver(() => resolveStorageApplicationIdentity(this.appConfigService)),\n );\n return this.credentialProvider;\n }\n\n /**\n * Eagerly initialize the MinIO client and verify bucket access.\n * Call this at startup to fail fast on misconfiguration.\n * If not called, the client is created lazily on first operation.\n */\n async initialize(): Promise<void> {\n await this.getClient();\n }\n\n /**\n * Obtain (and renew) the session credential WITHOUT building a client.\n *\n * Split out of `getClient()` so the object-key authorization guard can run\n * before any minio client exists. The guard needs the CONFINED applicationId,\n * which only arrives with the credential — so the order has to be\n * credentials → guard → client, not guard → credentials → client.\n *\n * The pinned property survives: no client is constructed for a rejected\n * `storageRef`. What changes is that a rejected ref now costs a credential\n * LOOKUP — which `StorageCredentialProvider` caches for the session lifetime,\n * so in practice it is a cache read rather than a round trip.\n *\n * Config is validated FIRST so an unconfigured runtime fails with a precise\n * CONFIGURATION error rather than an opaque credential one, and does not make a\n * pointless apps-manager round-trip on its way to failing.\n */\n private async ensureCredentials(): Promise<ResolvedStorageCredentials> {\n const connection = this.managedConnection;\n const endpoint = connection?.endpoint;\n const port = connection?.port ?? INFRA_DEFAULT_PORTS.MINIO;\n const useSSL = connection?.useSsl ?? false;\n\n // Configuration is validated BEFORE credentials are fetched — both so an\n // unconfigured runtime fails with a precise CONFIGURATION error rather than\n // an opaque credential error, and so it does not make a pointless\n // apps-manager round-trip on its way to failing.\n //\n // The required set changed with the credential source: the storage keys are\n // gone (they were the ROOT credential) and what is needed now is the\n // endpoint plus the bootstrap contract used to fetch session credentials.\n if (!endpoint || !this.isConfigured()) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message:\n 'Incomplete managed storage configuration. Required: storage.managed.endpoint (from STORAGE_ENDPOINT), '\n + 'PLATFORM_APPS_MANAGER_URL, PLATFORM_APPLICATION_PRIMARY_SECRET, APPLICATION_ID',\n hasEndpoint: !!endpoint,\n hasAppsManagerUrl: !!process.env.PLATFORM_APPS_MANAGER_URL,\n hasPrimarySecret: !!process.env.PLATFORM_APPLICATION_PRIMARY_SECRET,\n // Env, matching `isConfigured()` — the flag must name the SAME source\n // the predicate gates on, or the diagnostic sends the reader to a\n // value that was never the cause.\n hasApplicationId: !!process.env.APPLICATION_ID,\n },\n }\n );\n }\n\n // Renew, THEN decide whether the cached client is still usable. Checking the\n // cache first would return a client bound to an expired session and the\n // failure would surface as an opaque auth error mid-upload.\n let credentials;\n try {\n credentials = await this.getCredentialProvider().getCredentials();\n } catch (error) {\n // Fail closed, but as a typed CONFIGURATION error so callers and the\n // readiness probe can classify it — not as a bare Error escaping from the\n // resolver.\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n operation: 'acquire_storage_credentials',\n message: 'Could not obtain object storage session credentials from apps-manager.',\n error: describeCaughtError(error),\n },\n }\n );\n }\n\n return credentials;\n }\n\n /**\n * The minio client for the CURRENT credential, rebuilt when that credential\n * changes. Renew first, THEN decide whether the cached client is still usable:\n * checking the cache first would return a client bound to an expired session and\n * the failure would surface as an opaque auth error mid-upload.\n */\n private async getClient(): Promise<Client> {\n const credentials = await this.ensureCredentials();\n const connection = this.managedConnection;\n const endpoint = connection?.endpoint ?? '';\n const port = connection?.port ?? INFRA_DEFAULT_PORTS.MINIO;\n const useSSL = connection?.useSsl ?? false;\n\n if (this.client && this.clientAccessKey === credentials.accessKey) {\n return this.client;\n }\n\n const endpointUrl = endpoint.includes('://')\n ? new URL(endpoint)\n : new URL(`http${useSSL ? 's' : ''}://${endpoint}`);\n\n const options: ClientOptions = {\n endPoint: endpointUrl.hostname,\n port: endpointUrl.port ? parseInt(endpointUrl.port, 10) : port,\n useSSL: useSSL || endpointUrl.protocol === 'https:',\n accessKey: credentials.accessKey,\n secretKey: credentials.secretKey,\n // Present only for an STS session credential; a long-lived credential\n // carries none and the field stays undefined.\n ...(credentials.sessionToken ? { sessionToken: credentials.sessionToken } : {}),\n region: DEFAULT_STORAGE_REGION,\n // Keeps every upload on the single-PutObject path. The multipart branch\n // opens with a BUCKET-level ListMultipartUploads that a prefix-confined\n // session cannot be granted — see MAX_SINGLE_PUT_OBJECT_SIZE_BYTES.\n partSize: PART_SIZE_BYTES,\n };\n\n const client = new Client(options);\n\n // ⚠️ NO `bucketExists()` PROBE HERE — deliberately. This is F-D.\n //\n // The probe used to live here (and before that, `makeBucket()`). Under a\n // prefix-confined session credential it can NEVER succeed: `bucketExists()`\n // issues HeadBucket, which S3 authorises via `s3:ListBucket`, and the session\n // policy grants `ListBucket` only under `Condition StringLike s3:prefix`.\n // HeadBucket carries no prefix, so the condition cannot match and the call is\n // refused `AccessDenied` — on a credential whose object operations work\n // perfectly. Keeping it broke EVERY file operation in dev, in the backend and\n // in every minion, with a message pointing at credentials rather than at the\n // probe.\n //\n // Do NOT \"fix\" this by adding an unconditioned `ListBucket` to the policy.\n // That is the tempting repair and it re-grants bucket-wide enumeration —\n // every other application's object keys — to close a check that buys nothing:\n // bucket existence is already guaranteed platform-side by\n // `ObjectStorageStsBrokerService.ensureBucketExists()`, which runs with admin\n // rights on the credential-issuance path immediately before this client is\n // built. A missing bucket now surfaces at the first real operation, which is\n // where a genuine storage fault belongs.\n //\n // See `.claude/plans/object-storage-root-credential-distribution.md` (F-D).\n\n this.client = client;\n // Stamped together with the client so the cache check above can tell a\n // still-valid client from one bound to a superseded credential.\n this.clientAccessKey = credentials.accessKey;\n return client;\n }\n\n /**\n * The application identity object keys are built from — taken from the CREDENTIAL,\n * i.e. the subject the issuer confined the session policy to.\n *\n * Not `resolveStorageApplicationIdentity(appConfigService)`. That was the client's\n * own answer to the same question, and when the two disagreed the credential was\n * confined to one subtree while the client addressed another — every operation\n * failing `Valid and authorized credentials required` with both halves passing\n * their own tests. `assertPolicySafeApplicationId` requires a 24-hex ObjectId, so\n * the policy side cannot be bent to match the client; the client must take the\n * issuer's value.\n *\n * FAILS CLOSED when the issuer supplied none. Falling back to the local identity\n * is precisely the reintroduction of the split — it would work for applications\n * (where the two happen to agree) and silently mis-address for everything else,\n * which is the failure mode that took a day to find.\n */\n private async getApplicationId(executionContext: ExecutionContext<any>): Promise<string> {\n const credentials = await this.ensureCredentials();\n const applicationId = credentials.applicationId;\n\n if (!applicationId) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n operation: 'resolve_confined_application_identity',\n message:\n 'The object storage credential did not name the application it is confined to, so no '\n + 'object key can be addressed. The issuer must return `applicationId` alongside the '\n + 'session credential.',\n },\n }\n );\n }\n\n validateAppId(applicationId, this.errorBuilder, executionContext, 'applicationId');\n return applicationId;\n }\n\n /**\n * Resolve the canonical app-level object-key namespace prefix\n * (Slice 3.6).\n *\n * Sourced from `storage.managed.bucketPrefix`, which the configuration loader\n * seeds from `STORAGE_BUCKET_PREFIX`, originating from\n * `wildo.saas.config.dataServices.s3.bucketPrefix`. When set, every\n * application object key produced by `resolveApplicationObjectKey()`\n * (and every authorized `storageRef` it accepts) is prefixed with\n * `${bucketPrefix}/`. The bucket itself remains infra-controlled — N apps\n * can share one bucket with disjoint object trees.\n *\n * Cosmetic only: tenant isolation is enforced by the session policy, which\n * keys on the platform-minted `applicationId` and never on this value.\n *\n * Read lazily on every call (rather than cached at construction) so a\n * configuration change is observed without rebuilding the provider.\n */\n private resolveBucketPrefix(): string {\n const raw = this.managedConnection?.bucketPrefix;\n if (!raw) return '';\n const trimmed = raw.trim();\n return trimmed.length === 0 ? '' : `${trimmed.replace(/\\/+$/, '')}/`;\n }\n\n /**\n * Refuse any key fragment carrying a `.` or `..` segment.\n *\n * ## Why the managed provider needs this at all\n *\n * The local-directory provider has always had a traversal guard\n * (`resolveSafePathFromRelative`: `path.resolve` + a `startsWith(base + sep)` check). This\n * provider had NONE — an S3 key is an opaque string, never resolved by a filesystem, so a `..`\n * segment cannot escape a bucket and the guard looked unnecessary. It is not, for two reasons:\n *\n * 1. **The read guard below is textual.** `startsWith(expectedPrefix)` is satisfied by\n * `applications/<app>/files/x/../../../elsewhere/y`, so a stored ref carrying traversal passes\n * the one check that exists — and a future consumer that DOES normalize the key (a mirror to a\n * filesystem, an archive extraction, a signed-URL rewriter) inherits a ref that was never\n * checked.\n * 2. **A prefix is the tenant boundary here.** `<scope>/<scopeId>` exists so erasure, orphan\n * sweeps and per-tenant listing are prefix operations. A key whose literal text contains `..`\n * still lands under the prefix it was composed from, but it is unreadable as a path and no\n * normalizing tool downstream agrees with the sweep about which tenant owns it.\n *\n * The invariant is enforced HERE rather than at the resolver because `StorageUploadOptions` has\n * more than one producer: `FileStoragePathResolverBackendService` sanitizes (and is the only\n * app-authored source), but the audit-archive batch composes its own `folderPath` and never\n * passes through that sanitizer. This method is the single point every key — upload composition\n * AND every stored `storageRef` on download/delete/metadata — must pass.\n *\n * Fail-closed with AUTHORIZATION, matching the local provider's verdict for the same input, so\n * one authored value cannot mean two different things depending on which provider is bound.\n */\n private assertNoTraversalSegments(\n candidate: string,\n executionContext: ExecutionContext<any>,\n diagnostics: Record<string, unknown>,\n ): void {\n const hasTraversalSegment = candidate\n .split('/')\n .some((segment) => segment === '.' || segment === '..');\n\n if (!hasTraversalSegment) {\n return;\n }\n\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_PATH_TRAVERSAL_DETECTED,\n context: {\n // diagnostic (log-only)\n ...diagnostics,\n candidate,\n provider: this.providerId,\n },\n }\n );\n }\n\n private async resolveApplicationObjectKey(\n fileId: string,\n executionContext: ExecutionContext<any>,\n storageRef?: string,\n linkedResourceType?: ResourceType,\n fileScope?: FileScopeIdentifiers,\n ): Promise<string> {\n // Checked BEFORE the application identity is resolved: a traversal segment is a refusal that\n // needs no credential, and paying an apps-manager STS round trip to reject it would let a\n // hostile key fragment drive outbound requests.\n this.assertNoTraversalSegments(fileId, executionContext, { fileId, source: 'composed_key' });\n\n const applicationId = await this.getApplicationId(executionContext);\n const bucketPrefix = this.resolveBucketPrefix();\n // Explicit staging segment, never a fallthrough. A blob with no resource type is NOT placed\n // under some default resource — it lands in `_unlinked/`, and stays there: late LINKING is\n // allowed (the row's `linkedResourceId` fills in later), late TYPE declaration is not, because\n // the key is derived once at create and the blob never moves.\n const storageName = linkedResourceType\n ? resolveSharedPersistenceCollectionName(linkedResourceType)\n : UNLINKED_STORAGE_SEGMENT;\n const { scope, scopeId } = resolveScopeSegments(fileScope, applicationId);\n const defaultKey =\n bucketPrefix\n + API_ROUTES_BACKEND_DEFINITIONS.FILE_STORAGE.STORAGE_KEY_APPLICATION_FILE(applicationId, fileId, storageName, scope, scopeId);\n\n if (!storageRef) {\n return defaultKey;\n }\n\n const normalizedStorageRef = storageRef.trim();\n if (!normalizedStorageRef) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_STORAGE_REF_INVALID,\n context: {\n // diagnostic (log-only)\n fileId,\n applicationId,\n },\n }\n );\n }\n\n // A stored ref is checked for traversal too, not only the freshly-composed key. The prefix\n // check below is TEXTUAL, so `applications/<app>/files/x/../../../elsewhere/y` satisfies it;\n // the row it came from is not a trusted source just because it is persisted.\n this.assertNoTraversalSegments(normalizedStorageRef, executionContext, { fileId, applicationId, source: 'stored_storage_ref' });\n\n // The guard confines to the APPLICATION subtree, deliberately NOT to this call's resource\n // segment. A read of an already-stored blob supplies no `linkedResourceType`, so keying the\n // guard on the current call would reject every legitimate read of a linked file. Per-resource\n // confinement is the session policy's job (it is minted per principal); this guard's job is\n // that a `storageRef` from a row cannot escape the application.\n const expectedPrefix =\n bucketPrefix\n + `applications/${applicationId}/files/`;\n if (!normalizedStorageRef.startsWith(expectedPrefix)) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_STORAGE_REF_FORBIDDEN,\n context: {\n // diagnostic (log-only)\n fileId,\n applicationId,\n storageRef: normalizedStorageRef,\n expectedPrefix,\n },\n }\n );\n }\n\n return normalizedStorageRef;\n }\n\n private convertStorageError(\n error: unknown,\n operation: 'upload' | 'download' | 'delete' | 'metadata',\n executionContext: ExecutionContext<any> | undefined,\n context: Record<string, unknown>,\n ): never {\n if (isWildoBackendError(error)) {\n throw error;\n }\n\n const errorMessage = describeCaughtError(error);\n // Classify on the S3 error CODE first; the message is a fallback only.\n //\n // A message is prose an SDK is free to reword, and matching on substrings has\n // two real failure modes here: a benign message containing \"not found\" is\n // misread as a missing object, and — the one F-D made concrete — a genuine\n // `AccessDenied` whose message is phrased differently escapes classification\n // entirely and surfaces as a generic connectivity error, pointing the reader\n // at the wrong subsystem. The minio client exposes `code` on its errors, so\n // the reliable signal is available and was simply not being used.\n const errorCode = resolveStorageErrorCode(error);\n const errorMessageLower = errorMessage.toLowerCase();\n\n if (\n errorCode === 'NoSuchKey'\n || errorCode === 'NotFound'\n || errorCode === 'NoSuchBucket'\n || (!errorCode && (errorMessageLower.includes('nosuchkey') || errorMessageLower.includes('not found')))\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_NOT_FOUND_IN_STORAGE,\n context: {\n // diagnostic (log-only)\n operation,\n ...context,\n },\n }\n );\n }\n\n if (\n errorCode === 'AccessDenied'\n || errorCode === 'Forbidden'\n || errorCode === 'SignatureDoesNotMatch'\n || errorCode === 'InvalidAccessKeyId'\n || errorCode === 'ExpiredToken'\n || errorCode === 'InvalidToken'\n || (!errorCode && (\n errorMessageLower.includes('accessdenied')\n || errorMessageLower.includes('access denied')\n || errorMessageLower.includes('forbidden')\n || errorMessageLower.includes('signaturedoesnotmatch')\n || errorMessageLower.includes('invalidaccesskeyid')\n ))\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_STORAGE_ACCESS_DENIED,\n context: {\n // diagnostic (log-only)\n operation,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n if (\n errorMessageLower.includes('bucketnotfound')\n || errorMessageLower.includes('invalidbucketname')\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message: 'Managed storage bucket configuration error',\n operation,\n bucketName: this.bucketName,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n if (\n errorMessageLower.includes('connection')\n || errorMessageLower.includes('timeout')\n || errorMessageLower.includes('econnrefused')\n || errorMessageLower.includes('network')\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.NETWORK,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.NETWORK,\n context: {\n message: 'Managed storage connection failed',\n operation,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n if (\n errorMessageLower.includes('stream')\n || errorMessageLower.includes('pipe')\n || errorMessageLower.includes('readable')\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.EXTERNAL_SERVICE,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.EXTERNAL_SERVICE,\n context: {\n message: 'File stream error during storage operation',\n operation,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n throw this.errorBuilder.buildError(\n ErrorType.EXTERNAL_SERVICE,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.EXTERNAL_SERVICE,\n context: {\n message: `Managed storage operation failed: ${operation}`,\n operation,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n async upload(\n fileStream: Readable,\n fileId: string,\n mimeType: string,\n size: number,\n executionContext: ExecutionContext<any>,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult> {\n validateFileId(fileId, this.errorBuilder, executionContext, 'fileId');\n validateContentType(mimeType, this.errorBuilder, executionContext, 'mimeType');\n validateSize(\n size,\n resolveConfiguredMaxFileSize(this.appConfigService.config.storage?.maxFileSize),\n this.errorBuilder,\n executionContext,\n 'size',\n );\n validateStream(fileStream, this.errorBuilder, executionContext, 'fileStream');\n\n // Above this, the client would take the multipart branch, whose opening\n // ListMultipartUploads call a prefix-confined session cannot perform — the\n // store would answer a bare `AccessDenied` that reads as a credential fault.\n // Refuse here instead, naming the real reason. Reachable only when an\n // application configures `storage.maxFileSize` above the single-PUT ceiling;\n // `validateSize` has already applied that configured limit.\n // See MAX_SINGLE_PUT_OBJECT_SIZE_BYTES.\n if (size > MAX_SINGLE_PUT_OBJECT_SIZE_BYTES) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n // Same reference `validateContentLength` uses for a size violation —\n // this IS one, just against a provider ceiling rather than the\n // application's configured limit.\n customMessageReference: ErrorCustomMessageReference.CONTENT_LENGTH_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fileId,\n size,\n reason: 'exceeds_single_put_ceiling',\n maxSinglePutSize: MAX_SINGLE_PUT_OBJECT_SIZE_BYTES,\n message:\n 'Object exceeds the single-PutObject ceiling for managed storage. Managed storage cannot use '\n + 'multipart upload under a prefix-confined credential; lower storage.maxFileSize to at most '\n + `${MAX_SINGLE_PUT_OBJECT_SIZE_BYTES} bytes.`,\n },\n }\n );\n }\n\n const leafName = (options?.fileName?.trim()) || fileId;\n const folderPath = options?.folderPath?.trim();\n const effectiveFileId = folderPath\n ? `${folderPath}/${leafName}`\n : leafName;\n\n if (!effectiveFileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_STORAGE_KEY_COMPOSITION_FAILED,\n }\n );\n }\n\n const includeAppId = options?.includeApplicationId ?? true;\n const key = includeAppId\n ? await this.resolveApplicationObjectKey(effectiveFileId, executionContext, undefined, options?.linkedResourceType, options?.scope)\n : effectiveFileId;\n const client = await this.getClient();\n\n try {\n await client.putObject(\n this.bucketName,\n key,\n fileStream,\n size,\n {\n [WildoHeaderKeys.CONTENT_TYPE]: mimeType,\n },\n );\n } catch (error) {\n this.convertStorageError(error, 'upload', executionContext, {\n fileId,\n storageRef: key,\n provider: this.providerId,\n });\n }\n\n return {\n storageRef: key,\n provider: this.providerId,\n };\n }\n\n async download(\n file: StoredFileStorageTarget,\n executionContext: ExecutionContext<any>,\n ): Promise<StorageDownloadResult> {\n const key = await this.resolveApplicationObjectKey(file.fileId, executionContext, file.storageRef);\n const client = await this.getClient();\n let stream: Readable;\n let metadata: StorageFileMetadata;\n\n try {\n const stat = await client.statObject(this.bucketName, key);\n const contentType = stat.metaData[WildoHeaderKeys.CONTENT_TYPE];\n if (!contentType) {\n throw this.errorBuilder.buildError(\n ErrorType.EXTERNAL_SERVICE,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.EXTERNAL_SERVICE,\n context: {\n message: `Managed storage object metadata missing required ${WildoHeaderKeys.CONTENT_TYPE}`,\n fileId: file.fileId,\n storageRef: key,\n },\n },\n );\n }\n\n stream = await client.getObject(this.bucketName, key);\n metadata = {\n contentType,\n size: stat.size,\n etag: stat.etag,\n lastModified: stat.lastModified,\n };\n } catch (error) {\n this.convertStorageError(error, 'download', executionContext, {\n fileId: file.fileId,\n storageRef: key,\n provider: this.providerId,\n });\n }\n\n return {\n stream,\n contentType: metadata.contentType,\n size: metadata.size,\n etag: metadata.etag,\n lastModified: metadata.lastModified,\n };\n }\n\n async delete(\n file: StoredFileStorageTarget,\n executionContext: ExecutionContext<any>,\n ): Promise<void> {\n const key = await this.resolveApplicationObjectKey(file.fileId, executionContext, file.storageRef);\n const client = await this.getClient();\n\n try {\n await client.removeObject(this.bucketName, key);\n } catch (error) {\n // Same code-first classification as `convertStorageError`: a delete of an\n // already-absent object is a no-op, but only when the store actually said\n // so. Inferring it from prose can swallow a real failure.\n const deleteErrorCode = resolveStorageErrorCode(error);\n const errorMessageLower = describeCaughtError(error).toLowerCase();\n if (\n deleteErrorCode === 'NoSuchKey'\n || deleteErrorCode === 'NotFound'\n || (!deleteErrorCode && (errorMessageLower.includes('nosuchkey') || errorMessageLower.includes('not found')))\n ) {\n return;\n }\n this.convertStorageError(error, 'delete', executionContext, {\n fileId: file.fileId,\n storageRef: key,\n provider: this.providerId,\n });\n }\n }\n\n async getMetadata(\n file: StoredFileStorageTarget,\n executionContext: ExecutionContext<any>,\n ): Promise<StorageFileMetadata> {\n const key = await this.resolveApplicationObjectKey(file.fileId, executionContext, file.storageRef);\n const client = await this.getClient();\n\n try {\n const stat = await client.statObject(this.bucketName, key);\n const contentType = stat.metaData[WildoHeaderKeys.CONTENT_TYPE];\n if (!contentType) {\n throw this.errorBuilder.buildError(\n ErrorType.EXTERNAL_SERVICE,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.EXTERNAL_SERVICE,\n context: {\n message: `Managed storage object metadata missing required ${WildoHeaderKeys.CONTENT_TYPE}`,\n fileId: file.fileId,\n storageRef: key,\n },\n },\n );\n }\n\n return {\n contentType,\n size: stat.size,\n etag: stat.etag,\n lastModified: stat.lastModified,\n };\n } catch (error) {\n this.convertStorageError(error, 'metadata', executionContext, {\n fileId: file.fileId,\n storageRef: key,\n provider: this.providerId,\n });\n }\n }\n\n // =========================================================================\n // Health check\n // =========================================================================\n\n async healthCheck(): Promise<StorageProviderHealthResult> {\n const startTime = Date.now();\n\n // RECOVER, don't just report. This used to `return { healthy: false }` on a\n // null client and never try again — which turned any transient startup failure\n // into a PERMANENT one: `initialize()` runs once, so a client that failed to\n // build at boot was never rebuilt, storage stayed unhealthy for the process\n // lifetime, and `/health/ready` answered 503 forever while `/health` looked\n // fine. That is the documented \"port open + /health healthy + /health/ready 503\n // forever\" state (`platform/CLAUDE.md`), reached without any ongoing fault.\n //\n // Observed exactly that way on apps-manager: the credential fetch was refused\n // at boot, the listener came up 0.4s later, and nothing retried. A readiness\n // probe is the natural retry point — it is called repeatedly, by design, and a\n // dependency that has come back should be allowed to say so.\n //\n // `getClient()` is idempotent and caches, so a healthy probe costs no extra\n // work; a still-failing one reports the CURRENT reason instead of the stale\n // \"not initialized\".\n if (!this.client) {\n try {\n await this.getClient();\n } catch (error) {\n return { healthy: false, latency: Date.now() - startTime, error: describeCaughtError(error) };\n }\n }\n\n /**\n * Declared OUTSIDE the try so the credential-rejection retry below can probe the SAME key.\n * Recomputing it there would ask a different question than the one that just failed.\n */\n let probeKey = '';\n\n try {\n // ⚠️ Probes with an OBJECT-level call, not `bucketExists()`. Second site of\n // F-D, and the more damaging one: this is the readiness dependency behind\n // `/health/ready`, so a probe the credential cannot satisfy produces the\n // documented \"port open + /health healthy + /health/ready 503 forever\"\n // state (see `platform/CLAUDE.md`) — with remote clients looping on\n // \"Remote API not ready\" and nothing pointing at storage.\n //\n // `bucketExists()` issues HeadBucket, authorised by an UNCONDITIONED\n // `s3:ListBucket`. The session policy grants `ListBucket` only under\n // `Condition StringLike s3:prefix`, and HeadBucket sends no prefix, so it\n // can never pass. `statObject` on a key inside this application's own\n // prefix is authorised by the policy's object statements, which is what the\n // credential is actually for.\n //\n // A `NoSuchKey` reply is the HEALTHY answer: it proves the store was\n // reached AND the credential was accepted. Only a real refusal or transport\n // failure is unhealthy.\n // The probe key must sit inside the prefix the CREDENTIAL covers, not the\n // one the client would have guessed — otherwise readiness fails `AccessDenied`\n // on a perfectly good credential and blames storage. Same identity source as\n // every real operation, for the same reason.\n const probeApplicationId = (await this.ensureCredentials()).applicationId\n ?? this.appConfigService.applicationId;\n probeKey = `${this.resolveBucketPrefix()}`\n + API_ROUTES_BACKEND_DEFINITIONS.FILE_STORAGE.STORAGE_KEY_APPLICATION_FILE(\n probeApplicationId,\n '__storage_healthcheck__',\n // The probe has no File row and no resource. It must sit under the SAME staging segment\n // a real unlinked blob uses — once the session policy narrows per resource, a probe key\n // outside every granted prefix would fail `AccessDenied` on a perfectly good credential\n // and report storage unhealthy.\n UNLINKED_STORAGE_SEGMENT,\n ResourcePrimaryScope.APPLICATION,\n probeApplicationId,\n );\n\n // `this.client!` — the recovery branch above either populated it or returned.\n await this.client!.statObject(this.bucketName, probeKey);\n return { healthy: true, latency: Date.now() - startTime };\n } catch (error) {\n const code = resolveStorageErrorCode(error);\n if (code === 'NoSuchKey' || code === 'NotFound') {\n return { healthy: true, latency: Date.now() - startTime };\n }\n\n /**\n * A credential the STORE REJECTS is re-acquired, not held until it expires.\n *\n * The provider refreshes on EXPIRY only — its contract says so explicitly (\"Refresh before\n * expiry, not after failure\"), and that is right for the ordinary case: callers should never\n * observe an expired credential. But it leaves one state unrecoverable, and this is the probe\n * that meets it. A session can become invalid while still unexpired — the object store\n * restarts and forgets its STS sessions, or the parent credential rotates underneath it. The\n * cached credential then stays \"fresh\" by the clock and is refused by the store on every call.\n *\n * Measured 2026-08-22: THREE platform runtimes (crontabs, apps-manager, the dev companion)\n * held such a credential for ~27 HOURS. `/health` stayed 200 while `/health/ready` answered\n * 503 the whole time, and the application backend logged `Remote API not ready` 2,384 times\n * against one of them. Restarting each process cleared it — which is the definition of a\n * defect that requires manual intervention, and it is exactly the state\n * `platform/CLAUDE.md` describes as \"port open + /health healthy + /health/ready 503 forever\".\n *\n * `StorageCredentialProvider.invalidate()` existed for precisely this — its own JSDoc says\n * \"for an explicit re-acquire after a hard failure\" — and NOTHING called it, in production or\n * in a test. A capability with no door: the third found in this workstream, after\n * `usePostgreSQL` and `MongoDBService.overrideUri`.\n *\n * Retried ONCE, and only for a rejection that names a credential problem. A blanket retry\n * would mask a genuine outage as latency, and a retry loop on a store that is simply down\n * would turn a readiness probe into a stall. One attempt distinguishes \"this credential is\n * stale\" from \"the store is unreachable\", which is the only question this probe has to answer.\n */\n if (this.isCredentialRejection(code, error)) {\n this.credentialProvider?.invalidate();\n this.client = null;\n this.clientAccessKey = undefined;\n\n try {\n const retryClient = await this.getClient();\n await retryClient.statObject(this.bucketName, probeKey);\n this.logger.info(\n 'Object storage credential was refused and has been re-acquired; storage is healthy again.',\n );\n return { healthy: true, latency: Date.now() - startTime };\n } catch (retryError) {\n const retryCode = resolveStorageErrorCode(retryError);\n if (retryCode === 'NoSuchKey' || retryCode === 'NotFound') {\n this.logger.info(\n 'Object storage credential was refused and has been re-acquired; storage is healthy again.',\n );\n return { healthy: true, latency: Date.now() - startTime };\n }\n return {\n healthy: false,\n latency: Date.now() - startTime,\n error: describeCaughtError(retryError),\n };\n }\n }\n\n return { healthy: false, latency: Date.now() - startTime, error: describeCaughtError(error) };\n }\n }\n\n /**\n * Whether a failure says \"this CREDENTIAL is not accepted\" rather than \"the STORE is unavailable\".\n *\n * Only the first is worth re-acquiring for. The distinction is made on the error CODE where the\n * client supplies one, and falls back to the message otherwise — MinIO answers a rejected STS\n * session with `Valid and authorized credentials required`, which carries no S3 error code, and\n * that exact string is what the three stuck runtimes reported for 27 hours.\n */\n private isCredentialRejection(code: string | undefined, error: unknown): boolean {\n const CREDENTIAL_REJECTION_CODES = new Set([\n 'AccessDenied',\n 'InvalidAccessKeyId',\n 'SignatureDoesNotMatch',\n 'ExpiredToken',\n 'InvalidToken',\n 'TokenRefreshRequired',\n 'AuthorizationHeaderMalformed',\n ]);\n if (code && CREDENTIAL_REJECTION_CODES.has(code)) return true;\n\n const message = error instanceof Error ? error.message : String(error ?? '');\n return /valid and authorized credentials required|security token|access denied|invalid access key/i\n .test(message);\n }\n}\n"]}
1
+ {"version":3,"file":"wildo-managed-storage-provider.backend.service.js","sourceRoot":"","sources":["../../../../../src/files/storage/wildo-managed-storage-provider.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Wildo-Managed Storage Provider\n *\n * Default IFileStorageProvider implementation backed by MinIO/S3.\n * All file operations go through z_file() declarations and the unified\n * IFileStorageProvider interface.\n *\n * Two inputs, from two different places, and the split is deliberate:\n * - TOPOLOGY (endpoint, port, ssl, bucket, key prefix) comes from resolved\n * application configuration (`storage.managed`), which the configuration\n * loader seeds from the environment.\n * - CREDENTIALS are short-lived, prefix-confined STS sessions fetched from\n * apps-manager per use. They never appear in configuration or in the\n * environment.\n */\n\nimport { injectable, inject, optional } from 'inversify';\nimport { Readable } from 'stream';\nimport { Client, ClientOptions } from 'minio';\nimport { ErrorType, ErrorCustomMessageReference, WildoHeaderKeys, isWildoBackendError } from '@wildo-ai/saas-models';\nimport { FileStorageAccepted } from '@wildo-ai/zod-decorators';\nimport { INFRA_DEFAULT_PORTS, STORAGE_DEFAULTS } from '@wildo-ai/platform-config-lib';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport type { AppConfiguration_Storage_ManagedConnection } from '~wildo-backend-lib/config/models/app-config.backend.schemas';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport { validateAppId, validateContentType, validateFileId, validateSize, validateStream, resolveConfiguredMaxFileSize } from '~wildo-backend-lib/files/utils/file-validation.utils';\nimport { API_ROUTES_BACKEND_DEFINITIONS } from '~wildo-backend-lib/requests/models/api-routes.backend.defintions';\nimport { ResourcePrimaryScope } from '@wildo-ai/saas-models';\nimport type { FileScopeIdentifiers, ResourceType } from '@wildo-ai/saas-models';\n\nimport { StorageCredentialProvider } from '~wildo-backend-lib/files/storage/storage-credential-provider.backend.utils';\nimport type { ResolvedStorageCredentials, StorageCredentialResolver } from '~wildo-backend-lib/files/storage/storage-credential-provider.backend.utils';\nimport { createStsStorageCredentialResolver } from '~wildo-backend-lib/files/storage/storage-sts-credential-resolver.backend.utils';\nimport { resolveStorageApplicationIdentity } from '~wildo-backend-lib/files/utils/storage-application-identity.backend.utils';\nimport {\n UNLINKED_STORAGE_SEGMENT,\n composeApplicationStorageKey,\n composeStorageLeafPath,\n storageKeyHasTraversalSegment,\n} from './application-storage-key.backend.utils';\nimport type {\n IFileStorageProvider,\n StorageUploadResult,\n StorageUploadOptions,\n StorageDownloadResult,\n StorageFileMetadata,\n StorageProviderHealthResult,\n StoredFileStorageTarget,\n} from './file-storage-provider.types';\n\nconst DEFAULT_STORAGE_REGION = 'us-east-1';\n\n/**\n * S3's maximum object size for a SINGLE `PutObject` request, and therefore the\n * largest object this provider can store under a prefix-confined credential.\n *\n * ## Why a prefix-confined credential cannot use multipart at all\n *\n * The minio client's multipart path opens with `findUploadId()`, which issues\n * **ListMultipartUploads** — a BUCKET-level operation authorised by\n * `s3:ListBucketMultipartUploads`. That action is not in the session policy, so\n * every upload large enough to take the multipart branch is refused\n * `AccessDenied` before a single byte is sent. Measured against live MinIO:\n * `CreateMultipartUpload` is allowed (it maps to `s3:PutObject`), while\n * `findUploadId` and `AbortMultipartUpload` are both refused.\n *\n * Granting the missing action is NOT an option, and not merely on preference —\n * MinIO rejects the policy outright: `s3:ListBucketMultipartUploads` does not\n * accept the `s3:prefix` condition key\n * (`InvalidParameterValue: unsupported condition keys '[s3:prefix]'`). The only\n * way to grant it is an UNCONDITIONED bucket-wide statement, which would expose\n * every other application's in-flight upload keys — the same tenant-structure\n * leak the conditioned `s3:ListBucket` exists to prevent.\n *\n * So the multipart branch is avoided rather than authorised: {@link PART_SIZE_BYTES}\n * is set high enough that no object this provider accepts can reach it, and\n * anything above this ceiling is refused here with a precise error rather than\n * an opaque `AccessDenied` from the store.\n *\n * See `.claude/plans/object-storage-root-credential-distribution.md` (F-D).\n */\nconst MAX_SINGLE_PUT_OBJECT_SIZE_BYTES = 5 * 1024 * 1024 * 1024;\n\n/**\n * Forces every upload onto the single-`PutObject` path — see\n * {@link MAX_SINGLE_PUT_OBJECT_SIZE_BYTES} for why multipart is unreachable.\n *\n * The client branches on `size <= partSize`, so pinning this to the single-PUT\n * ceiling makes the branch unreachable for any object the provider accepts.\n *\n * It costs no additional memory: the single-PUT path buffers `size` bytes, which\n * is bounded by the application's own configured `storage.maxFileSize`, not by\n * this value. What it does mean is that an upload is fully buffered rather than\n * streamed in chunks — acceptable at the 100 MB default ceiling, and the reason\n * `storage.maxFileSize` is the knob that governs storage memory pressure.\n */\nconst PART_SIZE_BYTES = MAX_SINGLE_PUT_OBJECT_SIZE_BYTES;\n\n/**\n * The S3/MinIO error CODE, when the thrown value carries one.\n *\n * Preferred over message matching everywhere in this file. The minio client sets\n * `code` (e.g. `AccessDenied`, `NoSuchKey`, `ExpiredToken`) on its errors, and a\n * code is a stable contract where a message is prose the SDK may reword between\n * releases. F-D is the concrete cost of getting this wrong: a real `AccessDenied`\n * whose message did not contain the expected substring was classified as a\n * generic connectivity failure, so the log blamed credentials and the actual\n * cause — an unauthorised HeadBucket probe — stayed invisible.\n *\n * Returns `undefined` for a plain `Error`, which is the signal for callers to\n * fall back to substring matching rather than mis-classify.\n */\nfunction resolveStorageErrorCode(error: unknown): string | undefined {\n const code = (error as { code?: unknown })?.code;\n return typeof code === 'string' && code.length > 0 ? code : undefined;\n}\n\n@injectable()\nexport class WildoManagedStorageProvider implements IFileStorageProvider {\n readonly providerId = FileStorageAccepted.WILDO_MANAGED;\n private client: Client | null = null;\n /**\n * Access key the cached {@link client} was built with. A storage client binds\n * its credentials at construction, so once those credentials can EXPIRE the\n * client must be rebuilt when they change — caching it unconditionally (as this\n * did while the credential was the never-changing root key) would keep using a\n * dead session until the process restarted.\n */\n private clientAccessKey: string | undefined;\n /**\n * Renews credentials before they expire. Today it is fed the long-lived env\n * credential, so behaviour is unchanged; the point of the seam is that\n * `getClient()` no longer assumes the credential is immutable, which is what\n * short-lived prefix-confined STS credentials require.\n * See `.claude/plans/object-storage-root-credential-distribution.md`.\n */\n private credentialProvider: StorageCredentialProvider | null = null;\n /**\n * The object store's topology (endpoint, port, ssl, bucket, key prefix), read\n * from resolved application configuration on every use.\n *\n * ## Why configuration and not `process.env`\n *\n * Topology is platform-injected material, exactly like `database.mongodb.host`,\n * and configuration is where platform-injected material belongs: it is the one\n * seam that can later be served over the wire instead of baked into a `.env`\n * file. The environment is still the SOURCE — `buildStorageTopologyFromEnvironment`\n * reads it — but it is read once, at configuration construction, rather than by\n * each consumer.\n *\n * Resolved lazily on every use rather than captured at construction. The bucket\n * used to be a class field initializer, evaluated during DI wiring — before\n * application configuration exists — which is precisely why a construction-time\n * capture cannot be the source here.\n * See `.claude/plans/application-runtime-topology-delivery.md`.\n *\n * Returns `undefined` when no managed store is configured; callers fail with a\n * precise CONFIGURATION error rather than inventing a default, because a\n * plausible default would make an unconfigured runtime look configured and fail\n * later at an object operation.\n */\n private get managedConnection(): AppConfiguration_Storage_ManagedConnection | undefined {\n return this.appConfigService.config.storage?.managed;\n }\n\n /**\n * The bucket. Not optional in practice: reached only from paths that have\n * already resolved a client, and therefore already proved a managed\n * connection exists. The fallback exists so an error-formatting path\n * (`convertStorageError`) can name the bucket without being able to throw a\n * second error while reporting the first.\n */\n private get bucketName(): string {\n return this.managedConnection?.bucket ?? STORAGE_DEFAULTS.BUCKET;\n }\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger)\n private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService)\n private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService)\n private readonly appConfigService: AppConfigurationService,\n /**\n * OPTIONAL override for how credentials are obtained — appended LAST so no\n * existing construction site shifts.\n *\n * Unbound (the common case) the provider fetches sessions from apps-manager\n * over HTTP. A runtime CO-LOCATED with the issuer binds an in-process resolver\n * instead: same broker, same prefix-confined session policy, same short-lived\n * credential — no network hop, and therefore no dependency on a listener that\n * may not exist yet.\n *\n * Optional deliberately, and the default is the SAFE case: omitting it yields\n * the ordinary remote fetch. Only the co-located runtime opts out, and it must\n * do so explicitly.\n */\n @inject(SAAS_SERVICE_TYPES.StorageCredentialResolver) @optional()\n private readonly credentialResolverOverride?: StorageCredentialResolver,\n ) {}\n\n /**\n * ⚠️ Deliberately does NOT test `STORAGE_ACCESS_KEY` / `STORAGE_SECRET_KEY`.\n *\n * Those are the root credential this provider stopped consuming, and Step 2 of\n * the storage plan removes them from generated env entirely. Leaving them in\n * this predicate would mean storage silently reports itself UNCONFIGURED the\n * moment they are removed — the file feature would disable itself with no\n * error, which is far worse than failing loudly.\n *\n * What storage now needs is the endpoint plus the bootstrap contract by which\n * credentials are fetched.\n *\n * The endpoint and the caller's own identity come from CONFIGURATION; the two\n * apps-manager REACHABILITY values stay in the ENVIRONMENT, deliberately — a URL\n * and a secret are what a process needs before it can fetch anything at all,\n * configuration included, so they cannot themselves be delivered as\n * configuration.\n *\n * ## Why identity is NOT `process.env.APPLICATION_ID`\n *\n * It used to be, while the object-key builder read\n * `appConfigService.applicationId` — two sources for one concept. They agree for\n * an application (the loader seeds config from that env var) and they do NOT\n * agree for a platform service, which resolves its identity locally and has no\n * `APPLICATION_ID` in env at all. That split is F-G: every platform service\n * reported storage UNCONFIGURED on the env conjunct, the router skipped it in\n * silence, and module-registry publish has been dead since. Reading the same\n * source the operation addresses removes the disagreement by construction —\n * and it needs no new environment variable, so nothing changes at env-generation\n * time. See `.claude/plans/object-storage-root-credential-distribution.md`.\n *\n * Reading configuration here can throw `app_configuration_not_initialized`, and\n * that is left unsoftened on purpose: answering `false` for \"configuration is\n * not loaded yet\" is indistinguishable from \"this application has no file\n * feature\", and the router would SKIP the provider in silence. Every caller was\n * enumerated and runs after configuration init.\n */\n isConfigured(): boolean {\n return !!this.managedConnection?.endpoint && this.hasUsableCredentialSource();\n }\n\n /**\n * Whether SOME credential source can serve this runtime.\n *\n * The split matters: the four-var bootstrap contract is a property of the HTTP\n * resolver, not of storage. Testing it unconditionally made the predicate ask\n * \"can I reach apps-manager?\" of a runtime that does not need to — which is how\n * a co-located runtime with a perfectly good in-process source would still\n * report UNCONFIGURED and be skipped by the router.\n */\n private hasUsableCredentialSource(): boolean {\n // An injected resolver IS the source; it needs nothing from the environment.\n if (this.credentialResolverOverride) return true;\n\n return !!process.env.PLATFORM_APPS_MANAGER_URL\n && !!process.env.PLATFORM_APPLICATION_PRIMARY_SECRET\n // ⚠️ REVERTED 2026-08-12, and the env read is LOAD-BEARING here — do not\n // \"clean it up\" to the configuration identity without reading this first.\n //\n // Identity was briefly taken from configuration, to close the dual-source\n // split described on the resolver. That is the right end state and it caused\n // an OUTAGE, because it made this predicate true for PLATFORM services — and\n // apps-manager is the STS ISSUER. It then fetched its own storage credentials\n // from itself, over HTTP, BEFORE its own listener existed: a guaranteed\n // `ECONNREFUSED`, not a race. `healthCheck()` never retried, so storage stayed\n // unhealthy for the process lifetime and `/health/ready` answered 503 forever\n // — the exact state the comment there warns about.\n //\n // Absence of `APPLICATION_ID` in a platform env is therefore doing real work\n // today: it is what keeps a platform service out of a client relationship with\n // itself. Single-sourcing the identity is safe only once (a) the platform-plane\n // STS door exists and (b) the issuer is excluded from being its own client.\n // Until then this stays an env read. See F-G in\n // `.claude/plans/object-storage-root-credential-distribution.md`.\n && !!process.env.APPLICATION_ID;\n }\n\n /**\n * The credential source, built lazily so env is read at first use rather than\n * at construction — preserving the pre-existing behaviour that tests and\n * dynamic relayers rely on to re-use one instance under different env contexts.\n *\n * Credentials come from apps-manager as short-lived, prefix-confined STS\n * sessions. The env resolver that preceded this was DELETED rather than kept as\n * a fallback: a fallback would fire on any transient apps-manager hiccup,\n * succeed with the ROOT credential, and leave no signal that the confinement\n * had been bypassed.\n */\n private getCredentialProvider(): StorageCredentialProvider {\n if (this.credentialProvider) return this.credentialProvider;\n\n this.credentialProvider = new StorageCredentialProvider(\n this.credentialResolverOverride\n // Identity from CONFIGURATION, single-sourced with the object-key builder\n // (`resolveStorageApplicationIdentity`) rather than re-read from env.\n ?? createStsStorageCredentialResolver(() => resolveStorageApplicationIdentity(this.appConfigService)),\n );\n return this.credentialProvider;\n }\n\n /**\n * Eagerly initialize the MinIO client and verify bucket access.\n * Call this at startup to fail fast on misconfiguration.\n * If not called, the client is created lazily on first operation.\n */\n async initialize(): Promise<void> {\n await this.getClient();\n }\n\n /**\n * Obtain (and renew) the session credential WITHOUT building a client.\n *\n * Split out of `getClient()` so the object-key authorization guard can run\n * before any minio client exists. The guard needs the CONFINED applicationId,\n * which only arrives with the credential — so the order has to be\n * credentials → guard → client, not guard → credentials → client.\n *\n * The pinned property survives: no client is constructed for a rejected\n * `storageRef`. What changes is that a rejected ref now costs a credential\n * LOOKUP — which `StorageCredentialProvider` caches for the session lifetime,\n * so in practice it is a cache read rather than a round trip.\n *\n * Config is validated FIRST so an unconfigured runtime fails with a precise\n * CONFIGURATION error rather than an opaque credential one, and does not make a\n * pointless apps-manager round-trip on its way to failing.\n */\n private async ensureCredentials(): Promise<ResolvedStorageCredentials> {\n const connection = this.managedConnection;\n const endpoint = connection?.endpoint;\n const port = connection?.port ?? INFRA_DEFAULT_PORTS.MINIO;\n const useSSL = connection?.useSsl ?? false;\n\n // Configuration is validated BEFORE credentials are fetched — both so an\n // unconfigured runtime fails with a precise CONFIGURATION error rather than\n // an opaque credential error, and so it does not make a pointless\n // apps-manager round-trip on its way to failing.\n //\n // The required set changed with the credential source: the storage keys are\n // gone (they were the ROOT credential) and what is needed now is the\n // endpoint plus the bootstrap contract used to fetch session credentials.\n if (!endpoint || !this.isConfigured()) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message:\n 'Incomplete managed storage configuration. Required: storage.managed.endpoint (from STORAGE_ENDPOINT), '\n + 'PLATFORM_APPS_MANAGER_URL, PLATFORM_APPLICATION_PRIMARY_SECRET, APPLICATION_ID',\n hasEndpoint: !!endpoint,\n hasAppsManagerUrl: !!process.env.PLATFORM_APPS_MANAGER_URL,\n hasPrimarySecret: !!process.env.PLATFORM_APPLICATION_PRIMARY_SECRET,\n // Env, matching `isConfigured()` — the flag must name the SAME source\n // the predicate gates on, or the diagnostic sends the reader to a\n // value that was never the cause.\n hasApplicationId: !!process.env.APPLICATION_ID,\n },\n }\n );\n }\n\n // Renew, THEN decide whether the cached client is still usable. Checking the\n // cache first would return a client bound to an expired session and the\n // failure would surface as an opaque auth error mid-upload.\n let credentials;\n try {\n credentials = await this.getCredentialProvider().getCredentials();\n } catch (error) {\n // Fail closed, but as a typed CONFIGURATION error so callers and the\n // readiness probe can classify it — not as a bare Error escaping from the\n // resolver.\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n operation: 'acquire_storage_credentials',\n message: 'Could not obtain object storage session credentials from apps-manager.',\n error: describeCaughtError(error),\n },\n }\n );\n }\n\n return credentials;\n }\n\n /**\n * The minio client for the CURRENT credential, rebuilt when that credential\n * changes. Renew first, THEN decide whether the cached client is still usable:\n * checking the cache first would return a client bound to an expired session and\n * the failure would surface as an opaque auth error mid-upload.\n */\n private async getClient(): Promise<Client> {\n const credentials = await this.ensureCredentials();\n const connection = this.managedConnection;\n const endpoint = connection?.endpoint ?? '';\n const port = connection?.port ?? INFRA_DEFAULT_PORTS.MINIO;\n const useSSL = connection?.useSsl ?? false;\n\n if (this.client && this.clientAccessKey === credentials.accessKey) {\n return this.client;\n }\n\n const endpointUrl = endpoint.includes('://')\n ? new URL(endpoint)\n : new URL(`http${useSSL ? 's' : ''}://${endpoint}`);\n\n const options: ClientOptions = {\n endPoint: endpointUrl.hostname,\n port: endpointUrl.port ? parseInt(endpointUrl.port, 10) : port,\n useSSL: useSSL || endpointUrl.protocol === 'https:',\n accessKey: credentials.accessKey,\n secretKey: credentials.secretKey,\n // Present only for an STS session credential; a long-lived credential\n // carries none and the field stays undefined.\n ...(credentials.sessionToken ? { sessionToken: credentials.sessionToken } : {}),\n region: DEFAULT_STORAGE_REGION,\n // Keeps every upload on the single-PutObject path. The multipart branch\n // opens with a BUCKET-level ListMultipartUploads that a prefix-confined\n // session cannot be granted — see MAX_SINGLE_PUT_OBJECT_SIZE_BYTES.\n partSize: PART_SIZE_BYTES,\n };\n\n const client = new Client(options);\n\n // ⚠️ NO `bucketExists()` PROBE HERE — deliberately. This is F-D.\n //\n // The probe used to live here (and before that, `makeBucket()`). Under a\n // prefix-confined session credential it can NEVER succeed: `bucketExists()`\n // issues HeadBucket, which S3 authorises via `s3:ListBucket`, and the session\n // policy grants `ListBucket` only under `Condition StringLike s3:prefix`.\n // HeadBucket carries no prefix, so the condition cannot match and the call is\n // refused `AccessDenied` — on a credential whose object operations work\n // perfectly. Keeping it broke EVERY file operation in dev, in the backend and\n // in every minion, with a message pointing at credentials rather than at the\n // probe.\n //\n // Do NOT \"fix\" this by adding an unconditioned `ListBucket` to the policy.\n // That is the tempting repair and it re-grants bucket-wide enumeration —\n // every other application's object keys — to close a check that buys nothing:\n // bucket existence is already guaranteed platform-side by\n // `ObjectStorageStsBrokerService.ensureBucketExists()`, which runs with admin\n // rights on the credential-issuance path immediately before this client is\n // built. A missing bucket now surfaces at the first real operation, which is\n // where a genuine storage fault belongs.\n //\n // See `.claude/plans/object-storage-root-credential-distribution.md` (F-D).\n\n this.client = client;\n // Stamped together with the client so the cache check above can tell a\n // still-valid client from one bound to a superseded credential.\n this.clientAccessKey = credentials.accessKey;\n return client;\n }\n\n /**\n * The application identity object keys are built from — taken from the CREDENTIAL,\n * i.e. the subject the issuer confined the session policy to.\n *\n * Not `resolveStorageApplicationIdentity(appConfigService)`. That was the client's\n * own answer to the same question, and when the two disagreed the credential was\n * confined to one subtree while the client addressed another — every operation\n * failing `Valid and authorized credentials required` with both halves passing\n * their own tests. `assertPolicySafeApplicationId` requires a 24-hex ObjectId, so\n * the policy side cannot be bent to match the client; the client must take the\n * issuer's value.\n *\n * FAILS CLOSED when the issuer supplied none. Falling back to the local identity\n * is precisely the reintroduction of the split — it would work for applications\n * (where the two happen to agree) and silently mis-address for everything else,\n * which is the failure mode that took a day to find.\n */\n private async getApplicationId(executionContext: ExecutionContext<any>): Promise<string> {\n const credentials = await this.ensureCredentials();\n const applicationId = credentials.applicationId;\n\n if (!applicationId) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n operation: 'resolve_confined_application_identity',\n message:\n 'The object storage credential did not name the application it is confined to, so no '\n + 'object key can be addressed. The issuer must return `applicationId` alongside the '\n + 'session credential.',\n },\n }\n );\n }\n\n validateAppId(applicationId, this.errorBuilder, executionContext, 'applicationId');\n return applicationId;\n }\n\n /**\n * Resolve the canonical app-level object-key namespace prefix\n * (Slice 3.6).\n *\n * Sourced from `storage.managed.bucketPrefix`, which the configuration loader\n * seeds from `STORAGE_BUCKET_PREFIX`, originating from\n * `wildo.saas.config.dataServices.s3.bucketPrefix`. When set, every\n * application object key produced by `resolveApplicationObjectKey()`\n * (and every authorized `storageRef` it accepts) is prefixed with\n * `${bucketPrefix}/`. The bucket itself remains infra-controlled — N apps\n * can share one bucket with disjoint object trees.\n *\n * Cosmetic only: tenant isolation is enforced by the session policy, which\n * keys on the platform-minted `applicationId` and never on this value.\n *\n * Read lazily on every call (rather than cached at construction) so a\n * configuration change is observed without rebuilding the provider.\n */\n private resolveBucketPrefix(): string {\n const raw = this.managedConnection?.bucketPrefix;\n if (!raw) return '';\n const trimmed = raw.trim();\n return trimmed.length === 0 ? '' : `${trimmed.replace(/\\/+$/, '')}/`;\n }\n\n /**\n * Refuse any key fragment carrying a `.` or `..` segment.\n *\n * ## Why the managed provider needs this at all\n *\n * The local-directory provider has always had a traversal guard\n * (`resolveSafePathFromRelative`: `path.resolve` + a `startsWith(base + sep)` check). This\n * provider had NONE — an S3 key is an opaque string, never resolved by a filesystem, so a `..`\n * segment cannot escape a bucket and the guard looked unnecessary. It is not, for two reasons:\n *\n * 1. **The read guard below is textual.** `startsWith(expectedPrefix)` is satisfied by\n * `applications/<app>/files/x/../../../elsewhere/y`, so a stored ref carrying traversal passes\n * the one check that exists — and a future consumer that DOES normalize the key (a mirror to a\n * filesystem, an archive extraction, a signed-URL rewriter) inherits a ref that was never\n * checked.\n * 2. **A prefix is the tenant boundary here.** `<scope>/<scopeId>` exists so erasure, orphan\n * sweeps and per-tenant listing are prefix operations. A key whose literal text contains `..`\n * still lands under the prefix it was composed from, but it is unreadable as a path and no\n * normalizing tool downstream agrees with the sweep about which tenant owns it.\n *\n * The invariant is enforced HERE rather than at the resolver because `StorageUploadOptions` has\n * more than one producer: `FileStoragePathResolverBackendService` sanitizes (and is the only\n * app-authored source), but the audit-archive batch composes its own `folderPath` and never\n * passes through that sanitizer. This method is the single point every key — upload composition\n * AND every stored `storageRef` on download/delete/metadata — must pass.\n *\n * Fail-closed with AUTHORIZATION, matching the local provider's verdict for the same input, so\n * one authored value cannot mean two different things depending on which provider is bound.\n */\n private assertNoTraversalSegments(\n candidate: string,\n executionContext: ExecutionContext<any>,\n diagnostics: Record<string, unknown>,\n ): void {\n if (!storageKeyHasTraversalSegment(candidate)) {\n return;\n }\n\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_PATH_TRAVERSAL_DETECTED,\n context: {\n // diagnostic (log-only)\n ...diagnostics,\n candidate,\n provider: this.providerId,\n },\n }\n );\n }\n\n private async resolveApplicationObjectKey(\n fileId: string,\n executionContext: ExecutionContext<any>,\n storageRef?: string,\n linkedResourceType?: ResourceType,\n fileScope?: FileScopeIdentifiers,\n ): Promise<string> {\n // Checked BEFORE the application identity is resolved: a traversal segment is a refusal that\n // needs no credential, and paying an apps-manager STS round trip to reject it would let a\n // hostile key fragment drive outbound requests.\n this.assertNoTraversalSegments(fileId, executionContext, { fileId, source: 'composed_key' });\n\n const applicationId = await this.getApplicationId(executionContext);\n const bucketPrefix = this.resolveBucketPrefix();\n // The relative key comes from the SHARED composer, so the local-directory provider addresses the\n // same blob at the same place. `bucketPrefix` is the one part that stays here: it is an\n // object-store namespacing knob (N applications sharing one bucket) with no meaning on a\n // filesystem, so it frames the shared key rather than living inside it.\n const defaultKey =\n bucketPrefix\n + composeApplicationStorageKey({ applicationId, leafPath: fileId, linkedResourceType, scope: fileScope });\n\n if (!storageRef) {\n return defaultKey;\n }\n\n const normalizedStorageRef = storageRef.trim();\n if (!normalizedStorageRef) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_STORAGE_REF_INVALID,\n context: {\n // diagnostic (log-only)\n fileId,\n applicationId,\n },\n }\n );\n }\n\n // A stored ref is checked for traversal too, not only the freshly-composed key. The prefix\n // check below is TEXTUAL, so `applications/<app>/files/x/../../../elsewhere/y` satisfies it;\n // the row it came from is not a trusted source just because it is persisted.\n this.assertNoTraversalSegments(normalizedStorageRef, executionContext, { fileId, applicationId, source: 'stored_storage_ref' });\n\n // The guard confines to the APPLICATION subtree, deliberately NOT to this call's resource\n // segment. A read of an already-stored blob supplies no `linkedResourceType`, so keying the\n // guard on the current call would reject every legitimate read of a linked file. Per-resource\n // confinement is the session policy's job (it is minted per principal); this guard's job is\n // that a `storageRef` from a row cannot escape the application.\n const expectedPrefix =\n bucketPrefix\n + `applications/${applicationId}/files/`;\n if (!normalizedStorageRef.startsWith(expectedPrefix)) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_STORAGE_REF_FORBIDDEN,\n context: {\n // diagnostic (log-only)\n fileId,\n applicationId,\n storageRef: normalizedStorageRef,\n expectedPrefix,\n },\n }\n );\n }\n\n return normalizedStorageRef;\n }\n\n private convertStorageError(\n error: unknown,\n operation: 'upload' | 'download' | 'delete' | 'metadata',\n executionContext: ExecutionContext<any> | undefined,\n context: Record<string, unknown>,\n ): never {\n if (isWildoBackendError(error)) {\n throw error;\n }\n\n const errorMessage = describeCaughtError(error);\n // Classify on the S3 error CODE first; the message is a fallback only.\n //\n // A message is prose an SDK is free to reword, and matching on substrings has\n // two real failure modes here: a benign message containing \"not found\" is\n // misread as a missing object, and — the one F-D made concrete — a genuine\n // `AccessDenied` whose message is phrased differently escapes classification\n // entirely and surfaces as a generic connectivity error, pointing the reader\n // at the wrong subsystem. The minio client exposes `code` on its errors, so\n // the reliable signal is available and was simply not being used.\n const errorCode = resolveStorageErrorCode(error);\n const errorMessageLower = errorMessage.toLowerCase();\n\n if (\n errorCode === 'NoSuchKey'\n || errorCode === 'NotFound'\n || errorCode === 'NoSuchBucket'\n || (!errorCode && (errorMessageLower.includes('nosuchkey') || errorMessageLower.includes('not found')))\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_NOT_FOUND_IN_STORAGE,\n context: {\n // diagnostic (log-only)\n operation,\n ...context,\n },\n }\n );\n }\n\n if (\n errorCode === 'AccessDenied'\n || errorCode === 'Forbidden'\n || errorCode === 'SignatureDoesNotMatch'\n || errorCode === 'InvalidAccessKeyId'\n || errorCode === 'ExpiredToken'\n || errorCode === 'InvalidToken'\n || (!errorCode && (\n errorMessageLower.includes('accessdenied')\n || errorMessageLower.includes('access denied')\n || errorMessageLower.includes('forbidden')\n || errorMessageLower.includes('signaturedoesnotmatch')\n || errorMessageLower.includes('invalidaccesskeyid')\n ))\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_STORAGE_ACCESS_DENIED,\n context: {\n // diagnostic (log-only)\n operation,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n if (\n errorMessageLower.includes('bucketnotfound')\n || errorMessageLower.includes('invalidbucketname')\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message: 'Managed storage bucket configuration error',\n operation,\n bucketName: this.bucketName,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n if (\n errorMessageLower.includes('connection')\n || errorMessageLower.includes('timeout')\n || errorMessageLower.includes('econnrefused')\n || errorMessageLower.includes('network')\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.NETWORK,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.NETWORK,\n context: {\n message: 'Managed storage connection failed',\n operation,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n if (\n errorMessageLower.includes('stream')\n || errorMessageLower.includes('pipe')\n || errorMessageLower.includes('readable')\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.EXTERNAL_SERVICE,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.EXTERNAL_SERVICE,\n context: {\n message: 'File stream error during storage operation',\n operation,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n throw this.errorBuilder.buildError(\n ErrorType.EXTERNAL_SERVICE,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.EXTERNAL_SERVICE,\n context: {\n message: `Managed storage operation failed: ${operation}`,\n operation,\n ...context,\n originalError: errorMessage,\n },\n }\n );\n }\n\n async upload(\n fileStream: Readable,\n fileId: string,\n mimeType: string,\n size: number,\n executionContext: ExecutionContext<any>,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult> {\n validateFileId(fileId, this.errorBuilder, executionContext, 'fileId');\n validateContentType(mimeType, this.errorBuilder, executionContext, 'mimeType');\n validateSize(\n size,\n resolveConfiguredMaxFileSize(this.appConfigService.config.storage?.maxFileSize),\n this.errorBuilder,\n executionContext,\n 'size',\n );\n validateStream(fileStream, this.errorBuilder, executionContext, 'fileStream');\n\n // Above this, the client would take the multipart branch, whose opening\n // ListMultipartUploads call a prefix-confined session cannot perform — the\n // store would answer a bare `AccessDenied` that reads as a credential fault.\n // Refuse here instead, naming the real reason. Reachable only when an\n // application configures `storage.maxFileSize` above the single-PUT ceiling;\n // `validateSize` has already applied that configured limit.\n // See MAX_SINGLE_PUT_OBJECT_SIZE_BYTES.\n if (size > MAX_SINGLE_PUT_OBJECT_SIZE_BYTES) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n // Same reference `validateContentLength` uses for a size violation —\n // this IS one, just against a provider ceiling rather than the\n // application's configured limit.\n customMessageReference: ErrorCustomMessageReference.CONTENT_LENGTH_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fileId,\n size,\n reason: 'exceeds_single_put_ceiling',\n maxSinglePutSize: MAX_SINGLE_PUT_OBJECT_SIZE_BYTES,\n message:\n 'Object exceeds the single-PutObject ceiling for managed storage. Managed storage cannot use '\n + 'multipart upload under a prefix-confined credential; lower storage.maxFileSize to at most '\n + `${MAX_SINGLE_PUT_OBJECT_SIZE_BYTES} bytes.`,\n },\n }\n );\n }\n\n const effectiveFileId = composeStorageLeafPath(fileId, options);\n\n if (!effectiveFileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_STORAGE_KEY_COMPOSITION_FAILED,\n }\n );\n }\n\n const includeAppId = options?.includeApplicationId ?? true;\n const key = includeAppId\n ? await this.resolveApplicationObjectKey(effectiveFileId, executionContext, undefined, options?.linkedResourceType, options?.scope)\n : effectiveFileId;\n const client = await this.getClient();\n\n try {\n await client.putObject(\n this.bucketName,\n key,\n fileStream,\n size,\n {\n [WildoHeaderKeys.CONTENT_TYPE]: mimeType,\n },\n );\n } catch (error) {\n this.convertStorageError(error, 'upload', executionContext, {\n fileId,\n storageRef: key,\n provider: this.providerId,\n });\n }\n\n return {\n storageRef: key,\n provider: this.providerId,\n };\n }\n\n async download(\n file: StoredFileStorageTarget,\n executionContext: ExecutionContext<any>,\n ): Promise<StorageDownloadResult> {\n const key = await this.resolveApplicationObjectKey(file.fileId, executionContext, file.storageRef);\n const client = await this.getClient();\n let stream: Readable;\n let metadata: StorageFileMetadata;\n\n try {\n const stat = await client.statObject(this.bucketName, key);\n const contentType = stat.metaData[WildoHeaderKeys.CONTENT_TYPE];\n if (!contentType) {\n throw this.errorBuilder.buildError(\n ErrorType.EXTERNAL_SERVICE,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.EXTERNAL_SERVICE,\n context: {\n message: `Managed storage object metadata missing required ${WildoHeaderKeys.CONTENT_TYPE}`,\n fileId: file.fileId,\n storageRef: key,\n },\n },\n );\n }\n\n stream = await client.getObject(this.bucketName, key);\n metadata = {\n contentType,\n size: stat.size,\n etag: stat.etag,\n lastModified: stat.lastModified,\n };\n } catch (error) {\n this.convertStorageError(error, 'download', executionContext, {\n fileId: file.fileId,\n storageRef: key,\n provider: this.providerId,\n });\n }\n\n return {\n stream,\n contentType: metadata.contentType,\n size: metadata.size,\n etag: metadata.etag,\n lastModified: metadata.lastModified,\n };\n }\n\n async delete(\n file: StoredFileStorageTarget,\n executionContext: ExecutionContext<any>,\n ): Promise<void> {\n const key = await this.resolveApplicationObjectKey(file.fileId, executionContext, file.storageRef);\n const client = await this.getClient();\n\n try {\n await client.removeObject(this.bucketName, key);\n } catch (error) {\n // Same code-first classification as `convertStorageError`: a delete of an\n // already-absent object is a no-op, but only when the store actually said\n // so. Inferring it from prose can swallow a real failure.\n const deleteErrorCode = resolveStorageErrorCode(error);\n const errorMessageLower = describeCaughtError(error).toLowerCase();\n if (\n deleteErrorCode === 'NoSuchKey'\n || deleteErrorCode === 'NotFound'\n || (!deleteErrorCode && (errorMessageLower.includes('nosuchkey') || errorMessageLower.includes('not found')))\n ) {\n return;\n }\n this.convertStorageError(error, 'delete', executionContext, {\n fileId: file.fileId,\n storageRef: key,\n provider: this.providerId,\n });\n }\n }\n\n async getMetadata(\n file: StoredFileStorageTarget,\n executionContext: ExecutionContext<any>,\n ): Promise<StorageFileMetadata> {\n const key = await this.resolveApplicationObjectKey(file.fileId, executionContext, file.storageRef);\n const client = await this.getClient();\n\n try {\n const stat = await client.statObject(this.bucketName, key);\n const contentType = stat.metaData[WildoHeaderKeys.CONTENT_TYPE];\n if (!contentType) {\n throw this.errorBuilder.buildError(\n ErrorType.EXTERNAL_SERVICE,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.EXTERNAL_SERVICE,\n context: {\n message: `Managed storage object metadata missing required ${WildoHeaderKeys.CONTENT_TYPE}`,\n fileId: file.fileId,\n storageRef: key,\n },\n },\n );\n }\n\n return {\n contentType,\n size: stat.size,\n etag: stat.etag,\n lastModified: stat.lastModified,\n };\n } catch (error) {\n this.convertStorageError(error, 'metadata', executionContext, {\n fileId: file.fileId,\n storageRef: key,\n provider: this.providerId,\n });\n }\n }\n\n // =========================================================================\n // Health check\n // =========================================================================\n\n async healthCheck(): Promise<StorageProviderHealthResult> {\n const startTime = Date.now();\n\n // RECOVER, don't just report. This used to `return { healthy: false }` on a\n // null client and never try again — which turned any transient startup failure\n // into a PERMANENT one: `initialize()` runs once, so a client that failed to\n // build at boot was never rebuilt, storage stayed unhealthy for the process\n // lifetime, and `/health/ready` answered 503 forever while `/health` looked\n // fine. That is the documented \"port open + /health healthy + /health/ready 503\n // forever\" state (`platform/CLAUDE.md`), reached without any ongoing fault.\n //\n // Observed exactly that way on apps-manager: the credential fetch was refused\n // at boot, the listener came up 0.4s later, and nothing retried. A readiness\n // probe is the natural retry point — it is called repeatedly, by design, and a\n // dependency that has come back should be allowed to say so.\n //\n // `getClient()` is idempotent and caches, so a healthy probe costs no extra\n // work; a still-failing one reports the CURRENT reason instead of the stale\n // \"not initialized\".\n if (!this.client) {\n try {\n await this.getClient();\n } catch (error) {\n return { healthy: false, latency: Date.now() - startTime, error: describeCaughtError(error) };\n }\n }\n\n /**\n * Declared OUTSIDE the try so the credential-rejection retry below can probe the SAME key.\n * Recomputing it there would ask a different question than the one that just failed.\n */\n let probeKey = '';\n\n try {\n // ⚠️ Probes with an OBJECT-level call, not `bucketExists()`. Second site of\n // F-D, and the more damaging one: this is the readiness dependency behind\n // `/health/ready`, so a probe the credential cannot satisfy produces the\n // documented \"port open + /health healthy + /health/ready 503 forever\"\n // state (see `platform/CLAUDE.md`) — with remote clients looping on\n // \"Remote API not ready\" and nothing pointing at storage.\n //\n // `bucketExists()` issues HeadBucket, authorised by an UNCONDITIONED\n // `s3:ListBucket`. The session policy grants `ListBucket` only under\n // `Condition StringLike s3:prefix`, and HeadBucket sends no prefix, so it\n // can never pass. `statObject` on a key inside this application's own\n // prefix is authorised by the policy's object statements, which is what the\n // credential is actually for.\n //\n // A `NoSuchKey` reply is the HEALTHY answer: it proves the store was\n // reached AND the credential was accepted. Only a real refusal or transport\n // failure is unhealthy.\n // The probe key must sit inside the prefix the CREDENTIAL covers, not the\n // one the client would have guessed — otherwise readiness fails `AccessDenied`\n // on a perfectly good credential and blames storage. Same identity source as\n // every real operation, for the same reason.\n const probeApplicationId = (await this.ensureCredentials()).applicationId\n ?? this.appConfigService.applicationId;\n probeKey = `${this.resolveBucketPrefix()}`\n + API_ROUTES_BACKEND_DEFINITIONS.FILE_STORAGE.STORAGE_KEY_APPLICATION_FILE(\n probeApplicationId,\n '__storage_healthcheck__',\n // The probe has no File row and no resource. It must sit under the SAME staging segment\n // a real unlinked blob uses — once the session policy narrows per resource, a probe key\n // outside every granted prefix would fail `AccessDenied` on a perfectly good credential\n // and report storage unhealthy.\n UNLINKED_STORAGE_SEGMENT,\n ResourcePrimaryScope.APPLICATION,\n probeApplicationId,\n );\n\n // `this.client!` — the recovery branch above either populated it or returned.\n await this.client!.statObject(this.bucketName, probeKey);\n return { healthy: true, latency: Date.now() - startTime };\n } catch (error) {\n const code = resolveStorageErrorCode(error);\n if (code === 'NoSuchKey' || code === 'NotFound') {\n return { healthy: true, latency: Date.now() - startTime };\n }\n\n /**\n * A credential the STORE REJECTS is re-acquired, not held until it expires.\n *\n * The provider refreshes on EXPIRY only — its contract says so explicitly (\"Refresh before\n * expiry, not after failure\"), and that is right for the ordinary case: callers should never\n * observe an expired credential. But it leaves one state unrecoverable, and this is the probe\n * that meets it. A session can become invalid while still unexpired — the object store\n * restarts and forgets its STS sessions, or the parent credential rotates underneath it. The\n * cached credential then stays \"fresh\" by the clock and is refused by the store on every call.\n *\n * Measured 2026-08-22: THREE platform runtimes (crontabs, apps-manager, the dev companion)\n * held such a credential for ~27 HOURS. `/health` stayed 200 while `/health/ready` answered\n * 503 the whole time, and the application backend logged `Remote API not ready` 2,384 times\n * against one of them. Restarting each process cleared it — which is the definition of a\n * defect that requires manual intervention, and it is exactly the state\n * `platform/CLAUDE.md` describes as \"port open + /health healthy + /health/ready 503 forever\".\n *\n * `StorageCredentialProvider.invalidate()` existed for precisely this — its own JSDoc says\n * \"for an explicit re-acquire after a hard failure\" — and NOTHING called it, in production or\n * in a test. A capability with no door: the third found in this workstream, after\n * `usePostgreSQL` and `MongoDBService.overrideUri`.\n *\n * Retried ONCE, and only for a rejection that names a credential problem. A blanket retry\n * would mask a genuine outage as latency, and a retry loop on a store that is simply down\n * would turn a readiness probe into a stall. One attempt distinguishes \"this credential is\n * stale\" from \"the store is unreachable\", which is the only question this probe has to answer.\n */\n if (this.isCredentialRejection(code, error)) {\n this.credentialProvider?.invalidate();\n this.client = null;\n this.clientAccessKey = undefined;\n\n try {\n const retryClient = await this.getClient();\n await retryClient.statObject(this.bucketName, probeKey);\n this.logger.info(\n 'Object storage credential was refused and has been re-acquired; storage is healthy again.',\n );\n return { healthy: true, latency: Date.now() - startTime };\n } catch (retryError) {\n const retryCode = resolveStorageErrorCode(retryError);\n if (retryCode === 'NoSuchKey' || retryCode === 'NotFound') {\n this.logger.info(\n 'Object storage credential was refused and has been re-acquired; storage is healthy again.',\n );\n return { healthy: true, latency: Date.now() - startTime };\n }\n return {\n healthy: false,\n latency: Date.now() - startTime,\n error: describeCaughtError(retryError),\n };\n }\n }\n\n return { healthy: false, latency: Date.now() - startTime, error: describeCaughtError(error) };\n }\n }\n\n /**\n * Whether a failure says \"this CREDENTIAL is not accepted\" rather than \"the STORE is unavailable\".\n *\n * Only the first is worth re-acquiring for. The distinction is made on the error CODE where the\n * client supplies one, and falls back to the message otherwise — MinIO answers a rejected STS\n * session with `Valid and authorized credentials required`, which carries no S3 error code, and\n * that exact string is what the three stuck runtimes reported for 27 hours.\n */\n private isCredentialRejection(code: string | undefined, error: unknown): boolean {\n const CREDENTIAL_REJECTION_CODES = new Set([\n 'AccessDenied',\n 'InvalidAccessKeyId',\n 'SignatureDoesNotMatch',\n 'ExpiredToken',\n 'InvalidToken',\n 'TokenRefreshRequired',\n 'AuthorizationHeaderMalformed',\n ]);\n if (code && CREDENTIAL_REJECTION_CODES.has(code)) return true;\n\n const message = error instanceof Error ? error.message : String(error ?? '');\n return /valid and authorized credentials required|security token|access denied|invalid access key/i\n .test(message);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"file-field-schema-path.backend.utils.d.ts","sourceRoot":"","sources":["../../../../../src/files/utils/file-field-schema-path.backend.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAeL,KAAK,kBAAkB,EAExB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,oCAAqC,SAAQ,KAAK;aAE3C,SAAS,EAAE,MAAM;aACjB,gBAAgB,EAAE,kBAAkB;aACpC,mBAAmB,EAAE,kBAAkB;gBAFvC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,kBAAkB,EACpC,mBAAmB,EAAE,kBAAkB;CAO1D;AAED,qBAAa,yCAA0C,SAAQ,KAAK;aACtC,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAM9C;AAED,qBAAa,+CAAgD,SAAQ,KAAK;aAC5C,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAM9C;AAkFD,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,CAAC,CAAC,UAAU,GAAG,SAAS,EAChC,UAAU,GAAE,MAAW,EACvB,aAAa,GAAE,OAAO,CAAC,MAAM,CAAyB,GACrD,+BAA+B,EAAE,CAyHnC;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,CAAC,CAAC,UAAU,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAChB,+BAA+B,GAAG,SAAS,CAI7C;AAaD,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,OAAO,EACb,kBAAkB,EAAE,MAAM,GACzB,wBAAwB,EAAE,CAuD5B;AAED,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,OAAO,EAClB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAsCT;AAED,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,OAAO,EACzB,SAAS,EAAE,OAAO,GACjB,OAAO,CAgCT;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,EAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CAqCN"}
1
+ {"version":3,"file":"file-field-schema-path.backend.utils.d.ts","sourceRoot":"","sources":["../../../../../src/files/utils/file-field-schema-path.backend.utils.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAeL,KAAK,kBAAkB,EAExB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,oCAAqC,SAAQ,KAAK;aAE3C,SAAS,EAAE,MAAM;aACjB,gBAAgB,EAAE,kBAAkB;aACpC,mBAAmB,EAAE,kBAAkB;gBAFvC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,kBAAkB,EACpC,mBAAmB,EAAE,kBAAkB;CAO1D;AAED,qBAAa,yCAA0C,SAAQ,KAAK;aACtC,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAM9C;AAED,qBAAa,+CAAgD,SAAQ,KAAK;aAC5C,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAM9C;AAkFD,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,CAAC,CAAC,UAAU,GAAG,SAAS,EAChC,UAAU,GAAE,MAAW,EACvB,aAAa,GAAE,OAAO,CAAC,MAAM,CAAyB,GACrD,+BAA+B,EAAE,CAyHnC;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,CAAC,CAAC,UAAU,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAChB,+BAA+B,GAAG,SAAS,CAI7C;AAaD,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,OAAO,EACb,kBAAkB,EAAE,MAAM,GACzB,wBAAwB,EAAE,CAuD5B;AAED,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,OAAO,EAClB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAsCT;AAED,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,OAAO,EACzB,SAAS,EAAE,OAAO,GACjB,OAAO,CAgCT;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,EAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CAqCN"}
@@ -1,3 +1,23 @@
1
+ /*
2
+ * ## Coverage: unit tests only, accepted deliberately — 2026-09-08 (#467)
3
+ *
4
+ * This walker's descent through nested objects, arrays and discriminated unions — including its
5
+ * refusals for records, maps, sets, tuples and plain unions — has never executed outside its own
6
+ * unit tests. Every `z_file()` field declared in the engine and in BOTH example applications sits
7
+ * at the TOP LEVEL of its resource, so nothing reaches the descent.
8
+ *
9
+ * Nothing is wrong here. The gap is that no application has a reason to declare the shape, and
10
+ * buying the proof would mean authoring a declaration for the purpose of testing it — which proves
11
+ * the harness more than the product. That trade was weighed and taken; the project's usual bar
12
+ * (unit + integration + end-to-end for a shipped subsystem) is knowingly not met.
13
+ *
14
+ * **What would change the answer:** an application declaring a nested or repeated `z_file()` field.
15
+ * Whoever does that first is the first party to execute this code path, and should treat a surprise
16
+ * there as expected rather than as a new defect.
17
+ *
18
+ * Do NOT read this note as an invitation to narrow the walker to the shapes something uses today —
19
+ * that was the third option and it was not chosen.
20
+ */
1
21
  import { getFileMetadata, getZodDef, getZodDefArrayProperty, getZodDefProperty, getZodDefSchemaProperty, getZodDefStringProperty, getZodObjectShape, getZodType, isFileSchema, isZodArray, isZodDefault, isZodNullable, isZodObject, isZodOptional, unwrapSchema, } from '@wildo-ai/zod-decorators';
2
22
  export class IncompatibleFileFieldSchemaPathError extends Error {
3
23
  fieldName;
@@ -1 +1 @@
1
- {"version":3,"file":"file-field-schema-path.backend.utils.js","sourceRoot":"","sources":["../../../../../src/files/utils/file-field-schema-path.backend.utils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,SAAS,EACT,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,aAAa,EAEb,YAAY,GACb,MAAM,0BAA0B,CAAC;AAelC,MAAM,OAAO,oCAAqC,SAAQ,KAAK;IAE3C;IACA;IACA;IAHlB,YACkB,SAAiB,EACjB,gBAAoC,EACpC,mBAAuC;QAEvD,KAAK,CACH,0EAA0E,SAAS,IAAI,CACxF,CAAC;QANc,cAAS,GAAT,SAAS,CAAQ;QACjB,qBAAgB,GAAhB,gBAAgB,CAAoB;QACpC,wBAAmB,GAAnB,mBAAmB,CAAoB;QAKvD,IAAI,CAAC,IAAI,GAAG,sCAAsC,CAAC;IACrD,CAAC;CACF;AAED,MAAM,OAAO,yCAA0C,SAAQ,KAAK;IACtC;IAA5B,YAA4B,SAAiB;QAC3C,KAAK,CACH,wDAAwD,SAAS,iFAAiF,CACnJ,CAAC;QAHwB,cAAS,GAAT,SAAS,CAAQ;QAI3C,IAAI,CAAC,IAAI,GAAG,2CAA2C,CAAC;IAC1D,CAAC;CACF;AAED,MAAM,OAAO,+CAAgD,SAAQ,KAAK;IAC5C;IAA5B,YAA4B,SAAiB;QAC3C,KAAK,CACH,gEAAgE,SAAS,2HAA2H,CACrM,CAAC;QAHwB,cAAS,GAAT,SAAS,CAAQ;QAI3C,IAAI,CAAC,IAAI,GAAG,iDAAiD,CAAC;IAChE,CAAC;CACF;AAED,SAAS,kCAAkC,CAAC,MAAoB;IAC9D,IAAI,uBAAuB,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,SAAS,EAAE,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAA+B,CAAC;IACxF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAA8B,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAoB;IACtD,IAAI,uBAAuB,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,SAAS,EAAE,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAA+B,CAAC;IACxF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAA8B,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,8BAA8B,CACrC,KAAc;IAEd,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7C,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;aACpD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,8BAA8B,CAAC,UAAU,CAAC,CAAC,CAAC,CACjF,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,yBAAyB,CAChC,IAAwB,EACxB,KAAyB;IAEzB,OAAO,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;YACrD,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,gCAAgC,CACvC,MAA2C;IAE3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2C,CAAC;IAElE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBACnC,SAAS;YACX,CAAC;YAED,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC1E,MAAM,IAAI,oCAAoC,CAC5C,KAAK,CAAC,SAAS,EACf,QAAQ,CAAC,YAAY,EACrB,KAAK,CAAC,YAAY,CACnB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACtD,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAC9C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,MAAgC,EAChC,aAAqB,EAAE,EACvB,gBAAiC,IAAI,OAAO,EAAU;IAEtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,OAAO,gCAAgC,CAAC;gBACtC,8BAA8B,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC;gBACnE,8BAA8B,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,WAAW,GAAG,uBAAuB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACjE,OAAO,8BAA8B,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,8BAA8B,CAAC,eAAe,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzC,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO;gBACL;oBACE,SAAS,EAAE,UAAU;oBACrB,YAAY;iBACb;aACF,CAAC;QACJ,CAAC;QAED,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,iBAAiB,CAAC,eAAe,EAAE,SAAS,CAA6B,CAAC;YAChG,OAAO,8BAA8B,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,UAAU,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YAC5E,MAAM,WAAW,GAAG,uBAAuB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;YAC1E,MAAM,wBAAwB,GAAG,8BAA8B,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACxG,IAAI,wBAAwB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,+CAA+C,CAAC,UAAU,IAAI,QAAQ,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,sBAAsB,CAAC,eAAe,EAAE,OAAO,CAA+B,CAAC;YAClG,MAAM,UAAU,GAAG,uBAAuB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACpE,MAAM,aAAa,GAAG,gCAAgC,CAAC;gBACrD,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClC,8BAA8B,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAChE,CAAC;gBACF,8BAA8B,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC;aACtE,CAAC,CAAC;YACH,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,+CAA+C,CAAC,UAAU,IAAI,QAAQ,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;gBAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACvE,OAAO,8BAA8B,CAAC,WAA2B,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;YACtD,MAAM,UAAU,GAAG,OAAO,UAAU,KAAK,UAAU;gBACjD,CAAC,CAAC,UAAU,EAAE;gBACd,CAAC,CAAC,SAAS,CAAC;YACd,OAAO,8BAA8B,CAAC,UAAsC,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAC3G,CAAC;QAED,IAAI,UAAU,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,uBAAuB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACpE,MAAM,WAAW,GAAG,uBAAuB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YACtE,OAAO,gCAAgC,CAAC;gBACtC,8BAA8B,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC;gBACrE,8BAA8B,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC;aACvE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,kCAAkC,CAAC,eAAe,CAAC,CAAC;QACzE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,gCAAgC,CACrC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,8BAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAChG,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;QACtE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC1D,8BAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAClE,CAAC;YACF,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,yCAAyC,CAAC,UAAU,IAAI,QAAQ,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,MAAgC,EAChC,SAAiB;IAEjB,OAAO,8BAA8B,CAAC,MAAM,CAAC,CAAC,IAAI,CAChD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CACzC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAI,KAAiC,CAAC,EAAE,IAAK,KAAiC,CAAC,GAAG,CAAC;IACpG,OAAO,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;QACjE,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,IAAa,EACb,kBAA0B;IAE1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAA+B,EAAE,CAAC;IAEnD,MAAM,KAAK,GAAG,CACZ,OAAgB,EAChB,UAAkB,EAClB,WAAmB,EACb,EAAE;QACR,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC9B,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;gBAChF,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,SAAS,GAAI,OAAmC,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAExE,IAAI,UAAU,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAClD,WAAW,CAAC,IAAI,CAAC;oBACf,kBAAkB;oBAClB,gBAAgB,EAAE,eAAe;oBACjC,gBAAgB,EAAE,WAAW,IAAI,SAAS;oBAC1C,aAAa,EAAE,gBAAgB,CAAC,OAAO,CAAC;oBACxC,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC,CAAC;IAEF,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACnB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,SAAkB,EAClB,kBAA0B;IAE1B,IACE,CAAC,SAAS;WACP,OAAO,SAAS,KAAK,QAAQ;WAC7B,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAC7B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAE,UAAkB,EAAW,EAAE;QAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC;gBACzB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,UAAU,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAE,OAAmC,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC;IAEF,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,gBAAyB,EACzB,SAAkB;IAElB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS,KAAK,IAAI,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,gBAA2C,CAAC;IACnE,MAAM,WAAW,GAAG,SAAoC,CAAC;IACzD,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAC/B,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,2BAA2B,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAA2C,EAC3C,WAAmB,EACnB,KAAc;IAEd,MAAM,kBAAkB,GAAG,WAAW;SACnC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC;SAC5B,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAY,MAAM,CAAC;IAE9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtE,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,CAAC;QACtC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO;IACT,CAAC;IAEA,OAAmC,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;AAC7D,CAAC","sourcesContent":["import { z } from 'zod';\nimport {\n getFileMetadata,\n getZodDef,\n getZodDefArrayProperty,\n getZodDefProperty,\n getZodDefSchemaProperty,\n getZodDefStringProperty,\n getZodObjectShape,\n getZodType,\n isFileSchema,\n isZodArray,\n isZodDefault,\n isZodNullable,\n isZodObject,\n isZodOptional,\n type FileSchemaMetadata,\n unwrapSchema,\n} from '@wildo-ai/zod-decorators';\n\nexport interface ResolvedFileFieldSchemaMetadata {\n fieldName: string;\n fileMetadata: FileSchemaMetadata;\n}\n\nexport interface FileFieldValueOccurrence {\n canonicalFieldPath: string;\n runtimeFieldPath: string;\n ownerRuntimePath?: string;\n ownerStableId?: string;\n value: unknown;\n}\n\nexport class IncompatibleFileFieldSchemaPathError extends Error {\n constructor(\n public readonly fieldName: string,\n public readonly existingMetadata: FileSchemaMetadata,\n public readonly conflictingMetadata: FileSchemaMetadata,\n ) {\n super(\n `Incompatible z_file() metadata detected for canonical file field path \"${fieldName}\".`,\n );\n this.name = 'IncompatibleFileFieldSchemaPathError';\n }\n}\n\nexport class UnsupportedPlainUnionFileFieldSchemaError extends Error {\n constructor(public readonly fieldName: string) {\n super(\n `Unsupported z.union() file field schema detected at \"${fieldName}\". File fields inside non-discriminated unions must use z.discriminatedUnion().`,\n );\n this.name = 'UnsupportedPlainUnionFileFieldSchemaError';\n }\n}\n\nexport class UnsupportedDynamicContainerFileFieldSchemaError extends Error {\n constructor(public readonly fieldName: string) {\n super(\n `Unsupported dynamic-container file field schema detected at \"${fieldName}\". File fields inside z.record(), z.map(), z.set(), or z.tuple() are not supported by runtime file occurrence processing.`,\n );\n this.name = 'UnsupportedDynamicContainerFileFieldSchemaError';\n }\n}\n\nfunction getDiscriminatedUnionObjectOptions(schema: z.ZodTypeAny): z.ZodObject<any>[] {\n if (getZodDefStringProperty(schema, 'discriminator') === undefined) {\n return [];\n }\n\n const options = getZodDefArrayProperty(schema, 'options') as z.ZodTypeAny[] | undefined;\n if (!options?.length) {\n return [];\n }\n\n return options.filter((option): option is z.ZodObject<any> => isZodObject(option));\n}\n\nfunction getPlainUnionObjectOptions(schema: z.ZodTypeAny): z.ZodObject<any>[] {\n if (getZodDefStringProperty(schema, 'discriminator') !== undefined) {\n return [];\n }\n\n const options = getZodDefArrayProperty(schema, 'options') as z.ZodTypeAny[] | undefined;\n if (!options?.length) {\n return [];\n }\n\n return options.filter((option): option is z.ZodObject<any> => isZodObject(option));\n}\n\nfunction normalizeMetadataForComparison(\n value: unknown,\n): unknown {\n if (Array.isArray(value)) {\n return value.map(normalizeMetadataForComparison);\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, childValue]) => [key, normalizeMetadataForComparison(childValue)]),\n );\n }\n\n return value;\n}\n\nfunction areFileMetadataCompatible(\n left: FileSchemaMetadata,\n right: FileSchemaMetadata,\n): boolean {\n return JSON.stringify(normalizeMetadataForComparison(left))\n === JSON.stringify(normalizeMetadataForComparison(right));\n}\n\nfunction mergeCompatibleFileFieldMetadata(\n groups: ResolvedFileFieldSchemaMetadata[][],\n): ResolvedFileFieldSchemaMetadata[] {\n const merged = new Map<string, ResolvedFileFieldSchemaMetadata>();\n\n for (const group of groups) {\n for (const entry of group) {\n const existing = merged.get(entry.fieldName);\n if (!existing) {\n merged.set(entry.fieldName, entry);\n continue;\n }\n\n if (!areFileMetadataCompatible(existing.fileMetadata, entry.fileMetadata)) {\n throw new IncompatibleFileFieldSchemaPathError(\n entry.fieldName,\n existing.fileMetadata,\n entry.fileMetadata,\n );\n }\n }\n }\n\n return Array.from(merged.values()).sort((left, right) =>\n left.fieldName.localeCompare(right.fieldName),\n );\n}\n\nexport function collectFileFieldSchemaMetadata(\n schema: z.ZodTypeAny | undefined,\n pathPrefix: string = '',\n activeSchemas: WeakSet<object> = new WeakSet<object>(),\n): ResolvedFileFieldSchemaMetadata[] {\n if (!schema) {\n return [];\n }\n\n if (activeSchemas.has(schema)) {\n return [];\n }\n\n activeSchemas.add(schema);\n try {\n const rawSchemaType = getZodType(schema);\n if (rawSchemaType === 'pipe') {\n const inSchema = getZodDefSchemaProperty(schema, 'in');\n const outSchema = getZodDefSchemaProperty(schema, 'out');\n return mergeCompatibleFileFieldMetadata([\n collectFileFieldSchemaMetadata(inSchema, pathPrefix, activeSchemas),\n collectFileFieldSchemaMetadata(outSchema, pathPrefix, activeSchemas),\n ]);\n }\n\n if (isZodOptional(schema) || isZodNullable(schema) || isZodDefault(schema)) {\n const innerSchema = getZodDefSchemaProperty(schema, 'innerType');\n return collectFileFieldSchemaMetadata(innerSchema, pathPrefix, activeSchemas);\n }\n\n const unwrappedSchema = unwrapSchema(schema);\n if (unwrappedSchema !== schema) {\n return collectFileFieldSchemaMetadata(unwrappedSchema, pathPrefix, activeSchemas);\n }\n\n if (isFileSchema(unwrappedSchema)) {\n const fileMetadata = getFileMetadata(unwrappedSchema);\n if (!fileMetadata?.isFile || !pathPrefix) {\n return [];\n }\n\n return [\n {\n fieldName: pathPrefix,\n fileMetadata,\n },\n ];\n }\n\n if (isZodArray(unwrappedSchema)) {\n const elementSchema = getZodDefProperty(unwrappedSchema, 'element') as z.ZodTypeAny | undefined;\n return collectFileFieldSchemaMetadata(elementSchema, pathPrefix, activeSchemas);\n }\n\n const schemaType = getZodType(unwrappedSchema);\n if (schemaType === 'record' || schemaType === 'map' || schemaType === 'set') {\n const valueSchema = getZodDefSchemaProperty(unwrappedSchema, 'valueType');\n const dynamicContainerMetadata = collectFileFieldSchemaMetadata(valueSchema, pathPrefix, activeSchemas);\n if (dynamicContainerMetadata.length > 0) {\n throw new UnsupportedDynamicContainerFileFieldSchemaError(pathPrefix || '<root>');\n }\n return [];\n }\n\n if (schemaType === 'tuple') {\n const tupleItems = getZodDefArrayProperty(unwrappedSchema, 'items') as z.ZodTypeAny[] | undefined;\n const restSchema = getZodDefSchemaProperty(unwrappedSchema, 'rest');\n const tupleMetadata = mergeCompatibleFileFieldMetadata([\n ...((tupleItems ?? []).map((item) =>\n collectFileFieldSchemaMetadata(item, pathPrefix, activeSchemas)\n )),\n collectFileFieldSchemaMetadata(restSchema, pathPrefix, activeSchemas),\n ]);\n if (tupleMetadata.length > 0) {\n throw new UnsupportedDynamicContainerFileFieldSchemaError(pathPrefix || '<root>');\n }\n return [];\n }\n\n if (isZodObject(unwrappedSchema)) {\n const shape = getZodObjectShape(unwrappedSchema);\n return Object.entries(shape).flatMap(([fieldName, fieldSchema]) => {\n const nextPath = pathPrefix ? `${pathPrefix}.${fieldName}` : fieldName;\n return collectFileFieldSchemaMetadata(fieldSchema as z.ZodTypeAny, nextPath, activeSchemas);\n });\n }\n\n if (schemaType === 'lazy') {\n const lazyGetter = getZodDef(unwrappedSchema)?.getter;\n const lazySchema = typeof lazyGetter === 'function'\n ? lazyGetter()\n : undefined;\n return collectFileFieldSchemaMetadata(lazySchema as z.ZodTypeAny | undefined, pathPrefix, activeSchemas);\n }\n\n if (schemaType === 'intersection') {\n const leftSchema = getZodDefSchemaProperty(unwrappedSchema, 'left');\n const rightSchema = getZodDefSchemaProperty(unwrappedSchema, 'right');\n return mergeCompatibleFileFieldMetadata([\n collectFileFieldSchemaMetadata(leftSchema, pathPrefix, activeSchemas),\n collectFileFieldSchemaMetadata(rightSchema, pathPrefix, activeSchemas),\n ]);\n }\n\n const unionOptions = getDiscriminatedUnionObjectOptions(unwrappedSchema);\n if (unionOptions.length > 0) {\n return mergeCompatibleFileFieldMetadata(\n unionOptions.map((option) => collectFileFieldSchemaMetadata(option, pathPrefix, activeSchemas)),\n );\n }\n\n const plainUnionOptions = getPlainUnionObjectOptions(unwrappedSchema);\n if (plainUnionOptions.length > 0) {\n const plainUnionMetadata = plainUnionOptions.map((option) =>\n collectFileFieldSchemaMetadata(option, pathPrefix, activeSchemas),\n );\n if (plainUnionMetadata.some((entries) => entries.length > 0)) {\n throw new UnsupportedPlainUnionFileFieldSchemaError(pathPrefix || '<root>');\n }\n }\n\n return [];\n } finally {\n activeSchemas.delete(schema);\n }\n}\n\nexport function getFileFieldSchemaMetadataByPath(\n schema: z.ZodTypeAny | undefined,\n fieldName: string,\n): ResolvedFileFieldSchemaMetadata | undefined {\n return collectFileFieldSchemaMetadata(schema).find(\n (entry) => entry.fieldName === fieldName,\n );\n}\n\nfunction getOwnerStableId(owner: unknown): string | undefined {\n if (!owner || typeof owner !== 'object') {\n return undefined;\n }\n\n const candidateId = (owner as Record<string, unknown>).id ?? (owner as Record<string, unknown>)._id;\n return typeof candidateId === 'string' && candidateId.trim() !== ''\n ? candidateId\n : undefined;\n}\n\nexport function enumerateFileFieldValueOccurrences(\n data: unknown,\n canonicalFieldPath: string,\n): FileFieldValueOccurrence[] {\n if (!canonicalFieldPath.trim()) {\n return [];\n }\n\n const tokens = canonicalFieldPath.split('.').filter(Boolean);\n if (tokens.length === 0) {\n return [];\n }\n\n const occurrences: FileFieldValueOccurrence[] = [];\n\n const visit = (\n current: unknown,\n tokenIndex: number,\n runtimePath: string,\n ): void => {\n if (current === null || current === undefined) {\n return;\n }\n\n if (Array.isArray(current)) {\n current.forEach((item, index) => {\n const nextRuntimePath = runtimePath ? `${runtimePath}[${index}]` : `[${index}]`;\n visit(item, tokenIndex, nextRuntimePath);\n });\n return;\n }\n\n if (typeof current !== 'object') {\n return;\n }\n\n const token = tokens[tokenIndex];\n const nextValue = (current as Record<string, unknown>)[token];\n const nextRuntimePath = runtimePath ? `${runtimePath}.${token}` : token;\n\n if (tokenIndex === tokens.length - 1) {\n if (nextValue !== null && nextValue !== undefined) {\n occurrences.push({\n canonicalFieldPath,\n runtimeFieldPath: nextRuntimePath,\n ownerRuntimePath: runtimePath || undefined,\n ownerStableId: getOwnerStableId(current),\n value: nextValue,\n });\n }\n return;\n }\n\n visit(nextValue, tokenIndex + 1, nextRuntimePath);\n };\n\n visit(data, 0, '');\n return occurrences;\n}\n\nexport function hasExplicitCanonicalFieldMutation(\n patchData: unknown,\n canonicalFieldPath: string,\n): boolean {\n if (\n !patchData\n || typeof patchData !== 'object'\n || !canonicalFieldPath.trim()\n ) {\n return false;\n }\n\n const tokens = canonicalFieldPath.split('.').filter(Boolean);\n if (tokens.length === 0) {\n return false;\n }\n\n const visit = (current: unknown, tokenIndex: number): boolean => {\n if (Array.isArray(current)) {\n return current.length === 0\n ? true\n : current.some((item) => visit(item, tokenIndex));\n }\n\n if (!current || typeof current !== 'object') {\n return true;\n }\n\n const token = tokens[tokenIndex];\n if (!Object.prototype.hasOwnProperty.call(current, token)) {\n return false;\n }\n\n if (tokenIndex === tokens.length - 1) {\n return true;\n }\n\n return visit((current as Record<string, unknown>)[token], tokenIndex + 1);\n };\n\n return visit(patchData, 0);\n}\n\nexport function mergeEffectiveResourceState(\n existingResource: unknown,\n patchData: unknown,\n): unknown {\n if (patchData === undefined) {\n return existingResource;\n }\n\n if (patchData === null || existingResource === null) {\n return patchData;\n }\n\n if (Array.isArray(patchData)) {\n return patchData;\n }\n\n if (typeof patchData !== 'object') {\n return patchData;\n }\n\n if (Array.isArray(existingResource) || typeof existingResource !== 'object') {\n return patchData;\n }\n\n const existingRecord = existingResource as Record<string, unknown>;\n const patchRecord = patchData as Record<string, unknown>;\n const mergedEntries = new Map<string, unknown>(\n Object.entries(existingRecord),\n );\n\n for (const [key, value] of Object.entries(patchRecord)) {\n mergedEntries.set(key, mergeEffectiveResourceState(existingRecord[key], value));\n }\n\n return Object.fromEntries(mergedEntries);\n}\n\nexport function setValueAtRuntimePath(\n target: Record<string, unknown> | unknown[],\n runtimePath: string,\n value: unknown,\n): void {\n const normalizedSegments = runtimePath\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n\n if (normalizedSegments.length === 0) {\n return;\n }\n\n let current: unknown = target;\n\n for (let index = 0; index < normalizedSegments.length - 1; index += 1) {\n const segment = normalizedSegments[index];\n if (Array.isArray(current)) {\n current = current[Number(segment)];\n continue;\n }\n\n if (!current || typeof current !== 'object') {\n return;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n const finalSegment = normalizedSegments[normalizedSegments.length - 1];\n if (Array.isArray(current)) {\n current[Number(finalSegment)] = value;\n return;\n }\n\n if (!current || typeof current !== 'object') {\n return;\n }\n\n (current as Record<string, unknown>)[finalSegment] = value;\n}\n"]}
1
+ {"version":3,"file":"file-field-schema-path.backend.utils.js","sourceRoot":"","sources":["../../../../../src/files/utils/file-field-schema-path.backend.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ## Coverage: unit tests only, accepted deliberately — 2026-09-08 (#467)\n *\n * This walker's descent through nested objects, arrays and discriminated unions — including its\n * refusals for records, maps, sets, tuples and plain unions — has never executed outside its own\n * unit tests. Every `z_file()` field declared in the engine and in BOTH example applications sits\n * at the TOP LEVEL of its resource, so nothing reaches the descent.\n *\n * Nothing is wrong here. The gap is that no application has a reason to declare the shape, and\n * buying the proof would mean authoring a declaration for the purpose of testing it — which proves\n * the harness more than the product. That trade was weighed and taken; the project's usual bar\n * (unit + integration + end-to-end for a shipped subsystem) is knowingly not met.\n *\n * **What would change the answer:** an application declaring a nested or repeated `z_file()` field.\n * Whoever does that first is the first party to execute this code path, and should treat a surprise\n * there as expected rather than as a new defect.\n *\n * Do NOT read this note as an invitation to narrow the walker to the shapes something uses today —\n * that was the third option and it was not chosen.\n */\n\nimport { z } from 'zod';\nimport {\n getFileMetadata,\n getZodDef,\n getZodDefArrayProperty,\n getZodDefProperty,\n getZodDefSchemaProperty,\n getZodDefStringProperty,\n getZodObjectShape,\n getZodType,\n isFileSchema,\n isZodArray,\n isZodDefault,\n isZodNullable,\n isZodObject,\n isZodOptional,\n type FileSchemaMetadata,\n unwrapSchema,\n} from '@wildo-ai/zod-decorators';\n\nexport interface ResolvedFileFieldSchemaMetadata {\n fieldName: string;\n fileMetadata: FileSchemaMetadata;\n}\n\nexport interface FileFieldValueOccurrence {\n canonicalFieldPath: string;\n runtimeFieldPath: string;\n ownerRuntimePath?: string;\n ownerStableId?: string;\n value: unknown;\n}\n\nexport class IncompatibleFileFieldSchemaPathError extends Error {\n constructor(\n public readonly fieldName: string,\n public readonly existingMetadata: FileSchemaMetadata,\n public readonly conflictingMetadata: FileSchemaMetadata,\n ) {\n super(\n `Incompatible z_file() metadata detected for canonical file field path \"${fieldName}\".`,\n );\n this.name = 'IncompatibleFileFieldSchemaPathError';\n }\n}\n\nexport class UnsupportedPlainUnionFileFieldSchemaError extends Error {\n constructor(public readonly fieldName: string) {\n super(\n `Unsupported z.union() file field schema detected at \"${fieldName}\". File fields inside non-discriminated unions must use z.discriminatedUnion().`,\n );\n this.name = 'UnsupportedPlainUnionFileFieldSchemaError';\n }\n}\n\nexport class UnsupportedDynamicContainerFileFieldSchemaError extends Error {\n constructor(public readonly fieldName: string) {\n super(\n `Unsupported dynamic-container file field schema detected at \"${fieldName}\". File fields inside z.record(), z.map(), z.set(), or z.tuple() are not supported by runtime file occurrence processing.`,\n );\n this.name = 'UnsupportedDynamicContainerFileFieldSchemaError';\n }\n}\n\nfunction getDiscriminatedUnionObjectOptions(schema: z.ZodTypeAny): z.ZodObject<any>[] {\n if (getZodDefStringProperty(schema, 'discriminator') === undefined) {\n return [];\n }\n\n const options = getZodDefArrayProperty(schema, 'options') as z.ZodTypeAny[] | undefined;\n if (!options?.length) {\n return [];\n }\n\n return options.filter((option): option is z.ZodObject<any> => isZodObject(option));\n}\n\nfunction getPlainUnionObjectOptions(schema: z.ZodTypeAny): z.ZodObject<any>[] {\n if (getZodDefStringProperty(schema, 'discriminator') !== undefined) {\n return [];\n }\n\n const options = getZodDefArrayProperty(schema, 'options') as z.ZodTypeAny[] | undefined;\n if (!options?.length) {\n return [];\n }\n\n return options.filter((option): option is z.ZodObject<any> => isZodObject(option));\n}\n\nfunction normalizeMetadataForComparison(\n value: unknown,\n): unknown {\n if (Array.isArray(value)) {\n return value.map(normalizeMetadataForComparison);\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, childValue]) => [key, normalizeMetadataForComparison(childValue)]),\n );\n }\n\n return value;\n}\n\nfunction areFileMetadataCompatible(\n left: FileSchemaMetadata,\n right: FileSchemaMetadata,\n): boolean {\n return JSON.stringify(normalizeMetadataForComparison(left))\n === JSON.stringify(normalizeMetadataForComparison(right));\n}\n\nfunction mergeCompatibleFileFieldMetadata(\n groups: ResolvedFileFieldSchemaMetadata[][],\n): ResolvedFileFieldSchemaMetadata[] {\n const merged = new Map<string, ResolvedFileFieldSchemaMetadata>();\n\n for (const group of groups) {\n for (const entry of group) {\n const existing = merged.get(entry.fieldName);\n if (!existing) {\n merged.set(entry.fieldName, entry);\n continue;\n }\n\n if (!areFileMetadataCompatible(existing.fileMetadata, entry.fileMetadata)) {\n throw new IncompatibleFileFieldSchemaPathError(\n entry.fieldName,\n existing.fileMetadata,\n entry.fileMetadata,\n );\n }\n }\n }\n\n return Array.from(merged.values()).sort((left, right) =>\n left.fieldName.localeCompare(right.fieldName),\n );\n}\n\nexport function collectFileFieldSchemaMetadata(\n schema: z.ZodTypeAny | undefined,\n pathPrefix: string = '',\n activeSchemas: WeakSet<object> = new WeakSet<object>(),\n): ResolvedFileFieldSchemaMetadata[] {\n if (!schema) {\n return [];\n }\n\n if (activeSchemas.has(schema)) {\n return [];\n }\n\n activeSchemas.add(schema);\n try {\n const rawSchemaType = getZodType(schema);\n if (rawSchemaType === 'pipe') {\n const inSchema = getZodDefSchemaProperty(schema, 'in');\n const outSchema = getZodDefSchemaProperty(schema, 'out');\n return mergeCompatibleFileFieldMetadata([\n collectFileFieldSchemaMetadata(inSchema, pathPrefix, activeSchemas),\n collectFileFieldSchemaMetadata(outSchema, pathPrefix, activeSchemas),\n ]);\n }\n\n if (isZodOptional(schema) || isZodNullable(schema) || isZodDefault(schema)) {\n const innerSchema = getZodDefSchemaProperty(schema, 'innerType');\n return collectFileFieldSchemaMetadata(innerSchema, pathPrefix, activeSchemas);\n }\n\n const unwrappedSchema = unwrapSchema(schema);\n if (unwrappedSchema !== schema) {\n return collectFileFieldSchemaMetadata(unwrappedSchema, pathPrefix, activeSchemas);\n }\n\n if (isFileSchema(unwrappedSchema)) {\n const fileMetadata = getFileMetadata(unwrappedSchema);\n if (!fileMetadata?.isFile || !pathPrefix) {\n return [];\n }\n\n return [\n {\n fieldName: pathPrefix,\n fileMetadata,\n },\n ];\n }\n\n if (isZodArray(unwrappedSchema)) {\n const elementSchema = getZodDefProperty(unwrappedSchema, 'element') as z.ZodTypeAny | undefined;\n return collectFileFieldSchemaMetadata(elementSchema, pathPrefix, activeSchemas);\n }\n\n const schemaType = getZodType(unwrappedSchema);\n if (schemaType === 'record' || schemaType === 'map' || schemaType === 'set') {\n const valueSchema = getZodDefSchemaProperty(unwrappedSchema, 'valueType');\n const dynamicContainerMetadata = collectFileFieldSchemaMetadata(valueSchema, pathPrefix, activeSchemas);\n if (dynamicContainerMetadata.length > 0) {\n throw new UnsupportedDynamicContainerFileFieldSchemaError(pathPrefix || '<root>');\n }\n return [];\n }\n\n if (schemaType === 'tuple') {\n const tupleItems = getZodDefArrayProperty(unwrappedSchema, 'items') as z.ZodTypeAny[] | undefined;\n const restSchema = getZodDefSchemaProperty(unwrappedSchema, 'rest');\n const tupleMetadata = mergeCompatibleFileFieldMetadata([\n ...((tupleItems ?? []).map((item) =>\n collectFileFieldSchemaMetadata(item, pathPrefix, activeSchemas)\n )),\n collectFileFieldSchemaMetadata(restSchema, pathPrefix, activeSchemas),\n ]);\n if (tupleMetadata.length > 0) {\n throw new UnsupportedDynamicContainerFileFieldSchemaError(pathPrefix || '<root>');\n }\n return [];\n }\n\n if (isZodObject(unwrappedSchema)) {\n const shape = getZodObjectShape(unwrappedSchema);\n return Object.entries(shape).flatMap(([fieldName, fieldSchema]) => {\n const nextPath = pathPrefix ? `${pathPrefix}.${fieldName}` : fieldName;\n return collectFileFieldSchemaMetadata(fieldSchema as z.ZodTypeAny, nextPath, activeSchemas);\n });\n }\n\n if (schemaType === 'lazy') {\n const lazyGetter = getZodDef(unwrappedSchema)?.getter;\n const lazySchema = typeof lazyGetter === 'function'\n ? lazyGetter()\n : undefined;\n return collectFileFieldSchemaMetadata(lazySchema as z.ZodTypeAny | undefined, pathPrefix, activeSchemas);\n }\n\n if (schemaType === 'intersection') {\n const leftSchema = getZodDefSchemaProperty(unwrappedSchema, 'left');\n const rightSchema = getZodDefSchemaProperty(unwrappedSchema, 'right');\n return mergeCompatibleFileFieldMetadata([\n collectFileFieldSchemaMetadata(leftSchema, pathPrefix, activeSchemas),\n collectFileFieldSchemaMetadata(rightSchema, pathPrefix, activeSchemas),\n ]);\n }\n\n const unionOptions = getDiscriminatedUnionObjectOptions(unwrappedSchema);\n if (unionOptions.length > 0) {\n return mergeCompatibleFileFieldMetadata(\n unionOptions.map((option) => collectFileFieldSchemaMetadata(option, pathPrefix, activeSchemas)),\n );\n }\n\n const plainUnionOptions = getPlainUnionObjectOptions(unwrappedSchema);\n if (plainUnionOptions.length > 0) {\n const plainUnionMetadata = plainUnionOptions.map((option) =>\n collectFileFieldSchemaMetadata(option, pathPrefix, activeSchemas),\n );\n if (plainUnionMetadata.some((entries) => entries.length > 0)) {\n throw new UnsupportedPlainUnionFileFieldSchemaError(pathPrefix || '<root>');\n }\n }\n\n return [];\n } finally {\n activeSchemas.delete(schema);\n }\n}\n\nexport function getFileFieldSchemaMetadataByPath(\n schema: z.ZodTypeAny | undefined,\n fieldName: string,\n): ResolvedFileFieldSchemaMetadata | undefined {\n return collectFileFieldSchemaMetadata(schema).find(\n (entry) => entry.fieldName === fieldName,\n );\n}\n\nfunction getOwnerStableId(owner: unknown): string | undefined {\n if (!owner || typeof owner !== 'object') {\n return undefined;\n }\n\n const candidateId = (owner as Record<string, unknown>).id ?? (owner as Record<string, unknown>)._id;\n return typeof candidateId === 'string' && candidateId.trim() !== ''\n ? candidateId\n : undefined;\n}\n\nexport function enumerateFileFieldValueOccurrences(\n data: unknown,\n canonicalFieldPath: string,\n): FileFieldValueOccurrence[] {\n if (!canonicalFieldPath.trim()) {\n return [];\n }\n\n const tokens = canonicalFieldPath.split('.').filter(Boolean);\n if (tokens.length === 0) {\n return [];\n }\n\n const occurrences: FileFieldValueOccurrence[] = [];\n\n const visit = (\n current: unknown,\n tokenIndex: number,\n runtimePath: string,\n ): void => {\n if (current === null || current === undefined) {\n return;\n }\n\n if (Array.isArray(current)) {\n current.forEach((item, index) => {\n const nextRuntimePath = runtimePath ? `${runtimePath}[${index}]` : `[${index}]`;\n visit(item, tokenIndex, nextRuntimePath);\n });\n return;\n }\n\n if (typeof current !== 'object') {\n return;\n }\n\n const token = tokens[tokenIndex];\n const nextValue = (current as Record<string, unknown>)[token];\n const nextRuntimePath = runtimePath ? `${runtimePath}.${token}` : token;\n\n if (tokenIndex === tokens.length - 1) {\n if (nextValue !== null && nextValue !== undefined) {\n occurrences.push({\n canonicalFieldPath,\n runtimeFieldPath: nextRuntimePath,\n ownerRuntimePath: runtimePath || undefined,\n ownerStableId: getOwnerStableId(current),\n value: nextValue,\n });\n }\n return;\n }\n\n visit(nextValue, tokenIndex + 1, nextRuntimePath);\n };\n\n visit(data, 0, '');\n return occurrences;\n}\n\nexport function hasExplicitCanonicalFieldMutation(\n patchData: unknown,\n canonicalFieldPath: string,\n): boolean {\n if (\n !patchData\n || typeof patchData !== 'object'\n || !canonicalFieldPath.trim()\n ) {\n return false;\n }\n\n const tokens = canonicalFieldPath.split('.').filter(Boolean);\n if (tokens.length === 0) {\n return false;\n }\n\n const visit = (current: unknown, tokenIndex: number): boolean => {\n if (Array.isArray(current)) {\n return current.length === 0\n ? true\n : current.some((item) => visit(item, tokenIndex));\n }\n\n if (!current || typeof current !== 'object') {\n return true;\n }\n\n const token = tokens[tokenIndex];\n if (!Object.prototype.hasOwnProperty.call(current, token)) {\n return false;\n }\n\n if (tokenIndex === tokens.length - 1) {\n return true;\n }\n\n return visit((current as Record<string, unknown>)[token], tokenIndex + 1);\n };\n\n return visit(patchData, 0);\n}\n\nexport function mergeEffectiveResourceState(\n existingResource: unknown,\n patchData: unknown,\n): unknown {\n if (patchData === undefined) {\n return existingResource;\n }\n\n if (patchData === null || existingResource === null) {\n return patchData;\n }\n\n if (Array.isArray(patchData)) {\n return patchData;\n }\n\n if (typeof patchData !== 'object') {\n return patchData;\n }\n\n if (Array.isArray(existingResource) || typeof existingResource !== 'object') {\n return patchData;\n }\n\n const existingRecord = existingResource as Record<string, unknown>;\n const patchRecord = patchData as Record<string, unknown>;\n const mergedEntries = new Map<string, unknown>(\n Object.entries(existingRecord),\n );\n\n for (const [key, value] of Object.entries(patchRecord)) {\n mergedEntries.set(key, mergeEffectiveResourceState(existingRecord[key], value));\n }\n\n return Object.fromEntries(mergedEntries);\n}\n\nexport function setValueAtRuntimePath(\n target: Record<string, unknown> | unknown[],\n runtimePath: string,\n value: unknown,\n): void {\n const normalizedSegments = runtimePath\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n\n if (normalizedSegments.length === 0) {\n return;\n }\n\n let current: unknown = target;\n\n for (let index = 0; index < normalizedSegments.length - 1; index += 1) {\n const segment = normalizedSegments[index];\n if (Array.isArray(current)) {\n current = current[Number(segment)];\n continue;\n }\n\n if (!current || typeof current !== 'object') {\n return;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n const finalSegment = normalizedSegments[normalizedSegments.length - 1];\n if (Array.isArray(current)) {\n current[Number(finalSegment)] = value;\n return;\n }\n\n if (!current || typeof current !== 'object') {\n return;\n }\n\n (current as Record<string, unknown>)[finalSegment] = value;\n}\n"]}