@wildo-ai/saas-backend-lib 1.1.1 → 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 (972) 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 +14 -3
  20. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
  21. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +138 -24
  22. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
  23. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts +3 -1
  24. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts.map +1 -1
  25. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js +8 -3
  26. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js.map +1 -1
  27. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts +11 -0
  28. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts.map +1 -1
  29. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js +11 -2
  30. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js.map +1 -1
  31. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts +124 -13
  32. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
  33. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +207 -21
  34. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
  35. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts +60 -8
  36. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
  37. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +174 -26
  38. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
  39. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +48 -4
  40. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
  41. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +102 -30
  42. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
  43. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
  44. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
  45. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
  46. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
  47. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts +89 -14
  48. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
  49. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js +84 -11
  50. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
  51. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.d.ts.map +1 -1
  52. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js +16 -0
  53. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js.map +1 -1
  54. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts +20 -6
  55. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
  56. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +96 -32
  57. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
  58. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts +3 -1
  59. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts.map +1 -1
  60. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js +32 -7
  61. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js.map +1 -1
  62. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts +8 -5
  63. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts.map +1 -1
  64. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.js.map +1 -1
  65. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +80 -0
  66. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
  67. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +298 -23
  68. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
  69. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts +71 -1
  70. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
  71. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +85 -5
  72. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
  73. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts +21 -0
  74. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
  75. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +146 -4
  76. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
  77. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts +22 -0
  78. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
  79. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
  80. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts +3 -26
  81. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts.map +1 -1
  82. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js +3 -68
  83. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js.map +1 -1
  84. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
  85. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +4 -1
  86. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
  87. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts +11 -0
  88. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
  89. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js +39 -5
  90. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
  91. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +181 -2
  92. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
  93. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +533 -43
  94. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
  95. package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts +36 -3
  96. package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
  97. package/dist/esm/base-classes/services/services/system-access.backend.service.js +70 -8
  98. package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
  99. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts +28 -0
  100. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -0
  101. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js +90 -0
  102. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -0
  103. package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts +44 -0
  104. package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -0
  105. package/dist/esm/billing/batches/usage-flush.batch.backend.service.js +99 -0
  106. package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -0
  107. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts +91 -0
  108. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -0
  109. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js +152 -0
  110. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -0
  111. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +186 -0
  112. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -0
  113. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +474 -0
  114. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
  115. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts +100 -0
  116. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
  117. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js +209 -6
  118. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
  119. package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts +200 -4
  120. package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
  121. package/dist/esm/billing/services/back-office/usage-metering.backend.service.js +593 -64
  122. package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
  123. package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts +36 -0
  124. package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -0
  125. package/dist/esm/billing/services/billing-adapter-registry.backend.js +83 -0
  126. package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -0
  127. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts +9 -0
  128. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
  129. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js +11 -1
  130. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
  131. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
  132. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +54 -13
  133. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
  134. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +38 -1
  135. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
  136. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +67 -2
  137. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
  138. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts +30 -1
  139. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
  140. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js +43 -1
  141. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
  142. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts +11 -3
  143. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
  144. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js +30 -16
  145. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
  146. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
  147. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js +104 -25
  148. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
  149. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +18 -1
  150. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
  151. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +106 -2
  152. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
  153. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts +52 -0
  154. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -0
  155. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js +74 -0
  156. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -0
  157. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts +104 -11
  158. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
  159. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +260 -26
  160. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
  161. package/dist/esm/billing/testing/mock-billing-provider.d.ts +30 -1
  162. package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
  163. package/dist/esm/billing/testing/mock-billing-provider.js +25 -0
  164. package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
  165. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js +11 -4
  166. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
  167. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +263 -13
  168. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
  169. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +376 -58
  170. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
  171. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +264 -7
  172. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
  173. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +414 -5
  174. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
  175. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
  176. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
  177. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
  178. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +16 -0
  179. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -0
  180. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +140 -0
  181. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -0
  182. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
  183. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
  184. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +65 -6
  185. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
  186. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
  187. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
  188. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
  189. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
  190. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
  191. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +45 -0
  192. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
  193. package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts +5 -0
  194. package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
  195. package/dist/esm/config/bootstrap/application-runtime-profile.backend.js +6 -0
  196. package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
  197. package/dist/esm/config/custom/application-config-controller.backend.service.d.ts.map +1 -1
  198. package/dist/esm/config/custom/application-config-controller.backend.service.js +7 -1
  199. package/dist/esm/config/custom/application-config-controller.backend.service.js.map +1 -1
  200. package/dist/esm/config/models/app-config.backend.schemas.d.ts +146 -46
  201. package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
  202. package/dist/esm/config/models/app-config.backend.schemas.js +121 -12
  203. package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
  204. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts +38 -15
  205. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
  206. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js +17 -2
  207. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
  208. package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts +0 -1
  209. package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
  210. package/dist/esm/config/services/app-configuration-loader.backend.service.js +68 -76
  211. package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
  212. package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
  213. package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
  214. package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
  215. package/dist/esm/config/services/app-configuration.backend.utils.d.ts +43 -1
  216. package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
  217. package/dist/esm/config/services/app-configuration.backend.utils.js +52 -3
  218. package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
  219. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +25 -0
  220. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
  221. package/dist/esm/config/services/application-startup-config-validator.backend.service.js +41 -1
  222. package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
  223. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.d.ts +2 -2
  224. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js +2 -2
  225. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js.map +1 -1
  226. package/dist/esm/databases/models/filter.backend.schemas.js +2 -2
  227. package/dist/esm/databases/models/filter.backend.schemas.js.map +1 -1
  228. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.d.ts.map +1 -1
  229. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js +20 -1
  230. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js.map +1 -1
  231. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
  232. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js +48 -0
  233. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
  234. package/dist/esm/databases/services/redis.service.d.ts +27 -0
  235. package/dist/esm/databases/services/redis.service.d.ts.map +1 -1
  236. package/dist/esm/databases/services/redis.service.js +29 -0
  237. package/dist/esm/databases/services/redis.service.js.map +1 -1
  238. package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
  239. package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
  240. package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
  241. package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
  242. package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
  243. package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
  244. package/dist/esm/errors/services/error-handler.backend.service.js +134 -8
  245. package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
  246. package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
  247. package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
  248. package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
  249. package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
  250. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
  251. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
  252. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
  253. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
  254. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
  255. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
  256. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
  257. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
  258. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts +41 -0
  259. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts.map +1 -0
  260. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js +40 -0
  261. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js.map +1 -0
  262. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts +64 -0
  263. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts.map +1 -0
  264. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js +193 -0
  265. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js.map +1 -0
  266. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +72 -4
  267. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
  268. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +60 -19
  269. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
  270. package/dist/esm/external-data/external-data-transform.backend.d.ts.map +1 -1
  271. package/dist/esm/external-data/external-data-transform.backend.js +7 -1
  272. package/dist/esm/external-data/external-data-transform.backend.js.map +1 -1
  273. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts +2 -0
  274. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts.map +1 -1
  275. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js +13 -0
  276. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js.map +1 -1
  277. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts +4 -2
  278. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
  279. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
  280. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +256 -0
  281. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -0
  282. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +333 -0
  283. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -0
  284. package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts +56 -0
  285. package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -0
  286. package/dist/esm/external-providers/operations/provider-operation-request.backend.js +211 -0
  287. package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -0
  288. package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts +45 -0
  289. package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -0
  290. package/dist/esm/external-providers/operations/provider-request-signing.backend.js +216 -0
  291. package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -0
  292. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts +56 -0
  293. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -0
  294. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js +78 -0
  295. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -0
  296. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts +1 -1
  297. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
  298. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js +2 -2
  299. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
  300. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts +89 -0
  301. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -0
  302. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js +164 -0
  303. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -0
  304. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts +26 -27
  305. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
  306. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js +50 -64
  307. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
  308. package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
  309. package/dist/esm/external-providers/services/document-extraction.backend.service.js +3 -3
  310. package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
  311. package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
  312. package/dist/esm/external-providers/services/embeddings.backend.service.js +4 -4
  313. package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
  314. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +306 -7
  315. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
  316. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +539 -45
  317. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
  318. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
  319. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +25 -2
  320. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
  321. package/dist/esm/files/controllers/file.controller.d.ts +24 -1
  322. package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
  323. package/dist/esm/files/controllers/file.controller.js +83 -11
  324. package/dist/esm/files/controllers/file.controller.js.map +1 -1
  325. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts +17 -0
  326. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts.map +1 -0
  327. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js +1 -0
  328. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js.map +1 -0
  329. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts +5 -1
  330. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
  331. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +76 -13
  332. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
  333. package/dist/esm/files/services/file-operation-handler.backend.service.d.ts +18 -0
  334. package/dist/esm/files/services/file-operation-handler.backend.service.d.ts.map +1 -1
  335. package/dist/esm/files/services/file-operation-handler.backend.service.js +36 -28
  336. package/dist/esm/files/services/file-operation-handler.backend.service.js.map +1 -1
  337. package/dist/esm/files/services/file-scanning.backend.service.d.ts +94 -9
  338. package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
  339. package/dist/esm/files/services/file-scanning.backend.service.js +197 -17
  340. package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
  341. package/dist/esm/files/services/file-text-extraction.backend.service.d.ts +60 -1
  342. package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
  343. package/dist/esm/files/services/file-text-extraction.backend.service.js +167 -8
  344. package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
  345. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +214 -0
  346. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -0
  347. package/dist/esm/files/services/file-upload-grant.backend.service.js +566 -0
  348. package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -0
  349. package/dist/esm/files/services/files.backend.service.d.ts +87 -0
  350. package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
  351. package/dist/esm/files/services/files.backend.service.js +252 -19
  352. package/dist/esm/files/services/files.backend.service.js.map +1 -1
  353. package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts +109 -0
  354. package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -0
  355. package/dist/esm/files/storage/application-storage-key.backend.utils.js +123 -0
  356. package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -0
  357. package/dist/esm/files/storage/file-storage-provider.types.d.ts +16 -10
  358. package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
  359. package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
  360. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts +67 -8
  361. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
  362. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js +101 -28
  363. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
  364. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
  365. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js +8 -55
  366. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
  367. package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
  368. package/dist/esm/files/utils/file-field-schema-path.backend.utils.js +20 -0
  369. package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
  370. package/dist/esm/files/utils/file-uploader.utils.d.ts.map +1 -1
  371. package/dist/esm/files/utils/file-uploader.utils.js +12 -0
  372. package/dist/esm/files/utils/file-uploader.utils.js.map +1 -1
  373. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts +86 -0
  374. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -0
  375. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js +288 -0
  376. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -0
  377. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts +15 -0
  378. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
  379. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js +76 -5
  380. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
  381. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
  382. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js +6 -1
  383. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
  384. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts +60 -0
  385. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
  386. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js +63 -0
  387. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
  388. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
  389. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
  390. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +200 -44
  391. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
  392. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
  393. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
  394. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
  395. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
  396. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
  397. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
  398. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
  399. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
  400. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
  401. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
  402. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
  403. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts +0 -13
  404. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
  405. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js +14 -22
  406. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
  407. package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts +8 -3
  408. package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
  409. package/dist/esm/flows-actors/models/core-facets.backend.definitions.js +25 -15
  410. package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
  411. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts +13 -1
  412. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
  413. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
  414. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +88 -8
  415. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
  416. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +333 -31
  417. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
  418. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
  419. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js +4 -2
  420. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
  421. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts +113 -0
  422. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -0
  423. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js +62 -0
  424. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -0
  425. package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
  426. package/dist/esm/flows-actors/services/actors-system.backend.service.js +0 -2
  427. package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
  428. package/dist/esm/flows-actors/services/agents.backend.service.d.ts +107 -1
  429. package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
  430. package/dist/esm/flows-actors/services/agents.backend.service.js +519 -56
  431. package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
  432. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +5 -1
  433. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
  434. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +79 -16
  435. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
  436. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +34 -5
  437. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
  438. package/dist/esm/flows-actors/services/flows-actors-registry.service.js +154 -20
  439. package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
  440. package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
  441. package/dist/esm/flows-actors/services/flows.backend.services.js +27 -23
  442. package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
  443. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
  444. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js +7 -1
  445. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
  446. package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts +90 -0
  447. package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -0
  448. package/dist/esm/flows-actors/services/mcp-client.backend.service.js +368 -0
  449. package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
  450. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
  451. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
  452. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
  453. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
  454. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts +151 -41
  455. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
  456. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +308 -143
  457. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
  458. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts +0 -207
  459. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
  460. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js +8 -243
  461. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
  462. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
  463. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
  464. package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts +9 -14
  465. package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
  466. package/dist/esm/guidance/services/milestone-evaluator.backend.service.js +18 -89
  467. package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
  468. package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts +86 -0
  469. package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -0
  470. package/dist/esm/guidance/services/progression-state-store.backend.service.js +155 -0
  471. package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -0
  472. package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts +10 -0
  473. package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
  474. package/dist/esm/i18n/controllers/i18n-controller.backend.service.js +55 -5
  475. package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
  476. package/dist/esm/index.d.ts +15 -5
  477. package/dist/esm/index.d.ts.map +1 -1
  478. package/dist/esm/index.js +45 -5
  479. package/dist/esm/index.js.map +1 -1
  480. package/dist/esm/inject/models/container.d.ts.map +1 -1
  481. package/dist/esm/inject/models/container.js +82 -10
  482. package/dist/esm/inject/models/container.js.map +1 -1
  483. package/dist/esm/inject/models/service-types.d.ts +20 -3
  484. package/dist/esm/inject/models/service-types.d.ts.map +1 -1
  485. package/dist/esm/inject/models/service-types.js +21 -3
  486. package/dist/esm/inject/models/service-types.js.map +1 -1
  487. package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
  488. package/dist/esm/mcp/controllers/mcp.controller.js +32 -4
  489. package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
  490. package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts +34 -0
  491. package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts.map +1 -1
  492. package/dist/esm/mcp/models/mcp-tool.backend.schemas.js +42 -0
  493. package/dist/esm/mcp/models/mcp-tool.backend.schemas.js.map +1 -1
  494. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +84 -1
  495. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
  496. package/dist/esm/mcp/services/mcp-server.backend.service.js +235 -11
  497. package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
  498. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts +64 -2
  499. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
  500. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +152 -6
  501. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
  502. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
  503. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js +49 -4
  504. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
  505. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts +66 -0
  506. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -0
  507. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js +199 -0
  508. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -0
  509. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts +149 -13
  510. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
  511. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js +411 -19
  512. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
  513. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts +11 -2
  514. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
  515. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
  516. package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts +28 -9
  517. package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
  518. package/dist/esm/monitoring/logger/models/logger.backend.schemas.js +30 -10
  519. package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
  520. package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
  521. package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
  522. package/dist/esm/monitoring/logger/services/logger.service.js +52 -11
  523. package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
  524. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts +62 -0
  525. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -0
  526. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js +78 -0
  527. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -0
  528. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +309 -0
  529. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -0
  530. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +385 -0
  531. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -0
  532. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +1 -0
  533. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
  534. package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
  535. package/dist/esm/monitoring/observability/services/metrics.service.d.ts +21 -0
  536. package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
  537. package/dist/esm/monitoring/observability/services/metrics.service.js +38 -0
  538. package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
  539. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -80
  540. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -1
  541. package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -25
  542. package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -1
  543. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -49
  544. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -1
  545. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -141
  546. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -1
  547. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -37
  548. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -1
  549. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -121
  550. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -1
  551. package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts +66 -1
  552. package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
  553. package/dist/esm/notifications/email/services/email-template-registry.backend.service.js +105 -10
  554. package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
  555. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -58
  556. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -1
  557. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -223
  558. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -1
  559. package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
  560. package/dist/esm/notifications/email/services/email-template-validator.backend.service.js +10 -1
  561. package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
  562. package/dist/esm/notifications/email/services/email.backend.service.d.ts +60 -4
  563. package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
  564. package/dist/esm/notifications/email/services/email.backend.service.js +145 -43
  565. package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
  566. package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts +0 -1
  567. package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
  568. package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
  569. package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
  570. package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
  571. package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
  572. package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
  573. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +108 -13
  574. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
  575. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +432 -101
  576. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
  577. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +2 -2
  578. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
  579. package/dist/esm/notifications/sms/services/sms.backend.service.js +5 -5
  580. package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
  581. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
  582. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
  583. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
  584. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
  585. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
  586. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
  587. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +54 -7
  588. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
  589. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts +5 -5
  590. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts.map +1 -1
  591. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js +14 -13
  592. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js.map +1 -1
  593. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts +2 -1
  594. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
  595. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +18 -8
  596. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
  597. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
  598. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +20 -18
  599. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
  600. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts +16 -0
  601. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
  602. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js +18 -0
  603. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
  604. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts +2 -2
  605. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js +2 -2
  606. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
  607. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
  608. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js +63 -2
  609. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
  610. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.d.ts.map +1 -1
  611. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js +4 -1
  612. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js.map +1 -1
  613. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts +66 -0
  614. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -0
  615. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js +257 -0
  616. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -0
  617. package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts +12 -0
  618. package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -0
  619. package/dist/esm/queue/adapters/queue-adapter.backend.binding.js +47 -0
  620. package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -0
  621. package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts +87 -0
  622. package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -0
  623. package/dist/esm/queue/adapters/queue-adapter.backend.interface.js +1 -0
  624. package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -0
  625. package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts +31 -0
  626. package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -0
  627. package/dist/esm/queue/adapters/queue-adapter.backend.options.js +13 -0
  628. package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -0
  629. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts +19 -25
  630. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
  631. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js +33 -0
  632. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
  633. package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts +2 -2
  634. package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
  635. package/dist/esm/queue/domain-queue-consumer.backend.service.js +1 -4
  636. package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
  637. package/dist/esm/queue/job-consumer.backend.service.d.ts +2 -2
  638. package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
  639. package/dist/esm/queue/job-consumer.backend.service.js +1 -4
  640. package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
  641. package/dist/esm/queue/job-executor.backend.service.d.ts +2 -2
  642. package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
  643. package/dist/esm/queue/job-executor.backend.service.js +1 -4
  644. package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
  645. package/dist/esm/queue/queue-monitoring.backend.service.d.ts +8 -4
  646. package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
  647. package/dist/esm/queue/queue-monitoring.backend.service.js +25 -17
  648. package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
  649. package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts +16 -1
  650. package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
  651. package/dist/esm/queue/queue-worker-initializer.backend.service.js +16 -1
  652. package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
  653. package/dist/esm/queue/queue.backend.service.d.ts +3 -3
  654. package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
  655. package/dist/esm/queue/queue.backend.service.js +26 -4
  656. package/dist/esm/queue/queue.backend.service.js.map +1 -1
  657. package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts +2 -2
  658. package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
  659. package/dist/esm/queue/worker-shutdown-manager.backend.service.js +18 -3
  660. package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
  661. package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts +50 -25
  662. package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
  663. package/dist/esm/rag/utils/rag-chunking.backend.utils.js +147 -39
  664. package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
  665. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts +12 -3
  666. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
  667. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js +12 -3
  668. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
  669. package/dist/esm/requests/service/websocket.service.d.ts +9 -0
  670. package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
  671. package/dist/esm/requests/service/websocket.service.js +88 -15
  672. package/dist/esm/requests/service/websocket.service.js.map +1 -1
  673. package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
  674. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +16 -2
  675. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
  676. package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
  677. package/dist/esm/resources/models/resources-operations.backend.definitions.js +2 -0
  678. package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
  679. package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
  680. package/dist/esm/resources/models/resources-relationships.backend.definitions.js +14 -0
  681. package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
  682. package/dist/esm/resources/models/resources-types.backend.schemas.d.ts +2 -1
  683. package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
  684. package/dist/esm/resources/models/resources-types.backend.schemas.js +8 -0
  685. package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
  686. package/dist/esm/resources/services/resource-id.backend.service.js +3 -3
  687. package/dist/esm/resources/services/resource-id.backend.service.js.map +1 -1
  688. package/dist/esm/resources/services/resources-registry.backend.service.d.ts +60 -5
  689. package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
  690. package/dist/esm/resources/services/resources-registry.backend.service.js +91 -7
  691. package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
  692. package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts +36 -3
  693. package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
  694. package/dist/esm/runtime/controllers/health-controller.backend.service.js +32 -10
  695. package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
  696. package/dist/esm/runtime/domain-module.backend.definitions.d.ts +24 -0
  697. package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
  698. package/dist/esm/runtime/domain-module.backend.definitions.js +24 -0
  699. package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
  700. package/dist/esm/runtime/services/execution-context-creator.backend.service.d.ts.map +1 -1
  701. package/dist/esm/runtime/services/execution-context-creator.backend.service.js +13 -7
  702. package/dist/esm/runtime/services/execution-context-creator.backend.service.js.map +1 -1
  703. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts +51 -0
  704. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
  705. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
  706. package/dist/esm/runtime/services/http-server.backend.service.d.ts +26 -0
  707. package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
  708. package/dist/esm/runtime/services/http-server.backend.service.js +181 -1
  709. package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
  710. package/dist/esm/runtime/services/start-application.backend.service.d.ts +47 -1
  711. package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
  712. package/dist/esm/runtime/services/start-application.backend.service.js +343 -77
  713. package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
  714. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts +15 -0
  715. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
  716. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js +28 -0
  717. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
  718. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts +5 -1
  719. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
  720. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js +24 -4
  721. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
  722. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
  723. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +29 -4
  724. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
  725. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts +114 -0
  726. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
  727. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js +354 -3
  728. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
  729. package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts +1 -0
  730. package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
  731. package/dist/esm/security/authentications/models/cimd.backend.schemas.js +22 -0
  732. package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
  733. package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts +3 -23
  734. package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts.map +1 -1
  735. package/dist/esm/security/authentications/models/jwt.backend.schemas.js +20 -45
  736. package/dist/esm/security/authentications/models/jwt.backend.schemas.js.map +1 -1
  737. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
  738. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
  739. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
  740. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts +0 -2
  741. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
  742. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js +23 -14
  743. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
  744. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts +0 -1
  745. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
  746. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js +15 -12
  747. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
  748. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts +113 -3
  749. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
  750. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js +207 -30
  751. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
  752. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts +95 -2
  753. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
  754. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js +153 -9
  755. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
  756. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +190 -0
  757. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
  758. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +377 -53
  759. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
  760. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts +9 -1
  761. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
  762. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +77 -2
  763. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
  764. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.d.ts.map +1 -1
  765. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js +5 -3
  766. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js.map +1 -1
  767. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts +41 -0
  768. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
  769. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js +202 -23
  770. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
  771. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
  772. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +42 -1
  773. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
  774. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
  775. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +34 -4
  776. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
  777. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts +29 -5
  778. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
  779. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js +77 -5
  780. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
  781. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +41 -1
  782. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
  783. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +87 -4
  784. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
  785. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
  786. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
  787. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
  788. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
  789. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
  790. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
  791. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
  792. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
  793. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
  794. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
  795. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
  796. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts +28 -0
  797. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -0
  798. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +283 -0
  799. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -0
  800. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts +4 -3
  801. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
  802. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js +4 -3
  803. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
  804. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts +35 -0
  805. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
  806. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js +111 -21
  807. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
  808. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts +14 -1
  809. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
  810. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js +49 -8
  811. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
  812. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
  813. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js +4 -0
  814. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
  815. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
  816. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js +6 -0
  817. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
  818. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts +37 -1
  819. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
  820. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js +51 -0
  821. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
  822. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts +41 -0
  823. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
  824. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js +45 -0
  825. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
  826. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts +116 -0
  827. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -0
  828. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js +162 -0
  829. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -0
  830. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.d.ts.map +1 -1
  831. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js +24 -1
  832. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js.map +1 -1
  833. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts +20 -20
  834. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
  835. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js +27 -28
  836. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
  837. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
  838. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +77 -3
  839. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
  840. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts +117 -0
  841. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts.map +1 -0
  842. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js +104 -0
  843. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js.map +1 -0
  844. package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
  845. package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
  846. package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
  847. package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
  848. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +93 -0
  849. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -0
  850. package/dist/esm/security/authorizations/role-conferral.backend.utils.js +95 -0
  851. package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -0
  852. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +124 -1
  853. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
  854. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +142 -5
  855. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
  856. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +175 -14
  857. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
  858. package/dist/esm/security/authorizations/services/authorizations.backend.service.js +385 -49
  859. package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
  860. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +6 -14
  861. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
  862. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +13 -22
  863. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
  864. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts +60 -0
  865. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -0
  866. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js +79 -0
  867. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -0
  868. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +161 -0
  869. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -0
  870. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +512 -0
  871. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -0
  872. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +59 -0
  873. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -0
  874. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js +22 -0
  875. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -0
  876. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts +44 -0
  877. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -0
  878. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js +20 -0
  879. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -0
  880. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +191 -0
  881. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -0
  882. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +385 -0
  883. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -0
  884. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts +41 -0
  885. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
  886. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js +358 -0
  887. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -0
  888. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts +160 -0
  889. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -0
  890. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +266 -0
  891. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -0
  892. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +111 -0
  893. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -0
  894. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +107 -0
  895. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -0
  896. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts +54 -0
  897. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -0
  898. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +153 -0
  899. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -0
  900. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +195 -0
  901. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -0
  902. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +387 -0
  903. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -0
  904. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts +45 -0
  905. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
  906. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js +291 -0
  907. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -0
  908. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +62 -0
  909. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -0
  910. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js +29 -0
  911. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -0
  912. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts +127 -0
  913. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -0
  914. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js +277 -0
  915. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -0
  916. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts +66 -0
  917. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -0
  918. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js +75 -0
  919. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -0
  920. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts +18 -1
  921. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts.map +1 -1
  922. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js +110 -74
  923. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js.map +1 -1
  924. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts +22 -0
  925. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts.map +1 -0
  926. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js +22 -0
  927. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js.map +1 -0
  928. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts +17 -3
  929. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts.map +1 -1
  930. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js +12 -0
  931. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js.map +1 -1
  932. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +41 -3
  933. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
  934. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +83 -20
  935. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
  936. package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
  937. package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
  938. package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
  939. package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
  940. package/dist/esm/security/jwt/services/jwt.backend.service.d.ts.map +1 -1
  941. package/dist/esm/security/jwt/services/jwt.backend.service.js +1 -18
  942. package/dist/esm/security/jwt/services/jwt.backend.service.js.map +1 -1
  943. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts +26 -0
  944. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
  945. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js +43 -0
  946. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
  947. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +8 -1
  948. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
  949. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +49 -0
  950. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
  951. package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
  952. package/dist/esm/security/scim/controllers/scim.backend.controller.js +17 -5
  953. package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
  954. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts +67 -29
  955. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
  956. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js +47 -25
  957. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
  958. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts +10 -2
  959. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
  960. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js +10 -2
  961. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
  962. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts +143 -0
  963. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -0
  964. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js +258 -0
  965. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -0
  966. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts +39 -0
  967. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -0
  968. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js +159 -0
  969. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -0
  970. package/dist/tsconfig.build.tsbuildinfo +1 -1
  971. package/package.json +17 -9
  972. package/dist/esm/.builder.pid +0 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-api-rest-operation-reference.backend.js","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,0BAA0B,GAG3B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,gCAAgC,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACxG,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAA8B,MAAM,sCAAsC,CAAC;AAE9I,2EAA2E;AAC3E,MAAM,CAAN,IAAY,wCASX;AATD,WAAY,wCAAwC;IAClD,gFAAgF;IAChF,yFAA6C,CAAA;IAC7C,gFAAgF;IAChF,uFAA2C,CAAA;IAC3C,8FAA8F;IAC9F,iGAAqD,CAAA;IACrD,iEAAiE;IACjE,6FAAiD,CAAA;AACnD,CAAC,EATW,wCAAwC,KAAxC,wCAAwC,QASnD;AAED,MAAM,OAAO,oCAAqC,SAAQ,KAAK;IAG3C;IAFlB,YACE,OAAe,EACC,MAKf;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QAPC,WAAM,GAAN,MAAM,CAKrB;QAGD,IAAI,CAAC,IAAI,GAAG,sCAAsC,CAAC;IACrD,CAAC;CACF;AAED,uGAAuG;AACvG,MAAM,aAAa,GAAG,OAAO,CAAC;AAC9B,MAAM,UAAU,GAAG,cAAc,CAAC;AAUlC;;;;;;;GAOG;AACH,MAAM,UAAU,uCAAuC,CACrD,KAAyC;IAEzC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC5D,MAAM,MAAM,GAAG,CAAC,IAA8C,EAAE,OAAe,EAAS,EAAE;QACxF,MAAM,IAAI,oCAAoC,CAAC,OAAO,EAAE;YACtD,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,SAAS,CAAC,mBAAmB,EAAE,MAAM;SAC9E,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,yFAAyF;IACzF,2FAA2F;IAC3F,IAAI,SAAS,CAAC,cAAc,KAAK,gCAAgC,CAAC,KAAK,EAAE,CAAC;QACxE,MAAM,CACJ,wCAAwC,CAAC,oBAAoB,EAC7D,QAAQ,MAAM,2CAA2C,WAAW,IAAI,SAAS,CAAC,WAAW,gCAAgC;cAC3H,wGAAwG,CAC3G,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,cAAc,CAAC,GAAG,IAAI,SAAS,CAAC,MAAM,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;QACxF,0FAA0F;QAC1F,8DAA8D;QAC9D,MAAM,CACJ,wCAAwC,CAAC,mBAAmB,EAC5D,QAAQ,MAAM,2CAA2C,WAAW,IAAI,SAAS,CAAC,WAAW,sBAAsB,SAAS,CAAC,MAAM,IAAI;cACrI,gDAAgD,CACnD,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,MAAM,sBAAsB,GAAG,IAAI,GAAG,CACpC,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;SACzB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,6BAA6B,CAAC,IAAI,CAAC;SAC1E,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CACtC,CAAC;IAEF,IAAI,MAAM,KAAK,MAAM,IAAI,SAAS,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC9D,MAAM,CACJ,wCAAwC,CAAC,wBAAwB,EACjE,iCAAiC,WAAW,IAAI,SAAS,CAAC,WAAW,mEAAmE;cACtI,yHAAyH,CAC5H,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,IAAI,SAAS,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC9D,kFAAkF;QAClF,MAAM,CACJ,wCAAwC,CAAC,wBAAwB,EACjE,QAAQ,MAAM,mCAAmC,SAAS,CAAC,YAAY,+CAA+C,CACvH,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QAChG,MAAM,CACJ,wCAAwC,CAAC,wBAAwB,EACjE,QAAQ,MAAM,gCAAgC,SAAS,CAAC,YAAY,8BAA8B,WAAW,IAAI,SAAS,CAAC,WAAW,IAAI;cACxI,yDAAyD,CAAC,GAAG,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,IAAI,CAChH,CAAC;IACJ,CAAC;IAED,gGAAgG;IAChG,+FAA+F;IAC/F,gEAAgE;IAChE,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QACvF,IAAI,KAAK,KAAK,SAAS,CAAC,YAAY;YAAE,OAAO,aAAa,CAAC;QAC3D,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CACjD,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,6BAA6B,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK,CAC/F,CAAC;QACF,IAAI,SAAS,EAAE,aAAa,KAAK,SAAS;YAAE,OAAO,kBAAkB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/F,OAAO,MAAM,CACX,wCAAwC,CAAC,sBAAsB,EAC/D,uBAAuB,WAAW,IAAI,SAAS,CAAC,WAAW,yBAAyB,KAAK,yCAAyC;cAChI,qHAAqH,CACxH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,gGAAgG;IAChG,6FAA6F;IAC7F,+FAA+F;IAC/F,eAAe;IACf,MAAM,YAAY,GAAG,SAAS,CAAC,UAAU,EAAE,KAAK,KAAK,2BAA2B,CAAC,MAAM;WAClF,SAAS,CAAC,UAAU,CAAC,UAAU,KAAK,SAAS;WAC7C,SAAS,CAAC,UAAU,CAAC,WAAW,KAAK,SAAS;QACjD,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE;QAChG,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,MAAM,EAAE,SAAS,CAAC,MAAM,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,GAAG;QACnH,YAAY;QACZ,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,wFAAwF;QACxF,uFAAuF;KACxF,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Projecting a PROVIDER operation onto an ETL read-surface spec (S3a, #331).\n *\n * This is the executable half of the convergence recorded on\n * {@link HttpApiRestOperationReferenceSchema}: a binding names an operation in the provider's own\n * catalogue, and this turns that operation plus the binding's resource-shaped half into the\n * {@link HttpApiRestOperationSpec} every REST_JSON compiler already consumes. Nothing downstream\n * changes — the compilers never learn that a reference existed.\n *\n * A pure function over data, so the interesting refusals are testable without a provider.\n */\n\nimport {\n HttpApiRestOperationMethod,\n type HttpApiRestOperationReference,\n type HttpApiRestOperationSpec,\n} from '@wildo-ai/saas-models/external-data';\nimport { ExternalOperation_Classification, API_HttpMethod } from '@wildo-ai/external-connectors-models';\nimport { ProviderRestPaginationStyle, ProviderRestParameterLocation, type ProviderRestOperation } from '@wildo-ai/external-connectors-models';\n\n/** Why a referenced provider operation cannot serve an ETL read member. */\nexport enum HttpApiRestOperationReferenceRefusalKind {\n /** The operation MUTATES the vendor; a read surface may never reference one. */\n OPERATION_IS_A_WRITE = 'OPERATION_IS_A_WRITE',\n /** The operation's method is outside the read-surface vocabulary (GET/POST). */\n METHOD_NOT_READABLE = 'METHOD_NOT_READABLE',\n /** The reference and the operation disagree about the key: named/absent/unknown parameter. */\n KEY_PARAMETER_INCOHERENT = 'KEY_PARAMETER_INCOHERENT',\n /** The operation's path has a token the ETL has no value for. */\n UNSATISFIED_PATH_TOKEN = 'UNSATISFIED_PATH_TOKEN',\n}\n\nexport class HttpApiRestOperationReferenceRefusal extends Error {\n constructor(\n message: string,\n public readonly detail: {\n readonly kind: HttpApiRestOperationReferenceRefusalKind;\n readonly providerRef: string;\n readonly providerOperationId: string;\n readonly member: string;\n },\n ) {\n super(message);\n this.name = 'HttpApiRestOperationReferenceRefusal';\n }\n}\n\n/** The ETL's own token for \"this resource's synthesized key\", which every REST_JSON compiler fills. */\nconst ETL_KEY_TOKEN = '{key}';\nconst PATH_TOKEN = /\\{([^}]+)\\}/g;\n\nexport interface ProjectRestOperationReferenceInput {\n reference: HttpApiRestOperationReference;\n operation: ProviderRestOperation;\n providerRef: string;\n /** Which lifecycle member is being resolved — `read` is the only key-addressed one. */\n member: 'read' | 'list' | 'count' | 'search';\n}\n\n/**\n * Build the read-surface spec a REST_JSON compiler consumes.\n *\n * Reads only what an ETL read can honour, and refuses the rest by NAME rather than degrading:\n * every refusal here is an authoring mistake somebody must fix, and a silently degraded read\n * surface (a filter quietly dropped, a write quietly performed) is the failure this whole lane is\n * built to make impossible.\n */\nexport function projectProviderOperationOntoReadSurface(\n input: ProjectRestOperationReferenceInput,\n): HttpApiRestOperationSpec {\n const { reference, operation, providerRef, member } = input;\n const refuse = (kind: HttpApiRestOperationReferenceRefusalKind, message: string): never => {\n throw new HttpApiRestOperationReferenceRefusal(message, {\n kind, providerRef, providerOperationId: reference.providerOperationId, member,\n });\n };\n\n // A read surface that could reference a WRITE would let a LIST call delete rows, and the\n // repository's read-only stance (ETL D3) would rest on nobody having authored it that way.\n if (operation.classification === ExternalOperation_Classification.WRITE) {\n refuse(\n HttpApiRestOperationReferenceRefusalKind.OPERATION_IS_A_WRITE,\n `The '${member}' member references provider operation '${providerRef}.${operation.operationId}', which is classified WRITE. `\n + 'A read surface may only reference READ operations — a LIST that could mutate the target is not a read.',\n );\n }\n\n if (operation.method !== API_HttpMethod.GET && operation.method !== API_HttpMethod.POST) {\n // POST is admitted for the same reason the inline vocabulary admits it: JSON-RPC and many\n // enterprise search endpoints are POST-shaped even for reads.\n refuse(\n HttpApiRestOperationReferenceRefusalKind.METHOD_NOT_READABLE,\n `The '${member}' member references provider operation '${providerRef}.${operation.operationId}', whose method is ${operation.method}. `\n + 'A read-surface member speaks GET or POST only.',\n );\n }\n\n // ── the key token ──────────────────────────────────────────────────────────\n const declaredPathParameters = new Set(\n (operation.parameters ?? [])\n .filter((parameter) => parameter.in === ProviderRestParameterLocation.PATH)\n .map((parameter) => parameter.name),\n );\n\n if (member === 'read' && reference.keyParameter === undefined) {\n refuse(\n HttpApiRestOperationReferenceRefusalKind.KEY_PARAMETER_INCOHERENT,\n `The 'read' member references '${providerRef}.${operation.operationId}' and declares no keyParameter — a key-addressed read has a hole `\n + \"only this resource's synthesized key can fill, and the provider's operation names that parameter in its own vocabulary.\",\n );\n }\n if (member !== 'read' && reference.keyParameter !== undefined) {\n // Refused rather than ignored: an author who wrote it believes it does something.\n refuse(\n HttpApiRestOperationReferenceRefusalKind.KEY_PARAMETER_INCOHERENT,\n `The '${member}' member declares keyParameter '${reference.keyParameter}', which only a key-addressed 'read' can use.`,\n );\n }\n if (reference.keyParameter !== undefined && !declaredPathParameters.has(reference.keyParameter)) {\n refuse(\n HttpApiRestOperationReferenceRefusalKind.KEY_PARAMETER_INCOHERENT,\n `The '${member}' member names keyParameter '${reference.keyParameter}', and provider operation '${providerRef}.${operation.operationId}' `\n + `declares no PATH parameter by that name (it declares: ${[...declaredPathParameters].join(', ') || 'none'}).`,\n );\n }\n\n // Rewrite the operation's own key token into the ETL's, and refuse any OTHER token: the ETL has\n // exactly one value to supply, so a second hole would be filled with the literal `{token}` and\n // the target would answer a confident 404 nobody could explain.\n const pathTemplate = operation.pathTemplate.replace(PATH_TOKEN, (match, token: string) => {\n if (token === reference.keyParameter) return ETL_KEY_TOKEN;\n const parameter = (operation.parameters ?? []).find(\n (candidate) => candidate.in === ProviderRestParameterLocation.PATH && candidate.name === token,\n );\n if (parameter?.constantValue !== undefined) return encodeURIComponent(parameter.constantValue);\n return refuse(\n HttpApiRestOperationReferenceRefusalKind.UNSATISFIED_PATH_TOKEN,\n `Provider operation '${providerRef}.${operation.operationId}' has the path token '${match}', and an ETL read has no value for it `\n + '— declare it with a constantValue on the operation, or reference an operation whose path this resource can address.',\n );\n });\n\n // ── paging ─────────────────────────────────────────────────────────────────\n // Only OFFSET paging projects: the read surface's `pagingParams` is a (limit, offset) pair, and\n // a cursor or link style has no representation in it. Absent means the member is unpaginated\n // here — the honest answer, since inventing an offset over a cursor API silently re-reads page\n // one forever.\n const pagingParams = operation.pagination?.style === ProviderRestPaginationStyle.OFFSET\n && operation.pagination.limitParam !== undefined\n && operation.pagination.offsetParam !== undefined\n ? { limitParam: operation.pagination.limitParam, offsetParam: operation.pagination.offsetParam }\n : undefined;\n\n return {\n method: operation.method === API_HttpMethod.POST ? HttpApiRestOperationMethod.POST : HttpApiRestOperationMethod.GET,\n pathTemplate,\n ...(pagingParams ? { pagingParams } : {}),\n ...(reference.filterParams ? { filterParams: reference.filterParams } : {}),\n ...(reference.searchParam ? { searchParam: reference.searchParam } : {}),\n ...(operation.resultPath ? { resultPath: operation.resultPath } : {}),\n // `jsonRpcEnvelope` is deliberately NOT projected: a provider operation has no JSON-RPC\n // concept, so a reference can never produce one. A JSON-RPC read surface stays inline.\n };\n}\n"]}
@@ -5,7 +5,8 @@
5
5
  * rate budget. Engine-independent by design (no DI, no ErrorBuilder): the adapter maps
6
6
  * {@link HttpApiTransportError} into its ordinary error projection.
7
7
  */
8
- import type { HttpApiErasureOperationMethod, HttpApiRemoteCallSemantics, HttpApiRestOperationMethod } from '@wildo-ai/saas-models/external-data';
8
+ import type { API_HttpMethod } from '@wildo-ai/external-connectors-models';
9
+ import type { HttpApiRemoteCallSemantics } from '@wildo-ai/saas-models/external-data';
9
10
  /**
10
11
  * How a transport attempt failed — each member names a DIFFERENT remedy: TIMEOUT/NETWORK are
11
12
  * environmental (retryable), REMOTE_ERROR carries the target's own final answer, INVALID_JSON is
@@ -18,33 +19,99 @@ export declare enum HttpApiTransportFailureKind {
18
19
  INVALID_JSON = "INVALID_JSON",
19
20
  RATE_BUDGET_EXHAUSTED = "RATE_BUDGET_EXHAUSTED"
20
21
  }
21
- /** Minimal fetch shape — injectable so unit tests run without a network. */
22
+ /**
23
+ * Minimal fetch shape — injectable so unit tests run without a network.
24
+ *
25
+ * `body` widened beyond `string` for S3a (#331): a hand-authored provider operation may upload a
26
+ * file (`FormData`, so the platform picks the multipart boundary — a transport that wrote its own
27
+ * `Content-Type` would produce a boundary the body does not use) or send raw bytes.
28
+ */
22
29
  export type HttpApiFetchLike = (url: string, init: {
23
30
  method: string;
24
31
  headers: Record<string, string>;
25
- body?: string;
32
+ body?: string | FormData | Uint8Array;
26
33
  signal?: AbortSignal;
27
34
  }) => Promise<{
28
35
  status: number;
29
36
  ok: boolean;
30
37
  text(): Promise<string>;
31
38
  }>;
39
+ /**
40
+ * How a request body is encoded on the wire. Slice 1 needed JSON alone, because every ETL call is
41
+ * a read; a hand-authored WRITE reaches vendors that take form bodies and file uploads, so the
42
+ * encoding is carried on the request rather than inferred from the method.
43
+ */
44
+ export declare enum HttpApiTransportBodyEncoding {
45
+ JSON = "json",
46
+ FORM_URLENCODED = "form-urlencoded",
47
+ /** `FormData`; the transport sends NO `Content-Type`, so the platform sets it with its boundary. */
48
+ MULTIPART = "multipart",
49
+ /** A raw text body under a caller-declared media type. */
50
+ TEXT = "text",
51
+ /** Raw bytes under a caller-declared media type. */
52
+ BINARY = "binary"
53
+ }
54
+ /** The request body, discriminated so each encoding carries exactly what it needs. */
55
+ export type HttpApiTransportBody = {
56
+ encoding: HttpApiTransportBodyEncoding.JSON;
57
+ value: unknown;
58
+ } | {
59
+ encoding: HttpApiTransportBodyEncoding.FORM_URLENCODED;
60
+ value: Readonly<Record<string, string>>;
61
+ } | {
62
+ encoding: HttpApiTransportBodyEncoding.MULTIPART;
63
+ value: FormData;
64
+ } | {
65
+ encoding: HttpApiTransportBodyEncoding.TEXT;
66
+ value: string;
67
+ contentType: string;
68
+ } | {
69
+ encoding: HttpApiTransportBodyEncoding.BINARY;
70
+ value: Uint8Array;
71
+ contentType: string;
72
+ };
73
+ /** How the RESPONSE body is decoded. */
74
+ export declare enum HttpApiTransportResponseDecoding {
75
+ /** Parse as JSON; a 2xx with an unparsable body is a contract failure at the target. */
76
+ JSON = "json",
77
+ /** Keep the raw text (a CSV export, an XML document); nothing is parsed. */
78
+ TEXT = "text",
79
+ /** Read nothing — for a write whose body carries no information (a 204). */
80
+ NONE = "none"
81
+ }
32
82
  export interface HttpApiTransportRequest {
33
83
  /**
34
- * Read-family methods, plus the erasure family's `DELETE` — the transport is deliberately
35
- * method-agnostic plumbing; WHICH methods a caller may compile is governed one layer up (the
36
- * read compilers speak GET/POST, only the stance-6b erasure door speaks DELETE).
84
+ * The transport is deliberately method-agnostic plumbing; WHICH methods a caller may compile is
85
+ * governed one layer up (the read compilers speak GET/POST, the stance-6b erasure door speaks
86
+ * DELETE, a provider operation speaks whatever it declares). The vocabulary is
87
+ * `API_HttpMethod` — the one named HTTP-method source this repository already has — rather than
88
+ * a third list beside the two read/erasure ones.
37
89
  */
38
- method: `${HttpApiRestOperationMethod}` | `${HttpApiErasureOperationMethod}`;
90
+ method: `${API_HttpMethod}`;
39
91
  url: string;
40
92
  headers: Record<string, string>;
41
- /** JSON body, serialized by the transport (POST-shaped reads: JSON-RPC, search endpoints). */
42
- jsonBody?: unknown;
93
+ body?: HttpApiTransportBody;
94
+ /** Absent = {@link HttpApiTransportResponseDecoding.JSON}, which is what every caller did before S3a. */
95
+ responseDecoding?: HttpApiTransportResponseDecoding;
96
+ /**
97
+ * Whether re-sending this exact request is safe. REQUIRED, and deliberately not defaulted from
98
+ * the method.
99
+ *
100
+ * Before S3a every call through here was a read or a delete-by-key, so retrying a timeout was
101
+ * always right and the policy could stay implicit. The moment a hand-authored PUT/PATCH/POST
102
+ * write arrives, an implicit retry duplicates it — and a default derived from the method would
103
+ * be wrong in BOTH directions: it would stop retrying the POST-shaped reads the ETL depends on
104
+ * (JSON-RPC, search endpoints), and it would happily retry a POST that charges a card. So each
105
+ * caller answers, and the compiler makes every framing site answer.
106
+ */
107
+ retrySafe: boolean;
43
108
  }
44
109
  export interface HttpApiTransportResponse {
45
110
  status: number;
46
- /** Parsed JSON body; `undefined` for an empty body. */
111
+ /** Parsed JSON body; `undefined` for an empty body or a non-JSON decoding. */
47
112
  json: unknown;
113
+ /** Raw body text, present for {@link HttpApiTransportResponseDecoding.TEXT}. */
114
+ text?: string;
48
115
  }
49
116
  /**
50
117
  * Every transport failure carries WHAT was attempted and HOW OFTEN, so the adapter's refusal
@@ -83,11 +150,19 @@ export declare class HttpApiRateBudget {
83
150
  tryConsume(nowMs?: number): boolean;
84
151
  }
85
152
  /**
86
- * Execute one remote read-family call under the binding's semantics.
153
+ * Execute one remote call under the caller's semantics.
154
+ *
155
+ * Retry applies to a timeout, a network error, or a retryable status (429/502/503/504) — and ONLY
156
+ * when the request declares itself `retrySafe`. Any other non-2xx status is a terminal remote
157
+ * answer and is thrown on the first attempt: retrying a 400/401/403/404 re-asks a question whose
158
+ * answer is final.
87
159
  *
88
- * Retry policy applies to IDEMPOTENT failures only: a timeout, a network error, or a retryable
89
- * status (429/502/503/504). Any other non-2xx status is a terminal remote answer and is thrown
90
- * on the first attempt — retrying a 400/401/403/404 re-asks a question whose answer is final.
160
+ * The `retrySafe` gate arrived with S3a (#331). Every call before it was a read or a
161
+ * delete-by-key, so the policy could be "retry every transient" and be right; a hand-authored
162
+ * write makes that policy a duplicate-submission engine. Note a 429 is gated too, and that is
163
+ * deliberate rather than an oversight: a 429 means the vendor did not act, but a TIMEOUT on the
164
+ * same request means we do not know whether it acted, and one gate that is honest about both
165
+ * beats two that invite the reader to work out which case they are in.
91
166
  */
92
167
  export declare function executeHttpApiTransportCall(request: HttpApiTransportRequest, semantics: Pick<HttpApiRemoteCallSemantics, 'timeoutMs' | 'retry'>, fetchImpl: HttpApiFetchLike, rateBudget?: HttpApiRateBudget): Promise<HttpApiTransportResponse>;
93
168
  //# sourceMappingURL=http-api-transport.backend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-api-transport.backend.d.ts","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/http-api-transport.backend.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,6BAA6B,EAC7B,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,qCAAqC,CAAC;AAE7C;;;;GAIG;AACH,oBAAY,2BAA2B;IACrC,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,YAAY,iBAAiB;IAC7B,YAAY,iBAAiB;IAC7B,qBAAqB,0BAA0B;CAChD;AAED,4EAA4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KACE,OAAO,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,MAAM,EAAE,GAAG,0BAA0B,EAAE,GAAG,GAAG,6BAA6B,EAAE,CAAC;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,MAAM,EAAE;QACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,gFAAgF;QAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;KAC5C;gBARD,OAAO,EAAE,MAAM,EACC,MAAM,EAAE;QACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,gFAAgF;QAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;KAC5C;CAKJ;AAID;;;;;GAKG;AACH,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAFlD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;gBAEd,oBAAoB,CAAC,EAAE,MAAM;IAE1D,mGAAmG;IACnG,UAAU,CAAC,KAAK,GAAE,MAAmB,GAAG,OAAO;CAUhD;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,IAAI,CAAC,0BAA0B,EAAE,WAAW,GAAG,OAAO,CAAC,EAClE,SAAS,EAAE,gBAAgB,EAC3B,UAAU,CAAC,EAAE,iBAAiB,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CAmFnC"}
1
+ {"version":3,"file":"http-api-transport.backend.d.ts","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/http-api-transport.backend.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,32 @@ export var HttpApiTransportFailureKind;
18
18
  HttpApiTransportFailureKind["INVALID_JSON"] = "INVALID_JSON";
19
19
  HttpApiTransportFailureKind["RATE_BUDGET_EXHAUSTED"] = "RATE_BUDGET_EXHAUSTED";
20
20
  })(HttpApiTransportFailureKind || (HttpApiTransportFailureKind = {}));
