@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
@@ -11,14 +11,30 @@
11
11
  * 5. Processes combined results (CLEAN / INFECTED)
12
12
  * 6. Quarantines infected files
13
13
  *
14
- * Scanning is **optimistic**: the upload response returns immediately
15
- * with status UPLOADED. The file becomes downloadable only after
16
- * transitioning to CLEAN (when scanning is enabled). If scanning is
17
- * disabled, the file stays at UPLOADED and remains downloadable.
14
+ * Scanning is **fail-closed at the gate, asynchronous in the pipeline** (#433). The upload handler
15
+ * AWAITS `initiateScan`, which awaits the UPLOADED -> SCANNING transition and only then fires the
16
+ * pipeline — so the upload response costs one status write, not a scan, and the file is already
17
+ * non-downloadable when the caller is told the upload succeeded. It becomes downloadable when the
18
+ * result handler transitions it to CLEAN.
19
+ *
20
+ * This paragraph used to say the response "returns immediately with status UPLOADED", and that was
21
+ * the defect: UPLOADED is a downloadable status, so a field declaring `scanPolicy: 'required'` had
22
+ * a window in which unscanned bytes were servable. If scanning is not required for the field, the
23
+ * file stays at UPLOADED and remains downloadable — that half is unchanged and deliberate.
18
24
  *
19
25
  * Configuration:
20
- * - Global: `appConfig.files.scanning.enabled` (default: false)
21
- * - Per-field: `z_file({ scanPolicy: 'required' | 'skip' })` overrides global
26
+ * - Application-wide: DERIVED, not declared. Scanning is on for a field that states no policy of its
27
+ * own exactly when a scanner is reachable — `fileScanning.antivirus` (seeded from `CLAMAV_HOST`) or
28
+ * `fileScanning.yara` both enabled and reachable (`YARA_ENABLED` + `YARA_HOST`). Provisioning the
29
+ * sidecar IS the application-level opt-in; there is no separate on/off flag. See
30
+ * {@link FileScanningBackendService.isGlobalScanningEnabled} for why it is derived rather than declared.
31
+ * - Per-field: `z_file({ scanPolicy: 'required' | 'skip' })` overrides that, in both directions.
32
+ *
33
+ * These two lines used to name `appConfig.files.scanning.enabled`, a configuration path no schema has
34
+ * ever declared — so the application-wide half was documented, cast through `any`, and dead.
35
+ *
36
+ * A scan that was REQUESTED and finds no scanner now FAILS the file rather than passing it; the tail of
37
+ * `executeScan` carries the reasoning.
22
38
  */
23
39
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
24
40
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -32,7 +48,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
32
48
  var __param = (this && this.__param) || function (paramIndex, decorator) {
33
49
  return function (target, key) { decorator(target, key, paramIndex); }
34
50
  };
35
- import { injectable, inject } from 'inversify';
51
+ import { injectable, inject, optional } from 'inversify';
36
52
  import { ErrorType, ErrorCustomMessageReference, FileStatus, FILE_STATUS_TRANSITIONS, } from '@wildo-ai/saas-models';
37
53
  import { SAAS_SERVICE_TYPES } from '../../inject/models/service-types.js';
38
54
  import { ErrorBuilderBackendService } from '../../errors/services/error-builder.backend.service.js';
@@ -55,9 +71,10 @@ let FileScanningBackendService = class FileScanningBackendService {
55
71
  clamavScanner;
56
72
  yaraScanner;
57
73
  fileStorageRouter;
74
+ auditLogsService;
58
75
  logDebug;
59
76
  onCleanCallbacks = new Map();
60
- constructor(logger, errorBuilder, filesService, appConfigService, clamavScanner, yaraScanner, fileStorageRouter) {
77
+ constructor(logger, errorBuilder, filesService, appConfigService, clamavScanner, yaraScanner, fileStorageRouter, auditLogsService) {
61
78
  this.logger = logger;
62
79
  this.errorBuilder = errorBuilder;
63
80
  this.filesService = filesService;
@@ -65,6 +82,7 @@ let FileScanningBackendService = class FileScanningBackendService {
65
82
  this.clamavScanner = clamavScanner;
66
83
  this.yaraScanner = yaraScanner;
67
84
  this.fileStorageRouter = fileStorageRouter;
85
+ this.auditLogsService = auditLogsService;
68
86
  this.logDebug = this.logger.debugByType('FileScanningBackendService');
69
87
  }
70
88
  /**
@@ -72,7 +90,17 @@ let FileScanningBackendService = class FileScanningBackendService {
72
90
  *
73
91
  * Resolution order:
74
92
  * 1. Per-field `z_file({ scanPolicy })` wins if set
75
- * 2. Falls back to global `appConfig.files.scanning.enabled`
93
+ * 2. Falls back to the application-wide answer, {@link isGlobalScanningEnabled}
94
+ *
95
+ * assurance-control: WILDO.SECURITY.INGESTED_CONTENT_INSPECTION — whether ingested content is
96
+ * inspected is a declared decision, per field and then per application, rather than an implicit one.
97
+ *
98
+ * The per-APPLICATION half of that claim was false until 2026-09-09: step 2 read a configuration path
99
+ * no schema declares, so it answered `false` in every application ever built and `scanPolicy` was the
100
+ * only reachable declaration. It is true now because the application-wide answer is DERIVED from the
101
+ * scanner topology the operator provisions — a declaration made by supplying `CLAMAV_HOST`, and
102
+ * refused a default. Nothing here is implicit in either direction: a field can still override, and a
103
+ * requested scan with no scanner refuses rather than passing (see the tail of `executeScan`).
76
104
  */
77
105
  shouldScan(fileMetadata) {
78
106
  const scanPolicy = fileMetadata?.scanPolicy;
@@ -83,13 +111,54 @@ let FileScanningBackendService = class FileScanningBackendService {
83
111
  return this.isGlobalScanningEnabled();
84
112
  }
85
113
  /**
86
- * Check if global scanning is enabled in the app configuration.
114
+ * Whether scanning is on APPLICATION-WIDE, for a file field that states no `scanPolicy` of its own.
115
+ *
116
+ * DERIVED from the platform-injected `fileScanning` topology: a scanner being reachable IS the
117
+ * application-level opt-in.
118
+ *
119
+ * ## What this replaced
120
+ *
121
+ * `(this.appConfigService.config as Record<string, any>)?.files?.scanning?.enabled === true`. The
122
+ * `any` cast is the tell — `AppConfigurationSchema` declares no `files` section, `z.object` strips
123
+ * unknown keys, so the parsed configuration could never carry that path and the expression was
124
+ * `undefined === true` for every application, for the whole life of the flag. The service's own
125
+ * docstring documented it as the global switch.
126
+ *
127
+ * ## Why DERIVED rather than declared
128
+ *
129
+ * Adding an `enabled` boolean to `AppConfiguration_FileScanningSchema` was the other candidate and is
130
+ * rejected on three counts:
131
+ *
132
+ * - **the answer already exists.** `fileScanning` is a mutation-boundary-PROTECTED section
133
+ * (`APP_CONFIG_MUTATION_BOUNDARY_RULES` in `app-config.backend-authored.definitions.ts`: "file-scanning
134
+ * sidecar topology and its platform-level opt-in are env/bootstrap-owned"), so an application cannot
135
+ * author it. A boolean would have to be seeded from a NEW environment key sitting beside the host key
136
+ * that already says the same thing — a second source of truth that can disagree with the first;
137
+ * - **it matches the convention of the thing it gates.** ClamAV has no enable flag anywhere in this
138
+ * subsystem: `ClamAVScannerBackendService.isConfigured()` states "presence of a host IS the opt-in",
139
+ * and `buildFileServicesTopologyFromEnvironment` refuses to emit a plausible default host for exactly
140
+ * that reason;
141
+ * - **it closes the hole the repair would otherwise open.** A separate boolean makes "globally on, no
142
+ * scanner reachable" a REPRESENTABLE state, and that state is precisely the one the pipeline used to
143
+ * answer with a CLEAN verdict. Derived, the state cannot exist: the switch is on only when something
144
+ * can actually run. The runtime refusal in `executeScan` stays regardless, because `scanPolicy:
145
+ * 'required'` reaches the same tail without consulting this switch at all.
146
+ *
147
+ * The two predicates are the pipeline's OWN — `executeScan` gates its two layers on exactly
148
+ * `clamavScanner.isConfigured()` and `yaraScanner.isEnabled()` — so the switch and the pipeline cannot
149
+ * come to different conclusions about whether a scan is possible. Note `isEnabled()` is already the
150
+ * conjunction of YARA's two independent axes (opted in AND reachable), which is why the "enabled but
151
+ * unreachable" misconfiguration does not read as an application-wide opt-in here; the startup validator
152
+ * reports it as its own issue instead.
153
+ *
154
+ * The `isInitialized()` guard stays: both scanner reads deliberately throw
155
+ * `app_configuration_not_initialized` rather than softening to `false`, and a scan decision taken before
156
+ * configuration has landed is not a decision.
87
157
  */
88
158
  isGlobalScanningEnabled() {
89
159
  if (!this.appConfigService.isInitialized())
90
160
  return false;
91
- const filesConfig = this.appConfigService.config?.files;
92
- return filesConfig?.scanning?.enabled === true;
161
+ return this.clamavScanner.isConfigured() || this.yaraScanner.isEnabled();
93
162
  }
94
163
  /**
95
164
  * Initiate scanning for a file that just reached UPLOADED status.
@@ -243,13 +312,46 @@ let FileScanningBackendService = class FileScanningBackendService {
243
312
  }
244
313
  }
245
314
  }
246
- // ── All layers passed ──────────────────────────────────────────────
247
- if (!this.clamavScanner.isConfigured() && !this.yaraScanner.isEnabled()) {
248
- this.logger.warn('No scanners configured — marking as CLEAN', { fileId });
315
+ // ── Nothing ran: refuse, do not certify ────────────────────────────
316
+ //
317
+ // This branch used to log a warning and then hand `handleScanResult` a CLEAN verdict with
318
+ // `scannerRef: 'none'` — which transitions the file to `FileStatus.CLEAN`, a member of
319
+ // `FILE_DOWNLOADABLE_STATUSES`. A scan had been REQUESTED (`shouldScan` said yes, `initiateScan`
320
+ // moved the file to SCANNING, the uploader was told the upload succeeded), and the answer returned
321
+ // was the answer a PASSING scan gives, produced by no scanner. That is strictly worse than not
322
+ // scanning at all: a field declaring `scanPolicy: 'required'` ended with bytes certified clean, and
323
+ // the only trace was a warning in a log nobody reads.
324
+ //
325
+ // ERROR -> `FileStatus.FAILED` is the fail-closed terminal, and the right one rather than merely the
326
+ // safe one: FAILED is outside `FILE_DOWNLOADABLE_STATUSES` so the bytes are blocked, it is outside
327
+ // `FILE_METADATA_WITHHELD_STATUSES` so the uploader can still poll and see WHY, and
328
+ // `FILE_STATUS_TRANSITIONS` keeps SCANNING -> FAILED, so nothing about the lifecycle has to move.
329
+ // A file that failed this way becomes scannable again the moment a scanner is provisioned.
330
+ //
331
+ // Keyed on `executedScannerLayers` — direct evidence that nothing ran — rather than on re-asking the
332
+ // two `isConfigured()` predicates. Re-asking would be a second copy of the decision the two layer
333
+ // gates above already took, and the copies can disagree if a layer ever grows another skip reason.
334
+ //
335
+ // Not redundant with the boot gate, which is the obvious objection. `collectScanningIssues` refuses
336
+ // to start an application whose fields declare `scanPolicy: 'required'` when ClamAV is unconfigured,
337
+ // so in a well-formed deployment this branch is unreachable. But that gate builds its population by
338
+ // walking every resource's file fields inside `try { … } catch { continue; }`: a resource whose field
339
+ // detection throws contributes no fields and is silently absent from the count. A boot check that can
340
+ // under-report the population it protects is not a substitute for the refusal at the site itself.
341
+ if (executedScannerLayers.length === 0) {
342
+ await this.handleScanResult(fileId, {
343
+ verdict: FileScanVerdict.ERROR,
344
+ errorMessage: 'Scan was requested but no scanner is configured (no ClamAV host, and YARA not enabled/reachable) — refusing to certify the file as clean',
345
+ scannerRef: 'none',
346
+ }, executionContext);
347
+ return;
249
348
  }
349
+ // ── All layers that ran, passed ────────────────────────────────────
350
+ // `join('+')` needs no `|| 'none'` fallback any more: the empty case returned above, so a CLEAN
351
+ // verdict from here always names at least one scanner that actually executed.
250
352
  await this.handleScanResult(fileId, {
251
353
  verdict: FileScanVerdict.CLEAN,
252
- scannerRef: executedScannerLayers.join('+') || 'none',
354
+ scannerRef: executedScannerLayers.join('+'),
253
355
  }, executionContext);
254
356
  }
255
357
  /**
@@ -267,6 +369,19 @@ let FileScanningBackendService = class FileScanningBackendService {
267
369
  scannerRef: result.scannerRef,
268
370
  durationMs: result.durationMs,
269
371
  });
372
+ /*
373
+ * assurance-control: WILDO.SECURITY.INGESTED_CONTENT_INSPECTION — the scanner's verdict becomes a
374
+ * member of `FileStatus`, which is also what `FILE_DOWNLOADABLE_STATUSES` reads, so "inspected" and
375
+ * "servable" are one decision rather than two that could disagree. `FileScanVerdict` names the
376
+ * scanner's answer; `FileStatus` is the one with consequence, which is why the assurance capability
377
+ * derives from it.
378
+ *
379
+ * The outcome now ALSO reaches the audit trail (#506): `FILE_MALWARE_DETECTED` when a scanner
380
+ * concludes an infection, `FILE_MALWARE_SCAN_FAILED` when the scan could not run. Both are
381
+ * emitted AFTER the terminal transition, so the row can never describe a state the record does
382
+ * not hold. Until they existed, an infection produced a status change and nothing else — the only
383
+ * way to learn malware had arrived was to notice a row sitting at `QUARANTINED`.
384
+ */
270
385
  switch (result.verdict) {
271
386
  case FileScanVerdict.CLEAN:
272
387
  await this.filesService.updateFileStatus(fileId, FileStatus.CLEAN, executionContext);
@@ -296,6 +411,9 @@ let FileScanningBackendService = class FileScanningBackendService {
296
411
  scannerRef: result.scannerRef,
297
412
  });
298
413
  await this.quarantineInfectedFile(fileId, result, executionContext);
414
+ // AFTER the quarantine transition, so `fileStatus` is what the record holds rather than what
415
+ // this method intended. If the quarantine failed, the row says INFECTED, which is true.
416
+ await this.recordScanOutcomeAudit(fileId, result, executionContext);
299
417
  break;
300
418
  case FileScanVerdict.ERROR:
301
419
  this.onCleanCallbacks.delete(fileId);
@@ -305,9 +423,69 @@ let FileScanningBackendService = class FileScanningBackendService {
305
423
  scannerRef: result.scannerRef,
306
424
  });
307
425
  await this.filesService.updateFileStatus(fileId, FileStatus.FAILED, executionContext);
426
+ await this.recordScanOutcomeAudit(fileId, result, executionContext);
308
427
  break;
309
428
  }
310
429
  }
430
+ /**
431
+ * Write the scan outcome to the audit trail (#506).
432
+ *
433
+ * Best-effort and never throwing: the file's status transition is the enforcement, and an audit
434
+ * store being unavailable must not convert a successful quarantine into an exception that leaves
435
+ * the caller believing the scan failed.
436
+ *
437
+ * A CLEAN verdict is deliberately NOT audited. Every upload is scanned, so a clean row per upload
438
+ * would be the highest-volume event in the trail and would bury the two that matter — and the
439
+ * upload itself is already recorded by `FILE_UPLOAD_GRANT_REDEEMED`. What is added here is the
440
+ * conclusion an operator would want to be alerted on.
441
+ */
442
+ async recordScanOutcomeAudit(fileId, result, executionContext) {
443
+ if (!this.auditLogsService)
444
+ return;
445
+ try {
446
+ // Re-read rather than assume: the transition may have failed, and the audit row must describe
447
+ // the record, not the intent.
448
+ const fileStatus = await this.resolveRecordedFileStatus(fileId, executionContext);
449
+ const organizationId = executionContext.initiatorIds?.organizationId;
450
+ const userId = executionContext.initiatorIds?.userId;
451
+ if (result.verdict === FileScanVerdict.INFECTED) {
452
+ await this.auditLogsService.logFileMalwareDetected({
453
+ fileId,
454
+ scannerRef: result.scannerRef,
455
+ threatName: result.threatName,
456
+ organizationId,
457
+ userId,
458
+ fileStatus,
459
+ }, executionContext);
460
+ return;
461
+ }
462
+ await this.auditLogsService.logFileMalwareScanFailed({
463
+ fileId,
464
+ scannerRef: result.scannerRef,
465
+ failureReason: result.errorMessage,
466
+ organizationId,
467
+ userId,
468
+ fileStatus,
469
+ }, executionContext);
470
+ }
471
+ catch (error) {
472
+ this.logger.warn('Failed to record the file scan outcome in the audit trail', {
473
+ fileId,
474
+ verdict: result.verdict,
475
+ ...projectCaughtErrorLogFields(error),
476
+ });
477
+ }
478
+ }
479
+ /** The status the FILES row actually carries after the transition, or `unknown` if it cannot be read. */
480
+ async resolveRecordedFileStatus(fileId, executionContext) {
481
+ try {
482
+ const file = await this.filesService.getFile(fileId, executionContext);
483
+ return file?.status ?? 'unknown';
484
+ }
485
+ catch {
486
+ return 'unknown';
487
+ }
488
+ }
311
489
  /**
312
490
  * Quarantine an infected file.
313
491
  *
@@ -340,12 +518,14 @@ FileScanningBackendService = __decorate([
340
518
  __param(4, inject(SAAS_SERVICE_TYPES.ClamAVScannerService)),
341
519
  __param(5, inject(SAAS_SERVICE_TYPES.YaraScannerService)),
342
520
  __param(6, inject(SAAS_SERVICE_TYPES.FileStorageRouter)),
521
+ __param(7, inject(SAAS_SERVICE_TYPES.AuditLogsService)),
522
+ __param(7, optional()),
343
523
  __metadata("design:paramtypes", [Function, ErrorBuilderBackendService,
344
524
  FilesBackendService,
345
525
  AppConfigurationService,
346
526
  ClamAVScannerBackendService,
347
527
  YaraScannerBackendService,
348
- FileStorageRouterBackendService])
528
+ FileStorageRouterBackendService, Function])
349
529
  ], FileScanningBackendService);
350
530
  export { FileScanningBackendService };
351
531
  //# sourceMappingURL=file-scanning.backend.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-scanning.backend.service.js","sourceRoot":"","sources":["../../../../../src/files/services/file-scanning.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * File Scanning Backend Service\n *\n * Orchestrates antivirus scanning for uploaded files. After a file\n * reaches UPLOADED status, this service:\n *\n * 1. Transitions the file to SCANNING\n * 2. Downloads the file from storage\n * 3. Submits to ClamAV via TCP (signature-based)\n * 4. If ClamAV passes, submits to YARA via REST (pattern-based, optional)\n * 5. Processes combined results (CLEAN / INFECTED)\n * 6. Quarantines infected files\n *\n * Scanning is **optimistic**: the upload response returns immediately\n * with status UPLOADED. The file becomes downloadable only after\n * transitioning to CLEAN (when scanning is enabled). If scanning is\n * disabled, the file stays at UPLOADED and remains downloadable.\n *\n * Configuration:\n * - Global: `appConfig.files.scanning.enabled` (default: false)\n * - Per-field: `z_file({ scanPolicy: 'required' | 'skip' })` overrides global\n */\n\nimport { injectable, inject } from 'inversify';\nimport {\n ErrorType,\n ErrorCustomMessageReference,\n FileStatus,\n FILE_STATUS_TRANSITIONS,\n} from '@wildo-ai/saas-models';\nimport type { FileSchemaMetadata } from '@wildo-ai/zod-decorators';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError, projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport { FilesBackendService } from '~wildo-backend-lib/files/services/files.backend.service';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { ClamAVScannerBackendService } from '~wildo-backend-lib/files/scanning/clamav-scanner.backend.service';\nimport {\n FileScanVerdict,\n type FileScanResult,\n} from '~wildo-backend-lib/files/scanning/file-scan.types';\nimport { YaraScannerBackendService } from '~wildo-backend-lib/files/scanning/yara-scanner.backend.service';\nimport { FileStorageRouterBackendService } from '~wildo-backend-lib/files/storage/file-storage-router.backend.service';\nexport {\n FileScanVerdict,\n type FileScanResult,\n} from '~wildo-backend-lib/files/scanning/file-scan.types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n@injectable()\nexport class FileScanningBackendService {\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n private readonly onCleanCallbacks = new Map<string, () => Promise<void>>();\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger)\n private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService)\n private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.FilesBackendService)\n private readonly filesService: FilesBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService)\n private readonly appConfigService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ClamAVScannerService)\n private readonly clamavScanner: ClamAVScannerBackendService,\n @inject(SAAS_SERVICE_TYPES.YaraScannerService)\n private readonly yaraScanner: YaraScannerBackendService,\n @inject(SAAS_SERVICE_TYPES.FileStorageRouter)\n private readonly fileStorageRouter: FileStorageRouterBackendService,\n ) {\n this.logDebug = this.logger.debugByType('FileScanningBackendService');\n }\n\n /**\n * Determine whether a file should be scanned after upload.\n *\n * Resolution order:\n * 1. Per-field `z_file({ scanPolicy })` wins if set\n * 2. Falls back to global `appConfig.files.scanning.enabled`\n */\n shouldScan(fileMetadata?: FileSchemaMetadata): boolean {\n const scanPolicy = fileMetadata?.scanPolicy;\n\n if (scanPolicy === 'required') return true;\n if (scanPolicy === 'skip') return false;\n\n return this.isGlobalScanningEnabled();\n }\n\n /**\n * Check if global scanning is enabled in the app configuration.\n */\n isGlobalScanningEnabled(): boolean {\n if (!this.appConfigService.isInitialized()) return false;\n const filesConfig = (this.appConfigService.config as Record<string, any>)?.files;\n return filesConfig?.scanning?.enabled === true;\n }\n\n /**\n * Initiate scanning for a file that just reached UPLOADED status.\n *\n * Transitions to SCANNING, then dispatches the scan job.\n * The response is fire-and-forget: the caller does not wait for scan\n * completion — scan results are processed asynchronously via\n * `handleScanResult()`.\n *\n * @param onClean - Optional callback invoked when scan verdict is CLEAN.\n * Used to chain post-scan work that must only run on safe bytes. Note the file\n * STATUS lifecycle ends at CLEAN for processing purposes — RAG chunking of a\n * `ragSource` file field is per-field derived data (chunk rows), never a file\n * status transition.\n */\n async initiateScan(\n fileId: string,\n executionContext: ExecutionContext<any>,\n onClean?: () => Promise<void>,\n ): Promise<void> {\n const allowedTransitions = FILE_STATUS_TRANSITIONS[FileStatus.UPLOADED];\n if (!allowedTransitions.includes(FileStatus.SCANNING)) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_INVALID_STATUS_TRANSITION,\n context: {\n fileId, // diagnostic (log-only)\n },\n },\n );\n }\n\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.SCANNING,\n executionContext,\n );\n\n if (onClean) {\n this.onCleanCallbacks.set(fileId, onClean);\n }\n\n this.logDebug('File transitioned to SCANNING, dispatching scan', { fileId });\n\n // Run the full scanning pipeline asynchronously. The file is already in\n // SCANNING status so downloads are blocked until the result handler\n // transitions it to CLEAN / INFECTED / FAILED.\n this.executeScan(fileId, executionContext).catch((err) => {\n this.logger.error('Scan execution failed unexpectedly', {\n fileId,\n ...projectCaughtErrorLogFields(err),\n });\n });\n }\n\n /**\n * Download the file from storage and run the scanning pipeline.\n *\n * Pipeline order:\n * 1. ClamAV (signature-based) — if configured\n * 2. YARA (pattern-based) — if enabled and ClamAV passed\n *\n * Short-circuits on first INFECTED verdict. YARA only runs if the\n * file survived ClamAV — no point in pattern-matching a known virus.\n */\n private async executeScan(\n fileId: string,\n executionContext: ExecutionContext<any>,\n ): Promise<void> {\n const file = await this.filesService.getFile(fileId, executionContext);\n if (!file) {\n this.logger.error('File not found for scanning', { fileId });\n return;\n }\n\n // Resolve through FilesBackendService rather than the router directly, so a\n // LEGACY row that persisted no `storageProvider` falls back to the default\n // provider instead of failing the scan. Reimplementing the lookup here is what\n // made this one of five different behaviours for a provider-less row.\n //\n // The throw is deliberately converted back into a terminal verdict rather than\n // propagated. `getStorageProviderForFile` throws INTERNAL when the persisted id\n // is not registered, and this pipeline is fire-and-forget — its dispatcher's\n // `.catch()` only LOGS. An escaping throw would therefore leave the file in\n // SCANNING permanently, and downloads stay blocked until a result handler moves\n // it out. That is strictly worse than the ERROR verdict this site already\n // recorded, so the drift is closed WITHOUT adopting the reference behaviour on\n // the throwing branch.\n let provider;\n try {\n provider = this.filesService.getStorageProviderForFile(file, executionContext);\n } catch (err) {\n await this.handleScanResult(fileId, {\n verdict: FileScanVerdict.ERROR,\n errorMessage: `Storage provider '${file.storageProvider}' not available for scan download`,\n scannerRef: 'scan-pipeline',\n }, executionContext);\n this.logger.error('Scan aborted: persisted storage provider is not registered', {\n fileId,\n storageProvider: file.storageProvider,\n ...projectCaughtErrorLogFields(err),\n });\n return;\n }\n\n const downloadParams = {\n fileId: file.fileId,\n storageProvider: file.storageProvider,\n storageRef: file.storageRef,\n };\n const executedScannerLayers: string[] = [];\n\n // ── Layer 1: ClamAV ────────────────────────────────────────────────\n if (this.clamavScanner.isConfigured()) {\n executedScannerLayers.push('clamav');\n let downloadResult;\n try {\n downloadResult = await provider.download(downloadParams, executionContext);\n } catch (err) {\n await this.handleScanResult(fileId, {\n verdict: FileScanVerdict.ERROR,\n errorMessage: `Failed to download file for ClamAV: ${describeCaughtError(err)}`,\n scannerRef: 'clamav',\n }, executionContext);\n return;\n }\n\n try {\n const clamResult = await this.clamavScanner.scanStream(downloadResult.stream, fileId);\n\n if (clamResult.verdict !== FileScanVerdict.CLEAN) {\n await this.handleScanResult(fileId, clamResult, executionContext);\n return;\n }\n\n this.logDebug('ClamAV layer passed', { fileId, durationMs: clamResult.durationMs });\n } finally {\n if (!downloadResult.stream.destroyed) {\n downloadResult.stream.destroy();\n }\n }\n } else {\n this.logDebug('ClamAV not configured — skipping signature scan', { fileId });\n }\n\n // ── Layer 2: YARA (optional, platform-level) ───────────────────────\n if (this.yaraScanner.isEnabled()) {\n executedScannerLayers.push('yara');\n let downloadResult;\n try {\n downloadResult = await provider.download(downloadParams, executionContext);\n } catch (err) {\n await this.handleScanResult(fileId, {\n verdict: FileScanVerdict.ERROR,\n errorMessage: `Failed to download file for YARA: ${describeCaughtError(err)}`,\n scannerRef: 'yara',\n }, executionContext);\n return;\n }\n\n try {\n const yaraResult = await this.yaraScanner.scanStream(downloadResult.stream, fileId);\n\n if (yaraResult.verdict !== FileScanVerdict.CLEAN) {\n await this.handleScanResult(fileId, yaraResult, executionContext);\n return;\n }\n\n this.logDebug('YARA layer passed', { fileId, durationMs: yaraResult.durationMs });\n } finally {\n if (!downloadResult.stream.destroyed) {\n downloadResult.stream.destroy();\n }\n }\n }\n\n // ── All layers passed ──────────────────────────────────────────────\n if (!this.clamavScanner.isConfigured() && !this.yaraScanner.isEnabled()) {\n this.logger.warn('No scanners configured — marking as CLEAN', { fileId });\n }\n\n await this.handleScanResult(fileId, {\n verdict: FileScanVerdict.CLEAN,\n scannerRef: executedScannerLayers.join('+') || 'none',\n }, executionContext);\n }\n\n /**\n * Process the result of a scan job.\n *\n * - CLEAN: transition to CLEAN (file becomes downloadable)\n * - INFECTED: transition to INFECTED, then quarantine\n * - ERROR: transition to FAILED (retryable via re-scan)\n */\n async handleScanResult(\n fileId: string,\n result: FileScanResult,\n executionContext: ExecutionContext<any>,\n ): Promise<void> {\n this.logDebug('Processing scan result', {\n fileId,\n verdict: result.verdict,\n threatName: result.threatName,\n scannerRef: result.scannerRef,\n durationMs: result.durationMs,\n });\n\n switch (result.verdict) {\n case FileScanVerdict.CLEAN:\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.CLEAN,\n executionContext,\n );\n this.logDebug('File marked as CLEAN after scan', { fileId });\n\n // Invoke the post-clean callback (generic post-scan work registered by initiateScan's\n // caller). RAG ingestion is deliberately NOT chained here: the service-tier write hook and\n // the hourly reconciliation sweep own corpus derivation, and the ingestion pipeline itself\n // refuses non-downloadable files — so a file that finishes scanning is picked up by the\n // next sweep run with no per-file callback wiring.\n const onClean = this.onCleanCallbacks.get(fileId);\n if (onClean) {\n this.onCleanCallbacks.delete(fileId);\n onClean().catch((err) => {\n this.logger.error('Post-clean callback failed', {\n fileId,\n ...projectCaughtErrorLogFields(err),\n });\n });\n }\n break;\n\n case FileScanVerdict.INFECTED:\n this.onCleanCallbacks.delete(fileId);\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.INFECTED,\n executionContext,\n );\n this.logger.warn('File flagged as INFECTED', {\n fileId,\n threatName: result.threatName,\n scannerRef: result.scannerRef,\n });\n\n await this.quarantineInfectedFile(fileId, result, executionContext);\n break;\n\n case FileScanVerdict.ERROR:\n this.onCleanCallbacks.delete(fileId);\n this.logger.error('Scan failed with error', {\n fileId,\n errorMessage: result.errorMessage,\n scannerRef: result.scannerRef,\n });\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.FAILED,\n executionContext,\n );\n break;\n }\n }\n\n /**\n * Quarantine an infected file.\n *\n * Transitions INFECTED → QUARANTINED. The blob remains in storage\n * but the file is permanently blocked from download. Operators can\n * delete quarantined files via admin tooling.\n */\n private async quarantineInfectedFile(\n fileId: string,\n result: FileScanResult,\n executionContext: ExecutionContext<any>,\n ): Promise<void> {\n try {\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.QUARANTINED,\n executionContext,\n );\n this.logDebug('Infected file quarantined', {\n fileId,\n threatName: result.threatName,\n });\n } catch (error) {\n this.logger.error('Failed to quarantine infected file', {\n fileId,\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"file-scanning.backend.service.js","sourceRoot":"","sources":["../../../../../src/files/services/file-scanning.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * File Scanning Backend Service\n *\n * Orchestrates antivirus scanning for uploaded files. After a file\n * reaches UPLOADED status, this service:\n *\n * 1. Transitions the file to SCANNING\n * 2. Downloads the file from storage\n * 3. Submits to ClamAV via TCP (signature-based)\n * 4. If ClamAV passes, submits to YARA via REST (pattern-based, optional)\n * 5. Processes combined results (CLEAN / INFECTED)\n * 6. Quarantines infected files\n *\n * Scanning is **fail-closed at the gate, asynchronous in the pipeline** (#433). The upload handler\n * AWAITS `initiateScan`, which awaits the UPLOADED -> SCANNING transition and only then fires the\n * pipeline — so the upload response costs one status write, not a scan, and the file is already\n * non-downloadable when the caller is told the upload succeeded. It becomes downloadable when the\n * result handler transitions it to CLEAN.\n *\n * This paragraph used to say the response \"returns immediately with status UPLOADED\", and that was\n * the defect: UPLOADED is a downloadable status, so a field declaring `scanPolicy: 'required'` had\n * a window in which unscanned bytes were servable. If scanning is not required for the field, the\n * file stays at UPLOADED and remains downloadable — that half is unchanged and deliberate.\n *\n * Configuration:\n * - Application-wide: DERIVED, not declared. Scanning is on for a field that states no policy of its\n * own exactly when a scanner is reachable — `fileScanning.antivirus` (seeded from `CLAMAV_HOST`) or\n * `fileScanning.yara` both enabled and reachable (`YARA_ENABLED` + `YARA_HOST`). Provisioning the\n * sidecar IS the application-level opt-in; there is no separate on/off flag. See\n * {@link FileScanningBackendService.isGlobalScanningEnabled} for why it is derived rather than declared.\n * - Per-field: `z_file({ scanPolicy: 'required' | 'skip' })` overrides that, in both directions.\n *\n * These two lines used to name `appConfig.files.scanning.enabled`, a configuration path no schema has\n * ever declared — so the application-wide half was documented, cast through `any`, and dead.\n *\n * A scan that was REQUESTED and finds no scanner now FAILS the file rather than passing it; the tail of\n * `executeScan` carries the reasoning.\n */\n\nimport { injectable, inject, optional } from 'inversify';\nimport {\n ErrorType,\n ErrorCustomMessageReference,\n FileStatus,\n FILE_STATUS_TRANSITIONS,\n} from '@wildo-ai/saas-models';\nimport type { FileSchemaMetadata } from '@wildo-ai/zod-decorators';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { AuditLogsBackendService } from '~wildo-backend-lib/compliance/audit-trails/services/audit-logs.backend.service';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError, projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\nimport { FilesBackendService } from '~wildo-backend-lib/files/services/files.backend.service';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport { ClamAVScannerBackendService } from '~wildo-backend-lib/files/scanning/clamav-scanner.backend.service';\nimport {\n FileScanVerdict,\n type FileScanResult,\n} from '~wildo-backend-lib/files/scanning/file-scan.types';\nimport { YaraScannerBackendService } from '~wildo-backend-lib/files/scanning/yara-scanner.backend.service';\nimport { FileStorageRouterBackendService } from '~wildo-backend-lib/files/storage/file-storage-router.backend.service';\nexport {\n FileScanVerdict,\n type FileScanResult,\n} from '~wildo-backend-lib/files/scanning/file-scan.types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n@injectable()\nexport class FileScanningBackendService {\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n private readonly onCleanCallbacks = new Map<string, () => Promise<void>>();\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger)\n private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService)\n private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.FilesBackendService)\n private readonly filesService: FilesBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService)\n private readonly appConfigService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ClamAVScannerService)\n private readonly clamavScanner: ClamAVScannerBackendService,\n @inject(SAAS_SERVICE_TYPES.YaraScannerService)\n private readonly yaraScanner: YaraScannerBackendService,\n @inject(SAAS_SERVICE_TYPES.FileStorageRouter)\n private readonly fileStorageRouter: FileStorageRouterBackendService,\n /*\n * `@optional()` because a container without the audit service must still SCAN (#506). The record\n * is what this issue adds; refusing to inspect content when the recorder is absent would trade a\n * missing audit row for missing malware detection, which is the worse of the two.\n *\n * The emission below is likewise best-effort: an audit failure must not turn a successful\n * quarantine into an exception that leaves the file mid-transition.\n */\n @inject(SAAS_SERVICE_TYPES.AuditLogsService) @optional()\n private readonly auditLogsService?: AuditLogsBackendService,\n ) {\n this.logDebug = this.logger.debugByType('FileScanningBackendService');\n }\n\n /**\n * Determine whether a file should be scanned after upload.\n *\n * Resolution order:\n * 1. Per-field `z_file({ scanPolicy })` wins if set\n * 2. Falls back to the application-wide answer, {@link isGlobalScanningEnabled}\n *\n * assurance-control: WILDO.SECURITY.INGESTED_CONTENT_INSPECTION — whether ingested content is\n * inspected is a declared decision, per field and then per application, rather than an implicit one.\n *\n * The per-APPLICATION half of that claim was false until 2026-09-09: step 2 read a configuration path\n * no schema declares, so it answered `false` in every application ever built and `scanPolicy` was the\n * only reachable declaration. It is true now because the application-wide answer is DERIVED from the\n * scanner topology the operator provisions — a declaration made by supplying `CLAMAV_HOST`, and\n * refused a default. Nothing here is implicit in either direction: a field can still override, and a\n * requested scan with no scanner refuses rather than passing (see the tail of `executeScan`).\n */\n shouldScan(fileMetadata?: FileSchemaMetadata): boolean {\n const scanPolicy = fileMetadata?.scanPolicy;\n\n if (scanPolicy === 'required') return true;\n if (scanPolicy === 'skip') return false;\n\n return this.isGlobalScanningEnabled();\n }\n\n /**\n * Whether scanning is on APPLICATION-WIDE, for a file field that states no `scanPolicy` of its own.\n *\n * DERIVED from the platform-injected `fileScanning` topology: a scanner being reachable IS the\n * application-level opt-in.\n *\n * ## What this replaced\n *\n * `(this.appConfigService.config as Record<string, any>)?.files?.scanning?.enabled === true`. The\n * `any` cast is the tell — `AppConfigurationSchema` declares no `files` section, `z.object` strips\n * unknown keys, so the parsed configuration could never carry that path and the expression was\n * `undefined === true` for every application, for the whole life of the flag. The service's own\n * docstring documented it as the global switch.\n *\n * ## Why DERIVED rather than declared\n *\n * Adding an `enabled` boolean to `AppConfiguration_FileScanningSchema` was the other candidate and is\n * rejected on three counts:\n *\n * - **the answer already exists.** `fileScanning` is a mutation-boundary-PROTECTED section\n * (`APP_CONFIG_MUTATION_BOUNDARY_RULES` in `app-config.backend-authored.definitions.ts`: \"file-scanning\n * sidecar topology and its platform-level opt-in are env/bootstrap-owned\"), so an application cannot\n * author it. A boolean would have to be seeded from a NEW environment key sitting beside the host key\n * that already says the same thing — a second source of truth that can disagree with the first;\n * - **it matches the convention of the thing it gates.** ClamAV has no enable flag anywhere in this\n * subsystem: `ClamAVScannerBackendService.isConfigured()` states \"presence of a host IS the opt-in\",\n * and `buildFileServicesTopologyFromEnvironment` refuses to emit a plausible default host for exactly\n * that reason;\n * - **it closes the hole the repair would otherwise open.** A separate boolean makes \"globally on, no\n * scanner reachable\" a REPRESENTABLE state, and that state is precisely the one the pipeline used to\n * answer with a CLEAN verdict. Derived, the state cannot exist: the switch is on only when something\n * can actually run. The runtime refusal in `executeScan` stays regardless, because `scanPolicy:\n * 'required'` reaches the same tail without consulting this switch at all.\n *\n * The two predicates are the pipeline's OWN — `executeScan` gates its two layers on exactly\n * `clamavScanner.isConfigured()` and `yaraScanner.isEnabled()` — so the switch and the pipeline cannot\n * come to different conclusions about whether a scan is possible. Note `isEnabled()` is already the\n * conjunction of YARA's two independent axes (opted in AND reachable), which is why the \"enabled but\n * unreachable\" misconfiguration does not read as an application-wide opt-in here; the startup validator\n * reports it as its own issue instead.\n *\n * The `isInitialized()` guard stays: both scanner reads deliberately throw\n * `app_configuration_not_initialized` rather than softening to `false`, and a scan decision taken before\n * configuration has landed is not a decision.\n */\n isGlobalScanningEnabled(): boolean {\n if (!this.appConfigService.isInitialized()) return false;\n return this.clamavScanner.isConfigured() || this.yaraScanner.isEnabled();\n }\n\n /**\n * Initiate scanning for a file that just reached UPLOADED status.\n *\n * Transitions to SCANNING, then dispatches the scan job.\n * The response is fire-and-forget: the caller does not wait for scan\n * completion — scan results are processed asynchronously via\n * `handleScanResult()`.\n *\n * @param onClean - Optional callback invoked when scan verdict is CLEAN.\n * Used to chain post-scan work that must only run on safe bytes. Note the file\n * STATUS lifecycle ends at CLEAN for processing purposes — RAG chunking of a\n * `ragSource` file field is per-field derived data (chunk rows), never a file\n * status transition.\n */\n async initiateScan(\n fileId: string,\n executionContext: ExecutionContext<any>,\n onClean?: () => Promise<void>,\n ): Promise<void> {\n const allowedTransitions = FILE_STATUS_TRANSITIONS[FileStatus.UPLOADED];\n if (!allowedTransitions.includes(FileStatus.SCANNING)) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n executionContext,\n {\n customMessageReference: ErrorCustomMessageReference.FILE_INVALID_STATUS_TRANSITION,\n context: {\n fileId, // diagnostic (log-only)\n },\n },\n );\n }\n\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.SCANNING,\n executionContext,\n );\n\n if (onClean) {\n this.onCleanCallbacks.set(fileId, onClean);\n }\n\n this.logDebug('File transitioned to SCANNING, dispatching scan', { fileId });\n\n // Run the full scanning pipeline asynchronously. The file is already in\n // SCANNING status so downloads are blocked until the result handler\n // transitions it to CLEAN / INFECTED / FAILED.\n this.executeScan(fileId, executionContext).catch((err) => {\n this.logger.error('Scan execution failed unexpectedly', {\n fileId,\n ...projectCaughtErrorLogFields(err),\n });\n });\n }\n\n /**\n * Download the file from storage and run the scanning pipeline.\n *\n * Pipeline order:\n * 1. ClamAV (signature-based) — if configured\n * 2. YARA (pattern-based) — if enabled and ClamAV passed\n *\n * Short-circuits on first INFECTED verdict. YARA only runs if the\n * file survived ClamAV — no point in pattern-matching a known virus.\n */\n private async executeScan(\n fileId: string,\n executionContext: ExecutionContext<any>,\n ): Promise<void> {\n const file = await this.filesService.getFile(fileId, executionContext);\n if (!file) {\n this.logger.error('File not found for scanning', { fileId });\n return;\n }\n\n // Resolve through FilesBackendService rather than the router directly, so a\n // LEGACY row that persisted no `storageProvider` falls back to the default\n // provider instead of failing the scan. Reimplementing the lookup here is what\n // made this one of five different behaviours for a provider-less row.\n //\n // The throw is deliberately converted back into a terminal verdict rather than\n // propagated. `getStorageProviderForFile` throws INTERNAL when the persisted id\n // is not registered, and this pipeline is fire-and-forget — its dispatcher's\n // `.catch()` only LOGS. An escaping throw would therefore leave the file in\n // SCANNING permanently, and downloads stay blocked until a result handler moves\n // it out. That is strictly worse than the ERROR verdict this site already\n // recorded, so the drift is closed WITHOUT adopting the reference behaviour on\n // the throwing branch.\n let provider;\n try {\n provider = this.filesService.getStorageProviderForFile(file, executionContext);\n } catch (err) {\n await this.handleScanResult(fileId, {\n verdict: FileScanVerdict.ERROR,\n errorMessage: `Storage provider '${file.storageProvider}' not available for scan download`,\n scannerRef: 'scan-pipeline',\n }, executionContext);\n this.logger.error('Scan aborted: persisted storage provider is not registered', {\n fileId,\n storageProvider: file.storageProvider,\n ...projectCaughtErrorLogFields(err),\n });\n return;\n }\n\n const downloadParams = {\n fileId: file.fileId,\n storageProvider: file.storageProvider,\n storageRef: file.storageRef,\n };\n const executedScannerLayers: string[] = [];\n\n // ── Layer 1: ClamAV ────────────────────────────────────────────────\n if (this.clamavScanner.isConfigured()) {\n executedScannerLayers.push('clamav');\n let downloadResult;\n try {\n downloadResult = await provider.download(downloadParams, executionContext);\n } catch (err) {\n await this.handleScanResult(fileId, {\n verdict: FileScanVerdict.ERROR,\n errorMessage: `Failed to download file for ClamAV: ${describeCaughtError(err)}`,\n scannerRef: 'clamav',\n }, executionContext);\n return;\n }\n\n try {\n const clamResult = await this.clamavScanner.scanStream(downloadResult.stream, fileId);\n\n if (clamResult.verdict !== FileScanVerdict.CLEAN) {\n await this.handleScanResult(fileId, clamResult, executionContext);\n return;\n }\n\n this.logDebug('ClamAV layer passed', { fileId, durationMs: clamResult.durationMs });\n } finally {\n if (!downloadResult.stream.destroyed) {\n downloadResult.stream.destroy();\n }\n }\n } else {\n this.logDebug('ClamAV not configured — skipping signature scan', { fileId });\n }\n\n // ── Layer 2: YARA (optional, platform-level) ───────────────────────\n if (this.yaraScanner.isEnabled()) {\n executedScannerLayers.push('yara');\n let downloadResult;\n try {\n downloadResult = await provider.download(downloadParams, executionContext);\n } catch (err) {\n await this.handleScanResult(fileId, {\n verdict: FileScanVerdict.ERROR,\n errorMessage: `Failed to download file for YARA: ${describeCaughtError(err)}`,\n scannerRef: 'yara',\n }, executionContext);\n return;\n }\n\n try {\n const yaraResult = await this.yaraScanner.scanStream(downloadResult.stream, fileId);\n\n if (yaraResult.verdict !== FileScanVerdict.CLEAN) {\n await this.handleScanResult(fileId, yaraResult, executionContext);\n return;\n }\n\n this.logDebug('YARA layer passed', { fileId, durationMs: yaraResult.durationMs });\n } finally {\n if (!downloadResult.stream.destroyed) {\n downloadResult.stream.destroy();\n }\n }\n }\n\n // ── Nothing ran: refuse, do not certify ────────────────────────────\n //\n // This branch used to log a warning and then hand `handleScanResult` a CLEAN verdict with\n // `scannerRef: 'none'` — which transitions the file to `FileStatus.CLEAN`, a member of\n // `FILE_DOWNLOADABLE_STATUSES`. A scan had been REQUESTED (`shouldScan` said yes, `initiateScan`\n // moved the file to SCANNING, the uploader was told the upload succeeded), and the answer returned\n // was the answer a PASSING scan gives, produced by no scanner. That is strictly worse than not\n // scanning at all: a field declaring `scanPolicy: 'required'` ended with bytes certified clean, and\n // the only trace was a warning in a log nobody reads.\n //\n // ERROR -> `FileStatus.FAILED` is the fail-closed terminal, and the right one rather than merely the\n // safe one: FAILED is outside `FILE_DOWNLOADABLE_STATUSES` so the bytes are blocked, it is outside\n // `FILE_METADATA_WITHHELD_STATUSES` so the uploader can still poll and see WHY, and\n // `FILE_STATUS_TRANSITIONS` keeps SCANNING -> FAILED, so nothing about the lifecycle has to move.\n // A file that failed this way becomes scannable again the moment a scanner is provisioned.\n //\n // Keyed on `executedScannerLayers` — direct evidence that nothing ran — rather than on re-asking the\n // two `isConfigured()` predicates. Re-asking would be a second copy of the decision the two layer\n // gates above already took, and the copies can disagree if a layer ever grows another skip reason.\n //\n // Not redundant with the boot gate, which is the obvious objection. `collectScanningIssues` refuses\n // to start an application whose fields declare `scanPolicy: 'required'` when ClamAV is unconfigured,\n // so in a well-formed deployment this branch is unreachable. But that gate builds its population by\n // walking every resource's file fields inside `try { … } catch { continue; }`: a resource whose field\n // detection throws contributes no fields and is silently absent from the count. A boot check that can\n // under-report the population it protects is not a substitute for the refusal at the site itself.\n if (executedScannerLayers.length === 0) {\n await this.handleScanResult(fileId, {\n verdict: FileScanVerdict.ERROR,\n errorMessage: 'Scan was requested but no scanner is configured (no ClamAV host, and YARA not enabled/reachable) — refusing to certify the file as clean',\n scannerRef: 'none',\n }, executionContext);\n return;\n }\n\n // ── All layers that ran, passed ────────────────────────────────────\n // `join('+')` needs no `|| 'none'` fallback any more: the empty case returned above, so a CLEAN\n // verdict from here always names at least one scanner that actually executed.\n await this.handleScanResult(fileId, {\n verdict: FileScanVerdict.CLEAN,\n scannerRef: executedScannerLayers.join('+'),\n }, executionContext);\n }\n\n /**\n * Process the result of a scan job.\n *\n * - CLEAN: transition to CLEAN (file becomes downloadable)\n * - INFECTED: transition to INFECTED, then quarantine\n * - ERROR: transition to FAILED (retryable via re-scan)\n */\n async handleScanResult(\n fileId: string,\n result: FileScanResult,\n executionContext: ExecutionContext<any>,\n ): Promise<void> {\n this.logDebug('Processing scan result', {\n fileId,\n verdict: result.verdict,\n threatName: result.threatName,\n scannerRef: result.scannerRef,\n durationMs: result.durationMs,\n });\n\n /*\n * assurance-control: WILDO.SECURITY.INGESTED_CONTENT_INSPECTION — the scanner's verdict becomes a\n * member of `FileStatus`, which is also what `FILE_DOWNLOADABLE_STATUSES` reads, so \"inspected\" and\n * \"servable\" are one decision rather than two that could disagree. `FileScanVerdict` names the\n * scanner's answer; `FileStatus` is the one with consequence, which is why the assurance capability\n * derives from it.\n *\n * The outcome now ALSO reaches the audit trail (#506): `FILE_MALWARE_DETECTED` when a scanner\n * concludes an infection, `FILE_MALWARE_SCAN_FAILED` when the scan could not run. Both are\n * emitted AFTER the terminal transition, so the row can never describe a state the record does\n * not hold. Until they existed, an infection produced a status change and nothing else — the only\n * way to learn malware had arrived was to notice a row sitting at `QUARANTINED`.\n */\n switch (result.verdict) {\n case FileScanVerdict.CLEAN:\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.CLEAN,\n executionContext,\n );\n this.logDebug('File marked as CLEAN after scan', { fileId });\n\n // Invoke the post-clean callback (generic post-scan work registered by initiateScan's\n // caller). RAG ingestion is deliberately NOT chained here: the service-tier write hook and\n // the hourly reconciliation sweep own corpus derivation, and the ingestion pipeline itself\n // refuses non-downloadable files — so a file that finishes scanning is picked up by the\n // next sweep run with no per-file callback wiring.\n const onClean = this.onCleanCallbacks.get(fileId);\n if (onClean) {\n this.onCleanCallbacks.delete(fileId);\n onClean().catch((err) => {\n this.logger.error('Post-clean callback failed', {\n fileId,\n ...projectCaughtErrorLogFields(err),\n });\n });\n }\n break;\n\n case FileScanVerdict.INFECTED:\n this.onCleanCallbacks.delete(fileId);\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.INFECTED,\n executionContext,\n );\n this.logger.warn('File flagged as INFECTED', {\n fileId,\n threatName: result.threatName,\n scannerRef: result.scannerRef,\n });\n\n await this.quarantineInfectedFile(fileId, result, executionContext);\n // AFTER the quarantine transition, so `fileStatus` is what the record holds rather than what\n // this method intended. If the quarantine failed, the row says INFECTED, which is true.\n await this.recordScanOutcomeAudit(fileId, result, executionContext);\n break;\n\n case FileScanVerdict.ERROR:\n this.onCleanCallbacks.delete(fileId);\n this.logger.error('Scan failed with error', {\n fileId,\n errorMessage: result.errorMessage,\n scannerRef: result.scannerRef,\n });\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.FAILED,\n executionContext,\n );\n await this.recordScanOutcomeAudit(fileId, result, executionContext);\n break;\n }\n }\n\n /**\n * Write the scan outcome to the audit trail (#506).\n *\n * Best-effort and never throwing: the file's status transition is the enforcement, and an audit\n * store being unavailable must not convert a successful quarantine into an exception that leaves\n * the caller believing the scan failed.\n *\n * A CLEAN verdict is deliberately NOT audited. Every upload is scanned, so a clean row per upload\n * would be the highest-volume event in the trail and would bury the two that matter — and the\n * upload itself is already recorded by `FILE_UPLOAD_GRANT_REDEEMED`. What is added here is the\n * conclusion an operator would want to be alerted on.\n */\n private async recordScanOutcomeAudit(\n fileId: string,\n result: FileScanResult,\n executionContext: ExecutionContext<any>,\n ): Promise<void> {\n if (!this.auditLogsService) return;\n\n try {\n // Re-read rather than assume: the transition may have failed, and the audit row must describe\n // the record, not the intent.\n const fileStatus = await this.resolveRecordedFileStatus(fileId, executionContext);\n const organizationId = executionContext.initiatorIds?.organizationId;\n const userId = executionContext.initiatorIds?.userId;\n\n if (result.verdict === FileScanVerdict.INFECTED) {\n await this.auditLogsService.logFileMalwareDetected({\n fileId,\n scannerRef: result.scannerRef,\n threatName: result.threatName,\n organizationId,\n userId,\n fileStatus,\n }, executionContext);\n return;\n }\n\n await this.auditLogsService.logFileMalwareScanFailed({\n fileId,\n scannerRef: result.scannerRef,\n failureReason: result.errorMessage,\n organizationId,\n userId,\n fileStatus,\n }, executionContext);\n } catch (error) {\n this.logger.warn('Failed to record the file scan outcome in the audit trail', {\n fileId,\n verdict: result.verdict,\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n\n /** The status the FILES row actually carries after the transition, or `unknown` if it cannot be read. */\n private async resolveRecordedFileStatus(\n fileId: string,\n executionContext: ExecutionContext<any>,\n ): Promise<string> {\n try {\n const file = await this.filesService.getFile(fileId, executionContext) as { status?: string } | null;\n return file?.status ?? 'unknown';\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Quarantine an infected file.\n *\n * Transitions INFECTED → QUARANTINED. The blob remains in storage\n * but the file is permanently blocked from download. Operators can\n * delete quarantined files via admin tooling.\n */\n private async quarantineInfectedFile(\n fileId: string,\n result: FileScanResult,\n executionContext: ExecutionContext<any>,\n ): Promise<void> {\n try {\n await this.filesService.updateFileStatus(\n fileId,\n FileStatus.QUARANTINED,\n executionContext,\n );\n this.logDebug('Infected file quarantined', {\n fileId,\n threatName: result.threatName,\n });\n } catch (error) {\n this.logger.error('Failed to quarantine infected file', {\n fileId,\n ...projectCaughtErrorLogFields(error),\n });\n }\n }\n}\n"]}
@@ -50,8 +50,30 @@
50
50
  * owns that decision and documents the full precedence, including the branch that protects an
51
51
  * existing RAG corpus from a provider outage. Plain text never touches a provider.
52
52
  *
53
+ * ## Office / OpenDocument — six served LOCALLY, three provider-only (#434, closed 2026-09-09)
54
+ *
55
+ * The framework's `Documents` media group admits Word, Excel, PowerPoint and the OpenDocument
56
+ * trio, and until 2026-09-08 the extractor supported NONE of them: a corpus field using the group
57
+ * accepted uploads that could never contribute a chunk under any configuration, skipped at debug.
58
+ *
59
+ * The nine types are THREE technical problems, and reading them as one is what produced this
60
+ * header's earlier claim that a local library would cost "three to six" dependencies:
61
+ *
62
+ * - **OOXML** (`.docx` `.xlsx` `.pptx`) and **OpenDocument** (`.odt` `.ods` `.odp`) are ZIP+XML —
63
+ * the SAME technique, so ONE module reads all six, on two dependencies rather than six
64
+ * (`fflate` to unzip, `fast-xml-parser` to read). See
65
+ * `office-document-text-extraction.backend.utils.ts`.
66
+ * - **Legacy binary Office** (`.doc` `.xls` `.ppt`) are OLE2 compound files from a different era.
67
+ * A reader for them is a project, not a dependency, so they stay PROVIDER-ONLY.
68
+ *
69
+ * So the six take exactly the ladder PDF already takes, with the office extractor in the rung
70
+ * `pdfjs-dist` occupies: a configured provider is preferred when the field opted into it, the
71
+ * local library serves everything else, and a deployment with NO provider can finally read the
72
+ * documents its media group accepts. The three remaining types keep the conditional support and
73
+ * the precise refusal, because for them the provider genuinely is the only path.
74
+ *
53
75
  * Future:
54
- * - Office documents (docx via mammoth, xlsx/pptx via dedicated libs)
76
+ * - Legacy binary Office (`.doc` / `.xls` / `.ppt`) locally, if an OLE2 reader ever earns its place
55
77
  * - Audio/video transcript extraction
56
78
  *
57
79
  * The service operates against the storage provider contract — it downloads
@@ -116,6 +138,14 @@ export declare class FileTextExtractionBackendService {
116
138
  * Check if a MIME type supports text extraction.
117
139
  */
118
140
  isExtractionSupported(mimeType: string): boolean;
141
+ /**
142
+ * Whether the configured document-extraction provider declares this MIME type.
143
+ *
144
+ * Deliberately narrower than {@link resolveUsableProviderBinding}: no byte length, no logging, and
145
+ * every failure answers `false`. It is a capability QUESTION asked on a hot path (once per file
146
+ * per sweep), not the resolution that precedes an actual extraction.
147
+ */
148
+ private providerDeclaresMimeType;
119
149
  private extractFromText;
120
150
  /**
121
151
  * THE SELECTION SEAM — provider first when one is configured and usable, local library
@@ -211,6 +241,35 @@ export declare class FileTextExtractionBackendService {
211
241
  * which rung of that seam routed here and is logged, so an operator reading the logs can tell
212
242
  * "no provider is configured" from "the provider was down" without inspecting configuration.
213
243
  */
244
+ /**
245
+ * The LOCAL-LIBRARY rung of {@link extractFromDocument}'s ladder, dispatched by MIME.
246
+ *
247
+ * Two libraries sit at this rung and they are not interchangeable: `pdfjs-dist` reads a PDF's
248
+ * text layer, and the ZIP+XML extractor reads OOXML / OpenDocument parts. Handing a document to
249
+ * the wrong one produces an unreadable-bytes classification that blames the FILE for a routing
250
+ * mistake — which is exactly the failure the provider-only era's refusal existed to avoid, so it
251
+ * must not reappear now that there are two locals instead of one.
252
+ *
253
+ * One dispatcher rather than a branch at each of the five call sites, because the five rungs are
254
+ * the same decision reached for five different reasons; branching at each would be five places to
255
+ * forget the office arm the day a sixth rung appears.
256
+ */
257
+ private extractLocally;
258
+ /**
259
+ * OOXML / OpenDocument text, read locally (#434).
260
+ *
261
+ * `partCount` is reported as `pageCount` deliberately: for a `.pptx` it IS the slide count, and
262
+ * for the others it is the closest honest analogue of "how many units of this document were
263
+ * read". Inventing a page count by dividing characters would be a number an operator could
264
+ * reasonably act on and that means nothing.
265
+ *
266
+ * An {@link OfficeDocumentExtractionError} is rethrown UNTOUCHED so the caller's classifier sees
267
+ * it: every one of its failures is a statement about the document's own bytes — not a readable
268
+ * ZIP, larger than the decompression bound, or holding none of the parts its type keeps text in
269
+ * — which is precisely the unreadable-document bucket, and not the provider-unavailable one that
270
+ * must protect an existing corpus.
271
+ */
272
+ private extractFromOfficeDocument;
214
273
  private extractFromPDF;
215
274
  /** Drain a download stream into a single buffer. Shared by every extraction path. */
216
275
  private collectStream;
@@ -1 +1 @@
1
- {"version":3,"file":"file-text-extraction.backend.service.d.ts","sourceRoot":"","sources":["../../../../../src/files/services/file-text-extraction.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAMH,OAAO,EAA0C,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAClG,OAAO,EAAE,0BAA0B,EAAE,MAAM,kEAAkE,CAAC;AAC9G,OAAO,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;AACvG,OAAO,EAAE,+BAA+B,EAAE,MAAM,sEAAsE,CAAC;AACvH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAC9F,OAAO,EACL,gCAAgC,EAIjC,MAAM,oFAAoF,CAAC;AAG5F;;;;;;;;GAQG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAgDD,qBACa,gCAAgC;IAKzC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAGlC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAS7B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IApBtC,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;gBAI9D,MAAM,EAAE,aAAa,EAErB,YAAY,EAAE,0BAA0B,EAExC,iBAAiB,EAAE,+BAA+B,EAGlD,YAAY,EAAE,mBAAmB,EASjC,kBAAkB,CAAC,EAAE,gCAAgC;IAMxE;;OAEG;IACG,WAAW,CACf,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EACvC,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,wBAAwB,CAAC;IAsFpC;;OAEG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;YAOlC,eAAe;IAmB7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoDG;YACW,mBAAmB;IAiHjC;;;;;;;;;OASG;IACH,OAAO,CAAC,4BAA4B;IAqCpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;YACW,cAAc;IA8F5B,qFAAqF;YACvE,aAAa;CAO5B"}
1
+ {"version":3,"file":"file-text-extraction.backend.service.d.ts","sourceRoot":"","sources":["../../../../../src/files/services/file-text-extraction.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFG;AAMH,OAAO,EAA0C,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAQ1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAClG,OAAO,EAAE,0BAA0B,EAAE,MAAM,kEAAkE,CAAC;AAC9G,OAAO,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;AACvG,OAAO,EAAE,+BAA+B,EAAE,MAAM,sEAAsE,CAAC;AACvH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAC9F,OAAO,EACL,gCAAgC,EAIjC,MAAM,oFAAoF,CAAC;AAG5F;;;;;;;;GAQG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAkED,qBACa,gCAAgC;IAKzC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAGlC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAS7B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IApBtC,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;gBAI9D,MAAM,EAAE,aAAa,EAErB,YAAY,EAAE,0BAA0B,EAExC,iBAAiB,EAAE,+BAA+B,EAGlD,YAAY,EAAE,mBAAmB,EASjC,kBAAkB,CAAC,EAAE,gCAAgC;IAMxE;;OAEG;IACG,WAAW,CACf,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EACvC,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,wBAAwB,CAAC;IA0FpC;;OAEG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAsBhD;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;YAalB,eAAe;IAmB7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoDG;YACW,mBAAmB;IA4IjC;;;;;;;;;OASG;IACH,OAAO,CAAC,4BAA4B;IAqCpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH;;;;;;;;;;;;OAYG;YACW,cAAc;IAY5B;;;;;;;;;;;;;OAaG;YACW,yBAAyB;YA2BzB,cAAc;IA8F5B,qFAAqF;YACvE,aAAa;CAO5B"}