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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (853) hide show
  1. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.d.ts.map +1 -1
  2. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js +19 -1
  3. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js.map +1 -1
  4. package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
  5. package/dist/esm/base-classes/models/manual-controllers.backend.definition.js +4 -0
  6. package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
  7. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts +35 -0
  8. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts.map +1 -0
  9. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js +111 -0
  10. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js.map +1 -0
  11. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts +50 -0
  12. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts.map +1 -0
  13. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js +199 -0
  14. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js.map +1 -0
  15. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts +111 -0
  16. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts.map +1 -1
  17. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js +140 -0
  18. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js.map +1 -1
  19. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
  20. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +27 -6
  21. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
  22. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts +124 -13
  23. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
  24. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +207 -21
  25. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
  26. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts +60 -8
  27. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
  28. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +174 -26
  29. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
  30. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +47 -4
  31. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
  32. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +96 -29
  33. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
  34. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
  35. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
  36. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
  37. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
  38. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts +89 -14
  39. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
  40. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js +84 -11
  41. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
  42. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
  43. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +9 -1
  44. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
  45. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +49 -0
  46. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
  47. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +171 -18
  48. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
  49. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
  50. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +23 -3
  51. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
  52. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
  53. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +20 -0
  54. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
  55. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts +22 -0
  56. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
  57. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
  58. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
  59. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +4 -1
  60. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
  61. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts +11 -0
  62. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
  63. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js +39 -5
  64. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
  65. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +181 -2
  66. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
  67. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +529 -41
  68. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
  69. package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts +36 -3
  70. package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
  71. package/dist/esm/base-classes/services/services/system-access.backend.service.js +70 -8
  72. package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
  73. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts +28 -0
  74. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -0
  75. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js +90 -0
  76. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -0
  77. package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts +44 -0
  78. package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -0
  79. package/dist/esm/billing/batches/usage-flush.batch.backend.service.js +99 -0
  80. package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -0
  81. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts +91 -0
  82. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -0
  83. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js +152 -0
  84. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -0
  85. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +186 -0
  86. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -0
  87. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +474 -0
  88. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
  89. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts +100 -0
  90. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
  91. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js +209 -6
  92. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
  93. package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts +200 -4
  94. package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
  95. package/dist/esm/billing/services/back-office/usage-metering.backend.service.js +593 -64
  96. package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
  97. package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts +36 -0
  98. package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -0
  99. package/dist/esm/billing/services/billing-adapter-registry.backend.js +83 -0
  100. package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -0
  101. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts +9 -0
  102. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
  103. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js +11 -1
  104. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
  105. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
  106. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +48 -7
  107. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
  108. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +38 -1
  109. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
  110. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +67 -2
  111. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
  112. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts +30 -1
  113. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
  114. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js +43 -1
  115. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
  116. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts +11 -3
  117. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
  118. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js +30 -16
  119. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
  120. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
  121. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js +104 -25
  122. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
  123. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +18 -1
  124. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
  125. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +106 -2
  126. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
  127. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts +52 -0
  128. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -0
  129. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js +74 -0
  130. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -0
  131. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts +104 -11
  132. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
  133. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +260 -26
  134. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
  135. package/dist/esm/billing/testing/mock-billing-provider.d.ts +30 -1
  136. package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
  137. package/dist/esm/billing/testing/mock-billing-provider.js +25 -0
  138. package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
  139. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js +11 -4
  140. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
  141. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +225 -13
  142. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
  143. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +340 -62
  144. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
  145. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +244 -7
  146. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
  147. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +386 -5
  148. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
  149. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
  150. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
  151. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
  152. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +6 -2
  153. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -1
  154. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +31 -9
  155. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -1
  156. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
  157. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
  158. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +57 -1
  159. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
  160. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
  161. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
  162. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
  163. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
  164. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
  165. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +31 -0
  166. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
  167. package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts +5 -0
  168. package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
  169. package/dist/esm/config/bootstrap/application-runtime-profile.backend.js +6 -0
  170. package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
  171. package/dist/esm/config/models/app-config.backend.schemas.d.ts +142 -46
  172. package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
  173. package/dist/esm/config/models/app-config.backend.schemas.js +121 -12
  174. package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
  175. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts +38 -15
  176. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
  177. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js +17 -2
  178. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
  179. package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts +0 -1
  180. package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
  181. package/dist/esm/config/services/app-configuration-loader.backend.service.js +68 -76
  182. package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
  183. package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
  184. package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
  185. package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
  186. package/dist/esm/config/services/app-configuration.backend.utils.d.ts +33 -0
  187. package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
  188. package/dist/esm/config/services/app-configuration.backend.utils.js +39 -1
  189. package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
  190. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +25 -0
  191. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
  192. package/dist/esm/config/services/application-startup-config-validator.backend.service.js +41 -1
  193. package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
  194. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
  195. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js +48 -0
  196. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
  197. package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
  198. package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
  199. package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
  200. package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
  201. package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
  202. package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
  203. package/dist/esm/errors/services/error-handler.backend.service.js +129 -8
  204. package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
  205. package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
  206. package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
  207. package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
  208. package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
  209. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
  210. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
  211. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
  212. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
  213. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
  214. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
  215. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
  216. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
  217. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +59 -2
  218. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
  219. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +52 -17
  220. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
  221. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts +4 -2
  222. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
  223. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
  224. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +256 -0
  225. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -0
  226. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +333 -0
  227. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -0
  228. package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts +56 -0
  229. package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -0
  230. package/dist/esm/external-providers/operations/provider-operation-request.backend.js +211 -0
  231. package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -0
  232. package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts +45 -0
  233. package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -0
  234. package/dist/esm/external-providers/operations/provider-request-signing.backend.js +216 -0
  235. package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -0
  236. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts +56 -0
  237. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -0
  238. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js +78 -0
  239. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -0
  240. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts +1 -1
  241. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
  242. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js +2 -2
  243. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
  244. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts +89 -0
  245. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -0
  246. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js +164 -0
  247. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -0
  248. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts +26 -27
  249. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
  250. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js +50 -64
  251. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
  252. package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
  253. package/dist/esm/external-providers/services/document-extraction.backend.service.js +3 -3
  254. package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
  255. package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
  256. package/dist/esm/external-providers/services/embeddings.backend.service.js +4 -4
  257. package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
  258. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +292 -7
  259. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
  260. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +533 -45
  261. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
  262. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
  263. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +25 -2
  264. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
  265. package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
  266. package/dist/esm/files/controllers/file.controller.js +21 -13
  267. package/dist/esm/files/controllers/file.controller.js.map +1 -1
  268. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
  269. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +39 -15
  270. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
  271. package/dist/esm/files/services/file-scanning.backend.service.d.ts +94 -9
  272. package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
  273. package/dist/esm/files/services/file-scanning.backend.service.js +197 -17
  274. package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
  275. package/dist/esm/files/services/file-text-extraction.backend.service.d.ts +60 -1
  276. package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
  277. package/dist/esm/files/services/file-text-extraction.backend.service.js +167 -8
  278. package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
  279. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +53 -2
  280. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -1
  281. package/dist/esm/files/services/file-upload-grant.backend.service.js +127 -3
  282. package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -1
  283. package/dist/esm/files/services/files.backend.service.d.ts +68 -0
  284. package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
  285. package/dist/esm/files/services/files.backend.service.js +175 -5
  286. package/dist/esm/files/services/files.backend.service.js.map +1 -1
  287. package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts +109 -0
  288. package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -0
  289. package/dist/esm/files/storage/application-storage-key.backend.utils.js +123 -0
  290. package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -0
  291. package/dist/esm/files/storage/file-storage-provider.types.d.ts +16 -10
  292. package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
  293. package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
  294. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts +67 -8
  295. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
  296. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js +101 -28
  297. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
  298. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
  299. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js +8 -55
  300. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
  301. package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
  302. package/dist/esm/files/utils/file-field-schema-path.backend.utils.js +20 -0
  303. package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
  304. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts +86 -0
  305. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -0
  306. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js +288 -0
  307. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -0
  308. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts +15 -0
  309. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
  310. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js +76 -5
  311. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
  312. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
  313. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js +6 -1
  314. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
  315. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts +60 -0
  316. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
  317. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js +63 -0
  318. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
  319. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
  320. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
  321. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +196 -40
  322. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
  323. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
  324. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
  325. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
  326. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
  327. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
  328. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
  329. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
  330. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
  331. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
  332. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
  333. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
  334. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts +0 -13
  335. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
  336. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js +14 -22
  337. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
  338. package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts +8 -3
  339. package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
  340. package/dist/esm/flows-actors/models/core-facets.backend.definitions.js +25 -15
  341. package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
  342. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts +13 -1
  343. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
  344. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
  345. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +88 -8
  346. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
  347. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +333 -31
  348. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
  349. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
  350. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js +4 -2
  351. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
  352. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts +113 -0
  353. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -0
  354. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js +62 -0
  355. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -0
  356. package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
  357. package/dist/esm/flows-actors/services/actors-system.backend.service.js +0 -2
  358. package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
  359. package/dist/esm/flows-actors/services/agents.backend.service.d.ts +28 -1
  360. package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
  361. package/dist/esm/flows-actors/services/agents.backend.service.js +204 -18
  362. package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
  363. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +5 -1
  364. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
  365. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +79 -16
  366. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
  367. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +34 -5
  368. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
  369. package/dist/esm/flows-actors/services/flows-actors-registry.service.js +154 -20
  370. package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
  371. package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
  372. package/dist/esm/flows-actors/services/flows.backend.services.js +27 -23
  373. package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
  374. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
  375. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js +7 -1
  376. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
  377. package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts +90 -0
  378. package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -0
  379. package/dist/esm/flows-actors/services/mcp-client.backend.service.js +368 -0
  380. package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
  381. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
  382. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
  383. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
  384. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
  385. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
  386. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +8 -4
  387. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
  388. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts +0 -207
  389. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
  390. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js +8 -243
  391. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
  392. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
  393. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
  394. package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts +9 -14
  395. package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
  396. package/dist/esm/guidance/services/milestone-evaluator.backend.service.js +18 -89
  397. package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
  398. package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts +86 -0
  399. package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -0
  400. package/dist/esm/guidance/services/progression-state-store.backend.service.js +155 -0
  401. package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -0
  402. package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts +10 -0
  403. package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
  404. package/dist/esm/i18n/controllers/i18n-controller.backend.service.js +55 -5
  405. package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
  406. package/dist/esm/index.d.ts +11 -4
  407. package/dist/esm/index.d.ts.map +1 -1
  408. package/dist/esm/index.js +31 -4
  409. package/dist/esm/index.js.map +1 -1
  410. package/dist/esm/inject/models/container.d.ts.map +1 -1
  411. package/dist/esm/inject/models/container.js +78 -10
  412. package/dist/esm/inject/models/container.js.map +1 -1
  413. package/dist/esm/inject/models/service-types.d.ts +17 -3
  414. package/dist/esm/inject/models/service-types.d.ts.map +1 -1
  415. package/dist/esm/inject/models/service-types.js +19 -3
  416. package/dist/esm/inject/models/service-types.js.map +1 -1
  417. package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
  418. package/dist/esm/mcp/controllers/mcp.controller.js +20 -0
  419. package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
  420. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +56 -1
  421. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
  422. package/dist/esm/mcp/services/mcp-server.backend.service.js +107 -11
  423. package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
  424. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
  425. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +22 -0
  426. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
  427. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
  428. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js +49 -4
  429. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
  430. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts +66 -0
  431. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -0
  432. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js +199 -0
  433. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -0
  434. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts +149 -13
  435. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
  436. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js +411 -19
  437. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
  438. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts +11 -2
  439. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
  440. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
  441. package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts +28 -9
  442. package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
  443. package/dist/esm/monitoring/logger/models/logger.backend.schemas.js +30 -10
  444. package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
  445. package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
  446. package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
  447. package/dist/esm/monitoring/logger/services/logger.service.js +52 -11
  448. package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
  449. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts +62 -0
  450. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -0
  451. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js +78 -0
  452. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -0
  453. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +309 -0
  454. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -0
  455. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +385 -0
  456. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -0
  457. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +1 -0
  458. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
  459. package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
  460. package/dist/esm/monitoring/observability/services/metrics.service.d.ts +21 -0
  461. package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
  462. package/dist/esm/monitoring/observability/services/metrics.service.js +38 -0
  463. package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
  464. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -80
  465. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -1
  466. package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -25
  467. package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -1
  468. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -49
  469. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -1
  470. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -141
  471. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -1
  472. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -37
  473. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -1
  474. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -121
  475. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -1
  476. package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts +66 -1
  477. package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
  478. package/dist/esm/notifications/email/services/email-template-registry.backend.service.js +105 -10
  479. package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
  480. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -58
  481. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -1
  482. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -223
  483. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -1
  484. package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
  485. package/dist/esm/notifications/email/services/email-template-validator.backend.service.js +10 -1
  486. package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
  487. package/dist/esm/notifications/email/services/email.backend.service.d.ts +60 -4
  488. package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
  489. package/dist/esm/notifications/email/services/email.backend.service.js +145 -43
  490. package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
  491. package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts +0 -1
  492. package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
  493. package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
  494. package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
  495. package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
  496. package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
  497. package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
  498. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +99 -13
  499. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
  500. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +422 -66
  501. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
  502. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +2 -2
  503. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
  504. package/dist/esm/notifications/sms/services/sms.backend.service.js +5 -5
  505. package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
  506. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
  507. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
  508. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
  509. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
  510. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
  511. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
  512. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +46 -1
  513. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
  514. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
  515. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +16 -6
  516. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
  517. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
  518. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +12 -12
  519. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
  520. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts +16 -0
  521. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
  522. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js +18 -0
  523. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
  524. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts +2 -2
  525. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js +2 -2
  526. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
  527. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
  528. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js +63 -2
  529. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
  530. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts +66 -0
  531. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -0
  532. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js +257 -0
  533. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -0
  534. package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts +12 -0
  535. package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -0
  536. package/dist/esm/queue/adapters/queue-adapter.backend.binding.js +47 -0
  537. package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -0
  538. package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts +87 -0
  539. package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -0
  540. package/dist/esm/queue/adapters/queue-adapter.backend.interface.js +1 -0
  541. package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -0
  542. package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts +31 -0
  543. package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -0
  544. package/dist/esm/queue/adapters/queue-adapter.backend.options.js +13 -0
  545. package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -0
  546. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts +19 -25
  547. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
  548. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js +33 -0
  549. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
  550. package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts +2 -2
  551. package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
  552. package/dist/esm/queue/domain-queue-consumer.backend.service.js +1 -4
  553. package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
  554. package/dist/esm/queue/job-consumer.backend.service.d.ts +2 -2
  555. package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
  556. package/dist/esm/queue/job-consumer.backend.service.js +1 -4
  557. package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
  558. package/dist/esm/queue/job-executor.backend.service.d.ts +2 -2
  559. package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
  560. package/dist/esm/queue/job-executor.backend.service.js +1 -4
  561. package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
  562. package/dist/esm/queue/queue-monitoring.backend.service.d.ts +8 -4
  563. package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
  564. package/dist/esm/queue/queue-monitoring.backend.service.js +25 -17
  565. package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
  566. package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts +16 -1
  567. package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
  568. package/dist/esm/queue/queue-worker-initializer.backend.service.js +16 -1
  569. package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
  570. package/dist/esm/queue/queue.backend.service.d.ts +3 -3
  571. package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
  572. package/dist/esm/queue/queue.backend.service.js +26 -4
  573. package/dist/esm/queue/queue.backend.service.js.map +1 -1
  574. package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts +2 -2
  575. package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
  576. package/dist/esm/queue/worker-shutdown-manager.backend.service.js +18 -3
  577. package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
  578. package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts +50 -25
  579. package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
  580. package/dist/esm/rag/utils/rag-chunking.backend.utils.js +147 -39
  581. package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
  582. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts +12 -3
  583. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
  584. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js +12 -3
  585. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
  586. package/dist/esm/requests/service/websocket.service.d.ts +9 -0
  587. package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
  588. package/dist/esm/requests/service/websocket.service.js +32 -8
  589. package/dist/esm/requests/service/websocket.service.js.map +1 -1
  590. package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
  591. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +14 -2
  592. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
  593. package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
  594. package/dist/esm/resources/models/resources-operations.backend.definitions.js +2 -0
  595. package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
  596. package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
  597. package/dist/esm/resources/models/resources-relationships.backend.definitions.js +14 -0
  598. package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
  599. package/dist/esm/resources/models/resources-types.backend.schemas.d.ts +2 -1
  600. package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
  601. package/dist/esm/resources/models/resources-types.backend.schemas.js +8 -0
  602. package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
  603. package/dist/esm/resources/services/resources-registry.backend.service.d.ts +60 -5
  604. package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
  605. package/dist/esm/resources/services/resources-registry.backend.service.js +90 -6
  606. package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
  607. package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts +36 -3
  608. package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
  609. package/dist/esm/runtime/controllers/health-controller.backend.service.js +32 -10
  610. package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
  611. package/dist/esm/runtime/domain-module.backend.definitions.d.ts +24 -0
  612. package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
  613. package/dist/esm/runtime/domain-module.backend.definitions.js +24 -0
  614. package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
  615. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts +51 -0
  616. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
  617. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
  618. package/dist/esm/runtime/services/http-server.backend.service.d.ts +26 -0
  619. package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
  620. package/dist/esm/runtime/services/http-server.backend.service.js +181 -1
  621. package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
  622. package/dist/esm/runtime/services/start-application.backend.service.d.ts +19 -1
  623. package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
  624. package/dist/esm/runtime/services/start-application.backend.service.js +261 -77
  625. package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
  626. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts +15 -0
  627. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
  628. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js +28 -0
  629. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
  630. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts +5 -1
  631. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
  632. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js +24 -4
  633. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
  634. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
  635. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +29 -4
  636. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
  637. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts +114 -0
  638. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
  639. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js +354 -3
  640. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
  641. package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts +1 -0
  642. package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
  643. package/dist/esm/security/authentications/models/cimd.backend.schemas.js +22 -0
  644. package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
  645. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
  646. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
  647. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
  648. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts +0 -2
  649. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
  650. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js +23 -14
  651. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
  652. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts +0 -1
  653. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
  654. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js +15 -12
  655. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
  656. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts +113 -3
  657. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
  658. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js +207 -30
  659. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
  660. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts +95 -2
  661. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
  662. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js +153 -9
  663. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
  664. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +190 -0
  665. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
  666. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +377 -53
  667. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
  668. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
  669. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +68 -1
  670. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
  671. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts +41 -0
  672. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
  673. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js +202 -23
  674. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
  675. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
  676. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +42 -1
  677. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
  678. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
  679. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +34 -4
  680. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
  681. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts +29 -5
  682. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
  683. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js +77 -5
  684. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
  685. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +17 -1
  686. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
  687. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +49 -17
  688. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
  689. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
  690. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
  691. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
  692. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
  693. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
  694. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
  695. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
  696. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
  697. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
  698. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
  699. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
  700. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts +28 -0
  701. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -0
  702. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +283 -0
  703. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -0
  704. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts +4 -3
  705. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
  706. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js +4 -3
  707. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
  708. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts +35 -0
  709. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
  710. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js +111 -21
  711. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
  712. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts +14 -1
  713. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
  714. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js +49 -8
  715. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
  716. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
  717. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js +4 -0
  718. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
  719. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
  720. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js +6 -0
  721. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
  722. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts +37 -1
  723. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
  724. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js +51 -0
  725. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
  726. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts +41 -0
  727. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
  728. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js +45 -0
  729. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
  730. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts +116 -0
  731. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -0
  732. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js +162 -0
  733. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -0
  734. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts +20 -20
  735. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
  736. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js +27 -28
  737. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
  738. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
  739. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +77 -3
  740. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
  741. package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
  742. package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
  743. package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
  744. package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
  745. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +93 -0
  746. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -0
  747. package/dist/esm/security/authorizations/role-conferral.backend.utils.js +95 -0
  748. package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -0
  749. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +124 -1
  750. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
  751. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +142 -5
  752. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
  753. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +74 -8
  754. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
  755. package/dist/esm/security/authorizations/services/authorizations.backend.service.js +175 -19
  756. package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
  757. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +6 -14
  758. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
  759. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +13 -22
  760. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
  761. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts +60 -0
  762. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -0
  763. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js +79 -0
  764. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -0
  765. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +161 -0
  766. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -0
  767. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +512 -0
  768. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -0
  769. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +59 -0
  770. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -0
  771. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js +22 -0
  772. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -0
  773. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts +44 -0
  774. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -0
  775. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js +20 -0
  776. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -0
  777. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +191 -0
  778. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -0
  779. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +385 -0
  780. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -0
  781. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts +41 -0
  782. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
  783. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js +358 -0
  784. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -0
  785. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts +160 -0
  786. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -0
  787. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +266 -0
  788. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -0
  789. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +111 -0
  790. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -0
  791. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +107 -0
  792. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -0
  793. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts +54 -0
  794. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -0
  795. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +153 -0
  796. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -0
  797. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +195 -0
  798. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -0
  799. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +387 -0
  800. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -0
  801. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts +45 -0
  802. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
  803. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js +291 -0
  804. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -0
  805. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +62 -0
  806. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -0
  807. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js +29 -0
  808. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -0
  809. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts +127 -0
  810. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -0
  811. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js +277 -0
  812. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -0
  813. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts +66 -0
  814. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -0
  815. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js +75 -0
  816. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -0
  817. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +21 -3
  818. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
  819. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +26 -16
  820. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
  821. package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
  822. package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
  823. package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
  824. package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
  825. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts +26 -0
  826. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
  827. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js +43 -0
  828. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
  829. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +8 -1
  830. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
  831. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +49 -0
  832. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
  833. package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
  834. package/dist/esm/security/scim/controllers/scim.backend.controller.js +17 -5
  835. package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
  836. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts +67 -29
  837. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
  838. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js +47 -25
  839. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
  840. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts +10 -2
  841. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
  842. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js +10 -2
  843. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
  844. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts +143 -0
  845. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -0
  846. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js +258 -0
  847. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -0
  848. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts +39 -0
  849. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -0
  850. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js +159 -0
  851. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -0
  852. package/dist/tsconfig.build.tsbuildinfo +1 -1
  853. package/package.json +11 -9
