@wildo-ai/saas-backend-lib 1.1.12 → 1.1.13

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 (226) hide show
  1. package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
  2. package/dist/esm/base-classes/models/manual-controllers.backend.definition.js +2 -0
  3. package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
  4. package/dist/esm/base-classes/services/repositories/stored-field-omission.backend.d.ts +4 -0
  5. package/dist/esm/base-classes/services/repositories/stored-field-omission.backend.d.ts.map +1 -1
  6. package/dist/esm/base-classes/services/repositories/stored-field-omission.backend.js +20 -5
  7. package/dist/esm/base-classes/services/repositories/stored-field-omission.backend.js.map +1 -1
  8. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-registry.backend.service.d.ts +3 -0
  9. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-registry.backend.service.d.ts.map +1 -1
  10. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-registry.backend.service.js +10 -1
  11. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-registry.backend.service.js.map +1 -1
  12. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation.factory.backend.d.ts +22 -0
  13. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation.factory.backend.d.ts.map +1 -1
  14. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation.factory.backend.js +25 -1
  15. package/dist/esm/base-classes/services/services/resource-operation-custom-implementation.factory.backend.js.map +1 -1
  16. package/dist/esm/base-classes/services/services/resource-operation-transaction-persistence.backend.utils.d.ts +38 -3
  17. package/dist/esm/base-classes/services/services/resource-operation-transaction-persistence.backend.utils.d.ts.map +1 -1
  18. package/dist/esm/base-classes/services/services/resource-operation-transaction-persistence.backend.utils.js +68 -5
  19. package/dist/esm/base-classes/services/services/resource-operation-transaction-persistence.backend.utils.js.map +1 -1
  20. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts +2 -2
  21. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
  22. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +6 -3
  23. package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
  24. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +83 -0
  25. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
  26. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +217 -14
  27. package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
  28. package/dist/esm/compliance/approval-seals/approval-seal-currency.backend.d.ts +32 -0
  29. package/dist/esm/compliance/approval-seals/approval-seal-currency.backend.d.ts.map +1 -0
  30. package/dist/esm/compliance/approval-seals/approval-seal-currency.backend.js +36 -0
  31. package/dist/esm/compliance/approval-seals/approval-seal-currency.backend.js.map +1 -0
  32. package/dist/esm/compliance/approval-seals/approval-seal-on-record.backend.d.ts +38 -0
  33. package/dist/esm/compliance/approval-seals/approval-seal-on-record.backend.d.ts.map +1 -0
  34. package/dist/esm/compliance/approval-seals/approval-seal-on-record.backend.js +83 -0
  35. package/dist/esm/compliance/approval-seals/approval-seal-on-record.backend.js.map +1 -0
  36. package/dist/esm/compliance/approval-seals/approval-seal-presentation-read.backend.d.ts +36 -0
  37. package/dist/esm/compliance/approval-seals/approval-seal-presentation-read.backend.d.ts.map +1 -0
  38. package/dist/esm/compliance/approval-seals/approval-seal-presentation-read.backend.js +51 -0
  39. package/dist/esm/compliance/approval-seals/approval-seal-presentation-read.backend.js.map +1 -0
  40. package/dist/esm/compliance/approval-seals/approval-seal-relay-store.backend.d.ts +46 -0
  41. package/dist/esm/compliance/approval-seals/approval-seal-relay-store.backend.d.ts.map +1 -1
  42. package/dist/esm/compliance/approval-seals/approval-seal-relay-store.backend.js +68 -0
  43. package/dist/esm/compliance/approval-seals/approval-seal-relay-store.backend.js.map +1 -1
  44. package/dist/esm/compliance/approval-seals/approval-seal-store.backend.d.ts +27 -0
  45. package/dist/esm/compliance/approval-seals/approval-seal-store.backend.d.ts.map +1 -1
  46. package/dist/esm/compliance/approval-seals/approval-seal-store.backend.js +42 -3
  47. package/dist/esm/compliance/approval-seals/approval-seal-store.backend.js.map +1 -1
  48. package/dist/esm/compliance/approval-seals/approval-seals-admin.backend.contracts.d.ts +26 -1
  49. package/dist/esm/compliance/approval-seals/approval-seals-admin.backend.contracts.d.ts.map +1 -1
  50. package/dist/esm/compliance/approval-seals/approval-seals-admin.backend.contracts.js +10 -0
  51. package/dist/esm/compliance/approval-seals/approval-seals-admin.backend.contracts.js.map +1 -1
  52. package/dist/esm/compliance/approval-seals/approval-seals-admin.backend.controller.d.ts +10 -1
  53. package/dist/esm/compliance/approval-seals/approval-seals-admin.backend.controller.d.ts.map +1 -1
  54. package/dist/esm/compliance/approval-seals/approval-seals-admin.backend.controller.js +60 -28
  55. package/dist/esm/compliance/approval-seals/approval-seals-admin.backend.controller.js.map +1 -1
  56. package/dist/esm/compliance/approval-seals/approval-seals-on-record.backend.controller.d.ts +90 -0
  57. package/dist/esm/compliance/approval-seals/approval-seals-on-record.backend.controller.d.ts.map +1 -0
  58. package/dist/esm/compliance/approval-seals/approval-seals-on-record.backend.controller.js +373 -0
  59. package/dist/esm/compliance/approval-seals/approval-seals-on-record.backend.controller.js.map +1 -0
  60. package/dist/esm/compliance/approval-seals/decision-presentation.backend.d.ts +29 -2
  61. package/dist/esm/compliance/approval-seals/decision-presentation.backend.d.ts.map +1 -1
  62. package/dist/esm/compliance/approval-seals/decision-presentation.backend.js +40 -3
  63. package/dist/esm/compliance/approval-seals/decision-presentation.backend.js.map +1 -1
  64. package/dist/esm/compliance/electronic-signatures/pdf-signature-structure.backend.d.ts.map +1 -1
  65. package/dist/esm/compliance/electronic-signatures/pdf-signature-structure.backend.js +34 -6
  66. package/dist/esm/compliance/electronic-signatures/pdf-signature-structure.backend.js.map +1 -1
  67. package/dist/esm/compliance/electronic-signatures/signature-request-evidence-files.backend.d.ts +30 -6
  68. package/dist/esm/compliance/electronic-signatures/signature-request-evidence-files.backend.d.ts.map +1 -1
  69. package/dist/esm/compliance/electronic-signatures/signature-request-evidence-files.backend.js +67 -22
  70. package/dist/esm/compliance/electronic-signatures/signature-request-evidence-files.backend.js.map +1 -1
  71. package/dist/esm/compliance/electronic-signatures/signature-request-poll.batch.backend.service.d.ts.map +1 -1
  72. package/dist/esm/compliance/electronic-signatures/signature-request-poll.batch.backend.service.js +18 -1
  73. package/dist/esm/compliance/electronic-signatures/signature-request-poll.batch.backend.service.js.map +1 -1
  74. package/dist/esm/compliance/electronic-signatures/signature-requests.backend.service.d.ts +66 -1
  75. package/dist/esm/compliance/electronic-signatures/signature-requests.backend.service.d.ts.map +1 -1
  76. package/dist/esm/compliance/electronic-signatures/signature-requests.backend.service.js +161 -14
  77. package/dist/esm/compliance/electronic-signatures/signature-requests.backend.service.js.map +1 -1
  78. package/dist/esm/compliance/electronic-signatures/signed-document-validation.backend.d.ts +47 -0
  79. package/dist/esm/compliance/electronic-signatures/signed-document-validation.backend.d.ts.map +1 -1
  80. package/dist/esm/compliance/electronic-signatures/signed-document-validation.backend.js.map +1 -1
  81. package/dist/esm/external-providers/services/content-safety.backend.service.d.ts +27 -2
  82. package/dist/esm/external-providers/services/content-safety.backend.service.d.ts.map +1 -1
  83. package/dist/esm/external-providers/services/content-safety.backend.service.js +46 -1
  84. package/dist/esm/external-providers/services/content-safety.backend.service.js.map +1 -1
  85. package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
  86. package/dist/esm/external-providers/services/embeddings.backend.service.js +2 -0
  87. package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
  88. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +11 -0
  89. package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
  90. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +23 -0
  91. package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
  92. package/dist/esm/external-providers/services/provider-service-account-token.backend.d.ts +19 -1
  93. package/dist/esm/external-providers/services/provider-service-account-token.backend.d.ts.map +1 -1
  94. package/dist/esm/external-providers/services/provider-service-account-token.backend.js +41 -1
  95. package/dist/esm/external-providers/services/provider-service-account-token.backend.js.map +1 -1
  96. package/dist/esm/files/utils/file-parent-read-context.backend.d.ts +27 -2
  97. package/dist/esm/files/utils/file-parent-read-context.backend.d.ts.map +1 -1
  98. package/dist/esm/files/utils/file-parent-read-context.backend.js +23 -4
  99. package/dist/esm/files/utils/file-parent-read-context.backend.js.map +1 -1
  100. package/dist/esm/flows-actors/content-guardrails/classifier-availability.backend.utils.d.ts +26 -0
  101. package/dist/esm/flows-actors/content-guardrails/classifier-availability.backend.utils.d.ts.map +1 -1
  102. package/dist/esm/flows-actors/content-guardrails/classifier-availability.backend.utils.js +100 -8
  103. package/dist/esm/flows-actors/content-guardrails/classifier-availability.backend.utils.js.map +1 -1
  104. package/dist/esm/flows-actors/content-guardrails/record-owner-policy.backend.d.ts +3 -1
  105. package/dist/esm/flows-actors/content-guardrails/record-owner-policy.backend.d.ts.map +1 -1
  106. package/dist/esm/flows-actors/content-guardrails/record-owner-policy.backend.js +8 -2
  107. package/dist/esm/flows-actors/content-guardrails/record-owner-policy.backend.js.map +1 -1
  108. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +43 -0
  109. package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
  110. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +37 -0
  111. package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
  112. package/dist/esm/flows-actors/services/agent-work-decisions.backend.service.d.ts +7 -0
  113. package/dist/esm/flows-actors/services/agent-work-decisions.backend.service.d.ts.map +1 -1
  114. package/dist/esm/flows-actors/services/agent-work-decisions.backend.service.js +8 -3
  115. package/dist/esm/flows-actors/services/agent-work-decisions.backend.service.js.map +1 -1
  116. package/dist/esm/flows-actors/services/agents.backend.service.d.ts +31 -6
  117. package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
  118. package/dist/esm/flows-actors/services/agents.backend.service.js +78 -30
  119. package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
  120. package/dist/esm/flows-actors/services/autonomous-agent-turn.backend.service.d.ts.map +1 -1
  121. package/dist/esm/flows-actors/services/autonomous-agent-turn.backend.service.js +4 -0
  122. package/dist/esm/flows-actors/services/autonomous-agent-turn.backend.service.js.map +1 -1
  123. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +28 -2
  124. package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
  125. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +132 -22
  126. package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
  127. package/dist/esm/flows-actors/services/flow-actor-executions.custom-impl.backend.service.d.ts.map +1 -1
  128. package/dist/esm/flows-actors/services/flow-actor-executions.custom-impl.backend.service.js +12 -8
  129. package/dist/esm/flows-actors/services/flow-actor-executions.custom-impl.backend.service.js.map +1 -1
  130. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +5 -0
  131. package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
  132. package/dist/esm/flows-actors/services/flows-actors-registry.service.js +18 -2
  133. package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
  134. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts +33 -0
  135. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
  136. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +58 -0
  137. package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
  138. package/dist/esm/inbound/services/inbound-delivery-dispatch.backend.service.d.ts +12 -1
  139. package/dist/esm/inbound/services/inbound-delivery-dispatch.backend.service.d.ts.map +1 -1
  140. package/dist/esm/inbound/services/inbound-delivery-dispatch.backend.service.js +23 -4
  141. package/dist/esm/inbound/services/inbound-delivery-dispatch.backend.service.js.map +1 -1
  142. package/dist/esm/inbound/services/inbound-delivery-receiver.backend.service.d.ts +12 -1
  143. package/dist/esm/inbound/services/inbound-delivery-receiver.backend.service.d.ts.map +1 -1
  144. package/dist/esm/inbound/services/inbound-delivery-receiver.backend.service.js +55 -17
  145. package/dist/esm/inbound/services/inbound-delivery-receiver.backend.service.js.map +1 -1
  146. package/dist/esm/inbound/services/inbound-delivery-store.backend.service.d.ts +22 -1
  147. package/dist/esm/inbound/services/inbound-delivery-store.backend.service.d.ts.map +1 -1
  148. package/dist/esm/inbound/services/inbound-delivery-store.backend.service.js +52 -9
  149. package/dist/esm/inbound/services/inbound-delivery-store.backend.service.js.map +1 -1
  150. package/dist/esm/inbound/services/inbound-delivery-stored-body.backend.service.d.ts +79 -0
  151. package/dist/esm/inbound/services/inbound-delivery-stored-body.backend.service.d.ts.map +1 -0
  152. package/dist/esm/inbound/services/inbound-delivery-stored-body.backend.service.js +211 -0
  153. package/dist/esm/inbound/services/inbound-delivery-stored-body.backend.service.js.map +1 -0
  154. package/dist/esm/inbound/services/inbound-delivery-subject-erasure-severance.backend.d.ts +2 -2
  155. package/dist/esm/inbound/services/inbound-delivery-subject-erasure-severance.backend.d.ts.map +1 -1
  156. package/dist/esm/inbound/services/inbound-delivery-subject-erasure-severance.backend.js +9 -1
  157. package/dist/esm/inbound/services/inbound-delivery-subject-erasure-severance.backend.js.map +1 -1
  158. package/dist/esm/index.d.ts +1 -0
  159. package/dist/esm/index.d.ts.map +1 -1
  160. package/dist/esm/index.js +1 -0
  161. package/dist/esm/index.js.map +1 -1
  162. package/dist/esm/inject/models/container.d.ts.map +1 -1
  163. package/dist/esm/inject/models/container.js +6 -0
  164. package/dist/esm/inject/models/container.js.map +1 -1
  165. package/dist/esm/inject/models/service-types.d.ts +5 -0
  166. package/dist/esm/inject/models/service-types.d.ts.map +1 -1
  167. package/dist/esm/inject/models/service-types.js +3 -0
  168. package/dist/esm/inject/models/service-types.js.map +1 -1
  169. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +5 -0
  170. package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
  171. package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
  172. package/dist/esm/monitoring/observability/services/metrics.service.d.ts +34 -1
  173. package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
  174. package/dist/esm/monitoring/observability/services/metrics.service.js +49 -0
  175. package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
  176. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +6 -1
  177. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
  178. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +15 -4
  179. package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
  180. package/dist/esm/notifications/webhooks/outbound/services/m2m-webhook-delivery-log.custom-impl.backend.service.d.ts.map +1 -1
  181. package/dist/esm/notifications/webhooks/outbound/services/m2m-webhook-delivery-log.custom-impl.backend.service.js +3 -1
  182. package/dist/esm/notifications/webhooks/outbound/services/m2m-webhook-delivery-log.custom-impl.backend.service.js.map +1 -1
  183. package/dist/esm/runtime/services/http-server.backend.service.d.ts +3 -1
  184. package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
  185. package/dist/esm/runtime/services/http-server.backend.service.js +11 -3
  186. package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
  187. package/dist/esm/runtime/services/utils/inbound-endpoint-raw-body.backend.utils.d.ts +22 -0
  188. package/dist/esm/runtime/services/utils/inbound-endpoint-raw-body.backend.utils.d.ts.map +1 -1
  189. package/dist/esm/runtime/services/utils/inbound-endpoint-raw-body.backend.utils.js +54 -0
  190. package/dist/esm/runtime/services/utils/inbound-endpoint-raw-body.backend.utils.js.map +1 -1
  191. package/dist/esm/security/authentications/services/auth-methods/auth-password-reset.backend.service.d.ts +51 -0
  192. package/dist/esm/security/authentications/services/auth-methods/auth-password-reset.backend.service.d.ts.map +1 -1
  193. package/dist/esm/security/authentications/services/auth-methods/auth-password-reset.backend.service.js +87 -15
  194. package/dist/esm/security/authentications/services/auth-methods/auth-password-reset.backend.service.js.map +1 -1
  195. package/dist/esm/security/authentications/services/custom-impls/siem-delivery-dlq.custom-impl.backend.service.d.ts.map +1 -1
  196. package/dist/esm/security/authentications/services/custom-impls/siem-delivery-dlq.custom-impl.backend.service.js +5 -2
  197. package/dist/esm/security/authentications/services/custom-impls/siem-delivery-dlq.custom-impl.backend.service.js.map +1 -1
  198. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -1
  199. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +65 -24
  200. package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -1
  201. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +64 -1
  202. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
  203. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +84 -2
  204. package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
  205. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +14 -0
  206. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
  207. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +13 -5
  208. package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
  209. package/dist/esm/users/services/anonymous-consent.custom-impl.backend.service.d.ts.map +1 -1
  210. package/dist/esm/users/services/anonymous-consent.custom-impl.backend.service.js +6 -2
  211. package/dist/esm/users/services/anonymous-consent.custom-impl.backend.service.js.map +1 -1
  212. package/dist/esm/users/services/user-force-password-reset.custom-impl.backend.service.d.ts +7 -0
  213. package/dist/esm/users/services/user-force-password-reset.custom-impl.backend.service.d.ts.map +1 -1
  214. package/dist/esm/users/services/user-force-password-reset.custom-impl.backend.service.js +65 -20
  215. package/dist/esm/users/services/user-force-password-reset.custom-impl.backend.service.js.map +1 -1
  216. package/dist/esm/users/services/user-role-administration.custom-impl.backend.service.d.ts.map +1 -1
  217. package/dist/esm/users/services/user-role-administration.custom-impl.backend.service.js +11 -4
  218. package/dist/esm/users/services/user-role-administration.custom-impl.backend.service.js.map +1 -1
  219. package/dist/esm/users/services/user-self-custom-implementations.backend.d.ts.map +1 -1
  220. package/dist/esm/users/services/user-self-custom-implementations.backend.js +4 -2
  221. package/dist/esm/users/services/user-self-custom-implementations.backend.js.map +1 -1
  222. package/dist/esm/users/services/user-super-admin-floor.custom-impl.backend.service.d.ts.map +1 -1
  223. package/dist/esm/users/services/user-super-admin-floor.custom-impl.backend.service.js +16 -0
  224. package/dist/esm/users/services/user-super-admin-floor.custom-impl.backend.service.js.map +1 -1
  225. package/dist/tsconfig.build.tsbuildinfo +1 -1
  226. package/package.json +10 -10
