@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":"frontend-bootstrap.backend.service.js","sourceRoot":"","sources":["../../../../../src/external-providers/services/frontend-bootstrap.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `FrontendBootstrapBackendService` — the SOLE cross-facet seam where\n * backend code projects a frontend-safe provider slice into the existing\n * `/application-config` bootstrap payload.\n *\n * The service prefers the generated frontend bootstrap payload baked into the\n * backend runtime artifact for the requested frontend service. When that\n * payload is absent, it falls back to resolving the declared scope against the\n * engine public frontend registries for the corresponding facet. No\n * backend-only fields can cross this seam.\n *\n * See `.cursor/plans/provider-registration-refactor-implementation-plan.md`\n * §Phase 0.9.\n */\n\nimport { inject, injectable } from 'inversify';\nimport {\n AppFrontendType,\n ErrorCustomMessageReference,\n ErrorType,\n type FrontendAppBootstrapPayload,\n type FrontendProviderEntry,\n type FrontendProvidersBlock,\n} from '@wildo-ai/saas-models';\nimport {\n EngineFrontendAppProviderRegistry,\n type FrontendAppProviderModule,\n} from '@wildo-ai/external-connectors-public/app';\nimport {\n EngineFrontendTechdocProviderRegistry,\n type FrontendTechdocProviderModule,\n} from '@wildo-ai/external-connectors-public/techdoc';\nimport {\n EngineFrontendWebsiteProviderRegistry,\n type FrontendWebsiteProviderModule,\n} from '@wildo-ai/external-connectors-public/website';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\n\nexport type {\n FrontendAppBootstrapPayload,\n FrontendProviderEntry,\n FrontendProvidersBlock,\n} from '@wildo-ai/saas-models';\n\ntype FrontendRuntimeProviderModule =\n | FrontendAppProviderModule\n | FrontendTechdocProviderModule\n | FrontendWebsiteProviderModule;\n\ninterface FrontendRuntimeProviderRegistry {\n getProviderByRef(ref: string): FrontendRuntimeProviderModule | undefined;\n}\n\nexport interface FrontendBootstrapBackendService {\n /**\n * Builds the per-frontend-service payload. `frontendType` selects\n * which facet registry (frontendApp / frontendTechdoc /\n * frontendWebsite) is projected; `frontendServiceName` disambiguates\n * when an app declares multiple services of the same `AppFrontendType`\n * (e.g. customer + admin SaaS-app frontends).\n */\n buildPayload(args: {\n frontendType: AppFrontendType;\n frontendServiceName: string;\n }): Promise<FrontendAppBootstrapPayload>;\n}\n\n@injectable()\nexport class DefaultFrontendBootstrapBackendService\n implements FrontendBootstrapBackendService\n{\n constructor(\n @inject(SAAS_SERVICE_TYPES.AppConfigService)\n private readonly appConfigService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService)\n private readonly errorBuilder: ErrorBuilderBackendService,\n ) {}\n\n async buildPayload(args: {\n frontendType: AppFrontendType;\n frontendServiceName: string;\n }): Promise<FrontendAppBootstrapPayload> {\n return {\n frontendProviders: this.buildFrontendProvidersBlock(args),\n };\n }\n\n private buildFrontendProvidersBlock(args: {\n frontendType: AppFrontendType;\n frontendServiceName: string;\n }): FrontendProvidersBlock {\n const generatedBootstrap = this.appConfigService.getFrontendProviderBootstrap(\n args.frontendServiceName,\n );\n if (generatedBootstrap) {\n return generatedBootstrap;\n }\n\n const scope =\n this.appConfigService.config.providers?.scopes?.frontendServices?.[\n args.frontendServiceName\n ];\n\n if (!scope) {\n return { providers: {} };\n }\n\n const registry = this.resolveRegistry(args.frontendType);\n const providers = Object.fromEntries(\n Object.keys(scope.providers).map((providerRef) => [\n providerRef,\n this.resolveProviderEntry({\n providerRef,\n frontendType: args.frontendType,\n frontendServiceName: args.frontendServiceName,\n registry,\n }),\n ]),\n );\n\n return { providers };\n }\n\n private resolveProviderEntry(args: {\n providerRef: string;\n frontendType: AppFrontendType;\n frontendServiceName: string;\n registry: FrontendRuntimeProviderRegistry;\n }): FrontendProviderEntry {\n const provider = args.registry.getProviderByRef(args.providerRef);\n if (!provider) {\n throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message:\n `Frontend provider \"${args.providerRef}\" is declared for frontend service ` +\n `\"${args.frontendServiceName}\" but no public ${args.frontendType} module is available.`,\n frontendType: args.frontendType,\n frontendServiceName: args.frontendServiceName,\n providerRef: args.providerRef,\n },\n });\n }\n\n return {\n metadata: provider.metadata,\n providerCapabilities: [...provider.providerCapabilities],\n protocols: [...provider.protocols],\n publicConfig: provider.publicConfig,\n };\n }\n\n private resolveRegistry(\n frontendType: AppFrontendType,\n ): FrontendRuntimeProviderRegistry {\n switch (frontendType) {\n case AppFrontendType.SAAS_APP:\n return EngineFrontendAppProviderRegistry;\n case AppFrontendType.TECH_DOC:\n return EngineFrontendTechdocProviderRegistry;\n case AppFrontendType.STATIC_WEBSITE:\n return EngineFrontendWebsiteProviderRegistry;\n default: {\n const exhaustiveCheck: never = frontendType;\n return exhaustiveCheck;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"frontend-bootstrap.backend.service.js","sourceRoot":"","sources":["../../../../../src/external-providers/services/frontend-bootstrap.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `FrontendBootstrapBackendService` — the SOLE cross-facet seam where\n * backend code projects a frontend-safe provider slice into the existing\n * `/application-config` bootstrap payload.\n *\n * The service prefers the generated frontend bootstrap payload baked into the\n * backend runtime artifact for the requested frontend service. When that\n * payload is absent, it falls back to resolving the declared scope against the\n * engine public frontend registries for the corresponding facet. No\n * backend-only fields can cross this seam.\n *\n * See `.cursor/plans/provider-registration-refactor-implementation-plan.md`\n * §Phase 0.9.\n */\n\nimport { inject, injectable } from 'inversify';\nimport {\n AppFrontendType,\n ErrorCustomMessageReference,\n ErrorType,\n normalizeProviderFrontendCspFootprint,\n type FrontendAppBootstrapPayload,\n type FrontendProviderEntry,\n type FrontendProvidersBlock,\n} from '@wildo-ai/saas-models';\nimport {\n EngineFrontendAppProviderRegistry,\n projectFrontendComponentDescriptors,\n type FrontendAppProviderModule,\n} from '@wildo-ai/external-connectors-public/app';\nimport {\n EngineFrontendTechdocProviderRegistry,\n type FrontendTechdocProviderModule,\n} from '@wildo-ai/external-connectors-public/techdoc';\nimport {\n EngineFrontendWebsiteProviderRegistry,\n type FrontendWebsiteProviderModule,\n} from '@wildo-ai/external-connectors-public/website';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\n\nexport type {\n FrontendAppBootstrapPayload,\n FrontendProviderEntry,\n FrontendProvidersBlock,\n} from '@wildo-ai/saas-models';\n\ntype FrontendRuntimeProviderModule =\n | FrontendAppProviderModule\n | FrontendTechdocProviderModule\n | FrontendWebsiteProviderModule;\n\ninterface FrontendRuntimeProviderRegistry {\n getProviderByRef(ref: string): FrontendRuntimeProviderModule | undefined;\n}\n\nexport interface FrontendBootstrapBackendService {\n /**\n * Builds the per-frontend-service payload. `frontendType` selects\n * which facet registry (frontendApp / frontendTechdoc /\n * frontendWebsite) is projected; `frontendServiceName` disambiguates\n * when an app declares multiple services of the same `AppFrontendType`\n * (e.g. customer + admin SaaS-app frontends).\n */\n buildPayload(args: {\n frontendType: AppFrontendType;\n frontendServiceName: string;\n }): Promise<FrontendAppBootstrapPayload>;\n}\n\n@injectable()\nexport class DefaultFrontendBootstrapBackendService\n implements FrontendBootstrapBackendService\n{\n constructor(\n @inject(SAAS_SERVICE_TYPES.AppConfigService)\n private readonly appConfigService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService)\n private readonly errorBuilder: ErrorBuilderBackendService,\n ) {}\n\n async buildPayload(args: {\n frontendType: AppFrontendType;\n frontendServiceName: string;\n }): Promise<FrontendAppBootstrapPayload> {\n return {\n frontendProviders: this.buildFrontendProvidersBlock(args),\n };\n }\n\n private buildFrontendProvidersBlock(args: {\n frontendType: AppFrontendType;\n frontendServiceName: string;\n }): FrontendProvidersBlock {\n const generatedBootstrap = this.appConfigService.getFrontendProviderBootstrap(\n args.frontendServiceName,\n );\n if (generatedBootstrap) {\n return generatedBootstrap;\n }\n\n const scope =\n this.appConfigService.config.providers?.scopes?.frontendServices?.[\n args.frontendServiceName\n ];\n\n if (!scope) {\n return { providers: {} };\n }\n\n const registry = this.resolveRegistry(args.frontendType);\n const providers = Object.fromEntries(\n Object.keys(scope.providers).map((providerRef) => [\n providerRef,\n this.resolveProviderEntry({\n providerRef,\n frontendType: args.frontendType,\n frontendServiceName: args.frontendServiceName,\n registry,\n }),\n ]),\n );\n\n return { providers };\n }\n\n private resolveProviderEntry(args: {\n providerRef: string;\n frontendType: AppFrontendType;\n frontendServiceName: string;\n registry: FrontendRuntimeProviderRegistry;\n }): FrontendProviderEntry {\n const provider = args.registry.getProviderByRef(args.providerRef);\n if (!provider) {\n throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message:\n `Frontend provider \"${args.providerRef}\" is declared for frontend service ` +\n `\"${args.frontendServiceName}\" but no public ${args.frontendType} module is available.`,\n frontendType: args.frontendType,\n frontendServiceName: args.frontendServiceName,\n providerRef: args.providerRef,\n },\n });\n }\n\n return {\n metadata: provider.metadata,\n providerCapabilities: [...provider.providerCapabilities],\n protocols: [...provider.protocols],\n publicConfig: provider.publicConfig,\n // The DATA half of the frontend surface (#332, #380). This is the SECOND\n // site that projects a module into an entry —\n // `projectFrontendProviderContribution` in\n // `external-connectors-public/companion-exports.ts` is the first, and it\n // feeds the generated artifact this method is the fallback for. Omitting\n // any of these fields here would make a provider's CSP footprint, SDK\n // descriptor or component declarations depend on whether a sync had run,\n // which is a difference no consumer can see and only production can\n // punish.\n //\n // `components` was added second and briefly landed on the first site only,\n // which is the shape this comment already warned about — hence the shared\n // projection below rather than a second spread here.\n // A module AUTHORS a partial footprint — name the buckets you reach — and\n // the wire carries all of them, so the CSP composer never branches on\n // absence and the hydration join has two comparable shapes. Normalized\n // through the one shared function rather than spread here, because a\n // second opinion about whether an unnamed bucket is `[]` or absent is\n // read by that join as a stale artifact.\n csp: provider.csp === undefined ? undefined : normalizeProviderFrontendCspFootprint(provider.csp),\n scripts: provider.scripts === undefined ? undefined : [...provider.scripts],\n sdk: provider.sdk?.descriptor,\n components: projectFrontendComponentDescriptors(provider.components),\n };\n }\n\n private resolveRegistry(\n frontendType: AppFrontendType,\n ): FrontendRuntimeProviderRegistry {\n switch (frontendType) {\n case AppFrontendType.SAAS_APP:\n return EngineFrontendAppProviderRegistry;\n case AppFrontendType.TECH_DOC:\n return EngineFrontendTechdocProviderRegistry;\n case AppFrontendType.STATIC_WEBSITE:\n return EngineFrontendWebsiteProviderRegistry;\n default: {\n const exhaustiveCheck: never = frontendType;\n return exhaustiveCheck;\n }\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"file.controller.d.ts","sourceRoot":"","sources":["../../../../../src/files/controllers/file.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,OAAO,EAAE,gCAAgC,EAAE,MAAM,0FAA0F,CAAC;AAC5I,OAAO,EAAE,+BAA+B,EAAE,MAAM,0EAA0E,CAAC;AAC3H,OAAO,EAAE,qCAAqC,EAAE,MAAM,+EAA+E,CAAC;AACtI,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAC9F,OAAO,EAAE,gCAAgC,EAAE,MAAM,wEAAwE,CAAC;AAE1H,OAAO,EAAE,6BAA6B,EAAE,MAAM,yFAAyF,CAAC;AAGxI,OAAO,EAAE,yCAAyC,EAAE,MAAM,qGAAqG,CAAC;AAGhK,OAAO,EAAE,6BAA6B,EAAE,MAAM,qEAAqE,CAAC;AACpH,OAAO,EAAE,uBAAuB,EAAE,MAAM,+DAA+D,CAAC;AAUxG,qBACa,cAAe,SAAQ,gCAAgC;IAMhE,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IAExC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAEvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAErC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAEvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAlBE,MAAM,EAAE,GAAG,EACE,YAAY,EAAE,GAAG,EACjB,YAAY,EAAE,GAAG,EAEhD,iBAAiB,EAAE,+BAA+B,EAElD,uBAAuB,EAAE,qCAAqC,EAE9D,YAAY,EAAE,mBAAmB,EAEjC,sBAAsB,EAAE,6BAA6B,EAErD,oBAAoB,EAAE,yCAAyC,EAE/D,kBAAkB,EAAE,gCAAgC,EAEpD,sBAAsB,EAAE,6BAA6B,EAErD,gBAAgB,EAAE,uBAAuB;IAK5D;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IA0B7B;;;;;;;;;;;OAWG;IACH;;;;;;;;OAQG;YACW,qBAAqB;IAWnC;;;;;;;OAOG;YACW,iBAAiB;IAuB/B,OAAO,CAAC,oBAAoB;IAO5B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,6BAA6B;IAUrC,OAAO,CAAC,sBAAsB;IAa9B;;;;OAIG;YACW,yBAAyB;IAuBvC;;;;;OAKG;IACH,OAAO,CAAC,yCAAyC;IA0BjD;;;;;;;;OAQG;YACW,iBAAiB;IAoC/B;;;OAGG;YACW,gBAAgB;IAI9B;;;;OAIG;YACW,yBAAyB;IA4BvC;;;;;OAKG;YACW,YAAY;IAiH1B;;;;;;;;OAQG;YACW,qBAAqB;IAYnC;;;;;OAKG;YACW,eAAe;IAyF7B;;;;;;OAMG;YACW,UAAU;IAsJxB;;;;;;;;;;;;;OAaG;YACW,SAAS;IA8HvB;;;;OAIG;IACH,OAAO,CAAC,2CAA2C;IAoDnD;;;;;;OAMG;YACW,eAAe;IAa7B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,4BAA4B;CAqCrC"}
1
+ {"version":3,"file":"file.controller.d.ts","sourceRoot":"","sources":["../../../../../src/files/controllers/file.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsBH,OAAO,EAAE,gCAAgC,EAAE,MAAM,0FAA0F,CAAC;AAC5I,OAAO,EAAE,+BAA+B,EAAE,MAAM,0EAA0E,CAAC;AAC3H,OAAO,EAAE,qCAAqC,EAAE,MAAM,+EAA+E,CAAC;AACtI,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAC9F,OAAO,EAAE,gCAAgC,EAAE,MAAM,wEAAwE,CAAC;AAE1H,OAAO,EAAE,6BAA6B,EAAE,MAAM,yFAAyF,CAAC;AAGxI,OAAO,EAAE,yCAAyC,EAAE,MAAM,qGAAqG,CAAC;AAGhK,OAAO,EAAE,6BAA6B,EAAE,MAAM,qEAAqE,CAAC;AACpH,OAAO,EAAE,uBAAuB,EAAE,MAAM,+DAA+D,CAAC;AAUxG,qBACa,cAAe,SAAQ,gCAAgC;IAMhE,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IAExC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAEvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAErC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAEvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAlBE,MAAM,EAAE,GAAG,EACE,YAAY,EAAE,GAAG,EACjB,YAAY,EAAE,GAAG,EAEhD,iBAAiB,EAAE,+BAA+B,EAElD,uBAAuB,EAAE,qCAAqC,EAE9D,YAAY,EAAE,mBAAmB,EAEjC,sBAAsB,EAAE,6BAA6B,EAErD,oBAAoB,EAAE,yCAAyC,EAE/D,kBAAkB,EAAE,gCAAgC,EAEpD,sBAAsB,EAAE,6BAA6B,EAErD,gBAAgB,EAAE,uBAAuB;IAK5D;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAkC7B;;;;;;;;;;;OAWG;IACH;;;;;;;;OAQG;YACW,qBAAqB;IAWnC;;;;;;;OAOG;YACW,iBAAiB;IAuB/B,OAAO,CAAC,oBAAoB;IAO5B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,6BAA6B;IAUrC,OAAO,CAAC,sBAAsB;IAa9B;;;;OAIG;YACW,yBAAyB;IAuBvC;;;;;OAKG;IACH,OAAO,CAAC,yCAAyC;IA0BjD;;;;;;;;OAQG;YACW,iBAAiB;IAoC/B;;;OAGG;YACW,gBAAgB;IAI9B;;;;OAIG;YACW,yBAAyB;IA4BvC;;;;;OAKG;YACW,YAAY;IAiH1B;;;;;;;;OAQG;YACW,qBAAqB;IAYnC;;;;;OAKG;YACW,eAAe;IAyF7B;;;;;;OAMG;YACW,UAAU;IAsJxB;;;;;;;;;;;;;OAaG;YACW,SAAS;IA8HvB;;;;OAIG;IACH,OAAO,CAAC,2CAA2C;IAoDnD;;;;;;OAMG;YACW,eAAe;IAa7B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,4BAA4B;CAqCrC"}
@@ -24,7 +24,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
24
24
  };
25
25
  import { injectable, inject } from 'inversify';
26
26
  import { z } from 'zod';
27
- import { CoreConsumableTokenTypes, ConsumableToken_ConsumptionMode, CoreResourceOperation, CoreResourceType, ExecutionContext_ExecutionType, ErrorType, ErrorCustomMessageReference, FileStatus, FILE_DOWNLOADABLE_STATUSES, FILE_METADATA_WITHHELD_STATUSES, isWildoBackendError, } from '@wildo-ai/saas-models';
27
+ import { CoreConsumableTokenTypes, ConsumableToken_ConsumptionMode, CoreResourceOperation, CoreResourceType, ExecutionContext_ExecutionType, ErrorType, ErrorCustomMessageReference, FileStatus, FILE_DOWNLOADABLE_STATUSES, FILE_METADATA_WITHHELD_STATUSES, isWildoBackendError, MANUAL_CONTROLLER_ROUTES_URLS, ManualControllerRouteKey, } from '@wildo-ai/saas-models';
28
28
  import { SAAS_SERVICE_TYPES } from '../../inject/models/service-types.js';
29
29
  import { AbstractControllerBackendService } from '../../base-classes/services/controllers/abstract-controller.backend.service.js';
30
30
  import { ResourcesRegistryBackendService } from '../../resources/services/resources-registry.backend.service.js';
@@ -76,21 +76,29 @@ let FileController = class FileController extends AbstractControllerBackendServi
76
76
  // File upload grants (issue #312) — registered BEFORE the generic `/files/:fileId` family so that
77
77
  // `upload-grants` can never be read as a fileId. The status read is PUBLIC: the token is the
78
78
  // credential, and the drop page has no session. Revocation is authenticated and addressed by ID.
79
- this.router.get('/files/upload-grants/:token', this.asyncHandler(this.readUploadGrantStatus.bind(this)));
80
- this.logRouteRegistration('GET', '/files/upload-grants/:token', 'Read upload grant status (token-authenticated, public)');
81
- this.router.delete('/files/upload-grants/:grantId', this.asyncHandler(this.revokeUploadGrant.bind(this)));
82
- this.logRouteRegistration('DELETE', '/files/upload-grants/:grantId', 'Revoke an upload grant (minter or super-admin)');
83
- this.router.get('/files/:fileId', this.asyncHandler(this.downloadFile.bind(this)));
84
- this.logRouteRegistration('GET', '/files/:fileId', 'Download file');
79
+ // Paths come from `MANUAL_CONTROLLER_ROUTES_URLS` rather than from literals. They were literals
80
+ // until 2026-09-09, which put them outside every mechanism keyed on `ManualControllerRouteKey` —
81
+ // including the generated API reference, where a file route could therefore never appear.
82
+ const uploadGrantStatusUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_UPLOAD_GRANT_STATUS];
83
+ this.router.get(uploadGrantStatusUrl, this.asyncHandler(this.readUploadGrantStatus.bind(this)));
84
+ this.logRouteRegistration('GET', uploadGrantStatusUrl, 'Read upload grant status (token-authenticated, public)');
85
+ const uploadGrantRevokeUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_UPLOAD_GRANT_REVOKE];
86
+ this.router.delete(uploadGrantRevokeUrl, this.asyncHandler(this.revokeUploadGrant.bind(this)));
87
+ this.logRouteRegistration('DELETE', uploadGrantRevokeUrl, 'Revoke an upload grant (minter or super-admin)');
88
+ const fileItemUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_ITEM];
89
+ this.router.get(fileItemUrl, this.asyncHandler(this.downloadFile.bind(this)));
90
+ this.logRouteRegistration('GET', fileItemUrl, 'Download file');
85
91
  // Get file metadata: GET /files/:fileId/metadata
86
- this.router.get('/files/:fileId/metadata', this.asyncHandler(this.getFileMetadata.bind(this)));
87
- this.logRouteRegistration('GET', '/files/:fileId/metadata', 'Get file metadata');
92
+ const fileMetadataUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_METADATA];
93
+ this.router.get(fileMetadataUrl, this.asyncHandler(this.getFileMetadata.bind(this)));
94
+ this.logRouteRegistration('GET', fileMetadataUrl, 'Get file metadata');
88
95
  // Delete file: DELETE /files/:fileId
