@hotmeshio/long-tail 0.30.2 → 0.30.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 (271) hide show
  1. package/build/api/escalations/accumulate.d.ts +2 -1
  2. package/build/api/escalations/accumulate.js +2 -1
  3. package/build/api/escalations/metadata.d.ts +3 -2
  4. package/build/api/escalations/metadata.js +4 -3
  5. package/build/api/escalations/resolve-batch.d.ts +3 -1
  6. package/build/api/escalations/resolve-batch.js +14 -1
  7. package/build/api/scan-codes/choice.js +3 -2
  8. package/build/api/scan-codes/context.d.ts +6 -0
  9. package/build/api/scan-codes/context.js +10 -1
  10. package/build/api/scan-codes/locate.js +1 -0
  11. package/build/api/scan-codes/subject.js +32 -3
  12. package/build/api/scan-codes/verb-accumulate.js +1 -1
  13. package/build/api/scan-codes/verb-fill.js +2 -1
  14. package/build/api/scan-codes/verb-into-subject.js +1 -1
  15. package/build/api/scan-codes/verbs-subject.js +1 -1
  16. package/build/api/scan-codes/verbs.js +4 -4
  17. package/build/lib/db/schemas/043_scan_pattern_and_member_targets.sql +26 -0
  18. package/build/lib/facet-value.d.ts +3 -0
  19. package/build/lib/facet-value.js +9 -0
  20. package/build/routes/scan-codes.js +3 -0
  21. package/build/sdk/index.d.ts +3 -3
  22. package/build/services/escalation/batch.d.ts +4 -3
  23. package/build/services/escalation/batch.js +5 -3
  24. package/build/services/escalation/claim-asserted.d.ts +2 -1
  25. package/build/services/escalation/crud.d.ts +3 -2
  26. package/build/services/orchestrator/condition.d.ts +6 -0
  27. package/build/services/orchestrator/condition.js +6 -0
  28. package/build/services/scan-code/read.js +3 -0
  29. package/build/services/scan-code/sql.d.ts +3 -3
  30. package/build/services/scan-code/sql.js +19 -8
  31. package/build/services/scan-code/validate-scheme-pattern.d.ts +16 -0
  32. package/build/services/scan-code/validate-scheme-pattern.js +75 -0
  33. package/build/services/scan-code/validate.d.ts +3 -1
  34. package/build/services/scan-code/validate.js +6 -1
  35. package/build/services/scan-code/write.d.ts +3 -0
  36. package/build/services/scan-code/write.js +3 -0
  37. package/build/shared/scan-code/index.d.ts +2 -1
  38. package/build/shared/scan-code/index.js +8 -1
  39. package/build/shared/scan-code/parse.d.ts +22 -1
  40. package/build/shared/scan-code/parse.js +78 -0
  41. package/build/shared/scan-code/target.d.ts +4 -0
  42. package/build/shared/scan-code/target.js +14 -0
  43. package/build/system/mcp-servers/admin/schemas.d.ts +86 -77
  44. package/build/system/mcp-servers/admin/schemas.js +4 -1
  45. package/build/system/seed/tool-manifests-admin.js +1 -1
  46. package/build/tsconfig.tsbuildinfo +1 -1
  47. package/build/types/escalation.d.ts +15 -0
  48. package/build/types/escalation.js +16 -1
  49. package/build/types/facets.d.ts +5 -0
  50. package/build/types/index.d.ts +3 -3
  51. package/build/types/index.js +5 -1
  52. package/build/types/scan-code/constants.d.ts +20 -0
  53. package/build/types/scan-code/constants.js +20 -1
  54. package/build/types/scan-code/response.d.ts +2 -1
  55. package/build/types/scan-code/rule.d.ts +11 -1
  56. package/dashboard/dist/assets/{AdminDashboard-NVtdLI4I.js → AdminDashboard-VQ1fhhJP.js} +2 -2
  57. package/dashboard/dist/assets/{AdminDashboard-NVtdLI4I.js.map → AdminDashboard-VQ1fhhJP.js.map} +1 -1
  58. package/dashboard/dist/assets/{AgentConfigPage-Db1Oi72V.js → AgentConfigPage-BOe_W2Ij.js} +2 -2
  59. package/dashboard/dist/assets/{AgentConfigPage-Db1Oi72V.js.map → AgentConfigPage-BOe_W2Ij.js.map} +1 -1
  60. package/dashboard/dist/assets/{AgentDetailPage-BF4mw1bD.js → AgentDetailPage-5ov5D9V2.js} +2 -2
  61. package/dashboard/dist/assets/{AgentDetailPage-BF4mw1bD.js.map → AgentDetailPage-5ov5D9V2.js.map} +1 -1
  62. package/dashboard/dist/assets/{AgentsPage-DmF0m3Ro.js → AgentsPage-DDFMKHhI.js} +2 -2
  63. package/dashboard/dist/assets/{AgentsPage-DmF0m3Ro.js.map → AgentsPage-DDFMKHhI.js.map} +1 -1
  64. package/dashboard/dist/assets/{AvailableEscalationsPage-jy2WKDjr.js → AvailableEscalationsPage-GFn8Sgg1.js} +2 -2
  65. package/dashboard/dist/assets/{AvailableEscalationsPage-jy2WKDjr.js.map → AvailableEscalationsPage-GFn8Sgg1.js.map} +1 -1
  66. package/dashboard/dist/assets/{BotPicker-HJtVHdNe.js → BotPicker-Dqpo36dM.js} +2 -2
  67. package/dashboard/dist/assets/{BotPicker-HJtVHdNe.js.map → BotPicker-Dqpo36dM.js.map} +1 -1
  68. package/dashboard/dist/assets/{BulkAssignModal-DsJJZ9X4.js → BulkAssignModal-CmLVxkz-.js} +2 -2
  69. package/dashboard/dist/assets/{BulkAssignModal-DsJJZ9X4.js.map → BulkAssignModal-CmLVxkz-.js.map} +1 -1
  70. package/dashboard/dist/assets/{CapabilitiesPage-iCn7PxDP.js → CapabilitiesPage-Dfkip6_b.js} +2 -2
  71. package/dashboard/dist/assets/{CapabilitiesPage-iCn7PxDP.js.map → CapabilitiesPage-Dfkip6_b.js.map} +1 -1
  72. package/dashboard/dist/assets/{CollapsibleSection-DFfVr_Ut.js → CollapsibleSection-CYNYMYSa.js} +2 -2
  73. package/dashboard/dist/assets/{CollapsibleSection-DFfVr_Ut.js.map → CollapsibleSection-CYNYMYSa.js.map} +1 -1
  74. package/dashboard/dist/assets/{ConfirmDeleteModal-D6TwO-yT.js → ConfirmDeleteModal-CpJNP-8w.js} +2 -2
  75. package/dashboard/dist/assets/{ConfirmDeleteModal-D6TwO-yT.js.map → ConfirmDeleteModal-CpJNP-8w.js.map} +1 -1
  76. package/dashboard/dist/assets/{ConnectedAppsPage-BOD-tgY0.js → ConnectedAppsPage-DXIp2Dpl.js} +2 -2
  77. package/dashboard/dist/assets/{ConnectedAppsPage-BOD-tgY0.js.map → ConnectedAppsPage-DXIp2Dpl.js.map} +1 -1
  78. package/dashboard/dist/assets/{CountdownTimer-u_o3OygV.js → CountdownTimer-CuPY7zkb.js} +2 -2
  79. package/dashboard/dist/assets/{CountdownTimer-u_o3OygV.js.map → CountdownTimer-CuPY7zkb.js.map} +1 -1
  80. package/dashboard/dist/assets/{CredentialsPage-C3dnRsMh.js → CredentialsPage-CtrnkHcj.js} +2 -2
  81. package/dashboard/dist/assets/{CredentialsPage-C3dnRsMh.js.map → CredentialsPage-CtrnkHcj.js.map} +1 -1
  82. package/dashboard/dist/assets/{CronLabel-BFh5TCsB.js → CronLabel-DVjTw5Ri.js} +2 -2
  83. package/dashboard/dist/assets/{CronLabel-BFh5TCsB.js.map → CronLabel-DVjTw5Ri.js.map} +1 -1
  84. package/dashboard/dist/assets/{ElapsedCell-D0jYuFKh.js → ElapsedCell-gY_mGMTF.js} +2 -2
  85. package/dashboard/dist/assets/{ElapsedCell-D0jYuFKh.js.map → ElapsedCell-gY_mGMTF.js.map} +1 -1
  86. package/dashboard/dist/assets/{EntityTimelinePanel-Ch-BsRu8.js → EntityTimelinePanel-DJN_ZEQa.js} +2 -2
  87. package/dashboard/dist/assets/{EntityTimelinePanel-Ch-BsRu8.js.map → EntityTimelinePanel-DJN_ZEQa.js.map} +1 -1
  88. package/dashboard/dist/assets/{EscalationListSchemaPage-DuSLiInU.js → EscalationListSchemaPage-A4KpTdJA.js} +3 -3
  89. package/dashboard/dist/assets/{EscalationListSchemaPage-DuSLiInU.js.map → EscalationListSchemaPage-A4KpTdJA.js.map} +1 -1
  90. package/dashboard/dist/assets/{EscalationSchemaPage-D_mYri6e.js → EscalationSchemaPage-nfCn42hT.js} +2 -2
  91. package/dashboard/dist/assets/{EscalationSchemaPage-D_mYri6e.js.map → EscalationSchemaPage-nfCn42hT.js.map} +1 -1
  92. package/dashboard/dist/assets/{EscalationTimeline-DiN8ImWF.js → EscalationTimeline-CLvSr1SD.js} +2 -2
  93. package/dashboard/dist/assets/{EscalationTimeline-DiN8ImWF.js.map → EscalationTimeline-CLvSr1SD.js.map} +1 -1
  94. package/dashboard/dist/assets/{EscalationTitleSelect-36tkc2TE.js → EscalationTitleSelect-CT7mYHkb.js} +2 -2
  95. package/dashboard/dist/assets/{EscalationTitleSelect-36tkc2TE.js.map → EscalationTitleSelect-CT7mYHkb.js.map} +1 -1
  96. package/dashboard/dist/assets/{EscalationsOverview-yHY6JKiV.js → EscalationsOverview-CKaGRh-E.js} +2 -2
  97. package/dashboard/dist/assets/{EscalationsOverview-yHY6JKiV.js.map → EscalationsOverview-CKaGRh-E.js.map} +1 -1
  98. package/dashboard/dist/assets/{EventTable-DTtu2iM_.js → EventTable-2ywJsOLy.js} +2 -2
  99. package/dashboard/dist/assets/{EventTable-DTtu2iM_.js.map → EventTable-2ywJsOLy.js.map} +1 -1
  100. package/dashboard/dist/assets/{FilterBar-ByZiD0ty.js → FilterBar-Dy0b7wwf.js} +2 -2
  101. package/dashboard/dist/assets/{FilterBar-ByZiD0ty.js.map → FilterBar-Dy0b7wwf.js.map} +1 -1
  102. package/dashboard/dist/assets/{GraphInvokePage-Cbn6igr_.js → GraphInvokePage-yOVpraAy.js} +2 -2
  103. package/dashboard/dist/assets/{GraphInvokePage-Cbn6igr_.js.map → GraphInvokePage-yOVpraAy.js.map} +1 -1
  104. package/dashboard/dist/assets/{HomePage-CtLKm_S4.js → HomePage-67xXjKjN.js} +2 -2
  105. package/dashboard/dist/assets/{HomePage-CtLKm_S4.js.map → HomePage-67xXjKjN.js.map} +1 -1
  106. package/dashboard/dist/assets/{LinePage-Q5Cgjd3N.js → LinePage-CMsYtukW.js} +3 -3
  107. package/dashboard/dist/assets/{LinePage-Q5Cgjd3N.js.map → LinePage-CMsYtukW.js.map} +1 -1
  108. package/dashboard/dist/assets/{LinesPage-BX3d-rj0.js → LinesPage-pwL46mOS.js} +3 -3
  109. package/dashboard/dist/assets/{LinesPage-BX3d-rj0.js.map → LinesPage-pwL46mOS.js.map} +1 -1
  110. package/dashboard/dist/assets/{ListToolbar-bj2sgAK4.js → ListToolbar-CJmvGy2B.js} +2 -2
  111. package/dashboard/dist/assets/{ListToolbar-bj2sgAK4.js.map → ListToolbar-CJmvGy2B.js.map} +1 -1
  112. package/dashboard/dist/assets/{McpOverview-BD3UWbcC.js → McpOverview-DA9LLvNG.js} +2 -2
  113. package/dashboard/dist/assets/{McpOverview-BD3UWbcC.js.map → McpOverview-DA9LLvNG.js.map} +1 -1
  114. package/dashboard/dist/assets/{McpQueryDetailPage-ISzY-BfT.js → McpQueryDetailPage-N7qLmfE8.js} +2 -2
  115. package/dashboard/dist/assets/{McpQueryDetailPage-ISzY-BfT.js.map → McpQueryDetailPage-N7qLmfE8.js.map} +1 -1
  116. package/dashboard/dist/assets/{McpQueryPage-t555QJ3m.js → McpQueryPage-CpsP3w7x.js} +2 -2
  117. package/dashboard/dist/assets/{McpQueryPage-t555QJ3m.js.map → McpQueryPage-CpsP3w7x.js.map} +1 -1
  118. package/dashboard/dist/assets/{McpRunDetailPage-C4jozQFh.js → McpRunDetailPage-qHRQ1pEY.js} +2 -2
  119. package/dashboard/dist/assets/{McpRunDetailPage-C4jozQFh.js.map → McpRunDetailPage-qHRQ1pEY.js.map} +1 -1
  120. package/dashboard/dist/assets/{McpRunsPage-Z-mtyRBp.js → McpRunsPage-BRDDYpTM.js} +2 -2
  121. package/dashboard/dist/assets/{McpRunsPage-Z-mtyRBp.js.map → McpRunsPage-BRDDYpTM.js.map} +1 -1
  122. package/dashboard/dist/assets/{OperationsPage-ClYilVyZ.js → OperationsPage-zUaab-CL.js} +3 -3
  123. package/dashboard/dist/assets/{OperationsPage-ClYilVyZ.js.map → OperationsPage-zUaab-CL.js.map} +1 -1
  124. package/dashboard/dist/assets/{OperatorDashboard-3Hi2IiHi.js → OperatorDashboard-el5BquXN.js} +2 -2
  125. package/dashboard/dist/assets/{OperatorDashboard-3Hi2IiHi.js.map → OperatorDashboard-el5BquXN.js.map} +1 -1
  126. package/dashboard/dist/assets/{PersonaDetailPage-xb7O3tn9.js → PersonaDetailPage-B_tb8gfl.js} +2 -2
  127. package/dashboard/dist/assets/{PersonaDetailPage-xb7O3tn9.js.map → PersonaDetailPage-B_tb8gfl.js.map} +1 -1
  128. package/dashboard/dist/assets/{PersonasPage-uCYVhRBB.js → PersonasPage-BPI7mqM8.js} +2 -2
  129. package/dashboard/dist/assets/{PersonasPage-uCYVhRBB.js.map → PersonasPage-BPI7mqM8.js.map} +1 -1
  130. package/dashboard/dist/assets/{PortalPage-D1MOMJ9Q.js → PortalPage-e_rBb1do.js} +2 -2
  131. package/dashboard/dist/assets/{PortalPage-D1MOMJ9Q.js.map → PortalPage-e_rBb1do.js.map} +1 -1
  132. package/dashboard/dist/assets/{ProcessDetailPage-Tf8FQCUm.js → ProcessDetailPage-D35RX1bB.js} +2 -2
  133. package/dashboard/dist/assets/{ProcessDetailPage-Tf8FQCUm.js.map → ProcessDetailPage-D35RX1bB.js.map} +1 -1
  134. package/dashboard/dist/assets/{ProcessesListPage-DPLRgznC.js → ProcessesListPage-CT81miI5.js} +2 -2
  135. package/dashboard/dist/assets/{ProcessesListPage-DPLRgznC.js.map → ProcessesListPage-CT81miI5.js.map} +1 -1
  136. package/dashboard/dist/assets/{ResolverForm-BXqJEPte.js → ResolverForm-BxJkoKAO.js} +2 -2
  137. package/dashboard/dist/assets/{ResolverForm-BXqJEPte.js.map → ResolverForm-BxJkoKAO.js.map} +1 -1
  138. package/dashboard/dist/assets/{RoleDetailPage-KJnZGPPY.js → RoleDetailPage-DtU7vsJm.js} +2 -2
  139. package/dashboard/dist/assets/{RoleDetailPage-KJnZGPPY.js.map → RoleDetailPage-DtU7vsJm.js.map} +1 -1
  140. package/dashboard/dist/assets/{RolesPage-C5f-3zcs.js → RolesPage-BE7RWt9q.js} +2 -2
  141. package/dashboard/dist/assets/{RolesPage-C5f-3zcs.js.map → RolesPage-BE7RWt9q.js.map} +1 -1
  142. package/dashboard/dist/assets/{RosterWidget-WCtpUEzc.js → RosterWidget-BJMx0a8Z.js} +2 -2
  143. package/dashboard/dist/assets/{RosterWidget-WCtpUEzc.js.map → RosterWidget-BJMx0a8Z.js.map} +1 -1
  144. package/dashboard/dist/assets/{RunAsSelector-CzabsFYU.js → RunAsSelector-Co6s9bqA.js} +2 -2
  145. package/dashboard/dist/assets/{RunAsSelector-CzabsFYU.js.map → RunAsSelector-Co6s9bqA.js.map} +1 -1
  146. package/dashboard/dist/assets/ScanCodesPage-C2TETaj5.js +2 -0
  147. package/dashboard/dist/assets/ScanCodesPage-C2TETaj5.js.map +1 -0
  148. package/dashboard/dist/assets/ScanSchemeDetailPage-C2UgU8l-.js +5 -0
  149. package/dashboard/dist/assets/ScanSchemeDetailPage-C2UgU8l-.js.map +1 -0
  150. package/dashboard/dist/assets/ScanStationPage-nWYz-OD3.js +2 -0
  151. package/dashboard/dist/assets/ScanStationPage-nWYz-OD3.js.map +1 -0
  152. package/dashboard/dist/assets/SchemeMatchFields-9H7SmbED.js +4 -0
  153. package/dashboard/dist/assets/SchemeMatchFields-9H7SmbED.js.map +1 -0
  154. package/dashboard/dist/assets/{StickyPagination-C2fzclxr.js → StickyPagination-miUdVAKw.js} +2 -2
  155. package/dashboard/dist/assets/{StickyPagination-C2fzclxr.js.map → StickyPagination-miUdVAKw.js.map} +1 -1
  156. package/dashboard/dist/assets/{StreamMessageDetail-wF4NM8gi.js → StreamMessageDetail-D5Rk7pn7.js} +2 -2
  157. package/dashboard/dist/assets/{StreamMessageDetail-wF4NM8gi.js.map → StreamMessageDetail-D5Rk7pn7.js.map} +1 -1
  158. package/dashboard/dist/assets/{SwimlaneTimeline-B4Hg97qO.js → SwimlaneTimeline-B1QY1ZzH.js} +2 -2
  159. package/dashboard/dist/assets/{SwimlaneTimeline-B4Hg97qO.js.map → SwimlaneTimeline-B1QY1ZzH.js.map} +1 -1
  160. package/dashboard/dist/assets/{TaskDetailPage-DAxxcFDD.js → TaskDetailPage-DKUM37o8.js} +2 -2
  161. package/dashboard/dist/assets/{TaskDetailPage-DAxxcFDD.js.map → TaskDetailPage-DKUM37o8.js.map} +1 -1
  162. package/dashboard/dist/assets/{TasksListPage-BmghuHbc.js → TasksListPage-CUulwvm-.js} +2 -2
  163. package/dashboard/dist/assets/{TasksListPage-BmghuHbc.js.map → TasksListPage-CUulwvm-.js.map} +1 -1
  164. package/dashboard/dist/assets/{TimeAgo-CFeB6U2O.js → TimeAgo-CHTelacB.js} +2 -2
  165. package/dashboard/dist/assets/{TimeAgo-CFeB6U2O.js.map → TimeAgo-CHTelacB.js.map} +1 -1
  166. package/dashboard/dist/assets/{TimestampCell-M_FD9JEc.js → TimestampCell-NanLWLKo.js} +2 -2
  167. package/dashboard/dist/assets/{TimestampCell-M_FD9JEc.js.map → TimestampCell-NanLWLKo.js.map} +1 -1
  168. package/dashboard/dist/assets/{ToolTestPanel-D7PihZG9.js → ToolTestPanel-CF1CHzgz.js} +2 -2
  169. package/dashboard/dist/assets/{ToolTestPanel-D7PihZG9.js.map → ToolTestPanel-CF1CHzgz.js.map} +1 -1
  170. package/dashboard/dist/assets/{TopicDetailPage-T0dLt7Ao.js → TopicDetailPage-CGO8XV_a.js} +2 -2
  171. package/dashboard/dist/assets/{TopicDetailPage-T0dLt7Ao.js.map → TopicDetailPage-CGO8XV_a.js.map} +1 -1
  172. package/dashboard/dist/assets/{TopicsPage-DP5ox5oX.js → TopicsPage-Bt8gOKYr.js} +2 -2
  173. package/dashboard/dist/assets/{TopicsPage-DP5ox5oX.js.map → TopicsPage-Bt8gOKYr.js.map} +1 -1
  174. package/dashboard/dist/assets/{UserName-ET3r3u-A.js → UserName-DKXnK7DD.js} +2 -2
  175. package/dashboard/dist/assets/{UserName-ET3r3u-A.js.map → UserName-DKXnK7DD.js.map} +1 -1
  176. package/dashboard/dist/assets/{WorkflowExecutionPage-DBq2lZ_C.js → WorkflowExecutionPage-Crf7AIFc.js} +2 -2
  177. package/dashboard/dist/assets/{WorkflowExecutionPage-DBq2lZ_C.js.map → WorkflowExecutionPage-Crf7AIFc.js.map} +1 -1
  178. package/dashboard/dist/assets/{WorkflowsDashboard-WO4cH8sU.js → WorkflowsDashboard--isjt06C.js} +2 -2
  179. package/dashboard/dist/assets/{WorkflowsDashboard-WO4cH8sU.js.map → WorkflowsDashboard--isjt06C.js.map} +1 -1
  180. package/dashboard/dist/assets/{WorkflowsOverview-CJfg0rQH.js → WorkflowsOverview-D7Oqf4-V.js} +2 -2
  181. package/dashboard/dist/assets/{WorkflowsOverview-CJfg0rQH.js.map → WorkflowsOverview-D7Oqf4-V.js.map} +1 -1
  182. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C8rkvYCp.js → YamlWorkflowDetailPage-B0wxgrGP.js} +8 -8
  183. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C8rkvYCp.js.map → YamlWorkflowDetailPage-B0wxgrGP.js.map} +1 -1
  184. package/dashboard/dist/assets/{YamlWorkflowsPage-DHQ4ZVzM.js → YamlWorkflowsPage-BVdLnm6K.js} +2 -2
  185. package/dashboard/dist/assets/{YamlWorkflowsPage-DHQ4ZVzM.js.map → YamlWorkflowsPage-BVdLnm6K.js.map} +1 -1
  186. package/dashboard/dist/assets/{agents-zulmHig2.js → agents-CHjbjHXA.js} +2 -2
  187. package/dashboard/dist/assets/{agents-zulmHig2.js.map → agents-CHjbjHXA.js.map} +1 -1
  188. package/dashboard/dist/assets/{bots-D4mtcPHB.js → bots-WrUhEPWs.js} +2 -2
  189. package/dashboard/dist/assets/{bots-D4mtcPHB.js.map → bots-WrUhEPWs.js.map} +1 -1
  190. package/dashboard/dist/assets/{capabilities-rFZDH0zF.js → capabilities-CunMmkj8.js} +2 -2
  191. package/dashboard/dist/assets/{capabilities-rFZDH0zF.js.map → capabilities-CunMmkj8.js.map} +1 -1
  192. package/dashboard/dist/assets/{controlplane-INfcW_9F.js → controlplane-D6IZIZoh.js} +2 -2
  193. package/dashboard/dist/assets/{controlplane-INfcW_9F.js.map → controlplane-D6IZIZoh.js.map} +1 -1
  194. package/dashboard/dist/assets/{escalation-columns-8ker-czW.js → escalation-columns-Bvo6JI4Z.js} +2 -2
  195. package/dashboard/dist/assets/{escalation-columns-8ker-czW.js.map → escalation-columns-Bvo6JI4Z.js.map} +1 -1
  196. package/dashboard/dist/assets/{escalation-items-B6eDMoTN.js → escalation-items-DFGRwo49.js} +2 -2
  197. package/dashboard/dist/assets/{escalation-items-B6eDMoTN.js.map → escalation-items-DFGRwo49.js.map} +1 -1
  198. package/dashboard/dist/assets/{index-Cfg4TFDb.js → index-B8qrHwp9.js} +2 -2
  199. package/dashboard/dist/assets/{index-Cfg4TFDb.js.map → index-B8qrHwp9.js.map} +1 -1
  200. package/dashboard/dist/assets/{index-D-Fd0gQ_.js → index-B95LbYhW.js} +2 -2
  201. package/dashboard/dist/assets/{index-D-Fd0gQ_.js.map → index-B95LbYhW.js.map} +1 -1
  202. package/dashboard/dist/assets/{index-BpillEP7.js → index-BZFSXEkr.js} +2 -2
  203. package/dashboard/dist/assets/{index-BpillEP7.js.map → index-BZFSXEkr.js.map} +1 -1
  204. package/dashboard/dist/assets/index-BmzscsXK.css +1 -0
  205. package/dashboard/dist/assets/{index-ChF-l2z9.js → index-Bo8QU31k.js} +2 -2
  206. package/dashboard/dist/assets/{index-ChF-l2z9.js.map → index-Bo8QU31k.js.map} +1 -1
  207. package/dashboard/dist/assets/{index-0LXkjZjt.js → index-C7EIu1mG.js} +2 -2
  208. package/dashboard/dist/assets/{index-0LXkjZjt.js.map → index-C7EIu1mG.js.map} +1 -1
  209. package/dashboard/dist/assets/{index-Cm6_Peh7.js → index-CpCchhQv.js} +2 -2
  210. package/dashboard/dist/assets/{index-Cm6_Peh7.js.map → index-CpCchhQv.js.map} +1 -1
  211. package/dashboard/dist/assets/{index-5XUBZtlv.js → index-DCJ483vt.js} +2 -2
  212. package/dashboard/dist/assets/{index-5XUBZtlv.js.map → index-DCJ483vt.js.map} +1 -1
  213. package/dashboard/dist/assets/{index-BcVkiaCv.js → index-DRK7M1_9.js} +2 -2
  214. package/dashboard/dist/assets/{index-BcVkiaCv.js.map → index-DRK7M1_9.js.map} +1 -1
  215. package/dashboard/dist/assets/{index-D-EVgGsm.js → index-DRw0FXdX.js} +2 -2
  216. package/dashboard/dist/assets/{index-D-EVgGsm.js.map → index-DRw0FXdX.js.map} +1 -1
  217. package/dashboard/dist/assets/{index-CV7KmPdF.js → index-OuKQ_0eB.js} +2 -2
  218. package/dashboard/dist/assets/{index-CV7KmPdF.js.map → index-OuKQ_0eB.js.map} +1 -1
  219. package/dashboard/dist/assets/index-P-DlgAWj.js +3 -0
  220. package/dashboard/dist/assets/index-P-DlgAWj.js.map +1 -0
  221. package/dashboard/dist/assets/{index-Cg9W61lM.js → index-boT612Jo.js} +2 -2
  222. package/dashboard/dist/assets/{index-Cg9W61lM.js.map → index-boT612Jo.js.map} +1 -1
  223. package/dashboard/dist/assets/index-ygxyAKcc.js +67 -0
  224. package/dashboard/dist/assets/index-ygxyAKcc.js.map +1 -0
  225. package/dashboard/dist/assets/{knowledge-_WaBsrbC.js → knowledge-BubJBTwg.js} +2 -2
  226. package/dashboard/dist/assets/{knowledge-_WaBsrbC.js.map → knowledge-BubJBTwg.js.map} +1 -1
  227. package/dashboard/dist/assets/{machines-D6ig2Q8z.js → machines-DSm5NFgs.js} +2 -2
  228. package/dashboard/dist/assets/{machines-D6ig2Q8z.js.map → machines-DSm5NFgs.js.map} +1 -1
  229. package/dashboard/dist/assets/{mcp-DtWRQM1G.js → mcp-D6MckqOV.js} +2 -2
  230. package/dashboard/dist/assets/{mcp-DtWRQM1G.js.map → mcp-D6MckqOV.js.map} +1 -1
  231. package/dashboard/dist/assets/{mcp-query-vQm92kTd.js → mcp-query-VyCdOag6.js} +2 -2
  232. package/dashboard/dist/assets/{mcp-query-vQm92kTd.js.map → mcp-query-VyCdOag6.js.map} +1 -1
  233. package/dashboard/dist/assets/{personas-BLxQpGNz.js → personas-CyJc10xe.js} +2 -2
  234. package/dashboard/dist/assets/{personas-BLxQpGNz.js.map → personas-CyJc10xe.js.map} +1 -1
  235. package/dashboard/dist/assets/{pipelines-ClmRtlkR.js → pipelines-B2inDtx3.js} +2 -2
  236. package/dashboard/dist/assets/{pipelines-ClmRtlkR.js.map → pipelines-B2inDtx3.js.map} +1 -1
  237. package/dashboard/dist/assets/{tasks-CVZT1pf0.js → tasks-DOP4d3M6.js} +2 -2
  238. package/dashboard/dist/assets/{tasks-CVZT1pf0.js.map → tasks-DOP4d3M6.js.map} +1 -1
  239. package/dashboard/dist/assets/{topics-rkG9-6El.js → topics-CNOjSWpX.js} +2 -2
  240. package/dashboard/dist/assets/{topics-rkG9-6El.js.map → topics-CNOjSWpX.js.map} +1 -1
  241. package/dashboard/dist/assets/{useDebouncedValue-D2aCC74y.js → useDebouncedValue-CgO0TGMd.js} +2 -2
  242. package/dashboard/dist/assets/{useDebouncedValue-D2aCC74y.js.map → useDebouncedValue-CgO0TGMd.js.map} +1 -1
  243. package/dashboard/dist/assets/{useNamespace-BGfkF4ej.js → useNamespace-BWHvUKtK.js} +2 -2
  244. package/dashboard/dist/assets/{useNamespace-BGfkF4ej.js.map → useNamespace-BWHvUKtK.js.map} +1 -1
  245. package/dashboard/dist/assets/{useYamlActivityEvents-DOU0_nfZ.js → useYamlActivityEvents-BZQ__ZGD.js} +2 -2
  246. package/dashboard/dist/assets/{useYamlActivityEvents-DOU0_nfZ.js.map → useYamlActivityEvents-BZQ__ZGD.js.map} +1 -1
  247. package/dashboard/dist/assets/{validate-bHZ917pZ.js → validate-CAin6WM_.js} +2 -2
  248. package/dashboard/dist/assets/{validate-bHZ917pZ.js.map → validate-CAin6WM_.js.map} +1 -1
  249. package/dashboard/dist/assets/{yaml-workflows-S7qlgdg6.js → yaml-workflows-Dyln3od-.js} +2 -2
  250. package/dashboard/dist/assets/{yaml-workflows-S7qlgdg6.js.map → yaml-workflows-Dyln3od-.js.map} +1 -1
  251. package/dashboard/dist/index.html +2 -2
  252. package/docs/accumulator.md +1 -1
  253. package/docs/api/http/escalations.md +1 -1
  254. package/docs/api/sdk/escalations.md +1 -1
  255. package/docs/dashboard.md +3 -1
  256. package/docs/hitl/escalation.md +16 -0
  257. package/docs/scan-codes.md +28 -9
  258. package/package.json +2 -2
  259. package/dashboard/dist/assets/GrantScopeField-BzWGzBfA.js +0 -2
  260. package/dashboard/dist/assets/GrantScopeField-BzWGzBfA.js.map +0 -1
  261. package/dashboard/dist/assets/ScanCodesPage-D51d17HH.js +0 -2
  262. package/dashboard/dist/assets/ScanCodesPage-D51d17HH.js.map +0 -1
  263. package/dashboard/dist/assets/ScanSchemeDetailPage-CUK6Skxj.js +0 -2
  264. package/dashboard/dist/assets/ScanSchemeDetailPage-CUK6Skxj.js.map +0 -1
  265. package/dashboard/dist/assets/ScanStationPage-7vK0ddiV.js +0 -2
  266. package/dashboard/dist/assets/ScanStationPage-7vK0ddiV.js.map +0 -1
  267. package/dashboard/dist/assets/index-BpJ77OST.js +0 -3
  268. package/dashboard/dist/assets/index-BpJ77OST.js.map +0 -1
  269. package/dashboard/dist/assets/index-C_dp4WgY.css +0 -1
  270. package/dashboard/dist/assets/index-xycFf66M.js +0 -67
  271. package/dashboard/dist/assets/index-xycFf66M.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import type { AccumulatedItem, ContainerSelector, LTEscalationRecord } from '../../types';
