@hotmeshio/long-tail 0.21.0 → 0.21.1

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 (217) hide show
  1. package/build/api/escalations/accumulate.d.ts +8 -0
  2. package/build/api/escalations/accumulate.js +25 -0
  3. package/build/api/escalations/index.d.ts +1 -1
  4. package/build/api/escalations/index.js +2 -1
  5. package/build/api/scan-codes/context.d.ts +14 -1
  6. package/build/api/scan-codes/context.js +30 -2
  7. package/build/api/scan-codes/identity.js +1 -0
  8. package/build/api/scan-codes/verbs.d.ts +9 -3
  9. package/build/api/scan-codes/verbs.js +77 -23
  10. package/build/index.d.ts +2 -1
  11. package/build/index.js +3 -2
  12. package/build/routes/escalations/accumulate.js +8 -0
  13. package/build/sdk/index.d.ts +3 -0
  14. package/build/sdk/index.js +1 -0
  15. package/build/services/scan-code/index.d.ts +1 -1
  16. package/build/services/scan-code/index.js +3 -1
  17. package/build/services/scan-code/parse.d.ts +17 -3
  18. package/build/services/scan-code/parse.js +37 -4
  19. package/build/services/scan-code/validate.js +19 -0
  20. package/build/system/mcp-servers/admin/escalations.js +6 -1
  21. package/build/system/mcp-servers/admin/schemas.d.ts +6 -3
  22. package/build/system/mcp-servers/admin/schemas.js +2 -1
  23. package/build/system/seed/tool-manifests-admin.d.ts +189 -0
  24. package/build/system/seed/tool-manifests-admin.js +1 -1
  25. package/build/types/index.d.ts +2 -2
  26. package/build/types/index.js +2 -1
  27. package/build/types/scan-code.d.ts +31 -1
  28. package/build/types/scan-code.js +20 -2
  29. package/dashboard/dist/assets/{AdminDashboard-uarpHB88.js → AdminDashboard-Covdam48.js} +2 -2
  30. package/dashboard/dist/assets/{AdminDashboard-uarpHB88.js.map → AdminDashboard-Covdam48.js.map} +1 -1
  31. package/dashboard/dist/assets/{AgentConfigPage-BcUaDD5E.js → AgentConfigPage-CE1k6J5r.js} +2 -2
  32. package/dashboard/dist/assets/{AgentConfigPage-BcUaDD5E.js.map → AgentConfigPage-CE1k6J5r.js.map} +1 -1
  33. package/dashboard/dist/assets/{AgentDetailPage-BaZBhK6i.js → AgentDetailPage-CWJZIZP1.js} +2 -2
  34. package/dashboard/dist/assets/{AgentDetailPage-BaZBhK6i.js.map → AgentDetailPage-CWJZIZP1.js.map} +1 -1
  35. package/dashboard/dist/assets/{AgentsPage-CuVFSDc4.js → AgentsPage---Dg5ufF.js} +2 -2
  36. package/dashboard/dist/assets/{AgentsPage-CuVFSDc4.js.map → AgentsPage---Dg5ufF.js.map} +1 -1
  37. package/dashboard/dist/assets/{AvailableEscalationsPage-iO5NyyIK.js → AvailableEscalationsPage-CpbC8oTN.js} +2 -2
  38. package/dashboard/dist/assets/{AvailableEscalationsPage-iO5NyyIK.js.map → AvailableEscalationsPage-CpbC8oTN.js.map} +1 -1
  39. package/dashboard/dist/assets/{BotPicker-CClMby6B.js → BotPicker-D3drO3-T.js} +2 -2
  40. package/dashboard/dist/assets/{BotPicker-CClMby6B.js.map → BotPicker-D3drO3-T.js.map} +1 -1
  41. package/dashboard/dist/assets/{BulkAssignModal-BL8FRgkN.js → BulkAssignModal-BOAWsViq.js} +2 -2
  42. package/dashboard/dist/assets/{BulkAssignModal-BL8FRgkN.js.map → BulkAssignModal-BOAWsViq.js.map} +1 -1
  43. package/dashboard/dist/assets/{CapabilitiesPage-D53ogPor.js → CapabilitiesPage-RGgD3YZO.js} +2 -2
  44. package/dashboard/dist/assets/{CapabilitiesPage-D53ogPor.js.map → CapabilitiesPage-RGgD3YZO.js.map} +1 -1
  45. package/dashboard/dist/assets/{CollapsibleSection-ow8jpbtD.js → CollapsibleSection-DNkZn87n.js} +2 -2
  46. package/dashboard/dist/assets/{CollapsibleSection-ow8jpbtD.js.map → CollapsibleSection-DNkZn87n.js.map} +1 -1
  47. package/dashboard/dist/assets/{ConfirmDeleteModal-CeEDt9iJ.js → ConfirmDeleteModal-BqzOwhPr.js} +2 -2
  48. package/dashboard/dist/assets/{ConfirmDeleteModal-CeEDt9iJ.js.map → ConfirmDeleteModal-BqzOwhPr.js.map} +1 -1
  49. package/dashboard/dist/assets/{CountdownTimer-CSqyZMCG.js → CountdownTimer-BaexQMK6.js} +2 -2
  50. package/dashboard/dist/assets/{CountdownTimer-CSqyZMCG.js.map → CountdownTimer-BaexQMK6.js.map} +1 -1
  51. package/dashboard/dist/assets/{CredentialsPage-Dx7SxA23.js → CredentialsPage-D7abp0aS.js} +2 -2
  52. package/dashboard/dist/assets/{CredentialsPage-Dx7SxA23.js.map → CredentialsPage-D7abp0aS.js.map} +1 -1
  53. package/dashboard/dist/assets/{CronLabel-LYPxpvNN.js → CronLabel-DZiWmTwJ.js} +2 -2
  54. package/dashboard/dist/assets/{CronLabel-LYPxpvNN.js.map → CronLabel-DZiWmTwJ.js.map} +1 -1
  55. package/dashboard/dist/assets/{ElapsedCell-BZJTSm9N.js → ElapsedCell-BdGO_w4v.js} +2 -2
  56. package/dashboard/dist/assets/{ElapsedCell-BZJTSm9N.js.map → ElapsedCell-BdGO_w4v.js.map} +1 -1
  57. package/dashboard/dist/assets/{EntityTimelinePanel-0wIIW2en.js → EntityTimelinePanel-DIDcF5Yu.js} +2 -2
  58. package/dashboard/dist/assets/{EntityTimelinePanel-0wIIW2en.js.map → EntityTimelinePanel-DIDcF5Yu.js.map} +1 -1
  59. package/dashboard/dist/assets/{EscalationListSchemaPage-CoYvtMzj.js → EscalationListSchemaPage-C28rn9XC.js} +2 -2
  60. package/dashboard/dist/assets/{EscalationListSchemaPage-CoYvtMzj.js.map → EscalationListSchemaPage-C28rn9XC.js.map} +1 -1
  61. package/dashboard/dist/assets/{EscalationListView-DWFHPufv.js → EscalationListView-CkBnkpDJ.js} +2 -2
  62. package/dashboard/dist/assets/{EscalationListView-DWFHPufv.js.map → EscalationListView-CkBnkpDJ.js.map} +1 -1
  63. package/dashboard/dist/assets/{EscalationSchemaPage-C9Xu_A25.js → EscalationSchemaPage-W5r0A1kj.js} +2 -2
  64. package/dashboard/dist/assets/{EscalationSchemaPage-C9Xu_A25.js.map → EscalationSchemaPage-W5r0A1kj.js.map} +1 -1
  65. package/dashboard/dist/assets/{EscalationTimeline-D8W2LNNk.js → EscalationTimeline-DKyTz6sM.js} +2 -2
  66. package/dashboard/dist/assets/{EscalationTimeline-D8W2LNNk.js.map → EscalationTimeline-DKyTz6sM.js.map} +1 -1
  67. package/dashboard/dist/assets/{EscalationTitleSelect-DLK8NWMp.js → EscalationTitleSelect-CzKfavri.js} +2 -2
  68. package/dashboard/dist/assets/{EscalationTitleSelect-DLK8NWMp.js.map → EscalationTitleSelect-CzKfavri.js.map} +1 -1
  69. package/dashboard/dist/assets/{EscalationsOverview-CW57FaP9.js → EscalationsOverview-Tdu3Yx2c.js} +2 -2
  70. package/dashboard/dist/assets/{EscalationsOverview-CW57FaP9.js.map → EscalationsOverview-Tdu3Yx2c.js.map} +1 -1
  71. package/dashboard/dist/assets/{EventTable-D1ctWhKf.js → EventTable-DiIxOJwO.js} +2 -2
  72. package/dashboard/dist/assets/{EventTable-D1ctWhKf.js.map → EventTable-DiIxOJwO.js.map} +1 -1
  73. package/dashboard/dist/assets/{FilterBar-C-iur-Nj.js → FilterBar-CvMBCVIo.js} +2 -2
  74. package/dashboard/dist/assets/{FilterBar-C-iur-Nj.js.map → FilterBar-CvMBCVIo.js.map} +1 -1
  75. package/dashboard/dist/assets/{GraphInvokePage-CcA_44M4.js → GraphInvokePage-DO-yyhi6.js} +2 -2
  76. package/dashboard/dist/assets/{GraphInvokePage-CcA_44M4.js.map → GraphInvokePage-DO-yyhi6.js.map} +1 -1
  77. package/dashboard/dist/assets/{HomePage-Dc085ghJ.js → HomePage-DSS3eHR2.js} +2 -2
  78. package/dashboard/dist/assets/{HomePage-Dc085ghJ.js.map → HomePage-DSS3eHR2.js.map} +1 -1
  79. package/dashboard/dist/assets/{ListToolbar-h_ziBt4O.js → ListToolbar-C3-Tqqub.js} +2 -2
  80. package/dashboard/dist/assets/{ListToolbar-h_ziBt4O.js.map → ListToolbar-C3-Tqqub.js.map} +1 -1
  81. package/dashboard/dist/assets/{McpOverview-qXXhbNWV.js → McpOverview-DEJmsdVi.js} +2 -2
  82. package/dashboard/dist/assets/{McpOverview-qXXhbNWV.js.map → McpOverview-DEJmsdVi.js.map} +1 -1
  83. package/dashboard/dist/assets/{McpQueryDetailPage-SEzSbZrd.js → McpQueryDetailPage-DYJr16l7.js} +2 -2
  84. package/dashboard/dist/assets/{McpQueryDetailPage-SEzSbZrd.js.map → McpQueryDetailPage-DYJr16l7.js.map} +1 -1
  85. package/dashboard/dist/assets/{McpQueryPage-Cy0V0kv9.js → McpQueryPage-BBcG_UuU.js} +2 -2
  86. package/dashboard/dist/assets/{McpQueryPage-Cy0V0kv9.js.map → McpQueryPage-BBcG_UuU.js.map} +1 -1
  87. package/dashboard/dist/assets/{McpRunDetailPage-DjJO5vSb.js → McpRunDetailPage-C6xw0kBg.js} +2 -2
  88. package/dashboard/dist/assets/{McpRunDetailPage-DjJO5vSb.js.map → McpRunDetailPage-C6xw0kBg.js.map} +1 -1
  89. package/dashboard/dist/assets/{McpRunsPage-BfjiJ8mM.js → McpRunsPage-CRQqrF4Q.js} +2 -2
  90. package/dashboard/dist/assets/{McpRunsPage-BfjiJ8mM.js.map → McpRunsPage-CRQqrF4Q.js.map} +1 -1
  91. package/dashboard/dist/assets/{OperationsPage-dJcER0T_.js → OperationsPage-Dlfwzf-0.js} +2 -2
  92. package/dashboard/dist/assets/{OperationsPage-dJcER0T_.js.map → OperationsPage-Dlfwzf-0.js.map} +1 -1
  93. package/dashboard/dist/assets/{OperatorDashboard-zCkW4eqk.js → OperatorDashboard-DoiDGZ9R.js} +2 -2
  94. package/dashboard/dist/assets/{OperatorDashboard-zCkW4eqk.js.map → OperatorDashboard-DoiDGZ9R.js.map} +1 -1
  95. package/dashboard/dist/assets/{PersonaDetailPage-Cx6L3Jvu.js → PersonaDetailPage-BzbA4Prr.js} +2 -2
  96. package/dashboard/dist/assets/{PersonaDetailPage-Cx6L3Jvu.js.map → PersonaDetailPage-BzbA4Prr.js.map} +1 -1
  97. package/dashboard/dist/assets/{PersonasPage-DOgGUlJl.js → PersonasPage-B36yn4hU.js} +2 -2
  98. package/dashboard/dist/assets/{PersonasPage-DOgGUlJl.js.map → PersonasPage-B36yn4hU.js.map} +1 -1
  99. package/dashboard/dist/assets/{PortalPage-BKuL1BeJ.js → PortalPage-BkD4YfDf.js} +2 -2
  100. package/dashboard/dist/assets/{PortalPage-BKuL1BeJ.js.map → PortalPage-BkD4YfDf.js.map} +1 -1
  101. package/dashboard/dist/assets/{ProcessDetailPage-BFcFSDUv.js → ProcessDetailPage-BT0eiBWY.js} +2 -2
  102. package/dashboard/dist/assets/{ProcessDetailPage-BFcFSDUv.js.map → ProcessDetailPage-BT0eiBWY.js.map} +1 -1
  103. package/dashboard/dist/assets/{ProcessesListPage-BaHV2cXp.js → ProcessesListPage-BEqeeNae.js} +2 -2
  104. package/dashboard/dist/assets/{ProcessesListPage-BaHV2cXp.js.map → ProcessesListPage-BEqeeNae.js.map} +1 -1
  105. package/dashboard/dist/assets/{ResolverForm-Bgc0Zrya.js → ResolverForm-BwgjIX97.js} +2 -2
  106. package/dashboard/dist/assets/{ResolverForm-Bgc0Zrya.js.map → ResolverForm-BwgjIX97.js.map} +1 -1
  107. package/dashboard/dist/assets/{RoleDetailPage-BPY6i3CU.js → RoleDetailPage-BFuLNJXa.js} +2 -2
  108. package/dashboard/dist/assets/{RoleDetailPage-BPY6i3CU.js.map → RoleDetailPage-BFuLNJXa.js.map} +1 -1
  109. package/dashboard/dist/assets/{RolesPage-DSqqKPbv.js → RolesPage-80quJU5-.js} +2 -2
  110. package/dashboard/dist/assets/{RolesPage-DSqqKPbv.js.map → RolesPage-80quJU5-.js.map} +1 -1
  111. package/dashboard/dist/assets/{RunAsSelector-B29iWwel.js → RunAsSelector-BoePhWVD.js} +2 -2
  112. package/dashboard/dist/assets/{RunAsSelector-B29iWwel.js.map → RunAsSelector-BoePhWVD.js.map} +1 -1
  113. package/dashboard/dist/assets/{ScanCodesPage-S8aAJfnC.js → ScanCodesPage-Cu1bKEix.js} +2 -2
  114. package/dashboard/dist/assets/{ScanCodesPage-S8aAJfnC.js.map → ScanCodesPage-Cu1bKEix.js.map} +1 -1
  115. package/dashboard/dist/assets/ScanSchemeDetailPage-D9AbS6UY.js +2 -0
  116. package/dashboard/dist/assets/ScanSchemeDetailPage-D9AbS6UY.js.map +1 -0
  117. package/dashboard/dist/assets/{ScanStationPage-R9t1-CeQ.js → ScanStationPage-gcZGefvT.js} +2 -2
  118. package/dashboard/dist/assets/{ScanStationPage-R9t1-CeQ.js.map → ScanStationPage-gcZGefvT.js.map} +1 -1
  119. package/dashboard/dist/assets/{StickyPagination-CkW_A507.js → StickyPagination-9ITrei_d.js} +2 -2
  120. package/dashboard/dist/assets/{StickyPagination-CkW_A507.js.map → StickyPagination-9ITrei_d.js.map} +1 -1
  121. package/dashboard/dist/assets/{StreamMessageDetail-yzWX0wac.js → StreamMessageDetail-BkYvEHFY.js} +2 -2
  122. package/dashboard/dist/assets/{StreamMessageDetail-yzWX0wac.js.map → StreamMessageDetail-BkYvEHFY.js.map} +1 -1
  123. package/dashboard/dist/assets/{SwimlaneTimeline-Cf4DXFxj.js → SwimlaneTimeline-B1rotFix.js} +2 -2
  124. package/dashboard/dist/assets/{SwimlaneTimeline-Cf4DXFxj.js.map → SwimlaneTimeline-B1rotFix.js.map} +1 -1
  125. package/dashboard/dist/assets/{TaskDetailPage-DCDcEps9.js → TaskDetailPage-zhn_U_eC.js} +2 -2
  126. package/dashboard/dist/assets/{TaskDetailPage-DCDcEps9.js.map → TaskDetailPage-zhn_U_eC.js.map} +1 -1
  127. package/dashboard/dist/assets/{TasksListPage-BBATgpf7.js → TasksListPage-CNbNeagx.js} +2 -2
  128. package/dashboard/dist/assets/{TasksListPage-BBATgpf7.js.map → TasksListPage-CNbNeagx.js.map} +1 -1
  129. package/dashboard/dist/assets/{TimeAgo-CSNVEjch.js → TimeAgo-0YVMBwls.js} +2 -2
  130. package/dashboard/dist/assets/{TimeAgo-CSNVEjch.js.map → TimeAgo-0YVMBwls.js.map} +1 -1
  131. package/dashboard/dist/assets/{TimestampCell-Du1nBrPn.js → TimestampCell-DB7r3np8.js} +2 -2
  132. package/dashboard/dist/assets/{TimestampCell-Du1nBrPn.js.map → TimestampCell-DB7r3np8.js.map} +1 -1
  133. package/dashboard/dist/assets/{ToolTestPanel-CF-h_5Rg.js → ToolTestPanel-BLfA02wv.js} +2 -2
  134. package/dashboard/dist/assets/{ToolTestPanel-CF-h_5Rg.js.map → ToolTestPanel-BLfA02wv.js.map} +1 -1
  135. package/dashboard/dist/assets/{TopicDetailPage-Dr1UmWcp.js → TopicDetailPage-eAqPKShq.js} +2 -2
  136. package/dashboard/dist/assets/{TopicDetailPage-Dr1UmWcp.js.map → TopicDetailPage-eAqPKShq.js.map} +1 -1
  137. package/dashboard/dist/assets/{TopicsPage-CUUo-Ylf.js → TopicsPage-BNNWD-zl.js} +2 -2
  138. package/dashboard/dist/assets/{TopicsPage-CUUo-Ylf.js.map → TopicsPage-BNNWD-zl.js.map} +1 -1
  139. package/dashboard/dist/assets/{UserName-kBh1dc39.js → UserName-Pw46tO_k.js} +2 -2
  140. package/dashboard/dist/assets/{UserName-kBh1dc39.js.map → UserName-Pw46tO_k.js.map} +1 -1
  141. package/dashboard/dist/assets/{WorkflowExecutionPage-CCRSbnDx.js → WorkflowExecutionPage-DvA51lT3.js} +2 -2
  142. package/dashboard/dist/assets/{WorkflowExecutionPage-CCRSbnDx.js.map → WorkflowExecutionPage-DvA51lT3.js.map} +1 -1
  143. package/dashboard/dist/assets/{WorkflowsDashboard-BNQVvyek.js → WorkflowsDashboard-DFDTwnhn.js} +2 -2
  144. package/dashboard/dist/assets/{WorkflowsDashboard-BNQVvyek.js.map → WorkflowsDashboard-DFDTwnhn.js.map} +1 -1
  145. package/dashboard/dist/assets/{WorkflowsOverview-DswubNJN.js → WorkflowsOverview-5i2Tcy-p.js} +2 -2
  146. package/dashboard/dist/assets/{WorkflowsOverview-DswubNJN.js.map → WorkflowsOverview-5i2Tcy-p.js.map} +1 -1
  147. package/dashboard/dist/assets/{YamlWorkflowDetailPage-Cw9Dlmup.js → YamlWorkflowDetailPage-p4VEYZS0.js} +2 -2
  148. package/dashboard/dist/assets/{YamlWorkflowDetailPage-Cw9Dlmup.js.map → YamlWorkflowDetailPage-p4VEYZS0.js.map} +1 -1
  149. package/dashboard/dist/assets/{YamlWorkflowsPage-DB8xnIXy.js → YamlWorkflowsPage-Cq-hMVxl.js} +2 -2
  150. package/dashboard/dist/assets/{YamlWorkflowsPage-DB8xnIXy.js.map → YamlWorkflowsPage-Cq-hMVxl.js.map} +1 -1
  151. package/dashboard/dist/assets/{agents-BwEnf6N9.js → agents-EyBPJMYa.js} +2 -2
  152. package/dashboard/dist/assets/{agents-BwEnf6N9.js.map → agents-EyBPJMYa.js.map} +1 -1
  153. package/dashboard/dist/assets/{bots-CCmJTT2u.js → bots-DX6jjqtF.js} +2 -2
  154. package/dashboard/dist/assets/{bots-CCmJTT2u.js.map → bots-DX6jjqtF.js.map} +1 -1
  155. package/dashboard/dist/assets/{capabilities-BZHgp_nh.js → capabilities-ZdLv9xBQ.js} +2 -2
  156. package/dashboard/dist/assets/{capabilities-BZHgp_nh.js.map → capabilities-ZdLv9xBQ.js.map} +1 -1
  157. package/dashboard/dist/assets/{controlplane-CyfwUlFA.js → controlplane-CpvZaJuw.js} +2 -2
  158. package/dashboard/dist/assets/{controlplane-CyfwUlFA.js.map → controlplane-CpvZaJuw.js.map} +1 -1
  159. package/dashboard/dist/assets/{escalation-columns-BJPTNmLW.js → escalation-columns-Mvsze5eV.js} +2 -2
  160. package/dashboard/dist/assets/{escalation-columns-BJPTNmLW.js.map → escalation-columns-Mvsze5eV.js.map} +1 -1
  161. package/dashboard/dist/assets/{index-CDrqqbSR.js → index-B_GT23TE.js} +3 -3
  162. package/dashboard/dist/assets/{index-CDrqqbSR.js.map → index-B_GT23TE.js.map} +1 -1
  163. package/dashboard/dist/assets/{index-CVwzCZ43.js → index-BbCjGO3M.js} +2 -2
  164. package/dashboard/dist/assets/{index-CVwzCZ43.js.map → index-BbCjGO3M.js.map} +1 -1
  165. package/dashboard/dist/assets/{index-CuVkSmj5.js → index-Bhb89oHH.js} +2 -2
  166. package/dashboard/dist/assets/{index-CuVkSmj5.js.map → index-Bhb89oHH.js.map} +1 -1
  167. package/dashboard/dist/assets/{index-3gbd5neL.js → index-CgUcYveM.js} +33 -33
  168. package/dashboard/dist/assets/index-CgUcYveM.js.map +1 -0
  169. package/dashboard/dist/assets/{index-BAAVTyZ-.js → index-Cn8uJsd7.js} +2 -2
  170. package/dashboard/dist/assets/{index-BAAVTyZ-.js.map → index-Cn8uJsd7.js.map} +1 -1
  171. package/dashboard/dist/assets/{index-C7KHqOTQ.js → index-D-Xs4rAW.js} +2 -2
  172. package/dashboard/dist/assets/{index-C7KHqOTQ.js.map → index-D-Xs4rAW.js.map} +1 -1
  173. package/dashboard/dist/assets/{index-DZ8X_Gp4.js → index-DGmzBY9D.js} +2 -2
  174. package/dashboard/dist/assets/{index-DZ8X_Gp4.js.map → index-DGmzBY9D.js.map} +1 -1
  175. package/dashboard/dist/assets/{index-DBWS5QL8.js → index-DZhtP2Ok.js} +2 -2
  176. package/dashboard/dist/assets/{index-DBWS5QL8.js.map → index-DZhtP2Ok.js.map} +1 -1
  177. package/dashboard/dist/assets/{index-ClVbfe4z.js → index-DkrBFFSO.js} +2 -2
  178. package/dashboard/dist/assets/{index-ClVbfe4z.js.map → index-DkrBFFSO.js.map} +1 -1
  179. package/dashboard/dist/assets/{index-BC6Jenlo.js → index-Eo-l3Lqo.js} +2 -2
  180. package/dashboard/dist/assets/{index-BC6Jenlo.js.map → index-Eo-l3Lqo.js.map} +1 -1
  181. package/dashboard/dist/assets/{index-DIWCI6HC.js → index-PfSRKerc.js} +2 -2
  182. package/dashboard/dist/assets/{index-DIWCI6HC.js.map → index-PfSRKerc.js.map} +1 -1
  183. package/dashboard/dist/assets/{index-DAuX_PlL.js → index-oFKUFGQL.js} +2 -2
  184. package/dashboard/dist/assets/{index-DAuX_PlL.js.map → index-oFKUFGQL.js.map} +1 -1
  185. package/dashboard/dist/assets/{index-CaGF6TCC.js → index-z5Hpeidu.js} +2 -2
  186. package/dashboard/dist/assets/{index-CaGF6TCC.js.map → index-z5Hpeidu.js.map} +1 -1
  187. package/dashboard/dist/assets/{knowledge-CqyLhUMg.js → knowledge-CgloEkaf.js} +2 -2
  188. package/dashboard/dist/assets/{knowledge-CqyLhUMg.js.map → knowledge-CgloEkaf.js.map} +1 -1
  189. package/dashboard/dist/assets/{mcp-Cvu6bFYH.js → mcp-Bix7QYO7.js} +2 -2
  190. package/dashboard/dist/assets/{mcp-Cvu6bFYH.js.map → mcp-Bix7QYO7.js.map} +1 -1
  191. package/dashboard/dist/assets/{mcp-query-qC6A3e9l.js → mcp-query-o-sGX2ST.js} +2 -2
  192. package/dashboard/dist/assets/{mcp-query-qC6A3e9l.js.map → mcp-query-o-sGX2ST.js.map} +1 -1
  193. package/dashboard/dist/assets/{personas-BKN_lJuV.js → personas-30azkJ_s.js} +2 -2
  194. package/dashboard/dist/assets/{personas-BKN_lJuV.js.map → personas-30azkJ_s.js.map} +1 -1
  195. package/dashboard/dist/assets/{pipelines-BldIfv85.js → pipelines-Bfk2GFK7.js} +2 -2
  196. package/dashboard/dist/assets/{pipelines-BldIfv85.js.map → pipelines-Bfk2GFK7.js.map} +1 -1
  197. package/dashboard/dist/assets/{tasks-B-Uay8uL.js → tasks-CpdopewW.js} +2 -2
  198. package/dashboard/dist/assets/{tasks-B-Uay8uL.js.map → tasks-CpdopewW.js.map} +1 -1
  199. package/dashboard/dist/assets/{topics-438EQogt.js → topics--bvCV9Yp.js} +2 -2
  200. package/dashboard/dist/assets/{topics-438EQogt.js.map → topics--bvCV9Yp.js.map} +1 -1
  201. package/dashboard/dist/assets/{useDebouncedValue-Cw8hYZ8y.js → useDebouncedValue-Da0lPmj3.js} +2 -2
  202. package/dashboard/dist/assets/{useDebouncedValue-Cw8hYZ8y.js.map → useDebouncedValue-Da0lPmj3.js.map} +1 -1
  203. package/dashboard/dist/assets/{useNamespace-D1218GQ8.js → useNamespace-DD_Esl6n.js} +2 -2
  204. package/dashboard/dist/assets/{useNamespace-D1218GQ8.js.map → useNamespace-DD_Esl6n.js.map} +1 -1
  205. package/dashboard/dist/assets/{useYamlActivityEvents-BAQf_y_U.js → useYamlActivityEvents-AeAhZJJk.js} +2 -2
  206. package/dashboard/dist/assets/{useYamlActivityEvents-BAQf_y_U.js.map → useYamlActivityEvents-AeAhZJJk.js.map} +1 -1
  207. package/dashboard/dist/assets/{yaml-workflows-CN01gEB0.js → yaml-workflows-BHAOOGvn.js} +2 -2
  208. package/dashboard/dist/assets/{yaml-workflows-CN01gEB0.js.map → yaml-workflows-BHAOOGvn.js.map} +1 -1
  209. package/dashboard/dist/index.html +1 -1
  210. package/docs/accumulator.md +3 -3
  211. package/docs/api/http/escalations.md +2 -1
  212. package/docs/api/sdk/escalations.md +3 -2
  213. package/docs/scan-codes.md +20 -9
  214. package/package.json +1 -1
  215. package/dashboard/dist/assets/ScanSchemeDetailPage-CUBRAtmJ.js +0 -2
  216. package/dashboard/dist/assets/ScanSchemeDetailPage-CUBRAtmJ.js.map +0 -1
  217. package/dashboard/dist/assets/index-3gbd5neL.js.map +0 -1
