@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.
- package/build/api/escalations/bulk.d.ts +18 -0
- package/build/api/escalations/bulk.js +49 -1
- package/build/api/escalations/claim.d.ts +4 -1
- package/build/api/escalations/claim.js +6 -2
- package/build/api/escalations/helpers.d.ts +11 -1
- package/build/api/escalations/helpers.js +30 -3
- package/build/api/escalations/index.d.ts +1 -1
- package/build/api/escalations/index.js +2 -1
- package/build/index.js +4 -0
- package/build/routes/escalations/bulk.js +6 -0
- package/build/routes/escalations/single.js +3 -1
- package/build/sdk/index.d.ts +5 -0
- package/build/sdk/index.js +1 -0
- package/build/services/escalation/bulk.d.ts +27 -0
- package/build/services/escalation/bulk.js +39 -0
- package/build/services/escalation/crud.d.ts +10 -2
- package/build/services/escalation/crud.js +20 -12
- package/build/services/escalation/sql.d.ts +17 -0
- package/build/services/escalation/sql.js +44 -1
- package/build/system/mcp-servers/admin/escalations.js +13 -1
- package/build/system/mcp-servers/admin/schemas.d.ts +10 -0
- package/build/system/mcp-servers/admin/schemas.js +6 -2
- package/build/system/seed/tool-manifests-admin.d.ts +88 -0
- package/build/system/seed/tool-manifests-admin.js +2 -1
- package/dashboard/dist/assets/{AdminDashboard-DeZsR4pA.js → AdminDashboard-BS3wd7Zg.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DeZsR4pA.js.map → AdminDashboard-BS3wd7Zg.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-Bi5ZAsjf.js → AgentConfigPage-4C9aU0dj.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-Bi5ZAsjf.js.map → AgentConfigPage-4C9aU0dj.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CIbKor5E.js → AgentDetailPage-B6uvDnMF.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-CIbKor5E.js.map → AgentDetailPage-B6uvDnMF.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-CRFZ6KDu.js → AgentsPage-vtxdvdrQ.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-CRFZ6KDu.js.map → AgentsPage-vtxdvdrQ.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-C9VKPhD6.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-C9VKPhD6.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-CkY9u7nD.js +2 -0
- package/dashboard/dist/assets/{BotPicker-dUpw1wW6.js.map → BotPicker-CkY9u7nD.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-OIbUDYlC.js +2 -0
- package/dashboard/dist/assets/BulkAssignModal-OIbUDYlC.js.map +1 -0
- package/dashboard/dist/assets/CapabilitiesPage-Bkbq_GO6.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-Ca2jEln-.js.map → CapabilitiesPage-Bkbq_GO6.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BXlR5QmW.js → CollapsibleSection-Zuz9HkFL.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BXlR5QmW.js.map → CollapsibleSection-Zuz9HkFL.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-CGyCCzGh.js → CredentialsPage-CAmDMnzV.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CGyCCzGh.js.map → CredentialsPage-CAmDMnzV.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CAu2hmQf.js → CronLabel-DX2woCPZ.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CAu2hmQf.js.map → CronLabel-DX2woCPZ.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-Bir0Xs1p.js → DataTable-DFPMeqyQ.js} +2 -2
- package/dashboard/dist/assets/DataTable-DFPMeqyQ.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-DovkhN2p.js → DropZone-7UoXQ4qL.js} +2 -2
- package/dashboard/dist/assets/{DropZone-DovkhN2p.js.map → DropZone-7UoXQ4qL.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-B1eoCzEw.js → ElapsedCell-D2old1NF.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-B1eoCzEw.js.map → ElapsedCell-D2old1NF.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-CIOyjwjM.js → EntityTimelinePanel-m9baDiW0.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-CIOyjwjM.js.map → EntityTimelinePanel-m9baDiW0.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-DQNQ7o_4.js → EscalationListSchemaPage-BPr7Ou8c.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-DQNQ7o_4.js.map → EscalationListSchemaPage-BPr7Ou8c.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-DFgDn4R3.js → EscalationSchemaPage-83n5JyAh.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-DFgDn4R3.js.map → EscalationSchemaPage-83n5JyAh.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DfbKtXVZ.js → EscalationsOverview-CDJ5wRlq.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DfbKtXVZ.js.map → EscalationsOverview-CDJ5wRlq.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CZPkvhao.js → EventTable-DRUHkKtv.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CZPkvhao.js.map → EventTable-DRUHkKtv.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CYjKK9Cp.js → FilterBar-C06DK5Oa.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CYjKK9Cp.js.map → FilterBar-C06DK5Oa.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DY9u42vt.js → GraphInvokePage-DSlyTmyq.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DY9u42vt.js.map → GraphInvokePage-DSlyTmyq.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-p_CYlGnh.js → HomePage-DXzDBkQV.js} +2 -2
- package/dashboard/dist/assets/{HomePage-p_CYlGnh.js.map → HomePage-DXzDBkQV.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Dz-1RXSH.js → ListToolbar-BvpGFFYp.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Dz-1RXSH.js.map → ListToolbar-BvpGFFYp.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BUI9sVTk.js → McpOverview-C2atR_B6.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BUI9sVTk.js.map → McpOverview-C2atR_B6.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CVN_UAB3.js → McpQueryDetailPage-BUxPspjB.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-CVN_UAB3.js.map → McpQueryDetailPage-BUxPspjB.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-CM_Fgl9G.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-DRTKSPDR.js.map → McpQueryPage-CM_Fgl9G.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CTb1AxR3.js → McpRunDetailPage-Bo9vXQBA.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CTb1AxR3.js.map → McpRunDetailPage-Bo9vXQBA.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BWLwjVd0.js → McpRunsPage-BwsgvGtg.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BWLwjVd0.js.map → McpRunsPage-BwsgvGtg.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-BeifzjUm.js → NamespacePill-CKp_9EaI.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-BeifzjUm.js.map → NamespacePill-CKp_9EaI.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-BftWAJ9m.js +3 -0
- package/dashboard/dist/assets/OperationsPage-BftWAJ9m.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-DGs9kPOZ.js → OperatorDashboard-CKjrYYFi.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DGs9kPOZ.js.map → OperatorDashboard-CKjrYYFi.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BpeBHqyc.js → PageHeader-CDDpHpdv.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BpeBHqyc.js.map → PageHeader-CDDpHpdv.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-JXeUFa_g.js → PageHeaderWithStats-DIWH6fRv.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-JXeUFa_g.js.map → PageHeaderWithStats-DIWH6fRv.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-C33MgXUY.js → PersonaDetailPage-BsIPtBxZ.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-C33MgXUY.js.map → PersonaDetailPage-BsIPtBxZ.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-BbLOHq5X.js → PersonasPage-62hANmNf.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-BbLOHq5X.js.map → PersonasPage-62hANmNf.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-zwd0HCJl.js → ProcessDetailPage-DS_t9DcR.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-zwd0HCJl.js.map → ProcessDetailPage-DS_t9DcR.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DnfmK6jf.js → ProcessesListPage-Ch2tSICc.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DnfmK6jf.js.map → ProcessesListPage-Ch2tSICc.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-axZtFPC_.js → RoleDetailPage-DVbtnTvn.js} +3 -3
- package/dashboard/dist/assets/{RoleDetailPage-axZtFPC_.js.map → RoleDetailPage-DVbtnTvn.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-EocCXZh0.js → RolePill-C0hExOmI.js} +2 -2
- package/dashboard/dist/assets/{RolePill-EocCXZh0.js.map → RolePill-C0hExOmI.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-DN6yqH7-.js → RolesPage-CK6FjD5P.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DN6yqH7-.js.map → RolesPage-CK6FjD5P.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-ImueSaJ4.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-DrGsUhL8.js.map → RunAsSelector-ImueSaJ4.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-BmQjEyWZ.js → ScanCodesPage-CDqLJuCq.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-BmQjEyWZ.js.map → ScanCodesPage-CDqLJuCq.js.map} +1 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-DO6qtJdM.js +2 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-DO6qtJdM.js.map +1 -0
- package/dashboard/dist/assets/ScanStationPage-ID3xMhds.js +2 -0
- package/dashboard/dist/assets/ScanStationPage-ID3xMhds.js.map +1 -0
- package/dashboard/dist/assets/{ScopeBadge-H5dEqeHi.js → ScopeBadge-BBQvz4pj.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-H5dEqeHi.js.map → ScopeBadge-BBQvz4pj.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-BDeUwPtb.js +2 -0
- package/dashboard/dist/assets/StatusBadge-BDeUwPtb.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-9VkHiOsT.js → StickyPagination-XA1krmz5.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-9VkHiOsT.js.map → StickyPagination-XA1krmz5.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-C37J6Qyz.js → StreamMessageDetail-DziA1g1e.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-C37J6Qyz.js.map → StreamMessageDetail-DziA1g1e.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-NVGsBIX-.js → SwimlaneTimeline-DTNEnHiF.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-NVGsBIX-.js.map → SwimlaneTimeline-DTNEnHiF.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-Ch5u6iPH.js → TagInput-BXxXs1JD.js} +2 -2
- package/dashboard/dist/assets/{TagInput-Ch5u6iPH.js.map → TagInput-BXxXs1JD.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-5sbMHi5U.js → TaskDetailPage-U19sJHAI.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-5sbMHi5U.js.map → TaskDetailPage-U19sJHAI.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Bz146p-P.js → TaskQueuePill-BKGJBVZG.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Bz146p-P.js.map → TaskQueuePill-BKGJBVZG.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-C9AN7IBb.js → TasksListPage-jc4Xk7kI.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-C9AN7IBb.js.map → TasksListPage-jc4Xk7kI.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CsbQGlSd.js → TimeAgo-GWgJ0LVq.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CsbQGlSd.js.map → TimeAgo-GWgJ0LVq.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DlbIkV-G.js → TimestampCell-Dk1TVsFV.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DlbIkV-G.js.map → TimestampCell-Dk1TVsFV.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-sj8OkBB0.js → ToolPill-BY6zLSfA.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-sj8OkBB0.js.map → ToolPill-BY6zLSfA.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-BKbLocvr.js → ToolTestPanel-BKcqnR68.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BKbLocvr.js.map → ToolTestPanel-BKcqnR68.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-fOnTfDso.js → TopicDetailPage-D8GcDu_0.js} +4 -4
- package/dashboard/dist/assets/{TopicDetailPage-fOnTfDso.js.map → TopicDetailPage-D8GcDu_0.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-BoVkp7DM.js → TopicsPage-BT9LV3yH.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-BoVkp7DM.js.map → TopicsPage-BT9LV3yH.js.map} +1 -1
- package/dashboard/dist/assets/UserName-BrwZnLjU.js +2 -0
- package/dashboard/dist/assets/{UserName-0gjVPU_U.js.map → UserName-BrwZnLjU.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-CldfHwky.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-CldfHwky.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowPill-BcA7S3gI.js → WorkflowPill-qp5UF3-y.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-BcA7S3gI.js.map → WorkflowPill-qp5UF3-y.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-Bzvz6tTY.js → WorkflowsDashboard-DkyGkxW1.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-Bzvz6tTY.js.map → WorkflowsDashboard-DkyGkxW1.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-BkcRU4Ej.js → WorkflowsOverview-DACADuUE.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BkcRU4Ej.js.map → WorkflowsOverview-DACADuUE.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmM78sYi.js → YamlWorkflowDetailPage-DSAjzido.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmM78sYi.js.map → YamlWorkflowDetailPage-DSAjzido.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-Dp6vG1au.js → YamlWorkflowsPage-CqoSFz5B.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-Dp6vG1au.js.map → YamlWorkflowsPage-CqoSFz5B.js.map} +1 -1
- package/dashboard/dist/assets/{agents-MeqzOPD6.js → agents-Cg_e-aaf.js} +2 -2
- package/dashboard/dist/assets/{agents-MeqzOPD6.js.map → agents-Cg_e-aaf.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DTGXnvX_.js → bots-B047yNJ0.js} +2 -2
- package/dashboard/dist/assets/{bots-DTGXnvX_.js.map → bots-B047yNJ0.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-BjlARR7F.js → capabilities-CI1dbCDk.js} +2 -2
- package/dashboard/dist/assets/{capabilities-BjlARR7F.js.map → capabilities-CI1dbCDk.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DMYI0OaL.js → controlplane-Cy7snw7f.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DMYI0OaL.js.map → controlplane-Cy7snw7f.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BMO_H3cb.js → escalation-columns-BNrONMYj.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BMO_H3cb.js.map → escalation-columns-BNrONMYj.js.map} +1 -1
- package/dashboard/dist/assets/index-B6Grf1WQ.js +6 -0
- package/dashboard/dist/assets/index-B6Grf1WQ.js.map +1 -0
- package/dashboard/dist/assets/{index-D3iDAWK2.js → index-Bf3hVGXZ.js} +2 -2
- package/dashboard/dist/assets/{index-D3iDAWK2.js.map → index-Bf3hVGXZ.js.map} +1 -1
- package/dashboard/dist/assets/{index-D6kXz3H8.js → index-Bxd2sXqz.js} +2 -2
- package/dashboard/dist/assets/{index-D6kXz3H8.js.map → index-Bxd2sXqz.js.map} +1 -1
- package/dashboard/dist/assets/index-CJV2pWNH.css +1 -0
- package/dashboard/dist/assets/{index-CGCD5hTX.js → index-COKZW8Xx.js} +2 -2
- package/dashboard/dist/assets/{index-CGCD5hTX.js.map → index-COKZW8Xx.js.map} +1 -1
- package/dashboard/dist/assets/{index-k5vcLICm.js → index-C_y0lQ_o.js} +3 -3
- package/dashboard/dist/assets/{index-k5vcLICm.js.map → index-C_y0lQ_o.js.map} +1 -1
- package/dashboard/dist/assets/{index-3QEnMBNG.js → index-DAUV3eJ-.js} +2 -2
- package/dashboard/dist/assets/{index-3QEnMBNG.js.map → index-DAUV3eJ-.js.map} +1 -1
- package/dashboard/dist/assets/{index-DuhqzYwC.js → index-DVtIMrTb.js} +2 -2
- package/dashboard/dist/assets/{index-DuhqzYwC.js.map → index-DVtIMrTb.js.map} +1 -1
- package/dashboard/dist/assets/index-Ds5rGe-i.js +3 -0
- package/dashboard/dist/assets/index-Ds5rGe-i.js.map +1 -0
- package/dashboard/dist/assets/{index-B3FzpDEG.js → index-DyTb77Jb.js} +2 -2
- package/dashboard/dist/assets/{index-B3FzpDEG.js.map → index-DyTb77Jb.js.map} +1 -1
- package/dashboard/dist/assets/{index-Ch-OS1pk.js → index-Uk6N1qiH.js} +2 -2
- package/dashboard/dist/assets/{index-Ch-OS1pk.js.map → index-Uk6N1qiH.js.map} +1 -1
- package/dashboard/dist/assets/index-X3_AxcUk.js +2 -0
- package/dashboard/dist/assets/{index-Dsgqxdyh.js.map → index-X3_AxcUk.js.map} +1 -1
- package/dashboard/dist/assets/{index-BU4oujVO.js → index-lGfBW1PB.js} +29 -28
- package/dashboard/dist/assets/index-lGfBW1PB.js.map +1 -0
- package/dashboard/dist/assets/{index-CkkOh8y9.js → index-nUmEwQrg.js} +2 -2
- package/dashboard/dist/assets/{index-CkkOh8y9.js.map → index-nUmEwQrg.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DAV1Jy7b.js → knowledge-DsIUzscY.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DAV1Jy7b.js.map → knowledge-DsIUzscY.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CivbxL1P.js → mcp-D889kZ-c.js} +2 -2
- package/dashboard/dist/assets/{mcp-CivbxL1P.js.map → mcp-D889kZ-c.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CGvWNrgo.js → mcp-query-Cs9J2pVT.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CGvWNrgo.js.map → mcp-query-Cs9J2pVT.js.map} +1 -1
- package/dashboard/dist/assets/metadata-display-DHjqWkLG.js +2 -0
- package/dashboard/dist/assets/metadata-display-DHjqWkLG.js.map +1 -0
- package/dashboard/dist/assets/{personas-lI3aUr6t.js → personas-xHB16O-Q.js} +2 -2
- package/dashboard/dist/assets/{personas-lI3aUr6t.js.map → personas-xHB16O-Q.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DjPfnTmx.js → pipelines-DnTPjw1v.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DjPfnTmx.js.map → pipelines-DnTPjw1v.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-Co_S55BO.js → tasks-BcDvp6dL.js} +2 -2
- package/dashboard/dist/assets/{tasks-Co_S55BO.js.map → tasks-BcDvp6dL.js.map} +1 -1
- package/dashboard/dist/assets/{topics-2IGhZXBi.js → topics-DXw6BNy5.js} +2 -2
- package/dashboard/dist/assets/{topics-2IGhZXBi.js.map → topics-DXw6BNy5.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-D0C5yke4.js → useEventHooks-C-bsD8zP.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-D0C5yke4.js.map → useEventHooks-C-bsD8zP.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-LG52DTT-.js → useNamespace-wZCsEF6O.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-LG52DTT-.js.map → useNamespace-wZCsEF6O.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-1IZGVpWC.js → useYamlActivityEvents-Cu_o4-ow.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-1IZGVpWC.js.map → useYamlActivityEvents-Cu_o4-ow.js.map} +1 -1
- package/dashboard/dist/assets/{users-C-eHT1i6.js → users-XpCq_umD.js} +2 -2
- package/dashboard/dist/assets/{users-C-eHT1i6.js.map → users-XpCq_umD.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BPsNpK3Y.js → vendor-icons-BgsXTN4h.js} +145 -140
- package/dashboard/dist/assets/vendor-icons-BgsXTN4h.js.map +1 -0
- package/dashboard/dist/assets/{workflows-C16CeY4e.js → workflows-CMxHVqQ8.js} +2 -2
- package/dashboard/dist/assets/{workflows-C16CeY4e.js.map → workflows-CMxHVqQ8.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-BBenayT9.js → yaml-workflows-kxOF5yEC.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-BBenayT9.js.map → yaml-workflows-kxOF5yEC.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +34 -1
- package/docs/dashboard.md +2 -0
- package/docs/events.md +1 -1
- package/docs/hitl/iframe.md +56 -6
- package/docs/hitl/x-lt-footer.md +6 -0
- package/docs/hitl/x-lt-list-schema.md +4 -2
- package/package.json +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DDsmXjpi.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DDsmXjpi.js.map +0 -1
- package/dashboard/dist/assets/BotPicker-dUpw1wW6.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-Ca2jEln-.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-rnoWmFqx.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-rnoWmFqx.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-hlnadaFt.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-hlnadaFt.js.map +0 -1
- package/dashboard/dist/assets/DataTable-Bir0Xs1p.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-DRTKSPDR.js +0 -2
- package/dashboard/dist/assets/OperationsPage-BSl_oUAJ.js +0 -3
- package/dashboard/dist/assets/OperationsPage-BSl_oUAJ.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-DrGsUhL8.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-VODehqGs.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-VODehqGs.js.map +0 -1
- package/dashboard/dist/assets/ScanStationPage-Y-9Gs7t5.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-Y-9Gs7t5.js.map +0 -1
- package/dashboard/dist/assets/StatusBadge-DkgllZHv.js +0 -2
- package/dashboard/dist/assets/StatusBadge-DkgllZHv.js.map +0 -1
- package/dashboard/dist/assets/UserName-0gjVPU_U.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-B28OxTS_.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-B28OxTS_.js.map +0 -1
- package/dashboard/dist/assets/index-B5jxf81r.css +0 -1
- package/dashboard/dist/assets/index-BU4oujVO.js.map +0 -1
- package/dashboard/dist/assets/index-Dsgqxdyh.js +0 -2
- package/dashboard/dist/assets/index-DuyzcDuV.js +0 -6
- package/dashboard/dist/assets/index-DuyzcDuV.js.map +0 -1
- package/dashboard/dist/assets/index-LF1gEc6w.js +0 -3
- package/dashboard/dist/assets/index-LF1gEc6w.js.map +0 -1
- 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
|
@@ -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
|
/**
|
package/build/sdk/index.d.ts
CHANGED
|
@@ -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[];
|
package/build/sdk/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
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">;
|