@@ -3,7 +3,7 @@
3
3
  * (partial-resource paper, PR-29): provider-access resolution, transport execution (timeout /
4
4
  * bounded retry / rate budget), the per-dialect wire framing (OData GET, REST_JSON GET/POST +
5
5
  * JSON-RPC envelope semantics, Odoo `execute_kw` with the `common.authenticate` handshake and
6
- * the instance-cached uid), and the 404-as-null read tolerance.
6
+ * the credential-keyed cached uid), and the 404-as-null read tolerance.
7
7
  *
8
8
  * TWO consumers, by design: the VIRTUAL repository (`http-api-resource-repository`) and the
9
9
  * pipeline extraction source (P-2). The declaration layer is split on purpose — a pipeline is
@@ -32,15 +32,58 @@ export declare class HttpApiReadClient {
32
32
  private readonly fetchImpl;
33
33
  private readonly rateBudget;
34
34
  /**
35
- * The authenticated uid for this binding's credentials, resolved once per client instance
36
- * through the documented `common.authenticate(db, login, api_key, {})` handshake and cached —
37
- * clients are constructed once per consumer and the credential set is instance-stable. A
38
- * credential rotation therefore needs a process restart in slice 1 (recorded; an invalidation
39
- * hook belongs with the runtime-proof work, measured against real session-expiry behavior).
35
+ * The authenticated uid, KEYED ON the credential it was minted under rather than merely
36
+ * remembered against this instance.
37
+ *
38
+ * The uid comes from the documented `common.authenticate(db, login, api_key, {})` handshake and
39
+ * is worth caching: the virtual repository builds ONE client per binding and keeps it for the
40
+ * process lifetime (`http-api-resource-repository.backend.service.ts:163`), so re-authenticating
41
+ * per call would double every read's round trips.
42
+ *
43
+ * What it must never do is outlive the credential. `resolveAccess` runs on EVERY call and reads
44
+ * the secret afresh (environment, provider registry, or a tenant credential row), so a rotation
45
+ * genuinely reaches this class — and a uid remembered against the instance would then be an
46
+ * identity minted under the retired credential, presented on every subsequent `execute_kw`.
47
+ *
48
+ * Keying the cache on the credential is what makes that unrepresentable, and it is deliberately
49
+ * preferred over an `invalidate()` some rotation path has to remember to call: there is no
50
+ * enumeration of rotation sites to get wrong, because a changed credential simply misses. Note
51
+ * the key includes `baseUrl` — a uid is a `res.users` row id on ONE database on ONE instance, so
52
+ * repointing the binding at another host must not reuse it either.
53
+ *
54
+ * The key is a SHA-256 of the tuple rather than the tuple itself, so the API key is not held
55
+ * alive on a long-lived field beyond the call that resolved it. The hash is per `execute_kw`
56
+ * call and costs microseconds against a network round trip.
57
+ *
58
+ * ONE slot, not a map. A map would save a handshake when a credential the client has already
59
+ * seen comes back, at the cost of accumulating one secret-derived entry per retired credential
60
+ * for the lifetime of the process — an unbounded set, to avoid a round trip nobody has measured.
61
+ * A binding names one credential at a time, so the slot is single and a rollback re-authenticates.
62
+ *
63
+ * The single slot stays SAFE now that an Odoo binding MAY name a tenant-owned target (#333, which
64
+ * widened `connectionTargetForBinding` from the `APPLICATION` pin it used to hold). Alternating
65
+ * tenants each miss the key and pay a handshake — slower, and never one tenant acting under
66
+ * another tenant's uid, which is what an instance-remembered uid would have become the moment the
67
+ * scope widened. The key is the credential, so the widening cost a round trip and no correctness.
68
+ *
69
+ * This replaces the slice-1 note that said a rotation needs a process restart, and with it the
70
+ * owed work to "measure against real session-expiry behavior". That measurement was owed for an
71
+ * invalidation TRIGGER, and this design needs no trigger. It also has nothing to expire against:
72
+ * `execute_kw` below re-presents `db` + `uid` + `apiKey` in the args of every single call, so
73
+ * there is no server-side session here whose lifetime we could be racing — the only thing that
74
+ * can retire the uid is the credential (or the instance) it names, which is exactly the key.
40
75
  */
41
- private odooAuthenticatedUid?;
76
+ private odooAuthenticatedIdentity?;
42
77
  constructor(binding: HttpApiResourceBinding, providerAccessResolver: HttpApiProviderAccessResolver, fetchImpl?: HttpApiFetchLike);
43
- resolveAccess(executionContext: ExecutionContext<any>): HttpApiProviderAccess;
78
+ /**
79
+ * `async`, so a target this execution cannot satisfy REJECTS rather than throwing synchronously.
80
+ *
81
+ * `connectionTargetForBinding` refuses before the port is reached, and a synchronous throw out of
82
+ * a `Promise`-returning method escapes every `.catch()` a caller attaches — the failure would land
83
+ * as an unhandled exception in whichever frame happened to call it without `await`. The keyword is
84
+ * the whole fix.
85
+ */
86
+ resolveAccess(executionContext: ExecutionContext<any>): Promise<HttpApiProviderAccess>;
44
87
  odataGet(executionContext: ExecutionContext<any>, compiled: ODataCompiledRequest): Promise<unknown>;
45
88
  odataGetOrNull(executionContext: ExecutionContext<any>, compiled: ODataCompiledRequest): Promise<unknown | null>;
46
89
  /**
@@ -69,6 +112,15 @@ export declare class HttpApiReadClient {
69
112
  restJsonReadOrNull(executionContext: ExecutionContext<any>, compiled: RestJsonCompiledRequest): Promise<unknown | null>;
70
113
  private buildRestJsonRequest;
71
114
  odooExecuteKw(executionContext: ExecutionContext<any>, call: OdooCompiledCall): Promise<unknown>;
115
+ /**
116
+ * The identity a cached uid belongs to: the instance it was minted on, and the exact credential
117
+ * it was minted with.
118
+ *
119
+ * `JSON.stringify` over the tuple rather than a joined string because JSON escapes each member,
120
+ * so no combination of separators inside a db name, a login or a key can make two different
121
+ * tuples produce one key.
122
+ */
123
+ private static odooCredentialKey;
72
124
  private executeOdooRpc;
73
125
  /** OData's canonical `DELETE /EntitySet(key)`; a 404 is the row already gone (idempotent). */
74
126
  odataDeleteByPath(executionContext: ExecutionContext<any>, path: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"http-api-read-client.backend.d.ts","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/http-api-read-client.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACvB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;AAE5G,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKxE,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EACnC,MAAM,oCAAoC,CAAC;AAE5C,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,EAAE,gBAGjC,CAAC;AAEF,qBAAa,iBAAiB;IAa1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAd5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAE/C;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB,CAAC,CAAS;gBAGnB,OAAO,EAAE,sBAAsB,EAC/B,sBAAsB,EAAE,6BAA6B,EACrD,SAAS,GAAE,gBAAsC;IAK7D,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,qBAAqB;IAMvE,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQnG,cAAc,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAS7H;;;;OAIG;IACU,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlG;;;;;;;;OAQG;IACU,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAc/F,OAAO,CAAC,iBAAiB;IAaZ,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBnH;;;;OAIG;IACU,kBAAkB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiBpI,OAAO,CAAC,oBAAoB;IA6Bf,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;YAqC/F,cAAc;IA6B5B,8FAA8F;IACjF,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASpG;;;;OAIG;IACU,uBAAuB,CAClC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EACvC,QAAQ,EAAE,8BAA8B,GACvC,OAAO,CAAC,IAAI,CAAC;IAuBhB,sEAAsE;IACzD,OAAO,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAOxE,0FAA0F;IAC7E,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;CAQtF"}
1
+ {"version":3,"file":"http-api-read-client.backend.d.ts","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/http-api-read-client.backend.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * (partial-resource paper, PR-29): provider-access resolution, transport execution (timeout /
4
4
  * bounded retry / rate budget), the per-dialect wire framing (OData GET, REST_JSON GET/POST +
5
5
  * JSON-RPC envelope semantics, Odoo `execute_kw` with the `common.authenticate` handshake and
6
- * the instance-cached uid), and the 404-as-null read tolerance.
6
+ * the credential-keyed cached uid), and the 404-as-null read tolerance.
7
7
  *
