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

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 (1056) hide show
  1. package/dist/esm/__tests__/fixture-deep-partial.d.ts.map +1 -1
  2. package/dist/esm/__tests__/integration/redis-integration-gate.d.ts.map +1 -1
  3. package/dist/esm/__tests__/setup.d.ts.map +1 -1
  4. package/dist/esm/__tests__/test-container.d.ts.map +1 -1
  5. package/dist/esm/applications/models/applications.backend.schemas.d.ts.map +1 -1
  6. package/dist/esm/applications/seeds/application-metadata-defaults.seeds.d.ts.map +1 -1
  7. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.d.ts.map +1 -1
  8. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js.map +1 -1
  9. package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
  10. package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
  11. package/dist/esm/base-classes/models/repositories.backend.schemas.d.ts.map +1 -1
  12. package/dist/esm/base-classes/services/__tests__/mock-resource-operation-helper.service.d.ts +1 -1
  13. package/dist/esm/base-classes/services/__tests__/mock-resource-operation-helper.service.d.ts.map +1 -1
  14. package/dist/esm/base-classes/services/batches/batches-cronjobs-custom-execution.service.d.ts.map +1 -1
  15. package/dist/esm/base-classes/services/batches/batches-cronjobs-executor.backend.service.d.ts.map +1 -1
  16. package/dist/esm/base-classes/services/batches/batches-cronjobs-resource-execution.backend.service.d.ts.map +1 -1
  17. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts.map +1 -1
  18. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js.map +1 -1
  19. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts.map +1 -1
  20. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js +12 -1
  21. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js.map +1 -1
  22. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts.map +1 -1
  23. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js.map +1 -1
  24. package/dist/esm/base-classes/services/batches/resource-retention-sweep.batch.backend.service.d.ts.map +1 -1
  25. package/dist/esm/base-classes/services/batches/suspension-reactivation-sweep.batch.backend.service.d.ts.map +1 -1
  26. package/dist/esm/base-classes/services/controllers/abstract-controller.backend.service.d.ts.map +1 -1
  27. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
  28. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
  29. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts.map +1 -1
  30. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js.map +1 -1
  31. package/dist/esm/base-classes/services/controllers/utils/audit-access-fields.backend.utils.d.ts.map +1 -1
  32. package/dist/esm/base-classes/services/controllers/utils/operation-response-serializer.backend.utils.d.ts.map +1 -1
  33. package/dist/esm/base-classes/services/controllers/validate-field-handler.backend.service.d.ts.map +1 -1
  34. package/dist/esm/base-classes/services/repositories/__tests__/method-span-scan.guard-helpers.d.ts.map +1 -1
  35. package/dist/esm/base-classes/services/repositories/__tests__/mock-repositories-registry-handler.service.d.ts.map +1 -1
  36. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts.map +1 -1
  37. package/dist/esm/base-classes/services/repositories/http-api/http-api-filter-translation.backend.d.ts.map +1 -1
  38. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
  39. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +13 -4
  40. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
  41. package/dist/esm/base-classes/services/repositories/http-api/http-api-query.backend.d.ts.map +1 -1
  42. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
  43. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +17 -0
  44. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
  45. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
  46. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
  47. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -1
  48. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -1
  49. package/dist/esm/base-classes/services/repositories/http-api/http-api-row-projection.backend.d.ts.map +1 -1
  50. package/dist/esm/base-classes/services/repositories/http-api/http-api-subject-erasure-effect.backend.d.ts.map +1 -1
  51. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
  52. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
  53. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.d.ts.map +1 -1
  54. package/dist/esm/base-classes/services/repositories/http-api/odoo-jsonrpc-compiler.backend.d.ts.map +1 -1
  55. package/dist/esm/base-classes/services/repositories/http-api/rest-json-query-compiler.backend.d.ts.map +1 -1
  56. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
  57. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
  58. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts.map +1 -1
  59. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts.map +1 -1
  60. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +57 -0
  61. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
  62. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +95 -2
  63. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
  64. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
  65. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
  66. package/dist/esm/base-classes/services/repositories/repository-guarded-mutation.backend.types.d.ts.map +1 -1
  67. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts +5 -2
  68. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
  69. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +14 -3
  70. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
  71. package/dist/esm/base-classes/services/repositories/repository-version-metadata.backend.utils.d.ts.map +1 -1
  72. package/dist/esm/base-classes/services/repositories/resource-write-integrity.backend.d.ts.map +1 -1
  73. package/dist/esm/base-classes/services/repositories/seed-row-default-materialization.backend.d.ts +72 -0
  74. package/dist/esm/base-classes/services/repositories/seed-row-default-materialization.backend.d.ts.map +1 -0
  75. package/dist/esm/base-classes/services/repositories/seed-row-default-materialization.backend.js +88 -0
  76. package/dist/esm/base-classes/services/repositories/seed-row-default-materialization.backend.js.map +1 -0
  77. package/dist/esm/base-classes/services/repositories/unique-constraint-conflict-reference.backend.d.ts.map +1 -1
  78. package/dist/esm/base-classes/services/resource-operations-helper.backend.service.d.ts.map +1 -1
  79. package/dist/esm/base-classes/services/services/__tests__/mock-services-registry-handler.service.d.ts.map +1 -1
  80. package/dist/esm/base-classes/services/services/__tests__/mock-system-access.service.d.ts.map +1 -1
  81. package/dist/esm/base-classes/services/services/read-only-field-change.backend.utils.d.ts.map +1 -1
  82. package/dist/esm/base-classes/services/services/resource-operation-audit-emission.backend.utils.d.ts.map +1 -1
  83. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
  84. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
  85. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-registry.backend.service.d.ts.map +1 -1
  86. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation.factory.backend.d.ts.map +1 -1
  87. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts.map +1 -1
  88. package/dist/esm/base-classes/services/services/resource-operation-server-injected-fields.backend.utils.d.ts.map +1 -1
  89. package/dist/esm/base-classes/services/services/resource-operation-transaction-persistence.backend.utils.d.ts.map +1 -1
  90. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
  91. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
  92. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
  93. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
  94. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
  95. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +44 -6
  96. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
  97. package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
  98. package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
  99. package/dist/esm/base-classes/utils/backend-type-utils.d.ts.map +1 -1
  100. package/dist/esm/base-classes/utils/single-subject-addressing.backend.utils.d.ts.map +1 -1
  101. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -1
  102. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -1
  103. package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -1
  104. package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -1
  105. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -1
  106. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -1
  107. package/dist/esm/billing/services/back-office/abstract-billing.backend.service.d.ts.map +1 -1
  108. package/dist/esm/billing/services/back-office/billing-feature-sync.backend.service.d.ts.map +1 -1
  109. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +1 -1
  110. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -1
  111. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +5 -4
  112. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -1
  113. package/dist/esm/billing/services/back-office/billing-state.backend.service.d.ts.map +1 -1
  114. package/dist/esm/billing/services/back-office/billing-state.backend.service.js +11 -1
  115. package/dist/esm/billing/services/back-office/billing-state.backend.service.js.map +1 -1
  116. package/dist/esm/billing/services/back-office/billing-subject-erasure-effect.backend.d.ts.map +1 -1
  117. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
  118. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
  119. package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
  120. package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
  121. package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -1
  122. package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -1
  123. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
  124. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
  125. package/dist/esm/billing/services/billing.utils.d.ts.map +1 -1
  126. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
  127. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
  128. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +32 -0
  129. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
  130. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +32 -1
  131. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
  132. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
  133. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
  134. package/dist/esm/billing/services/custom-impl/credit-pool.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
  135. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
  136. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
  137. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
  138. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
  139. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +9 -6
  140. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
  141. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +9 -6
  142. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
  143. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -1
  144. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -1
  145. package/dist/esm/billing/services/webhooks/billing-webhook-adapter.backend.service.d.ts.map +1 -1
  146. package/dist/esm/billing/services/webhooks/billing-webhook-capability-handler.backend.service.d.ts.map +1 -1
  147. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
  148. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +50 -3
  149. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
  150. package/dist/esm/billing/testing/billing-test-fixtures.d.ts.map +1 -1
  151. package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
  152. package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
  153. package/dist/esm/charts/controllers/chart.backend.controller.d.ts.map +1 -1
  154. package/dist/esm/charts/services/chart-registry.backend.service.d.ts +80 -7
  155. package/dist/esm/charts/services/chart-registry.backend.service.d.ts.map +1 -1
  156. package/dist/esm/charts/services/chart-registry.backend.service.js +115 -8
  157. package/dist/esm/charts/services/chart-registry.backend.service.js.map +1 -1
  158. package/dist/esm/companion-exports.d.ts.map +1 -1
  159. package/dist/esm/compliance/audit-trails/audit-logs.custom-impl.backend.service.d.ts.map +1 -1
  160. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.d.ts.map +1 -1
  161. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
  162. package/dist/esm/compliance/audit-trails/batches/immudb-audit-reconcile.batch.backend.service.d.ts.map +1 -1
  163. package/dist/esm/compliance/audit-trails/batches/siem-webhook-delivery.batch.backend.service.d.ts.map +1 -1
  164. package/dist/esm/compliance/audit-trails/services/__tests__/mock-audit-logs.service.d.ts.map +1 -1
  165. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
  166. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
  167. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +107 -4
  168. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
  169. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +176 -5
  170. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
  171. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
  172. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
  173. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -1
  174. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -1
  175. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
  176. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
  177. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -1
  178. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -1
  179. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
  180. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +21 -0
  181. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
  182. package/dist/esm/compliance/audit-trails/services/utils/ocsf-class-mapping.backend.utils.d.ts.map +1 -1
  183. package/dist/esm/compliance/audit-trails/services/utils/siem-dictionary.backend.utils.d.ts.map +1 -1
  184. package/dist/esm/compliance/audit-trails/services/utils/siem-ocsf-projection.backend.utils.d.ts.map +1 -1
  185. package/dist/esm/compliance/audit-trails/services/utils/siem-projection-contract.backend.utils.d.ts.map +1 -1
  186. package/dist/esm/compliance/audit-trails/utils/audit-actor.backend.utils.d.ts.map +1 -1
  187. package/dist/esm/compliance/audit-trails/utils/layer2-audit-provider-boot-diagnostic.backend.utils.d.ts.map +1 -1
  188. package/dist/esm/compliance/index.d.ts.map +1 -1
  189. package/dist/esm/compliance/privacy/retention-hide-predicate.backend.d.ts.map +1 -1
  190. package/dist/esm/compliance/privacy/services/subject-erasure-external-effects.backend.service.d.ts.map +1 -1
  191. package/dist/esm/compliance/privacy/services/subject-session-revocation.backend.service.d.ts.map +1 -1
  192. package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
  193. package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
  194. package/dist/esm/config/bootstrap/minion-initialization-projection.backend.d.ts.map +1 -1
  195. package/dist/esm/config/bootstrap/runtime-principal-attestation.backend.service.d.ts.map +1 -1
  196. package/dist/esm/config/bootstrap/runtime-principal-attestation.backend.service.js +3 -0
  197. package/dist/esm/config/bootstrap/runtime-principal-attestation.backend.service.js.map +1 -1
  198. package/dist/esm/config/bootstrap/runtime-principal.backend.service.d.ts.map +1 -1
  199. package/dist/esm/config/custom/application-config-controller.backend.service.d.ts.map +1 -1
  200. package/dist/esm/config/models/app-config-secrets.backend.schemas.d.ts.map +1 -1
  201. package/dist/esm/config/models/app-config.backend-authored.definitions.d.ts.map +1 -1
  202. package/dist/esm/config/models/app-config.backend.schemas.d.ts +4 -4
  203. package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
  204. package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
  205. package/dist/esm/config/models/app-env-config.backend.schemas.d.ts.map +1 -1
  206. package/dist/esm/config/models/apps-manager-transport.backend.definitions.d.ts +36 -0
  207. package/dist/esm/config/models/apps-manager-transport.backend.definitions.d.ts.map +1 -0
  208. package/dist/esm/config/models/apps-manager-transport.backend.definitions.js +36 -0
  209. package/dist/esm/config/models/apps-manager-transport.backend.definitions.js.map +1 -0
  210. package/dist/esm/config/models/config-mutation-boundary.utils.d.ts.map +1 -1
  211. package/dist/esm/config/models/postgresql-env-config.backend.schemas.d.ts.map +1 -1
  212. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
  213. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
  214. package/dist/esm/config/models/runtime-topology.backend.contracts.d.ts.map +1 -1
  215. package/dist/esm/config/services/__tests__/mock-app-configuration.service.d.ts.map +1 -1
  216. package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
  217. package/dist/esm/config/services/app-configuration-loader.backend.service.js +3 -0
  218. package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
  219. package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
  220. package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
  221. package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
  222. package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
  223. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +12 -0
  224. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
  225. package/dist/esm/config/services/application-startup-config-validator.backend.service.js +28 -0
  226. package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
  227. package/dist/esm/data-seeding/batches/data-seeding-run-cleanup.batch.backend.service.d.ts.map +1 -1
  228. package/dist/esm/data-seeding/batches/data-seeding-scheduled-rerun.batch.backend.service.d.ts.map +1 -1
  229. package/dist/esm/data-seeding/controllers/data-seeding-admin.backend.contracts.d.ts.map +1 -1
  230. package/dist/esm/data-seeding/controllers/data-seeding-admin.backend.controller.d.ts.map +1 -1
  231. package/dist/esm/data-seeding/data-seeding-models.d.ts.map +1 -1
  232. package/dist/esm/data-seeding/models/business-key-resolver.shared.utils.d.ts.map +1 -1
  233. package/dist/esm/data-seeding/models/data-seed-execution-context.shared.types.d.ts.map +1 -1
  234. package/dist/esm/data-seeding/models/data-seed-migrator-runner.shared.utils.d.ts.map +1 -1
  235. package/dist/esm/data-seeding/models/data-seed-reconciler.shared.utils.d.ts.map +1 -1
  236. package/dist/esm/data-seeding/models/data-seed-row-metadata.shared.schemas.d.ts.map +1 -1
  237. package/dist/esm/data-seeding/models/data-seed-row-metadata.shared.utils.d.ts.map +1 -1
  238. package/dist/esm/data-seeding/models/data-seed-run.shared.resources-config.schemas.d.ts.map +1 -1
  239. package/dist/esm/data-seeding/models/data-seed-run.shared.schemas.d.ts.map +1 -1
  240. package/dist/esm/data-seeding/models/data-seed-trigger-mode-matrix.shared.utils.d.ts.map +1 -1
  241. package/dist/esm/data-seeding/models/data-seed.shared.schemas.d.ts.map +1 -1
  242. package/dist/esm/data-seeding/services/data-seed-application-bootstrap.backend.d.ts.map +1 -1
  243. package/dist/esm/data-seeding/services/data-seed-dispatcher.backend.service.d.ts.map +1 -1
  244. package/dist/esm/data-seeding/services/data-seed-registry.backend.service.d.ts.map +1 -1
  245. package/dist/esm/data-seeding/services/data-seed-scope-resolver-registry.backend.service.d.ts.map +1 -1
  246. package/dist/esm/data-seeding/services/engines/additive-seed-engine.backend.service.d.ts.map +1 -1
  247. package/dist/esm/data-seeding/services/engines/lazy-seed-engine.backend.service.d.ts.map +1 -1
  248. package/dist/esm/data-seeding/services/engines/manual-seed-engine.backend.service.d.ts.map +1 -1
  249. package/dist/esm/data-seeding/services/engines/sync-seed-engine.backend.service.d.ts.map +1 -1
  250. package/dist/esm/data-seeding/services/engines/upgrade-seed-engine.backend.service.d.ts.map +1 -1
  251. package/dist/esm/data-seeding/services/shared/data-seed-business-key.shared.utils.d.ts.map +1 -1
  252. package/dist/esm/data-seeding/services/shared/data-seed-error.shared.utils.d.ts.map +1 -1
  253. package/dist/esm/data-seeding/services/shared/data-seed-run-counters.shared.types.d.ts.map +1 -1
  254. package/dist/esm/data-seeding/services/shared/data-seed-run-ledger.backend.d.ts.map +1 -1
  255. package/dist/esm/data-seeding/services/shared/data-seed-scope-anchor.shared.types.d.ts.map +1 -1
  256. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.d.ts.map +1 -1
  257. package/dist/esm/data-seeding/services/shared/data-seed-scope-resolution.backend.d.ts.map +1 -1
  258. package/dist/esm/databases/models/aggregation.backend.schemas.d.ts.map +1 -1
  259. package/dist/esm/databases/models/databases.backend.schemas.d.ts.map +1 -1
  260. package/dist/esm/databases/models/filter.backend.schemas.d.ts.map +1 -1
  261. package/dist/esm/databases/models/resolve-persistence-adapter.backend.utils.d.ts.map +1 -1
  262. package/dist/esm/databases/models/sql.backend.schemas.d.ts.map +1 -1
  263. package/dist/esm/databases/models/transaction.shared.schemas.d.ts.map +1 -1
  264. package/dist/esm/databases/services/__tests__/mock-mongo-transaction-registry.service.d.ts.map +1 -1
  265. package/dist/esm/databases/services/__tests__/mock-mongodb.service.d.ts.map +1 -1
  266. package/dist/esm/databases/services/__tests__/mock-mongoose-model.service.d.ts.map +1 -1
  267. package/dist/esm/databases/services/__tests__/mock-redis.service.d.ts.map +1 -1
  268. package/dist/esm/databases/services/__tests__/mock-zod-mongoose-schema-convertor.service.d.ts.map +1 -1
  269. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.d.ts.map +1 -1
  270. package/dist/esm/databases/services/aggregation/aggregation-query.backend.service.d.ts.map +1 -1
  271. package/dist/esm/databases/services/aggregation/computed-measure-evaluator.backend.service.d.ts.map +1 -1
  272. package/dist/esm/databases/services/aggregation/field-access-validator.backend.service.d.ts.map +1 -1
  273. package/dist/esm/databases/services/aggregation/time-series-densifier.backend.service.d.ts.map +1 -1
  274. package/dist/esm/databases/services/aggregation/topn-processor.backend.service.d.ts.map +1 -1
  275. package/dist/esm/databases/services/aggregation/window-function-processor.backend.service.d.ts.map +1 -1
  276. package/dist/esm/databases/services/db-utils.d.ts.map +1 -1
  277. package/dist/esm/databases/services/mongo-aggregation.backend.service.d.ts.map +1 -1
  278. package/dist/esm/databases/services/mongodb.service.d.ts.map +1 -1
  279. package/dist/esm/databases/services/postgresql-aggregation.backend.service.d.ts.map +1 -1
  280. package/dist/esm/databases/services/postgresql-database.backend.service.d.ts.map +1 -1
  281. package/dist/esm/databases/services/postgresql-development-provisioning.backend.d.ts.map +1 -1
  282. package/dist/esm/databases/services/postgresql-filter.backend.service.d.ts.map +1 -1
  283. package/dist/esm/databases/services/postgresql-migration-runner.backend.d.ts.map +1 -1
  284. package/dist/esm/databases/services/postgresql-schema-ddl.backend.d.ts.map +1 -1
  285. package/dist/esm/databases/services/postgresql-schema-migration-sql.backend.d.ts.map +1 -1
  286. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
  287. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
  288. package/dist/esm/databases/services/postgresql-schema-plan-lockfile.backend.d.ts.map +1 -1
  289. package/dist/esm/databases/services/redis.service.d.ts.map +1 -1
  290. package/dist/esm/databases/services/resource-persistence-unit-of-work.backend.service.d.ts.map +1 -1
  291. package/dist/esm/databases/services/schema-planning-standalone.backend.d.ts.map +1 -1
  292. package/dist/esm/databases/services/zod-to-mongoose-schema-convertor.backend.service.d.ts.map +1 -1
  293. package/dist/esm/databases/services/zod-to-sql-hybrid-schema.planner.d.ts.map +1 -1
  294. package/dist/esm/databases/utils/postgresql-identifier.backend.utils.d.ts.map +1 -1
  295. package/dist/esm/errors/services/__tests__/mock-error-builder.service.d.ts.map +1 -1
  296. package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
  297. package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
  298. package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
  299. package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
  300. package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
  301. package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
  302. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
  303. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
  304. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
  305. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
  306. package/dist/esm/external-data/batches/external-data-pipeline-scheduled-run.batch.backend.service.d.ts.map +1 -1
  307. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts.map +1 -1
  308. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts.map +1 -1
  309. package/dist/esm/external-data/external-data-extraction-source.backend.d.ts.map +1 -1
  310. package/dist/esm/external-data/external-data-models.exports.d.ts.map +1 -1
  311. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
  312. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
  313. package/dist/esm/external-data/external-data-transform.backend.d.ts.map +1 -1
  314. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts.map +1 -1
  315. package/dist/esm/external-providers/models/external-providers.backend.schemas.d.ts.map +1 -1
  316. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
  317. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
  318. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +102 -52
  319. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -1
  320. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +117 -71
  321. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -1
  322. package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -1
  323. package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -1
  324. package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -1
  325. package/dist/esm/external-providers/operations/provider-request-signing.backend.js +26 -7
  326. package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -1
  327. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -1
  328. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -1
  329. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
  330. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
  331. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -1
  332. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -1
  333. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
  334. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
  335. package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts +81 -34
  336. package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
  337. package/dist/esm/external-providers/services/document-extraction.backend.service.js +179 -98
  338. package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
  339. package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
  340. package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
  341. package/dist/esm/external-providers/services/external-api-handler.backend.service.d.ts.map +1 -1
  342. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +121 -0
  343. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
  344. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +151 -0
  345. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
  346. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts +15 -1
  347. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
  348. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +60 -4
  349. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
  350. package/dist/esm/features/controllers/features.backend.controller.d.ts.map +1 -1
  351. package/dist/esm/features/services/__tests__/mock-feature-definition-registry.service.d.ts.map +1 -1
  352. package/dist/esm/features/services/__tests__/mock-feature-resolution.service.d.ts.map +1 -1
  353. package/dist/esm/features/services/application-features-admin-write-path.custom-impl.backend.service.d.ts.map +1 -1
  354. package/dist/esm/features/services/feature-definition-registry.backend.service.d.ts.map +1 -1
  355. package/dist/esm/features/services/feature-gate.backend.service.d.ts.map +1 -1
  356. package/dist/esm/features/services/feature-resolution.backend.service.d.ts.map +1 -1
  357. package/dist/esm/features/services/organization-features-admin-write-path.custom-impl.backend.service.d.ts.map +1 -1
  358. package/dist/esm/features/services/scope-feature-ledger-relationship.backend.utils.d.ts.map +1 -1
  359. package/dist/esm/features/services/scope-features-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -1
  360. package/dist/esm/features/testing/feature-test-utils.d.ts.map +1 -1
  361. package/dist/esm/files/batches/files-cleanup.batch.backend.service.d.ts.map +1 -1
  362. package/dist/esm/files/constraints/file-analyzers.types.d.ts.map +1 -1
  363. package/dist/esm/files/constraints/file-constraint-resolver-chain.backend.service.d.ts.map +1 -1
  364. package/dist/esm/files/constraints/file-constraint.types.d.ts.map +1 -1
  365. package/dist/esm/files/constraints/file-validation.backend.service.d.ts.map +1 -1
  366. package/dist/esm/files/constraints/resource-field-constraint-resolver.backend.service.d.ts.map +1 -1
  367. package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
  368. package/dist/esm/files/controllers/file.controller.js.map +1 -1
  369. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts.map +1 -1
  370. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js.map +1 -1
  371. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts +37 -0
  372. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
  373. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +221 -21
  374. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
  375. package/dist/esm/files/scanning/clamav-scanner.backend.service.d.ts.map +1 -1
  376. package/dist/esm/files/scanning/file-scan.types.d.ts.map +1 -1
  377. package/dist/esm/files/scanning/yara-scanner.backend.service.d.ts.map +1 -1
  378. package/dist/esm/files/scanning/yara-scanner.backend.service.js +20 -2
  379. package/dist/esm/files/scanning/yara-scanner.backend.service.js.map +1 -1
  380. package/dist/esm/files/services/__tests__/mock-file-field-detection.service.d.ts.map +1 -1
  381. package/dist/esm/files/services/__tests__/mock-file-operation-handler.service.d.ts.map +1 -1
  382. package/dist/esm/files/services/__tests__/mock-file-repository.service.d.ts.map +1 -1
  383. package/dist/esm/files/services/file-field-detection.backend.service.d.ts.map +1 -1
  384. package/dist/esm/files/services/file-operation-handler.backend.service.d.ts.map +1 -1
  385. package/dist/esm/files/services/file-operation-handler.backend.service.js.map +1 -1
  386. package/dist/esm/files/services/file-population.backend.service.d.ts.map +1 -1
  387. package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
  388. package/dist/esm/files/services/file-scanning.backend.service.js +5 -0
  389. package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
  390. package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
  391. package/dist/esm/files/services/file-text-extraction.backend.service.js +8 -5
  392. package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
  393. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -1
  394. package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -1
  395. package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
  396. package/dist/esm/files/services/files.backend.service.js +3 -1
  397. package/dist/esm/files/services/files.backend.service.js.map +1 -1
  398. package/dist/esm/files/services/rag-source-field-detection.backend.service.d.ts.map +1 -1
  399. package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -1
  400. package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -1
  401. package/dist/esm/files/storage/file-storage-path-resolver.backend.service.d.ts.map +1 -1
  402. package/dist/esm/files/storage/file-storage-provider.types.d.ts +36 -1
  403. package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
  404. package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
  405. package/dist/esm/files/storage/file-storage-router.backend.service.d.ts +21 -3
  406. package/dist/esm/files/storage/file-storage-router.backend.service.d.ts.map +1 -1
  407. package/dist/esm/files/storage/file-storage-router.backend.service.js +38 -5
  408. package/dist/esm/files/storage/file-storage-router.backend.service.js.map +1 -1
  409. package/dist/esm/files/storage/google-drive-storage-provider.backend.service.d.ts +87 -0
  410. package/dist/esm/files/storage/google-drive-storage-provider.backend.service.d.ts.map +1 -0
  411. package/dist/esm/files/storage/google-drive-storage-provider.backend.service.js +340 -0
  412. package/dist/esm/files/storage/google-drive-storage-provider.backend.service.js.map +1 -0
  413. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
  414. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
  415. package/dist/esm/files/storage/storage-credential-provider.backend.utils.d.ts.map +1 -1
  416. package/dist/esm/files/storage/storage-platform-sts-credential-resolver.backend.utils.d.ts.map +1 -1
  417. package/dist/esm/files/storage/storage-sts-credential-resolver.backend.utils.d.ts.map +1 -1
  418. package/dist/esm/files/storage/storage-sts-credential-resolver.backend.utils.js +10 -3
  419. package/dist/esm/files/storage/storage-sts-credential-resolver.backend.utils.js.map +1 -1
  420. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
  421. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
  422. package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
  423. package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
  424. package/dist/esm/files/utils/file-upload.utils.d.ts.map +1 -1
  425. package/dist/esm/files/utils/file-uploader.utils.d.ts.map +1 -1
  426. package/dist/esm/files/utils/file-uploader.utils.js.map +1 -1
  427. package/dist/esm/files/utils/file-validation.utils.d.ts.map +1 -1
  428. package/dist/esm/files/utils/image-derivation.backend.utils.d.ts.map +1 -1
  429. package/dist/esm/files/utils/image-thumbnail.backend.utils.d.ts.map +1 -1
  430. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -1
  431. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -1
  432. package/dist/esm/files/utils/rag-source-field-schema-path.backend.utils.d.ts.map +1 -1
  433. package/dist/esm/files/utils/storage-application-identity.backend.utils.d.ts.map +1 -1
  434. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
  435. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
  436. package/dist/esm/flows-actors/a2a/batches/a2a-push-delivery.batch.backend.service.d.ts.map +1 -1
  437. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
  438. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
  439. package/dist/esm/flows-actors/a2a/models/a2a-dialect.backend.schemas.d.ts.map +1 -1
  440. package/dist/esm/flows-actors/a2a/models/a2a-push-notification-delivery.backend.utils.d.ts.map +1 -1
  441. package/dist/esm/flows-actors/a2a/models/a2a-push-notification.backend.schemas.d.ts.map +1 -1
  442. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
  443. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
  444. package/dist/esm/flows-actors/a2a/services/a2a-push-delivery-log.repository.d.ts.map +1 -1
  445. package/dist/esm/flows-actors/a2a/services/a2a-push-dispatcher.backend.service.d.ts.map +1 -1
  446. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
  447. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
  448. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
  449. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
  450. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
  451. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
  452. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
  453. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
  454. package/dist/esm/flows-actors/controllers/flows-actors.controller.d.ts.map +1 -1
  455. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
  456. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
  457. package/dist/esm/flows-actors/models/agent-facets.backend.definitions.d.ts.map +1 -1
  458. package/dist/esm/flows-actors/models/agents.backend.definitions.d.ts.map +1 -1
  459. package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
  460. package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
  461. package/dist/esm/flows-actors/models/flows-actors.backend.definitions.d.ts.map +1 -1
  462. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
  463. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
  464. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +107 -16
  465. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
  466. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +118 -18
  467. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
  468. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
  469. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
  470. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -1
  471. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -1
  472. package/dist/esm/flows-actors/services/__tests__/fixtures/meta-workflow-evaluation-treatment.test-fixture.d.ts.map +1 -1
  473. package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
  474. package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
  475. package/dist/esm/flows-actors/services/agent-call-trace-sink.backend.d.ts.map +1 -1
  476. package/dist/esm/flows-actors/services/agent-facets.backend.service.d.ts.map +1 -1
  477. package/dist/esm/flows-actors/services/agents.backend.service.d.ts +104 -5
  478. package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
  479. package/dist/esm/flows-actors/services/agents.backend.service.js +263 -31
  480. package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
  481. package/dist/esm/flows-actors/services/context-curation.backend.service.d.ts.map +1 -1
  482. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +46 -1
  483. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
  484. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +193 -6
  485. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
  486. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
  487. package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
  488. package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
  489. package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
  490. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
  491. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
  492. package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -1
  493. package/dist/esm/flows-actors/services/mcp-client.backend.service.js +3 -0
  494. package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -1
  495. package/dist/esm/flows-actors/services/mcp-credential-resolver.backend.service.d.ts +99 -0
  496. package/dist/esm/flows-actors/services/mcp-credential-resolver.backend.service.d.ts.map +1 -0
  497. package/dist/esm/flows-actors/services/mcp-credential-resolver.backend.service.js +155 -0
  498. package/dist/esm/flows-actors/services/mcp-credential-resolver.backend.service.js.map +1 -0
  499. package/dist/esm/flows-actors/services/meta-workflow-evaluation-treatment-compiler.backend.service.d.ts.map +1 -1
  500. package/dist/esm/flows-actors/services/meta-workflow-standard-action-contracts.backend.service.d.ts.map +1 -1
  501. package/dist/esm/flows-actors/services/meta-workflow-standard-evaluation-contracts.backend.service.d.ts.map +1 -1
  502. package/dist/esm/flows-actors/services/meta-workflow-structured-artifact-action-compiler.backend.service.d.ts.map +1 -1
  503. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
  504. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
  505. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
  506. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +9 -0
  507. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
  508. package/dist/esm/flows-actors/utils/bounded-subprocess.backend.utils.d.ts.map +1 -1
  509. package/dist/esm/flows-actors/utils/flows-actors-frontend-extractor.utils.d.ts.map +1 -1
  510. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
  511. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
  512. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
  513. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
  514. package/dist/esm/flows-actors/utils/prompt-ir-adapters.backend.utils.d.ts.map +1 -1
  515. package/dist/esm/flows-actors/utils/tool-approval-modification.backend.utils.d.ts +77 -0
  516. package/dist/esm/flows-actors/utils/tool-approval-modification.backend.utils.d.ts.map +1 -0
  517. package/dist/esm/flows-actors/utils/tool-approval-modification.backend.utils.js +164 -0
  518. package/dist/esm/flows-actors/utils/tool-approval-modification.backend.utils.js.map +1 -0
  519. package/dist/esm/flows-actors/utils/tool-approval-signing.backend.utils.d.ts +48 -0
  520. package/dist/esm/flows-actors/utils/tool-approval-signing.backend.utils.d.ts.map +1 -0
  521. package/dist/esm/flows-actors/utils/tool-approval-signing.backend.utils.js +101 -0
  522. package/dist/esm/flows-actors/utils/tool-approval-signing.backend.utils.js.map +1 -0
  523. package/dist/esm/guidance/batches/dormancy-detection.batch.backend.service.d.ts.map +1 -1
  524. package/dist/esm/guidance/services/guidance-trigger-evaluator.backend.service.d.ts.map +1 -1
  525. package/dist/esm/guidance/services/lifecycle-custom-implementations.backend.d.ts.map +1 -1
  526. package/dist/esm/guidance/services/lifecycle-evaluator.backend.service.d.ts.map +1 -1
  527. package/dist/esm/guidance/services/lifecycle-scope-id.backend.utils.d.ts.map +1 -1
  528. package/dist/esm/guidance/services/milestone-condition-registry.backend.service.d.ts.map +1 -1
  529. package/dist/esm/guidance/services/milestone-definition-registry.backend.service.d.ts.map +1 -1
  530. package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
  531. package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
  532. package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -1
  533. package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -1
  534. package/dist/esm/guidance/services/scoped-state-read-custom-implementations.backend.d.ts.map +1 -1
  535. package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
  536. package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
  537. package/dist/esm/i18n/services/i18n.backend.service.d.ts.map +1 -1
  538. package/dist/esm/index.d.ts +0 -1
  539. package/dist/esm/index.d.ts.map +1 -1
  540. package/dist/esm/index.js +0 -1
  541. package/dist/esm/index.js.map +1 -1
  542. package/dist/esm/inject/models/container.d.ts +10 -0
  543. package/dist/esm/inject/models/container.d.ts.map +1 -1
  544. package/dist/esm/inject/models/container.js +49 -1
  545. package/dist/esm/inject/models/container.js.map +1 -1
  546. package/dist/esm/inject/models/service-types.d.ts +3 -0
  547. package/dist/esm/inject/models/service-types.d.ts.map +1 -1
  548. package/dist/esm/inject/models/service-types.js +3 -0
  549. package/dist/esm/inject/models/service-types.js.map +1 -1
  550. package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
  551. package/dist/esm/mcp/controllers/mcp.controller.js +50 -3
  552. package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
  553. package/dist/esm/mcp/models/mcp-protocol.backend.schemas.d.ts.map +1 -1
  554. package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts.map +1 -1
  555. package/dist/esm/mcp/models/mcp-tool.backend.schemas.js.map +1 -1
  556. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
  557. package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
  558. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
  559. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
  560. package/dist/esm/mcp/services/resource-server-instances-registry.backend.service.d.ts.map +1 -1
  561. package/dist/esm/mcp/utils/zod-to-mcp-json-schema.backend.utils.d.ts.map +1 -1
  562. package/dist/esm/meta-workflow-runtime.exports.d.ts.map +1 -1
  563. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
  564. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
  565. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -1
  566. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -1
  567. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
  568. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
  569. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
  570. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
  571. package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
  572. package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
  573. package/dist/esm/monitoring/logger/services/__tests__/mock-logger.service.d.ts.map +1 -1
  574. package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
  575. package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
  576. package/dist/esm/monitoring/logger/services/logger.service.js +3 -3
  577. package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
  578. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -1
  579. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -1
  580. package/dist/esm/monitoring/logger/utils/log-value-normalization.backend.utils.d.ts.map +1 -1
  581. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +10 -6
  582. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -1
  583. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +10 -6
  584. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -1
  585. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
  586. package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
  587. package/dist/esm/monitoring/observability/otel-preload.d.ts.map +1 -1
  588. package/dist/esm/monitoring/observability/otel-sdk-global-handle.d.ts.map +1 -1
  589. package/dist/esm/monitoring/observability/services/__tests__/mock-metrics.service.d.ts.map +1 -1
  590. package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
  591. package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
  592. package/dist/esm/monitoring/observability/services/observability.backend.service.d.ts.map +1 -1
  593. package/dist/esm/notifications/email/components/email-components.d.ts.map +1 -1
  594. package/dist/esm/notifications/email/models/email-template-definition.d.ts.map +1 -1
  595. package/dist/esm/notifications/email/models/email-transport.backend.definitions.d.ts.map +1 -1
  596. package/dist/esm/notifications/email/services/email-batch-send.batch.backend.service.d.ts.map +1 -1
  597. package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
  598. package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
  599. package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
  600. package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
  601. package/dist/esm/notifications/email/services/email.backend.service.d.ts +47 -6
  602. package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
  603. package/dist/esm/notifications/email/services/email.backend.service.js +86 -36
  604. package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
  605. package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
  606. package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
  607. package/dist/esm/notifications/email/utils/interpolate-email-label.utils.d.ts.map +1 -1
  608. package/dist/esm/notifications/email/utils/zod-to-typescript.utils.d.ts.map +1 -1
  609. package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
  610. package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
  611. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
  612. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
  613. package/dist/esm/notifications/sms/models/sms-transport.backend.definitions.d.ts +32 -0
  614. package/dist/esm/notifications/sms/models/sms-transport.backend.definitions.d.ts.map +1 -0
  615. package/dist/esm/notifications/sms/models/sms-transport.backend.definitions.js +32 -0
  616. package/dist/esm/notifications/sms/models/sms-transport.backend.definitions.js.map +1 -0
  617. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +64 -10
  618. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
  619. package/dist/esm/notifications/sms/services/sms.backend.service.js +277 -82
  620. package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
  621. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
  622. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
  623. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
  624. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
  625. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts.map +1 -1
  626. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
  627. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
  628. package/dist/esm/notifications/webhooks/outbound/services/m2m-webhook-delivery-log.custom-impl.backend.service.d.ts.map +1 -1
  629. package/dist/esm/notifications/webhooks/outbound/services/m2m-webhook-delivery-log.repository.d.ts.map +1 -1
  630. package/dist/esm/notifications/webhooks/outbound/services/m2m-webhook-dispatcher.backend.service.d.ts.map +1 -1
  631. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-public-key.custom-impl.backend.service.d.ts.map +1 -1
  632. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
  633. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
  634. package/dist/esm/notifications/webhooks/outbound/services/webhook-config.backend.service.d.ts.map +1 -1
  635. package/dist/esm/notifications/webhooks/services/polymorphic-lookup.backend.service.d.ts.map +1 -1
  636. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
  637. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
  638. package/dist/esm/organizations/batches/organization-member-invitation-sweep.batch.backend.service.d.ts.map +1 -1
  639. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts.map +1 -1
  640. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
  641. package/dist/esm/organizations/services/authority-change-audit.backend.utils.d.ts.map +1 -1
  642. package/dist/esm/organizations/services/invitation-acceptance.backend.utils.d.ts.map +1 -1
  643. package/dist/esm/organizations/services/org-creation-on-registration.backend.utils.d.ts.map +1 -1
  644. package/dist/esm/organizations/services/org-member-roles-validation.backend.utils.d.ts.map +1 -1
  645. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
  646. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
  647. package/dist/esm/organizations/services/organization-deletion-audit.custom-impl.backend.service.d.ts.map +1 -1
  648. package/dist/esm/organizations/services/organization-member-custom-implementation.backend.service.d.ts.map +1 -1
  649. package/dist/esm/organizations/services/organization-onboarding-operation.backend.utils.d.ts.map +1 -1
  650. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.d.ts.map +1 -1
  651. package/dist/esm/organizations/services/organization-unit-member-custom-implementation.backend.service.d.ts.map +1 -1
  652. package/dist/esm/organizations/services/scim-provisioning-gate.backend.utils.d.ts.map +1 -1
  653. package/dist/esm/organizations/services/user-org-type-grant.backend.utils.d.ts.map +1 -1
  654. package/dist/esm/organizations/services/user-type-revocation-on-org-leave.backend.utils.d.ts.map +1 -1
  655. package/dist/esm/pdf-templates/__tests__/fixtures/tiny-pdf-template.fixture.d.ts.map +1 -1
  656. package/dist/esm/pdf-templates/models/pdf-template-binding.d.ts.map +1 -1
  657. package/dist/esm/pdf-templates/models/pdf-template-definition.d.ts.map +1 -1
  658. package/dist/esm/pdf-templates/services/pdf-generated-file-writer.backend.service.d.ts.map +1 -1
  659. package/dist/esm/pdf-templates/services/pdf-generation-orchestrator.backend.service.d.ts.map +1 -1
  660. package/dist/esm/pdf-templates/services/pdf-renderer.backend.service.d.ts.map +1 -1
  661. package/dist/esm/pdf-templates/services/pdf-template-binding.backend.service.d.ts.map +1 -1
  662. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -1
  663. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -1
  664. package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -1
  665. package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -1
  666. package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -1
  667. package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -1
  668. package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -1
  669. package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -1
  670. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
  671. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
  672. package/dist/esm/queue/apps-crontabs-manager.backend.service.d.ts.map +1 -1
  673. package/dist/esm/queue/cron-job-sync.backend.service.d.ts.map +1 -1
  674. package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
  675. package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
  676. package/dist/esm/queue/job-completion-registry.backend.service.d.ts.map +1 -1
  677. package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
  678. package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
  679. package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
  680. package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
  681. package/dist/esm/queue/job-payload-storage.backend.service.d.ts.map +1 -1
  682. package/dist/esm/queue/job-status-tracking.backend.service.d.ts.map +1 -1
  683. package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
  684. package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
  685. package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
  686. package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
  687. package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
  688. package/dist/esm/queue/queue.backend.service.js.map +1 -1
  689. package/dist/esm/queue/scheduled-message-verifier.backend.service.d.ts.map +1 -1
  690. package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
  691. package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
  692. package/dist/esm/rag/batches/rag-embedding-drain.batch.backend.service.d.ts.map +1 -1
  693. package/dist/esm/rag/batches/rag-reconciliation-sweep.batch.backend.service.d.ts.map +1 -1
  694. package/dist/esm/rag/models/rag-chunk-store.backend.types.d.ts.map +1 -1
  695. package/dist/esm/rag/models/rag-retrieval.backend.types.d.ts.map +1 -1
  696. package/dist/esm/rag/services/mongodb-rag-chunk-store.backend.service.d.ts.map +1 -1
  697. package/dist/esm/rag/services/postgresql-rag-chunk-store.backend.service.d.ts.map +1 -1
  698. package/dist/esm/rag/services/rag-chunk-collection.mongodb-ddl.backend.d.ts.map +1 -1
  699. package/dist/esm/rag/services/rag-chunk-retrieval.mongodb-query.backend.d.ts.map +1 -1
  700. package/dist/esm/rag/services/rag-chunk-retrieval.postgresql-query.backend.d.ts.map +1 -1
  701. package/dist/esm/rag/services/rag-chunk-store.backend.service.d.ts.map +1 -1
  702. package/dist/esm/rag/services/rag-chunk-table.postgresql-ddl.backend.d.ts.map +1 -1
  703. package/dist/esm/rag/services/rag-ingestion.backend.service.d.ts.map +1 -1
  704. package/dist/esm/rag/services/rag-retrieval.backend.service.d.ts.map +1 -1
  705. package/dist/esm/rag/utils/rag-chunk-fusion.backend.utils.d.ts.map +1 -1
  706. package/dist/esm/rag/utils/rag-chunk-removal.backend.utils.d.ts.map +1 -1
  707. package/dist/esm/rag/utils/rag-chunk-row-shaping.backend.utils.d.ts.map +1 -1
  708. package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
  709. package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
  710. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
  711. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
  712. package/dist/esm/rag/utils/rag-ingestion-trigger.backend.utils.d.ts.map +1 -1
  713. package/dist/esm/rag/utils/rag-retrieval-scope.backend.utils.d.ts.map +1 -1
  714. package/dist/esm/rag/utils/rag-source-field-value.backend.utils.d.ts.map +1 -1
  715. package/dist/esm/requests/models/api-routes.backend.defintions.d.ts.map +1 -1
  716. package/dist/esm/requests/models/requests.backend.schemas.d.ts.map +1 -1
  717. package/dist/esm/requests/service/platform-mutualized-handler.backend.service.d.ts.map +1 -1
  718. package/dist/esm/requests/service/platform-requests.backend.utils.d.ts.map +1 -1
  719. package/dist/esm/requests/service/remote-client-base.backend.service.d.ts.map +1 -1
  720. package/dist/esm/requests/service/serverless-services-handler.backend.service.d.ts.map +1 -1
  721. package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
  722. package/dist/esm/requests/service/websocket.service.js +49 -1
  723. package/dist/esm/requests/service/websocket.service.js.map +1 -1
  724. package/dist/esm/resources/backend-resource-registry.exports.d.ts.map +1 -1
  725. package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
  726. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +2 -0
  727. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
  728. package/dist/esm/resources/models/index.d.ts.map +1 -1
  729. package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
  730. package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
  731. package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
  732. package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
  733. package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
  734. package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
  735. package/dist/esm/resources/models/resources.backend.schemas.d.ts.map +1 -1
  736. package/dist/esm/resources/models/virtual-fields.backend.types.d.ts.map +1 -1
  737. package/dist/esm/resources/services/__tests__/mock-resources-registry.service.d.ts.map +1 -1
  738. package/dist/esm/resources/services/resource-context.backend.service.d.ts.map +1 -1
  739. package/dist/esm/resources/services/resource-id.backend.service.d.ts.map +1 -1
  740. package/dist/esm/resources/services/resource-population.backend.service.d.ts +17 -2
  741. package/dist/esm/resources/services/resource-population.backend.service.d.ts.map +1 -1
  742. package/dist/esm/resources/services/resource-population.backend.service.js +74 -18
  743. package/dist/esm/resources/services/resource-population.backend.service.js.map +1 -1
  744. package/dist/esm/resources/services/resources-registry.backend.service.d.ts +23 -0
  745. package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
  746. package/dist/esm/resources/services/resources-registry.backend.service.js +31 -0
  747. package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
  748. package/dist/esm/resources/services/virtual-fields.backend.service.d.ts.map +1 -1
  749. package/dist/esm/resources/utils/resource-retention.backend.utils.d.ts.map +1 -1
  750. package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
  751. package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
  752. package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
  753. package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
  754. package/dist/esm/runtime/models/execution-context.backend.schemas.d.ts.map +1 -1
  755. package/dist/esm/runtime/models/request-context.als.backend.d.ts.map +1 -1
  756. package/dist/esm/runtime/models/runtime.backend.schemas.d.ts.map +1 -1
  757. package/dist/esm/runtime/services/execution-context-creator.backend.service.d.ts.map +1 -1
  758. package/dist/esm/runtime/services/execution-context-creator.backend.service.js.map +1 -1
  759. package/dist/esm/runtime/services/execution-context-handler.backend.service.d.ts.map +1 -1
  760. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
  761. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
  762. package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
  763. package/dist/esm/runtime/services/http-server.backend.service.js +10 -0
  764. package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
  765. package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
  766. package/dist/esm/runtime/services/start-application.backend.service.js +26 -12
  767. package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
  768. package/dist/esm/runtime/services/utils/oauth-body-cap.backend.utils.d.ts.map +1 -1
  769. package/dist/esm/runtime/testing/execution-context-test-fixtures.d.ts.map +1 -1
  770. package/dist/esm/runtime/testing/mock-execution-context-creator.service.d.ts.map +1 -1
  771. package/dist/esm/runtime/utils/application-startup-config-access.backend.utils.d.ts.map +1 -1
  772. package/dist/esm/runtime/utils/feature-gated-core-resource-exclusions.backend.utils.d.ts.map +1 -1
  773. package/dist/esm/runtime/utils/request-client-ip.utils.d.ts.map +1 -1
  774. package/dist/esm/runtime/utils/scan-default-exports.backend.utils.d.ts.map +1 -1
  775. package/dist/esm/security/api-keys/api-key-generation.backend.utils.d.ts.map +1 -1
  776. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
  777. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
  778. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
  779. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
  780. package/dist/esm/security/authentications/controllers/auth-method-management-controller.backend.service.d.ts.map +1 -1
  781. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts +22 -0
  782. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
  783. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +84 -0
  784. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
  785. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
  786. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
  787. package/dist/esm/security/authentications/models/auth-constants.backend.d.ts.map +1 -1
  788. package/dist/esm/security/authentications/models/authentications.backend.schemas.d.ts.map +1 -1
  789. package/dist/esm/security/authentications/models/authorization-client.backend.schemas.d.ts.map +1 -1
  790. package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
  791. package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
  792. package/dist/esm/security/authentications/models/federated-auth-transport.backend.definitions.d.ts +37 -0
  793. package/dist/esm/security/authentications/models/federated-auth-transport.backend.definitions.d.ts.map +1 -0
  794. package/dist/esm/security/authentications/models/federated-auth-transport.backend.definitions.js +37 -0
  795. package/dist/esm/security/authentications/models/federated-auth-transport.backend.definitions.js.map +1 -0
  796. package/dist/esm/security/authentications/models/identity-persistence-boundaries.backend.d.ts.map +1 -1
  797. package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts.map +1 -1
  798. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
  799. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
  800. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
  801. package/dist/esm/security/authentications/models/saml-authentication.backend.schemas.d.ts.map +1 -1
  802. package/dist/esm/security/authentications/models/sso-connection.backend.schemas.d.ts.map +1 -1
  803. package/dist/esm/security/authentications/models/user-authorization-version.backend.utils.d.ts.map +1 -1
  804. package/dist/esm/security/authentications/seeds/enterprise-config-defaults.seeds.d.ts.map +1 -1
  805. package/dist/esm/security/authentications/services/__tests__/mock-auth-execution-context-factory.service.d.ts.map +1 -1
  806. package/dist/esm/security/authentications/services/__tests__/mock-auth-token-issuer.service.d.ts.map +1 -1
  807. package/dist/esm/security/authentications/services/__tests__/oauth-provider-audit-spies.mock.d.ts.map +1 -1
  808. package/dist/esm/security/authentications/services/admin-config/__tests__/mock-domain-to-org-lookup.service.d.ts.map +1 -1
  809. package/dist/esm/security/authentications/services/admin-config/__tests__/mock-enterprise-user-provisioning.service.d.ts.map +1 -1
  810. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
  811. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
  812. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
  813. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
  814. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
  815. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
  816. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
  817. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
  818. package/dist/esm/security/authentications/services/admin-config/oidc-discovery.backend.service.d.ts.map +1 -1
  819. package/dist/esm/security/authentications/services/admin-config/oidc-discovery.backend.service.js +2 -1
  820. package/dist/esm/security/authentications/services/admin-config/oidc-discovery.backend.service.js.map +1 -1
  821. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +9 -2
  822. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
  823. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +9 -2
  824. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
  825. package/dist/esm/security/authentications/services/auth-credential-verifier.backend.service.d.ts.map +1 -1
  826. package/dist/esm/security/authentications/services/auth-execution-context-factory.backend.service.d.ts.map +1 -1
  827. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
  828. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
  829. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.d.ts.map +1 -1
  830. package/dist/esm/security/authentications/services/auth-methods/auth-password-reset.backend.service.d.ts.map +1 -1
  831. package/dist/esm/security/authentications/services/auth-methods/auth-phone-verification.backend.service.d.ts.map +1 -1
  832. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
  833. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
  834. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts +97 -0
  835. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
  836. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +218 -26
  837. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
  838. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts +14 -0
  839. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
  840. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +36 -0
  841. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
  842. package/dist/esm/security/authentications/services/auth-methods/saml-assertion-validator.backend.service.d.ts.map +1 -1
  843. package/dist/esm/security/authentications/services/auth-methods/saml-authentication.backend.service.d.ts.map +1 -1
  844. package/dist/esm/security/authentications/services/auth-methods/saml-metadata.backend.service.d.ts.map +1 -1
  845. package/dist/esm/security/authentications/services/auth-methods/saml-replay-guard.backend.service.d.ts.map +1 -1
  846. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
  847. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
  848. package/dist/esm/security/authentications/services/auth-session-store.backend.service.d.ts.map +1 -1
  849. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
  850. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
  851. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
  852. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
  853. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
  854. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
  855. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
  856. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
  857. package/dist/esm/security/authentications/services/custom-impls/scim-tokens.custom-impl.backend.service.d.ts.map +1 -1
  858. package/dist/esm/security/authentications/services/custom-impls/siem-delivery-dlq.custom-impl.backend.service.d.ts.map +1 -1
  859. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -1
  860. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +57 -1
  861. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -1
  862. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
  863. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
  864. package/dist/esm/security/authentications/services/custom-impls/sso-connection.custom-impl.backend.service.d.ts.map +1 -1
  865. package/dist/esm/security/authentications/services/custom-impls/sso-connection.custom-impl.backend.service.js +11 -1
  866. package/dist/esm/security/authentications/services/custom-impls/sso-connection.custom-impl.backend.service.js.map +1 -1
  867. package/dist/esm/security/authentications/services/email-verification-initiator.backend.service.d.ts.map +1 -1
  868. package/dist/esm/security/authentications/services/machine-token-issuer.backend.service.d.ts.map +1 -1
  869. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
  870. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
  871. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
  872. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
  873. package/dist/esm/security/authentications/services/oidc-user-claims.backend.service.d.ts.map +1 -1
  874. package/dist/esm/security/authentications/services/resolve-active-member-orgs.backend.utils.d.ts.map +1 -1
  875. package/dist/esm/security/authentications/services/utils/__tests__/mock-auth-user-lookup.service.d.ts.map +1 -1
  876. package/dist/esm/security/authentications/services/utils/auth-controller.utils.d.ts.map +1 -1
  877. package/dist/esm/security/authentications/services/utils/auth-credential-ops.backend.service.d.ts.map +1 -1
  878. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
  879. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
  880. package/dist/esm/security/authentications/services/utils/auth-response-helper.backend.service.d.ts.map +1 -1
  881. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
  882. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
  883. package/dist/esm/security/authentications/services/utils/concurrent-session-eviction.backend.utils.d.ts.map +1 -1
  884. package/dist/esm/security/authentications/services/utils/ensure-user-profile.backend.utils.d.ts.map +1 -1
  885. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
  886. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
  887. package/dist/esm/security/authentications/services/utils/machine-auth-rate-limit.backend.utils.d.ts.map +1 -1
  888. package/dist/esm/security/authentications/services/utils/pkce.backend.utils.d.ts.map +1 -1
  889. package/dist/esm/security/authentications/services/utils/saml-java-availability.d.ts.map +1 -1
  890. package/dist/esm/security/authentications/utils/application-auth-policy-audit.backend.utils.d.ts.map +1 -1
  891. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
  892. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
  893. package/dist/esm/security/authentications/utils/one-off-session-lifetime.backend.utils.d.ts.map +1 -1
  894. package/dist/esm/security/authentications/utils/social-oauth2-purpose.backend.utils.d.ts.map +1 -1
  895. package/dist/esm/security/authorizations/access-grant-decision.factory.backend.d.ts +59 -0
  896. package/dist/esm/security/authorizations/access-grant-decision.factory.backend.d.ts.map +1 -0
  897. package/dist/esm/security/authorizations/access-grant-decision.factory.backend.js +111 -0
  898. package/dist/esm/security/authorizations/access-grant-decision.factory.backend.js.map +1 -0
  899. package/dist/esm/security/authorizations/access-grant-lifecycle-audit.backend.d.ts +57 -0
  900. package/dist/esm/security/authorizations/access-grant-lifecycle-audit.backend.d.ts.map +1 -0
  901. package/dist/esm/security/authorizations/access-grant-lifecycle-audit.backend.js +133 -0
  902. package/dist/esm/security/authorizations/access-grant-lifecycle-audit.backend.js.map +1 -0
  903. package/dist/esm/security/authorizations/application-access-grant-custom-implementation.backend.service.d.ts +41 -0
  904. package/dist/esm/security/authorizations/application-access-grant-custom-implementation.backend.service.d.ts.map +1 -0
  905. package/dist/esm/security/authorizations/application-access-grant-custom-implementation.backend.service.js +157 -0
  906. package/dist/esm/security/authorizations/application-access-grant-custom-implementation.backend.service.js.map +1 -0
  907. package/dist/esm/security/authorizations/application-wide-read-admission.backend.d.ts +84 -0
  908. package/dist/esm/security/authorizations/application-wide-read-admission.backend.d.ts.map +1 -0
  909. package/dist/esm/security/authorizations/application-wide-read-admission.backend.js +99 -0
  910. package/dist/esm/security/authorizations/application-wide-read-admission.backend.js.map +1 -0
  911. package/dist/esm/security/authorizations/authorization-denial-audit.backend.utils.d.ts.map +1 -1
  912. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -1
  913. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -1
  914. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.d.ts.map +1 -1
  915. package/dist/esm/security/authorizations/junction-scope-resolution.backend.d.ts.map +1 -1
  916. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
  917. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
  918. package/dist/esm/security/authorizations/organization-unit-narrowing-enforcement.backend.d.ts.map +1 -1
  919. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
  920. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +20 -181
  921. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
  922. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts.map +1 -1
  923. package/dist/esm/security/authorizations/relationship-foreign-key-filter.backend.d.ts.map +1 -1
  924. package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
  925. package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
  926. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +40 -0
  927. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -1
  928. package/dist/esm/security/authorizations/role-conferral.backend.utils.js +43 -1
  929. package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -1
  930. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +27 -17
  931. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
  932. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +27 -17
  933. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
  934. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +72 -0
  935. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
  936. package/dist/esm/security/authorizations/services/authorizations.backend.service.js +153 -10
  937. package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
  938. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
  939. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
  940. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -1
  941. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -1
  942. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +139 -1
  943. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -1
  944. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +474 -33
  945. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -1
  946. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +40 -0
  947. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -1
  948. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -1
  949. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -1
  950. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -1
  951. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +19 -0
  952. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -1
  953. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +38 -0
  954. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -1
  955. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -1
  956. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -1
  957. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -1
  958. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +17 -1
  959. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -1
  960. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +14 -0
  961. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -1
  962. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +16 -0
  963. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -1
  964. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -1
  965. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +1 -1
  966. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -1
  967. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +19 -0
  968. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -1
  969. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +45 -2
  970. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -1
  971. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -1
  972. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -1
  973. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +37 -1
  974. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -1
  975. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -1
  976. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -1
  977. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -1
  978. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -1
  979. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -1
  980. package/dist/esm/security/connected-accounts/utils/user-delegated-access-token-slot.backend.utils.d.ts +34 -0
  981. package/dist/esm/security/connected-accounts/utils/user-delegated-access-token-slot.backend.utils.d.ts.map +1 -0
  982. package/dist/esm/security/connected-accounts/utils/user-delegated-access-token-slot.backend.utils.js +39 -0
  983. package/dist/esm/security/connected-accounts/utils/user-delegated-access-token-slot.backend.utils.js.map +1 -0
  984. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts.map +1 -1
  985. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts.map +1 -1
  986. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts.map +1 -1
  987. package/dist/esm/security/consumable-tokens/models/consumable-tokens.shared.schemas.d.ts.map +1 -1
  988. package/dist/esm/security/consumable-tokens/models/index.d.ts.map +1 -1
  989. package/dist/esm/security/consumable-tokens/services/__tests__/mock-consumable-token.service.d.ts.map +1 -1
  990. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
  991. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
  992. package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
  993. package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
  994. package/dist/esm/security/jwt/services/auth-jwt-guard.backend.service.d.ts.map +1 -1
  995. package/dist/esm/security/jwt/services/jwt.backend.service.d.ts.map +1 -1
  996. package/dist/esm/security/jwt/services/wildo-worker-bootstrap-client.backend.service.d.ts +13 -0
  997. package/dist/esm/security/jwt/services/wildo-worker-bootstrap-client.backend.service.d.ts.map +1 -1
  998. package/dist/esm/security/jwt/services/wildo-worker-bootstrap-client.backend.service.js +14 -0
  999. package/dist/esm/security/jwt/services/wildo-worker-bootstrap-client.backend.service.js.map +1 -1
  1000. package/dist/esm/security/jwt/utils/jwt-verification-error-classification.backend.utils.d.ts.map +1 -1
  1001. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
  1002. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
  1003. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
  1004. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
  1005. package/dist/esm/security/outbound/outbound-request-deadline.backend.utils.d.ts +39 -0
  1006. package/dist/esm/security/outbound/outbound-request-deadline.backend.utils.d.ts.map +1 -0
  1007. package/dist/esm/security/outbound/outbound-request-deadline.backend.utils.js +60 -0
  1008. package/dist/esm/security/outbound/outbound-request-deadline.backend.utils.js.map +1 -0
  1009. package/dist/esm/security/outbound/outbound-request-headers.backend.utils.d.ts +66 -0
  1010. package/dist/esm/security/outbound/outbound-request-headers.backend.utils.d.ts.map +1 -0
  1011. package/dist/esm/security/outbound/outbound-request-headers.backend.utils.js +75 -0
  1012. package/dist/esm/security/outbound/outbound-request-headers.backend.utils.js.map +1 -0
  1013. package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
  1014. package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
  1015. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
  1016. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
  1017. package/dist/esm/security/scim/utils/scim-attribute-path-resolver.backend.utils.d.ts.map +1 -1
  1018. package/dist/esm/security/scim/utils/scim-filter-parser.d.ts.map +1 -1
  1019. package/dist/esm/security/scim/utils/scim-response-formatter.d.ts.map +1 -1
  1020. package/dist/esm/security/session-invalidation-fence.backend.utils.d.ts.map +1 -1
  1021. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
  1022. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
  1023. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -1
  1024. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -1
  1025. package/dist/esm/security/token-invalidation-fence.backend.utils.d.ts.map +1 -1
  1026. package/dist/esm/testing.d.ts.map +1 -1
  1027. package/dist/esm/users/services/inbound-contact-custom-implementation.backend.service.d.ts.map +1 -1
  1028. package/dist/esm/users/services/user-deletion-audit.custom-impl.backend.service.d.ts.map +1 -1
  1029. package/dist/esm/users/services/user-force-password-reset.custom-impl.backend.service.d.ts.map +1 -1
  1030. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -1
  1031. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -1
  1032. package/dist/esm/users/services/user-role-administration.custom-impl.backend.service.d.ts.map +1 -1
  1033. package/dist/esm/users/services/user-self-custom-implementations.backend.d.ts.map +1 -1
  1034. package/dist/esm/users/services/user-super-admin-floor.custom-impl.backend.service.d.ts.map +1 -1
  1035. package/dist/tsconfig.build.tsbuildinfo +1 -1
  1036. package/package.json +9 -9
  1037. package/dist/esm/external-providers/services/flow-actor-design.backend.service.d.ts +0 -45
  1038. package/dist/esm/external-providers/services/flow-actor-design.backend.service.d.ts.map +0 -1
  1039. package/dist/esm/external-providers/services/flow-actor-design.backend.service.js +0 -22
  1040. package/dist/esm/external-providers/services/flow-actor-design.backend.service.js.map +0 -1
  1041. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -0
  1042. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -0
  1043. package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -0
  1044. package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -0
  1045. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -0
  1046. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -0
  1047. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -0
  1048. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -0
  1049. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -0
  1050. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -0
  1051. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -0
  1052. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -0
  1053. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -0
  1054. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -0
  1055. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -0
  1056. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"billing-account.mutations.custom-impl.backend.service.js","sourceRoot":"","sources":["../../../../../../src/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Billing Account Mutations Custom Implementations\n *\n * Implements CREATE, OPEN_CHECKOUT, OPEN_PORTAL operations\n * on billing account polymorphic variants.\n *\n * Patterns:\n * CREATE → PREFIX_CORE_OPERATIONS — PREFIX calls provider.createCustomer(), core CREATE writes to DB\n * DELETE → PREFIX_CORE_OPERATIONS — PREFIX refuses the hard delete (409) while retained\n * financial children still reference the account; core DELETE otherwise proceeds\n * OPEN_CHECKOUT → REPLACE_CORE_OPERATIONS — calls provider.createCheckoutSession(), returns { url, sessionId }\n * OPEN_PORTAL → REPLACE_CORE_OPERATIONS — calls provider.createCustomerPortalSession(), returns { url }\n *\n * One factory per polymorphic variant (org, user) per operation.\n *\n * @see billing-polymorphic-full-implementation.md §4.4\n */\n\nimport {\n CoreResourceOperation,\n CoreResourceType,\n ResourceOperationVariantType,\n ResourcePrimaryScope,\n ProductType,\n TaxCalculationMode,\n ErrorType,\n ErrorCustomMessageReference,\n BillingAccount_Operations,\n BillingAccount_OpenCheckoutRequestDto,\n BillingAccount_OpenPortalRequestDto,\n} from '@wildo-ai/saas-models';\nimport {\n createResourceCustomServiceImplementation,\n type ResourceCustomServiceImplementationFactory,\n} from '~wildo-backend-lib/base-classes/services/services/resource-operation-custom-implementation.factory.backend';\nimport type { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport {\n describeUnaddressableShape,\n resolveSingleSubjectId,\n} from '~wildo-backend-lib/base-classes/utils/single-subject-addressing.backend.utils';\nimport { getBillingProvider, getBillingProviderRef, getBillingConfig, getBillingStateService } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-implementations.backend';\nimport { assertNoBillingAccountDependents, BillingCatalogReadIntent, readProductByKey, readPriceForProduct, readPromotionByCode, resolveBillingVariantsFromResourceType } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-impl-utils.backend';\nimport { buildCheckoutSessionMetadata } from '~wildo-backend-lib/billing/services/billing-checkout-metadata.backend.utils';\n\n// ── Billing account polymorphic variant types ────────────────────────\n\nconst BILLING_ACCOUNT_VARIANT_TYPES = [\n CoreResourceType.ORGANIZATION_BILLING_ACCOUNTS,\n CoreResourceType.USER_BILLING_ACCOUNTS,\n] as const;\n\n// ════════════════════════════════════════════════════════════════════\n// CREATE — PREFIX_CORE_OPERATIONS\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create billing account CREATE custom impl factories for all variants.\n *\n * PREFIX: Creates a customer on the billing provider (Stripe), returns the create data\n * augmented with providerCustomerId and providerRef.\n * CORE: Standard CREATE writes to DB.\n *\n * Registered on `INTERNAL_CALL` — the variant the resource configuration actually declares\n * for CREATE. This registration was authored against `REPOSITORY_ONLY` and was orphaned when\n * 623c5aee moved the configured variant to `INTERNAL_CALL` (the auto-create path runs through\n * `SystemAccessBackendService.createAsSystem`, which the service tier only reaches via\n * INTERNAL_CALL / API_CALL). Because custom implementations resolve by an EXACT operation-path\n * key that embeds `variantType`, the stale registration was unreachable rather than degraded:\n * `provider.createCustomer()` never ran and every auto-created account was persisted with no\n * `providerCustomerId` — the only local key mapping invoices and subscriptions back to the\n * provider customer. Pinned by `billing-custom-impl-operation-path-coherence.test.ts`.\n */\nexport function createBillingAccountCreateFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: CoreResourceOperation.CREATE,\n variantType: ResourceOperationVariantType.INTERNAL_CALL,\n isOperationDefault: true,\n },\n handlers: {\n prefixCoreOperations: async (_id, input, executionContext, _operationPath, utils) => {\n const provider = getBillingProvider();\n\n // Extract contact info from the initiator's user context\n const userContext = utils.initiatorUserContext;\n const email = userContext?.email || 'unknown@example.com';\n const name = userContext?.displayName || userContext?.name || userContext?.email || 'Unknown';\n\n const { providerCustomerId } = await provider.createCustomer({\n email,\n name,\n metadata: {\n resourceType: variantResourceType,\n ...input.metadata,\n },\n });\n\n return {\n ...input,\n providerCustomerId,\n providerRef: getBillingProviderRef(),\n isActive: true,\n };\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n\n// ════════════════════════════════════════════════════════════════════\n// DELETE — PREFIX_CORE_OPERATIONS (dependents guard)\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create billing account DELETE guard factories for all variants.\n *\n * PREFIX: refuses the hard delete with 409 `BILLING_ACCOUNT_HAS_DEPENDENTS` while retained\n * subscriptions / invoice refs / usage records / credit pools still reference the account.\n * There is no CORE replacement — when the guard passes, the standard DELETE proceeds untouched.\n *\n * This enforces the billing-retention decision (2026-07-29) rather than adding new policy: that\n * decision disabled all 18 billing cascades so the financial audit trail survives its scope, and\n * its rationale block explicitly forbids the resulting half-state (\"retaining the children while\n * deleting the account strands the provider-customer mapping\"). A direct hard delete was the only\n * remaining path into that state. See `assertNoBillingAccountDependents` for the full reasoning.\n *\n * Registered on `INTERNAL_CALL` — the variant the resource configuration actually declares for\n * DELETE. Custom implementations are resolved by an exact operation-path key that embeds\n * `variantType`, so a guard registered under any other variant would never run.\n */\nexport function createBillingAccountDeleteDependentsGuardFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: CoreResourceOperation.DELETE,\n variantType: ResourceOperationVariantType.INTERNAL_CALL,\n isOperationDefault: true,\n },\n handlers: {\n prefixCoreOperations: async (_id, input, executionContext, _operationPath, utils) => {\n // Fail closed: the dependent scan filters on a single account id, so a POPULATION-addressed\n // delete (an ids array or an unpinned filter reaching this path via `doByOperationPath`)\n // must be refused rather than silently producing a filter that matches nothing and waving\n // the delete through. DELETE is CRITICAL.\n //\n // A conditional `{ _id, … }` filter resolves to that one account and is admitted — the scan\n // then runs against exactly the account the delete can destroy.\n const billingAccountId = resolveSingleSubjectId(_id);\n if (billingAccountId === undefined) {\n throw utils.errorBuilder.buildError(ErrorType.VALIDATION, executionContext, {\n context: {\n message: 'Billing account DELETE requires a single addressed account to verify dependents',\n resourceType: variantResourceType,\n receivedAddressing: describeUnaddressableShape(_id),\n },\n });\n }\n\n const variants = resolveBillingVariantsFromResourceType(variantResourceType);\n if (!variants) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_SCOPE_NOT_ENABLED,\n context: { resourceType: variantResourceType },\n });\n }\n\n await assertNoBillingAccountDependents(billingAccountId, variants, executionContext, utils);\n\n // Guard only — the core DELETE input is passed through unchanged.\n return input;\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n\n// ════════════════════════════════════════════════════════════════════\n// OPEN_CHECKOUT — REPLACE_CORE_OPERATIONS\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create OPEN_CHECKOUT custom impl factories for all variants.\n *\n * REPLACE: Resolves the billing account, product, and price.\n * Creates a Stripe Checkout Session and returns the redirect URL.\n * No DB write — the subscription is created by webhook after payment.\n */\nexport function createBillingAccountOpenCheckoutFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: BillingAccount_Operations.OPEN_CHECKOUT,\n variantType: ResourceOperationVariantType.API_CALL,\n isOperationDefault: true,\n },\n requestDtoSchema: BillingAccount_OpenCheckoutRequestDto,\n handlers: {\n replaceCoreOperations: async (_id, input, executionContext, _operationPath, utils) => {\n const billingAccount = utils.currentObject;\n\n if (!billingAccount?.providerCustomerId) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_NO_PROVIDER_CUSTOMER,\n context: { billingAccountId: _id },\n });\n }\n\n // Resolve product and price\n // ACQUIRE: this is the purchase itself, so a product the catalogue has retired is refused.\n const product = await readProductByKey(input.productKey, BillingCatalogReadIntent.ACQUIRE, executionContext, utils);\n\n // Validate product scope — prevent purchasing a product targeted at a different scope\n const variants = resolveBillingVariantsFromResourceType(variantResourceType);\n if (variants && product.targetScopes && !product.targetScopes.includes(variants.scopeType)) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_SCOPE_MISMATCH,\n context: {\n productKey: input.productKey,\n productScopes: product.targetScopes,\n currentScope: variants.scopeType,\n },\n });\n }\n\n // The price MUST belong to the product being purchased. Resolving the two independently\n // (which this did) bills the provider for one product's price while the local record —\n // and therefore every entitlement derived from it — names another.\n const price = await readPriceForProduct(input.priceId, product, executionContext, utils);\n\n if (!price.providerPriceId) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_NO_PROVIDER_PRICE,\n context: { priceId: input.priceId, productKey: input.productKey },\n });\n }\n\n // Determine checkout mode based on product type\n const isSubscription = [ProductType.PLAN, ProductType.ADDON, ProductType.METERED].includes(product.type as ProductType);\n\n // Resolve trial days\n const config = getBillingConfig();\n const trialDays = input.trialDays\n ?? product.behaviorPolicy?.trial?.days\n ?? config.defaultBehaviorPolicy.defaultTrialDays;\n\n // Resolve promotion code → provider promotion code ID (C1 + H3)\n let providerPromotionCodeId: string | undefined;\n /** The Wildo promotion row behind that code, carried into metadata so completion can count it (#518). */\n let appliedPromotionId: string | undefined;\n if (input.promotionCode) {\n const promotion = await readPromotionByCode(input.promotionCode, executionContext, utils);\n if (!promotion) {\n throw utils.errorBuilder.buildError(ErrorType.NOT_FOUND, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_NOT_FOUND,\n context: { promotionCode: input.promotionCode },\n });\n }\n\n const now = new Date();\n if (promotion.validFrom && now < new Date(promotion.validFrom)) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Promotion has not started yet' },\n });\n }\n if (promotion.validUntil && now > new Date(promotion.validUntil)) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Promotion has expired' },\n });\n }\n if (promotion.maxRedemptions !== null && promotion.maxRedemptions !== undefined) {\n if ((promotion.timesRedeemed ?? 0) >= promotion.maxRedemptions) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Maximum redemptions reached' },\n });\n }\n }\n if (promotion.applicableProducts?.length > 0 && !promotion.applicableProducts.includes(input.productKey)) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Promotion is not applicable to this product', productKey: input.productKey },\n });\n }\n if (!promotion.providerPromotionId && !promotion.providerCouponId) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Promotion is not synced to billing provider' },\n });\n }\n providerPromotionCodeId = promotion.providerPromotionId;\n appliedPromotionId = promotion._id;\n }\n\n // Create checkout session on provider\n const provider = getBillingProvider();\n const session = await provider.createCheckoutSession({\n providerCustomerId: billingAccount.providerCustomerId,\n lineItems: [{ providerPriceId: price.providerPriceId, quantity: input.quantity }],\n mode: isSubscription ? 'subscription' : 'payment',\n successUrl: input.successUrl,\n cancelUrl: input.cancelUrl,\n trialPeriodDays: isSubscription && trialDays > 0 ? trialDays : undefined,\n /*\n * #408 (2026-09-08) — two authored declarations that reached no provider call until\n * now, and this is the ONLY live purchase route, so this is where they take effect.\n *\n * `automaticTax`: the application's `billing.tax.calculationMode`. PROVIDER_MANAGED\n * used to change nothing, leaving the Stripe account's own configuration to decide\n * silently whether tax was computed.\n *\n * `requirePaymentMethodForTrial`: the PRODUCT's declaration, and only meaningful when\n * this checkout actually starts a trial — asking for a card up front on a purchase\n * with no trial is a different decision nobody authored. Wonder Todos' enterprise plan\n * declares `true` and its professional plan `false`, and the two were indistinguishable\n * at the provider.\n */\n automaticTax: config.tax?.calculationMode === TaxCalculationMode.PROVIDER_MANAGED,\n requirePaymentMethodForTrial: isSubscription\n && trialDays > 0\n && product.behaviorPolicy?.trial?.requirePaymentMethod === true,\n /*\n * NEVER let the provider's own promotion-code entry accept a code (#518).\n *\n * This was `!providerPromotionCodeId` — so whenever a customer supplied NO code, the\n * hosted checkout page offered its own promo-code box, and a code typed there bypassed\n * every control the block above enforces: `validFrom`, `validUntil`, `maxRedemptions`\n * and `applicableProducts`. Four authored controls, silently optional, because the\n * discount was applied by the provider from its own synced coupon and Wildo never saw\n * the redemption at all.\n *\n * A code now reaches a purchase only through `input.promotionCode`, which is validated\n * here and counted at completion. An application that wants to offer a code entry\n * collects it in its own UI and passes it — which is also the only way the four\n * controls can mean anything.\n */\n allowPromotionCodes: false,\n providerPromotionCodeId,\n // The provider echoes this map back VERBATIM inside a genuinely signed\n // `checkout.session.completed`, and the webhook router turns it into a credit grant. It\n // used to be assembled with `...input.metadata` LAST, so a caller-supplied record could\n // overwrite `billingAccountId` / `productKey` / `quantity` — no signature forgery\n // required, because a valid signature proves the PROVIDER sent the bytes, not that WE\n // wrote them. The builder writes the framework's reserved keys last and strips reserved\n // keys out of caller metadata; see `billing-checkout-metadata.backend.utils.ts`.\n metadata: buildCheckoutSessionMetadata({\n billingAccountId: _id!,\n productKey: input.productKey,\n quantity: input.quantity,\n // Carried so the redemption can be COUNTED when the session completes (#518). The\n // validation above refused an exhausted code and then never incremented anything, so\n // a code used only through checkout stayed at zero redemptions forever and\n // `maxRedemptions` could be exceeded without limit.\n promotionId: appliedPromotionId,\n callerMetadata: input.metadata,\n }),\n });\n\n return { url: session.url, sessionId: session.sessionId };\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n\n// ════════════════════════════════════════════════════════════════════\n// OPEN_PORTAL — REPLACE_CORE_OPERATIONS\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create OPEN_PORTAL custom impl factories for all variants.\n *\n * REPLACE: Resolves the billing account's providerCustomerId, creates a\n * Stripe Customer Portal session, and returns the redirect URL.\n * No DB write.\n */\nexport function createBillingAccountOpenPortalFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: BillingAccount_Operations.OPEN_PORTAL,\n variantType: ResourceOperationVariantType.API_CALL,\n isOperationDefault: true,\n },\n requestDtoSchema: BillingAccount_OpenPortalRequestDto,\n handlers: {\n replaceCoreOperations: async (_id, input, executionContext, _operationPath, utils) => {\n const billingAccount = utils.currentObject;\n\n if (!billingAccount?.providerCustomerId) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_NO_PROVIDER_CUSTOMER,\n context: { billingAccountId: _id },\n });\n }\n\n const provider = getBillingProvider();\n const result = await provider.createCustomerPortalSession(\n billingAccount.providerCustomerId,\n input.returnUrl,\n );\n\n return { url: result.url };\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n\n// ════════════════════════════════════════════════════════════════════\n// GET_STATE — REPLACE_CORE_OPERATIONS (collection-level)\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create GET_STATE custom impl factories for all variants.\n *\n * REPLACE: Collection-level operation (no entity ID). Resolves scopeType\n * and scopeEntityId from execution context, delegates to BillingStateBackendService.\n * Returns the full aggregated billing state with automatic authorization via\n * the engine's parent scope validation.\n */\nexport function createBillingAccountGetStateFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: BillingAccount_Operations.GET_STATE,\n variantType: ResourceOperationVariantType.API_CALL,\n isOperationDefault: true,\n },\n handlers: {\n replaceCoreOperations: async (_id, _input, executionContext, _operationPath, _utils) => {\n const variants = resolveBillingVariantsFromResourceType(variantResourceType);\n if (!variants) {\n throw _utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_SCOPE_NOT_ENABLED,\n context: { resourceType: variantResourceType },\n });\n }\n\n const scopeEntityId = executionContext[variants.scopeKey] as string | undefined;\n if (!scopeEntityId) {\n throw _utils.errorBuilder.buildError(ErrorType.VALIDATION, executionContext, {\n context: { message: 'Missing scope entity ID in execution context', scopeKey: variants.scopeKey },\n });\n }\n\n const billingConfig = getBillingConfig();\n const enabledScopes = billingConfig.enabledScopes ?? [ResourcePrimaryScope.ORGANIZATIONS];\n\n const billingStateService = getBillingStateService();\n return billingStateService.getState(variants.scopeType, scopeEntityId, enabledScopes, executionContext);\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n"]}
