@hotmeshio/long-tail 0.5.11 → 0.5.12
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/diagnostics.d.ts +5 -0
- package/build/api/diagnostics.js +5 -1
- package/build/api/escalations/list.d.ts +2 -0
- package/build/api/escalations/list.js +2 -0
- package/build/api/settings.d.ts +1 -1
- package/build/api/settings.js +3 -1
- package/build/api/workflows/invocation.d.ts +6 -0
- package/build/api/workflows/invocation.js +6 -2
- package/build/modules/features.d.ts +19 -0
- package/build/modules/features.js +16 -0
- package/build/routes/diagnostics.js +15 -2
- package/build/routes/escalations/list.js +2 -0
- package/build/routes/workflows/invocation.js +12 -4
- package/build/sdk/index.d.ts +2 -0
- package/build/services/diagnostics/index.d.ts +40 -6
- package/build/services/diagnostics/index.js +54 -5
- package/build/services/escalation/queries.d.ts +2 -0
- package/build/services/escalation/queries.js +84 -2
- package/build/services/escalation/sql.d.ts +7 -0
- package/build/services/escalation/sql.js +50 -1
- package/build/services/task/resolve.d.ts +5 -3
- package/build/services/task/resolve.js +9 -6
- package/build/services/task/sql.d.ts +6 -1
- package/build/services/task/sql.js +7 -1
- package/build/start/adapters.js +3 -0
- package/build/system/mcp-servers/admin/diagnostics.d.ts +5 -4
- package/build/system/mcp-servers/admin/diagnostics.js +12 -10
- package/build/system/mcp-servers/admin/escalations.d.ts +6 -0
- package/build/system/mcp-servers/admin/escalations.js +182 -54
- package/build/system/mcp-servers/admin/index.js +3 -3
- package/build/system/mcp-servers/admin/schemas.d.ts +92 -3
- package/build/system/mcp-servers/admin/schemas.js +39 -4
- package/build/system/mcp-servers/admin/workflows.js +23 -12
- package/build/system/seed/tool-manifests-admin.d.ts +1324 -562
- package/build/system/seed/tool-manifests-admin.js +10 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/startup.d.ts +9 -0
- package/dashboard/dist/assets/{AdminDashboard-DZpduYdW.js → AdminDashboard-LTiYLuzq.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DZpduYdW.js.map → AdminDashboard-LTiYLuzq.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js → AgentConfigPage-nlOudfpZ.js} +7 -7
- package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js.map → AgentConfigPage-nlOudfpZ.js.map} +1 -1
- package/dashboard/dist/assets/AgentDetailPage-BSUnDvGp.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-BSUnDvGp.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-DpS0cCYe.js +2 -0
- package/dashboard/dist/assets/AgentsPage-DpS0cCYe.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BEylRqjP.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BEylRqjP.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js → BotPicker-BhKmq7M7.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js.map → BotPicker-BhKmq7M7.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-DLIleX2L.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DTfKCzBQ.js.map → CapabilitiesPage-DLIleX2L.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js → CollapsibleSection-D7SVwNVk.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js.map → CollapsibleSection-D7SVwNVk.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js → CredentialsPage-fat5Z2U9.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js.map → CredentialsPage-fat5Z2U9.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js → CronLabel-OOP4P2mJ.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js.map → CronLabel-OOP4P2mJ.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js → CustomDurationPicker-COacSAXO.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js.map → CustomDurationPicker-COacSAXO.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-Dwpgbueb.js → DropZone-Bfw2YLVS.js} +2 -2
- package/dashboard/dist/assets/{DropZone-Dwpgbueb.js.map → DropZone-Bfw2YLVS.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js → ElapsedCell-CkfCD-m7.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js.map → ElapsedCell-CkfCD-m7.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js → EscalationsOverview-BmI8jxlh.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js.map → EscalationsOverview-BmI8jxlh.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CwvX_L9t.js → EventTable-CeKfFk3m.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CwvX_L9t.js.map → EventTable-CeKfFk3m.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js → GraphInvokePage-BZBPBCSq.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js.map → GraphInvokePage-BZBPBCSq.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-BS_-jcHr.js → HomePage-dM7U2tl6.js} +2 -2
- package/dashboard/dist/assets/{HomePage-BS_-jcHr.js.map → HomePage-dM7U2tl6.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js → ListToolbar-BJaCzAXS.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js.map → ListToolbar-BJaCzAXS.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js → McpOverview-CvnDG5OB.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js.map → McpOverview-CvnDG5OB.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js → McpQueryDetailPage-DwmSIcIL.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js.map → McpQueryDetailPage-DwmSIcIL.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-CU6FMEEk.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-CU6FMEEk.js.map +1 -0
- package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js → McpRunDetailPage-8a6lsehv.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js.map → McpRunDetailPage-8a6lsehv.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-CPMYWgm_.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-CPMYWgm_.js.map +1 -0
- package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js → NamespacePill-D6btr6e8.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js.map → NamespacePill-D6btr6e8.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-g9o7I925.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-g9o7I925.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-Bnt2iQQa.js → PageHeader-Dk2Pe44Q.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Bnt2iQQa.js.map → PageHeader-Dk2Pe44Q.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js → PageHeaderWithStats-DJQCZ0FR.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js.map → PageHeaderWithStats-DJQCZ0FR.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js → ProcessDetailPage-ByyWCs2A.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js.map → ProcessDetailPage-ByyWCs2A.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-BTsXds4l.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-BTsXds4l.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-DQTT1s9v.js → RolePill-Du-aNnjR.js} +2 -2
- package/dashboard/dist/assets/{RolePill-DQTT1s9v.js.map → RolePill-Du-aNnjR.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js → RolesPage-B2Kdf-L9.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js.map → RolesPage-B2Kdf-L9.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js → RunAsSelector-BzkZXpSX.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js.map → RunAsSelector-BzkZXpSX.js.map} +1 -1
- package/dashboard/dist/assets/StreamMessageDetail-B6ch-6SY.js +2 -0
- package/dashboard/dist/assets/{StreamMessageDetail-BF0tM0cd.js.map → StreamMessageDetail-B6ch-6SY.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js → SwimlaneTimeline-CjvfUkls.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js.map → SwimlaneTimeline-CjvfUkls.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-B00uqhjX.js → TagInput-CZSeyesi.js} +2 -2
- package/dashboard/dist/assets/{TagInput-B00uqhjX.js.map → TagInput-CZSeyesi.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js → TaskDetailPage-BjHU6opi.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js.map → TaskDetailPage-BjHU6opi.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js → TaskQueuePill-CQrXrSxk.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js.map → TaskQueuePill-CQrXrSxk.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js → TasksListPage-Bem44zd0.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js.map → TasksListPage-Bem44zd0.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js → TimeAgo-CUIYqSt_.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js.map → TimeAgo-CUIYqSt_.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js → TimestampCell--tnreI1i.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js.map → TimestampCell--tnreI1i.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-DjvedZSn.js → ToolPill-O09jsTQM.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-DjvedZSn.js.map → ToolPill-O09jsTQM.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js → ToolTestPanel-OD99H7Pk.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js.map → ToolTestPanel-OD99H7Pk.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js → TopicDetailPage-rh_dsTJI.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js.map → TopicDetailPage-rh_dsTJI.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js → TopicsPage-CD_40_v-.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js.map → TopicsPage-CD_40_v-.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-xHAgkk8M.js → UserName-C__c8BN0.js} +2 -2
- package/dashboard/dist/assets/{UserName-xHAgkk8M.js.map → UserName-C__c8BN0.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js → WorkflowExecutionPage-Bw6QdtUO.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js.map → WorkflowExecutionPage-Bw6QdtUO.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js → WorkflowPill-CS-IsR0U.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js.map → WorkflowPill-CS-IsR0U.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BgI-iOP6.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-BgI-iOP6.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js → WorkflowsOverview-BRc0QbA7.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js.map → WorkflowsOverview-BRc0QbA7.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js → YamlWorkflowDetailPage-DdzspNQR.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js.map → YamlWorkflowDetailPage-DdzspNQR.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js → YamlWorkflowsPage-Djw5ZbgQ.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js.map → YamlWorkflowsPage-Djw5ZbgQ.js.map} +1 -1
- package/dashboard/dist/assets/{agents-JE4aL07D.js → agents-xstNkF6c.js} +2 -2
- package/dashboard/dist/assets/{agents-JE4aL07D.js.map → agents-xstNkF6c.js.map} +1 -1
- package/dashboard/dist/assets/api-path-u2Jf9QXS.js +2 -0
- package/dashboard/dist/assets/api-path-u2Jf9QXS.js.map +1 -0
- package/dashboard/dist/assets/{bots-cAzKkDtQ.js → bots-BztAI0s_.js} +2 -2
- package/dashboard/dist/assets/{bots-cAzKkDtQ.js.map → bots-BztAI0s_.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-RBFXLAXF.js → capabilities-CEDwtxNL.js} +2 -2
- package/dashboard/dist/assets/{capabilities-RBFXLAXF.js.map → capabilities-CEDwtxNL.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DGhv3rwI.js → controlplane-BlGEsRKe.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DGhv3rwI.js.map → controlplane-BlGEsRKe.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-DqTkKbCv.js → escalation-columns-nVYVt7Gl.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-DqTkKbCv.js.map → escalation-columns-nVYVt7Gl.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-ne7dIaPa.js → escalation-iI4QKlP-.js} +2 -2
- package/dashboard/dist/assets/{escalation-ne7dIaPa.js.map → escalation-iI4QKlP-.js.map} +1 -1
- package/dashboard/dist/assets/{index-BbJuC9kg.js → index-B5qsp8lb.js} +2 -2
- package/dashboard/dist/assets/{index-BbJuC9kg.js.map → index-B5qsp8lb.js.map} +1 -1
- package/dashboard/dist/assets/{index-CgyucK0e.js → index-B7VC0vjf.js} +2 -2
- package/dashboard/dist/assets/{index-CgyucK0e.js.map → index-B7VC0vjf.js.map} +1 -1
- package/dashboard/dist/assets/{index-CQDn-bLr.js → index-BUmnJ4eT.js} +2 -2
- package/dashboard/dist/assets/{index-CQDn-bLr.js.map → index-BUmnJ4eT.js.map} +1 -1
- package/dashboard/dist/assets/{index-DgzgRTNg.js → index-CAqEy2Db.js} +2 -2
- package/dashboard/dist/assets/{index-DgzgRTNg.js.map → index-CAqEy2Db.js.map} +1 -1
- package/dashboard/dist/assets/{index-CByjpYlU.js → index-CMviPjXQ.js} +2 -2
- package/dashboard/dist/assets/{index-CByjpYlU.js.map → index-CMviPjXQ.js.map} +1 -1
- package/dashboard/dist/assets/index-CP0JEQhZ.js +6 -0
- package/dashboard/dist/assets/{index-CucXk58o.js.map → index-CP0JEQhZ.js.map} +1 -1
- package/dashboard/dist/assets/index-CUfgt3mV.js +2 -0
- package/dashboard/dist/assets/index-CUfgt3mV.js.map +1 -0
- package/dashboard/dist/assets/{index-DPJW96d2.js → index-D1xVY4JR.js} +26 -26
- package/dashboard/dist/assets/index-D1xVY4JR.js.map +1 -0
- package/dashboard/dist/assets/{index-CEpw_Fh8.js → index-DPLy-jwO.js} +2 -2
- package/dashboard/dist/assets/{index-CEpw_Fh8.js.map → index-DPLy-jwO.js.map} +1 -1
- package/dashboard/dist/assets/{index-BTqhAT6p.js → index-DjJ6VCuc.js} +2 -2
- package/dashboard/dist/assets/{index-BTqhAT6p.js.map → index-DjJ6VCuc.js.map} +1 -1
- package/dashboard/dist/assets/{index-QxAYCJ1S.js → index-Dsi5o7dx.js} +2 -2
- package/dashboard/dist/assets/{index-QxAYCJ1S.js.map → index-Dsi5o7dx.js.map} +1 -1
- package/dashboard/dist/assets/{index-C2l4GcZ7.js → index-DzVYjoex.js} +3 -3
- package/dashboard/dist/assets/{index-C2l4GcZ7.js.map → index-DzVYjoex.js.map} +1 -1
- package/dashboard/dist/assets/index-FuhiJuHL.js +2 -0
- package/dashboard/dist/assets/index-FuhiJuHL.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-DzRpsm3D.js → knowledge-BKg0cr39.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DzRpsm3D.js.map → knowledge-BKg0cr39.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-B1lc6nL4.js → mcp-CVdHpKlz.js} +2 -2
- package/dashboard/dist/assets/{mcp-B1lc6nL4.js.map → mcp-CVdHpKlz.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CXuweaN3.js → mcp-query-CYxZcbwQ.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CXuweaN3.js.map → mcp-query-CYxZcbwQ.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-D4VLWDvu.js → pipelines-BOEv7P6O.js} +2 -2
- package/dashboard/dist/assets/{pipelines-D4VLWDvu.js.map → pipelines-BOEv7P6O.js.map} +1 -1
- package/dashboard/dist/assets/{roles-CSpHRRu8.js → roles-c5cV2QYQ.js} +2 -2
- package/dashboard/dist/assets/{roles-CSpHRRu8.js.map → roles-c5cV2QYQ.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CWUsKhM4.js → tasks-JV3BjeEF.js} +2 -2
- package/dashboard/dist/assets/{tasks-CWUsKhM4.js.map → tasks-JV3BjeEF.js.map} +1 -1
- package/dashboard/dist/assets/{topics-BXwstrzB.js → topics-BDaPnhnQ.js} +2 -2
- package/dashboard/dist/assets/{topics-BXwstrzB.js.map → topics-BDaPnhnQ.js.map} +1 -1
- package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js +2 -0
- package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js.map +1 -0
- package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js → useEventHooks-a7Dnh8G4.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js.map → useEventHooks-a7Dnh8G4.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CsepDyR5.js → useNamespace-BSwEV0e9.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CsepDyR5.js.map → useNamespace-BSwEV0e9.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js → useYamlActivityEvents-BuqvL-cn.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js.map → useYamlActivityEvents-BuqvL-cn.js.map} +1 -1
- package/dashboard/dist/assets/{users-DvhHbR0R.js → users-Pn85K_3C.js} +2 -2
- package/dashboard/dist/assets/{users-DvhHbR0R.js.map → users-Pn85K_3C.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-Dj2F0Jrb.js → vendor-icons-D5ycKPA2.js} +114 -109
- package/dashboard/dist/assets/vendor-icons-D5ycKPA2.js.map +1 -0
- package/dashboard/dist/assets/{workflows-C7Cam2Ok.js → workflows-DF-9Voyi.js} +2 -2
- package/dashboard/dist/assets/{workflows-C7Cam2Ok.js.map → workflows-DF-9Voyi.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js → yaml-workflows-2roKaSSK.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js.map → yaml-workflows-2roKaSSK.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/api/mcp/admin.md +156 -12
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-C3FztFd_.js +0 -2
- package/dashboard/dist/assets/AgentsPage-C3FztFd_.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-DTfKCzBQ.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js +0 -2
- package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js.map +0 -1
- package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js.map +0 -1
- package/dashboard/dist/assets/StreamMessageDetail-BF0tM0cd.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js.map +0 -1
- package/dashboard/dist/assets/index-CucXk58o.js +0 -6
- package/dashboard/dist/assets/index-DPJW96d2.js.map +0 -1
- package/dashboard/dist/assets/index-DeZhNCf5.js +0 -2
- package/dashboard/dist/assets/index-DeZhNCf5.js.map +0 -1
- package/dashboard/dist/assets/index-Do8Xp3pa.js +0 -2
- package/dashboard/dist/assets/index-Do8Xp3pa.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +0 -1
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
// `hmsh_escalations` here rather than composed from generic SDK calls.
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.RESOLVE_BY_METADATA_ATOMIC = exports.RELEASE_EXPIRED_CLAIMS = void 0;
|
|
14
|
+
exports.RESOLVE_BY_METADATA_ATOMIC = exports.COUNT_SEARCH_ESCALATIONS = exports.RELEASE_EXPIRED_CLAIMS = void 0;
|
|
15
|
+
exports.searchEscalationsQuery = searchEscalationsQuery;
|
|
15
16
|
/**
|
|
16
17
|
* Sweep expired claims back to the available pool.
|
|
17
18
|
*
|
|
@@ -31,6 +32,54 @@ SET assigned_to = NULL,
|
|
|
31
32
|
WHERE status = 'pending'
|
|
32
33
|
AND assigned_to IS NOT NULL
|
|
33
34
|
AND assigned_until <= NOW()`;
|
|
35
|
+
/**
|
|
36
|
+
* Free-text escalation search.
|
|
37
|
+
*
|
|
38
|
+
* The SDK's `client.list()` filters by structured columns only — it has no
|
|
39
|
+
* free-text predicate. Long-tail's contract needs a search box that matches a
|
|
40
|
+
* correlation key (order id, ticket id) or any visible field across the WHOLE
|
|
41
|
+
* result set, not just the current page. That is server-side SQL here (over the
|
|
42
|
+
* `lt_escalations` view, which adds the computed `available` flag), following the
|
|
43
|
+
* same raw-SQL-on-the-shared-table pattern as the atomic resolve below — so the
|
|
44
|
+
* filter flows SQL→service→API→route→dashboard rather than being faked client-side.
|
|
45
|
+
*
|
|
46
|
+
* All structured filters are optional and combine with the search term (AND).
|
|
47
|
+
* `metadata::text ILIKE` scans the JSONB as text (the GIN index is containment-only
|
|
48
|
+
* and cannot serve ILIKE) — bounded in practice by the other filters and the page.
|
|
49
|
+
*
|
|
50
|
+
* $1 status, $2 role, $3 roles (text[] visibleRoles), $4 type, $5 subtype,
|
|
51
|
+
* $6 priority, $7 assigned_to, $8 available (bool), $9 search.
|
|
52
|
+
* The list query adds $10 limit, $11 offset.
|
|
53
|
+
*/
|
|
54
|
+
const SEARCH_ESCALATIONS_WHERE = `\
|
|
55
|
+
FROM public.lt_escalations
|
|
56
|
+
WHERE ($1::text IS NULL OR status = $1)
|
|
57
|
+
AND ($2::text IS NULL OR role = $2)
|
|
58
|
+
AND ($3::text[] IS NULL OR role = ANY($3))
|
|
59
|
+
AND ($4::text IS NULL OR type = $4)
|
|
60
|
+
AND ($5::text IS NULL OR subtype = $5)
|
|
61
|
+
AND ($6::int IS NULL OR priority = $6)
|
|
62
|
+
AND ($7::text IS NULL OR assigned_to = $7)
|
|
63
|
+
AND ($8::boolean IS NULL OR available = $8)
|
|
64
|
+
AND ($9::text IS NULL OR (
|
|
65
|
+
description ILIKE '%' || $9 || '%'
|
|
66
|
+
OR type ILIKE '%' || $9 || '%'
|
|
67
|
+
OR subtype ILIKE '%' || $9 || '%'
|
|
68
|
+
OR role ILIKE '%' || $9 || '%'
|
|
69
|
+
OR workflow_id ILIKE '%' || $9 || '%'
|
|
70
|
+
OR origin_id ILIKE '%' || $9 || '%'
|
|
71
|
+
OR id::text ILIKE '%' || $9 || '%'
|
|
72
|
+
OR metadata::text ILIKE '%' || $9 || '%'
|
|
73
|
+
))`;
|
|
74
|
+
/** Count matching the search WHERE (params $1–$9). */
|
|
75
|
+
exports.COUNT_SEARCH_ESCALATIONS = `SELECT COUNT(*)::int AS total\n${SEARCH_ESCALATIONS_WHERE}`;
|
|
76
|
+
/**
|
|
77
|
+
* Build the search SELECT. `orderBy` is composed from a whitelist by the caller
|
|
78
|
+
* (never raw user input), so it is safe to interpolate; everything else is bound.
|
|
79
|
+
*/
|
|
80
|
+
function searchEscalationsQuery(orderBy) {
|
|
81
|
+
return `SELECT *\n${SEARCH_ESCALATIONS_WHERE}\n ORDER BY ${orderBy}\n LIMIT $10 OFFSET $11`;
|
|
82
|
+
}
|
|
34
83
|
/**
|
|
35
84
|
* Atomic resolve by metadata with signal guard.
|
|
36
85
|
*
|
|
@@ -4,9 +4,11 @@ import type { ResolvedHandle } from './types';
|
|
|
4
4
|
* HotMesh needs to get a workflow handle.
|
|
5
5
|
*
|
|
6
6
|
* 1. Look up lt_tasks by workflow_id — returns workflow_type and task_queue.
|
|
7
|
-
* 2. If no task record (e.g., orchestrators/containers
|
|
8
|
-
*
|
|
7
|
+
* 2. If no task record (e.g., orchestrators/containers, or a child running in
|
|
8
|
+
* another app), fall back to `<appId>.jobs` (entity) + lt_config_workflows
|
|
9
|
+
* (task_queue). `appId` selects the HotMesh namespace to scan — children of
|
|
10
|
+
* a workflow live under their own app's schema, not always `durable`.
|
|
9
11
|
* 3. If task_queue is null (pre-migration record), fall back to lt_config_workflows.
|
|
10
12
|
* 4. Throws if the workflow cannot be resolved.
|
|
11
13
|
*/
|
|
12
|
-
export declare function resolveWorkflowHandle(workflowId: string): Promise<ResolvedHandle>;
|
|
14
|
+
export declare function resolveWorkflowHandle(workflowId: string, appId?: string): Promise<ResolvedHandle>;
|
|
@@ -9,12 +9,14 @@ const sql_1 = require("./sql");
|
|
|
9
9
|
* HotMesh needs to get a workflow handle.
|
|
10
10
|
*
|
|
11
11
|
* 1. Look up lt_tasks by workflow_id — returns workflow_type and task_queue.
|
|
12
|
-
* 2. If no task record (e.g., orchestrators/containers
|
|
13
|
-
*
|
|
12
|
+
* 2. If no task record (e.g., orchestrators/containers, or a child running in
|
|
13
|
+
* another app), fall back to `<appId>.jobs` (entity) + lt_config_workflows
|
|
14
|
+
* (task_queue). `appId` selects the HotMesh namespace to scan — children of
|
|
15
|
+
* a workflow live under their own app's schema, not always `durable`.
|
|
14
16
|
* 3. If task_queue is null (pre-migration record), fall back to lt_config_workflows.
|
|
15
17
|
* 4. Throws if the workflow cannot be resolved.
|
|
16
18
|
*/
|
|
17
|
-
async function resolveWorkflowHandle(workflowId) {
|
|
19
|
+
async function resolveWorkflowHandle(workflowId, appId = 'durable') {
|
|
18
20
|
const pool = (0, db_1.getPool)();
|
|
19
21
|
// 1. Try lt_tasks first (leaf workflows)
|
|
20
22
|
const { rows } = await pool.query(sql_1.RESOLVE_TASK_BY_WORKFLOW_ID, [workflowId]);
|
|
@@ -29,9 +31,10 @@ async function resolveWorkflowHandle(workflowId) {
|
|
|
29
31
|
return { taskQueue: configRows[0].task_queue, workflowName: workflow_type };
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
|
-
// 2. Fall back to
|
|
33
|
-
// have no lt_tasks record but do have a job with an entity tag
|
|
34
|
-
|
|
34
|
+
// 2. Fall back to <appId>.jobs — handles orchestrators/containers that
|
|
35
|
+
// have no lt_tasks record but do have a job with an entity tag, and
|
|
36
|
+
// children running in a non-default namespace.
|
|
37
|
+
const { rows: jobRows } = await pool.query((0, sql_1.RESOLVE_JOB_ENTITY)(appId), [`hmsh:${appId}:j:${workflowId}`]);
|
|
35
38
|
if (jobRows.length > 0 && jobRows[0].entity) {
|
|
36
39
|
const entity = jobRows[0].entity;
|
|
37
40
|
// 2a. Try lt_config_workflows for task_queue
|
|
@@ -5,7 +5,12 @@ export declare const GET_TASK_BY_SIGNAL_ID = "SELECT * FROM lt_tasks WHERE signa
|
|
|
5
5
|
export declare const GET_TASK_BY_WORKFLOW_ID = "SELECT * FROM lt_tasks WHERE workflow_id = $1 ORDER BY created_at DESC LIMIT 1";
|
|
6
6
|
export declare const RESOLVE_TASK_BY_WORKFLOW_ID = "SELECT workflow_type, task_queue FROM lt_tasks WHERE workflow_id = $1 ORDER BY created_at DESC LIMIT 1";
|
|
7
7
|
export declare const RESOLVE_CONFIG_TASK_QUEUE = "SELECT task_queue FROM lt_config_workflows WHERE workflow_type = $1";
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Look up a job's entity tag in a specific HotMesh namespace. The namespace is a
|
|
10
|
+
* Postgres schema name, so it is interpolated (not a bind param) — same pattern
|
|
11
|
+
* as the diagnostics queries. Callers pass the trusted app_id from config.
|
|
12
|
+
*/
|
|
13
|
+
export declare const RESOLVE_JOB_ENTITY: (appId: string) => string;
|
|
9
14
|
export declare const GET_PROCESS_TASKS = "SELECT * FROM lt_tasks WHERE origin_id = $1 ORDER BY created_at ASC";
|
|
10
15
|
/**
|
|
11
16
|
* Build the process-stats totals CTE query for a given interval.
|
|
@@ -25,7 +25,13 @@ exports.GET_TASK_BY_WORKFLOW_ID = `SELECT * FROM lt_tasks WHERE workflow_id = $1
|
|
|
25
25
|
// ---- resolve.ts queries ---------------------------------------------------
|
|
26
26
|
exports.RESOLVE_TASK_BY_WORKFLOW_ID = `SELECT workflow_type, task_queue FROM lt_tasks WHERE workflow_id = $1 ORDER BY created_at DESC LIMIT 1`;
|
|
27
27
|
exports.RESOLVE_CONFIG_TASK_QUEUE = `SELECT task_queue FROM lt_config_workflows WHERE workflow_type = $1`;
|
|
28
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Look up a job's entity tag in a specific HotMesh namespace. The namespace is a
|
|
30
|
+
* Postgres schema name, so it is interpolated (not a bind param) — same pattern
|
|
31
|
+
* as the diagnostics queries. Callers pass the trusted app_id from config.
|
|
32
|
+
*/
|
|
33
|
+
const RESOLVE_JOB_ENTITY = (appId) => `SELECT entity FROM "${appId}".jobs WHERE key = $1 LIMIT 1`;
|
|
34
|
+
exports.RESOLVE_JOB_ENTITY = RESOLVE_JOB_ENTITY;
|
|
29
35
|
// ---- process.ts queries ---------------------------------------------------
|
|
30
36
|
exports.GET_PROCESS_TASKS = `SELECT * FROM lt_tasks WHERE origin_id = $1 ORDER BY created_at ASC`;
|
|
31
37
|
/**
|
package/build/start/adapters.js
CHANGED
|
@@ -15,12 +15,15 @@ const adapter_1 = require("../services/mcp/adapter");
|
|
|
15
15
|
const escalation_strategy_1 = require("../services/escalation-strategy");
|
|
16
16
|
const default_1 = require("../services/escalation-strategy/default");
|
|
17
17
|
const mcp_2 = require("../services/escalation-strategy/mcp");
|
|
18
|
+
const features_1 = require("../modules/features");
|
|
18
19
|
const socket_auth_1 = require("./socket-auth");
|
|
19
20
|
/**
|
|
20
21
|
* Register all adapters (logging, telemetry, events, maintenance,
|
|
21
22
|
* escalation strategy, MCP) based on the startup config.
|
|
22
23
|
*/
|
|
23
24
|
function registerAdapters(startConfig) {
|
|
25
|
+
// Dashboard feature flags (default permissive; deployment opts out).
|
|
26
|
+
(0, features_1.configureFeatureFlags)(startConfig.features);
|
|
24
27
|
// Logging (register first so subsequent log calls use it)
|
|
25
28
|
if (startConfig.logging?.adapter) {
|
|
26
29
|
logger_1.loggerRegistry.register(startConfig.logging.adapter);
|
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
* Diagnostics tools — mirrors routes/diagnostics.ts. Pure read-only.
|
|
3
3
|
*
|
|
4
4
|
* Three tools:
|
|
5
|
-
* diagnose_job —
|
|
5
|
+
* diagnose_job — per-job verdict (compact by default; opt into events/streams)
|
|
6
6
|
* find_stalled_jobs — fleet-level: running jobs with no recent status change
|
|
7
7
|
* find_orphaned_signals — fleet-level: suspended waiters with no escalation row
|
|
8
8
|
*
|
|
9
9
|
* Efficient usage: start fleet-wide (find_orphaned_signals for the genuinely
|
|
10
10
|
* broken case, find_stalled_jobs for candidates), then call diagnose_job on a
|
|
11
|
-
* specific id for root cause — do not fan diagnose_job across every job.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* specific id for root cause — do not fan diagnose_job across every job.
|
|
12
|
+
* diagnose_job returns the verdict only by default; add include: ['events'] or
|
|
13
|
+
* ['streams'] for the heavy arrays. For full raw message payloads, use the
|
|
14
|
+
* stream browser (list_stream_messages filtered by jid).
|
|
14
15
|
*/
|
|
15
16
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
16
17
|
export declare function registerDiagnosticsTools(server: McpServer): void;
|
|
@@ -39,21 +39,23 @@ const schemas_1 = require("./schemas");
|
|
|
39
39
|
function registerDiagnosticsTools(server) {
|
|
40
40
|
server.registerTool('diagnose_job', {
|
|
41
41
|
title: 'Diagnose Job',
|
|
42
|
-
description: 'Read-only diagnosis for a single workflow job.
|
|
43
|
-
'
|
|
44
|
-
'
|
|
45
|
-
'
|
|
46
|
-
'
|
|
47
|
-
'cannot be unwound). ' +
|
|
42
|
+
description: 'Read-only diagnosis for a single workflow job. Compact by default — returns the ' +
|
|
43
|
+
'verdict only: status, idle_for_ms, workflow_type, stream_summary (counts), the ' +
|
|
44
|
+
'escalation row from hmsh_escalations, and structured findings[] with confidence, ' +
|
|
45
|
+
'evidence, and read-only guidance (where to look next — never recovery; HotMesh ' +
|
|
46
|
+
'state cannot be unwound). ' +
|
|
48
47
|
'A workflow sitting at a condition()/waitFor()/sleepFor() for a long time is ' +
|
|
49
48
|
'classified as a healthy wait, not a fault — only dead-letter, reservation-leak, ' +
|
|
50
49
|
'or a suspended-waiter-with-no-escalation indicate a real problem. ' +
|
|
51
|
-
'
|
|
52
|
-
'
|
|
53
|
-
'
|
|
50
|
+
'To opt into the heavy arrays pass include: ["events"] for the execution timeline ' +
|
|
51
|
+
'(capped by max_events, default 500) and/or include: ["streams"] for raw engine+worker ' +
|
|
52
|
+
'messages; large result/message payloads are summarized to {bytes,preview,truncated}. ' +
|
|
53
|
+
'For full untruncated payloads use list_stream_messages filtered by jid (returned in ' +
|
|
54
|
+
'raw_messages). Call find_orphaned_signals / find_stalled_jobs first to surface IDs, ' +
|
|
55
|
+
'then this per job.',
|
|
54
56
|
inputSchema: schemas_1.diagnoseJobSchema,
|
|
55
57
|
}, async (args) => {
|
|
56
|
-
const result = await api.diagnose({ workflowId: args.workflow_id, appId: args.app_id, maxEvents: args.max_events });
|
|
58
|
+
const result = await api.diagnose({ workflowId: args.workflow_id, appId: args.app_id, maxEvents: args.max_events, include: args.include, verbosity: args.verbosity });
|
|
57
59
|
if (result.error) {
|
|
58
60
|
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
59
61
|
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Escalation tools — mirrors routes/escalations/
|
|
3
|
+
*
|
|
4
|
+
* Every tool runs as the `lt-system` bot. The escalation RBAC helpers
|
|
5
|
+
* (getVisibleRoles / getUserRoles / hasGlobalEscalationAccess) query a uuid
|
|
6
|
+
* column, so the bot's external_id string ('lt-system') would blow up with
|
|
7
|
+
* `invalid input syntax for type uuid`. `systemAuth()` resolves the bot's real
|
|
8
|
+
* UUID once and caches it; that UUID (a superadmin) is passed as the principal.
|
|
3
9
|
*/
|
|
4
10
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
11
|
export declare function registerEscalationTools(server: McpServer): void;
|
|
@@ -35,47 +35,109 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.registerEscalationTools = registerEscalationTools;
|
|
37
37
|
const escalationService = __importStar(require("../../../services/escalation"));
|
|
38
|
+
const escalationApi = __importStar(require("../../../api/escalations"));
|
|
38
39
|
const escalationMetaApi = __importStar(require("../../../api/escalations/metadata"));
|
|
39
40
|
const escalationBulkApi = __importStar(require("../../../api/escalations/bulk"));
|
|
41
|
+
const iam_1 = require("../../../services/iam");
|
|
40
42
|
const schemas_1 = require("./schemas");
|
|
43
|
+
let systemPrincipalId = null;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve (and cache) the lt-system bot's real UUID. The escalation RBAC helpers
|
|
46
|
+
* query the uuid `user_id` column, so the external_id string 'lt-system' would
|
|
47
|
+
* raise `invalid input syntax for type uuid`. The bot is a superadmin, so it has
|
|
48
|
+
* global escalation access.
|
|
49
|
+
*/
|
|
50
|
+
async function systemAuth() {
|
|
51
|
+
if (!systemPrincipalId)
|
|
52
|
+
systemPrincipalId = await (0, iam_1.ensureSystemBot)();
|
|
53
|
+
return { userId: systemPrincipalId, role: 'superadmin' };
|
|
54
|
+
}
|
|
55
|
+
/** Project the full escalation record to the MCP-facing shape, including metadata. */
|
|
56
|
+
function projectEscalation(e) {
|
|
57
|
+
return {
|
|
58
|
+
id: e.id,
|
|
59
|
+
type: e.type,
|
|
60
|
+
subtype: e.subtype,
|
|
61
|
+
role: e.role,
|
|
62
|
+
priority: e.priority,
|
|
63
|
+
status: e.status,
|
|
64
|
+
description: e.description,
|
|
65
|
+
workflow_id: e.workflow_id,
|
|
66
|
+
workflow_type: e.workflow_type,
|
|
67
|
+
assigned_to: e.assigned_to,
|
|
68
|
+
assigned_until: e.assigned_until,
|
|
69
|
+
signal_key: e.signal_key,
|
|
70
|
+
metadata: e.metadata,
|
|
71
|
+
created_at: e.created_at,
|
|
72
|
+
updated_at: e.updated_at,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
41
75
|
function registerEscalationTools(server) {
|
|
76
|
+
// ── Read-only ───────────────────────────────────────────────────────────────
|
|
42
77
|
// mirrors GET /api/escalations
|
|
43
78
|
server.registerTool('find_escalations', {
|
|
44
79
|
title: 'Find Escalations',
|
|
45
|
-
description: 'Search escalations with optional filters
|
|
46
|
-
'
|
|
80
|
+
description: 'Search escalations with optional filters (status, role, type, subtype, ' +
|
|
81
|
+
'assigned_to, priority), free-text `search`, and sorting. `search` matches ' +
|
|
82
|
+
'across description, type/subtype, role, workflow/origin id, and metadata values ' +
|
|
83
|
+
'(e.g. a correlation key like an order id) server-side over the full result set. ' +
|
|
84
|
+
'Returns full records including metadata, workflow linkage, assignment, and signal_key.',
|
|
47
85
|
inputSchema: schemas_1.findEscalationsSchema,
|
|
48
86
|
}, async (args) => {
|
|
49
|
-
const
|
|
87
|
+
const result = await escalationApi.listEscalations({
|
|
50
88
|
status: args.status,
|
|
51
89
|
role: args.role,
|
|
52
90
|
type: args.type,
|
|
91
|
+
subtype: args.subtype,
|
|
92
|
+
assigned_to: args.assigned_to,
|
|
93
|
+
search: args.search,
|
|
53
94
|
priority: args.priority,
|
|
54
95
|
limit: args.limit,
|
|
55
96
|
offset: args.offset,
|
|
56
|
-
|
|
97
|
+
sort_by: args.sort_by,
|
|
98
|
+
order: args.order,
|
|
99
|
+
}, await systemAuth());
|
|
100
|
+
if (result.error) {
|
|
101
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
102
|
+
}
|
|
103
|
+
const { escalations, total } = result.data;
|
|
57
104
|
return {
|
|
58
105
|
content: [{
|
|
59
106
|
type: 'text',
|
|
60
107
|
text: JSON.stringify({
|
|
61
108
|
total,
|
|
62
109
|
count: escalations.length,
|
|
63
|
-
escalations: escalations.map(
|
|
64
|
-
id: e.id,
|
|
65
|
-
type: e.type,
|
|
66
|
-
subtype: e.subtype,
|
|
67
|
-
role: e.role,
|
|
68
|
-
priority: e.priority,
|
|
69
|
-
status: e.status,
|
|
70
|
-
description: e.description,
|
|
71
|
-
workflow_type: e.workflow_type,
|
|
72
|
-
assigned_to: e.assigned_to,
|
|
73
|
-
created_at: e.created_at,
|
|
74
|
-
})),
|
|
110
|
+
escalations: escalations.map(projectEscalation),
|
|
75
111
|
}),
|
|
76
112
|
}],
|
|
77
113
|
};
|
|
78
114
|
});
|
|
115
|
+
// mirrors GET /api/escalations/:id
|
|
116
|
+
server.registerTool('get_escalation', {
|
|
117
|
+
title: 'Get Escalation',
|
|
118
|
+
description: 'Get a single escalation by ID — the full record including metadata, envelope ' +
|
|
119
|
+
'linkage, resolver/escalation payloads, signal_key, and assignment state.',
|
|
120
|
+
inputSchema: schemas_1.getEscalationSchema,
|
|
121
|
+
}, async (args) => {
|
|
122
|
+
const result = await escalationApi.getEscalation({ id: args.id }, await systemAuth());
|
|
123
|
+
if (result.error) {
|
|
124
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
125
|
+
}
|
|
126
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
127
|
+
});
|
|
128
|
+
// mirrors GET /api/escalations/by-workflow/:workflowId
|
|
129
|
+
server.registerTool('get_escalations_by_workflow', {
|
|
130
|
+
title: 'Get Escalations by Workflow',
|
|
131
|
+
description: 'List all escalations linked to a specific workflow ID, newest first. Returns ' +
|
|
132
|
+
'full records including metadata.',
|
|
133
|
+
inputSchema: schemas_1.getEscalationsByWorkflowSchema,
|
|
134
|
+
}, async (args) => {
|
|
135
|
+
const result = await escalationApi.getEscalationsByWorkflowId({ workflowId: args.workflow_id });
|
|
136
|
+
if (result.error) {
|
|
137
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
138
|
+
}
|
|
139
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
140
|
+
});
|
|
79
141
|
// mirrors GET /api/escalations/stats
|
|
80
142
|
server.registerTool('get_escalation_stats', {
|
|
81
143
|
title: 'Get Escalation Stats',
|
|
@@ -85,12 +147,23 @@ function registerEscalationTools(server) {
|
|
|
85
147
|
}, async (args) => {
|
|
86
148
|
const stats = await escalationService.getEscalationStats(undefined, args.period);
|
|
87
149
|
return {
|
|
88
|
-
content: [{
|
|
89
|
-
type: 'text',
|
|
90
|
-
text: JSON.stringify(stats),
|
|
91
|
-
}],
|
|
150
|
+
content: [{ type: 'text', text: JSON.stringify(stats) }],
|
|
92
151
|
};
|
|
93
152
|
});
|
|
153
|
+
// mirrors GET /api/escalations/by-metadata
|
|
154
|
+
server.registerTool('find_by_metadata', {
|
|
155
|
+
title: 'Find by Metadata',
|
|
156
|
+
description: 'Find escalations by a metadata key-value pair (e.g. a correlation key written ' +
|
|
157
|
+
'into metadata when the escalation was raised).',
|
|
158
|
+
inputSchema: schemas_1.findByMetadataSchema,
|
|
159
|
+
}, async (args) => {
|
|
160
|
+
const result = await escalationMetaApi.findByMetadata(args, await systemAuth());
|
|
161
|
+
if (result.error) {
|
|
162
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
163
|
+
}
|
|
164
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
165
|
+
});
|
|
166
|
+
// ── Read-write ────────────────────────────────────────────────────────────────
|
|
94
167
|
// mirrors POST /api/escalations/:id/claim
|
|
95
168
|
server.registerTool('claim_escalation', {
|
|
96
169
|
title: 'Claim Escalation',
|
|
@@ -99,23 +172,79 @@ function registerEscalationTools(server) {
|
|
|
99
172
|
'the escalation returns to the queue.',
|
|
100
173
|
inputSchema: schemas_1.claimEscalationSchema,
|
|
101
174
|
}, async (args) => {
|
|
102
|
-
const
|
|
103
|
-
if (
|
|
104
|
-
return {
|
|
105
|
-
content: [{ type: 'text', text: JSON.stringify({ error: 'Escalation not found' }) }],
|
|
106
|
-
isError: true,
|
|
107
|
-
};
|
|
175
|
+
const result = await escalationApi.claimEscalation({ id: args.id, durationMinutes: args.duration_minutes }, await systemAuth());
|
|
176
|
+
if (result.error) {
|
|
177
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
108
178
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
179
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
180
|
+
});
|
|
181
|
+
// mirrors POST /api/escalations/:id/release
|
|
182
|
+
server.registerTool('release_escalation', {
|
|
183
|
+
title: 'Release Escalation',
|
|
184
|
+
description: 'Release a claimed escalation back to the available pool. Reverses a ' +
|
|
185
|
+
'claim_escalation so another holder can pick it up.',
|
|
186
|
+
inputSchema: schemas_1.releaseEscalationSchema,
|
|
187
|
+
}, async (args) => {
|
|
188
|
+
const result = await escalationApi.releaseEscalation({ id: args.id }, await systemAuth());
|
|
189
|
+
if (result.error) {
|
|
190
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
115
191
|
}
|
|
116
|
-
return {
|
|
117
|
-
|
|
118
|
-
|
|
192
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
193
|
+
});
|
|
194
|
+
// mirrors POST /api/escalations/:id/resolve
|
|
195
|
+
server.registerTool('resolve_escalation', {
|
|
196
|
+
title: 'Resolve Escalation',
|
|
197
|
+
description: 'Resolve a pending escalation with a human-provided payload. Routes by escalation ' +
|
|
198
|
+
'shape: efficient (signal_key) escalations resume the waiting workflow in place; ' +
|
|
199
|
+
'legacy paths signal via routing metadata or re-run the original workflow. ' +
|
|
200
|
+
'Password fields in the payload are replaced with ephemeral tokens.',
|
|
201
|
+
inputSchema: schemas_1.resolveEscalationSchema,
|
|
202
|
+
}, async (args) => {
|
|
203
|
+
const result = await escalationApi.resolveEscalation({ id: args.id, resolverPayload: args.resolverPayload }, await systemAuth());
|
|
204
|
+
if (result.error) {
|
|
205
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
206
|
+
}
|
|
207
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
208
|
+
});
|
|
209
|
+
// mirrors POST /api/escalations/resolve-by-signal-key
|
|
210
|
+
server.registerTool('resolve_by_signal_key', {
|
|
211
|
+
title: 'Resolve by Signal Key',
|
|
212
|
+
description: 'Resolve an efficient (atomic) escalation directly by its signal_key and resume the ' +
|
|
213
|
+
'waiting workflow in place. For callers that know the deterministic signal id and want ' +
|
|
214
|
+
'to skip the id lookup.',
|
|
215
|
+
inputSchema: schemas_1.resolveBySignalKeySchema,
|
|
216
|
+
}, async (args) => {
|
|
217
|
+
const result = await escalationApi.resolveBySignalKey({ signalKey: args.signalKey, resolverPayload: args.resolverPayload }, await systemAuth());
|
|
218
|
+
if (result.error) {
|
|
219
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
220
|
+
}
|
|
221
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
222
|
+
});
|
|
223
|
+
// mirrors PATCH /api/escalations/:id/escalate
|
|
224
|
+
server.registerTool('escalate_escalation', {
|
|
225
|
+
title: 'Escalate Escalation',
|
|
226
|
+
description: 'Route a pending escalation to a different role (per the escalation chain). The new ' +
|
|
227
|
+
'role becomes responsible for resolving it.',
|
|
228
|
+
inputSchema: schemas_1.escalateEscalationSchema,
|
|
229
|
+
}, async (args) => {
|
|
230
|
+
const result = await escalationApi.escalateToRole({ id: args.id, targetRole: args.targetRole }, await systemAuth());
|
|
231
|
+
if (result.error) {
|
|
232
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
233
|
+
}
|
|
234
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
235
|
+
});
|
|
236
|
+
// mirrors POST /api/escalations/:id/cancel
|
|
237
|
+
server.registerTool('cancel_escalation', {
|
|
238
|
+
title: 'Cancel Escalation',
|
|
239
|
+
description: 'Permanently cancel a pending escalation — used when the tied workflow has ' +
|
|
240
|
+
'terminated and can never receive the resolution signal. Preserved for audit.',
|
|
241
|
+
inputSchema: schemas_1.cancelEscalationSchema,
|
|
242
|
+
}, async (args) => {
|
|
243
|
+
const result = await escalationApi.cancelSingleEscalation({ id: args.id }, await systemAuth());
|
|
244
|
+
if (result.error) {
|
|
245
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
246
|
+
}
|
|
247
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
119
248
|
});
|
|
120
249
|
// mirrors POST /api/escalations/release-expired
|
|
121
250
|
server.registerTool('release_expired_claims', {
|
|
@@ -148,26 +277,13 @@ function registerEscalationTools(server) {
|
|
|
148
277
|
}],
|
|
149
278
|
};
|
|
150
279
|
});
|
|
151
|
-
// ── Metadata-based operations ───────────────────────────────────────────────
|
|
152
|
-
// mirrors GET /api/escalations/by-metadata
|
|
153
|
-
server.registerTool('find_by_metadata', {
|
|
154
|
-
title: 'Find by Metadata',
|
|
155
|
-
description: 'Find escalations by a metadata key-value pair.',
|
|
156
|
-
inputSchema: schemas_1.findByMetadataSchema,
|
|
157
|
-
}, async (args) => {
|
|
158
|
-
const result = await escalationMetaApi.findByMetadata(args, { userId: 'lt-system' });
|
|
159
|
-
if (result.error) {
|
|
160
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
161
|
-
}
|
|
162
|
-
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
163
|
-
});
|
|
164
280
|
// mirrors POST /api/escalations/claim-by-metadata
|
|
165
281
|
server.registerTool('claim_by_metadata', {
|
|
166
282
|
title: 'Claim by Metadata',
|
|
167
283
|
description: 'Find and claim an escalation by metadata key-value pair.',
|
|
168
284
|
inputSchema: schemas_1.claimByMetadataSchema,
|
|
169
285
|
}, async (args) => {
|
|
170
|
-
const result = await escalationMetaApi.claimByMetadata(args,
|
|
286
|
+
const result = await escalationMetaApi.claimByMetadata(args, await systemAuth());
|
|
171
287
|
if (result.error) {
|
|
172
288
|
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
173
289
|
}
|
|
@@ -179,7 +295,7 @@ function registerEscalationTools(server) {
|
|
|
179
295
|
description: 'Find and resolve an escalation by metadata key-value pair.',
|
|
180
296
|
inputSchema: schemas_1.resolveByMetadataSchema,
|
|
181
297
|
}, async (args) => {
|
|
182
|
-
const result = await escalationMetaApi.resolveByMetadata(args,
|
|
298
|
+
const result = await escalationMetaApi.resolveByMetadata(args, await systemAuth());
|
|
183
299
|
if (result.error) {
|
|
184
300
|
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
185
301
|
}
|
|
@@ -192,7 +308,7 @@ function registerEscalationTools(server) {
|
|
|
192
308
|
description: 'Claim multiple escalations in a single operation.',
|
|
193
309
|
inputSchema: schemas_1.bulkClaimSchema,
|
|
194
310
|
}, async (args) => {
|
|
195
|
-
const result = await escalationBulkApi.bulkClaim(args,
|
|
311
|
+
const result = await escalationBulkApi.bulkClaim(args, await systemAuth());
|
|
196
312
|
if (result.error) {
|
|
197
313
|
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
198
314
|
}
|
|
@@ -204,7 +320,7 @@ function registerEscalationTools(server) {
|
|
|
204
320
|
description: 'Assign multiple escalations to a specific user.',
|
|
205
321
|
inputSchema: schemas_1.bulkAssignSchema,
|
|
206
322
|
}, async (args) => {
|
|
207
|
-
const result = await escalationBulkApi.bulkAssign(args,
|
|
323
|
+
const result = await escalationBulkApi.bulkAssign(args, await systemAuth());
|
|
208
324
|
if (result.error) {
|
|
209
325
|
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
210
326
|
}
|
|
@@ -216,7 +332,19 @@ function registerEscalationTools(server) {
|
|
|
216
332
|
description: 'Escalate multiple escalations to a different role.',
|
|
217
333
|
inputSchema: schemas_1.bulkEscalateSchema,
|
|
218
334
|
}, async (args) => {
|
|
219
|
-
const result = await escalationBulkApi.bulkEscalate(args,
|
|
335
|
+
const result = await escalationBulkApi.bulkEscalate(args, await systemAuth());
|
|
336
|
+
if (result.error) {
|
|
337
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
338
|
+
}
|
|
339
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
340
|
+
});
|
|
341
|
+
// mirrors POST /api/escalations/bulk-cancel
|
|
342
|
+
server.registerTool('bulk_cancel', {
|
|
343
|
+
title: 'Bulk Cancel',
|
|
344
|
+
description: 'Cancel multiple pending escalations in a single operation.',
|
|
345
|
+
inputSchema: schemas_1.bulkCancelSchema,
|
|
346
|
+
}, async (args) => {
|
|
347
|
+
const result = await escalationApi.bulkCancel(args, await systemAuth());
|
|
220
348
|
if (result.error) {
|
|
221
349
|
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
222
350
|
}
|
|
@@ -228,7 +356,7 @@ function registerEscalationTools(server) {
|
|
|
228
356
|
description: 'Update the priority of multiple escalations.',
|
|
229
357
|
inputSchema: schemas_1.updatePrioritySchema,
|
|
230
358
|
}, async (args) => {
|
|
231
|
-
const result = await escalationBulkApi.updatePriority(args,
|
|
359
|
+
const result = await escalationBulkApi.updatePriority(args, await systemAuth());
|
|
232
360
|
if (result.error) {
|
|
233
361
|
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
234
362
|
}
|
|
@@ -55,7 +55,7 @@ const settings_1 = require("./settings");
|
|
|
55
55
|
const exports_1 = require("./exports");
|
|
56
56
|
const overview_1 = require("./overview");
|
|
57
57
|
const diagnostics_1 = require("./diagnostics");
|
|
58
|
-
const TOOL_COUNT =
|
|
58
|
+
const TOOL_COUNT = 83;
|
|
59
59
|
let server = null;
|
|
60
60
|
async function createAdminServer(options) {
|
|
61
61
|
if (server && !options?.fresh)
|
|
@@ -66,7 +66,7 @@ async function createAdminServer(options) {
|
|
|
66
66
|
server = instance;
|
|
67
67
|
}
|
|
68
68
|
(0, tasks_1.registerTaskTools)(instance); // 2 tools
|
|
69
|
-
(0, escalations_1.registerEscalationTools)(instance); //
|
|
69
|
+
(0, escalations_1.registerEscalationTools)(instance); // 20 tools (RO + RW single + metadata + bulk)
|
|
70
70
|
(0, workflow_config_1.registerWorkflowConfigTools)(instance); // 3 tools
|
|
71
71
|
(0, workflows_1.registerWorkflowTools)(instance); // 3 tools
|
|
72
72
|
(0, mcp_servers_1.registerMcpServerTools)(instance); // 4 tools
|
|
@@ -83,7 +83,7 @@ async function createAdminServer(options) {
|
|
|
83
83
|
(0, exports_1.registerExportTools)(instance); // 4 tools
|
|
84
84
|
(0, overview_1.registerOverviewTools)(instance); // 1 tool
|
|
85
85
|
(0, diagnostics_1.registerDiagnosticsTools)(instance); // 3 tools
|
|
86
|
-
// Total:
|
|
86
|
+
// Total: 83
|
|
87
87
|
logger_1.loggerRegistry.info(`[lt-mcp:admin] ${name} ready (${TOOL_COUNT} tools registered)`);
|
|
88
88
|
return instance;
|
|
89
89
|
}
|