@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
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * Flow:
8
8
  * 1. Operation hook calls recordUsage() after successful operation
9
- * 2. Usage records are stored in DB (reportedToProvider: false)
9
+ * 2. Usage records are stored in DB (flushState: pending)
10
10
  * 3. Periodic flush (cron) aggregates and reports to provider
11
11
  * 4. Provider bills at the end of the billing period
12
12
  *
@@ -24,16 +24,39 @@ var __metadata = (this && this.__metadata) || function (k, v) {
24
24
  var __param = (this && this.__param) || function (paramIndex, decorator) {
25
25
  return function (target, key) { decorator(target, key, paramIndex); }
26
26
  };
27
+ var UsageMeteringBackendService_1;
27
28
  import { injectable, inject } from 'inversify';
28
- import { ProductType, SubscriptionStatus, CoreResourceType, CoreResourceOperation, } from '@wildo-ai/saas-models';
29
+ import { createHash } from 'node:crypto';
30
+ import { UsageSourceType, UsageRecordFlushState, UsageRecordUnreportableReason, ProductType, SubscriptionStatus, MeteringAggregationWindow, CoreResourceType, CoreResourceOperation, } from '@wildo-ai/saas-models';
29
31
  import { AbstractBillingBackendService } from '../../../billing/services/back-office/abstract-billing.backend.service.js';
30
- import { BILLING_SCOPE_TO_VARIANTS } from '../../../billing/services/custom-impl/billing-custom-impl-utils.backend.js';
32
+ import { BILLING_SCOPE_TO_VARIANTS, resolveBillingVariants } from '../../../billing/services/custom-impl/billing-custom-impl-utils.backend.js';
31
33
  import { SAAS_SERVICE_TYPES } from '../../../inject/models/service-types.js';
32
34
  // =====================================================
33
35
  // Service
34
36
  // =====================================================
35
37
  let UsageMeteringBackendService = class UsageMeteringBackendService extends AbstractBillingBackendService {
38
+ static { UsageMeteringBackendService_1 = this; }
36
39
  repositoriesRegistry;
40
+ /**
41
+ * How many rows one LIST page fetches while draining the pending set.
42
+ *
43
+ * A page size, never a cap: the drain pages until exhausted. It exists because a single query for an
44
+ * unbounded set is the shape that produced the `limit: 10000` this replaced.
45
+ */
46
+ static FLUSH_PAGE_SIZE = 500;
47
+ /**
48
+ * The runaway guard, in PAGES. Reaching it aborts the scope and reports nothing — see
49
+ * `listAllUnreportedRecords` for why a partial flush is worse than none.
50
+ *
51
+ * 2,000 pages is a million pending rows. That is not a busy hour, it is a flush that has not run for
52
+ * a long time, and the right response is a person rather than a bigger number.
53
+ */
54
+ static MAX_FLUSH_PAGES = 2_000;
55
+ /** First retry delay; each subsequent one multiplies by the product's `backoffMultiplier`. */
56
+ static RETRY_BASE_DELAY_MS = 250;
57
+ /** Per-run caches, held only for the duration of one `flushToProvider`. `null` means "looked up, absent". */
58
+ flushProductCache;
59
+ flushPeriodCache;
37
60
  constructor(logger, servicesRegistry, executionContextCreator, resourcesRegistry, errorBuilder, repositoriesRegistry) {
38
61
  super(logger, servicesRegistry, executionContextCreator, resourcesRegistry, errorBuilder);
39
62
  this.repositoriesRegistry = repositoriesRegistry;
@@ -55,6 +78,15 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
55
78
  * Stores locally — NOT reported to provider immediately.
56
79
  *
57
80
  * @param variants — resolved billing polymorphic variants for the target scope
81
+ * @returns whether a usage row was actually written.
82
+ *
83
+ * The return type was `void` until 2026-09-08 (#415), which was harmless only while nothing called
84
+ * this: the method DECLINES silently when the account holds no active metered subscription, so a
85
+ * caller could not distinguish "recorded" from "declined". The first real caller then reported the
86
+ * quantity it had ASKED for whichever happened — an operational counter claiming usage that was
87
+ * never written, the same shape as the discarded `modifiedCount` this file already fixed once in
88
+ * the flush. Caught by a pin rather than by a reading, which is the argument for writing the
89
+ * refusal cases as carefully as the success ones.
58
90
  */
59
91
  async recordUsage(variants, billingAccountId, productKey, quantity, options) {
60
92
  this.logDebug('Recording usage', { billingAccountId, productKey, quantity, scope: variants.scopeType });
@@ -65,7 +97,7 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
65
97
  productKey,
66
98
  scope: variants.scopeType,
67
99
  });
68
- return;
100
+ return false;
69
101
  }
70
102
  const ctx = await this.internalCtx(variants.usageRecord, CoreResourceOperation.CREATE);
71
103
  await this.servicesRegistry.create(variants.usageRecord, ctx, {
@@ -74,9 +106,109 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
74
106
  quantity,
75
107
  timestamp: new Date(),
76
108
  source: options?.source,
77
- reportedToProvider: false,
109
+ flushState: UsageRecordFlushState.PENDING,
78
110
  metadata: options?.metadata,
79
111
  });
112
+ return true;
113
+ }
114
+ /**
115
+ * Record usage declared by an OPERATION, resolving the scope, the billing account and the quantity
116
+ * from the operation's own execution context and result (#415).
117
+ *
118
+ * This is the caller `recordUsage` never had. Until it existed, a product could be declared METERED,
119
+ * priced and synced to the provider while nothing in the framework ever wrote a usage row — the
120
+ * only way to meter was to reach into this service by hand from a custom implementation, which is a
121
+ * workaround rather than an authoring surface.
122
+ *
123
+ * **Never throws.** It runs after a write has already committed, so a failure here must not turn a
124
+ * successful operation into an error the caller sees. Every refusal is a warning naming the product
125
+ * and the reason, because an unrecorded unit is revenue that will not be billed and the log line is
126
+ * the only thing that will ever say so.
127
+ *
128
+ * @returns the quantity recorded, or 0 when nothing was recorded — so a caller can log the outcome
129
+ * rather than assume it.
130
+ */
131
+ async recordDeclaredOperationUsage(declaration, executionContext, operationResult) {
132
+ try {
133
+ const variants = resolveBillingVariants(executionContext);
134
+ if (!variants) {
135
+ this.logger.warn('Declared metered usage not recorded: no billing scope on the execution context', {
136
+ productKey: declaration.productKey,
137
+ });
138
+ return 0;
139
+ }
140
+ const quantity = this.resolveDeclaredQuantity(declaration, operationResult);
141
+ if (quantity === undefined)
142
+ return 0;
143
+ // Zero is a legitimate outcome of a result-derived quantity — an export of nothing — and
144
+ // reporting it would be a meter event carrying no usage.
145
+ if (quantity === 0)
146
+ return 0;
147
+ const billingAccountId = await this.resolveBillingAccountIdForScope(variants, executionContext);
148
+ if (!billingAccountId) {
149
+ this.logger.warn('Declared metered usage not recorded: no billing account for this scope', {
150
+ productKey: declaration.productKey,
151
+ scope: variants.scopeType,
152
+ });
153
+ return 0;
154
+ }
155
+ // Honour what `recordUsage` REPORTS rather than what was asked for: it declines silently when
156
+ // the account holds no active metered subscription, and returning the requested quantity there
157
+ // would make the hook's own log claim usage that was never written.
158
+ const recorded = await this.recordUsage(variants, billingAccountId, declaration.productKey, quantity, {
159
+ source: {
160
+ // OPERATION, and this declaration is what that member was always for: usage generated by a
161
+ // resource operation succeeding, as opposed to a periodic RESOURCE_COUNT or a CUSTOM
162
+ // recording an application makes for itself.
163
+ type: UsageSourceType.OPERATION,
164
+ resourceType: String(executionContext.operation?.resourceIdentifier ?? ''),
165
+ operationIdentifier: String(executionContext.operation?.operationIdentifier ?? ''),
166
+ description: 'Declared on the operation configuration',
167
+ },
168
+ });
169
+ return recorded ? quantity : 0;
170
+ }
171
+ catch (error) {
172
+ this.logger.error('Failed to record declared metered usage', {
173
+ productKey: declaration.productKey,
174
+ message: error.message,
175
+ });
176
+ return 0;
177
+ }
178
+ }
179
+ /**
180
+ * The declared quantity: fixed, or read from the written row.
181
+ *
182
+ * A `quantityFromResultField` that does not resolve to a finite non-negative number records NOTHING
183
+ * and warns, rather than falling back to 1. Silently billing the wrong amount is worse than billing
184
+ * nothing and saying so — a fallback here would be a wrong number nobody could distinguish from a
185
+ * right one.
186
+ */
187
+ resolveDeclaredQuantity(declaration, operationResult) {
188
+ if (declaration.quantityFromResultField === undefined) {
189
+ return declaration.quantity ?? 1;
190
+ }
191
+ const raw = declaration.quantityFromResultField
192
+ .split('.')
193
+ .reduce((value, segment) => (value !== null && typeof value === 'object' ? value[segment] : undefined), operationResult);
194
+ if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 0) {
195
+ this.logger.warn('Declared metered usage not recorded: quantity field did not resolve to a usable number', {
196
+ productKey: declaration.productKey,
197
+ quantityFromResultField: declaration.quantityFromResultField,
198
+ resolvedType: typeof raw,
199
+ });
200
+ return undefined;
201
+ }
202
+ return raw;
203
+ }
204
+ /** The scope's billing account, addressed by the scope entity rather than by an id the caller supplies. */
205
+ async resolveBillingAccountIdForScope(variants, executionContext) {
206
+ const scopeEntityId = executionContext[variants.scopeKey];
207
+ if (!scopeEntityId)
208
+ return undefined;
209
+ const ctx = await this.internalCtx(variants.billingAccount, CoreResourceOperation.LIST);
210
+ const accounts = await this.servicesRegistry.list(variants.billingAccount, ctx, { [variants.scopeEntityDocField]: scopeEntityId }, { page: 1, limit: 1 });
211
+ return accounts[0]?._id;
80
212
  }