1
+ {"version":3,"file":"billing-account.mutations.custom-impl.backend.service.js","sourceRoot":"","sources":["../../../../../src/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Billing Account Mutations Custom Implementations\n *\n * Implements CREATE, OPEN_CHECKOUT, OPEN_PORTAL operations\n * on billing account polymorphic variants.\n *\n * Patterns:\n * CREATE → PREFIX_CORE_OPERATIONS — PREFIX calls provider.createCustomer(), core CREATE writes to DB\n * DELETE → PREFIX_CORE_OPERATIONS — PREFIX refuses the hard delete (409) while retained\n * financial children still reference the account; core DELETE otherwise proceeds\n * OPEN_CHECKOUT → REPLACE_CORE_OPERATIONS — calls provider.createCheckoutSession(), returns { url, sessionId }\n * OPEN_PORTAL → REPLACE_CORE_OPERATIONS — calls provider.createCustomerPortalSession(), returns { url }\n *\n * One factory per polymorphic variant (org, user) per operation.\n *\n * @see billing-polymorphic-full-implementation.md §4.4\n */\n\nimport {\n CoreResourceOperation,\n CoreResourceType,\n ResourceOperationVariantType,\n ResourcePrimaryScope,\n ProductType,\n TaxCalculationMode,\n ErrorType,\n ErrorCustomMessageReference,\n BillingAccount_Operations,\n BillingAccount_OpenCheckoutRequestDto,\n BillingAccount_OpenPortalRequestDto,\n} from '@wildo-ai/saas-models';\nimport {\n createResourceCustomServiceImplementation,\n type ResourceCustomServiceImplementationFactory,\n} from '~wildo-backend-lib/base-classes/services/services/resource-operation-custom-implementation.factory.backend';\nimport type { ResourcesRegistryBackendService } from '~wildo-backend-lib/resources/services/resources-registry.backend.service';\nimport {\n describeUnaddressableShape,\n resolveSingleSubjectId,\n} from '~wildo-backend-lib/base-classes/utils/single-subject-addressing.backend.utils';\nimport { getBillingProvider, getBillingProviderRef, getBillingConfig, getBillingStateService } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-implementations.backend';\nimport { assertNoBillingAccountDependents, BillingCatalogReadIntent, readProductByKey, readPriceForProduct, readPromotionByCode, resolveBillingVariantsFromResourceType } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-impl-utils.backend';\nimport { buildCheckoutSessionMetadata } from '~wildo-backend-lib/billing/services/billing-checkout-metadata.backend.utils';\n\n// ── Billing account polymorphic variant types ────────────────────────\n\nconst BILLING_ACCOUNT_VARIANT_TYPES = [\n CoreResourceType.ORGANIZATION_BILLING_ACCOUNTS,\n CoreResourceType.USER_BILLING_ACCOUNTS,\n] as const;\n\n// ════════════════════════════════════════════════════════════════════\n// CREATE — PREFIX_CORE_OPERATIONS\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create billing account CREATE custom impl factories for all variants.\n *\n * PREFIX: Creates a customer on the billing provider (Stripe), returns the create data\n * augmented with providerCustomerId and providerRef.\n * CORE: Standard CREATE writes to DB.\n *\n * Registered on `INTERNAL_CALL` — the variant the resource configuration actually declares\n * for CREATE. This registration was authored against `REPOSITORY_ONLY` and was orphaned when\n * 623c5aee moved the configured variant to `INTERNAL_CALL` (the auto-create path runs through\n * `SystemAccessBackendService.createAsSystem`, which the service tier only reaches via\n * INTERNAL_CALL / API_CALL). Because custom implementations resolve by an EXACT operation-path\n * key that embeds `variantType`, the stale registration was unreachable rather than degraded:\n * `provider.createCustomer()` never ran and every auto-created account was persisted with no\n * `providerCustomerId` — the only local key mapping invoices and subscriptions back to the\n * provider customer. Pinned by `billing-custom-impl-operation-path-coherence.test.ts`.\n */\nexport function createBillingAccountCreateFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: CoreResourceOperation.CREATE,\n variantType: ResourceOperationVariantType.INTERNAL_CALL,\n isOperationDefault: true,\n },\n handlers: {\n prefixCoreOperations: async (_id, input, executionContext, _operationPath, utils) => {\n const provider = getBillingProvider();\n\n // Extract contact info from the initiator's user context\n const userContext = utils.initiatorUserContext;\n const email = userContext?.email || 'unknown@example.com';\n const name = userContext?.displayName || userContext?.name || userContext?.email || 'Unknown';\n\n const { providerCustomerId } = await provider.createCustomer({\n email,\n name,\n metadata: {\n resourceType: variantResourceType,\n ...input.metadata,\n },\n });\n\n return {\n ...input,\n providerCustomerId,\n providerRef: getBillingProviderRef(),\n isActive: true,\n };\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n\n// ════════════════════════════════════════════════════════════════════\n// DELETE — PREFIX_CORE_OPERATIONS (dependents guard)\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create billing account DELETE guard factories for all variants.\n *\n * PREFIX: refuses the hard delete with 409 `BILLING_ACCOUNT_HAS_DEPENDENTS` while retained\n * subscriptions / invoice refs / usage records / credit pools still reference the account.\n * There is no CORE replacement — when the guard passes, the standard DELETE proceeds untouched.\n *\n * This enforces the billing-retention decision (2026-07-29) rather than adding new policy: that\n * decision disabled all 18 billing cascades so the financial audit trail survives its scope, and\n * its rationale block explicitly forbids the resulting half-state (\"retaining the children while\n * deleting the account strands the provider-customer mapping\"). A direct hard delete was the only\n * remaining path into that state. See `assertNoBillingAccountDependents` for the full reasoning.\n *\n * Registered on `INTERNAL_CALL` — the variant the resource configuration actually declares for\n * DELETE. Custom implementations are resolved by an exact operation-path key that embeds\n * `variantType`, so a guard registered under any other variant would never run.\n */\nexport function createBillingAccountDeleteDependentsGuardFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: CoreResourceOperation.DELETE,\n variantType: ResourceOperationVariantType.INTERNAL_CALL,\n isOperationDefault: true,\n },\n handlers: {\n prefixCoreOperations: async (_id, input, executionContext, _operationPath, utils) => {\n // Fail closed: the dependent scan filters on a single account id, so a POPULATION-addressed\n // delete (an ids array or an unpinned filter reaching this path via `doByOperationPath`)\n // must be refused rather than silently producing a filter that matches nothing and waving\n // the delete through. DELETE is CRITICAL.\n //\n // A conditional `{ _id, … }` filter resolves to that one account and is admitted — the scan\n // then runs against exactly the account the delete can destroy.\n const billingAccountId = resolveSingleSubjectId(_id);\n if (billingAccountId === undefined) {\n throw utils.errorBuilder.buildError(ErrorType.VALIDATION, executionContext, {\n context: {\n message: 'Billing account DELETE requires a single addressed account to verify dependents',\n resourceType: variantResourceType,\n receivedAddressing: describeUnaddressableShape(_id),\n },\n });\n }\n\n const variants = resolveBillingVariantsFromResourceType(variantResourceType);\n if (!variants) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_SCOPE_NOT_ENABLED,\n context: { resourceType: variantResourceType },\n });\n }\n\n await assertNoBillingAccountDependents(billingAccountId, variants, executionContext, utils);\n\n // Guard only — the core DELETE input is passed through unchanged.\n return input;\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n\n// ════════════════════════════════════════════════════════════════════\n// OPEN_CHECKOUT — REPLACE_CORE_OPERATIONS\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create OPEN_CHECKOUT custom impl factories for all variants.\n *\n * REPLACE: Resolves the billing account, product, and price.\n * Creates a Stripe Checkout Session and returns the redirect URL.\n * No DB write — the subscription is created by webhook after payment.\n */\nexport function createBillingAccountOpenCheckoutFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: BillingAccount_Operations.OPEN_CHECKOUT,\n variantType: ResourceOperationVariantType.API_CALL,\n isOperationDefault: true,\n },\n requestDtoSchema: BillingAccount_OpenCheckoutRequestDto,\n handlers: {\n replaceCoreOperations: async (_id, input, executionContext, _operationPath, utils) => {\n const billingAccount = utils.currentObject;\n\n if (!billingAccount?.providerCustomerId) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_NO_PROVIDER_CUSTOMER,\n context: { billingAccountId: _id },\n });\n }\n\n // Resolve product and price\n // ACQUIRE: this is the purchase itself, so a product the catalogue has retired is refused.\n const product = await readProductByKey(input.productKey, BillingCatalogReadIntent.ACQUIRE, executionContext, utils);\n\n // Validate product scope — prevent purchasing a product targeted at a different scope\n const variants = resolveBillingVariantsFromResourceType(variantResourceType);\n if (variants && product.targetScopes && !product.targetScopes.includes(variants.scopeType)) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_SCOPE_MISMATCH,\n context: {\n productKey: input.productKey,\n productScopes: product.targetScopes,\n currentScope: variants.scopeType,\n },\n });\n }\n\n // The price MUST belong to the product being purchased. Resolving the two independently\n // (which this did) bills the provider for one product's price while the local record —\n // and therefore every entitlement derived from it — names another.\n const price = await readPriceForProduct(input.priceId, product, executionContext, utils);\n\n if (!price.providerPriceId) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_NO_PROVIDER_PRICE,\n context: { priceId: input.priceId, productKey: input.productKey },\n });\n }\n\n // Determine checkout mode based on product type\n const isSubscription = [ProductType.PLAN, ProductType.ADDON, ProductType.METERED].includes(product.type as ProductType);\n\n // Resolve trial days\n const config = getBillingConfig();\n const trialDays = input.trialDays\n ?? product.behaviorPolicy?.trial?.days\n ?? config.defaultBehaviorPolicy.defaultTrialDays;\n\n // Resolve promotion code → provider promotion code ID (C1 + H3)\n let providerPromotionCodeId: string | undefined;\n /** The Wildo promotion row behind that code, carried into metadata so completion can count it (#518). */\n let appliedPromotionId: string | undefined;\n if (input.promotionCode) {\n const promotion = await readPromotionByCode(input.promotionCode, executionContext, utils);\n if (!promotion) {\n throw utils.errorBuilder.buildError(ErrorType.NOT_FOUND, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_NOT_FOUND,\n context: { promotionCode: input.promotionCode },\n });\n }\n\n const now = new Date();\n if (promotion.validFrom && now < new Date(promotion.validFrom)) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Promotion has not started yet' },\n });\n }\n if (promotion.validUntil && now > new Date(promotion.validUntil)) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Promotion has expired' },\n });\n }\n if (promotion.maxRedemptions !== null && promotion.maxRedemptions !== undefined) {\n if ((promotion.timesRedeemed ?? 0) >= promotion.maxRedemptions) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Maximum redemptions reached' },\n });\n }\n }\n if (promotion.applicableProducts?.length > 0 && !promotion.applicableProducts.includes(input.productKey)) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Promotion is not applicable to this product', productKey: input.productKey },\n });\n }\n if (!promotion.providerPromotionId && !promotion.providerCouponId) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PROMOTION_INVALID,\n context: { promotionCode: input.promotionCode, reason: 'Promotion is not synced to billing provider' },\n });\n }\n providerPromotionCodeId = promotion.providerPromotionId;\n appliedPromotionId = promotion._id;\n }\n\n // Create checkout session on provider\n const provider = getBillingProvider();\n const session = await provider.createCheckoutSession({\n providerCustomerId: billingAccount.providerCustomerId,\n lineItems: [{ providerPriceId: price.providerPriceId, quantity: input.quantity }],\n mode: isSubscription ? 'subscription' : 'payment',\n successUrl: input.successUrl,\n cancelUrl: input.cancelUrl,\n trialPeriodDays: isSubscription && trialDays > 0 ? trialDays : undefined,\n /*\n * #408 (2026-09-08) — two authored declarations that reached no provider call until\n * now, and this is the ONLY live purchase route, so this is where they take effect.\n *\n * `automaticTax`: the application's `billing.tax.calculationMode`. PROVIDER_MANAGED\n * used to change nothing, leaving the Stripe account's own configuration to decide\n * silently whether tax was computed.\n *\n * `requirePaymentMethodForTrial`: the PRODUCT's declaration, and only meaningful when\n * this checkout actually starts a trial — asking for a card up front on a purchase\n * with no trial is a different decision nobody authored. Wonder Todos' enterprise plan\n * declares `true` and its professional plan `false`, and the two were indistinguishable\n * at the provider.\n */\n automaticTax: config.tax?.calculationMode === TaxCalculationMode.PROVIDER_MANAGED,\n requirePaymentMethodForTrial: isSubscription\n && trialDays > 0\n && product.behaviorPolicy?.trial?.requirePaymentMethod === true,\n /*\n * NEVER let the provider's own promotion-code entry accept a code (#518).\n *\n * This was `!providerPromotionCodeId` — so whenever a customer supplied NO code, the\n * hosted checkout page offered its own promo-code box, and a code typed there bypassed\n * every control the block above enforces: `validFrom`, `validUntil`, `maxRedemptions`\n * and `applicableProducts`. Four authored controls, silently optional, because the\n * discount was applied by the provider from its own synced coupon and Wildo never saw\n * the redemption at all.\n *\n * A code now reaches a purchase only through `input.promotionCode`, which is validated\n * here and counted at completion. An application that wants to offer a code entry\n * collects it in its own UI and passes it — which is also the only way the four\n * controls can mean anything.\n */\n allowPromotionCodes: false,\n providerPromotionCodeId,\n // The provider echoes this map back VERBATIM inside a genuinely signed\n // `checkout.session.completed`, and the webhook router turns it into a credit grant. It\n // used to be assembled with `...input.metadata` LAST, so a caller-supplied record could\n // overwrite `billingAccountId` / `productKey` / `quantity` — no signature forgery\n // required, because a valid signature proves the PROVIDER sent the bytes, not that WE\n // wrote them. The builder writes the framework's reserved keys last and strips reserved\n // keys out of caller metadata; see `billing-checkout-metadata.backend.utils.ts`.\n metadata: buildCheckoutSessionMetadata({\n billingAccountId: _id!,\n productKey: input.productKey,\n quantity: input.quantity,\n // Carried so the redemption can be COUNTED when the session completes (#518). The\n // validation above refused an exhausted code and then never incremented anything, so\n // a code used only through checkout stayed at zero redemptions forever and\n // `maxRedemptions` could be exceeded without limit.\n promotionId: appliedPromotionId,\n callerMetadata: input.metadata,\n }),\n });\n\n return { url: session.url, sessionId: session.sessionId };\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n\n// ════════════════════════════════════════════════════════════════════\n// OPEN_PORTAL — REPLACE_CORE_OPERATIONS\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create OPEN_PORTAL custom impl factories for all variants.\n *\n * REPLACE: Resolves the billing account's providerCustomerId, creates a\n * Stripe Customer Portal session, and returns the redirect URL.\n * No DB write.\n */\nexport function createBillingAccountOpenPortalFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: BillingAccount_Operations.OPEN_PORTAL,\n variantType: ResourceOperationVariantType.API_CALL,\n isOperationDefault: true,\n },\n requestDtoSchema: BillingAccount_OpenPortalRequestDto,\n handlers: {\n replaceCoreOperations: async (_id, input, executionContext, _operationPath, utils) => {\n const billingAccount = utils.currentObject;\n\n if (!billingAccount?.providerCustomerId) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_NO_PROVIDER_CUSTOMER,\n context: { billingAccountId: _id },\n });\n }\n\n const provider = getBillingProvider();\n const result = await provider.createCustomerPortalSession(\n billingAccount.providerCustomerId,\n input.returnUrl,\n );\n\n return { url: result.url };\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n\n// ════════════════════════════════════════════════════════════════════\n// GET_STATE — REPLACE_CORE_OPERATIONS (collection-level)\n// ════════════════════════════════════════════════════════════════════\n\n/**\n * Create GET_STATE custom impl factories for all variants.\n *\n * REPLACE: Collection-level operation (no entity ID). Resolves scopeType\n * and scopeEntityId from execution context, delegates to BillingStateBackendService.\n * Returns the full aggregated billing state with automatic authorization via\n * the engine's parent scope validation.\n */\nexport function createBillingAccountGetStateFactories(): ResourceCustomServiceImplementationFactory[] {\n return BILLING_ACCOUNT_VARIANT_TYPES.map((variantResourceType) => {\n const factory = (_resourcesRegistryService: ResourcesRegistryBackendService) => {\n return createResourceCustomServiceImplementation({\n operationPath: {\n resourceIdentifier: variantResourceType,\n operationIdentifier: BillingAccount_Operations.GET_STATE,\n variantType: ResourceOperationVariantType.API_CALL,\n isOperationDefault: true,\n },\n handlers: {\n replaceCoreOperations: async (_id, _input, executionContext, _operationPath, _utils) => {\n const variants = resolveBillingVariantsFromResourceType(variantResourceType);\n if (!variants) {\n throw _utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_SCOPE_NOT_ENABLED,\n context: { resourceType: variantResourceType },\n });\n }\n\n const scopeEntityId = executionContext[variants.scopeKey] as string | undefined;\n if (!scopeEntityId) {\n throw _utils.errorBuilder.buildError(ErrorType.VALIDATION, executionContext, {\n context: { message: 'Missing scope entity ID in execution context', scopeKey: variants.scopeKey },\n });\n }\n\n const billingConfig = getBillingConfig();\n const enabledScopes = billingConfig.enabledScopes ?? [ResourcePrimaryScope.ORGANIZATIONS];\n\n const billingStateService = getBillingStateService();\n return billingStateService.getState(variants.scopeType, scopeEntityId, enabledScopes, executionContext);\n },\n },\n });\n };\n\n return factory as unknown as ResourceCustomServiceImplementationFactory;\n });\n}\n"]}
@@ -7,6 +7,7 @@
7
7
  * and feature sync.
