@hotmeshio/long-tail 0.4.24 → 0.5.1
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 +41 -1
- package/build/api/yaml-workflows/crud.d.ts +1 -0
- package/build/api/yaml-workflows/crud.js +2 -2
- package/build/lib/db/schemas/011_escalation_index_audit.sql +50 -0
- package/build/routes/mcp-endpoint.js +3 -5
- package/build/services/escalation/sql.d.ts +2 -2
- package/build/services/escalation/sql.js +2 -2
- package/build/services/topics/system-topics.js +27 -27
- package/build/services/yaml-workflow/invoke.js +77 -6
- package/build/start/graph-workflows.d.ts +14 -0
- package/build/start/graph-workflows.js +126 -0
- package/build/start/workers.js +14 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +2 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/startup.d.ts +28 -0
- package/dashboard/dist/assets/{AdminDashboard-CgJC8ZZF.js → AdminDashboard-CMzR4d-w.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-CgJC8ZZF.js.map → AdminDashboard-CMzR4d-w.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-Bjl2Lsvo.js → AgentConfigPage-DHCpN4xk.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-Bjl2Lsvo.js.map → AgentConfigPage-DHCpN4xk.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-D5dHrfaM.js → AgentDetailPage-CSrejvSl.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-D5dHrfaM.js.map → AgentDetailPage-CSrejvSl.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-Mom3N1Av.js → AgentsPage-ntuzWHCD.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-Mom3N1Av.js.map → AgentsPage-ntuzWHCD.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-B2ZAb41C.js → AvailableEscalationsPage-Ci24fdxC.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-B2ZAb41C.js.map → AvailableEscalationsPage-Ci24fdxC.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-dCvnjynP.js → BotPicker-lj42d48P.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-dCvnjynP.js.map → BotPicker-lj42d48P.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-Bea9yLmU.js +2 -0
- package/dashboard/dist/assets/CapabilitiesPage-Bea9yLmU.js.map +1 -0
- package/dashboard/dist/assets/{CollapsibleSection-bW0UZN9b.js → CollapsibleSection-BeBsI1M4.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-bW0UZN9b.js.map → CollapsibleSection-BeBsI1M4.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-DVOK3aaR.js → CredentialsPage-BDzFa3HV.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-DVOK3aaR.js.map → CredentialsPage-BDzFa3HV.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-Cv5em7OP.js → CronLabel-DeNm1I4r.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-Cv5em7OP.js.map → CronLabel-DeNm1I4r.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-Dy4NBqhZ.js → CustomDurationPicker-C2OH9YcV.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-Dy4NBqhZ.js.map → CustomDurationPicker-C2OH9YcV.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-CptiQ0wc.js → DropZone-Dwpgbueb.js} +2 -2
- package/dashboard/dist/assets/{DropZone-CptiQ0wc.js.map → DropZone-Dwpgbueb.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-TQqWaVRq.js → ElapsedCell-WdzqA0dR.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-TQqWaVRq.js.map → ElapsedCell-WdzqA0dR.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-Cv5UvuHI.js → EscalationsOverview-BIEeflEV.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-Cv5UvuHI.js.map → EscalationsOverview-BIEeflEV.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-Doky6fCO.js → EventTable-NIhWP__B.js} +2 -2
- package/dashboard/dist/assets/{EventTable-Doky6fCO.js.map → EventTable-NIhWP__B.js.map} +1 -1
- package/dashboard/dist/assets/GraphInvokePage-DtAW8ilc.js +2 -0
- package/dashboard/dist/assets/GraphInvokePage-DtAW8ilc.js.map +1 -0
- package/dashboard/dist/assets/HomePage-HsO-M8ub.js +2 -0
- package/dashboard/dist/assets/{HomePage-CzvVyTq4.js.map → HomePage-HsO-M8ub.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Cfec9gz_.js → ListToolbar-DqaRlXrF.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Cfec9gz_.js.map → ListToolbar-DqaRlXrF.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BN4GsBGI.js → McpOverview-B4GsHxij.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BN4GsBGI.js.map → McpOverview-B4GsHxij.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DZKpzWST.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-DZKpzWST.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-BK5L2PqJ.js → McpQueryPage-B-8WR3GV.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-BK5L2PqJ.js.map → McpQueryPage-B-8WR3GV.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-Dt7Ai3qB.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-Dt7Ai3qB.js.map +1 -0
- package/dashboard/dist/assets/{McpRunsPage-QsXid9Xe.js → McpRunsPage-Bdke-HoQ.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-QsXid9Xe.js.map → McpRunsPage-Bdke-HoQ.js.map} +1 -1
- package/dashboard/dist/assets/NamespacePill-DnJl4Lre.js +2 -0
- package/dashboard/dist/assets/NamespacePill-DnJl4Lre.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-CZQSINho.js → OperatorDashboard-VZ97mufd.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-CZQSINho.js.map → OperatorDashboard-VZ97mufd.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BuJpMxyu.js → PageHeader-Bnt2iQQa.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BuJpMxyu.js.map → PageHeader-Bnt2iQQa.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-yD_PTbOl.js → PageHeaderWithStats-BuKc9MKt.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-yD_PTbOl.js.map → PageHeaderWithStats-BuKc9MKt.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-DUCOOvOK.js → ProcessDetailPage-BLfLfmWX.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DUCOOvOK.js.map → ProcessDetailPage-BLfLfmWX.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CXvSLTIM.js → ProcessesListPage-DG54t-Nd.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CXvSLTIM.js.map → ProcessesListPage-DG54t-Nd.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-SasQKc_B.js → RolePill-DQTT1s9v.js} +2 -2
- package/dashboard/dist/assets/{RolePill-SasQKc_B.js.map → RolePill-DQTT1s9v.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-DlQR0Iz_.js → RolesPage-Bdlv3DdW.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DlQR0Iz_.js.map → RolesPage-Bdlv3DdW.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DP-jxsv6.js → RunAsSelector-BFxxMvL3.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DP-jxsv6.js.map → RunAsSelector-BFxxMvL3.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BmASA0nN.js → SwimlaneTimeline-BZmad7WQ.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BmASA0nN.js.map → SwimlaneTimeline-BZmad7WQ.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-DvF3j8MA.js → TagInput-B00uqhjX.js} +2 -2
- package/dashboard/dist/assets/{TagInput-DvF3j8MA.js.map → TagInput-B00uqhjX.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CRowpkeZ.js → TaskDetailPage-CLl2mgBC.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CRowpkeZ.js.map → TaskDetailPage-CLl2mgBC.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BCQrS2oK.js → TaskQueuePill-CUsofm0X.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BCQrS2oK.js.map → TaskQueuePill-CUsofm0X.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-uJ6z37J-.js → TasksListPage-DoHXxZF-.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-uJ6z37J-.js.map → TasksListPage-DoHXxZF-.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BxwngK1D.js → TimeAgo-DZF9w8Rl.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BxwngK1D.js.map → TimeAgo-DZF9w8Rl.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CDmichOM.js → TimestampCell-DPpoTdrw.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CDmichOM.js.map → TimestampCell-DPpoTdrw.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-DjvedZSn.js +2 -0
- package/dashboard/dist/assets/ToolPill-DjvedZSn.js.map +1 -0
- package/dashboard/dist/assets/ToolTestPanel-DtAgJQfr.js +2 -0
- package/dashboard/dist/assets/ToolTestPanel-DtAgJQfr.js.map +1 -0
- package/dashboard/dist/assets/TopicDetailPage-W9RKkNNp.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-W9RKkNNp.js.map +1 -0
- package/dashboard/dist/assets/{TopicsPage-letISGGD.js → TopicsPage-Bc-4ne6V.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-letISGGD.js.map → TopicsPage-Bc-4ne6V.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-W6_Iz2Qb.js → UserName-O2Q4-E6E.js} +2 -2
- package/dashboard/dist/assets/{UserName-W6_Iz2Qb.js.map → UserName-O2Q4-E6E.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-Cfx-xlRT.js → WorkflowExecutionPage-DEDsBmn1.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-Cfx-xlRT.js.map → WorkflowExecutionPage-DEDsBmn1.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-Z-zHRKOK.js → WorkflowPill-F1oKUzmc.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-Z-zHRKOK.js.map → WorkflowPill-F1oKUzmc.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DC4XHMWt.js → WorkflowsDashboard-Bcf17vCt.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DC4XHMWt.js.map → WorkflowsDashboard-Bcf17vCt.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-GefO_yn0.js → WorkflowsOverview-Cwo2rqGT.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-GefO_yn0.js.map → WorkflowsOverview-Cwo2rqGT.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowDetailPage-Bv8ZFwO-.js +33 -0
- package/dashboard/dist/assets/YamlWorkflowDetailPage-Bv8ZFwO-.js.map +1 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DOiEQDOq.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DOiEQDOq.js.map +1 -0
- package/dashboard/dist/assets/{agents-BI5OeN84.js → agents-D09G0HCv.js} +2 -2
- package/dashboard/dist/assets/{agents-BI5OeN84.js.map → agents-D09G0HCv.js.map} +1 -1
- package/dashboard/dist/assets/{bots-1UzUCsrR.js → bots-D0LhyZZM.js} +2 -2
- package/dashboard/dist/assets/{bots-1UzUCsrR.js.map → bots-D0LhyZZM.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-BUbl-ojp.js → capabilities-DON4-NXs.js} +2 -2
- package/dashboard/dist/assets/{capabilities-BUbl-ojp.js.map → capabilities-DON4-NXs.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DTFrH_vN.js → controlplane-Bihd1kXf.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DTFrH_vN.js.map → controlplane-Bihd1kXf.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-BQhCt4W0.js → escalation-CP2XbdXK.js} +2 -2
- package/dashboard/dist/assets/{escalation-BQhCt4W0.js.map → escalation-CP2XbdXK.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-J20k5CcY.js → escalation-columns-9aw8Y4qq.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-J20k5CcY.js.map → escalation-columns-9aw8Y4qq.js.map} +1 -1
- package/dashboard/dist/assets/helpers-DzO-OGPe.js +2 -0
- package/dashboard/dist/assets/helpers-DzO-OGPe.js.map +1 -0
- package/dashboard/dist/assets/{index-CVGgSoda.js → index-B-BK3vtk.js} +2 -2
- package/dashboard/dist/assets/{index-CVGgSoda.js.map → index-B-BK3vtk.js.map} +1 -1
- package/dashboard/dist/assets/{index-CWEOhAiK.js → index-B7lEd0cY.js} +25 -25
- package/dashboard/dist/assets/index-B7lEd0cY.js.map +1 -0
- package/dashboard/dist/assets/index-BBBGETMs.js +6 -0
- package/dashboard/dist/assets/index-BBBGETMs.js.map +1 -0
- package/dashboard/dist/assets/index-BFyzZGtv.css +1 -0
- package/dashboard/dist/assets/{index-vgxjge70.js → index-BInTEEIX.js} +2 -2
- package/dashboard/dist/assets/{index-vgxjge70.js.map → index-BInTEEIX.js.map} +1 -1
- package/dashboard/dist/assets/index-BTp73vYK.js +2 -0
- package/dashboard/dist/assets/index-BTp73vYK.js.map +1 -0
- package/dashboard/dist/assets/index-CCup2uaP.js +2 -0
- package/dashboard/dist/assets/{index-C9ClHiiW.js.map → index-CCup2uaP.js.map} +1 -1
- package/dashboard/dist/assets/index-CMRW_PE-.js +9 -0
- package/dashboard/dist/assets/index-CMRW_PE-.js.map +1 -0
- package/dashboard/dist/assets/index-Cb7aSzox.js +2 -0
- package/dashboard/dist/assets/{index-si70YcIP.js.map → index-Cb7aSzox.js.map} +1 -1
- package/dashboard/dist/assets/index-Cjb8ulHm.js +2 -0
- package/dashboard/dist/assets/{index-WQQJ_cp7.js.map → index-Cjb8ulHm.js.map} +1 -1
- package/dashboard/dist/assets/index-DgLZ8Ix5.js +2 -0
- package/dashboard/dist/assets/{index-DasoTRjT.js.map → index-DgLZ8Ix5.js.map} +1 -1
- package/dashboard/dist/assets/index-H5Yb8CY2.js +2 -0
- package/dashboard/dist/assets/index-H5Yb8CY2.js.map +1 -0
- package/dashboard/dist/assets/{index-CLUYzdwz.js → index-_JsRJPds.js} +2 -2
- package/dashboard/dist/assets/{index-CLUYzdwz.js.map → index-_JsRJPds.js.map} +1 -1
- package/dashboard/dist/assets/{index-C-mbURj-.js → index-rbuNUyAh.js} +2 -2
- package/dashboard/dist/assets/{index-C-mbURj-.js.map → index-rbuNUyAh.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-D9Tuh-o-.js → knowledge-Bl_KaoKJ.js} +2 -2
- package/dashboard/dist/assets/{knowledge-D9Tuh-o-.js.map → knowledge-Bl_KaoKJ.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BO8QnWyk.js → mcp-DXbFGoA8.js} +2 -2
- package/dashboard/dist/assets/{mcp-BO8QnWyk.js.map → mcp-DXbFGoA8.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-WLtQtr51.js → mcp-query-Bg69DF2x.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-WLtQtr51.js.map → mcp-query-Bg69DF2x.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-BAVf9xud.js → pipelines-DK9LTg9F.js} +2 -2
- package/dashboard/dist/assets/{pipelines-BAVf9xud.js.map → pipelines-DK9LTg9F.js.map} +1 -1
- package/dashboard/dist/assets/{roles-mGO2-2hA.js → roles-BrsBN4hO.js} +2 -2
- package/dashboard/dist/assets/{roles-mGO2-2hA.js.map → roles-BrsBN4hO.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-JVRVCx0f.js → tasks-CwjvPECN.js} +2 -2
- package/dashboard/dist/assets/{tasks-JVRVCx0f.js.map → tasks-CwjvPECN.js.map} +1 -1
- package/dashboard/dist/assets/{topics-BLVnahd7.js → topics-BrwkmaFR.js} +2 -2
- package/dashboard/dist/assets/{topics-BLVnahd7.js.map → topics-BrwkmaFR.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BwjAi0Qq.js → useEventHooks-Cd1GM1NG.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BwjAi0Qq.js.map → useEventHooks-Cd1GM1NG.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DkHmXddZ.js → useNamespace-D9lghZ25.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DkHmXddZ.js.map → useNamespace-D9lghZ25.js.map} +1 -1
- package/dashboard/dist/assets/useYamlActivityEvents-vOhAwmKO.js +2 -0
- package/dashboard/dist/assets/useYamlActivityEvents-vOhAwmKO.js.map +1 -0
- package/dashboard/dist/assets/{users-BvizpAkV.js → users-ChQ7soaq.js} +2 -2
- package/dashboard/dist/assets/{users-BvizpAkV.js.map → users-ChQ7soaq.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-Doy0g69_.js → vendor-icons-Dj2F0Jrb.js} +38 -38
- package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +1 -0
- package/dashboard/dist/assets/workflows-BLKji1_1.js +2 -0
- package/dashboard/dist/assets/{workflows-CyEYa01a.js.map → workflows-BLKji1_1.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-BUhMfdaw.js +2 -0
- package/dashboard/dist/assets/{yaml-workflows-i3GzrEme.js.map → yaml-workflows-BUhMfdaw.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/story.md +13 -9
- package/package.json +2 -2
- package/dashboard/dist/assets/CapabilitiesPage-CK2fJ9Sy.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-CK2fJ9Sy.js.map +0 -1
- package/dashboard/dist/assets/HomePage-CzvVyTq4.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-lCW668WQ.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-lCW668WQ.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-CQOeYqxa.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CQOeYqxa.js.map +0 -1
- package/dashboard/dist/assets/ServerName-CHspudaC.js +0 -2
- package/dashboard/dist/assets/ServerName-CHspudaC.js.map +0 -1
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js.map +0 -1
- package/dashboard/dist/assets/ToolPill-1aTqYtzp.js +0 -2
- package/dashboard/dist/assets/ToolPill-1aTqYtzp.js.map +0 -1
- package/dashboard/dist/assets/ToolTestPanel-xjTn8sU8.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-xjTn8sU8.js.map +0 -1
- package/dashboard/dist/assets/TopicDetailPage-Dm0hDlS8.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-Dm0hDlS8.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-CMsrFooO.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-CMsrFooO.js.map +0 -1
- package/dashboard/dist/assets/helpers-ge6Eu90Y.js +0 -2
- package/dashboard/dist/assets/helpers-ge6Eu90Y.js.map +0 -1
- package/dashboard/dist/assets/index-C--SEsU7.css +0 -1
- package/dashboard/dist/assets/index-C45DvtAZ.js +0 -15
- package/dashboard/dist/assets/index-C45DvtAZ.js.map +0 -1
- package/dashboard/dist/assets/index-C9ClHiiW.js +0 -2
- package/dashboard/dist/assets/index-CWEOhAiK.js.map +0 -1
- package/dashboard/dist/assets/index-CWlP6vHG.js +0 -6
- package/dashboard/dist/assets/index-CWlP6vHG.js.map +0 -1
- package/dashboard/dist/assets/index-DasoTRjT.js +0 -2
- package/dashboard/dist/assets/index-FhasoOjO.js +0 -2
- package/dashboard/dist/assets/index-FhasoOjO.js.map +0 -1
- package/dashboard/dist/assets/index-WQQJ_cp7.js +0 -2
- package/dashboard/dist/assets/index-hAZiac0C.js +0 -2
- package/dashboard/dist/assets/index-hAZiac0C.js.map +0 -1
- package/dashboard/dist/assets/index-si70YcIP.js +0 -2
- package/dashboard/dist/assets/useExpandedRows-CkcEntB-.js +0 -2
- package/dashboard/dist/assets/useExpandedRows-CkcEntB-.js.map +0 -1
- package/dashboard/dist/assets/useYamlActivityEvents-CsaR5dWj.js +0 -2
- package/dashboard/dist/assets/useYamlActivityEvents-CsaR5dWj.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-Doy0g69_.js.map +0 -1
- package/dashboard/dist/assets/workflows-CyEYa01a.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-i3GzrEme.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolTestPanel-DtAgJQfr.js","sources":["../../src/components/common/display/ServerName.tsx","../../src/components/common/test/ToolTestPanel.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Server, ExternalLink } from 'lucide-react';\n\ninterface ServerNameProps {\n name: string;\n serverId?: string;\n /** Strip the common \"long-tail-\" prefix for display */\n short?: boolean;\n}\n\n/**\n * Universal MCP server name display. Monospace with a subtle Server icon.\n * When `serverId` is provided, hovering reveals a nav icon and clicking\n * navigates to the server config page.\n */\nexport function ServerName({ name, serverId, short = true }: ServerNameProps) {\n const navigate = useNavigate();\n const display = short ? name.replace(/^long-tail-/, '') : name;\n\n if (serverId) {\n return (\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/servers/${serverId}`); }}\n className=\"group/srv inline-flex items-center gap-1 text-[11px] font-mono text-text-tertiary hover:text-accent transition-colors\"\n title={name}\n >\n <Server className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary group-hover/srv:text-accent\" strokeWidth={1.5} />\n {display}\n <ExternalLink className=\"w-2 h-2 shrink-0 invisible group-hover/srv:visible text-accent\" strokeWidth={1.5} />\n </button>\n );\n }\n\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-tertiary\" title={name}>\n <Server className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n {display}\n </span>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, RotateCcw, Play, ExternalLink, KeyRound } from 'lucide-react';\nimport { useCallMcpTool } from '../../../api/mcp';\nimport { JsonViewer } from '../data/JsonViewer';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport { ToolPill } from '../display/ToolPill';\nimport { ServerName } from '../display/ServerName';\nimport type { McpToolManifest } from '../../../api/types';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\n\nfunction ToolErrorDisplay({ error }: { error: Error | null }) {\n const msg = error instanceof Error ? error.message : '';\n if (msg.startsWith('No credential found for provider')) {\n return (\n <div className=\"bg-status-warning/10 border border-status-warning/30 rounded-md px-3 py-2 flex items-start gap-2\">\n <KeyRound size={14} className=\"text-status-warning mt-0.5 shrink-0\" />\n <div>\n <p className=\"text-[11px] font-medium text-text-primary mb-0.5\">Credential required</p>\n <p className=\"text-[11px] text-text-secondary mb-1\">{msg}</p>\n <Link to=\"/credentials\" className=\"text-[11px] text-accent hover:underline inline-flex items-center gap-1\">\n Go to Credentials <ExternalLink size={10} />\n </Link>\n </div>\n </div>\n );\n }\n return (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-[11px] text-status-error\">{msg || 'Tool call failed'}</p>\n </div>\n );\n}\n\nfunction ExecutionLink({ data }: { data: unknown }) {\n const res = (data as any)?.result;\n const jobId = res?.job_id;\n const ns = res?.namespace || '';\n if (!jobId) return null;\n return (\n <Link\n to={`/mcp/executions/${encodeURIComponent(jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} />\n View Execution\n </Link>\n );\n}\n\ninterface ToolTestPanelProps {\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n onClose: () => void;\n}\n\nconst INPUT_CLS = 'input text-xs';\nconst LABEL_CLS = 'label';\n\n/** Text input for array fields — commits on blur or Enter, allows commas while typing */\nfunction ArrayInput({ value, onChange, className }: { value: any[]; onChange: (v: string[]) => void; className: string }) {\n const [raw, setRaw] = useState(value.join(', '));\n const commit = () => onChange(raw.split(',').map((s) => s.trim()).filter(Boolean));\n // Sync if parent value changes externally\n useEffect(() => { setRaw(value.join(', ')); }, [JSON.stringify(value)]); // eslint-disable-line\n return (\n <input\n type=\"text\"\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commit(); } }}\n placeholder=\"comma-separated values\"\n className={className}\n />\n );\n}\n\nexport function ToolTestPanel({ serverId, serverName, tool, onClose }: ToolTestPanelProps) {\n const callTool = useCallMcpTool();\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('');\n const [jsonError, setJsonError] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n\n useEffect(() => {\n const skeleton = buildSkeleton(tool.inputSchema);\n setFields(skeleton);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n setJsonError('');\n callTool.reset();\n }, [tool.name, serverId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const hasResult = !!callTool.data || !!callTool.error;\n\n const toggleMode = () => {\n if (!jsonMode) {\n setArgsJson(JSON.stringify(fields, null, 2));\n } else {\n try { setFields(JSON.parse(argsJson)); } catch { /* keep fields */ }\n }\n setJsonMode(!jsonMode);\n };\n\n const handleRun = () => {\n setJsonError('');\n callTool.reset();\n let parsed: Record<string, unknown>;\n if (jsonMode) {\n try { parsed = JSON.parse(argsJson); } catch { setJsonError('Invalid JSON'); return; }\n } else {\n parsed = { ...fields };\n }\n callTool.mutate({\n serverId,\n toolName: tool.name,\n arguments: parsed,\n ...(executeAs ? { execute_as: executeAs } : {}),\n });\n };\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised\">\n {/* Header */}\n <div className=\"flex items-start justify-between px-4 py-3 border-b border-surface-border/50 shrink-0\">\n <div className=\"min-w-0 space-y-1\">\n <ServerName name={serverName} serverId={serverId} short={false} />\n <div><ToolPill name={tool.name} size=\"md\" /></div>\n </div>\n <button onClick={onClose} className=\"p-1 text-text-quaternary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"px-4 py-4 space-y-5\">\n {tool.description && (\n <div className=\"border-l-2 border-accent/30 pl-3 py-1\">\n <p className=\"text-[11px] text-text-secondary leading-relaxed italic\">{tool.description}</p>\n </div>\n )}\n\n {/* Run as */}\n <div>\n <label className={LABEL_CLS}>run as</label>\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n </div>\n\n {/* Form / JSON toggle input */}\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-[10px] text-text-quaternary\">Parameters</span>\n <button onClick={toggleMode} className=\"text-[10px] text-accent/70 hover:text-accent transition-colors\">\n {jsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {jsonMode ? (\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"input-json w-full\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3\">\n {Object.entries(fields).sort(([a], [b]) => {\n const req = (tool.inputSchema?.required ?? []) as string[];\n const ai = req.indexOf(a);\n const bi = req.indexOf(b);\n if (ai !== -1 && bi !== -1) return ai - bi;\n if (ai !== -1) return -1;\n if (bi !== -1) return 1;\n return a.localeCompare(b);\n }).map(([key, value]) => {\n const propSchema = tool.inputSchema?.properties?.[key];\n const hint = propSchema?.description;\n const isRequired = (tool.inputSchema?.required ?? []).includes(key);\n return (\n <div key={key}>\n <label className={LABEL_CLS}>\n {key}\n {isRequired && <span className=\"text-accent/50 ml-0.5\">*</span>}\n </label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className={INPUT_CLS}\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : Array.isArray(value) ? (\n <ArrayInput\n value={value as any[]}\n onChange={(v) => setFields({ ...fields, [key]: v })}\n className={INPUT_CLS}\n />\n ) : typeof value === 'object' && value !== null ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setFields({ ...fields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid */ } }}\n className={`${INPUT_CLS} min-h-[48px] font-mono resize-y`}\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setFields({ ...fields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className={INPUT_CLS}\n placeholder={propSchema?.type === 'string' ? propSchema?.example || '' : ''}\n />\n )}\n {hint && <p className=\"text-[9px] text-text-quaternary/70 mt-0.5 leading-snug\">{hint}</p>}\n </div>\n );\n })}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-[11px] text-text-quaternary\">No parameters</p>\n )}\n </div>\n )}\n {jsonError && <p className=\"text-[11px] text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {/* Run button */}\n <button\n onClick={handleRun}\n disabled={callTool.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {callTool.isPending ? (\n 'Running...'\n ) : hasResult ? (\n <><RotateCcw size={12} /> Re-run</>\n ) : (\n <><Play size={12} /> Run</>\n )}\n </button>\n\n {/* Response */}\n {callTool.isPending && (\n <div className=\"animate-pulse\">\n <p className=\"text-[10px] text-text-quaternary mb-1\">Response</p>\n <div className=\"h-20 bg-surface-sunken/50 rounded-md\" />\n </div>\n )}\n {callTool.data ? (\n <div className=\"space-y-2\">\n <JsonViewer data={callTool.data as Record<string, unknown>} label=\"Response\" defaultCollapsed />\n <ExecutionLink data={callTool.data} />\n </div>\n ) : null}\n {callTool.error ? (\n <div>\n <p className=\"text-[10px] text-text-quaternary mb-1\">Response</p>\n <ToolErrorDisplay error={callTool.error as Error | null} />\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["ServerName","name","serverId","short","navigate","useNavigate","display","jsxs","e","jsx","Server","ExternalLink","ToolErrorDisplay","error","msg","KeyRound","Link","ExecutionLink","data","res","jobId","ns","INPUT_CLS","LABEL_CLS","ArrayInput","value","onChange","className","raw","setRaw","useState","commit","s","useEffect","ToolTestPanel","serverName","tool","onClose","callTool","useCallMcpTool","jsonMode","setJsonMode","fields","setFields","argsJson","setArgsJson","jsonError","setJsonError","executeAs","setExecuteAs","skeleton","buildSkeleton","hasResult","toggleMode","handleRun","parsed","ToolPill","X","RunAsSelector","a","b","req","_a","ai","bi","key","propSchema","_b","hint","isRequired","_c","v","Fragment","RotateCcw","Play","JsonViewer"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{a,j as e}from"./vendor-query-B2UbickB.js";import{a as K,b as X,c as Y,d as Z}from"./topics-BrwkmaFR.js";import{u as ee,c as j,J as R}from"./index-B7lEd0cY.js";import{L as te}from"./ListToolbar-DqaRlXrF.js";import{R as f,B as se,Q as ae,q as ce,aQ as ie,X as ne,T as re,g as le,aR as oe,a as $,aa as de,r as xe}from"./vendor-icons-Dj2F0Jrb.js";import{e as pe,c as me}from"./vendor-react-CXumBFUA.js";const he={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 N({icon:r,color:p,children:l}){return e.jsxs("div",{className:"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border",children:[e.jsx(r,{className:`w-4 h-4 ${p}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-xs font-semibold uppercase tracking-widest text-accent/80",children:l})]})}function ve(){var D,W,I,J;const{topic:r}=pe(),p=r?decodeURIComponent(r):null,l=me(),{data:t,isLoading:M,refetch:m,isFetching:L}=K(p),{data:h}=ee(),B=(D=h==null?void 0:h.ai)!=null&&D.enabled?"agents":"automations",y=X(),U=Y(),i=Z(),[c,u]=a.useState(!1),[o,v]=a.useState(""),[k,w]=a.useState(()=>`evt-${Date.now()}-${Math.random().toString(16).slice(2,6)}`),[b,S]=a.useState(""),[C,P]=a.useState(""),[E,_]=a.useState(""),[g,T]=a.useState(""),[q,d]=a.useState("");if(M)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(f,{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 z=t.source==="system",O=!t.managed,F=he[t.category]??"bg-zinc-400/15 text-zinc-400",x=t.example_payload?JSON.stringify(t.example_payload,null,2):(W=t.payload_schema)!=null&&W.properties?JSON.stringify(Object.fromEntries(Object.keys(t.payload_schema.properties).map(s=>[s,""])),null,2):"{}";!b&&x!=="{}"&&S(x),o||v(t.topic);const A=()=>{P(t.description??""),_((t.tags??[]).join(", ")),T(t.payload_schema?JSON.stringify(t.payload_schema,null,2):""),d(""),u(!0)},Q=()=>u(!1),V=()=>{const s=E.split(",").map(H=>H.trim()).filter(Boolean);let n;if(g.trim())try{n=JSON.parse(g),d("")}catch{d("Invalid JSON");return}y.mutate({topic:t.topic,description:C,tags:s,...n!==void 0?{payload_schema:n}:{}},{onSuccess:()=>{u(!1),m()}})},G=()=>{confirm(`Delete topic "${t.topic}"?
|
|
2
|
+
|
|
3
|
+
This removes it from the catalog. Active subscriptions are not affected.`)&&U.mutate(t.topic,{onSuccess:()=>l("/topics")})};return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3 mb-1",children:[e.jsx(f,{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(se,{className:"w-4 h-4",strokeWidth:1.5})})]}),!c&&t.description?e.jsx("p",{className:"text-sm text-text-secondary leading-relaxed",children:t.description}):c?null:e.jsx("p",{className:"text-sm text-text-quaternary italic",children:"No description"})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[!c&&O&&e.jsxs("button",{onClick:A,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(ae,{className:"w-3 h-3"})," Edit"]}),!c&&!z&&O&&e.jsxs("button",{onClick:G,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(ce,{className:"w-3 h-3"})," Delete"]}),c&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:V,disabled:y.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(ie,{className:"w-3 h-3"})," Save"]}),e.jsxs("button",{onClick:Q,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(ne,{className:"w-3 h-3"})," Cancel"]})]})]})]}),e.jsxs("div",{className:"bg-surface-sunken/50 rounded-md px-5 py-3 flex flex-wrap gap-x-6 gap-y-3 items-start mb-5 relative",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Category"}),e.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${F}`,children:t.category})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Source"}),e.jsx("span",{className:"text-xs font-mono text-text-secondary",children:t.source})]}),((I=t.tags)==null?void 0:I.length)>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Tags"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(re,{className:"w-2.5 h-2.5 text-text-quaternary",strokeWidth:1.5}),t.tags.map(s=>e.jsx("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-mono text-text-tertiary bg-surface-sunken",children:s},s))]})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Created"}),e.jsx("span",{className:"text-xs text-text-secondary",children:e.jsx(j,{date:t.created_at})})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Updated"}),e.jsx("span",{className:"text-xs text-text-secondary",children:e.jsx(j,{date:t.updated_at})})]}),t.last_seen_at&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Last Seen"}),e.jsx("span",{className:"text-xs text-text-secondary",children:e.jsx(j,{date:t.last_seen_at})})]}),e.jsx("div",{className:"ml-auto self-center",children:e.jsx(te,{onRefresh:()=>m(),isFetching:L,apiPath:`/topics/by-name/${encodeURIComponent(t.topic)}`})})]}),!c&&e.jsxs("div",{className:"grid grid-cols-3 gap-5",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx(N,{icon:f,color:"text-accent",children:"Payload Schema"}),t.payload_schema?e.jsx(R,{data:t.payload_schema}):e.jsx("p",{className:"text-[11px] text-text-quaternary",children:"No schema defined. Click Edit to add one."})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx(N,{icon:le,color:"text-cyan-400",children:"Example Payload"}),t.example_payload?e.jsx(R,{data:t.example_payload}):e.jsx("p",{className:"text-[11px] text-text-quaternary",children:"No example defined. Click Edit to add one."})]}),e.jsxs("div",{className:"min-w-0 space-y-4 animate-page-enter",children:[e.jsx(N,{icon:oe,color:"text-violet-400",children:"Test"}),e.jsxs("div",{className:"bg-surface-sunken/30 rounded-md px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx($,{className:"w-3.5 h-3.5 text-emerald-400",strokeWidth:1.5}),e.jsx("h2",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Target Subscribers"}),e.jsxs("span",{className:"relative group ml-auto",children:[e.jsx(de,{className:"w-3 h-3 text-text-quaternary cursor-help",strokeWidth:1.5}),e.jsx("span",{className:"absolute right-0 top-full mt-1 w-48 p-2 rounded bg-surface-raised border border-surface-border shadow-lg text-[10px] text-text-secondary leading-relaxed hidden group-hover:block z-10",children:"Publishing a test event is live — these subscribers will receive and process the payload."})]})]}),(J=t.subscribers)!=null&&J.length?e.jsx("div",{className:"space-y-0.5",children:t.subscribers.map(s=>e.jsxs("button",{onClick:()=>l(`/agents/${s.agent_id}`),className:"flex items-center gap-2 w-full text-left py-1 rounded hover:bg-surface-hover/50 transition-colors",children:[e.jsx($,{className:"w-2.5 h-2.5 text-emerald-400 shrink-0",strokeWidth:1.5}),e.jsx("span",{className:"text-[11px] text-text-primary hover:text-accent transition-colors truncate",children:s.agent_name}),e.jsx("span",{className:"text-[9px] font-mono text-text-quaternary ml-auto shrink-0",children:s.reaction_type})]},s.id))}):e.jsxs("p",{className:"text-[11px] text-text-quaternary",children:["No ",B," subscribed."]})]}),e.jsxs("div",{className:"sticky top-16 bg-surface-sunken/40 rounded-md p-4",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsx(xe,{className:"w-3.5 h-3.5 text-accent",strokeWidth:1.5}),e.jsx("h2",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Publish"})]}),e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Event ID"}),e.jsx("input",{value:k,onChange:s=>w(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1,placeholder:"evt-1720368000000-a3f2"}),e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Subject"}),e.jsx("input",{value:o||t.topic,onChange:s=>v(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1}),e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Payload"}),e.jsx("textarea",{value:b||x,onChange:s=>S(s.target.value),className:"input-json w-full text-[11px]",rows:7,spellCheck:!1,placeholder:'{ "key": "value" }'}),e.jsx("div",{className:"mt-3",children:e.jsx("button",{onClick:()=>{try{const s=JSON.parse(b||x),n=(o||t.topic)!==t.topic?o||t.topic:void 0;i.mutate({topic:t.topic,subject:n,eventId:k||void 0,data:s},{onSuccess:()=>{m(),w(`evt-${Date.now()}-${Math.random().toString(16).slice(2,6)}`)}})}catch{}},disabled:i.isPending,className:"btn-primary text-xs w-full",children:i.isPending?"Publishing…":"Publish"})}),i.isSuccess&&e.jsx("p",{className:"text-[10px] text-status-success mt-2 animate-page-enter",children:"Event published"}),i.isError&&e.jsx("p",{className:"text-[10px] text-status-error mt-2",children:i.error.message})]})]})]}),c&&e.jsxs("div",{className:"space-y-6 max-w-3xl",children:[e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Description"}),e.jsx("textarea",{value:C,onChange:s=>P(s.target.value),rows:3,className:"input resize-none",placeholder:"What this topic represents"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Tags"}),e.jsx("input",{type:"text",value:E,onChange:s=>_(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.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Payload Schema"}),e.jsx("textarea",{value:g,onChange:s=>{T(s.target.value),d("")},rows:12,className:"input-json w-full",placeholder:`{
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"orderId": { "type": "string" }
|
|
7
|
+
}
|
|
8
|
+
}`}),q&&e.jsx("p",{className:"text-[10px] text-red-400 mt-1",children:q}),e.jsx("p",{className:"hint",children:"JSON Schema describing the event.data shape."})]})]})]})}export{ve as TopicDetailPage};
|
|
9
|
+
//# sourceMappingURL=TopicDetailPage-W9RKkNNp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopicDetailPage-W9RKkNNp.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, FlaskConical, Info, Braces } 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';\nimport { useSettings } from '../../api/settings';\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 { data: settings } = useSettings();\n const subscriberLabel = settings?.ai?.enabled ? 'agents' : 'automations';\n const updateMutation = useUpdateTopic();\n const deleteMutation = useDeleteTopic();\n const publishMutation = usePublishTopic();\n\n const [editing, setEditing] = useState(false);\n const [publishSubject, setPublishSubject] = useState('');\n const [publishEventId, setPublishEventId] = useState(() => `evt-${Date.now()}-${Math.random().toString(16).slice(2, 6)}`);\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 defaultPayload = 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 if (!publishPayload && defaultPayload !== '{}') {\n setPublishPayload(defaultPayload);\n }\n if (!publishSubject) {\n setPublishSubject(topic.topic);\n }\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>\n {/* ── Header ───────────────────────────────────────────────── */}\n <div className=\"flex items-start justify-between mb-4\">\n <div>\n <div className=\"flex items-center gap-3 mb-1\">\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 {!editing && topic.description ? (\n <p className=\"text-sm text-text-secondary leading-relaxed\">{topic.description}</p>\n ) : !editing ? (\n <p className=\"text-sm text-text-quaternary italic\">No description</p>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {!editing && editable && (\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 )}\n {!editing && !isSystem && editable && (\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 {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 {/* ── Details band ─────────────────────────────────────────── */}\n <div className=\"bg-surface-sunken/50 rounded-md px-5 py-3 flex flex-wrap gap-x-6 gap-y-3 items-start mb-5 relative\">\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Category</p>\n <span className={`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${categoryPillCls}`}>{topic.category}</span>\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Source</p>\n <span className=\"text-xs font-mono text-text-secondary\">{topic.source}</span>\n </div>\n {topic.tags?.length > 0 && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tags</p>\n <div className=\"flex items-center gap-1.5\">\n <Tag className=\"w-2.5 h-2.5 text-text-quaternary\" strokeWidth={1.5} />\n {topic.tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-mono text-text-tertiary bg-surface-sunken\">{tag}</span>\n ))}\n </div>\n </div>\n )}\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Created</p>\n <span className=\"text-xs text-text-secondary\"><DateValue date={topic.created_at} /></span>\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Updated</p>\n <span className=\"text-xs text-text-secondary\"><DateValue date={topic.updated_at} /></span>\n </div>\n {topic.last_seen_at && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Last Seen</p>\n <span className=\"text-xs text-text-secondary\"><DateValue date={topic.last_seen_at} /></span>\n </div>\n )}\n <div className=\"ml-auto self-center\">\n <ListToolbar onRefresh={() => refetch()} isFetching={isFetching} apiPath={`/topics/by-name/${encodeURIComponent(topic.topic)}`} />\n </div>\n </div>\n\n {/* ── Three-column layout: Schema | Example | Test ─── */}\n {!editing && (\n <div className=\"grid grid-cols-3 gap-5\">\n {/* Col 1 — Payload Schema */}\n <div className=\"min-w-0\">\n <SectionHeader icon={Radio} color=\"text-accent\">Payload Schema</SectionHeader>\n {topic.payload_schema ? (\n <JsonViewer data={topic.payload_schema} />\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">No schema defined. Click Edit to add one.</p>\n )}\n </div>\n\n {/* Col 2 — Example Payload */}\n <div className=\"min-w-0\">\n <SectionHeader icon={Braces} color=\"text-cyan-400\">Example Payload</SectionHeader>\n {topic.example_payload ? (\n <JsonViewer data={topic.example_payload} />\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">No example defined. Click Edit to add one.</p>\n )}\n </div>\n\n {/* Col 3 — Test */}\n <div className=\"min-w-0 space-y-4 animate-page-enter\">\n <SectionHeader icon={FlaskConical} color=\"text-violet-400\">Test</SectionHeader>\n {/* Target Subscribers */}\n <div className=\"bg-surface-sunken/30 rounded-md px-4 py-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Bot className=\"w-3.5 h-3.5 text-emerald-400\" strokeWidth={1.5} />\n <h2 className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Target Subscribers\n </h2>\n <span className=\"relative group ml-auto\">\n <Info className=\"w-3 h-3 text-text-quaternary cursor-help\" strokeWidth={1.5} />\n <span className=\"absolute right-0 top-full mt-1 w-48 p-2 rounded bg-surface-raised border border-surface-border shadow-lg text-[10px] text-text-secondary leading-relaxed hidden group-hover:block z-10\">\n Publishing a test event is live — these subscribers will receive and process the payload.\n </span>\n </span>\n </div>\n {topic.subscribers?.length ? (\n <div className=\"space-y-0.5\">\n {topic.subscribers.map((sub) => (\n <button\n key={sub.id}\n onClick={() => navigate(`/agents/${sub.agent_id}`)}\n className=\"flex items-center gap-2 w-full text-left py-1 rounded hover:bg-surface-hover/50 transition-colors\"\n >\n <Bot className=\"w-2.5 h-2.5 text-emerald-400 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-[11px] text-text-primary hover:text-accent transition-colors truncate\">{sub.agent_name}</span>\n <span className=\"text-[9px] font-mono text-text-quaternary ml-auto shrink-0\">{sub.reaction_type}</span>\n </button>\n ))}\n </div>\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">No {subscriberLabel} subscribed.</p>\n )}\n </div>\n\n {/* Publish */}\n <div className=\"sticky top-16 bg-surface-sunken/40 rounded-md p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Send className=\"w-3.5 h-3.5 text-accent\" strokeWidth={1.5} />\n <h2 className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Publish</h2>\n </div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Event ID</label>\n <input\n value={publishEventId}\n onChange={(e) => setPublishEventId(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"evt-1720368000000-a3f2\"\n />\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Subject</label>\n <input\n value={publishSubject || topic.topic}\n onChange={(e) => setPublishSubject(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n />\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Payload</label>\n <textarea\n value={publishPayload || defaultPayload}\n onChange={(e) => setPublishPayload(e.target.value)}\n className=\"input-json w-full text-[11px]\"\n rows={7}\n spellCheck={false}\n placeholder='{ \"key\": \"value\" }'\n />\n <div className=\"mt-3\">\n <button\n onClick={() => {\n try {\n const data = JSON.parse(publishPayload || defaultPayload);\n const subject = (publishSubject || topic.topic) !== topic.topic\n ? (publishSubject || topic.topic)\n : undefined;\n publishMutation.mutate({ topic: topic.topic, subject, eventId: publishEventId || undefined, data }, { onSuccess: () => {\n refetch();\n // Generate a fresh event ID for the next publish\n setPublishEventId(`evt-${Date.now()}-${Math.random().toString(16).slice(2, 6)}`);\n } });\n } catch { /* invalid JSON */ }\n }}\n disabled={publishMutation.isPending}\n className=\"btn-primary text-xs w-full\"\n >\n {publishMutation.isPending ? 'Publishing…' : 'Publish'}\n </button>\n </div>\n {publishMutation.isSuccess && (\n <p className=\"text-[10px] text-status-success mt-2 animate-page-enter\">Event published</p>\n )}\n {publishMutation.isError && (\n <p className=\"text-[10px] text-status-error mt-2\">{publishMutation.error.message}</p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* ── Edit mode ────────────────────────────────────────────── */}\n {editing && (\n <div className=\"space-y-6 max-w-3xl\">\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 <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 <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.</p>\n </div>\n </div>\n )}\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","settings","useSettings","subscriberLabel","_a","updateMutation","useUpdateTopic","deleteMutation","useDeleteTopic","publishMutation","usePublishTopic","editing","setEditing","useState","publishSubject","setPublishSubject","publishEventId","setPublishEventId","publishPayload","setPublishPayload","editDescription","setEditDescription","editTags","setEditTags","editSchema","setEditSchema","schemaError","setSchemaError","Radio","isSystem","editable","categoryPillCls","defaultPayload","_b","k","startEdit","cancelEdit","saveEdit","tags","t","payload_schema","handleDelete","BookOpen","Pencil","Trash2","Fragment","Save","X","_c","Tag","tag","DateValue","ListToolbar","JsonViewer","Braces","FlaskConical","Bot","Info","_d","sub","Send","e","data","subject"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./vendor-query-B2UbickB.js";import{u as x}from"./topics-
|
|
2
|
-
//# sourceMappingURL=TopicsPage-
|
|
1
|
+
import{j as e}from"./vendor-query-B2UbickB.js";import{u as x}from"./topics-BrwkmaFR.js";import{u as m}from"./useFilterParams-x-Dg0Vgz.js";import{D as g}from"./DataTable-D9yuBv0w.js";import{S as u}from"./StickyPagination-BWhFSr2d.js";import{F as d,b}from"./FilterBar-Ck4K4rzu.js";import{P as f}from"./PageHeader-Bnt2iQQa.js";import{L as y}from"./ListToolbar-DqaRlXrF.js";import{c as h}from"./index-B7lEd0cY.js";import{R as j}from"./vendor-icons-Dj2F0Jrb.js";import{c as v}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";const k={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"},N=[{value:"task",label:"Task"},{value:"workflow",label:"Workflow"},{value:"escalation",label:"Escalation"},{value:"activity",label:"Activity"},{value:"knowledge",label:"Knowledge"},{value:"agent",label:"Agent"},{value:"app",label:"App"},{value:"milestone",label:"Milestone"}];function w({category:t}){const a=k[t]??"bg-zinc-400/15 text-zinc-400";return e.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${a}`,children:t})}const P=[{key:"topic",label:"Topic",render:t=>e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx(j,{className:"w-3 h-3 shrink-0 text-text-quaternary",strokeWidth:1.5}),e.jsx("span",{className:"text-xs font-mono text-text-primary truncate",children:t.topic})]})},{key:"category",label:"Category",render:t=>e.jsx(w,{category:t.category}),className:"w-28"},{key:"description",label:"Description",render:t=>t.description?e.jsx("span",{className:"text-[11px] text-text-secondary truncate block max-w-xs",children:t.description}):e.jsx("span",{className:"text-text-quaternary",children:"—"})},{key:"source",label:"Source",render:t=>e.jsx("span",{className:"text-[10px] font-mono text-text-tertiary",children:t.source}),className:"w-24"},{key:"subscriber_count",label:"Subscribers",render:t=>{const a=t.subscriber_count??0;return a?e.jsx("span",{className:"inline-flex items-center justify-center min-w-[20px] px-1.5 py-0.5 rounded-full text-[10px] font-medium bg-accent/15 text-accent",children:a}):e.jsx("span",{className:"text-text-quaternary",children:"—"})},className:"w-24 text-center"},{key:"last_seen_at",label:"Last Seen",render:t=>t.last_seen_at?e.jsx("span",{className:"whitespace-nowrap",children:e.jsx(h,{date:t.last_seen_at})}):e.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-28"}];function D(){const t=v(),{filters:a,setFilter:n,pagination:s}=m({filters:{category:""}}),{data:o,isLoading:l,refetch:c,isFetching:p}=x({category:a.category||void 0,limit:s.pageSize,offset:s.offset}),i=(o==null?void 0:o.total)??0;return e.jsxs("div",{children:[e.jsx(f,{title:"Topic Catalog",docsHash:"#docs:topics.md"}),e.jsx(d,{actions:e.jsx(y,{onRefresh:()=>c(),isFetching:p,apiPath:`/topics?limit=${s.pageSize}&offset=${s.offset}${a.category?`&category=${a.category}`:""}`}),children:e.jsx(b,{label:"Category",value:a.category,onChange:r=>n("category",r),options:N})}),e.jsx(g,{columns:P,data:(o==null?void 0:o.topics)??[],keyFn:r=>r.topic,onRowClick:r=>t(`/topics/${encodeURIComponent(r.topic)}`),isLoading:l,emptyMessage:"No topics registered yet"}),e.jsx(u,{page:s.page,totalPages:s.totalPages(i),onPageChange:s.setPage,total:i,pageSize:s.pageSize,onPageSizeChange:s.setPageSize})]})}export{D as TopicsPage};
|
|
2
|
+
//# sourceMappingURL=TopicsPage-Bc-4ne6V.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopicsPage-
|
|
1
|
+
{"version":3,"file":"TopicsPage-Bc-4ne6V.js","sources":["../../src/pages/topics/TopicsPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Radio } from 'lucide-react';\nimport { useTopics, type TopicCatalogEntry } from '../../api/topics';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { DateValue } from '../../components/common/display/DateValue';\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\nconst CATEGORY_OPTIONS = [\n { value: 'task', label: 'Task' },\n { value: 'workflow', label: 'Workflow' },\n { value: 'escalation', label: 'Escalation' },\n { value: 'activity', label: 'Activity' },\n { value: 'knowledge', label: 'Knowledge' },\n { value: 'agent', label: 'Agent' },\n { value: 'app', label: 'App' },\n { value: 'milestone', label: 'Milestone' },\n];\n\nfunction CategoryPill({ category }: { category: string }) {\n const cls = CATEGORY_COLORS[category] ?? 'bg-zinc-400/15 text-zinc-400';\n return (\n <span className={`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${cls}`}>\n {category}\n </span>\n );\n}\n\nconst columns: Column<TopicCatalogEntry>[] = [\n {\n key: 'topic',\n label: 'Topic',\n render: (row) => (\n <div className=\"flex items-center gap-2 min-w-0\">\n <Radio className=\"w-3 h-3 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n <span className=\"text-xs font-mono text-text-primary truncate\">{row.topic}</span>\n </div>\n ),\n },\n {\n key: 'category',\n label: 'Category',\n render: (row) => <CategoryPill category={row.category} />,\n className: 'w-28',\n },\n {\n key: 'description',\n label: 'Description',\n render: (row) => row.description\n ? <span className=\"text-[11px] text-text-secondary truncate block max-w-xs\">{row.description}</span>\n : <span className=\"text-text-quaternary\">—</span>,\n },\n {\n key: 'source',\n label: 'Source',\n render: (row) => (\n <span className=\"text-[10px] font-mono text-text-tertiary\">{row.source}</span>\n ),\n className: 'w-24',\n },\n {\n key: 'subscriber_count',\n label: 'Subscribers',\n render: (row) => {\n const count = row.subscriber_count ?? 0;\n if (!count) return <span className=\"text-text-quaternary\">—</span>;\n return (\n <span className=\"inline-flex items-center justify-center min-w-[20px] px-1.5 py-0.5 rounded-full text-[10px] font-medium bg-accent/15 text-accent\">\n {count}\n </span>\n );\n },\n className: 'w-24 text-center',\n },\n {\n key: 'last_seen_at',\n label: 'Last Seen',\n render: (row) => row.last_seen_at\n ? <span className=\"whitespace-nowrap\"><DateValue date={row.last_seen_at} /></span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-28',\n },\n];\n\nexport function TopicsPage() {\n const navigate = useNavigate();\n\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { category: '' },\n });\n\n const { data, isLoading, refetch, isFetching } = useTopics({\n category: filters.category || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader title=\"Topic Catalog\" docsHash=\"#docs:topics.md\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/topics?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.category ? `&category=${filters.category}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Category\"\n value={filters.category}\n onChange={(v) => setFilter('category', v)}\n options={CATEGORY_OPTIONS}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.topics ?? []}\n keyFn={(row) => row.topic}\n onRowClick={(row) => navigate(`/topics/${encodeURIComponent(row.topic)}`)}\n isLoading={isLoading}\n emptyMessage=\"No topics registered yet\"\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":["CATEGORY_COLORS","CATEGORY_OPTIONS","CategoryPill","category","cls","columns","row","jsxs","jsx","Radio","count","DateValue","TopicsPage","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","data","isLoading","refetch","isFetching","useTopics","total","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as r}from"./vendor-query-B2UbickB.js";import{a as t}from"./users-
|
|
2
|
-
//# sourceMappingURL=UserName-
|
|
1
|
+
import{j as r}from"./vendor-query-B2UbickB.js";import{a as t}from"./users-ChQ7soaq.js";function m({userId:a,fallback:s}){const{data:e}=t(a);return e?r.jsx(r.Fragment,{children:e.display_name||e.email||e.external_id}):r.jsx(r.Fragment,{children:s??`${a.slice(0,8)}…`})}export{m as U};
|
|
2
|
+
//# sourceMappingURL=UserName-O2Q4-E6E.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserName-
|
|
1
|
+
{"version":3,"file":"UserName-O2Q4-E6E.js","sources":["../../src/components/common/display/UserName.tsx"],"sourcesContent":["import { useUser } from '../../../api/users';\n\n/**\n * Resolves a user ID to their display name (or email, or truncated ID as fallback).\n * Renders inline — suitable for use inside <span>, <p>, etc.\n */\nexport function UserName({ userId, fallback }: { userId: string; fallback?: string }) {\n const { data: resolved } = useUser(userId);\n\n if (resolved) {\n return <>{resolved.display_name || resolved.email || resolved.external_id}</>;\n }\n\n // Still loading or no record — show fallback or truncated ID\n return <>{fallback ?? `${userId.slice(0, 8)}…`}</>;\n}\n"],"names":["UserName","userId","fallback","resolved","useUser","jsx","Fragment"],"mappings":"uFAMO,SAASA,EAAS,CAAE,OAAAC,EAAQ,SAAAC,GAAmD,CACpF,KAAM,CAAE,KAAMC,GAAaC,EAAQH,CAAM,EAEzC,OAAIE,oBACQ,SAAAA,EAAS,cAAgBA,EAAS,OAASA,EAAS,YAAY,EAIrEE,EAAAA,IAAAC,EAAAA,SAAA,CAAG,YAAY,GAAGL,EAAO,MAAM,EAAG,CAAC,CAAC,GAAA,CAAI,CACjD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e,a as k}from"./vendor-query-B2UbickB.js";import{a as I,
|
|
2
|
-
//# sourceMappingURL=WorkflowExecutionPage-
|
|
1
|
+
import{j as e,a as k}from"./vendor-query-B2UbickB.js";import{a as I,f as P}from"./workflows-BLKji1_1.js";import{h as R}from"./useEventHooks-Cd1GM1NG.js";import{u as S}from"./useCollapsedSections-BU5HULGs.js";import{b as L,e as A}from"./tasks-CwjvPECN.js";import{c as y,D as U,J as N,e as M}from"./index-B7lEd0cY.js";import{P as V}from"./PageHeader-Bnt2iQQa.js";import{C as b}from"./CollapsibleSection-BeBsI1M4.js";import{L as D}from"./ListToolbar-DqaRlXrF.js";import{S as _}from"./StatusBadge-XQlNFwmH.js";import{C as K}from"./CopyableId-DaT0ZRHg.js";import{L as u,e as Q,c as z}from"./vendor-react-CXumBFUA.js";import{S as B}from"./SwimlaneTimeline-BZmad7WQ.js";import{E as H}from"./EventTable-NIhWP__B.js";import"./vendor-icons-Dj2F0Jrb.js";import"./FilterBar-Ck4K4rzu.js";function m({label:t,value:a,mono:s,truncate:r,children:n}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:t}),n||e.jsx("p",{className:`text-xs text-text-primary ${s?"font-mono":""} ${r?"truncate":""}`,title:r?a:void 0,children:a})]})}function J(t){const a=t.lastIndexOf("-");return a<=0?{taskQueue:t,workflowType:t}:{taskQueue:t.substring(0,a),workflowType:t.substring(a+1)}}function O({execution:t,task:a,escalations:s}){const r=t.parent_workflow_id,l=a&&a.workflow_id===t.workflow_id?a.parent_workflow_id:null,d=r||l||null,c=d&&d!==t.workflow_id?d:null,{taskQueue:o,workflowType:f}=J(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(K,{label:"Workflow Type",value:f,href:`/workflows/executions?entity=${encodeURIComponent(f)}`}),e.jsx(m,{label:"Task Queue",value:o,mono:!0}),e.jsx(m,{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(m,{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(m,{label:"Duration",children:e.jsx(U,{ms:t.duration_ms,className:"font-mono text-text-primary"})}),e.jsx(m,{label:"History Size",value:`${t.summary.total_events} events`}),e.jsx(m,{label:"Activities",value:`${t.summary.activities.completed} / ${t.summary.activities.total}`}),e.jsx(m,{label:"Workflow ID",value:t.workflow_id,mono:!0,truncate:!0})]}),(c||s&&s.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(u,{to:`/workflows/executions/${c}`,className:"text-xs font-mono text-accent hover:underline truncate",title:c,children:c})]}),!1,s&&s.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:s.length===1?"Escalation":"Escalations"}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1",children:s.map(p=>e.jsxs(u,{to:`/escalations/detail/${p.id}`,className:"inline-flex items-center gap-1.5 text-xs font-mono text-accent hover:underline",children:[e.jsx("span",{children:p.type}),e.jsx(_,{status:p.status})]},p.id))})]})]})]})}function F(t){var r;const a=t.events.find(n=>n.event_type==="workflow_execution_started"),s=(r=a==null?void 0:a.attributes)==null?void 0:r.input;return s&&typeof s=="object"?s:null}function q({execution:t}){const a=F(t),s=t.result,r=(s==null?void 0:s.data)??s??null;return!a&&!r?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"})}),r!==null&&e.jsx("div",{children:e.jsx(N,{data:r,label:"Result"})})]})}function Z({isRunning:t,hasToolCalls:a,workflowId:s,onAction:r}){const[n,l]=k.useState(!1),d=k.useRef(null);return k.useEffect(()=>{if(!n)return;const c=o=>{d.current&&!d.current.contains(o.target)&&l(!1)};return document.addEventListener("mousedown",c),()=>document.removeEventListener("mousedown",c)},[n]),e.jsxs("div",{className:"relative",ref:d,children:[e.jsx("button",{onClick:()=>l(!n),className:"btn-primary text-xs",children:"Actions"}),n&&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:()=>{r("restart"),l(!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:()=>{r("terminate"),l(!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(u,{to:`/mcp/queries/${s}?step=3`,className:"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover",onClick:()=>l(!1),children:"Compile into Pipeline"}),e.jsx(u,{to:`/mcp/executions/${encodeURIComponent(s)}?namespace=durable`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"View Pipeline Execution"}),e.jsx(u,{to:`/admin/streams?source=worker&jid=${encodeURIComponent(s)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"Worker Messages"}),e.jsx(u,{to:`/admin/streams?source=engine&jid=${encodeURIComponent(s)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"Engine Messages"})]})]})}function ue(){const{workflowId:t}=Q();R(t);const a="Workflow Execution",{data:s,isLoading:r,error:n,refetch:l,isFetching:d}=I(t),{data:c}=L(t),{data:o}=A(t),{data:f}=M(t),p=z(),h=P(),{isCollapsed:w,toggle:v}=S("workflow-execution"),C=x=>{var i;if(x==="terminate")confirm("Are you sure you want to terminate this workflow?")&&h.mutate(t);else if(x==="restart"&&s){const $=s.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/,""),j=s.events.find(W=>W.event_type==="workflow_execution_started"),g=(i=j==null?void 0:j.attributes)==null?void 0:i.input;g&&sessionStorage.setItem("lt:invoke:prefill",JSON.stringify(g)),p(`/workflows/start?type=${encodeURIComponent($)}&mode=now`)}};if(r)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)??"",i=x.includes("expired")||x.includes("no longer available");return e.jsxs("div",{children:[e.jsx(u,{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:i?"Execution data is no longer available":n?"Unable to load execution":"Execution not found"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:i?"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 E=s.status!=="completed"&&s.status!=="failed",T=s.status==="completed"&&s.events.some(x=>{if(x.event_type!=="activity_task_completed")return!1;const i=x.attributes.activity_type;return i==="callDbTool"||i==="callVisionTool"||i==="callMcpTool"||(i==null?void 0:i.startsWith("mcp_"))});return e.jsxs("div",{children:[e.jsx(V,{title:a,actions:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(D,{onRefresh:()=>l(),isFetching:d,apiPath:`/workflow-states/${t}/execution`}),e.jsx(_,{status:s.status}),e.jsx(Z,{isRunning:E,hasToolCalls:T,workflowId:t,onAction:C})]})}),e.jsx(O,{execution:s,task:c,childTasks:o==null?void 0:o.tasks,escalations:f==null?void 0:f.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(b,{title:"Details",sectionKey:"details",isCollapsed:w("details"),onToggle:v,contentClassName:"mt-4 ml-9",children:e.jsx(q,{execution:s})}),e.jsx(b,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:w("timeline"),onToggle:v,contentClassName:"mt-4 ml-9",children:e.jsx(B,{events:s.events,childTasks:o==null?void 0:o.tasks})}),e.jsx(b,{title:"Events",sectionKey:"events",isCollapsed:w("events"),onToggle:v,contentClassName:"mt-4 ml-9",children:e.jsx(H,{events:s.events,childTasks:o==null?void 0:o.tasks})})]})]})}export{ue as WorkflowExecutionPage};
|
|
2
|
+
//# sourceMappingURL=WorkflowExecutionPage-DEDsBmn1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowExecutionPage-Cfx-xlRT.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, 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 Pipeline Execution\n </Link>\n <Link\n to={`/admin/streams?source=worker&jid=${encodeURIComponent(workflowId)}`}\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 Worker Messages\n </Link>\n <Link\n to={`/admin/streams?source=engine&jid=${encodeURIComponent(workflowId)}`}\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 Engine Messages\n </Link>\n </div>\n )}\n </div>\n );\n}\n\nexport function WorkflowExecutionPage() {\n const { workflowId } = useParams<{ workflowId: string }>();\n useWorkflowDetailEvents(workflowId);\n\n const executionTitle = 'Workflow 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","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
|
+
{"version":3,"file":"WorkflowExecutionPage-DEDsBmn1.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, 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 Pipeline Execution\n </Link>\n <Link\n to={`/admin/streams?source=worker&jid=${encodeURIComponent(workflowId)}`}\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 Worker Messages\n </Link>\n <Link\n to={`/admin/streams?source=engine&jid=${encodeURIComponent(workflowId)}`}\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 Engine Messages\n </Link>\n </div>\n )}\n </div>\n );\n}\n\nexport function WorkflowExecutionPage() {\n const { workflowId } = useParams<{ workflowId: string }>();\n useWorkflowDetailEvents(workflowId);\n\n const executionTitle = 'Workflow 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","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 +1,2 @@
|
|
|
1
|
-
import{j as
|
|
2
|
-
//# sourceMappingURL=WorkflowPill-
|
|
1
|
+
import{j as g}from"./vendor-query-B2UbickB.js";import{W as p,Z as u,b as m,S as d,ad as h}from"./vendor-icons-Dj2F0Jrb.js";const a=[{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 f(t){let x=0;for(let s=0;s<t.length;s++)x=(x<<5)-x+t.charCodeAt(s)|0;return Math.abs(x)}function k(t){return a[f(t)%a.length]}const y={certified:h,configured:d,pipeline:m,capability:u,durable:p},w={certified:{text:"text-status-success",bg:"bg-status-success/10"},configured:{text:"text-amber-500/70",bg:"bg-amber-200/[0.12]"}},C={xs:{bulb:"w-4 h-4",icon:"w-2 h-2",text:"text-[9px]",pad:"pr-1.5 pl-0.5",gap:"-ml-1"},sm:{bulb:"w-5 h-5",icon:"w-2.5 h-2.5",text:"text-[11px]",pad:"pr-2 pl-1",gap:"-ml-1.5"},md:{bulb:"w-6 h-6",icon:"w-3 h-3",text:"text-[13px]",pad:"pr-2.5 pl-1.5",gap:"-ml-2"}};function I({type:t,size:x="sm",certified:s,variant:r}){const l=r??(s?"certified":"durable"),i=y[l],b=C[x],e=w[l],n=e?null:k(t),c=(e==null?void 0:e.text)??(n==null?void 0:n.text)??"text-accent/75",o=(e==null?void 0:e.bg)??(n==null?void 0:n.bg)??"bg-accent/[0.08]";return g.jsxs("span",{className:"inline-flex items-center",children:[g.jsx("span",{className:`${b.bulb} rounded-full ${o} inline-flex items-center justify-center shrink-0 z-[1]`,children:g.jsx(i,{className:`${b.icon} ${c}`})}),g.jsx("span",{className:`${b.gap} ${b.pad} ${o} rounded-r-full font-mono text-text-secondary`,style:{fontSize:b.text==="text-[9px]"?"9px":b.text==="text-[11px]"?"11px":"13px",lineHeight:1.4},children:t})]})}export{I as W};
|
|
2
|
+
//# sourceMappingURL=WorkflowPill-F1oKUzmc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowPill-
|
|
1
|
+
{"version":3,"file":"WorkflowPill-F1oKUzmc.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, SlidersHorizontal, 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: SlidersHorizontal,\n pipeline: Wand2,\n capability: Zap,\n durable: Workflow,\n};\n\nconst VARIANT_FIXED_COLOR: Record<string, { text: string; bg: string }> = {\n certified: { text: 'text-status-success', bg: 'bg-status-success/10' },\n configured: { text: 'text-amber-500/70', bg: 'bg-amber-200/[0.12]' },\n};\n\nconst SIZE_CONFIG = {\n xs: { bulb: 'w-4 h-4', icon: 'w-2 h-2', text: 'text-[9px]', pad: 'pr-1.5 pl-0.5', gap: '-ml-1' },\n sm: { bulb: 'w-5 h-5', icon: 'w-2.5 h-2.5', text: 'text-[11px]', pad: 'pr-2 pl-1', gap: '-ml-1.5' },\n md: { bulb: 'w-6 h-6', icon: 'w-3 h-3', text: 'text-[13px]', pad: 'pr-2.5 pl-1.5', gap: '-ml-2' },\n} as const;\n\nexport function WorkflowPill({ type, size = 'sm', certified, variant }: WorkflowPillProps) {\n const resolved = variant ?? (certified ? 'certified' : 'durable');\n const Icon = VARIANT_ICON[resolved];\n const s = SIZE_CONFIG[size];\n\n const fixed = VARIANT_FIXED_COLOR[resolved];\n const derived = fixed ? null : typeColor(type);\n const iconColor = fixed?.text ?? derived?.text ?? 'text-accent/75';\n const bgColor = fixed?.bg ?? derived?.bg ?? 'bg-accent/[0.08]';\n\n return (\n <span className=\"inline-flex items-center\">\n {/* Bulb — circular icon container */}\n <span className={`${s.bulb} rounded-full ${bgColor} inline-flex items-center justify-center shrink-0 z-[1]`}>\n <Icon className={`${s.icon} ${iconColor}`} />\n </span>\n {/* Label — extends right, overlapping the bulb */}\n <span\n className={`${s.gap} ${s.pad} ${bgColor} rounded-r-full font-mono text-text-secondary`}\n style={{ fontSize: s.text === 'text-[9px]' ? '9px' : s.text === 'text-[11px]' ? '11px' : '13px', lineHeight: 1.4 }}\n >\n {type}\n </span>\n </span>\n );\n}\n"],"names":["PALETTE","hash","str","h","i","typeColor","typeName","VARIANT_ICON","ShieldCheck","SlidersHorizontal","Wand2","Zap","Workflow","VARIANT_FIXED_COLOR","SIZE_CONFIG","WorkflowPill","type","size","certified","variant","resolved","Icon","s","fixed","derived","iconColor","bgColor","jsxs","jsx"],"mappings":"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"}
|
package/dashboard/dist/assets/{WorkflowsDashboard-DC4XHMWt.js → WorkflowsDashboard-Bcf17vCt.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as u,j as s}from"./vendor-query-B2UbickB.js";import{T as h}from"./TimestampCell-
|
|
2
|
-
//# sourceMappingURL=WorkflowsDashboard-
|
|
1
|
+
import{a as u,j as s}from"./vendor-query-B2UbickB.js";import{T as h}from"./TimestampCell-DPpoTdrw.js";import{E as R}from"./ElapsedCell-WdzqA0dR.js";import{u as W,d as z,b as E}from"./workflows-BLKji1_1.js";import{j as A}from"./index-B7lEd0cY.js";import{u as L}from"./useNamespace-D9lghZ25.js";import{b as M}from"./useEventHooks-Cd1GM1NG.js";import{u as I}from"./useFilterParams-x-Dg0Vgz.js";import{D as U}from"./DataTable-D9yuBv0w.js";import{W as O}from"./WorkflowPill-F1oKUzmc.js";import{P as B}from"./PageHeader-Bnt2iQQa.js";import{F as H,b as f}from"./FilterBar-Ck4K4rzu.js";import{S as G}from"./StickyPagination-BWhFSr2d.js";import{L as J}from"./ListToolbar-DqaRlXrF.js";import{R as V,a as w}from"./RowActions-Dg-Fsm5O.js";import{u as q,y as K}from"./vendor-icons-Dj2F0Jrb.js";import{c as Q}from"./vendor-react-CXumBFUA.js";import"./controlplane-Bihd1kXf.js";import"./EmptyState-BcsfPq9T.js";const X={running:"in_progress",completed:"completed",failed:"failed"},Y={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},Z={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function ee(d,n,p,m,a){return[{key:"workflow_id",label:"Workflow ID / Type",render:e=>{const o=Y[X[e.status]??e.status]??"bg-status-pending",r=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 ${o}${r}`,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:s.jsx(O,{type:e.entity,variant:a.get(e.entity)??"durable",size:"xs"})})]})]})}},{key:"created_at",label:"Created",render:e=>s.jsx(h,{date:e.created_at}),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:e=>s.jsx(h,{date:e.updated_at}),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:e=>s.jsx(R,{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(V,{children:[s.jsx(w,{icon:q,title:`Filter by ${e.entity}`,onClick:()=>d(e.entity)}),s.jsx("button",{onClick:o=>{o.stopPropagation(),n(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] ${Z[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"})})}),p&&s.jsx(w,{icon:K,title:"View config",onClick:()=>m(`/workflows/registry/${encodeURIComponent(e.entity)}`)})]}),className:"w-24 text-right"}]}function we({tier:d="all"}){M();const n=Q(),{isSuperAdmin:p}=A(),{namespace:m}=L(),{filters:a,setFilter:e,pagination:o,sort:r,setSort:v}=I({filters:{search:"",entity:"",status:"",tier:d}}),l=a.tier||"all",k=l==="certified"?"true":l==="durable"?"false":void 0,{data:g}=W(),{data:x}=z(),j=u.useMemo(()=>{const t=new Map;for(const y of x??[])t.set(y.workflow_type,y.tier??"durable");return t},[x]),S=ee(t=>e("entity",t),t=>e("status",t),p,n,j),[c,C]=u.useState(a.search);u.useEffect(()=>{if(c===a.search)return;const t=setTimeout(()=>e("search",c),300);return()=>clearTimeout(t)},[c,e,a.search]);const{data:i,isLoading:_,refetch:$,isFetching:N}=E({limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:k,namespace:m||void 0}),b=(i==null?void 0:i.total)??0,T=(i==null?void 0:i.jobs)??[],P=u.useMemo(()=>[...new Set((g??[]).map(t=>t.workflow_type))].sort(),[g]),F="Workflow Executions",D=l==="certified"?"No certified workflow executions found":l==="durable"?"No durable workflow executions found":"No workflow executions found";return s.jsxs("div",{children:[s.jsx(B,{title:F,docsHash:"#docs:dashboard.md:durable-executions"}),s.jsxs(H,{actions:s.jsx(J,{onRefresh:()=>$(),isFetching:N,apiPath:`/workflow-states/jobs?limit=${o.pageSize}&offset=${o.offset}${a.entity?`&entity=${a.entity}`:""}${a.search?`&search=${a.search}`:""}${a.status?`&status=${a.status}`:""}${r.sort_by?`&sort_by=${r.sort_by}&order=${r.order}`:""}`}),children:[s.jsx("input",{type:"text",placeholder:"Search workflow ID...",value:c,onChange:t=>C(t.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(f,{label:"Type",value:a.entity,onChange:t=>e("entity",t),options:P.map(t=>({value:t,label:t}))}),s.jsx(f,{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(f,{label:"Tier",value:a.tier==="all"?"":a.tier,onChange:t=>e("tier",t||"all"),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]})]}),s.jsx(U,{columns:S,data:T,keyFn:t=>t.workflow_id,onRowClick:t=>n(`/workflows/executions/${t.workflow_id}`),isLoading:_,emptyMessage:D,sort:r,onSort:v}),s.jsx(G,{page:o.page,totalPages:o.totalPages(b),onPageChange:o.setPage,total:b,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{we as WorkflowsDashboard};
|
|
2
|
+
//# sourceMappingURL=WorkflowsDashboard-Bcf17vCt.js.map
|