81
213
  /**
82
214
  * Get usage summary for a billing account.
@@ -95,6 +227,12 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
95
227
  }),
96
228
  };
97
229
  const ctx = await this.internalCtx(variants.usageRecord, CoreResourceOperation.LIST);
230
+ /*
231
+ * A SUMMARY read, and its cap is honest about being one: `getUsage` answers "roughly how much has
232
+ * this account used", for a dashboard. It is not the billing path — `flushToProvider` drains the
233
+ * pending set by paging and never truncates, because money depends on it. Keeping a cap here and
234
+ * removing it there is the distinction, not an inconsistency.
235
+ */
98
236
  const records = await this.servicesRegistry.list(variants.usageRecord, ctx, filters, { limit: 10000 });
99
237
  // Aggregate by product key
100
238
  const usage = {};
@@ -112,15 +250,23 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
112
250
  */
113
251
  async flushToProvider() {
114
252
  if (!this.billingProvider) {
115
- return { totalRecords: 0, reported: 0, failed: 0, errors: ['Provider not initialized'] };
253
+ return { totalRecords: 0, reported: 0, failed: 0, unreportable: 0, errors: ['Provider not initialized'], quantityRecorded: 0, quantityReported: 0, quantityUnreportable: 0 };
116
254
  }
117
255
  this.logDebug('Starting usage flush to provider');
118
256
  const result = {
119
257
  totalRecords: 0,
120
258
  reported: 0,
121
259
  failed: 0,
260
+ unreportable: 0,
122
261
  errors: [],
262
+ quantityRecorded: 0,
263
+ quantityReported: 0,
264
+ quantityUnreportable: 0,
123
265
  };
266
+ // Per-run caches. A flush touches the same handful of products and subscriptions repeatedly, and
267
+ // both lookups are needed PER GROUP; without these the policy read alone is one query per group.
268
+ this.flushProductCache = new Map();
269
+ this.flushPeriodCache = new Map();
124
270
  // Process each billing scope independently — usage records live in per-scope collections
125
271
  for (const [scopeKey, scopeData] of Object.entries(BILLING_SCOPE_TO_VARIANTS)) {
126
272
  const variants = { scopeKey, ...scopeData };
@@ -131,6 +277,34 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
131
277
  result.errors.push(`Flush error for scope ${variants.scopeType}: ${error.message}`);
132
278
  }
133
279
  }