89
- this.router.delete('/files/:fileId', this.asyncHandler(this.deleteFile.bind(this)));
90
- this.logRouteRegistration('DELETE', '/files/:fileId', 'Delete file');
96
+ this.router.delete(fileItemUrl, this.asyncHandler(this.deleteFile.bind(this)));
97
+ this.logRouteRegistration('DELETE', fileItemUrl, 'Delete file');
91
98
  // Share file: POST /files/:fileId/share
92
- this.router.post('/files/:fileId/share', this.asyncHandler(this.shareFile.bind(this)));
93
- this.logRouteRegistration('POST', '/files/:fileId/share', 'Generate share link');
99
+ const fileShareUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_SHARE];
100
+ this.router.post(fileShareUrl, this.asyncHandler(this.shareFile.bind(this)));
101
+ this.logRouteRegistration('POST', fileShareUrl, 'Generate share link');
94
102
  }
95
103
  /**
96
104
  * Get the READ operation path for FILES resource.
@@ -1 +1 @@
1
- {"version":3,"file":"file.controller.js","sourceRoot":"","sources":["../../../../../src/files/controllers/file.controller.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * File Controller Backend Service\n *\n * Handles file download, metadata retrieval, deletion, and sharing.\n * Provides global file access endpoints independent of resource context.\n *\n * Routes:\n * - GET /files/:fileId - Download file (supports ?consumable_token=... for public access)\n * - GET /files/:fileId/metadata - Get file metadata (supports ?consumable_token=...)\n * - DELETE /files/:fileId - Delete file (unlinked only)\n * - POST /files/:fileId/share - Generate a shareable consumable token\n */\n\nimport { injectable, inject } from 'inversify';\nimport { Request, Response, NextFunction } from 'express';\nimport { z } from 'zod';\nimport {\n CoreConsumableTokenTypes,\n ConsumableToken_ConsumptionMode,\n CoreResourceOperation,\n CoreResourceType,\n ExecutionContext_ExecutionType,\n ErrorType,\n ErrorCustomMessageReference,\n FileStatus,\n FILE_DOWNLOADABLE_STATUSES,\n FILE_METADATA_WITHHELD_STATUSES,\n isWildoBackendError,\n} from '@wildo-ai/saas-models';\nimport { File } from '@wildo-ai/saas-models';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { AbstractControllerBackendService } from '~wildo-backend-lib/base-classes/services/controllers/abstract-controller.backend.service';\nimport { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport { ExecutionContextCreatorBackendService } from '~wildo-backend-lib/runtime/services/execution-context-creator.backend.service';\nimport { FilesBackendService } from '~wildo-backend-lib/files/services/files.backend.service';\nimport { FileFieldDetectionBackendService } from '~wildo-backend-lib/files/services/file-field-detection.backend.service';\nimport { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport { ConsumableTokenBackendService } from '~wildo-backend-lib/security/consumable-tokens/services/consumable-token.backend.service';\nimport { ExpiresInDurationSchema, DurationUnit, type DurationValue, type ExpiresInDuration } from '@wildo-ai/zod-decorators';\nimport { resolveFileUploaderPrincipal } from '~wildo-backend-lib/files/utils/file-uploader.utils';\nimport { RepositoriesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/repositories/repositories-registry-handler.backend.service';\nimport { validateFileId } from '~wildo-backend-lib/files/utils/file-validation.utils';\nimport { projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { FileUploadGrantBackendService } from '~wildo-backend-lib/files/services/file-upload-grant.backend.service';\nimport { RateLimitBackendService } from '~wildo-backend-lib/errors/services/rate-limit.backend.service';\n/**\n * Zod schema for POST /files/:fileId/share request body validation.\n * All fields are optional — defaults come from z_file({ sharableDefaults }) or hardcoded fallbacks.\n */\nconst ShareFileRequestBodySchema = z.object({\n expiresIn: ExpiresInDurationSchema.optional(),\n maxUses: z.number().int().min(1).optional(),\n}).strict();\n\n@injectable()\nexport class FileController extends AbstractControllerBackendService {\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) logger: any,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) errorBuilder: any,\n @inject(SAAS_SERVICE_TYPES.ErrorHandlerService) errorHandler: any,\n @inject(SAAS_SERVICE_TYPES.ResourceRegistryService)\n private readonly resourcesRegistry: ResourcesRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.ExecutionContextCreatorBackendService)\n private readonly executionContextCreator: ExecutionContextCreatorBackendService,\n @inject(SAAS_SERVICE_TYPES.FilesBackendService)\n private readonly filesService: FilesBackendService,\n @inject(SAAS_SERVICE_TYPES.ConsumableTokenService)\n private readonly consumableTokenService: ConsumableTokenBackendService,\n @inject(SAAS_SERVICE_TYPES.RepositoriesRegistryHandlerService)\n private readonly repositoriesRegistry: RepositoriesRegistryHandlerBackendService,\n @inject(SAAS_SERVICE_TYPES.FileFieldDetectionService)\n private readonly fileFieldDetection: FileFieldDetectionBackendService,\n @inject(SAAS_SERVICE_TYPES.FileUploadGrantService)\n private readonly fileUploadGrantService: FileUploadGrantBackendService,\n @inject(SAAS_SERVICE_TYPES.RateLimitBackendService)\n private readonly rateLimitService: RateLimitBackendService,\n ) {\n super(logger, errorBuilder, errorHandler, 'FileController');\n }\n\n /**\n * Setup file controller routes\n */\n protected setupRoutes(): void {\n // Download file: GET /files/:fileId\n // File upload grants (issue #312) — registered BEFORE the generic `/files/:fileId` family so that\n // `upload-grants` can never be read as a fileId. The status read is PUBLIC: the token is the\n // credential, and the drop page has no session. Revocation is authenticated and addressed by ID.\n this.router.get('/files/upload-grants/:token', this.asyncHandler(this.readUploadGrantStatus.bind(this)));\n this.logRouteRegistration('GET', '/files/upload-grants/:token', 'Read upload grant status (token-authenticated, public)');\n this.router.delete('/files/upload-grants/:grantId', this.asyncHandler(this.revokeUploadGrant.bind(this)));\n this.logRouteRegistration('DELETE', '/files/upload-grants/:grantId', 'Revoke an upload grant (minter or super-admin)');\n\n this.router.get('/files/:fileId', this.asyncHandler(this.downloadFile.bind(this)));\n this.logRouteRegistration('GET', '/files/:fileId', 'Download file');\n\n // Get file metadata: GET /files/:fileId/metadata\n this.router.get('/files/:fileId/metadata', this.asyncHandler(this.getFileMetadata.bind(this)));\n this.logRouteRegistration('GET', '/files/:fileId/metadata', 'Get file metadata');\n\n // Delete file: DELETE /files/:fileId\n this.router.delete('/files/:fileId', this.asyncHandler(this.deleteFile.bind(this)));\n this.logRouteRegistration('DELETE', '/files/:fileId', 'Delete file');\n\n // Share file: POST /files/:fileId/share\n this.router.post('/files/:fileId/share', this.asyncHandler(this.shareFile.bind(this)));\n this.logRouteRegistration('POST', '/files/:fileId/share', 'Generate share link');\n }\n\n /**\n * Get the READ operation path for FILES resource.\n * Used to create execution contexts for file operations.\n *\n * FILES declares only `REPOSITORY_ONLY` variants for the core operations\n * (see `files.shared.resources-config.schemas.ts`) — file metadata is\n * managed off the standard HTTP routing surface. This controller exposes\n * its own `/files/...` routes but bootstraps execution contexts against\n * the registered repository-only operations. See\n * `ResourcesRegistryBackendService.getRepositoryOperationPathDefault` for\n * why this is a distinct method from `getOperationPathDefault`.\n */\n /**\n * GET /files/upload-grants/:token — public status read (issue #312, D10).\n *\n * Rate-limited like the other public token endpoints: a token is 64 hex chars of entropy, so this\n * is not an enumeration surface, but a public route with a database read behind it still needs a\n * ceiling. Returns state, target, constraints, the upload URL and header name (what the drop page\n * renders), and after redemption the produced `fileId` + status (what an agent reads back). Never\n * the file's name.\n */\n private async readUploadGrantStatus(req: Request, res: Response, next: NextFunction): Promise<void> {\n try {\n await this.rateLimitService.checkPolicy(req, res, { requestsPerMinute: 30, requestsPerHour: 300 }, 'files:upload-grant:status');\n const token = req.params.token as string;\n const status = await this.fileUploadGrantService.readStatus(token);\n res.status(200).json(status);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * DELETE /files/upload-grants/:grantId — revoke, authenticated, by ID never by value.\n *\n * The context is created against the FILES DELETE operation exactly as `deleteFile` does (the\n * repository-only sibling lookup — see {@link getFileReadOperation}); who may revoke — the minter,\n * or a platform super-administrator — is decided inside the grant service. Idempotent: an already\n * revoked or redeemed grant answers `{ revoked: false }` rather than an error.\n */\n private async revokeUploadGrant(req: Request, res: Response, next: NextFunction): Promise<void> {\n try {\n const grantId = req.params.grantId as string;\n const operationPath = this.getFileDeleteOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(ErrorType.INTERNAL, {} as ExecutionContext<any>, {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: { message: 'File DELETE operation not found' },\n });\n }\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n { url: `/files/upload-grants/${grantId}`, parameters: [] },\n );\n const revoked = await this.fileUploadGrantService.revoke(grantId, executionContext);\n res.status(200).json({ grantId, revoked });\n } catch (error) {\n next(error);\n }\n }\n\n private getFileReadOperation() {\n return this.resourcesRegistry.getRepositoryOperationPathDefault(\n CoreResourceType.FILES,\n CoreResourceOperation.READ\n );\n }\n\n /**\n * Get the DELETE operation path for FILES resource.\n *\n * See {@link getFileReadOperation} for the rationale behind using the\n * repository-only sibling lookup rather than the URL-bearing one.\n */\n private getFileDeleteOperation() {\n return this.resourcesRegistry.getRepositoryOperationPathDefault(\n CoreResourceType.FILES,\n CoreResourceOperation.DELETE\n );\n }\n\n /**\n * Withhold the metadata of a file whose status puts it past disclosure (gate **G-FILE**).\n *\n * The download route already gates the BYTES on {@link FILE_DOWNLOADABLE_STATUSES}; the metadata\n * route had no status gate at all, so after a privacy erasure marked a file `DELETED` its\n * `originalFilename` and `uploadedBy` stayed readable by any member of its scope until the cleanup\n * batch physically removed it — weeks later. Erasure has to be complete at T+0, not eventually.\n *\n * Answers NOT_FOUND rather than the download route's \"not available\" validation error: for an\n * ERASED file, confirming that the id still resolves is itself a disclosure. The download route's\n * shape is right for its own cases (an in-flight `SCANNING` file genuinely exists and will become\n * downloadable); this one must behave as deleted, matching the retained parent row it belonged to.\n */\n private assertFileMetadataDisclosable(\n file: File,\n fileId: string,\n executionContext?: ExecutionContext<any>,\n ): void {\n if (FILE_METADATA_WITHHELD_STATUSES.has(file.status)) {\n throw this.buildFileNotFoundError(fileId, executionContext);\n }\n }\n\n private buildFileNotFoundError(fileId: string, executionContext?: ExecutionContext<any>) {\n return this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_NOT_FOUND,\n context: {\n fileId, // diagnostic (log-only)\n },\n }\n );\n }\n\n /**\n * Authenticated direct file routes should not disclose whether a probed fileId\n * exists when the caller lacks access. Collapse authorization failures into\n * the same not-found surface used for genuinely missing files.\n */\n private async getReadableFileOrNotFound(\n fileId: string,\n executionContext: ExecutionContext<any>,\n ): Promise<File> {\n try {\n const file = await this.filesService.getFile(fileId, executionContext);\n if (!file) {\n throw this.buildFileNotFoundError(fileId, executionContext);\n }\n return file;\n } catch (error) {\n const errorType = isWildoBackendError(error)\n ? error.type\n : (error instanceof Error && 'errorType' in error ? (error as Error & { errorType?: ErrorType }).errorType : undefined);\n\n if (errorType === ErrorType.AUTHORIZATION) {\n throw this.buildFileNotFoundError(fileId, executionContext);\n }\n\n throw error;\n }\n }\n\n /**\n * Public consumable-token downloads bypass normal user authorization. Build a\n * minimal synthetic execution context that carries only the FILES READ\n * operation identity and a public execution type, without fabricating a user\n * initiator.\n */\n private createSyntheticPublicReadExecutionContext(): ExecutionContext<any> {\n const operationPath = this.getFileReadOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: {\n message: 'File READ operation not found for synthetic public execution context',\n },\n }\n );\n }\n\n return new ExecutionContext(\n operation,\n ExecutionContext_ExecutionType.PUBLIC_EXECUTION,\n new Map(),\n null,\n [],\n [],\n );\n }\n\n /**\n * Validate a consumable token for file access (WITHOUT consuming it).\n * Returns true if a valid token was provided, false if no token is present.\n * Throws if token is present but invalid (expired, revoked, type mismatch, relatedId mismatch).\n *\n * IMPORTANT: Consumption is intentionally NOT done here. Callers must call\n * `consumeFileTokenWithRetry()` AFTER confirming the file exists, to avoid burning\n * SINGLE_USE tokens on 404s.\n */\n private async validateFileToken(\n consumableTokenValue: string | undefined,\n fileId: string,\n ): Promise<boolean> {\n if (!consumableTokenValue) {\n return false;\n }\n\n // Validate the token using the dedicated service\n // Restricts to FILE_PUBLIC_ACCESS type only\n const tokenObject = await this.consumableTokenService.validateToken(\n consumableTokenValue,\n [CoreConsumableTokenTypes.FILE_PUBLIC_ACCESS],\n );\n\n // SECURITY: FILE_PUBLIC_ACCESS tokens MUST have a relatedId matching the requested file.\n // Tokens without relatedId would be wildcard tokens that can access any file — reject them.\n if (!tokenObject.relatedId || tokenObject.relatedId !== fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHENTICATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.CONSUMABLE_TOKEN_CONTEXT_MISMATCH,\n context: {\n message: tokenObject.relatedId\n ? 'Token relatedId does not match requested fileId'\n : 'FILE_PUBLIC_ACCESS tokens must have a relatedId bound to a specific file',\n expectedFileId: fileId,\n },\n }\n );\n }\n\n return true;\n }\n\n /**\n * Consume a file access token AFTER the file has been confirmed to exist.\n * This prevents burning SINGLE_USE tokens on 404 responses.\n */\n private async consumeFileToken(consumableTokenValue: string): Promise<void> {\n await this.consumableTokenService.consumeToken(consumableTokenValue);\n }\n\n /**\n * Post-response token consumption still has to happen after a successful HTTP\n * finish event, but we retry transient failures a few times so a short-lived\n * Mongo hiccup does not silently leave file-access tokens reusable.\n */\n private async consumeFileTokenWithRetry(consumableTokenValue: string, fileId: string): Promise<void> {\n const retryDelaysMs = [0, 100, 250, 500];\n\n for (let attempt = 0; attempt < retryDelaysMs.length; attempt += 1) {\n const delayMs = retryDelaysMs[attempt]!;\n\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n try {\n await this.consumeFileToken(consumableTokenValue);\n return;\n } catch (error) {\n if (attempt === retryDelaysMs.length - 1) {\n throw error;\n }\n\n this.logger.warn('Retrying file token consumption after successful response', {\n fileId,\n attempt: attempt + 1,\n nextRetryDelayMs: retryDelaysMs[attempt + 1],\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n }\n\n /**\n * Download file endpoint.\n * GET /files/:fileId\n *\n * Supports consumable token access via query parameter: ?consumable_token=...\n */\n private async downloadFile(req: Request, res: Response, next: NextFunction): Promise<void> {\n const fileId = req.params.fileId as string;\n\n // Defense-in-depth: Check for presence before format validation\n // Express routes should ensure params exist, but explicit check improves robustness\n if (!fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ID_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fieldName: 'fileId',\n reason: 'missing',\n }\n }\n );\n }\n\n const consumableToken = req.query.consumable_token as string | undefined;\n\n this.logDebug('File download requested', { fileId, hasConsumableToken: !!consumableToken });\n\n try {\n // Validate fileId format (CRITICAL: Prevents invalid fileId propagation and database errors)\n // ExecutionContext will be created below, but validation can happen early with undefined context\n validateFileId(fileId, this.errorBuilder, undefined, 'fileId');\n\n // ── Token-based public access path ──\n // If a consumable token is provided, validate it and serve the file directly\n // without going through the normal execution context / authorization flow.\n const isTokenAccess = await this.validateFileToken(consumableToken, fileId);\n\n if (isTokenAccess) {\n const file = await this.getFileDirectly(fileId);\n if (!file) {\n throw this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_NOT_FOUND,\n context: { fileId }, // diagnostic (log-only)\n }\n );\n }\n if (!FILE_DOWNLOADABLE_STATUSES.has(file.status)) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.VALIDATION,\n context: { message: 'File is not available for download', fileId, status: file.status },\n }\n );\n }\n const syntheticExecutionContext = this.createSyntheticPublicReadExecutionContext();\n this.scheduleConsumableTokenConsumptionOnSuccess(res, consumableToken!, fileId);\n await this.streamFileFromStorage(file, res, syntheticExecutionContext, next);\n return;\n }\n\n // ── Normal authenticated access path ──\n // Create execution context for file READ operation\n const operationPath = this.getFileReadOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n {} as ExecutionContext<any>,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: {\n message: 'File READ operation not found',\n },\n }\n );\n }\n\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n {\n url: `/files/${fileId}`,\n parameters: [],\n }\n );\n\n // Authorize file access\n const file = await this.getReadableFileOrNotFound(fileId, executionContext);\n\n if (!FILE_DOWNLOADABLE_STATUSES.has(file.status)) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.VALIDATION,\n context: {\n message: 'File is not available for download',\n fileId,\n status: file.status,\n },\n }\n );\n }\n\n // Stream file from storage\n await this.streamFileFromStorage(file, res, executionContext, next);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * Stream file from storage to response (global download endpoint).\n *\n * Delegates to the shared `FilesBackendService.streamFileToResponse` seam so the\n * global download route and the resource-integrated serve route share one\n * streaming/lifecycle implementation. The global download endpoint forces\n * `attachment` (browser download); the resource serve route uses `inline`\n * (in-place preview). Authorization is already performed by the caller.\n */\n private async streamFileFromStorage(\n file: File,\n res: Response,\n executionContext: ExecutionContext<any> | undefined,\n next?: NextFunction,\n ): Promise<void> {\n await this.filesService.streamFileToResponse(file, res, executionContext, {\n disposition: 'attachment',\n next,\n });\n }\n\n /**\n * Get file metadata endpoint.\n * GET /files/:fileId/metadata\n *\n * Supports consumable token access via query parameter: ?consumable_token=...\n */\n private async getFileMetadata(req: Request, res: Response, next: NextFunction): Promise<void> {\n const fileId = req.params.fileId as string;\n\n // Defense-in-depth: Check for presence before format validation\n // Express routes should ensure params exist, but explicit check improves robustness\n if (!fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ID_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fieldName: 'fileId',\n reason: 'missing',\n }\n }\n );\n }\n\n const consumableToken = req.query.consumable_token as string | undefined;\n\n this.logDebug('File metadata requested', { fileId, hasConsumableToken: !!consumableToken });\n\n try {\n // Validate fileId format (CRITICAL: Prevents invalid fileId propagation and database errors)\n // ExecutionContext will be created below, but validation can happen early with undefined context\n validateFileId(fileId, this.errorBuilder, undefined, 'fileId');\n\n // ── Token-based public access path ──\n const isTokenAccess = await this.validateFileToken(consumableToken, fileId);\n\n if (isTokenAccess) {\n const file = await this.getFileDirectly(fileId);\n if (!file) {\n throw this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_NOT_FOUND,\n context: { fileId }, // diagnostic (log-only)\n }\n );\n }\n this.assertFileMetadataDisclosable(file, fileId);\n this.scheduleConsumableTokenConsumptionOnSuccess(res, consumableToken!, fileId);\n const fileMetadata = this.filesService.toMetadataResponse(file);\n this.jsonSuccess(res, fileMetadata);\n return;\n }\n\n // ── Normal authenticated access path ──\n // Create execution context for file READ operation\n const operationPath = this.getFileReadOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n {} as ExecutionContext<any>,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: {\n message: 'File READ operation not found',\n },\n }\n );\n }\n\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n {\n url: `/files/${fileId}/metadata`,\n parameters: [],\n }\n );\n\n // Authorize file access and get file\n const file = await this.getReadableFileOrNotFound(fileId, executionContext);\n this.assertFileMetadataDisclosable(file, fileId, executionContext);\n\n // Return file metadata\n const fileMetadata = this.filesService.toMetadataResponse(file);\n this.jsonSuccess(res, fileMetadata);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * Delete file endpoint.\n * DELETE /files/:fileId\n *\n * Only allows deletion of unlinked files (status: UPLOADED or ORPHANED).\n * Rejects deletion of linked files (status: LINKED).\n */\n private async deleteFile(req: Request, res: Response, next: NextFunction): Promise<void> {\n const fileId = req.params.fileId as string;\n\n // Defense-in-depth: Check for presence before format validation\n // Express routes should ensure params exist, but explicit check improves robustness\n if (!fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ID_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fieldName: 'fileId',\n reason: 'missing',\n }\n }\n );\n }\n\n this.logDebug('File deletion requested', { fileId });\n\n try {\n // Validate fileId format (CRITICAL: Prevents invalid fileId propagation and database errors)\n // ExecutionContext will be created below, but validation can happen early with undefined context\n validateFileId(fileId, this.errorBuilder, undefined, 'fileId');\n\n // Create execution context for file DELETE operation\n const operationPath = this.getFileDeleteOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n {} as ExecutionContext<any>,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: {\n message: 'File DELETE operation not found',\n },\n }\n );\n }\n\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n {\n url: `/files/${fileId}`,\n parameters: [],\n }\n );\n\n // Read file first to verify it exists and check status. Like other\n // authenticated direct file routes, delete should not leak whether a\n // probed fileId exists outside the caller's accessible scope.\n const file = await this.getReadableFileOrNotFound(fileId, executionContext);\n\n // Check if file is already deleted\n if (file.status === FileStatus.DELETED) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ALREADY_DELETED,\n context: {\n // diagnostic (log-only)\n fileId,\n status: file.status,\n },\n }\n );\n }\n\n // AV scanning is the only in-flight processing state left on the FILE lifecycle — text\n // extraction/indexing moved to per-field chunk rows with the resource-native RAG reshape and\n // no longer blocks a delete (their cleanup follows the file through the removal seams).\n if (file.status === FileStatus.SCANNING) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_DELETE_WHILE_PROCESSING,\n context: {\n // diagnostic (log-only)\n fileId,\n status: file.status,\n },\n }\n );\n }\n\n // Reject deletion of linked files\n if (file.status === FileStatus.LINKED) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_DELETE_LINKED_BLOCKED,\n context: {\n // diagnostic (log-only)\n fileId,\n status: file.status,\n linkedResourceType: file.linkedResourceType,\n linkedResourceId: file.linkedResourceId,\n },\n }\n );\n }\n\n // Detached-file delete is owned by the recorded uploader principal.\n // We compare only the raw id + entity type pair and leave richer display\n // hydration to clients on demand.\n const currentUploaderPrincipal = resolveFileUploaderPrincipal(executionContext);\n if (\n !currentUploaderPrincipal\n || !file.uploadedBy\n || !file.uploadedByEntityType\n || file.uploadedBy !== currentUploaderPrincipal.uploadedBy\n || file.uploadedByEntityType !== currentUploaderPrincipal.uploadedByEntityType\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_DELETE_UPLOADER_ONLY,\n context: {\n // diagnostic (log-only)\n fileId,\n uploadedBy: file.uploadedBy,\n uploadedByEntityType: file.uploadedByEntityType,\n currentUploaderPrincipal,\n },\n }\n );\n }\n\n // Delete file (soft delete)\n await this.filesService.deleteFile(fileId, executionContext);\n\n // Return success response\n this.jsonSuccess(res, {\n success: true,\n message: 'File deleted successfully',\n fileId,\n }, 200);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * Share file endpoint.\n * POST /files/:fileId/share\n *\n * Generates a shareable consumable token for the specified file.\n * Requires the file's z_file field to have `sharable: true` in its schema metadata.\n *\n * Request body (optional):\n * - expiresIn?: DurationValue (minutes/hours/days, value ≥ 1) — override default expiration\n * - maxUses?: number — override default max uses (only for BOUNDED_REUSE)\n *\n * Returns:\n * - { token: string, expiresAt: string, maxUses?: number }\n */\n private async shareFile(req: Request, res: Response, next: NextFunction): Promise<void> {\n const fileId = req.params.fileId as string;\n\n if (!fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ID_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fieldName: 'fileId',\n reason: 'missing',\n }\n }\n );\n }\n\n this.logDebug('File share requested', { fileId });\n\n try {\n validateFileId(fileId, this.errorBuilder, undefined, 'fileId');\n\n // ── Validate request body ──\n const bodyParseResult = ShareFileRequestBodySchema.safeParse(req.body || {});\n if (!bodyParseResult.success) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_SHARE_REQUEST_INVALID,\n context: {\n // diagnostic (log-only)\n errors: bodyParseResult.error.issues.map(i => ({ path: i.path.join('.'), message: i.message })),\n },\n }\n );\n }\n const requestBody = bodyParseResult.data;\n\n // Create execution context for file READ operation (share requires at least read access)\n const operationPath = this.getFileReadOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n {} as ExecutionContext<any>,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: { message: 'File READ operation not found' },\n }\n );\n }\n\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n {\n url: `/files/${fileId}/share`,\n parameters: [],\n }\n );\n\n // Authorize and get the file\n const file = await this.getReadableFileOrNotFound(fileId, executionContext);\n\n // ── Check if the file's z_file field is declared as sharable ──\n // The sharable flag is on the schema metadata of the z_file field that owns this file.\n // We need to look up the resource configuration and inspect the field metadata.\n const fileFieldMetadata = this.getFileFieldSharableMetadata(file);\n if (!fileFieldMetadata.sharable) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.CONSUMABLE_TOKEN_FILE_SHARING_DISABLED,\n context: {\n // diagnostic (log-only)\n fileId,\n linkedResourceType: file.linkedResourceType,\n linkedFieldName: file.linkedFieldName,\n },\n }\n );\n }\n\n // ── Resolve sharing defaults from schema metadata, then override with request body ──\n const defaults = fileFieldMetadata.sharableDefaults || {};\n\n const expiresIn = requestBody.expiresIn ?? defaults.expiresIn ?? { value: 7, unit: DurationUnit.DAYS };\n const consumptionMode = defaults.consumptionMode === 'SINGLE_USE'\n ? ConsumableToken_ConsumptionMode.SINGLE_USE\n : ConsumableToken_ConsumptionMode.BOUNDED_REUSE;\n const maxUses = consumptionMode === ConsumableToken_ConsumptionMode.BOUNDED_REUSE\n ? (requestBody.maxUses || defaults.maxUses || 100)\n : undefined;\n\n // ── Generate consumable token ──\n // NOTE: tokenType in CreateTokenParams is the token type identifier (e.g., FILE_PUBLIC_ACCESS),\n // NOT the Wildo resource type (e.g., FILES). validateToken checks this field against expected types.\n const result = await this.consumableTokenService.createToken({\n tokenType: CoreConsumableTokenTypes.FILE_PUBLIC_ACCESS,\n consumptionMode,\n resourceIdentifier: CoreResourceType.FILES,\n relatedId: fileId,\n organizationId: file.organizationId,\n expiresIn: expiresIn as DurationValue,\n roles: [],\n maxUses,\n metadata: {\n linkedResourceType: file.linkedResourceType,\n linkedFieldName: file.linkedFieldName,\n originalFilename: file.originalFilename,\n },\n });\n\n this.jsonSuccess(res, {\n token: result.token,\n expiresAt: result.expiresAt.toISOString(),\n ...(maxUses != null && { maxUses }),\n }, 201);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * Consume a public access token only after the HTTP response has completed\n * successfully. This avoids burning single-use tokens on downstream stream or\n * response failures that happen after authorization has already succeeded.\n */\n private scheduleConsumableTokenConsumptionOnSuccess(\n res: Response,\n consumableToken: string,\n fileId: string,\n ): void {\n let settled = false;\n\n const cleanup = () => {\n res.off('finish', onFinish);\n res.off('close', onClose);\n res.off('error', onError);\n };\n\n const onFinish = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n\n void Promise.resolve(this.consumeFileTokenWithRetry(consumableToken, fileId)).catch((error: unknown) => {\n this.logger.error('Failed to consume file token after successful response retries', {\n fileId,\n ...projectCaughtErrorLogFields(error),\n });\n });\n };\n\n const onClose = () => {\n if (settled || res.writableFinished) {\n return;\n }\n\n settled = true;\n cleanup();\n };\n\n const onError = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n };\n\n res.once('finish', onFinish);\n res.once('close', onClose);\n res.once('error', onError);\n }\n\n /**\n * Fetch a file record directly via repository, bypassing user-level authorization.\n * Used for token-authenticated public access where the consumable token itself provides authorization.\n *\n * Uses an internal system execution context (INTERNALLY_INITIATED_REQUEST with APP_ADMIN_SUPER_ADMIN)\n * to perform the read, ensuring the repository's prefix/postfix hooks have a valid context.\n */\n private async getFileDirectly(fileId: string): Promise<File | null> {\n const internalContext = await this.executionContextCreator.createForInternalSystemOperation();\n const filesRepo = this.repositoriesRegistry.getRepositoryOrThrow(\n CoreResourceType.FILES,\n internalContext,\n );\n const file = await filesRepo.read<File>(\n internalContext,\n { _id: fileId },\n );\n return file || null;\n }\n\n /**\n * Look up the z_file field metadata for a linked file to determine if sharing is enabled.\n *\n * Uses `getFileMetadata()` from `@wildo-ai/zod-decorators` to read the `FileSchemaMetadata`\n * stored by `z_file({ sharable: true })`. The metadata is accessed via the resource registry\n * → resource configuration → mainSchema → field schema.\n *\n * Returns `{ sharable: boolean, sharableDefaults?: ... }` based on the schema metadata\n * of the field that owns this file. If the file is not linked or the field cannot be\n * found, returns `{ sharable: false }`.\n */\n private getFileFieldSharableMetadata(file: File): {\n sharable: boolean;\n sharableDefaults?: { expiresIn?: ExpiresInDuration; maxUses?: number; consumptionMode?: 'SINGLE_USE' | 'BOUNDED_REUSE' };\n } {\n // File must be linked to a resource to have schema metadata\n if (!file.linkedResourceType || !file.linkedFieldName) {\n return { sharable: false };\n }\n\n try {\n const detectedField = this.fileFieldDetection.getFileFieldMetadata(\n file.linkedResourceType as any,\n file.linkedFieldName,\n );\n if (!detectedField) {\n return { sharable: false };\n }\n\n const fileConfig = detectedField.fileMetadata;\n if (!fileConfig) {\n return { sharable: false };\n }\n\n return {\n sharable: !!fileConfig.sharable,\n sharableDefaults: fileConfig.sharableDefaults,\n };\n } catch {\n // If anything fails during schema lookup, sharing is not available\n this.logDebug('Failed to look up file field sharable metadata', {\n fileId: file.fileId,\n linkedResourceType: file.linkedResourceType,\n linkedFieldName: file.linkedFieldName,\n });\n return { sharable: false };\n }\n }\n}\n"]}
1
+ {"version":3,"file":"file.controller.js","sourceRoot":"","sources":["../../../../../src/files/controllers/file.controller.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * File Controller Backend Service\n *\n * Handles file download, metadata retrieval, deletion, and sharing.\n * Provides global file access endpoints independent of resource context.\n *\n * Routes:\n * - GET /files/:fileId - Download file (supports ?consumable_token=... for public access)\n * - GET /files/:fileId/metadata - Get file metadata (supports ?consumable_token=...)\n * - DELETE /files/:fileId - Delete file (unlinked only)\n * - POST /files/:fileId/share - Generate a shareable consumable token\n */\n\nimport { injectable, inject } from 'inversify';\nimport { Request, Response, NextFunction } from 'express';\nimport { z } from 'zod';\nimport {\n CoreConsumableTokenTypes,\n ConsumableToken_ConsumptionMode,\n CoreResourceOperation,\n CoreResourceType,\n ExecutionContext_ExecutionType,\n ErrorType,\n ErrorCustomMessageReference,\n FileStatus,\n FILE_DOWNLOADABLE_STATUSES,\n FILE_METADATA_WITHHELD_STATUSES,\n isWildoBackendError,\n MANUAL_CONTROLLER_ROUTES_URLS,\n ManualControllerRouteKey,\n} from '@wildo-ai/saas-models';\nimport { File } from '@wildo-ai/saas-models';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { AbstractControllerBackendService } from '~wildo-backend-lib/base-classes/services/controllers/abstract-controller.backend.service';\nimport { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport { ExecutionContextCreatorBackendService } from '~wildo-backend-lib/runtime/services/execution-context-creator.backend.service';\nimport { FilesBackendService } from '~wildo-backend-lib/files/services/files.backend.service';\nimport { FileFieldDetectionBackendService } from '~wildo-backend-lib/files/services/file-field-detection.backend.service';\nimport { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport { ConsumableTokenBackendService } from '~wildo-backend-lib/security/consumable-tokens/services/consumable-token.backend.service';\nimport { ExpiresInDurationSchema, DurationUnit, type DurationValue, type ExpiresInDuration } from '@wildo-ai/zod-decorators';\nimport { resolveFileUploaderPrincipal } from '~wildo-backend-lib/files/utils/file-uploader.utils';\nimport { RepositoriesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/repositories/repositories-registry-handler.backend.service';\nimport { validateFileId } from '~wildo-backend-lib/files/utils/file-validation.utils';\nimport { projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { FileUploadGrantBackendService } from '~wildo-backend-lib/files/services/file-upload-grant.backend.service';\nimport { RateLimitBackendService } from '~wildo-backend-lib/errors/services/rate-limit.backend.service';\n/**\n * Zod schema for POST /files/:fileId/share request body validation.\n * All fields are optional — defaults come from z_file({ sharableDefaults }) or hardcoded fallbacks.\n */\nconst ShareFileRequestBodySchema = z.object({\n expiresIn: ExpiresInDurationSchema.optional(),\n maxUses: z.number().int().min(1).optional(),\n}).strict();\n\n@injectable()\nexport class FileController extends AbstractControllerBackendService {\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) logger: any,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) errorBuilder: any,\n @inject(SAAS_SERVICE_TYPES.ErrorHandlerService) errorHandler: any,\n @inject(SAAS_SERVICE_TYPES.ResourceRegistryService)\n private readonly resourcesRegistry: ResourcesRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.ExecutionContextCreatorBackendService)\n private readonly executionContextCreator: ExecutionContextCreatorBackendService,\n @inject(SAAS_SERVICE_TYPES.FilesBackendService)\n private readonly filesService: FilesBackendService,\n @inject(SAAS_SERVICE_TYPES.ConsumableTokenService)\n private readonly consumableTokenService: ConsumableTokenBackendService,\n @inject(SAAS_SERVICE_TYPES.RepositoriesRegistryHandlerService)\n private readonly repositoriesRegistry: RepositoriesRegistryHandlerBackendService,\n @inject(SAAS_SERVICE_TYPES.FileFieldDetectionService)\n private readonly fileFieldDetection: FileFieldDetectionBackendService,\n @inject(SAAS_SERVICE_TYPES.FileUploadGrantService)\n private readonly fileUploadGrantService: FileUploadGrantBackendService,\n @inject(SAAS_SERVICE_TYPES.RateLimitBackendService)\n private readonly rateLimitService: RateLimitBackendService,\n ) {\n super(logger, errorBuilder, errorHandler, 'FileController');\n }\n\n /**\n * Setup file controller routes\n */\n protected setupRoutes(): void {\n // Download file: GET /files/:fileId\n // File upload grants (issue #312) — registered BEFORE the generic `/files/:fileId` family so that\n // `upload-grants` can never be read as a fileId. The status read is PUBLIC: the token is the\n // credential, and the drop page has no session. Revocation is authenticated and addressed by ID.\n // Paths come from `MANUAL_CONTROLLER_ROUTES_URLS` rather than from literals. They were literals\n // until 2026-09-09, which put them outside every mechanism keyed on `ManualControllerRouteKey` —\n // including the generated API reference, where a file route could therefore never appear.\n const uploadGrantStatusUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_UPLOAD_GRANT_STATUS];\n this.router.get(uploadGrantStatusUrl, this.asyncHandler(this.readUploadGrantStatus.bind(this)));\n this.logRouteRegistration('GET', uploadGrantStatusUrl, 'Read upload grant status (token-authenticated, public)');\n const uploadGrantRevokeUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_UPLOAD_GRANT_REVOKE];\n this.router.delete(uploadGrantRevokeUrl, this.asyncHandler(this.revokeUploadGrant.bind(this)));\n this.logRouteRegistration('DELETE', uploadGrantRevokeUrl, 'Revoke an upload grant (minter or super-admin)');\n\n const fileItemUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_ITEM];\n this.router.get(fileItemUrl, this.asyncHandler(this.downloadFile.bind(this)));\n this.logRouteRegistration('GET', fileItemUrl, 'Download file');\n\n // Get file metadata: GET /files/:fileId/metadata\n const fileMetadataUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_METADATA];\n this.router.get(fileMetadataUrl, this.asyncHandler(this.getFileMetadata.bind(this)));\n this.logRouteRegistration('GET', fileMetadataUrl, 'Get file metadata');\n\n // Delete file: DELETE /files/:fileId\n this.router.delete(fileItemUrl, this.asyncHandler(this.deleteFile.bind(this)));\n this.logRouteRegistration('DELETE', fileItemUrl, 'Delete file');\n\n // Share file: POST /files/:fileId/share\n const fileShareUrl = MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FILES_SHARE];\n this.router.post(fileShareUrl, this.asyncHandler(this.shareFile.bind(this)));\n this.logRouteRegistration('POST', fileShareUrl, 'Generate share link');\n }\n\n /**\n * Get the READ operation path for FILES resource.\n * Used to create execution contexts for file operations.\n *\n * FILES declares only `REPOSITORY_ONLY` variants for the core operations\n * (see `files.shared.resources-config.schemas.ts`) — file metadata is\n * managed off the standard HTTP routing surface. This controller exposes\n * its own `/files/...` routes but bootstraps execution contexts against\n * the registered repository-only operations. See\n * `ResourcesRegistryBackendService.getRepositoryOperationPathDefault` for\n * why this is a distinct method from `getOperationPathDefault`.\n */\n /**\n * GET /files/upload-grants/:token — public status read (issue #312, D10).\n *\n * Rate-limited like the other public token endpoints: a token is 64 hex chars of entropy, so this\n * is not an enumeration surface, but a public route with a database read behind it still needs a\n * ceiling. Returns state, target, constraints, the upload URL and header name (what the drop page\n * renders), and after redemption the produced `fileId` + status (what an agent reads back). Never\n * the file's name.\n */\n private async readUploadGrantStatus(req: Request, res: Response, next: NextFunction): Promise<void> {\n try {\n await this.rateLimitService.checkPolicy(req, res, { requestsPerMinute: 30, requestsPerHour: 300 }, 'files:upload-grant:status');\n const token = req.params.token as string;\n const status = await this.fileUploadGrantService.readStatus(token);\n res.status(200).json(status);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * DELETE /files/upload-grants/:grantId — revoke, authenticated, by ID never by value.\n *\n * The context is created against the FILES DELETE operation exactly as `deleteFile` does (the\n * repository-only sibling lookup — see {@link getFileReadOperation}); who may revoke — the minter,\n * or a platform super-administrator — is decided inside the grant service. Idempotent: an already\n * revoked or redeemed grant answers `{ revoked: false }` rather than an error.\n */\n private async revokeUploadGrant(req: Request, res: Response, next: NextFunction): Promise<void> {\n try {\n const grantId = req.params.grantId as string;\n const operationPath = this.getFileDeleteOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(ErrorType.INTERNAL, {} as ExecutionContext<any>, {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: { message: 'File DELETE operation not found' },\n });\n }\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n { url: `/files/upload-grants/${grantId}`, parameters: [] },\n );\n const revoked = await this.fileUploadGrantService.revoke(grantId, executionContext);\n res.status(200).json({ grantId, revoked });\n } catch (error) {\n next(error);\n }\n }\n\n private getFileReadOperation() {\n return this.resourcesRegistry.getRepositoryOperationPathDefault(\n CoreResourceType.FILES,\n CoreResourceOperation.READ\n );\n }\n\n /**\n * Get the DELETE operation path for FILES resource.\n *\n * See {@link getFileReadOperation} for the rationale behind using the\n * repository-only sibling lookup rather than the URL-bearing one.\n */\n private getFileDeleteOperation() {\n return this.resourcesRegistry.getRepositoryOperationPathDefault(\n CoreResourceType.FILES,\n CoreResourceOperation.DELETE\n );\n }\n\n /**\n * Withhold the metadata of a file whose status puts it past disclosure (gate **G-FILE**).\n *\n * The download route already gates the BYTES on {@link FILE_DOWNLOADABLE_STATUSES}; the metadata\n * route had no status gate at all, so after a privacy erasure marked a file `DELETED` its\n * `originalFilename` and `uploadedBy` stayed readable by any member of its scope until the cleanup\n * batch physically removed it — weeks later. Erasure has to be complete at T+0, not eventually.\n *\n * Answers NOT_FOUND rather than the download route's \"not available\" validation error: for an\n * ERASED file, confirming that the id still resolves is itself a disclosure. The download route's\n * shape is right for its own cases (an in-flight `SCANNING` file genuinely exists and will become\n * downloadable); this one must behave as deleted, matching the retained parent row it belonged to.\n */\n private assertFileMetadataDisclosable(\n file: File,\n fileId: string,\n executionContext?: ExecutionContext<any>,\n ): void {\n if (FILE_METADATA_WITHHELD_STATUSES.has(file.status)) {\n throw this.buildFileNotFoundError(fileId, executionContext);\n }\n }\n\n private buildFileNotFoundError(fileId: string, executionContext?: ExecutionContext<any>) {\n return this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_NOT_FOUND,\n context: {\n fileId, // diagnostic (log-only)\n },\n }\n );\n }\n\n /**\n * Authenticated direct file routes should not disclose whether a probed fileId\n * exists when the caller lacks access. Collapse authorization failures into\n * the same not-found surface used for genuinely missing files.\n */\n private async getReadableFileOrNotFound(\n fileId: string,\n executionContext: ExecutionContext<any>,\n ): Promise<File> {\n try {\n const file = await this.filesService.getFile(fileId, executionContext);\n if (!file) {\n throw this.buildFileNotFoundError(fileId, executionContext);\n }\n return file;\n } catch (error) {\n const errorType = isWildoBackendError(error)\n ? error.type\n : (error instanceof Error && 'errorType' in error ? (error as Error & { errorType?: ErrorType }).errorType : undefined);\n\n if (errorType === ErrorType.AUTHORIZATION) {\n throw this.buildFileNotFoundError(fileId, executionContext);\n }\n\n throw error;\n }\n }\n\n /**\n * Public consumable-token downloads bypass normal user authorization. Build a\n * minimal synthetic execution context that carries only the FILES READ\n * operation identity and a public execution type, without fabricating a user\n * initiator.\n */\n private createSyntheticPublicReadExecutionContext(): ExecutionContext<any> {\n const operationPath = this.getFileReadOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: {\n message: 'File READ operation not found for synthetic public execution context',\n },\n }\n );\n }\n\n return new ExecutionContext(\n operation,\n ExecutionContext_ExecutionType.PUBLIC_EXECUTION,\n new Map(),\n null,\n [],\n [],\n );\n }\n\n /**\n * Validate a consumable token for file access (WITHOUT consuming it).\n * Returns true if a valid token was provided, false if no token is present.\n * Throws if token is present but invalid (expired, revoked, type mismatch, relatedId mismatch).\n *\n * IMPORTANT: Consumption is intentionally NOT done here. Callers must call\n * `consumeFileTokenWithRetry()` AFTER confirming the file exists, to avoid burning\n * SINGLE_USE tokens on 404s.\n */\n private async validateFileToken(\n consumableTokenValue: string | undefined,\n fileId: string,\n ): Promise<boolean> {\n if (!consumableTokenValue) {\n return false;\n }\n\n // Validate the token using the dedicated service\n // Restricts to FILE_PUBLIC_ACCESS type only\n const tokenObject = await this.consumableTokenService.validateToken(\n consumableTokenValue,\n [CoreConsumableTokenTypes.FILE_PUBLIC_ACCESS],\n );\n\n // SECURITY: FILE_PUBLIC_ACCESS tokens MUST have a relatedId matching the requested file.\n // Tokens without relatedId would be wildcard tokens that can access any file — reject them.\n if (!tokenObject.relatedId || tokenObject.relatedId !== fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHENTICATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.CONSUMABLE_TOKEN_CONTEXT_MISMATCH,\n context: {\n message: tokenObject.relatedId\n ? 'Token relatedId does not match requested fileId'\n : 'FILE_PUBLIC_ACCESS tokens must have a relatedId bound to a specific file',\n expectedFileId: fileId,\n },\n }\n );\n }\n\n return true;\n }\n\n /**\n * Consume a file access token AFTER the file has been confirmed to exist.\n * This prevents burning SINGLE_USE tokens on 404 responses.\n */\n private async consumeFileToken(consumableTokenValue: string): Promise<void> {\n await this.consumableTokenService.consumeToken(consumableTokenValue);\n }\n\n /**\n * Post-response token consumption still has to happen after a successful HTTP\n * finish event, but we retry transient failures a few times so a short-lived\n * Mongo hiccup does not silently leave file-access tokens reusable.\n */\n private async consumeFileTokenWithRetry(consumableTokenValue: string, fileId: string): Promise<void> {\n const retryDelaysMs = [0, 100, 250, 500];\n\n for (let attempt = 0; attempt < retryDelaysMs.length; attempt += 1) {\n const delayMs = retryDelaysMs[attempt]!;\n\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n try {\n await this.consumeFileToken(consumableTokenValue);\n return;\n } catch (error) {\n if (attempt === retryDelaysMs.length - 1) {\n throw error;\n }\n\n this.logger.warn('Retrying file token consumption after successful response', {\n fileId,\n attempt: attempt + 1,\n nextRetryDelayMs: retryDelaysMs[attempt + 1],\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n }\n\n /**\n * Download file endpoint.\n * GET /files/:fileId\n *\n * Supports consumable token access via query parameter: ?consumable_token=...\n */\n private async downloadFile(req: Request, res: Response, next: NextFunction): Promise<void> {\n const fileId = req.params.fileId as string;\n\n // Defense-in-depth: Check for presence before format validation\n // Express routes should ensure params exist, but explicit check improves robustness\n if (!fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ID_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fieldName: 'fileId',\n reason: 'missing',\n }\n }\n );\n }\n\n const consumableToken = req.query.consumable_token as string | undefined;\n\n this.logDebug('File download requested', { fileId, hasConsumableToken: !!consumableToken });\n\n try {\n // Validate fileId format (CRITICAL: Prevents invalid fileId propagation and database errors)\n // ExecutionContext will be created below, but validation can happen early with undefined context\n validateFileId(fileId, this.errorBuilder, undefined, 'fileId');\n\n // ── Token-based public access path ──\n // If a consumable token is provided, validate it and serve the file directly\n // without going through the normal execution context / authorization flow.\n const isTokenAccess = await this.validateFileToken(consumableToken, fileId);\n\n if (isTokenAccess) {\n const file = await this.getFileDirectly(fileId);\n if (!file) {\n throw this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_NOT_FOUND,\n context: { fileId }, // diagnostic (log-only)\n }\n );\n }\n if (!FILE_DOWNLOADABLE_STATUSES.has(file.status)) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.VALIDATION,\n context: { message: 'File is not available for download', fileId, status: file.status },\n }\n );\n }\n const syntheticExecutionContext = this.createSyntheticPublicReadExecutionContext();\n this.scheduleConsumableTokenConsumptionOnSuccess(res, consumableToken!, fileId);\n await this.streamFileFromStorage(file, res, syntheticExecutionContext, next);\n return;\n }\n\n // ── Normal authenticated access path ──\n // Create execution context for file READ operation\n const operationPath = this.getFileReadOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n {} as ExecutionContext<any>,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: {\n message: 'File READ operation not found',\n },\n }\n );\n }\n\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n {\n url: `/files/${fileId}`,\n parameters: [],\n }\n );\n\n // Authorize file access\n const file = await this.getReadableFileOrNotFound(fileId, executionContext);\n\n if (!FILE_DOWNLOADABLE_STATUSES.has(file.status)) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.VALIDATION,\n context: {\n message: 'File is not available for download',\n fileId,\n status: file.status,\n },\n }\n );\n }\n\n // Stream file from storage\n await this.streamFileFromStorage(file, res, executionContext, next);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * Stream file from storage to response (global download endpoint).\n *\n * Delegates to the shared `FilesBackendService.streamFileToResponse` seam so the\n * global download route and the resource-integrated serve route share one\n * streaming/lifecycle implementation. The global download endpoint forces\n * `attachment` (browser download); the resource serve route uses `inline`\n * (in-place preview). Authorization is already performed by the caller.\n */\n private async streamFileFromStorage(\n file: File,\n res: Response,\n executionContext: ExecutionContext<any> | undefined,\n next?: NextFunction,\n ): Promise<void> {\n await this.filesService.streamFileToResponse(file, res, executionContext, {\n disposition: 'attachment',\n next,\n });\n }\n\n /**\n * Get file metadata endpoint.\n * GET /files/:fileId/metadata\n *\n * Supports consumable token access via query parameter: ?consumable_token=...\n */\n private async getFileMetadata(req: Request, res: Response, next: NextFunction): Promise<void> {\n const fileId = req.params.fileId as string;\n\n // Defense-in-depth: Check for presence before format validation\n // Express routes should ensure params exist, but explicit check improves robustness\n if (!fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ID_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fieldName: 'fileId',\n reason: 'missing',\n }\n }\n );\n }\n\n const consumableToken = req.query.consumable_token as string | undefined;\n\n this.logDebug('File metadata requested', { fileId, hasConsumableToken: !!consumableToken });\n\n try {\n // Validate fileId format (CRITICAL: Prevents invalid fileId propagation and database errors)\n // ExecutionContext will be created below, but validation can happen early with undefined context\n validateFileId(fileId, this.errorBuilder, undefined, 'fileId');\n\n // ── Token-based public access path ──\n const isTokenAccess = await this.validateFileToken(consumableToken, fileId);\n\n if (isTokenAccess) {\n const file = await this.getFileDirectly(fileId);\n if (!file) {\n throw this.errorBuilder.buildError(\n ErrorType.NOT_FOUND,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_NOT_FOUND,\n context: { fileId }, // diagnostic (log-only)\n }\n );\n }\n this.assertFileMetadataDisclosable(file, fileId);\n this.scheduleConsumableTokenConsumptionOnSuccess(res, consumableToken!, fileId);\n const fileMetadata = this.filesService.toMetadataResponse(file);\n this.jsonSuccess(res, fileMetadata);\n return;\n }\n\n // ── Normal authenticated access path ──\n // Create execution context for file READ operation\n const operationPath = this.getFileReadOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n {} as ExecutionContext<any>,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: {\n message: 'File READ operation not found',\n },\n }\n );\n }\n\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n {\n url: `/files/${fileId}/metadata`,\n parameters: [],\n }\n );\n\n // Authorize file access and get file\n const file = await this.getReadableFileOrNotFound(fileId, executionContext);\n this.assertFileMetadataDisclosable(file, fileId, executionContext);\n\n // Return file metadata\n const fileMetadata = this.filesService.toMetadataResponse(file);\n this.jsonSuccess(res, fileMetadata);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * Delete file endpoint.\n * DELETE /files/:fileId\n *\n * Only allows deletion of unlinked files (status: UPLOADED or ORPHANED).\n * Rejects deletion of linked files (status: LINKED).\n */\n private async deleteFile(req: Request, res: Response, next: NextFunction): Promise<void> {\n const fileId = req.params.fileId as string;\n\n // Defense-in-depth: Check for presence before format validation\n // Express routes should ensure params exist, but explicit check improves robustness\n if (!fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ID_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fieldName: 'fileId',\n reason: 'missing',\n }\n }\n );\n }\n\n this.logDebug('File deletion requested', { fileId });\n\n try {\n // Validate fileId format (CRITICAL: Prevents invalid fileId propagation and database errors)\n // ExecutionContext will be created below, but validation can happen early with undefined context\n validateFileId(fileId, this.errorBuilder, undefined, 'fileId');\n\n // Create execution context for file DELETE operation\n const operationPath = this.getFileDeleteOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n {} as ExecutionContext<any>,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: {\n message: 'File DELETE operation not found',\n },\n }\n );\n }\n\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n {\n url: `/files/${fileId}`,\n parameters: [],\n }\n );\n\n // Read file first to verify it exists and check status. Like other\n // authenticated direct file routes, delete should not leak whether a\n // probed fileId exists outside the caller's accessible scope.\n const file = await this.getReadableFileOrNotFound(fileId, executionContext);\n\n // Check if file is already deleted\n if (file.status === FileStatus.DELETED) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ALREADY_DELETED,\n context: {\n // diagnostic (log-only)\n fileId,\n status: file.status,\n },\n }\n );\n }\n\n // AV scanning is the only in-flight processing state left on the FILE lifecycle — text\n // extraction/indexing moved to per-field chunk rows with the resource-native RAG reshape and\n // no longer blocks a delete (their cleanup follows the file through the removal seams).\n if (file.status === FileStatus.SCANNING) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_DELETE_WHILE_PROCESSING,\n context: {\n // diagnostic (log-only)\n fileId,\n status: file.status,\n },\n }\n );\n }\n\n // Reject deletion of linked files\n if (file.status === FileStatus.LINKED) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_DELETE_LINKED_BLOCKED,\n context: {\n // diagnostic (log-only)\n fileId,\n status: file.status,\n linkedResourceType: file.linkedResourceType,\n linkedResourceId: file.linkedResourceId,\n },\n }\n );\n }\n\n // Detached-file delete is owned by the recorded uploader principal.\n // We compare only the raw id + entity type pair and leave richer display\n // hydration to clients on demand.\n const currentUploaderPrincipal = resolveFileUploaderPrincipal(executionContext);\n if (\n !currentUploaderPrincipal\n || !file.uploadedBy\n || !file.uploadedByEntityType\n || file.uploadedBy !== currentUploaderPrincipal.uploadedBy\n || file.uploadedByEntityType !== currentUploaderPrincipal.uploadedByEntityType\n ) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_DELETE_UPLOADER_ONLY,\n context: {\n // diagnostic (log-only)\n fileId,\n uploadedBy: file.uploadedBy,\n uploadedByEntityType: file.uploadedByEntityType,\n currentUploaderPrincipal,\n },\n }\n );\n }\n\n // Delete file (soft delete)\n await this.filesService.deleteFile(fileId, executionContext);\n\n // Return success response\n this.jsonSuccess(res, {\n success: true,\n message: 'File deleted successfully',\n fileId,\n }, 200);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * Share file endpoint.\n * POST /files/:fileId/share\n *\n * Generates a shareable consumable token for the specified file.\n * Requires the file's z_file field to have `sharable: true` in its schema metadata.\n *\n * Request body (optional):\n * - expiresIn?: DurationValue (minutes/hours/days, value ≥ 1) — override default expiration\n * - maxUses?: number — override default max uses (only for BOUNDED_REUSE)\n *\n * Returns:\n * - { token: string, expiresAt: string, maxUses?: number }\n */\n private async shareFile(req: Request, res: Response, next: NextFunction): Promise<void> {\n const fileId = req.params.fileId as string;\n\n if (!fileId) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_ID_VALIDATION_FAILED,\n context: {\n // diagnostic (log-only)\n fieldName: 'fileId',\n reason: 'missing',\n }\n }\n );\n }\n\n this.logDebug('File share requested', { fileId });\n\n try {\n validateFileId(fileId, this.errorBuilder, undefined, 'fileId');\n\n // ── Validate request body ──\n const bodyParseResult = ShareFileRequestBodySchema.safeParse(req.body || {});\n if (!bodyParseResult.success) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_SHARE_REQUEST_INVALID,\n context: {\n // diagnostic (log-only)\n errors: bodyParseResult.error.issues.map(i => ({ path: i.path.join('.'), message: i.message })),\n },\n }\n );\n }\n const requestBody = bodyParseResult.data;\n\n // Create execution context for file READ operation (share requires at least read access)\n const operationPath = this.getFileReadOperation();\n const operation = this.resourcesRegistry.getOperationFromPath(operationPath);\n if (!operation) {\n throw this.errorBuilder.buildError(\n ErrorType.INTERNAL,\n {} as ExecutionContext<any>,\n {\n customMessageReference: ErrorCustomMessageReference.INTERNAL,\n context: { message: 'File READ operation not found' },\n }\n );\n }\n\n const executionContext = await this.executionContextCreator.createExecutionContextFromRequest(\n req,\n operation,\n {\n url: `/files/${fileId}/share`,\n parameters: [],\n }\n );\n\n // Authorize and get the file\n const file = await this.getReadableFileOrNotFound(fileId, executionContext);\n\n // ── Check if the file's z_file field is declared as sharable ──\n // The sharable flag is on the schema metadata of the z_file field that owns this file.\n // We need to look up the resource configuration and inspect the field metadata.\n const fileFieldMetadata = this.getFileFieldSharableMetadata(file);\n if (!fileFieldMetadata.sharable) {\n throw this.errorBuilder.buildError(\n ErrorType.AUTHORIZATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.CONSUMABLE_TOKEN_FILE_SHARING_DISABLED,\n context: {\n // diagnostic (log-only)\n fileId,\n linkedResourceType: file.linkedResourceType,\n linkedFieldName: file.linkedFieldName,\n },\n }\n );\n }\n\n // ── Resolve sharing defaults from schema metadata, then override with request body ──\n const defaults = fileFieldMetadata.sharableDefaults || {};\n\n const expiresIn = requestBody.expiresIn ?? defaults.expiresIn ?? { value: 7, unit: DurationUnit.DAYS };\n const consumptionMode = defaults.consumptionMode === 'SINGLE_USE'\n ? ConsumableToken_ConsumptionMode.SINGLE_USE\n : ConsumableToken_ConsumptionMode.BOUNDED_REUSE;\n const maxUses = consumptionMode === ConsumableToken_ConsumptionMode.BOUNDED_REUSE\n ? (requestBody.maxUses || defaults.maxUses || 100)\n : undefined;\n\n // ── Generate consumable token ──\n // NOTE: tokenType in CreateTokenParams is the token type identifier (e.g., FILE_PUBLIC_ACCESS),\n // NOT the Wildo resource type (e.g., FILES). validateToken checks this field against expected types.\n const result = await this.consumableTokenService.createToken({\n tokenType: CoreConsumableTokenTypes.FILE_PUBLIC_ACCESS,\n consumptionMode,\n resourceIdentifier: CoreResourceType.FILES,\n relatedId: fileId,\n organizationId: file.organizationId,\n expiresIn: expiresIn as DurationValue,\n roles: [],\n maxUses,\n metadata: {\n linkedResourceType: file.linkedResourceType,\n linkedFieldName: file.linkedFieldName,\n originalFilename: file.originalFilename,\n },\n });\n\n this.jsonSuccess(res, {\n token: result.token,\n expiresAt: result.expiresAt.toISOString(),\n ...(maxUses != null && { maxUses }),\n }, 201);\n } catch (error) {\n next(error);\n }\n }\n\n /**\n * Consume a public access token only after the HTTP response has completed\n * successfully. This avoids burning single-use tokens on downstream stream or\n * response failures that happen after authorization has already succeeded.\n */\n private scheduleConsumableTokenConsumptionOnSuccess(\n res: Response,\n consumableToken: string,\n fileId: string,\n ): void {\n let settled = false;\n\n const cleanup = () => {\n res.off('finish', onFinish);\n res.off('close', onClose);\n res.off('error', onError);\n };\n\n const onFinish = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n\n void Promise.resolve(this.consumeFileTokenWithRetry(consumableToken, fileId)).catch((error: unknown) => {\n this.logger.error('Failed to consume file token after successful response retries', {\n fileId,\n ...projectCaughtErrorLogFields(error),\n });\n });\n };\n\n const onClose = () => {\n if (settled || res.writableFinished) {\n return;\n }\n\n settled = true;\n cleanup();\n };\n\n const onError = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n };\n\n res.once('finish', onFinish);\n res.once('close', onClose);\n res.once('error', onError);\n }\n\n /**\n * Fetch a file record directly via repository, bypassing user-level authorization.\n * Used for token-authenticated public access where the consumable token itself provides authorization.\n *\n * Uses an internal system execution context (INTERNALLY_INITIATED_REQUEST with APP_ADMIN_SUPER_ADMIN)\n * to perform the read, ensuring the repository's prefix/postfix hooks have a valid context.\n */\n private async getFileDirectly(fileId: string): Promise<File | null> {\n const internalContext = await this.executionContextCreator.createForInternalSystemOperation();\n const filesRepo = this.repositoriesRegistry.getRepositoryOrThrow(\n CoreResourceType.FILES,\n internalContext,\n );\n const file = await filesRepo.read<File>(\n internalContext,\n { _id: fileId },\n );\n return file || null;\n }\n\n /**\n * Look up the z_file field metadata for a linked file to determine if sharing is enabled.\n *\n * Uses `getFileMetadata()` from `@wildo-ai/zod-decorators` to read the `FileSchemaMetadata`\n * stored by `z_file({ sharable: true })`. The metadata is accessed via the resource registry\n * → resource configuration → mainSchema → field schema.\n *\n * Returns `{ sharable: boolean, sharableDefaults?: ... }` based on the schema metadata\n * of the field that owns this file. If the file is not linked or the field cannot be\n * found, returns `{ sharable: false }`.\n */\n private getFileFieldSharableMetadata(file: File): {\n sharable: boolean;\n sharableDefaults?: { expiresIn?: ExpiresInDuration; maxUses?: number; consumptionMode?: 'SINGLE_USE' | 'BOUNDED_REUSE' };\n } {\n // File must be linked to a resource to have schema metadata\n if (!file.linkedResourceType || !file.linkedFieldName) {\n return { sharable: false };\n }\n\n try {\n const detectedField = this.fileFieldDetection.getFileFieldMetadata(\n file.linkedResourceType as any,\n file.linkedFieldName,\n );\n if (!detectedField) {\n return { sharable: false };\n }\n\n const fileConfig = detectedField.fileMetadata;\n if (!fileConfig) {\n return { sharable: false };\n }\n\n return {\n sharable: !!fileConfig.sharable,\n sharableDefaults: fileConfig.sharableDefaults,\n };\n } catch {\n // If anything fails during schema lookup, sharing is not available\n this.logDebug('Failed to look up file field sharable metadata', {\n fileId: file.fileId,\n linkedResourceType: file.linkedResourceType,\n linkedFieldName: file.linkedFieldName,\n });\n return { sharable: false };\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"resource-file-upload-handler.backend.service.d.ts","sourceRoot":"","sources":["../../../../../src/files/handlers/resource-file-upload-handler.backend.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-file-upload-handler.backend.service.d.ts","sourceRoot":"","sources":["../../../../../src/files/handlers/resource-file-upload-handler.backend.service.ts"],"names":[],"mappings":"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"}
@@ -392,9 +392,44 @@ let ResourceFileUploadHandlerBackendService = class ResourceFileUploadHandlerBac
392
392
  },
393
393
  });
394
394
  }
395
- // Step 9: Return success response with file metadata
396
- const fileMetadata = this.filesService.toMetadataResponse(uploadedFile);
397
- uploadReachedSuccessState = uploadedFile.status === FileStatus.UPLOADED;
395
+ /*
396
+ * Step 9: hold a scanned file NON-DOWNLOADABLE before anyone is told the upload succeeded.
397
+ *
398
+ * `initiateScan` awaits the UPLOADED -> SCANNING transition and only then fires the scan
399
+ * pipeline asynchronously, so awaiting it here costs ONE status write, not the scan. Until
400
+ * 2026-09-08 this ran AFTER the response, fire-and-forget (#433): the file sat at UPLOADED —
401
+ * a downloadable status — for the whole gap between the upload committing and the transition
402
+ * landing, so a field declaring `scanPolicy: 'required'` had a window in which its bytes were
403
+ * servable unscanned. The control advertised more than it held.
404
+ *
405
+ * FAIL-CLOSED, deliberately: this is NOT wrapped in a catch. A scan that cannot be initiated
406
+ * fails the upload, and because `uploadReachedSuccessState` is still false the catch below
407
+ * marks the file FAILED. A caught-and-logged failure would leave the row at UPLOADED, which is
408
+ * exactly the servable state this closes — a scanner outage would silently reopen the window
409
+ * on every upload. An operator gets a failed upload instead, which is the behaviour a control
410
+ * named `required` has to have.
411
+ */
412
+ const scanIsRequired = this.fileScanningService.shouldScan(fieldMeta?.fileMetadata);
413
+ let uploadedFileForResponse = uploadedFile;
414
+ if (scanIsRequired) {
415
+ await this.fileScanningService.initiateScan(uploadedFile.fileId, executionContext);
416
+ // Re-read so the response reports SCANNING rather than the UPLOADED this row no longer has.
417
+ // A client polling `GET /files/:fileId/metadata` sees SCANNING either way; reporting
418
+ // UPLOADED here would make the upload response the one place the two disagree. A null read
419
+ // keeps the pre-transition row rather than failing an upload that already succeeded.
420
+ const afterScanInitiation = await this.filesService.getFile(uploadedFile.fileId, executionContext);
421
+ if (afterScanInitiation) {
422
+ uploadedFileForResponse = afterScanInitiation;
423
+ }
424
+ }
425
+ // Step 9b: Return success response with file metadata
426
+ const fileMetadata = this.filesService.toMetadataResponse(uploadedFileForResponse);
427
+ /*
428
+ * SCANNING counts as reached-success alongside UPLOADED: the upload itself committed, and the
429
+ * catch below must not roll a scanned file back to FAILED for a later response-layer failure.
430
+ */
431
+ uploadReachedSuccessState = uploadedFileForResponse.status === FileStatus.UPLOADED
432
+ || uploadedFileForResponse.status === FileStatus.SCANNING;
398
433
  response.status(200).json({
399
434
  success: true,
400
435
  file: fileMetadata,
@@ -404,7 +439,7 @@ let ResourceFileUploadHandlerBackendService = class ResourceFileUploadHandlerBac
404
439
  resourceType,
405
440
  fieldName,
406
441
  });
407
- // Step 9b: a redeemed grant records what it produced and is audited. Best-effort by contract —
442
+ // Step 10: a redeemed grant records what it produced and is audited. Best-effort by contract —
408
443
  // the upload has succeeded and the response is sent; a failure here is logged, never thrown.
409
444
  if (grant) {
410
445
  this.fileUploadGrantService
@@ -417,17 +452,6 @@ let ResourceFileUploadHandlerBackendService = class ResourceFileUploadHandlerBac
417
452
  });
418
453
  });
419
454
  }
420
- // Step 10: Post-upload async pipeline (fire-and-forget, response already sent)
421
- const shouldScan = this.fileScanningService.shouldScan(fieldMeta?.fileMetadata);
422
- if (shouldScan) {
423
- this.fileScanningService.initiateScan(uploadedFile.fileId, executionContext)
424
- .catch((scanError) => {
425
- this.logger.error('Failed to initiate file scanning', {
426
- fileId: uploadedFile.fileId,
427
- ...projectCaughtErrorLogFields(scanError),
428
- });
429
- });
430
- }
431
455
  }
432
456
  catch (error) {
433
457
  // Only pre-success failures should transition a file to FAILED. Once the