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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (972) hide show
  1. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.d.ts.map +1 -1
  2. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js +19 -1
  3. package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js.map +1 -1
  4. package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
  5. package/dist/esm/base-classes/models/manual-controllers.backend.definition.js +4 -0
  6. package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
  7. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts +35 -0
  8. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts.map +1 -0
  9. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js +111 -0
  10. package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js.map +1 -0
  11. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts +50 -0
  12. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts.map +1 -0
  13. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js +199 -0
  14. package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js.map +1 -0
  15. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts +111 -0
  16. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts.map +1 -1
  17. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js +140 -0
  18. package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js.map +1 -1
  19. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts +14 -3
  20. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
  21. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +138 -24
  22. package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
  23. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts +3 -1
  24. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts.map +1 -1
  25. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js +8 -3
  26. package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js.map +1 -1
  27. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts +11 -0
  28. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts.map +1 -1
  29. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js +11 -2
  30. package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js.map +1 -1
  31. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts +124 -13
  32. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
  33. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +207 -21
  34. package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
  35. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts +60 -8
  36. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
  37. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +174 -26
  38. package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
  39. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +48 -4
  40. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
  41. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +102 -30
  42. package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
  43. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
  44. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
  45. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
  46. package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
  47. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts +89 -14
  48. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
  49. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js +84 -11
  50. package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
  51. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.d.ts.map +1 -1
  52. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js +16 -0
  53. package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js.map +1 -1
  54. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts +20 -6
  55. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
  56. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +96 -32
  57. package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
  58. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts +3 -1
  59. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts.map +1 -1
  60. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js +32 -7
  61. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js.map +1 -1
  62. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts +8 -5
  63. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts.map +1 -1
  64. package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.js.map +1 -1
  65. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +80 -0
  66. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
  67. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +298 -23
  68. package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
  69. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts +71 -1
  70. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
  71. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +85 -5
  72. package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
  73. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts +21 -0
  74. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
  75. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +146 -4
  76. package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
  77. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts +22 -0
  78. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
  79. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
  80. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts +3 -26
  81. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts.map +1 -1
  82. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js +3 -68
  83. package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js.map +1 -1
  84. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
  85. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +4 -1
  86. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
  87. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts +11 -0
  88. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
  89. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js +39 -5
  90. package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
  91. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +181 -2
  92. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
  93. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +533 -43
  94. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
  95. package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts +36 -3
  96. package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
  97. package/dist/esm/base-classes/services/services/system-access.backend.service.js +70 -8
  98. package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
  99. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts +28 -0
  100. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -0
  101. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js +90 -0
  102. package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -0
  103. package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts +44 -0
  104. package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -0
  105. package/dist/esm/billing/batches/usage-flush.batch.backend.service.js +99 -0
  106. package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -0
  107. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts +91 -0
  108. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -0
  109. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js +152 -0
  110. package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -0
  111. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +186 -0
  112. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -0
  113. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +474 -0
  114. package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
  115. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts +100 -0
  116. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
  117. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js +209 -6
  118. package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
  119. package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts +200 -4
  120. package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
  121. package/dist/esm/billing/services/back-office/usage-metering.backend.service.js +593 -64
  122. package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
  123. package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts +36 -0
  124. package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -0
  125. package/dist/esm/billing/services/billing-adapter-registry.backend.js +83 -0
  126. package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -0
  127. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts +9 -0
  128. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
  129. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js +11 -1
  130. package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
  131. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
  132. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +54 -13
  133. package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
  134. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +38 -1
  135. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
  136. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +67 -2
  137. package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
  138. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts +30 -1
  139. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
  140. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js +43 -1
  141. package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
  142. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts +11 -3
  143. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
  144. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js +30 -16
  145. package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
  146. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
  147. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js +104 -25
  148. package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
  149. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +18 -1
  150. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
  151. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +106 -2
  152. package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
  153. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts +52 -0
  154. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -0
  155. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js +74 -0
  156. package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -0
  157. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts +104 -11
  158. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
  159. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +260 -26
  160. package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
  161. package/dist/esm/billing/testing/mock-billing-provider.d.ts +30 -1
  162. package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
  163. package/dist/esm/billing/testing/mock-billing-provider.js +25 -0
  164. package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
  165. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js +11 -4
  166. package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
  167. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +263 -13
  168. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
  169. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +376 -58
  170. package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
  171. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +264 -7
  172. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
  173. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +414 -5
  174. package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
  175. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
  176. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
  177. package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
  178. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +16 -0
  179. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -0
  180. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +140 -0
  181. package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -0
  182. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
  183. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
  184. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +65 -6
  185. package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
  186. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
  187. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
  188. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
  189. package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
  190. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
  191. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +45 -0
  192. package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
  193. package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts +5 -0
  194. package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
  195. package/dist/esm/config/bootstrap/application-runtime-profile.backend.js +6 -0
  196. package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
  197. package/dist/esm/config/custom/application-config-controller.backend.service.d.ts.map +1 -1
  198. package/dist/esm/config/custom/application-config-controller.backend.service.js +7 -1
  199. package/dist/esm/config/custom/application-config-controller.backend.service.js.map +1 -1
  200. package/dist/esm/config/models/app-config.backend.schemas.d.ts +146 -46
  201. package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
  202. package/dist/esm/config/models/app-config.backend.schemas.js +121 -12
  203. package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
  204. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts +38 -15
  205. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
  206. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js +17 -2
  207. package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
  208. package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts +0 -1
  209. package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
  210. package/dist/esm/config/services/app-configuration-loader.backend.service.js +68 -76
  211. package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
  212. package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
  213. package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
  214. package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
  215. package/dist/esm/config/services/app-configuration.backend.utils.d.ts +43 -1
  216. package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
  217. package/dist/esm/config/services/app-configuration.backend.utils.js +52 -3
  218. package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
  219. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +25 -0
  220. package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
  221. package/dist/esm/config/services/application-startup-config-validator.backend.service.js +41 -1
  222. package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
  223. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.d.ts +2 -2
  224. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js +2 -2
  225. package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js.map +1 -1
  226. package/dist/esm/databases/models/filter.backend.schemas.js +2 -2
  227. package/dist/esm/databases/models/filter.backend.schemas.js.map +1 -1
  228. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.d.ts.map +1 -1
  229. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js +20 -1
  230. package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js.map +1 -1
  231. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
  232. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js +48 -0
  233. package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
  234. package/dist/esm/databases/services/redis.service.d.ts +27 -0
  235. package/dist/esm/databases/services/redis.service.d.ts.map +1 -1
  236. package/dist/esm/databases/services/redis.service.js +29 -0
  237. package/dist/esm/databases/services/redis.service.js.map +1 -1
  238. package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
  239. package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
  240. package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
  241. package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
  242. package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
  243. package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
  244. package/dist/esm/errors/services/error-handler.backend.service.js +134 -8
  245. package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
  246. package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
  247. package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
  248. package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
  249. package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
  250. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
  251. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
  252. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
  253. package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
  254. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
  255. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
  256. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
  257. package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
  258. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts +41 -0
  259. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts.map +1 -0
  260. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js +40 -0
  261. package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js.map +1 -0
  262. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts +64 -0
  263. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts.map +1 -0
  264. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js +193 -0
  265. package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js.map +1 -0
  266. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +72 -4
  267. package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
  268. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +60 -19
  269. package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
  270. package/dist/esm/external-data/external-data-transform.backend.d.ts.map +1 -1
  271. package/dist/esm/external-data/external-data-transform.backend.js +7 -1
  272. package/dist/esm/external-data/external-data-transform.backend.js.map +1 -1
  273. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts +2 -0
  274. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts.map +1 -1
  275. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js +13 -0
  276. package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js.map +1 -1
  277. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts +4 -2
  278. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
  279. package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
  280. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +256 -0
  281. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -0
  282. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +333 -0
  283. package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -0
  284. package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts +56 -0
  285. package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -0
  286. package/dist/esm/external-providers/operations/provider-operation-request.backend.js +211 -0
  287. package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -0
  288. package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts +45 -0
  289. package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -0
  290. package/dist/esm/external-providers/operations/provider-request-signing.backend.js +216 -0
  291. package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -0
  292. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts +56 -0
  293. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -0
  294. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js +78 -0
  295. package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -0
  296. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts +1 -1
  297. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
  298. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js +2 -2
  299. package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
  300. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts +89 -0
  301. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -0
  302. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js +164 -0
  303. package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -0
  304. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts +26 -27
  305. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
  306. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js +50 -64
  307. package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
  308. package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
  309. package/dist/esm/external-providers/services/document-extraction.backend.service.js +3 -3
  310. package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
  311. package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
  312. package/dist/esm/external-providers/services/embeddings.backend.service.js +4 -4
  313. package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
  314. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +306 -7
  315. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
  316. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +539 -45
  317. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
  318. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
  319. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +25 -2
  320. package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
  321. package/dist/esm/files/controllers/file.controller.d.ts +24 -1
  322. package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
  323. package/dist/esm/files/controllers/file.controller.js +83 -11
  324. package/dist/esm/files/controllers/file.controller.js.map +1 -1
  325. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts +17 -0
  326. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts.map +1 -0
  327. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js +1 -0
  328. package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js.map +1 -0
  329. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts +5 -1
  330. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
  331. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +76 -13
  332. package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
  333. package/dist/esm/files/services/file-operation-handler.backend.service.d.ts +18 -0
  334. package/dist/esm/files/services/file-operation-handler.backend.service.d.ts.map +1 -1
  335. package/dist/esm/files/services/file-operation-handler.backend.service.js +36 -28
  336. package/dist/esm/files/services/file-operation-handler.backend.service.js.map +1 -1
  337. package/dist/esm/files/services/file-scanning.backend.service.d.ts +94 -9
  338. package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
  339. package/dist/esm/files/services/file-scanning.backend.service.js +197 -17
  340. package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
  341. package/dist/esm/files/services/file-text-extraction.backend.service.d.ts +60 -1
  342. package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
  343. package/dist/esm/files/services/file-text-extraction.backend.service.js +167 -8
  344. package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
  345. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +214 -0
  346. package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -0
  347. package/dist/esm/files/services/file-upload-grant.backend.service.js +566 -0
  348. package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -0
  349. package/dist/esm/files/services/files.backend.service.d.ts +87 -0
  350. package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
  351. package/dist/esm/files/services/files.backend.service.js +252 -19
  352. package/dist/esm/files/services/files.backend.service.js.map +1 -1
  353. package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts +109 -0
  354. package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -0
  355. package/dist/esm/files/storage/application-storage-key.backend.utils.js +123 -0
  356. package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -0
  357. package/dist/esm/files/storage/file-storage-provider.types.d.ts +16 -10
  358. package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
  359. package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
  360. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts +67 -8
  361. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
  362. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js +101 -28
  363. package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
  364. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
  365. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js +8 -55
  366. package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
  367. package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
  368. package/dist/esm/files/utils/file-field-schema-path.backend.utils.js +20 -0
  369. package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
  370. package/dist/esm/files/utils/file-uploader.utils.d.ts.map +1 -1
  371. package/dist/esm/files/utils/file-uploader.utils.js +12 -0
  372. package/dist/esm/files/utils/file-uploader.utils.js.map +1 -1
  373. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts +86 -0
  374. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -0
  375. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js +288 -0
  376. package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -0
  377. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts +15 -0
  378. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
  379. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js +76 -5
  380. package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
  381. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
  382. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js +6 -1
  383. package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
  384. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts +60 -0
  385. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
  386. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js +63 -0
  387. package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
  388. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
  389. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
  390. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +200 -44
  391. package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
  392. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
  393. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
  394. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
  395. package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
  396. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
  397. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
  398. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
  399. package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
  400. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
  401. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
  402. package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
  403. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts +0 -13
  404. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
  405. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js +14 -22
  406. package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
  407. package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts +8 -3
  408. package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
  409. package/dist/esm/flows-actors/models/core-facets.backend.definitions.js +25 -15
  410. package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
  411. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts +13 -1
  412. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
  413. package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
  414. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +88 -8
  415. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
  416. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +333 -31
  417. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
  418. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
  419. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js +4 -2
  420. package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
  421. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts +113 -0
  422. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -0
  423. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js +62 -0
  424. package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -0
  425. package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
  426. package/dist/esm/flows-actors/services/actors-system.backend.service.js +0 -2
  427. package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
  428. package/dist/esm/flows-actors/services/agents.backend.service.d.ts +107 -1
  429. package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
  430. package/dist/esm/flows-actors/services/agents.backend.service.js +519 -56
  431. package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
  432. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +5 -1
  433. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
  434. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +79 -16
  435. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
  436. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +34 -5
  437. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
  438. package/dist/esm/flows-actors/services/flows-actors-registry.service.js +154 -20
  439. package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
  440. package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
  441. package/dist/esm/flows-actors/services/flows.backend.services.js +27 -23
  442. package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
  443. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
  444. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js +7 -1
  445. package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
  446. package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts +90 -0
  447. package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -0
  448. package/dist/esm/flows-actors/services/mcp-client.backend.service.js +368 -0
  449. package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
  450. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
  451. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
  452. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
  453. package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
  454. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts +151 -41
  455. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
  456. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +308 -143
  457. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
  458. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts +0 -207
  459. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
  460. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js +8 -243
  461. package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
  462. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
  463. package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
  464. package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts +9 -14
  465. package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
  466. package/dist/esm/guidance/services/milestone-evaluator.backend.service.js +18 -89
  467. package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
  468. package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts +86 -0
  469. package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -0
  470. package/dist/esm/guidance/services/progression-state-store.backend.service.js +155 -0
  471. package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -0
  472. package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts +10 -0
  473. package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
  474. package/dist/esm/i18n/controllers/i18n-controller.backend.service.js +55 -5
  475. package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
  476. package/dist/esm/index.d.ts +15 -5
  477. package/dist/esm/index.d.ts.map +1 -1
  478. package/dist/esm/index.js +45 -5
  479. package/dist/esm/index.js.map +1 -1
  480. package/dist/esm/inject/models/container.d.ts.map +1 -1
  481. package/dist/esm/inject/models/container.js +82 -10
  482. package/dist/esm/inject/models/container.js.map +1 -1
  483. package/dist/esm/inject/models/service-types.d.ts +20 -3
  484. package/dist/esm/inject/models/service-types.d.ts.map +1 -1
  485. package/dist/esm/inject/models/service-types.js +21 -3
  486. package/dist/esm/inject/models/service-types.js.map +1 -1
  487. package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
  488. package/dist/esm/mcp/controllers/mcp.controller.js +32 -4
  489. package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
  490. package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts +34 -0
  491. package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts.map +1 -1
  492. package/dist/esm/mcp/models/mcp-tool.backend.schemas.js +42 -0
  493. package/dist/esm/mcp/models/mcp-tool.backend.schemas.js.map +1 -1
  494. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +84 -1
  495. package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
  496. package/dist/esm/mcp/services/mcp-server.backend.service.js +235 -11
  497. package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
  498. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts +64 -2
  499. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
  500. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +152 -6
  501. package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
  502. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
  503. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js +49 -4
  504. package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
  505. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts +66 -0
  506. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -0
  507. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js +199 -0
  508. package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -0
  509. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts +149 -13
  510. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
  511. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js +411 -19
  512. package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
  513. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts +11 -2
  514. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
  515. package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
  516. package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts +28 -9
  517. package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
  518. package/dist/esm/monitoring/logger/models/logger.backend.schemas.js +30 -10
  519. package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
  520. package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
  521. package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
  522. package/dist/esm/monitoring/logger/services/logger.service.js +52 -11
  523. package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
  524. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts +62 -0
  525. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -0
  526. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js +78 -0
  527. package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -0
  528. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +309 -0
  529. package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -0
  530. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +385 -0
  531. package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -0
  532. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +1 -0
  533. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
  534. package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
  535. package/dist/esm/monitoring/observability/services/metrics.service.d.ts +21 -0
  536. package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
  537. package/dist/esm/monitoring/observability/services/metrics.service.js +38 -0
  538. package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
  539. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -80
  540. package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -1
  541. package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -25
  542. package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -1
  543. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -49
  544. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -1
  545. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -141
  546. package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -1
  547. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -37
  548. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -1
  549. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -121
  550. package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -1
  551. package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts +66 -1
  552. package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
  553. package/dist/esm/notifications/email/services/email-template-registry.backend.service.js +105 -10
  554. package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
  555. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -58
  556. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -1
  557. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -223
  558. package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -1
  559. package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
  560. package/dist/esm/notifications/email/services/email-template-validator.backend.service.js +10 -1
  561. package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
  562. package/dist/esm/notifications/email/services/email.backend.service.d.ts +60 -4
  563. package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
  564. package/dist/esm/notifications/email/services/email.backend.service.js +145 -43
  565. package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
  566. package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts +0 -1
  567. package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
  568. package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
  569. package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
  570. package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
  571. package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
  572. package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
  573. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +108 -13
  574. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
  575. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +432 -101
  576. package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
  577. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +2 -2
  578. package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
  579. package/dist/esm/notifications/sms/services/sms.backend.service.js +5 -5
  580. package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
  581. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
  582. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
  583. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
  584. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
  585. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
  586. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
  587. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +54 -7
  588. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
  589. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts +5 -5
  590. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts.map +1 -1
  591. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js +14 -13
  592. package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js.map +1 -1
  593. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts +2 -1
  594. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
  595. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +18 -8
  596. package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
  597. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
  598. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +20 -18
  599. package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
  600. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts +16 -0
  601. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
  602. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js +18 -0
  603. package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
  604. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts +2 -2
  605. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js +2 -2
  606. package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
  607. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
  608. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js +63 -2
  609. package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
  610. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.d.ts.map +1 -1
  611. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js +4 -1
  612. package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js.map +1 -1
  613. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts +66 -0
  614. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -0
  615. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js +257 -0
  616. package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -0
  617. package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts +12 -0
  618. package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -0
  619. package/dist/esm/queue/adapters/queue-adapter.backend.binding.js +47 -0
  620. package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -0
  621. package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts +87 -0
  622. package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -0
  623. package/dist/esm/queue/adapters/queue-adapter.backend.interface.js +1 -0
  624. package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -0
  625. package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts +31 -0
  626. package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -0
  627. package/dist/esm/queue/adapters/queue-adapter.backend.options.js +13 -0
  628. package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -0
  629. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts +19 -25
  630. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
  631. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js +33 -0
  632. package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
  633. package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts +2 -2
  634. package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
  635. package/dist/esm/queue/domain-queue-consumer.backend.service.js +1 -4
  636. package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
  637. package/dist/esm/queue/job-consumer.backend.service.d.ts +2 -2
  638. package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
  639. package/dist/esm/queue/job-consumer.backend.service.js +1 -4
  640. package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
  641. package/dist/esm/queue/job-executor.backend.service.d.ts +2 -2
  642. package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
  643. package/dist/esm/queue/job-executor.backend.service.js +1 -4
  644. package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
  645. package/dist/esm/queue/queue-monitoring.backend.service.d.ts +8 -4
  646. package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
  647. package/dist/esm/queue/queue-monitoring.backend.service.js +25 -17
  648. package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
  649. package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts +16 -1
  650. package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
  651. package/dist/esm/queue/queue-worker-initializer.backend.service.js +16 -1
  652. package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
  653. package/dist/esm/queue/queue.backend.service.d.ts +3 -3
  654. package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
  655. package/dist/esm/queue/queue.backend.service.js +26 -4
  656. package/dist/esm/queue/queue.backend.service.js.map +1 -1
  657. package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts +2 -2
  658. package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
  659. package/dist/esm/queue/worker-shutdown-manager.backend.service.js +18 -3
  660. package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
  661. package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts +50 -25
  662. package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
  663. package/dist/esm/rag/utils/rag-chunking.backend.utils.js +147 -39
  664. package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
  665. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts +12 -3
  666. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
  667. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js +12 -3
  668. package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
  669. package/dist/esm/requests/service/websocket.service.d.ts +9 -0
  670. package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
  671. package/dist/esm/requests/service/websocket.service.js +88 -15
  672. package/dist/esm/requests/service/websocket.service.js.map +1 -1
  673. package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
  674. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +16 -2
  675. package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
  676. package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
  677. package/dist/esm/resources/models/resources-operations.backend.definitions.js +2 -0
  678. package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
  679. package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
  680. package/dist/esm/resources/models/resources-relationships.backend.definitions.js +14 -0
  681. package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
  682. package/dist/esm/resources/models/resources-types.backend.schemas.d.ts +2 -1
  683. package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
  684. package/dist/esm/resources/models/resources-types.backend.schemas.js +8 -0
  685. package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
  686. package/dist/esm/resources/services/resource-id.backend.service.js +3 -3
  687. package/dist/esm/resources/services/resource-id.backend.service.js.map +1 -1
  688. package/dist/esm/resources/services/resources-registry.backend.service.d.ts +60 -5
  689. package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
  690. package/dist/esm/resources/services/resources-registry.backend.service.js +91 -7
  691. package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
  692. package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts +36 -3
  693. package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
  694. package/dist/esm/runtime/controllers/health-controller.backend.service.js +32 -10
  695. package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
  696. package/dist/esm/runtime/domain-module.backend.definitions.d.ts +24 -0
  697. package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
  698. package/dist/esm/runtime/domain-module.backend.definitions.js +24 -0
  699. package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
  700. package/dist/esm/runtime/services/execution-context-creator.backend.service.d.ts.map +1 -1
  701. package/dist/esm/runtime/services/execution-context-creator.backend.service.js +13 -7
  702. package/dist/esm/runtime/services/execution-context-creator.backend.service.js.map +1 -1
  703. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts +51 -0
  704. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
  705. package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
  706. package/dist/esm/runtime/services/http-server.backend.service.d.ts +26 -0
  707. package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
  708. package/dist/esm/runtime/services/http-server.backend.service.js +181 -1
  709. package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
  710. package/dist/esm/runtime/services/start-application.backend.service.d.ts +47 -1
  711. package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
  712. package/dist/esm/runtime/services/start-application.backend.service.js +343 -77
  713. package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
  714. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts +15 -0
  715. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
  716. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js +28 -0
  717. package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
  718. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts +5 -1
  719. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
  720. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js +24 -4
  721. package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
  722. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
  723. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +29 -4
  724. package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
  725. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts +114 -0
  726. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
  727. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js +354 -3
  728. package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
  729. package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts +1 -0
  730. package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
  731. package/dist/esm/security/authentications/models/cimd.backend.schemas.js +22 -0
  732. package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
  733. package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts +3 -23
  734. package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts.map +1 -1
  735. package/dist/esm/security/authentications/models/jwt.backend.schemas.js +20 -45
  736. package/dist/esm/security/authentications/models/jwt.backend.schemas.js.map +1 -1
  737. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
  738. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
  739. package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
  740. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts +0 -2
  741. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
  742. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js +23 -14
  743. package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
  744. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts +0 -1
  745. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
  746. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js +15 -12
  747. package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
  748. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts +113 -3
  749. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
  750. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js +207 -30
  751. package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
  752. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts +95 -2
  753. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
  754. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js +153 -9
  755. package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
  756. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +190 -0
  757. package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
  758. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +377 -53
  759. package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
  760. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts +9 -1
  761. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
  762. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +77 -2
  763. package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
  764. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.d.ts.map +1 -1
  765. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js +5 -3
  766. package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js.map +1 -1
  767. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts +41 -0
  768. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
  769. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js +202 -23
  770. package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
  771. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
  772. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +42 -1
  773. package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
  774. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
  775. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +34 -4
  776. package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
  777. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts +29 -5
  778. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
  779. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js +77 -5
  780. package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
  781. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +41 -1
  782. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
  783. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +87 -4
  784. package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
  785. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
  786. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
  787. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
  788. package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
  789. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
  790. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
  791. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
  792. package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
  793. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
  794. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
  795. package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
  796. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts +28 -0
  797. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -0
  798. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +283 -0
  799. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -0
  800. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts +4 -3
  801. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
  802. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js +4 -3
  803. package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
  804. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts +35 -0
  805. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
  806. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js +111 -21
  807. package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
  808. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts +14 -1
  809. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
  810. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js +49 -8
  811. package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
  812. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
  813. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js +4 -0
  814. package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
  815. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
  816. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js +6 -0
  817. package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
  818. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts +37 -1
  819. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
  820. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js +51 -0
  821. package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
  822. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts +41 -0
  823. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
  824. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js +45 -0
  825. package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
  826. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts +116 -0
  827. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -0
  828. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js +162 -0
  829. package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -0
  830. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.d.ts.map +1 -1
  831. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js +24 -1
  832. package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js.map +1 -1
  833. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts +20 -20
  834. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
  835. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js +27 -28
  836. package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
  837. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
  838. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +77 -3
  839. package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
  840. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts +117 -0
  841. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts.map +1 -0
  842. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js +104 -0
  843. package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js.map +1 -0
  844. package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
  845. package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
  846. package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
  847. package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
  848. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +93 -0
  849. package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -0
  850. package/dist/esm/security/authorizations/role-conferral.backend.utils.js +95 -0
  851. package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -0
  852. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +124 -1
  853. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
  854. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +142 -5
  855. package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
  856. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +175 -14
  857. package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
  858. package/dist/esm/security/authorizations/services/authorizations.backend.service.js +385 -49
  859. package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
  860. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +6 -14
  861. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
  862. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +13 -22
  863. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
  864. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts +60 -0
  865. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -0
  866. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js +79 -0
  867. package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -0
  868. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +161 -0
  869. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -0
  870. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +512 -0
  871. package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -0
  872. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +59 -0
  873. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -0
  874. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js +22 -0
  875. package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -0
  876. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts +44 -0
  877. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -0
  878. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js +20 -0
  879. package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -0
  880. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +191 -0
  881. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -0
  882. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +385 -0
  883. package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -0
  884. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts +41 -0
  885. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
  886. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js +358 -0
  887. package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -0
  888. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts +160 -0
  889. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -0
  890. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +266 -0
  891. package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -0
  892. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +111 -0
  893. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -0
  894. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +107 -0
  895. package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -0
  896. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts +54 -0
  897. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -0
  898. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +153 -0
  899. package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -0
  900. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +195 -0
  901. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -0
  902. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +387 -0
  903. package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -0
  904. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts +45 -0
  905. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
  906. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js +291 -0
  907. package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -0
  908. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +62 -0
  909. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -0
  910. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js +29 -0
  911. package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -0
  912. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts +127 -0
  913. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -0
  914. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js +277 -0
  915. package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -0
  916. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts +66 -0
  917. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -0
  918. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js +75 -0
  919. package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -0
  920. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts +18 -1
  921. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts.map +1 -1
  922. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js +110 -74
  923. package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js.map +1 -1
  924. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts +22 -0
  925. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts.map +1 -0
  926. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js +22 -0
  927. package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js.map +1 -0
  928. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts +17 -3
  929. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts.map +1 -1
  930. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js +12 -0
  931. package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js.map +1 -1
  932. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +41 -3
  933. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
  934. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +83 -20
  935. package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
  936. package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
  937. package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
  938. package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
  939. package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
  940. package/dist/esm/security/jwt/services/jwt.backend.service.d.ts.map +1 -1
  941. package/dist/esm/security/jwt/services/jwt.backend.service.js +1 -18
  942. package/dist/esm/security/jwt/services/jwt.backend.service.js.map +1 -1
  943. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts +26 -0
  944. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
  945. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js +43 -0
  946. package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
  947. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +8 -1
  948. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
  949. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +49 -0
  950. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
  951. package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
  952. package/dist/esm/security/scim/controllers/scim.backend.controller.js +17 -5
  953. package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
  954. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts +67 -29
  955. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
  956. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js +47 -25
  957. package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
  958. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts +10 -2
  959. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
  960. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js +10 -2
  961. package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
  962. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts +143 -0
  963. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -0
  964. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js +258 -0
  965. package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -0
  966. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts +39 -0
  967. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -0
  968. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js +159 -0
  969. package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -0
  970. package/dist/tsconfig.build.tsbuildinfo +1 -1
  971. package/package.json +17 -9
  972. package/dist/esm/.builder.pid +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"email.backend.service.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Email Backend Service\n *\n * Main service for sending emails. Orchestrates:\n * - File-based template resolution via EmailTemplateRegistryBackendService\n * - Context building\n * - React Email rendering (subject fn + body fn → HTML/text)\n * - Provider resolution and HTTP execution\n */\n\nimport { injectable, inject } from 'inversify';\nimport { render } from '@react-email/render';\nimport { randomUUID } from 'node:crypto';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport type { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport {\n getConfiguredFallbackLanguage,\n getConfiguredPrimaryLanguage,\n} from '~wildo-backend-lib/config/services/app-configuration.backend.utils';\nimport type { ExternalProvidersRegistryBackendService } from '~wildo-backend-lib/external-providers/services/external-providers-registry.backend.service';\nimport type { EmailContextProviderRegistryBackendService } from './email-context-provider-registry.backend.service';\nimport type { EmailTemplateRegistryBackendService } from './email-template-registry.backend.service';\nimport { buildEmailBrandTokensFromConfig, type EmailBrandTokens } from '~wildo-backend-lib/notifications/email/utils/color-conversion.utils';\nimport {\n EmailTemplateContext,\n EmailTemplateType_ToEngineCapability,\n EmailTemplateType,\n EngineCapability,\n ErrorCustomMessageReference,\n ErrorType,\n isWildoBackendError,\n WildoHeaderKeys,\n} from '@wildo-ai/saas-models';\nimport type {\n StandardEmail_SendRequest,\n StandardEmail_SendResponse,\n} from '@wildo-ai/external-connectors-models';\nimport {\n EmailProviderPayloadEncoding,\n EmailProviderSubmissionClassification,\n ExternalProvider_ExchangeProtocol_Kind,\n StandardEmail_SendRequestSchema,\n StandardEmail_SendResponseSchema,\n} from '@wildo-ai/external-connectors-models';\nimport type {\n EmailProviderSendRequest,\n EmailProviderSendResponseInput,\n} from '@wildo-ai/external-connectors-private/backend';\nimport { AvailableLanguage } from '@wildo-ai/presets-components-models';\nimport {\n EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS,\n} from '~wildo-backend-lib/notifications/email/models/email-transport.backend.definitions';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction validateEmailAddresses(emails: string[]): string[] {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emails.filter(email => !emailRegex.test(email.trim()));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface EmailSendRequest {\n /**\n * Stable identity of one logical provider submission. A caller that can\n * retry across process/job boundaries must persist and reuse this value.\n * Ephemeral callers may omit it and let the service allocate one.\n */\n submissionId?: string;\n /** Template reference (e.g., \"system.welcome_email\") */\n templateRef: string;\n /** Locale for template selection */\n locale: AvailableLanguage;\n /** Email type for provider routing */\n type: EmailTemplateType;\n /** Primary recipient email(s) */\n to: string | string[];\n /** CC recipients (optional) */\n cc?: string[];\n /** BCC recipients (optional) */\n bcc?: string[];\n /** Reply-to address (optional) */\n replyTo?: string;\n /** From address (optional - uses provider default if not specified) */\n from?: string;\n /** Context for template rendering */\n context: EmailTemplateContext;\n /** File IDs for attachments (optional) */\n attachmentFileIds?: string[];\n /** Organization ID for org-scoped templates (optional) */\n organizationId?: string;\n}\n\nexport enum EmailSubmissionOutcome {\n NOT_SUBMITTED = 'not_submitted',\n PROVIDER_ACCEPTED = 'provider_accepted',\n PROVIDER_REJECTED = 'provider_rejected',\n ACCEPTANCE_UNKNOWN = 'acceptance_unknown',\n}\n\nexport interface EmailSendResult {\n success: boolean;\n /**\n * Whether an at-least-once caller should retry. An acceptance-unknown retry\n * can duplicate an externally visible email; provider-native idempotency is\n * only an optional risk reduction.\n */\n retryable: boolean;\n submissionId: string;\n outcome: EmailSubmissionOutcome;\n /** All honest provider receipts. Empty means no receipt was returned. */\n providerMessageIds: string[];\n /** Provider confirmed that this logical submission was already accepted. */\n deduplicated?: boolean;\n rejectedRecipients?: Array<{ email: string; reason?: string }>;\n providerId?: string;\n error?: string;\n templateRef: string;\n recipientCount: number;\n}\n\n/**\n * Fields common to every resolved email provider regardless of delivery\n * mode. `from*` come from the app's `providerConfigurations` override, not\n * the runtime contract.\n */\ninterface EmailProviderConfig_Base {\n providerId: string;\n fromAddress?: string;\n fromName?: string;\n}\n\n/**\n * Network delivery — the resolved shape for every real provider (Resend,\n * SendGrid, …). Carries the composed endpoint, auth material, and the\n * provider-specific request builder/parser used by\n * `executeProviderRequest`'s `fetch` path.\n */\ninterface EmailProviderConfig_Network extends EmailProviderConfig_Base {\n delivery: 'network';\n apiKey: string;\n endpoint: string;\n authHeaderName: string;\n authPrefix?: string;\n authScheme?: 'api-key' | 'bearer' | 'basic';\n basicUsername?: string;\n domain?: string;\n /**\n * Wire encoding the provider expects for its request body. Every network\n * provider declares this on its runtime contract; there is no fallback\n * encoding at the consumer boundary.\n */\n payloadEncoding: EmailProviderPayloadEncoding;\n /**\n * Whether the provider expects the API key to be embedded in the JSON\n * payload body (Mailchimp's `key` field). Sourced from the provider\n * module's `runtimeContract.embedsApiKeyInBody`. Defaults to `false`.\n */\n embedsApiKeyInBody: boolean;\n /**\n * Per-provider send-payload builder. Sourced from the provider\n * module's `runtimeContract.buildSendRequest`. Receives the\n * normalized `StandardEmail_SendRequest` plus the optional\n * `configuredDomain` (Mailgun's `{domain}` token).\n */\n buildSendRequest: (\n input: { request: StandardEmail_SendRequest; configuredDomain?: string },\n ) => EmailProviderSendRequest;\n parseSendResponse: (\n input: EmailProviderSendResponseInput,\n ) => StandardEmail_SendResponse;\n}\n\n/**\n * Log delivery — the resolved shape for the dev `preview` provider. Carries\n * NO endpoint / apiKey / payload builder because it never opens a socket;\n * `executeProviderRequest` renders + logs the email without fabricating a\n * provider receipt. Discriminated from network on `delivery` so consumers branch\n * on the contract, never on the provider ref.\n */\ninterface EmailProviderConfig_Log extends EmailProviderConfig_Base {\n delivery: 'log';\n}\n\ntype EmailProviderConfig = EmailProviderConfig_Network | EmailProviderConfig_Log;\n\ntype EmailProviderExecutionResult =\n | {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED;\n response: StandardEmail_SendResponse;\n receiptParseError?: string;\n /**\n * The adapter explicitly classified the submission as accepted but\n * violated another response-contract invariant. Acceptance remains the\n * no-replay authority while the violation stays observable.\n */\n adapterContractViolation?: string;\n }\n | {\n outcome:\n | EmailSubmissionOutcome.PROVIDER_REJECTED\n | EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN;\n error: string;\n retryable: boolean;\n };\n\ninterface EmailAddress {\n email: string;\n name?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE\n// ─────────────────────────────────────────────────────────────────────────────\n\n@injectable()\nexport class EmailBackendService {\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.EmailTemplateRegistry) private readonly templateRegistry: EmailTemplateRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.EmailContextProviderRegistry) private readonly contextProviderRegistry: EmailContextProviderRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly configService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ExternalProvidersRegistryService) private readonly externalProvidersRegistry: ExternalProvidersRegistryBackendService,\n ) {\n this.logDebug = this.logger.debugByType('EmailBackendService');\n this.logger.setDebugTypeLogging('EmailBackendService', false);\n }\n\n /**\n * Send an email using a file-based template definition.\n */\n async send(request: EmailSendRequest): Promise<EmailSendResult> {\n const startTime = Date.now();\n const submissionId = request.submissionId ?? randomUUID();\n let providerTransportStarted = false;\n this.logger.info('Sending email', {\n templateRef: request.templateRef,\n submissionId,\n locale: request.locale,\n recipientCount: Array.isArray(request.to) ? request.to.length : 1,\n });\n\n try {\n // 0. Validate email addresses\n const recipients = Array.isArray(request.to) ? request.to : [request.to];\n const allEmails = [\n ...recipients,\n ...(request.cc || []),\n ...(request.bcc || []),\n ...(request.replyTo ? [request.replyTo] : []),\n ];\n\n const invalidEmails = validateEmailAddresses(allEmails);\n if (invalidEmails.length > 0) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.EMAIL_INVALID_ADDRESS_FORMAT,\n context: {\n // diagnostic (log-only)\n invalidEmails,\n },\n },\n );\n }\n\n // 1. Resolve template + labels from file-based registry\n const defaultLocale = this.getDefaultLocale();\n const resolved = this.templateRegistry.resolve(\n request.templateRef,\n request.locale,\n defaultLocale,\n this.getFallbackLocale(),\n );\n\n // 2. Get design tokens\n const brandTokens = this.getDesignTokens();\n\n // 3. Build additional context from providers\n const additionalContext = await this.contextProviderRegistry.buildAdditionalContext(\n {\n templateRef: request.templateRef,\n locale: request.locale,\n baseContext: request.context,\n },\n this.createProviderUtils(),\n );\n\n // 4. Build full context\n const fullContext: EmailTemplateContext = {\n currentObject: request.context.currentObject,\n objectContext: request.context.objectContext,\n userContext: request.context.userContext,\n additionalContext: {\n ...(request.context.additionalContext as Record<string, unknown> || {}),\n ...additionalContext,\n },\n };\n\n // 5. Render subject and body from definition functions\n const templateProps = { context: fullContext, brand: brandTokens, labels: resolved.labels };\n const subject = resolved.definition.subject(templateProps);\n const bodyElement = resolved.definition.body(templateProps);\n\n const bodyHtml = await render(bodyElement, { pretty: true });\n const bodyText = await render(bodyElement, { plainText: true });\n\n // 6. Resolve provider\n const emailType = resolved.definition.type ?? request.type;\n const engineCapability = EmailTemplateType_ToEngineCapability[emailType];\n const providerConfig = this.resolveEmailProvider(engineCapability);\n\n // 7. Build email request\n const emailRequest = this.buildEmailRequest(\n request,\n submissionId,\n { subject, bodyHtml, bodyText },\n providerConfig,\n recipients,\n );\n\n const providerRequest = providerConfig.delivery === 'network'\n ? providerConfig.buildSendRequest({\n request: emailRequest,\n configuredDomain: providerConfig.domain,\n })\n : undefined;\n\n // 8. Execute send via provider\n const execution = await this.executeProviderRequest(\n providerConfig,\n emailRequest,\n providerRequest,\n () => {\n providerTransportStarted = true;\n },\n );\n const durationMs = Date.now() - startTime;\n\n if (execution.outcome !== EmailSubmissionOutcome.PROVIDER_ACCEPTED) {\n this.logger.warn('Email provider did not confirm acceptance', {\n templateRef: request.templateRef,\n submissionId,\n outcome: execution.outcome,\n providerId: providerConfig.providerId,\n error: execution.error,\n durationMs,\n });\n return {\n success: false,\n retryable: execution.retryable,\n submissionId,\n outcome: execution.outcome,\n providerMessageIds: [],\n providerId: providerConfig.providerId,\n error: execution.error,\n templateRef: request.templateRef,\n recipientCount: recipients.length,\n };\n }\n\n const providerMessageIds = execution.response.providerMessageIds;\n this.logger.info('Email submission accepted', {\n templateRef: request.templateRef,\n submissionId,\n providerMessageIds,\n deduplicated: execution.response.deduplicated,\n providerReceiptMissing: providerMessageIds.length === 0,\n receiptParseError: execution.receiptParseError,\n adapterContractViolation: execution.adapterContractViolation,\n providerId: providerConfig.providerId,\n durationMs,\n });\n\n return {\n success: execution.response.success,\n retryable: false,\n submissionId,\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n providerMessageIds,\n deduplicated: execution.response.deduplicated,\n rejectedRecipients: execution.response.rejectedRecipients,\n providerId: providerConfig.providerId,\n error: execution.adapterContractViolation\n ?? (execution.response.success\n ? undefined\n : this.describeRejectedRecipients(\n execution.response.rejectedRecipients,\n )),\n templateRef: request.templateRef,\n recipientCount: recipients.length,\n };\n } catch (err) {\n const error = err as Error;\n const durationMs = Date.now() - startTime;\n\n this.logger.error('Email send failed', {\n templateRef: request.templateRef,\n errorMessage: error.message,\n durationMs,\n });\n\n if (isWildoBackendError(err) && (err.type === ErrorType.CONFIGURATION || err.type === ErrorType.VALIDATION)) {\n throw err;\n }\n\n return {\n success: false,\n retryable: true,\n submissionId,\n outcome: providerTransportStarted\n ? EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN\n : EmailSubmissionOutcome.NOT_SUBMITTED,\n providerMessageIds: [],\n error: error.message,\n templateRef: request.templateRef,\n recipientCount: Array.isArray(request.to) ? request.to.length : 1,\n };\n }\n }\n\n /**\n * Send email to multiple recipients individually (different context per recipient).\n */\n async sendToMultiple(requests: EmailSendRequest[]): Promise<EmailSendResult[]> {\n const results: EmailSendResult[] = [];\n for (const request of requests) {\n const result = await this.send(request);\n results.push(result);\n }\n return results;\n }\n\n private getDefaultLocale(): AvailableLanguage {\n return getConfiguredPrimaryLanguage(this.configService.config);\n }\n\n private getFallbackLocale(): AvailableLanguage {\n return getConfiguredFallbackLanguage(this.configService.config);\n }\n\n private getDesignTokens(): EmailBrandTokens {\n try {\n return buildEmailBrandTokensFromConfig(this.configService.config.email?.brandTokens);\n } catch (err) {\n this.logger.warn('Failed to extract design tokens, using defaults', {\n errorMessage: (err as Error).message,\n });\n return buildEmailBrandTokensFromConfig(undefined);\n }\n }\n\n private resolveEmailProvider(capability: EngineCapability): EmailProviderConfig {\n const providerId = this.externalProvidersRegistry.getPrimaryProviderForEngineCapability(capability);\n\n if (!providerId) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No email provider configured for capability: ${capability}`, capability } },\n );\n }\n\n if (!this.externalProvidersRegistry.isProviderEnabled(providerId, ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER)) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `Email provider is disabled by external provider configuration: ${providerId}`, providerId, capability } },\n );\n }\n\n const emailContract = this.externalProvidersRegistry.getProviderConfiguration(\n providerId,\n ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER,\n )?.runtimeContract;\n if (emailContract?.kind !== 'email') {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No EMAIL_PROVIDER runtime contract found for provider: ${providerId}`, providerId, capability } },\n );\n }\n\n const appConfig = this.configService.config as Record<string, unknown>;\n const providersConfig = appConfig?.providerConfigurations as Record<string, Record<string, {\n fromAddress?: string;\n fromName?: string;\n domain?: string;\n }> | undefined> | undefined;\n const providerConfig = providersConfig?.[providerId]?.[ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER];\n\n // Non-sending delivery (the dev `preview` provider): no endpoint, no\n // API key. Branch on the CONTRACT field — never the provider ref — so\n // this stays a first-class provider and passes the\n // no-provider-ref-branches guard; `executeProviderRequest` renders +\n // logs instead of opening a socket. Resolved BEFORE the API-key\n // requirement below so a log provider doesn't need a secret at all.\n if (emailContract.delivery === 'log') {\n return {\n providerId,\n delivery: 'log',\n fromAddress: providerConfig?.fromAddress,\n fromName: providerConfig?.fromName,\n };\n }\n\n // Network delivery — a live provider API key is required.\n const apiKey = this.externalProvidersRegistry.getProviderApiKey(\n providerId,\n ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER,\n );\n if (!apiKey) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No env-provided API key configured for provider: ${providerId}`, providerId, capability } },\n );\n }\n\n // Resolve the path-token domain (Mailgun) from the contract's declared\n // `sendEndpointPathTokens`. The branch is contract-driven, not ref-keyed:\n // any provider that declares the `'domain'` token gets the same treatment.\n const requiresDomainToken = emailContract.sendEndpointPathTokens?.includes('domain') === true;\n const configuredDomain = requiresDomainToken\n ? providerConfig?.domain ?? process.env[`${providerId.toUpperCase()}_DOMAIN`]\n : providerConfig?.domain;\n if (requiresDomainToken && !configuredDomain) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `Email provider '${providerId}' declares a {domain} send-endpoint token but no domain is configured.`, providerId } },\n );\n }\n\n return {\n providerId,\n delivery: 'network',\n apiKey,\n endpoint: this.composeEmailSendEndpoint(emailContract.baseUrl, emailContract.sendEndpointPath, configuredDomain),\n authHeaderName: emailContract.apiKey.headerName,\n authPrefix: emailContract.apiKey.prefix,\n authScheme: emailContract.apiKey.scheme,\n basicUsername: emailContract.apiKey.basicUsername,\n fromAddress: providerConfig?.fromAddress,\n fromName: providerConfig?.fromName,\n domain: configuredDomain,\n payloadEncoding: emailContract.payloadEncoding,\n embedsApiKeyInBody: emailContract.embedsApiKeyInBody === true,\n buildSendRequest: emailContract.buildSendRequest,\n parseSendResponse: emailContract.parseSendResponse,\n };\n }\n\n private buildEmailRequest(\n request: EmailSendRequest,\n submissionId: string,\n rendered: { subject: string; bodyHtml: string; bodyText: string },\n providerConfig: EmailProviderConfig,\n recipients: string[],\n ): StandardEmail_SendRequest {\n const toAddresses: EmailAddress[] = recipients.map(email => ({ email }));\n\n // From-address precedence: per-send override → per-provider config\n // (`providerConfigurations.<provider>.EMAIL_PROVIDER.fromAddress`) → the\n // app's global `email.from`. The latter is REQUIRED by\n // `AppConfiguration_Email_Schema`, so it is the normal source; the literal\n // fallback is a defensive last resort that should be unreachable once\n // config is initialized. Previously `email.from` was silently ignored —\n // the send fell back to the literal, producing an unverified/invalid\n // sender that providers reject.\n const configuredFrom = this.configService.config.email?.from;\n const from: EmailAddress = {\n email: request.from || providerConfig.fromAddress || configuredFrom || 'noreply@example.com',\n name: providerConfig.fromName,\n };\n\n return StandardEmail_SendRequestSchema.parse({\n submissionId,\n from,\n to: toAddresses,\n cc: request.cc?.map(email => ({ email })),\n bcc: request.bcc?.map(email => ({ email })),\n replyTo: request.replyTo ? { email: request.replyTo } : undefined,\n subject: rendered.subject,\n html: rendered.bodyHtml,\n text: rendered.bodyText,\n });\n }\n\n private async executeProviderRequest(\n providerConfig: EmailProviderConfig,\n request: StandardEmail_SendRequest,\n providerRequest?: EmailProviderSendRequest,\n onTransportStart?: () => void,\n ): Promise<EmailProviderExecutionResult> {\n // Log delivery (dev `preview` provider): the template is already\n // rendered — surface it in the logs (subject, recipients, body preview)\n // without inventing a provider receipt. No network I/O. Narrowing on the\n // contract-derived `delivery` field also gates the network-only fields\n // (`endpoint`, `buildSendRequest`, …) accessed below.\n if (providerConfig.delivery === 'log') {\n const recipients = request.to.map(recipient => recipient.email);\n this.logger.info('[email-preview] Email logged instead of sent (log-delivery provider)', {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n from: request.from?.email,\n to: recipients,\n cc: request.cc?.map(recipient => recipient.email),\n bcc: request.bcc?.map(recipient => recipient.email),\n subject: request.subject,\n textPreview: request.text?.slice(0, 2000),\n });\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n response: {\n success: true,\n classification: EmailProviderSubmissionClassification.ACCEPTED,\n providerMessageIds: [],\n },\n };\n }\n\n // Build the provider projection before transport so adapter failures are\n // distinguishable from acceptance-unknown network failures.\n if (!providerRequest) {\n throw new Error('Network email submission is missing its provider request');\n }\n const headers = {\n ...this.buildProviderEmailHeaders(providerConfig),\n ...providerRequest.transportHeaders,\n };\n const body = this.serializeProviderEmailPayload(\n providerConfig,\n providerRequest.payload,\n );\n\n const abortController = new AbortController();\n const timeoutHandle = setTimeout(\n () => abortController.abort(\n new Error(\n `Email provider request exceeded ${EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS}ms`,\n ),\n ),\n EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS,\n );\n let response: Response;\n try {\n onTransportStart?.();\n response = await fetch(providerConfig.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: abortController.signal,\n });\n } catch (error) {\n clearTimeout(timeoutHandle);\n // Once fetch starts, a transport exception gives no trustworthy evidence\n // about whether the provider received the bytes. At-least-once recovery\n // retries this outcome and accepts the possibility of a duplicate.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: describeCaughtError(error),\n retryable: true,\n };\n }\n\n try {\n let responseText = '';\n let responseReadError: string | undefined;\n try {\n responseText = await this.readResponseTextWithAbort(\n response,\n abortController.signal,\n );\n } catch (error) {\n // Keep the deadline active through response-body consumption so a\n // provider that returns headers but stalls its body cannot retain this\n // request indefinitely.\n responseReadError = describeCaughtError(error);\n } finally {\n clearTimeout(timeoutHandle);\n }\n\n const parserInput: EmailProviderSendResponseInput = {\n status: response.status,\n headers: this.responseHeadersToRecord(response.headers),\n body: this.bestEffortParseResponseBody(responseText),\n };\n\n let parsedResponse: StandardEmail_SendResponse | undefined;\n let parserFailure: string | undefined;\n let acceptedContractViolation: string | undefined;\n try {\n const providerParsedResponse = providerConfig.parseSendResponse(parserInput);\n const validatedResponse = StandardEmail_SendResponseSchema.safeParse(\n providerParsedResponse,\n );\n if (validatedResponse.success) {\n parsedResponse = validatedResponse.data;\n } else {\n parserFailure = `Provider response parser violated StandardEmail_SendResponse: ${validatedResponse.error.message}`;\n this.logger.error(\n 'Email provider response adapter contract violation',\n {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n httpStatus: response.status,\n validationError: validatedResponse.error.message,\n },\n );\n if (\n typeof providerParsedResponse === 'object'\n && providerParsedResponse !== null\n && providerParsedResponse.classification === EmailProviderSubmissionClassification.ACCEPTED\n ) {\n /**\n * `classification` is the adapter's provider-aware submission\n * authority. Once it explicitly says ACCEPTED, a malformed\n * receipt, retry hint, or convenience field must remain an\n * observable contract defect without authorizing a duplicate\n * at-least-once replay.\n */\n acceptedContractViolation = parserFailure;\n parsedResponse = {\n success: false,\n classification:\n EmailProviderSubmissionClassification.ACCEPTED,\n providerMessageIds: [],\n };\n }\n }\n } catch (error) {\n parserFailure = describeCaughtError(error);\n }\n\n if (parsedResponse) {\n if (\n parsedResponse.classification === EmailProviderSubmissionClassification.ACCEPTANCE_UNKNOWN\n ) {\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: parsedResponse.providerError\n ?? this.buildProviderHttpError(\n response.status,\n responseText,\n responseReadError,\n ),\n retryable: parsedResponse.retryable ?? true,\n };\n }\n\n if (\n parsedResponse.classification === EmailProviderSubmissionClassification.REJECTED\n ) {\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_REJECTED,\n error: parsedResponse.providerError\n ?? this.describeRejectedRecipients(\n parsedResponse.rejectedRecipients,\n ),\n retryable: parsedResponse.retryable\n ?? this.isRetryableDefiniteRejectionStatus(response.status),\n };\n }\n\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n response: parsedResponse,\n receiptParseError: responseReadError,\n adapterContractViolation: acceptedContractViolation,\n };\n }\n\n if (response.ok) {\n // HTTP 2xx alone is not universal acceptance evidence. Postmark and\n // Mailchimp, for example, can encode semantic rejection inside a 2xx\n // body. If the provider-owned classifier failed or violated its schema,\n // the only honest state is ambiguous acceptance.\n const classificationError = responseReadError\n ?? parserFailure\n ?? 'Provider response adapter returned no valid classification';\n this.logger.error(\n 'Email provider 2xx response could not be classified',\n {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n httpStatus: response.status,\n classificationError,\n },\n );\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: classificationError,\n retryable: true,\n };\n }\n\n const providerHttpError = this.buildProviderHttpError(\n response.status,\n responseText,\n responseReadError,\n );\n const genericError = parserFailure\n ? `${providerHttpError}; provider response parser failed: ${parserFailure}`\n : providerHttpError;\n if (\n response.status === 408\n || response.status === 409\n || response.status >= 500\n ) {\n // A timeout, conflict, or 5xx may be emitted after an upstream accepted\n // the request. Provider adapters can override this only when their body\n // contract provides stronger evidence.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: genericError,\n retryable: true,\n };\n }\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_REJECTED,\n error: genericError,\n retryable: this.isRetryableDefiniteRejectionStatus(response.status),\n };\n } catch (error) {\n clearTimeout(timeoutHandle);\n // Fetch already resolved, so even a local post-response bug cannot prove\n // that the provider did not accept the bytes. At-least-once recovery\n // retries and may duplicate the externally visible message.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: describeCaughtError(error),\n retryable: true,\n };\n }\n }\n\n private bestEffortParseResponseBody(responseText: string): unknown {\n if (responseText.trim().length === 0) return undefined;\n try {\n return JSON.parse(responseText) as unknown;\n } catch {\n return responseText;\n }\n }\n\n private buildProviderHttpError(\n status: number,\n responseText: string,\n responseFailure?: string,\n ): string {\n const responseDetail = responseFailure\n ? `response unavailable (${responseFailure})`\n : responseText.substring(0, 500);\n return `Email provider returned HTTP ${status}: ${responseDetail}`;\n }\n\n private isRetryableDefiniteRejectionStatus(status: number): boolean {\n return status === 425 || status === 429;\n }\n\n /**\n * Fetch implementations normally abort response-body reads with the request\n * signal, but mocks, polyfills, and some stream failures do not. Race the\n * body promise explicitly so the transport deadline covers both receipt\n * headers and body consumption and can never outlive the durable lease.\n */\n private async readResponseTextWithAbort(\n response: Response,\n signal: AbortSignal,\n ): Promise<string> {\n if (signal.aborted) {\n throw this.abortReasonToError(signal.reason);\n }\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n abortListener = () => reject(this.abortReasonToError(signal.reason));\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([response.text(), aborted]);\n } finally {\n if (abortListener) {\n signal.removeEventListener('abort', abortListener);\n }\n }\n }\n\n private abortReasonToError(reason: unknown): Error {\n return reason instanceof Error\n ? reason\n : new Error(\n typeof reason === 'string'\n ? reason\n : 'Email provider request was aborted',\n );\n }\n\n private describeRejectedRecipients(rejectedRecipients?: Array<{ email: string; reason?: string }>): string {\n if (!rejectedRecipients?.length) {\n return 'Email provider response explicitly rejected the submission';\n }\n return `Email provider rejected recipient(s): ${rejectedRecipients\n .map(({ email, reason }) => reason ? `${email} (${reason})` : email)\n .join(', ')}`;\n }\n\n private responseHeadersToRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key.toLowerCase()] = value;\n });\n return result;\n }\n\n /**\n * Compose the send-endpoint URL from the provider's runtime contract.\n * Substitutes the `{domain}` token (used by Mailgun) when present —\n * any provider that declares `sendEndpointPathTokens: ['domain']` gets\n * the same treatment.\n */\n private composeEmailSendEndpoint(\n baseUrl: string,\n sendEndpointPath: string,\n configuredDomain?: string,\n ): string {\n const path = sendEndpointPath.replace('{domain}', configuredDomain ?? '');\n return `${baseUrl}${path}`;\n }\n\n private buildProviderEmailHeaders(providerConfig: EmailProviderConfig_Network): Record<string, string> {\n const contentHeaders = providerConfig.payloadEncoding === EmailProviderPayloadEncoding.JSON\n ? { [WildoHeaderKeys.CONTENT_TYPE]: 'application/json' }\n : {};\n\n if (providerConfig.authScheme === 'basic') {\n const username = providerConfig.basicUsername ?? 'api';\n return {\n ...contentHeaders,\n [providerConfig.authHeaderName]: `Basic ${Buffer.from(`${username}:${providerConfig.apiKey}`).toString('base64')}`,\n };\n }\n\n const credential = providerConfig.authScheme === 'bearer'\n ? `Bearer ${providerConfig.apiKey}`\n : `${providerConfig.authPrefix ?? ''}${providerConfig.apiKey}`;\n\n return {\n ...contentHeaders,\n [providerConfig.authHeaderName]: credential,\n };\n }\n\n /**\n * Serialize the provider-specific payload into the wire encoding the\n * provider expects. Every branch is driven by the provider module's\n * runtime contract (`payloadEncoding`, `embedsApiKeyInBody`) — no\n * `providerId === '<literal>'` branches.\n */\n private serializeProviderEmailPayload(\n providerConfig: EmailProviderConfig_Network,\n payload: unknown,\n ): BodyInit {\n if (\n providerConfig.payloadEncoding === EmailProviderPayloadEncoding.MULTIPART_FORM_DATA\n ) {\n if (!(payload instanceof FormData)) {\n throw new Error(\n `Email provider '${providerConfig.providerId}' declared multipart-form-data but its request builder did not return FormData`,\n );\n }\n // The provider gateway owns multipart field names and binary parts.\n // Passing the FormData through also lets fetch generate the boundary;\n // buildProviderEmailHeaders intentionally omits Content-Type here.\n return payload;\n }\n\n return JSON.stringify(\n providerConfig.embedsApiKeyInBody\n ? { ...(payload as Record<string, unknown>), key: providerConfig.apiKey }\n : payload,\n );\n }\n\n // Per-provider payload building lives in the provider module's\n // `runtimeContract.buildSendRequest` (one of the six EMAIL_PROVIDER\n // backend modules). The email service no longer branches on provider id.\n\n private createProviderUtils() {\n return {\n getRepository: <T>(resourceType: string): T => {\n throw new Error(`getRepository('${resourceType}') is not available in the email context provider. Inject repository data via additionalContext instead.`);\n },\n logger: {\n debug: (message: string, meta?: Record<string, unknown>) =>\n this.logger.debug(message, meta),\n info: (message: string, meta?: Record<string, unknown>) =>\n this.logger.info(message, meta),\n warn: (message: string, meta?: Record<string, unknown>) =>\n this.logger.warn(message, meta),\n error: (message: string, meta?: Record<string, unknown>) =>\n this.logger.error(message, meta),\n },\n errorBuilder: {\n buildError: (type: string, message: string, details?: Record<string, unknown>) => {\n const err = new Error(message);\n (err as Error & { type: string; details: unknown }).type = type;\n (err as Error & { type: string; details: unknown }).details = details;\n return err;\n },\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"email.backend.service.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/services/email.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Email Backend Service\n *\n * Main service for sending emails. Orchestrates:\n * - File-based template resolution via EmailTemplateRegistryBackendService\n * - Context building\n * - React Email rendering (subject fn + body fn → HTML/text)\n * - Provider resolution and HTTP execution\n *\n * ## A sent email leaves LOG LINES and nothing else — by decision (#412, 2026-09-08)\n *\n * There is no persisted record of a sent email anywhere in the framework: no core resource, no\n * delivery log, no per-tenant history. **\"Did this customer receive it?\" is answered with the email\n * provider's own tooling, never with Wildo.** Say that to anyone who asks for it here, rather than\n * treating the absence as a gap to be filled.\n *\n * It reads as an oversight because the sibling subsystem does the opposite: outbound M2M webhooks\n * carry a persisted per-tenant delivery log (`ORGANIZATION_M2M_WEBHOOK_DELIVERY_LOG` and its\n * application twin). The asymmetry is deliberate and the reason is not the table — it is that a\n * persisted email record is a new per-user personal-data store carrying retention policy, privacy\n * classification, subject-export and erasure obligations FOR MESSAGE CONTENT. A metadata-only\n * variant (recipient, template, timestamp, provider id; no body) was on the table and declined too,\n * because it carries the same set of obligations over a smaller payload.\n *\n * Reopening this is legitimate, and it starts with the obligations rather than with the schema.\n */\n\nimport { injectable, inject, optional } from 'inversify';\nimport { render } from '@react-email/render';\nimport { randomUUID } from 'node:crypto';\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport type { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport type { ErrorBuilderBackendService } from '~wildo-backend-lib/errors/services/error-builder.backend.service';\nimport { describeCaughtError } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport type { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\nimport {\n getConfiguredFallbackLanguage,\n getConfiguredPrimaryLanguage,\n} from '~wildo-backend-lib/config/services/app-configuration.backend.utils';\nimport type { ExternalProvidersRegistryBackendService } from '~wildo-backend-lib/external-providers/services/external-providers-registry.backend.service';\nimport type { FilesBackendService } from '~wildo-backend-lib/files/services/files.backend.service';\nimport type { EmailTemplateRegistryBackendService } from './email-template-registry.backend.service';\nimport { buildEmailBrandTokensFromConfig, type EmailBrandTokens } from '~wildo-backend-lib/notifications/email/utils/color-conversion.utils';\nimport {\n EmailTemplateContext,\n EmailTemplateType_ToEngineCapability,\n EmailTemplateType,\n EngineCapability,\n ErrorCustomMessageReference,\n ErrorType,\n isWildoBackendError,\n WildoHeaderKeys,\n} from '@wildo-ai/saas-models';\nimport type {\n StandardEmail_Attachment,\n StandardEmail_SendRequest,\n StandardEmail_SendResponse,\n} from '@wildo-ai/external-connectors-models';\nimport {\n EmailProviderPayloadEncoding,\n EmailProviderSubmissionClassification,\n ExternalProvider_ExchangeProtocol_Kind,\n StandardEmail_SendRequestSchema,\n StandardEmail_SendResponseSchema,\n ProviderProtocolRuntimeKind,\n} from '@wildo-ai/external-connectors-models';\nimport type {\n EmailProviderSendRequest,\n EmailProviderSendResponseInput,\n} from '@wildo-ai/external-connectors-private/backend';\nimport { AvailableLanguage } from '@wildo-ai/presets-components-models';\nimport {\n EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS,\n} from '~wildo-backend-lib/notifications/email/models/email-transport.backend.definitions';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction validateEmailAddresses(emails: string[]): string[] {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emails.filter(email => !emailRegex.test(email.trim()));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Total size ceiling for the attachments of ONE email, applied after the bytes are resolved (#429).\n *\n * 10 MB, deliberately below every provider ceiling this framework talks to — SendGrid 30 MB,\n * Mailgun 25 MB, SES 40 MB on the raw message — so an over-size send is refused HERE, naming the\n * files and the measured total, instead of at a vendor whose rejection an application cannot act\n * on. Base64 also inflates the wire payload by roughly a third, so a limit set AT a provider's\n * number would still fail there.\n *\n * A constant rather than a config key, until an application needs a different number: a configurable\n * limit that nothing reads is the exact defect this issue closed, and adding the reader is the\n * cheaper half of that change.\n */\nexport const OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT = 10 * 1024 * 1024;\n\nexport interface EmailSendRequest {\n /**\n * Stable identity of one logical provider submission. A caller that can\n * retry across process/job boundaries must persist and reuse this value.\n * Ephemeral callers may omit it and let the service allocate one.\n */\n submissionId?: string;\n /** Template reference (e.g., \"system.welcome_email\") */\n templateRef: string;\n /** Locale for template selection */\n locale: AvailableLanguage;\n /** Email type for provider routing */\n type: EmailTemplateType;\n /** Primary recipient email(s) */\n to: string | string[];\n /** CC recipients (optional) */\n cc?: string[];\n /** BCC recipients (optional) */\n bcc?: string[];\n /** Reply-to address (optional) */\n replyTo?: string;\n /** From address (optional - uses provider default if not specified) */\n from?: string;\n /** Context for template rendering */\n context: EmailTemplateContext;\n /** File IDs for attachments (optional) */\n attachmentFileIds?: string[];\n /** Organization ID for org-scoped templates (optional) */\n organizationId?: string;\n}\n\nexport enum EmailSubmissionOutcome {\n NOT_SUBMITTED = 'not_submitted',\n PROVIDER_ACCEPTED = 'provider_accepted',\n PROVIDER_REJECTED = 'provider_rejected',\n ACCEPTANCE_UNKNOWN = 'acceptance_unknown',\n}\n\nexport interface EmailSendResult {\n success: boolean;\n /**\n * Whether an at-least-once caller should retry. An acceptance-unknown retry\n * can duplicate an externally visible email; provider-native idempotency is\n * only an optional risk reduction.\n */\n retryable: boolean;\n submissionId: string;\n outcome: EmailSubmissionOutcome;\n /** All honest provider receipts. Empty means no receipt was returned. */\n providerMessageIds: string[];\n /** Provider confirmed that this logical submission was already accepted. */\n deduplicated?: boolean;\n rejectedRecipients?: Array<{ email: string; reason?: string }>;\n providerId?: string;\n error?: string;\n templateRef: string;\n recipientCount: number;\n}\n\n/**\n * Fields common to every resolved email provider regardless of delivery\n * mode. `from*` come from the app's `providerConfigurations` override, not\n * the runtime contract.\n */\ninterface EmailProviderConfig_Base {\n providerId: string;\n fromAddress?: string;\n fromName?: string;\n}\n\n/**\n * Network delivery — the resolved shape for every real provider (Resend,\n * SendGrid, …). Carries the composed endpoint, auth material, and the\n * provider-specific request builder/parser used by\n * `executeProviderRequest`'s `fetch` path.\n */\ninterface EmailProviderConfig_Network extends EmailProviderConfig_Base {\n delivery: 'network';\n apiKey: string;\n endpoint: string;\n authHeaderName: string;\n authPrefix?: string;\n authScheme?: 'api-key' | 'bearer' | 'basic';\n basicUsername?: string;\n domain?: string;\n /**\n * Wire encoding the provider expects for its request body. Every network\n * provider declares this on its runtime contract; there is no fallback\n * encoding at the consumer boundary.\n */\n payloadEncoding: EmailProviderPayloadEncoding;\n /**\n * Whether the provider expects the API key to be embedded in the JSON\n * payload body (Mailchimp's `key` field). Sourced from the provider\n * module's `runtimeContract.embedsApiKeyInBody`. Defaults to `false`.\n */\n embedsApiKeyInBody: boolean;\n /**\n * Per-provider send-payload builder. Sourced from the provider\n * module's `runtimeContract.buildSendRequest`. Receives the\n * normalized `StandardEmail_SendRequest` plus the optional\n * `configuredDomain` (Mailgun's `{domain}` token).\n */\n buildSendRequest: (\n input: { request: StandardEmail_SendRequest; configuredDomain?: string },\n ) => EmailProviderSendRequest;\n parseSendResponse: (\n input: EmailProviderSendResponseInput,\n ) => StandardEmail_SendResponse;\n}\n\n/**\n * Log delivery — the resolved shape for the dev `preview` provider. Carries\n * NO endpoint / apiKey / payload builder because it never opens a socket;\n * `executeProviderRequest` renders + logs the email without fabricating a\n * provider receipt. Discriminated from network on `delivery` so consumers branch\n * on the contract, never on the provider ref.\n */\ninterface EmailProviderConfig_Log extends EmailProviderConfig_Base {\n delivery: 'log';\n}\n\ntype EmailProviderConfig = EmailProviderConfig_Network | EmailProviderConfig_Log;\n\ntype EmailProviderExecutionResult =\n | {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED;\n response: StandardEmail_SendResponse;\n receiptParseError?: string;\n /**\n * The adapter explicitly classified the submission as accepted but\n * violated another response-contract invariant. Acceptance remains the\n * no-replay authority while the violation stays observable.\n */\n adapterContractViolation?: string;\n }\n | {\n outcome:\n | EmailSubmissionOutcome.PROVIDER_REJECTED\n | EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN;\n error: string;\n retryable: boolean;\n };\n\ninterface EmailAddress {\n email: string;\n name?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE\n// ─────────────────────────────────────────────────────────────────────────────\n\n@injectable()\nexport class EmailBackendService {\n protected logDebug: (message: string, context?: Record<string, unknown>) => void;\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.ErrorBuilderService) private readonly errorBuilder: ErrorBuilderBackendService,\n @inject(SAAS_SERVICE_TYPES.EmailTemplateRegistry) private readonly templateRegistry: EmailTemplateRegistryBackendService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly configService: AppConfigurationService,\n @inject(SAAS_SERVICE_TYPES.ExternalProvidersRegistryService) private readonly externalProvidersRegistry: ExternalProvidersRegistryBackendService,\n /*\n * Attachments (#429). Injected `@optional()` because a deployment that never attaches a file\n * should not fail to construct its email service, and because the resolution is reached only\n * when a caller supplies `attachmentFileIds` — an absent binding then refuses that one send\n * with a named error rather than silently dropping the attachment, which is the defect this\n * closes.\n */\n @inject(SAAS_SERVICE_TYPES.FilesBackendService) @optional() private readonly filesService: FilesBackendService | undefined,\n ) {\n this.logDebug = this.logger.debugByType('EmailBackendService');\n this.logger.setDebugTypeLogging('EmailBackendService', false);\n }\n\n /**\n * Send an email using a file-based template definition.\n */\n async send(request: EmailSendRequest): Promise<EmailSendResult> {\n const startTime = Date.now();\n const submissionId = request.submissionId ?? randomUUID();\n let providerTransportStarted = false;\n this.logger.info('Sending email', {\n templateRef: request.templateRef,\n submissionId,\n locale: request.locale,\n recipientCount: Array.isArray(request.to) ? request.to.length : 1,\n });\n\n try {\n // 0. Validate email addresses\n const recipients = Array.isArray(request.to) ? request.to : [request.to];\n const allEmails = [\n ...recipients,\n ...(request.cc || []),\n ...(request.bcc || []),\n ...(request.replyTo ? [request.replyTo] : []),\n ];\n\n const invalidEmails = validateEmailAddresses(allEmails);\n if (invalidEmails.length > 0) {\n throw this.errorBuilder.buildError(\n ErrorType.VALIDATION,\n undefined,\n {\n customMessageReference: ErrorCustomMessageReference.EMAIL_INVALID_ADDRESS_FORMAT,\n context: {\n // diagnostic (log-only)\n invalidEmails,\n },\n },\n );\n }\n\n // 1. Resolve template + labels from file-based registry\n const defaultLocale = this.getDefaultLocale();\n const resolved = this.templateRegistry.resolve(\n request.templateRef,\n request.locale,\n defaultLocale,\n this.getFallbackLocale(),\n );\n\n // 2. Get design tokens\n const brandTokens = this.getDesignTokens();\n\n // 3. Build full context\n const fullContext: EmailTemplateContext = {\n currentObject: request.context.currentObject,\n objectContext: request.context.objectContext,\n userContext: request.context.userContext,\n additionalContext: {\n ...(request.context.additionalContext as Record<string, unknown> || {}),\n },\n };\n\n // 5. Render subject and body from definition functions\n const templateProps = { context: fullContext, brand: brandTokens, labels: resolved.labels };\n const subject = resolved.definition.subject(templateProps);\n const bodyElement = resolved.definition.body(templateProps);\n\n const bodyHtml = await render(bodyElement, { pretty: true });\n const bodyText = await render(bodyElement, { plainText: true });\n\n // 6. Resolve provider\n const emailType = resolved.definition.type ?? request.type;\n const engineCapability = EmailTemplateType_ToEngineCapability[emailType];\n const providerConfig = this.resolveEmailProvider(engineCapability);\n\n // 6b. Resolve caller-supplied attachments to bytes (#429). Before the request is built,\n // because a file that cannot be served must refuse the send rather than produce an email\n // that silently lacks what the caller attached.\n const attachments = await this.resolveAttachments(request);\n\n // 7. Build email request\n const emailRequest = this.buildEmailRequest(\n request,\n submissionId,\n { subject, bodyHtml, bodyText },\n providerConfig,\n recipients,\n attachments,\n );\n\n const providerRequest = providerConfig.delivery === 'network'\n ? providerConfig.buildSendRequest({\n request: emailRequest,\n configuredDomain: providerConfig.domain,\n })\n : undefined;\n\n // 8. Execute send via provider\n const execution = await this.executeProviderRequest(\n providerConfig,\n emailRequest,\n providerRequest,\n () => {\n providerTransportStarted = true;\n },\n );\n const durationMs = Date.now() - startTime;\n\n if (execution.outcome !== EmailSubmissionOutcome.PROVIDER_ACCEPTED) {\n this.logger.warn('Email provider did not confirm acceptance', {\n templateRef: request.templateRef,\n submissionId,\n outcome: execution.outcome,\n providerId: providerConfig.providerId,\n error: execution.error,\n durationMs,\n });\n return {\n success: false,\n retryable: execution.retryable,\n submissionId,\n outcome: execution.outcome,\n providerMessageIds: [],\n providerId: providerConfig.providerId,\n error: execution.error,\n templateRef: request.templateRef,\n recipientCount: recipients.length,\n };\n }\n\n const providerMessageIds = execution.response.providerMessageIds;\n this.logger.info('Email submission accepted', {\n templateRef: request.templateRef,\n submissionId,\n providerMessageIds,\n deduplicated: execution.response.deduplicated,\n providerReceiptMissing: providerMessageIds.length === 0,\n receiptParseError: execution.receiptParseError,\n adapterContractViolation: execution.adapterContractViolation,\n providerId: providerConfig.providerId,\n durationMs,\n });\n\n return {\n success: execution.response.success,\n retryable: false,\n submissionId,\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n providerMessageIds,\n deduplicated: execution.response.deduplicated,\n rejectedRecipients: execution.response.rejectedRecipients,\n providerId: providerConfig.providerId,\n error: execution.adapterContractViolation\n ?? (execution.response.success\n ? undefined\n : this.describeRejectedRecipients(\n execution.response.rejectedRecipients,\n )),\n templateRef: request.templateRef,\n recipientCount: recipients.length,\n };\n } catch (err) {\n const error = err as Error;\n const durationMs = Date.now() - startTime;\n\n this.logger.error('Email send failed', {\n templateRef: request.templateRef,\n errorMessage: error.message,\n durationMs,\n });\n\n if (isWildoBackendError(err) && (err.type === ErrorType.CONFIGURATION || err.type === ErrorType.VALIDATION)) {\n throw err;\n }\n\n return {\n success: false,\n retryable: true,\n submissionId,\n outcome: providerTransportStarted\n ? EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN\n : EmailSubmissionOutcome.NOT_SUBMITTED,\n providerMessageIds: [],\n error: error.message,\n templateRef: request.templateRef,\n recipientCount: Array.isArray(request.to) ? request.to.length : 1,\n };\n }\n }\n\n /**\n * Send email to multiple recipients individually (different context per recipient).\n */\n async sendToMultiple(requests: EmailSendRequest[]): Promise<EmailSendResult[]> {\n const results: EmailSendResult[] = [];\n for (const request of requests) {\n const result = await this.send(request);\n results.push(result);\n }\n return results;\n }\n\n private getDefaultLocale(): AvailableLanguage {\n return getConfiguredPrimaryLanguage(this.configService.config);\n }\n\n private getFallbackLocale(): AvailableLanguage {\n return getConfiguredFallbackLanguage(this.configService.config);\n }\n\n private getDesignTokens(): EmailBrandTokens {\n try {\n return buildEmailBrandTokensFromConfig(this.configService.config.email?.brandTokens);\n } catch (err) {\n this.logger.warn('Failed to extract design tokens, using defaults', {\n errorMessage: (err as Error).message,\n });\n return buildEmailBrandTokensFromConfig(undefined);\n }\n }\n\n private resolveEmailProvider(capability: EngineCapability): EmailProviderConfig {\n const providerId = this.externalProvidersRegistry.getPrimaryProviderForEngineCapability(capability);\n\n if (!providerId) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No email provider configured for capability: ${capability}`, capability } },\n );\n }\n\n if (!this.externalProvidersRegistry.isProviderEnabled(providerId, ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER)) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `Email provider is disabled by external provider configuration: ${providerId}`, providerId, capability } },\n );\n }\n\n const emailContract = this.externalProvidersRegistry.getProviderConfiguration(\n providerId,\n ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER,\n )?.runtimeContract;\n if (emailContract?.kind !== ProviderProtocolRuntimeKind.EMAIL) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No EMAIL_PROVIDER runtime contract found for provider: ${providerId}`, providerId, capability } },\n );\n }\n\n const appConfig = this.configService.config as Record<string, unknown>;\n const providersConfig = appConfig?.providerConfigurations as Record<string, Record<string, {\n fromAddress?: string;\n fromName?: string;\n domain?: string;\n }> | undefined> | undefined;\n const providerConfig = providersConfig?.[providerId]?.[ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER];\n\n // Non-sending delivery (the dev `preview` provider): no endpoint, no\n // API key. Branch on the CONTRACT field — never the provider ref — so\n // this stays a first-class provider and passes the\n // no-provider-ref-branches guard; `executeProviderRequest` renders +\n // logs instead of opening a socket. Resolved BEFORE the API-key\n // requirement below so a log provider doesn't need a secret at all.\n if (emailContract.delivery === 'log') {\n return {\n providerId,\n delivery: 'log',\n fromAddress: providerConfig?.fromAddress,\n fromName: providerConfig?.fromName,\n };\n }\n\n // Network delivery — a live provider API key is required.\n const apiKey = this.externalProvidersRegistry.getProviderApiKey(\n providerId,\n ExternalProvider_ExchangeProtocol_Kind.EMAIL_PROVIDER,\n );\n if (!apiKey) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `No env-provided API key configured for provider: ${providerId}`, providerId, capability } },\n );\n }\n\n // Resolve the path-token domain (Mailgun) from the contract's declared\n // `sendEndpointPathTokens`. The branch is contract-driven, not ref-keyed:\n // any provider that declares the `'domain'` token gets the same treatment.\n const requiresDomainToken = emailContract.sendEndpointPathTokens?.includes('domain') === true;\n const configuredDomain = requiresDomainToken\n ? providerConfig?.domain ?? process.env[`${providerId.toUpperCase()}_DOMAIN`]\n : providerConfig?.domain;\n if (requiresDomainToken && !configuredDomain) {\n throw this.errorBuilder.buildError(\n ErrorType.CONFIGURATION,\n undefined,\n { context: { message: `Email provider '${providerId}' declares a {domain} send-endpoint token but no domain is configured.`, providerId } },\n );\n }\n\n return {\n providerId,\n delivery: 'network',\n apiKey,\n endpoint: this.composeEmailSendEndpoint(emailContract.baseUrl, emailContract.sendEndpointPath, configuredDomain),\n authHeaderName: emailContract.apiKey.headerName,\n authPrefix: emailContract.apiKey.prefix,\n authScheme: emailContract.apiKey.scheme,\n basicUsername: emailContract.apiKey.basicUsername,\n fromAddress: providerConfig?.fromAddress,\n fromName: providerConfig?.fromName,\n domain: configuredDomain,\n payloadEncoding: emailContract.payloadEncoding,\n embedsApiKeyInBody: emailContract.embedsApiKeyInBody === true,\n buildSendRequest: emailContract.buildSendRequest,\n parseSendResponse: emailContract.parseSendResponse,\n };\n }\n\n /**\n * Resolve `attachmentFileIds` to the vendor-neutral `attachments` array several provider adapters\n * already map (#429).\n *\n * Until this existed the field was declared and read by nothing, so a caller supplying an\n * attachment got a successful send and an attachment-less email. Every refusal below therefore\n * THROWS: a silent drop is the defect, and error handling that drops quietly is the same defect.\n *\n * ## The size cap is the framework's, not a provider's\n *\n * {@link OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT} is deliberately below every provider limit this\n * framework talks to, so the refusal happens HERE — with the file ids and the measured total in\n * the error — rather than at a vendor that answers with a rejected submission and a message the\n * application cannot act on. It is a named constant rather than a config key on purpose: an\n * authored limit nothing read is precisely the class of defect this issue came from, and a\n * config surface can be added the day an application needs a different number.\n *\n * ## What is NOT checked here, and why\n *\n * The file TYPE. A file reaching this point has already passed upload-time validation and, where\n * the field opts into scanning, the scanner — and the status gate inside\n * `readFilesForOutboundAttachment` admits only what the download route would serve, which\n * excludes INFECTED. Re-deciding admissible types at send time would be a second policy that can\n * disagree with the first.\n */\n private async resolveAttachments(request: EmailSendRequest): Promise<StandardEmail_Attachment[]> {\n const fileIds = request.attachmentFileIds ?? [];\n if (fileIds.length === 0) {\n return [];\n }\n\n if (!this.filesService) {\n throw this.errorBuilder.buildError(ErrorType.CONFIGURATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.CONFIGURATION,\n context: {\n message: 'Email attachments were requested but the files service is not bound',\n attachmentCount: fileIds.length,\n },\n });\n }\n\n const resolved = await this.filesService.readFilesForOutboundAttachment(fileIds, {\n applicationId: this.configService.applicationId ?? undefined,\n // The tenancy confinement. An organization-scoped send reaches only that organization's\n // files; a send without one reaches only application-scoped files.\n ...(request.organizationId ? { organizationId: request.organizationId } : {}),\n });\n\n const totalBytes = resolved.reduce((total, file) => total + file.bytes.byteLength, 0);\n if (totalBytes > OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT) {\n throw this.errorBuilder.buildError(ErrorType.VALIDATION, undefined, {\n customMessageReference: ErrorCustomMessageReference.VALIDATION,\n context: {\n message: 'Email attachments exceed the outbound total-size limit',\n totalBytes,\n limitBytes: OUTBOUND_ATTACHMENT_TOTAL_BYTES_LIMIT,\n fileIds: resolved.map((file) => file.fileId),\n },\n });\n }\n\n return resolved.map((file) => ({\n filename: file.filename,\n content: file.bytes.toString('base64'),\n contentType: file.mimeType,\n }));\n }\n\n private buildEmailRequest(\n request: EmailSendRequest,\n submissionId: string,\n rendered: { subject: string; bodyHtml: string; bodyText: string },\n providerConfig: EmailProviderConfig,\n recipients: string[],\n attachments: StandardEmail_Attachment[],\n ): StandardEmail_SendRequest {\n const toAddresses: EmailAddress[] = recipients.map(email => ({ email }));\n\n // From-address precedence: per-send override → per-provider config\n // (`providerConfigurations.<provider>.EMAIL_PROVIDER.fromAddress`) → the\n // app's global `email.from`. The latter is REQUIRED by\n // `AppConfiguration_Email_Schema`, so it is the normal source; the literal\n // fallback is a defensive last resort that should be unreachable once\n // config is initialized. Previously `email.from` was silently ignored —\n // the send fell back to the literal, producing an unverified/invalid\n // sender that providers reject.\n const configuredFrom = this.configService.config.email?.from;\n const from: EmailAddress = {\n email: request.from || providerConfig.fromAddress || configuredFrom || 'noreply@example.com',\n name: providerConfig.fromName,\n };\n\n return StandardEmail_SendRequestSchema.parse({\n submissionId,\n from,\n to: toAddresses,\n cc: request.cc?.map(email => ({ email })),\n bcc: request.bcc?.map(email => ({ email })),\n replyTo: request.replyTo ? { email: request.replyTo } : undefined,\n subject: rendered.subject,\n html: rendered.bodyHtml,\n text: rendered.bodyText,\n // Omitted rather than sent empty: the field is optional on the vendor-neutral contract and\n // several adapters branch on its presence.\n ...(attachments.length > 0 ? { attachments } : {}),\n });\n }\n\n private async executeProviderRequest(\n providerConfig: EmailProviderConfig,\n request: StandardEmail_SendRequest,\n providerRequest?: EmailProviderSendRequest,\n onTransportStart?: () => void,\n ): Promise<EmailProviderExecutionResult> {\n // Log delivery (dev `preview` provider): the template is already\n // rendered — surface it in the logs (subject, recipients, body preview)\n // without inventing a provider receipt. No network I/O. Narrowing on the\n // contract-derived `delivery` field also gates the network-only fields\n // (`endpoint`, `buildSendRequest`, …) accessed below.\n if (providerConfig.delivery === 'log') {\n const recipients = request.to.map(recipient => recipient.email);\n this.logger.info('[email-preview] Email logged instead of sent (log-delivery provider)', {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n from: request.from?.email,\n to: recipients,\n cc: request.cc?.map(recipient => recipient.email),\n bcc: request.bcc?.map(recipient => recipient.email),\n subject: request.subject,\n textPreview: request.text?.slice(0, 2000),\n /*\n * DERIVED FACTS ABOUT THE HTML, never the HTML itself (#522).\n *\n * This provider is how a developer sees a local send, and it surfaced a TEXT preview only —\n * so anything that exists only in the HTML was invisible here. A brand logo is an `<img>`,\n * which is a fair part of why ninety-five templates rendered none without anyone noticing.\n *\n * The body is not logged. That is the same rule the attachment line below already follows —\n * names, never the bytes — and a full HTML email in a log line would be both unreadable and\n * a place for personal data to accumulate. `imageCount` is the smallest fact that tells the\n * two cases apart, which is all the dev loop needs: 0 where a logo did not resolve, 1 where\n * it did.\n *\n * Writing the rendered HTML to a FILE a developer can open is the better surface and is a\n * real decision — where it lives, who removes it, and which environments produce it — so it\n * is recorded rather than invented inside a provider branch.\n */\n htmlBytes: request.html === undefined ? undefined : Buffer.byteLength(request.html, 'utf8'),\n imageCount: request.html === undefined ? undefined : (request.html.match(/<img\\b/gi) ?? []).length,\n // Names only, never the bytes (#429). The log-delivery provider is how a developer sees a\n // local send, so an attachment that resolved has to be visible here — otherwise the dev\n // loop looks identical whether the resolution worked or silently produced nothing, which\n // is the failure this whole path exists to remove.\n attachments: request.attachments?.map((attachment) => ({\n filename: attachment.filename,\n contentType: attachment.contentType,\n bytes: Buffer.from(attachment.content, 'base64').byteLength,\n })),\n });\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n response: {\n success: true,\n classification: EmailProviderSubmissionClassification.ACCEPTED,\n providerMessageIds: [],\n },\n };\n }\n\n // Build the provider projection before transport so adapter failures are\n // distinguishable from acceptance-unknown network failures.\n if (!providerRequest) {\n throw new Error('Network email submission is missing its provider request');\n }\n const headers = {\n ...this.buildProviderEmailHeaders(providerConfig),\n ...providerRequest.transportHeaders,\n };\n const body = this.serializeProviderEmailPayload(\n providerConfig,\n providerRequest.payload,\n );\n\n const abortController = new AbortController();\n const timeoutHandle = setTimeout(\n () => abortController.abort(\n new Error(\n `Email provider request exceeded ${EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS}ms`,\n ),\n ),\n EMAIL_PROVIDER_TRANSPORT_TIMEOUT_MS,\n );\n let response: Response;\n try {\n onTransportStart?.();\n response = await fetch(providerConfig.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: abortController.signal,\n });\n } catch (error) {\n clearTimeout(timeoutHandle);\n // Once fetch starts, a transport exception gives no trustworthy evidence\n // about whether the provider received the bytes. At-least-once recovery\n // retries this outcome and accepts the possibility of a duplicate.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: describeCaughtError(error),\n retryable: true,\n };\n }\n\n try {\n let responseText = '';\n let responseReadError: string | undefined;\n try {\n responseText = await this.readResponseTextWithAbort(\n response,\n abortController.signal,\n );\n } catch (error) {\n // Keep the deadline active through response-body consumption so a\n // provider that returns headers but stalls its body cannot retain this\n // request indefinitely.\n responseReadError = describeCaughtError(error);\n } finally {\n clearTimeout(timeoutHandle);\n }\n\n const parserInput: EmailProviderSendResponseInput = {\n status: response.status,\n headers: this.responseHeadersToRecord(response.headers),\n body: this.bestEffortParseResponseBody(responseText),\n };\n\n let parsedResponse: StandardEmail_SendResponse | undefined;\n let parserFailure: string | undefined;\n let acceptedContractViolation: string | undefined;\n try {\n const providerParsedResponse = providerConfig.parseSendResponse(parserInput);\n const validatedResponse = StandardEmail_SendResponseSchema.safeParse(\n providerParsedResponse,\n );\n if (validatedResponse.success) {\n parsedResponse = validatedResponse.data;\n } else {\n parserFailure = `Provider response parser violated StandardEmail_SendResponse: ${validatedResponse.error.message}`;\n this.logger.error(\n 'Email provider response adapter contract violation',\n {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n httpStatus: response.status,\n validationError: validatedResponse.error.message,\n },\n );\n if (\n typeof providerParsedResponse === 'object'\n && providerParsedResponse !== null\n && providerParsedResponse.classification === EmailProviderSubmissionClassification.ACCEPTED\n ) {\n /**\n * `classification` is the adapter's provider-aware submission\n * authority. Once it explicitly says ACCEPTED, a malformed\n * receipt, retry hint, or convenience field must remain an\n * observable contract defect without authorizing a duplicate\n * at-least-once replay.\n */\n acceptedContractViolation = parserFailure;\n parsedResponse = {\n success: false,\n classification:\n EmailProviderSubmissionClassification.ACCEPTED,\n providerMessageIds: [],\n };\n }\n }\n } catch (error) {\n parserFailure = describeCaughtError(error);\n }\n\n if (parsedResponse) {\n if (\n parsedResponse.classification === EmailProviderSubmissionClassification.ACCEPTANCE_UNKNOWN\n ) {\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: parsedResponse.providerError\n ?? this.buildProviderHttpError(\n response.status,\n responseText,\n responseReadError,\n ),\n retryable: parsedResponse.retryable ?? true,\n };\n }\n\n if (\n parsedResponse.classification === EmailProviderSubmissionClassification.REJECTED\n ) {\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_REJECTED,\n error: parsedResponse.providerError\n ?? this.describeRejectedRecipients(\n parsedResponse.rejectedRecipients,\n ),\n retryable: parsedResponse.retryable\n ?? this.isRetryableDefiniteRejectionStatus(response.status),\n };\n }\n\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_ACCEPTED,\n response: parsedResponse,\n receiptParseError: responseReadError,\n adapterContractViolation: acceptedContractViolation,\n };\n }\n\n if (response.ok) {\n // HTTP 2xx alone is not universal acceptance evidence. Postmark and\n // Mailchimp, for example, can encode semantic rejection inside a 2xx\n // body. If the provider-owned classifier failed or violated its schema,\n // the only honest state is ambiguous acceptance.\n const classificationError = responseReadError\n ?? parserFailure\n ?? 'Provider response adapter returned no valid classification';\n this.logger.error(\n 'Email provider 2xx response could not be classified',\n {\n providerId: providerConfig.providerId,\n submissionId: request.submissionId,\n httpStatus: response.status,\n classificationError,\n },\n );\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: classificationError,\n retryable: true,\n };\n }\n\n const providerHttpError = this.buildProviderHttpError(\n response.status,\n responseText,\n responseReadError,\n );\n const genericError = parserFailure\n ? `${providerHttpError}; provider response parser failed: ${parserFailure}`\n : providerHttpError;\n if (\n response.status === 408\n || response.status === 409\n || response.status >= 500\n ) {\n // A timeout, conflict, or 5xx may be emitted after an upstream accepted\n // the request. Provider adapters can override this only when their body\n // contract provides stronger evidence.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: genericError,\n retryable: true,\n };\n }\n return {\n outcome: EmailSubmissionOutcome.PROVIDER_REJECTED,\n error: genericError,\n retryable: this.isRetryableDefiniteRejectionStatus(response.status),\n };\n } catch (error) {\n clearTimeout(timeoutHandle);\n // Fetch already resolved, so even a local post-response bug cannot prove\n // that the provider did not accept the bytes. At-least-once recovery\n // retries and may duplicate the externally visible message.\n return {\n outcome: EmailSubmissionOutcome.ACCEPTANCE_UNKNOWN,\n error: describeCaughtError(error),\n retryable: true,\n };\n }\n }\n\n private bestEffortParseResponseBody(responseText: string): unknown {\n if (responseText.trim().length === 0) return undefined;\n try {\n return JSON.parse(responseText) as unknown;\n } catch {\n return responseText;\n }\n }\n\n private buildProviderHttpError(\n status: number,\n responseText: string,\n responseFailure?: string,\n ): string {\n const responseDetail = responseFailure\n ? `response unavailable (${responseFailure})`\n : responseText.substring(0, 500);\n return `Email provider returned HTTP ${status}: ${responseDetail}`;\n }\n\n private isRetryableDefiniteRejectionStatus(status: number): boolean {\n return status === 425 || status === 429;\n }\n\n /**\n * Fetch implementations normally abort response-body reads with the request\n * signal, but mocks, polyfills, and some stream failures do not. Race the\n * body promise explicitly so the transport deadline covers both receipt\n * headers and body consumption and can never outlive the durable lease.\n */\n private async readResponseTextWithAbort(\n response: Response,\n signal: AbortSignal,\n ): Promise<string> {\n if (signal.aborted) {\n throw this.abortReasonToError(signal.reason);\n }\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n abortListener = () => reject(this.abortReasonToError(signal.reason));\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([response.text(), aborted]);\n } finally {\n if (abortListener) {\n signal.removeEventListener('abort', abortListener);\n }\n }\n }\n\n private abortReasonToError(reason: unknown): Error {\n return reason instanceof Error\n ? reason\n : new Error(\n typeof reason === 'string'\n ? reason\n : 'Email provider request was aborted',\n );\n }\n\n private describeRejectedRecipients(rejectedRecipients?: Array<{ email: string; reason?: string }>): string {\n if (!rejectedRecipients?.length) {\n return 'Email provider response explicitly rejected the submission';\n }\n return `Email provider rejected recipient(s): ${rejectedRecipients\n .map(({ email, reason }) => reason ? `${email} (${reason})` : email)\n .join(', ')}`;\n }\n\n private responseHeadersToRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key.toLowerCase()] = value;\n });\n return result;\n }\n\n /**\n * Compose the send-endpoint URL from the provider's runtime contract.\n * Substitutes the `{domain}` token (used by Mailgun) when present —\n * any provider that declares `sendEndpointPathTokens: ['domain']` gets\n * the same treatment.\n */\n private composeEmailSendEndpoint(\n baseUrl: string,\n sendEndpointPath: string,\n configuredDomain?: string,\n ): string {\n const path = sendEndpointPath.replace('{domain}', configuredDomain ?? '');\n return `${baseUrl}${path}`;\n }\n\n private buildProviderEmailHeaders(providerConfig: EmailProviderConfig_Network): Record<string, string> {\n const contentHeaders = providerConfig.payloadEncoding === EmailProviderPayloadEncoding.JSON\n ? { [WildoHeaderKeys.CONTENT_TYPE]: 'application/json' }\n : {};\n\n if (providerConfig.authScheme === 'basic') {\n const username = providerConfig.basicUsername ?? 'api';\n return {\n ...contentHeaders,\n [providerConfig.authHeaderName]: `Basic ${Buffer.from(`${username}:${providerConfig.apiKey}`).toString('base64')}`,\n };\n }\n\n const credential = providerConfig.authScheme === 'bearer'\n ? `Bearer ${providerConfig.apiKey}`\n : `${providerConfig.authPrefix ?? ''}${providerConfig.apiKey}`;\n\n return {\n ...contentHeaders,\n [providerConfig.authHeaderName]: credential,\n };\n }\n\n /**\n * Serialize the provider-specific payload into the wire encoding the\n * provider expects. Every branch is driven by the provider module's\n * runtime contract (`payloadEncoding`, `embedsApiKeyInBody`) — no\n * `providerId === '<literal>'` branches.\n */\n private serializeProviderEmailPayload(\n providerConfig: EmailProviderConfig_Network,\n payload: unknown,\n ): BodyInit {\n if (\n providerConfig.payloadEncoding === EmailProviderPayloadEncoding.MULTIPART_FORM_DATA\n ) {\n if (!(payload instanceof FormData)) {\n throw new Error(\n `Email provider '${providerConfig.providerId}' declared multipart-form-data but its request builder did not return FormData`,\n );\n }\n // The provider gateway owns multipart field names and binary parts.\n // Passing the FormData through also lets fetch generate the boundary;\n // buildProviderEmailHeaders intentionally omits Content-Type here.\n return payload;\n }\n\n return JSON.stringify(\n providerConfig.embedsApiKeyInBody\n ? { ...(payload as Record<string, unknown>), key: providerConfig.apiKey }\n : payload,\n );\n }\n\n // Per-provider payload building lives in the provider module's\n // `runtimeContract.buildSendRequest` (one of the six EMAIL_PROVIDER\n // backend modules). The email service no longer branches on provider id.\n\n}\n"]}
