@hotmeshio/long-tail 0.14.0 → 0.14.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 (263) hide show
  1. package/build/api/escalations/bulk.d.ts +18 -0
  2. package/build/api/escalations/bulk.js +49 -1
  3. package/build/api/escalations/claim.d.ts +4 -1
  4. package/build/api/escalations/claim.js +6 -2
  5. package/build/api/escalations/helpers.d.ts +11 -1
  6. package/build/api/escalations/helpers.js +30 -3
  7. package/build/api/escalations/index.d.ts +1 -1
  8. package/build/api/escalations/index.js +2 -1
  9. package/build/index.js +4 -0
  10. package/build/routes/escalations/bulk.js +6 -0
  11. package/build/routes/escalations/single.js +3 -1
  12. package/build/sdk/index.d.ts +5 -0
  13. package/build/sdk/index.js +1 -0
  14. package/build/services/escalation/bulk.d.ts +27 -0
  15. package/build/services/escalation/bulk.js +39 -0
  16. package/build/services/escalation/crud.d.ts +10 -2
  17. package/build/services/escalation/crud.js +20 -12
  18. package/build/services/escalation/sql.d.ts +17 -0
  19. package/build/services/escalation/sql.js +44 -1
  20. package/build/system/mcp-servers/admin/escalations.js +13 -1
  21. package/build/system/mcp-servers/admin/schemas.d.ts +10 -0
  22. package/build/system/mcp-servers/admin/schemas.js +6 -2
  23. package/build/system/seed/tool-manifests-admin.d.ts +88 -0
  24. package/build/system/seed/tool-manifests-admin.js +2 -1
  25. package/dashboard/dist/assets/{AdminDashboard-DeZsR4pA.js → AdminDashboard-BS3wd7Zg.js} +2 -2
  26. package/dashboard/dist/assets/{AdminDashboard-DeZsR4pA.js.map → AdminDashboard-BS3wd7Zg.js.map} +1 -1
  27. package/dashboard/dist/assets/{AgentConfigPage-Bi5ZAsjf.js → AgentConfigPage-4C9aU0dj.js} +6 -6
  28. package/dashboard/dist/assets/{AgentConfigPage-Bi5ZAsjf.js.map → AgentConfigPage-4C9aU0dj.js.map} +1 -1
  29. package/dashboard/dist/assets/{AgentDetailPage-CIbKor5E.js → AgentDetailPage-B6uvDnMF.js} +3 -3
  30. package/dashboard/dist/assets/{AgentDetailPage-CIbKor5E.js.map → AgentDetailPage-B6uvDnMF.js.map} +1 -1
  31. package/dashboard/dist/assets/{AgentsPage-CRFZ6KDu.js → AgentsPage-vtxdvdrQ.js} +2 -2
  32. package/dashboard/dist/assets/{AgentsPage-CRFZ6KDu.js.map → AgentsPage-vtxdvdrQ.js.map} +1 -1
  33. package/dashboard/dist/assets/AvailableEscalationsPage-C9VKPhD6.js +2 -0
  34. package/dashboard/dist/assets/AvailableEscalationsPage-C9VKPhD6.js.map +1 -0
  35. package/dashboard/dist/assets/BotPicker-CkY9u7nD.js +2 -0
  36. package/dashboard/dist/assets/{BotPicker-dUpw1wW6.js.map → BotPicker-CkY9u7nD.js.map} +1 -1
  37. package/dashboard/dist/assets/BulkAssignModal-OIbUDYlC.js +2 -0
  38. package/dashboard/dist/assets/BulkAssignModal-OIbUDYlC.js.map +1 -0
  39. package/dashboard/dist/assets/CapabilitiesPage-Bkbq_GO6.js +2 -0
  40. package/dashboard/dist/assets/{CapabilitiesPage-Ca2jEln-.js.map → CapabilitiesPage-Bkbq_GO6.js.map} +1 -1
  41. package/dashboard/dist/assets/{CollapsibleSection-BXlR5QmW.js → CollapsibleSection-Zuz9HkFL.js} +2 -2
  42. package/dashboard/dist/assets/{CollapsibleSection-BXlR5QmW.js.map → CollapsibleSection-Zuz9HkFL.js.map} +1 -1
  43. package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js +2 -0
  44. package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js.map +1 -0
  45. package/dashboard/dist/assets/{CredentialsPage-CGyCCzGh.js → CredentialsPage-CAmDMnzV.js} +2 -2
  46. package/dashboard/dist/assets/{CredentialsPage-CGyCCzGh.js.map → CredentialsPage-CAmDMnzV.js.map} +1 -1
  47. package/dashboard/dist/assets/{CronLabel-CAu2hmQf.js → CronLabel-DX2woCPZ.js} +2 -2
  48. package/dashboard/dist/assets/{CronLabel-CAu2hmQf.js.map → CronLabel-DX2woCPZ.js.map} +1 -1
  49. package/dashboard/dist/assets/{DataTable-Bir0Xs1p.js → DataTable-DFPMeqyQ.js} +2 -2
  50. package/dashboard/dist/assets/DataTable-DFPMeqyQ.js.map +1 -0
  51. package/dashboard/dist/assets/{DropZone-DovkhN2p.js → DropZone-7UoXQ4qL.js} +2 -2
  52. package/dashboard/dist/assets/{DropZone-DovkhN2p.js.map → DropZone-7UoXQ4qL.js.map} +1 -1
  53. package/dashboard/dist/assets/{ElapsedCell-B1eoCzEw.js → ElapsedCell-D2old1NF.js} +2 -2
  54. package/dashboard/dist/assets/{ElapsedCell-B1eoCzEw.js.map → ElapsedCell-D2old1NF.js.map} +1 -1
  55. package/dashboard/dist/assets/{EntityTimelinePanel-CIOyjwjM.js → EntityTimelinePanel-m9baDiW0.js} +2 -2
  56. package/dashboard/dist/assets/{EntityTimelinePanel-CIOyjwjM.js.map → EntityTimelinePanel-m9baDiW0.js.map} +1 -1
  57. package/dashboard/dist/assets/{EscalationListSchemaPage-DQNQ7o_4.js → EscalationListSchemaPage-BPr7Ou8c.js} +3 -3
  58. package/dashboard/dist/assets/{EscalationListSchemaPage-DQNQ7o_4.js.map → EscalationListSchemaPage-BPr7Ou8c.js.map} +1 -1
  59. package/dashboard/dist/assets/{EscalationSchemaPage-DFgDn4R3.js → EscalationSchemaPage-83n5JyAh.js} +3 -3
  60. package/dashboard/dist/assets/{EscalationSchemaPage-DFgDn4R3.js.map → EscalationSchemaPage-83n5JyAh.js.map} +1 -1
  61. package/dashboard/dist/assets/{EscalationsOverview-DfbKtXVZ.js → EscalationsOverview-CDJ5wRlq.js} +2 -2
  62. package/dashboard/dist/assets/{EscalationsOverview-DfbKtXVZ.js.map → EscalationsOverview-CDJ5wRlq.js.map} +1 -1
  63. package/dashboard/dist/assets/{EventTable-CZPkvhao.js → EventTable-DRUHkKtv.js} +2 -2
  64. package/dashboard/dist/assets/{EventTable-CZPkvhao.js.map → EventTable-DRUHkKtv.js.map} +1 -1
  65. package/dashboard/dist/assets/{FilterBar-CYjKK9Cp.js → FilterBar-C06DK5Oa.js} +2 -2
  66. package/dashboard/dist/assets/{FilterBar-CYjKK9Cp.js.map → FilterBar-C06DK5Oa.js.map} +1 -1
  67. package/dashboard/dist/assets/{GraphInvokePage-DY9u42vt.js → GraphInvokePage-DSlyTmyq.js} +2 -2
  68. package/dashboard/dist/assets/{GraphInvokePage-DY9u42vt.js.map → GraphInvokePage-DSlyTmyq.js.map} +1 -1
  69. package/dashboard/dist/assets/{HomePage-p_CYlGnh.js → HomePage-DXzDBkQV.js} +2 -2
  70. package/dashboard/dist/assets/{HomePage-p_CYlGnh.js.map → HomePage-DXzDBkQV.js.map} +1 -1
  71. package/dashboard/dist/assets/{ListToolbar-Dz-1RXSH.js → ListToolbar-BvpGFFYp.js} +2 -2
  72. package/dashboard/dist/assets/{ListToolbar-Dz-1RXSH.js.map → ListToolbar-BvpGFFYp.js.map} +1 -1
  73. package/dashboard/dist/assets/{McpOverview-BUI9sVTk.js → McpOverview-C2atR_B6.js} +2 -2
  74. package/dashboard/dist/assets/{McpOverview-BUI9sVTk.js.map → McpOverview-C2atR_B6.js.map} +1 -1
  75. package/dashboard/dist/assets/{McpQueryDetailPage-CVN_UAB3.js → McpQueryDetailPage-BUxPspjB.js} +3 -3
  76. package/dashboard/dist/assets/{McpQueryDetailPage-CVN_UAB3.js.map → McpQueryDetailPage-BUxPspjB.js.map} +1 -1
  77. package/dashboard/dist/assets/McpQueryPage-CM_Fgl9G.js +2 -0
  78. package/dashboard/dist/assets/{McpQueryPage-DRTKSPDR.js.map → McpQueryPage-CM_Fgl9G.js.map} +1 -1
  79. package/dashboard/dist/assets/{McpRunDetailPage-CTb1AxR3.js → McpRunDetailPage-Bo9vXQBA.js} +2 -2
  80. package/dashboard/dist/assets/{McpRunDetailPage-CTb1AxR3.js.map → McpRunDetailPage-Bo9vXQBA.js.map} +1 -1
  81. package/dashboard/dist/assets/{McpRunsPage-BWLwjVd0.js → McpRunsPage-BwsgvGtg.js} +2 -2
  82. package/dashboard/dist/assets/{McpRunsPage-BWLwjVd0.js.map → McpRunsPage-BwsgvGtg.js.map} +1 -1
  83. package/dashboard/dist/assets/{NamespacePill-BeifzjUm.js → NamespacePill-CKp_9EaI.js} +2 -2
  84. package/dashboard/dist/assets/{NamespacePill-BeifzjUm.js.map → NamespacePill-CKp_9EaI.js.map} +1 -1
  85. package/dashboard/dist/assets/OperationsPage-BftWAJ9m.js +3 -0
  86. package/dashboard/dist/assets/OperationsPage-BftWAJ9m.js.map +1 -0
  87. package/dashboard/dist/assets/{OperatorDashboard-DGs9kPOZ.js → OperatorDashboard-CKjrYYFi.js} +2 -2
  88. package/dashboard/dist/assets/{OperatorDashboard-DGs9kPOZ.js.map → OperatorDashboard-CKjrYYFi.js.map} +1 -1
  89. package/dashboard/dist/assets/{PageHeader-BpeBHqyc.js → PageHeader-CDDpHpdv.js} +2 -2
  90. package/dashboard/dist/assets/{PageHeader-BpeBHqyc.js.map → PageHeader-CDDpHpdv.js.map} +1 -1
  91. package/dashboard/dist/assets/{PageHeaderWithStats-JXeUFa_g.js → PageHeaderWithStats-DIWH6fRv.js} +2 -2
  92. package/dashboard/dist/assets/{PageHeaderWithStats-JXeUFa_g.js.map → PageHeaderWithStats-DIWH6fRv.js.map} +1 -1
  93. package/dashboard/dist/assets/{PersonaDetailPage-C33MgXUY.js → PersonaDetailPage-BsIPtBxZ.js} +2 -2
  94. package/dashboard/dist/assets/{PersonaDetailPage-C33MgXUY.js.map → PersonaDetailPage-BsIPtBxZ.js.map} +1 -1
  95. package/dashboard/dist/assets/{PersonasPage-BbLOHq5X.js → PersonasPage-62hANmNf.js} +2 -2
  96. package/dashboard/dist/assets/{PersonasPage-BbLOHq5X.js.map → PersonasPage-62hANmNf.js.map} +1 -1
  97. package/dashboard/dist/assets/{ProcessDetailPage-zwd0HCJl.js → ProcessDetailPage-DS_t9DcR.js} +2 -2
  98. package/dashboard/dist/assets/{ProcessDetailPage-zwd0HCJl.js.map → ProcessDetailPage-DS_t9DcR.js.map} +1 -1
  99. package/dashboard/dist/assets/{ProcessesListPage-DnfmK6jf.js → ProcessesListPage-Ch2tSICc.js} +2 -2
  100. package/dashboard/dist/assets/{ProcessesListPage-DnfmK6jf.js.map → ProcessesListPage-Ch2tSICc.js.map} +1 -1
  101. package/dashboard/dist/assets/{RoleDetailPage-axZtFPC_.js → RoleDetailPage-DVbtnTvn.js} +3 -3
  102. package/dashboard/dist/assets/{RoleDetailPage-axZtFPC_.js.map → RoleDetailPage-DVbtnTvn.js.map} +1 -1
  103. package/dashboard/dist/assets/{RolePill-EocCXZh0.js → RolePill-C0hExOmI.js} +2 -2
  104. package/dashboard/dist/assets/{RolePill-EocCXZh0.js.map → RolePill-C0hExOmI.js.map} +1 -1
  105. package/dashboard/dist/assets/{RolesPage-DN6yqH7-.js → RolesPage-CK6FjD5P.js} +2 -2
  106. package/dashboard/dist/assets/{RolesPage-DN6yqH7-.js.map → RolesPage-CK6FjD5P.js.map} +1 -1
  107. package/dashboard/dist/assets/RunAsSelector-ImueSaJ4.js +2 -0
  108. package/dashboard/dist/assets/{RunAsSelector-DrGsUhL8.js.map → RunAsSelector-ImueSaJ4.js.map} +1 -1
  109. package/dashboard/dist/assets/{ScanCodesPage-BmQjEyWZ.js → ScanCodesPage-CDqLJuCq.js} +2 -2
  110. package/dashboard/dist/assets/{ScanCodesPage-BmQjEyWZ.js.map → ScanCodesPage-CDqLJuCq.js.map} +1 -1
  111. package/dashboard/dist/assets/ScanSchemeDetailPage-DO6qtJdM.js +2 -0
  112. package/dashboard/dist/assets/ScanSchemeDetailPage-DO6qtJdM.js.map +1 -0
  113. package/dashboard/dist/assets/ScanStationPage-ID3xMhds.js +2 -0
  114. package/dashboard/dist/assets/ScanStationPage-ID3xMhds.js.map +1 -0
  115. package/dashboard/dist/assets/{ScopeBadge-H5dEqeHi.js → ScopeBadge-BBQvz4pj.js} +2 -2
  116. package/dashboard/dist/assets/{ScopeBadge-H5dEqeHi.js.map → ScopeBadge-BBQvz4pj.js.map} +1 -1
  117. package/dashboard/dist/assets/StatusBadge-BDeUwPtb.js +2 -0
  118. package/dashboard/dist/assets/StatusBadge-BDeUwPtb.js.map +1 -0
  119. package/dashboard/dist/assets/{StickyPagination-9VkHiOsT.js → StickyPagination-XA1krmz5.js} +2 -2
  120. package/dashboard/dist/assets/{StickyPagination-9VkHiOsT.js.map → StickyPagination-XA1krmz5.js.map} +1 -1
  121. package/dashboard/dist/assets/{StreamMessageDetail-C37J6Qyz.js → StreamMessageDetail-DziA1g1e.js} +2 -2
  122. package/dashboard/dist/assets/{StreamMessageDetail-C37J6Qyz.js.map → StreamMessageDetail-DziA1g1e.js.map} +1 -1
  123. package/dashboard/dist/assets/{SwimlaneTimeline-NVGsBIX-.js → SwimlaneTimeline-DTNEnHiF.js} +2 -2
  124. package/dashboard/dist/assets/{SwimlaneTimeline-NVGsBIX-.js.map → SwimlaneTimeline-DTNEnHiF.js.map} +1 -1
  125. package/dashboard/dist/assets/{TagInput-Ch5u6iPH.js → TagInput-BXxXs1JD.js} +2 -2
  126. package/dashboard/dist/assets/{TagInput-Ch5u6iPH.js.map → TagInput-BXxXs1JD.js.map} +1 -1
  127. package/dashboard/dist/assets/{TaskDetailPage-5sbMHi5U.js → TaskDetailPage-U19sJHAI.js} +2 -2
  128. package/dashboard/dist/assets/{TaskDetailPage-5sbMHi5U.js.map → TaskDetailPage-U19sJHAI.js.map} +1 -1
  129. package/dashboard/dist/assets/{TaskQueuePill-Bz146p-P.js → TaskQueuePill-BKGJBVZG.js} +2 -2
  130. package/dashboard/dist/assets/{TaskQueuePill-Bz146p-P.js.map → TaskQueuePill-BKGJBVZG.js.map} +1 -1
  131. package/dashboard/dist/assets/{TasksListPage-C9AN7IBb.js → TasksListPage-jc4Xk7kI.js} +2 -2
  132. package/dashboard/dist/assets/{TasksListPage-C9AN7IBb.js.map → TasksListPage-jc4Xk7kI.js.map} +1 -1
  133. package/dashboard/dist/assets/{TimeAgo-CsbQGlSd.js → TimeAgo-GWgJ0LVq.js} +2 -2
  134. package/dashboard/dist/assets/{TimeAgo-CsbQGlSd.js.map → TimeAgo-GWgJ0LVq.js.map} +1 -1
  135. package/dashboard/dist/assets/{TimestampCell-DlbIkV-G.js → TimestampCell-Dk1TVsFV.js} +2 -2
  136. package/dashboard/dist/assets/{TimestampCell-DlbIkV-G.js.map → TimestampCell-Dk1TVsFV.js.map} +1 -1
  137. package/dashboard/dist/assets/{ToolPill-sj8OkBB0.js → ToolPill-BY6zLSfA.js} +2 -2
  138. package/dashboard/dist/assets/{ToolPill-sj8OkBB0.js.map → ToolPill-BY6zLSfA.js.map} +1 -1
  139. package/dashboard/dist/assets/{ToolTestPanel-BKbLocvr.js → ToolTestPanel-BKcqnR68.js} +2 -2
  140. package/dashboard/dist/assets/{ToolTestPanel-BKbLocvr.js.map → ToolTestPanel-BKcqnR68.js.map} +1 -1
  141. package/dashboard/dist/assets/{TopicDetailPage-fOnTfDso.js → TopicDetailPage-D8GcDu_0.js} +4 -4
  142. package/dashboard/dist/assets/{TopicDetailPage-fOnTfDso.js.map → TopicDetailPage-D8GcDu_0.js.map} +1 -1
  143. package/dashboard/dist/assets/{TopicsPage-BoVkp7DM.js → TopicsPage-BT9LV3yH.js} +2 -2
  144. package/dashboard/dist/assets/{TopicsPage-BoVkp7DM.js.map → TopicsPage-BT9LV3yH.js.map} +1 -1
  145. package/dashboard/dist/assets/UserName-BrwZnLjU.js +2 -0
  146. package/dashboard/dist/assets/{UserName-0gjVPU_U.js.map → UserName-BrwZnLjU.js.map} +1 -1
  147. package/dashboard/dist/assets/WorkflowExecutionPage-CldfHwky.js +2 -0
  148. package/dashboard/dist/assets/WorkflowExecutionPage-CldfHwky.js.map +1 -0
  149. package/dashboard/dist/assets/{WorkflowPill-BcA7S3gI.js → WorkflowPill-qp5UF3-y.js} +2 -2
  150. package/dashboard/dist/assets/{WorkflowPill-BcA7S3gI.js.map → WorkflowPill-qp5UF3-y.js.map} +1 -1
  151. package/dashboard/dist/assets/{WorkflowsDashboard-Bzvz6tTY.js → WorkflowsDashboard-DkyGkxW1.js} +2 -2
  152. package/dashboard/dist/assets/{WorkflowsDashboard-Bzvz6tTY.js.map → WorkflowsDashboard-DkyGkxW1.js.map} +1 -1
  153. package/dashboard/dist/assets/{WorkflowsOverview-BkcRU4Ej.js → WorkflowsOverview-DACADuUE.js} +2 -2
  154. package/dashboard/dist/assets/{WorkflowsOverview-BkcRU4Ej.js.map → WorkflowsOverview-DACADuUE.js.map} +1 -1
  155. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmM78sYi.js → YamlWorkflowDetailPage-DSAjzido.js} +2 -2
  156. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmM78sYi.js.map → YamlWorkflowDetailPage-DSAjzido.js.map} +1 -1
  157. package/dashboard/dist/assets/{YamlWorkflowsPage-Dp6vG1au.js → YamlWorkflowsPage-CqoSFz5B.js} +2 -2
  158. package/dashboard/dist/assets/{YamlWorkflowsPage-Dp6vG1au.js.map → YamlWorkflowsPage-CqoSFz5B.js.map} +1 -1
  159. package/dashboard/dist/assets/{agents-MeqzOPD6.js → agents-Cg_e-aaf.js} +2 -2
  160. package/dashboard/dist/assets/{agents-MeqzOPD6.js.map → agents-Cg_e-aaf.js.map} +1 -1
  161. package/dashboard/dist/assets/{bots-DTGXnvX_.js → bots-B047yNJ0.js} +2 -2
  162. package/dashboard/dist/assets/{bots-DTGXnvX_.js.map → bots-B047yNJ0.js.map} +1 -1
  163. package/dashboard/dist/assets/{capabilities-BjlARR7F.js → capabilities-CI1dbCDk.js} +2 -2
  164. package/dashboard/dist/assets/{capabilities-BjlARR7F.js.map → capabilities-CI1dbCDk.js.map} +1 -1
  165. package/dashboard/dist/assets/{controlplane-DMYI0OaL.js → controlplane-Cy7snw7f.js} +2 -2
  166. package/dashboard/dist/assets/{controlplane-DMYI0OaL.js.map → controlplane-Cy7snw7f.js.map} +1 -1
  167. package/dashboard/dist/assets/{escalation-columns-BMO_H3cb.js → escalation-columns-BNrONMYj.js} +2 -2
  168. package/dashboard/dist/assets/{escalation-columns-BMO_H3cb.js.map → escalation-columns-BNrONMYj.js.map} +1 -1
  169. package/dashboard/dist/assets/index-B6Grf1WQ.js +6 -0
  170. package/dashboard/dist/assets/index-B6Grf1WQ.js.map +1 -0
  171. package/dashboard/dist/assets/{index-D3iDAWK2.js → index-Bf3hVGXZ.js} +2 -2
  172. package/dashboard/dist/assets/{index-D3iDAWK2.js.map → index-Bf3hVGXZ.js.map} +1 -1
  173. package/dashboard/dist/assets/{index-D6kXz3H8.js → index-Bxd2sXqz.js} +2 -2
  174. package/dashboard/dist/assets/{index-D6kXz3H8.js.map → index-Bxd2sXqz.js.map} +1 -1
  175. package/dashboard/dist/assets/index-CJV2pWNH.css +1 -0
  176. package/dashboard/dist/assets/{index-CGCD5hTX.js → index-COKZW8Xx.js} +2 -2
  177. package/dashboard/dist/assets/{index-CGCD5hTX.js.map → index-COKZW8Xx.js.map} +1 -1
  178. package/dashboard/dist/assets/{index-k5vcLICm.js → index-C_y0lQ_o.js} +3 -3
  179. package/dashboard/dist/assets/{index-k5vcLICm.js.map → index-C_y0lQ_o.js.map} +1 -1
  180. package/dashboard/dist/assets/{index-3QEnMBNG.js → index-DAUV3eJ-.js} +2 -2
  181. package/dashboard/dist/assets/{index-3QEnMBNG.js.map → index-DAUV3eJ-.js.map} +1 -1
  182. package/dashboard/dist/assets/{index-DuhqzYwC.js → index-DVtIMrTb.js} +2 -2
  183. package/dashboard/dist/assets/{index-DuhqzYwC.js.map → index-DVtIMrTb.js.map} +1 -1
  184. package/dashboard/dist/assets/index-Ds5rGe-i.js +3 -0
  185. package/dashboard/dist/assets/index-Ds5rGe-i.js.map +1 -0
  186. package/dashboard/dist/assets/{index-B3FzpDEG.js → index-DyTb77Jb.js} +2 -2
  187. package/dashboard/dist/assets/{index-B3FzpDEG.js.map → index-DyTb77Jb.js.map} +1 -1
  188. package/dashboard/dist/assets/{index-Ch-OS1pk.js → index-Uk6N1qiH.js} +2 -2
  189. package/dashboard/dist/assets/{index-Ch-OS1pk.js.map → index-Uk6N1qiH.js.map} +1 -1
  190. package/dashboard/dist/assets/index-X3_AxcUk.js +2 -0
  191. package/dashboard/dist/assets/{index-Dsgqxdyh.js.map → index-X3_AxcUk.js.map} +1 -1
  192. package/dashboard/dist/assets/{index-BU4oujVO.js → index-lGfBW1PB.js} +29 -28
  193. package/dashboard/dist/assets/index-lGfBW1PB.js.map +1 -0
  194. package/dashboard/dist/assets/{index-CkkOh8y9.js → index-nUmEwQrg.js} +2 -2
  195. package/dashboard/dist/assets/{index-CkkOh8y9.js.map → index-nUmEwQrg.js.map} +1 -1
  196. package/dashboard/dist/assets/{knowledge-DAV1Jy7b.js → knowledge-DsIUzscY.js} +2 -2
  197. package/dashboard/dist/assets/{knowledge-DAV1Jy7b.js.map → knowledge-DsIUzscY.js.map} +1 -1
  198. package/dashboard/dist/assets/{mcp-CivbxL1P.js → mcp-D889kZ-c.js} +2 -2
  199. package/dashboard/dist/assets/{mcp-CivbxL1P.js.map → mcp-D889kZ-c.js.map} +1 -1
  200. package/dashboard/dist/assets/{mcp-query-CGvWNrgo.js → mcp-query-Cs9J2pVT.js} +2 -2
  201. package/dashboard/dist/assets/{mcp-query-CGvWNrgo.js.map → mcp-query-Cs9J2pVT.js.map} +1 -1
  202. package/dashboard/dist/assets/metadata-display-DHjqWkLG.js +2 -0
  203. package/dashboard/dist/assets/metadata-display-DHjqWkLG.js.map +1 -0
  204. package/dashboard/dist/assets/{personas-lI3aUr6t.js → personas-xHB16O-Q.js} +2 -2
  205. package/dashboard/dist/assets/{personas-lI3aUr6t.js.map → personas-xHB16O-Q.js.map} +1 -1
  206. package/dashboard/dist/assets/{pipelines-DjPfnTmx.js → pipelines-DnTPjw1v.js} +2 -2
  207. package/dashboard/dist/assets/{pipelines-DjPfnTmx.js.map → pipelines-DnTPjw1v.js.map} +1 -1
  208. package/dashboard/dist/assets/{tasks-Co_S55BO.js → tasks-BcDvp6dL.js} +2 -2
  209. package/dashboard/dist/assets/{tasks-Co_S55BO.js.map → tasks-BcDvp6dL.js.map} +1 -1
  210. package/dashboard/dist/assets/{topics-2IGhZXBi.js → topics-DXw6BNy5.js} +2 -2
  211. package/dashboard/dist/assets/{topics-2IGhZXBi.js.map → topics-DXw6BNy5.js.map} +1 -1
  212. package/dashboard/dist/assets/{useEventHooks-D0C5yke4.js → useEventHooks-C-bsD8zP.js} +2 -2
  213. package/dashboard/dist/assets/{useEventHooks-D0C5yke4.js.map → useEventHooks-C-bsD8zP.js.map} +1 -1
  214. package/dashboard/dist/assets/{useNamespace-LG52DTT-.js → useNamespace-wZCsEF6O.js} +2 -2
  215. package/dashboard/dist/assets/{useNamespace-LG52DTT-.js.map → useNamespace-wZCsEF6O.js.map} +1 -1
  216. package/dashboard/dist/assets/{useYamlActivityEvents-1IZGVpWC.js → useYamlActivityEvents-Cu_o4-ow.js} +2 -2
  217. package/dashboard/dist/assets/{useYamlActivityEvents-1IZGVpWC.js.map → useYamlActivityEvents-Cu_o4-ow.js.map} +1 -1
  218. package/dashboard/dist/assets/{users-C-eHT1i6.js → users-XpCq_umD.js} +2 -2
  219. package/dashboard/dist/assets/{users-C-eHT1i6.js.map → users-XpCq_umD.js.map} +1 -1
  220. package/dashboard/dist/assets/{vendor-icons-BPsNpK3Y.js → vendor-icons-BgsXTN4h.js} +145 -140
  221. package/dashboard/dist/assets/vendor-icons-BgsXTN4h.js.map +1 -0
  222. package/dashboard/dist/assets/{workflows-C16CeY4e.js → workflows-CMxHVqQ8.js} +2 -2
  223. package/dashboard/dist/assets/{workflows-C16CeY4e.js.map → workflows-CMxHVqQ8.js.map} +1 -1
  224. package/dashboard/dist/assets/{yaml-workflows-BBenayT9.js → yaml-workflows-kxOF5yEC.js} +2 -2
  225. package/dashboard/dist/assets/{yaml-workflows-BBenayT9.js.map → yaml-workflows-kxOF5yEC.js.map} +1 -1
  226. package/dashboard/dist/index.html +3 -3
  227. package/docs/api/http/escalations.md +34 -1
  228. package/docs/dashboard.md +2 -0
  229. package/docs/events.md +1 -1
  230. package/docs/hitl/iframe.md +56 -6
  231. package/docs/hitl/x-lt-footer.md +6 -0
  232. package/docs/hitl/x-lt-list-schema.md +4 -2
  233. package/package.json +1 -1
  234. package/dashboard/dist/assets/AvailableEscalationsPage-DDsmXjpi.js +0 -2
  235. package/dashboard/dist/assets/AvailableEscalationsPage-DDsmXjpi.js.map +0 -1
  236. package/dashboard/dist/assets/BotPicker-dUpw1wW6.js +0 -2
  237. package/dashboard/dist/assets/CapabilitiesPage-Ca2jEln-.js +0 -2
  238. package/dashboard/dist/assets/CountdownTimer-rnoWmFqx.js +0 -2
  239. package/dashboard/dist/assets/CountdownTimer-rnoWmFqx.js.map +0 -1
  240. package/dashboard/dist/assets/CustomDurationPicker-hlnadaFt.js +0 -2
  241. package/dashboard/dist/assets/CustomDurationPicker-hlnadaFt.js.map +0 -1
  242. package/dashboard/dist/assets/DataTable-Bir0Xs1p.js.map +0 -1
  243. package/dashboard/dist/assets/McpQueryPage-DRTKSPDR.js +0 -2
  244. package/dashboard/dist/assets/OperationsPage-BSl_oUAJ.js +0 -3
  245. package/dashboard/dist/assets/OperationsPage-BSl_oUAJ.js.map +0 -1
  246. package/dashboard/dist/assets/RunAsSelector-DrGsUhL8.js +0 -2
  247. package/dashboard/dist/assets/ScanSchemeDetailPage-VODehqGs.js +0 -2
  248. package/dashboard/dist/assets/ScanSchemeDetailPage-VODehqGs.js.map +0 -1
  249. package/dashboard/dist/assets/ScanStationPage-Y-9Gs7t5.js +0 -2
  250. package/dashboard/dist/assets/ScanStationPage-Y-9Gs7t5.js.map +0 -1
  251. package/dashboard/dist/assets/StatusBadge-DkgllZHv.js +0 -2
  252. package/dashboard/dist/assets/StatusBadge-DkgllZHv.js.map +0 -1
  253. package/dashboard/dist/assets/UserName-0gjVPU_U.js +0 -2
  254. package/dashboard/dist/assets/WorkflowExecutionPage-B28OxTS_.js +0 -2
  255. package/dashboard/dist/assets/WorkflowExecutionPage-B28OxTS_.js.map +0 -1
  256. package/dashboard/dist/assets/index-B5jxf81r.css +0 -1
  257. package/dashboard/dist/assets/index-BU4oujVO.js.map +0 -1
  258. package/dashboard/dist/assets/index-Dsgqxdyh.js +0 -2
  259. package/dashboard/dist/assets/index-DuyzcDuV.js +0 -6
  260. package/dashboard/dist/assets/index-DuyzcDuV.js.map +0 -1
  261. package/dashboard/dist/assets/index-LF1gEc6w.js +0 -3
  262. package/dashboard/dist/assets/index-LF1gEc6w.js.map +0 -1
  263. package/dashboard/dist/assets/vendor-icons-BPsNpK3Y.js.map +0 -1