280
+ /*
281
+ * The reconciliation check, stated as an ERROR rather than left to a reader of two numbers.
282
+ * Anything not reported is money not billed, and the run is the only moment at which the two
283
+ * quantities are both known.
284
+ */
285
+ /*
286
+ * Unreportable quantity is stated on its OWN line, and always — it is not an anomaly to be
287
+ * inferred from a mismatch. This is usage a customer generated and will never be billed for,
288
+ * which somebody may want to write off, invoice out of band, or simply know about. It appears
289
+ * exactly once per row, on the run that made the determination, because the row leaves the
290
+ * pending set at the same moment (#512).
291
+ */
292
+ if (result.quantityUnreportable > 0) {
293
+ result.errors.push(`UNREPORTABLE USAGE — ${result.quantityUnreportable} unit(s) across ${result.unreportable} record(s) were ` +
294
+ `permanently abandoned this run and will never be billed. The per-group lines above name the billing ` +
295
+ `accounts and the reason. Those rows are now marked unreportable and will not be selected again, so ` +
296
+ `THIS IS THE ONLY RUN THAT WILL REPORT THEM.`);
297
+ }
298
+ const quantityAccountedFor = result.quantityReported + result.quantityUnreportable;
299
+ if (quantityAccountedFor !== result.quantityRecorded) {
300
+ const shortfall = result.quantityRecorded - quantityAccountedFor;
301
+ result.errors.push(`RECONCILIATION MISMATCH — ${result.quantityRecorded} unit(s) of usage were pending, ` +
302
+ `${result.quantityReported} were reported to the provider and ${result.quantityUnreportable} were ` +
303
+ `determined unreportable (${shortfall > 0 ? `${shortfall} NEITHER billed nor accounted for` : `${-shortfall} billed in EXCESS`}). ` +
304
+ `The per-group errors above name which groups; every row left pending stays selectable by the next run.`);
305
+ }
306
+ this.flushProductCache = undefined;
307
+ this.flushPeriodCache = undefined;
134
308
  this.logDebug('Usage flush complete', { ...result });
135
309
  return result;
136
310
  }
@@ -138,83 +312,383 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
138
312
  // Private — Flush per scope
139
313
  // ════════════════════════════════════════════════════════════