@@ -51,6 +51,5 @@ export declare function buildEmailBrandTokensFromConfig(brandTokens?: {
51
51
  primaryColor?: string;
52
52
  secondaryColor?: string;
53
53
  fontFamily?: string;
54
- logoUrl?: string;
55
54
  }): EmailBrandTokens;
56
55
  //# sourceMappingURL=color-conversion.utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"color-conversion.utils.d.ts","sourceRoot":"","sources":["../../../../../../src/notifications/email/utils/color-conversion.utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA4BrD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBhD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,gBAezC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,WAAW,CAAC,EAAE;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,gBAAgB,CAYlB"}
1
+ {"version":3,"file":"color-conversion.utils.d.ts","sourceRoot":"","sources":["../../../../../../src/notifications/email/utils/color-conversion.utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA4BrD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBhD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,gBAezC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,WAAW,CAAC,EAAE;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CAGrB,GACA,gBAAgB,CAYlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"color-conversion.utils.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/utils/color-conversion.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Color Conversion Utilities\n * \n * Utilities for converting colors between formats for email compatibility.\n * Email clients don't support OKLCH, so we need to convert to Hex.\n */\n\nimport { oklch, formatHex, Oklch } from 'culori';\n\n/**\n * Convert an OKLCH color string to Hex\n * \n * @param oklchColor - OKLCH color string (e.g., \"oklch(0.7 0.15 180)\")\n * @returns Hex color string (e.g., \"#4fa3a3\")\n */\nexport function oklchToHex(oklchColor: string): string {\n try {\n // Parse the OKLCH color\n const parsed = oklch(oklchColor);\n \n if (!parsed) {\n // If parsing fails, try to extract values manually\n const match = oklchColor.match(/oklch\\(\\s*([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\s*\\)/i);\n if (match) {\n const color: Oklch = {\n mode: 'oklch',\n l: parseFloat(match[1]),\n c: parseFloat(match[2]),\n h: parseFloat(match[3]),\n };\n return formatHex(color) || '#000000';\n }\n return '#000000';\n }\n \n // Convert to Hex\n const hex = formatHex(parsed);\n return hex || '#000000';\n } catch {\n // Silently return fallback - color conversion failures are non-critical\n // Caller can log if needed, but we return a safe default\n return '#000000';\n }\n}\n\n/**\n * Check if a color string is in OKLCH format\n */\nexport function isOklchColor(color: string): boolean {\n return color.toLowerCase().startsWith('oklch(');\n}\n\n/**\n * Convert any color to hex format\n * Handles OKLCH, rgb, hsl, and passes through hex\n */\nexport function toHexColor(color: string): string {\n if (!color) return '#000000';\n \n // Already hex\n if (color.startsWith('#')) {\n return color;\n }\n \n // OKLCH\n if (isOklchColor(color)) {\n return oklchToHex(color);\n }\n \n // Try culori for other formats\n try {\n const hex = formatHex(color);\n return hex || '#000000';\n } catch {\n return '#000000';\n }\n}\n\n/**\n * Email Brand Tokens structure (hex colors)\n */\nexport interface EmailBrandTokens {\n primaryColor: string;\n primaryForeground: string;\n secondaryColor: string;\n backgroundColor: string;\n foregroundColor: string;\n mutedColor: string;\n mutedForeground: string;\n borderColor: string;\n successColor: string;\n warningColor: string;\n destructiveColor: string;\n borderRadius: string;\n fontFamily: string;\n headingFontFamily?: string;\n}\n\n/**\n * Default email design tokens (fallback values)\n */\nexport const DEFAULT_EMAIL_DESIGN_TOKENS: EmailBrandTokens = {\n primaryColor: '#0066cc',\n primaryForeground: '#ffffff',\n secondaryColor: '#6c757d',\n backgroundColor: '#ffffff',\n foregroundColor: '#1a1a1a',\n mutedColor: '#f5f5f5',\n mutedForeground: '#6c757d',\n borderColor: '#e5e5e5',\n successColor: '#22c55e',\n warningColor: '#f59e0b',\n destructiveColor: '#ef4444',\n borderRadius: '0.5rem',\n fontFamily: 'Arial, Helvetica, sans-serif',\n headingFontFamily: 'Arial, Helvetica, sans-serif',\n};\n\n/**\n * Build full `EmailBrandTokens` from the simplified `email.brandTokens` config.\n * Merges provided values with `DEFAULT_EMAIL_DESIGN_TOKENS`.\n */\nexport function buildEmailBrandTokensFromConfig(\n brandTokens?: {\n primaryColor?: string;\n secondaryColor?: string;\n fontFamily?: string;\n logoUrl?: string;\n },\n): EmailBrandTokens {\n if (!brandTokens) return { ...DEFAULT_EMAIL_DESIGN_TOKENS };\n\n return {\n ...DEFAULT_EMAIL_DESIGN_TOKENS,\n ...(brandTokens.primaryColor && { primaryColor: toHexColor(brandTokens.primaryColor) }),\n ...(brandTokens.secondaryColor && { secondaryColor: toHexColor(brandTokens.secondaryColor) }),\n ...(brandTokens.fontFamily && {\n fontFamily: brandTokens.fontFamily,\n headingFontFamily: brandTokens.fontFamily,\n }),\n };\n}\n"]}
1
+ {"version":3,"file":"color-conversion.utils.js","sourceRoot":"","sources":["../../../../../../src/notifications/email/utils/color-conversion.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Color Conversion Utilities\n * \n * Utilities for converting colors between formats for email compatibility.\n * Email clients don't support OKLCH, so we need to convert to Hex.\n */\n\nimport { oklch, formatHex, Oklch } from 'culori';\n\n/**\n * Convert an OKLCH color string to Hex\n * \n * @param oklchColor - OKLCH color string (e.g., \"oklch(0.7 0.15 180)\")\n * @returns Hex color string (e.g., \"#4fa3a3\")\n */\nexport function oklchToHex(oklchColor: string): string {\n try {\n // Parse the OKLCH color\n const parsed = oklch(oklchColor);\n \n if (!parsed) {\n // If parsing fails, try to extract values manually\n const match = oklchColor.match(/oklch\\(\\s*([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\s*\\)/i);\n if (match) {\n const color: Oklch = {\n mode: 'oklch',\n l: parseFloat(match[1]),\n c: parseFloat(match[2]),\n h: parseFloat(match[3]),\n };\n return formatHex(color) || '#000000';\n }\n return '#000000';\n }\n \n // Convert to Hex\n const hex = formatHex(parsed);\n return hex || '#000000';\n } catch {\n // Silently return fallback - color conversion failures are non-critical\n // Caller can log if needed, but we return a safe default\n return '#000000';\n }\n}\n\n/**\n * Check if a color string is in OKLCH format\n */\nexport function isOklchColor(color: string): boolean {\n return color.toLowerCase().startsWith('oklch(');\n}\n\n/**\n * Convert any color to hex format\n * Handles OKLCH, rgb, hsl, and passes through hex\n */\nexport function toHexColor(color: string): string {\n if (!color) return '#000000';\n \n // Already hex\n if (color.startsWith('#')) {\n return color;\n }\n \n // OKLCH\n if (isOklchColor(color)) {\n return oklchToHex(color);\n }\n \n // Try culori for other formats\n try {\n const hex = formatHex(color);\n return hex || '#000000';\n } catch {\n return '#000000';\n }\n}\n\n/**\n * Email Brand Tokens structure (hex colors)\n */\nexport interface EmailBrandTokens {\n primaryColor: string;\n primaryForeground: string;\n secondaryColor: string;\n backgroundColor: string;\n foregroundColor: string;\n mutedColor: string;\n mutedForeground: string;\n borderColor: string;\n successColor: string;\n warningColor: string;\n destructiveColor: string;\n borderRadius: string;\n fontFamily: string;\n headingFontFamily?: string;\n}\n\n/**\n * Default email design tokens (fallback values)\n */\nexport const DEFAULT_EMAIL_DESIGN_TOKENS: EmailBrandTokens = {\n primaryColor: '#0066cc',\n primaryForeground: '#ffffff',\n secondaryColor: '#6c757d',\n backgroundColor: '#ffffff',\n foregroundColor: '#1a1a1a',\n mutedColor: '#f5f5f5',\n mutedForeground: '#6c757d',\n borderColor: '#e5e5e5',\n successColor: '#22c55e',\n warningColor: '#f59e0b',\n destructiveColor: '#ef4444',\n borderRadius: '0.5rem',\n fontFamily: 'Arial, Helvetica, sans-serif',\n headingFontFamily: 'Arial, Helvetica, sans-serif',\n};\n\n/**\n * Build full `EmailBrandTokens` from the simplified `email.brandTokens` config.\n * Merges provided values with `DEFAULT_EMAIL_DESIGN_TOKENS`.\n */\nexport function buildEmailBrandTokensFromConfig(\n brandTokens?: {\n primaryColor?: string;\n secondaryColor?: string;\n fontFamily?: string;\n // No `logoUrl`: it never had a destination here — `EmailBrandTokens` has no logo field — and the\n // logo is scope-resolved into `primaryScopeContext.logoUrl` instead. See the email config schema.\n },\n): EmailBrandTokens {\n if (!brandTokens) return { ...DEFAULT_EMAIL_DESIGN_TOKENS };\n\n return {\n ...DEFAULT_EMAIL_DESIGN_TOKENS,\n ...(brandTokens.primaryColor && { primaryColor: toHexColor(brandTokens.primaryColor) }),\n ...(brandTokens.secondaryColor && { secondaryColor: toHexColor(brandTokens.secondaryColor) }),\n ...(brandTokens.fontFamily && {\n fontFamily: brandTokens.fontFamily,\n headingFontFamily: brandTokens.fontFamily,\n }),\n };\n}\n"]}
@@ -5,16 +5,18 @@ import { ResourcesRegistryBackendService } from '../../resources/services/resour
5
5
  import { ExecutionContextCreatorBackendService } from '../../runtime/services/execution-context-creator.backend.service';
6
6
  import { ExecutionContext } from '../../runtime/models/execution-context.backend.schemas';
7
7
  import { ResourceConfiguration_Operation } from '@wildo-ai/saas-models';
8
- import { ResourcePrimaryScope, NotificationBadgeOperation, NotificationBadgeDefinition, NotificationBadgeIdentifier } from '@wildo-ai/saas-models';
8
+ import { NotificationBadgeOperation, NotificationBadgeDefinition, NotificationBadgeIdentifier, type NotificationScope } from '@wildo-ai/saas-models';
9
9
  import { WebSocketService } from '../../requests/service/websocket.service';
10
10
  /**
11
- * Badge reference format: `${scope}:${scopeId}:${identifier}`
12
- * Examples:
13
- * - user_self:user123:new_messages
14
- * - organization:org456:pending_tasks
11
+ * A parsed badge REFERENCE — one badge ROW, addressed as `<scope>:<scopeId>:<identifier>`.
12
+ *
13
+ * The FORMAT is not defined here. It lives once in `@wildo-ai/saas-models`
14
+ * (`buildNotificationBadgeReference` / `parseNotificationBadgeReference`) because the browser badge
15
+ * store parses the same string off the wire, and two hand-rolled `split(':')` implementations are
16
+ * how a producer and a consumer come to disagree about what the parts mean.
15
17
  */
16
18
  export interface BadgeReference {
17
- scope: ResourcePrimaryScope;
19
+ scope: NotificationScope;
18
20
  scopeId: string;
19
21
  identifier: NotificationBadgeIdentifier;
20
22
  }
@@ -61,9 +63,13 @@ export declare class NotificationBadgeBackendService {
61
63
  */
62
64
  private buildBadgeExecutionContext;
63
65
  /**
64
- * Build a badge reference string
66
+ * Build a badge reference string.
67
+ *
68
+ * Delegates to the shared builder rather than re-templating the format: the browser reduces this
69
+ * exact string to a badge KEY on arrival, so the producer and the consumer must be reading one
70
+ * definition of where the parts are.
65
71
  */
66
- buildBadgeReference(scope: ResourcePrimaryScope, scopeId: string, identifier: NotificationBadgeIdentifier): string;
72
+ buildBadgeReference(scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier): string;
67
73
  /**
68
74
  * Parse a badge reference string.
69
75
  *
@@ -77,34 +83,133 @@ export declare class NotificationBadgeBackendService {
77
83
  /**
78
84
  * Get badge count for a specific identifier and scope
79
85
  */
80
- getBadgeCount<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: ResourcePrimaryScope, scopeId: string, identifier: NotificationBadgeIdentifier): Promise<number>;
86
+ getBadgeCount<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier): Promise<number>;
81
87
  /**
82
88
  * Get all badges for a specific scope
83
89
  */
84
- getAllBadges<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: ResourcePrimaryScope, scopeId: string): Promise<Array<{
90
+ getAllBadges<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string): Promise<Array<{
85
91
  identifier: string;
86
92
  count: number;
87
93
  }>>;