@@ -94,3 +94,11 @@ export declare function itemsView(escalation: LTEscalationRecord): EscalationIte
94
94
  export declare function getEscalationItems(input: {
95
95
  id: string;
96
96
  }, auth: LTApiAuth): Promise<LTApiResult<EscalationItemsView>>;
97
+ /**
98
+ * GET the held items of an accumulator or batch row by its `signal_key`, the
99
+ * deterministic home signal id a workflow knows without a row id. Read scope
100
+ * gates it; anything the caller may not see answers 404.
101
+ */
102
+ export declare function getEscalationItemsBySignalKey(input: {
103
+ signalKey: string;
104
+ }, auth: LTApiAuth): Promise<LTApiResult<EscalationItemsView>>;
@@ -41,6 +41,7 @@ exports.removeItemBySignalKey = removeItemBySignalKey;
41
41
  exports.removeItemByMetadata = removeItemByMetadata;
42
42
  exports.itemsView = itemsView;
43
43
  exports.getEscalationItems = getEscalationItems;
44
+ exports.getEscalationItemsBySignalKey = getEscalationItemsBySignalKey;
44
45
  const escalationService = __importStar(require("../../services/escalation"));
45
46
  const resolver_validation_1 = require("../../services/escalation/resolver-validation");
46
47
  const enforcement_cache_1 = require("../../services/role/enforcement-cache");