8
8
  * TWO consumers, by design: the VIRTUAL repository (`http-api-resource-repository`) and the
9
9
  * pipeline extraction source (P-2). The declaration layer is split on purpose — a pipeline is
@@ -17,7 +17,10 @@
17
17
  * narrows a query and never interprets a ROW — it moves compiled requests and returns parsed
18
18
  * bodies.
19
19
  */
20
- import { HttpApiRateBudget, HttpApiTransportError, HttpApiTransportFailureKind, executeHttpApiTransportCall, } from './http-api-transport.backend.js';
20
+ import { createHash } from 'node:crypto';
21
+ import { ExternalProvider_Connection_DelegationMode, ExternalProvider_Connection_OwnerScope, } from '@wildo-ai/external-connectors-models';
22
+ import { ExternalProvider_ConnectionTargetSchema, } from '@wildo-ai/external-connectors-models';
23
+ import { HttpApiRateBudget, HttpApiTransportBodyEncoding, HttpApiTransportError, HttpApiTransportFailureKind, executeHttpApiTransportCall, } from './http-api-transport.backend.js';
21
24
  import { HttpApiRemoteContractError, resolveHttpApiResultPath, } from './http-api-row-projection.backend.js';
22
25
  import { HttpApiProviderAccessError, } from './http-api-provider-access.backend.js';
23
26
  /** Default fetch over the platform global (Node ≥18); injectable for tests. */
@@ -25,31 +28,131 @@ export const defaultHttpApiFetch = async (url, init) => {
25
28
  const response = await fetch(url, init);
26
29
  return { status: response.status, ok: response.ok, text: () => response.text() };
27
30
  };
