@hotmeshio/long-tail 0.4.12 → 0.4.14
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/README.md +76 -100
- package/build/api/escalations/helpers.d.ts +14 -0
- package/build/api/escalations/helpers.js +14 -0
- package/build/api/escalations/index.d.ts +1 -0
- package/build/api/escalations/index.js +5 -1
- package/build/api/escalations/metadata.d.ts +56 -0
- package/build/api/escalations/metadata.js +178 -0
- package/build/api/index.d.ts +2 -1
- package/build/api/index.js +3 -2
- package/build/api/{mcp-runs.d.ts → pipelines.d.ts} +18 -0
- package/build/api/{mcp-runs.js → pipelines.js} +36 -4
- package/build/api/workflows/discovery.js +1 -1
- package/build/bin/ltc.js +17 -0
- package/build/lib/cli/commands/escalations.d.ts +9 -0
- package/build/lib/cli/commands/escalations.js +36 -0
- package/build/lib/db/schemas/010_metadata_gin.sql +5 -0
- package/build/routes/escalations/index.js +3 -0
- package/build/routes/escalations/metadata.d.ts +6 -0
- package/build/routes/escalations/metadata.js +86 -0
- package/build/routes/index.js +3 -2
- package/build/routes/{mcp-runs.js → pipelines.js} +17 -4
- package/build/sdk/index.d.ts +30 -4
- package/build/sdk/index.js +15 -5
- package/build/services/escalation/crud.d.ts +5 -0
- package/build/services/escalation/crud.js +27 -0
- package/build/services/escalation/sql.d.ts +5 -0
- package/build/services/escalation/sql.js +39 -1
- package/build/services/interceptor/activities/escalation.js +11 -0
- package/build/services/{mcp-runs → pipelines}/sql.js +1 -1
- package/build/start/adapters.js +3 -6
- package/build/start/server.js +7 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/startup.d.ts +3 -3
- package/dashboard/dist/assets/{AdminDashboard-B7AFFt4L.js → AdminDashboard-BuqyRY2r.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-B7AFFt4L.js.map → AdminDashboard-BuqyRY2r.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-Bum1dUIi.js +16 -0
- package/dashboard/dist/assets/AgentConfigPage-Bum1dUIi.js.map +1 -0
- package/dashboard/dist/assets/{AgentDetailPage-DnHaUCS5.js → AgentDetailPage-0Kq-tBF2.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-DnHaUCS5.js.map → AgentDetailPage-0Kq-tBF2.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-BR2-PdTq.js → AgentsPage-B5gYDSOX.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-BR2-PdTq.js.map → AgentsPage-B5gYDSOX.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-BWHThQDC.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BWHThQDC.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-BQ336piW.js +2 -0
- package/dashboard/dist/assets/{BotPicker-CAowL3ib.js.map → BotPicker-BQ336piW.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-CkiJROX-.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-CSUKBvEN.js.map → CapabilitiesPage-CkiJROX-.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-Bv6ixURp.js → CollapsibleSection-SM8_UjNe.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-Bv6ixURp.js.map → CollapsibleSection-SM8_UjNe.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CdPKxRBj.js → CredentialsPage-f6niro9_.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CdPKxRBj.js.map → CredentialsPage-f6niro9_.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-BtdXRDqs.js → CronLabel-DINmdqoe.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-BtdXRDqs.js.map → CronLabel-DINmdqoe.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-Mq3SLUuv.js → CustomDurationPicker-BCUcYxfB.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-Mq3SLUuv.js.map → CustomDurationPicker-BCUcYxfB.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-lw2wmqty.js → DropZone-BkfRoUcm.js} +2 -2
- package/dashboard/dist/assets/{DropZone-lw2wmqty.js.map → DropZone-BkfRoUcm.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-DOTqB4ZX.js → ElapsedCell-DPYZnXsX.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DOTqB4ZX.js.map → ElapsedCell-DPYZnXsX.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DSM8Mnb-.js → EscalationsOverview-CTB8AEBd.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DSM8Mnb-.js.map → EscalationsOverview-CTB8AEBd.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-C-HagWbs.js → EventTable-8_r3Tg09.js} +2 -2
- package/dashboard/dist/assets/{EventTable-C-HagWbs.js.map → EventTable-8_r3Tg09.js.map} +1 -1
- package/dashboard/dist/assets/{EventTopicPill-RaASGdZz.js → EventTopicPill-CCWCs07y.js} +2 -2
- package/dashboard/dist/assets/{EventTopicPill-RaASGdZz.js.map → EventTopicPill-CCWCs07y.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-Bjxnjv6p.js +2 -0
- package/dashboard/dist/assets/HomePage-Bjxnjv6p.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-B60JrvJ9.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-o8xSCSVv.js.map → ListToolbar-B60JrvJ9.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-whVRP_Nj.js +2 -0
- package/dashboard/dist/assets/McpOverview-whVRP_Nj.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryDetailPage-UR0bySPJ.js → McpQueryDetailPage-DPuujJkH.js} +2 -2
- package/dashboard/dist/assets/McpQueryDetailPage-DPuujJkH.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-C-mzOcGH.js → McpQueryPage-DciK6r7r.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-C-mzOcGH.js.map → McpQueryPage-DciK6r7r.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-QEz8BCTu.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-QEz8BCTu.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-BA6AVpi_.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-BA6AVpi_.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-DrUMzwnl.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-DrUMzwnl.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-B4w-LDUF.js → PageHeader-CR6TpJG_.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-B4w-LDUF.js.map → PageHeader-CR6TpJG_.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DQmNXYcG.js → PageHeaderWithStats-CRcQEAO1.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DQmNXYcG.js.map → PageHeaderWithStats-CRcQEAO1.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-8cJEBC_E.js → ProcessDetailPage-Dc5ASJpQ.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-8cJEBC_E.js.map → ProcessDetailPage-Dc5ASJpQ.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CiprI5Wj.js → ProcessesListPage-Sa-bjC-g.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CiprI5Wj.js.map → ProcessesListPage-Sa-bjC-g.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-Dk-YUxCm.js → RolePill-BC54Vn-U.js} +2 -2
- package/dashboard/dist/assets/{RolePill-Dk-YUxCm.js.map → RolePill-BC54Vn-U.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-xo6AgPym.js → RolesPage-DmO8Jlbw.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-xo6AgPym.js.map → RolesPage-DmO8Jlbw.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DPXWgduq.js → RunAsSelector-yWEwIZRe.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DPXWgduq.js.map → RunAsSelector-yWEwIZRe.js.map} +1 -1
- package/dashboard/dist/assets/{ServerName-A6Wlv3vZ.js → ServerName-Q6okiv4f.js} +2 -2
- package/dashboard/dist/assets/{ServerName-A6Wlv3vZ.js.map → ServerName-Q6okiv4f.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BzG8QxYs.js → SwimlaneTimeline-CmzfFQ09.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BzG8QxYs.js.map → SwimlaneTimeline-CmzfFQ09.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CYh3PFNq.js → TagInput-D6l1SPWd.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CYh3PFNq.js.map → TagInput-D6l1SPWd.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-Ck_0-iO2.js → TaskDetailPage-CI4JTC62.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-Ck_0-iO2.js.map → TaskDetailPage-CI4JTC62.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BSFLiBcf.js → TaskQueuePill-iDBVCEQQ.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BSFLiBcf.js.map → TaskQueuePill-iDBVCEQQ.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DtR4F0ho.js → TasksListPage-xdNmQsNE.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DtR4F0ho.js.map → TasksListPage-xdNmQsNE.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BLNstYO1.js → TimeAgo-B_um9BWR.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BLNstYO1.js.map → TimeAgo-B_um9BWR.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DxIz3l1J.js → TimestampCell-BJ6trAqW.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DxIz3l1J.js.map → TimestampCell-BJ6trAqW.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-CcKNnnrK.js → ToolPill-HcRTggHo.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-CcKNnnrK.js.map → ToolPill-HcRTggHo.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-AVDlqGQI.js → ToolTestPanel-DMQhLDES.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-AVDlqGQI.js.map → ToolTestPanel-DMQhLDES.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-YeGQA0vD.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-YeGQA0vD.js.map +1 -0
- package/dashboard/dist/assets/{TopicsPage-BdnJ7E_S.js → TopicsPage-B3QZNlWz.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-BdnJ7E_S.js.map → TopicsPage-B3QZNlWz.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-Bk-pzKYb.js → UserName-MpSZ2_EH.js} +2 -2
- package/dashboard/dist/assets/{UserName-Bk-pzKYb.js.map → UserName-MpSZ2_EH.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DqMqDb1h.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-DqMqDb1h.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-54px0YiY.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-54px0YiY.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-nXLTR0OO.js → WorkflowsDashboard-BF7FpMmk.js} +2 -2
- package/dashboard/dist/assets/WorkflowsDashboard-BF7FpMmk.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-BdSHBzzd.js → WorkflowsOverview-YFc_KBMS.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BdSHBzzd.js.map → WorkflowsOverview-YFc_KBMS.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BOLs5KTB.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-BsO4L_SW.js.map → YamlWorkflowsPage-BOLs5KTB.js.map} +1 -1
- package/dashboard/dist/assets/{agents-CtF0uBav.js → agents-CPYVSCQ3.js} +2 -2
- package/dashboard/dist/assets/{agents-CtF0uBav.js.map → agents-CPYVSCQ3.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DOP_eck8.js → bots-DCXjHjID.js} +2 -2
- package/dashboard/dist/assets/{bots-DOP_eck8.js.map → bots-DCXjHjID.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DvxG02aF.js → capabilities-CreogBYU.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DvxG02aF.js.map → capabilities-CreogBYU.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Dmq81vAY.js → controlplane-Cm_-Gb1x.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Dmq81vAY.js.map → controlplane-Cm_-Gb1x.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CLqe28Ba.js +2 -0
- package/dashboard/dist/assets/escalation-columns-CLqe28Ba.js.map +1 -0
- package/dashboard/dist/assets/{escalation-BP3UWfIe.js → escalation-ulsBFHVb.js} +2 -2
- package/dashboard/dist/assets/{escalation-BP3UWfIe.js.map → escalation-ulsBFHVb.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-B_PYr0pL.js → helpers-etjHeZEI.js} +2 -2
- package/dashboard/dist/assets/{helpers-B_PYr0pL.js.map → helpers-etjHeZEI.js.map} +1 -1
- package/dashboard/dist/assets/index-7Fbktqcl.js +2 -0
- package/dashboard/dist/assets/index-7Fbktqcl.js.map +1 -0
- package/dashboard/dist/assets/{index-DQs-LMoa.js → index-BkCkBW_D.js} +2 -2
- package/dashboard/dist/assets/{index-DQs-LMoa.js.map → index-BkCkBW_D.js.map} +1 -1
- package/dashboard/dist/assets/index-BkOv2dQA.js +2 -0
- package/dashboard/dist/assets/{index-Bb1ycul8.js.map → index-BkOv2dQA.js.map} +1 -1
- package/dashboard/dist/assets/index-C37LMzJa.css +1 -0
- package/dashboard/dist/assets/{index-CkcPZdQm.js → index-CKDOaej4.js} +6 -6
- package/dashboard/dist/assets/index-CKDOaej4.js.map +1 -0
- package/dashboard/dist/assets/{index-Do1x4kN0.js → index-CcvHiZW-.js} +2 -2
- package/dashboard/dist/assets/{index-Do1x4kN0.js.map → index-CcvHiZW-.js.map} +1 -1
- package/dashboard/dist/assets/{index-B80zLZVl.js → index-CihScSLF.js} +2 -2
- package/dashboard/dist/assets/{index-B80zLZVl.js.map → index-CihScSLF.js.map} +1 -1
- package/dashboard/dist/assets/{index-B3wGNZN2.js → index-Cnpo94XG.js} +2 -2
- package/dashboard/dist/assets/{index-B3wGNZN2.js.map → index-Cnpo94XG.js.map} +1 -1
- package/dashboard/dist/assets/index-DFuHrLll.js +15 -0
- package/dashboard/dist/assets/index-DFuHrLll.js.map +1 -0
- package/dashboard/dist/assets/{index-DzQBDt3K.js → index-DGpIF_Td.js} +2 -2
- package/dashboard/dist/assets/{index-DzQBDt3K.js.map → index-DGpIF_Td.js.map} +1 -1
- package/dashboard/dist/assets/index-DT0JeuiL.js +2 -0
- package/dashboard/dist/assets/index-DT0JeuiL.js.map +1 -0
- package/dashboard/dist/assets/index-DT68ewTC.js +2 -0
- package/dashboard/dist/assets/{index-EqKHsaVz.js.map → index-DT68ewTC.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bv0eLXZq.js → index-DVqtJBno.js} +4 -4
- package/dashboard/dist/assets/{index-Bv0eLXZq.js.map → index-DVqtJBno.js.map} +1 -1
- package/dashboard/dist/assets/{index-BnB7G5bA.js → index-DYmrNJ_H.js} +23 -23
- package/dashboard/dist/assets/index-DYmrNJ_H.js.map +1 -0
- package/dashboard/dist/assets/{knowledge--SApApck.js → knowledge-CXA2DJwY.js} +2 -2
- package/dashboard/dist/assets/{knowledge--SApApck.js.map → knowledge-CXA2DJwY.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-dn9iPrzm.js → mcp-DeC-PpeL.js} +2 -2
- package/dashboard/dist/assets/{mcp-dn9iPrzm.js.map → mcp-DeC-PpeL.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CgiU2UR6.js → mcp-query-DldD_RPZ.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CgiU2UR6.js.map → mcp-query-DldD_RPZ.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-D93H3wFO.js → namespaces-BIGZ6exX.js} +2 -2
- package/dashboard/dist/assets/{namespaces-D93H3wFO.js.map → namespaces-BIGZ6exX.js.map} +1 -1
- package/dashboard/dist/assets/pipelines-BtihifKT.js +2 -0
- package/dashboard/dist/assets/pipelines-BtihifKT.js.map +1 -0
- package/dashboard/dist/assets/{roles-DuOWZTpx.js → roles-4DocbpKy.js} +2 -2
- package/dashboard/dist/assets/{roles-DuOWZTpx.js.map → roles-4DocbpKy.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DoCbLKz4.js → tasks-B9P_7SR_.js} +2 -2
- package/dashboard/dist/assets/{tasks-DoCbLKz4.js.map → tasks-B9P_7SR_.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CS7Sxf_-.js → topics-CcLT-IrY.js} +2 -2
- package/dashboard/dist/assets/{topics-CS7Sxf_-.js.map → topics-CcLT-IrY.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-CrIe_Ulh.js → useEventHooks-B9UOxef_.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-CrIe_Ulh.js.map → useEventHooks-B9UOxef_.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-JzvzGsUR.js → useYamlActivityEvents-V_MENSI5.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-JzvzGsUR.js.map → useYamlActivityEvents-V_MENSI5.js.map} +1 -1
- package/dashboard/dist/assets/{users-DnxSh2dX.js → users-BHF3YOU1.js} +2 -2
- package/dashboard/dist/assets/{users-DnxSh2dX.js.map → users-BHF3YOU1.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-5gSix3t2.js → vendor-icons-CrrAvF2g.js} +131 -111
- package/dashboard/dist/assets/vendor-icons-CrrAvF2g.js.map +1 -0
- package/dashboard/dist/assets/{workflows-zFmmxc08.js → workflows-DorgmYSk.js} +2 -2
- package/dashboard/dist/assets/{workflows-zFmmxc08.js.map → workflows-DorgmYSk.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-VSax0tKa.js → yaml-workflows-DTGpqnEG.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-VSax0tKa.js.map → yaml-workflows-DTGpqnEG.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +96 -0
- package/docs/api/http/{mcp-runs.md → pipelines.md} +39 -25
- package/docs/api/sdk/escalations.md +84 -0
- package/docs/cli.md +8 -0
- package/docs/dashboard.md +1 -1
- package/docs/sdk.md +2 -2
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentConfigPage-CjuCbr5J.js +0 -16
- package/dashboard/dist/assets/AgentConfigPage-CjuCbr5J.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-CEkeo_N4.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CEkeo_N4.js.map +0 -1
- package/dashboard/dist/assets/BotPicker-CAowL3ib.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-CSUKBvEN.js +0 -2
- package/dashboard/dist/assets/HomePage-BkMEYnRK.js +0 -2
- package/dashboard/dist/assets/HomePage-BkMEYnRK.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-o8xSCSVv.js +0 -2
- package/dashboard/dist/assets/McpOverview-C4man2br.js +0 -2
- package/dashboard/dist/assets/McpOverview-C4man2br.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-UR0bySPJ.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-bJl08JSG.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-bJl08JSG.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-i2FGJ6yf.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-i2FGJ6yf.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-DLpqyLle.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-DLpqyLle.js.map +0 -1
- package/dashboard/dist/assets/TopicDetailPage-DQkoAlsj.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-DQkoAlsj.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-B6mBqWq6.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-B6mBqWq6.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-BkfIn8N3.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-BkfIn8N3.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-nXLTR0OO.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BsO4L_SW.js +0 -2
- package/dashboard/dist/assets/escalation-columns-BayccZzU.js +0 -2
- package/dashboard/dist/assets/escalation-columns-BayccZzU.js.map +0 -1
- package/dashboard/dist/assets/index-Bb1ycul8.js +0 -2
- package/dashboard/dist/assets/index-BnB7G5bA.js.map +0 -1
- package/dashboard/dist/assets/index-BnVnJcXw.js +0 -2
- package/dashboard/dist/assets/index-BnVnJcXw.js.map +0 -1
- package/dashboard/dist/assets/index-CkcPZdQm.js.map +0 -1
- package/dashboard/dist/assets/index-CsagXf3M.js +0 -2
- package/dashboard/dist/assets/index-CsagXf3M.js.map +0 -1
- package/dashboard/dist/assets/index-DZI2L4ag.css +0 -1
- package/dashboard/dist/assets/index-EqKHsaVz.js +0 -2
- package/dashboard/dist/assets/index-ox042ec_.js +0 -15
- package/dashboard/dist/assets/index-ox042ec_.js.map +0 -1
- package/dashboard/dist/assets/mcp-runs-BN5MrKai.js +0 -2
- package/dashboard/dist/assets/mcp-runs-BN5MrKai.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-5gSix3t2.js.map +0 -1
- /package/build/routes/{mcp-runs.d.ts → pipelines.d.ts} +0 -0
- /package/build/services/{mcp-runs → pipelines}/enrichment.d.ts +0 -0
- /package/build/services/{mcp-runs → pipelines}/enrichment.js +0 -0
- /package/build/services/{mcp-runs → pipelines}/events.d.ts +0 -0
- /package/build/services/{mcp-runs → pipelines}/events.js +0 -0
- /package/build/services/{mcp-runs → pipelines}/execution-builder.d.ts +0 -0
- /package/build/services/{mcp-runs → pipelines}/execution-builder.js +0 -0
- /package/build/services/{mcp-runs → pipelines}/index.d.ts +0 -0
- /package/build/services/{mcp-runs → pipelines}/index.js +0 -0
- /package/build/services/{mcp-runs → pipelines}/queries.d.ts +0 -0
- /package/build/services/{mcp-runs → pipelines}/queries.js +0 -0
- /package/build/services/{mcp-runs → pipelines}/sql.d.ts +0 -0
- /package/build/services/{mcp-runs → pipelines}/types.d.ts +0 -0
- /package/build/services/{mcp-runs → pipelines}/types.js +0 -0
- /package/docs/api/sdk/{mcp-runs.md → pipelines.md} +0 -0
package/build/api/index.js
CHANGED
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.maintenance = exports.namespaces = exports.dba = exports.workflowSets = exports.botAccounts = exports.controlplane = exports.exports = exports.settings = exports.insight = exports.mcpRuns = exports.mcp = exports.auth = exports.roles = exports.users = exports.yamlWorkflows = exports.workflows = exports.escalations = exports.tasks = void 0;
|
|
36
|
+
exports.maintenance = exports.namespaces = exports.dba = exports.workflowSets = exports.botAccounts = exports.controlplane = exports.exports = exports.settings = exports.insight = exports.mcpRuns = exports.pipelines = exports.mcp = exports.auth = exports.roles = exports.users = exports.yamlWorkflows = exports.workflows = exports.escalations = exports.tasks = void 0;
|
|
37
37
|
exports.tasks = __importStar(require("./tasks"));
|
|
38
38
|
exports.escalations = __importStar(require("./escalations"));
|
|
39
39
|
exports.workflows = __importStar(require("./workflows"));
|
|
@@ -42,7 +42,8 @@ exports.users = __importStar(require("./users"));
|
|
|
42
42
|
exports.roles = __importStar(require("./roles"));
|
|
43
43
|
exports.auth = __importStar(require("./auth"));
|
|
44
44
|
exports.mcp = __importStar(require("./mcp"));
|
|
45
|
-
exports.
|
|
45
|
+
exports.pipelines = __importStar(require("./pipelines"));
|
|
46
|
+
exports.mcpRuns = __importStar(require("./pipelines")); // backward-compat alias
|
|
46
47
|
exports.insight = __importStar(require("./insight"));
|
|
47
48
|
exports.settings = __importStar(require("./settings"));
|
|
48
49
|
exports.exports = __importStar(require("./exports"));
|
|
@@ -43,3 +43,21 @@ export declare function getJobExecution(input: {
|
|
|
43
43
|
jobId: string;
|
|
44
44
|
app_id: string;
|
|
45
45
|
}): Promise<LTApiResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Interrupt a running pipeline job via HotMesh.interrupt().
|
|
48
|
+
*
|
|
49
|
+
* This is the pipeline equivalent of the durable terminate endpoint.
|
|
50
|
+
* Pipelines run as raw HotMesh YAML DAGs, not through the Durable
|
|
51
|
+
* abstraction, so they require the app_id (namespace) and topic
|
|
52
|
+
* to locate the correct engine instance.
|
|
53
|
+
*
|
|
54
|
+
* @param input.jobId — HotMesh job ID (workflow_id)
|
|
55
|
+
* @param input.topic — workflow entity/topic name
|
|
56
|
+
* @param input.app_id — HotMesh namespace (e.g. "hmsh", "longtail")
|
|
57
|
+
* @returns `{ status: 200, data: { interrupted: true } }` or error
|
|
58
|
+
*/
|
|
59
|
+
export declare function interruptJob(input: {
|
|
60
|
+
jobId: string;
|
|
61
|
+
topic: string;
|
|
62
|
+
app_id: string;
|
|
63
|
+
}): Promise<LTApiResult>;
|
|
@@ -3,8 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.listEntities = listEntities;
|
|
4
4
|
exports.listJobs = listJobs;
|
|
5
5
|
exports.getJobExecution = getJobExecution;
|
|
6
|
+
exports.interruptJob = interruptJob;
|
|
6
7
|
const hotmesh_utils_1 = require("../services/hotmesh-utils");
|
|
7
|
-
const
|
|
8
|
+
const pipelines_1 = require("../services/pipelines");
|
|
9
|
+
const controlplane_1 = require("../services/controlplane");
|
|
8
10
|
/**
|
|
9
11
|
* List distinct entity types for an app (HotMesh namespace).
|
|
10
12
|
*
|
|
@@ -16,7 +18,7 @@ async function listEntities(input) {
|
|
|
16
18
|
if (!input.app_id) {
|
|
17
19
|
return { status: 400, error: 'app_id query parameter is required' };
|
|
18
20
|
}
|
|
19
|
-
const entities = await (0,
|
|
21
|
+
const entities = await (0, pipelines_1.listEntities)(input.app_id);
|
|
20
22
|
return { status: 200, data: { entities } };
|
|
21
23
|
}
|
|
22
24
|
catch (err) {
|
|
@@ -42,7 +44,7 @@ async function listJobs(input) {
|
|
|
42
44
|
if (!input.app_id) {
|
|
43
45
|
return { status: 400, error: 'app_id query parameter is required' };
|
|
44
46
|
}
|
|
45
|
-
const result = await (0,
|
|
47
|
+
const result = await (0, pipelines_1.listJobs)({
|
|
46
48
|
rawAppId: input.app_id,
|
|
47
49
|
limit: input.limit,
|
|
48
50
|
offset: input.offset,
|
|
@@ -78,7 +80,7 @@ async function getJobExecution(input) {
|
|
|
78
80
|
}
|
|
79
81
|
const appId = (0, hotmesh_utils_1.sanitizeAppId)(input.app_id);
|
|
80
82
|
const schema = (0, hotmesh_utils_1.quoteSchema)(appId);
|
|
81
|
-
const execution = await (0,
|
|
83
|
+
const execution = await (0, pipelines_1.buildExecution)(input.jobId, appId, schema);
|
|
82
84
|
return { status: 200, data: execution };
|
|
83
85
|
}
|
|
84
86
|
catch (err) {
|
|
@@ -89,3 +91,33 @@ async function getJobExecution(input) {
|
|
|
89
91
|
return { status: 500, error: msg };
|
|
90
92
|
}
|
|
91
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Interrupt a running pipeline job via HotMesh.interrupt().
|
|
96
|
+
*
|
|
97
|
+
* This is the pipeline equivalent of the durable terminate endpoint.
|
|
98
|
+
* Pipelines run as raw HotMesh YAML DAGs, not through the Durable
|
|
99
|
+
* abstraction, so they require the app_id (namespace) and topic
|
|
100
|
+
* to locate the correct engine instance.
|
|
101
|
+
*
|
|
102
|
+
* @param input.jobId — HotMesh job ID (workflow_id)
|
|
103
|
+
* @param input.topic — workflow entity/topic name
|
|
104
|
+
* @param input.app_id — HotMesh namespace (e.g. "hmsh", "longtail")
|
|
105
|
+
* @returns `{ status: 200, data: { interrupted: true } }` or error
|
|
106
|
+
*/
|
|
107
|
+
async function interruptJob(input) {
|
|
108
|
+
try {
|
|
109
|
+
if (!input.app_id) {
|
|
110
|
+
return { status: 400, error: 'app_id is required' };
|
|
111
|
+
}
|
|
112
|
+
if (!input.topic) {
|
|
113
|
+
return { status: 400, error: 'topic is required' };
|
|
114
|
+
}
|
|
115
|
+
const appId = (0, hotmesh_utils_1.sanitizeAppId)(input.app_id);
|
|
116
|
+
const engine = await (0, controlplane_1.getEngine)(appId);
|
|
117
|
+
await engine.interrupt(input.topic, input.jobId);
|
|
118
|
+
return { status: 200, data: { interrupted: true, jobId: input.jobId } };
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
return { status: 500, error: err.message };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -40,7 +40,7 @@ const configService = __importStar(require("../../services/config"));
|
|
|
40
40
|
const cron_1 = require("../../services/cron");
|
|
41
41
|
const db_1 = require("../../lib/db");
|
|
42
42
|
const registry_1 = require("../../services/workers/registry");
|
|
43
|
-
const sql_1 = require("../../services/
|
|
43
|
+
const sql_1 = require("../../services/pipelines/sql");
|
|
44
44
|
/**
|
|
45
45
|
* List active workflow workers with their registration status.
|
|
46
46
|
*
|
package/build/bin/ltc.js
CHANGED
|
@@ -134,6 +134,23 @@ escCmd.command('release <id>')
|
|
|
134
134
|
escCmd.command('resolve <id>')
|
|
135
135
|
.requiredOption('--data <json>', 'Resolver payload (JSON string)')
|
|
136
136
|
.action(wrap(esc.resolveEscalation));
|
|
137
|
+
escCmd.command('find-by-meta <key> <value>')
|
|
138
|
+
.description('Find escalations by metadata key-value pair')
|
|
139
|
+
.option('--status <status>', 'Filter by status')
|
|
140
|
+
.option('--limit <n>', 'Max results')
|
|
141
|
+
.option('--json', 'JSON output')
|
|
142
|
+
.option('-q, --quiet', 'IDs only')
|
|
143
|
+
.action(wrap(esc.findByMetadata));
|
|
144
|
+
escCmd.command('claim-by-meta <key> <value>')
|
|
145
|
+
.description('Claim an escalation by metadata key-value pair')
|
|
146
|
+
.option('--duration <minutes>', 'Claim duration in minutes')
|
|
147
|
+
.option('--assignee <external_id>', 'Claim on behalf of user (external_id)')
|
|
148
|
+
.action(wrap(esc.claimByMetadata));
|
|
149
|
+
escCmd.command('resolve-by-meta <key> <value>')
|
|
150
|
+
.description('Resolve an escalation by metadata key-value pair')
|
|
151
|
+
.option('--data <json>', 'Resolver payload (JSON string)')
|
|
152
|
+
.option('--assignee <external_id>', 'Resolve on behalf of user (external_id)')
|
|
153
|
+
.action(wrap(esc.resolveByMetadata));
|
|
137
154
|
// ── Workflows ────────────────────────────────────────────────────────────
|
|
138
155
|
const wfCmd = commander_1.program.command('workflows').alias('wf').description('Manage durable workflows');
|
|
139
156
|
wfCmd.command('list')
|
|
@@ -16,4 +16,13 @@ export declare function releaseEscalation(id: string): Promise<void>;
|
|
|
16
16
|
export declare function resolveEscalation(id: string, opts: {
|
|
17
17
|
data?: string;
|
|
18
18
|
}): Promise<void>;
|
|
19
|
+
export declare function findByMetadata(key: string, value: string, opts: ListOptions): Promise<void>;
|
|
20
|
+
export declare function claimByMetadata(key: string, value: string, opts: {
|
|
21
|
+
duration?: string;
|
|
22
|
+
assignee?: string;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
export declare function resolveByMetadata(key: string, value: string, opts: {
|
|
25
|
+
data?: string;
|
|
26
|
+
assignee?: string;
|
|
27
|
+
}): Promise<void>;
|
|
19
28
|
export {};
|
|
@@ -8,6 +8,9 @@ exports.getEscalation = getEscalation;
|
|
|
8
8
|
exports.claimEscalation = claimEscalation;
|
|
9
9
|
exports.releaseEscalation = releaseEscalation;
|
|
10
10
|
exports.resolveEscalation = resolveEscalation;
|
|
11
|
+
exports.findByMetadata = findByMetadata;
|
|
12
|
+
exports.claimByMetadata = claimByMetadata;
|
|
13
|
+
exports.resolveByMetadata = resolveByMetadata;
|
|
11
14
|
const picocolors_1 = __importDefault(require("picocolors"));
|
|
12
15
|
const client_1 = require("../client");
|
|
13
16
|
const format_1 = require("../format");
|
|
@@ -67,3 +70,36 @@ async function resolveEscalation(id, opts) {
|
|
|
67
70
|
});
|
|
68
71
|
console.log(`\n ${picocolors_1.default.green('✓')} Resolved ${picocolors_1.default.dim(id)}\n`);
|
|
69
72
|
}
|
|
73
|
+
// --- Metadata candidate key commands ----------------------------------------
|
|
74
|
+
async function findByMetadata(key, value, opts) {
|
|
75
|
+
const params = new URLSearchParams({ key, value });
|
|
76
|
+
if (opts.status)
|
|
77
|
+
params.set('status', opts.status);
|
|
78
|
+
if (opts.limit)
|
|
79
|
+
params.set('limit', opts.limit);
|
|
80
|
+
const data = await (0, client_1.apiFetch)(`/escalations/by-metadata?${params}`);
|
|
81
|
+
(0, format_1.output)(data, data.escalations || [], COLUMNS, opts);
|
|
82
|
+
}
|
|
83
|
+
async function claimByMetadata(key, value, opts) {
|
|
84
|
+
const body = { key, value };
|
|
85
|
+
if (opts.duration)
|
|
86
|
+
body.durationMinutes = parseInt(opts.duration, 10);
|
|
87
|
+
if (opts.assignee)
|
|
88
|
+
body.assignee = opts.assignee;
|
|
89
|
+
const data = await (0, client_1.apiFetch)('/escalations/claim-by-metadata', {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
body: JSON.stringify(body),
|
|
92
|
+
});
|
|
93
|
+
console.log(`\n ${picocolors_1.default.green('✓')} Claimed ${picocolors_1.default.dim(data.escalation?.id || '')} by ${key}=${value}\n`);
|
|
94
|
+
}
|
|
95
|
+
async function resolveByMetadata(key, value, opts) {
|
|
96
|
+
const resolverPayload = opts.data ? JSON.parse(opts.data) : {};
|
|
97
|
+
const body = { key, value, resolverPayload };
|
|
98
|
+
if (opts.assignee)
|
|
99
|
+
body.assignee = opts.assignee;
|
|
100
|
+
await (0, client_1.apiFetch)('/escalations/resolve-by-metadata', {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
body: JSON.stringify(body),
|
|
103
|
+
});
|
|
104
|
+
console.log(`\n ${picocolors_1.default.green('✓')} Resolved by ${key}=${value}\n`);
|
|
105
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- GIN index for JSONB containment queries on lt_escalations.metadata.
|
|
2
|
+
-- Enables efficient lookups like: WHERE metadata @> '{"orderId":"order-123"}'::jsonb
|
|
3
|
+
-- Uses jsonb_path_ops (smaller, faster for @> queries).
|
|
4
|
+
CREATE INDEX IF NOT EXISTS idx_lt_escalations_metadata
|
|
5
|
+
ON lt_escalations USING GIN (metadata jsonb_path_ops);
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const express_1 = require("express");
|
|
4
4
|
const list_1 = require("./list");
|
|
5
5
|
const bulk_1 = require("./bulk");
|
|
6
|
+
const metadata_1 = require("./metadata");
|
|
6
7
|
const single_1 = require("./single");
|
|
7
8
|
const resolve_1 = require("./resolve");
|
|
8
9
|
const router = (0, express_1.Router)();
|
|
@@ -12,6 +13,8 @@ const router = (0, express_1.Router)();
|
|
|
12
13
|
// POST /release-expired, PATCH /priority, POST /bulk-claim,
|
|
13
14
|
// POST /bulk-assign, PATCH /bulk-escalate, POST /bulk-triage
|
|
14
15
|
(0, bulk_1.registerBulkRoutes)(router);
|
|
16
|
+
// GET /by-metadata, POST /claim-by-metadata, POST /resolve-by-metadata
|
|
17
|
+
(0, metadata_1.registerMetadataRoutes)(router);
|
|
15
18
|
// PATCH /:id/escalate, GET /by-workflow/:workflowId,
|
|
16
19
|
// GET /:id, POST /:id/claim, POST /:id/release
|
|
17
20
|
(0, single_1.registerSingleRoutes)(router);
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.registerMetadataRoutes = registerMetadataRoutes;
|
|
37
|
+
const api = __importStar(require("../../api/escalations"));
|
|
38
|
+
/**
|
|
39
|
+
* Register metadata-based escalation lookup routes.
|
|
40
|
+
* Must be registered BEFORE parameterized /:id routes.
|
|
41
|
+
*/
|
|
42
|
+
function registerMetadataRoutes(router) {
|
|
43
|
+
/**
|
|
44
|
+
* GET /api/escalations/by-metadata
|
|
45
|
+
* Find escalations by a metadata key-value pair.
|
|
46
|
+
* Query: key, value, status?, limit?, offset?
|
|
47
|
+
*/
|
|
48
|
+
router.get('/by-metadata', async (req, res) => {
|
|
49
|
+
const result = await api.findByMetadata({
|
|
50
|
+
key: req.query.key,
|
|
51
|
+
value: req.query.value,
|
|
52
|
+
status: req.query.status,
|
|
53
|
+
limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
|
|
54
|
+
offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
|
|
55
|
+
}, req.auth);
|
|
56
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
57
|
+
});
|
|
58
|
+
/**
|
|
59
|
+
* POST /api/escalations/claim-by-metadata
|
|
60
|
+
* Find and claim an escalation by metadata key-value pair.
|
|
61
|
+
* Body: { key, value, durationMinutes?, assignee? }
|
|
62
|
+
*/
|
|
63
|
+
router.post('/claim-by-metadata', async (req, res) => {
|
|
64
|
+
const result = await api.claimByMetadata({
|
|
65
|
+
key: req.body?.key,
|
|
66
|
+
value: req.body?.value,
|
|
67
|
+
durationMinutes: req.body?.durationMinutes,
|
|
68
|
+
assignee: req.body?.assignee,
|
|
69
|
+
}, req.auth);
|
|
70
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* POST /api/escalations/resolve-by-metadata
|
|
74
|
+
* Find and resolve an escalation by metadata key-value pair.
|
|
75
|
+
* Body: { key, value, resolverPayload, assignee? }
|
|
76
|
+
*/
|
|
77
|
+
router.post('/resolve-by-metadata', async (req, res) => {
|
|
78
|
+
const result = await api.resolveByMetadata({
|
|
79
|
+
key: req.body?.key,
|
|
80
|
+
value: req.body?.value,
|
|
81
|
+
resolverPayload: req.body?.resolverPayload,
|
|
82
|
+
assignee: req.body?.assignee,
|
|
83
|
+
}, req.auth);
|
|
84
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
85
|
+
});
|
|
86
|
+
}
|
package/build/routes/index.js
CHANGED
|
@@ -20,7 +20,7 @@ const mcp_1 = __importDefault(require("./mcp"));
|
|
|
20
20
|
const insight_1 = __importDefault(require("./insight"));
|
|
21
21
|
const yaml_workflows_1 = __importDefault(require("./yaml-workflows"));
|
|
22
22
|
const settings_1 = __importDefault(require("./settings"));
|
|
23
|
-
const
|
|
23
|
+
const pipelines_1 = __importDefault(require("./pipelines"));
|
|
24
24
|
const namespaces_1 = __importDefault(require("./namespaces"));
|
|
25
25
|
const files_1 = __importDefault(require("./files"));
|
|
26
26
|
const file_browser_1 = __importDefault(require("./file-browser"));
|
|
@@ -54,7 +54,8 @@ router.use('/dba', dba_1.default);
|
|
|
54
54
|
router.use('/mcp', mcp_1.default);
|
|
55
55
|
router.use('/insight', insight_1.default);
|
|
56
56
|
router.use('/yaml-workflows', yaml_workflows_1.default);
|
|
57
|
-
router.use('/
|
|
57
|
+
router.use('/pipelines', pipelines_1.default);
|
|
58
|
+
router.use('/mcp-runs', pipelines_1.default); // backward-compat alias
|
|
58
59
|
router.use('/namespaces', namespaces_1.default);
|
|
59
60
|
router.use('/file-browser', file_browser_1.default);
|
|
60
61
|
router.use('/controlplane', controlplane_1.default);
|
|
@@ -34,11 +34,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
const express_1 = require("express");
|
|
37
|
-
const api = __importStar(require("../api/
|
|
37
|
+
const api = __importStar(require("../api/pipelines"));
|
|
38
38
|
const router = (0, express_1.Router)();
|
|
39
39
|
// ── Routes ───────────────────────────────────────────────────────────────────
|
|
40
40
|
/**
|
|
41
|
-
* GET /api/
|
|
41
|
+
* GET /api/pipelines/entities
|
|
42
42
|
* Return distinct entity (tool) names from {appId}.jobs,
|
|
43
43
|
* supplemented with graph_topics from yaml_workflows for this app_id.
|
|
44
44
|
*/
|
|
@@ -49,7 +49,7 @@ router.get('/entities', async (req, res) => {
|
|
|
49
49
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
50
50
|
});
|
|
51
51
|
/**
|
|
52
|
-
* GET /api/
|
|
52
|
+
* GET /api/pipelines
|
|
53
53
|
* List jobs from {appId}.jobs for a given app_id.
|
|
54
54
|
*/
|
|
55
55
|
router.get('/', async (req, res) => {
|
|
@@ -66,7 +66,7 @@ router.get('/', async (req, res) => {
|
|
|
66
66
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
67
67
|
});
|
|
68
68
|
/**
|
|
69
|
-
* GET /api/
|
|
69
|
+
* GET /api/pipelines/:jobId/execution
|
|
70
70
|
* Export execution details for a specific HotMesh pipeline job.
|
|
71
71
|
*/
|
|
72
72
|
router.get('/:jobId/execution', async (req, res) => {
|
|
@@ -76,4 +76,17 @@ router.get('/:jobId/execution', async (req, res) => {
|
|
|
76
76
|
});
|
|
77
77
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
78
78
|
});
|
|
79
|
+
/**
|
|
80
|
+
* POST /api/pipelines/:jobId/interrupt
|
|
81
|
+
* Interrupt a running pipeline job via HotMesh.interrupt().
|
|
82
|
+
* Body: { topic, app_id }
|
|
83
|
+
*/
|
|
84
|
+
router.post('/:jobId/interrupt', async (req, res) => {
|
|
85
|
+
const result = await api.interruptJob({
|
|
86
|
+
jobId: req.params.jobId,
|
|
87
|
+
topic: req.body.topic,
|
|
88
|
+
app_id: req.body.app_id,
|
|
89
|
+
});
|
|
90
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
91
|
+
});
|
|
79
92
|
exports.default = router;
|
package/build/sdk/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as usersApi from '../api/users';
|
|
|
6
6
|
import * as rolesApi from '../api/roles';
|
|
7
7
|
import * as authApi from '../api/auth';
|
|
8
8
|
import * as mcpApi from '../api/mcp';
|
|
9
|
-
import * as
|
|
9
|
+
import * as pipelinesApi from '../api/pipelines';
|
|
10
10
|
import * as insightApi from '../api/insight';
|
|
11
11
|
import * as settingsApi from '../api/settings';
|
|
12
12
|
import * as exportsApi from '../api/exports';
|
|
@@ -150,6 +150,25 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
150
150
|
ids: string[];
|
|
151
151
|
hint?: string;
|
|
152
152
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
153
|
+
findByMetadata: (input: {
|
|
154
|
+
key: string;
|
|
155
|
+
value: string;
|
|
156
|
+
status?: string;
|
|
157
|
+
limit?: number;
|
|
158
|
+
offset?: number;
|
|
159
|
+
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
160
|
+
claimByMetadata: (input: {
|
|
161
|
+
key: string;
|
|
162
|
+
value: string;
|
|
163
|
+
durationMinutes?: number;
|
|
164
|
+
assignee?: string;
|
|
165
|
+
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
166
|
+
resolveByMetadata: (input: {
|
|
167
|
+
key: string;
|
|
168
|
+
value: string;
|
|
169
|
+
resolverPayload: Record<string, any>;
|
|
170
|
+
assignee?: string;
|
|
171
|
+
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
153
172
|
};
|
|
154
173
|
workflows: {
|
|
155
174
|
invoke: (input: {
|
|
@@ -241,10 +260,17 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
241
260
|
execute_as?: string;
|
|
242
261
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
243
262
|
};
|
|
263
|
+
pipelines: {
|
|
264
|
+
listEntities: typeof pipelinesApi.listEntities;
|
|
265
|
+
listJobs: typeof pipelinesApi.listJobs;
|
|
266
|
+
getExecution: typeof pipelinesApi.getJobExecution;
|
|
267
|
+
interrupt: typeof pipelinesApi.interruptJob;
|
|
268
|
+
};
|
|
269
|
+
/** @deprecated Use `pipelines` */
|
|
244
270
|
mcpRuns: {
|
|
245
|
-
listEntities: typeof
|
|
246
|
-
listJobs: typeof
|
|
247
|
-
getExecution: typeof
|
|
271
|
+
listEntities: typeof pipelinesApi.listEntities;
|
|
272
|
+
listJobs: typeof pipelinesApi.listJobs;
|
|
273
|
+
getExecution: typeof pipelinesApi.getJobExecution;
|
|
248
274
|
};
|
|
249
275
|
insight: {
|
|
250
276
|
mcpQuery: (input: {
|
package/build/sdk/index.js
CHANGED
|
@@ -42,7 +42,7 @@ const usersApi = __importStar(require("../api/users"));
|
|
|
42
42
|
const rolesApi = __importStar(require("../api/roles"));
|
|
43
43
|
const authApi = __importStar(require("../api/auth"));
|
|
44
44
|
const mcpApi = __importStar(require("../api/mcp"));
|
|
45
|
-
const
|
|
45
|
+
const pipelinesApi = __importStar(require("../api/pipelines"));
|
|
46
46
|
const insightApi = __importStar(require("../api/insight"));
|
|
47
47
|
const settingsApi = __importStar(require("../api/settings"));
|
|
48
48
|
const exportsApi = __importStar(require("../api/exports"));
|
|
@@ -130,6 +130,9 @@ function createClient(options = {}) {
|
|
|
130
130
|
bulkAssign: bindAuth(escalationsApi.bulkAssign, auth),
|
|
131
131
|
bulkEscalate: bindAuth(escalationsApi.bulkEscalate, auth),
|
|
132
132
|
bulkTriage: bindAuth(escalationsApi.bulkTriage, auth),
|
|
133
|
+
findByMetadata: bindAuth(escalationsApi.findByMetadata, auth),
|
|
134
|
+
claimByMetadata: bindAuth(escalationsApi.claimByMetadata, auth),
|
|
135
|
+
resolveByMetadata: bindAuth(escalationsApi.resolveByMetadata, auth),
|
|
133
136
|
},
|
|
134
137
|
// ── Workflows ──────────────────────────────────────────────────────────
|
|
135
138
|
workflows: {
|
|
@@ -208,11 +211,18 @@ function createClient(options = {}) {
|
|
|
208
211
|
listTools: mcpApi.listMcpServerTools,
|
|
209
212
|
callTool: bindOptionalAuth(mcpApi.callMcpTool, auth),
|
|
210
213
|
},
|
|
211
|
-
// ──
|
|
214
|
+
// ── Pipelines ──────────────────────────────────────────────────────────
|
|
215
|
+
pipelines: {
|
|
216
|
+
listEntities: pipelinesApi.listEntities,
|
|
217
|
+
listJobs: pipelinesApi.listJobs,
|
|
218
|
+
getExecution: pipelinesApi.getJobExecution,
|
|
219
|
+
interrupt: pipelinesApi.interruptJob,
|
|
220
|
+
},
|
|
221
|
+
/** @deprecated Use `pipelines` */
|
|
212
222
|
mcpRuns: {
|
|
213
|
-
listEntities:
|
|
214
|
-
listJobs:
|
|
215
|
-
getExecution:
|
|
223
|
+
listEntities: pipelinesApi.listEntities,
|
|
224
|
+
listJobs: pipelinesApi.listJobs,
|
|
225
|
+
getExecution: pipelinesApi.getJobExecution,
|
|
216
226
|
},
|
|
217
227
|
// ── Insight ────────────────────────────────────────────────────────────
|
|
218
228
|
insight: {
|
|
@@ -45,3 +45,8 @@ export declare function enrichEscalationRouting(id: string, metadataPatch: Recor
|
|
|
45
45
|
taskId?: string;
|
|
46
46
|
}): Promise<LTEscalationRecord | null>;
|
|
47
47
|
export declare function getEscalationsByOriginId(originId: string): Promise<LTEscalationRecord[]>;
|
|
48
|
+
export declare function findByMetadata(key: string, value: string, status?: string, limit?: number, offset?: number): Promise<{
|
|
49
|
+
escalations: LTEscalationRecord[];
|
|
50
|
+
total: number;
|
|
51
|
+
}>;
|
|
52
|
+
export declare function claimByMetadata(key: string, value: string, userId: string, durationMinutes?: number): Promise<ClaimResult | null>;
|
|
@@ -14,6 +14,8 @@ exports.getEscalationsByWorkflowId = getEscalationsByWorkflowId;
|
|
|
14
14
|
exports.updateEscalationMetadata = updateEscalationMetadata;
|
|
15
15
|
exports.enrichEscalationRouting = enrichEscalationRouting;
|
|
16
16
|
exports.getEscalationsByOriginId = getEscalationsByOriginId;
|
|
17
|
+
exports.findByMetadata = findByMetadata;
|
|
18
|
+
exports.claimByMetadata = claimByMetadata;
|
|
17
19
|
const db_1 = require("../../lib/db");
|
|
18
20
|
const sql_1 = require("./sql");
|
|
19
21
|
async function createEscalation(input) {
|
|
@@ -148,3 +150,28 @@ async function getEscalationsByOriginId(originId) {
|
|
|
148
150
|
const { rows } = await pool.query(sql_1.GET_ESCALATIONS_BY_ORIGIN_ID, [originId]);
|
|
149
151
|
return rows;
|
|
150
152
|
}
|
|
153
|
+
// --- Metadata candidate key lookups -----------------------------------------
|
|
154
|
+
async function findByMetadata(key, value, status, limit = 50, offset = 0) {
|
|
155
|
+
const pool = (0, db_1.getPool)();
|
|
156
|
+
const filter = JSON.stringify({ [key]: value });
|
|
157
|
+
const [countResult, dataResult] = await Promise.all([
|
|
158
|
+
pool.query(sql_1.COUNT_BY_METADATA, [filter, status || null]),
|
|
159
|
+
pool.query(sql_1.FIND_BY_METADATA, [filter, status || null, limit, offset]),
|
|
160
|
+
]);
|
|
161
|
+
return {
|
|
162
|
+
escalations: dataResult.rows,
|
|
163
|
+
total: parseInt(countResult.rows[0].count, 10),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
async function claimByMetadata(key, value, userId, durationMinutes = 30) {
|
|
167
|
+
const pool = (0, db_1.getPool)();
|
|
168
|
+
const filter = JSON.stringify({ [key]: value });
|
|
169
|
+
const { rows } = await pool.query(sql_1.CLAIM_BY_METADATA, [filter, userId, durationMinutes]);
|
|
170
|
+
if (rows.length === 0)
|
|
171
|
+
return null;
|
|
172
|
+
const row = rows[0];
|
|
173
|
+
return {
|
|
174
|
+
escalation: row,
|
|
175
|
+
isExtension: row.prev_assigned_to === userId,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
@@ -19,3 +19,8 @@ export declare const BULK_RESOLVE_FOR_TRIAGE = "UPDATE lt_escalations\nSET statu
|
|
|
19
19
|
export declare const UPDATE_ESCALATION_METADATA = "UPDATE lt_escalations\nSET metadata = COALESCE(metadata, '{}'::jsonb) || $2::jsonb,\n updated_at = NOW()\nWHERE id = $1\nRETURNING *";
|
|
20
20
|
export declare const ENRICH_ESCALATION_ROUTING = "UPDATE lt_escalations\nSET metadata = COALESCE(metadata, '{}'::jsonb) || $2::jsonb,\n workflow_type = COALESCE(workflow_type, $3),\n workflow_id = COALESCE(workflow_id, $4),\n task_queue = COALESCE(task_queue, $5),\n task_id = COALESCE(task_id, $6),\n updated_at = NOW()\nWHERE id = $1\nRETURNING *";
|
|
21
21
|
export declare const LIST_DISTINCT_TYPES = "SELECT DISTINCT type FROM lt_escalations ORDER BY type";
|
|
22
|
+
/** Find escalations by a single metadata key-value pair. */
|
|
23
|
+
export declare const FIND_BY_METADATA = "SELECT * FROM lt_escalations\nWHERE metadata @> $1::jsonb\n AND ($2::text IS NULL OR status = $2)\nORDER BY priority ASC, created_at ASC\nLIMIT $3 OFFSET $4";
|
|
24
|
+
export declare const COUNT_BY_METADATA = "SELECT COUNT(*) FROM lt_escalations\nWHERE metadata @> $1::jsonb\n AND ($2::text IS NULL OR status = $2)";
|
|
25
|
+
/** Atomic claim by metadata: find one available escalation and claim it. */
|
|
26
|
+
export declare const CLAIM_BY_METADATA = "WITH target AS (\n SELECT id, assigned_to\n FROM lt_escalations\n WHERE metadata @> $1::jsonb\n AND status = 'pending'\n AND (\n assigned_to IS NULL\n OR assigned_until <= NOW()\n OR assigned_to = $2\n )\n ORDER BY priority ASC, created_at ASC\n LIMIT 1\n FOR UPDATE SKIP LOCKED\n),\nupdated AS (\n UPDATE lt_escalations e\n SET assigned_to = $2,\n claimed_at = NOW(),\n assigned_until = NOW() + INTERVAL '1 minute' * $3\n FROM target t\n WHERE e.id = t.id\n RETURNING e.*, t.assigned_to AS prev_assigned_to\n)\nSELECT * FROM updated";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Escalation SQL – externalized from crud.ts, bulk.ts, queries.ts
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.LIST_DISTINCT_TYPES = exports.ENRICH_ESCALATION_ROUTING = exports.UPDATE_ESCALATION_METADATA = exports.BULK_RESOLVE_FOR_TRIAGE = exports.BULK_ESCALATE_TO_ROLE = exports.BULK_ASSIGN = exports.BULK_CLAIM = exports.GET_ESCALATIONS_BY_ORIGIN_ID = exports.GET_ESCALATIONS_BY_WORKFLOW_ID = exports.GET_ESCALATIONS_BY_TASK_ID = exports.GET_ESCALATION = exports.ESCALATE_TO_ROLE = exports.RELEASE_EXPIRED_CLAIMS = exports.RELEASE_ESCALATION = exports.GET_ESCALATION_ROLES = exports.UPDATE_ESCALATIONS_PRIORITY = exports.RESOLVE_ESCALATION = exports.CLAIM_ESCALATION = exports.CREATE_ESCALATION = exports.ENSURE_ROLE_EXISTS = void 0;
|
|
6
|
+
exports.CLAIM_BY_METADATA = exports.COUNT_BY_METADATA = exports.FIND_BY_METADATA = exports.LIST_DISTINCT_TYPES = exports.ENRICH_ESCALATION_ROUTING = exports.UPDATE_ESCALATION_METADATA = exports.BULK_RESOLVE_FOR_TRIAGE = exports.BULK_ESCALATE_TO_ROLE = exports.BULK_ASSIGN = exports.BULK_CLAIM = exports.GET_ESCALATIONS_BY_ORIGIN_ID = exports.GET_ESCALATIONS_BY_WORKFLOW_ID = exports.GET_ESCALATIONS_BY_TASK_ID = exports.GET_ESCALATION = exports.ESCALATE_TO_ROLE = exports.RELEASE_EXPIRED_CLAIMS = exports.RELEASE_ESCALATION = exports.GET_ESCALATION_ROLES = exports.UPDATE_ESCALATIONS_PRIORITY = exports.RESOLVE_ESCALATION = exports.CLAIM_ESCALATION = exports.CREATE_ESCALATION = exports.ENSURE_ROLE_EXISTS = void 0;
|
|
7
7
|
// --- Role management -------------------------------------------------------
|
|
8
8
|
exports.ENSURE_ROLE_EXISTS = 'INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING';
|
|
9
9
|
// --- Single-record CRUD ---------------------------------------------------
|
|
@@ -133,3 +133,41 @@ SET metadata = COALESCE(metadata, '{}'::jsonb) || $2::jsonb,
|
|
|
133
133
|
WHERE id = $1
|
|
134
134
|
RETURNING *`;
|
|
135
135
|
exports.LIST_DISTINCT_TYPES = 'SELECT DISTINCT type FROM lt_escalations ORDER BY type';
|
|
136
|
+
// --- Metadata candidate key lookups -----------------------------------------
|
|
137
|
+
/** Find escalations by a single metadata key-value pair. */
|
|
138
|
+
exports.FIND_BY_METADATA = `\
|
|
139
|
+
SELECT * FROM lt_escalations
|
|
140
|
+
WHERE metadata @> $1::jsonb
|
|
141
|
+
AND ($2::text IS NULL OR status = $2)
|
|
142
|
+
ORDER BY priority ASC, created_at ASC
|
|
143
|
+
LIMIT $3 OFFSET $4`;
|
|
144
|
+
exports.COUNT_BY_METADATA = `\
|
|
145
|
+
SELECT COUNT(*) FROM lt_escalations
|
|
146
|
+
WHERE metadata @> $1::jsonb
|
|
147
|
+
AND ($2::text IS NULL OR status = $2)`;
|
|
148
|
+
/** Atomic claim by metadata: find one available escalation and claim it. */
|
|
149
|
+
exports.CLAIM_BY_METADATA = `\
|
|
150
|
+
WITH target AS (
|
|
151
|
+
SELECT id, assigned_to
|
|
152
|
+
FROM lt_escalations
|
|
153
|
+
WHERE metadata @> $1::jsonb
|
|
154
|
+
AND status = 'pending'
|
|
155
|
+
AND (
|
|
156
|
+
assigned_to IS NULL
|
|
157
|
+
OR assigned_until <= NOW()
|
|
158
|
+
OR assigned_to = $2
|
|
159
|
+
)
|
|
160
|
+
ORDER BY priority ASC, created_at ASC
|
|
161
|
+
LIMIT 1
|
|
162
|
+
FOR UPDATE SKIP LOCKED
|
|
163
|
+
),
|
|
164
|
+
updated AS (
|
|
165
|
+
UPDATE lt_escalations e
|
|
166
|
+
SET assigned_to = $2,
|
|
167
|
+
claimed_at = NOW(),
|
|
168
|
+
assigned_until = NOW() + INTERVAL '1 minute' * $3
|
|
169
|
+
FROM target t
|
|
170
|
+
WHERE e.id = t.id
|
|
171
|
+
RETURNING e.*, t.assigned_to AS prev_assigned_to
|
|
172
|
+
)
|
|
173
|
+
SELECT * FROM updated`;
|
|
@@ -39,6 +39,7 @@ exports.ltEnrichEscalationRouting = ltEnrichEscalationRouting;
|
|
|
39
39
|
exports.ltCreateEscalation = ltCreateEscalation;
|
|
40
40
|
const escalationService = __importStar(require("../../escalation"));
|
|
41
41
|
const logger_1 = require("../../../lib/logger");
|
|
42
|
+
const publish_1 = require("../../../lib/events/publish");
|
|
42
43
|
/**
|
|
43
44
|
* Resolve an escalation record. Called by the interceptor after
|
|
44
45
|
* detecting a re-run (resolver data present in the envelope).
|
|
@@ -106,5 +107,15 @@ async function ltCreateEscalation(input) {
|
|
|
106
107
|
trace_id: input.traceId,
|
|
107
108
|
span_id: input.spanId,
|
|
108
109
|
});
|
|
110
|
+
(0, publish_1.publishEscalationEvent)({
|
|
111
|
+
type: 'escalation.created',
|
|
112
|
+
source: 'interceptor',
|
|
113
|
+
workflowId: input.workflowId || '',
|
|
114
|
+
workflowName: input.workflowType || '',
|
|
115
|
+
taskQueue: input.taskQueue || '',
|
|
116
|
+
escalationId: escalation.id,
|
|
117
|
+
status: 'pending',
|
|
118
|
+
data: { type: input.type, role: input.role },
|
|
119
|
+
});
|
|
109
120
|
return escalation.id;
|
|
110
121
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// SQL templates for
|
|
2
|
+
// SQL templates for pipeline queries.
|
|
3
3
|
// Schema placeholders (${schema}) are interpolated at call time
|
|
4
4
|
// because Postgres does not support parameterized schema names.
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|