88
94
  /**
89
- * Execute a badge operation (increment, decrement, set, reset)
95
+ * Execute a badge operation (increment, decrement, set, reset).
96
+ *
97
+ * ## Two write shapes, because the vocabulary carries two kinds of change
98
+ *
99
+ * `SET` and `RESET` are ABSOLUTE: the value written does not depend on the value read, so a plain
100
+ * read-then-write is already correct — concurrent absolute writes are last-writer-wins, which is
101
+ * what "set it to N" means.
102
+ *
103
+ * `INCREMENT` and `DECREMENT` are RELATIVE, and that is where this method used to lose data. It
104
+ * read `count`, computed `count ± value` in JavaScript, and wrote the result back. Two operations
105
+ * committing concurrently both read the SAME previous value, so the second write overwrote the
106
+ * first and one increment vanished — with no error, no log, and a badge that is simply too low
107
+ * forever after (an EVENT_COUNTER badge is never re-derived; that is the whole distinction
108
+ * `NotificationBadgeSourceKind` draws, and it is why the drift is permanent here and self-healing
109
+ * on a DERIVED_QUERY badge).
110
+ *
111
+ * More checking cannot fix that — the two writers have nothing to collide on. So the relative arms
112
+ * now go through the adapter-neutral guarded mutation, where the STORE performs the arithmetic in
113
+ * one statement (`$inc` on MongoDB, `COALESCE(col, 0) + delta` on PostgreSQL) and the two writers
114
+ * collide on the row itself. See {@link applyRelativeCountChange}.
90
115
  */