140
314
  async flushScopeToProvider(variants, result) {
141
- // List unreported records from this scope's usage record collection
142
- const listCtx = await this.internalCtx(variants.usageRecord, CoreResourceOperation.LIST);
143
- const records = await this.servicesRegistry.list(variants.usageRecord, listCtx, { reportedToProvider: false }, { limit: 10000 });
315
+ const pending = await this.listAllUnreportedRecords(variants, result);
316
+ if (pending.length === 0)
317
+ return;
318
+ const records = await this.selectDueRecords(pending);
144
319
  result.totalRecords += records.length;
320
+ for (const record of records)
321
+ result.quantityRecorded += record.quantity;
145
322
  if (records.length === 0)
146
323
  return;
147
- // Aggregate by (billingAccountFkField value, productKey)
324
+ const groups = await this.buildFlushGroups(variants, records);
325
+ for (const group of groups) {
326
+ await this.reportGroup(variants, group, result);
327
+ }
328
+ }
329
+ /**
330
+ * Page through EVERY unreported row in this scope.
331
+ *
332
+ * The whole set is read before anything is reported, because aggregation is defined over the whole
333
+ * pending set and a page is not a meaningful unit of it.
334
+ *
335
+ * This replaced a single `{ limit: 10000 }` (#415). That cap did not fail when it was reached — it
336
+ * returned the first ten thousand rows and the run looked healthy, so the eleven-thousandth unit of
337
+ * usage was simply never billed and nothing anywhere said so. A cap that is reached is money not
338
+ * billed; the only honest cap is one that REFUSES.
339
+ */
340
+ async listAllUnreportedRecords(variants, result) {
341
+ const listCtx = await this.internalCtx(variants.usageRecord, CoreResourceOperation.LIST);
342
+ const collected = [];
343
+ for (let page = 1; page <= UsageMeteringBackendService_1.MAX_FLUSH_PAGES; page += 1) {
344
+ const pageRecords = await this.servicesRegistry.list(variants.usageRecord, listCtx, { flushState: UsageRecordFlushState.PENDING }, { page, limit: UsageMeteringBackendService_1.FLUSH_PAGE_SIZE });
345
+ collected.push(...pageRecords);
346
+ if (pageRecords.length < UsageMeteringBackendService_1.FLUSH_PAGE_SIZE)
347
+ return collected;
348
+ }
349
+ /*
350
+ * The runaway guard, and it reports NOTHING rather than reporting what it has. A partial flush
351
+ * would mark those rows reported and leave the rest for a next run that would hit the same wall,
352
+ * so the backlog would never drain while every run looked partially successful. Refusing keeps
353
+ * every row selectable and puts a human in front of the reason.
354
+ */
355
+ result.errors.push(`FLUSH ABORTED for scope ${variants.scopeType}: more than ` +
356
+ `${UsageMeteringBackendService_1.MAX_FLUSH_PAGES * UsageMeteringBackendService_1.FLUSH_PAGE_SIZE} unreported usage rows. ` +
357
+ `Nothing was reported for this scope — every row remains pending. This is a backlog, not a spike: ` +
358
+ `investigate why the scheduled flush stopped running before draining it.`);
359
+ return [];
360
+ }
361
+ /**
362
+ * Keep only the rows whose PRODUCT is due to be flushed, per its authored `flushIntervalMinutes`
363
+ * (#415).
364
+ *
365
+ * The field means "usage for this product should reach the provider within N minutes of being
366
+ * recorded", so a product is due when its OLDEST pending row has waited that long. Derived from the
367
+ * rows already in hand — no last-flush timestamp is stored anywhere, because storing one would be a
368
+ * second source of truth for something the rows already say, and one that can go stale.
369
+ *
370
+ * The batch runs on a cadence at least as fast as the shortest interval any product can author; this
371
+ * is what turns one shared schedule into per-product intervals. A product authoring 1440 accumulates
372
+ * for a day and produces one provider event instead of 288, which is what its author asked for.
373
+ *
374
+ * Note the ASYMMETRY, and it is deliberate: waiting is per product, but once ONE product is due its
375
+ * rows go now rather than at the next tick. Reporting sooner than authored is never wrong; later is.
376
+ */
377
+ async selectDueRecords(records) {
378
+ const oldestByProduct = new Map();
379
+ for (const record of records) {
380
+ const at = (record.timestamp instanceof Date ? record.timestamp : new Date(record.timestamp)).getTime();
381
+ const seen = oldestByProduct.get(record.productKey);
382
+ if (seen === undefined || at < seen)
383
+ oldestByProduct.set(record.productKey, at);
384
+ }
385
+ const now = Date.now();
386
+ const dueProducts = new Set();
387
+ for (const [productKey, oldest] of oldestByProduct) {
388
+ const policy = await this.resolveMeteringPolicy(productKey);
389
+ const intervalMinutes = policy?.flushIntervalMinutes;
390
+ // No authored policy means no authored patience: flush it on this tick, which is what every
391
+ // product did before the field was read.
392
+ if (intervalMinutes === undefined || now - oldest >= intervalMinutes * 60_000) {
393
+ dueProducts.add(productKey);
394
+ }
395
+ }
396
+ return records.filter((record) => dueProducts.has(record.productKey));
397
+ }
398
+ // ════════════════════════════════════════════════════════════
399
+ // Private — Grouping (the authored metering policy is READ here)
400
+ // ════════════════════════════════════════════════════════════
401
+ /**
402
+ * Turn pending rows into the groups that will each become one provider meter event, honouring the
403
+ * product's authored `metering` policy (#415).
404
+ *
405
+ * Until this existed the policy block was declared, defaulted, documented and read by NOTHING: every
406
+ * row was merged by (account, product) whatever the product said, so `preFlushAggregation: false`
407
+ * was unrepresentable and `aggregationWindow` chose between two behaviours that were the same one.
408
+ * Its own JSDoc said so and asked that the gap stay visible, which is why this comment says what
409
+ * replaced it.
410
+ *
411
+ * The policy is per PRODUCT, so two products flushing in the same run are grouped by their own
412
+ * rules — that is why the policy is resolved inside the loop rather than once for the run.
413
+ */
414
+ async buildFlushGroups(variants, records) {
148
415
  const billingAccountFk = variants.billingAccountFkField;
149
- const aggregateKey = (r) => `${r[billingAccountFk]}::${r.productKey}`;
150
- const aggregated = new Map();
416
+ const grouped = new Map();
417
+ const ungrouped = [];
151
418
  for (const record of records) {
152
- const key = aggregateKey(record);
153
- const existing = aggregated.get(key);
419
+ const billingAccountId = record[billingAccountFk];
420
+ const timestamp = record.timestamp instanceof Date ? record.timestamp : new Date(record.timestamp);
421
+ const policy = await this.resolveMeteringPolicy(record.productKey);
422
+ /*
423
+ * `preFlushAggregation: false` means exactly what it says: report each row on its own. It is the
424
+ * shape a product picks when the provider must see every event — because the provider's own
425
+ * aggregation differs from a sum, or because each event carries a distinct instant. Merging
426
+ * locally destroys both, irreversibly, before the provider ever sees them.
427
+ */
428
+ if (policy?.preFlushAggregation === false) {
429
+ ungrouped.push({
430
+ billingAccountId,
431
+ productKey: record.productKey,
432
+ quantity: record.quantity,
433
+ recordIds: [record._id],
434
+ latestTimestamp: timestamp,
435
+ });
436
+ continue;
437
+ }
438
+ /*
439
+ * `PER_BILLING_PERIOD` splits a group at a billing-period boundary. It is not a preference: a
440
+ * merged group carries ONE timestamp, and the provider assigns a meter event to the period that
441
+ * timestamp falls in — so merging across a boundary bills a whole period's usage into the wrong
442
+ * period. `PER_FLUSH` merges everything pending, which is right when a product's periods do not
443
+ * matter to how it is priced.
444
+ */
445
+ const periodStart = policy?.aggregationWindow === MeteringAggregationWindow.PER_BILLING_PERIOD
446
+ ? await this.resolvePeriodStartFor(variants, billingAccountId, record.productKey, timestamp)
447
+ : undefined;
448
+ const key = `${billingAccountId}::${record.productKey}::${periodStart?.toISOString() ?? 'all'}`;
449
+ const existing = grouped.get(key);
154
450
  if (existing) {
155
451
  existing.quantity += record.quantity;
156
452
  existing.recordIds.push(record._id);
453
+ if (timestamp > existing.latestTimestamp)
454
+ existing.latestTimestamp = timestamp;
157
455
  }
158
456
  else {
159
- aggregated.set(key, {
160
- billingAccountId: record[billingAccountFk],
457
+ grouped.set(key, {
458
+ billingAccountId,
161
459
  productKey: record.productKey,
162
460
  quantity: record.quantity,
163
461
  recordIds: [record._id],
462
+ latestTimestamp: timestamp,
463
+ periodStart,
164
464
  });
165
465
  }
166
466
  }
167
- // Report each aggregated group to provider via billing meter events
168
- for (const [, group] of aggregated) {
467
+ return [...grouped.values(), ...ungrouped];
468
+ }
469
+ // ════════════════════════════════════════════════════════════
470
+ // Private — Reporting one group
471
+ // ════════════════════════════════════════════════════════════
472
+ async reportGroup(variants, group, result) {
473
+ try {
474
+ const { accountExists, providerCustomerId } = await this.resolveProviderCustomer(variants, group.billingAccountId);
475
+ /*
476
+ * The billing account is GONE — permanent, and the reason the rows get a terminal state
477
+ * instead of another failure count (#512). Usage rows are RETAINED when their subject is
478
+ * erased, so this is a designed outcome rather than corruption; what was not designed was the
479
+ * flush treating it as retryable, which re-selected the same rows on every five-minute run,
480
+ * failed identically, and grew an error backlog no operator action could drain.
481
+ */
482
+ if (!accountExists) {
483
+ result.errors.push(`UNREPORTABLE — billing account ${group.billingAccountId} no longer exists (scope: ${variants.scopeType}), so ` +
484
+ `${group.quantity} unit(s) of ${group.productKey} usage across ${group.recordIds.length} record(s) can never be ` +
485
+ `reported. The rows are RETAINED for the tax/audit obligation and are being marked unreportable so the flush ` +
486
+ `stops re-selecting them.`);
487
+ await this.markGroupUnreportable(variants, group, UsageRecordUnreportableReason.BILLING_ACCOUNT_DELETED, result);
488
+ return;
489
+ }
490
+ /*
491
+ * The account exists but has no provider customer yet — TRANSIENT. Provisioning may still
492
+ * complete, so the rows stay pending and this stays a failure. Do not be tempted to reuse the
493
+ * terminal state here: it would abandon billable usage the moment a flush overtook an
494
+ * in-progress customer creation.
495
+ */
496
+ if (!providerCustomerId) {
497
+ result.errors.push(`No provider customer ID for billing account ${group.billingAccountId} (scope: ${variants.scopeType})`);
498
+ result.failed += group.recordIds.length;
499
+ return;
500
+ }
501
+ const policy = await this.resolveMeteringPolicy(group.productKey);
502
+ /*
503
+ * The meterEventName is derived from the product key.
504
+ * Convention: product key IS the meter event name (configured when creating the meter in Stripe).
505
+ *
506
+ * `timestamp` and `identifier` were BOTH omitted until 2026-09-08 (#415), and each omission was
507
+ * its own defect:
508
+ *
509
+ * - Without a timestamp the provider stamps the event with the moment the FLUSH ran, so usage
510
+ * recorded before a period boundary and flushed after it is billed to the wrong period. Every
511
+ * metered product was exposed to that, on every run that crossed a boundary.
512
+ * - Without an identifier a re-report is a SECOND charge. The whole duplicate-charge apparatus
513
+ * below exists because of that, and an identifier is the provider's own answer to it: a meter
514
+ * event carrying one that has already been seen is discarded. So a re-report of an identical
515
+ * group is now a no-op at the provider rather than money moving twice — which is a far better
516
+ * property than detecting the risk after the fact.
517
+ *
518
+ * The identifier is DERIVED FROM THE ROWS, not from the attempt, so a retry of the same group
519
+ * sends the same identifier while a genuinely different group cannot collide with it.
520
+ */
521
+ await this.reportWithRetry(policy, {
522
+ meterEventName: group.productKey,
523
+ providerCustomerId,
524
+ value: group.quantity,
525
+ timestamp: group.latestTimestamp,
526
+ identifier: this.buildUsageEventIdentifier(variants, group),
527
+ });
528
+ // Bulk-mark all records in this group as reported (single DB call).
529
+ //
530
+ // The `reportUsage` above ALREADY moved money — it is not retryable-for-free. The marking is
531
+ // what stops the next sweep from re-reporting the same usage, because the sweep selects on
532
+ // `flushState: pending`. So a PARTIAL marking is a duplicate-charge condition: any record
533
+ // that stayed unmarked will be picked up again and billed to the customer a second time.
534
+ //
535
+ // Honour `modifiedCount` rather than assuming success. Previously the return value was
536
+ // discarded and `result.reported` was incremented by the full group size, which made a partial
537
+ // marking both invisible and unfalsifiable — the operational counter reported success for
538
+ // records that were about to be re-billed.
539
+ const markedCount = await this.repositoriesRegistry.bulkUpdateForInfrastructure(variants.usageRecord, { _id: { $in: group.recordIds } },
540
+ // The adapter-neutral guarded-mutation descriptor. This was `{ $set: … }` — raw MongoDB —
541
+ // until `bulkUpdateForInfrastructure` became adapter-neutral; on a PostgreSQL-backed usage
542
+ // record the old path threw before marking anything, which is the duplicate-charge
543
+ // condition the block below exists to detect.
544
+ { set: { flushState: UsageRecordFlushState.REPORTED, reportedAt: new Date() } });
545
+ // Reported is reported: the provider has the quantity whatever the marking did.
546
+ result.quantityReported += group.quantity;
547
+ const unmarkedCount = group.recordIds.length - markedCount;
548
+ if (unmarkedCount > 0) {
549
+ /*
550
+ * Still loud, and still not a "retry me" — but no longer a duplicate CHARGE, because the
551
+ * identifier above makes the provider discard a repeat of this exact group. What survives is a
552
+ * repeat of a DIFFERENT group: the next sweep re-selects the unmarked rows, and if new usage
553
+ * has arrived meanwhile it aggregates them together into a group with a different identifier,
554
+ * which the provider will accept. So this is still an operator's problem, one step less severe.
555
+ */
556
+ result.errors.push(`PARTIAL MARKING — ${group.billingAccountId}/${group.productKey} (scope: ${variants.scopeType}): ` +
557
+ `usage of ${group.quantity} was REPORTED to the provider, but only ${markedCount}/${group.recordIds.length} ` +
558
+ `records could be marked as reported. A re-report of this exact group is idempotent at the provider ` +
559
+ `(same event identifier), but the next sweep may aggregate the ${unmarkedCount} unmarked record(s) with ` +
560
+ `NEW usage into a different group, which would be accepted and double-count them. Mark them manually.`);
561
+ result.failed += unmarkedCount;
562
+ }
563
+ result.reported += markedCount;
564
+ }
565
+ catch (error) {
566
+ result.errors.push(`${group.billingAccountId}/${group.productKey} (scope: ${variants.scopeType}): ${error.message}`);
567
+ result.failed += group.recordIds.length;
568
+ }
569
+ }
570
+ /**
571
+ * Report one meter event, honouring the product's authored `retryPolicy` (#415).
572
+ *
573
+ * `maxRetries` and `backoffMultiplier` were authored, defaulted and read by nothing — a provider
574
+ * blip failed the whole group and left it for the next scheduled run, which on a 60-minute schedule
575
+ * is an hour of unbilled usage for a fault that would have cleared in a second.
576
+ *
577
+ * The retry is SAFE only because of the idempotency identifier the caller supplies: a retry after a
578
+ * response that was lost in transit re-sends the same identifier, and the provider discards it. Retry
579
+ * without that is how a timeout becomes a double charge, which is why the two landed together.
580
+ */
581
+ async reportWithRetry(policy, request) {
582
+ const maxRetries = Math.max(0, policy?.retryPolicy?.maxRetries ?? 0);
583
+ const backoffMultiplier = policy?.retryPolicy?.backoffMultiplier ?? 2;
584
+ let attempt = 0;
585
+ for (;;) {
169
586
  try {
170
- // Resolve provider customer ID from billing account
171
- const providerCustomerId = await this.resolveProviderCustomerId(variants, group.billingAccountId);
172
- if (!providerCustomerId) {
173
- result.errors.push(`No provider customer ID for billing account ${group.billingAccountId} (scope: ${variants.scopeType})`);
174
- result.failed += group.recordIds.length;
175
- continue;
176
- }
177
- // The meterEventName is derived from the product key
178
- // Convention: product key IS the meter event name (configured when creating the meter in Stripe)
179
- await this.billingProvider.reportUsage({
180
- meterEventName: group.productKey,
181
- providerCustomerId,
182
- value: group.quantity,
587
+ await this.billingProvider.reportUsage(request);
588
+ return;
589
+ }
590
+ catch (error) {
591
+ if (attempt >= maxRetries)
592
+ throw error;
593
+ const delayMs = UsageMeteringBackendService_1.RETRY_BASE_DELAY_MS * Math.pow(backoffMultiplier, attempt);
594
+ this.logger.warn('Usage report failed, retrying', {
595
+ meterEventName: request.meterEventName,
596
+ attempt: attempt + 1,
597
+ maxRetries,
598
+ delayMs,
183
599
  });
184
- // Bulk-mark all records in this group as reported (single DB call).
185
- //
186
- // The `reportUsage` above ALREADY moved money — it is not retryable-for-free. The marking is
187
- // what stops the next sweep from re-reporting the same usage, because the sweep selects on
188
- // `reportedToProvider: false`. So a PARTIAL marking is a duplicate-charge condition: any record
189
- // that stayed unmarked will be picked up again and billed to the customer a second time.
190
- //
191
- // Honour `modifiedCount` rather than assuming success. Previously the return value was
192
- // discarded and `result.reported` was incremented by the full group size, which made a partial
193
- // marking both invisible and unfalsifiable — the operational counter reported success for
194
- // records that were about to be re-billed.
195
- const markedCount = await this.repositoriesRegistry.bulkUpdateForInfrastructure(variants.usageRecord, { _id: { $in: group.recordIds } },
196
- // The adapter-neutral guarded-mutation descriptor. This was `{ $set: … }` — raw MongoDB —
197
- // until `bulkUpdateForInfrastructure` became adapter-neutral; on a PostgreSQL-backed usage
198
- // record the old path threw before marking anything, which is the duplicate-charge
199
- // condition the block below exists to detect.
200
- { set: { reportedToProvider: true, reportedAt: new Date() } });
201
- const unmarkedCount = group.recordIds.length - markedCount;
202
- if (unmarkedCount > 0) {
203
- // Loud + specific: usage is already reported to the provider, so this is NOT a "retry me"
204
- // error — re-running the sweep is precisely what would double-charge.
205
- result.errors.push(`DUPLICATE-CHARGE RISK — ${group.billingAccountId}/${group.productKey} (scope: ${variants.scopeType}): ` +
206
- `usage of ${group.quantity} was REPORTED to the provider, but only ${markedCount}/${group.recordIds.length} ` +
207
- `records could be marked as reported. The ${unmarkedCount} unmarked record(s) remain selectable by the next ` +
208
- `sweep and would be billed AGAIN. Investigate before the next run; mark them manually if the report succeeded.`);
209
- result.failed += unmarkedCount;
600
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
601
+ attempt += 1;
602
+ }
603
+ }
604
+ }
605
+ /**
606
+ * A stable, bounded idempotency key for one meter event.
607
+ *
608
+ * Derived from the ROWS the event carries — sorted, so ordering cannot change it — and hashed, so a
609
+ * group of ten thousand rows produces the same short key as a group of one. Two different groups
610
+ * cannot collide; the same group retried, or re-reported after a partial marking, produces the same
611
+ * key and the provider discards the repeat.
612
+ */
613
+ buildUsageEventIdentifier(variants, group) {
614
+ const material = [
615
+ variants.scopeType,
616
+ group.billingAccountId,
617
+ group.productKey,
618
+ ...[...group.recordIds].sort(),
619
+ ].join('|');
620
+ return `wildo-usage-${createHash('sha256').update(material).digest('hex').slice(0, 32)}`;
621
+ }
622
+ // ════════════════════════════════════════════════════════════
623
+ // Private — Policy and period resolution (per-run cached)
624
+ // ════════════════════════════════════════════════════════════
625
+ /** The product's authored metering policy, or `undefined` when it authored none. */
626
+ async resolveMeteringPolicy(productKey) {
627
+ const cached = this.flushProductCache?.get(productKey);
628
+ if (cached !== undefined)
629
+ return cached ?? undefined;
630
+ const ctx = await this.internalCtx(CoreResourceType.PRODUCTS, CoreResourceOperation.LIST);
631
+ let policy;
632
+ try {
633
+ const products = await this.servicesRegistry.list(CoreResourceType.PRODUCTS, ctx, { key: productKey }, { page: 1, limit: 1 });
634
+ policy = products[0]?.behaviorPolicy?.metering;
635
+ }
636
+ catch (error) {
637
+ // A policy that cannot be read is not a reason to stop billing: fall through to the merged
638
+ // default, which is what every product got before the policy was read at all.
639
+ this.logger.warn('Failed to read metering policy; flushing this product with default aggregation', {
640
+ productKey,
641
+ message: error.message,
642
+ });
643
+ }
644
+ this.flushProductCache?.set(productKey, policy ?? null);
645
+ return policy;
646
+ }
647
+ /**
648
+ * The start of the billing period containing `timestamp`, for `PER_BILLING_PERIOD` grouping.
649
+ *
650
+ * Derived from the subscription's own `currentPeriodStart` / `currentPeriodEnd` — real data, not a
651
+ * calendar rule invented here — stepping backwards by the period's own length for usage older than
652
+ * the current period. Returns `undefined` when no subscription can be resolved, which merges the
653
+ * rows exactly as `PER_FLUSH` would: an unknown boundary must not silently invent one.
654
+ */
655
+ async resolvePeriodStartFor(variants, billingAccountId, productKey, timestamp) {
656
+ const cacheKey = `${variants.scopeType}::${billingAccountId}`;
657
+ let boundaries = this.flushPeriodCache?.get(cacheKey);
658
+ if (boundaries === undefined) {
659
+ boundaries = null;
660
+ const ctx = await this.internalCtx(variants.subscription, CoreResourceOperation.LIST);
661
+ try {
662
+ const subscriptions = await this.servicesRegistry.list(variants.subscription, ctx, {
663
+ [variants.billingAccountFkField]: billingAccountId,
664
+ status: { $in: [SubscriptionStatus.ACTIVE, SubscriptionStatus.TRIALING] },
665
+ });
666
+ const subscription = subscriptions[0];
667
+ if (subscription?.currentPeriodStart && subscription?.currentPeriodEnd) {
668
+ boundaries = {
669
+ start: new Date(subscription.currentPeriodStart),
670
+ end: new Date(subscription.currentPeriodEnd),
671
+ };
210
672
  }
211
- result.reported += markedCount;
212
673
  }
213
674
  catch (error) {
214
- result.errors.push(`${group.billingAccountId}/${group.productKey} (scope: ${variants.scopeType}): ${error.message}`);
215
- result.failed += group.recordIds.length;
675
+ this.logger.warn('Failed to resolve billing period for per-period aggregation; merging as PER_FLUSH', {
676
+ billingAccountId, productKey, message: error.message,
677
+ });
216
678
  }
679
+ this.flushPeriodCache?.set(cacheKey, boundaries);
217
680
  }
681
+ if (!boundaries)
682
+ return undefined;
683
+ const periodLengthMs = boundaries.end.getTime() - boundaries.start.getTime();
684
+ if (periodLengthMs <= 0)
685
+ return boundaries.start;
686
+ // Step backwards whole periods until the timestamp is inside one. Usage newer than the current
687
+ // period end belongs to the current period — the subscription simply has not rolled over yet.
688
+ let start = boundaries.start.getTime();
689
+ while (timestamp.getTime() < start)
690
+ start -= periodLengthMs;
691
+ return new Date(start);
218
692
  }
219
693
  // ════════════════════════════════════════════════════════════
220
694
  // Private — Resolution
@@ -258,19 +732,74 @@ let UsageMeteringBackendService = class UsageMeteringBackendService extends Abst
258
732
  }
259
733
  return false;
260
734
  }
261
- async resolveProviderCustomerId(variants, billingAccountId) {
735
+ /**
736
+ * Resolve the provider customer for a billing account, distinguishing the two ways it can fail.
737
+ *
738
+ * This used to return `string | null`, and that single `null` fused a PERMANENT condition with a
739
+ * TRANSIENT one (#512):
740
+ *
741
+ * - the account row is GONE — legitimately reachable, because usage rows are RETAINED when their
742
+ * subject is erased, so a deleted account leaves rows behind. Nothing will ever restore the
743
+ * mapping, and a flush that keeps retrying is building a backlog it cannot drain;
744
+ * - the account EXISTS but carries no `providerCustomerId` yet — provisioning may still complete,
745
+ * and abandoning those rows would throw away billable usage.
746
+ *
747
+ * They lead to opposite actions, so the caller must be able to tell them apart. Two plain fields
748
+ * rather than a discriminated union deliberately: `engine/tsconfig.common.json` sets
749
+ * `strict: false`, under which narrowing a union on a boolean-literal discriminant does not work,
750
+ * and a caller that cannot narrow reads the wrong field with no diagnostic.
751
+ *
752
+ * A read that THROWS is treated as transient — `degradeOrRethrow` has already decided the error is
753
+ * survivable, and a storage failure says nothing about whether the row exists.
754
+ */
755
+ async resolveProviderCustomer(variants, billingAccountId) {
262
756
  const readCtx = await this.internalCtx(variants.billingAccount, CoreResourceOperation.READ);
263
757
  try {
264
758
  const billingAccount = await this.servicesRegistry.read(variants.billingAccount, readCtx, billingAccountId);
265
- return billingAccount?.providerCustomerId ?? null;
759
+ if (!billingAccount)
760
+ return { accountExists: false, providerCustomerId: null };
761
+ return { accountExists: true, providerCustomerId: billingAccount.providerCustomerId ?? null };
266
762
  }
267
763
  catch (error) {
268
764
  this.degradeOrRethrow(error, 'Failed to resolve provider customer ID', { billingAccountId, scope: variants.scopeType });
269
765
  }
270
- return null;
766
+ return { accountExists: true, providerCustomerId: null };
767
+ }
768
+ /**
769
+ * Move a group's rows to the terminal `unreportable` state so the flush stops re-selecting them.
770
+ *
771
+ * NO money moved and none ever will, which is why this is its own state rather than a convenient
772
+ * `reported: true`. The reason and the instant are written beside it, because the row is a
773
+ * RETAINED financial record and the next reader of it — an auditor, an operator reconciling a
774
+ * period — needs to know why a measured quantity was never billed.
775
+ *
776
+ * A marking that does not fully land is reported and NOT retried here: the rows that stayed
777
+ * pending are simply selected again next run, which is harmless (unlike the reported case, where
778
+ * a partial marking risks double-billing). The counters follow what the write actually did.
779
+ */
780
+ async markGroupUnreportable(variants, group, reason, result) {
781
+ const markedCount = await this.repositoriesRegistry.bulkUpdateForInfrastructure(variants.usageRecord, { _id: { $in: group.recordIds } }, { set: { flushState: UsageRecordFlushState.UNREPORTABLE, unreportableReason: reason, unreportableAt: new Date() } });
782
+ result.unreportable += markedCount;
783
+ result.quantityUnreportable += markedCount === group.recordIds.length
784
+ ? group.quantity
785
+ : 0;
786
+ const unmarkedCount = group.recordIds.length - markedCount;
787
+ if (unmarkedCount > 0) {
788
+ /*
789
+ * The quantity is credited only on a COMPLETE marking, above. A group's quantity is an
790
+ * aggregate over its rows and this class does not carry per-row quantities into the group, so
791
+ * a partial marking cannot be apportioned — and guessing would corrupt the reconciliation
792
+ * identity in the direction that hides unbilled usage. The rows that stayed pending will be
793
+ * re-selected, re-grouped and accounted for then.
794
+ */
795
+ result.errors.push(`PARTIAL UNREPORTABLE MARKING — ${group.billingAccountId}/${group.productKey} (scope: ${variants.scopeType}): ` +
796
+ `only ${markedCount}/${group.recordIds.length} record(s) could be marked unreportable. The ${unmarkedCount} ` +
797
+ `unmarked record(s) stay pending and will be re-selected next run; no usage was reported to the provider.`);
798
+ result.failed += unmarkedCount;
799
+ }
271
800
  }
272
801
  };
273
- UsageMeteringBackendService = __decorate([
802
+ UsageMeteringBackendService = UsageMeteringBackendService_1 = __decorate([
274
803
  injectable(),
275
804
  __param(0, inject(SAAS_SERVICE_TYPES.Logger)),
276
805
  __param(1, inject(SAAS_SERVICE_TYPES.ServicesRegistryHandlerService)),