21
+ /**
22
+ * How a request body is encoded on the wire. Slice 1 needed JSON alone, because every ETL call is
23
+ * a read; a hand-authored WRITE reaches vendors that take form bodies and file uploads, so the
24
+ * encoding is carried on the request rather than inferred from the method.
25
+ */
26
+ export var HttpApiTransportBodyEncoding;
27
+ (function (HttpApiTransportBodyEncoding) {
28
+ HttpApiTransportBodyEncoding["JSON"] = "json";
29
+ HttpApiTransportBodyEncoding["FORM_URLENCODED"] = "form-urlencoded";
30
+ /** `FormData`; the transport sends NO `Content-Type`, so the platform sets it with its boundary. */
31
+ HttpApiTransportBodyEncoding["MULTIPART"] = "multipart";
32
+ /** A raw text body under a caller-declared media type. */
33
+ HttpApiTransportBodyEncoding["TEXT"] = "text";
34
+ /** Raw bytes under a caller-declared media type. */
35
+ HttpApiTransportBodyEncoding["BINARY"] = "binary";
36
+ })(HttpApiTransportBodyEncoding || (HttpApiTransportBodyEncoding = {}));
37
+ /** How the RESPONSE body is decoded. */
38
+ export var HttpApiTransportResponseDecoding;
39
+ (function (HttpApiTransportResponseDecoding) {
40
+ /** Parse as JSON; a 2xx with an unparsable body is a contract failure at the target. */
41
+ HttpApiTransportResponseDecoding["JSON"] = "json";
42
+ /** Keep the raw text (a CSV export, an XML document); nothing is parsed. */
43
+ HttpApiTransportResponseDecoding["TEXT"] = "text";
44
+ /** Read nothing — for a write whose body carries no information (a 204). */
45
+ HttpApiTransportResponseDecoding["NONE"] = "none";
46
+ })(HttpApiTransportResponseDecoding || (HttpApiTransportResponseDecoding = {}));
21
47
  /**
22
48
  * Every transport failure carries WHAT was attempted and HOW OFTEN, so the adapter's refusal
23
49
  * names the remote reality instead of a generic network error. Never carries the request
@@ -59,11 +85,46 @@ export class HttpApiRateBudget {
59
85
  }
60
86
  }
61
87
  /**
62
- * Execute one remote read-family call under the binding's semantics.
88
+ * Frame one request body: the wire bytes and the `Content-Type` that describes them.
89
+ *
90
+ * MULTIPART deliberately contributes NO header — `FormData` carries a boundary the platform
91
+ * generates while serializing, and a `Content-Type` written here would name a different one, so
92
+ * the target would parse zero parts from a body that looks well formed.
93
+ */
94
+ function frameBody(body) {
95
+ if (body === undefined)
96
+ return {};
97
+ switch (body.encoding) {
98
+ case HttpApiTransportBodyEncoding.JSON:
99
+ return { payload: JSON.stringify(body.value), contentType: 'application/json' };
100
+ case HttpApiTransportBodyEncoding.FORM_URLENCODED:
101
+ return { payload: new URLSearchParams(body.value).toString(), contentType: 'application/x-www-form-urlencoded' };
102
+ case HttpApiTransportBodyEncoding.MULTIPART:
103
+ return { payload: body.value };
104
+ case HttpApiTransportBodyEncoding.TEXT:
105
+ return { payload: body.value, contentType: body.contentType };
106
+ case HttpApiTransportBodyEncoding.BINARY:
107
+ return { payload: body.value, contentType: body.contentType };
108
+ default: {
109
+ const exhaustiveCheck = body;
110
+ return exhaustiveCheck;
111
+ }
112
+ }
113
+ }
114
+ /**
115
+ * Execute one remote call under the caller's semantics.
116
+ *
117
+ * Retry applies to a timeout, a network error, or a retryable status (429/502/503/504) — and ONLY
118
+ * when the request declares itself `retrySafe`. Any other non-2xx status is a terminal remote
119
+ * answer and is thrown on the first attempt: retrying a 400/401/403/404 re-asks a question whose
120
+ * answer is final.
63
121
  *
64
- * Retry policy applies to IDEMPOTENT failures only: a timeout, a network error, or a retryable
65
- * status (429/502/503/504). Any other non-2xx status is a terminal remote answer and is thrown
66
- * on the first attempt — retrying a 400/401/403/404 re-asks a question whose answer is final.
122
+ * The `retrySafe` gate arrived with S3a (#331). Every call before it was a read or a
123
+ * delete-by-key, so the policy could be "retry every transient" and be right; a hand-authored
124
+ * write makes that policy a duplicate-submission engine. Note a 429 is gated too, and that is
125
+ * deliberate rather than an oversight: a 429 means the vendor did not act, but a TIMEOUT on the
126
+ * same request means we do not know whether it acted, and one gate that is honest about both
127
+ * beats two that invite the reader to work out which case they are in.
67
128
  */