91
- executeBadgeOperation<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: ResourcePrimaryScope, scopeId: string, identifier: NotificationBadgeIdentifier, operation: NotificationBadgeOperation, value?: number): Promise<BadgeUpdateResult>;
116
+ executeBadgeOperation<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier, operation: NotificationBadgeOperation, value?: number): Promise<BadgeUpdateResult>;
117
+ /**
118
+ * Apply a RELATIVE change (`+value` / `-value`) to a badge counter without ever reading it into
119
+ * JavaScript first.
120
+ *
121
+ * ## The shape, and why it is a loop rather than a straight line
122
+ *
123
+ * A guarded mutation only mutates a row that ALREADY EXISTS — it returns `null` when its filter
124
+ * matched nothing, and it cannot insert. A badge row, meanwhile, is materialized lazily on its
125
+ * first write. So the write is "apply the delta; if there was no row, materialize one at ZERO and
126
+ * apply the delta to that".
127
+ *
128
+ * **Materializing at ZERO rather than at the target is the load-bearing detail.** Creating the row
129
+ * already carrying `value` would mean two racing first-increments each insert a row holding `1`,
130
+ * and one of the two increments is lost exactly as before — the defect would simply have moved
131
+ * from the update to the insert. Creating at zero and then letting BOTH callers apply their own
132
+ * delta through the atomic statement keeps every increment: the store matches one row for both,
133
+ * and it ends at 2.
134
+ *
135
+ * ## The residual, stated rather than hidden
136
+ *
137
+ * Two racing materializations can still leave a DUPLICATE badge row, because nothing in the schema
138
+ * makes `(scopeId, identifier)` unique — `identifier` carries `.isSummaryField()` and no
139
+ * `.isUnique()`, so the store has no constraint to refuse the second insert with. That duplicate
140
+ * hazard is older than this method and is not what this change is about: it costs a stray row,
141
+ * whereas the read-modify-write cost a permanently wrong number. Closing it means a unique index,
142
+ * which is an engine resource change owing a migration in every PostgreSQL-backed surface
143
+ * (`.claude/rules/engine-resource-changes-owe-migrations.md`) and belongs with the badge-identity
144
+ * work, not here.
145
+ *
146
+ * @returns the count before and after, as observed from the row the store returned.
147
+ */
148
+ private applyRelativeCountChange;
149
+ /**
150
+ * ONE attempt at the atomic delta. Returns the before/after counts, or `null` when no row matched.
151
+ *
152
+ * ## The decrement floor lives in the FILTER, not in `Math.max`
153
+ *
154
+ * `Math.max(0, previousCount - value)` computes the floor from a value read moments earlier, which
155
+ * is the very read this change exists to remove. The floor is therefore expressed as a GUARD the
156
+ * store evaluates in the same statement as the write — `count: { $gte: magnitude }` — which is the
157
+ * idiom the promotion redemption counter uses for its `maxRedemptions` ceiling.
158
+ *
159
+ * That guard alone would REFUSE a decrement that cannot be taken in full, where the previous
160
+ * behaviour CLAMPED it to zero. Preserving the clamp needs a second statement, because neither
161
+ * adapter's neutral vocabulary can express "subtract, floored at zero" in one (there is no `$max`
162
+ * in `RepositoryGuardedMutation`, deliberately — an operator no adapter pair can honour identically
163
+ * does not get a name there). So a below-floor row is set to zero by a SECOND guarded statement,
164
+ * itself conditioned on the row still being below the floor. Each statement is atomic, and the
165
+ * pair is safe in every interleaving:
166
+ *
167
+ * - first matched → the count fell by exactly `magnitude`;
168
+ * - first missed, second matched → the count was below the floor at the moment of the write and is
169
+ * now zero, which is what `Math.max(0, count - value)` meant for that count;
170
+ * - both missed → either no row, or a concurrent INCREMENT crossed the floor between the two
171
+ * statements. The caller distinguishes those and retries rather than concluding.
172
+ *
173
+ * ## `updatedAt` is deliberately absent from the descriptor
174
+ *
175
+ * Both adapters bump it themselves — mongoose's `timestamps` hook on one, an explicit
176
+ * planned-column assignment inside `prepareGuardedUpdate` on the other. Passing it here would be a
177
+ * second authority for the same field, and the two would disagree the day either arm changes.
178
+ */
179
+ private applyGuardedCountDelta;
180
+ /**
181
+ * Insert the badge row at ZERO so a subsequent atomic delta has something to mutate.
182
+ *
183
+ * Goes through the SERVICE tier (`repository.create` with the badge-scoped execution context)
184
+ * rather than a raw insert, so the row is schema-validated and gets its scope FK injected by
185
+ * context enrichment at birth — see {@link buildBadgeExecutionContext} for why the triggering
186
+ * operation's own context cannot serve here.
187
+ */
188
+ private materializeZeroBadge;
189
+ /**
190
+ * Write an ABSOLUTE count (`SET` / `RESET`).
191
+ *
192
+ * The read here is NOT a read-modify-write: the value written is fixed by the caller, so a
193
+ * concurrent absolute write can only replace it wholesale, which is what an absolute write means.
194
+ * The read decides update-versus-insert and supplies the reported `previousCount`.
195
+ */
196
+ private writeAbsoluteCount;
92
197
  /**
93
198
  * Increment a badge count
94
199
  */