8
8
  */
9
9
  import { CoreResourceType, ResourcePrimaryScope } from '@wildo-ai/saas-models';
10
+ import type { Product } from '@wildo-ai/saas-models';
10
11
  import type { ResourceOperation_CustomImplementation_Utils } from '../../../base-classes/services/services/resource-operation-custom-implementation-base.backend.service';
11
12
  import type { ExecutionContext } from '../../../runtime/models/execution-context.backend.schemas';
12
13
  /** All credit pool polymorphic variant types (org, user). */
@@ -95,6 +96,37 @@ export declare enum BillingCatalogReadIntent {
95
96
  */
96
97
  REFERENCE = "reference"
97
98
  }
99
+ /**
100
+ * THE acquirability predicate: may this catalog row be BOUGHT, or moved onto, right now?
101
+ *
102
+ * ## Why this is exported rather than inlined in the ACQUIRE arm below
103
+ *
104
+ * {@link BillingCatalogReadIntent} closed the per-KEY half of catalogue retirement: a caller
105
+ * naming a retired product by key is refused. It says nothing about the LISTING half, and a
106
+ * listing surface cannot use the reader — it holds rows it already fetched in bulk, not keys.
107
+ * Left to itself every listing re-derives the answer from the raw `isActive` column, which is
108
+ * precisely the "separate `assertProductIsPurchasable` helper the fourth session forgets" that
109
+ * the required-intent argument was introduced to remove. Measured 2026-09-09: the engine's own
110
+ * `billing-pricing-table.tsx` had already hand-rolled `p.isPublic && p.isActive`, so the
111
+ * retirement rule existed in two places written by two people and agreed only by luck.
112
+ *
113
+ * So the gate and the listing now share ONE predicate, and the boundary it draws is deliberate:
114
+ *
115
+ * - **`isActive` is ACQUIRABILITY** — "available for purchase", the same answer on every surface,
116
+ * and the one this predicate owns because the purchase gate enforces it.
117
+ * - **`isPublic` is VISIBILITY** — "visible to end users", and the answer legitimately DIFFERS by
118
+ * surface: a back-office catalog listing shows non-public rows, a customer pricing table does
119
+ * not, and a customer handed a direct link to a private-but-active plan may buy it (the gate
120
+ * accepts them, deliberately). Folding `isPublic` in here would make the purchase gate refuse
121
+ * that customer, which is a product decision nobody has taken.
122
+ *
123
+ * A surface that wants "public AND acquirable" composes the two; it must not re-spell either.
124
+ *
125
+ * @param productRow - a `Product` row as read from the repository.
126
+ */
127
+ export declare function isProductAcquirable(productRow: Pick<Product, 'isActive'> | {
128
+ isActive?: boolean;
129
+ }): boolean;
98
130
  /**
99
131
  * Read a product from the repository by key.
100
132
  *
@@ -1 +1 @@
1
- {"version":3,"file":"billing-custom-impl-utils.backend.d.ts","sourceRoot":"","sources":["../../../../../../src/billing/services/custom-impl/billing-custom-impl-utils.backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"billing-custom-impl-utils.backend.d.ts","sourceRoot":"","sources":["../../../../../src/billing/services/custom-impl/billing-custom-impl-utils.backend.ts"],"names":[],"mappings":"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"}
@@ -156,6 +156,37 @@ export var BillingCatalogReadIntent;
156
156
  */