@@ -41,7 +41,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
41
41
  * unique slot is owed when a caller can race (the send trigger, #2925).
42
42
  */
43
43
  import { createHash, randomBytes } from 'node:crypto';
44
- import { injectable, inject, optional } from 'inversify';
44
+ import { injectable, inject, optional, unmanaged } from 'inversify';
45
45
  import { ApprovalSealStatus, CoreAuditableEventType, CoreResourceType, ErrorCustomMessageReference, ErrorType, HumanDecision_Outcome, SignatureRequest_CancellationReason, SignatureRequest_Event, SignatureRequest_RereadCause, SignatureRequest_State, SignatureRequest_TransitionOutcome, SIGNATURE_REQUEST_TERMINAL_STATES, SortOrder, UserStatus, advanceSignatureRequestState, } from '@wildo-ai/saas-models';
46
46
  import { ElectronicSignature_CancellationOutcome, ElectronicSignature_VendorRequestStatus, } from '@wildo-ai/external-connectors-models';
47
47
  import { SAAS_SERVICE_TYPES } from '../../inject/models/service-types.js';
@@ -49,7 +49,7 @@ import { ElectronicSignatureSendOutcome } from '../../external-providers/service
49
49
  import { describeCaughtError } from '../../errors/utils/error-log-level-classification.backend.utils.js';
50
50
  import { isUniqueConstraintConflict } from '../../errors/utils/unique-conflict-classification.backend.utils.js';
51
51
  import { SignedDocumentVerdict } from './signed-document-validation.backend.js';
52
- import { SignatureRequestEvidenceField } from './signature-request-evidence-files.backend.js';
52
+ import { SIGNATURE_EVIDENCE_LINK_RETRIED, SignatureRequestEvidenceField, SignatureRequestEvidenceLinkOutcome, } from './signature-request-evidence-files.backend.js';
53
53
  /** Why a deliverable was not sent. */
54
54
  export var SignatureRequestSendRefusal;
55
55
  (function (SignatureRequestSendRefusal) {
@@ -72,6 +72,36 @@ export var SignatureRequestSendRefusal;
72
72
  /** The vendor accepted the request and the record could not be written; the request was cancelled at the vendor. */
73
73
  SignatureRequestSendRefusal["RECORD_NOT_WRITTEN"] = "record_not_written";
74
74
  })(SignatureRequestSendRefusal || (SignatureRequestSendRefusal = {}));
75
+ /**
76
+ * Why a request the vendor reported complete was not made SIGNED by its evidence: the label of
77
+ * `signature_request_evidence_refused_total`, and what the re-read's reason explains in words.
78
+ */
79
+ export var SignatureRequestEvidenceFailure;
80
+ (function (SignatureRequestEvidenceFailure) {
81
+ /** No signed-document validator is bound in this runtime. */
82
+ SignatureRequestEvidenceFailure["NO_VALIDATOR"] = "no_validator";
83
+ /** The vendor split the request into several documents; one signed document per request is kept. */
84
+ SignatureRequestEvidenceFailure["SPLIT_REQUEST"] = "split_request";
85
+ /** The provider declares no evidence policy (trust anchors). */
86
+ SignatureRequestEvidenceFailure["NO_EVIDENCE_POLICY"] = "no_evidence_policy";
87
+ /** The signed document could not be downloaded. */
88
+ SignatureRequestEvidenceFailure["DOWNLOAD_FAILED"] = "download_failed";
89
+ /** The document did not validate (tampered, updated after signing, untrusted chain, refused algorithm, revocation). */
90
+ SignatureRequestEvidenceFailure["REJECTED"] = "rejected";
91
+ /** The document validated and proves another signer or a lower level than required: the request FAILS. */
92
+ SignatureRequestEvidenceFailure["MISMATCHED"] = "mismatched";
93
+ /** The document validated and its evidence could not be written: the request stays open and is read again. */
94
+ SignatureRequestEvidenceFailure["NOT_KEPT"] = "not_kept";
95
+ })(SignatureRequestEvidenceFailure || (SignatureRequestEvidenceFailure = {}));
96
+ /**
97
+ * How long after a request became SIGNED the poll keeps linking its evidence files (#2293). Longer than the files
98
+ * cleanup waits before it removes an unlinked file (a day after its scan ended, its default `unlinkedThresholdMs`), so a
99
+ * scan that ends late is still linked; a file the cleanup removed first is reported lost.
100
+ */
101
+ export const SIGNATURE_EVIDENCE_LINK_WINDOW_MS = 48 * 3_600_000;
102
+ /** The SIGNED requests one poll reads, a page at a time, to link their evidence. */
103
+ const SIGNATURE_EVIDENCE_LINK_SCAN_LIMIT = 2_000;
104
+ const SIGNATURE_EVIDENCE_LINK_SCAN_PAGE = 100;
75
105
  /** Why a re-read did not reach the transition function, or did and could not write. */
76
106
  export var SignatureRequestRefreshStop;
77
107
  (function (SignatureRequestRefreshStop) {
@@ -97,7 +127,8 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
97
127
  errorBuilder;
98
128
  evidenceFiles;
99
129
  auditLogs;
100
- constructor(logger, repositories, executionContextCreator, transport, files, validator, errorBuilder, evidenceFiles, auditLogs) {
130
+ metrics;
131
+ constructor(logger, repositories, executionContextCreator, transport, files, validator, errorBuilder, evidenceFiles, auditLogs, metrics, clock) {
101
132
  this.logger = logger;
102
133
  this.repositories = repositories;
103
134
  this.executionContextCreator = executionContextCreator;
@@ -107,7 +138,12 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
107
138
  this.errorBuilder = errorBuilder;
108
139
  this.evidenceFiles = evidenceFiles;
109
140
  this.auditLogs = auditLogs;
141
+ this.metrics = metrics;
142
+ this.clock = clock ?? (() => new Date());
110
143
  }
144
+ clock;
145
+ /** Evidence files already reported lost by this process, so a lost file is logged once rather than every poll. */
146
+ reportedLostEvidence = new Set();
111
147
  /**
112
148
  * The removal effect of `signatureRequests` (#2293), registered at startup with the evidence teardown: before the rows of
113
149
  * requests whose record goes are destroyed, every OPEN one is cancelled at its vendor, and deleted there where its
@@ -157,6 +193,11 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
157
193
  * for the seal's bind check, so the sealed-deliverable gate is marked as that check is.)
158
194
  */
159
195
  async sendForSignature(input) {
196
+ const result = await this.sendOnce(input);
197
+ this.metrics?.recordSignatureRequestSent({ outcome: 'refusal' in result ? result.refusal : ElectronicSignatureSendOutcome.SENT, requiredLevel: input.requiredLevel });
198
+ return result;
199
+ }
200
+ async sendOnce(input) {
160
201
  const refuse = (refusal, reason, retryable = false, signatureRequestId) => ({ sent: false, refusal, reason, retryable, ...(signatureRequestId ? { signatureRequestId } : {}) });
161
202
  const context = await this.executionContextCreator.createForInternalSystemOperation();
162
203
  // 1. The sealed approval, and the file it binds.
@@ -369,8 +410,10 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
369
410
  const statuses = [];
370
411
  for (const reference of references) {
371
412
  const read = await this.transport.read(providerRef, reference);
372
- if (read.read === false)
413
+ if (read.read === false) {
414
+ this.metrics?.recordSignatureRequestVendorNotRead({ providerRef });
373
415
  return { signatureRequestId, outcome: SignatureRequestRefreshStop.NOT_READ, reason: read.reason };
416
+ }
374
417
  statuses.push(read.reading.status);
375
418
  }
376
419
  let event = eventOfVendorStatuses(statuses);
@@ -381,6 +424,8 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
381
424
  event = evidence.event;
382
425
  reason = evidence.reason;
383
426
  validated = evidence.validated;
427
+ if (evidence.failure)
428
+ this.metrics?.recordSignatureRequestEvidenceRefused({ providerRef, failure: evidence.failure });
384
429
  }
385
430
  if (event === undefined)
386
431
  return { signatureRequestId, outcome: SignatureRequest_TransitionOutcome.UNCHANGED, state: current, reason };
@@ -391,8 +436,10 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
391
436
  let kept;
392
437
  if (transition.state === SignatureRequest_State.SIGNED) {
393
438
  const keeping = await this.keepEvidence(row, validated);
394
- if ('reason' in keeping)
439
+ if ('reason' in keeping) {
440
+ this.metrics?.recordSignatureRequestEvidenceRefused({ providerRef, failure: SignatureRequestEvidenceFailure.NOT_KEPT });
395
441
  return { signatureRequestId, outcome: SignatureRequest_TransitionOutcome.UNCHANGED, state: current, event, reason: keeping.reason };
442
+ }
396
443
  kept = keeping;
397
444
  }
398
445
  const now = new Date();
@@ -414,10 +461,12 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
414
461
  return { signatureRequestId, outcome: SignatureRequestRefreshStop.LOST_RACE, reason: 'Another re-read moved the request first.' };
415
462
  }
416
463
  if (kept) {
417
- await this.evidenceFiles?.link(kept.signedDocumentFileId, row, SignatureRequestEvidenceField.SIGNED_DOCUMENT);
418
- await this.evidenceFiles?.link(kept.validationEvidenceFileId, row, SignatureRequestEvidenceField.VALIDATION_EVIDENCE);
464
+ // A file not linkable yet (its scan is in flight) is linked by a later poll (`linkPendingEvidence`), never dropped.
465
+ await this.linkEvidenceFile(kept.signedDocumentFileId, row, SignatureRequestEvidenceField.SIGNED_DOCUMENT);
466
+ await this.linkEvidenceFile(kept.validationEvidenceFileId, row, SignatureRequestEvidenceField.VALIDATION_EVIDENCE);
419
467
  }
420
468
  this.logger.info('[signature-requests] A signature request moved', { signatureRequestId, from: current, to: transition.state, event });
469
+ this.metrics?.recordSignatureRequestMoved({ providerRef, to: transition.state });
421
470
  await this.record({
422
471
  eventType: CoreAuditableEventType.SIGNATURE_REQUEST_MOVED, ...signatureRequestEventFieldsOf(row), from: current, to: transition.state, event,
423
472
  ...(reason ? { reason } : {}),
@@ -440,17 +489,18 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
440
489
  * several references cannot keep its evidence in the request's own fields and is left open (stated, never guessed).
441
490
  */
442
491
  async validateEvidence(row, context) {
492
+ const F = SignatureRequestEvidenceFailure;
443
493
  if (!this.validator) {
444
- return { event: SignatureRequest_Event.EVIDENCE_REJECTED, reason: 'The vendor reports the request complete and no signed-document validator is bound: it stays open.' };
494
+ return { event: SignatureRequest_Event.EVIDENCE_REJECTED, failure: F.NO_VALIDATOR, reason: 'The vendor reports the request complete and no signed-document validator is bound: it stays open.' };
445
495
  }
446
496
  const providerRef = String(row.providerRef);
447
497
  const references = row.vendorReferences;
448
498
  if (references.length !== 1) {
449
- return { event: SignatureRequest_Event.EVIDENCE_REJECTED, reason: `The vendor split the request into ${references.length} documents; one signed document per request is kept, so it stays open.` };
499
+ return { event: SignatureRequest_Event.EVIDENCE_REJECTED, failure: F.SPLIT_REQUEST, reason: `The vendor split the request into ${references.length} documents; one signed document per request is kept, so it stays open.` };
450
500
  }
451
501
  const evidencePolicy = this.transport.evidencePolicyOf?.(providerRef);
452
502
  if (!evidencePolicy)
453
- return { event: SignatureRequest_Event.EVIDENCE_REJECTED, reason: `Provider "${providerRef}" declares no evidence policy (trust anchors): it stays open.` };
503
+ return { event: SignatureRequest_Event.EVIDENCE_REJECTED, failure: F.NO_EVIDENCE_POLICY, reason: `Provider "${providerRef}" declares no evidence policy (trust anchors): it stays open.` };
454
504
  const signers = await this.repositories.findManyForInfrastructure(CoreResourceType.SIGNATURE_REQUEST_SIGNERS, { signatureRequestId: row._id }, context);
455
505
  const expectedSigners = [];
456
506
  for (const signer of signers) {
@@ -465,7 +515,7 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
465
515
  }
466
516
  const download = await this.transport.downloadSignedDocument(providerRef, references[0]);
467
517
  if (download.downloaded === false)
468
- return { event: SignatureRequest_Event.EVIDENCE_REJECTED, reason: download.reason };
518
+ return { event: SignatureRequest_Event.EVIDENCE_REJECTED, failure: F.DOWNLOAD_FAILED, reason: download.reason };
469
519
  const verdict = await this.validator.validate({
470
520
  signedDocument: download.bytes, originalContentSha256: String(row.originalContentSha256), requiredLevel: row.requiredLevel,
471
521
  providerRef, vendorEnvironment: this.transport.vendorEnvironmentOf?.(providerRef), evidencePolicy,
@@ -473,9 +523,9 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
473
523
  expectedSigners,
474
524
  });
475
525
  if (verdict.verdict === SignedDocumentVerdict.MISMATCHED)
476
- return { event: SignatureRequest_Event.EVIDENCE_MISMATCHED, reason: verdict.reason };
526
+ return { event: SignatureRequest_Event.EVIDENCE_MISMATCHED, failure: F.MISMATCHED, reason: verdict.reason };
477
527
  if (verdict.verdict !== SignedDocumentVerdict.VALID)
478
- return { event: SignatureRequest_Event.EVIDENCE_REJECTED, reason: verdict.reason };
528
+ return { event: SignatureRequest_Event.EVIDENCE_REJECTED, failure: F.REJECTED, reason: verdict.reason };
479
529
  // The signers the evidence PROVED: those a validated certificate names. At SIMPLE a vendor's own seal names nobody.
480
530
  const provedEmails = new Set(verdict.evidence.signatures.flatMap((signature) => (signature.signerEmail ? [signature.signerEmail] : [])));
481
531
  return {
@@ -486,6 +536,100 @@ let SignatureRequestsBackendService = class SignatureRequestsBackendService {
486
536
  },
487
537
  };
488
538
  }
539
+ /**
540
+ * Link the evidence files of the requests that became SIGNED in the last {@link SIGNATURE_EVIDENCE_LINK_WINDOW_MS} and
541
+ * are not linked yet (#2293). Run by the poll. A file whose scan has not ended is linked by a later run; one that can
542
+ * never be linked is reported lost, once. Without this, a signed document scanned on write was never linked (its link
543
+ * is refused while it is SCANNING) and the files cleanup removed it a day later. Never throws for one request.
544
+ *
545
+ * Read cost, stated: each run reads every SIGNED request of the window and each of its two files once, a primary-key read
546
+ * per file, up to {@link SIGNATURE_EVIDENCE_LINK_SCAN_LIMIT} requests.
547
+ */
548
+ async linkPendingEvidence() {
549
+ const report = { examined: 0, linked: 0, pending: 0, lost: 0 };
550
+ if (!this.evidenceFiles)
551
+ return report;
552
+ const context = await this.executionContextCreator.createForInternalSystemOperation();
553
+ for await (const row of this.signedInLinkWindow(context)) {
554
+ report.examined += 1;
555
+ for (const field of [SignatureRequestEvidenceField.SIGNED_DOCUMENT, SignatureRequestEvidenceField.VALIDATION_EVIDENCE]) {
556
+ const fileId = row[field]?.fileId;
557
+ if (typeof fileId !== 'string')
558
+ continue;
559
+ let outcome;
560
+ try {
561
+ outcome = await this.linkEvidenceFile(fileId, row, field);
562
+ }
563
+ catch (error) {
564
+ this.logger.warn('[signature-requests] An evidence file could not be linked; the next poll tries again', { signatureRequestId: String(row._id), fileId, error: describeCaughtError(error) });
565
+ report.pending += 1;
566
+ continue;
567
+ }
568
+ if (outcome === SignatureRequestEvidenceLinkOutcome.LINKED)
569
+ report.linked += 1;
570
+ else if (SIGNATURE_EVIDENCE_LINK_RETRIED.has(outcome))
571
+ report.pending += 1;
572
+ else if (outcome === SignatureRequestEvidenceLinkOutcome.LOST)
573
+ report.lost += 1;
574
+ }
575
+ }
576
+ return report;
577
+ }
578
+ /**
579
+ * Link one evidence file and say what happened: a lost file at error (once per process, with its metric), a link left
580
+ * for a later poll at info. Never throws; the port never does.
581
+ */
582
+ async linkEvidenceFile(fileId, row, field) {
583
+ if (!this.evidenceFiles)
584
+ return SignatureRequestEvidenceLinkOutcome.FAILED;
585
+ const outcome = await this.evidenceFiles.link(fileId, row, field);
586
+ if (outcome === SignatureRequestEvidenceLinkOutcome.ALREADY_LINKED)
587
+ return outcome;
588
+ if (outcome === SignatureRequestEvidenceLinkOutcome.LOST) {
589
+ if (this.reportedLostEvidence.has(fileId))
590
+ return outcome;
591
+ if (this.reportedLostEvidence.size < 10_000)
592
+ this.reportedLostEvidence.add(fileId);
593
+ this.logger.error('[signature-requests] A SIGNED request names an evidence file that can never be linked to it (gone, infected, quarantined, failed, or linked elsewhere); its evidence is not kept', {
594
+ signatureRequestId: String(row._id), fileId, field,
595
+ });
596
+ }
597
+ else if (SIGNATURE_EVIDENCE_LINK_RETRIED.has(outcome)) {
598
+ this.logger.info('[signature-requests] An evidence file is not linkable yet (its scan has not ended, or the store did not answer); the poll links it later', {
599
+ signatureRequestId: String(row._id), fileId, field, outcome,
600
+ });
601
+ }
602
+ this.metrics?.recordSignatureRequestEvidenceLink({ outcome });
603
+ return outcome;
604
+ }
605
+ /**
606
+ * The SIGNED requests validated in the link window, oldest first, a page at a time. Pages advance on `validatedAt`, ids
607
+ * already seen skipped, so requests validated in the same instant are not lost between pages (the trigger's paging).
608
+ */
609
+ async *signedInLinkWindow(context) {
610
+ let from = new Date(this.clock().getTime() - SIGNATURE_EVIDENCE_LINK_WINDOW_MS);
611
+ const seen = new Set();
612
+ let pageSize = SIGNATURE_EVIDENCE_LINK_SCAN_PAGE;
613
+ for (let scanned = 0; scanned < SIGNATURE_EVIDENCE_LINK_SCAN_LIMIT;) {
614
+ const page = await this.repositories.findManyForInfrastructure(CoreResourceType.SIGNATURE_REQUESTS, { state: SignatureRequest_State.SIGNED, validatedAt: { $gte: from } }, context, undefined, { sort: [{ field: 'validatedAt', order: SortOrder.ASC }, { field: '_id', order: SortOrder.ASC }], limit: pageSize });
615
+ const fresh = page.filter((row) => !seen.has(String(row._id)));
616
+ if (fresh.length === 0) {
617
+ if (page.length < pageSize || pageSize >= SIGNATURE_EVIDENCE_LINK_SCAN_LIMIT)
618
+ return;
619
+ pageSize = Math.min(pageSize * 2, SIGNATURE_EVIDENCE_LINK_SCAN_LIMIT);
620
+ continue;
621
+ }
622
+ for (const row of fresh) {
623
+ seen.add(String(row._id));
624
+ scanned += 1;
625
+ yield row;
626
+ }
627
+ if (page.length < pageSize)
628
+ return;
629
+ const last = page[page.length - 1].validatedAt;
630
+ from = last instanceof Date ? last : new Date(String(last));
631
+ }
632
+ }
489
633
  /** Write the request's two evidence files, unlinked. A reason when they cannot be kept: the request then stays open. */
490
634
  async keepEvidence(row, validated) {
491
635
  if (!validated)
@@ -538,7 +682,10 @@ SignatureRequestsBackendService = __decorate([
538
682
  __param(7, optional()),
539
683
  __param(8, inject(SAAS_SERVICE_TYPES.AuditLogsService)),
540
684
  __param(8, optional()),
541
- __metadata("design:paramtypes", [Function, Object, Object, Object, Object, Object, Object, Object, Object])
685
+ __param(9, inject(SAAS_SERVICE_TYPES.MetricsService)),
686
+ __param(9, optional()),
687
+ __param(10, unmanaged()),
688
+ __metadata("design:paramtypes", [Function, Object, Object, Object, Object, Object, Object, Object, Object, Object, Function])
542
689
  ], SignatureRequestsBackendService);
543
690
  export { SignatureRequestsBackendService };
544
691
  /** The fields every signature request event names, read from the request row. */