2
2
  import type { LTApiAuth, LTApiResult } from '../../types/sdk';
3
+ import type { FacetValue } from '../../types/facets';
3
4
  /** Names the second row of a reciprocal add or removal. Exactly one selector. */
4
5
  export interface ReciprocalInput {
5
6
  id?: string;
@@ -62,7 +63,7 @@ export declare function accumulateItemBySignalKey(input: {
62
63
  */
63
64
  export declare function accumulateItemByMetadata(input: {
64
65
  key: string;
65
- value: string;
66
+ value: FacetValue;
66
67
  restrictRoles?: string[];
67
68
  /** Narrows the container beyond the facet: type, subtype, extra facet guards. */
68
69
  container?: ContainerSelector;
@@ -51,6 +51,7 @@ const escalation_1 = require("../../types/escalation");
51
51
  const helpers_1 = require("./helpers");
52
52
  const resolve_1 = require("./resolve");
53
53
  const metadata_1 = require("./metadata");
54
+ const facet_value_1 = require("../../lib/facet-value");
54
55
  function parseEnvelope(escalation) {
55
56
  try {
56
57
  const parsed = JSON.parse(escalation.envelope || '{}');
@@ -317,7 +318,7 @@ async function accumulateItemBySignalKey(input, auth) {
317
318
  async function accumulateItemByMetadata(input, auth) {
318
319
  try {
319
320
  const { key, value, itemKey, metadata } = input;
320
- if (!key || !value)
321
+ if (!key || !(0, facet_value_1.hasFacetValue)(value))
321
322
  return { status: 400, error: 'key and value are required' };
322
323
  const keyError = itemKeyError(itemKey);
323
324
  if (keyError)
@@ -1,6 +1,7 @@
1
1
  import { type ProvisionIfAbsent } from './helpers';
2
2
  import type { LTApiAuth, LTApiResult } from '../../types/sdk';
3
3
  import type { ScanAvailability } from '../../types';
4
+ import type { FacetValue } from '../../types/facets';
4
5
  /**
5
6
  * Intersect the caller's scope roles with an optional caller-supplied
6
7
  * restriction (e.g. a scan step's expected queues). Global scope with no
@@ -31,7 +32,7 @@ export declare function findByMetadata(input: {
31
32
  */
32
33
  export declare function claimByMetadata(input: {
33
34
  key: string;
34
- value: string;
35
+ value: FacetValue;
35
36
  durationMinutes?: number;
36
37
  assignee?: string;
37
38
  metadata?: Record<string, any>;
@@ -54,7 +55,7 @@ export declare function claimByMetadata(input: {
54
55
  */
55
56
  export declare function resolveByMetadata(input: {
56
57
  key: string;
57
- value: string;
58
+ value: FacetValue;
58
59
  resolverPayload: Record<string, any>;
59
60
  assignee?: string;
60
61
  metadata?: Record<string, any>;
@@ -43,6 +43,7 @@ const resolver_validation_1 = require("../../services/escalation/resolver-valida
43
43
  const enforcement_cache_1 = require("../../services/role/enforcement-cache");
44
44
  const resolve_1 = require("./resolve");
45
45
  const uuid_1 = require("../../lib/uuid");
46
+ const facet_value_1 = require("../../lib/facet-value");
46
47
  /**
47
48
  * Intersect the caller's scope roles with an optional caller-supplied
48
49
  * restriction (e.g. a scan step's expected queues). Global scope with no
@@ -65,7 +66,7 @@ function restrictScopeRoles(scopeRoles, global, restrictRoles) {
65
66
  */
66
67
  async function findByMetadata(input, auth) {
67
68
  try {
68
- if (!input.key || !input.value) {
69
+ if (!input.key || !(0, facet_value_1.hasFacetValue)(input.value)) {
69
70
  return { status: 400, error: 'key and value are required' };
70
71
  }
71
72
  // RBAC scoped IN SQL: the caller's read scope (read_all roles see every match;
@@ -94,7 +95,7 @@ async function findByMetadata(input, auth) {
94
95
  */
95
96
  async function claimByMetadata(input, auth) {
96
97
  try {
97
- if (!input.key || !input.value) {
98
+ if (!input.key || !(0, facet_value_1.hasFacetValue)(input.value)) {
98
99
  return { status: 400, error: 'key and value are required' };
99
100
  }
100
101
  if (input.assertId !== undefined && !(0, uuid_1.isUuid)(input.assertId)) {
@@ -145,7 +146,7 @@ async function claimByMetadata(input, auth) {
145
146
  */
146
147
  async function resolveByMetadata(input, auth) {
147
148
  try {
148
- if (!input.key || !input.value) {
149
+ if (!input.key || !(0, facet_value_1.hasFacetValue)(input.value)) {
149
150
  return { status: 400, error: 'key and value are required' };
150
151
  }
151
152
  if (!input.resolverPayload) {
@@ -4,7 +4,9 @@ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
4
4
  * with `batch: [...]`). Interim submissions are cheap atomic fills — the row
5
5
  * stays pending and `remaining` reports progress. The LAST item completes the
6
6
  * escalation: the row resolves and the waiting workflow wakes with the full
7
- * collection, in the same statement.
7
+ * collection, in the same statement. On a wait that declared `wakeOnFill` for
8
+ * this key, the fill resolves the row early and the workflow wakes with the
9
+ * items so far (`outcome: 'woke'`, `remaining` > 0).
8
10
  *
9
11
  * Each item validates against the SAME versioned form schema a single-item
10
12
  * resolver gets (metadata.form_schema → pinned lt_role_schemas → live role
@@ -48,7 +48,9 @@ const metadata_1 = require("./metadata");
48
48
  * with `batch: [...]`). Interim submissions are cheap atomic fills — the row
49
49
  * stays pending and `remaining` reports progress. The LAST item completes the
50
50
  * escalation: the row resolves and the waiting workflow wakes with the full
51
- * collection, in the same statement.
51
+ * collection, in the same statement. On a wait that declared `wakeOnFill` for
52
+ * this key, the fill resolves the row early and the workflow wakes with the
53
+ * items so far (`outcome: 'woke'`, `remaining` > 0).
52
54
  *
53
55
  * Each item validates against the SAME versioned form schema a single-item
54
56
  * resolver gets (metadata.form_schema → pinned lt_role_schemas → live role
@@ -228,6 +230,17 @@ function batchOutcomeResult(result, itemKey, workflowId) {
228
230
  escalationId: result.escalation?.id,
229
231
  },
230
232
  };
233
+ case escalation_1.BATCH_ITEM_OUTCOMES.WOKE:
234
+ return {
235
+ status: 200,
236
+ data: {
237
+ outcome: escalation_1.BATCH_ITEM_OUTCOMES.WOKE,
238
+ remaining: result.remaining,
239
+ signaled: !!result.escalation?.signal_key,
240
+ escalationId: result.escalation?.id,
241
+ workflowId,
242
+ },
243
+ };
231
244
  case 'duplicate-item':
232
245
  return {
233
246
  status: 409,
@@ -41,6 +41,7 @@ const identity_1 = require("./identity");
41
41
  const grant_1 = require("./grant");
42
42
  const helpers_1 = require("../escalations/helpers");
43
43
  const context_1 = require("./context");
44
+ const scan_code_1 = require("../../shared/scan-code");
44
45
  const present_1 = require("./present");
45
46
  const choice_roles_1 = require("./choice-roles");
46
47
  const x_lt_actions_1 = require("../../shared/form-validation/x-lt-actions");
@@ -109,8 +110,8 @@ async function executeScanChoice(input, auth) {
109
110
  return stampPointer((0, context_1.conflict)('the item is no longer in the presented state'), rule, input);
110
111
  }
111
112
  const row = loaded;
112
- const target = row?.metadata?.[scheme.target_facet];
113
- if (!row || typeof target !== 'string' || !target) {
113
+ const target = (0, scan_code_1.facetTarget)(row?.metadata?.[scheme.target_facet]);
114
+ if (!row || !target) {
114
115
  return {
115
116
  status: 200,
116
117
  data: { outcome: types_1.SCAN_OUTCOMES.UNCONFIGURED, error: `escalation does not carry the scheme facet "${scheme.target_facet}"` },
@@ -44,6 +44,12 @@ export interface StepContext {
44
44
  subjectStale?: boolean;
45
45
  }
46
46
  export declare function targetFilter(step: ScanStep, ctx: StepContext): Record<string, any>;
47
+ /**
48
+ * The value the target facet contains on a matching row: the target, or a
49
+ * one-item list when the scheme's facet holds a list (`metadata @>` then
50
+ * matches membership).
51
+ */
52
+ export declare function targetValue(ctx: Pick<StepContext, 'scheme' | 'parsed'>): string | string[];
47
53
  export declare function templateContext(ctx: StepContext): scanCodeService.ScanTemplateContext;
48
54
  /** The `{subject.x}` bag: the held row's metadata plus its id. */
49
55
  export declare function subjectBag(row: LTEscalationRecord): Record<string, unknown>;
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.targetFilter = targetFilter;
37
+ exports.targetValue = targetValue;
37
38
  exports.templateContext = templateContext;
38
39
  exports.subjectBag = subjectBag;
39
40
  exports.liveClaimMetadata = liveClaimMetadata;
@@ -52,7 +53,15 @@ const scanCodeService = __importStar(require("../../services/scan-code"));
52
53
  const escalationService = __importStar(require("../../services/escalation"));
53
54
  const types_1 = require("../../types");
54
55
  function targetFilter(step, ctx) {
55
- return { [ctx.scheme.target_facet]: ctx.parsed.target, ...(step.query?.facets ?? {}) };
56
+ return { [ctx.scheme.target_facet]: targetValue(ctx), ...(step.query?.facets ?? {}) };
57
+ }
58
+ /**
59
+ * The value the target facet contains on a matching row: the target, or a
60
+ * one-item list when the scheme's facet holds a list (`metadata @>` then
61
+ * matches membership).
62
+ */
63
+ function targetValue(ctx) {
64
+ return ctx.scheme.target_match === types_1.SCAN_TARGET_MATCH.MEMBER ? [ctx.parsed.target] : ctx.parsed.target;
56
65
  }
57
66
  function templateContext(ctx) {
58
67
  return {
@@ -123,6 +123,7 @@ async function locateStep(step, ctx) {
123
123
  ...step.query,
124
124
  targetFacet: ctx.scheme.target_facet,
125
125
  target: ctx.parsed.target,
126
+ targetMatch: ctx.scheme.target_match,
126
127
  },
127
128
  },
128
129
  };
@@ -41,6 +41,8 @@ const userService = __importStar(require("../../services/user"));
41
41
  const uuid_1 = require("../../lib/uuid");
42
42
  const helpers_1 = require("../escalations/helpers");
43
43
  const types_1 = require("../../types");
44
+ const scan_code_1 = require("../../shared/scan-code");
45
+ const escalation_1 = require("../../types/escalation");
44
46
  async function resolveSubject(ref, schemes, stationAuth) {
45
47
  if (!ref)
46
48
  return null;
@@ -49,16 +51,43 @@ async function resolveSubject(ref, schemes, stationAuth) {
49
51
  const parsed = scanCodeService.parseScanCode(ref.code, schemes);
50
52
  if (!parsed.ok || parsed.scheme.kind !== types_1.SCAN_SCHEME_KINDS.ACTION)
51
53
  return { ok: false };
52
- const row = await escalationService.getEscalation(ref.escalationId);
53
- if (!row || row.status !== 'pending')
54
+ const held = await escalationService.getEscalation(ref.escalationId);
55
+ const row = held?.status === 'pending' ? held : await nextRound(held, parsed.scheme, parsed.parsed.target);
56
+ if (!row)
54
57
  return { ok: false };
55
58
  if (await (0, helpers_1.assertReadAccess)(stationAuth.userId, row))
56
59
  return { ok: false };
57
- if (row.metadata?.[parsed.scheme.target_facet] !== parsed.parsed.target) {
60
+ if (!(0, scan_code_1.facetHolds)(row.metadata?.[parsed.scheme.target_facet], parsed.parsed.target)) {
58
61
  return { ok: false };
59
62
  }
60
63
  return { ok: true, subject: { row, parsed: parsed.parsed, scheme: parsed.scheme, code: ref.code } };
61
64
  }
65
+ /**
66
+ * The pending round that follows a row a fill resolved to wake its wait
67
+ * (`$trigger: 'fill'`): the one pending row in the same role, of the same
68
+ * workflow, carrying the same target. Null when there is none yet.
69
+ */
70
+ async function nextRound(held, scheme, target) {
71
+ if (!held || held.status !== 'resolved' || !held.workflow_id)
72
+ return null;
73
+ if (resolverTrigger(held) !== escalation_1.ESCALATION_TRIGGER_FILL)
74
+ return null;
75
+ const value = scheme.target_match === types_1.SCAN_TARGET_MATCH.MEMBER ? [target] : target;
76
+ const { escalations } = await escalationService.searchByFacets({
77
+ roles: [held.role], facets: { [scheme.target_facet]: value }, status: 'pending', limit: 2,
78
+ });
79
+ const rounds = escalations.filter((e) => e.workflow_id === held.workflow_id);
80
+ return rounds.length === 1 ? rounds[0] : null;
81
+ }
82
+ function resolverTrigger(row) {
83
+ try {
84
+ const payload = typeof row.resolver_payload === 'string' ? JSON.parse(row.resolver_payload) : row.resolver_payload;
85
+ return payload?.[escalation_1.ESCALATION_TRIGGER_KEY];
86
+ }
87
+ catch {
88
+ return undefined;
89
+ }
90
+ }
62
91
  /** Who holds a live claim on the row, when that is someone other than `actorId`. */
63
92
  async function claimedByOther(row, actorId) {
64
93
  if (!row.assigned_to || !(0, types_1.isEffectivelyClaimed)(row) || row.assigned_to === actorId)
@@ -109,7 +109,7 @@ async function accumulateStep(step, ctx) {
109
109
  else {
110
110
  request = {
111
111
  key: ctx.scheme.target_facet,
112
- value: ctx.parsed.target,
112
+ value: (0, context_1.targetValue)(ctx),
113
113
  itemKey: rendered.itemKey,
114
114
  payload: rendered.payload,
115
115
  metadata: rendered.metadata,
@@ -139,7 +139,8 @@ async function fillStep(step, ctx) {
139
139
  }, ctx.auth);
140
140
  if (result.status === 200) {
141
141
  const data = result.data;
142
- const done = data.outcome === 'completed';
142
+ // A fill that woke the wait (`woke`) is interim here: the next round carries the rest.
143
+ const done = data.outcome === escalation_1.BATCH_ITEM_OUTCOMES.COMPLETED;
143
144
  const filled = progress(batch, batch.pending.length - (done ? 0 : (data.remaining ?? 0)));
144
145
  const next = pendingCopy(batch.pending.filter((k) => k !== itemKey), separator, labeler).next;
145
146
  return (0, context_1.withDone)({
@@ -62,7 +62,7 @@ async function locateItem(step, ctx) {
62
62
  roles: roles ?? undefined,
63
63
  types: selector.types,
64
64
  subtypes: selector.subtypes,
65
- facets: { ...selector.facets, [ctx.scheme.target_facet]: ctx.parsed.target },
65
+ facets: { ...selector.facets, [ctx.scheme.target_facet]: (0, context_1.targetValue)(ctx) },
66
66
  status: 'pending',
67
67
  exists: [escalation_1.ESCALATION_ACCUMULATE_KEYS.COUNT],
68
68
  limit: 3,
@@ -87,7 +87,7 @@ async function locateContainer(step, ctx) {
87
87
  roles: roles ?? undefined,
88
88
  types: selector?.types,
89
89
  subtypes: selector?.subtypes,
90
- facets: { ...selector?.facets, [ctx.scheme.target_facet]: ctx.parsed.target },
90
+ facets: { ...selector?.facets, [ctx.scheme.target_facet]: (0, context_1.targetValue)(ctx) },
91
91
  status: 'pending',
92
92
  exists: [escalation_1.ESCALATION_ACCUMULATE_KEYS.COUNT],
93
93
  limit: 2,
@@ -64,7 +64,7 @@ async function claimStep(step, ctx, presentedId) {
64
64
  return notPrimed;
65
65
  const result = await (0, metadata_1.claimByMetadata)({
66
66
  key: ctx.scheme.target_facet,
67
- value: ctx.parsed.target,
67
+ value: (0, context_1.targetValue)(ctx),
68
68
  durationMinutes: step.params?.durationMinutes,
69
69
  metadata: { ...metadata, ...(0, context_1.provenance)(ctx) },
70
70
  restrictRoles: step.query?.roles,
@@ -95,7 +95,7 @@ async function resolveStep(step, ctx, presentedId) {
95
95
  return notPrimed;
96
96
  const result = await (0, metadata_1.resolveByMetadata)({
97
97
  key: ctx.scheme.target_facet,
98
- value: ctx.parsed.target,
98
+ value: (0, context_1.targetValue)(ctx),
99
99
  resolverPayload: rendered.resolverPayload,
100
100
  metadata: { ...rendered.metadata, ...(0, context_1.provenance)(ctx) },
101
101
  restrictRoles: step.query?.roles,
@@ -143,7 +143,7 @@ async function escalateStep(step, ctx, presentedId) {
143
143
  role: step.params.targetRole,
144
144
  description: step.params?.description ?? ctx.rule.name,
145
145
  metadata: {
146
- [ctx.scheme.target_facet]: ctx.parsed.target,
146
+ [ctx.scheme.target_facet]: (0, context_1.targetValue)(ctx),
147
147
  ...(0, context_1.interpolatedMetadata)(step, ctx),
148
148
  ...(0, context_1.provenance)(ctx),
149
149
  },
@@ -234,7 +234,7 @@ async function cancelStep(step, ctx, presentedId) {
234
234
  return notPrimed;
235
235
  const claimed = await (0, metadata_1.claimByMetadata)({
236
236
  key: ctx.scheme.target_facet,
237
- value: ctx.parsed.target,
237
+ value: (0, context_1.targetValue)(ctx),
238
238
  metadata: (0, context_1.provenance)(ctx),
239
239
  restrictRoles: step.query?.roles,
240
240
  assertId: presentedId,
@@ -0,0 +1,26 @@
1
+ -- Migration 043: pattern scan schemes and list-valued target facets
2
+ --
3
+ -- encoding 'pattern': a scheme whose codes carry no scheme or category, such
4
+ -- as a carrier tracking number. A code matching one of `patterns` (regular
5
+ -- expressions over the whole code) parses with the code as the target, and
6
+ -- the scheme's single rule is category '0'. `precedes_gtin` declares which
7
+ -- reads a digits-only code first while an enabled gtin scheme exists: true,
8
+ -- the patterns; false, the gtin scheme. Beside an enabled gtin scheme the
9
+ -- declaration is required.
10
+ --
11
+ -- target_match:
12
+ -- 'value' the target facet holds one value equal to the target.
13
+ -- 'member' the target facet holds a list; a row matches when the list
14
+ -- contains the target (metadata @> {facet: [target]}).
15
+
16
+ ALTER TABLE lt_config_scan_schemes
17
+ DROP CONSTRAINT IF EXISTS lt_config_scan_schemes_encoding_check;
18
+ ALTER TABLE lt_config_scan_schemes
19
+ ADD CONSTRAINT lt_config_scan_schemes_encoding_check
20
+ CHECK (encoding IN ('fixed', 'delimited', 'gtin', 'pattern'));
21
+
22
+ ALTER TABLE lt_config_scan_schemes
23
+ ADD COLUMN IF NOT EXISTS patterns JSONB NOT NULL DEFAULT '[]'::jsonb,
24
+ ADD COLUMN IF NOT EXISTS precedes_gtin BOOLEAN,
25
+ ADD COLUMN IF NOT EXISTS target_match TEXT NOT NULL DEFAULT 'value'
26
+ CHECK (target_match IN ('value', 'member'));
@@ -0,0 +1,3 @@
1
+ import type { FacetValue } from '../types/facets';
2
+ /** True when a facet value names something to match: a non-empty string or a non-empty list of them. */
3
+ export declare function hasFacetValue(value: unknown): value is FacetValue;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasFacetValue = hasFacetValue;
4
+ /** True when a facet value names something to match: a non-empty string or a non-empty list of them. */
5
+ function hasFacetValue(value) {
6
+ if (typeof value === 'string')
7
+ return value.length > 0;
8
+ return Array.isArray(value) && value.length > 0 && value.every((v) => typeof v === 'string' && v.length > 0);
9
+ }
@@ -105,6 +105,9 @@ router.put('/schemes/:version', auth_1.requireRoleManager, async (req, res) => {
105
105
  grant_ttl_seconds: req.body.grant_ttl_seconds,
106
106
  grant_max_uses: req.body.grant_max_uses,
107
107
  grant_scope: req.body.grant_scope,
108
+ patterns: req.body.patterns,
109
+ precedes_gtin: req.body.precedes_gtin,
110
+ target_match: req.body.target_match,
108
111
  enabled: req.body.enabled,
109
112
  });
110
113
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -207,7 +207,7 @@ export declare function createClient(options?: LTClientOptions): {
207
207
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
208
208
  claimByMetadata: (input: {
209
209
  key: string;
210
- value: string;
210
+ value: import("..").FacetValue;
211
211
  durationMinutes?: number;
212
212
  assignee?: string;
213
213
  metadata?: Record<string, any>;
@@ -217,7 +217,7 @@ export declare function createClient(options?: LTClientOptions): {
217
217
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
218
218
  resolveByMetadata: (input: {
219
219
  key: string;
220
- value: string;
220
+ value: import("..").FacetValue;
221
221
  resolverPayload: Record<string, any>;
222
222
  assignee?: string;
223
223
  metadata?: Record<string, any>;
@@ -266,7 +266,7 @@ export declare function createClient(options?: LTClientOptions): {
266
266
  } & Omit<import("../api/escalations/accumulate").AccumulateItemInput, "assertClaim">, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
267
267
  accumulateByMetadata: (input: {
268
268
  key: string;
269
- value: string;
269
+ value: import("..").FacetValue;
270
270
  restrictRoles?: string[];
271
271
  container?: import("..").ContainerSelector;
272
272
  } & Omit<import("../api/escalations/accumulate").AccumulateItemInput, "assertClaim">, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
@@ -3,15 +3,16 @@ export interface ResolveBatchItemOutcome {
3
3
  outcome: BatchItemOutcome;
4
4
  /** Items still awaiting submission after this call (0 exactly when completed). */
5
5
  remaining: number;
6
- /** The post-fill row on `completed`/`accepted`; null on every failure outcome. */
6
+ /** The post-fill row on `completed`/`accepted`/`woke`; null on every failure outcome. */
7
7
  escalation: LTEscalationRecord | null;
8
8
  }
9
9
  /**
10
10
  * Fills one declared item of a batch escalation in a single atomic SDK
11
11
  * statement (guarded fill + facet recompute + resolve-and-wake on the last
12
12
  * item). `actor` is recorded under `envelope.batch_filled_by[itemKey]`. Interim fills publish `escalation.updated` with progress; the
13
- * completing fill publishes the standard `escalation.resolved`. Failure
14
- * outcomes publish nothing — the row was untouched.
13
+ * completing fill, and a fill that woke a `wakeOnFill` wait (`woke`), publish
14
+ * the standard `escalation.resolved`. Failure outcomes publish nothing — the
15
+ * row was untouched.
15
16
  */
16
17
  export declare function resolveBatchItem(id: string, itemKey: string, payload: Record<string, any>, metadata?: Record<string, any>, assertClaim?: string, resolvedBy?: {
17
18
  id: string;
@@ -4,6 +4,7 @@ exports.resolveBatchItem = resolveBatchItem;
4
4
  exports.resolveBatchItemBySignalKey = resolveBatchItemBySignalKey;
5
5
  exports.resolveBatchItemByMetadata = resolveBatchItemByMetadata;
6
6
  const escalation_wire_1 = require("../../lib/events/escalation-wire");
7
+ const escalation_1 = require("../../types/escalation");
7
8
  const uuid_1 = require("../../lib/uuid");
8
9
  const client_1 = require("./client");
9
10
  const crud_1 = require("./crud");
@@ -12,8 +13,9 @@ const map_1 = require("./map");
12
13
  * Fills one declared item of a batch escalation in a single atomic SDK
13
14
  * statement (guarded fill + facet recompute + resolve-and-wake on the last
14
15
  * item). `actor` is recorded under `envelope.batch_filled_by[itemKey]`. Interim fills publish `escalation.updated` with progress; the
15
- * completing fill publishes the standard `escalation.resolved`. Failure
16
- * outcomes publish nothing — the row was untouched.
16
+ * completing fill, and a fill that woke a `wakeOnFill` wait (`woke`), publish
17
+ * the standard `escalation.resolved`. Failure outcomes publish nothing — the
18
+ * row was untouched.
17
19
  */
18
20
  async function resolveBatchItem(id, itemKey, payload, metadata, assertClaim, resolvedBy, actor) {
19
21
  if (!(0, uuid_1.isUuid)(id))
@@ -72,7 +74,7 @@ function settleBatchOutcome(result, itemKey) {
72
74
  return { outcome: result.outcome, remaining: -1, escalation: null };
73
75
  }
74
76
  const escalation = (0, map_1.toEscalationRecord)(result.entry);
75
- const completed = result.outcome === 'completed';
77
+ const completed = result.outcome === escalation_1.BATCH_ITEM_OUTCOMES.COMPLETED || result.outcome === escalation_1.BATCH_ITEM_OUTCOMES.WOKE;
76
78
  (0, crud_1.publishEscalationChange)({
77
79
  type: completed ? 'escalation.resolved' : 'escalation.updated',
78
80
  source: 'service',
@@ -1,4 +1,5 @@
1
1
  import type { ClaimResult } from './types';
2
+ import type { FacetValue } from '../../types/facets';
2
3
  /**
3
4
  * Claims one named row, the same claim `claimByMetadata` makes on the row it
4
5
  * picks: pending, the facet still matches, the role is allowed, and no live
@@ -7,4 +8,4 @@ import type { ClaimResult } from './types';
7
8
  */
8
9
  export declare const CLAIM_ASSERTED = "WITH target AS MATERIALIZED (\n SELECT id, assigned_to AS prior_assigned_to FROM public.hmsh_escalations\n WHERE id = $6\n AND metadata @> $1::jsonb\n AND ($4::text[] IS NULL OR role = ANY($4::text[]))\n AND status = 'pending'\n AND (assigned_to IS NULL OR assigned_until IS NULL OR assigned_until <= NOW() OR assigned_to = $2)\n FOR UPDATE SKIP LOCKED\n)\nUPDATE public.hmsh_escalations e\nSET assigned_to = $2,\n claimed_at = NOW(),\n claim_expires_at = NOW() + ($3 * INTERVAL '1 minute'),\n assigned_until = NOW() + ($3 * INTERVAL '1 minute'),\n metadata = CASE WHEN $5::jsonb IS NOT NULL\n THEN COALESCE(e.metadata, '{}'::jsonb) || $5::jsonb\n ELSE e.metadata END,\n updated_at = NOW()\nFROM target WHERE e.id = target.id\nRETURNING e.*, target.prior_assigned_to\n";
9
10
  /** Claim the row `id` when it still carries `key = value`; null when it does not. */
10
- export declare function claimAssertedByMetadata(id: string, key: string, value: string, userId: string, durationMinutes?: number, metadata?: Record<string, any>, allowedRoles?: string[] | null): Promise<ClaimResult | null>;
11
+ export declare function claimAssertedByMetadata(id: string, key: string, value: FacetValue, userId: string, durationMinutes?: number, metadata?: Record<string, any>, allowedRoles?: string[] | null): Promise<ClaimResult | null>;
@@ -1,6 +1,7 @@
1
1
  import { publishEscalationEvent } from '../../lib/events/publish';
2
2
  import type { LTEscalationRecord, ScanAvailability } from '../../types';
3
3
  import type { CreateEscalationInput, ClaimResult } from './types';
4
+ import type { FacetValue } from '../../types/facets';
4
5
  /**
5
6
  * Every escalation write publishes an event AND drops this container's cached
6
7
  * aggregates — the event triggers a dashboard refetch, which must observe the
@@ -212,7 +213,7 @@ export declare function findByMetadata(key: string, value: string, status?: stri
212
213
  * excluded from claim-by-metadata (their items are pre-claimed and resolved
213
214
  * by id). Self-scope claim-by-metadata would require a HotMesh SDK predicate.
214
215
  */
215
- export declare function claimByMetadata(key: string, value: string, userId: string, durationMinutes?: number, metadata?: Record<string, any>, allowedRoles?: string[] | null): Promise<(ClaimResult & {
216
+ export declare function claimByMetadata(key: string, value: FacetValue, userId: string, durationMinutes?: number, metadata?: Record<string, any>, allowedRoles?: string[] | null): Promise<(ClaimResult & {
216
217
  candidatesExist: number;
217
218
  }) | null>;
218
219
  export interface ResolveByMetadataResult {
@@ -256,4 +257,4 @@ export interface ResolveByMetadataResult {
256
257
  * business logic over the shared table, so it runs as one atomic statement on
257
258
  * `hmsh_escalations` rather than through the generic SDK resolve.
258
259
  */
259
- export declare function resolveByMetadataAtomic(key: string, value: string, userId: string, resolverPayload: Record<string, any>, metadata?: Record<string, any>, writeAllRoles?: string[] | null, writeSelfRoles?: string[] | null, enforcingRoles?: string[] | null, assertId?: string | null, extraFacets?: Record<string, any> | null, availability?: ScanAvailability | null): Promise<ResolveByMetadataResult>;
260
+ export declare function resolveByMetadataAtomic(key: string, value: FacetValue, userId: string, resolverPayload: Record<string, any>, metadata?: Record<string, any>, writeAllRoles?: string[] | null, writeSelfRoles?: string[] | null, enforcingRoles?: string[] | null, assertId?: string | null, extraFacets?: Record<string, any> | null, availability?: ScanAvailability | null): Promise<ResolveByMetadataResult>;
@@ -126,6 +126,12 @@ export type ConditionEscalationConfig = Types.ConditionQueueConfig & {
126
126
  * already satisfied go in `filled` (hotmesh 0.31.0+), keyed by item key
127
127
  * with `payload`, `at` from the source of record, and an optional `actor`;
128
128
  * the row starts with that progress and delivers them with the collection.
129
+ * Add `wakeOnFill: true` (or a list of keys, hotmesh 0.32.0+) and a fill
130
+ * resumes the wait with the items so far, `$filled: [itemKey]`, `$filledAt`,
131
+ * `$filledBy` and `$trigger: 'fill'`, so the workflow acts on each item as it
132
+ * lands; park the next round with every fill carried forward in `filled`,
133
+ * built from `$filledAt` and `$filledBy`. The last key completes as on any
134
+ * batch.
129
135
  *
130
136
  * **Open accumulation — items arrive over time (hotmesh 0.29.0+).** Declare
131
137
  * `accumulate` and the escalation holds items added via `accumulateItem`
@@ -172,6 +172,12 @@ function toEngineConfig(escalation) {
172
172
  * already satisfied go in `filled` (hotmesh 0.31.0+), keyed by item key
173
173
  * with `payload`, `at` from the source of record, and an optional `actor`;
174
174
  * the row starts with that progress and delivers them with the collection.
175
+ * Add `wakeOnFill: true` (or a list of keys, hotmesh 0.32.0+) and a fill
176
+ * resumes the wait with the items so far, `$filled: [itemKey]`, `$filledAt`,
177
+ * `$filledBy` and `$trigger: 'fill'`, so the workflow acts on each item as it
178
+ * lands; park the next round with every fill carried forward in `filled`,
179
+ * built from `$filledAt` and `$filledBy`. The last key completes as on any
180
+ * batch.
175
181
  *
176
182
  * **Open accumulation — items arrive over time (hotmesh 0.29.0+).** Declare
177
183
  * `accumulate` and the escalation holds items added via `accumulateItem`
@@ -15,6 +15,9 @@ function mapScheme(row) {
15
15
  encoding: row.encoding,
16
16
  delimiter: row.delimiter,
17
17
  target_length: row.target_length ?? null,
18
+ patterns: Array.isArray(row.patterns) ? row.patterns : [],
19
+ precedes_gtin: row.precedes_gtin ?? null,
20
+ target_match: row.target_match ?? 'value',
18
21
  kind: row.kind ?? 'action',
19
22
  grant_ttl_seconds: row.grant_ttl_seconds ?? null,
20
23
  grant_max_uses: row.grant_max_uses ?? 0,
@@ -2,16 +2,16 @@ export declare const LIST_SCHEMES = "SELECT * FROM lt_config_scan_schemes ORDER
2
2
  export declare const GET_SCHEME = "SELECT * FROM lt_config_scan_schemes WHERE version = $1";
3
3
  export declare const LIST_ACTIONS = "SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 ORDER BY category";
4
4
  export declare const GET_ACTION = "SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2";
5
- export declare const UPSERT_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n kind = EXCLUDED.kind,\n grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,\n grant_max_uses = EXCLUDED.grant_max_uses,\n grant_scope = EXCLUDED.grant_scope,\n enabled = EXCLUDED.enabled\nRETURNING *";
5
+ export declare const UPSERT_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope,\n patterns, precedes_gtin, target_match)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n kind = EXCLUDED.kind,\n grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,\n grant_max_uses = EXCLUDED.grant_max_uses,\n grant_scope = EXCLUDED.grant_scope,\n patterns = EXCLUDED.patterns,\n precedes_gtin = EXCLUDED.precedes_gtin,\n target_match = EXCLUDED.target_match,\n enabled = EXCLUDED.enabled\nRETURNING *";
6
6
  export declare const DELETE_SCHEME = "DELETE FROM lt_config_scan_schemes WHERE version = $1";
7
7
  export declare const UPSERT_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, not_primed, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7)\nON CONFLICT (scheme_version, category) DO UPDATE SET\n name = EXCLUDED.name,\n steps = EXCLUDED.steps,\n fallback = EXCLUDED.fallback,\n not_primed = EXCLUDED.not_primed,\n enabled = EXCLUDED.enabled\nRETURNING *";
8
8
  export declare const DELETE_ACTION = "DELETE FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2";
9
- export declare const SEED_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (version) DO NOTHING";
9
+ export declare const SEED_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope,\n patterns, precedes_gtin, target_match)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (version) DO NOTHING";
10
10
  export declare const SEED_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, not_primed, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7)\nON CONFLICT (scheme_version, category) DO NOTHING";
11
11
  /**
12
12
  * Apply — same column set as the upsert, guarded by IS DISTINCT FROM so an
13
13
  * unchanged declaration is a zero-row no-op. `(xmax = 0)` distinguishes
14
14
  * insert from update. jsonb columns compare content-wise in SQL.
15
15
  */
16
- export declare const APPLY_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n kind = EXCLUDED.kind,\n grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,\n grant_max_uses = EXCLUDED.grant_max_uses,\n grant_scope = EXCLUDED.grant_scope,\n enabled = EXCLUDED.enabled,\n updated_at = NOW()\nWHERE (lt_config_scan_schemes.name, lt_config_scan_schemes.description,\n lt_config_scan_schemes.target_facet, lt_config_scan_schemes.encoding,\n lt_config_scan_schemes.delimiter, lt_config_scan_schemes.target_length,\n lt_config_scan_schemes.kind, lt_config_scan_schemes.grant_ttl_seconds,\n lt_config_scan_schemes.grant_max_uses, lt_config_scan_schemes.enabled,\n lt_config_scan_schemes.grant_scope)\n IS DISTINCT FROM\n (EXCLUDED.name, EXCLUDED.description, EXCLUDED.target_facet,\n EXCLUDED.encoding, EXCLUDED.delimiter, EXCLUDED.target_length,\n EXCLUDED.kind, EXCLUDED.grant_ttl_seconds, EXCLUDED.grant_max_uses,\n EXCLUDED.enabled, EXCLUDED.grant_scope)\nRETURNING (xmax = 0) AS inserted";
16
+ export declare const APPLY_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope,\n patterns, precedes_gtin, target_match)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n kind = EXCLUDED.kind,\n grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,\n grant_max_uses = EXCLUDED.grant_max_uses,\n grant_scope = EXCLUDED.grant_scope,\n patterns = EXCLUDED.patterns,\n precedes_gtin = EXCLUDED.precedes_gtin,\n target_match = EXCLUDED.target_match,\n enabled = EXCLUDED.enabled,\n updated_at = NOW()\nWHERE (lt_config_scan_schemes.name, lt_config_scan_schemes.description,\n lt_config_scan_schemes.target_facet, lt_config_scan_schemes.encoding,\n lt_config_scan_schemes.delimiter, lt_config_scan_schemes.target_length,\n lt_config_scan_schemes.kind, lt_config_scan_schemes.grant_ttl_seconds,\n lt_config_scan_schemes.grant_max_uses, lt_config_scan_schemes.enabled,\n lt_config_scan_schemes.grant_scope, lt_config_scan_schemes.patterns,\n lt_config_scan_schemes.precedes_gtin, lt_config_scan_schemes.target_match)\n IS DISTINCT FROM\n (EXCLUDED.name, EXCLUDED.description, EXCLUDED.target_facet,\n EXCLUDED.encoding, EXCLUDED.delimiter, EXCLUDED.target_length,\n EXCLUDED.kind, EXCLUDED.grant_ttl_seconds, EXCLUDED.grant_max_uses,\n EXCLUDED.enabled, EXCLUDED.grant_scope, EXCLUDED.patterns,\n EXCLUDED.precedes_gtin, EXCLUDED.target_match)\nRETURNING (xmax = 0) AS inserted";
17
17
  export declare const APPLY_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, not_primed, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7)\nON CONFLICT (scheme_version, category) DO UPDATE SET\n name = EXCLUDED.name,\n steps = EXCLUDED.steps,\n fallback = EXCLUDED.fallback,\n not_primed = EXCLUDED.not_primed,\n enabled = EXCLUDED.enabled,\n updated_at = NOW()\nWHERE (lt_config_scan_actions.name, lt_config_scan_actions.steps,\n lt_config_scan_actions.fallback, lt_config_scan_actions.not_primed,\n lt_config_scan_actions.enabled)\n IS DISTINCT FROM\n (EXCLUDED.name, EXCLUDED.steps, EXCLUDED.fallback,\n EXCLUDED.not_primed, EXCLUDED.enabled)\nRETURNING (xmax = 0) AS inserted";