95
- increment<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: ResourcePrimaryScope, scopeId: string, identifier: NotificationBadgeIdentifier, amount?: number): Promise<BadgeUpdateResult>;
200
+ increment<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier, amount?: number): Promise<BadgeUpdateResult>;
96
201
  /**
97
202
  * Decrement a badge count
98
203
  */
99
- decrement<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: ResourcePrimaryScope, scopeId: string, identifier: NotificationBadgeIdentifier, amount?: number): Promise<BadgeUpdateResult>;
204
+ decrement<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier, amount?: number): Promise<BadgeUpdateResult>;
100
205
  /**
101
206
  * Set a badge count to a specific value
102
207
  */
103
- set<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: ResourcePrimaryScope, scopeId: string, identifier: NotificationBadgeIdentifier, value: number): Promise<BadgeUpdateResult>;
208
+ set<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier, value: number): Promise<BadgeUpdateResult>;
104
209
  /**
105
210
  * Reset a badge count to zero
106
211
  */
107
- reset<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: ResourcePrimaryScope, scopeId: string, identifier: NotificationBadgeIdentifier): Promise<BadgeUpdateResult>;
212
+ reset<TResourceConfigOperation extends ResourceConfiguration_Operation<any, any, any>>(executionContext: ExecutionContext<TResourceConfigOperation>, scope: NotificationScope, scopeId: string, identifier: NotificationBadgeIdentifier): Promise<BadgeUpdateResult>;
108
213
  /**
109
214
  * Recompute a DERIVED_QUERY badge and persist the result (R5).
110
215
  *
@@ -133,9 +238,22 @@ export declare class NotificationBadgeBackendService {
133
238
  organizationId?: string | null;
134
239
  }): Promise<void>;
135
240
  /**
136
- * Find a badge by scope, scopeId, and identifier
241
+ * Find a badge by scope, scopeId, and identifier.
242
+ *
243
+ * `executionContext` is the CALLER's context and is deliberately not used for the read: a badge
244
+ * read runs on its own badge-resource-scoped context, exactly as a badge write does, because the
245
+ * triggering operation's context carries the wrong scope (see {@link buildBadgeExecutionContext}).
246
+ * The parameter is kept so the private read reads like every other method on this service.
137
247
  */