31
+ /**
32
+ * The binding's declared connection SHAPE, plus the instance ids this execution supplies — ONE
33
+ * place, deliberately.
34
+ *
35
+ * ## What changed, and why the refusal that used to live here is gone
36
+ *
37
+ * This function used to refuse every delegated binding, naming a missing subsystem: "the engine has
38
+ * no outbound per-user token store". That was true when it was written and is not any more — the
39
+ * store exists, is bound, and serves the connection controller (#333). What actually blocked the
40
+ * lift was narrower: the binding carried a two-valued `identityMode`, and `USER_DELEGATED` cannot
41
+ * say WHOSE ACCOUNT is spent. A user's own grant (`USER × SERVICE`) and a tenant's registration
42
+ * acting for one of its members (`ORGANIZATION × USER`) are both "per-user OAuth" and resolve
43
+ * different credentials, so mapping the one field would have silently picked a lane. The binding
44
+ * now carries the shape itself, and this function only has to source the instances.
45
+ *
46
+ * ## The ids come from the EXECUTION, and that is not the resolver reading ambient context
47
+ *
48
+ * `ExternalProvider_ConnectionTarget`'s own contract says a target is supplied BY THE CALL and never
49
+ * invented by the resolver, because "the resolver cannot verify a target it also invented". This is
50
+ * the call side of that split: an httpApiBinding read is triggered by a resource operation, so the
51
+ * organization and the user it runs for ARE the execution's, and naming them here is what leaves the
52
+ * resolver free to authorize them. It refuses rather than falling back — an absent organization on a
53
+ * tenant-owned binding must not quietly become the application's account, which is the exact
54
+ * mis-attribution `resolveProviderSecretForConnection` exists to prevent.
55
+ *
56
+ * ## The rules are the SCHEMA's
57
+ *
58
+ * Every refusal below comes from `ExternalProvider_ConnectionTargetSchema`'s own refinements, which
59
+ * already say — better than a re-statement here would — that an instance-owned connection names
60
+ * which instance, that an application-owned one has no id to name, and that a delegated call must
61
+ * name the user it acts for. Re-deriving them here would be a second copy that drifts.
62
+ */
63
+ function connectionTargetForBinding(binding, executionContext) {
64
+ const { ownerScope, delegation } = binding.connection;
65
+ const initiator = executionContext.initiatorIds;
66
+ const ownerId = ownerScope === ExternalProvider_Connection_OwnerScope.ORGANIZATION
67
+ ? initiator?.organizationId
68
+ : ownerScope === ExternalProvider_Connection_OwnerScope.USER
69
+ ? initiator?.userId
70
+ : undefined;
71
+ const candidate = {
72
+ ownerScope,
73
+ delegation,
74
+ ...(ownerId === undefined ? {} : { ownerId }),
75
+ ...(delegation === ExternalProvider_Connection_DelegationMode.USER && initiator?.userId !== undefined
76
+ ? { actingForUserId: initiator.userId }
77
+ : {}),
78
+ };
79
+ const parsed = ExternalProvider_ConnectionTargetSchema.safeParse(candidate);
80
+ if (!parsed.success) {
81
+ throw new HttpApiProviderAccessError(`The binding toward provider '${binding.providerRef}' declares a ${ownerScope} × ${delegation} connection, `
82
+ + 'and this execution cannot supply what that names: '
83
+ + parsed.error.issues.map((issue) => issue.message).join(' ')
84
+ + ' Either trigger the read from an execution that carries them, or declare a connection the application can satisfy alone.');
85
+ }
86
+ return parsed.data;
87
+ }
28
88
  export class HttpApiReadClient {
29
89
  binding;
30
90
  providerAccessResolver;
31
91
  fetchImpl;
32
92
  rateBudget;
33
93
  /**
34
- * The authenticated uid for this binding's credentials, resolved once per client instance
35
- * through the documented `common.authenticate(db, login, api_key, {})` handshake and cached —
36
- * clients are constructed once per consumer and the credential set is instance-stable. A
37
- * credential rotation therefore needs a process restart in slice 1 (recorded; an invalidation
38
- * hook belongs with the runtime-proof work, measured against real session-expiry behavior).
94
+ * The authenticated uid, KEYED ON the credential it was minted under rather than merely
95
+ * remembered against this instance.
96
+ *
97
+ * The uid comes from the documented `common.authenticate(db, login, api_key, {})` handshake and
98
+ * is worth caching: the virtual repository builds ONE client per binding and keeps it for the
99
+ * process lifetime (`http-api-resource-repository.backend.service.ts:163`), so re-authenticating
100
+ * per call would double every read's round trips.
101
+ *
102
+ * What it must never do is outlive the credential. `resolveAccess` runs on EVERY call and reads
103
+ * the secret afresh (environment, provider registry, or a tenant credential row), so a rotation
104
+ * genuinely reaches this class — and a uid remembered against the instance would then be an
105
+ * identity minted under the retired credential, presented on every subsequent `execute_kw`.
106
+ *
107
+ * Keying the cache on the credential is what makes that unrepresentable, and it is deliberately
108
+ * preferred over an `invalidate()` some rotation path has to remember to call: there is no
109
+ * enumeration of rotation sites to get wrong, because a changed credential simply misses. Note
110
+ * the key includes `baseUrl` — a uid is a `res.users` row id on ONE database on ONE instance, so
111
+ * repointing the binding at another host must not reuse it either.
112
+ *
113
+ * The key is a SHA-256 of the tuple rather than the tuple itself, so the API key is not held
114
+ * alive on a long-lived field beyond the call that resolved it. The hash is per `execute_kw`
115
+ * call and costs microseconds against a network round trip.
116
+ *
117
+ * ONE slot, not a map. A map would save a handshake when a credential the client has already
118
+ * seen comes back, at the cost of accumulating one secret-derived entry per retired credential
119
+ * for the lifetime of the process — an unbounded set, to avoid a round trip nobody has measured.
120
+ * A binding names one credential at a time, so the slot is single and a rollback re-authenticates.
121
+ *
122
+ * The single slot stays SAFE now that an Odoo binding MAY name a tenant-owned target (#333, which
123
+ * widened `connectionTargetForBinding` from the `APPLICATION` pin it used to hold). Alternating
124
+ * tenants each miss the key and pay a handshake — slower, and never one tenant acting under
125
+ * another tenant's uid, which is what an instance-remembered uid would have become the moment the
126
+ * scope widened. The key is the credential, so the widening cost a round trip and no correctness.
127
+ *
128
+ * This replaces the slice-1 note that said a rotation needs a process restart, and with it the
129
+ * owed work to "measure against real session-expiry behavior". That measurement was owed for an
130
+ * invalidation TRIGGER, and this design needs no trigger. It also has nothing to expire against:
131
+ * `execute_kw` below re-presents `db` + `uid` + `apiKey` in the args of every single call, so
132
+ * there is no server-side session here whose lifetime we could be racing — the only thing that
133
+ * can retire the uid is the credential (or the instance) it names, which is exactly the key.
39
134
  */
40
- odooAuthenticatedUid;
135
+ odooAuthenticatedIdentity;
41
136
  constructor(binding, providerAccessResolver, fetchImpl = defaultHttpApiFetch) {
42
137
  this.binding = binding;
43
138
  this.providerAccessResolver = providerAccessResolver;
44
139
  this.fetchImpl = fetchImpl;
45
140
  this.rateBudget = new HttpApiRateBudget(binding.remoteCallSemantics.maxRequestsPerMinute);
46
141
  }
47
- resolveAccess(executionContext) {
48
- return this.providerAccessResolver.resolveAccess(this.binding, executionContext);
142
+ /**
143
+ * `async`, so a target this execution cannot satisfy REJECTS rather than throwing synchronously.
144
+ *
145
+ * `connectionTargetForBinding` refuses before the port is reached, and a synchronous throw out of
146
+ * a `Promise`-returning method escapes every `.catch()` a caller attaches — the failure would land
147
+ * as an unhandled exception in whichever frame happened to call it without `await`. The keyword is
148
+ * the whole fix.
149
+ */
150
+ async resolveAccess(executionContext) {
151
+ return this.providerAccessResolver.resolveAccess(this.binding.providerRef, connectionTargetForBinding(this.binding, executionContext), executionContext);
49
152
  }
50
153
  // ── OData ────────────────────────────────────────────────────────────────────
51
154
  async odataGet(executionContext, compiled) {
52
- const access = this.resolveAccess(executionContext);
155
+ const access = await this.resolveAccess(executionContext);
53
156
  const response = await executeHttpApiTransportCall(this.buildODataRequest(access, compiled), this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget);
54
157
  return response.json;
55
158
  }
@@ -69,9 +172,11 @@ export class HttpApiReadClient {
69
172
  * service-relative) continuation URL; nothing is compiled locally.
70
173
  */
71
174
  async odataGetByUrl(executionContext, url) {
72
- const access = this.resolveAccess(executionContext);
175
+ const access = await this.resolveAccess(executionContext);
73
176
  const absoluteUrl = url.startsWith('http') ? url : `${access.baseUrl}${url.startsWith('/') ? '' : '/'}${url}`;
74
- const response = await executeHttpApiTransportCall({ method: 'GET', url: absoluteUrl, headers: { Accept: 'application/json', ...access.headers } }, this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget);
177
+ const response = await executeHttpApiTransportCall(
178
+ // A paging continuation is a read: safe to re-send after a timeout.
179
+ { method: 'GET', url: absoluteUrl, headers: { Accept: 'application/json', ...access.headers }, retrySafe: true }, this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget);
75
180
  return response.json;
76
181
  }
77
182
  /**
@@ -85,7 +190,7 @@ export class HttpApiReadClient {
85
190
  */
86
191
  async odataMetadataText(executionContext) {
87
192
  try {
88
- const access = this.resolveAccess(executionContext);
193
+ const access = await this.resolveAccess(executionContext);
89
194
  const response = await this.fetchImpl(`${access.baseUrl}/$metadata`, {
90
195
  method: 'GET',
91
196
  headers: { Accept: 'application/xml', ...access.headers },
@@ -106,11 +211,12 @@ export class HttpApiReadClient {
106
211
  method: 'GET',
107
212
  url: `${access.baseUrl}${compiled.path}${search.length > 0 ? `?${search}` : ''}`,
108
213
  headers: { Accept: 'application/json', ...access.headers },
214
+ retrySafe: true,
109
215
  };
110
216
  }
111
217
  // ── REST_JSON ────────────────────────────────────────────────────────────────
112
218
  async restJson(executionContext, compiled) {
113
- const access = this.resolveAccess(executionContext);
219
+ const access = await this.resolveAccess(executionContext);
114
220
  const response = await executeHttpApiTransportCall(this.buildRestJsonRequest(access, compiled), this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget);
115
221
  if (compiled.jsonRpc) {
116
222
  const envelope = response.json;
@@ -149,7 +255,10 @@ export class HttpApiReadClient {
149
255
  method: 'POST',
150
256
  url: `${access.baseUrl}${compiled.path}`,
151
257
  headers: { Accept: 'application/json', ...access.headers },
152
- jsonBody: { jsonrpc: '2.0', method: compiled.jsonRpc.rpcMethod, params: compiled.params, id: 1 },
258
+ body: { encoding: HttpApiTransportBodyEncoding.JSON, value: { jsonrpc: '2.0', method: compiled.jsonRpc.rpcMethod, params: compiled.params, id: 1 } },
259
+ // POST-shaped, read by construction: the read compilers are the only producers of this
260
+ // request and they compile nothing but reads, so re-sending it cannot duplicate a write.
261
+ retrySafe: true,
153
262
  };
154
263
  }
155
264
  if (compiled.method === 'POST') {
@@ -157,7 +266,9 @@ export class HttpApiReadClient {
157
266
  method: 'POST',
158
267
  url: `${access.baseUrl}${compiled.path}`,
159
268
  headers: { Accept: 'application/json', ...access.headers },
160
- jsonBody: compiled.params,
269
+ body: { encoding: HttpApiTransportBodyEncoding.JSON, value: compiled.params },
270
+ // Same argument as the JSON-RPC branch above: a POST-shaped SEARCH is still a read.
271
+ retrySafe: true,
161
272
  };
162
273
  }
163
274
  const search = Object.entries(compiled.params)
@@ -167,11 +278,12 @@ export class HttpApiReadClient {
167
278
  method: 'GET',
168
279
  url: `${access.baseUrl}${compiled.path}${search.length > 0 ? `?${search}` : ''}`,
169
280
  headers: { Accept: 'application/json', ...access.headers },
281
+ retrySafe: true,
170
282
  };
171
283
  }
172
284
  // ── Odoo execute_kw ──────────────────────────────────────────────────────────
173
285
  async odooExecuteKw(executionContext, call) {
174
- const access = this.resolveAccess(executionContext);
286
+ const access = await this.resolveAccess(executionContext);
175
287
  const credentials = access.jsonRpcInArgsCredentials;
176
288
  if (!credentials) {
177
289
  // An ODOO_JSONRPC binding on a provider whose contract declares no in-args auth cannot
@@ -179,20 +291,33 @@ export class HttpApiReadClient {
179
291
  throw new HttpApiProviderAccessError(`Provider '${this.binding.providerRef}' declares no jsonRpcInArgsAuth on its rest contract, but this binding speaks ODOO_JSONRPC — `
180
292
  + 'the target authenticates INSIDE the RPC args; declare jsonRpcInArgsAuth (dbEnvVarName, loginEnvVarName) on the provider module.');
181
293
  }
182
- if (this.odooAuthenticatedUid === undefined) {
294
+ // Resolved from THIS call's access, so a rotated credential produces a different key and the
295
+ // cached identity below simply does not match — no invalidation call, and therefore no
296
+ // rotation path that can forget to make one.
297
+ const credentialKey = HttpApiReadClient.odooCredentialKey(access.baseUrl, credentials);
298
+ let authenticatedUid = this.odooAuthenticatedIdentity?.credentialKey === credentialKey
299
+ ? this.odooAuthenticatedIdentity.uid
300
+ : undefined;
301
+ if (authenticatedUid === undefined) {
183
302
  const uid = await this.executeOdooRpc(access, 'common', 'authenticate', [
184
303
  credentials.db, credentials.login, credentials.apiKey, {},
185
304
  ]);
186
305
  if (typeof uid !== 'number' || !Number.isInteger(uid) || uid <= 0) {
187
306
  // Odoo answers `false` for rejected credentials — a terminal answer, spelled loudly.
307
+ //
308
+ // The previously cached identity is left alone rather than dropped: it belongs to a
309
+ // DIFFERENT key (that is why we are here), so it can never be served for these
310
+ // credentials, and keeping it means a rotation that is rolled back does not pay a second
311
+ // handshake. Only a successful authenticate writes the field.
188
312
  throw new HttpApiProviderAccessError(`Odoo rejected the credentials for provider '${this.binding.providerRef}' (db '${credentials.db}', login '${credentials.login}'): `
189
313
  + `authenticate answered ${JSON.stringify(uid)} instead of a uid.`);
190
314
  }
191
- this.odooAuthenticatedUid = uid;
315
+ authenticatedUid = uid;
316
+ this.odooAuthenticatedIdentity = { credentialKey, uid };
192
317
  }
193
318
  return this.executeOdooRpc(access, 'object', 'execute_kw', [
194
319
  credentials.db,
195
- this.odooAuthenticatedUid,
320
+ authenticatedUid,
196
321
  credentials.apiKey,
197
322
  this.binding.entityRef,
198
323
  call.method,
@@ -200,12 +325,29 @@ export class HttpApiReadClient {
200
325
  call.kwargs,
201
326
  ]);
202
327
  }
328
+ /**
329
+ * The identity a cached uid belongs to: the instance it was minted on, and the exact credential
330
+ * it was minted with.
331
+ *
332
+ * `JSON.stringify` over the tuple rather than a joined string because JSON escapes each member,
333
+ * so no combination of separators inside a db name, a login or a key can make two different
334
+ * tuples produce one key.
335
+ */
336
+ static odooCredentialKey(baseUrl, credentials) {
337
+ return createHash('sha256')
338
+ .update(JSON.stringify([baseUrl, credentials.db, credentials.login, credentials.apiKey]))
339
+ .digest('hex');
340
+ }
203
341
  async executeOdooRpc(access, service, method, args) {
204
342
  const response = await executeHttpApiTransportCall({
205
343
  method: 'POST',
206
344
  url: `${access.baseUrl}/jsonrpc`,
207
345
  headers: { Accept: 'application/json', ...access.headers },
208
- jsonBody: { jsonrpc: '2.0', method: 'call', params: { service, method, args }, id: 1 },
346
+ body: { encoding: HttpApiTransportBodyEncoding.JSON, value: { jsonrpc: '2.0', method: 'call', params: { service, method, args }, id: 1 } },
347
+ // Two callers, both safe to repeat: `common.authenticate` (a pure question) and
348
+ // `object.execute_kw` with a read method — the Odoo compiler emits `search_read`/
349
+ // `search_count` and nothing that writes.
350
+ retrySafe: true,
209
351
  }, this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget);
210
352
  const envelope = response.json;
211
353
  if (envelope && typeof envelope === 'object' && envelope.error) {
@@ -216,11 +358,14 @@ export class HttpApiReadClient {
216
358
  // ── Erasure-family calls (stance 6b — the door ORCHESTRATES, the client frames) ──
217
359
  /** OData's canonical `DELETE /EntitySet(key)`; a 404 is the row already gone (idempotent). */
218
360
  async odataDeleteByPath(executionContext, path) {
219
- const access = this.resolveAccess(executionContext);
361
+ const access = await this.resolveAccess(executionContext);
220
362
  await this.rawCallTolerating404({
221
363
  method: 'DELETE',
222
364
  url: `${access.baseUrl}${path}`,
223
365
  headers: { Accept: 'application/json', ...access.headers },
366
+ // Idempotent by key: the second DELETE of a gone row answers 404, which this door reads as
367
+ // already-gone. That is what makes a retried timeout safe here and unsafe on a create.
368
+ retrySafe: true,
224
369
  });
225
370
  }
226
371
  /**
@@ -229,14 +374,17 @@ export class HttpApiReadClient {
229
374
  * transport error.
230
375
  */
231
376
  async restDeclaredErasureCall(executionContext, compiled) {
232
- const access = this.resolveAccess(executionContext);
377
+ const access = await this.resolveAccess(executionContext);
233
378
  const response = await this.rawCallTolerating404({
234
379
  method: compiled.method,
235
380
  url: `${access.baseUrl}${compiled.path}`,
236
381
  headers: { Accept: 'application/json', ...access.headers },
237
- jsonBody: compiled.jsonRpc
238
- ? { jsonrpc: '2.0', method: compiled.jsonRpc.rpcMethod, params: {}, id: 1 }
382
+ body: compiled.jsonRpc
383
+ ? { encoding: HttpApiTransportBodyEncoding.JSON, value: { jsonrpc: '2.0', method: compiled.jsonRpc.rpcMethod, params: {}, id: 1 } }
239
384
  : undefined,
385
+ // A declared erasure addresses ONE row by key and is idempotent for the same reason the
386
+ // OData delete above is; the repository's own remediation for a partial failure is a re-run.
387
+ retrySafe: true,
240
388
  });
241
389
  if (compiled.jsonRpc && response !== undefined) {
242
390
  const envelope = response;
@@ -1 +1 @@
1
- {"version":3,"file":"http-api-read-client.backend.js","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/http-api-read-client.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `HttpApiReadClient` — THE one implementation of the HTTP-API dialect mechanics\n * (partial-resource paper, PR-29): provider-access resolution, transport execution (timeout /\n * bounded retry / rate budget), the per-dialect wire framing (OData GET, REST_JSON GET/POST +\n * JSON-RPC envelope semantics, Odoo `execute_kw` with the `common.authenticate` handshake and\n * the instance-cached uid), and the 404-as-null read tolerance.\n *\n * TWO consumers, by design: the VIRTUAL repository (`http-api-resource-repository`) and the\n * pipeline extraction source (P-2). The declaration layer is split on purpose — a pipeline is\n * not a persistence adapter — but the runtime middle must be structurally un-duplicable: this\n * class is where \"same mechanism\" stops being a discipline and becomes a fact. The drift pin\n * (`http-api-read-client.single-authority.test.ts`) refuses a second `authenticate` handshake\n * anywhere in the directory.\n *\n * Everything above the wire stays with the consumer: T-set translation, projection, scope\n * checks, audit emission, erasure orchestration, mapping/loading. This class never widens or\n * narrows a query and never interprets a ROW — it moves compiled requests and returns parsed\n * bodies.\n */\n\nimport type {\n HttpApiResourceBinding,\n} from '@wildo-ai/saas-models/external-data';\n\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\n\nimport {\n HttpApiRateBudget,\n HttpApiTransportError,\n HttpApiTransportFailureKind,\n executeHttpApiTransportCall,\n type HttpApiFetchLike,\n type HttpApiTransportRequest,\n} from './http-api-transport.backend';\nimport type { ODataCompiledRequest } from './odata-query-compiler.backend';\nimport type { RestJsonCompiledErasureRequest, RestJsonCompiledRequest } from './rest-json-query-compiler.backend';\nimport type { OdooCompiledCall } from './odoo-jsonrpc-compiler.backend';\nimport {\n HttpApiRemoteContractError,\n resolveHttpApiResultPath,\n} from './http-api-row-projection.backend';\nimport {\n HttpApiProviderAccessError,\n type HttpApiProviderAccess,\n type HttpApiProviderAccessResolver,\n} from './http-api-provider-access.backend';\n\n/** Default fetch over the platform global (Node ≥18); injectable for tests. */\nexport const defaultHttpApiFetch: HttpApiFetchLike = async (url, init) => {\n const response = await fetch(url, init as RequestInit);\n return { status: response.status, ok: response.ok, text: () => response.text() };\n};\n\nexport class HttpApiReadClient {\n private readonly rateBudget: HttpApiRateBudget;\n\n /**\n * The authenticated uid for this binding's credentials, resolved once per client instance\n * through the documented `common.authenticate(db, login, api_key, {})` handshake and cached —\n * clients are constructed once per consumer and the credential set is instance-stable. A\n * credential rotation therefore needs a process restart in slice 1 (recorded; an invalidation\n * hook belongs with the runtime-proof work, measured against real session-expiry behavior).\n */\n private odooAuthenticatedUid?: number;\n\n constructor(\n private readonly binding: HttpApiResourceBinding,\n private readonly providerAccessResolver: HttpApiProviderAccessResolver,\n private readonly fetchImpl: HttpApiFetchLike = defaultHttpApiFetch,\n ) {\n this.rateBudget = new HttpApiRateBudget(binding.remoteCallSemantics.maxRequestsPerMinute);\n }\n\n public resolveAccess(executionContext: ExecutionContext<any>): HttpApiProviderAccess {\n return this.providerAccessResolver.resolveAccess(this.binding, executionContext);\n }\n\n // ── OData ────────────────────────────────────────────────────────────────────\n\n public async odataGet(executionContext: ExecutionContext<any>, compiled: ODataCompiledRequest): Promise<unknown> {\n const access = this.resolveAccess(executionContext);\n const response = await executeHttpApiTransportCall(\n this.buildODataRequest(access, compiled), this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget,\n );\n return response.json;\n }\n\n public async odataGetOrNull(executionContext: ExecutionContext<any>, compiled: ODataCompiledRequest): Promise<unknown | null> {\n try {\n return await this.odataGet(executionContext, compiled);\n } catch (error) {\n if (error instanceof HttpApiTransportError && error.detail.status === 404) return null;\n throw error;\n }\n }\n\n /**\n * Follow an OData server-driven paging link (`@odata.nextLink`) — the drift-safe extraction\n * paging the v3.1 discipline mandates. The link is the server's own absolute (or\n * service-relative) continuation URL; nothing is compiled locally.\n */\n public async odataGetByUrl(executionContext: ExecutionContext<any>, url: string): Promise<unknown> {\n const access = this.resolveAccess(executionContext);\n const absoluteUrl = url.startsWith('http') ? url : `${access.baseUrl}${url.startsWith('/') ? '' : '/'}${url}`;\n const response = await executeHttpApiTransportCall(\n { method: 'GET', url: absoluteUrl, headers: { Accept: 'application/json', ...access.headers } },\n this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget,\n );\n return response.json;\n }\n\n /**\n * `GET /$metadata` as raw XML text — the WARN-only schema-drift probe's input (partial-resource\n * paper, PR-21). Deliberately OUTSIDE the JSON transport: the EDMX document is XML, and the\n * transport treats a 2xx non-JSON body as a contract failure — correct for every data read,\n * wrong for this one diagnostic document. One plain fetch, no retry, no rate-budget draw\n * (a diagnostic must never spend the data path's budget), and EVERY failure — non-200, network\n * error, a server that does not serve `$metadata` at all — answers `null`: the probe's caller\n * treats null as \"nothing to compare\", never as drift.\n */\n public async odataMetadataText(executionContext: ExecutionContext<any>): Promise<string | null> {\n try {\n const access = this.resolveAccess(executionContext);\n const response = await this.fetchImpl(`${access.baseUrl}/$metadata`, {\n method: 'GET',\n headers: { Accept: 'application/xml', ...access.headers },\n });\n if (response.status !== 200) return null;\n return await response.text();\n } catch {\n return null;\n }\n }\n\n private buildODataRequest(access: { baseUrl: string; headers: Record<string, string> }, compiled: ODataCompiledRequest): HttpApiTransportRequest {\n const search = Object.entries(compiled.params)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&');\n return {\n method: 'GET',\n url: `${access.baseUrl}${compiled.path}${search.length > 0 ? `?${search}` : ''}`,\n headers: { Accept: 'application/json', ...access.headers },\n };\n }\n\n // ── REST_JSON ────────────────────────────────────────────────────────────────\n\n public async restJson(executionContext: ExecutionContext<any>, compiled: RestJsonCompiledRequest): Promise<unknown> {\n const access = this.resolveAccess(executionContext);\n const response = await executeHttpApiTransportCall(\n this.buildRestJsonRequest(access, compiled), this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget,\n );\n if (compiled.jsonRpc) {\n const envelope = response.json as { result?: unknown; error?: { code?: number; message?: string } };\n if (envelope && typeof envelope === 'object' && envelope.error) {\n throw new HttpApiTransportError(\n `JSON-RPC error from the target: ${envelope.error.message ?? 'unknown'} (code ${envelope.error.code ?? '?'})`,\n { url: compiled.path, method: 'POST', attempts: 1, kind: HttpApiTransportFailureKind.REMOTE_ERROR },\n );\n }\n return envelope?.result;\n }\n return response.json;\n }\n\n /**\n * Single-row REST read with the dialect's no-row semantics: a remote 404, and a `null`/`false`\n * payload at the declared resultPath, are the target's honest \"no row\"; an ABSENT leaf is a\n * contract breach, never a silent not-found.\n */\n public async restJsonReadOrNull(executionContext: ExecutionContext<any>, compiled: RestJsonCompiledRequest): Promise<unknown | null> {\n try {\n const body = await this.restJson(executionContext, compiled);\n const payload = resolveHttpApiResultPath(body, compiled.resultPath);\n if (payload === null || payload === false) return null;\n if (payload === undefined) {\n throw new HttpApiRemoteContractError(\n `The remote read answered 200 but the declared resultPath '${compiled.resultPath ?? '(body)'}' resolves to nothing.`,\n );\n }\n return payload;\n } catch (error) {\n if (error instanceof HttpApiTransportError && error.detail.status === 404) return null;\n throw error;\n }\n }\n\n private buildRestJsonRequest(access: { baseUrl: string; headers: Record<string, string> }, compiled: RestJsonCompiledRequest): HttpApiTransportRequest {\n if (compiled.jsonRpc) {\n return {\n method: 'POST',\n url: `${access.baseUrl}${compiled.path}`,\n headers: { Accept: 'application/json', ...access.headers },\n jsonBody: { jsonrpc: '2.0', method: compiled.jsonRpc.rpcMethod, params: compiled.params, id: 1 },\n };\n }\n if (compiled.method === 'POST') {\n return {\n method: 'POST',\n url: `${access.baseUrl}${compiled.path}`,\n headers: { Accept: 'application/json', ...access.headers },\n jsonBody: compiled.params,\n };\n }\n const search = Object.entries(compiled.params)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&');\n return {\n method: 'GET',\n url: `${access.baseUrl}${compiled.path}${search.length > 0 ? `?${search}` : ''}`,\n headers: { Accept: 'application/json', ...access.headers },\n };\n }\n\n // ── Odoo execute_kw ──────────────────────────────────────────────────────────\n\n public async odooExecuteKw(executionContext: ExecutionContext<any>, call: OdooCompiledCall): Promise<unknown> {\n const access = this.resolveAccess(executionContext);\n const credentials = access.jsonRpcInArgsCredentials;\n if (!credentials) {\n // An ODOO_JSONRPC binding on a provider whose contract declares no in-args auth cannot\n // authenticate at all — the header credential is unread by `/jsonrpc`.\n throw new HttpApiProviderAccessError(\n `Provider '${this.binding.providerRef}' declares no jsonRpcInArgsAuth on its rest contract, but this binding speaks ODOO_JSONRPC — `\n + 'the target authenticates INSIDE the RPC args; declare jsonRpcInArgsAuth (dbEnvVarName, loginEnvVarName) on the provider module.',\n );\n }\n\n if (this.odooAuthenticatedUid === undefined) {\n const uid = await this.executeOdooRpc(access, 'common', 'authenticate', [\n credentials.db, credentials.login, credentials.apiKey, {},\n ]);\n if (typeof uid !== 'number' || !Number.isInteger(uid) || uid <= 0) {\n // Odoo answers `false` for rejected credentials — a terminal answer, spelled loudly.\n throw new HttpApiProviderAccessError(\n `Odoo rejected the credentials for provider '${this.binding.providerRef}' (db '${credentials.db}', login '${credentials.login}'): `\n + `authenticate answered ${JSON.stringify(uid)} instead of a uid.`,\n );\n }\n this.odooAuthenticatedUid = uid;\n }\n\n return this.executeOdooRpc(access, 'object', 'execute_kw', [\n credentials.db,\n this.odooAuthenticatedUid,\n credentials.apiKey,\n this.binding.entityRef,\n call.method,\n call.positionalArgs,\n call.kwargs,\n ]);\n }\n\n private async executeOdooRpc(\n access: { baseUrl: string; headers: Record<string, string> },\n service: string,\n method: string,\n args: unknown[],\n ): Promise<unknown> {\n const response = await executeHttpApiTransportCall(\n {\n method: 'POST',\n url: `${access.baseUrl}/jsonrpc`,\n headers: { Accept: 'application/json', ...access.headers },\n jsonBody: { jsonrpc: '2.0', method: 'call', params: { service, method, args }, id: 1 },\n },\n this.binding.remoteCallSemantics,\n this.fetchImpl,\n this.rateBudget,\n );\n const envelope = response.json as { result?: unknown; error?: { code?: number; message?: string; data?: { message?: string } } };\n if (envelope && typeof envelope === 'object' && envelope.error) {\n throw new HttpApiTransportError(\n `Odoo JSON-RPC error: ${envelope.error.data?.message ?? envelope.error.message ?? 'unknown'} (code ${envelope.error.code ?? '?'})`,\n { url: '/jsonrpc', method: 'POST', attempts: 1, kind: HttpApiTransportFailureKind.REMOTE_ERROR },\n );\n }\n return envelope?.result;\n }\n\n // ── Erasure-family calls (stance 6b — the door ORCHESTRATES, the client frames) ──\n\n /** OData's canonical `DELETE /EntitySet(key)`; a 404 is the row already gone (idempotent). */\n public async odataDeleteByPath(executionContext: ExecutionContext<any>, path: string): Promise<void> {\n const access = this.resolveAccess(executionContext);\n await this.rawCallTolerating404({\n method: 'DELETE',\n url: `${access.baseUrl}${path}`,\n headers: { Accept: 'application/json', ...access.headers },\n });\n }\n\n /**\n * One declared REST_JSON erasure call (stance 6b explicit spec): frames method/path/RPC\n * envelope, tolerates 404 as already-gone, and surfaces a JSON-RPC error envelope as a\n * transport error.\n */\n public async restDeclaredErasureCall(\n executionContext: ExecutionContext<any>,\n compiled: RestJsonCompiledErasureRequest,\n ): Promise<void> {\n const access = this.resolveAccess(executionContext);\n const response = await this.rawCallTolerating404({\n method: compiled.method,\n url: `${access.baseUrl}${compiled.path}`,\n headers: { Accept: 'application/json', ...access.headers },\n jsonBody: compiled.jsonRpc\n ? { jsonrpc: '2.0', method: compiled.jsonRpc.rpcMethod, params: {}, id: 1 }\n : undefined,\n });\n if (compiled.jsonRpc && response !== undefined) {\n const envelope = response as { error?: { code?: number; message?: string } };\n if (envelope && typeof envelope === 'object' && envelope.error) {\n throw new HttpApiTransportError(\n `JSON-RPC error from the declared erasure operation: ${envelope.error.message ?? 'unknown'} (code ${envelope.error.code ?? '?'})`,\n { url: compiled.path, method: compiled.method, attempts: 1, kind: HttpApiTransportFailureKind.REMOTE_ERROR },\n );\n }\n }\n }\n\n // ── Generic transport ────────────────────────────────────────────────────────\n\n /** One transport call, body parsed; the caller frames the request. */\n public async rawCall(request: HttpApiTransportRequest): Promise<unknown> {\n const response = await executeHttpApiTransportCall(\n request, this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget,\n );\n return response.json;\n }\n\n /** As {@link rawCall}, tolerating a remote 404 as \"already gone\" (idempotent deletes). */\n public async rawCallTolerating404(request: HttpApiTransportRequest): Promise<unknown> {\n try {\n return await this.rawCall(request);\n } catch (error) {\n if (error instanceof HttpApiTransportError && error.detail.status === 404) return undefined;\n throw error;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"http-api-read-client.backend.js","sourceRoot":"","sources":["../../../../../../../src/base-classes/services/repositories/http-api/http-api-read-client.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `HttpApiReadClient` — THE one implementation of the HTTP-API dialect mechanics\n * (partial-resource paper, PR-29): provider-access resolution, transport execution (timeout /\n * bounded retry / rate budget), the per-dialect wire framing (OData GET, REST_JSON GET/POST +\n * JSON-RPC envelope semantics, Odoo `execute_kw` with the `common.authenticate` handshake and\n * the credential-keyed cached uid), and the 404-as-null read tolerance.\n *\n * TWO consumers, by design: the VIRTUAL repository (`http-api-resource-repository`) and the\n * pipeline extraction source (P-2). The declaration layer is split on purpose — a pipeline is\n * not a persistence adapter — but the runtime middle must be structurally un-duplicable: this\n * class is where \"same mechanism\" stops being a discipline and becomes a fact. The drift pin\n * (`http-api-read-client.single-authority.test.ts`) refuses a second `authenticate` handshake\n * anywhere in the directory.\n *\n * Everything above the wire stays with the consumer: T-set translation, projection, scope\n * checks, audit emission, erasure orchestration, mapping/loading. This class never widens or\n * narrows a query and never interprets a ROW — it moves compiled requests and returns parsed\n * bodies.\n */\n\nimport { createHash } from 'node:crypto';\n\nimport {\n ExternalProvider_Connection_DelegationMode,\n ExternalProvider_Connection_OwnerScope,\n} from '@wildo-ai/external-connectors-models';\nimport {\n ExternalProvider_ConnectionTargetSchema,\n type ExternalProvider_ConnectionTarget,\n} from '@wildo-ai/external-connectors-models';\nimport type {\n HttpApiResourceBinding,\n} from '@wildo-ai/saas-models/external-data';\n\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\n\nimport {\n HttpApiRateBudget,\n HttpApiTransportBodyEncoding,\n HttpApiTransportError,\n HttpApiTransportFailureKind,\n executeHttpApiTransportCall,\n type HttpApiFetchLike,\n type HttpApiTransportRequest,\n} from './http-api-transport.backend';\nimport type { ODataCompiledRequest } from './odata-query-compiler.backend';\nimport type { RestJsonCompiledErasureRequest, RestJsonCompiledRequest } from './rest-json-query-compiler.backend';\nimport type { OdooCompiledCall } from './odoo-jsonrpc-compiler.backend';\nimport {\n HttpApiRemoteContractError,\n resolveHttpApiResultPath,\n} from './http-api-row-projection.backend';\nimport {\n HttpApiProviderAccessError,\n type HttpApiProviderAccess,\n type HttpApiProviderAccessResolver,\n} from './http-api-provider-access.backend';\n\n/** Default fetch over the platform global (Node ≥18); injectable for tests. */\nexport const defaultHttpApiFetch: HttpApiFetchLike = async (url, init) => {\n const response = await fetch(url, init as RequestInit);\n return { status: response.status, ok: response.ok, text: () => response.text() };\n};\n\n/**\n * The binding's declared connection SHAPE, plus the instance ids this execution supplies — ONE\n * place, deliberately.\n *\n * ## What changed, and why the refusal that used to live here is gone\n *\n * This function used to refuse every delegated binding, naming a missing subsystem: \"the engine has\n * no outbound per-user token store\". That was true when it was written and is not any more — the\n * store exists, is bound, and serves the connection controller (#333). What actually blocked the\n * lift was narrower: the binding carried a two-valued `identityMode`, and `USER_DELEGATED` cannot\n * say WHOSE ACCOUNT is spent. A user's own grant (`USER × SERVICE`) and a tenant's registration\n * acting for one of its members (`ORGANIZATION × USER`) are both \"per-user OAuth\" and resolve\n * different credentials, so mapping the one field would have silently picked a lane. The binding\n * now carries the shape itself, and this function only has to source the instances.\n *\n * ## The ids come from the EXECUTION, and that is not the resolver reading ambient context\n *\n * `ExternalProvider_ConnectionTarget`'s own contract says a target is supplied BY THE CALL and never\n * invented by the resolver, because \"the resolver cannot verify a target it also invented\". This is\n * the call side of that split: an httpApiBinding read is triggered by a resource operation, so the\n * organization and the user it runs for ARE the execution's, and naming them here is what leaves the\n * resolver free to authorize them. It refuses rather than falling back — an absent organization on a\n * tenant-owned binding must not quietly become the application's account, which is the exact\n * mis-attribution `resolveProviderSecretForConnection` exists to prevent.\n *\n * ## The rules are the SCHEMA's\n *\n * Every refusal below comes from `ExternalProvider_ConnectionTargetSchema`'s own refinements, which\n * already say — better than a re-statement here would — that an instance-owned connection names\n * which instance, that an application-owned one has no id to name, and that a delegated call must\n * name the user it acts for. Re-deriving them here would be a second copy that drifts.\n */\nfunction connectionTargetForBinding(\n binding: Pick<HttpApiResourceBinding, 'providerRef' | 'connection'>,\n executionContext: ExecutionContext<any>,\n): ExternalProvider_ConnectionTarget {\n const { ownerScope, delegation } = binding.connection;\n const initiator = executionContext.initiatorIds;\n\n const ownerId = ownerScope === ExternalProvider_Connection_OwnerScope.ORGANIZATION\n ? initiator?.organizationId\n : ownerScope === ExternalProvider_Connection_OwnerScope.USER\n ? initiator?.userId\n : undefined;\n\n const candidate = {\n ownerScope,\n delegation,\n ...(ownerId === undefined ? {} : { ownerId }),\n ...(delegation === ExternalProvider_Connection_DelegationMode.USER && initiator?.userId !== undefined\n ? { actingForUserId: initiator.userId }\n : {}),\n };\n\n const parsed = ExternalProvider_ConnectionTargetSchema.safeParse(candidate);\n if (!parsed.success) {\n throw new HttpApiProviderAccessError(\n `The binding toward provider '${binding.providerRef}' declares a ${ownerScope} × ${delegation} connection, `\n + 'and this execution cannot supply what that names: '\n + parsed.error.issues.map((issue) => issue.message).join(' ')\n + ' Either trigger the read from an execution that carries them, or declare a connection the application can satisfy alone.',\n );\n }\n return parsed.data;\n}\n\nexport class HttpApiReadClient {\n private readonly rateBudget: HttpApiRateBudget;\n\n /**\n * The authenticated uid, KEYED ON the credential it was minted under rather than merely\n * remembered against this instance.\n *\n * The uid comes from the documented `common.authenticate(db, login, api_key, {})` handshake and\n * is worth caching: the virtual repository builds ONE client per binding and keeps it for the\n * process lifetime (`http-api-resource-repository.backend.service.ts:163`), so re-authenticating\n * per call would double every read's round trips.\n *\n * What it must never do is outlive the credential. `resolveAccess` runs on EVERY call and reads\n * the secret afresh (environment, provider registry, or a tenant credential row), so a rotation\n * genuinely reaches this class — and a uid remembered against the instance would then be an\n * identity minted under the retired credential, presented on every subsequent `execute_kw`.\n *\n * Keying the cache on the credential is what makes that unrepresentable, and it is deliberately\n * preferred over an `invalidate()` some rotation path has to remember to call: there is no\n * enumeration of rotation sites to get wrong, because a changed credential simply misses. Note\n * the key includes `baseUrl` — a uid is a `res.users` row id on ONE database on ONE instance, so\n * repointing the binding at another host must not reuse it either.\n *\n * The key is a SHA-256 of the tuple rather than the tuple itself, so the API key is not held\n * alive on a long-lived field beyond the call that resolved it. The hash is per `execute_kw`\n * call and costs microseconds against a network round trip.\n *\n * ONE slot, not a map. A map would save a handshake when a credential the client has already\n * seen comes back, at the cost of accumulating one secret-derived entry per retired credential\n * for the lifetime of the process — an unbounded set, to avoid a round trip nobody has measured.\n * A binding names one credential at a time, so the slot is single and a rollback re-authenticates.\n *\n * The single slot stays SAFE now that an Odoo binding MAY name a tenant-owned target (#333, which\n * widened `connectionTargetForBinding` from the `APPLICATION` pin it used to hold). Alternating\n * tenants each miss the key and pay a handshake — slower, and never one tenant acting under\n * another tenant's uid, which is what an instance-remembered uid would have become the moment the\n * scope widened. The key is the credential, so the widening cost a round trip and no correctness.\n *\n * This replaces the slice-1 note that said a rotation needs a process restart, and with it the\n * owed work to \"measure against real session-expiry behavior\". That measurement was owed for an\n * invalidation TRIGGER, and this design needs no trigger. It also has nothing to expire against:\n * `execute_kw` below re-presents `db` + `uid` + `apiKey` in the args of every single call, so\n * there is no server-side session here whose lifetime we could be racing — the only thing that\n * can retire the uid is the credential (or the instance) it names, which is exactly the key.\n */\n private odooAuthenticatedIdentity?: { credentialKey: string; uid: number };\n\n constructor(\n private readonly binding: HttpApiResourceBinding,\n private readonly providerAccessResolver: HttpApiProviderAccessResolver,\n private readonly fetchImpl: HttpApiFetchLike = defaultHttpApiFetch,\n ) {\n this.rateBudget = new HttpApiRateBudget(binding.remoteCallSemantics.maxRequestsPerMinute);\n }\n\n /**\n * `async`, so a target this execution cannot satisfy REJECTS rather than throwing synchronously.\n *\n * `connectionTargetForBinding` refuses before the port is reached, and a synchronous throw out of\n * a `Promise`-returning method escapes every `.catch()` a caller attaches — the failure would land\n * as an unhandled exception in whichever frame happened to call it without `await`. The keyword is\n * the whole fix.\n */\n public async resolveAccess(executionContext: ExecutionContext<any>): Promise<HttpApiProviderAccess> {\n return this.providerAccessResolver.resolveAccess(\n this.binding.providerRef,\n connectionTargetForBinding(this.binding, executionContext),\n executionContext,\n );\n }\n\n // ── OData ────────────────────────────────────────────────────────────────────\n\n public async odataGet(executionContext: ExecutionContext<any>, compiled: ODataCompiledRequest): Promise<unknown> {\n const access = await this.resolveAccess(executionContext);\n const response = await executeHttpApiTransportCall(\n this.buildODataRequest(access, compiled), this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget,\n );\n return response.json;\n }\n\n public async odataGetOrNull(executionContext: ExecutionContext<any>, compiled: ODataCompiledRequest): Promise<unknown | null> {\n try {\n return await this.odataGet(executionContext, compiled);\n } catch (error) {\n if (error instanceof HttpApiTransportError && error.detail.status === 404) return null;\n throw error;\n }\n }\n\n /**\n * Follow an OData server-driven paging link (`@odata.nextLink`) — the drift-safe extraction\n * paging the v3.1 discipline mandates. The link is the server's own absolute (or\n * service-relative) continuation URL; nothing is compiled locally.\n */\n public async odataGetByUrl(executionContext: ExecutionContext<any>, url: string): Promise<unknown> {\n const access = await this.resolveAccess(executionContext);\n const absoluteUrl = url.startsWith('http') ? url : `${access.baseUrl}${url.startsWith('/') ? '' : '/'}${url}`;\n const response = await executeHttpApiTransportCall(\n // A paging continuation is a read: safe to re-send after a timeout.\n { method: 'GET', url: absoluteUrl, headers: { Accept: 'application/json', ...access.headers }, retrySafe: true },\n this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget,\n );\n return response.json;\n }\n\n /**\n * `GET /$metadata` as raw XML text — the WARN-only schema-drift probe's input (partial-resource\n * paper, PR-21). Deliberately OUTSIDE the JSON transport: the EDMX document is XML, and the\n * transport treats a 2xx non-JSON body as a contract failure — correct for every data read,\n * wrong for this one diagnostic document. One plain fetch, no retry, no rate-budget draw\n * (a diagnostic must never spend the data path's budget), and EVERY failure — non-200, network\n * error, a server that does not serve `$metadata` at all — answers `null`: the probe's caller\n * treats null as \"nothing to compare\", never as drift.\n */\n public async odataMetadataText(executionContext: ExecutionContext<any>): Promise<string | null> {\n try {\n const access = await this.resolveAccess(executionContext);\n const response = await this.fetchImpl(`${access.baseUrl}/$metadata`, {\n method: 'GET',\n headers: { Accept: 'application/xml', ...access.headers },\n });\n if (response.status !== 200) return null;\n return await response.text();\n } catch {\n return null;\n }\n }\n\n private buildODataRequest(access: { baseUrl: string; headers: Record<string, string> }, compiled: ODataCompiledRequest): HttpApiTransportRequest {\n const search = Object.entries(compiled.params)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&');\n return {\n method: 'GET',\n url: `${access.baseUrl}${compiled.path}${search.length > 0 ? `?${search}` : ''}`,\n headers: { Accept: 'application/json', ...access.headers },\n retrySafe: true,\n };\n }\n\n // ── REST_JSON ────────────────────────────────────────────────────────────────\n\n public async restJson(executionContext: ExecutionContext<any>, compiled: RestJsonCompiledRequest): Promise<unknown> {\n const access = await this.resolveAccess(executionContext);\n const response = await executeHttpApiTransportCall(\n this.buildRestJsonRequest(access, compiled), this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget,\n );\n if (compiled.jsonRpc) {\n const envelope = response.json as { result?: unknown; error?: { code?: number; message?: string } };\n if (envelope && typeof envelope === 'object' && envelope.error) {\n throw new HttpApiTransportError(\n `JSON-RPC error from the target: ${envelope.error.message ?? 'unknown'} (code ${envelope.error.code ?? '?'})`,\n { url: compiled.path, method: 'POST', attempts: 1, kind: HttpApiTransportFailureKind.REMOTE_ERROR },\n );\n }\n return envelope?.result;\n }\n return response.json;\n }\n\n /**\n * Single-row REST read with the dialect's no-row semantics: a remote 404, and a `null`/`false`\n * payload at the declared resultPath, are the target's honest \"no row\"; an ABSENT leaf is a\n * contract breach, never a silent not-found.\n */\n public async restJsonReadOrNull(executionContext: ExecutionContext<any>, compiled: RestJsonCompiledRequest): Promise<unknown | null> {\n try {\n const body = await this.restJson(executionContext, compiled);\n const payload = resolveHttpApiResultPath(body, compiled.resultPath);\n if (payload === null || payload === false) return null;\n if (payload === undefined) {\n throw new HttpApiRemoteContractError(\n `The remote read answered 200 but the declared resultPath '${compiled.resultPath ?? '(body)'}' resolves to nothing.`,\n );\n }\n return payload;\n } catch (error) {\n if (error instanceof HttpApiTransportError && error.detail.status === 404) return null;\n throw error;\n }\n }\n\n private buildRestJsonRequest(access: { baseUrl: string; headers: Record<string, string> }, compiled: RestJsonCompiledRequest): HttpApiTransportRequest {\n if (compiled.jsonRpc) {\n return {\n method: 'POST',\n url: `${access.baseUrl}${compiled.path}`,\n headers: { Accept: 'application/json', ...access.headers },\n body: { encoding: HttpApiTransportBodyEncoding.JSON, value: { jsonrpc: '2.0', method: compiled.jsonRpc.rpcMethod, params: compiled.params, id: 1 } },\n // POST-shaped, read by construction: the read compilers are the only producers of this\n // request and they compile nothing but reads, so re-sending it cannot duplicate a write.\n retrySafe: true,\n };\n }\n if (compiled.method === 'POST') {\n return {\n method: 'POST',\n url: `${access.baseUrl}${compiled.path}`,\n headers: { Accept: 'application/json', ...access.headers },\n body: { encoding: HttpApiTransportBodyEncoding.JSON, value: compiled.params },\n // Same argument as the JSON-RPC branch above: a POST-shaped SEARCH is still a read.\n retrySafe: true,\n };\n }\n const search = Object.entries(compiled.params)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&');\n return {\n method: 'GET',\n url: `${access.baseUrl}${compiled.path}${search.length > 0 ? `?${search}` : ''}`,\n headers: { Accept: 'application/json', ...access.headers },\n retrySafe: true,\n };\n }\n\n // ── Odoo execute_kw ──────────────────────────────────────────────────────────\n\n public async odooExecuteKw(executionContext: ExecutionContext<any>, call: OdooCompiledCall): Promise<unknown> {\n const access = await this.resolveAccess(executionContext);\n const credentials = access.jsonRpcInArgsCredentials;\n if (!credentials) {\n // An ODOO_JSONRPC binding on a provider whose contract declares no in-args auth cannot\n // authenticate at all — the header credential is unread by `/jsonrpc`.\n throw new HttpApiProviderAccessError(\n `Provider '${this.binding.providerRef}' declares no jsonRpcInArgsAuth on its rest contract, but this binding speaks ODOO_JSONRPC — `\n + 'the target authenticates INSIDE the RPC args; declare jsonRpcInArgsAuth (dbEnvVarName, loginEnvVarName) on the provider module.',\n );\n }\n\n // Resolved from THIS call's access, so a rotated credential produces a different key and the\n // cached identity below simply does not match — no invalidation call, and therefore no\n // rotation path that can forget to make one.\n const credentialKey = HttpApiReadClient.odooCredentialKey(access.baseUrl, credentials);\n let authenticatedUid = this.odooAuthenticatedIdentity?.credentialKey === credentialKey\n ? this.odooAuthenticatedIdentity.uid\n : undefined;\n\n if (authenticatedUid === undefined) {\n const uid = await this.executeOdooRpc(access, 'common', 'authenticate', [\n credentials.db, credentials.login, credentials.apiKey, {},\n ]);\n if (typeof uid !== 'number' || !Number.isInteger(uid) || uid <= 0) {\n // Odoo answers `false` for rejected credentials — a terminal answer, spelled loudly.\n //\n // The previously cached identity is left alone rather than dropped: it belongs to a\n // DIFFERENT key (that is why we are here), so it can never be served for these\n // credentials, and keeping it means a rotation that is rolled back does not pay a second\n // handshake. Only a successful authenticate writes the field.\n throw new HttpApiProviderAccessError(\n `Odoo rejected the credentials for provider '${this.binding.providerRef}' (db '${credentials.db}', login '${credentials.login}'): `\n + `authenticate answered ${JSON.stringify(uid)} instead of a uid.`,\n );\n }\n authenticatedUid = uid;\n this.odooAuthenticatedIdentity = { credentialKey, uid };\n }\n\n return this.executeOdooRpc(access, 'object', 'execute_kw', [\n credentials.db,\n authenticatedUid,\n credentials.apiKey,\n this.binding.entityRef,\n call.method,\n call.positionalArgs,\n call.kwargs,\n ]);\n }\n\n /**\n * The identity a cached uid belongs to: the instance it was minted on, and the exact credential\n * it was minted with.\n *\n * `JSON.stringify` over the tuple rather than a joined string because JSON escapes each member,\n * so no combination of separators inside a db name, a login or a key can make two different\n * tuples produce one key.\n */\n private static odooCredentialKey(\n baseUrl: string,\n credentials: { db: string; login: string; apiKey: string },\n ): string {\n return createHash('sha256')\n .update(JSON.stringify([baseUrl, credentials.db, credentials.login, credentials.apiKey]))\n .digest('hex');\n }\n\n private async executeOdooRpc(\n access: { baseUrl: string; headers: Record<string, string> },\n service: string,\n method: string,\n args: unknown[],\n ): Promise<unknown> {\n const response = await executeHttpApiTransportCall(\n {\n method: 'POST',\n url: `${access.baseUrl}/jsonrpc`,\n headers: { Accept: 'application/json', ...access.headers },\n body: { encoding: HttpApiTransportBodyEncoding.JSON, value: { jsonrpc: '2.0', method: 'call', params: { service, method, args }, id: 1 } },\n // Two callers, both safe to repeat: `common.authenticate` (a pure question) and\n // `object.execute_kw` with a read method — the Odoo compiler emits `search_read`/\n // `search_count` and nothing that writes.\n retrySafe: true,\n },\n this.binding.remoteCallSemantics,\n this.fetchImpl,\n this.rateBudget,\n );\n const envelope = response.json as { result?: unknown; error?: { code?: number; message?: string; data?: { message?: string } } };\n if (envelope && typeof envelope === 'object' && envelope.error) {\n throw new HttpApiTransportError(\n `Odoo JSON-RPC error: ${envelope.error.data?.message ?? envelope.error.message ?? 'unknown'} (code ${envelope.error.code ?? '?'})`,\n { url: '/jsonrpc', method: 'POST', attempts: 1, kind: HttpApiTransportFailureKind.REMOTE_ERROR },\n );\n }\n return envelope?.result;\n }\n\n // ── Erasure-family calls (stance 6b — the door ORCHESTRATES, the client frames) ──\n\n /** OData's canonical `DELETE /EntitySet(key)`; a 404 is the row already gone (idempotent). */\n public async odataDeleteByPath(executionContext: ExecutionContext<any>, path: string): Promise<void> {\n const access = await this.resolveAccess(executionContext);\n await this.rawCallTolerating404({\n method: 'DELETE',\n url: `${access.baseUrl}${path}`,\n headers: { Accept: 'application/json', ...access.headers },\n // Idempotent by key: the second DELETE of a gone row answers 404, which this door reads as\n // already-gone. That is what makes a retried timeout safe here and unsafe on a create.\n retrySafe: true,\n });\n }\n\n /**\n * One declared REST_JSON erasure call (stance 6b explicit spec): frames method/path/RPC\n * envelope, tolerates 404 as already-gone, and surfaces a JSON-RPC error envelope as a\n * transport error.\n */\n public async restDeclaredErasureCall(\n executionContext: ExecutionContext<any>,\n compiled: RestJsonCompiledErasureRequest,\n ): Promise<void> {\n const access = await this.resolveAccess(executionContext);\n const response = await this.rawCallTolerating404({\n method: compiled.method,\n url: `${access.baseUrl}${compiled.path}`,\n headers: { Accept: 'application/json', ...access.headers },\n body: compiled.jsonRpc\n ? { encoding: HttpApiTransportBodyEncoding.JSON, value: { jsonrpc: '2.0', method: compiled.jsonRpc.rpcMethod, params: {}, id: 1 } }\n : undefined,\n // A declared erasure addresses ONE row by key and is idempotent for the same reason the\n // OData delete above is; the repository's own remediation for a partial failure is a re-run.\n retrySafe: true,\n });\n if (compiled.jsonRpc && response !== undefined) {\n const envelope = response as { error?: { code?: number; message?: string } };\n if (envelope && typeof envelope === 'object' && envelope.error) {\n throw new HttpApiTransportError(\n `JSON-RPC error from the declared erasure operation: ${envelope.error.message ?? 'unknown'} (code ${envelope.error.code ?? '?'})`,\n { url: compiled.path, method: compiled.method, attempts: 1, kind: HttpApiTransportFailureKind.REMOTE_ERROR },\n );\n }\n }\n }\n\n // ── Generic transport ────────────────────────────────────────────────────────\n\n /** One transport call, body parsed; the caller frames the request. */\n public async rawCall(request: HttpApiTransportRequest): Promise<unknown> {\n const response = await executeHttpApiTransportCall(\n request, this.binding.remoteCallSemantics, this.fetchImpl, this.rateBudget,\n );\n return response.json;\n }\n\n /** As {@link rawCall}, tolerating a remote 404 as \"already gone\" (idempotent deletes). */\n public async rawCallTolerating404(request: HttpApiTransportRequest): Promise<unknown> {\n try {\n return await this.rawCall(request);\n } catch (error) {\n if (error instanceof HttpApiTransportError && error.detail.status === 404) return undefined;\n throw error;\n }\n }\n}\n"]}