@hotmeshio/long-tail 0.4.12 → 0.4.13
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/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/routes/index.js +3 -2
- package/build/routes/{mcp-runs.js → pipelines.js} +17 -4
- package/build/sdk/index.d.ts +11 -4
- package/build/sdk/index.js +12 -5
- package/build/services/{mcp-runs → pipelines}/sql.js +1 -1
- package/build/start/adapters.js +3 -6
- package/build/start/server.js +5 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/startup.d.ts +3 -3
- package/dashboard/dist/assets/{AdminDashboard-B7AFFt4L.js → AdminDashboard-Jwr3Fsaz.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-B7AFFt4L.js.map → AdminDashboard-Jwr3Fsaz.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-CjuCbr5J.js → AgentConfigPage-DbqbFXEq.js} +4 -4
- package/dashboard/dist/assets/{AgentConfigPage-CjuCbr5J.js.map → AgentConfigPage-DbqbFXEq.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DnHaUCS5.js → AgentDetailPage-Cw7foCHd.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-DnHaUCS5.js.map → AgentDetailPage-Cw7foCHd.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-BR2-PdTq.js → AgentsPage-DzpWsTFO.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-BR2-PdTq.js.map → AgentsPage-DzpWsTFO.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-CEkeo_N4.js → AvailableEscalationsPage-D2cxvpAK.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-CEkeo_N4.js.map → AvailableEscalationsPage-D2cxvpAK.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-Ddu4V0uf.js +2 -0
- package/dashboard/dist/assets/{BotPicker-CAowL3ib.js.map → BotPicker-Ddu4V0uf.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-BTd-uYTM.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-CSUKBvEN.js.map → CapabilitiesPage-BTd-uYTM.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-Bv6ixURp.js → CollapsibleSection-DM-75khr.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-Bv6ixURp.js.map → CollapsibleSection-DM-75khr.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CdPKxRBj.js → CredentialsPage-BQNraRZu.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CdPKxRBj.js.map → CredentialsPage-BQNraRZu.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-BtdXRDqs.js → CronLabel-CPuMNBua.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-BtdXRDqs.js.map → CronLabel-CPuMNBua.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-Mq3SLUuv.js → CustomDurationPicker-CLq8B89Y.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-Mq3SLUuv.js.map → CustomDurationPicker-CLq8B89Y.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-8lk94nZt.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DOTqB4ZX.js.map → ElapsedCell-8lk94nZt.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DSM8Mnb-.js → EscalationsOverview-BfSrQ7A5.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DSM8Mnb-.js.map → EscalationsOverview-BfSrQ7A5.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-C-HagWbs.js → EventTable-D3IOLoxv.js} +2 -2
- package/dashboard/dist/assets/{EventTable-C-HagWbs.js.map → EventTable-D3IOLoxv.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-RO3qbF38.js +2 -0
- package/dashboard/dist/assets/HomePage-RO3qbF38.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-4lObXT3_.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-o8xSCSVv.js.map → ListToolbar-4lObXT3_.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-BdLivZv8.js +2 -0
- package/dashboard/dist/assets/McpOverview-BdLivZv8.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryDetailPage-UR0bySPJ.js → McpQueryDetailPage-DKFkH1qa.js} +2 -2
- package/dashboard/dist/assets/McpQueryDetailPage-DKFkH1qa.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-C-mzOcGH.js → McpQueryPage-AFV_QPwm.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-C-mzOcGH.js.map → McpQueryPage-AFV_QPwm.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-DQJ41oKW.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-DQJ41oKW.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-CzVS7zcc.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-CzVS7zcc.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-DLpqyLle.js → OperatorDashboard-B_QmNzLw.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DLpqyLle.js.map → OperatorDashboard-B_QmNzLw.js.map} +1 -1
- 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-qibro3Dm.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-8cJEBC_E.js.map → ProcessDetailPage-qibro3Dm.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CiprI5Wj.js → ProcessesListPage-CPgiDbdS.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CiprI5Wj.js.map → ProcessesListPage-CPgiDbdS.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-BAj88I_Y.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-xo6AgPym.js.map → RolesPage-BAj88I_Y.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DPXWgduq.js → RunAsSelector-IdZ-qOfl.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DPXWgduq.js.map → RunAsSelector-IdZ-qOfl.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-WQ6VMuqg.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BzG8QxYs.js.map → SwimlaneTimeline-WQ6VMuqg.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-buNgjwiz.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-Ck_0-iO2.js.map → TaskDetailPage-buNgjwiz.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-BQjjNjRC.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DtR4F0ho.js.map → TasksListPage-BQjjNjRC.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BLNstYO1.js → TimeAgo-Dvkw4shy.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BLNstYO1.js.map → TimeAgo-Dvkw4shy.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DxIz3l1J.js → TimestampCell-DGEGdbOW.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DxIz3l1J.js.map → TimestampCell-DGEGdbOW.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-GY3n1V12.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-AVDlqGQI.js.map → ToolTestPanel-GY3n1V12.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-CGim5yi0.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-CGim5yi0.js.map +1 -0
- package/dashboard/dist/assets/{TopicsPage-BdnJ7E_S.js → TopicsPage-DLyRlo0A.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-BdnJ7E_S.js.map → TopicsPage-DLyRlo0A.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-Bk-pzKYb.js → UserName-B8dGlxj9.js} +2 -2
- package/dashboard/dist/assets/{UserName-Bk-pzKYb.js.map → UserName-B8dGlxj9.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BQbIIdIA.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-BQbIIdIA.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-DL6oRbka.js} +2 -2
- package/dashboard/dist/assets/WorkflowsDashboard-DL6oRbka.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-BdSHBzzd.js → WorkflowsOverview-Reab_xHT.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BdSHBzzd.js.map → WorkflowsOverview-Reab_xHT.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BoFstOcp.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-BsO4L_SW.js.map → YamlWorkflowsPage-BoFstOcp.js.map} +1 -1
- package/dashboard/dist/assets/{agents-CtF0uBav.js → agents-CQsJU21y.js} +2 -2
- package/dashboard/dist/assets/{agents-CtF0uBav.js.map → agents-CQsJU21y.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DOP_eck8.js → bots-t1FPESbm.js} +2 -2
- package/dashboard/dist/assets/{bots-DOP_eck8.js.map → bots-t1FPESbm.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DvxG02aF.js → capabilities-D1Y3hVvf.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DvxG02aF.js.map → capabilities-D1Y3hVvf.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Dmq81vAY.js → controlplane-CV-y8cfH.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Dmq81vAY.js.map → controlplane-CV-y8cfH.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-BP3UWfIe.js → escalation-Bf_SO_75.js} +2 -2
- package/dashboard/dist/assets/{escalation-BP3UWfIe.js.map → escalation-Bf_SO_75.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BayccZzU.js → escalation-columns-DgY8c1hM.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BayccZzU.js.map → escalation-columns-DgY8c1hM.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-B_PYr0pL.js → helpers-nWSTagzD.js} +2 -2
- package/dashboard/dist/assets/{helpers-B_PYr0pL.js.map → helpers-nWSTagzD.js.map} +1 -1
- package/dashboard/dist/assets/{index-DzQBDt3K.js → index-0i5oHs_4.js} +2 -2
- package/dashboard/dist/assets/{index-DzQBDt3K.js.map → index-0i5oHs_4.js.map} +1 -1
- package/dashboard/dist/assets/index-B77P0ssX.js +2 -0
- package/dashboard/dist/assets/{index-Bb1ycul8.js.map → index-B77P0ssX.js.map} +1 -1
- package/dashboard/dist/assets/index-BRYCB_g0.js +2 -0
- package/dashboard/dist/assets/index-BRYCB_g0.js.map +1 -0
- package/dashboard/dist/assets/{index-B80zLZVl.js → index-BVXXvXlF.js} +2 -2
- package/dashboard/dist/assets/{index-B80zLZVl.js.map → index-BVXXvXlF.js.map} +1 -1
- package/dashboard/dist/assets/{index-BnB7G5bA.js → index-BZu5zewH.js} +23 -23
- package/dashboard/dist/assets/index-BZu5zewH.js.map +1 -0
- package/dashboard/dist/assets/index-C42ACUTi.js +2 -0
- package/dashboard/dist/assets/index-C42ACUTi.js.map +1 -0
- package/dashboard/dist/assets/{index-DQs-LMoa.js → index-CHBiEYmf.js} +2 -2
- package/dashboard/dist/assets/{index-DQs-LMoa.js.map → index-CHBiEYmf.js.map} +1 -1
- package/dashboard/dist/assets/index-CdUj8mKq.js +15 -0
- package/dashboard/dist/assets/index-CdUj8mKq.js.map +1 -0
- package/dashboard/dist/assets/{index-Bv0eLXZq.js → index-DAQvhgrL.js} +4 -4
- package/dashboard/dist/assets/{index-Bv0eLXZq.js.map → index-DAQvhgrL.js.map} +1 -1
- package/dashboard/dist/assets/{index-CkcPZdQm.js → index-DUaF8VYe.js} +2 -2
- package/dashboard/dist/assets/{index-CkcPZdQm.js.map → index-DUaF8VYe.js.map} +1 -1
- package/dashboard/dist/assets/{index-Do1x4kN0.js → index-Dp8iH4i2.js} +2 -2
- package/dashboard/dist/assets/{index-Do1x4kN0.js.map → index-Dp8iH4i2.js.map} +1 -1
- package/dashboard/dist/assets/index-MO0YnTPi.js +2 -0
- package/dashboard/dist/assets/{index-EqKHsaVz.js.map → index-MO0YnTPi.js.map} +1 -1
- package/dashboard/dist/assets/index-ib-nDwd6.css +1 -0
- package/dashboard/dist/assets/{index-B3wGNZN2.js → index-wlL3EZ14.js} +2 -2
- package/dashboard/dist/assets/{index-B3wGNZN2.js.map → index-wlL3EZ14.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge--SApApck.js → knowledge-DJhm5z0p.js} +2 -2
- package/dashboard/dist/assets/{knowledge--SApApck.js.map → knowledge-DJhm5z0p.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-dn9iPrzm.js → mcp-DMYXb9fv.js} +2 -2
- package/dashboard/dist/assets/{mcp-dn9iPrzm.js.map → mcp-DMYXb9fv.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CgiU2UR6.js → mcp-query-DE-oPOvi.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CgiU2UR6.js.map → mcp-query-DE-oPOvi.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-D93H3wFO.js → namespaces-Bjjm4EG1.js} +2 -2
- package/dashboard/dist/assets/{namespaces-D93H3wFO.js.map → namespaces-Bjjm4EG1.js.map} +1 -1
- package/dashboard/dist/assets/pipelines-C8aRprVr.js +2 -0
- package/dashboard/dist/assets/pipelines-C8aRprVr.js.map +1 -0
- package/dashboard/dist/assets/{roles-DuOWZTpx.js → roles-CQsPYJXe.js} +2 -2
- package/dashboard/dist/assets/{roles-DuOWZTpx.js.map → roles-CQsPYJXe.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DoCbLKz4.js → tasks-BQ1c7trT.js} +2 -2
- package/dashboard/dist/assets/{tasks-DoCbLKz4.js.map → tasks-BQ1c7trT.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CS7Sxf_-.js → topics-DIziCjqg.js} +2 -2
- package/dashboard/dist/assets/{topics-CS7Sxf_-.js.map → topics-DIziCjqg.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-CrIe_Ulh.js → useEventHooks-CPxcH6zx.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-CrIe_Ulh.js.map → useEventHooks-CPxcH6zx.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-JzvzGsUR.js → useYamlActivityEvents-DnPywDgy.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-JzvzGsUR.js.map → useYamlActivityEvents-DnPywDgy.js.map} +1 -1
- package/dashboard/dist/assets/{users-DnxSh2dX.js → users-CMGaVe_B.js} +2 -2
- package/dashboard/dist/assets/{users-DnxSh2dX.js.map → users-CMGaVe_B.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-CD7-d5w8.js} +2 -2
- package/dashboard/dist/assets/{workflows-zFmmxc08.js.map → workflows-CD7-d5w8.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-VSax0tKa.js → yaml-workflows-CIeymjZr.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-VSax0tKa.js.map → yaml-workflows-CIeymjZr.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/{mcp-runs.md → pipelines.md} +39 -25
- package/docs/dashboard.md +1 -1
- package/docs/sdk.md +1 -1
- package/package.json +1 -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/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/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-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
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as P,a as I,j as e}from"./vendor-query-B2UbickB.js";import{b as D}from"./mcp-runs-BN5MrKai.js";import{u as R,c as K,D as U,d as N,J as w,N as $}from"./index-BnB7G5bA.js";import{S as J}from"./StatusBadge-XQlNFwmH.js";import{P as k}from"./PageHeader-B4w-LDUF.js";import{C as L}from"./CopyableId-DaT0ZRHg.js";import{C as j}from"./CollapsibleSection-Bv6ixURp.js";import{u as M}from"./useCollapsedSections-BU5HULGs.js";import{L as V}from"./ListToolbar-o8xSCSVv.js";import{S as q}from"./SwimlaneTimeline-BzG8QxYs.js";import{E as B}from"./EventTable-C-HagWbs.js";import{e as F,f as H}from"./vendor-react-CXumBFUA.js";import"./vendor-icons-5gSix3t2.js";import"./FilterBar-Ck4K4rzu.js";const Q={running:"in_progress",completed:"completed",failed:"failed"};function le(){var v,b;const{jobId:s}=F(),[o]=H(),r=o.get("namespace")||"longtail",h=P(),{data:t,isLoading:S,error:i,refetch:_,isFetching:C}=D(s,r),{data:x}=R(),{isCollapsed:d,toggle:m}=M("mcp-run-detail"),f=((v=x==null?void 0:x.telemetry)==null?void 0:v.traceUrl)??null,E=I.useCallback(c=>{!s||c.workflowId!==s||h.invalidateQueries({queryKey:["mcpRunExecution",s]})},[s,h]);if(K(`${$}.activity.>`,E),S)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(i||!t)return e.jsxs("div",{children:[e.jsx(k,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(b=i==null?void 0:i.message)!=null&&b.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(i==null?void 0:i.message)??"The run could not be resolved."})]})]});const{events:p,summary:a}=t,u=p.find(c=>{var y;return c.category==="activity"&&((y=c.attributes.kind)==null?void 0:y.includes("completed"))}),T=(u==null?void 0:u.attributes.result)??null,n=t.result,g=(n==null?void 0:n.data)??n??null;return e.jsxs("div",{children:[e.jsx(k,{title:"Pipeline Execution",actions:e.jsx(V,{onRefresh:()=>_(),isFetching:C,apiPath:`/mcp-runs/${s}/execution?app_id=${r}`})}),e.jsxs("div",{className:"bg-surface-sunken/50 rounded-md p-5 mb-8",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsx("h2",{className:"text-sm font-mono text-text-primary truncate flex-1",children:t.workflow_id}),e.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[e.jsx(l,{label:"Tools",value:a.activities.user}),e.jsx(l,{label:"System",value:a.activities.system,muted:!0}),a.child_workflows.total>0&&e.jsx(l,{label:"Children",value:a.child_workflows.total}),a.timers>0&&e.jsx(l,{label:"Timers",value:a.timers}),a.signals>0&&e.jsx(l,{label:"Signals",value:a.signals}),e.jsx(J,{status:Q[t.status]??t.status})]})]}),e.jsxs("div",{className:"grid grid-cols-6 gap-x-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Server"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:r})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Tool"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:t.workflow_type||"—"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Duration"}),e.jsx(U,{ms:t.duration_ms,className:"font-mono text-text-primary"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Started"}),t.start_time?e.jsx(N,{date:t.start_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Completed"}),t.close_time?e.jsx(N,{date:t.close_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Trace"}),t.trace_id?e.jsx(L,{label:"",value:t.trace_id,href:f?f.replace("{traceId}",t.trace_id):void 0,external:!0}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"})]})]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(j,{title:"Details",sectionKey:"details",isCollapsed:d("details"),onToggle:m,children:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[e.jsx("div",{children:e.jsx(w,{data:T??{},label:"Input"})}),g!==null&&e.jsx("div",{children:e.jsx(w,{data:g,label:"Result"})})]})}),e.jsx(j,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:d("timeline"),onToggle:m,children:e.jsx(q,{events:p,outline:!0})}),e.jsx(j,{title:"Events",sectionKey:"events",isCollapsed:d("events"),onToggle:m,children:e.jsx(B,{events:p})})]})]})}function l({label:s,value:o,muted:r}){return e.jsxs("div",{className:"flex items-center gap-1.5 text-xs",children:[e.jsx("span",{className:"text-text-tertiary",children:s}),e.jsx("span",{className:`font-medium tabular-nums ${r?"text-text-tertiary":"text-text-primary"}`,children:o})]})}export{le as McpRunDetailPage};
|
|
2
|
-
//# sourceMappingURL=McpRunDetailPage-bJl08JSG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"McpRunDetailPage-bJl08JSG.js","sources":["../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { useParams, useSearchParams } from 'react-router-dom';\nimport { useCallback } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution } from '../../api/mcp-runs';\nimport { useSettings } from '../../api/settings';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { DurationValue } from '../../components/common/display/DurationValue';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || 'longtail';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error, refetch, isFetching } = useMcpRunExecution(jobId!, namespace);\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n\n\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.activity.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events, summary } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n <div>\n <PageHeader\n title=\"Pipeline Execution\"\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/mcp-runs/${jobId}/execution?app_id=${namespace}`}\n />\n }\n />\n\n {/* ── Header card ─────────────────────────────────── */}\n <div className=\"bg-surface-sunken/50 rounded-md p-5 mb-8\">\n {/* Row 1: Job ID + stats + status */}\n <div className=\"flex items-center gap-4 mb-4\">\n <h2 className=\"text-sm font-mono text-text-primary truncate flex-1\">{execution.workflow_id}</h2>\n <div className=\"flex items-center gap-4 shrink-0\">\n <Stat label=\"Tools\" value={summary.activities.user} />\n <Stat label=\"System\" value={summary.activities.system} muted />\n {summary.child_workflows.total > 0 && (\n <Stat label=\"Children\" value={summary.child_workflows.total} />\n )}\n {summary.timers > 0 && <Stat label=\"Timers\" value={summary.timers} />}\n {summary.signals > 0 && <Stat label=\"Signals\" value={summary.signals} />}\n <StatusBadge status={statusMap[execution.status] ?? execution.status} />\n </div>\n </div>\n\n {/* Row 2: Namespace, Topic, Duration, Started, Trace */}\n <div className=\"grid grid-cols-6 gap-x-6\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Server</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{namespace}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Tool</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{execution.workflow_type || '—'}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Duration</p>\n <DurationValue ms={execution.duration_ms} className=\"font-mono text-text-primary\" />\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Started</p>\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Completed</p>\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Trace</p>\n {execution.trace_id ? (\n <CopyableId\n label=\"\"\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Sections ────────────────────────────────────── */}\n <div className=\"space-y-6\">\n {/* Details: Input + Result */}\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6\">\n <div>\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n </div>\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n </CollapsibleSection>\n\n {/* Execution Timeline (swimlane) */}\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle}>\n <SwimlaneTimeline events={events} outline />\n </CollapsibleSection>\n\n {/* Events (table) */}\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle}>\n <EventTable events={events} />\n </CollapsibleSection>\n </div>\n </div>\n );\n}\n\n// ── Stat pill ────────────────────────────────────────────────────────────────\n\nfunction Stat({ label, value, muted }: { label: string; value: number; muted?: boolean }) {\n return (\n <div className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-text-tertiary\">{label}</span>\n <span className={`font-medium tabular-nums ${muted ? 'text-text-tertiary' : 'text-text-primary'}`}>{value}</span>\n </div>\n );\n}\n"],"names":["statusMap","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","namespace","queryClient","useQueryClient","execution","isLoading","error","refetch","isFetching","useMcpRunExecution","settings","useSettings","isCollapsed","toggle","useCollapsedSections","traceUrl","_a","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","jsxs","jsx","PageHeader","_b","events","summary","triggerCompleted","e","triggerInput","rawResult","result","ListToolbar","Stat","StatusBadge","DurationValue","DateValue","CopyableId","CollapsibleSection","JsonViewer","SwimlaneTimeline","EventTable","label","value","muted"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as m,j as s}from"./vendor-query-B2UbickB.js";import{a as T,u as F}from"./mcp-runs-BN5MrKai.js";import{a as R}from"./yaml-workflows-VSax0tKa.js";import{u as M}from"./namespaces-D93H3wFO.js";import{u as z}from"./useFilterParams-x-Dg0Vgz.js";import{D as E}from"./DataTable-D9yuBv0w.js";import{W as A}from"./WorkflowPill-BkfIn8N3.js";import{T as b}from"./TimestampCell-DxIz3l1J.js";import{E as L}from"./ElapsedCell-DOTqB4ZX.js";import{P as U}from"./PageHeader-B4w-LDUF.js";import{F as I,b as h}from"./FilterBar-Ck4K4rzu.js";import{S as O}from"./StickyPagination-BWhFSr2d.js";import{L as W}from"./ListToolbar-o8xSCSVv.js";import{R as B,a as H}from"./RowActions-Dg-Fsm5O.js";import{t as q}from"./vendor-icons-5gSix3t2.js";import{c as G}from"./vendor-react-CXumBFUA.js";import"./index-BnB7G5bA.js";import"./EmptyState-BcsfPq9T.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},J={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},K={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function Q(f,a){return[{key:"workflow_id",label:"Run ID / Tool",render:e=>{const p=J[Y[e.status]??e.status]??"bg-status-pending",n=e.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[s.jsx("span",{className:`w-1.5 h-1.5 shrink-0 rounded-full mt-1.5 ${p}${n}`,title:e.status}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:e.workflow_id}),s.jsx("div",{className:"mt-0.5",children:e.entity?s.jsx(A,{type:e.entity,variant:"pipeline",size:"xs"}):s.jsx("span",{className:"text-[10px] text-text-tertiary",children:"—"})})]})]})}},{key:"created_at",label:"Created",sortable:!0,render:e=>s.jsx(b,{date:e.created_at}),className:"w-40"},{key:"updated_at",label:"Updated",sortable:!0,render:e=>s.jsx(b,{date:e.updated_at}),className:"w-40"},{key:"duration",label:"Duration",render:e=>s.jsx(L,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>s.jsxs(B,{children:[s.jsx(H,{icon:q,title:`Filter by ${e.entity}`,onClick:()=>f(e.entity)}),s.jsx("button",{onClick:p=>{p.stopPropagation(),a(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${K[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function xe(){const f=G(),{filters:a,setFilter:e,setFilters:p,pagination:n,sort:g,setSort:v}=z({filters:{search:"",entity:"",status:"",namespace:""}}),[d,j]=m.useState(a.search);m.useEffect(()=>{if(d===a.search)return;const t=setTimeout(()=>e("search",d),300);return()=>clearTimeout(t)},[d,e,a.search]);const{data:r}=R(),{data:l}=M(),x=m.useMemo(()=>{const t=new Set((r==null?void 0:r.app_ids)??[]);for(const o of(l==null?void 0:l.namespaces)??[])t.add(o.name);return[...t].sort()},[r==null?void 0:r.app_ids,l==null?void 0:l.namespaces]),S=x.includes("hmsh")?"hmsh":x[0]??"",i=a.namespace||S,{data:c}=T(i),{data:u,isLoading:N,refetch:_,isFetching:k}=F({app_id:i,limit:n.pageSize,offset:n.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:g.sort_by||void 0,order:g.order||void 0}),y=(u==null?void 0:u.total)??0,C=(u==null?void 0:u.jobs)??[],$=Q(t=>e("entity",t),t=>e("status",t)),w=m.useMemo(()=>{const t=new Set(x);return i&&t.add(i),[...t].sort().map(o=>({value:o,label:o}))},[x,i]),P=m.useMemo(()=>{const t=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!t.has(a.entity)&&t.add(a.entity),[...t].sort().map(o=>({value:o,label:o}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(U,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:pipeline-executions"}),s.jsxs(I,{actions:s.jsx(W,{onRefresh:()=>_(),isFetching:k,apiPath:`/mcp-runs?app_id=${i||"longtail"}&limit=${n.pageSize}&offset=${n.offset}${a.entity?`&entity=${a.entity}`:""}${a.status?`&status=${a.status}`:""}${a.search?`&search=${a.search}`:""}`}),children:[s.jsx(h,{label:"Namespace",value:i,onChange:t=>{p({namespace:t,entity:""})},options:w,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:d,onChange:t=>j(t.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(h,{label:"Tool",value:a.entity,onChange:t=>e("entity",t),options:P}),s.jsx(h,{label:"Status",value:a.status,onChange:t=>e("status",t),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(E,{columns:$,data:C,keyFn:t=>t.workflow_id,onRowClick:t=>f(`/mcp/executions/${encodeURIComponent(t.workflow_id)}?namespace=${i}`),isLoading:N,emptyMessage:"No pipeline executions found",sort:g,onSort:v}),s.jsx(O,{page:n.page,totalPages:n.totalPages(y),onPageChange:n.setPage,total:y,pageSize:n.pageSize,onPageSizeChange:n.setPageSize})]})}export{xe as McpRunsPage};
|
|
2
|
-
//# sourceMappingURL=McpRunsPage-i2FGJ6yf.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"McpRunsPage-i2FGJ6yf.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter } from 'lucide-react';\nimport { useMcpRuns, useMcpEntities } from '../../api/mcp-runs';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useNamespaces } from '../../api/namespaces';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob } from '../../api/types';\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Run ID / Tool',\n render: (row) => {\n const dotClass = STATUS_DOT[statusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-1.5 h-1.5 shrink-0 rounded-full mt-1.5 ${dotClass}${pulseClass}`} title={row.status} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n {row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-[10px] text-text-tertiary\">—</span>}\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { filters, setFilter, setFilters, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n const { data: nsData } = useNamespaces();\n\n const allNamespaceNames = useMemo(() => {\n const set = new Set(appIdData?.app_ids ?? []);\n for (const ns of nsData?.namespaces ?? []) {\n set.add(ns.name);\n }\n return [...set].sort();\n }, [appIdData?.app_ids, nsData?.namespaces]);\n\n // Default: URL param > 'hmsh' (if exists) > first in list\n const defaultNamespace = allNamespaceNames.includes('hmsh')\n ? 'hmsh'\n : allNamespaceNames[0] ?? '';\n const activeNamespace = filters.namespace || defaultNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading, refetch, isFetching } = useMcpRuns({\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || undefined,\n order: sort.order || undefined,\n });\n\n const total = runsData?.total ?? 0;\n const jobs = runsData?.jobs ?? [];\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n );\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" docsHash=\"#docs:dashboard.md:pipeline-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/mcp-runs?app_id=${activeNamespace || 'longtail'}&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.status ? `&status=${filters.status}` : ''}${filters.search ? `&search=${filters.search}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No pipeline executions found\"\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["statusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","nsData","useNamespaces","allNamespaceNames","useMemo","set","ns","defaultNamespace","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","id","entities","known","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{a,j as e}from"./vendor-query-B2UbickB.js";import{a as z,b as A,c as V,d as G}from"./topics-CS7Sxf_-.js";import{d as b,J as q}from"./index-BnB7G5bA.js";import{L as H}from"./ListToolbar-o8xSCSVv.js";import{R as r,B as K,q as X,O as Y,p as Q,aM as Z,X as ee,T as te,a as D}from"./vendor-icons-5gSix3t2.js";import{e as se,c as ae}from"./vendor-react-CXumBFUA.js";const ce={task:"bg-blue-400/15 text-blue-400",workflow:"bg-accent/15 text-accent",escalation:"bg-amber-400/15 text-amber-400",activity:"bg-cyan-400/15 text-cyan-400",knowledge:"bg-violet-400/15 text-violet-400",agent:"bg-emerald-400/15 text-emerald-400",app:"bg-rose-400/15 text-rose-400",milestone:"bg-violet-400/15 text-violet-400"};function x({icon:l,color:m,children:o}){return e.jsxs("div",{className:"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border",children:[e.jsx(l,{className:`w-4 h-4 ${m}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-xs font-semibold uppercase tracking-widest text-accent/80",children:o})]})}function me(){var E,T,O;const{topic:l}=se(),m=l?decodeURIComponent(l):null,o=ae(),{data:t,isLoading:J,refetch:f,isFetching:R}=z(m),N=A(),W=V(),c=G(),[n,p]=a.useState(!1),[h,u]=a.useState(!1),[y,v]=a.useState(""),[S,k]=a.useState(""),[w,C]=a.useState(""),[j,P]=a.useState(""),[_,d]=a.useState("");if(J)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!t)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsx(r,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1}),e.jsx("h2",{className:"text-lg font-medium text-text-primary mb-2",children:"Topic not found"})]});const M=t.source==="system",$=!t.managed,F=ce[t.category]??"bg-zinc-400/15 text-zinc-400",U=()=>{k(t.description??""),C((t.tags??[]).join(", ")),P(t.payload_schema?JSON.stringify(t.payload_schema,null,2):""),d(""),p(!0)},B=()=>p(!1),I=()=>{const s=w.split(",").map(g=>g.trim()).filter(Boolean);let i;if(j.trim())try{i=JSON.parse(j),d("")}catch{d("Invalid JSON");return}N.mutate({topic:t.topic,description:S,tags:s,...i!==void 0?{payload_schema:i}:{}},{onSuccess:()=>{p(!1),f()}})},L=()=>{confirm(`Delete topic "${t.topic}"?
|
|
2
|
-
|
|
3
|
-
This removes it from the catalog. Active subscriptions are not affected.`)&&W.mutate(t.topic,{onSuccess:()=>o("/topics")})};return e.jsxs("div",{className:"max-w-3xl",children:[e.jsxs("div",{className:"flex items-start justify-between mb-6",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx(r,{className:"w-5 h-5 text-accent",strokeWidth:1.5}),e.jsx("h1",{className:"text-lg font-mono font-medium text-text-primary",children:t.topic}),e.jsx("button",{onClick:()=>{window.location.hash="#docs:topics.md"},className:"text-text-quaternary hover:text-accent transition-colors",title:"Topic docs",children:e.jsx(K,{className:"w-4 h-4",strokeWidth:1.5})})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${F}`,children:t.category}),e.jsxs("span",{className:"text-[10px] font-mono text-text-quaternary",children:["source: ",t.source]}),t.last_seen_at&&e.jsxs("span",{className:"text-[10px] text-text-quaternary",children:["last seen ",e.jsx(b,{date:t.last_seen_at})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(H,{onRefresh:()=>f(),isFetching:R,apiPath:`/topics/by-name/${encodeURIComponent(t.topic)}`}),!n&&e.jsxs("button",{onClick:()=>{var i;const s=t.example_payload?JSON.stringify(t.example_payload,null,2):(i=t.payload_schema)!=null&&i.properties?JSON.stringify(Object.fromEntries(Object.keys(t.payload_schema.properties).map(g=>[g,""])),null,2):"{}";v(s),u(!h)},className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${h?"bg-accent/10 text-accent":"text-text-tertiary hover:text-accent hover:bg-surface-hover"}`,children:[e.jsx(X,{className:"w-3 h-3"})," Publish"]}),!n&&$&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:U,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[e.jsx(Y,{className:"w-3 h-3"})," Edit"]}),!M&&e.jsxs("button",{onClick:L,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors",children:[e.jsx(Q,{className:"w-3 h-3"})," Delete"]})]}),n&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:I,disabled:N.isPending,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[e.jsx(Z,{className:"w-3 h-3"})," Save"]}),e.jsxs("button",{onClick:B,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-text-tertiary hover:text-text-primary hover:bg-surface-hover transition-colors",children:[e.jsx(ee,{className:"w-3 h-3"})," Cancel"]})]})]})]}),h&&e.jsxs("div",{className:"mb-6 bg-surface-sunken/50 rounded-md p-4",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-accent/60 mb-2",children:"Publish test event"}),e.jsx("textarea",{value:y,onChange:s=>v(s.target.value),className:"input-json w-full text-xs",rows:6,spellCheck:!1,placeholder:'{ "key": "value" }'}),e.jsxs("div",{className:"flex items-center gap-3 mt-3",children:[e.jsx("button",{onClick:()=>{try{const s=JSON.parse(y);c.mutate({topic:t.topic,data:s},{onSuccess:()=>u(!1)})}catch{}},disabled:c.isPending,className:"btn-primary text-xs",children:c.isPending?"Publishing...":"Publish"}),e.jsx("button",{onClick:()=>u(!1),className:"text-xs text-text-tertiary hover:text-text-primary",children:"Cancel"}),c.isSuccess&&e.jsx("span",{className:"text-xs text-status-success",children:"Published"}),c.isError&&e.jsx("span",{className:"text-xs text-status-error",children:c.error.message})]})]}),e.jsx("div",{className:"mb-8",children:n?e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Description"}),e.jsx("textarea",{value:S,onChange:s=>k(s.target.value),rows:3,className:"input resize-none",placeholder:"What this topic represents"})]}):t.description?e.jsx("p",{className:"text-sm text-text-secondary leading-relaxed",children:t.description}):e.jsx("p",{className:"text-sm text-text-quaternary italic",children:"No description"})}),e.jsx("div",{className:"mb-8",children:n?e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Tags"}),e.jsx("input",{type:"text",value:w,onChange:s=>C(s.target.value),placeholder:"lifecycle, core, error",className:"input font-mono"}),e.jsx("p",{className:"hint",children:"Comma-separated. Used for filtering in the catalog."})]}):((E=t.tags)==null?void 0:E.length)>0?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(te,{className:"w-3 h-3 text-text-quaternary",strokeWidth:1.5}),t.tags.map(s=>e.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded text-[10px] font-mono text-text-tertiary bg-surface-sunken",children:s},s))]}):null}),e.jsx("div",{className:"mb-8",children:n?e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Payload Schema"}),e.jsx("textarea",{value:j,onChange:s=>{P(s.target.value),d("")},rows:12,className:"input-json w-full",placeholder:`{
|
|
4
|
-
"type": "object",
|
|
5
|
-
"properties": {
|
|
6
|
-
"orderId": { "type": "string" }
|
|
7
|
-
}
|
|
8
|
-
}`}),_&&e.jsx("p",{className:"text-[10px] text-red-400 mt-1",children:_}),e.jsx("p",{className:"hint",children:"JSON Schema describing the event.data shape. Shown in subscription editor as field reference."})]}):t.payload_schema?e.jsxs(e.Fragment,{children:[e.jsx(x,{icon:r,color:"text-accent",children:"Payload Schema"}),e.jsx(q,{data:t.payload_schema})]}):e.jsxs(e.Fragment,{children:[e.jsx(x,{icon:r,color:"text-accent",children:"Payload Schema"}),e.jsx("p",{className:"text-[11px] text-text-quaternary",children:"No schema defined. Click Edit to add one."})]})}),t.example_payload&&e.jsxs("div",{className:"mb-8",children:[e.jsx(x,{icon:r,color:"text-cyan-400",children:"Example Payload"}),e.jsx(q,{data:t.example_payload})]}),e.jsxs("div",{className:"mb-8",children:[e.jsxs(x,{icon:D,color:"text-emerald-400",children:["Subscribers (",((T=t.subscribers)==null?void 0:T.length)??0,")"]}),(O=t.subscribers)!=null&&O.length?e.jsx("div",{className:"space-y-1",children:t.subscribers.map(s=>e.jsxs("div",{className:"flex items-center justify-between py-2 px-3 rounded-md hover:bg-surface-hover transition-colors",children:[e.jsxs("button",{onClick:()=>o(`/agents/${s.agent_id}`),className:"flex items-center gap-2 text-left min-w-0",children:[e.jsx(D,{className:"w-3 h-3 text-emerald-400 shrink-0",strokeWidth:1.5}),e.jsx("span",{className:"text-xs text-text-primary hover:text-accent transition-colors",children:s.agent_name})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-[10px] font-mono text-text-quaternary",children:s.topic}),e.jsx("span",{className:"text-[10px] text-text-tertiary",children:s.reaction_type})]})]},s.id))}):e.jsx("p",{className:"text-[11px] text-text-quaternary py-2",children:"No agents are subscribed to this topic."})]}),e.jsxs("div",{className:"text-[10px] text-text-quaternary space-y-1 pt-4 border-t border-surface-border",children:[e.jsxs("p",{children:["Created ",e.jsx(b,{date:t.created_at})]}),e.jsxs("p",{children:["Updated ",e.jsx(b,{date:t.updated_at})]})]})]})}export{me as TopicDetailPage};
|
|
9
|
-
//# sourceMappingURL=TopicDetailPage-DQkoAlsj.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TopicDetailPage-DQkoAlsj.js","sources":["../../src/pages/topics/TopicDetailPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { Radio, Bot, Tag, Pencil, Trash2, Save, X, BookOpen, Send } from 'lucide-react';\nimport { useTopic, useUpdateTopic, useDeleteTopic, usePublishTopic } from '../../api/topics';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'bg-blue-400/15 text-blue-400',\n workflow: 'bg-accent/15 text-accent',\n escalation: 'bg-amber-400/15 text-amber-400',\n activity: 'bg-cyan-400/15 text-cyan-400',\n knowledge: 'bg-violet-400/15 text-violet-400',\n agent: 'bg-emerald-400/15 text-emerald-400',\n app: 'bg-rose-400/15 text-rose-400',\n milestone: 'bg-violet-400/15 text-violet-400',\n};\n\nfunction SectionHeader({ icon: Icon, color, children }: { icon: React.ElementType; color: string; children: React.ReactNode }) {\n return (\n <div className=\"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border\">\n <Icon className={`w-4 h-4 ${color}`} strokeWidth={1.5} />\n <h2 className=\"text-xs font-semibold uppercase tracking-widest text-accent/80\">{children}</h2>\n </div>\n );\n}\n\nexport function TopicDetailPage() {\n const { topic: encodedTopic } = useParams<{ topic: string }>();\n const topicKey = encodedTopic ? decodeURIComponent(encodedTopic) : null;\n const navigate = useNavigate();\n const { data: topic, isLoading, refetch, isFetching } = useTopic(topicKey);\n const updateMutation = useUpdateTopic();\n const deleteMutation = useDeleteTopic();\n const publishMutation = usePublishTopic();\n\n const [editing, setEditing] = useState(false);\n const [publishing, setPublishing] = useState(false);\n const [publishPayload, setPublishPayload] = useState('');\n const [editDescription, setEditDescription] = useState('');\n const [editTags, setEditTags] = useState('');\n const [editSchema, setEditSchema] = useState('');\n const [schemaError, setSchemaError] = useState('');\n\n if (isLoading) {\n return <div className=\"animate-pulse space-y-4\"><div className=\"h-8 bg-surface-sunken rounded w-48\" /><div className=\"h-40 bg-surface-sunken rounded\" /></div>;\n }\n\n if (!topic) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Radio className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">Topic not found</h2>\n </div>\n );\n }\n\n const isSystem = topic.source === 'system';\n const isManaged = topic.managed;\n const editable = !isManaged;\n const categoryPillCls = CATEGORY_COLORS[topic.category] ?? 'bg-zinc-400/15 text-zinc-400';\n\n const startEdit = () => {\n setEditDescription(topic.description ?? '');\n setEditTags((topic.tags ?? []).join(', '));\n setEditSchema(topic.payload_schema ? JSON.stringify(topic.payload_schema, null, 2) : '');\n setSchemaError('');\n setEditing(true);\n };\n\n const cancelEdit = () => setEditing(false);\n\n const saveEdit = () => {\n const tags = editTags.split(',').map((t) => t.trim()).filter(Boolean);\n let payload_schema: Record<string, any> | undefined;\n if (editSchema.trim()) {\n try {\n payload_schema = JSON.parse(editSchema);\n setSchemaError('');\n } catch {\n setSchemaError('Invalid JSON');\n return;\n }\n }\n updateMutation.mutate(\n { topic: topic.topic, description: editDescription, tags, ...(payload_schema !== undefined ? { payload_schema } : {}) },\n { onSuccess: () => { setEditing(false); refetch(); } },\n );\n };\n\n const handleDelete = () => {\n if (confirm(`Delete topic \"${topic.topic}\"?\\n\\nThis removes it from the catalog. Active subscriptions are not affected.`)) {\n deleteMutation.mutate(topic.topic, { onSuccess: () => navigate('/topics') });\n }\n };\n\n return (\n <div className=\"max-w-3xl\">\n {/* Header */}\n <div className=\"flex items-start justify-between mb-6\">\n <div>\n <div className=\"flex items-center gap-3 mb-2\">\n <Radio className=\"w-5 h-5 text-accent\" strokeWidth={1.5} />\n <h1 className=\"text-lg font-mono font-medium text-text-primary\">{topic.topic}</h1>\n <button onClick={() => { window.location.hash = '#docs:topics.md'; }} className=\"text-text-quaternary hover:text-accent transition-colors\" title=\"Topic docs\">\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className={`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${categoryPillCls}`}>{topic.category}</span>\n <span className=\"text-[10px] font-mono text-text-quaternary\">source: {topic.source}</span>\n {topic.last_seen_at && (\n <span className=\"text-[10px] text-text-quaternary\">last seen <DateValue date={topic.last_seen_at} /></span>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/topics/by-name/${encodeURIComponent(topic.topic)}`}\n />\n {!editing && (\n <button\n onClick={() => {\n const payload = topic.example_payload\n ? JSON.stringify(topic.example_payload, null, 2)\n : topic.payload_schema?.properties\n ? JSON.stringify(Object.fromEntries(Object.keys(topic.payload_schema.properties).map(k => [k, ''])), null, 2)\n : '{}';\n setPublishPayload(payload);\n setPublishing(!publishing);\n }}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${publishing ? 'bg-accent/10 text-accent' : 'text-text-tertiary hover:text-accent hover:bg-surface-hover'}`}\n >\n <Send className=\"w-3 h-3\" /> Publish\n </button>\n )}\n {!editing && editable && (\n <>\n <button onClick={startEdit} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\">\n <Pencil className=\"w-3 h-3\" /> Edit\n </button>\n {!isSystem && (\n <button onClick={handleDelete} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors\">\n <Trash2 className=\"w-3 h-3\" /> Delete\n </button>\n )}\n </>\n )}\n {editing && (\n <>\n <button onClick={saveEdit} disabled={updateMutation.isPending} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\">\n <Save className=\"w-3 h-3\" /> Save\n </button>\n <button onClick={cancelEdit} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-text-tertiary hover:text-text-primary hover:bg-surface-hover transition-colors\">\n <X className=\"w-3 h-3\" /> Cancel\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Publish panel */}\n {publishing && (\n <div className=\"mb-6 bg-surface-sunken/50 rounded-md p-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-accent/60 mb-2\">Publish test event</p>\n <textarea\n value={publishPayload}\n onChange={(e) => setPublishPayload(e.target.value)}\n className=\"input-json w-full text-xs\"\n rows={6}\n spellCheck={false}\n placeholder='{ \"key\": \"value\" }'\n />\n <div className=\"flex items-center gap-3 mt-3\">\n <button\n onClick={() => {\n try {\n const data = JSON.parse(publishPayload);\n publishMutation.mutate({ topic: topic.topic, data }, {\n onSuccess: () => setPublishing(false),\n });\n } catch { /* invalid JSON */ }\n }}\n disabled={publishMutation.isPending}\n className=\"btn-primary text-xs\"\n >\n {publishMutation.isPending ? 'Publishing...' : 'Publish'}\n </button>\n <button onClick={() => setPublishing(false)} className=\"text-xs text-text-tertiary hover:text-text-primary\">Cancel</button>\n {publishMutation.isSuccess && <span className=\"text-xs text-status-success\">Published</span>}\n {publishMutation.isError && <span className=\"text-xs text-status-error\">{publishMutation.error.message}</span>}\n </div>\n </div>\n )}\n\n {/* Description */}\n <div className=\"mb-8\">\n {editing ? (\n <div>\n <label className=\"section-header\">Description</label>\n <textarea\n value={editDescription}\n onChange={(e) => setEditDescription(e.target.value)}\n rows={3}\n className=\"input resize-none\"\n placeholder=\"What this topic represents\"\n />\n </div>\n ) : (\n topic.description\n ? <p className=\"text-sm text-text-secondary leading-relaxed\">{topic.description}</p>\n : <p className=\"text-sm text-text-quaternary italic\">No description</p>\n )}\n </div>\n\n {/* Tags */}\n <div className=\"mb-8\">\n {editing ? (\n <div>\n <label className=\"section-header\">Tags</label>\n <input\n type=\"text\"\n value={editTags}\n onChange={(e) => setEditTags(e.target.value)}\n placeholder=\"lifecycle, core, error\"\n className=\"input font-mono\"\n />\n <p className=\"hint\">Comma-separated. Used for filtering in the catalog.</p>\n </div>\n ) : topic.tags?.length > 0 ? (\n <div className=\"flex items-center gap-2\">\n <Tag className=\"w-3 h-3 text-text-quaternary\" strokeWidth={1.5} />\n {topic.tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center px-2 py-0.5 rounded text-[10px] font-mono text-text-tertiary bg-surface-sunken\">\n {tag}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n\n {/* Payload Schema */}\n <div className=\"mb-8\">\n {editing ? (\n <div>\n <label className=\"section-header\">Payload Schema</label>\n <textarea\n value={editSchema}\n onChange={(e) => { setEditSchema(e.target.value); setSchemaError(''); }}\n rows={12}\n className=\"input-json w-full\"\n placeholder={'{\\n \"type\": \"object\",\\n \"properties\": {\\n \"orderId\": { \"type\": \"string\" }\\n }\\n}'}\n />\n {schemaError && <p className=\"text-[10px] text-red-400 mt-1\">{schemaError}</p>}\n <p className=\"hint\">JSON Schema describing the event.data shape. Shown in subscription editor as field reference.</p>\n </div>\n ) : topic.payload_schema ? (\n <>\n <SectionHeader icon={Radio} color=\"text-accent\">Payload Schema</SectionHeader>\n <JsonViewer data={topic.payload_schema} />\n </>\n ) : (\n <>\n <SectionHeader icon={Radio} color=\"text-accent\">Payload Schema</SectionHeader>\n <p className=\"text-[11px] text-text-quaternary\">No schema defined. Click Edit to add one.</p>\n </>\n )}\n </div>\n\n {/* Example Payload */}\n {topic.example_payload && (\n <div className=\"mb-8\">\n <SectionHeader icon={Radio} color=\"text-cyan-400\">Example Payload</SectionHeader>\n <JsonViewer data={topic.example_payload} />\n </div>\n )}\n\n {/* Subscribers */}\n <div className=\"mb-8\">\n <SectionHeader icon={Bot} color=\"text-emerald-400\">\n Subscribers ({topic.subscribers?.length ?? 0})\n </SectionHeader>\n {topic.subscribers?.length ? (\n <div className=\"space-y-1\">\n {topic.subscribers.map((sub) => (\n <div key={sub.id} className=\"flex items-center justify-between py-2 px-3 rounded-md hover:bg-surface-hover transition-colors\">\n <button\n onClick={() => navigate(`/agents/${sub.agent_id}`)}\n className=\"flex items-center gap-2 text-left min-w-0\"\n >\n <Bot className=\"w-3 h-3 text-emerald-400 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-xs text-text-primary hover:text-accent transition-colors\">{sub.agent_name}</span>\n </button>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-[10px] font-mono text-text-quaternary\">{sub.topic}</span>\n <span className=\"text-[10px] text-text-tertiary\">{sub.reaction_type}</span>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-[11px] text-text-quaternary py-2\">No agents are subscribed to this topic.</p>\n )}\n </div>\n\n {/* Metadata */}\n <div className=\"text-[10px] text-text-quaternary space-y-1 pt-4 border-t border-surface-border\">\n <p>Created <DateValue date={topic.created_at} /></p>\n <p>Updated <DateValue date={topic.updated_at} /></p>\n </div>\n </div>\n );\n}\n"],"names":["CATEGORY_COLORS","SectionHeader","Icon","color","children","jsxs","jsx","TopicDetailPage","encodedTopic","useParams","topicKey","navigate","useNavigate","topic","isLoading","refetch","isFetching","useTopic","updateMutation","useUpdateTopic","deleteMutation","useDeleteTopic","publishMutation","usePublishTopic","editing","setEditing","useState","publishing","setPublishing","publishPayload","setPublishPayload","editDescription","setEditDescription","editTags","setEditTags","editSchema","setEditSchema","schemaError","setSchemaError","Radio","isSystem","editable","categoryPillCls","startEdit","cancelEdit","saveEdit","tags","t","payload_schema","handleDelete","BookOpen","DateValue","ListToolbar","payload","_a","k","Send","Fragment","Pencil","Trash2","Save","X","e","data","Tag","tag","JsonViewer","Bot","_b","_c","sub"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,a as b}from"./vendor-query-B2UbickB.js";import{a as S,g as L}from"./workflows-zFmmxc08.js";import{h as P}from"./useEventHooks-CrIe_Ulh.js";import{u as R}from"./useCollapsedSections-BU5HULGs.js";import{b as A,e as D}from"./tasks-DoCbLKz4.js";import{d as y,D as V,J as N,e as K}from"./index-BnB7G5bA.js";import{P as Q}from"./PageHeader-B4w-LDUF.js";import{C as k}from"./CollapsibleSection-Bv6ixURp.js";import{L as U}from"./ListToolbar-o8xSCSVv.js";import{S as _}from"./StatusBadge-XQlNFwmH.js";import{C as z}from"./CopyableId-DaT0ZRHg.js";import{L as f,e as B,u as H,c as J}from"./vendor-react-CXumBFUA.js";import{S as M}from"./SwimlaneTimeline-BzG8QxYs.js";import{E as O}from"./EventTable-C-HagWbs.js";import"./vendor-icons-5gSix3t2.js";import"./FilterBar-Ck4K4rzu.js";function u({label:t,value:a,mono:r,truncate:s,children:i}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:t}),i||e.jsx("p",{className:`text-xs text-text-primary ${r?"font-mono":""} ${s?"truncate":""}`,title:s?a:void 0,children:a})]})}function F(t){const a=t.lastIndexOf("-");return a<=0?{taskQueue:t,workflowType:t}:{taskQueue:t.substring(0,a),workflowType:t.substring(a+1)}}function q({execution:t,task:a,escalations:r}){const s=t.parent_workflow_id,n=a&&a.workflow_id===t.workflow_id?a.parent_workflow_id:null,d=s||n||null,c=d&&d!==t.workflow_id?d:null,{taskQueue:p,workflowType:o}=F(t.workflow_type);return e.jsxs("div",{className:"bg-surface-sunken/50 rounded-md px-6 py-5 mb-6",children:[e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-y-4 gap-x-8",children:[e.jsx(z,{label:"Workflow Type",value:o,href:`/workflows/executions?entity=${encodeURIComponent(o)}`}),e.jsx(u,{label:"Task Queue",value:p,mono:!0}),e.jsx(u,{label:"Start Time",children:t.start_time?e.jsx(y,{date:t.start_time,format:"datetime",className:"text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})}),e.jsx(u,{label:"End Time",children:t.close_time?e.jsx(y,{date:t.close_time,format:"datetime",className:"text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})}),e.jsx(u,{label:"Duration",children:e.jsx(V,{ms:t.duration_ms,className:"font-mono text-text-primary"})}),e.jsx(u,{label:"History Size",value:`${t.summary.total_events} events`}),e.jsx(u,{label:"Activities",value:`${t.summary.activities.completed} / ${t.summary.activities.total}`}),e.jsx(u,{label:"Workflow ID",value:t.workflow_id,mono:!0,truncate:!0})]}),(c||r&&r.length>0)&&e.jsxs("div",{className:"mt-5 pt-4 border-t border-surface-border/50 space-y-3",children:[c&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary shrink-0",children:"Parent"}),e.jsx(f,{to:`/workflows/executions/${c}`,className:"text-xs font-mono text-accent hover:underline truncate",title:c,children:c})]}),!1,r&&r.length>0&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary shrink-0 mt-0.5",children:r.length===1?"Escalation":"Escalations"}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1",children:r.map(m=>e.jsxs(f,{to:`/escalations/detail/${m.id}`,className:"inline-flex items-center gap-1.5 text-xs font-mono text-accent hover:underline",children:[e.jsx("span",{children:m.type}),e.jsx(_,{status:m.status})]},m.id))})]})]})]})}function Z(t){var s;const a=t.events.find(i=>i.event_type==="workflow_execution_started"),r=(s=a==null?void 0:a.attributes)==null?void 0:s.input;return r&&typeof r=="object"?r:null}function G({execution:t}){const a=Z(t),r=t.result,s=(r==null?void 0:r.data)??r??null;return!a&&!s?null:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[a!==null&&e.jsx("div",{children:e.jsx(N,{data:a,label:"Input Envelope"})}),s!==null&&e.jsx("div",{children:e.jsx(N,{data:s,label:"Result"})})]})}function X({isRunning:t,hasToolCalls:a,workflowId:r,onAction:s}){const[i,n]=b.useState(!1),d=b.useRef(null);return b.useEffect(()=>{if(!i)return;const c=p=>{d.current&&!d.current.contains(p.target)&&n(!1)};return document.addEventListener("mousedown",c),()=>document.removeEventListener("mousedown",c)},[i]),e.jsxs("div",{className:"relative",ref:d,children:[e.jsx("button",{onClick:()=>n(!i),className:"btn-primary text-xs",children:"Actions"}),i&&e.jsxs("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-10",children:[e.jsx("button",{onClick:()=>{s("restart"),n(!1)},className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",children:"Restart Workflow"}),t&&e.jsx("button",{onClick:()=>{s("terminate"),n(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"}),a&&e.jsx(f,{to:`/mcp/queries/${r}?step=3`,className:"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover",onClick:()=>n(!1),children:"Compile into Pipeline"}),e.jsx(f,{to:`/mcp/executions/${encodeURIComponent(r)}?namespace=durable`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>n(!1),children:"View Raw Execution"})]})]})}function fe(){const{workflowId:t}=B(),{pathname:a}=H();P(t);const r=(a.startsWith("/workflows/durable/"),"Durable Execution"),{data:s,isLoading:i,error:n,refetch:d,isFetching:c}=S(t),{data:p}=A(t),{data:o}=D(t),{data:m}=K(t),E=J(),h=L(),{isCollapsed:w,toggle:v}=R("workflow-execution"),T=x=>{var l;if(x==="terminate")confirm("Are you sure you want to terminate this workflow?")&&h.mutate(t);else if(x==="restart"&&s){const W=s.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/,""),j=s.events.find($=>$.event_type==="workflow_execution_started"),g=(l=j==null?void 0:j.attributes)==null?void 0:l.input;g&&sessionStorage.setItem("lt:invoke:prefill",JSON.stringify(g)),E(`/workflows/start?type=${encodeURIComponent(W)}&mode=now`)}};if(i)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(n||!s){const x=(n==null?void 0:n.message)??"",l=x.includes("expired")||x.includes("no longer available");return e.jsxs("div",{children:[e.jsx(f,{to:"/workflows/executions",className:"text-xs text-text-tertiary hover:text-text-primary",children:"← Workflows"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:l?"Execution data is no longer available":n?"Unable to load execution":"Execution not found"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:l?"This workflow's underlying job has expired. The task record is preserved, but the execution timeline has been cleaned up.":x||"The workflow could not be resolved."})]})]})}const C=s.status!=="completed"&&s.status!=="failed",I=s.status==="completed"&&s.events.some(x=>{if(x.event_type!=="activity_task_completed")return!1;const l=x.attributes.activity_type;return l==="callDbTool"||l==="callVisionTool"||l==="callMcpTool"||(l==null?void 0:l.startsWith("mcp_"))});return e.jsxs("div",{children:[e.jsx(Q,{title:r,actions:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(U,{onRefresh:()=>d(),isFetching:c,apiPath:`/workflow-states/${t}/execution`}),e.jsx(_,{status:s.status}),e.jsx(X,{isRunning:C,hasToolCalls:I,workflowId:t,onAction:T})]})}),e.jsx(q,{execution:s,task:p,childTasks:o==null?void 0:o.tasks,escalations:m==null?void 0:m.escalations}),h.error&&e.jsx("div",{className:"py-3 mb-6",children:e.jsxs("p",{className:"text-xs text-status-error",children:["Terminate failed: ",h.error.message]})}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(k,{title:"Details",sectionKey:"details",isCollapsed:w("details"),onToggle:v,contentClassName:"mt-4 ml-9",children:e.jsx(G,{execution:s})}),e.jsx(k,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:w("timeline"),onToggle:v,contentClassName:"mt-4 ml-9",children:e.jsx(M,{events:s.events,childTasks:o==null?void 0:o.tasks})}),e.jsx(k,{title:"Events",sectionKey:"events",isCollapsed:w("events"),onToggle:v,contentClassName:"mt-4 ml-9",children:e.jsx(O,{events:s.events,childTasks:o==null?void 0:o.tasks})})]})]})}export{fe as WorkflowExecutionPage};
|
|
2
|
-
//# sourceMappingURL=WorkflowExecutionPage-B6mBqWq6.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowExecutionPage-B6mBqWq6.js","sources":["../../src/pages/workflows/workflow-execution/ExecutionHeader.tsx","../../src/pages/workflows/workflow-execution/ExecutionInputResult.tsx","../../src/pages/workflows/WorkflowExecutionPage.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { CopyableId } from '../../../components/common/display/CopyableId';\nimport type { WorkflowExecution, LTTaskRecord, LTEscalationRecord } from '../../../api/types';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\n\nfunction MetadataField({\n label,\n value,\n mono,\n truncate,\n children,\n}: {\n label: string;\n value?: string;\n mono?: boolean;\n truncate?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {label}\n </p>\n {children || (\n <p\n className={`text-xs text-text-primary ${mono ? 'font-mono' : ''} ${truncate ? 'truncate' : ''}`}\n title={truncate ? value : undefined}\n >\n {value}\n </p>\n )}\n </div>\n );\n}\n\n/**\n * Split a HotMesh compound entity key (taskQueue-workflowName) on the last '-'.\n * Workflow names are camelCase, so the last segment is always the workflow type.\n */\nfunction splitEntityKey(compound: string): { taskQueue: string; workflowType: string } {\n const lastDash = compound.lastIndexOf('-');\n if (lastDash <= 0) return { taskQueue: compound, workflowType: compound };\n return {\n taskQueue: compound.substring(0, lastDash),\n workflowType: compound.substring(lastDash + 1),\n };\n}\n\ninterface ExecutionHeaderProps {\n execution: WorkflowExecution;\n task?: LTTaskRecord | null;\n childTasks?: LTTaskRecord[];\n escalations?: LTEscalationRecord[];\n}\n\nexport function ExecutionHeader({ execution, task, escalations }: ExecutionHeaderProps) {\n // Determine parent relationship — prefer execution-level pj (from HotMesh\n // raw state), fall back to lt_tasks record. When the SDK adds\n // parent_workflow_id natively, it flows through automatically.\n const executionParent = (execution as any).parent_workflow_id as string | undefined;\n const isLeaf = task && task.workflow_id === execution.workflow_id;\n const taskParent = isLeaf ? task.parent_workflow_id : null;\n const rawParent = executionParent || taskParent || null;\n // Filter self-references — cron-invoked workflows store themselves as parent\n const parentWorkflowId = rawParent && rawParent !== execution.workflow_id ? rawParent : null;\n\n // Split compound HotMesh keys into separate task queue / workflow type\n const { taskQueue, workflowType } = splitEntityKey(execution.workflow_type);\n\n return (\n <div className=\"bg-surface-sunken/50 rounded-md px-6 py-5 mb-6\">\n\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-y-4 gap-x-8\">\n <CopyableId label=\"Workflow Type\" value={workflowType} href={`/workflows/executions?entity=${encodeURIComponent(workflowType)}`} />\n <MetadataField label=\"Task Queue\" value={taskQueue} mono />\n <MetadataField label=\"Start Time\">\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" className=\"text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </MetadataField>\n <MetadataField label=\"End Time\">\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" className=\"text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </MetadataField>\n <MetadataField label=\"Duration\">\n <DurationValue ms={execution.duration_ms} className=\"font-mono text-text-primary\" />\n </MetadataField>\n <MetadataField\n label=\"History Size\"\n value={`${execution.summary.total_events} events`}\n />\n <MetadataField\n label=\"Activities\"\n value={`${execution.summary.activities.completed} / ${execution.summary.activities.total}`}\n />\n <MetadataField\n label=\"Workflow ID\"\n value={execution.workflow_id}\n mono\n truncate\n />\n </div>\n\n {/* Related links */}\n {(parentWorkflowId || (escalations && escalations.length > 0)) && (\n <div className=\"mt-5 pt-4 border-t border-surface-border/50 space-y-3\">\n {/* Parent navigation */}\n {parentWorkflowId && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary shrink-0\">\n Parent\n </span>\n <Link\n to={`/workflows/executions/${parentWorkflowId}`}\n className=\"text-xs font-mono text-accent hover:underline truncate\"\n title={parentWorkflowId}\n >\n {parentWorkflowId}\n </Link>\n </div>\n )}\n\n {/* Process link — deep-links to process list filtered by this workflow */}\n {false && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary shrink-0\">\n Process\n </span>\n <Link\n to={`/processes/all?search=${encodeURIComponent(execution.workflow_id)}`}\n className=\"text-xs font-mono text-accent hover:underline truncate\"\n >\n Find in Processes\n </Link>\n </div>\n )}\n\n {/* Escalation links */}\n {escalations && escalations.length > 0 && (\n <div className=\"flex items-start gap-2\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary shrink-0 mt-0.5\">\n {escalations.length === 1 ? 'Escalation' : 'Escalations'}\n </span>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1\">\n {escalations.map((esc) => (\n <Link\n key={esc.id}\n to={`/escalations/detail/${esc.id}`}\n className=\"inline-flex items-center gap-1.5 text-xs font-mono text-accent hover:underline\"\n >\n <span>{esc.type}</span>\n <StatusBadge status={esc.status} />\n </Link>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { WorkflowExecution } from '../../../api/types';\n\ninterface ExecutionInputResultProps {\n execution: WorkflowExecution;\n}\n\n/**\n * Extract the workflow input envelope from the workflow_execution_started event.\n * HotMesh 0.13.0+ includes the actual trigger arguments (the envelope passed\n * to startWorkflow) in the start event's `input` attribute.\n */\nfunction extractInput(execution: WorkflowExecution): Record<string, unknown> | null {\n const startEvent = execution.events.find(\n (e) => e.event_type === 'workflow_execution_started',\n );\n const input = (startEvent?.attributes as any)?.input;\n return input && typeof input === 'object' ? input : null;\n}\n\nexport function ExecutionInputResult({ execution }: ExecutionInputResultProps) {\n const input = extractInput(execution);\n\n // Result: unwrap the workflow return — the `data` field is what LT users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n if (!input && !result) return null;\n\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6\">\n {input !== null && (\n <div>\n <JsonViewer data={input} label=\"Input Envelope\" />\n </div>\n )}\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { useParams, useLocation, useNavigate, Link } from 'react-router-dom';\nimport { useWorkflowExecution, useTerminateWorkflow } from '../../api/workflows';\nimport { useWorkflowDetailEvents } from '../../hooks/useEventHooks';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useTaskByWorkflowId, useChildTasks } from '../../api/tasks';\nimport { useEscalationsByWorkflowId } from '../../api/escalations';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\n\nimport { ExecutionHeader } from './workflow-execution/ExecutionHeader';\nimport { ExecutionInputResult } from './workflow-execution/ExecutionInputResult';\nimport { SwimlaneTimeline } from './workflow-execution/SwimlaneTimeline';\nimport { EventTable } from './workflow-execution/EventTable';\n\nfunction ActionsDropdown({ isRunning, hasToolCalls, workflowId, onAction }: {\n isRunning: boolean;\n hasToolCalls: boolean;\n workflowId: string;\n onAction: (action: 'restart' | 'terminate') => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n return (\n <div className=\"relative\" ref={ref}>\n <button onClick={() => setOpen(!open)} className=\"btn-primary text-xs\">\n Actions\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-10\">\n <button\n onClick={() => { onAction('restart'); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n >\n Restart Workflow\n </button>\n {isRunning && (\n <button\n onClick={() => { onAction('terminate'); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n )}\n {hasToolCalls && (\n <Link\n to={`/mcp/queries/${workflowId}?step=3`}\n className=\"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Compile into Pipeline\n </Link>\n )}\n <Link\n to={`/mcp/executions/${encodeURIComponent(workflowId)}?namespace=durable`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n View Raw Execution\n </Link>\n </div>\n )}\n </div>\n );\n}\n\nexport function WorkflowExecutionPage() {\n const { workflowId } = useParams<{ workflowId: string }>();\n const { pathname } = useLocation();\n useWorkflowDetailEvents(workflowId);\n\n const executionTitle = pathname.startsWith('/workflows/durable/')\n ? 'Durable Execution'\n : 'Durable Execution';\n const { data: execution, isLoading, error, refetch, isFetching } = useWorkflowExecution(workflowId!);\n const { data: task } = useTaskByWorkflowId(workflowId!);\n const { data: childTasksData } = useChildTasks(workflowId!);\n const { data: escalationsData } = useEscalationsByWorkflowId(workflowId);\n const navigate = useNavigate();\n const terminateMutation = useTerminateWorkflow();\n const { isCollapsed, toggle } = useCollapsedSections('workflow-execution');\n\n const handleAction = (action: 'restart' | 'terminate') => {\n if (action === 'terminate') {\n if (confirm('Are you sure you want to terminate this workflow?')) {\n terminateMutation.mutate(workflowId!);\n }\n } else if (action === 'restart' && execution) {\n // Extract entity from workflow_id (format: {entity}-{guid})\n const entity = execution.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/, '');\n // Extract original input from the started event\n const startEvent = execution.events.find((e) => e.event_type === 'workflow_execution_started');\n const input = (startEvent?.attributes as any)?.input;\n if (input) {\n sessionStorage.setItem('lt:invoke:prefill', JSON.stringify(input));\n }\n navigate(`/workflows/start?type=${encodeURIComponent(entity)}&mode=now`);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n const msg = (error as Error)?.message ?? '';\n const isExpired = msg.includes('expired') || msg.includes('no longer available');\n\n return (\n <div>\n <Link to=\"/workflows/executions\" className=\"text-xs text-text-tertiary hover:text-text-primary\">\n ← Workflows\n </Link>\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {isExpired\n ? 'Execution data is no longer available'\n : error\n ? 'Unable to load execution'\n : 'Execution not found'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {isExpired\n ? \"This workflow's underlying job has expired. The task record is preserved, but the execution timeline has been cleaned up.\"\n : msg || 'The workflow could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const isRunning = execution.status !== 'completed' && execution.status !== 'failed';\n const hasToolCalls = execution.status === 'completed' && execution.events.some(\n (e) => {\n if (e.event_type !== 'activity_task_completed') return false;\n const actType = (e.attributes as any).activity_type;\n return actType === 'callDbTool' || actType === 'callVisionTool' || actType === 'callMcpTool' || actType?.startsWith('mcp_');\n },\n );\n\n return (\n <div>\n <PageHeader\n title={executionTitle}\n actions={\n <div className=\"flex items-center gap-3\">\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/${workflowId}/execution`}\n />\n <StatusBadge status={execution.status} />\n <ActionsDropdown\n isRunning={isRunning}\n hasToolCalls={hasToolCalls}\n workflowId={workflowId!}\n onAction={handleAction}\n />\n </div>\n }\n />\n\n <ExecutionHeader\n execution={execution}\n task={task}\n childTasks={childTasksData?.tasks}\n escalations={escalationsData?.escalations}\n />\n\n {terminateMutation.error && (\n <div className=\"py-3 mb-6\">\n <p className=\"text-xs text-status-error\">\n Terminate failed: {terminateMutation.error.message}\n </p>\n </div>\n )}\n\n\n <div className=\"space-y-6\">\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <ExecutionInputResult execution={execution} />\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <SwimlaneTimeline\n events={execution.events}\n childTasks={childTasksData?.tasks}\n />\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <EventTable\n events={execution.events}\n childTasks={childTasksData?.tasks}\n />\n </CollapsibleSection>\n </div>\n </div>\n );\n}\n"],"names":["MetadataField","label","value","mono","truncate","children","jsx","splitEntityKey","compound","lastDash","ExecutionHeader","execution","task","escalations","executionParent","taskParent","rawParent","parentWorkflowId","taskQueue","workflowType","jsxs","CopyableId","DateValue","DurationValue","Link","esc","StatusBadge","extractInput","startEvent","e","input","_a","ExecutionInputResult","rawResult","result","JsonViewer","ActionsDropdown","isRunning","hasToolCalls","workflowId","onAction","open","setOpen","useState","ref","useRef","useEffect","handler","WorkflowExecutionPage","useParams","pathname","useLocation","useWorkflowDetailEvents","executionTitle","isLoading","error","refetch","isFetching","useWorkflowExecution","useTaskByWorkflowId","childTasksData","useChildTasks","escalationsData","useEscalationsByWorkflowId","navigate","useNavigate","terminateMutation","useTerminateWorkflow","isCollapsed","toggle","useCollapsedSections","handleAction","action","entity","msg","isExpired","actType","PageHeader","ListToolbar","CollapsibleSection","SwimlaneTimeline","EventTable"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as n}from"./vendor-query-B2UbickB.js";import{c as d,Z as u,W as f,S as m,ab as h}from"./vendor-icons-5gSix3t2.js";const s=[{text:"text-rose-400",bg:"bg-rose-400/[0.08]"},{text:"text-pink-400",bg:"bg-pink-400/[0.08]"},{text:"text-fuchsia-400",bg:"bg-fuchsia-400/[0.08]"},{text:"text-purple-400",bg:"bg-purple-400/[0.08]"},{text:"text-violet-400",bg:"bg-violet-400/[0.08]"},{text:"text-indigo-400",bg:"bg-indigo-400/[0.08]"},{text:"text-blue-400",bg:"bg-blue-400/[0.08]"},{text:"text-sky-400",bg:"bg-sky-400/[0.08]"},{text:"text-cyan-400",bg:"bg-cyan-400/[0.08]"},{text:"text-teal-400",bg:"bg-teal-400/[0.08]"},{text:"text-emerald-400",bg:"bg-emerald-400/[0.08]"},{text:"text-green-400",bg:"bg-green-400/[0.08]"},{text:"text-lime-400",bg:"bg-lime-400/[0.08]"},{text:"text-yellow-400",bg:"bg-yellow-400/[0.08]"},{text:"text-amber-400",bg:"bg-amber-400/[0.08]"},{text:"text-orange-400",bg:"bg-orange-400/[0.08]"},{text:"text-red-400",bg:"bg-red-400/[0.08]"},{text:"text-stone-400",bg:"bg-stone-400/[0.08]"},{text:"text-rose-300",bg:"bg-rose-300/[0.08]"},{text:"text-violet-300",bg:"bg-violet-300/[0.08]"},{text:"text-sky-300",bg:"bg-sky-300/[0.08]"},{text:"text-teal-300",bg:"bg-teal-300/[0.08]"},{text:"text-amber-300",bg:"bg-amber-300/[0.08]"},{text:"text-pink-300",bg:"bg-pink-300/[0.08]"}];function y(e){let t=0;for(let x=0;x<e.length;x++)t=(t<<5)-t+e.charCodeAt(x)|0;return Math.abs(t)}function k(e){return s[y(e)%s.length]}const C={certified:h,configured:m,pipeline:f,capability:u,durable:d},w={certified:"text-status-success",configured:"text-status-info"};function N({type:e,size:t="sm",certified:x,variant:r}){const a=t==="md"?"px-2.5 py-0.5 gap-1.5":t==="xs"?"px-1 py-px gap-0.5":"px-1.5 py-px gap-1",l=t==="md"?"13px":t==="xs"?"9px":"11px",i=t==="md"?"w-3.5 h-3.5":t==="xs"?"w-2 h-2":"w-2.5 h-2.5",o=r??(x?"certified":"durable"),c=C[o],b=w[o],g=b?null:k(e),p=b||((g==null?void 0:g.text)??"text-accent/75");return n.jsxs("span",{className:`inline-flex items-center ${a} font-mono text-text-secondary border border-surface-border rounded-lg`,style:{fontSize:l,lineHeight:1.1},children:[n.jsx(c,{className:`${i} shrink-0 ${p}`}),e]})}export{N as W};
|
|
2
|
-
//# sourceMappingURL=WorkflowPill-BkfIn8N3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowPill-BkfIn8N3.js","sources":["../../src/lib/type-color.ts","../../src/components/common/display/WorkflowPill.tsx"],"sourcesContent":["/**\n * Deterministic color assignment for workflow type names.\n *\n * Maps any string to a consistent color from a curated 24-color palette.\n * The same type name always produces the same color across the entire UI.\n * Uses a simple hash to distribute names evenly across the palette.\n *\n * Each entry provides:\n * text — icon and text color (Tailwind class)\n * bg — subtle background tint (Tailwind class)\n */\n\nconst PALETTE: Array<{ text: string; bg: string }> = [\n { text: 'text-rose-400', bg: 'bg-rose-400/[0.08]' },\n { text: 'text-pink-400', bg: 'bg-pink-400/[0.08]' },\n { text: 'text-fuchsia-400', bg: 'bg-fuchsia-400/[0.08]' },\n { text: 'text-purple-400', bg: 'bg-purple-400/[0.08]' },\n { text: 'text-violet-400', bg: 'bg-violet-400/[0.08]' },\n { text: 'text-indigo-400', bg: 'bg-indigo-400/[0.08]' },\n { text: 'text-blue-400', bg: 'bg-blue-400/[0.08]' },\n { text: 'text-sky-400', bg: 'bg-sky-400/[0.08]' },\n { text: 'text-cyan-400', bg: 'bg-cyan-400/[0.08]' },\n { text: 'text-teal-400', bg: 'bg-teal-400/[0.08]' },\n { text: 'text-emerald-400', bg: 'bg-emerald-400/[0.08]' },\n { text: 'text-green-400', bg: 'bg-green-400/[0.08]' },\n { text: 'text-lime-400', bg: 'bg-lime-400/[0.08]' },\n { text: 'text-yellow-400', bg: 'bg-yellow-400/[0.08]' },\n { text: 'text-amber-400', bg: 'bg-amber-400/[0.08]' },\n { text: 'text-orange-400', bg: 'bg-orange-400/[0.08]' },\n { text: 'text-red-400', bg: 'bg-red-400/[0.08]' },\n { text: 'text-stone-400', bg: 'bg-stone-400/[0.08]' },\n { text: 'text-rose-300', bg: 'bg-rose-300/[0.08]' },\n { text: 'text-violet-300', bg: 'bg-violet-300/[0.08]' },\n { text: 'text-sky-300', bg: 'bg-sky-300/[0.08]' },\n { text: 'text-teal-300', bg: 'bg-teal-300/[0.08]' },\n { text: 'text-amber-300', bg: 'bg-amber-300/[0.08]' },\n { text: 'text-pink-300', bg: 'bg-pink-300/[0.08]' },\n];\n\nfunction hash(str: string): number {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n h = ((h << 5) - h + str.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\nexport function typeColor(typeName: string): { text: string; bg: string } {\n return PALETTE[hash(typeName) % PALETTE.length];\n}\n","import { Workflow, ShieldCheck, Settings, Wand2, Zap } from 'lucide-react';\nimport { typeColor } from '../../../lib/type-color';\n\ntype WorkflowVariant = 'durable' | 'configured' | 'certified' | 'pipeline' | 'capability';\n\ninterface WorkflowPillProps {\n type: string;\n size?: 'xs' | 'sm' | 'md';\n /** @deprecated Use `variant` instead */\n certified?: boolean;\n variant?: WorkflowVariant;\n}\n\nconst VARIANT_ICON: Record<WorkflowVariant, typeof Workflow> = {\n certified: ShieldCheck,\n configured: Settings,\n pipeline: Wand2,\n capability: Zap,\n durable: Workflow,\n};\n\nconst VARIANT_FIXED_COLOR: Record<string, string> = {\n certified: 'text-status-success',\n configured: 'text-status-info',\n};\n\nexport function WorkflowPill({ type, size = 'sm', certified, variant }: WorkflowPillProps) {\n const sizeClass = size === 'md'\n ? 'px-2.5 py-0.5 gap-1.5'\n : size === 'xs'\n ? 'px-1 py-px gap-0.5'\n : 'px-1.5 py-px gap-1';\n const fontSize = size === 'md' ? '13px' : size === 'xs' ? '9px' : '11px';\n const iconClass = size === 'md' ? 'w-3.5 h-3.5' : size === 'xs' ? 'w-2 h-2' : 'w-2.5 h-2.5';\n\n const resolved = variant ?? (certified ? 'certified' : 'durable');\n const Icon = VARIANT_ICON[resolved];\n\n // Pipeline and durable variants get a type-name-derived color.\n // Certified and configured keep their fixed semantic colors.\n const fixedColor = VARIANT_FIXED_COLOR[resolved];\n const derived = fixedColor ? null : typeColor(type);\n const iconColor = fixedColor || (derived?.text ?? 'text-accent/75');\n\n return (\n <span className={`inline-flex items-center ${sizeClass} font-mono text-text-secondary border border-surface-border rounded-lg`} style={{ fontSize, lineHeight: 1.1 }}>\n <Icon className={`${iconClass} shrink-0 ${iconColor}`} />\n {type}\n </span>\n );\n}\n"],"names":["PALETTE","hash","str","h","i","typeColor","typeName","VARIANT_ICON","ShieldCheck","Settings","Wand2","Zap","Workflow","VARIANT_FIXED_COLOR","WorkflowPill","type","size","certified","variant","sizeClass","fontSize","iconClass","resolved","Icon","fixedColor","derived","iconColor","jsxs","jsx"],"mappings":"2HAYA,MAAMA,EAA+C,CACnD,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,mBAAqB,GAAI,uBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,eAAqB,GAAI,mBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,mBAAqB,GAAI,uBAAA,EACjC,CAAE,KAAM,iBAAqB,GAAI,qBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,iBAAqB,GAAI,qBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,eAAqB,GAAI,mBAAA,EACjC,CAAE,KAAM,iBAAqB,GAAI,qBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,eAAqB,GAAI,mBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,iBAAqB,GAAI,qBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,CACnC,EAEA,SAASC,EAAKC,EAAqB,CACjC,IAAIC,EAAI,EACR,QAASC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAC9BD,GAAMA,GAAK,GAAKA,EAAID,EAAI,WAAWE,CAAC,EAAK,EAE3C,OAAO,KAAK,IAAID,CAAC,CACnB,CAEO,SAASE,EAAUC,EAAgD,CACxE,OAAON,EAAQC,EAAKK,CAAQ,EAAIN,EAAQ,MAAM,CAChD,CCpCA,MAAMO,EAAyD,CAC7D,UAAYC,EACZ,WAAYC,EACZ,SAAYC,EACZ,WAAYC,EACZ,QAAYC,CACd,EAEMC,EAA8C,CAClD,UAAY,sBACZ,WAAY,kBACd,EAEO,SAASC,EAAa,CAAE,KAAAC,EAAM,KAAAC,EAAO,KAAM,UAAAC,EAAW,QAAAC,GAA8B,CACzF,MAAMC,EAAYH,IAAS,KACvB,wBACAA,IAAS,KACP,qBACA,qBACAI,EAAWJ,IAAS,KAAO,OAASA,IAAS,KAAO,MAAQ,OAC5DK,EAAYL,IAAS,KAAO,cAAgBA,IAAS,KAAO,UAAY,cAExEM,EAAWJ,IAAYD,EAAY,YAAc,WACjDM,EAAOhB,EAAae,CAAQ,EAI5BE,EAAaX,EAAoBS,CAAQ,EACzCG,EAAUD,EAAa,KAAOnB,EAAUU,CAAI,EAC5CW,EAAYF,KAAeC,GAAA,YAAAA,EAAS,OAAQ,kBAElD,OACEE,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BR,CAAS,yEAA0E,MAAO,CAAE,SAAAC,EAAU,WAAY,GAAA,EAC7J,SAAA,CAAAQ,MAACL,GAAK,UAAW,GAAGF,CAAS,aAAaK,CAAS,GAAI,EACtDX,CAAA,EACH,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsDashboard-nXLTR0OO.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-1.5 h-1.5 shrink-0 rounded-full mt-1.5 ${dotClass}${pulseClass}`} title={row.status} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} size=\"xs\" />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\n );\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: jobsData, isLoading, refetch, isFetching } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n registered: registeredFilter,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Durable Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:durable-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/jobs?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.search ? `&search=${filters.search}` : ''}${filters.status ? `&status=${filters.status}` : ''}${sort.sort_by ? `&sort_by=${sort.sort_by}&order=${sort.order}` : ''}`}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"8yBAoBA,MAAMA,EAAuC,CAC3C,QAAS,cACT,UAAW,YACX,OAAQ,QACV,EAEMC,EAAqC,CACzC,YAAa,mBACb,UAAW,oBACX,OAAQ,iBACV,EAEMC,EAAwC,CAC5C,QAAS,qBACT,UAAW,sBACX,OAAQ,mBACV,EAEA,SAASC,EACPC,EACAC,EACAC,EACAC,EACAC,EACiB,CACjB,MAAO,CACL,CACE,IAAK,cACL,MAAO,qBACP,OAASC,GAAQ,CACf,MAAMC,EAAWT,EAAWD,EAAaS,EAAI,MAAM,GAAKA,EAAI,MAAM,GAAK,oBACjEE,EAAaF,EAAI,SAAW,UAAY,iBAAmB,GACjE,OACEG,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAW,4CAA4CH,CAAQ,GAAGC,CAAU,GAAI,MAAOF,EAAI,MAAA,CAAQ,EACzGG,EAAAA,KAAC,MAAA,CAAI,UAAU,UACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,qDACb,SAAAJ,EAAI,YACP,QACC,MAAA,CAAI,UAAU,SACb,SAAAI,MAACC,EAAA,CAAa,KAAML,EAAI,OAAQ,QAASD,EAAQ,IAAIC,EAAI,MAAM,GAAK,UAAW,KAAK,KAAK,CAAA,CAC3F,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAAA,EAEF,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASM,EAAA,CAAc,KAAMN,EAAI,WAAY,EACtD,UAAW,OACX,SAAU,EAAA,EAEZ,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASM,EAAA,CAAc,KAAMN,EAAI,WAAY,EACtD,UAAW,OACX,SAAU,EAAA,EAEZ,CACE,IAAK,WACL,MAAO,WACP,OAASA,GACPI,EAAAA,IAACG,EAAA,CACC,UAAWP,EAAI,WACf,QAASA,EAAI,SAAW,UAAY,KAAOA,EAAI,WAC/C,OAAQA,EAAI,SAAW,SAAA,CAAA,EAG3B,UAAW,MAAA,EAEb,CACE,IAAK,UACL,MAAO,GACP,OAASA,GACPG,EAAAA,KAACK,EAAA,CACC,SAAA,CAAAJ,EAAAA,IAACK,EAAA,CACC,KAAMC,EACN,MAAO,aAAaV,EAAI,MAAM,GAC9B,QAAS,IAAML,EAAeK,EAAI,MAAM,CAAA,CAAA,EAE1CI,EAAAA,IAAC,SAAA,CACC,QAAUO,GAAM,CAAEA,EAAE,gBAAA,EAAmBf,EAAeI,EAAI,MAAM,CAAG,EACnE,UAAU,2DACV,MAAO,aAAaA,EAAI,MAAM,GAE9B,SAAAI,EAAAA,IAAC,OAAI,UAAW,qBAAqBX,EAAcO,EAAI,MAAM,GAAK,oBAAoB,oBAAqB,QAAQ,YAAY,KAAK,eAClI,eAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,GAAA,CAAI,CAAA,CAChC,CAAA,CAAA,EAEDH,GACCO,EAAAA,IAACK,EAAA,CACC,KAAMG,EACN,MAAM,cACN,QAAS,IAAMd,EAAS,uBAAuB,mBAAmBE,EAAI,MAAM,CAAC,EAAE,CAAA,CAAA,CACjF,EAEJ,EAEF,UAAW,iBAAA,CACb,CAEJ,CAEO,SAASa,GAAmB,CAAE,KAAMC,EAAc,OAAoC,CAC3FC,EAAA,EACA,MAAMjB,EAAWkB,EAAA,EACX,CAAE,aAAAnB,CAAA,EAAiBoB,EAAA,EAEnB,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACxE,QAAS,CAAE,OAAQ,GAAI,OAAQ,GAAI,OAAQ,GAAI,KAAMT,CAAA,CAAY,CAClE,EAEKU,EAAcN,EAAQ,MAAQ,MAG9BO,EAAmBD,IAAe,YAAc,OAClDA,IAAe,UAAY,QAC3B,OAEE,CAAE,KAAME,CAAA,EAAYC,EAAA,EACpB,CAAE,KAAMC,CAAA,EAAmBC,EAAA,EAE3B9B,EAAU+B,EAAAA,QAAQ,IAAM,CAC5B,MAAMC,MAAU,IAChB,UAAWC,KAAMJ,GAAkB,GACjCG,EAAI,IAAIC,EAAG,cAAeA,EAAG,MAAQ,SAAS,EAEhD,OAAOD,CACT,EAAG,CAACH,CAAc,CAAC,EAEbK,EAAUvC,EACbwC,GAAWf,EAAU,SAAUe,CAAM,EACrCC,GAAWhB,EAAU,SAAUgB,CAAM,EACtCtC,EACAC,EACAC,CAAA,EAEI,CAACqC,EAAaC,CAAc,EAAIC,EAAAA,SAASpB,EAAQ,MAAM,EAE7DqB,EAAAA,UAAU,IAAM,CACd,GAAIH,IAAgBlB,EAAQ,OAAQ,OACpC,MAAMsB,EAAQ,WAAW,IAAMrB,EAAU,SAAUiB,CAAW,EAAG,GAAG,EACpE,MAAO,IAAM,aAAaI,CAAK,CACjC,EAAG,CAACJ,EAAajB,EAAWD,EAAQ,MAAM,CAAC,EAE3C,KAAM,CAAE,KAAMuB,EAAU,UAAAC,EAAW,QAAAC,EAAS,WAAAC,CAAA,EAAeC,EAAQ,CACjE,MAAOzB,EAAW,SAClB,OAAQA,EAAW,OACnB,OAAQF,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,QAASG,EAAK,SAAW,OACzB,MAAOA,EAAK,QAAUA,EAAK,MAAQ,OACnC,WAAYI,CAAA,CACb,EAEKqB,GAAQL,GAAA,YAAAA,EAAU,QAAS,EAC3BM,GAAON,GAAA,YAAAA,EAAU,OAAQ,CAAA,EAEzBO,EAAWlB,EAAAA,QAAQ,IAChB,CAAC,GAAG,IAAI,KAAKJ,GAAW,CAAA,GAAI,IAAKuB,GAAMA,EAAE,aAAa,CAAC,CAAC,EAAE,KAAA,EAChE,CAACvB,CAAO,CAAC,EAENwB,EAAY,qBAEZC,EAAe3B,IAAe,YAChC,yCACAA,IAAe,UACb,uCACA,+BAEN,cACG,MAAA,CACC,SAAA,CAAApB,EAAAA,IAACgD,EAAA,CAAW,MAAOF,EAAW,SAAS,wCAAwC,EAE/E/C,OAACkD,GAAU,QACTjD,EAAAA,IAACkD,EAAA,CACC,UAAW,IAAMX,EAAA,EACjB,WAAAC,EACA,QAAS,+BAA+BxB,EAAW,QAAQ,WAAWA,EAAW,MAAM,GAAGF,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,GAAGA,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,GAAGA,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,GAAGG,EAAK,QAAU,YAAYA,EAAK,OAAO,UAAUA,EAAK,KAAK,GAAK,EAAE,EAAA,CAAA,EAG1T,SAAA,CAAAjB,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,YAAY,wBACZ,MAAOgC,EACP,SAAWzB,GAAM0B,EAAe1B,EAAE,OAAO,KAAK,EAC9C,UAAU,kCAAA,CAAA,EAEZP,EAAAA,IAACmD,EAAA,CACC,MAAM,OACN,MAAOrC,EAAQ,OACf,SAAWsC,GAAMrC,EAAU,SAAUqC,CAAC,EACtC,QAASR,EAAS,IAAKrC,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,CAAA,EAEvDP,EAAAA,IAACmD,EAAA,CACC,MAAM,SACN,MAAOrC,EAAQ,OACf,SAAWsC,GAAMrC,EAAU,SAAUqC,CAAC,EACtC,QAAS,CACP,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,SAAU,MAAO,QAAA,CAAS,CACrC,CAAA,EAEFpD,EAAAA,IAACmD,EAAA,CACC,MAAM,OACN,MAAOrC,EAAQ,OAAS,MAAQ,GAAKA,EAAQ,KAC7C,SAAWsC,GAAMrC,EAAU,OAAQqC,GAAK,KAAK,EAC7C,QAAS,CACP,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,UAAW,MAAO,SAAA,CAAU,CACvC,CAAA,CACF,EACF,EAEApD,EAAAA,IAACqD,EAAA,CACC,QAAAxB,EACA,KAAMc,EACN,MAAQ/C,GAAQA,EAAI,YACpB,WAAaA,GAAQF,EAAS,yBAAyBE,EAAI,WAAW,EAAE,EACxE,UAAA0C,EACA,aAAAS,EACA,KAAA9B,EACA,OAAQC,CAAA,CAAA,EAGVlB,EAAAA,IAACsD,EAAA,CACC,KAAMtC,EAAW,KACjB,WAAYA,EAAW,WAAW0B,CAAK,EACvC,aAAc1B,EAAW,QACzB,MAAA0B,EACA,SAAU1B,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{l as W,n as z,o as $,u as F}from"./yaml-workflows-VSax0tKa.js";import{a as q,d as Y}from"./useYamlActivityEvents-JzvzGsUR.js";import{u as B}from"./useFilterParams-x-Dg0Vgz.js";import{u as D}from"./useExpandedRows-CkcEntB-.js";import{P}from"./PageHeader-B4w-LDUF.js";import{F as V,a as H,b as O}from"./FilterBar-Ck4K4rzu.js";import{E as U}from"./EmptyState-BcsfPq9T.js";import{R as J}from"./RunAsSelector-DPXWgduq.js";import{b as A,T as G}from"./ToolPill-CcKNnnrK.js";import{X as L,a4 as X,ac as K,P as T,o as Q,ad as Z,a5 as ee,W as te}from"./vendor-icons-5gSix3t2.js";import{L as se,c as re}from"./vendor-react-CXumBFUA.js";import{S as w}from"./index-BnB7G5bA.js";import{d as M,C as ae}from"./helpers-B_PYr0pL.js";import{S as E}from"./StatusBadge-XQlNFwmH.js";import{S as ne}from"./ServerName-A6Wlv3vZ.js";import"./BotPicker-CAowL3ib.js";import"./bots-DOP_eck8.js";import"./TimeAgo-BLNstYO1.js";const I={mcp:{border:"border-blue-500",text:"text-blue-500",icon:"MCP"},db:{border:"border-blue-500",text:"text-blue-500",icon:"DB"},llm:{border:"border-violet-500",text:"text-violet-500",icon:"LLM"},transform:{border:"border-emerald-500",text:"text-emerald-500",icon:"Map"}};function oe({steps:t,manifest:i,isComplete:r}){const a=i.filter(s=>s.type==="worker"),u=a.length,o=a.map(s=>{const l=t.find(d=>d.activityId===s.activity_id),p=s.tool_source||"mcp",f=I[p]||I.mcp;return{activityId:s.activity_id,title:s.title||s.mcp_tool_name||s.activity_id,toolName:s.mcp_tool_name,colors:f,status:(l==null?void 0:l.status)||"pending",error:l==null?void 0:l.error}});return e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] text-text-secondary mb-3",children:r?`All ${u} steps completed`:`Running step ${o.filter(s=>s.status==="completed").length+1} of ${u}...`}),e.jsx("div",{className:"space-y-0",children:o.map((s,l)=>{const p=l===o.length-1;return e.jsxs("div",{className:"flex items-stretch gap-2",children:[e.jsxs("div",{className:"flex flex-col items-center w-4 shrink-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${s.status==="completed"?"bg-status-success border-status-success":s.status==="running"?`${s.colors.border} bg-transparent animate-pulse`:s.status==="failed"?"bg-status-error border-status-error":"bg-surface-sunken border-surface-border"}`}),!p&&e.jsx("span",{className:`w-px flex-1 transition-colors ${s.status==="completed"?"bg-status-success/30":"bg-surface-border"}`})]}),e.jsxs("div",{className:p?"":"pb-3",children:[e.jsx("p",{className:`text-[11px] font-medium ${s.status==="running"?"text-text-primary":s.status==="completed"?"text-text-secondary":s.status==="failed"?"text-status-error":"text-text-tertiary"}`,children:s.title}),s.toolName&&e.jsx("span",{className:"text-[9px] text-text-tertiary font-mono",children:s.toolName}),s.error&&e.jsx("p",{className:"text-[9px] text-status-error mt-0.5",children:s.error})]})]},s.activityId)})})]})}function ie({workflow:t,onClose:i}){const r=W(),[a,u]=x.useState(!1),[o,s]=x.useState({}),[l,p]=x.useState(""),[f,d]=x.useState(""),[m,j]=x.useState(""),[b,N]=x.useState(null),[v,y]=x.useState(null),{steps:k,isComplete:n}=q(b);x.useEffect(()=>{N(null),y(null),d(""),r.reset();const h=A(t.input_schema);s(h),p(JSON.stringify(h,null,2)),u(!1)},[t.id]),x.useEffect(()=>{if(n&&b){const h=b,g=setTimeout(()=>{y({jobId:h}),N(null)},800);return()=>clearTimeout(g)}},[n,b]);const c=()=>{if(!a)p(JSON.stringify(o,null,2));else try{s(JSON.parse(l))}catch{}u(!a)},S=async()=>{d(""),y(null);let h;if(a)try{h=JSON.parse(l)}catch{d("Invalid JSON");return}else h={...o};try{const g=await r.mutateAsync({id:t.id,data:h,sync:!1,...m?{execute_as:m}:{}});g.job_id&&N(g.job_id)}catch{}},_=!!b,R=t.app_id||"longtail";return e.jsxs("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary truncate",children:t.app_id}),e.jsx("code",{className:"text-[11px] font-mono text-accent truncate block",children:t.graph_topic})]}),e.jsx("button",{onClick:()=>{_||i()},className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsx(L,{className:"w-4 h-4"})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:_?e.jsx(oe,{steps:k,manifest:t.activity_manifest,isComplete:n}):v?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"})}),e.jsx("p",{className:"text-xs font-medium text-status-success",children:"Workflow completed"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(se,{to:`/mcp/executions/${encodeURIComponent(v.jobId)}?namespace=${encodeURIComponent(R)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(X,{size:12})," View execution"]}),e.jsxs("button",{onClick:()=>y(null),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(K,{size:12})," Run again"]})]})]}):e.jsxs(e.Fragment,{children:[e.jsx(J,{selected:m,onChange:j}),t.description&&e.jsx("p",{className:"text-[11px] text-text-secondary leading-relaxed",children:t.description}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Input"}),e.jsx("button",{onClick:c,className:"text-[10px] text-accent hover:underline",children:a?"Form view":"JSON view"})]}),a?e.jsx("textarea",{value:l,onChange:h=>p(h.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1}):e.jsxs("div",{className:"space-y-3 max-h-[300px] overflow-y-auto",children:[Object.entries(o).map(([h,g])=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:h}),typeof g=="boolean"?e.jsxs("select",{value:String(g),onChange:C=>s({...o,[h]:C.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):typeof g=="object"?e.jsx("textarea",{value:JSON.stringify(g,null,2),onChange:C=>{try{s({...o,[h]:JSON.parse(C.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"}):e.jsx("input",{type:typeof g=="number"?"number":"text",value:String(g??""),onChange:C=>s({...o,[h]:typeof g=="number"?Number(C.target.value):C.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"})]},h)),Object.keys(o).length===0&&e.jsx("p",{className:"text-[11px] text-text-tertiary italic",children:"No input fields defined"})]}),f&&e.jsx("p",{className:"text-[11px] text-status-error mt-1",children:f})]}),r.isError&&e.jsx("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsx("p",{className:"text-[11px] text-status-error",children:r.error instanceof Error?r.error.message:"Invocation failed"})}),e.jsx("button",{onClick:S,disabled:r.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:r.isPending?"Starting...":e.jsxs(e.Fragment,{children:[e.jsx(T,{size:12})," Run"]})})]})})]})}function ce({cronInput:t,setCronInput:i,setCron:r,hasCronSchedule:a,onSave:u,onClear:o}){return e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx(w,{className:"mb-3",children:"Schedule"}),e.jsxs("div",{className:"flex gap-3 items-start",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("input",{type:"text",value:t,onChange:s=>{i(s.target.value),r.reset()},placeholder:"0 */6 * * *",className:"input-json w-full"}),t.trim()&&M(t.trim())&&e.jsx("p",{className:"text-xs text-text-secondary mt-1.5",children:M(t.trim())})]}),e.jsx("button",{onClick:u,disabled:r.isPending,className:"btn-primary text-xs shrink-0",children:r.isPending?"Saving...":"Save"}),a&&e.jsx("button",{onClick:o,disabled:r.isPending,className:"btn-ghost text-xs text-status-error shrink-0",children:"Clear"})]}),r.isSuccess&&e.jsx("p",{className:"text-[10px] text-status-success mt-2",children:"Schedule updated"}),r.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-2",children:r.error.message})]}),e.jsxs("div",{className:"bg-surface-sunken rounded-lg p-4",children:[e.jsx(w,{className:"mb-2",children:"Common Patterns"}),e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5",children:ae.map(([s,l])=>e.jsxs("button",{type:"button",onClick:()=>{i(s),r.reset()},className:"flex items-center gap-2 text-left py-0.5 group",children:[e.jsx("code",{className:"font-mono text-[11px] text-accent group-hover:text-accent-hover",children:s}),e.jsx("span",{className:"text-[10px] text-text-tertiary",children:l})]},s))})]})]})}function le({workflow:t,onClose:i}){const r=z(),a=$(),[u,o]=x.useState(""),[s,l]=x.useState(""),[p,f]=x.useState(!1),[d,m]=x.useState({}),[j,b]=x.useState("{}");x.useEffect(()=>{o(t.cron_schedule??""),l(t.execute_as??""),r.reset(),a.reset();const n=t.cron_envelope||{},c=Object.keys(n).length>0?n:A(t.input_schema);m(c),b(JSON.stringify(c,null,2)),f(!1)},[t.id]);const N=()=>{if(!p)b(JSON.stringify(d,null,2));else try{m(JSON.parse(j))}catch{}f(!p)},v=()=>{let n;if(p)try{n=JSON.parse(j)}catch{return}else n={...d};r.mutate({id:t.id,cron_schedule:u.trim(),cron_envelope:Object.keys(n).length>0?n:null,execute_as:s||null})},y=()=>{a.mutate(t.id,{onSuccess:()=>{o("")}})},k={isPending:r.isPending||a.isPending,isSuccess:r.isSuccess||a.isSuccess,error:r.error||a.error,reset:()=>{r.reset(),a.reset()}};return e.jsxs("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary truncate",children:"Cron Schedule"}),e.jsx("code",{className:"text-[11px] font-mono text-accent truncate block",children:t.graph_topic})]}),e.jsx("button",{onClick:i,className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsx(L,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:[e.jsx(J,{selected:s,onChange:l}),e.jsx(ce,{cronInput:u,setCronInput:o,setCron:k,hasCronSchedule:!!t.cron_schedule,onSave:v,onClear:y}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx(w,{children:"Default Input"}),e.jsx("button",{onClick:N,className:"text-[10px] text-accent hover:underline",children:p?"Form view":"JSON view"})]}),p?e.jsx("textarea",{value:j,onChange:n=>b(n.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1}):e.jsxs("div",{className:"space-y-3 max-h-[200px] overflow-y-auto",children:[Object.entries(d).map(([n,c])=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:n}),typeof c=="boolean"?e.jsxs("select",{value:String(c),onChange:S=>m({...d,[n]:S.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):typeof c=="object"?e.jsx("textarea",{value:JSON.stringify(c,null,2),onChange:S=>{try{m({...d,[n]:JSON.parse(S.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"}):e.jsx("input",{type:typeof c=="number"?"number":"text",value:String(c??""),onChange:S=>m({...d,[n]:typeof c=="number"?Number(S.target.value):S.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"})]},n)),Object.keys(d).length===0&&e.jsx("p",{className:"text-[11px] text-text-tertiary italic",children:"No input fields defined"})]})]})]})]})}function de(t){const i=new Map;for(const r of t){const a=i.get(r.app_id)??[];a.push(r),i.set(r.app_id,a)}return[...i.entries()].map(([r,a])=>{var f;const u={active:0,deployed:1,draft:2,archived:3},o=a.reduce((d,m)=>(u[m.status]??9)<(u[d]??9)?m.status:d,a[0].status),s=a.reduce((d,m)=>m.updated_at>d?m.updated_at:d,a[0].updated_at),l=a.reduce((d,m)=>{const j=parseInt(m.app_version||"0",10);return j>d?j:d},0),p=((f=a.find(d=>d.set_id))==null?void 0:f.set_id)||null;return{appId:r,workflows:a,toolCount:a.length,status:o,updatedAt:s,appVersion:String(l),setId:p}})}function ue(t,i){if(!i)return!0;const r=i.toLowerCase();return t.appId.toLowerCase().includes(r)?!0:t.workflows.some(a=>{var u,o;return a.graph_topic.toLowerCase().includes(r)||((u=a.name)==null?void 0:u.toLowerCase().includes(r))||((o=a.description)==null?void 0:o.toLowerCase().includes(r))})}function xe(t,i){if(!i)return t;const r=i.toLowerCase();return t.filter(a=>{var u,o;return a.graph_topic.toLowerCase().includes(r)||((u=a.name)==null?void 0:u.toLowerCase().includes(r))||((o=a.description)==null?void 0:o.toLowerCase().includes(r))})}function pe({wf:t,onTry:i,onCron:r}){const a=t.status==="active",u=!!t.cron_schedule;return e.jsxs("tr",{onClick:a?i:void 0,className:`group/row hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15 ${a?"cursor-pointer":""}`,children:[e.jsxs("td",{className:"pl-14 pr-6 py-2.5",children:[e.jsx(G,{name:t.graph_topic,size:"md"}),t.description&&e.jsx("p",{className:"text-[11px] leading-snug text-text-quaternary mt-0.5",children:t.description})]}),e.jsxs("td",{className:"px-4 py-2.5 w-20 text-[10px] text-text-quaternary font-mono whitespace-nowrap",children:["v",t.content_version]}),e.jsx("td",{className:"px-4 py-2.5 w-28 whitespace-nowrap",children:e.jsx(E,{status:t.status})}),e.jsx("td",{className:"px-4 py-2.5 w-16",children:e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[a&&e.jsx("button",{onClick:o=>{o.stopPropagation(),i()},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Test tool",children:e.jsx(T,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:o=>{o.stopPropagation(),r()},className:u?"text-status-success":"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:u?`Cron: ${t.cron_schedule}`:"Schedule cron",children:e.jsx(ee,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})})]})}function me({server:t,expanded:i,onToggle:r,onTryTool:a,onWorkbench:u,onCron:o,visibleTools:s}){return e.jsxs(e.Fragment,{children:[e.jsxs("tr",{onClick:r,className:"group/row border-b border-surface-border/50 transition-colors duration-100 cursor-pointer row-hover",children:[e.jsx("td",{className:"px-6 py-2.5",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`transition-transform duration-150 ${i?"rotate-90":""} text-text-tertiary`,children:e.jsx(Q,{size:14})}),e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(ne,{name:t.appId,short:!1}),e.jsx("sup",{className:"text-[9px] font-normal text-accent/70",children:t.toolCount})]})]})}),e.jsxs("td",{className:"px-4 py-2.5 text-[10px] text-text-quaternary font-mono whitespace-nowrap",children:["v",t.appVersion]}),e.jsx("td",{className:"px-4 py-2.5 whitespace-nowrap",children:e.jsx(E,{status:t.status})}),e.jsx("td",{className:"px-4 py-2.5 w-16",children:e.jsx("div",{className:"flex items-center justify-end gap-1.5",children:t.setId&&e.jsx("button",{onClick:l=>{l.stopPropagation(),u()},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Open workbench",children:e.jsx(Z,{className:"w-3.5 h-3.5",strokeWidth:1.5})})})})]}),i&&s.map(l=>e.jsx(pe,{wf:l,onTry:()=>a(l),onCron:()=>o(l)},l.id))]})}function Le(){const t=re(),{filters:i,setFilter:r}=B({filters:{status:"",server:"",search:""}}),{data:a,isLoading:u}=F({status:i.status||void 0,app_id:i.server||void 0,search:i.search||void 0,limit:200,offset:0}),o=(a==null?void 0:a.workflows)??[],{data:s}=Y({limit:100}),l=x.useMemo(()=>{const n=new Map;for(const c of(s==null?void 0:s.sets)??[])c.source_workflow_id&&n.set(c.id,c.source_workflow_id);return n},[s==null?void 0:s.sets]),p=x.useMemo(()=>de(o),[o]),f=x.useMemo(()=>[...new Set(o.map(c=>c.app_id))].sort().map(c=>({value:c,label:c})),[o]),d=x.useMemo(()=>i.search?p.filter(n=>ue(n,i.search)):p,[p,i.search]),{expandedIds:m,toggle:j}=D("lt:expanded:yaml-workflows"),[b,N]=x.useState(null),[v,y]=x.useState(null),k=b||v;return u?e.jsxs("div",{children:[e.jsx(P,{title:"MCP Pipeline Tools",docsHash:"#docs:dashboard.md:mcp-pipeline-tools"}),e.jsx("div",{className:"animate-pulse space-y-0",children:Array.from({length:4}).map((n,c)=>e.jsx("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})},c))})]}):e.jsxs("div",{children:[e.jsx(P,{title:"MCP Pipeline Tools",docsHash:"#docs:dashboard.md:mcp-pipeline-tools",actions:e.jsx("button",{onClick:()=>t("/mcp/queries/new"),className:"btn-primary text-xs",children:"Design Pipeline"})}),e.jsx("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Deterministic tools compiled from dynamic MCP executions. Each tool is a YAML DAG that the router discovers and invokes automatically."}),e.jsxs(V,{children:[e.jsx(H,{label:"Search",value:i.search,onChange:n=>r("search",n),placeholder:"Server or tool name…"}),f.length>1&&e.jsx(O,{label:"Server",value:i.server,onChange:n=>r("server",n),options:f}),e.jsx(O,{label:"Status",value:i.status,onChange:n=>r("status",n),options:[{value:"draft",label:"Draft"},{value:"deployed",label:"Deployed"},{value:"active",label:"Active"},{value:"archived",label:"Archived"}]})]}),e.jsxs("div",{className:"flex gap-0",children:[e.jsx("div",{className:`${k?"flex-1 min-w-0":"w-full"} transition-all`,children:d.length===0?e.jsx("div",{className:"cursor-pointer",onClick:()=>t("/mcp/queries/new"),children:e.jsx(U,{icon:te,title:"No pipelines yet",description:"Click to open the MCP Tool Designer and create your first deterministic tool."})}):e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b",children:[e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-20",children:"Version"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-16"})]})}),e.jsx("tbody",{children:d.map(n=>e.jsx(me,{server:n,expanded:m.has(n.appId),onToggle:()=>j(n.appId),onTryTool:c=>{y(null),N(c)},onWorkbench:()=>{if(n.setId){const c=l.get(n.setId);c&&t(`/mcp/queries/${c}?mode=plan&set_id=${n.setId}&step=2`)}},onCron:c=>{N(null),y(c)},visibleTools:xe(n.workflows,i.search)},n.appId))})]})}),b&&e.jsx("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsx(ie,{workflow:b,onClose:()=>N(null)})}),v&&e.jsx("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsx(le,{workflow:v,onClose:()=>y(null)})})]})]})}export{Le as YamlWorkflowsPage};
|
|
2
|
-
//# sourceMappingURL=YamlWorkflowsPage-BsO4L_SW.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as _,c as z,j as e,a as i,b as ae}from"./vendor-query-B2UbickB.js";import{f as ne,a as le}from"./vendor-react-CXumBFUA.js";import{P as ie}from"./PageHeader-B4w-LDUF.js";import{F as oe,a as ce}from"./FilterBar-Ck4K4rzu.js";import{L as xe}from"./ListToolbar-o8xSCSVv.js";import{E as de}from"./EmptyState-BcsfPq9T.js";import{D as ue}from"./DropZone-lw2wmqty.js";import{b as v}from"./index-BnB7G5bA.js";import{F as pe,o as Q,Q as X,V as me,m as he,at as fe,au as ge,av as je,aw as be,ax as ye,X as Ne,ay as ve,a4 as we,az as ke,p as Se,aA as H,aB as Ce,n as Fe}from"./vendor-icons-5gSix3t2.js";import{T as J}from"./TimeAgo-BLNstYO1.js";function Te(t,a=100,n){const s=new URLSearchParams;t&&s.set("prefix",t),s.set("pageSize",String(a)),n&&s.set("continuationToken",n);const o=s.toString();return _({queryKey:["fileBrowse",t,a,n],queryFn:()=>v(`/file-browser/browse?${o}`)})}function $e(t){return _({queryKey:["fileMetadata",t],queryFn:()=>v(`/file-browser/metadata/${t}`),enabled:!!t})}function Pe(){return z({mutationFn:t=>v("/file-browser/signed-url",{method:"POST",body:JSON.stringify(t)})})}function Ue(){return z({mutationFn:t=>v(`/file-browser/delete/${t}`,{method:"DELETE"})})}function Ee(){return z({mutationFn:async({path:t,file:a})=>{const n=await a.arrayBuffer();return v(`/file-browser/upload?path=${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/octet-stream"},body:n})}})}function De(t){return _({queryKey:["filePreviewUrl",t],queryFn:async()=>(await v("/file-browser/signed-url",{method:"POST",body:JSON.stringify({path:t,expiresIn:3600})})).url,enabled:!!t,staleTime:3e3*1e3})}function Be({prefix:t,onNavigate:a}){const n=t?t.replace(/\/+$/,"").split("/").filter(Boolean):[];return e.jsxs("nav",{className:"flex items-center gap-1 text-sm mb-6 min-h-[28px]",children:[e.jsxs("button",{onClick:()=>a(""),className:`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${n.length===0?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:[e.jsx(pe,{className:"w-4 h-4 text-accent/75",strokeWidth:1.5}),e.jsx("span",{children:"Root"})]}),n.map((s,o)=>{const l=o===n.length-1,d=n.slice(0,o+1).join("/")+"/";return e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Q,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("button",{onClick:()=>a(d),className:`px-1.5 py-0.5 rounded transition-colors ${l?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:s})]},d)})]})}function Le(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:t<1024*1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:`${(t/(1024*1024*1024)).toFixed(1)} GB`}function S(t){return t.split("/").pop()||t}function I({label:t,value:a,mono:n,children:s}){return e.jsxs("div",{children:[e.jsx("dt",{className:"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5",children:t}),e.jsx("dd",{className:`text-sm text-text-secondary ${n?"font-mono text-xs break-all":""}`,children:s||a})]})}function Re({url:t}){const[a,n]=i.useState(null),[s,o]=i.useState(!1);return a===null&&!s&&fetch(t).then(l=>{if(!l.ok)throw new Error;return l.text()}).then(l=>n(l.slice(0,1e5))).catch(()=>o(!0)),s?e.jsx("p",{className:"text-xs text-text-tertiary",children:"Could not load preview"}):a===null?e.jsx("div",{className:"animate-pulse h-32 bg-surface-sunken rounded"}):e.jsx("pre",{className:"font-mono text-xs text-text-secondary bg-surface-sunken rounded-md p-3 overflow-x-auto max-h-[400px] overflow-y-auto whitespace-pre-wrap break-words",children:a})}function Ie({metadata:t}){const[a,n]=i.useState(null);async function s(o,l){await navigator.clipboard.writeText(o),n(l),setTimeout(()=>n(null),2e3)}return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5",children:"Path"}),e.jsxs("dd",{onClick:()=>s(t.path,"path"),className:"group flex items-center gap-1.5 text-xs font-mono text-text-secondary break-all cursor-pointer hover:text-text-primary transition-colors",title:"Click to copy",children:[e.jsx("span",{className:"flex-1",children:t.path}),a==="path"?e.jsx(X,{className:"w-3.5 h-3.5 text-status-success shrink-0"}):e.jsx(me,{className:"w-3.5 h-3.5 opacity-0 group-hover:opacity-100 text-text-tertiary shrink-0 transition-opacity"})]})]}),e.jsx(I,{label:"Type",value:t.content_type}),e.jsx(I,{label:"Size",value:Le(t.size)}),e.jsx(I,{label:"Modified",children:e.jsx(J,{date:t.modified_at})})]})}async function _e(t,a){const s=await(await fetch(t)).blob(),o=URL.createObjectURL(s),l=document.createElement("a");l.href=o,l.download=a,l.style.display="none",document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(o)}function ze(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:t<1024*1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:`${(t/(1024*1024*1024)).toFixed(1)} GB`}function Me(t){var n;const a=((n=t.split(".").pop())==null?void 0:n.toLowerCase())||"";return["png","jpg","jpeg","gif","svg","webp"].includes(a)?e.jsx(fe,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5}):["json"].includes(a)?e.jsx(ge,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5}):["csv","xlsx","xls"].includes(a)?e.jsx(je,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5}):["txt","md","html","xml","yaml","yml","css","js","ts"].includes(a)?e.jsx(be,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5}):e.jsx(ye,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5})}function Oe(t){var n;const a=((n=t.split(".").pop())==null?void 0:n.toLowerCase())||"";return["png","jpg","jpeg","gif","svg","webp"].includes(a)}function qe(t){const a=t.replace(/\/+$/,"");return a.split("/").pop()||a}function We(t){return t.split("/").pop()||t}function Ae({directories:t,files:a,onNavigate:n,onSelect:s,selectedFile:o}){return e.jsxs("table",{className:"w-full mt-2",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-left text-[10px] uppercase tracking-wider text-text-tertiary",children:[e.jsx("th",{className:"pb-2 pl-2 font-medium",children:"Name"}),e.jsx("th",{className:"pb-2 font-medium w-24 text-right",children:"Size"}),e.jsx("th",{className:"pb-2 pr-2 font-medium w-40 text-right",children:"Modified"})]})}),e.jsxs("tbody",{children:[t.map(l=>e.jsxs("tr",{onClick:()=>n(l),className:"row-hover cursor-pointer group",children:[e.jsx("td",{className:"py-2 pl-2",children:e.jsxs("span",{className:"flex items-center gap-2.5",children:[e.jsx(he,{className:"w-4 h-4 text-accent/75 shrink-0",strokeWidth:1.5}),e.jsx("span",{className:"text-sm text-text-primary group-hover:text-accent transition-colors",children:qe(l)})]})}),e.jsx("td",{className:"py-2 text-right text-xs text-text-tertiary",children:"—"}),e.jsx("td",{className:"py-2 pr-2 text-right text-xs text-text-tertiary",children:"—"})]},l)),a.map(l=>e.jsxs("tr",{onClick:()=>s(l.path),className:`row-hover cursor-pointer group ${o===l.path?"bg-surface-hover":""}`,children:[e.jsx("td",{className:"py-2 pl-2",children:e.jsxs("span",{className:"flex items-center gap-2.5",children:[Me(l.path),e.jsx("span",{className:"text-sm text-text-primary truncate",children:We(l.path)})]})}),e.jsx("td",{className:"py-2 text-right text-xs text-text-secondary tabular-nums",children:ze(l.size)}),e.jsx("td",{className:"py-2 pr-2 text-right text-xs text-text-secondary",children:e.jsx(J,{date:l.modified_at})})]},l.path))]})]})}const Ke=[{label:"1 hour",value:3600},{label:"6 hours",value:21600},{label:"24 hours",value:86400},{label:"7 days",value:604800},{label:"30 days",value:2592e3}];function Ge({filePath:t,onClose:a,onDeleted:n}){var j,k;const{data:s,isLoading:o}=$e(t),l=Pe(),d=Ue(),[w,f]=i.useState(!1),[b,C]=i.useState(!1),[y,h]=i.useState(!1),{data:u}=De(t),g=((j=s==null?void 0:s.content_type)==null?void 0:j.startsWith("image/"))||Oe(t),F=/\.(ts|tsx|js|jsx|json|md|yaml|yml|toml|xml|csv|sql|sh|py|rb|go|rs|java|c|cpp|h|css|scss|html|txt|log|env|ini|cfg|conf)$/i,p=((k=s==null?void 0:s.content_type)==null?void 0:k.startsWith("text/"))||(s==null?void 0:s.content_type)==="application/json"||(s==null?void 0:s.content_type)==="application/xml"||(s==null?void 0:s.content_type)==="application/octet-stream"&&F.test(t),U=(s==null?void 0:s.content_type)==="application/pdf";async function E(){try{const c=await l.mutateAsync({path:t,expiresIn:3600}),x=c.url.startsWith("http")?c.url:`${window.location.origin}${c.url}`;_e(x,S(t))}catch{}}async function T(c){f(!1);try{const x=await l.mutateAsync({path:t,expiresIn:c}),N=x.url.startsWith("http")?x.url:`${window.location.origin}${x.url}`;await navigator.clipboard.writeText(N),C(!0),setTimeout(()=>C(!1),2e3)}catch{}}return e.jsx(e.Fragment,{children:e.jsxs("div",{className:"w-[380px] shrink-0 border-l border-surface-border bg-surface overflow-y-auto",children:[e.jsxs("div",{className:"sticky top-0 bg-surface z-10 px-5 pt-5 pb-3 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx("h3",{className:"text-sm font-medium text-text-primary truncate pr-2",title:S(t),children:S(t)}),e.jsx("button",{onClick:a,className:"text-text-tertiary hover:text-text-primary shrink-0",children:e.jsx(Ne,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"flex items-center gap-1 flex-wrap",children:[e.jsxs("button",{onClick:E,className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs",title:"Download",children:[e.jsx(ve,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:"Download"})]}),e.jsxs("a",{href:u,target:"_blank",rel:"noopener noreferrer",className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs",title:"Open in new tab",children:[e.jsx(we,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:"Open"})]}),e.jsxs("div",{className:"relative",children:[e.jsxs("button",{onClick:()=>f(c=>!c),className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs",title:"Share with signed URL",children:[b?e.jsx(X,{className:"w-3.5 h-3.5 text-status-success"}):e.jsx(ke,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:b?"Copied":"Share"})]}),w&&e.jsx("div",{className:"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg py-1 z-20 min-w-[120px]",children:Ke.map(c=>e.jsx("button",{onClick:()=>T(c.value),className:"w-full text-left px-3 py-1.5 text-xs text-text-secondary hover:bg-surface-hover hover:text-text-primary transition-colors",children:c.label},c.value))})]}),e.jsxs("button",{onClick:()=>h(!0),className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs text-status-error/70 hover:text-status-error",title:"Delete file",children:[e.jsx(Se,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:"Delete"})]})]}),y&&e.jsxs("div",{className:"mt-3 p-3 bg-status-error/5 border border-status-error/20 rounded-md",children:[e.jsxs("p",{className:"text-xs text-text-primary mb-2",children:["Permanently delete ",e.jsx("span",{className:"font-medium",children:S(t)}),"? This cannot be undone."]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{onClick:()=>h(!1),className:"btn-secondary text-xs",disabled:d.isPending,children:"Cancel"}),e.jsx("button",{onClick:async()=>{try{await d.mutateAsync(t),h(!1),n==null||n()}catch{}},className:"btn-primary text-xs !bg-status-error hover:!bg-status-error/90",disabled:d.isPending,children:d.isPending?"Deleting...":"Delete"})]}),d.isError&&e.jsx("p",{className:"text-xs text-status-error mt-2",children:d.error.message})]}),l.isError&&e.jsx("p",{className:"text-xs text-status-error mt-2",children:l.error.message})]}),e.jsx("div",{className:"p-5",children:o?e.jsxs("div",{className:"animate-pulse space-y-3",children:[e.jsx("div",{className:"h-48 bg-surface-sunken rounded"}),e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-2/3"})]}):e.jsxs(e.Fragment,{children:[g&&u&&e.jsx("div",{className:"mb-5 rounded-md border border-surface-border bg-surface-sunken overflow-hidden",style:{maxHeight:"400px"},children:e.jsx("img",{src:u,alt:S(t),className:"w-full object-cover object-top",style:{maxHeight:"400px"}})}),p&&u&&e.jsx("div",{className:"mb-5",children:e.jsx(Re,{url:u})}),U&&u&&e.jsx("div",{className:"mb-5 p-4 bg-surface-sunken rounded-md text-center",children:e.jsx("a",{href:u,target:"_blank",rel:"noopener noreferrer",className:"text-accent hover:text-accent-hover text-sm font-medium",children:"Open PDF in new tab"})}),s&&e.jsx(Ie,{metadata:s})]})})]})})}const He=[25,50,100,200];function at(){const[t,a]=ne(),n=t.get("prefix")||"",[s,o]=i.useState(""),[l,d]=i.useState(""),[w,f]=i.useState(null),[b,C]=i.useState(100),[y,h]=i.useState([]),[u,g]=i.useState();i.useEffect(()=>{const r=setTimeout(()=>{d(s),g(void 0),h([])},300);return()=>clearTimeout(r)},[s]);const F=l?`${n}${l}`:n,{data:p,isLoading:U,isFetching:E,refetch:T}=Te(F,b,u),j=Ee(),k=ae(),c=i.useRef(null),[x,N]=i.useState(null),[$,M]=i.useState(""),O=i.useCallback(r=>{N(r),M(n)},[n]),[q,W]=i.useState(""),V=i.useCallback(()=>{if(!x)return;W("");let r=x.length;for(const m of x){const K=`${$}${m.name}`;j.mutate({path:K,file:m},{onSuccess:()=>{r--,k.invalidateQueries({queryKey:["fileBrowse"]}),r<=0&&N(null)},onError:G=>{r--,W(G.message),console.error("[Upload] failed:",K,G)}})}},[x,$,j,k]),D=(p==null?void 0:p.directories)??[],P=(p==null?void 0:p.files)??[],B=p==null?void 0:p.nextToken,A=i.useCallback(r=>{o(""),d(""),f(null),g(void 0),h([]),a(r?{prefix:r}:{})},[a]);function Z(){B&&(h(r=>[...r,u||""]),g(B))}function Y(){if(y.length===0)return;const r=[...y],m=r.pop();h(r),g(m||void 0)}function ee(r){C(r),g(void 0),h([])}const te=D.length===0&&P.length===0,se=y.length+1,L=!!B,R=y.length>0,re=`/file-browser/browse?prefix=${encodeURIComponent(F)}&pageSize=${b}${u?`&continuationToken=${encodeURIComponent(u)}`:""}`;return e.jsxs(ue,{onDrop:O,label:"Drop files to upload",children:[e.jsxs("div",{className:"flex gap-0",children:[e.jsx("input",{ref:c,type:"file",multiple:!0,className:"hidden",onChange:r=>{const m=Array.from(r.target.files||[]);m.length&&O(m),r.target.value=""}}),e.jsxs("div",{className:"flex-1 min-w-0 overflow-hidden",children:[e.jsx(ie,{title:"Files",docsHash:"#docs:dashboard.md:files",actions:e.jsxs("button",{onClick:()=>{var r;return(r=c.current)==null?void 0:r.click()},disabled:j.isPending,className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(H,{className:"w-3.5 h-3.5"}),j.isPending?"Uploading...":"Upload"]})}),e.jsx(Be,{prefix:n,onNavigate:A}),e.jsx(oe,{actions:e.jsx(xe,{onRefresh:()=>T(),isFetching:E,apiPath:re}),children:e.jsx(ce,{label:"Search",value:s,onChange:o,placeholder:"Filter by prefix..."})}),U?e.jsx("div",{className:"animate-pulse space-y-2 mt-4",children:Array.from({length:6}).map((r,m)=>e.jsx("div",{className:"h-10 bg-surface-sunken rounded"},m))}):te?e.jsx("div",{className:"cursor-pointer",onClick:()=>{var r;return(r=c.current)==null?void 0:r.click()},children:e.jsx(de,{icon:Ce,title:s?"No matching files":"No files yet",description:s?void 0:"Drop files here or click to upload"})}):e.jsx(Ae,{directories:D,files:P,onNavigate:A,onSelect:f,selectedFile:w}),(R||L||P.length>0)&&e.jsxs("div",{className:"flex items-center justify-between pt-4 pb-2",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("p",{className:"text-xs text-text-tertiary",children:["Page ",se," · ",P.length+D.length," items"]}),e.jsx("select",{value:b,onChange:r=>ee(parseInt(r.target.value)),className:"select text-xs py-1",children:He.map(r=>e.jsxs("option",{value:r,children:[r," / page"]},r))})]}),(R||L)&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsxs("button",{onClick:Y,disabled:!R,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1",children:[e.jsx(Fe,{className:"w-3.5 h-3.5"}),"Previous"]}),e.jsxs("button",{onClick:Z,disabled:!L,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1",children:["Next",e.jsx(Q,{className:"w-3.5 h-3.5"})]})]})]})]}),w&&e.jsx(Ge,{filePath:w,onClose:()=>f(null),onDeleted:()=>{f(null),T()}})]}),x&&le.createPortal(e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"fixed inset-0 z-40 bg-black/30",onClick:()=>N(null)}),e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:e.jsxs("div",{className:"bg-surface-raised border border-surface-border rounded-lg shadow-lg w-full max-w-sm",children:[e.jsx("div",{className:"px-5 py-4 border-b border-surface-border",children:e.jsxs("h3",{className:"text-sm font-medium text-text-primary",children:["Upload ",x.length," file",x.length>1?"s":""]})}),e.jsxs("div",{className:"px-5 py-4 space-y-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Destination folder"}),e.jsx("input",{type:"text",value:$,onChange:r=>M(r.target.value),placeholder:"e.g., images/ or leave empty for root",className:"input text-xs w-full font-mono"})]}),e.jsx("div",{className:"text-[10px] text-text-quaternary space-y-0.5",children:x.map((r,m)=>e.jsxs("p",{className:"truncate",children:[$,r.name," ",e.jsxs("span",{className:"text-text-tertiary",children:["(",(r.size/1024).toFixed(1)," KB)"]})]},m))}),q&&e.jsx("p",{className:"text-xs text-status-error",children:q})]}),e.jsxs("div",{className:"flex justify-end gap-2 px-5 py-3 border-t border-surface-border",children:[e.jsx("button",{onClick:()=>N(null),className:"btn-ghost text-xs",children:"Cancel"}),e.jsxs("button",{onClick:V,className:"btn-primary text-xs",children:[e.jsx(H,{className:"w-3.5 h-3.5 mr-1.5 inline"}),"Upload"]})]})]})})]}),document.body)]})}export{at as FilesPage};
|
|
2
|
-
//# sourceMappingURL=index-Bb1ycul8.js.map
|