138
248
  private findBadge;
249
+ /**
250
+ * The badge read itself, addressed only by identity.
251
+ *
252
+ * Split out of {@link findBadge} because the atomic write path has no caller execution context to
253
+ * pass — it is reconciling its own guarded statements, not serving a request — and inventing one
254
+ * to satisfy a parameter the read never consults would be ceremony.
255
+ */
256
+ private findBadgeByIdentity;
139
257
  /**
140
258
  * Resolve the repository for a given badge scope.
141
259
  *
@@ -152,11 +270,14 @@ export declare class NotificationBadgeBackendService {
152
270
  */
153
271
  private resolveRepository;
154
272
  /**
155
- * Whether a string scope value is one of the supported badge scopes.
156
- * Used by `parseBadgeReference` to reject APPLICATION-scoped references
157
- * at parse time (the variant was dropped in the polymorphism refactor).
273
+ * Resolve the RESOURCE TYPE backing a badge scope — the same polymorphism dispatch
274
+ * {@link resolveRepository} performs, named separately because the atomic write path addresses the
275
+ * registry by resource type rather than by repository handle.
276
+ *
277
+ * One switch, two consumers: a second copy of this mapping is how a future third scope reaches one
278
+ * of them and not the other.
158
279
  */
159
- private isSupportedScope;
280
+ private resolveResourceType;
160
281
  /**
161
282
  * Build filter for scope-specific queries.
162
283
  *