157
157
  BillingCatalogReadIntent["REFERENCE"] = "reference";
158
158
  })(BillingCatalogReadIntent || (BillingCatalogReadIntent = {}));
159
+ /**
160
+ * THE acquirability predicate: may this catalog row be BOUGHT, or moved onto, right now?
161
+ *
162
+ * ## Why this is exported rather than inlined in the ACQUIRE arm below
163
+ *
164
+ * {@link BillingCatalogReadIntent} closed the per-KEY half of catalogue retirement: a caller
165
+ * naming a retired product by key is refused. It says nothing about the LISTING half, and a
166
+ * listing surface cannot use the reader — it holds rows it already fetched in bulk, not keys.
167
+ * Left to itself every listing re-derives the answer from the raw `isActive` column, which is
168
+ * precisely the "separate `assertProductIsPurchasable` helper the fourth session forgets" that
169
+ * the required-intent argument was introduced to remove. Measured 2026-09-09: the engine's own
170
+ * `billing-pricing-table.tsx` had already hand-rolled `p.isPublic && p.isActive`, so the
171
+ * retirement rule existed in two places written by two people and agreed only by luck.
172
+ *
173
+ * So the gate and the listing now share ONE predicate, and the boundary it draws is deliberate:
174
+ *
175
+ * - **`isActive` is ACQUIRABILITY** — "available for purchase", the same answer on every surface,
176
+ * and the one this predicate owns because the purchase gate enforces it.
177
+ * - **`isPublic` is VISIBILITY** — "visible to end users", and the answer legitimately DIFFERS by
178
+ * surface: a back-office catalog listing shows non-public rows, a customer pricing table does
179
+ * not, and a customer handed a direct link to a private-but-active plan may buy it (the gate
180
+ * accepts them, deliberately). Folding `isPublic` in here would make the purchase gate refuse
181
+ * that customer, which is a product decision nobody has taken.
182
+ *
183
+ * A surface that wants "public AND acquirable" composes the two; it must not re-spell either.
184
+ *
185
+ * @param productRow - a `Product` row as read from the repository.
186
+ */
187
+ export function isProductAcquirable(productRow) {
188
+ return productRow.isActive !== false;
189
+ }
159
190
  /**
160
191
  * Read a product from the repository by key.
161
192
  *
@@ -178,7 +209,7 @@ export async function readProductByKey(key, intent, executionContext, utils) {
178
209
  });
179
210
  }
180
211
  const productRow = product;
181
- if (intent === BillingCatalogReadIntent.ACQUIRE && productRow.isActive === false) {
212
+ if (intent === BillingCatalogReadIntent.ACQUIRE && !isProductAcquirable(productRow)) {
182
213
  throw utils.errorBuilder.buildError(ErrorType.CONFLICT, executionContext, {
183
214
  customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_RETIRED,
184
215
  context: { productKey: key, productId: productRow._id },
@@ -1 +1 @@
1
- {"version":3,"file":"billing-custom-impl-utils.backend.js","sourceRoot":"","sources":["../../../../../../src/billing/services/custom-impl/billing-custom-impl-utils.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared helpers for billing custom implementations.\n *\n * Used by subscription and billing account custom impl factories,\n * the webhook event router, and the feature sync service\n * for cross-resource reads, provider validation, variant resolution,\n * and feature sync.\n */\n\nimport {\n CoreResourceOperation,\n CoreResourceType,\n ResourcePrimaryScope,\n ErrorType,\n ErrorCustomMessageReference,\n RelationshipNature,\n coreSharedResourceRelationship,\n} from '@wildo-ai/saas-models';\nimport type { ResourceType } from '@wildo-ai/saas-models';\nimport type { ResourceOperation_CustomImplementation_Utils } from '~wildo-backend-lib/base-classes/services/services/resource-operation-custom-implementation-base.backend.service';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\n\n// ── Credit Pool Variant Types ───────────────────────────────────────\n\n/** All credit pool polymorphic variant types (org, user). */\nexport const CREDIT_POOL_VARIANT_TYPES = [\n CoreResourceType.ORGANIZATION_CREDIT_POOLS,\n CoreResourceType.USER_CREDIT_POOLS,\n] as const;\n\n// ── Polymorphic Variant Resolution ──────────────────────────────────\n\n/**\n * Resolved billing polymorphic variant context.\n *\n * Provides the concrete resource types and FK field names for a specific\n * billing scope (organization or user). Used by the webhook\n * router, custom implementation postfix handlers, and the feature sync service\n * to query the correct polymorphic collections with the correct field names.\n */\nexport interface BillingResolvedVariants {\n /** The scope key on ExecutionContext that identifies this variant ('organizationId' | 'userId') */\n scopeKey: string;\n /**\n * The scope entity FK field name as it appears on variant DOCUMENTS.\n * May differ from `scopeKey` for some variants.\n */\n scopeEntityDocField: string;\n /** The corresponding ResourcePrimaryScope value for features resource resolution */\n scopeType: ResourcePrimaryScope;\n /** The polymorphic FK field name on child resources (e.g., 'organizationBillingAccountId') */\n billingAccountFkField: string;\n /** The billing account variant resource type */\n billingAccount: string;\n /** The subscription variant resource type */\n subscription: string;\n /** The invoice ref variant resource type */\n invoiceRef: string;\n /** The credit pool variant resource type */\n creditPool: string;\n /** The usage record variant resource type */\n usageRecord: string;\n}\n\n/**\n * Deterministic mapping from execution context scope key to billing polymorphic variants.\n * All billing child resources share the same scope prefix per variant.\n */\nexport const BILLING_SCOPE_TO_VARIANTS: Record<string, Omit<BillingResolvedVariants, 'scopeKey'>> = {\n organizationId: {\n scopeEntityDocField: 'organizationId',\n scopeType: ResourcePrimaryScope.ORGANIZATIONS,\n billingAccountFkField: 'organizationBillingAccountId',\n billingAccount: CoreResourceType.ORGANIZATION_BILLING_ACCOUNTS,\n subscription: CoreResourceType.ORGANIZATION_SUBSCRIPTIONS,\n invoiceRef: CoreResourceType.ORGANIZATION_INVOICE_REFS,\n creditPool: CoreResourceType.ORGANIZATION_CREDIT_POOLS,\n usageRecord: CoreResourceType.ORGANIZATION_USAGE_RECORDS,\n },\n userId: {\n scopeEntityDocField: 'userId',\n scopeType: ResourcePrimaryScope.USER_SELF,\n billingAccountFkField: 'userBillingAccountId',\n billingAccount: CoreResourceType.USER_BILLING_ACCOUNTS,\n subscription: CoreResourceType.USER_SUBSCRIPTIONS,\n invoiceRef: CoreResourceType.USER_INVOICE_REFS,\n creditPool: CoreResourceType.USER_CREDIT_POOLS,\n usageRecord: CoreResourceType.USER_USAGE_RECORDS,\n },\n};\n\n/**\n * Resolve billing variants from an execution context's scope IDs.\n * Returns null for APPLICATION-scoped events (no entity scope).\n */\nexport function resolveBillingVariants(execCtx: ExecutionContext<any>): BillingResolvedVariants | null {\n if (execCtx.organizationId) return { scopeKey: 'organizationId', ...BILLING_SCOPE_TO_VARIANTS.organizationId };\n if (execCtx.userId) return { scopeKey: 'userId', ...BILLING_SCOPE_TO_VARIANTS.userId };\n return null;\n}\n\n/**\n * Resolve billing variants from a known variant resource type.\n * Used by custom implementation factories that know their variant at registration time.\n */\nconst VARIANT_TO_SCOPE_KEY: Record<string, string> = {\n [CoreResourceType.ORGANIZATION_BILLING_ACCOUNTS]: 'organizationId',\n [CoreResourceType.USER_BILLING_ACCOUNTS]: 'userId',\n [CoreResourceType.ORGANIZATION_SUBSCRIPTIONS]: 'organizationId',\n [CoreResourceType.USER_SUBSCRIPTIONS]: 'userId',\n [CoreResourceType.ORGANIZATION_CREDIT_POOLS]: 'organizationId',\n [CoreResourceType.USER_CREDIT_POOLS]: 'userId',\n [CoreResourceType.ORGANIZATION_INVOICE_REFS]: 'organizationId',\n [CoreResourceType.USER_INVOICE_REFS]: 'userId',\n [CoreResourceType.ORGANIZATION_USAGE_RECORDS]: 'organizationId',\n [CoreResourceType.USER_USAGE_RECORDS]: 'userId',\n};\n\nexport function resolveBillingVariantsFromResourceType(variantResourceType: string): BillingResolvedVariants | null {\n const scopeKey = VARIANT_TO_SCOPE_KEY[variantResourceType];\n if (!scopeKey) return null;\n return { scopeKey, ...BILLING_SCOPE_TO_VARIANTS[scopeKey] };\n}\n\n/**\n * Reverse mapping: ResourcePrimaryScope → scope key for BILLING_SCOPE_TO_VARIANTS.\n */\nconst SCOPE_TYPE_TO_SCOPE_KEY: Record<string, string> = {\n [ResourcePrimaryScope.ORGANIZATIONS]: 'organizationId',\n [ResourcePrimaryScope.USER_SELF]: 'userId',\n};\n\n/**\n * Resolve billing variants from a ResourcePrimaryScope value.\n * Used by the billing state endpoint where the caller provides scopeType directly.\n */\nexport function resolveBillingVariantsFromScopeType(scopeType: ResourcePrimaryScope): BillingResolvedVariants | null {\n const scopeKey = SCOPE_TYPE_TO_SCOPE_KEY[scopeType];\n if (!scopeKey || !BILLING_SCOPE_TO_VARIANTS[scopeKey]) return null;\n return { scopeKey, ...BILLING_SCOPE_TO_VARIANTS[scopeKey] };\n}\n\n// ── Product / Price repository reads ────────────────────────────────\n\n/**\n * Build the read context for an APPLICATION-scoped catalog resource (products, prices, promotions).\n *\n * ## The correction this encodes\n *\n * These readers used to pass the CALLER's execution context straight to the repository, under a\n * comment that read \"Products are APPLICATION-scoped — no org/user scope filtering applies\". That\n * statement is true about the RESOURCE and false about the READ, and the gap between the two was a\n * live 500.\n *\n * `PRODUCTS` / `PRICES` / `PROMOTIONS` are indeed APPLICATION-primary-scoped and model neither\n * `organizationId` nor `userId`. But the repository does not filter by the TARGET's scoping model —\n * it applies whatever the CALLER's context carries, and it is fail-closed on a field the target does\n * not model: it THROWS `CONFIGURATION` / `context_filter` rather than skipping it. So \"no scope\n * filtering applies\" describes the intent and inverts the consequence.\n *\n * It fires for real. Every caller here is a `BILLING_ACCOUNTS` / `SUBSCRIPTIONS` custom impl, and both\n * are polymorphic resources whose organization variant injects `organizationId` into the operation\n * context — so an org-scoped purchase or plan change reached a catalog read with an `organizationId`\n * the catalog has no column for.\n *\n * The sub-call context narrows the inherited context to fields the target actually models, which for\n * these resources is none of the caller's scope FKs — giving the unfiltered catalog read the original\n * comment assumed it already had.\n */\nasync function createCatalogReadContext(\n resourceType: ResourceType,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<ExecutionContext<any>> {\n return utils.executionContextCreator.createForSubCall(\n executionContext,\n resourceType,\n CoreResourceOperation.READ,\n utils.serviceOptions,\n );\n}\n\n/**\n * Why a catalog row is being read — and therefore whether a RETIRED row may be returned.\n *\n * ## Why this is a required parameter rather than a check at the sites that need it\n *\n * `Product.isActive` is the declared off-boarding path (`assertNoBillingAccountDependents` calls\n * the soft retire exactly that), and no purchase path consulted it: `readProductByKey` handed back\n * a retired product exactly like a live one, so \"retired\" was a label with no behaviour behind it\n * and the catalogue-retirement reconciliation below would have been cosmetic.\n *\n * The gate is a REQUIRED argument on the reader — the same shape, and for the same reason, as\n * {@link readPriceForProduct} making the price→product FK check unbypassable: the four call sites\n * are edited in different sessions, three of them must refuse and one must NOT, and a separate\n * `assertProductIsPurchasable` helper is exactly the thing the fourth session forgets. Making the\n * distinction unrepresentable-by-omission costs one argument and removes the whole failure mode.\n *\n * The enumeration, so a fifth site can see which company it is in:\n * - OPEN_CHECKOUT (`billing-account.mutations`) — ACQUIRE.\n * - CHANGE_PLAN target product (`subscription.mutations`) — ACQUIRE.\n * - ADD_ADDON product (`subscription.mutations`) — ACQUIRE.\n * - REMOVE_ADDON product (`subscription.mutations`) — **REFERENCE, deliberately.** A customer\n * holding a retired add-on must be able to drop it; refusing here would trap them on the very\n * product the catalogue withdrew.\n */\nexport enum BillingCatalogReadIntent {\n /**\n * The caller is about to BUY this, or move a subscription onto it. A retired row is refused with\n * `CONFLICT` / `BILLING_PRODUCT_RETIRED`.\n */\n ACQUIRE = 'acquire',\n /**\n * The caller is naming a row that a subscription ALREADY points at — to display it, to remove it,\n * to rebuild a provider item list. A retired row is returned normally, because refusing would\n * break the paths a customer on a retired product needs most.\n */\n REFERENCE = 'reference',\n}\n\n/**\n * Read a product from the repository by key.\n *\n * Products are APPLICATION-scoped, so no org/user scoping is MEANT to apply — which is precisely why\n * the read must not inherit the caller's scope context. See {@link createCatalogReadContext}.\n */\nexport async function readProductByKey(\n key: string,\n intent: BillingCatalogReadIntent,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const productRepo = utils.repositoriesRegistry.getRepository(CoreResourceType.PRODUCTS);\n if (!productRepo) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_NOT_FOUND,\n context: { productKey: key },\n });\n }\n const product = await productRepo.read(await createCatalogReadContext(CoreResourceType.PRODUCTS, executionContext, utils), { key });\n if (!product) {\n throw utils.errorBuilder.buildError(ErrorType.NOT_FOUND, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_NOT_FOUND,\n context: { productKey: key },\n });\n }\n const productRow = product as any;\n if (intent === BillingCatalogReadIntent.ACQUIRE && productRow.isActive === false) {\n throw utils.errorBuilder.buildError(ErrorType.CONFLICT, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_RETIRED,\n context: { productKey: key, productId: productRow._id },\n });\n }\n return productRow;\n}\n\n/**\n * Read a product from the repository by ID.\n */\nexport async function readProductById(\n productId: string,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const productRepo = utils.repositoriesRegistry.getRepository(CoreResourceType.PRODUCTS);\n if (!productRepo) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_NOT_FOUND,\n context: { productId },\n });\n }\n const product = await productRepo.read(await createCatalogReadContext(CoreResourceType.PRODUCTS, executionContext, utils), productId);\n if (!product) {\n throw utils.errorBuilder.buildError(ErrorType.NOT_FOUND, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_NOT_FOUND,\n context: { productId },\n });\n }\n return product;\n}\n\n/**\n * Read a price from the repository by ID.\n *\n * APPLICATION-scoped like products, and read on a sub-call context for the same reason — see\n * {@link createCatalogReadContext}.\n *\n * ## Use {@link readPriceForProduct} whenever a product is also in play\n *\n * This reader answers \"what is price X\", nothing more. It is correct for resolving the price of an\n * ALREADY-PERSISTED subscription item, where the product↔price pairing was decided (and validated)\n * when the item was written. It is NOT correct for a purchase path where the caller names a product\n * and a price in the same request: there the pairing is the thing an attacker controls, and reading\n * the two independently is precisely the defect {@link assertPriceBelongsToProduct} closes.\n */\nexport async function readPriceById(\n priceId: string,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const priceRepo = utils.repositoriesRegistry.getRepository(CoreResourceType.PRICES);\n if (!priceRepo) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRICE_NOT_FOUND,\n context: { priceId },\n });\n }\n const price = await priceRepo.read(await createCatalogReadContext(CoreResourceType.PRICES, executionContext, utils), priceId);\n if (!price) {\n throw utils.errorBuilder.buildError(ErrorType.NOT_FOUND, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRICE_NOT_FOUND,\n context: { priceId },\n });\n }\n return price;\n}\n\n/**\n * Refuse a price that does not belong to the product it is being purchased against.\n *\n * ## Why this has to exist\n *\n * `Price.productId` is a declared foreign key — every price already knows its product. Every\n * purchase path nevertheless resolved the two INDEPENDENTLY (product by key, price by id) and\n * checked only that the price had a `providerPriceId`. The FK was never consulted.\n *\n * The consequence is a split between what is CHARGED and what is GRANTED. The provider is billed\n * `price.providerPriceId`, while the local subscription item records `productId: product._id`, and\n * entitlements (feature sync, plan tier, credit pack size) derive from the ITEM's product. So a\n * caller who pairs the premium product key with a cheap product's price id is billed the cheap\n * price and entitled at the premium product — an authorization outcome purchased at the wrong\n * amount, with both sides internally consistent and nothing downstream able to notice.\n *\n * ## Why a combined reader rather than a check at each site\n *\n * The three purchase paths (OPEN_CHECKOUT, CHANGE_PLAN, ADD_ADDON) are edited in different sessions\n * and each had the same omission. {@link readPriceForProduct} is the shape that makes the invariant\n * unbypassable for the next one: resolving a price in a product context and validating the pairing\n * are one call, so a new purchase path cannot obtain the price without the check having run.\n *\n * @param price - The price row, as read from the catalog.\n * @param product - The product row the purchase names.\n * @throws `VALIDATION` (400, `BILLING_PRICE_PRODUCT_MISMATCH`) when `price.productId !== product._id`.\n */\nexport function assertPriceBelongsToProduct(\n price: any,\n product: any,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): void {\n if (price?.productId === product?._id) return;\n\n throw utils.errorBuilder.buildError(ErrorType.VALIDATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRICE_PRODUCT_MISMATCH,\n context: {\n priceId: price?._id,\n priceProductId: price?.productId ?? null,\n productId: product?._id,\n productKey: product?.key,\n },\n });\n}\n\n/**\n * Read a price and prove it belongs to the given product, in one step.\n *\n * The safe reader for every path where the caller names a product AND a price. See\n * {@link assertPriceBelongsToProduct} for what goes wrong when the two are resolved independently.\n */\nexport async function readPriceForProduct(\n priceId: string,\n product: any,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const price = await readPriceById(priceId, executionContext, utils);\n assertPriceBelongsToProduct(price, product, executionContext, utils);\n /*\n * A retired PRICE is refused here and nowhere else, and that placement is the whole argument.\n *\n * All three callers of this reader are acquisitions (OPEN_CHECKOUT, CHANGE_PLAN, ADD_ADDON) —\n * that is what the reader is FOR, per its own doc above — so the gate needs no intent argument\n * and cannot be reached by a reference read. `readPriceById`, which resolves the price of an\n * already-persisted subscription item, is deliberately left ungated: a subscriber on a retired\n * plan rebuilds their provider item list through it on every add-on change, and refusing there\n * would break the customer the retirement was supposed to leave alone.\n *\n * The catalogue-retirement sweep deactivates a retired product's prices alongside the product, so\n * in practice this fires together with the product gate; it is separate because an operator may\n * also retire a single price (a currency, an interval) while the product stays on sale.\n */\n if (price?.isActive === false) {\n throw utils.errorBuilder.buildError(ErrorType.CONFLICT, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_RETIRED,\n context: { priceId, productId: product?._id, productKey: product?.key },\n });\n }\n return price;\n}\n\n// ── Promotion resolution ────────────────────────────────────────────\n\n/**\n * Read an active promotion from the repository by its user-facing code.\n * Returns null if no active promotion with that code exists.\n */\nexport async function readPromotionByCode(\n code: string,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const promoRepo = utils.repositoriesRegistry.getRepository(CoreResourceType.PROMOTIONS);\n if (!promoRepo) return null;\n const promotion = await promoRepo.read(await createCatalogReadContext(CoreResourceType.PROMOTIONS, executionContext, utils), { code, isActive: true });\n return promotion ?? null;\n}\n\n// ── Billing account dependent scan (hard-delete guard) ──────────────\n\n/**\n * The retained financial child families that pin a billing account in place.\n *\n * Typed against `BillingResolvedVariants` so a rename of any variant field breaks the build\n * here rather than silently dropping a family from the guard.\n */\nexport type BillingAccountDependentFamily = Extract<\n keyof BillingResolvedVariants,\n 'subscription' | 'invoiceRef' | 'usageRecord' | 'creditPool'\n>;\n\n/**\n * Canonical ORDER of the billing child families. Order only — membership is derived below.\n *\n * Kept as an explicit tuple so the guard's scan order (and the report a human reads when a delete\n * is refused) is stable and mirrors the registry's declaration order, rather than depending on\n * however the relationship array happens to be arranged.\n */\nconst BILLING_ACCOUNT_DEPENDENT_FAMILY_ORDER: readonly BillingAccountDependentFamily[] = [\n 'subscription',\n 'invoiceRef',\n 'usageRecord',\n 'creditPool',\n] as const;\n\n/**\n * Every child family whose rows are RETAINED when their billing account is deleted.\n *\n * DERIVED from the registry, not restated. This used to be a hand-maintained list with a comment\n * asking a human to keep it in lock-step with `resources-registry.shared.core.definitions.ts` — the\n * exact coupling that rots, because the two live in different packages and nothing failed when they\n * disagreed. A family whose cascade is re-ENABLED now drops out of this list automatically (it is\n * no longer retained, so it no longer pins the account), and a family that stops being declared\n * disappears with it.\n *\n * The derivation asks the registry one question: for each `BillingAccounts → <child>` COMPOSITION\n * edge, is `onParentDelete` disabled? Disabled means \"these rows survive their parent\", which is\n * precisely what makes them a dependent that blocks a hard delete.\n *\n * Note this reads the BILLING-ACCOUNT edges specifically, not the scope edges. Both are disabled by\n * the same decision, but it is the account-parent edge that this guard is about.\n */\nexport const BILLING_ACCOUNT_DEPENDENT_FAMILIES: readonly BillingAccountDependentFamily[] =\n deriveRetainedBillingAccountDependentFamilies();\n\nfunction deriveRetainedBillingAccountDependentFamilies(): readonly BillingAccountDependentFamily[] {\n const billingAccountResourceTypes = new Set<string>(\n Object.values(BILLING_SCOPE_TO_VARIANTS).map((variants) => variants.billingAccount as string),\n );\n\n // child resource type → family key, across BOTH scope variants.\n const childResourceTypeToFamily = new Map<string, BillingAccountDependentFamily>();\n for (const variants of Object.values(BILLING_SCOPE_TO_VARIANTS)) {\n for (const family of BILLING_ACCOUNT_DEPENDENT_FAMILY_ORDER) {\n childResourceTypeToFamily.set(variants[family] as string, family);\n }\n }\n\n const retained = new Set<BillingAccountDependentFamily>();\n for (const relationship of coreSharedResourceRelationship) {\n if (relationship.nature !== RelationshipNature.COMPOSITION) continue;\n if (!billingAccountResourceTypes.has(relationship.resourceType1 as string)) continue;\n // Disabled (or absent) cascade == the child survives its parent == a retained dependent.\n if (relationship.childOperations?.lifecycle?.onParentDelete?.enabled === true) continue;\n\n const family = childResourceTypeToFamily.get(relationship.resourceType2 as string);\n if (family) retained.add(family);\n }\n\n return BILLING_ACCOUNT_DEPENDENT_FAMILY_ORDER.filter((family) => retained.has(family));\n}\n\n/**\n * Refuse hard removal of a billing account while retained financial children still reference it.\n *\n * ## Why this guard exists\n *\n * The billing-retention decision (2026-07-29) disabled `onParentDelete` on all 18 billing\n * cascades, so subscriptions / invoice refs / usage records / credit pools SURVIVE the deletion\n * of their scope and of their billing account. That made a direct hard delete of the account the\n * only remaining way to strand those retained rows behind a dangling FK.\n *\n * The damage is not merely referential: `providerCustomerId` is `.isBackendOnly()` and lives ONLY\n * on the account row. The children carry `providerInvoiceId` / `providerSubscriptionId` but NOT\n * the provider CUSTOMER id — so deleting the account destroys the only local key that maps a\n * retained invoice back to the customer it was billed to. A financial record that cannot be\n * reconciled against the provider defeats the purpose of retaining it. Nothing provider-side is\n * cleaned up on delete either, so the provider record lives on regardless.\n *\n * ## Why it fails closed\n *\n * The operation is `riskLevel: CRITICAL` and guards a compliance obligation, so \"cannot verify\"\n * must never read as \"nothing found\". A missing child repository raises `CONFIGURATION` rather\n * than being skipped, and any scope-filter failure inside the reads propagates instead of being\n * swallowed.\n *\n * The product off-boarding path is the soft retire (`isActive: false`), which this does not touch.\n *\n * Detection uses `read()` rather than `count()` deliberately: none of the four child families\n * declares a `COUNT` core operation, so `repository.count()` would throw INTERNAL. All four\n * declare `READ`. Each read is a single indexed hit on the billing-account FK, and the FK is\n * globally unique, so the result is correct regardless of how the execution context scopes it.\n *\n * @param billingAccountId - The account row about to be hard-deleted.\n * @param variants - Resolved polymorphic variants for the account's scope (org or user).\n * @throws `CONFLICT` (409, `BILLING_ACCOUNT_HAS_DEPENDENTS`) listing every blocking family.\n * @throws `CONFIGURATION` when a child family's repository is not registered (unverifiable).\n */\nexport async function assertNoBillingAccountDependents(\n billingAccountId: string,\n variants: BillingResolvedVariants,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<void> {\n const dependentFilter = { [variants.billingAccountFkField]: billingAccountId };\n\n const blockingFamilies = (\n await Promise.all(\n BILLING_ACCOUNT_DEPENDENT_FAMILIES.map(async (family) => {\n const childResourceType = variants[family];\n const childRepository = utils.repositoriesRegistry.getRepository(childResourceType);\n\n // Fail closed: an unregistered child repository means we cannot prove the family is\n // empty. Skipping it would silently downgrade the guard to \"nothing found\".\n if (!childRepository) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message: 'Cannot verify billing-account dependents: child repository is not registered',\n billingAccountId,\n dependentFamily: family,\n childResourceType,\n },\n });\n }\n\n const existingChild = await childRepository.read(executionContext, dependentFilter);\n return existingChild ? family : undefined;\n }),\n )\n ).filter((family): family is BillingAccountDependentFamily => family !== undefined);\n\n if (blockingFamilies.length > 0) {\n throw utils.errorBuilder.buildError(ErrorType.CONFLICT, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_ACCOUNT_HAS_DEPENDENTS,\n context: {\n billingAccountId,\n blockingDependentFamilies: blockingFamilies,\n blockingResourceTypes: blockingFamilies.map((family) => variants[family]),\n },\n });\n }\n}\n\n// ── Provider validation ─────────────────────────────────────────────\n\n/**\n * Validate that a subscription has a provider subscription ID.\n */\nexport function validateProviderSubscription(\n subscription: any,\n subscriptionId: string,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): void {\n if (!subscription?.providerSubscriptionId) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_NO_PROVIDER_SUBSCRIPTION,\n context: { subscriptionId },\n });\n }\n}\n\n// ── Provider item resolution ────────────────────────────────────────\n\n/**\n * Resolve the providerPriceId for each subscription item by reading prices.\n */\nexport async function resolveProviderItems(\n items: any[],\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<Array<{ providerSubscriptionItemId?: string; providerPriceId: string; quantity: number }>> {\n return Promise.all(\n items.map(async (item: any) => {\n const price = await readPriceById(item.priceId, executionContext, utils);\n return {\n providerSubscriptionItemId: item.providerSubscriptionItemId,\n providerPriceId: price.providerPriceId || item.priceId,\n quantity: item.quantity,\n };\n }),\n );\n}\n"]}
1
+ {"version":3,"file":"billing-custom-impl-utils.backend.js","sourceRoot":"","sources":["../../../../../src/billing/services/custom-impl/billing-custom-impl-utils.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared helpers for billing custom implementations.\n *\n * Used by subscription and billing account custom impl factories,\n * the webhook event router, and the feature sync service\n * for cross-resource reads, provider validation, variant resolution,\n * and feature sync.\n */\n\nimport {\n CoreResourceOperation,\n CoreResourceType,\n ResourcePrimaryScope,\n ErrorType,\n ErrorCustomMessageReference,\n RelationshipNature,\n coreSharedResourceRelationship,\n} from '@wildo-ai/saas-models';\nimport type { Product, ResourceType } from '@wildo-ai/saas-models';\nimport type { ResourceOperation_CustomImplementation_Utils } from '~wildo-backend-lib/base-classes/services/services/resource-operation-custom-implementation-base.backend.service';\nimport type { ExecutionContext } from '~wildo-backend-lib/runtime/models/execution-context.backend.schemas';\n\n// ── Credit Pool Variant Types ───────────────────────────────────────\n\n/** All credit pool polymorphic variant types (org, user). */\nexport const CREDIT_POOL_VARIANT_TYPES = [\n CoreResourceType.ORGANIZATION_CREDIT_POOLS,\n CoreResourceType.USER_CREDIT_POOLS,\n] as const;\n\n// ── Polymorphic Variant Resolution ──────────────────────────────────\n\n/**\n * Resolved billing polymorphic variant context.\n *\n * Provides the concrete resource types and FK field names for a specific\n * billing scope (organization or user). Used by the webhook\n * router, custom implementation postfix handlers, and the feature sync service\n * to query the correct polymorphic collections with the correct field names.\n */\nexport interface BillingResolvedVariants {\n /** The scope key on ExecutionContext that identifies this variant ('organizationId' | 'userId') */\n scopeKey: string;\n /**\n * The scope entity FK field name as it appears on variant DOCUMENTS.\n * May differ from `scopeKey` for some variants.\n */\n scopeEntityDocField: string;\n /** The corresponding ResourcePrimaryScope value for features resource resolution */\n scopeType: ResourcePrimaryScope;\n /** The polymorphic FK field name on child resources (e.g., 'organizationBillingAccountId') */\n billingAccountFkField: string;\n /** The billing account variant resource type */\n billingAccount: string;\n /** The subscription variant resource type */\n subscription: string;\n /** The invoice ref variant resource type */\n invoiceRef: string;\n /** The credit pool variant resource type */\n creditPool: string;\n /** The usage record variant resource type */\n usageRecord: string;\n}\n\n/**\n * Deterministic mapping from execution context scope key to billing polymorphic variants.\n * All billing child resources share the same scope prefix per variant.\n */\nexport const BILLING_SCOPE_TO_VARIANTS: Record<string, Omit<BillingResolvedVariants, 'scopeKey'>> = {\n organizationId: {\n scopeEntityDocField: 'organizationId',\n scopeType: ResourcePrimaryScope.ORGANIZATIONS,\n billingAccountFkField: 'organizationBillingAccountId',\n billingAccount: CoreResourceType.ORGANIZATION_BILLING_ACCOUNTS,\n subscription: CoreResourceType.ORGANIZATION_SUBSCRIPTIONS,\n invoiceRef: CoreResourceType.ORGANIZATION_INVOICE_REFS,\n creditPool: CoreResourceType.ORGANIZATION_CREDIT_POOLS,\n usageRecord: CoreResourceType.ORGANIZATION_USAGE_RECORDS,\n },\n userId: {\n scopeEntityDocField: 'userId',\n scopeType: ResourcePrimaryScope.USER_SELF,\n billingAccountFkField: 'userBillingAccountId',\n billingAccount: CoreResourceType.USER_BILLING_ACCOUNTS,\n subscription: CoreResourceType.USER_SUBSCRIPTIONS,\n invoiceRef: CoreResourceType.USER_INVOICE_REFS,\n creditPool: CoreResourceType.USER_CREDIT_POOLS,\n usageRecord: CoreResourceType.USER_USAGE_RECORDS,\n },\n};\n\n/**\n * Resolve billing variants from an execution context's scope IDs.\n * Returns null for APPLICATION-scoped events (no entity scope).\n */\nexport function resolveBillingVariants(execCtx: ExecutionContext<any>): BillingResolvedVariants | null {\n if (execCtx.organizationId) return { scopeKey: 'organizationId', ...BILLING_SCOPE_TO_VARIANTS.organizationId };\n if (execCtx.userId) return { scopeKey: 'userId', ...BILLING_SCOPE_TO_VARIANTS.userId };\n return null;\n}\n\n/**\n * Resolve billing variants from a known variant resource type.\n * Used by custom implementation factories that know their variant at registration time.\n */\nconst VARIANT_TO_SCOPE_KEY: Record<string, string> = {\n [CoreResourceType.ORGANIZATION_BILLING_ACCOUNTS]: 'organizationId',\n [CoreResourceType.USER_BILLING_ACCOUNTS]: 'userId',\n [CoreResourceType.ORGANIZATION_SUBSCRIPTIONS]: 'organizationId',\n [CoreResourceType.USER_SUBSCRIPTIONS]: 'userId',\n [CoreResourceType.ORGANIZATION_CREDIT_POOLS]: 'organizationId',\n [CoreResourceType.USER_CREDIT_POOLS]: 'userId',\n [CoreResourceType.ORGANIZATION_INVOICE_REFS]: 'organizationId',\n [CoreResourceType.USER_INVOICE_REFS]: 'userId',\n [CoreResourceType.ORGANIZATION_USAGE_RECORDS]: 'organizationId',\n [CoreResourceType.USER_USAGE_RECORDS]: 'userId',\n};\n\nexport function resolveBillingVariantsFromResourceType(variantResourceType: string): BillingResolvedVariants | null {\n const scopeKey = VARIANT_TO_SCOPE_KEY[variantResourceType];\n if (!scopeKey) return null;\n return { scopeKey, ...BILLING_SCOPE_TO_VARIANTS[scopeKey] };\n}\n\n/**\n * Reverse mapping: ResourcePrimaryScope → scope key for BILLING_SCOPE_TO_VARIANTS.\n */\nconst SCOPE_TYPE_TO_SCOPE_KEY: Record<string, string> = {\n [ResourcePrimaryScope.ORGANIZATIONS]: 'organizationId',\n [ResourcePrimaryScope.USER_SELF]: 'userId',\n};\n\n/**\n * Resolve billing variants from a ResourcePrimaryScope value.\n * Used by the billing state endpoint where the caller provides scopeType directly.\n */\nexport function resolveBillingVariantsFromScopeType(scopeType: ResourcePrimaryScope): BillingResolvedVariants | null {\n const scopeKey = SCOPE_TYPE_TO_SCOPE_KEY[scopeType];\n if (!scopeKey || !BILLING_SCOPE_TO_VARIANTS[scopeKey]) return null;\n return { scopeKey, ...BILLING_SCOPE_TO_VARIANTS[scopeKey] };\n}\n\n// ── Product / Price repository reads ────────────────────────────────\n\n/**\n * Build the read context for an APPLICATION-scoped catalog resource (products, prices, promotions).\n *\n * ## The correction this encodes\n *\n * These readers used to pass the CALLER's execution context straight to the repository, under a\n * comment that read \"Products are APPLICATION-scoped — no org/user scope filtering applies\". That\n * statement is true about the RESOURCE and false about the READ, and the gap between the two was a\n * live 500.\n *\n * `PRODUCTS` / `PRICES` / `PROMOTIONS` are indeed APPLICATION-primary-scoped and model neither\n * `organizationId` nor `userId`. But the repository does not filter by the TARGET's scoping model —\n * it applies whatever the CALLER's context carries, and it is fail-closed on a field the target does\n * not model: it THROWS `CONFIGURATION` / `context_filter` rather than skipping it. So \"no scope\n * filtering applies\" describes the intent and inverts the consequence.\n *\n * It fires for real. Every caller here is a `BILLING_ACCOUNTS` / `SUBSCRIPTIONS` custom impl, and both\n * are polymorphic resources whose organization variant injects `organizationId` into the operation\n * context — so an org-scoped purchase or plan change reached a catalog read with an `organizationId`\n * the catalog has no column for.\n *\n * The sub-call context narrows the inherited context to fields the target actually models, which for\n * these resources is none of the caller's scope FKs — giving the unfiltered catalog read the original\n * comment assumed it already had.\n */\nasync function createCatalogReadContext(\n resourceType: ResourceType,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<ExecutionContext<any>> {\n return utils.executionContextCreator.createForSubCall(\n executionContext,\n resourceType,\n CoreResourceOperation.READ,\n utils.serviceOptions,\n );\n}\n\n/**\n * Why a catalog row is being read — and therefore whether a RETIRED row may be returned.\n *\n * ## Why this is a required parameter rather than a check at the sites that need it\n *\n * `Product.isActive` is the declared off-boarding path (`assertNoBillingAccountDependents` calls\n * the soft retire exactly that), and no purchase path consulted it: `readProductByKey` handed back\n * a retired product exactly like a live one, so \"retired\" was a label with no behaviour behind it\n * and the catalogue-retirement reconciliation below would have been cosmetic.\n *\n * The gate is a REQUIRED argument on the reader — the same shape, and for the same reason, as\n * {@link readPriceForProduct} making the price→product FK check unbypassable: the four call sites\n * are edited in different sessions, three of them must refuse and one must NOT, and a separate\n * `assertProductIsPurchasable` helper is exactly the thing the fourth session forgets. Making the\n * distinction unrepresentable-by-omission costs one argument and removes the whole failure mode.\n *\n * The enumeration, so a fifth site can see which company it is in:\n * - OPEN_CHECKOUT (`billing-account.mutations`) — ACQUIRE.\n * - CHANGE_PLAN target product (`subscription.mutations`) — ACQUIRE.\n * - ADD_ADDON product (`subscription.mutations`) — ACQUIRE.\n * - REMOVE_ADDON product (`subscription.mutations`) — **REFERENCE, deliberately.** A customer\n * holding a retired add-on must be able to drop it; refusing here would trap them on the very\n * product the catalogue withdrew.\n */\nexport enum BillingCatalogReadIntent {\n /**\n * The caller is about to BUY this, or move a subscription onto it. A retired row is refused with\n * `CONFLICT` / `BILLING_PRODUCT_RETIRED`.\n */\n ACQUIRE = 'acquire',\n /**\n * The caller is naming a row that a subscription ALREADY points at — to display it, to remove it,\n * to rebuild a provider item list. A retired row is returned normally, because refusing would\n * break the paths a customer on a retired product needs most.\n */\n REFERENCE = 'reference',\n}\n\n/**\n * THE acquirability predicate: may this catalog row be BOUGHT, or moved onto, right now?\n *\n * ## Why this is exported rather than inlined in the ACQUIRE arm below\n *\n * {@link BillingCatalogReadIntent} closed the per-KEY half of catalogue retirement: a caller\n * naming a retired product by key is refused. It says nothing about the LISTING half, and a\n * listing surface cannot use the reader — it holds rows it already fetched in bulk, not keys.\n * Left to itself every listing re-derives the answer from the raw `isActive` column, which is\n * precisely the \"separate `assertProductIsPurchasable` helper the fourth session forgets\" that\n * the required-intent argument was introduced to remove. Measured 2026-09-09: the engine's own\n * `billing-pricing-table.tsx` had already hand-rolled `p.isPublic && p.isActive`, so the\n * retirement rule existed in two places written by two people and agreed only by luck.\n *\n * So the gate and the listing now share ONE predicate, and the boundary it draws is deliberate:\n *\n * - **`isActive` is ACQUIRABILITY** — \"available for purchase\", the same answer on every surface,\n * and the one this predicate owns because the purchase gate enforces it.\n * - **`isPublic` is VISIBILITY** — \"visible to end users\", and the answer legitimately DIFFERS by\n * surface: a back-office catalog listing shows non-public rows, a customer pricing table does\n * not, and a customer handed a direct link to a private-but-active plan may buy it (the gate\n * accepts them, deliberately). Folding `isPublic` in here would make the purchase gate refuse\n * that customer, which is a product decision nobody has taken.\n *\n * A surface that wants \"public AND acquirable\" composes the two; it must not re-spell either.\n *\n * @param productRow - a `Product` row as read from the repository.\n */\nexport function isProductAcquirable(productRow: Pick<Product, 'isActive'> | { isActive?: boolean }): boolean {\n return productRow.isActive !== false;\n}\n\n/**\n * Read a product from the repository by key.\n *\n * Products are APPLICATION-scoped, so no org/user scoping is MEANT to apply — which is precisely why\n * the read must not inherit the caller's scope context. See {@link createCatalogReadContext}.\n */\nexport async function readProductByKey(\n key: string,\n intent: BillingCatalogReadIntent,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const productRepo = utils.repositoriesRegistry.getRepository(CoreResourceType.PRODUCTS);\n if (!productRepo) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_NOT_FOUND,\n context: { productKey: key },\n });\n }\n const product = await productRepo.read(await createCatalogReadContext(CoreResourceType.PRODUCTS, executionContext, utils), { key });\n if (!product) {\n throw utils.errorBuilder.buildError(ErrorType.NOT_FOUND, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_NOT_FOUND,\n context: { productKey: key },\n });\n }\n const productRow = product as any;\n if (intent === BillingCatalogReadIntent.ACQUIRE && !isProductAcquirable(productRow)) {\n throw utils.errorBuilder.buildError(ErrorType.CONFLICT, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_RETIRED,\n context: { productKey: key, productId: productRow._id },\n });\n }\n return productRow;\n}\n\n/**\n * Read a product from the repository by ID.\n */\nexport async function readProductById(\n productId: string,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const productRepo = utils.repositoriesRegistry.getRepository(CoreResourceType.PRODUCTS);\n if (!productRepo) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_NOT_FOUND,\n context: { productId },\n });\n }\n const product = await productRepo.read(await createCatalogReadContext(CoreResourceType.PRODUCTS, executionContext, utils), productId);\n if (!product) {\n throw utils.errorBuilder.buildError(ErrorType.NOT_FOUND, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_NOT_FOUND,\n context: { productId },\n });\n }\n return product;\n}\n\n/**\n * Read a price from the repository by ID.\n *\n * APPLICATION-scoped like products, and read on a sub-call context for the same reason — see\n * {@link createCatalogReadContext}.\n *\n * ## Use {@link readPriceForProduct} whenever a product is also in play\n *\n * This reader answers \"what is price X\", nothing more. It is correct for resolving the price of an\n * ALREADY-PERSISTED subscription item, where the product↔price pairing was decided (and validated)\n * when the item was written. It is NOT correct for a purchase path where the caller names a product\n * and a price in the same request: there the pairing is the thing an attacker controls, and reading\n * the two independently is precisely the defect {@link assertPriceBelongsToProduct} closes.\n */\nexport async function readPriceById(\n priceId: string,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const priceRepo = utils.repositoriesRegistry.getRepository(CoreResourceType.PRICES);\n if (!priceRepo) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRICE_NOT_FOUND,\n context: { priceId },\n });\n }\n const price = await priceRepo.read(await createCatalogReadContext(CoreResourceType.PRICES, executionContext, utils), priceId);\n if (!price) {\n throw utils.errorBuilder.buildError(ErrorType.NOT_FOUND, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRICE_NOT_FOUND,\n context: { priceId },\n });\n }\n return price;\n}\n\n/**\n * Refuse a price that does not belong to the product it is being purchased against.\n *\n * ## Why this has to exist\n *\n * `Price.productId` is a declared foreign key — every price already knows its product. Every\n * purchase path nevertheless resolved the two INDEPENDENTLY (product by key, price by id) and\n * checked only that the price had a `providerPriceId`. The FK was never consulted.\n *\n * The consequence is a split between what is CHARGED and what is GRANTED. The provider is billed\n * `price.providerPriceId`, while the local subscription item records `productId: product._id`, and\n * entitlements (feature sync, plan tier, credit pack size) derive from the ITEM's product. So a\n * caller who pairs the premium product key with a cheap product's price id is billed the cheap\n * price and entitled at the premium product — an authorization outcome purchased at the wrong\n * amount, with both sides internally consistent and nothing downstream able to notice.\n *\n * ## Why a combined reader rather than a check at each site\n *\n * The three purchase paths (OPEN_CHECKOUT, CHANGE_PLAN, ADD_ADDON) are edited in different sessions\n * and each had the same omission. {@link readPriceForProduct} is the shape that makes the invariant\n * unbypassable for the next one: resolving a price in a product context and validating the pairing\n * are one call, so a new purchase path cannot obtain the price without the check having run.\n *\n * @param price - The price row, as read from the catalog.\n * @param product - The product row the purchase names.\n * @throws `VALIDATION` (400, `BILLING_PRICE_PRODUCT_MISMATCH`) when `price.productId !== product._id`.\n */\nexport function assertPriceBelongsToProduct(\n price: any,\n product: any,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): void {\n if (price?.productId === product?._id) return;\n\n throw utils.errorBuilder.buildError(ErrorType.VALIDATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRICE_PRODUCT_MISMATCH,\n context: {\n priceId: price?._id,\n priceProductId: price?.productId ?? null,\n productId: product?._id,\n productKey: product?.key,\n },\n });\n}\n\n/**\n * Read a price and prove it belongs to the given product, in one step.\n *\n * The safe reader for every path where the caller names a product AND a price. See\n * {@link assertPriceBelongsToProduct} for what goes wrong when the two are resolved independently.\n */\nexport async function readPriceForProduct(\n priceId: string,\n product: any,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const price = await readPriceById(priceId, executionContext, utils);\n assertPriceBelongsToProduct(price, product, executionContext, utils);\n /*\n * A retired PRICE is refused here and nowhere else, and that placement is the whole argument.\n *\n * All three callers of this reader are acquisitions (OPEN_CHECKOUT, CHANGE_PLAN, ADD_ADDON) —\n * that is what the reader is FOR, per its own doc above — so the gate needs no intent argument\n * and cannot be reached by a reference read. `readPriceById`, which resolves the price of an\n * already-persisted subscription item, is deliberately left ungated: a subscriber on a retired\n * plan rebuilds their provider item list through it on every add-on change, and refusing there\n * would break the customer the retirement was supposed to leave alone.\n *\n * The catalogue-retirement sweep deactivates a retired product's prices alongside the product, so\n * in practice this fires together with the product gate; it is separate because an operator may\n * also retire a single price (a currency, an interval) while the product stays on sale.\n */\n if (price?.isActive === false) {\n throw utils.errorBuilder.buildError(ErrorType.CONFLICT, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_PRODUCT_RETIRED,\n context: { priceId, productId: product?._id, productKey: product?.key },\n });\n }\n return price;\n}\n\n// ── Promotion resolution ────────────────────────────────────────────\n\n/**\n * Read an active promotion from the repository by its user-facing code.\n * Returns null if no active promotion with that code exists.\n */\nexport async function readPromotionByCode(\n code: string,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<any> {\n const promoRepo = utils.repositoriesRegistry.getRepository(CoreResourceType.PROMOTIONS);\n if (!promoRepo) return null;\n const promotion = await promoRepo.read(await createCatalogReadContext(CoreResourceType.PROMOTIONS, executionContext, utils), { code, isActive: true });\n return promotion ?? null;\n}\n\n// ── Billing account dependent scan (hard-delete guard) ──────────────\n\n/**\n * The retained financial child families that pin a billing account in place.\n *\n * Typed against `BillingResolvedVariants` so a rename of any variant field breaks the build\n * here rather than silently dropping a family from the guard.\n */\nexport type BillingAccountDependentFamily = Extract<\n keyof BillingResolvedVariants,\n 'subscription' | 'invoiceRef' | 'usageRecord' | 'creditPool'\n>;\n\n/**\n * Canonical ORDER of the billing child families. Order only — membership is derived below.\n *\n * Kept as an explicit tuple so the guard's scan order (and the report a human reads when a delete\n * is refused) is stable and mirrors the registry's declaration order, rather than depending on\n * however the relationship array happens to be arranged.\n */\nconst BILLING_ACCOUNT_DEPENDENT_FAMILY_ORDER: readonly BillingAccountDependentFamily[] = [\n 'subscription',\n 'invoiceRef',\n 'usageRecord',\n 'creditPool',\n] as const;\n\n/**\n * Every child family whose rows are RETAINED when their billing account is deleted.\n *\n * DERIVED from the registry, not restated. This used to be a hand-maintained list with a comment\n * asking a human to keep it in lock-step with `resources-registry.shared.core.definitions.ts` — the\n * exact coupling that rots, because the two live in different packages and nothing failed when they\n * disagreed. A family whose cascade is re-ENABLED now drops out of this list automatically (it is\n * no longer retained, so it no longer pins the account), and a family that stops being declared\n * disappears with it.\n *\n * The derivation asks the registry one question: for each `BillingAccounts → <child>` COMPOSITION\n * edge, is `onParentDelete` disabled? Disabled means \"these rows survive their parent\", which is\n * precisely what makes them a dependent that blocks a hard delete.\n *\n * Note this reads the BILLING-ACCOUNT edges specifically, not the scope edges. Both are disabled by\n * the same decision, but it is the account-parent edge that this guard is about.\n */\nexport const BILLING_ACCOUNT_DEPENDENT_FAMILIES: readonly BillingAccountDependentFamily[] =\n deriveRetainedBillingAccountDependentFamilies();\n\nfunction deriveRetainedBillingAccountDependentFamilies(): readonly BillingAccountDependentFamily[] {\n const billingAccountResourceTypes = new Set<string>(\n Object.values(BILLING_SCOPE_TO_VARIANTS).map((variants) => variants.billingAccount as string),\n );\n\n // child resource type → family key, across BOTH scope variants.\n const childResourceTypeToFamily = new Map<string, BillingAccountDependentFamily>();\n for (const variants of Object.values(BILLING_SCOPE_TO_VARIANTS)) {\n for (const family of BILLING_ACCOUNT_DEPENDENT_FAMILY_ORDER) {\n childResourceTypeToFamily.set(variants[family] as string, family);\n }\n }\n\n const retained = new Set<BillingAccountDependentFamily>();\n for (const relationship of coreSharedResourceRelationship) {\n if (relationship.nature !== RelationshipNature.COMPOSITION) continue;\n if (!billingAccountResourceTypes.has(relationship.resourceType1 as string)) continue;\n // Disabled (or absent) cascade == the child survives its parent == a retained dependent.\n if (relationship.childOperations?.lifecycle?.onParentDelete?.enabled === true) continue;\n\n const family = childResourceTypeToFamily.get(relationship.resourceType2 as string);\n if (family) retained.add(family);\n }\n\n return BILLING_ACCOUNT_DEPENDENT_FAMILY_ORDER.filter((family) => retained.has(family));\n}\n\n/**\n * Refuse hard removal of a billing account while retained financial children still reference it.\n *\n * ## Why this guard exists\n *\n * The billing-retention decision (2026-07-29) disabled `onParentDelete` on all 18 billing\n * cascades, so subscriptions / invoice refs / usage records / credit pools SURVIVE the deletion\n * of their scope and of their billing account. That made a direct hard delete of the account the\n * only remaining way to strand those retained rows behind a dangling FK.\n *\n * The damage is not merely referential: `providerCustomerId` is `.isBackendOnly()` and lives ONLY\n * on the account row. The children carry `providerInvoiceId` / `providerSubscriptionId` but NOT\n * the provider CUSTOMER id — so deleting the account destroys the only local key that maps a\n * retained invoice back to the customer it was billed to. A financial record that cannot be\n * reconciled against the provider defeats the purpose of retaining it. Nothing provider-side is\n * cleaned up on delete either, so the provider record lives on regardless.\n *\n * ## Why it fails closed\n *\n * The operation is `riskLevel: CRITICAL` and guards a compliance obligation, so \"cannot verify\"\n * must never read as \"nothing found\". A missing child repository raises `CONFIGURATION` rather\n * than being skipped, and any scope-filter failure inside the reads propagates instead of being\n * swallowed.\n *\n * The product off-boarding path is the soft retire (`isActive: false`), which this does not touch.\n *\n * Detection uses `read()` rather than `count()` deliberately: none of the four child families\n * declares a `COUNT` core operation, so `repository.count()` would throw INTERNAL. All four\n * declare `READ`. Each read is a single indexed hit on the billing-account FK, and the FK is\n * globally unique, so the result is correct regardless of how the execution context scopes it.\n *\n * @param billingAccountId - The account row about to be hard-deleted.\n * @param variants - Resolved polymorphic variants for the account's scope (org or user).\n * @throws `CONFLICT` (409, `BILLING_ACCOUNT_HAS_DEPENDENTS`) listing every blocking family.\n * @throws `CONFIGURATION` when a child family's repository is not registered (unverifiable).\n */\nexport async function assertNoBillingAccountDependents(\n billingAccountId: string,\n variants: BillingResolvedVariants,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<void> {\n const dependentFilter = { [variants.billingAccountFkField]: billingAccountId };\n\n const blockingFamilies = (\n await Promise.all(\n BILLING_ACCOUNT_DEPENDENT_FAMILIES.map(async (family) => {\n const childResourceType = variants[family];\n const childRepository = utils.repositoriesRegistry.getRepository(childResourceType);\n\n // Fail closed: an unregistered child repository means we cannot prove the family is\n // empty. Skipping it would silently downgrade the guard to \"nothing found\".\n if (!childRepository) {\n throw utils.errorBuilder.buildError(ErrorType.CONFIGURATION, executionContext, {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message: 'Cannot verify billing-account dependents: child repository is not registered',\n billingAccountId,\n dependentFamily: family,\n childResourceType,\n },\n });\n }\n\n const existingChild = await childRepository.read(executionContext, dependentFilter);\n return existingChild ? family : undefined;\n }),\n )\n ).filter((family): family is BillingAccountDependentFamily => family !== undefined);\n\n if (blockingFamilies.length > 0) {\n throw utils.errorBuilder.buildError(ErrorType.CONFLICT, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_ACCOUNT_HAS_DEPENDENTS,\n context: {\n billingAccountId,\n blockingDependentFamilies: blockingFamilies,\n blockingResourceTypes: blockingFamilies.map((family) => variants[family]),\n },\n });\n }\n}\n\n// ── Provider validation ─────────────────────────────────────────────\n\n/**\n * Validate that a subscription has a provider subscription ID.\n */\nexport function validateProviderSubscription(\n subscription: any,\n subscriptionId: string,\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): void {\n if (!subscription?.providerSubscriptionId) {\n throw utils.errorBuilder.buildError(ErrorType.BUSINESS_RULE, executionContext, {\n customMessageReference: ErrorCustomMessageReference.BILLING_NO_PROVIDER_SUBSCRIPTION,\n context: { subscriptionId },\n });\n }\n}\n\n// ── Provider item resolution ────────────────────────────────────────\n\n/**\n * Resolve the providerPriceId for each subscription item by reading prices.\n */\nexport async function resolveProviderItems(\n items: any[],\n executionContext: ExecutionContext<any>,\n utils: ResourceOperation_CustomImplementation_Utils,\n): Promise<Array<{ providerSubscriptionItemId?: string; providerPriceId: string; quantity: number }>> {\n return Promise.all(\n items.map(async (item: any) => {\n const price = await readPriceById(item.priceId, executionContext, utils);\n return {\n providerSubscriptionItemId: item.providerSubscriptionItemId,\n providerPriceId: price.providerPriceId || item.priceId,\n quantity: item.quantity,\n };\n }),\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"billing-custom-implementations.backend.d.ts","sourceRoot":"","sources":["../../../../../../src/billing/services/custom-impl/billing-custom-implementations.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAEtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,6FAA6F,CAAC;AAEzJ,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,4GAA4G,CAAC;AAC7K,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kEAAkE,CAAC;AACnH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,sFAAsF,CAAC;AAC7I,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+EAA+E,CAAC;AAiDhI;;;;GAIG;AACH,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,yBAAyB,EACnC,kBAAkB,EAAE,gCAAgC,EACpD,mBAAmB,EAAE,0BAA0B,EAC/C,aAAa,EAAE,oBAAoB,EACnC,YAAY,EAAE,0BAA0B,EACxC,WAAW,EAAE,MAAM,GAClB,IAAI,CAON;AAED;;;GAGG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,oBAAoB,EAAE,OAAO,gFAAgF,EAAE,2BAA2B,GACzI,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IACrC,OAAO,gFAAgF,EAAE,2BAA2B,GAAG,IAAI,CAE5H;AAED,wBAAgB,0BAA0B,CACxC,gBAAgB,EAAE,OAAO,uDAAuD,EAAE,gBAAgB,GACjG,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,uDAAuD,EAAE,gBAAgB,GAAG,IAAI,CAE7H;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,yBAAyB,CAO9D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAO9C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,gCAAgC,CAOxE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,0BAA0B,CAOnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,oBAAoB,CAOvD;AAID,eAAO,MAAM,4BAA4B,EAAE,0CAA0C,EAqBpF,CAAC;AAUF;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC/C,gBAAgB,EAAE,qCAAqC,GACtD,IAAI,CAwCN"}
1
+ {"version":3,"file":"billing-custom-implementations.backend.d.ts","sourceRoot":"","sources":["../../../../../src/billing/services/custom-impl/billing-custom-implementations.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAEtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,6FAA6F,CAAC;AAEzJ,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,4GAA4G,CAAC;AAC7K,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kEAAkE,CAAC;AACnH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,sFAAsF,CAAC;AAC7I,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+EAA+E,CAAC;AAiDhI;;;;GAIG;AACH,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,yBAAyB,EACnC,kBAAkB,EAAE,gCAAgC,EACpD,mBAAmB,EAAE,0BAA0B,EAC/C,aAAa,EAAE,oBAAoB,EACnC,YAAY,EAAE,0BAA0B,EACxC,WAAW,EAAE,MAAM,GAClB,IAAI,CAON;AAED;;;GAGG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,oBAAoB,EAAE,OAAO,gFAAgF,EAAE,2BAA2B,GACzI,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IACrC,OAAO,gFAAgF,EAAE,2BAA2B,GAAG,IAAI,CAE5H;AAED,wBAAgB,0BAA0B,CACxC,gBAAgB,EAAE,OAAO,uDAAuD,EAAE,gBAAgB,GACjG,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,uDAAuD,EAAE,gBAAgB,GAAG,IAAI,CAE7H;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,yBAAyB,CAO9D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAO9C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,gCAAgC,CAOxE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,0BAA0B,CAOnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,oBAAoB,CAOvD;AAID,eAAO,MAAM,4BAA4B,EAAE,0CAA0C,EAqBpF,CAAC;AAUF;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC/C,gBAAgB,EAAE,qCAAqC,GACtD,IAAI,CAwCN"}
@@ -1 +1 @@
1
- {"version":3,"file":"billing-custom-implementations.backend.js","sourceRoot":"","sources":["../../../../../../src/billing/services/custom-impl/billing-custom-implementations.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Billing Custom Implementations — Aggregator + Late-Binding Setup\n *\n * Exports all billing resource custom implementations for registration\n * in CoreBackend_ServiceImplementationsFactories.\n *\n * Uses late-binding for the billing provider and feature sync service:\n * - Factory functions are registered at startup (before billing is initialized)\n * - Handler functions execute at operation time (after billing is initialized)\n * - initializeBillingCustomImplementations() must be called during billing setup\n *\n * @see billing-polymorphic-full-implementation.md §4.4\n */\n\nimport type { StandardBilling_Interface } from '@wildo-ai/external-connectors-models';\nimport { CoreResourceType, CoreWebSocketEvent, ResourcePrimaryScope, ErrorType, ErrorCustomMessageReference } from '@wildo-ai/saas-models';\nimport type { BillingConfiguration } from '@wildo-ai/saas-models';\nimport type { ServicesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/services/services-registry-handler.backend.service';\nimport { BILLING_SCOPE_TO_VARIANTS, CREDIT_POOL_VARIANT_TYPES, resolveBillingVariantsFromResourceType } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-impl-utils.backend';\nimport type { ResourceCustomServiceImplementationFactory } from '~wildo-backend-lib/base-classes/services/services/resource-operation-custom-implementation.factory.backend';\nimport type { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport type { BillingFeatureSyncBackendService } from '~wildo-backend-lib/billing/services/back-office/billing-feature-sync.backend.service';\nimport type { BillingStateBackendService } from '~wildo-backend-lib/billing/services/back-office/billing-state.backend.service';\nimport {\n createSubscriptionCancelFactories,\n createSubscriptionResumeFactories,\n createSubscriptionChangePlanFactories,\n createSubscriptionAddAddonFactories,\n createSubscriptionRemoveAddonFactories,\n} from '~wildo-backend-lib/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service';\nimport {\n createBillingAccountCreateFactories,\n createBillingAccountDeleteDependentsGuardFactories,\n createBillingAccountOpenCheckoutFactories,\n createBillingAccountOpenPortalFactories,\n createBillingAccountGetStateFactories,\n} from '~wildo-backend-lib/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service';\nimport {\n createCreditPoolConsumeFactories,\n createCreditPoolTopUpFactories,\n} from '~wildo-backend-lib/billing/services/custom-impl/credit-pool.custom-ops.custom-impl.backend.service';\nimport {\n createPromotionCreateFactory,\n createPromotionApplyFactory,\n createPromotionDeactivateFactory,\n createPromotionDeactivateBulkFactory,\n} from '~wildo-backend-lib/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service';\n\n// ── Late-Binding References ──────────────────────────────────────────\n\nlet _billingProvider: StandardBilling_Interface | null = null;\nlet _featureSyncService: BillingFeatureSyncBackendService | null = null;\nlet _billingStateService: BillingStateBackendService | null = null;\nlet _billingConfig: BillingConfiguration | null = null;\n/** The ref the billing provider was RESOLVED under at startup — the one rows are stamped with. */\nlet _billingProviderRef: string | null = null;\nlet _errorBuilder: ErrorBuilderBackendService | null = null;\nlet _webSocketService: import('~wildo-backend-lib/requests/service/websocket.service').WebSocketService | null = null;\nlet _usageMeteringService: import('~wildo-backend-lib/billing/services/back-office/usage-metering.backend.service').UsageMeteringBackendService | null = null;\n\n/** Throw a CONFIGURATION WildoError_Backend, or fall back to plain Error if error builder itself isn't initialized yet. */\nfunction throwBillingNotInitialized(message: string): never {\n if (_errorBuilder) {\n throw _errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: { message },\n });\n }\n throw new Error(message);\n}\n\n/**\n * Initialize billing custom implementation dependencies.\n * Called from start-application after the billing provider is resolved.\n * Must be called before any billing custom operation executes.\n */\nexport function initializeBillingCustomImplementations(\n provider: StandardBilling_Interface,\n featureSyncService: BillingFeatureSyncBackendService,\n billingStateService: BillingStateBackendService,\n billingConfig: BillingConfiguration,\n errorBuilder: ErrorBuilderBackendService,\n providerRef: string,\n): void {\n _billingProvider = provider;\n _billingProviderRef = providerRef;\n _featureSyncService = featureSyncService;\n _billingStateService = billingStateService;\n _billingConfig = billingConfig;\n _errorBuilder = errorBuilder;\n}\n\n/**\n * Set the WebSocket service for credit pool post-op event emission.\n * Called from start-application after WebSocket service is resolved.\n */\n/**\n * Publish the usage-metering service for the post-operation usage hook (#415).\n *\n * A module-level seam rather than a DI edge, deliberately and for the same reason the WebSocket\n * service beside it uses one: `UsageMeteringBackendService` injects\n * `ServicesRegistryHandlerService`, and the hook lives ON that handler — so injecting the metering\n * service there would be a container cycle.\n *\n * It also gives the right behaviour for free: an application with no billing configured never calls\n * this, `getUsageMeteringService()` returns `null`, and the hook costs one null check per write\n * instead of resolving a service that would refuse anyway.\n */\nexport function setUsageMeteringService(\n usageMeteringService: import('~wildo-backend-lib/billing/services/back-office/usage-metering.backend.service').UsageMeteringBackendService,\n): void {\n _usageMeteringService = usageMeteringService;\n}\n\n/**\n * The usage-metering service, or `null` when billing is not configured.\n *\n * `null` rather than a throw, unlike `getBillingProvider()`: a write on a resource that declares no\n * metered usage must not be able to fail because billing is absent, and the caller checks.\n */\nexport function getUsageMeteringService():\n import('~wildo-backend-lib/billing/services/back-office/usage-metering.backend.service').UsageMeteringBackendService | null {\n return _usageMeteringService;\n}\n\nexport function setBillingWebSocketService(\n webSocketService: import('~wildo-backend-lib/requests/service/websocket.service').WebSocketService,\n): void {\n _webSocketService = webSocketService;\n}\n\n/**\n * Get the WebSocket service (optional — returns null if not initialized).\n */\nexport function getWebSocketService(): import('~wildo-backend-lib/requests/service/websocket.service').WebSocketService | null {\n return _webSocketService;\n}\n\n/**\n * Get the billing provider (lazy — resolved at operation execution time).\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getBillingProvider(): StandardBilling_Interface {\n if (!_billingProvider) {\n throwBillingNotInitialized(\n 'Billing provider not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _billingProvider;\n}\n\n/**\n * The provider ref the billing adapter was resolved under. Rows that record which provider\n * owns a customer (`providerRef` on billing accounts) take it from HERE — never from a literal\n * default: `config.providerRef || 'stripe'` stood at that site until 2026-09-05 (#327), a branch\n * on a provider ref that the guard test could not see and that would have stamped every row\n * 'stripe' under any other billing adapter.\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getBillingProviderRef(): string {\n if (!_billingProviderRef) {\n throwBillingNotInitialized(\n 'Billing provider ref not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _billingProviderRef;\n}\n\n/**\n * Get the feature sync service (lazy — resolved at operation execution time).\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getFeatureSyncService(): BillingFeatureSyncBackendService {\n if (!_featureSyncService) {\n throwBillingNotInitialized(\n 'Feature sync service not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _featureSyncService;\n}\n\n/**\n * Get the billing state service (lazy — resolved at operation execution time).\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getBillingStateService(): BillingStateBackendService {\n if (!_billingStateService) {\n throwBillingNotInitialized(\n 'Billing state service not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _billingStateService;\n}\n\n/**\n * Get the billing configuration (lazy — resolved at operation execution time).\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getBillingConfig(): BillingConfiguration {\n if (!_billingConfig) {\n throwBillingNotInitialized(\n 'Billing config not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _billingConfig;\n}\n\n// ── All billing custom implementation factories ──────────────────────\n\nexport const billingCustomImplementations: ResourceCustomServiceImplementationFactory[] = [\n // Subscription operations\n ...createSubscriptionCancelFactories(),\n ...createSubscriptionResumeFactories(),\n ...createSubscriptionChangePlanFactories(),\n ...createSubscriptionAddAddonFactories(),\n ...createSubscriptionRemoveAddonFactories(),\n // Billing account operations\n ...createBillingAccountCreateFactories(),\n ...createBillingAccountDeleteDependentsGuardFactories(),\n ...createBillingAccountOpenCheckoutFactories(),\n ...createBillingAccountOpenPortalFactories(),\n ...createBillingAccountGetStateFactories(),\n // Credit pool operations\n ...createCreditPoolConsumeFactories(),\n ...createCreditPoolTopUpFactories(),\n // Promotion operations\n createPromotionCreateFactory(),\n createPromotionApplyFactory(),\n createPromotionDeactivateFactory(),\n createPromotionDeactivateBulkFactory(),\n];\n\n// ── Post-operation hook registration ─────────────────────────────────\n\n/** All subscription polymorphic variant types. */\nconst SUBSCRIPTION_VARIANT_TYPES: readonly string[] = [\n CoreResourceType.ORGANIZATION_SUBSCRIPTIONS,\n CoreResourceType.USER_SUBSCRIPTIONS,\n];\n\n/**\n * Register post-operation hooks on subscription variant types.\n * After any successful mutation on a subscription, triggers feature sync\n * to recompute billing-derived features from current subscription state.\n *\n * This replaces explicit feature sync calls in subscription custom impls\n * and the webhook event router — the hook fires automatically.\n */\nexport function registerBillingPostOperationHooks(\n servicesRegistry: ServicesRegistryHandlerBackendService,\n): void {\n for (const subscriptionType of SUBSCRIPTION_VARIANT_TYPES) {\n servicesRegistry.registerPostOperationHook(subscriptionType, async (resourceType, _operationIdentifier, result, _executionContext) => {\n const variants = resolveBillingVariantsFromResourceType(resourceType);\n if (!variants) return;\n\n const billingAccountId = result?.[variants.billingAccountFkField] as string | undefined;\n if (!billingAccountId) return;\n\n const featureSyncService = getFeatureSyncService();\n await featureSyncService.onSubscriptionChanged(billingAccountId, variants);\n });\n }\n\n for (const creditPoolType of CREDIT_POOL_VARIANT_TYPES) {\n servicesRegistry.registerPostOperationHook(creditPoolType, async (resourceType, _operationIdentifier, result, executionContext) => {\n const ws = getWebSocketService();\n if (!ws) return;\n\n const variants = resolveBillingVariantsFromResourceType(resourceType);\n if (!variants) return;\n\n const billingAccountId = result?.[variants.billingAccountFkField] as string | undefined;\n if (!billingAccountId) return;\n\n const scopeEntityId = executionContext[variants.scopeKey] as string | undefined;\n if (!scopeEntityId) return;\n\n const message = {\n type: CoreWebSocketEvent.BILLING_CREDIT_POOL_UPDATED,\n payload: { scopeType: variants.scopeType, scopeEntityId, billingAccountId },\n timestamp: new Date(),\n };\n\n switch (variants.scopeType) {\n case ResourcePrimaryScope.ORGANIZATIONS: await ws.sendToOrganization(scopeEntityId, message); break;\n case ResourcePrimaryScope.USER_SELF: await ws.sendToUser(scopeEntityId, message); break;\n }\n });\n }\n}\n"]}
1
+ {"version":3,"file":"billing-custom-implementations.backend.js","sourceRoot":"","sources":["../../../../../src/billing/services/custom-impl/billing-custom-implementations.backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Billing Custom Implementations — Aggregator + Late-Binding Setup\n *\n * Exports all billing resource custom implementations for registration\n * in CoreBackend_ServiceImplementationsFactories.\n *\n * Uses late-binding for the billing provider and feature sync service:\n * - Factory functions are registered at startup (before billing is initialized)\n * - Handler functions execute at operation time (after billing is initialized)\n * - initializeBillingCustomImplementations() must be called during billing setup\n *\n * @see billing-polymorphic-full-implementation.md §4.4\n */\n\nimport type { StandardBilling_Interface } from '@wildo-ai/external-connectors-models';\nimport { CoreResourceType, CoreWebSocketEvent, ResourcePrimaryScope, ErrorType, ErrorCustomMessageReference } from '@wildo-ai/saas-models';\nimport type { BillingConfiguration } from '@wildo-ai/saas-models';\nimport type { ServicesRegistryHandlerBackendService } from '~wildo-backend-lib/base-classes/services/services/services-registry-handler.backend.service';\nimport { BILLING_SCOPE_TO_VARIANTS, CREDIT_POOL_VARIANT_TYPES, resolveBillingVariantsFromResourceType } from '~wildo-backend-lib/billing/services/custom-impl/billing-custom-impl-utils.backend';\nimport type { ResourceCustomServiceImplementationFactory } from '~wildo-backend-lib/base-classes/services/services/resource-operation-custom-implementation.factory.backend';\nimport type { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport type { BillingFeatureSyncBackendService } from '~wildo-backend-lib/billing/services/back-office/billing-feature-sync.backend.service';\nimport type { BillingStateBackendService } from '~wildo-backend-lib/billing/services/back-office/billing-state.backend.service';\nimport {\n createSubscriptionCancelFactories,\n createSubscriptionResumeFactories,\n createSubscriptionChangePlanFactories,\n createSubscriptionAddAddonFactories,\n createSubscriptionRemoveAddonFactories,\n} from '~wildo-backend-lib/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service';\nimport {\n createBillingAccountCreateFactories,\n createBillingAccountDeleteDependentsGuardFactories,\n createBillingAccountOpenCheckoutFactories,\n createBillingAccountOpenPortalFactories,\n createBillingAccountGetStateFactories,\n} from '~wildo-backend-lib/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service';\nimport {\n createCreditPoolConsumeFactories,\n createCreditPoolTopUpFactories,\n} from '~wildo-backend-lib/billing/services/custom-impl/credit-pool.custom-ops.custom-impl.backend.service';\nimport {\n createPromotionCreateFactory,\n createPromotionApplyFactory,\n createPromotionDeactivateFactory,\n createPromotionDeactivateBulkFactory,\n} from '~wildo-backend-lib/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service';\n\n// ── Late-Binding References ──────────────────────────────────────────\n\nlet _billingProvider: StandardBilling_Interface | null = null;\nlet _featureSyncService: BillingFeatureSyncBackendService | null = null;\nlet _billingStateService: BillingStateBackendService | null = null;\nlet _billingConfig: BillingConfiguration | null = null;\n/** The ref the billing provider was RESOLVED under at startup — the one rows are stamped with. */\nlet _billingProviderRef: string | null = null;\nlet _errorBuilder: ErrorBuilderBackendService | null = null;\nlet _webSocketService: import('~wildo-backend-lib/requests/service/websocket.service').WebSocketService | null = null;\nlet _usageMeteringService: import('~wildo-backend-lib/billing/services/back-office/usage-metering.backend.service').UsageMeteringBackendService | null = null;\n\n/** Throw a CONFIGURATION WildoError_Backend, or fall back to plain Error if error builder itself isn't initialized yet. */\nfunction throwBillingNotInitialized(message: string): never {\n if (_errorBuilder) {\n throw _errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: { message },\n });\n }\n throw new Error(message);\n}\n\n/**\n * Initialize billing custom implementation dependencies.\n * Called from start-application after the billing provider is resolved.\n * Must be called before any billing custom operation executes.\n */\nexport function initializeBillingCustomImplementations(\n provider: StandardBilling_Interface,\n featureSyncService: BillingFeatureSyncBackendService,\n billingStateService: BillingStateBackendService,\n billingConfig: BillingConfiguration,\n errorBuilder: ErrorBuilderBackendService,\n providerRef: string,\n): void {\n _billingProvider = provider;\n _billingProviderRef = providerRef;\n _featureSyncService = featureSyncService;\n _billingStateService = billingStateService;\n _billingConfig = billingConfig;\n _errorBuilder = errorBuilder;\n}\n\n/**\n * Set the WebSocket service for credit pool post-op event emission.\n * Called from start-application after WebSocket service is resolved.\n */\n/**\n * Publish the usage-metering service for the post-operation usage hook (#415).\n *\n * A module-level seam rather than a DI edge, deliberately and for the same reason the WebSocket\n * service beside it uses one: `UsageMeteringBackendService` injects\n * `ServicesRegistryHandlerService`, and the hook lives ON that handler — so injecting the metering\n * service there would be a container cycle.\n *\n * It also gives the right behaviour for free: an application with no billing configured never calls\n * this, `getUsageMeteringService()` returns `null`, and the hook costs one null check per write\n * instead of resolving a service that would refuse anyway.\n */\nexport function setUsageMeteringService(\n usageMeteringService: import('~wildo-backend-lib/billing/services/back-office/usage-metering.backend.service').UsageMeteringBackendService,\n): void {\n _usageMeteringService = usageMeteringService;\n}\n\n/**\n * The usage-metering service, or `null` when billing is not configured.\n *\n * `null` rather than a throw, unlike `getBillingProvider()`: a write on a resource that declares no\n * metered usage must not be able to fail because billing is absent, and the caller checks.\n */\nexport function getUsageMeteringService():\n import('~wildo-backend-lib/billing/services/back-office/usage-metering.backend.service').UsageMeteringBackendService | null {\n return _usageMeteringService;\n}\n\nexport function setBillingWebSocketService(\n webSocketService: import('~wildo-backend-lib/requests/service/websocket.service').WebSocketService,\n): void {\n _webSocketService = webSocketService;\n}\n\n/**\n * Get the WebSocket service (optional — returns null if not initialized).\n */\nexport function getWebSocketService(): import('~wildo-backend-lib/requests/service/websocket.service').WebSocketService | null {\n return _webSocketService;\n}\n\n/**\n * Get the billing provider (lazy — resolved at operation execution time).\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getBillingProvider(): StandardBilling_Interface {\n if (!_billingProvider) {\n throwBillingNotInitialized(\n 'Billing provider not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _billingProvider;\n}\n\n/**\n * The provider ref the billing adapter was resolved under. Rows that record which provider\n * owns a customer (`providerRef` on billing accounts) take it from HERE — never from a literal\n * default: `config.providerRef || 'stripe'` stood at that site until 2026-09-05 (#327), a branch\n * on a provider ref that the guard test could not see and that would have stamped every row\n * 'stripe' under any other billing adapter.\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getBillingProviderRef(): string {\n if (!_billingProviderRef) {\n throwBillingNotInitialized(\n 'Billing provider ref not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _billingProviderRef;\n}\n\n/**\n * Get the feature sync service (lazy — resolved at operation execution time).\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getFeatureSyncService(): BillingFeatureSyncBackendService {\n if (!_featureSyncService) {\n throwBillingNotInitialized(\n 'Feature sync service not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _featureSyncService;\n}\n\n/**\n * Get the billing state service (lazy — resolved at operation execution time).\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getBillingStateService(): BillingStateBackendService {\n if (!_billingStateService) {\n throwBillingNotInitialized(\n 'Billing state service not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _billingStateService;\n}\n\n/**\n * Get the billing configuration (lazy — resolved at operation execution time).\n * @throws if initializeBillingCustomImplementations() has not been called\n */\nexport function getBillingConfig(): BillingConfiguration {\n if (!_billingConfig) {\n throwBillingNotInitialized(\n 'Billing config not initialized — initializeBillingCustomImplementations() must be called first',\n );\n }\n return _billingConfig;\n}\n\n// ── All billing custom implementation factories ──────────────────────\n\nexport const billingCustomImplementations: ResourceCustomServiceImplementationFactory[] = [\n // Subscription operations\n ...createSubscriptionCancelFactories(),\n ...createSubscriptionResumeFactories(),\n ...createSubscriptionChangePlanFactories(),\n ...createSubscriptionAddAddonFactories(),\n ...createSubscriptionRemoveAddonFactories(),\n // Billing account operations\n ...createBillingAccountCreateFactories(),\n ...createBillingAccountDeleteDependentsGuardFactories(),\n ...createBillingAccountOpenCheckoutFactories(),\n ...createBillingAccountOpenPortalFactories(),\n ...createBillingAccountGetStateFactories(),\n // Credit pool operations\n ...createCreditPoolConsumeFactories(),\n ...createCreditPoolTopUpFactories(),\n // Promotion operations\n createPromotionCreateFactory(),\n createPromotionApplyFactory(),\n createPromotionDeactivateFactory(),\n createPromotionDeactivateBulkFactory(),\n];\n\n// ── Post-operation hook registration ─────────────────────────────────\n\n/** All subscription polymorphic variant types. */\nconst SUBSCRIPTION_VARIANT_TYPES: readonly string[] = [\n CoreResourceType.ORGANIZATION_SUBSCRIPTIONS,\n CoreResourceType.USER_SUBSCRIPTIONS,\n];\n\n/**\n * Register post-operation hooks on subscription variant types.\n * After any successful mutation on a subscription, triggers feature sync\n * to recompute billing-derived features from current subscription state.\n *\n * This replaces explicit feature sync calls in subscription custom impls\n * and the webhook event router — the hook fires automatically.\n */\nexport function registerBillingPostOperationHooks(\n servicesRegistry: ServicesRegistryHandlerBackendService,\n): void {\n for (const subscriptionType of SUBSCRIPTION_VARIANT_TYPES) {\n servicesRegistry.registerPostOperationHook(subscriptionType, async (resourceType, _operationIdentifier, result, _executionContext) => {\n const variants = resolveBillingVariantsFromResourceType(resourceType);\n if (!variants) return;\n\n const billingAccountId = result?.[variants.billingAccountFkField] as string | undefined;\n if (!billingAccountId) return;\n\n const featureSyncService = getFeatureSyncService();\n await featureSyncService.onSubscriptionChanged(billingAccountId, variants);\n });\n }\n\n for (const creditPoolType of CREDIT_POOL_VARIANT_TYPES) {\n servicesRegistry.registerPostOperationHook(creditPoolType, async (resourceType, _operationIdentifier, result, executionContext) => {\n const ws = getWebSocketService();\n if (!ws) return;\n\n const variants = resolveBillingVariantsFromResourceType(resourceType);\n if (!variants) return;\n\n const billingAccountId = result?.[variants.billingAccountFkField] as string | undefined;\n if (!billingAccountId) return;\n\n const scopeEntityId = executionContext[variants.scopeKey] as string | undefined;\n if (!scopeEntityId) return;\n\n const message = {\n type: CoreWebSocketEvent.BILLING_CREDIT_POOL_UPDATED,\n payload: { scopeType: variants.scopeType, scopeEntityId, billingAccountId },\n timestamp: new Date(),\n };\n\n switch (variants.scopeType) {\n case ResourcePrimaryScope.ORGANIZATIONS: await ws.sendToOrganization(scopeEntityId, message); break;\n case ResourcePrimaryScope.USER_SELF: await ws.sendToUser(scopeEntityId, message); break;\n }\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"credit-pool.custom-ops.custom-impl.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/billing/services/custom-impl/credit-pool.custom-ops.custom-impl.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,EAEL,KAAK,0CAA0C,EAChD,MAAM,4GAA4G,CAAC;AAQpH;;;;;;GAMG;AACH,wBAAgB,gCAAgC,IAAI,0CAA0C,EAAE,CA4C/F;AAMD;;;;;;GAMG;AACH,wBAAgB,8BAA8B,IAAI,0CAA0C,EAAE,CAwC7F"}
1
+ {"version":3,"file":"credit-pool.custom-ops.custom-impl.backend.service.d.ts","sourceRoot":"","sources":["../../../../../src/billing/services/custom-impl/credit-pool.custom-ops.custom-impl.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,EAEL,KAAK,0CAA0C,EAChD,MAAM,4GAA4G,CAAC;AAQpH;;;;;;GAMG;AACH,wBAAgB,gCAAgC,IAAI,0CAA0C,EAAE,CA4C/F;AAMD;;;;;;GAMG;AACH,wBAAgB,8BAA8B,IAAI,0CAA0C,EAAE,CAwC7F"}