@hotmeshio/long-tail 0.5.10 → 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/controlplane.d.ts +1 -0
- package/build/api/controlplane.js +1 -0
- package/build/api/diagnostics.d.ts +8 -1
- 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 +3 -2
- package/build/api/settings.js +13 -2
- 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/modules/version.d.ts +16 -0
- package/build/modules/version.js +34 -0
- package/build/routes/controlplane.js +1 -0
- package/build/routes/diagnostics.js +32 -11
- 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/controlplane/index.js +3 -2
- package/build/services/controlplane/stream-messages-sql.d.ts +4 -3
- package/build/services/controlplane/stream-messages-sql.js +12 -7
- package/build/services/controlplane/types.d.ts +2 -0
- package/build/services/diagnostics/index.d.ts +53 -7
- package/build/services/diagnostics/index.js +124 -36
- package/build/services/diagnostics/patterns.d.ts +13 -3
- package/build/services/diagnostics/patterns.js +25 -14
- 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 +11 -4
- package/build/system/mcp-servers/admin/diagnostics.js +34 -22
- 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 +101 -6
- package/build/system/mcp-servers/admin/schemas.js +43 -6
- 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/auth.d.ts +1 -1
- package/build/types/startup.d.ts +9 -0
- package/dashboard/dist/assets/{AdminDashboard-0LSslIQ7.js → AdminDashboard-LTiYLuzq.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-0LSslIQ7.js.map → AdminDashboard-LTiYLuzq.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-hqBr1540.js → AgentConfigPage-nlOudfpZ.js} +7 -7
- package/dashboard/dist/assets/{AgentConfigPage-hqBr1540.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-fFE4GAaO.js → BotPicker-BhKmq7M7.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-fFE4GAaO.js.map → BotPicker-BhKmq7M7.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-DLIleX2L.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DotZ7iQc.js.map → CapabilitiesPage-DLIleX2L.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D97SYypF.js → CollapsibleSection-D7SVwNVk.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D97SYypF.js.map → CollapsibleSection-D7SVwNVk.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-C08U6dlv.js → CredentialsPage-fat5Z2U9.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-C08U6dlv.js.map → CredentialsPage-fat5Z2U9.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-C2TuCl4h.js → CronLabel-OOP4P2mJ.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-C2TuCl4h.js.map → CronLabel-OOP4P2mJ.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-C3zGsESx.js → CustomDurationPicker-COacSAXO.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-C3zGsESx.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-DF4m0cv_.js → ElapsedCell-CkfCD-m7.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DF4m0cv_.js.map → ElapsedCell-CkfCD-m7.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-blGOYKtJ.js → EscalationsOverview-BmI8jxlh.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-blGOYKtJ.js.map → EscalationsOverview-BmI8jxlh.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-CeKfFk3m.js +2 -0
- package/dashboard/dist/assets/EventTable-CeKfFk3m.js.map +1 -0
- package/dashboard/dist/assets/{GraphInvokePage-QVAUHmjI.js → GraphInvokePage-BZBPBCSq.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-QVAUHmjI.js.map → GraphInvokePage-BZBPBCSq.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-DvYgvCcO.js → HomePage-dM7U2tl6.js} +2 -2
- package/dashboard/dist/assets/{HomePage-DvYgvCcO.js.map → HomePage-dM7U2tl6.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-D6tQ3ZG2.js → ListToolbar-BJaCzAXS.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-D6tQ3ZG2.js.map → ListToolbar-BJaCzAXS.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BClbGYb8.js → McpOverview-CvnDG5OB.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BClbGYb8.js.map → McpOverview-CvnDG5OB.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-DHjfDRdm.js → McpQueryDetailPage-DwmSIcIL.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-DHjfDRdm.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-8a6lsehv.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-DRbIZMU2.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-DjQuNERz.js → ProcessDetailPage-ByyWCs2A.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DjQuNERz.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-CFCN_mRF.js → RolesPage-B2Kdf-L9.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CFCN_mRF.js.map → RolesPage-B2Kdf-L9.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-sBxAvlRf.js → RunAsSelector-BzkZXpSX.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-sBxAvlRf.js.map → RunAsSelector-BzkZXpSX.js.map} +1 -1
- package/dashboard/dist/assets/StreamMessageDetail-B6ch-6SY.js +2 -0
- package/dashboard/dist/assets/StreamMessageDetail-B6ch-6SY.js.map +1 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CjvfUkls.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CjvfUkls.js.map +1 -0
- 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-CgFN5uWn.js → TaskDetailPage-BjHU6opi.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CgFN5uWn.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-qj25rRZL.js → TasksListPage-Bem44zd0.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-qj25rRZL.js.map → TasksListPage-Bem44zd0.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-C7LylVjP.js → TimeAgo-CUIYqSt_.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-C7LylVjP.js.map → TimeAgo-CUIYqSt_.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CrCtoBlo.js → TimestampCell--tnreI1i.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CrCtoBlo.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-DYGlB-QW.js → ToolTestPanel-OD99H7Pk.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DYGlB-QW.js.map → ToolTestPanel-OD99H7Pk.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DLY6X_R6.js → TopicDetailPage-rh_dsTJI.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-DLY6X_R6.js.map → TopicDetailPage-rh_dsTJI.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-C5nOLsLx.js → TopicsPage-CD_40_v-.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-C5nOLsLx.js.map → TopicsPage-CD_40_v-.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-CgUZyiwm.js → UserName-C__c8BN0.js} +2 -2
- package/dashboard/dist/assets/{UserName-CgUZyiwm.js.map → UserName-C__c8BN0.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-Bw6QdtUO.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-CDr5CTM2.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-CaMeZwde.js → WorkflowsOverview-BRc0QbA7.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CaMeZwde.js.map → WorkflowsOverview-BRc0QbA7.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3uyCiIX.js → YamlWorkflowDetailPage-DdzspNQR.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3uyCiIX.js.map → YamlWorkflowDetailPage-DdzspNQR.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DRnYgsvA.js → YamlWorkflowsPage-Djw5ZbgQ.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DRnYgsvA.js.map → YamlWorkflowsPage-Djw5ZbgQ.js.map} +1 -1
- package/dashboard/dist/assets/{agents-HMkTc425.js → agents-xstNkF6c.js} +2 -2
- package/dashboard/dist/assets/{agents-HMkTc425.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-CDe2jXNx.js → bots-BztAI0s_.js} +2 -2
- package/dashboard/dist/assets/{bots-CDe2jXNx.js.map → bots-BztAI0s_.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DhnM7Ztb.js → capabilities-CEDwtxNL.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DhnM7Ztb.js.map → capabilities-CEDwtxNL.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BwIJ9ZC_.js → controlplane-BlGEsRKe.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BwIJ9ZC_.js.map → controlplane-BlGEsRKe.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BKqSywVA.js → escalation-columns-nVYVt7Gl.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BKqSywVA.js.map → escalation-columns-nVYVt7Gl.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-Djk5XKmX.js → escalation-iI4QKlP-.js} +2 -2
- package/dashboard/dist/assets/{escalation-Djk5XKmX.js.map → escalation-iI4QKlP-.js.map} +1 -1
- package/dashboard/dist/assets/{index-BW-fIquS.js → index-B5qsp8lb.js} +2 -2
- package/dashboard/dist/assets/{index-BW-fIquS.js.map → index-B5qsp8lb.js.map} +1 -1
- package/dashboard/dist/assets/{index-DBi9Q9Hw.js → index-B7VC0vjf.js} +2 -2
- package/dashboard/dist/assets/{index-DBi9Q9Hw.js.map → index-B7VC0vjf.js.map} +1 -1
- package/dashboard/dist/assets/{index-CPIYW81T.js → index-BUmnJ4eT.js} +2 -2
- package/dashboard/dist/assets/{index-CPIYW81T.js.map → index-BUmnJ4eT.js.map} +1 -1
- package/dashboard/dist/assets/{index-BNkpns_E.js → index-CAqEy2Db.js} +2 -2
- package/dashboard/dist/assets/{index-BNkpns_E.js.map → index-CAqEy2Db.js.map} +1 -1
- package/dashboard/dist/assets/{index-BYpWOUEe.js → index-CMviPjXQ.js} +2 -2
- package/dashboard/dist/assets/{index-BYpWOUEe.js.map → index-CMviPjXQ.js.map} +1 -1
- package/dashboard/dist/assets/index-CP0JEQhZ.js +6 -0
- package/dashboard/dist/assets/{index-E2hQ8DIi.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-ClvYSNZd.css +1 -0
- package/dashboard/dist/assets/{index-BFQ2t-p1.js → index-D1xVY4JR.js} +27 -27
- package/dashboard/dist/assets/index-D1xVY4JR.js.map +1 -0
- package/dashboard/dist/assets/{index-rUST2YsO.js → index-DPLy-jwO.js} +2 -2
- package/dashboard/dist/assets/{index-rUST2YsO.js.map → index-DPLy-jwO.js.map} +1 -1
- package/dashboard/dist/assets/{index-DRIJM1L-.js → index-DjJ6VCuc.js} +2 -2
- package/dashboard/dist/assets/{index-DRIJM1L-.js.map → index-DjJ6VCuc.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dhy2PVAw.js → index-Dsi5o7dx.js} +2 -2
- package/dashboard/dist/assets/{index-Dhy2PVAw.js.map → index-Dsi5o7dx.js.map} +1 -1
- package/dashboard/dist/assets/{index-mEQ6kCnt.js → index-DzVYjoex.js} +3 -3
- package/dashboard/dist/assets/{index-mEQ6kCnt.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-jQE3dBVi.js → knowledge-BKg0cr39.js} +2 -2
- package/dashboard/dist/assets/{knowledge-jQE3dBVi.js.map → knowledge-BKg0cr39.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-DtEGfZiz.js → mcp-CVdHpKlz.js} +2 -2
- package/dashboard/dist/assets/{mcp-DtEGfZiz.js.map → mcp-CVdHpKlz.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CiTLVuDC.js → mcp-query-CYxZcbwQ.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CiTLVuDC.js.map → mcp-query-CYxZcbwQ.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-ClNdzuUK.js → pipelines-BOEv7P6O.js} +2 -2
- package/dashboard/dist/assets/{pipelines-ClNdzuUK.js.map → pipelines-BOEv7P6O.js.map} +1 -1
- package/dashboard/dist/assets/{roles-BmHbRaPT.js → roles-c5cV2QYQ.js} +2 -2
- package/dashboard/dist/assets/{roles-BmHbRaPT.js.map → roles-c5cV2QYQ.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BPONxLcq.js → tasks-JV3BjeEF.js} +2 -2
- package/dashboard/dist/assets/{tasks-BPONxLcq.js.map → tasks-JV3BjeEF.js.map} +1 -1
- package/dashboard/dist/assets/{topics-XREPRxwo.js → topics-BDaPnhnQ.js} +2 -2
- package/dashboard/dist/assets/{topics-XREPRxwo.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-M7SaEfel.js → useEventHooks-a7Dnh8G4.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-M7SaEfel.js.map → useEventHooks-a7Dnh8G4.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-BQHGkdBv.js → useNamespace-BSwEV0e9.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-BQHGkdBv.js.map → useNamespace-BSwEV0e9.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-B7JtUGSE.js → useYamlActivityEvents-BuqvL-cn.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-B7JtUGSE.js.map → useYamlActivityEvents-BuqvL-cn.js.map} +1 -1
- package/dashboard/dist/assets/{users-BpjSNhQe.js → users-Pn85K_3C.js} +2 -2
- package/dashboard/dist/assets/{users-BpjSNhQe.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-k4jE0ECC.js → workflows-DF-9Voyi.js} +2 -2
- package/dashboard/dist/assets/{workflows-k4jE0ECC.js.map → workflows-DF-9Voyi.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DpviSLEL.js → yaml-workflows-2roKaSSK.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DpviSLEL.js.map → yaml-workflows-2roKaSSK.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/mcp/admin.md +242 -5
- package/docs/mcp.md +102 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentDetailPage-bnXR1ezD.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-bnXR1ezD.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-tJIlrnfM.js +0 -2
- package/dashboard/dist/assets/AgentsPage-tJIlrnfM.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-B7gEfcw3.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-B7gEfcw3.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-DotZ7iQc.js +0 -2
- package/dashboard/dist/assets/EventTable-DzrMH-ux.js +0 -2
- package/dashboard/dist/assets/EventTable-DzrMH-ux.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-qtEuMDrd.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-qtEuMDrd.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-DRbIZMU2.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-CMfwXQ4R.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-CMfwXQ4R.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-Dq2pfV68.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-Dq2pfV68.js.map +0 -1
- package/dashboard/dist/assets/ProcessesListPage-vJimii8-.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-vJimii8-.js.map +0 -1
- package/dashboard/dist/assets/SwimlaneTimeline-2Eet4OOL.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-2Eet4OOL.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-CDr5CTM2.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-tCBP0i0Y.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-tCBP0i0Y.js.map +0 -1
- package/dashboard/dist/assets/index-BFQ2t-p1.js.map +0 -1
- package/dashboard/dist/assets/index-Cydgj_Co.js +0 -2
- package/dashboard/dist/assets/index-Cydgj_Co.js.map +0 -1
- package/dashboard/dist/assets/index-DSki_Ub6.css +0 -1
- package/dashboard/dist/assets/index-E2hQ8DIi.js +0 -6
- package/dashboard/dist/assets/index-u08vQUaw.js +0 -2
- package/dashboard/dist/assets/index-u08vQUaw.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +0 -1
|
@@ -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);
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Diagnostics tools — mirrors routes/diagnostics.ts
|
|
2
|
+
* Diagnostics tools — mirrors routes/diagnostics.ts. Pure read-only.
|
|
3
3
|
*
|
|
4
4
|
* Three tools:
|
|
5
|
-
* diagnose_job —
|
|
6
|
-
* find_stalled_jobs — fleet-level: running jobs with no recent
|
|
7
|
-
* find_orphaned_signals — fleet-level: suspended
|
|
5
|
+
* diagnose_job — per-job verdict (compact by default; opt into events/streams)
|
|
6
|
+
* find_stalled_jobs — fleet-level: running jobs with no recent status change
|
|
7
|
+
* find_orphaned_signals — fleet-level: suspended waiters with no escalation row
|
|
8
|
+
*
|
|
9
|
+
* Efficient usage: start fleet-wide (find_orphaned_signals for the genuinely
|
|
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
|
+
* 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).
|
|
8
15
|
*/
|
|
9
16
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
17
|
export declare function registerDiagnosticsTools(server: McpServer): void;
|
|
@@ -39,17 +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: '
|
|
43
|
-
'
|
|
44
|
-
'
|
|
45
|
-
'and
|
|
46
|
-
'
|
|
47
|
-
'
|
|
48
|
-
'
|
|
49
|
-
'
|
|
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). ' +
|
|
47
|
+
'A workflow sitting at a condition()/waitFor()/sleepFor() for a long time is ' +
|
|
48
|
+
'classified as a healthy wait, not a fault — only dead-letter, reservation-leak, ' +
|
|
49
|
+
'or a suspended-waiter-with-no-escalation indicate a real problem. ' +
|
|
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.',
|
|
50
56
|
inputSchema: schemas_1.diagnoseJobSchema,
|
|
51
57
|
}, async (args) => {
|
|
52
|
-
const result = await api.diagnose({ workflowId: args.workflow_id, appId: args.app_id });
|
|
58
|
+
const result = await api.diagnose({ workflowId: args.workflow_id, appId: args.app_id, maxEvents: args.max_events, include: args.include, verbosity: args.verbosity });
|
|
53
59
|
if (result.error) {
|
|
54
60
|
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
55
61
|
}
|
|
@@ -57,15 +63,18 @@ function registerDiagnosticsTools(server) {
|
|
|
57
63
|
});
|
|
58
64
|
server.registerTool('find_stalled_jobs', {
|
|
59
65
|
title: 'Find Stalled Jobs',
|
|
60
|
-
description: 'Find
|
|
61
|
-
'
|
|
62
|
-
'
|
|
63
|
-
'
|
|
66
|
+
description: 'Find running jobs with no status change in N minutes (bounded, indexed; cap 200). ' +
|
|
67
|
+
'IMPORTANT: "no recent change" is NOT "broken" — HotMesh bumps updated_at only on ' +
|
|
68
|
+
'status change, so a frozen timestamp is the normal signature of a workflow waiting ' +
|
|
69
|
+
'at a condition()/waitFor()/sleepFor(). Each row carries a `likely` classification: ' +
|
|
70
|
+
'"waiting" (has a pending escalation — healthy) vs "no_recent_progress" (worth a ' +
|
|
71
|
+
'closer look). Returns workflow_id, workflow_type, idle_ms, has_open_escalation, likely. ' +
|
|
72
|
+
'Triage the "no_recent_progress" rows with diagnose_job for root cause.',
|
|
64
73
|
inputSchema: schemas_1.findStalledJobsSchema,
|
|
65
74
|
}, async (args) => {
|
|
66
75
|
const result = await api.stalledJobs({
|
|
67
76
|
appId: args.app_id,
|
|
68
|
-
|
|
77
|
+
idleMinutes: args.idle_minutes,
|
|
69
78
|
workflowType: args.workflow_type,
|
|
70
79
|
limit: args.limit,
|
|
71
80
|
});
|
|
@@ -76,16 +85,19 @@ function registerDiagnosticsTools(server) {
|
|
|
76
85
|
});
|
|
77
86
|
server.registerTool('find_orphaned_signals', {
|
|
78
87
|
title: 'Find Orphaned Signals',
|
|
79
|
-
description: 'Find running workflows
|
|
80
|
-
'
|
|
81
|
-
'
|
|
82
|
-
'
|
|
83
|
-
'
|
|
84
|
-
'
|
|
85
|
-
'
|
|
88
|
+
description: 'Find running workflows suspended at a condition() (waiter committed, signal ' +
|
|
89
|
+
'registered) that have NO escalation row in hmsh_escalations — the genuinely ' +
|
|
90
|
+
'broken case: the workflow waits for a signal nothing will send. ' +
|
|
91
|
+
'Scans a recent window only (within_hours, default 24, max 720) to stay off a ' +
|
|
92
|
+
'full-history scan of the partitioned worker_streams table; widen the window ' +
|
|
93
|
+
'deliberately to reach older orphans, narrow it to go faster. ' +
|
|
94
|
+
'Returns job_id, signal_id, workflow_name, suspended_at, waiting_ms, and ' +
|
|
95
|
+
'missing_queue_config (true = pre-0.22 SDK, false = error at commit time), plus ' +
|
|
96
|
+
'the within_hours actually applied. Call diagnose_job on any result for the full ' +
|
|
97
|
+
'picture. This is read-only — resolving an orphan needs engineering review.',
|
|
86
98
|
inputSchema: schemas_1.findOrphanedSignalsSchema,
|
|
87
99
|
}, async (args) => {
|
|
88
|
-
const result = await api.orphanedSignals({ appId: args.app_id, limit: args.limit });
|
|
100
|
+
const result = await api.orphanedSignals({ appId: args.app_id, withinHours: args.within_hours, limit: args.limit });
|
|
89
101
|
if (result.error) {
|
|
90
102
|
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
91
103
|
}
|
|
@@ -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
|
}
|