68
129
  export async function executeHttpApiTransportCall(request, semantics, fetchImpl, rateBudget) {
69
130
  if (rateBudget && !rateBudget.tryConsume()) {
@@ -78,23 +139,33 @@ export async function executeHttpApiTransportCall(request, semantics, fetchImpl,
78
139
  const abort = new AbortController();
79
140
  const timeout = setTimeout(() => abort.abort(), semantics.timeoutMs);
80
141
  try {
142
+ const framed = frameBody(request.body);
81
143
  const response = await fetchImpl(request.url, {
82
144
  method: request.method,
83
- headers: request.jsonBody === undefined
145
+ // The caller's own headers win: a provider that must send its own `Content-Type` for a
146
+ // text body has already declared it, and the framing default must not overwrite it.
147
+ headers: framed.contentType === undefined
84
148
  ? request.headers
85
- : { 'Content-Type': 'application/json', ...request.headers },
86
- body: request.jsonBody === undefined ? undefined : JSON.stringify(request.jsonBody),
149
+ : { 'Content-Type': framed.contentType, ...request.headers },
150
+ body: framed.payload,
87
151
  signal: abort.signal,
88
152
  });
89
153
  const bodyText = await response.text();
90
154
  if (!response.ok) {
91
155
  const error = new HttpApiTransportError(`HTTP-API remote answered ${response.status} for ${request.method} ${request.url}`, { url: request.url, method: request.method, status: response.status, attempts: attempt, kind: HttpApiTransportFailureKind.REMOTE_ERROR });
92
- if (RETRYABLE_STATUS.has(response.status) && attempt < maxAttempts) {
156
+ if (request.retrySafe && RETRYABLE_STATUS.has(response.status) && attempt < maxAttempts) {
93
157
  lastError = error;
94
158
  continue;
95
159
  }
96
160
  throw error;
97
161
  }
162
+ const decoding = request.responseDecoding ?? HttpApiTransportResponseDecoding.JSON;
163
+ if (decoding === HttpApiTransportResponseDecoding.NONE) {
164
+ return { status: response.status, json: undefined };
165
+ }
166
+ if (decoding === HttpApiTransportResponseDecoding.TEXT) {
167
+ return { status: response.status, json: undefined, text: bodyText };
168
+ }
98
169
  if (bodyText.length === 0) {
99
170
  return { status: response.status, json: undefined };
100
171
  }
@@ -108,7 +179,7 @@ export async function executeHttpApiTransportCall(request, semantics, fetchImpl,
108
179
  }
109
180
  catch (error) {
110
181
  if (error instanceof HttpApiTransportError) {
111
- if (error.detail.kind === HttpApiTransportFailureKind.REMOTE_ERROR && RETRYABLE_STATUS.has(error.detail.status ?? 0) && attempt < maxAttempts) {
182
+ if (request.retrySafe && error.detail.kind === HttpApiTransportFailureKind.REMOTE_ERROR && RETRYABLE_STATUS.has(error.detail.status ?? 0) && attempt < maxAttempts) {
112
183
  lastError = error;
113
184
  continue;
114
185
  }
@@ -118,7 +189,7 @@ export async function executeHttpApiTransportCall(request, semantics, fetchImpl,
118
189
  const transportError = new HttpApiTransportError(isAbort
119
190
  ? `HTTP-API call timed out after ${semantics.timeoutMs}ms: ${request.method} ${request.url}`
120
191
  : `HTTP-API network failure for ${request.method} ${request.url}: ${error instanceof Error ? error.message : String(error)}`, { url: request.url, method: request.method, attempts: attempt, kind: isAbort ? HttpApiTransportFailureKind.TIMEOUT : HttpApiTransportFailureKind.NETWORK });
121
- if (attempt < maxAttempts) {
192
+ if (request.retrySafe && attempt < maxAttempts) {
122
193
  lastError = transportError;
123
194
  continue;
124
195
  }
@@ -128,7 +199,9 @@ export async function executeHttpApiTransportCall(request, semantics, fetchImpl,
128
199
  clearTimeout(timeout);
129
200
  }
130
201
  }
131
- // Unreachable while the loop throws on its last attempt; kept for control-flow honesty.
202
+ // Unreachable: every path in the loop either returns or throws — a non-retry-safe request
203
+ // throws on its first attempt, and a retry-safe one throws on its last. Kept for control-flow
204
+ // honesty, and because a future edit that adds a `continue` should land somewhere honest.
132
205
  throw lastError ?? new HttpApiTransportError(`HTTP-API call failed for ${request.method} ${request.url}`, { url: request.url, method: request.method, attempts: maxAttempts, kind: HttpApiTransportFailureKind.NETWORK });
133
206
  }
134
207
  function delay(ms) {
@@ -1 +1 @@
1
- {"version":3,"file":"http-api-transport.backend.js","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/http-api-transport.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HTTP transport for the HTTP-API resource repository — the ONE place a remote call leaves the\n * process, carrying the binding's declared remote-call semantics (ETL decision D10 / R15):\n * per-call timeout, bounded retry for idempotent read-family calls only, and an optional local\n * rate budget. Engine-independent by design (no DI, no ErrorBuilder): the adapter maps\n * {@link HttpApiTransportError} into its ordinary error projection.\n */\n\nimport type {\n HttpApiErasureOperationMethod,\n HttpApiRemoteCallSemantics,\n HttpApiRestOperationMethod,\n} from '@wildo-ai/saas-models/external-data';\n\n/**\n * How a transport attempt failed — each member names a DIFFERENT remedy: TIMEOUT/NETWORK are\n * environmental (retryable), REMOTE_ERROR carries the target's own final answer, INVALID_JSON is\n * a contract breach at the target, RATE_BUDGET_EXHAUSTED is the binding's own local ceiling.\n */\nexport enum HttpApiTransportFailureKind {\n TIMEOUT = 'TIMEOUT',\n NETWORK = 'NETWORK',\n REMOTE_ERROR = 'REMOTE_ERROR',\n INVALID_JSON = 'INVALID_JSON',\n RATE_BUDGET_EXHAUSTED = 'RATE_BUDGET_EXHAUSTED',\n}\n\n/** Minimal fetch shape — injectable so unit tests run without a network. */\nexport type HttpApiFetchLike = (\n url: string,\n init: {\n method: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n status: number;\n ok: boolean;\n text(): Promise<string>;\n}>;\n\nexport interface HttpApiTransportRequest {\n /**\n * Read-family methods, plus the erasure family's `DELETE` — the transport is deliberately\n * method-agnostic plumbing; WHICH methods a caller may compile is governed one layer up (the\n * read compilers speak GET/POST, only the stance-6b erasure door speaks DELETE).\n */\n method: `${HttpApiRestOperationMethod}` | `${HttpApiErasureOperationMethod}`;\n url: string;\n headers: Record<string, string>;\n /** JSON body, serialized by the transport (POST-shaped reads: JSON-RPC, search endpoints). */\n jsonBody?: unknown;\n}\n\nexport interface HttpApiTransportResponse {\n status: number;\n /** Parsed JSON body; `undefined` for an empty body. */\n json: unknown;\n}\n\n/**\n * Every transport failure carries WHAT was attempted and HOW OFTEN, so the adapter's refusal\n * names the remote reality instead of a generic network error. Never carries the request\n * headers (they hold credentials).\n */\nexport class HttpApiTransportError extends Error {\n constructor(\n message: string,\n public readonly detail: {\n readonly url: string;\n readonly method: string;\n /** HTTP status of the LAST attempt; undefined when no response was received. */\n readonly status?: number;\n readonly attempts: number;\n readonly kind: HttpApiTransportFailureKind;\n },\n ) {\n super(message);\n this.name = 'HttpApiTransportError';\n }\n}\n\nconst RETRYABLE_STATUS = new Set([429, 502, 503, 504]);\n\n/**\n * A per-binding local rate budget (`maxRequestsPerMinute`) — a sliding-window counter, not a\n * fairness scheduler. When the window is full the call REFUSES immediately rather than queueing:\n * queueing inside a request lifecycle turns a rate problem into a latency problem the caller\n * cannot see (scope-down paper: refusal is the honest failure mode).\n */\nexport class HttpApiRateBudget {\n private readonly timestamps: number[] = [];\n\n constructor(private readonly maxRequestsPerMinute?: number) {}\n\n /** Returns true when the call may proceed (and records it); false when the budget is exhausted. */\n tryConsume(nowMs: number = Date.now()): boolean {\n if (this.maxRequestsPerMinute === undefined) return true;\n const windowStart = nowMs - 60_000;\n while (this.timestamps.length > 0 && this.timestamps[0] <= windowStart) {\n this.timestamps.shift();\n }\n if (this.timestamps.length >= this.maxRequestsPerMinute) return false;\n this.timestamps.push(nowMs);\n return true;\n }\n}\n\n/**\n * Execute one remote read-family call under the binding's semantics.\n *\n * Retry policy applies to IDEMPOTENT failures only: a timeout, a network error, or a retryable\n * status (429/502/503/504). Any other non-2xx status is a terminal remote answer and is thrown\n * on the first attempt — retrying a 400/401/403/404 re-asks a question whose answer is final.\n */\nexport async function executeHttpApiTransportCall(\n request: HttpApiTransportRequest,\n semantics: Pick<HttpApiRemoteCallSemantics, 'timeoutMs' | 'retry'>,\n fetchImpl: HttpApiFetchLike,\n rateBudget?: HttpApiRateBudget,\n): Promise<HttpApiTransportResponse> {\n if (rateBudget && !rateBudget.tryConsume()) {\n throw new HttpApiTransportError(\n `HTTP-API rate budget exhausted for ${request.method} ${request.url}`,\n { url: request.url, method: request.method, attempts: 0, kind: HttpApiTransportFailureKind.RATE_BUDGET_EXHAUSTED },\n );\n }\n\n const maxAttempts = semantics.retry.maxAttempts;\n let lastError: HttpApiTransportError | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n if (attempt > 1) {\n await delay(semantics.retry.backoffMs * (attempt - 1));\n }\n\n const abort = new AbortController();\n const timeout = setTimeout(() => abort.abort(), semantics.timeoutMs);\n try {\n const response = await fetchImpl(request.url, {\n method: request.method,\n headers: request.jsonBody === undefined\n ? request.headers\n : { 'Content-Type': 'application/json', ...request.headers },\n body: request.jsonBody === undefined ? undefined : JSON.stringify(request.jsonBody),\n signal: abort.signal,\n });\n const bodyText = await response.text();\n\n if (!response.ok) {\n const error = new HttpApiTransportError(\n `HTTP-API remote answered ${response.status} for ${request.method} ${request.url}`,\n { url: request.url, method: request.method, status: response.status, attempts: attempt, kind: HttpApiTransportFailureKind.REMOTE_ERROR },\n );\n if (RETRYABLE_STATUS.has(response.status) && attempt < maxAttempts) {\n lastError = error;\n continue;\n }\n throw error;\n }\n\n if (bodyText.length === 0) {\n return { status: response.status, json: undefined };\n }\n try {\n return { status: response.status, json: JSON.parse(bodyText) };\n } catch {\n // A 2xx with unparsable JSON is a CONTRACT failure, not a transient — never retried.\n throw new HttpApiTransportError(\n `HTTP-API remote answered ${response.status} with a non-JSON body for ${request.method} ${request.url}`,\n { url: request.url, method: request.method, status: response.status, attempts: attempt, kind: HttpApiTransportFailureKind.INVALID_JSON },\n );\n }\n } catch (error) {\n if (error instanceof HttpApiTransportError) {\n if (error.detail.kind === HttpApiTransportFailureKind.REMOTE_ERROR && RETRYABLE_STATUS.has(error.detail.status ?? 0) && attempt < maxAttempts) {\n lastError = error;\n continue;\n }\n throw error;\n }\n const isAbort = error instanceof Error && error.name === 'AbortError';\n const transportError = new HttpApiTransportError(\n isAbort\n ? `HTTP-API call timed out after ${semantics.timeoutMs}ms: ${request.method} ${request.url}`\n : `HTTP-API network failure for ${request.method} ${request.url}: ${error instanceof Error ? error.message : String(error)}`,\n { url: request.url, method: request.method, attempts: attempt, kind: isAbort ? HttpApiTransportFailureKind.TIMEOUT : HttpApiTransportFailureKind.NETWORK },\n );\n if (attempt < maxAttempts) {\n lastError = transportError;\n continue;\n }\n throw transportError;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n // Unreachable while the loop throws on its last attempt; kept for control-flow honesty.\n throw lastError ?? new HttpApiTransportError(\n `HTTP-API call failed for ${request.method} ${request.url}`,\n { url: request.url, method: request.method, attempts: maxAttempts, kind: HttpApiTransportFailureKind.NETWORK },\n );\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"]}
1
+ {"version":3,"file":"http-api-transport.backend.js","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/http-api-transport.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HTTP transport for the HTTP-API resource repository — the ONE place a remote call leaves the\n * process, carrying the binding's declared remote-call semantics (ETL decision D10 / R15):\n * per-call timeout, bounded retry for idempotent read-family calls only, and an optional local\n * rate budget. Engine-independent by design (no DI, no ErrorBuilder): the adapter maps\n * {@link HttpApiTransportError} into its ordinary error projection.\n */\n\nimport type { API_HttpMethod } from '@wildo-ai/external-connectors-models';\nimport type { HttpApiRemoteCallSemantics } from '@wildo-ai/saas-models/external-data';\n\n/**\n * How a transport attempt failed — each member names a DIFFERENT remedy: TIMEOUT/NETWORK are\n * environmental (retryable), REMOTE_ERROR carries the target's own final answer, INVALID_JSON is\n * a contract breach at the target, RATE_BUDGET_EXHAUSTED is the binding's own local ceiling.\n */\nexport enum HttpApiTransportFailureKind {\n TIMEOUT = 'TIMEOUT',\n NETWORK = 'NETWORK',\n REMOTE_ERROR = 'REMOTE_ERROR',\n INVALID_JSON = 'INVALID_JSON',\n RATE_BUDGET_EXHAUSTED = 'RATE_BUDGET_EXHAUSTED',\n}\n\n/**\n * Minimal fetch shape — injectable so unit tests run without a network.\n *\n * `body` widened beyond `string` for S3a (#331): a hand-authored provider operation may upload a\n * file (`FormData`, so the platform picks the multipart boundary — a transport that wrote its own\n * `Content-Type` would produce a boundary the body does not use) or send raw bytes.\n */\nexport type HttpApiFetchLike = (\n url: string,\n init: {\n method: string;\n headers: Record<string, string>;\n body?: string | FormData | Uint8Array;\n signal?: AbortSignal;\n },\n) => Promise<{\n status: number;\n ok: boolean;\n text(): Promise<string>;\n}>;\n\n/**\n * How a request body is encoded on the wire. Slice 1 needed JSON alone, because every ETL call is\n * a read; a hand-authored WRITE reaches vendors that take form bodies and file uploads, so the\n * encoding is carried on the request rather than inferred from the method.\n */\nexport enum HttpApiTransportBodyEncoding {\n JSON = 'json',\n FORM_URLENCODED = 'form-urlencoded',\n /** `FormData`; the transport sends NO `Content-Type`, so the platform sets it with its boundary. */\n MULTIPART = 'multipart',\n /** A raw text body under a caller-declared media type. */\n TEXT = 'text',\n /** Raw bytes under a caller-declared media type. */\n BINARY = 'binary',\n}\n\n/** The request body, discriminated so each encoding carries exactly what it needs. */\nexport type HttpApiTransportBody =\n | { encoding: HttpApiTransportBodyEncoding.JSON; value: unknown }\n | { encoding: HttpApiTransportBodyEncoding.FORM_URLENCODED; value: Readonly<Record<string, string>> }\n | { encoding: HttpApiTransportBodyEncoding.MULTIPART; value: FormData }\n | { encoding: HttpApiTransportBodyEncoding.TEXT; value: string; contentType: string }\n | { encoding: HttpApiTransportBodyEncoding.BINARY; value: Uint8Array; contentType: string };\n\n/** How the RESPONSE body is decoded. */\nexport enum HttpApiTransportResponseDecoding {\n /** Parse as JSON; a 2xx with an unparsable body is a contract failure at the target. */\n JSON = 'json',\n /** Keep the raw text (a CSV export, an XML document); nothing is parsed. */\n TEXT = 'text',\n /** Read nothing — for a write whose body carries no information (a 204). */\n NONE = 'none',\n}\n\nexport interface HttpApiTransportRequest {\n /**\n * The transport is deliberately method-agnostic plumbing; WHICH methods a caller may compile is\n * governed one layer up (the read compilers speak GET/POST, the stance-6b erasure door speaks\n * DELETE, a provider operation speaks whatever it declares). The vocabulary is\n * `API_HttpMethod` — the one named HTTP-method source this repository already has — rather than\n * a third list beside the two read/erasure ones.\n */\n method: `${API_HttpMethod}`;\n url: string;\n headers: Record<string, string>;\n body?: HttpApiTransportBody;\n /** Absent = {@link HttpApiTransportResponseDecoding.JSON}, which is what every caller did before S3a. */\n responseDecoding?: HttpApiTransportResponseDecoding;\n /**\n * Whether re-sending this exact request is safe. REQUIRED, and deliberately not defaulted from\n * the method.\n *\n * Before S3a every call through here was a read or a delete-by-key, so retrying a timeout was\n * always right and the policy could stay implicit. The moment a hand-authored PUT/PATCH/POST\n * write arrives, an implicit retry duplicates it — and a default derived from the method would\n * be wrong in BOTH directions: it would stop retrying the POST-shaped reads the ETL depends on\n * (JSON-RPC, search endpoints), and it would happily retry a POST that charges a card. So each\n * caller answers, and the compiler makes every framing site answer.\n */\n retrySafe: boolean;\n}\n\nexport interface HttpApiTransportResponse {\n status: number;\n /** Parsed JSON body; `undefined` for an empty body or a non-JSON decoding. */\n json: unknown;\n /** Raw body text, present for {@link HttpApiTransportResponseDecoding.TEXT}. */\n text?: string;\n}\n\n/**\n * Every transport failure carries WHAT was attempted and HOW OFTEN, so the adapter's refusal\n * names the remote reality instead of a generic network error. Never carries the request\n * headers (they hold credentials).\n */\nexport class HttpApiTransportError extends Error {\n constructor(\n message: string,\n public readonly detail: {\n readonly url: string;\n readonly method: string;\n /** HTTP status of the LAST attempt; undefined when no response was received. */\n readonly status?: number;\n readonly attempts: number;\n readonly kind: HttpApiTransportFailureKind;\n },\n ) {\n super(message);\n this.name = 'HttpApiTransportError';\n }\n}\n\nconst RETRYABLE_STATUS = new Set([429, 502, 503, 504]);\n\n/**\n * A per-binding local rate budget (`maxRequestsPerMinute`) — a sliding-window counter, not a\n * fairness scheduler. When the window is full the call REFUSES immediately rather than queueing:\n * queueing inside a request lifecycle turns a rate problem into a latency problem the caller\n * cannot see (scope-down paper: refusal is the honest failure mode).\n */\nexport class HttpApiRateBudget {\n private readonly timestamps: number[] = [];\n\n constructor(private readonly maxRequestsPerMinute?: number) {}\n\n /** Returns true when the call may proceed (and records it); false when the budget is exhausted. */\n tryConsume(nowMs: number = Date.now()): boolean {\n if (this.maxRequestsPerMinute === undefined) return true;\n const windowStart = nowMs - 60_000;\n while (this.timestamps.length > 0 && this.timestamps[0] <= windowStart) {\n this.timestamps.shift();\n }\n if (this.timestamps.length >= this.maxRequestsPerMinute) return false;\n this.timestamps.push(nowMs);\n return true;\n }\n}\n\n/**\n * Frame one request body: the wire bytes and the `Content-Type` that describes them.\n *\n * MULTIPART deliberately contributes NO header — `FormData` carries a boundary the platform\n * generates while serializing, and a `Content-Type` written here would name a different one, so\n * the target would parse zero parts from a body that looks well formed.\n */\nfunction frameBody(body: HttpApiTransportBody | undefined): { payload?: string | FormData | Uint8Array; contentType?: string } {\n if (body === undefined) return {};\n switch (body.encoding) {\n case HttpApiTransportBodyEncoding.JSON:\n return { payload: JSON.stringify(body.value), contentType: 'application/json' };\n case HttpApiTransportBodyEncoding.FORM_URLENCODED:\n return { payload: new URLSearchParams(body.value as Record<string, string>).toString(), contentType: 'application/x-www-form-urlencoded' };\n case HttpApiTransportBodyEncoding.MULTIPART:\n return { payload: body.value };\n case HttpApiTransportBodyEncoding.TEXT:\n return { payload: body.value, contentType: body.contentType };\n case HttpApiTransportBodyEncoding.BINARY:\n return { payload: body.value, contentType: body.contentType };\n default: {\n const exhaustiveCheck: never = body;\n return exhaustiveCheck;\n }\n }\n}\n\n/**\n * Execute one remote call under the caller's semantics.\n *\n * Retry applies to a timeout, a network error, or a retryable status (429/502/503/504) — and ONLY\n * when the request declares itself `retrySafe`. Any other non-2xx status is a terminal remote\n * answer and is thrown on the first attempt: retrying a 400/401/403/404 re-asks a question whose\n * answer is final.\n *\n * The `retrySafe` gate arrived with S3a (#331). Every call before it was a read or a\n * delete-by-key, so the policy could be \"retry every transient\" and be right; a hand-authored\n * write makes that policy a duplicate-submission engine. Note a 429 is gated too, and that is\n * deliberate rather than an oversight: a 429 means the vendor did not act, but a TIMEOUT on the\n * same request means we do not know whether it acted, and one gate that is honest about both\n * beats two that invite the reader to work out which case they are in.\n */\nexport async function executeHttpApiTransportCall(\n request: HttpApiTransportRequest,\n semantics: Pick<HttpApiRemoteCallSemantics, 'timeoutMs' | 'retry'>,\n fetchImpl: HttpApiFetchLike,\n rateBudget?: HttpApiRateBudget,\n): Promise<HttpApiTransportResponse> {\n if (rateBudget && !rateBudget.tryConsume()) {\n throw new HttpApiTransportError(\n `HTTP-API rate budget exhausted for ${request.method} ${request.url}`,\n { url: request.url, method: request.method, attempts: 0, kind: HttpApiTransportFailureKind.RATE_BUDGET_EXHAUSTED },\n );\n }\n\n const maxAttempts = semantics.retry.maxAttempts;\n let lastError: HttpApiTransportError | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n if (attempt > 1) {\n await delay(semantics.retry.backoffMs * (attempt - 1));\n }\n\n const abort = new AbortController();\n const timeout = setTimeout(() => abort.abort(), semantics.timeoutMs);\n try {\n const framed = frameBody(request.body);\n const response = await fetchImpl(request.url, {\n method: request.method,\n // The caller's own headers win: a provider that must send its own `Content-Type` for a\n // text body has already declared it, and the framing default must not overwrite it.\n headers: framed.contentType === undefined\n ? request.headers\n : { 'Content-Type': framed.contentType, ...request.headers },\n body: framed.payload,\n signal: abort.signal,\n });\n const bodyText = await response.text();\n\n if (!response.ok) {\n const error = new HttpApiTransportError(\n `HTTP-API remote answered ${response.status} for ${request.method} ${request.url}`,\n { url: request.url, method: request.method, status: response.status, attempts: attempt, kind: HttpApiTransportFailureKind.REMOTE_ERROR },\n );\n if (request.retrySafe && RETRYABLE_STATUS.has(response.status) && attempt < maxAttempts) {\n lastError = error;\n continue;\n }\n throw error;\n }\n\n const decoding = request.responseDecoding ?? HttpApiTransportResponseDecoding.JSON;\n if (decoding === HttpApiTransportResponseDecoding.NONE) {\n return { status: response.status, json: undefined };\n }\n if (decoding === HttpApiTransportResponseDecoding.TEXT) {\n return { status: response.status, json: undefined, text: bodyText };\n }\n if (bodyText.length === 0) {\n return { status: response.status, json: undefined };\n }\n try {\n return { status: response.status, json: JSON.parse(bodyText) };\n } catch {\n // A 2xx with unparsable JSON is a CONTRACT failure, not a transient — never retried.\n throw new HttpApiTransportError(\n `HTTP-API remote answered ${response.status} with a non-JSON body for ${request.method} ${request.url}`,\n { url: request.url, method: request.method, status: response.status, attempts: attempt, kind: HttpApiTransportFailureKind.INVALID_JSON },\n );\n }\n } catch (error) {\n if (error instanceof HttpApiTransportError) {\n if (request.retrySafe && error.detail.kind === HttpApiTransportFailureKind.REMOTE_ERROR && RETRYABLE_STATUS.has(error.detail.status ?? 0) && attempt < maxAttempts) {\n lastError = error;\n continue;\n }\n throw error;\n }\n const isAbort = error instanceof Error && error.name === 'AbortError';\n const transportError = new HttpApiTransportError(\n isAbort\n ? `HTTP-API call timed out after ${semantics.timeoutMs}ms: ${request.method} ${request.url}`\n : `HTTP-API network failure for ${request.method} ${request.url}: ${error instanceof Error ? error.message : String(error)}`,\n { url: request.url, method: request.method, attempts: attempt, kind: isAbort ? HttpApiTransportFailureKind.TIMEOUT : HttpApiTransportFailureKind.NETWORK },\n );\n if (request.retrySafe && attempt < maxAttempts) {\n lastError = transportError;\n continue;\n }\n throw transportError;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n // Unreachable: every path in the loop either returns or throws — a non-retry-safe request\n // throws on its first attempt, and a retry-safe one throws on its last. Kept for control-flow\n // honesty, and because a future edit that adds a `continue` should land somewhere honest.\n throw lastError ?? new HttpApiTransportError(\n `HTTP-API call failed for ${request.method} ${request.url}`,\n { url: request.url, method: request.method, attempts: maxAttempts, kind: HttpApiTransportFailureKind.NETWORK },\n );\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"odata-query-compiler.backend.d.ts","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/odata-query-compiler.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAEV,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,aAAa,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC/C;AAgDD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,GACjB,MAAM,CASR;AAED,0CAA0C;AAC1C,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAKtB;AAoCD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,sBAAsB,EAC7B,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,oBAAoB,CA8CtB;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,iBAAiB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAClD,OAAO,EAAE;IACP,iFAAiF;IACjF,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,yFAAyF;IACzF,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IACnE,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA,oBAAoB,CAYtB;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,sBAAsB,GAC5B,oBAAoB,CAQtB"}
1
+ {"version":3,"file":"odata-query-compiler.backend.d.ts","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/odata-query-compiler.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAEV,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,aAAa,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC/C;AAgDD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,GACjB,MAAM,CASR;AAED,0CAA0C;AAC1C,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAKtB;AAoCD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,sBAAsB,EAC7B,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,oBAAoB,CA8CtB;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,iBAAiB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAClD,OAAO,EAAE;IACP,iFAAiF;IACjF,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,yFAAyF;IACzF,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IACnE,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA,oBAAoB,CA4BtB;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,sBAAsB,GAC5B,oBAAoB,CAQtB"}
@@ -161,8 +161,24 @@ export function compileODataCollectionRead(binding, query, options) {
161
161
  * per run.
162
162
  */
163
163
  export function compileODataExtractionFirstPage(binding, options) {
164
+ // `$orderby` on the KEY components, ascending, is not decoration — it is what makes the paged
165
+ // extraction drift-safe, and following `@odata.nextLink` alone does NOT provide it.
166
+ //
167
+ // Dataverse builds its paging cookie from the LAST ROW of the previous page under the query's
168
+ // own order, and its documentation is explicit that without a deterministic order "the same
169
+ // record can appear in more than one page" — it recommends ordering on the primary key, which is
170
+ // exactly what a binding's `keyFields` are. A duplicated row would be re-upserted (harmless), but
171
+ // a SKIPPED one is silently absent from a COMPLETE pass, and a complete pass is what authorizes
172
+ // the orphan stage — so a skip does not merely lose a row, it can orphan a live one.
173
+ // spec-cite: Microsoft Learn, "Page results using OData from Microsoft Dataverse Web API" —
174
+ // "Deterministic ordering is important" / "Without proper ordering, the same record can appear in
175
+ // more than one page."
176
+ //
177
+ // Key components are ordered as DECLARED: the schema already fixes their order for the composite
178
+ // key predicate, so reusing it keeps one source for "the key's component order".
164
179
  const params = {
165
180
  $select: [...new Set(options.selectRemoteFields)].join(','),
181
+ $orderby: binding.keyFields.map((keyField) => `${keyField.remoteField} asc`).join(','),
166
182
  $top: String(options.pageSize),
167
183
  };
168
184
  const filterFragments = Object.entries(options.sourceFilter ?? {}).map(([remoteField, value]) => `${remoteField} eq ${odataScalarLiteral(value)}`);
@@ -1 +1 @@
1
- {"version":3,"file":"odata-query-compiler.backend.js","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/odata-query-compiler.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * OData v4 compiler: {@link HttpApiTranslatedQuery} + binding → URL path + query parameters.\n *\n * One generic implementation for every OData target (SAP S/4HANA, Dataverse — ETL decision D0).\n * Purely mechanical: every predicate arriving here is ALREADY admitted by the T-set translation;\n * this module never widens or narrows a query, it only spells it.\n *\n * Key-literal spelling follows the component CODEC declared on the binding (paper A): string\n * components are quoted with doubled single-quotes, integer/guid/datetime components are\n * unquoted — the OData v4 primitive-literal forms.\n */\n\nimport {\n resolveHttpApiKeyComponents,\n} from '@wildo-ai/saas-models';\nimport {\n HttpApiKeyComponentCodec,\n type HttpApiKeyField,\n type HttpApiFieldMapping,\n} from '@wildo-ai/saas-models/external-data';\n\nimport type {\n HttpApiQueryScalar,\n HttpApiTranslatedQuery,\n} from './http-api-query.backend';\n\nexport interface ODataCompiledRequest {\n /** Path relative to the provider base URL, starting with '/'. */\n path: string;\n /** Query parameters, unencoded values (the transport URL-encodes once). */\n params: Record<string, string>;\n}\n\ninterface ODataBindingShape {\n entityRef: string;\n keyFields: readonly HttpApiKeyField[];\n fieldMappings: readonly HttpApiFieldMapping[];\n}\n\nfunction remoteFieldFor(binding: ODataBindingShape, localField: string): string {\n const mapping = binding.fieldMappings.find((entry) => entry.localField === localField);\n return mapping ? mapping.remoteField : localField;\n}\n\n/** OData string literal: single quotes doubled, wrapped in single quotes. */\nfunction odataStringLiteral(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction odataScalarLiteral(value: HttpApiQueryScalar): string {\n if (typeof value === 'string') return odataStringLiteral(value);\n if (value instanceof Date) return value.toISOString();\n return String(value);\n}\n\nfunction odataKeyComponentLiteral(codec: HttpApiKeyComponentCodec, value: string | number): string {\n switch (codec) {\n case HttpApiKeyComponentCodec.STRING:\n return odataStringLiteral(String(value));\n case HttpApiKeyComponentCodec.INTEGER:\n case HttpApiKeyComponentCodec.GUID:\n case HttpApiKeyComponentCodec.DATETIME_ISO:\n // OData v4 spells guid and datetimeoffset literals UNQUOTED in key predicates.\n return String(value);\n }\n}\n\n/**\n * Percent-encode the characters that break a URL PATH segment, leaving the predicate's\n * structural characters (`( ) = , '`) intact. `%` first, or the encoding re-encodes itself.\n * Applied to the finished predicate because these characters are never structural in one.\n * (The transport encodes QUERY params separately — this function must not run on `$filter`\n * fragments, or values would be double-encoded.)\n */\nfunction encodeODataPathPredicate(predicate: string): string {\n return predicate\n .replace(/%/g, '%25')\n .replace(/ /g, '%20')\n .replace(/\\?/g, '%3F')\n .replace(/#/g, '%23')\n .replace(/&/g, '%26')\n .replace(/\\+/g, '%2B')\n .replace(/\\//g, '%2F');\n}\n\n/**\n * The canonical key predicate for ONE row, from its synthesized id: `(K1=lit,K2=lit)` — or the\n * single-component short form `(lit)` when the binding declares one key field. PATH-encoded:\n * this predicate is only ever used as a URL path segment (the id-set `$filter` spelling lives in\n * `compileIdSetFilter`, which the transport's query-param encoding covers).\n */\nexport function compileODataKeyPredicate(\n binding: ODataBindingShape,\n resourceId: string,\n): string {\n const components = resolveHttpApiKeyComponents(binding, resourceId);\n if (binding.keyFields.length === 1) {\n return encodeODataPathPredicate(`(${odataKeyComponentLiteral(binding.keyFields[0].codec, components[0])})`);\n }\n const parts = binding.keyFields.map(\n (keyField, index) => `${keyField.remoteField}=${odataKeyComponentLiteral(keyField.codec, components[index])}`,\n );\n return encodeODataPathPredicate(`(${parts.join(',')})`);\n}\n\n/** Single-row read: `/EntitySet(key)`. */\nexport function compileODataKeyAddressedRead(\n binding: ODataBindingShape,\n resourceId: string,\n): ODataCompiledRequest {\n return {\n path: `/${binding.entityRef}${compileODataKeyPredicate(binding, resourceId)}`,\n params: {},\n };\n}\n\n/**\n * The id-set predicate (T2): a disjunction of full key predicates. Spelled as an `or`-chain of\n * per-component conjunctions — portable across OData v4.0 targets (`in` is 4.01-only, and only\n * expresses single-property membership anyway).\n */\nfunction compileIdSetFilter(binding: ODataBindingShape, ids: readonly string[]): string {\n const perId = ids.map((id) => {\n const components = resolveHttpApiKeyComponents(binding, id);\n const conjuncts = binding.keyFields.map(\n (keyField, index) => `${keyField.remoteField} eq ${odataKeyComponentLiteral(keyField.codec, components[index])}`,\n );\n return conjuncts.length === 1 ? conjuncts[0] : `(${conjuncts.join(' and ')})`;\n });\n return perId.length === 1 ? perId[0] : `(${perId.join(' or ')})`;\n}\n\nfunction compileSearchFilter(\n binding: ODataBindingShape,\n search: NonNullable<HttpApiTranslatedQuery['search']>,\n): string {\n const branches = search.localFields.map((localField) => {\n const remoteField = remoteFieldFor(binding, localField);\n if (search.fullMatchOnly) {\n return search.caseSensitive\n ? `${remoteField} eq ${odataStringLiteral(search.query)}`\n : `tolower(${remoteField}) eq ${odataStringLiteral(search.query.toLowerCase())}`;\n }\n return search.caseSensitive\n ? `contains(${remoteField},${odataStringLiteral(search.query)})`\n : `contains(tolower(${remoteField}),${odataStringLiteral(search.query.toLowerCase())})`;\n });\n return branches.length === 1 ? branches[0] : `(${branches.join(' or ')})`;\n}\n\n/**\n * Collection read (LIST/SEARCH/COUNT): `/EntitySet?$filter=…&$orderby=…&$top=…&$skip=…`.\n *\n * `matchNothing` MUST be short-circuited by the caller before compiling — compiling it is a\n * defect, and this module throws rather than spelling a query that could accidentally match.\n */\nexport function compileODataCollectionRead(\n binding: ODataBindingShape,\n query: HttpApiTranslatedQuery,\n options?: { count?: boolean },\n): ODataCompiledRequest {\n if (query.matchNothing) {\n throw new Error(\n 'A match-nothing query must be answered locally with an empty page — compiling it into OData risks matching rows.',\n );\n }\n\n const filterFragments: string[] = [];\n if (query.scope) {\n filterFragments.push(`${query.scope.remoteField} eq ${odataStringLiteral(query.scope.value)}`);\n }\n if (query.idIn) {\n filterFragments.push(compileIdSetFilter(binding, query.idIn));\n }\n for (const equals of query.fieldEquals) {\n filterFragments.push(`${remoteFieldFor(binding, equals.localField)} eq ${odataScalarLiteral(equals.value)}`);\n }\n for (const range of query.dateRanges) {\n const remoteField = remoteFieldFor(binding, range.localField);\n if (range.gte) filterFragments.push(`${remoteField} ge ${range.gte.toISOString()}`);\n if (range.lte) filterFragments.push(`${remoteField} le ${range.lte.toISOString()}`);\n }\n if (query.search) {\n filterFragments.push(compileSearchFilter(binding, query.search));\n }\n\n const params: Record<string, string> = {};\n if (filterFragments.length > 0) {\n params.$filter = filterFragments.join(' and ');\n }\n if (query.sort.length > 0) {\n params.$orderby = query.sort\n .map((key) => `${remoteFieldFor(binding, key.localField)}${key.direction === -1 ? ' desc' : ''}`)\n .join(',');\n }\n if (query.pagination) {\n params.$top = String(query.pagination.limit);\n if (query.pagination.offset > 0) {\n params.$skip = String(query.pagination.offset);\n }\n }\n if (options?.count) {\n params.$count = 'true';\n }\n\n return { path: `/${binding.entityRef}`, params };\n}\n\n/**\n * The ETL extraction FIRST page (partial-resource paper, D-P10 / PR-5): `$select` confined to\n * exactly the fields the pipeline maps (data minimization by construction — un-mapped personal\n * data never enters the process), an optional declared equality filter, `$top` as the page bound.\n * Subsequent pages are NOT compiled locally — the extraction follows the server's own\n * `@odata.nextLink` (drift-safe server-driven paging), so this function is only ever called once\n * per run.\n */\nexport function compileODataExtractionFirstPage(\n binding: ODataBindingShape & { entityRef: string },\n options: {\n /** REMOTE field names to select — the mapped fields plus every key component. */\n selectRemoteFields: readonly string[];\n /** Declared REMOTE-field equality conjunction (`sourceFilter`), already remote-named. */\n sourceFilter?: Readonly<Record<string, string | number | boolean>>;\n pageSize: number;\n },\n): ODataCompiledRequest {\n const params: Record<string, string> = {\n $select: [...new Set(options.selectRemoteFields)].join(','),\n $top: String(options.pageSize),\n };\n const filterFragments = Object.entries(options.sourceFilter ?? {}).map(\n ([remoteField, value]) => `${remoteField} eq ${odataScalarLiteral(value)}`,\n );\n if (filterFragments.length > 0) {\n params.$filter = filterFragments.join(' and ');\n }\n return { path: `/${binding.entityRef}`, params };\n}\n\n/** COUNT-only read: `/EntitySet/$count?$filter=…` — the body is the bare number. */\nexport function compileODataCountRead(\n binding: ODataBindingShape,\n query: HttpApiTranslatedQuery,\n): ODataCompiledRequest {\n const collection = compileODataCollectionRead(binding, query);\n const params = { ...collection.params };\n delete params.$orderby;\n delete params.$top;\n delete params.$skip;\n delete params.$count;\n return { path: `${collection.path}/$count`, params };\n}\n"]}
1
+ {"version":3,"file":"odata-query-compiler.backend.js","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/odata-query-compiler.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,wBAAwB,GAGzB,MAAM,qCAAqC,CAAC;AAoB7C,SAAS,cAAc,CAAC,OAA0B,EAAE,UAAkB;IACpE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACvF,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;AACpD,CAAC;AAED,6EAA6E;AAC7E,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAyB;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAChE,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,wBAAwB,CAAC,KAA+B,EAAE,KAAsB;IACvF,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,wBAAwB,CAAC,MAAM;YAClC,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,KAAK,wBAAwB,CAAC,OAAO,CAAC;QACtC,KAAK,wBAAwB,CAAC,IAAI,CAAC;QACnC,KAAK,wBAAwB,CAAC,YAAY;YACxC,+EAA+E;YAC/E,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,wBAAwB,CAAC,SAAiB;IACjD,OAAO,SAAS;SACb,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAA0B,EAC1B,UAAkB;IAElB,MAAM,UAAU,GAAG,2BAA2B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,wBAAwB,CAAC,IAAI,wBAAwB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9G,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CACjC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,IAAI,wBAAwB,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAC9G,CAAC;IACF,OAAO,wBAAwB,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,4BAA4B,CAC1C,OAA0B,EAC1B,UAAkB;IAElB,OAAO;QACL,IAAI,EAAE,IAAI,OAAO,CAAC,SAAS,GAAG,wBAAwB,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE;QAC7E,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,OAA0B,EAAE,GAAsB;IAC5E,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QAC3B,MAAM,UAAU,GAAG,2BAA2B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CACrC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,OAAO,wBAAwB,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CACjH,CAAC;QACF,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;IAChF,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACnE,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAA0B,EAC1B,MAAqD;IAErD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QACrD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,aAAa;gBACzB,CAAC,CAAC,GAAG,WAAW,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACzD,CAAC,CAAC,WAAW,WAAW,QAAQ,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACrF,CAAC;QACD,OAAO,MAAM,CAAC,aAAa;YACzB,CAAC,CAAC,YAAY,WAAW,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;YAChE,CAAC,CAAC,oBAAoB,WAAW,KAAK,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;IAC5F,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAC5E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAA0B,EAC1B,KAA6B,EAC7B,OAA6B;IAE7B,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,kHAAkH,CACnH,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,eAAe,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,eAAe,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,GAAG;YAAE,eAAe,CAAC,IAAI,CAAC,GAAG,WAAW,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACpF,IAAI,KAAK,CAAC,GAAG;YAAE,eAAe,CAAC,IAAI,CAAC,GAAG,WAAW,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,eAAe,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI;aACzB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aAChG,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,+BAA+B,CAC7C,OAAkD,EAClD,OAMC;IAED,8FAA8F;IAC9F,oFAAoF;IACpF,EAAE;IACF,8FAA8F;IAC9F,4FAA4F;IAC5F,iGAAiG;IACjG,kGAAkG;IAClG,gGAAgG;IAChG,qFAAqF;IACrF,4FAA4F;IAC5F,kGAAkG;IAClG,uBAAuB;IACvB,EAAE;IACF,iGAAiG;IACjG,iFAAiF;IACjF,MAAM,MAAM,GAA2B;QACrC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3D,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACtF,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC/B,CAAC;IACF,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CACpE,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,WAAW,OAAO,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC3E,CAAC;IACF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CACnC,OAA0B,EAC1B,KAA6B;IAE7B,MAAM,UAAU,GAAG,0BAA0B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;IACxC,OAAO,MAAM,CAAC,QAAQ,CAAC;IACvB,OAAO,MAAM,CAAC,IAAI,CAAC;IACnB,OAAO,MAAM,CAAC,KAAK,CAAC;IACpB,OAAO,MAAM,CAAC,MAAM,CAAC;IACrB,OAAO,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC;AACvD,CAAC","sourcesContent":["/**\n * OData v4 compiler: {@link HttpApiTranslatedQuery} + binding → URL path + query parameters.\n *\n * One generic implementation for every OData target (SAP S/4HANA, Dataverse — ETL decision D0).\n * Purely mechanical: every predicate arriving here is ALREADY admitted by the T-set translation;\n * this module never widens or narrows a query, it only spells it.\n *\n * Key-literal spelling follows the component CODEC declared on the binding (paper A): string\n * components are quoted with doubled single-quotes, integer/guid/datetime components are\n * unquoted — the OData v4 primitive-literal forms.\n */\n\nimport {\n resolveHttpApiKeyComponents,\n} from '@wildo-ai/saas-models';\nimport {\n HttpApiKeyComponentCodec,\n type HttpApiKeyField,\n type HttpApiFieldMapping,\n} from '@wildo-ai/saas-models/external-data';\n\nimport type {\n HttpApiQueryScalar,\n HttpApiTranslatedQuery,\n} from './http-api-query.backend';\n\nexport interface ODataCompiledRequest {\n /** Path relative to the provider base URL, starting with '/'. */\n path: string;\n /** Query parameters, unencoded values (the transport URL-encodes once). */\n params: Record<string, string>;\n}\n\ninterface ODataBindingShape {\n entityRef: string;\n keyFields: readonly HttpApiKeyField[];\n fieldMappings: readonly HttpApiFieldMapping[];\n}\n\nfunction remoteFieldFor(binding: ODataBindingShape, localField: string): string {\n const mapping = binding.fieldMappings.find((entry) => entry.localField === localField);\n return mapping ? mapping.remoteField : localField;\n}\n\n/** OData string literal: single quotes doubled, wrapped in single quotes. */\nfunction odataStringLiteral(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction odataScalarLiteral(value: HttpApiQueryScalar): string {\n if (typeof value === 'string') return odataStringLiteral(value);\n if (value instanceof Date) return value.toISOString();\n return String(value);\n}\n\nfunction odataKeyComponentLiteral(codec: HttpApiKeyComponentCodec, value: string | number): string {\n switch (codec) {\n case HttpApiKeyComponentCodec.STRING:\n return odataStringLiteral(String(value));\n case HttpApiKeyComponentCodec.INTEGER:\n case HttpApiKeyComponentCodec.GUID:\n case HttpApiKeyComponentCodec.DATETIME_ISO:\n // OData v4 spells guid and datetimeoffset literals UNQUOTED in key predicates.\n return String(value);\n }\n}\n\n/**\n * Percent-encode the characters that break a URL PATH segment, leaving the predicate's\n * structural characters (`( ) = , '`) intact. `%` first, or the encoding re-encodes itself.\n * Applied to the finished predicate because these characters are never structural in one.\n * (The transport encodes QUERY params separately — this function must not run on `$filter`\n * fragments, or values would be double-encoded.)\n */\nfunction encodeODataPathPredicate(predicate: string): string {\n return predicate\n .replace(/%/g, '%25')\n .replace(/ /g, '%20')\n .replace(/\\?/g, '%3F')\n .replace(/#/g, '%23')\n .replace(/&/g, '%26')\n .replace(/\\+/g, '%2B')\n .replace(/\\//g, '%2F');\n}\n\n/**\n * The canonical key predicate for ONE row, from its synthesized id: `(K1=lit,K2=lit)` — or the\n * single-component short form `(lit)` when the binding declares one key field. PATH-encoded:\n * this predicate is only ever used as a URL path segment (the id-set `$filter` spelling lives in\n * `compileIdSetFilter`, which the transport's query-param encoding covers).\n */\nexport function compileODataKeyPredicate(\n binding: ODataBindingShape,\n resourceId: string,\n): string {\n const components = resolveHttpApiKeyComponents(binding, resourceId);\n if (binding.keyFields.length === 1) {\n return encodeODataPathPredicate(`(${odataKeyComponentLiteral(binding.keyFields[0].codec, components[0])})`);\n }\n const parts = binding.keyFields.map(\n (keyField, index) => `${keyField.remoteField}=${odataKeyComponentLiteral(keyField.codec, components[index])}`,\n );\n return encodeODataPathPredicate(`(${parts.join(',')})`);\n}\n\n/** Single-row read: `/EntitySet(key)`. */\nexport function compileODataKeyAddressedRead(\n binding: ODataBindingShape,\n resourceId: string,\n): ODataCompiledRequest {\n return {\n path: `/${binding.entityRef}${compileODataKeyPredicate(binding, resourceId)}`,\n params: {},\n };\n}\n\n/**\n * The id-set predicate (T2): a disjunction of full key predicates. Spelled as an `or`-chain of\n * per-component conjunctions — portable across OData v4.0 targets (`in` is 4.01-only, and only\n * expresses single-property membership anyway).\n */\nfunction compileIdSetFilter(binding: ODataBindingShape, ids: readonly string[]): string {\n const perId = ids.map((id) => {\n const components = resolveHttpApiKeyComponents(binding, id);\n const conjuncts = binding.keyFields.map(\n (keyField, index) => `${keyField.remoteField} eq ${odataKeyComponentLiteral(keyField.codec, components[index])}`,\n );\n return conjuncts.length === 1 ? conjuncts[0] : `(${conjuncts.join(' and ')})`;\n });\n return perId.length === 1 ? perId[0] : `(${perId.join(' or ')})`;\n}\n\nfunction compileSearchFilter(\n binding: ODataBindingShape,\n search: NonNullable<HttpApiTranslatedQuery['search']>,\n): string {\n const branches = search.localFields.map((localField) => {\n const remoteField = remoteFieldFor(binding, localField);\n if (search.fullMatchOnly) {\n return search.caseSensitive\n ? `${remoteField} eq ${odataStringLiteral(search.query)}`\n : `tolower(${remoteField}) eq ${odataStringLiteral(search.query.toLowerCase())}`;\n }\n return search.caseSensitive\n ? `contains(${remoteField},${odataStringLiteral(search.query)})`\n : `contains(tolower(${remoteField}),${odataStringLiteral(search.query.toLowerCase())})`;\n });\n return branches.length === 1 ? branches[0] : `(${branches.join(' or ')})`;\n}\n\n/**\n * Collection read (LIST/SEARCH/COUNT): `/EntitySet?$filter=…&$orderby=…&$top=…&$skip=…`.\n *\n * `matchNothing` MUST be short-circuited by the caller before compiling — compiling it is a\n * defect, and this module throws rather than spelling a query that could accidentally match.\n */\nexport function compileODataCollectionRead(\n binding: ODataBindingShape,\n query: HttpApiTranslatedQuery,\n options?: { count?: boolean },\n): ODataCompiledRequest {\n if (query.matchNothing) {\n throw new Error(\n 'A match-nothing query must be answered locally with an empty page — compiling it into OData risks matching rows.',\n );\n }\n\n const filterFragments: string[] = [];\n if (query.scope) {\n filterFragments.push(`${query.scope.remoteField} eq ${odataStringLiteral(query.scope.value)}`);\n }\n if (query.idIn) {\n filterFragments.push(compileIdSetFilter(binding, query.idIn));\n }\n for (const equals of query.fieldEquals) {\n filterFragments.push(`${remoteFieldFor(binding, equals.localField)} eq ${odataScalarLiteral(equals.value)}`);\n }\n for (const range of query.dateRanges) {\n const remoteField = remoteFieldFor(binding, range.localField);\n if (range.gte) filterFragments.push(`${remoteField} ge ${range.gte.toISOString()}`);\n if (range.lte) filterFragments.push(`${remoteField} le ${range.lte.toISOString()}`);\n }\n if (query.search) {\n filterFragments.push(compileSearchFilter(binding, query.search));\n }\n\n const params: Record<string, string> = {};\n if (filterFragments.length > 0) {\n params.$filter = filterFragments.join(' and ');\n }\n if (query.sort.length > 0) {\n params.$orderby = query.sort\n .map((key) => `${remoteFieldFor(binding, key.localField)}${key.direction === -1 ? ' desc' : ''}`)\n .join(',');\n }\n if (query.pagination) {\n params.$top = String(query.pagination.limit);\n if (query.pagination.offset > 0) {\n params.$skip = String(query.pagination.offset);\n }\n }\n if (options?.count) {\n params.$count = 'true';\n }\n\n return { path: `/${binding.entityRef}`, params };\n}\n\n/**\n * The ETL extraction FIRST page (partial-resource paper, D-P10 / PR-5): `$select` confined to\n * exactly the fields the pipeline maps (data minimization by construction — un-mapped personal\n * data never enters the process), an optional declared equality filter, `$top` as the page bound.\n * Subsequent pages are NOT compiled locally — the extraction follows the server's own\n * `@odata.nextLink` (drift-safe server-driven paging), so this function is only ever called once\n * per run.\n */\nexport function compileODataExtractionFirstPage(\n binding: ODataBindingShape & { entityRef: string },\n options: {\n /** REMOTE field names to select — the mapped fields plus every key component. */\n selectRemoteFields: readonly string[];\n /** Declared REMOTE-field equality conjunction (`sourceFilter`), already remote-named. */\n sourceFilter?: Readonly<Record<string, string | number | boolean>>;\n pageSize: number;\n },\n): ODataCompiledRequest {\n // `$orderby` on the KEY components, ascending, is not decoration — it is what makes the paged\n // extraction drift-safe, and following `@odata.nextLink` alone does NOT provide it.\n //\n // Dataverse builds its paging cookie from the LAST ROW of the previous page under the query's\n // own order, and its documentation is explicit that without a deterministic order \"the same\n // record can appear in more than one page\" — it recommends ordering on the primary key, which is\n // exactly what a binding's `keyFields` are. A duplicated row would be re-upserted (harmless), but\n // a SKIPPED one is silently absent from a COMPLETE pass, and a complete pass is what authorizes\n // the orphan stage — so a skip does not merely lose a row, it can orphan a live one.\n // spec-cite: Microsoft Learn, \"Page results using OData from Microsoft Dataverse Web API\" —\n // \"Deterministic ordering is important\" / \"Without proper ordering, the same record can appear in\n // more than one page.\"\n //\n // Key components are ordered as DECLARED: the schema already fixes their order for the composite\n // key predicate, so reusing it keeps one source for \"the key's component order\".\n const params: Record<string, string> = {\n $select: [...new Set(options.selectRemoteFields)].join(','),\n $orderby: binding.keyFields.map((keyField) => `${keyField.remoteField} asc`).join(','),\n $top: String(options.pageSize),\n };\n const filterFragments = Object.entries(options.sourceFilter ?? {}).map(\n ([remoteField, value]) => `${remoteField} eq ${odataScalarLiteral(value)}`,\n );\n if (filterFragments.length > 0) {\n params.$filter = filterFragments.join(' and ');\n }\n return { path: `/${binding.entityRef}`, params };\n}\n\n/** COUNT-only read: `/EntitySet/$count?$filter=…` — the body is the bare number. */\nexport function compileODataCountRead(\n binding: ODataBindingShape,\n query: HttpApiTranslatedQuery,\n): ODataCompiledRequest {\n const collection = compileODataCollectionRead(binding, query);\n const params = { ...collection.params };\n delete params.$orderby;\n delete params.$top;\n delete params.$skip;\n delete params.$count;\n return { path: `${collection.path}/$count`, params };\n}\n"]}