@@ -419,6 +420,30 @@ async function getEscalationItems(input, auth) {
419
420
  return { status: 500, error: err.message };
420
421
  }
421
422
  }
423
+ /**
424
+ * GET the held items of an accumulator or batch row by its `signal_key`, the
425
+ * deterministic home signal id a workflow knows without a row id. Read scope
426
+ * gates it; anything the caller may not see answers 404.
427
+ */
428
+ async function getEscalationItemsBySignalKey(input, auth) {
429
+ try {
430
+ if (!input.signalKey)
431
+ return { status: 400, error: 'signalKey is required' };
432
+ const escalation = await escalationService.getEscalationBySignalKey(input.signalKey);
433
+ if (!escalation)
434
+ return { status: 404, error: 'Escalation not found' };
435
+ if (await (0, helpers_1.assertReadAccess)(auth.userId, escalation)) {
436
+ return { status: 404, error: 'Escalation not found' };
437
+ }
438
+ const view = itemsView(escalation);
439
+ if (!view)
440
+ return { status: 400, error: 'Escalation holds no items' };
441
+ return { status: 200, data: view };
442
+ }
443
+ catch (err) {
444
+ return { status: 500, error: err.message };
445
+ }
446
+ }
422
447
  function sideData(side) {
423
448
  return {
424
449
  outcome: side.outcome,
@@ -6,7 +6,7 @@ export { claimEscalation, releaseEscalation } from './claim';
6
6
  export { releaseExpiredClaims, updatePriority, bulkClaim, bulkAssign, bulkUnassign, bulkEscalate, bulkTriage } from './bulk';
7
7
  export { resolveEscalation, resolveBySignalKey, resolveByIds, resolveAllOrNone } from './resolve';
8
8
  export { resolveBatchItem, resolveBatchItemBySignalKey, resolveBatchItemByMetadata } from './resolve-batch';
9
- export { accumulateItem, accumulateItemBySignalKey, accumulateItemByMetadata, removeItem, removeItemBySignalKey, removeItemByMetadata, getEscalationItems, itemsView, } from './accumulate';
9
+ export { accumulateItem, accumulateItemBySignalKey, accumulateItemByMetadata, removeItem, removeItemBySignalKey, removeItemByMetadata, getEscalationItems, getEscalationItemsBySignalKey, itemsView, } from './accumulate';
10
10
  export { findByMetadata, claimByMetadata, resolveByMetadata } from './metadata';
11
11
  export { cancelSingleEscalation, bulkCancel } from './cancel';
12
12
  export { searchByFacets, claimGroups, claimByFacets } from './facets';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
3
+ exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItemsBySignalKey = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
4
4
  var create_1 = require("./create");
5
5
  Object.defineProperty(exports, "createEscalation", { enumerable: true, get: function () { return create_1.createEscalation; } });
6
6
  var list_1 = require("./list");
@@ -45,6 +45,7 @@ Object.defineProperty(exports, "removeItem", { enumerable: true, get: function (
45
45
  Object.defineProperty(exports, "removeItemBySignalKey", { enumerable: true, get: function () { return accumulate_1.removeItemBySignalKey; } });
46
46
  Object.defineProperty(exports, "removeItemByMetadata", { enumerable: true, get: function () { return accumulate_1.removeItemByMetadata; } });
47
47
  Object.defineProperty(exports, "getEscalationItems", { enumerable: true, get: function () { return accumulate_1.getEscalationItems; } });
48
+ Object.defineProperty(exports, "getEscalationItemsBySignalKey", { enumerable: true, get: function () { return accumulate_1.getEscalationItemsBySignalKey; } });
48
49
  Object.defineProperty(exports, "itemsView", { enumerable: true, get: function () { return accumulate_1.itemsView; } });
49
50
  var metadata_1 = require("./metadata");
50
51
  Object.defineProperty(exports, "findByMetadata", { enumerable: true, get: function () { return metadata_1.findByMetadata; } });
@@ -16,8 +16,21 @@ export interface StepContext {
16
16
  }
17
17
  export declare function targetFilter(step: ScanStep, ctx: StepContext): Record<string, any>;
18
18
  export declare function templateContext(ctx: StepContext): scanCodeService.ScanTemplateContext;
19
+ /**
20
+ * The metadata of the acting user's single live claim, or undefined when
21
+ * they hold none or more than one. One scoped list query, read before the
22
+ * guarded write; the write re-checks everything under lock.
23
+ */
24
+ export declare function liveClaimMetadata(ctx: StepContext): Promise<Record<string, unknown> | undefined>;
25
+ /**
26
+ * The template context for one step: the scan tokens, the located item row's
27
+ * metadata when the verb has one, and the actor's live claim when the step's
28
+ * params mention `{claim.…}` (the lookup costs one query, so it runs only
29
+ * then).
30
+ */
31
+ export declare function stepTemplate(step: ScanStep, ctx: StepContext, item?: LTEscalationRecord): Promise<scanCodeService.ScanTemplateContext>;
19
32
  export declare function provenance(ctx: StepContext): Record<string, any>;
20
- export declare function interpolatedMetadata(step: ScanStep, ctx: StepContext): Record<string, any>;
33
+ export declare function interpolatedMetadata(step: ScanStep, ctx: StepContext, tpl?: scanCodeService.ScanTemplateContext): Record<string, any>;
21
34
  export declare function executed(escalation: LTEscalationRecord | Record<string, any> | undefined, step: Pick<ScanStep, 'verb'>): LTApiResult<ScanExecuteResponse>;
22
35
  export declare function forbidden(error?: string): LTApiResult<ScanExecuteResponse>;
23
36
  export declare function conflict(error?: string): LTApiResult<ScanExecuteResponse>;
@@ -35,6 +35,8 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.targetFilter = targetFilter;
37
37
  exports.templateContext = templateContext;
38
+ exports.liveClaimMetadata = liveClaimMetadata;
39
+ exports.stepTemplate = stepTemplate;
38
40
  exports.provenance = provenance;
39
41
  exports.interpolatedMetadata = interpolatedMetadata;
40
42
  exports.executed = executed;
@@ -42,6 +44,7 @@ exports.forbidden = forbidden;
42
44
  exports.conflict = conflict;
43
45
  exports.notPrimed = notPrimed;
44
46
  const scanCodeService = __importStar(require("../../services/scan-code"));
47
+ const escalationService = __importStar(require("../../services/escalation"));
45
48
  const types_1 = require("../../types");
46
49
  function targetFilter(step, ctx) {
47
50
  return { [ctx.scheme.target_facet]: ctx.parsed.target, ...(step.query?.facets ?? {}) };
@@ -49,6 +52,31 @@ function targetFilter(step, ctx) {
49
52
  function templateContext(ctx) {
50
53
  return { target: ctx.parsed.target, category: ctx.parsed.category, scannedAt: ctx.scannedAt };
51
54
  }
55
+ /**
56
+ * The metadata of the acting user's single live claim, or undefined when
57
+ * they hold none or more than one. One scoped list query, read before the
58
+ * guarded write; the write re-checks everything under lock.
59
+ */
60
+ async function liveClaimMetadata(ctx) {
61
+ const { escalations } = await escalationService.listEscalations({
62
+ assigned_to: ctx.auth.userId,
63
+ status: 'pending',
64
+ limit: 2,
65
+ });
66
+ const live = escalations.filter(types_1.isEffectivelyClaimed);
67
+ return live.length === 1 ? (live[0].metadata ?? {}) : undefined;
68
+ }
69
+ /**
70
+ * The template context for one step: the scan tokens, the located item row's
71
+ * metadata when the verb has one, and the actor's live claim when the step's
72
+ * params mention `{claim.…}` (the lookup costs one query, so it runs only
73
+ * then).
74
+ */
75
+ async function stepTemplate(step, ctx, item) {
76
+ const base = templateContext(ctx);
77
+ const claim = scanCodeService.mentionsClaimToken(step.params) ? await liveClaimMetadata(ctx) : undefined;
78
+ return { ...base, ...(item ? { item: item.metadata ?? {} } : {}), ...(claim ? { claim } : {}) };
79
+ }
52
80
  function provenance(ctx) {
53
81
  return {
54
82
  [types_1.SCAN_PROVENANCE_KEYS.SCHEME]: ctx.scheme.version,
@@ -60,9 +88,9 @@ function provenance(ctx) {
60
88
  ...(ctx.acting ? { [types_1.SCAN_PROVENANCE_KEYS.STATION]: ctx.stationAuth.userId } : {}),
61
89
  };
62
90
  }
63
- function interpolatedMetadata(step, ctx) {
91
+ function interpolatedMetadata(step, ctx, tpl = templateContext(ctx)) {
64
92
  return step.params?.metadata
65
- ? scanCodeService.interpolateScanTemplate(step.params.metadata, templateContext(ctx))
93
+ ? scanCodeService.interpolateScanTemplate(step.params.metadata, tpl)
66
94
  : {};
67
95
  }
68
96
  function executed(escalation, step) {
@@ -94,6 +94,7 @@ async function executeIdentityScan(parsed, scheme, rule, previousActingToken) {
94
94
  actor: { id: user.id, displayName: user.display_name || user.external_id },
95
95
  actingToken: (0, ephemeral_1.formatEphemeralToken)(uuid, types_1.ACTING_IDENTITY_LABEL),
96
96
  expiresAt,
97
+ maxUses: scheme.grant_max_uses ?? 0,
97
98
  },
98
99
  };
99
100
  }
@@ -20,11 +20,17 @@ export declare function cancelStep(step: ScanStep, ctx: StepContext): Promise<LT
20
20
  * item's own pending row through the scheme facet, reads the container
21
21
  * facet value it carries, and adds the target to the container that shares
22
22
  * it, writing the item row as the reciprocal in the same statement. An
23
- * item with no row, or no container facet, falls through.
23
+ * item with no row, or no container facet, falls through. An item whose
24
+ * container has closed and whose successor has not parked yet answers
25
+ * `no_open_container` with the item row, so the station can say "scan
26
+ * again" instead of showing the bag with no hint.
24
27
  * - Container-locate (no `containerFacet`): the scan locates the container
25
28
  * by the scheme facet and adds `params.itemKey` (template).
26
29
  *
27
- * The write is the SDK's guarded statement; the locate only picks ids. A
28
- * container already holding the item answers conflict, never a second add.
30
+ * Templates may read `{claim.<facet>}` (the actor's live claim) and, in item
31
+ * mode, `{item.<facet>}` (the located row); an unresolvable token falls
32
+ * through. The write is the SDK's guarded statement; the locate only picks
33
+ * ids. A container already holding the item answers conflict, never a
34
+ * second add.
29
35
  */
30
36
  export declare function accumulateStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
@@ -54,12 +54,30 @@ const locate_1 = require("./locate");
54
54
  // ctx.auth is the effective actor: the badged person when a grant rode the
55
55
  // request, otherwise the authenticated principal. Attribution and write
56
56
  // scoping both derive from it, live, inside the escalation APIs.
57
+ /**
58
+ * Interpolates a step's params, or falls through when a `{claim.…}` or
59
+ * `{item.…}` token has nothing to read: a literal token never reaches a row.
60
+ */
61
+ async function templated(step, ctx, render, item) {
62
+ const tpl = await (0, context_1.stepTemplate)(step, ctx, item);
63
+ try {
64
+ return render(tpl);
65
+ }
66
+ catch (err) {
67
+ if (err instanceof scanCodeService.ScanTemplateError)
68
+ return null;
69
+ throw err;
70
+ }
71
+ }
57
72
  async function claimStep(step, ctx) {
73
+ const metadata = await templated(step, ctx, (tpl) => (0, context_1.interpolatedMetadata)(step, ctx, tpl));
74
+ if (metadata === null)
75
+ return null;
58
76
  const result = await (0, metadata_1.claimByMetadata)({
59
77
  key: ctx.scheme.target_facet,
60
78
  value: ctx.parsed.target,
61
79
  durationMinutes: step.params?.durationMinutes,
62
- metadata: { ...(0, context_1.interpolatedMetadata)(step, ctx), ...(0, context_1.provenance)(ctx) },
80
+ metadata: { ...metadata, ...(0, context_1.provenance)(ctx) },
63
81
  restrictRoles: step.query?.roles,
64
82
  }, ctx.auth);
65
83
  if (result.status === 404)
@@ -71,11 +89,17 @@ async function claimStep(step, ctx) {
71
89
  return (0, context_1.executed)(result.data.escalation, step);
72
90
  }
73
91
  async function resolveStep(step, ctx) {
92
+ const rendered = await templated(step, ctx, (tpl) => ({
93
+ resolverPayload: scanCodeService.interpolateScanTemplate(step.params?.resolverPayload ?? {}, tpl),
94
+ metadata: (0, context_1.interpolatedMetadata)(step, ctx, tpl),
95
+ }));
96
+ if (rendered === null)
97
+ return null;
74
98
  const result = await (0, metadata_1.resolveByMetadata)({
75
99
  key: ctx.scheme.target_facet,
76
100
  value: ctx.parsed.target,
77
- resolverPayload: scanCodeService.interpolateScanTemplate(step.params?.resolverPayload ?? {}, (0, context_1.templateContext)(ctx)),
78
- metadata: { ...(0, context_1.interpolatedMetadata)(step, ctx), ...(0, context_1.provenance)(ctx) },
101
+ resolverPayload: rendered.resolverPayload,
102
+ metadata: { ...rendered.metadata, ...(0, context_1.provenance)(ctx) },
79
103
  restrictRoles: step.query?.roles,
80
104
  extraFacets: step.query?.facets,
81
105
  }, ctx.auth);
@@ -213,35 +237,52 @@ async function cancelStep(step, ctx) {
213
237
  * item's own pending row through the scheme facet, reads the container
214
238
  * facet value it carries, and adds the target to the container that shares
215
239
  * it, writing the item row as the reciprocal in the same statement. An
216
- * item with no row, or no container facet, falls through.
240
+ * item with no row, or no container facet, falls through. An item whose
241
+ * container has closed and whose successor has not parked yet answers
242
+ * `no_open_container` with the item row, so the station can say "scan
243
+ * again" instead of showing the bag with no hint.
217
244
  * - Container-locate (no `containerFacet`): the scan locates the container
218
245
  * by the scheme facet and adds `params.itemKey` (template).
219
246
  *
220
- * The write is the SDK's guarded statement; the locate only picks ids. A
221
- * container already holding the item answers conflict, never a second add.
247
+ * Templates may read `{claim.<facet>}` (the actor's live claim) and, in item
248
+ * mode, `{item.<facet>}` (the located row); an unresolvable token falls
249
+ * through. The write is the SDK's guarded statement; the locate only picks
250
+ * ids. A container already holding the item answers conflict, never a
251
+ * second add.
222
252
  */
223
253
  async function accumulateStep(step, ctx) {
224
- const tpl = (0, context_1.templateContext)(ctx);
225
- const payload = step.params?.resolverPayload
226
- ? scanCodeService.interpolateScanTemplate(step.params.resolverPayload, tpl)
227
- : undefined;
228
- const metadata = { ...(0, context_1.interpolatedMetadata)(step, ctx), ...(0, context_1.provenance)(ctx) };
229
254
  const options = step.params?.accumulate;
230
- let request;
255
+ let item;
231
256
  if (options?.containerFacet) {
232
257
  const located = await (0, locate_1.locateForStep)(step, ctx, 1);
233
- const item = located?.escalations[0];
258
+ item = located?.escalations[0];
234
259
  if (!item)
235
260
  return null;
261
+ }
262
+ const rendered = await templated(step, ctx, (tpl) => ({
263
+ payload: step.params?.resolverPayload
264
+ ? scanCodeService.interpolateScanTemplate(step.params.resolverPayload, tpl)
265
+ : undefined,
266
+ metadata: { ...(0, context_1.interpolatedMetadata)(step, ctx, tpl), ...(0, context_1.provenance)(ctx) },
267
+ itemKey: options?.containerFacet
268
+ ? ctx.parsed.target
269
+ : scanCodeService.interpolateScanTemplate(step.params.itemKey, tpl),
270
+ }), item);
271
+ if (rendered === null)
272
+ return null;
273
+ let request;
274
+ let container;
275
+ if (options?.containerFacet && item) {
236
276
  const containerValue = item.metadata?.[options.containerFacet];
237
277
  if (containerValue === undefined || containerValue === null || containerValue === '')
238
278
  return null;
279
+ container = { facet: options.containerFacet, value: String(containerValue) };
239
280
  request = {
240
- key: options.containerFacet,
241
- value: String(containerValue),
242
- itemKey: ctx.parsed.target,
243
- payload,
244
- metadata,
281
+ key: container.facet,
282
+ value: container.value,
283
+ itemKey: rendered.itemKey,
284
+ payload: rendered.payload,
285
+ metadata: rendered.metadata,
245
286
  restrictRoles: options.containerRoles,
246
287
  ...(options.reciprocal === false ? {} : { reciprocal: { id: item.id } }),
247
288
  };
@@ -250,15 +291,28 @@ async function accumulateStep(step, ctx) {
250
291
  request = {
251
292
  key: ctx.scheme.target_facet,
252
293
  value: ctx.parsed.target,
253
- itemKey: scanCodeService.interpolateScanTemplate(step.params.itemKey, tpl),
254
- payload,
255
- metadata,
294
+ itemKey: rendered.itemKey,
295
+ payload: rendered.payload,
296
+ metadata: rendered.metadata,
256
297
  restrictRoles: step.query?.roles,
257
298
  };
258
299
  }
259
300
  const result = await (0, accumulate_1.accumulateItemByMetadata)(request, ctx.auth);
260
- if (result.status === 404)
261
- return null;
301
+ if (result.status === 404) {
302
+ if (!container || !item)
303
+ return null;
304
+ return {
305
+ status: 200,
306
+ data: {
307
+ outcome: types_1.SCAN_OUTCOMES.NO_OPEN_CONTAINER,
308
+ verb: step.verb,
309
+ escalation: item,
310
+ container,
311
+ fallback: ctx.rule.fallback,
312
+ error: `No open container carries ${container.facet} = ${container.value}`,
313
+ },
314
+ };
315
+ }
262
316
  if (result.status === 403)
263
317
  return (0, context_1.forbidden)(result.error);
264
318
  if (result.status === 409)
package/build/index.d.ts CHANGED
@@ -3,7 +3,8 @@ export { midnightTheme } from './themes/midnight';
3
3
  export { registerLT, createLTInterceptor } from './services/interceptor';
4
4
  export { createLTActivityInterceptor } from './services/interceptor/activity-interceptor';
5
5
  export { executeLT } from './services/orchestrator';
6
- export { conditional, conditionLT } from './services/orchestrator/condition';
6
+ export { conditional, conditionLT, conditionalAccumulator } from './services/orchestrator/condition';
7
+ export type { ConditionEscalationConfig, ConditionAccumulatorConfig } from './services/orchestrator/condition';
7
8
  export type { ExecuteLTOptions } from './services/orchestrator/types';
8
9
  export { JwtAuthAdapter, createAuthMiddleware, requireAuth, requireAdmin, signToken, setAuthAdapter } from './modules/auth';
9
10
  export * from './types';
package/build/index.js CHANGED
@@ -36,8 +36,8 @@ var __importStar = (this && this.__importStar) || (function () {
36
36
  };
37
37
  })();
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.getActivityIdentity = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishKnowledgeEvent = exports.publishAgentEvent = exports.publishWorkflowEvent = exports.publishActivityEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.seedConfigTopics = exports.seedSystemTopics = exports.TopicService = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.setAuthAdapter = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.conditionLT = exports.conditional = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.midnightTheme = exports.start = void 0;
40
- exports.LTExpressAdapter = exports.api = exports.KnowledgeApi = exports.resolveCredential = exports.mimeFromPath = exports.getStorageBackend = exports.listOAuthConnections = exports.getFreshAccessToken = exports.createClient = exports.CallbackEventAdapter = exports.builtinMcpServerFactories = exports.getSystemAgents = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = void 0;
39
+ exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishKnowledgeEvent = exports.publishAgentEvent = exports.publishWorkflowEvent = exports.publishActivityEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.seedConfigTopics = exports.seedSystemTopics = exports.TopicService = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.setAuthAdapter = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.conditionalAccumulator = exports.conditionLT = exports.conditional = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.midnightTheme = exports.start = void 0;
40
+ exports.LTExpressAdapter = exports.api = exports.KnowledgeApi = exports.resolveCredential = exports.mimeFromPath = exports.getStorageBackend = exports.listOAuthConnections = exports.getFreshAccessToken = exports.createClient = exports.CallbackEventAdapter = exports.builtinMcpServerFactories = exports.getSystemAgents = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = void 0;
41
41
  const config_1 = require("./modules/config");
42
42
  const logger_1 = require("./lib/logger");
43
43
  const midnight_1 = require("./themes/midnight");
@@ -57,6 +57,7 @@ Object.defineProperty(exports, "executeLT", { enumerable: true, get: function ()
57
57
  var condition_1 = require("./services/orchestrator/condition");
58
58
  Object.defineProperty(exports, "conditional", { enumerable: true, get: function () { return condition_1.conditional; } });
59
59
  Object.defineProperty(exports, "conditionLT", { enumerable: true, get: function () { return condition_1.conditionLT; } });
60
+ Object.defineProperty(exports, "conditionalAccumulator", { enumerable: true, get: function () { return condition_1.conditionalAccumulator; } });
60
61
  var auth_1 = require("./modules/auth");
61
62
  Object.defineProperty(exports, "JwtAuthAdapter", { enumerable: true, get: function () { return auth_1.JwtAuthAdapter; } });
62
63
  Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return auth_1.createAuthMiddleware; } });
@@ -101,6 +101,14 @@ function registerAccumulateRoutes(router) {
101
101
  }, req.auth);
102
102
  res.status(result.status).json(result.data ?? { error: result.error });
103
103
  });
104
+ /**
105
+ * GET /api/escalations/items-by-signal-key?signalKey=…
106
+ * The held items of an accumulator or batch row by its signal_key.
107
+ */
108
+ router.get('/items-by-signal-key', async (req, res) => {
109
+ const result = await api.getEscalationItemsBySignalKey({ signalKey: String(req.query.signalKey ?? '') }, req.auth);
110
+ res.status(result.status).json(result.data ?? { error: result.error });
111
+ });
104
112
  /**
105
113
  * POST /api/escalations/:id/accumulate
106
114
  * Add one item. Interim adds answer { outcome: 'accepted', count, remaining };
@@ -269,6 +269,9 @@ export declare function createClient(options?: LTClientOptions): {
269
269
  getItems: (input: {
270
270
  id: string;
271
271
  }, auth?: LTApiAuth) => Promise<LTApiResult<import("../api/escalations/accumulate").EscalationItemsView>>;
272
+ getItemsBySignalKey: (input: {
273
+ signalKey: string;
274
+ }, auth?: LTApiAuth) => Promise<LTApiResult<import("../api/escalations/accumulate").EscalationItemsView>>;
272
275
  searchByFacets: (input: import("..").FacetQuery, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
273
276
  claimGroups: (input: {
274
277
  query: import("..").FacetQuery;
@@ -154,6 +154,7 @@ function createClient(options = {}) {
154
154
  removeItemBySignalKey: bindAuth(escalationsApi.removeItemBySignalKey, auth),
155
155
  removeItemByMetadata: bindAuth(escalationsApi.removeItemByMetadata, auth),
156
156
  getItems: bindAuth(escalationsApi.getEscalationItems, auth),
157
+ getItemsBySignalKey: bindAuth(escalationsApi.getEscalationItemsBySignalKey, auth),
157
158
  // Faceted-routing surface (pond search + batch claim), RBAC-scoped to the caller's role.
158
159
  searchByFacets: bindAuth(escalationsApi.searchByFacets, auth),
159
160
  claimGroups: bindAuth(escalationsApi.claimGroups, auth),
@@ -1,4 +1,4 @@
1
1
  export { listScanSchemes, getScanScheme, listScanRules, getScanRule, } from './read';
2
2
  export { upsertScanScheme, deleteScanScheme, upsertScanRule, deleteScanRule, seedScanScheme, seedScanRule, applyScanScheme, applyScanRule, type ScanSchemeInput, type ScanRuleInput, } from './write';
3
- export { parseScanCode, interpolateScanTemplate, type ScanParseResult, type ScanParseFailure, type ScanTemplateContext, } from './parse';
3
+ export { parseScanCode, interpolateScanTemplate, mentionsClaimToken, ScanTemplateError, type ScanParseResult, type ScanParseFailure, type ScanTemplateContext, } from './parse';
4
4
  export { assertValidScheme, assertValidSteps } from './validate';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.assertValidSteps = exports.assertValidScheme = exports.interpolateScanTemplate = exports.parseScanCode = exports.applyScanRule = exports.applyScanScheme = exports.seedScanRule = exports.seedScanScheme = exports.deleteScanRule = exports.upsertScanRule = exports.deleteScanScheme = exports.upsertScanScheme = exports.getScanRule = exports.listScanRules = exports.getScanScheme = exports.listScanSchemes = void 0;
3
+ exports.assertValidSteps = exports.assertValidScheme = exports.ScanTemplateError = exports.mentionsClaimToken = exports.interpolateScanTemplate = exports.parseScanCode = exports.applyScanRule = exports.applyScanScheme = exports.seedScanRule = exports.seedScanScheme = exports.deleteScanRule = exports.upsertScanRule = exports.deleteScanScheme = exports.upsertScanScheme = exports.getScanRule = exports.listScanRules = exports.getScanScheme = exports.listScanSchemes = void 0;
4
4
  var read_1 = require("./read");
5
5
  Object.defineProperty(exports, "listScanSchemes", { enumerable: true, get: function () { return read_1.listScanSchemes; } });
6
6
  Object.defineProperty(exports, "getScanScheme", { enumerable: true, get: function () { return read_1.getScanScheme; } });
@@ -18,6 +18,8 @@ Object.defineProperty(exports, "applyScanRule", { enumerable: true, get: functio
18
18
  var parse_1 = require("./parse");
19
19
  Object.defineProperty(exports, "parseScanCode", { enumerable: true, get: function () { return parse_1.parseScanCode; } });
20
20
  Object.defineProperty(exports, "interpolateScanTemplate", { enumerable: true, get: function () { return parse_1.interpolateScanTemplate; } });
21
+ Object.defineProperty(exports, "mentionsClaimToken", { enumerable: true, get: function () { return parse_1.mentionsClaimToken; } });
22
+ Object.defineProperty(exports, "ScanTemplateError", { enumerable: true, get: function () { return parse_1.ScanTemplateError; } });
21
23
  var validate_1 = require("./validate");
22
24
  Object.defineProperty(exports, "assertValidScheme", { enumerable: true, get: function () { return validate_1.assertValidScheme; } });
23
25
  Object.defineProperty(exports, "assertValidSteps", { enumerable: true, get: function () { return validate_1.assertValidSteps; } });
@@ -26,10 +26,24 @@ export interface ScanTemplateContext {
26
26
  target: string;
27
27
  category: string;
28
28
  scannedAt: string;
29
+ /** The acting user's single live claim, its metadata; absent when none or ambiguous. */
30
+ claim?: Record<string, unknown>;
31
+ /** The row an item-mode accumulate step located, its metadata. */
32
+ item?: Record<string, unknown>;
29
33
  }
34
+ /** A `{claim.x}` or `{item.x}` token the context cannot resolve. */
35
+ export declare class ScanTemplateError extends Error {
36
+ readonly token: string;
37
+ readonly reason: string;
38
+ constructor(token: string, reason: string);
39
+ }
40
+ /** True when any string in the params mentions a `{claim.…}` token. */
41
+ export declare function mentionsClaimToken(value: unknown): boolean;
30
42
  /**
31
- * Replace SCAN_TEMPLATE_TOKENS inside string values of a params object.
32
- * Deep, pure, non-mutating. Only exact-token and in-string replacement of
33
- * the three known tokens no expression language.
43
+ * Replace the template tokens inside string values of a params object.
44
+ * Deep, pure, non-mutating. The three scan tokens are plain text
45
+ * replacement; `{claim.<facet>}` and `{item.<facet>}` read the context's
46
+ * facet bags and throw {@link ScanTemplateError} when they cannot resolve,
47
+ * so a literal token never reaches a row. No expression language.
34
48
  */
35
49
  export declare function interpolateScanTemplate<T>(value: T, ctx: ScanTemplateContext): T;
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScanTemplateError = void 0;
3
4
  exports.parseScanCode = parseScanCode;
5
+ exports.mentionsClaimToken = mentionsClaimToken;
4
6
  exports.interpolateScanTemplate = interpolateScanTemplate;
5
7
  const types_1 = require("../../types");
6
8
  /**
@@ -82,17 +84,48 @@ function malformed(scheme, detail) {
82
84
  failure: { reason: 'malformed', detail: `scheme ${scheme.version} ("${scheme.name}"): ${detail}` },
83
85
  };
84
86
  }
87
+ /** A `{claim.x}` or `{item.x}` token the context cannot resolve. */
88
+ class ScanTemplateError extends Error {
89
+ constructor(token, reason) {
90
+ super(`scan template ${token}: ${reason}`);
91
+ this.token = token;
92
+ this.reason = reason;
93
+ this.name = 'ScanTemplateError';
94
+ }
95
+ }
96
+ exports.ScanTemplateError = ScanTemplateError;
97
+ const BAG_TOKEN = /\{(claim|item)\.([a-zA-Z0-9_]+)\}/g;
98
+ /** True when any string in the params mentions a `{claim.…}` token. */
99
+ function mentionsClaimToken(value) {
100
+ return JSON.stringify(value ?? null).includes(`{${types_1.SCAN_TEMPLATE_BAGS.CLAIM}.`);
101
+ }
102
+ function resolveBagToken(ctx, bag, facet, token) {
103
+ const source = bag === types_1.SCAN_TEMPLATE_BAGS.CLAIM ? ctx.claim : ctx.item;
104
+ if (!source) {
105
+ throw new ScanTemplateError(token, bag === types_1.SCAN_TEMPLATE_BAGS.CLAIM
106
+ ? 'the actor holds no single live claim'
107
+ : 'no located item row on this step');
108
+ }
109
+ const v = source[facet];
110
+ if (v === undefined || v === null || v === '') {
111
+ throw new ScanTemplateError(token, `facet ${facet} is absent`);
112
+ }
113
+ return typeof v === 'object' ? JSON.stringify(v) : String(v);
114
+ }
85
115
  /**
86
- * Replace SCAN_TEMPLATE_TOKENS inside string values of a params object.
87
- * Deep, pure, non-mutating. Only exact-token and in-string replacement of
88
- * the three known tokens no expression language.
116
+ * Replace the template tokens inside string values of a params object.
117
+ * Deep, pure, non-mutating. The three scan tokens are plain text
118
+ * replacement; `{claim.<facet>}` and `{item.<facet>}` read the context's
119
+ * facet bags and throw {@link ScanTemplateError} when they cannot resolve,
120
+ * so a literal token never reaches a row. No expression language.
89
121
  */
90
122
  function interpolateScanTemplate(value, ctx) {
91
123
  if (typeof value === 'string') {
92
- return value
124
+ const scanned = value
93
125
  .split(types_1.SCAN_TEMPLATE_TOKENS.TARGET).join(ctx.target)
94
126
  .split(types_1.SCAN_TEMPLATE_TOKENS.CATEGORY).join(ctx.category)
95
127
  .split(types_1.SCAN_TEMPLATE_TOKENS.SCANNED_AT).join(ctx.scannedAt);
128
+ return scanned.replace(BAG_TOKEN, (token, bag, facet) => resolveBagToken(ctx, bag, facet, token));
96
129
  }
97
130
  if (Array.isArray(value)) {
98
131
  return value.map((v) => interpolateScanTemplate(v, ctx));
@@ -161,6 +161,7 @@ function assertValidSteps(steps) {
161
161
  throw new Error(`${at}: accumulate requires params.itemKey or params.accumulate.containerFacet`);
162
162
  }
163
163
  }
164
+ assertValidTemplateTokens(step, at);
164
165
  if (step.query && step.query.roles && !Array.isArray(step.query.roles)) {
165
166
  throw new Error(`${at}: query.roles must be an array`);
166
167
  }
@@ -178,3 +179,21 @@ function assertValidSteps(steps) {
178
179
  }
179
180
  });
180
181
  }
182
+ const BAG_TOKEN = /\{(claim|item)\.([^}]*)\}/g;
183
+ /**
184
+ * `{claim.<facet>}` and `{item.<facet>}` name facet keys; `{item.…}` reads
185
+ * the located row, which only an item-mode accumulate step has.
186
+ */
187
+ function assertValidTemplateTokens(step, at) {
188
+ const text = JSON.stringify(step.params ?? {});
189
+ const itemMode = step.verb === types_1.SCAN_VERBS.ACCUMULATE && !!step.params?.accumulate?.containerFacet;
190
+ for (const match of text.matchAll(BAG_TOKEN)) {
191
+ const [token, bag, facet] = match;
192
+ if (!facet_sql_1.FACET_KEY.test(facet)) {
193
+ throw new Error(`${at}: template token ${token} must name a facet key`);
194
+ }
195
+ if (bag === 'item' && !itemMode) {
196
+ throw new Error(`${at}: ${token} reads the located item row, which only an item-mode accumulate step has`);
197
+ }
198
+ }
199
+ }
@@ -251,7 +251,12 @@ function registerEscalationTools(server) {
251
251
  description: 'The held items of an accumulator or batch escalation in arrival order, with the count and max.',
252
252
  inputSchema: schemas_1.getEscalationItemsSchema,
253
253
  }, async (args) => {
254
- const result = await escalationApi.getEscalationItems({ id: args.id }, await systemAuth());
254
+ if (!args.id && !args.signalKey) {
255
+ return { content: [{ type: 'text', text: JSON.stringify({ error: 'id or signalKey is required' }) }], isError: true };
256
+ }
257
+ const result = args.id
258
+ ? await escalationApi.getEscalationItems({ id: args.id }, await systemAuth())
259
+ : await escalationApi.getEscalationItemsBySignalKey({ signalKey: args.signalKey }, await systemAuth());
255
260
  if (result.error) {
256
261
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
257
262
  }
@@ -284,11 +284,14 @@ export declare const removeItemSchema: z.ZodObject<{
284
284
  } | undefined;
285
285
  }>;
286
286
  export declare const getEscalationItemsSchema: z.ZodObject<{
287
- id: z.ZodString;
287
+ id: z.ZodOptional<z.ZodString>;
288
+ signalKey: z.ZodOptional<z.ZodString>;
288
289
  }, "strip", z.ZodTypeAny, {
289
- id: string;
290
+ id?: string | undefined;
291
+ signalKey?: string | undefined;
290
292
  }, {
291
- id: string;
293
+ id?: string | undefined;
294
+ signalKey?: string | undefined;
292
295
  }>;
293
296
  export declare const escalateEscalationSchema: z.ZodObject<{
294
297
  id: z.ZodString;
@@ -104,7 +104,8 @@ exports.removeItemSchema = zod_1.z.object({
104
104
  reciprocal: adminReciprocalSchema.omit({ payload: true }).optional(),
105
105
  });
106
106
  exports.getEscalationItemsSchema = zod_1.z.object({
107
- id: zod_1.z.string().describe('Accumulator or batch escalation UUID'),
107
+ id: zod_1.z.string().optional().describe('Accumulator or batch escalation UUID'),
108
+ signalKey: zod_1.z.string().optional().describe('The row signal_key, when the caller knows the home signal id rather than the row id'),
108
109
  });
109
110
  exports.escalateEscalationSchema = zod_1.z.object({
110
111
  id: zod_1.z.string().describe('Escalation UUID'),