@@ -49,6 +49,9 @@ export declare function bulkClaim(input: {
49
49
  * @param input.query — `{ role, facets? }` selector (query form)
50
50
  * @param input.targetUserId — user to assign to
51
51
  * @param input.durationMinutes — assignment duration (default: 30)
52
+ * @param input.reassign — also take over rows under a LIVE claim (ids form
53
+ * only; requires admin/superadmin). Default false: live claims are skipped
54
+ * and counted in `skipped`.
52
55
  * @param auth — authenticated user context
53
56
  * @returns `{ status: 200, data: { assigned, skipped } }`
54
57
  */
@@ -60,6 +63,21 @@ export declare function bulkAssign(input: {
60
63
  };
61
64
  targetUserId: string;
62
65
  durationMinutes?: number;
66
+ reassign?: boolean;
67
+ }, auth: LTApiAuth): Promise<LTApiResult>;
68
+ /**
69
+ * Return claimed escalations to the available pool — the admin override of
70
+ * someone else's live claim (self-return stays the release verb). One
71
+ * guarded statement; unclaimed and terminal rows are skipped. Publishes a
72
+ * `released` event per returned row with the acting admin in the delta.
73
+ *
74
+ * RBAC: admin/superadmin (global escalation access) only.
75
+ *
76
+ * @param input.ids — array of escalation UUIDs
77
+ * @returns `{ status: 200, data: { unassigned, skipped } }`
78
+ */
79
+ export declare function bulkUnassign(input: {
80
+ ids?: string[];
63
81
  }, auth: LTApiAuth): Promise<LTApiResult>;
64
82
  /**
65
83
  * Route multiple escalations to a different role.
@@ -37,6 +37,7 @@ exports.releaseExpiredClaims = releaseExpiredClaims;
37
37
  exports.updatePriority = updatePriority;
38
38
  exports.bulkClaim = bulkClaim;
39
39
  exports.bulkAssign = bulkAssign;
40
+ exports.bulkUnassign = bulkUnassign;
40
41
  exports.bulkEscalate = bulkEscalate;
41
42
  exports.bulkTriage = bulkTriage;
42
43
  const escalationService = __importStar(require("../../services/escalation"));
@@ -133,12 +134,15 @@ async function bulkClaim(input, auth) {
133
134
  * @param input.query — `{ role, facets? }` selector (query form)
134
135
  * @param input.targetUserId — user to assign to
135
136
  * @param input.durationMinutes — assignment duration (default: 30)
137
+ * @param input.reassign — also take over rows under a LIVE claim (ids form
138
+ * only; requires admin/superadmin). Default false: live claims are skipped
139
+ * and counted in `skipped`.
136
140
  * @param auth — authenticated user context
137
141
  * @returns `{ status: 200, data: { assigned, skipped } }`
138
142
  */
139
143
  async function bulkAssign(input, auth) {
140
144
  try {
141
- const { ids, query, targetUserId, durationMinutes } = input;
145
+ const { ids, query, targetUserId, durationMinutes, reassign } = input;
142
146
  if (!targetUserId || typeof targetUserId !== 'string') {
143
147
  return { status: 400, error: 'targetUserId is required' };
144
148
  }
@@ -147,6 +151,14 @@ async function bulkAssign(input, auth) {
147
151
  if (hasIds === hasQuery) {
148
152
  return { status: 400, error: 'provide exactly one of ids or query' };
149
153
  }
154
+ if (reassign === true && hasQuery) {
155
+ return { status: 400, error: 'reassign requires the ids form' };
156
+ }
157
+ // Taking over a LIVE claim is a management override — stricter than
158
+ // pre-assigning pool rows, which role-scoped admins may do.
159
+ if (reassign === true && !(await (0, helpers_1.hasGlobalEscalationAccess)(auth.userId))) {
160
+ return { status: 403, error: 'Forbidden: reassign requires admin access' };
161
+ }
150
162
  if (hasQuery) {
151
163
  if (!query.role || typeof query.role !== 'string') {
152
164
  return { status: 400, error: 'query.role is required' };
@@ -186,6 +198,14 @@ async function bulkAssign(input, auth) {
186
198
  }
187
199
  }
188
200
  }
201
+ if (reassign === true) {
202
+ const result = await escalationService.bulkReassignEscalations(ids, targetUserId, durationMinutes ?? 30);
203
+ if (result.assigned > 0) {
204
+ const priorById = new Map(result.changes.map((c) => [c.id, c.prior_assignee]));
205
+ (0, helpers_1.publishBulkClaimEvents)(result.changes.map((c) => c.id), targetUserId, undefined, priorById);
206
+ }
207
+ return { status: 200, data: { assigned: result.assigned, skipped: result.skipped } };
208
+ }
189
209
  const result = await escalationService.bulkAssignEscalations(ids, targetUserId, durationMinutes ?? 30);
190
210
  if (result.assigned > 0)
191
211
  (0, helpers_1.publishBulkClaimEvents)(ids, targetUserId);
@@ -195,6 +215,34 @@ async function bulkAssign(input, auth) {
195
215
  return { status: 500, error: err.message };
196
216
  }
197
217
  }
218
+ /**
219
+ * Return claimed escalations to the available pool — the admin override of
220
+ * someone else's live claim (self-return stays the release verb). One
221
+ * guarded statement; unclaimed and terminal rows are skipped. Publishes a
222
+ * `released` event per returned row with the acting admin in the delta.
223
+ *
224
+ * RBAC: admin/superadmin (global escalation access) only.
225
+ *
226
+ * @param input.ids — array of escalation UUIDs
227
+ * @returns `{ status: 200, data: { unassigned, skipped } }`
228
+ */
229
+ async function bulkUnassign(input, auth) {
230
+ try {
231
+ if (!(0, helpers_1.validateIds)(input.ids ?? [])) {
232
+ return { status: 400, error: 'ids must be a non-empty array' };
233
+ }
234
+ if (!(await (0, helpers_1.hasGlobalEscalationAccess)(auth.userId))) {
235
+ return { status: 403, error: 'Forbidden: unassign requires admin access' };
236
+ }
237
+ const result = await escalationService.bulkUnassignEscalations(input.ids);
238
+ if (result.unassigned > 0)
239
+ (0, helpers_1.publishBulkReleaseEvents)(result.changes, auth.userId);
240
+ return { status: 200, data: { unassigned: result.unassigned, skipped: result.skipped } };
241
+ }
242
+ catch (err) {
243
+ return { status: 500, error: err.message };
244
+ }
245
+ }
198
246
  /**
199
247
  * Route multiple escalations to a different role.
200
248
  *
@@ -21,12 +21,15 @@ export declare function claimEscalation(input: {
21
21
  * Release a claimed escalation back to the pool.
22
22
  *
23
23
  * Only the user who holds the claim can release it. Publishes a
24
- * `escalation.released` event.
24
+ * `escalation.released` event unless `quiet` — the identical release with no
25
+ * event, for bookkeeping releases that are not lifecycle transitions.
25
26
  *
26
27
  * @param input.id — escalation UUID
28
+ * @param input.quiet — suppress the `released` event (default: loud)
27
29
  * @param auth — authenticated user context
28
30
  * @returns `{ status: 200, data: { escalation } }` or 409
29
31
  */
30
32
  export declare function releaseEscalation(input: {
31
33
  id: string;
34
+ quiet?: boolean;
32
35
  }, auth: LTApiAuth): Promise<LTApiResult>;
@@ -81,9 +81,11 @@ async function claimEscalation(input, auth) {
81
81
  * Release a claimed escalation back to the pool.
82
82
  *
83
83
  * Only the user who holds the claim can release it. Publishes a
84
- * `escalation.released` event.
84
+ * `escalation.released` event unless `quiet` — the identical release with no
85
+ * event, for bookkeeping releases that are not lifecycle transitions.
85
86
  *
86
87
  * @param input.id — escalation UUID
88
+ * @param input.quiet — suppress the `released` event (default: loud)
87
89
  * @param auth — authenticated user context
88
90
  * @returns `{ status: 200, data: { escalation } }` or 409
89
91
  */
@@ -97,7 +99,9 @@ async function releaseEscalation(input, auth) {
97
99
  const manageDenied = await (0, helpers_1.assertQueueManageAccess)(auth.userId, escalation.role);
98
100
  if (manageDenied)
99
101
  return manageDenied;
100
- const result = await escalationService.releaseEscalation(input.id, auth.userId);
102
+ const result = await escalationService.releaseEscalation(input.id, auth.userId, {
103
+ quiet: input.quiet === true,
104
+ });
101
105
  if (!result) {
102
106
  return { status: 409, error: 'Escalation not found or not claimed by you' };
103
107
  }
@@ -150,4 +150,14 @@ export declare function publishBulkReassignEvents(beforeRows: Array<{
150
150
  id: string;
151
151
  role: string;
152
152
  }>, targetRole: string): void;
153
- export declare function publishBulkClaimEvents(ids: string[], assignedTo: string, knownRole?: string): void;
153
+ export declare function publishBulkClaimEvents(ids: string[], assignedTo: string, knownRole?: string, priorById?: Map<string, string | null>): void;
154
+ /**
155
+ * Per-row released events for an admin unassign — the row returns to the
156
+ * pool under the same verb a self-release produces, with the acting admin in
157
+ * the delta.
158
+ */
159
+ export declare function publishBulkReleaseEvents(changes: Array<{
160
+ id: string;
161
+ role: string;
162
+ prior_assignee: string | null;
163
+ }>, releasedBy: string): void;
@@ -46,6 +46,7 @@ exports.resolveAssignee = resolveAssignee;
46
46
  exports.ensureRoleMembership = ensureRoleMembership;
47
47
  exports.publishBulkReassignEvents = publishBulkReassignEvents;
48
48
  exports.publishBulkClaimEvents = publishBulkClaimEvents;
49
+ exports.publishBulkReleaseEvents = publishBulkReleaseEvents;
49
50
  const escalationService = __importStar(require("../../services/escalation"));
50
51
  const userService = __importStar(require("../../services/user"));
51
52
  const publish_1 = require("../../lib/events/publish");
@@ -283,10 +284,11 @@ function publishBulkReassignEvents(beforeRows, targetRole) {
283
284
  }
284
285
  }
285
286
  }
286
- function publishBulkClaimEvents(ids, assignedTo, knownRole) {
287
+ function publishBulkClaimEvents(ids, assignedTo, knownRole, priorById) {
287
288
  // The claimed subject carries each row's role token. Query-form callers
288
289
  // already know the single role; id-form callers resolve roles with one
289
- // indexed read. Fire-and-forget, like every event publish.
290
+ // indexed read. Fire-and-forget, like every event publish. `priorById`
291
+ // (reassign) adds the displaced assignee to each row's delta.
290
292
  void (async () => {
291
293
  const roleById = new Map();
292
294
  if (knownRole) {
@@ -299,6 +301,7 @@ function publishBulkClaimEvents(ids, assignedTo, knownRole) {
299
301
  roleById.set(row.id, row.role);
300
302
  }
301
303
  for (const id of ids) {
304
+ const prior = priorById?.get(id);
302
305
  (0, publish_1.publishEscalationEvent)({
303
306
  type: 'escalation.claimed',
304
307
  source: 'api',
@@ -310,8 +313,32 @@ function publishBulkClaimEvents(ids, assignedTo, knownRole) {
310
313
  status: 'claimed',
311
314
  // Bulk exception to the one-shape convention (see lib/events/escalation-wire.ts):
312
315
  // delta + `bulk: true`, no per-row fetch. Subscribers fetch by id for detail.
313
- data: { assigned_to: assignedTo, bulk: true },
316
+ data: { assigned_to: assignedTo, bulk: true, ...(prior ? { reassigned_from: prior } : {}) },
314
317
  });
315
318
  }
316
319
  })().catch(() => { });
317
320
  }
321
+ /**
322
+ * Per-row released events for an admin unassign — the row returns to the
323
+ * pool under the same verb a self-release produces, with the acting admin in
324
+ * the delta.
325
+ */
326
+ function publishBulkReleaseEvents(changes, releasedBy) {
327
+ for (const change of changes) {
328
+ void (0, publish_1.publishEscalationEvent)({
329
+ type: 'escalation.released',
330
+ source: 'api',
331
+ workflowId: '',
332
+ workflowName: '',
333
+ taskQueue: '',
334
+ escalationId: change.id,
335
+ role: change.role,
336
+ status: 'released',
337
+ data: {
338
+ released_by: releasedBy,
339
+ bulk: true,
340
+ ...(change.prior_assignee ? { unassigned_from: change.prior_assignee } : {}),
341
+ },
342
+ });
343
+ }
344
+ }
@@ -2,7 +2,7 @@ export { createEscalation } from './create';
2
2
  export { listEscalations, listAvailableEscalations, listDistinctTypes, listFacetKeys, getEscalationStats, getStationMetrics } from './list';
3
3
  export { getEscalation, getEscalationsByWorkflowId, escalateToRole } from './single';
4
4
  export { claimEscalation, releaseEscalation } from './claim';
5
- export { releaseExpiredClaims, updatePriority, bulkClaim, bulkAssign, bulkEscalate, bulkTriage } from './bulk';
5
+ export { releaseExpiredClaims, updatePriority, bulkClaim, bulkAssign, bulkUnassign, bulkEscalate, bulkTriage } from './bulk';
6
6
  export { resolveEscalation, resolveBySignalKey, resolveByIds, resolveAllOrNone } from './resolve';
7
7
  export { findByMetadata, claimByMetadata, resolveByMetadata } from './metadata';
8
8
  export { cancelSingleEscalation, bulkCancel } from './cancel';
@@ -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.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = 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.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.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = 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");
@@ -22,6 +22,7 @@ Object.defineProperty(exports, "releaseExpiredClaims", { enumerable: true, get:
22
22
  Object.defineProperty(exports, "updatePriority", { enumerable: true, get: function () { return bulk_1.updatePriority; } });
23
23
  Object.defineProperty(exports, "bulkClaim", { enumerable: true, get: function () { return bulk_1.bulkClaim; } });
24
24
  Object.defineProperty(exports, "bulkAssign", { enumerable: true, get: function () { return bulk_1.bulkAssign; } });
25
+ Object.defineProperty(exports, "bulkUnassign", { enumerable: true, get: function () { return bulk_1.bulkUnassign; } });
25
26
  Object.defineProperty(exports, "bulkEscalate", { enumerable: true, get: function () { return bulk_1.bulkEscalate; } });
26
27
  Object.defineProperty(exports, "bulkTriage", { enumerable: true, get: function () { return bulk_1.bulkTriage; } });
27
28
  var resolve_1 = require("./resolve");
package/build/index.js CHANGED
@@ -167,6 +167,10 @@ async function main() {
167
167
  },
168
168
  },
169
169
  examples: true,
170
+ features: {
171
+ // The examples ship the full scan demo (schemes 10/11); surface it.
172
+ scanCodes: true,
173
+ },
170
174
  mcp: {
171
175
  server: { enabled: true },
172
176
  },
@@ -54,9 +54,15 @@ function registerBulkRoutes(router) {
54
54
  query: req.body?.query,
55
55
  targetUserId: req.body?.targetUserId,
56
56
  durationMinutes: req.body?.durationMinutes,
57
+ // Take over live claims too (ids form; admin/superadmin only).
58
+ reassign: req.body?.reassign === true,
57
59
  }, req.auth);
58
60
  res.status(result.status).json(result.data ?? { error: result.error });
59
61
  });
62
+ router.post('/bulk-unassign', async (req, res) => {
63
+ const result = await api.bulkUnassign({ ids: req.body?.ids }, req.auth);
64
+ res.status(result.status).json(result.data ?? { error: result.error });
65
+ });
60
66
  router.patch('/bulk-escalate', async (req, res) => {
61
67
  const result = await api.bulkEscalate({ ids: req.body?.ids, targetRole: req.body?.targetRole }, req.auth);
62
68
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -84,12 +84,14 @@ function registerSingleRoutes(router) {
84
84
  * Release a claimed escalation back to the available pool.
85
85
  * Only the assigned actor (token user, or the badged person when an
86
86
  * X-LT-Acting-Token grant rides the request) may release their own claim.
87
+ * `quiet: true` in the body performs the identical release without the
88
+ * `released` event — bookkeeping releases only; default stays loud.
87
89
  */
88
90
  router.post('/:id/release', async (req, res) => {
89
91
  const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
90
92
  if (!auth)
91
93
  return;
92
- const result = await api.releaseEscalation({ id: req.params.id }, auth);
94
+ const result = await api.releaseEscalation({ id: req.params.id, quiet: req.body?.quiet === true }, auth);
93
95
  res.status(result.status).json(result.data ?? { error: result.error });
94
96
  });
95
97
  /**
@@ -139,6 +139,7 @@ export declare function createClient(options?: LTClientOptions): {
139
139
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
140
140
  release: (input: {
141
141
  id: string;
142
+ quiet?: boolean;
142
143
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
143
144
  resolve: (input: {
144
145
  id: string;
@@ -180,6 +181,10 @@ export declare function createClient(options?: LTClientOptions): {
180
181
  };
181
182
  targetUserId: string;
182
183
  durationMinutes?: number;
184
+ reassign?: boolean;
185
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
186
+ bulkUnassign: (input: {
187
+ ids?: string[];
183
188
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
184
189
  bulkEscalate: (input: {
185
190
  ids: string[];
@@ -136,6 +136,7 @@ function createClient(options = {}) {
136
136
  updatePriority: bindAuth(escalationsApi.updatePriority, auth),
137
137
  bulkClaim: bindAuth(escalationsApi.bulkClaim, auth),
138
138
  bulkAssign: bindAuth(escalationsApi.bulkAssign, auth),
139
+ bulkUnassign: bindAuth(escalationsApi.bulkUnassign, auth),
139
140
  bulkEscalate: bindAuth(escalationsApi.bulkEscalate, auth),
140
141
  bulkTriage: bindAuth(escalationsApi.bulkTriage, auth),
141
142
  findByMetadata: bindAuth(escalationsApi.findByMetadata, auth),
@@ -1,4 +1,10 @@
1
1
  import type { LTEscalationRecord } from '../../types';
2
+ /** One row touched by a reassign/unassign, with its pre-update assignee. */
3
+ export interface AssignmentChange {
4
+ id: string;
5
+ role: string;
6
+ prior_assignee: string | null;
7
+ }
2
8
  /**
3
9
  * Bulk claim escalations for a user.
4
10
  * Items already claimed by another active user are skipped.
@@ -29,6 +35,27 @@ export declare function bulkAssignEscalationsByQuery(query: {
29
35
  assigned: number;
30
36
  ids: string[];
31
37
  }>;
38
+ /**
39
+ * Reassign pending rows to a user, INCLUDING rows under a live claim — the
40
+ * management override plain assign is not (claimMany skips live claims). One
41
+ * guarded statement; rows not returned were terminal or missing. Each
42
+ * returned row carries its pre-update assignee for the event.
43
+ */
44
+ export declare function bulkReassignEscalations(ids: string[], targetUserId: string, durationMinutes?: number): Promise<{
45
+ assigned: number;
46
+ skipped: number;
47
+ changes: AssignmentChange[];
48
+ }>;
49
+ /**
50
+ * Return pending claimed rows to the available pool (admin override of
51
+ * someone else's claim — self-return stays the release verb). One guarded
52
+ * statement; unclaimed and terminal rows are skipped.
53
+ */
54
+ export declare function bulkUnassignEscalations(ids: string[]): Promise<{
55
+ unassigned: number;
56
+ skipped: number;
57
+ changes: AssignmentChange[];
58
+ }>;
32
59
  /**
33
60
  * Bulk reassign escalations to a different role.
34
61
  * Clears assignment on all affected rows.
@@ -3,11 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bulkClaimEscalations = bulkClaimEscalations;
4
4
  exports.bulkAssignEscalations = bulkAssignEscalations;
5
5
  exports.bulkAssignEscalationsByQuery = bulkAssignEscalationsByQuery;
6
+ exports.bulkReassignEscalations = bulkReassignEscalations;
7
+ exports.bulkUnassignEscalations = bulkUnassignEscalations;
6
8
  exports.bulkEscalateToRole = bulkEscalateToRole;
7
9
  exports.bulkCancelEscalations = bulkCancelEscalations;
8
10
  exports.bulkResolveForTriage = bulkResolveForTriage;
11
+ const db_1 = require("../../lib/db");
9
12
  const client_1 = require("./client");
10
13
  const map_1 = require("./map");
14
+ const sql_1 = require("./sql");
11
15
  /**
12
16
  * Bulk claim escalations for a user.
13
17
  * Items already claimed by another active user are skipped.
@@ -49,6 +53,41 @@ async function bulkAssignEscalationsByQuery(query, targetUserId, durationMinutes
49
53
  });
50
54
  return { assigned: claimed, ids: entries.map((e) => e.id) };
51
55
  }
56
+ /**
57
+ * Reassign pending rows to a user, INCLUDING rows under a live claim — the
58
+ * management override plain assign is not (claimMany skips live claims). One
59
+ * guarded statement; rows not returned were terminal or missing. Each
60
+ * returned row carries its pre-update assignee for the event.
61
+ */
62
+ async function bulkReassignEscalations(ids, targetUserId, durationMinutes = 30) {
63
+ if (ids.length === 0)
64
+ return { assigned: 0, skipped: 0, changes: [] };
65
+ await (0, client_1.ensureEscalationCompatView)();
66
+ const { rows } = await (0, db_1.getPool)().query(sql_1.BULK_REASSIGN, [ids, targetUserId, durationMinutes]);
67
+ const changes = rows.map((r) => ({
68
+ id: r.id,
69
+ role: r.role,
70
+ prior_assignee: r.prior_assignee ?? null,
71
+ }));
72
+ return { assigned: rows.length, skipped: ids.length - rows.length, changes };
73
+ }
74
+ /**
75
+ * Return pending claimed rows to the available pool (admin override of
76
+ * someone else's claim — self-return stays the release verb). One guarded
77
+ * statement; unclaimed and terminal rows are skipped.
78
+ */
79
+ async function bulkUnassignEscalations(ids) {
80
+ if (ids.length === 0)
81
+ return { unassigned: 0, skipped: 0, changes: [] };
82
+ await (0, client_1.ensureEscalationCompatView)();
83
+ const { rows } = await (0, db_1.getPool)().query(sql_1.BULK_UNASSIGN, [ids]);
84
+ const changes = rows.map((r) => ({
85
+ id: r.id,
86
+ role: r.role,
87
+ prior_assignee: r.prior_assignee ?? null,
88
+ }));
89
+ return { unassigned: rows.length, skipped: ids.length - rows.length, changes };
90
+ }
52
91
  /**
53
92
  * Bulk reassign escalations to a different role.
54
93
  * Clears assignment on all affected rows.
@@ -134,8 +134,16 @@ export declare function getEscalationScopeRows(ids: string[]): Promise<{
134
134
  /**
135
135
  * Release a single escalation claim back to the available pool.
136
136
  * Only the assigned user (or superadmin via route) may release.
137
- */
138
- export declare function releaseEscalation(id: string, userId: string): Promise<LTEscalationRecord | null>;
137
+ *
138
+ * `quiet` performs the identical release without publishing the `released`
139
+ * event — for bookkeeping releases (a dispatcher's held-skip loop frees rows
140
+ * every ranking window) that are not lifecycle transitions. Faceted machine
141
+ * claims are already silent; this is the release-side counterpart. Default
142
+ * stays loud.
143
+ */
144
+ export declare function releaseEscalation(id: string, userId: string, opts?: {
145
+ quiet?: boolean;
146
+ }): Promise<LTEscalationRecord | null>;
139
147
  /**
140
148
  * Sweep expired claims back to the available pool, returning the count cleared.
141
149
  * Availability is already query-time in the implicit model, but long-tail's
@@ -328,24 +328,32 @@ async function getEscalationScopeRows(ids) {
328
328
  /**
329
329
  * Release a single escalation claim back to the available pool.
330
330
  * Only the assigned user (or superadmin via route) may release.
331
+ *
332
+ * `quiet` performs the identical release without publishing the `released`
333
+ * event — for bookkeeping releases (a dispatcher's held-skip loop frees rows
334
+ * every ranking window) that are not lifecycle transitions. Faceted machine
335
+ * claims are already silent; this is the release-side counterpart. Default
336
+ * stays loud.
331
337
  */
332
- async function releaseEscalation(id, userId) {
338
+ async function releaseEscalation(id, userId, opts) {
333
339
  const client = await (0, client_1.escalations)();
334
340
  const result = await client.release({ id, assignee: userId });
335
341
  if (!result.ok)
336
342
  return null;
337
343
  const released = (0, map_1.toEscalationRecord)(result.entry);
338
- publishEscalationChange({
339
- type: 'escalation.released',
340
- source: 'service',
341
- workflowId: released.workflow_id || '',
342
- workflowName: released.workflow_type || '',
343
- taskQueue: released.task_queue || '',
344
- escalationId: released.id,
345
- role: released.role,
346
- status: 'released',
347
- data: (0, escalation_wire_1.escalationEventData)(released, { released_by: userId }),
348
- });
344
+ if (!opts?.quiet) {
345
+ publishEscalationChange({
346
+ type: 'escalation.released',
347
+ source: 'service',
348
+ workflowId: released.workflow_id || '',
349
+ workflowName: released.workflow_type || '',
350
+ taskQueue: released.task_queue || '',
351
+ escalationId: released.id,
352
+ role: released.role,
353
+ status: 'released',
354
+ data: (0, escalation_wire_1.escalationEventData)(released, { released_by: userId }),
355
+ });
356
+ }
349
357
  return released;
350
358
  }
351
359
  /**
@@ -8,6 +8,23 @@
8
8
  * table. Clears both `assigned_until` and `claim_expires_at`.
9
9
  */
10
10
  export declare const RELEASE_EXPIRED_CLAIMS = "UPDATE public.hmsh_escalations\nSET assigned_to = NULL,\n assigned_until = NULL,\n claimed_at = NULL,\n claim_expires_at = NULL,\n updated_at = NOW()\nWHERE status = 'pending'\n AND assigned_to IS NOT NULL\n AND assigned_until <= NOW()";
11
+ /**
12
+ * Reassign: hand pending rows to a user, INCLUDING rows under a live claim —
13
+ * the management override that plain assign (claimMany, which skips live
14
+ * claims) deliberately is not. One statement: the CTE reads each row's
15
+ * pre-update assignee (CTEs share one snapshot), so callers get
16
+ * prior_assignee for the event with no read-then-write window. An in-flight
17
+ * resolve by the prior assignee fails its claim assertion once assigned_to
18
+ * changes.
19
+ */
20
+ export declare const BULK_REASSIGN = "WITH prior AS (\n SELECT id, assigned_to FROM public.hmsh_escalations WHERE id = ANY($1::uuid[])\n)\nUPDATE public.hmsh_escalations e\nSET assigned_to = $2,\n assigned_until = NOW() + ($3::int * interval '1 minute'),\n claimed_at = NOW(),\n updated_at = NOW()\nFROM prior\nWHERE e.id = prior.id\n AND e.status = 'pending'\nRETURNING e.*, prior.assigned_to AS prior_assignee";
21
+ /**
22
+ * Unassign: return pending claimed rows to the available pool (an admin
23
+ * override of someone else's claim — self-return stays the release verb).
24
+ * Clears the same field set as RELEASE_EXPIRED_CLAIMS, without the expiry
25
+ * predicate.
26
+ */
27
+ export declare const BULK_UNASSIGN = "WITH prior AS (\n SELECT id, assigned_to FROM public.hmsh_escalations WHERE id = ANY($1::uuid[])\n)\nUPDATE public.hmsh_escalations e\nSET assigned_to = NULL,\n assigned_until = NULL,\n claimed_at = NULL,\n claim_expires_at = NULL,\n updated_at = NOW()\nFROM prior\nWHERE e.id = prior.id\n AND e.status = 'pending'\n AND e.assigned_to IS NOT NULL\nRETURNING e.*, prior.assigned_to AS prior_assignee";
11
28
  /** Count matching the search WHERE (params $1–$13). */
12
29
  export declare const COUNT_SEARCH_ESCALATIONS = "SELECT COUNT(*)::int AS total\n FROM public.lt_escalations\n WHERE ($1::text IS NULL OR status = $1)\n AND ($2::text IS NULL OR role = $2)\n AND (\n ($3::text[] IS NULL AND $10::text[] IS NULL)\n OR ($3::text[] IS NOT NULL AND role = ANY($3))\n OR ($10::text[] IS NOT NULL AND role = ANY($10) AND assigned_to = $11)\n )\n AND ($4::text IS NULL OR type = $4)\n AND ($5::text IS NULL OR subtype = $5)\n AND ($6::int IS NULL OR priority = $6)\n AND ($7::text IS NULL OR assigned_to = $7)\n AND ($8::boolean IS NULL OR available = $8)\n AND ($12::jsonb IS NULL OR metadata @> $12)\n AND ($9::text IS NULL OR origin_id = $9 OR workflow_id = $9\n OR ($13::uuid IS NOT NULL AND id = $13::uuid))";
13
30
  /**
@@ -11,7 +11,7 @@
11
11
  // `hmsh_escalations` here rather than composed from generic SDK calls.
12
12
  // ---------------------------------------------------------------------------
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.STATION_PERIOD_METRICS_SQL = exports.STATION_LIVE_COUNTS_SQL = exports.RESOLVE_BY_METADATA_ATOMIC = exports.COUNT_SEARCH_ESCALATIONS = exports.RELEASE_EXPIRED_CLAIMS = void 0;
14
+ exports.STATION_PERIOD_METRICS_SQL = exports.STATION_LIVE_COUNTS_SQL = exports.RESOLVE_BY_METADATA_ATOMIC = exports.COUNT_SEARCH_ESCALATIONS = exports.BULK_UNASSIGN = exports.BULK_REASSIGN = exports.RELEASE_EXPIRED_CLAIMS = void 0;
15
15
  exports.searchEscalationsQuery = searchEscalationsQuery;
16
16
  /**
17
17
  * Sweep expired claims back to the available pool.
@@ -32,6 +32,49 @@ SET assigned_to = NULL,
32
32
  WHERE status = 'pending'
33
33
  AND assigned_to IS NOT NULL
34
34
  AND assigned_until <= NOW()`;
35
+ /**
36
+ * Reassign: hand pending rows to a user, INCLUDING rows under a live claim —
37
+ * the management override that plain assign (claimMany, which skips live
38
+ * claims) deliberately is not. One statement: the CTE reads each row's
39
+ * pre-update assignee (CTEs share one snapshot), so callers get
40
+ * prior_assignee for the event with no read-then-write window. An in-flight
41
+ * resolve by the prior assignee fails its claim assertion once assigned_to
42
+ * changes.
43
+ */
44
+ exports.BULK_REASSIGN = `\
45
+ WITH prior AS (
46
+ SELECT id, assigned_to FROM public.hmsh_escalations WHERE id = ANY($1::uuid[])
47
+ )
48
+ UPDATE public.hmsh_escalations e
49
+ SET assigned_to = $2,
50
+ assigned_until = NOW() + ($3::int * interval '1 minute'),
51
+ claimed_at = NOW(),
52
+ updated_at = NOW()
53
+ FROM prior
54
+ WHERE e.id = prior.id
55
+ AND e.status = 'pending'
56
+ RETURNING e.*, prior.assigned_to AS prior_assignee`;
57
+ /**
58
+ * Unassign: return pending claimed rows to the available pool (an admin
59
+ * override of someone else's claim — self-return stays the release verb).
60
+ * Clears the same field set as RELEASE_EXPIRED_CLAIMS, without the expiry
61
+ * predicate.
62
+ */
63
+ exports.BULK_UNASSIGN = `\
64
+ WITH prior AS (
65
+ SELECT id, assigned_to FROM public.hmsh_escalations WHERE id = ANY($1::uuid[])
66
+ )
67
+ UPDATE public.hmsh_escalations e
68
+ SET assigned_to = NULL,
69
+ assigned_until = NULL,
70
+ claimed_at = NULL,
71
+ claim_expires_at = NULL,
72
+ updated_at = NOW()
73
+ FROM prior
74
+ WHERE e.id = prior.id
75
+ AND e.status = 'pending'
76
+ AND e.assigned_to IS NOT NULL
77
+ RETURNING e.*, prior.assigned_to AS prior_assignee`;
35
78
  /**
36
79
  * Escalation search by correlation id.
37
80
  *
@@ -417,7 +417,7 @@ function registerEscalationTools(server) {
417
417
  // mirrors POST /api/escalations/bulk-assign
418
418
  server.registerTool('bulk_assign', {
419
419
  title: 'Bulk Assign',
420
- description: 'Assign multiple escalations to a specific user.',
420
+ description: 'Assign multiple escalations to a specific user. Rows under a live claim are skipped unless reassign=true (the admin takeover).',
421
421
  inputSchema: schemas_1.bulkAssignSchema,
422
422
  }, async (args) => {
423
423
  const result = await escalationBulkApi.bulkAssign(args, await systemAuth());
@@ -426,6 +426,18 @@ function registerEscalationTools(server) {
426
426
  }
427
427
  return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
428
428
  });
429
+ // mirrors POST /api/escalations/bulk-unassign
430
+ server.registerTool('bulk_unassign', {
431
+ title: 'Bulk Unassign',
432
+ description: 'Return claimed escalations to the available pool — the admin override of a live claim. Unclaimed and terminal rows are skipped.',
433
+ inputSchema: schemas_1.bulkUnassignSchema,
434
+ }, async (args) => {
435
+ const result = await escalationBulkApi.bulkUnassign(args, await systemAuth());
436
+ if (result.error) {
437
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
438
+ }
439
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
440
+ });
429
441
  // mirrors PATCH /api/escalations/bulk-escalate
430
442
  server.registerTool('bulk_escalate', {
431
443
  title: 'Bulk Escalate',
@@ -1301,14 +1301,24 @@ export declare const bulkAssignSchema: z.ZodObject<{
1301
1301
  ids: z.ZodArray<z.ZodString, "many">;
1302
1302
  targetUserId: z.ZodString;
1303
1303
  durationMinutes: z.ZodOptional<z.ZodNumber>;
1304
+ reassign: z.ZodOptional<z.ZodBoolean>;
1304
1305
  }, "strip", z.ZodTypeAny, {
1305
1306
  ids: string[];
1306
1307
  targetUserId: string;
1307
1308
  durationMinutes?: number | undefined;
1309
+ reassign?: boolean | undefined;
1308
1310
  }, {
1309
1311
  ids: string[];
1310
1312
  targetUserId: string;
1311
1313
  durationMinutes?: number | undefined;
1314
+ reassign?: boolean | undefined;
1315
+ }>;
1316
+ export declare const bulkUnassignSchema: z.ZodObject<{
1317
+ ids: z.ZodArray<z.ZodString, "many">;
1318
+ }, "strip", z.ZodTypeAny, {
1319
+ ids: string[];
1320
+ }, {
1321
+ ids: string[];
1312
1322
  }>;
1313
1323
  export declare const bulkEscalateSchema: z.ZodObject<{
1314
1324
  ids: z.ZodArray<z.ZodString, "many">;