@hotmeshio/long-tail 0.1.21 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/agent-subscriptions.d.ts +15 -0
- package/build/api/agent-subscriptions.js +82 -0
- package/build/api/agents.d.ts +21 -0
- package/build/api/agents.js +100 -0
- package/build/api/capabilities.d.ts +2 -0
- package/build/api/capabilities.js +76 -0
- package/build/index.d.ts +2 -2
- package/build/index.js +5 -2
- package/build/lib/db/schemas/003_agents.sql +46 -0
- package/build/lib/db/schemas/004_agent_subscriptions.sql +38 -0
- package/build/lib/db/schemas/005_server_category.sql +6 -0
- package/build/lib/db/schemas/006_agent_sub_unique.sql +9 -0
- package/build/lib/events/callback.d.ts +4 -18
- package/build/lib/events/callback.js +8 -45
- package/build/lib/events/matching.d.ts +13 -0
- package/build/lib/events/matching.js +31 -0
- package/build/lib/events/publish.d.ts +20 -0
- package/build/lib/events/publish.js +33 -0
- package/build/routes/agents.d.ts +2 -0
- package/build/routes/agents.js +130 -0
- package/build/routes/capabilities.d.ts +2 -0
- package/build/routes/capabilities.js +47 -0
- package/build/routes/index.js +4 -0
- package/build/sdk/index.d.ts +13 -0
- package/build/sdk/index.js +14 -0
- package/build/services/agent/index.d.ts +32 -0
- package/build/services/agent/index.js +195 -0
- package/build/services/agent/input-mapper.d.ts +18 -0
- package/build/services/agent/input-mapper.js +51 -0
- package/build/services/agent/sql.d.ts +10 -0
- package/build/services/agent/sql.js +70 -0
- package/build/services/agent/subscription-sql.d.ts +7 -0
- package/build/services/agent/subscription-sql.js +49 -0
- package/build/services/agent/subscriptions.d.ts +30 -0
- package/build/services/agent/subscriptions.js +82 -0
- package/build/services/agent/trigger-registry.d.ts +45 -0
- package/build/services/agent/trigger-registry.js +232 -0
- package/build/services/cron/index.d.ts +17 -1
- package/build/services/cron/index.js +152 -4
- package/build/services/insight/index.js +11 -6
- package/build/services/mcp/db.d.ts +1 -0
- package/build/services/mcp/db.js +1 -0
- package/build/services/mcp/sql.d.ts +1 -1
- package/build/services/mcp/sql.js +2 -2
- package/build/start/workers.js +67 -0
- package/build/system/activities/knowledge.js +9 -2
- package/build/system/index.d.ts +2 -1
- package/build/system/index.js +93 -1
- package/build/system/mcp-servers/events.d.ts +5 -0
- package/build/system/mcp-servers/events.js +104 -0
- package/build/system/mcp-servers/playwright/schemas.d.ts +6 -6
- package/build/system/seed/tool-manifests-events.d.ts +37 -0
- package/build/system/seed/tool-manifests-events.js +30 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/agent.d.ts +72 -0
- package/build/types/agent.js +6 -0
- package/build/types/events.d.ts +7 -1
- package/build/types/index.d.ts +2 -1
- package/build/types/mcp.d.ts +2 -0
- package/build/types/startup.d.ts +37 -0
- package/dashboard/dist/assets/{AdminDashboard-CsTOErp1.js → AdminDashboard-DThDjhN5.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-CsTOErp1.js.map → AdminDashboard-DThDjhN5.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-NgxblxBW.js +13 -0
- package/dashboard/dist/assets/AgentConfigPage-NgxblxBW.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-DMS46nYY.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-DMS46nYY.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-pKfjHe4u.js +2 -0
- package/dashboard/dist/assets/AgentsPage-pKfjHe4u.js.map +1 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-BqQA3IJp.js → AvailableEscalationsPage-BFzHVnPh.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-BqQA3IJp.js.map → AvailableEscalationsPage-BFzHVnPh.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-Zxf7Npew.js +2 -0
- package/dashboard/dist/assets/BotPicker-Zxf7Npew.js.map +1 -0
- package/dashboard/dist/assets/CapabilitiesPage-6zOJ12cB.js +2 -0
- package/dashboard/dist/assets/CapabilitiesPage-6zOJ12cB.js.map +1 -0
- package/dashboard/dist/assets/{CollapsibleSection-CRtHQsAv.js → CollapsibleSection-DvBx4tmw.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CRtHQsAv.js.map → CollapsibleSection-DvBx4tmw.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-C7XT1bnO.js → CredentialsPage-C5f-Bg-o.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-C7XT1bnO.js.map → CredentialsPage-C5f-Bg-o.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-CAVTt5AG.js +2 -0
- package/dashboard/dist/assets/CronLabel-CAVTt5AG.js.map +1 -0
- package/dashboard/dist/assets/{CustomDurationPicker-BABUv1V2.js → CustomDurationPicker-Bk7D38y7.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-BABUv1V2.js.map → CustomDurationPicker-Bk7D38y7.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-D3-wSEf0.js → DataTable-D9yuBv0w.js} +2 -2
- package/dashboard/dist/assets/{DataTable-D3-wSEf0.js.map → DataTable-D9yuBv0w.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-DHKmMqRA.js → DropZone-2mGyDo1P.js} +2 -2
- package/dashboard/dist/assets/{DropZone-DHKmMqRA.js.map → DropZone-2mGyDo1P.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-DrJif03B.js → ElapsedCell-BpJjG1s-.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DrJif03B.js.map → ElapsedCell-BpJjG1s-.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-H6CwfeR-.js → EscalationsOverview-DPNd1vjF.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-H6CwfeR-.js.map → EscalationsOverview-DPNd1vjF.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-Dh3_9DAY.js → EventTable-BoP8KC3M.js} +2 -2
- package/dashboard/dist/assets/{EventTable-Dh3_9DAY.js.map → EventTable-BoP8KC3M.js.map} +1 -1
- package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js +2 -0
- package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js.map +1 -0
- package/dashboard/dist/assets/HomePage-h8I5ZolJ.js +2 -0
- package/dashboard/dist/assets/HomePage-h8I5ZolJ.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-BaYIIsAt.js +2 -0
- package/dashboard/dist/assets/ListToolbar-BaYIIsAt.js.map +1 -0
- package/dashboard/dist/assets/{McpOverview-ChLa6Gl7.js → McpOverview-BhZ3lSO6.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-ChLa6Gl7.js.map → McpOverview-BhZ3lSO6.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DVgcKa61.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-DVgcKa61.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-D2DmDFPu.js → McpQueryPage-CTWOBqKT.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-D2DmDFPu.js.map → McpQueryPage-CTWOBqKT.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-ERVuNEEK.js → McpRunDetailPage-CIpZJWRB.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-ERVuNEEK.js.map → McpRunDetailPage-CIpZJWRB.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-B3zpzPBf.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-B3zpzPBf.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-CJm_BTPU.js → OperatorDashboard-l2hVlIF3.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-CJm_BTPU.js.map → OperatorDashboard-l2hVlIF3.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-B-SN5GZ2.js → PageHeader-DLjHNYHX.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-B-SN5GZ2.js.map → PageHeader-DLjHNYHX.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BZ3AGT5s.js → PageHeaderWithStats-Oljg3n4j.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BZ3AGT5s.js.map → PageHeaderWithStats-Oljg3n4j.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-vfnCDyQK.js → ProcessDetailPage-BJ1rhK9_.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-vfnCDyQK.js.map → ProcessDetailPage-BJ1rhK9_.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DcAN6AJK.js → ProcessesListPage-IQKk_qkn.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DcAN6AJK.js.map → ProcessesListPage-IQKk_qkn.js.map} +1 -1
- package/dashboard/dist/assets/RolePill-Bp10-WfX.js +2 -0
- package/dashboard/dist/assets/RolePill-Bp10-WfX.js.map +1 -0
- package/dashboard/dist/assets/{RolesPage-DYSt2aAr.js → RolesPage-Dwcirtze.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DYSt2aAr.js.map → RolesPage-Dwcirtze.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-D4Fu8LVG.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-D4Fu8LVG.js.map +1 -0
- package/dashboard/dist/assets/ServerName-C9lUCFYb.js +2 -0
- package/dashboard/dist/assets/ServerName-C9lUCFYb.js.map +1 -0
- package/dashboard/dist/assets/SwimlaneTimeline-DQqgvwmC.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-DQqgvwmC.js.map +1 -0
- package/dashboard/dist/assets/{TagInput-DftaRHDV.js → TagInput-Dkljw_WI.js} +2 -2
- package/dashboard/dist/assets/{TagInput-DftaRHDV.js.map → TagInput-Dkljw_WI.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BoA-cfwW.js → TaskDetailPage-AHBMSHAA.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BoA-cfwW.js.map → TaskDetailPage-AHBMSHAA.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Ce8KlXtR.js → TaskQueuePill-DPwm25Cc.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Ce8KlXtR.js.map → TaskQueuePill-DPwm25Cc.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-g6XIbhju.js → TasksListPage-CnJdTsoX.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-g6XIbhju.js.map → TasksListPage-CnJdTsoX.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BihIwEbB.js → TimeAgo-C3A1r1Cv.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BihIwEbB.js.map → TimeAgo-C3A1r1Cv.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-GOFcvE-i.js → TimestampCell-DPfLR6bZ.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-GOFcvE-i.js.map → TimestampCell-DPfLR6bZ.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js +2 -0
- package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js.map +1 -0
- package/dashboard/dist/assets/ToolTestPanel-CwZ9zkD-.js +2 -0
- package/dashboard/dist/assets/ToolTestPanel-CwZ9zkD-.js.map +1 -0
- package/dashboard/dist/assets/{UserName-CmMVt4vS.js → UserName-ClO0a6Ar.js} +2 -2
- package/dashboard/dist/assets/{UserName-CmMVt4vS.js.map → UserName-ClO0a6Ar.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-soRFz_30.js → WorkflowExecutionPage-B-2aHAHK.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-soRFz_30.js.map → WorkflowExecutionPage-B-2aHAHK.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-DUDDyBsj.js → WorkflowPill-BbgVTGgI.js} +2 -2
- package/dashboard/dist/assets/WorkflowPill-BbgVTGgI.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-NtiQKl_i.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-NtiQKl_i.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-z3Ztiz1y.js → WorkflowsOverview-BQip_pvL.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-z3Ztiz1y.js.map → WorkflowsOverview-BQip_pvL.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BWFCVQ8b.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-BWFCVQ8b.js.map +1 -0
- package/dashboard/dist/assets/agents-5APoyRH8.js +2 -0
- package/dashboard/dist/assets/agents-5APoyRH8.js.map +1 -0
- package/dashboard/dist/assets/{bots-BZPXDh_y.js → bots-BoDH-pS7.js} +2 -2
- package/dashboard/dist/assets/{bots-BZPXDh_y.js.map → bots-BoDH-pS7.js.map} +1 -1
- package/dashboard/dist/assets/controlplane-D4NhQux3.js +2 -0
- package/dashboard/dist/assets/controlplane-D4NhQux3.js.map +1 -0
- package/dashboard/dist/assets/{escalation-DBUIq1Z4.js → escalation-BD2wtAt2.js} +2 -2
- package/dashboard/dist/assets/{escalation-DBUIq1Z4.js.map → escalation-BD2wtAt2.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-DjHcNgjo.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-DL4zsR8Y.js.map → escalation-columns-DjHcNgjo.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-D50KFFkI.js → helpers-D1ZPA4kI.js} +2 -2
- package/dashboard/dist/assets/{helpers-D50KFFkI.js.map → helpers-D1ZPA4kI.js.map} +1 -1
- package/dashboard/dist/assets/index-B-Z9TisY.js +2 -0
- package/dashboard/dist/assets/index-B-Z9TisY.js.map +1 -0
- package/dashboard/dist/assets/index-B6vQeWwf.js +6 -0
- package/dashboard/dist/assets/index-B6vQeWwf.js.map +1 -0
- package/dashboard/dist/assets/{index-D9_hZmsW.js → index-BD2vW8MG.js} +3 -3
- package/dashboard/dist/assets/{index-D9_hZmsW.js.map → index-BD2vW8MG.js.map} +1 -1
- package/dashboard/dist/assets/index-BciXgS35.css +1 -0
- package/dashboard/dist/assets/index-BgJR7kwH.js +2 -0
- package/dashboard/dist/assets/index-BgJR7kwH.js.map +1 -0
- package/dashboard/dist/assets/index-D9qswqDQ.js +2 -0
- package/dashboard/dist/assets/{index-BpoHVMV7.js.map → index-D9qswqDQ.js.map} +1 -1
- package/dashboard/dist/assets/index-DC7f6rWu.js +2 -0
- package/dashboard/dist/assets/{index-CEnDYJOO.js.map → index-DC7f6rWu.js.map} +1 -1
- package/dashboard/dist/assets/{index-B-jzKfuv.js → index-Zn5XforP.js} +2 -2
- package/dashboard/dist/assets/{index-B-jzKfuv.js.map → index-Zn5XforP.js.map} +1 -1
- package/dashboard/dist/assets/index-_5qNyf9o.js +2 -0
- package/dashboard/dist/assets/index-_5qNyf9o.js.map +1 -0
- package/dashboard/dist/assets/index-_dKxJhey.js +2 -0
- package/dashboard/dist/assets/{index-DzICLMI7.js.map → index-_dKxJhey.js.map} +1 -1
- package/dashboard/dist/assets/index-jp94-YlF.js +2 -0
- package/dashboard/dist/assets/index-jp94-YlF.js.map +1 -0
- package/dashboard/dist/assets/{index-BUjxYyxc.js → index-oGYUhkFa.js} +27 -27
- package/dashboard/dist/assets/index-oGYUhkFa.js.map +1 -0
- package/dashboard/dist/assets/index-qdYsS9h2.js +15 -0
- package/dashboard/dist/assets/index-qdYsS9h2.js.map +1 -0
- package/dashboard/dist/assets/knowledge-DsAU_TGL.js +2 -0
- package/dashboard/dist/assets/knowledge-DsAU_TGL.js.map +1 -0
- package/dashboard/dist/assets/{mcp-D0GrHRFe.js → mcp-CA3OeIyH.js} +2 -2
- package/dashboard/dist/assets/{mcp-D0GrHRFe.js.map → mcp-CA3OeIyH.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-DC5woQn5.js → mcp-query-BgmTDc7h.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-DC5woQn5.js.map → mcp-query-BgmTDc7h.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-CsoVQoPB.js → mcp-runs-C-FK2SyD.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-CsoVQoPB.js.map → mcp-runs-C-FK2SyD.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-unpIb4gX.js → namespaces-B8KNk0Jb.js} +2 -2
- package/dashboard/dist/assets/{namespaces-unpIb4gX.js.map → namespaces-B8KNk0Jb.js.map} +1 -1
- package/dashboard/dist/assets/{roles--kBaFljg.js → roles-BAPy1LU_.js} +2 -2
- package/dashboard/dist/assets/{roles--kBaFljg.js.map → roles-BAPy1LU_.js.map} +1 -1
- package/dashboard/dist/assets/{settings-B96YkawY.js → settings-Da0QSQDH.js} +2 -2
- package/dashboard/dist/assets/{settings-B96YkawY.js.map → settings-Da0QSQDH.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-D_1NCfOZ.js → tasks-BHlTusW0.js} +2 -2
- package/dashboard/dist/assets/{tasks-D_1NCfOZ.js.map → tasks-BHlTusW0.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-DBMdj9vw.js +2 -0
- package/dashboard/dist/assets/useEventHooks-DBMdj9vw.js.map +1 -0
- package/dashboard/dist/assets/{useYamlActivityEvents-D3RQjfzo.js → useYamlActivityEvents-BH_ynR_L.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-D3RQjfzo.js.map → useYamlActivityEvents-BH_ynR_L.js.map} +1 -1
- package/dashboard/dist/assets/{users-e2oatvoj.js → users-C9K2cMyb.js} +2 -2
- package/dashboard/dist/assets/{users-e2oatvoj.js.map → users-C9K2cMyb.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BkK55L-1.js → vendor-icons-E6836lXZ.js} +140 -95
- package/dashboard/dist/assets/vendor-icons-E6836lXZ.js.map +1 -0
- package/dashboard/dist/assets/workflows-B2rsLjoh.js +2 -0
- package/dashboard/dist/assets/workflows-B2rsLjoh.js.map +1 -0
- package/dashboard/dist/assets/{yaml-workflows-CAKU7LUu.js → yaml-workflows-BLiTvQM2.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CAKU7LUu.js.map → yaml-workflows-BLiTvQM2.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/agents.md +160 -0
- package/docs/api/http/agents.md +201 -0
- package/docs/api/sdk/agents.md +138 -0
- package/docs/story.md +101 -78
- package/package.json +3 -3
- package/dashboard/dist/assets/BotPicker-C2xR1xay.js +0 -2
- package/dashboard/dist/assets/BotPicker-C2xR1xay.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-CyEkulVR.js +0 -2
- package/dashboard/dist/assets/ListToolbar-CyEkulVR.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js.map +0 -1
- package/dashboard/dist/assets/RolePill-BhVC0cc3.js +0 -2
- package/dashboard/dist/assets/RolePill-BhVC0cc3.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js.map +0 -1
- package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-DUDDyBsj.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-DL4zsR8Y.js +0 -2
- package/dashboard/dist/assets/index-B-ioA6yv.js +0 -2
- package/dashboard/dist/assets/index-B-ioA6yv.js.map +0 -1
- package/dashboard/dist/assets/index-BMpoMc4A.js +0 -2
- package/dashboard/dist/assets/index-BMpoMc4A.js.map +0 -1
- package/dashboard/dist/assets/index-BU04qgJt.js +0 -15
- package/dashboard/dist/assets/index-BU04qgJt.js.map +0 -1
- package/dashboard/dist/assets/index-BUjxYyxc.js.map +0 -1
- package/dashboard/dist/assets/index-BpoHVMV7.js +0 -2
- package/dashboard/dist/assets/index-CEnDYJOO.js +0 -2
- package/dashboard/dist/assets/index-CbuH92vk.js +0 -6
- package/dashboard/dist/assets/index-CbuH92vk.js.map +0 -1
- package/dashboard/dist/assets/index-DrouIN-M.js +0 -2
- package/dashboard/dist/assets/index-DrouIN-M.js.map +0 -1
- package/dashboard/dist/assets/index-DzICLMI7.js +0 -2
- package/dashboard/dist/assets/index-efS5gKpv.css +0 -1
- package/dashboard/dist/assets/index-qT78AZDq.js +0 -2
- package/dashboard/dist/assets/index-qT78AZDq.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-BPjEkCpD.js +0 -2
- package/dashboard/dist/assets/useEventHooks-BPjEkCpD.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-BkK55L-1.js.map +0 -1
- package/dashboard/dist/assets/workflows-D6diL54s.js +0 -2
- package/dashboard/dist/assets/workflows-D6diL54s.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as m,j as s}from"./vendor-query-B2UbickB.js";import{a as T,u as F}from"./mcp-runs-CsoVQoPB.js";import{a as R}from"./yaml-workflows-CAKU7LUu.js";import{u as M}from"./namespaces-unpIb4gX.js";import{u as E}from"./useFilterParams-DZCAaBC7.js";import{D as z}from"./DataTable-D3-wSEf0.js";import{W as A}from"./WorkflowPill-DUDDyBsj.js";import{T as b}from"./TimestampCell-GOFcvE-i.js";import{E as L}from"./ElapsedCell-DrJif03B.js";import{P as U}from"./PageHeader-B-SN5GZ2.js";import{F as I,b as h}from"./FilterBar-Ck4K4rzu.js";import{S as O}from"./StickyPagination-F9FZsRy9.js";import{L as W}from"./ListToolbar-CyEkulVR.js";import{R as B,a as H}from"./RowActions-Dg-Fsm5O.js";import{p as q}from"./vendor-icons-BkK55L-1.js";import{c as G}from"./vendor-react-CX88sFS5.js";import"./index-BUjxYyxc.js";import"./EmptyState-BcsfPq9T.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},J={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},K={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function Q(f,a){return[{key:"workflow_id",label:"Run ID / Tool",render:e=>{const u=J[Y[e.status]??e.status]??"bg-status-pending",n=e.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[s.jsx("span",{className:`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${u}${n}`,title:e.status}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:e.workflow_id}),s.jsx("div",{className:"mt-0.5",children:e.entity?s.jsx(A,{type:e.entity,variant:"pipeline"}):s.jsx("span",{className:"text-[10px] text-text-tertiary",children:"—"})})]})]})}},{key:"created_at",label:"Created",sortable:!0,render:e=>s.jsx(b,{date:e.created_at}),className:"w-40"},{key:"updated_at",label:"Updated",sortable:!0,render:e=>s.jsx(b,{date:e.updated_at}),className:"w-40"},{key:"duration",label:"Duration",render:e=>s.jsx(L,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>s.jsxs(B,{children:[s.jsx(H,{icon:q,title:`Filter by ${e.entity}`,onClick:()=>f(e.entity)}),s.jsx("button",{onClick:u=>{u.stopPropagation(),a(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${K[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function xe(){const f=G(),{filters:a,setFilter:e,setFilters:u,pagination:n,sort:g,setSort:v}=E({filters:{search:"",entity:"",status:"",namespace:""}}),[d,j]=m.useState(a.search);m.useEffect(()=>{if(d===a.search)return;const t=setTimeout(()=>e("search",d),300);return()=>clearTimeout(t)},[d,e,a.search]);const{data:r}=R(),{data:l}=M(),x=m.useMemo(()=>{const t=new Set((r==null?void 0:r.app_ids)??[]);for(const o of(l==null?void 0:l.namespaces)??[])t.add(o.name);return[...t].sort()},[r==null?void 0:r.app_ids,l==null?void 0:l.namespaces]),S=x.includes("longtail")?"longtail":x[0]??"",i=a.namespace||S,{data:c}=T(i),{data:p,isLoading:N,refetch:_,isFetching:k}=F({app_id:i,limit:n.pageSize,offset:n.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:g.sort_by||void 0,order:g.order||void 0}),y=(p==null?void 0:p.total)??0,C=(p==null?void 0:p.jobs)??[],$=Q(t=>e("entity",t),t=>e("status",t)),w=m.useMemo(()=>{const t=new Set(x);return i&&t.add(i),[...t].sort().map(o=>({value:o,label:o}))},[x,i]),P=m.useMemo(()=>{const t=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!t.has(a.entity)&&t.add(a.entity),[...t].sort().map(o=>({value:o,label:o}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(U,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:pipeline-executions"}),s.jsxs(I,{actions:s.jsx(W,{onRefresh:()=>_(),isFetching:k,apiPath:`/mcp-runs?app_id=${i||"longtail"}&limit=${n.pageSize}&offset=${n.offset}${a.entity?`&entity=${a.entity}`:""}${a.status?`&status=${a.status}`:""}${a.search?`&search=${a.search}`:""}`}),children:[s.jsx(h,{label:"Namespace",value:i,onChange:t=>{u({namespace:t,entity:""})},options:w,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:d,onChange:t=>j(t.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(h,{label:"Tool",value:a.entity,onChange:t=>e("entity",t),options:P}),s.jsx(h,{label:"Status",value:a.status,onChange:t=>e("status",t),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(z,{columns:$,data:C,keyFn:t=>t.workflow_id,onRowClick:t=>f(`/mcp/executions/${encodeURIComponent(t.workflow_id)}?namespace=${i}`),isLoading:N,emptyMessage:"No pipeline executions found",sort:g,onSort:v}),s.jsx(O,{page:n.page,totalPages:n.totalPages(y),onPageChange:n.setPage,total:y,pageSize:n.pageSize,onPageSizeChange:n.setPageSize})]})}export{xe as McpRunsPage};
|
|
2
|
-
//# sourceMappingURL=McpRunsPage-BKba-3Wl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"McpRunsPage-BKba-3Wl.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter } from 'lucide-react';\nimport { useMcpRuns, useMcpEntities } from '../../api/mcp-runs';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useNamespaces } from '../../api/namespaces';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob } from '../../api/types';\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Run ID / Tool',\n render: (row) => {\n const dotClass = STATUS_DOT[statusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${dotClass}${pulseClass}`} title={row.status} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n {row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" />\n : <span className=\"text-[10px] text-text-tertiary\">—</span>}\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { filters, setFilter, setFilters, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n const { data: nsData } = useNamespaces();\n\n const allNamespaceNames = useMemo(() => {\n const set = new Set(appIdData?.app_ids ?? []);\n for (const ns of nsData?.namespaces ?? []) {\n set.add(ns.name);\n }\n return [...set].sort();\n }, [appIdData?.app_ids, nsData?.namespaces]);\n\n // Default: URL param > 'longtail' (if exists) > first in list\n const defaultNamespace = allNamespaceNames.includes('longtail')\n ? 'longtail'\n : allNamespaceNames[0] ?? '';\n const activeNamespace = filters.namespace || defaultNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading, refetch, isFetching } = useMcpRuns({\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || undefined,\n order: sort.order || undefined,\n });\n\n const total = runsData?.total ?? 0;\n const jobs = runsData?.jobs ?? [];\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n );\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" docsHash=\"#docs:dashboard.md:pipeline-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/mcp-runs?app_id=${activeNamespace || 'longtail'}&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.status ? `&status=${filters.status}` : ''}${filters.search ? `&search=${filters.search}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No pipeline executions found\"\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["statusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","nsData","useNamespaces","allNamespaceNames","useMemo","set","ns","defaultNamespace","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","id","entities","known","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as t}from"./vendor-query-B2UbickB.js";import{U as x}from"./vendor-icons-BkK55L-1.js";function o({role:e,size:s="sm"}){const n=s==="md"?"px-2.5 py-0.5 text-[11px] gap-1.5":"px-2 py-0.5 text-[10px] gap-1",a=s==="md"?"w-3 h-3":"w-2.5 h-2.5";return t.jsxs("span",{className:`inline-flex items-center ${n} bg-accent/[0.06] text-text-secondary rounded-lg`,children:[t.jsx(x,{className:`${a} shrink-0 text-accent/75`}),e]})}export{o as R};
|
|
2
|
-
//# sourceMappingURL=RolePill-BhVC0cc3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RolePill-BhVC0cc3.js","sources":["../../src/components/common/display/RolePill.tsx"],"sourcesContent":["import { User } from 'lucide-react';\n\ninterface RolePillProps {\n role: string;\n size?: 'sm' | 'md';\n}\n\nexport function RolePill({ role, size = 'sm' }: RolePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2.5 py-0.5 text-[11px] gap-1.5'\n : 'px-2 py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3 h-3' : 'w-2.5 h-2.5';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} bg-accent/[0.06] text-text-secondary rounded-lg`}>\n <User className={`${iconClass} shrink-0 text-accent/75`} />\n {role}\n </span>\n );\n}\n"],"names":["RolePill","role","size","sizeClass","iconClass","jsxs","jsx","User"],"mappings":"8FAOO,SAASA,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,MAAuB,CAC7D,MAAMC,EAAYD,IAAS,KACvB,oCACA,gCACEE,EAAYF,IAAS,KAAO,UAAY,cAE9C,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,mDACpD,SAAA,CAAAG,EAAAA,IAACC,EAAA,CAAK,UAAW,GAAGH,CAAS,2BAA4B,EACxDH,CAAA,EACH,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as s}from"./vendor-query-B2UbickB.js";import{B as o}from"./BotPicker-C2xR1xay.js";import{i as c}from"./index-BUjxYyxc.js";import{a3 as l,a4 as p}from"./vendor-icons-BkK55L-1.js";const y=["Describe","Discover","Compile","Deploy","Test","Verify"];function h(e){return e?e.status==="completed"?"completed":e.status==="failed"?"failed":"in_progress":"pending"}function j(e){const t=e.match(/```json\s*([\s\S]*?)```/)||e.match(/\{[\s\S]*?\n\}/);if(!t)return null;try{return JSON.parse((t[1]??t[0]).trim())}catch{return null}}const m=new Set(["token","authorization","bearer_token","access_token","api_token"]);function S(e){if(!(e!=null&&e.properties))return{};const t={},a=sessionStorage.getItem("lt_token")||"";for(const[r,i]of Object.entries(e.properties)){const n=i;n.default!==void 0?t[r]=n.default:m.has(r.toLowerCase())&&n.type==="string"?t[r]=a:n.type==="string"?t[r]="":n.type==="number"||n.type==="integer"?t[r]=n.minimum??0:n.type==="boolean"?t[r]=!1:n.type==="object"?t[r]={}:n.type==="array"?t[r]=[]:t[r]=null}return t}function g({selected:e,onChange:t}){const{user:a,isSuperAdmin:r,hasRoleType:i}=c(),n=r||i("admin");return s.jsx("div",{className:"px-2.5 py-2 rounded-md bg-accent/[0.06] border border-accent/20",children:n?s.jsxs("div",{className:"space-y-1",children:[s.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Run as"}),s.jsx(o,{selected:e,onChange:t})]}):s.jsx("div",{className:"flex items-center gap-1.5",children:e?s.jsxs(s.Fragment,{children:[s.jsx(l,{className:"w-3 h-3 text-accent/75 shrink-0",strokeWidth:1.5}),s.jsxs("span",{className:"text-[10px] text-text-secondary",children:["Running as ",s.jsx("span",{className:"font-medium text-accent font-mono",children:e})]})]}):s.jsxs(s.Fragment,{children:[s.jsx(p,{className:"w-3 h-3 text-accent/75 shrink-0",strokeWidth:1.5}),s.jsxs("span",{className:"text-[10px] text-text-secondary",children:["Running as ",s.jsx("span",{className:"font-medium text-accent",children:(a==null?void 0:a.displayName)||(a==null?void 0:a.userId)||"you"})]})]})})})}export{g as R,y as S,S as b,j as e,h as m};
|
|
2
|
-
//# sourceMappingURL=RunAsSelector-CD7_Dmb0.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RunAsSelector-CD7_Dmb0.js","sources":["../../src/pages/mcp/mcp-query-detail/helpers.ts","../../src/components/common/form/RunAsSelector.tsx"],"sourcesContent":["// ── Shared helpers for MCP Query Detail wizard panels ────────────────────────\n\nexport type Step = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport const STEP_LABELS_BASE = ['Describe', 'Discover', 'Compile', 'Deploy', 'Test', 'Verify'] as const;\n\nexport function mapStatus(exec: { status?: string } | undefined): string {\n if (!exec) return 'pending';\n if (exec.status === 'completed') return 'completed';\n if (exec.status === 'failed') return 'failed';\n return 'in_progress';\n}\n\nexport function extractJsonFromSummary(summary: string): Record<string, unknown> | null {\n const match = summary.match(/```json\\s*([\\s\\S]*?)```/) || summary.match(/\\{[\\s\\S]*?\\n\\}/);\n if (!match) return null;\n try { return JSON.parse((match[1] ?? match[0]).trim()); } catch { return null; }\n}\n\n// ── Helpers migrated from yaml-workflow-detail ───────────────────────────────\n\nexport type Section = 'invoke' | 'tools' | 'config';\n\n/** Keys that should auto-fill with the current session token when building test input skeletons. */\nconst TOKEN_FIELD_NAMES = new Set(['token', 'authorization', 'bearer_token', 'access_token', 'api_token']);\n\nexport function buildSkeleton(schema: Record<string, any>): Record<string, any> {\n if (!schema?.properties) return {};\n const result: Record<string, any> = {};\n // Auto-fill token fields with the current session token so test invocations\n // always use a fresh credential instead of requiring manual paste.\n const sessionToken = sessionStorage.getItem('lt_token') || '';\n for (const [key, prop] of Object.entries(schema.properties)) {\n const p = prop as any;\n if (p.default !== undefined) result[key] = p.default;\n else if (TOKEN_FIELD_NAMES.has(key.toLowerCase()) && p.type === 'string') result[key] = sessionToken;\n else if (p.type === 'string') result[key] = '';\n else if (p.type === 'number' || p.type === 'integer') result[key] = p.minimum ?? 0;\n else if (p.type === 'boolean') result[key] = false;\n else if (p.type === 'object') result[key] = {};\n else if (p.type === 'array') result[key] = [];\n else result[key] = null;\n }\n return result;\n}\n\nexport function inferFieldType(schemaProp: any): string {\n if (!schemaProp) return 'string';\n return schemaProp.type || 'string';\n}\n\nexport const metadataLabels: Record<string, string> = {\n app: 'MCP Workflow Server', tpc: 'MCP Workflow Tool', vrs: 'Version', ngn: 'Engine ID',\n jid: 'Job ID', gid: 'Run ID', aid: 'Activity ID', ts: 'Time Series',\n jc: 'Created', ju: 'Updated', trc: 'Trace ID', js: 'Job Status',\n};\n\nexport const jobStatusLabels: Record<number, string> = { 0: 'Completed', 1: 'Pending', 2: 'Error' };\n\nexport function parseCompactTimestamp(val: string): string {\n const match = val.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})\\.(\\d+)$/);\n if (!match) return val;\n const [, y, mo, d, h, mi, s, ms] = match;\n return `${y}-${mo}-${d} ${h}:${mi}:${s}.${ms}`;\n}\n\nexport function formatMetadataValue(key: string, value: unknown): string {\n if (key === 'js' && typeof value === 'number') return jobStatusLabels[value] ?? `Unknown (${value})`;\n if ((key === 'jc' || key === 'ju') && typeof value === 'string') return parseCompactTimestamp(value);\n return String(value ?? '');\n}\n\nexport function sourceLabel(s: string | undefined) {\n if (s === 'llm') return 'LLM';\n if (s === 'db') return 'DB';\n return 'MCP';\n}\n\nexport function sourceColor(s: string | undefined) {\n if (s === 'llm') return 'bg-purple-500/10 text-purple-400 border-purple-500/20';\n return 'bg-accent-primary/10 text-accent border-accent-primary/20';\n}\n","import { Bot, UserCircle } from 'lucide-react';\nimport { BotPicker } from './BotPicker';\nimport { useAuth } from '../../../hooks/useAuth';\n\ninterface RunAsSelectorProps {\n selected: string;\n onChange: (botExternalId: string) => void;\n}\n\nexport function RunAsSelector({ selected, onChange }: RunAsSelectorProps) {\n const { user, isSuperAdmin, hasRoleType } = useAuth();\n const isAdmin = isSuperAdmin || hasRoleType('admin');\n\n return (\n <div className=\"px-2.5 py-2 rounded-md bg-accent/[0.06] border border-accent/20\">\n {isAdmin ? (\n <div className=\"space-y-1\">\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Run as</label>\n <BotPicker selected={selected} onChange={onChange} />\n </div>\n ) : (\n <div className=\"flex items-center gap-1.5\">\n {selected ? (\n <>\n <Bot className=\"w-3 h-3 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-[10px] text-text-secondary\">\n Running as <span className=\"font-medium text-accent font-mono\">{selected}</span>\n </span>\n </>\n ) : (\n <>\n <UserCircle className=\"w-3 h-3 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-[10px] text-text-secondary\">\n Running as <span className=\"font-medium text-accent\">{user?.displayName || user?.userId || 'you'}</span>\n </span>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["STEP_LABELS_BASE","mapStatus","exec","extractJsonFromSummary","summary","match","TOKEN_FIELD_NAMES","buildSkeleton","schema","result","sessionToken","key","prop","p","RunAsSelector","selected","onChange","user","isSuperAdmin","hasRoleType","useAuth","isAdmin","jsx","jsxs","BotPicker","Fragment","Bot","UserCircle"],"mappings":"2LAIO,MAAMA,EAAmB,CAAC,WAAY,WAAY,UAAW,SAAU,OAAQ,QAAQ,EAEvF,SAASC,EAAUC,EAA+C,CACvE,OAAKA,EACDA,EAAK,SAAW,YAAoB,YACpCA,EAAK,SAAW,SAAiB,SAC9B,cAHW,SAIpB,CAEO,SAASC,EAAuBC,EAAiD,CACtF,MAAMC,EAAQD,EAAQ,MAAM,yBAAyB,GAAKA,EAAQ,MAAM,gBAAgB,EACxF,GAAI,CAACC,EAAO,OAAO,KACnB,GAAI,CAAE,OAAO,KAAK,OAAOA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAG,MAAM,CAAG,MAAQ,CAAE,OAAO,IAAM,CACjF,CAOA,MAAMC,MAAwB,IAAI,CAAC,QAAS,gBAAiB,eAAgB,eAAgB,WAAW,CAAC,EAElG,SAASC,EAAcC,EAAkD,CAC9E,GAAI,EAACA,GAAA,MAAAA,EAAQ,YAAY,MAAO,CAAA,EAChC,MAAMC,EAA8B,CAAA,EAG9BC,EAAe,eAAe,QAAQ,UAAU,GAAK,GAC3D,SAAW,CAACC,EAAKC,CAAI,IAAK,OAAO,QAAQJ,EAAO,UAAU,EAAG,CAC3D,MAAMK,EAAID,EACNC,EAAE,UAAY,OAAWJ,EAAOE,CAAG,EAAIE,EAAE,QACpCP,EAAkB,IAAIK,EAAI,YAAA,CAAa,GAAKE,EAAE,OAAS,SAAUJ,EAAOE,CAAG,EAAID,EAC/EG,EAAE,OAAS,SAAUJ,EAAOE,CAAG,EAAI,GACnCE,EAAE,OAAS,UAAYA,EAAE,OAAS,UAAWJ,EAAOE,CAAG,EAAIE,EAAE,SAAW,EACxEA,EAAE,OAAS,UAAWJ,EAAOE,CAAG,EAAI,GACpCE,EAAE,OAAS,SAAUJ,EAAOE,CAAG,EAAI,CAAA,EACnCE,EAAE,OAAS,QAASJ,EAAOE,CAAG,EAAI,CAAA,EACtCF,EAAOE,CAAG,EAAI,IACrB,CACA,OAAOF,CACT,CCnCO,SAASK,EAAc,CAAE,SAAAC,EAAU,SAAAC,GAAgC,CACxE,KAAM,CAAE,KAAAC,EAAM,aAAAC,EAAc,YAAAC,CAAA,EAAgBC,EAAA,EACtCC,EAAUH,GAAgBC,EAAY,OAAO,EAEnD,OACEG,EAAAA,IAAC,OAAI,UAAU,kEACZ,WACCC,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAD,EAAAA,IAAC,QAAA,CAAM,UAAU,yEAAyE,SAAA,SAAM,EAChGA,EAAAA,IAACE,EAAA,CAAU,SAAAT,EAAoB,SAAAC,CAAA,CAAoB,CAAA,CAAA,CACrD,EAEAM,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACZ,WACCC,EAAAA,KAAAE,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAACI,EAAA,CAAI,UAAU,kCAAkC,YAAa,IAAK,EACnEH,EAAAA,KAAC,OAAA,CAAK,UAAU,kCAAkC,SAAA,CAAA,cACrCD,EAAAA,IAAC,OAAA,CAAK,UAAU,oCAAqC,SAAAP,CAAA,CAAS,CAAA,CAAA,CAC3E,CAAA,CAAA,CACF,EAEAQ,EAAAA,KAAAE,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAACK,EAAA,CAAW,UAAU,kCAAkC,YAAa,IAAK,EAC1EJ,EAAAA,KAAC,OAAA,CAAK,UAAU,kCAAkC,SAAA,CAAA,cACrCD,EAAAA,IAAC,QAAK,UAAU,0BAA2B,2BAAM,eAAeL,GAAA,YAAAA,EAAM,SAAU,KAAA,CAAM,CAAA,CAAA,CACnG,CAAA,CAAA,CACF,EAEJ,EAEJ,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as t,a as D}from"./vendor-query-B2UbickB.js";import{D as K,c as L,J as w,f as I,C as Y}from"./index-BUjxYyxc.js";import{S as J}from"./StatusBadge-XQlNFwmH.js";import{L as A}from"./vendor-react-CX88sFS5.js";function O(s){if(!s)return null;try{return JSON.parse(s)}catch{return s}}function z({event:s}){return t.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[s.attributes.activity_type&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Activity"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.activity_type})]}),t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Kind"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.kind})]}),s.duration_ms!==null&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Duration"}),t.jsx(K,{ms:s.duration_ms,className:"font-mono text-text-primary"})]}),t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Time"}),t.jsx(L,{date:s.event_time,format:"datetime",className:"font-mono text-text-primary"})]}),s.attributes.signal_name&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Signal"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.signal_name})]}),s.attributes.awaited!==void 0&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Awaited"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.awaited?"Yes":"No (fire-and-forget)"})]}),s.attributes.timeline_key&&t.jsxs("div",{className:"col-span-2",children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Timeline Key"}),t.jsx("p",{className:"text-xs font-mono text-text-primary truncate",title:s.attributes.timeline_key,children:s.attributes.timeline_key})]}),s.attributes.execution_index!==void 0&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Exec Index"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.execution_index})]}),s.attributes.scheduled_event_id!=null&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Scheduled Event"}),t.jsxs("p",{className:"text-xs font-mono text-text-primary",children:["#",s.attributes.scheduled_event_id]})]}),s.attributes.wait_event_id!=null&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Wait Started"}),t.jsxs("p",{className:"text-xs font-mono text-text-primary",children:["Event #",s.attributes.wait_event_id]})]}),s.attributes.initiated_event_id!=null&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Initiated Event"}),t.jsxs("p",{className:"text-xs font-mono text-text-primary",children:["#",s.attributes.initiated_event_id]})]})]})}function B({event:s,childTask:n}){const r=n?O(n.envelope):null,c=n?O(n.data):null;return!n&&s.attributes.child_workflow_id?t.jsx("div",{className:"border-t border-surface-border pt-3",children:t.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[t.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Child Workflow"}),t.jsx(A,{to:`/workflows/executions/${s.attributes.child_workflow_id}`,className:"text-xs font-mono text-accent hover:underline",onClick:d=>d.stopPropagation(),children:s.attributes.child_workflow_id})]})}):n?t.jsxs("div",{className:"space-y-3 border-t border-surface-border pt-3",children:[t.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[t.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Child Workflow"}),t.jsx(A,{to:`/workflows/executions/${n.workflow_id}`,className:"text-xs font-mono text-accent hover:underline",onClick:d=>d.stopPropagation(),children:n.workflow_id}),t.jsx(J,{status:n.status}),n.completed_at&&t.jsxs("span",{className:"text-[10px] text-text-tertiary",children:["Completed ",t.jsx(L,{date:n.completed_at,format:"relative"})]})]}),(r!=null||c!=null)&&t.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[r!=null?t.jsx(w,{data:r,label:"Input (Envelope)",variant:"panel"}):t.jsx("div",{}),c!=null?t.jsx(w,{data:c,label:"Output (Result)",variant:"panel"}):t.jsx("div",{})]})]}):null}function G({event:s,childTask:n}){const r=s.attributes.input,c=s.attributes.result,d=s.category==="signal",x=s.category==="activity",o=s.category==="child_workflow",m=r!==void 0&&(x||o),p=!n&&c!==void 0&&(x||o),l=s.attributes.activity_type==="ltSignalParent"?"Signal Payload":"Result";return m||p?t.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[m?t.jsx(w,{data:r,label:"Input",variant:"panel"}):t.jsx("div",{}),p?t.jsx(w,{data:c,label:l,variant:"panel"}):t.jsx("div",{})]}):d&&r!==void 0?t.jsx(w,{data:r,label:"Signal Payload",variant:"panel"}):null}function H({event:s,childTask:n,pending:r=!1,onClose:c}){return t.jsxs("div",{className:"p-4 bg-surface-sunken rounded-md space-y-4",children:[t.jsxs("div",{className:"flex items-center justify-between gap-2",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("p",{className:"font-mono font-medium text-sm text-text-primary",children:s.attributes.activity_type??s.attributes.signal_name??s.attributes.child_workflow_id??s.event_type}),r&&t.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-status-warning/15 text-status-warning",children:[t.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"}),"Pending"]})]}),c&&t.jsx("button",{onClick:c,className:"text-text-tertiary hover:text-text-primary text-xs",children:"Close"})]}),t.jsx(z,{event:s}),t.jsx(B,{event:s,childTask:n}),t.jsx(G,{event:s,childTask:n}),s.attributes.failure!==void 0&&t.jsx(w,{data:s.attributes.failure,label:"Failure"}),(()=>{const{kind:d,activity_type:x,result:o,timeline_key:m,execution_index:p,signal_name:l,input:_,child_workflow_id:N,awaited:g,wait_event_id:k,scheduled_event_id:b,initiated_event_id:u,failure:y,trace_id:v,span_id:E,...M}=s.attributes;return Object.keys(M).length>0?t.jsx(w,{data:M,label:"Attributes"}):null})()]})}const j={activity:{bar:"bg-blue-500",outline:"border-blue-500 bg-transparent",text:"text-blue-500",label:"Activities"},signal:{bar:"bg-emerald-500",outline:"border-emerald-500 bg-transparent",text:"text-emerald-500",label:"Signals"},timer:{bar:"bg-status-warning",outline:"border-status-warning bg-transparent",text:"text-status-warning",label:"Timers"},child_workflow:{bar:"bg-violet-500",outline:"border-violet-500 bg-transparent",text:"text-violet-500",label:"Child Workflows"}},F="bg-stripes animate-pulse opacity-70",X=new Set(["callLLM","callDbTool","callVisionTool","callMcpTool","getDBTools","getVisionTools"]);function q(s,n){if(s.length<=n)return s;const r=Math.floor((n-1)/2);return`${s.slice(0,r)}…${s.slice(s.length-r)}`}function Q(s){const n=[],r=new Map,c=new Map;for(const x of s){const o=x.attributes.timeline_key;if(!o)continue;const m=x.event_type;m==="activity_task_scheduled"||m==="timer_started"||m==="child_workflow_execution_started"||m==="signal_wait_started"?r.set(o,x):c.set(o,x)}const d=new Set;for(const x of s){const o=x.attributes.timeline_key;if(o&&d.has(o))continue;o&&d.add(o);const m=o?r.get(o):void 0,p=o?c.get(o):void 0,l=p||m||x,_=l.category,N=l.attributes.activity_type||l.attributes.signal_name||l.attributes.child_workflow_id||l.event_type,g=m||l,k=p,b=new Date(g.event_time).getTime();let u=null,y=null,v=!1;k?(u=new Date(k.event_time).getTime(),y=k.duration_ms??u-b):l.duration_ms!==null?(y=l.duration_ms,u=b+y):v=!0,n.push({category:_,name:N||l.event_type,startTime:b,endTime:u,duration:y,eventId:l.event_id,pending:v})}return n}function st({events:s,childTasks:n,outline:r}){const[c,d]=D.useState(new Set),[x,o]=D.useState(null),p=s.filter(e=>e.category!=="workflow");if(p.length===0)return null;const l=Q(p);if(l.length===0)return null;const _=Date.now(),N=l.flatMap(e=>{const i=[e.startTime];return e.endTime?i.push(e.endTime):i.push(_),i}),g=Math.min(...N),b=Math.max(...N)-g||1,u=new Map;for(const e of l){const i=`${e.category}:${e.name}`,a=e.startTime-g,h=(e.endTime?e.endTime-g:_-g)-a,S={eventId:e.eventId,startPct:a/b*100,widthPct:Math.max(h/b*100,.5),duration:e.duration,label:`${e.name} — ${e.duration!==null?I(e.duration):"pending"} — ${new Date(e.startTime).toLocaleTimeString()}`,eventTime:new Date(e.startTime).toISOString(),pending:e.pending};u.has(i)||u.set(i,{name:e.name,category:e.category,segments:[]}),u.get(i).segments.push(S)}const y=Array.from(u.values()),v=5,E=Array.from({length:v+1},(e,i)=>({pct:i/v*100,label:I(Math.round(i/v*b))})),M=[...new Set(l.map(e=>e.category))],R=e=>{if(!(n!=null&&n.length))return;const i=e.attributes.activity_type;if(i)return n.find(a=>a.workflow_type===i)},$=e=>{d(i=>{const a=new Set(i);return a.has(e)?a.delete(e):a.add(e),a})},C=l.map(e=>e.eventId),P=C.length>0&&C.every(e=>c.has(e)),V=()=>{d(P?new Set:new Set(C))},T=(e,i)=>{var a,f;return i?F:r?((a=j[e])==null?void 0:a.outline)??"border-text-tertiary bg-transparent":((f=j[e])==null?void 0:f.bar)??"bg-text-tertiary"},W=e=>{var i;return r?((i=j[e])==null?void 0:i.text)??"text-text-tertiary":"text-white"};return t.jsxs("div",{className:"px-6 py-6 mb-6",children:[t.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Execution Timeline"}),t.jsx("button",{onClick:V,className:"text-[10px] text-accent hover:underline",children:P?"Collapse all":"Expand all"}),t.jsxs("div",{className:"flex items-center gap-3 ml-auto",children:[M.map(e=>{var i,a,f;return t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:`w-2 h-2 rounded-full ${r?`border ${((i=j[e])==null?void 0:i.outline)??"border-text-tertiary"}`:((a=j[e])==null?void 0:a.bar)??"bg-text-tertiary"}`}),t.jsx("span",{className:"text-[9px] text-text-tertiary",children:((f=j[e])==null?void 0:f.label)??e})]},e)}),l.some(e=>e.pending)&&t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"w-2 h-2 rounded-full bg-status-warning animate-pulse"}),t.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Pending"})]})]})]}),t.jsxs("div",{className:"flex",children:[t.jsx("div",{className:"w-56 shrink-0"}),t.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:E.map(e=>t.jsx("span",{className:"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1",style:{left:`${e.pct}%`},children:e.label},e.pct))})]}),y.map(e=>{const i=j[e.category];return t.jsxs("div",{children:[t.jsxs("div",{className:"flex items-center border-b border-surface-border",children:[t.jsxs("div",{className:"w-56 shrink-0 py-3 pr-4 flex items-center gap-2",children:[t.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${(i==null?void 0:i.bar)??"bg-text-tertiary"}`}),t.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:e.name,children:q(e.name,28)}),X.has(e.name)&&t.jsx("span",{className:"shrink-0 text-accent/60",title:"MCP tool interaction",children:t.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"})})})]}),t.jsxs("div",{className:"flex-1 relative h-10",children:[E.map(a=>t.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${a.pct}%`}},a.pct)),e.segments.map(a=>{const f=x===a.eventId,h=c.has(a.eventId),S=a.widthPct<3;return t.jsx("div",{className:`absolute top-2 h-6 rounded-sm cursor-pointer transition-all duration-200 origin-center ${r?"border-2":""} ${h?`${T(e.category,a.pending)} ring-2 ring-accent ring-offset-1`:`${T(e.category,a.pending)} hover:opacity-80`}`,style:{left:`${a.startPct}%`,width:`${a.widthPct}%`,minWidth:"4px",...f&&S?{transform:"scaleX(4) scaleY(1.3) translateY(-2px)",zIndex:20,borderRadius:"4px"}:{zIndex:h?10:1}},title:a.label,onClick:()=>$(a.eventId),onMouseEnter:()=>o(a.eventId),onMouseLeave:()=>o(null),children:a.widthPct>8&&t.jsx("span",{className:`absolute inset-0 flex items-center px-1.5 text-[9px] font-mono ${W(e.category)} truncate`,children:a.duration!==null?I(a.duration):"pending"})},a.eventId)})]})]}),e.segments.map(a=>{const f=c.has(a.eventId),h=p.find(S=>S.event_id===a.eventId);return t.jsx(Y,{open:f,children:h&&t.jsx("div",{className:"py-3",children:t.jsx(H,{event:h,childTask:R(h),pending:a.pending,onClose:()=>$(h.event_id)})})},a.eventId)})]},`${e.category}:${e.name}`)})]})}export{H as E,st as S};
|
|
2
|
-
//# sourceMappingURL=SwimlaneTimeline-CUl5RdXU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SwimlaneTimeline-CUl5RdXU.js","sources":["../../src/pages/workflows/workflow-execution/EventMetadataGrid.tsx","../../src/pages/workflows/workflow-execution/EventDetailPanel.tsx","../../src/pages/workflows/workflow-execution/utils.ts","../../src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\n\nfunction safeParseJson(raw: string | null | undefined): unknown {\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nexport function EventMetadataGrid({ event }: { event: WorkflowExecutionEvent }) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n {event.attributes.activity_type && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Activity\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.activity_type}\n </p>\n </div>\n )}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Kind\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.kind}\n </p>\n </div>\n {event.duration_ms !== null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Duration\n </p>\n <DurationValue ms={event.duration_ms} className=\"font-mono text-text-primary\" />\n </div>\n )}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Time\n </p>\n <DateValue date={event.event_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n </div>\n\n {event.attributes.signal_name && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Signal\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.signal_name}\n </p>\n </div>\n )}\n\n {event.attributes.awaited !== undefined && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Awaited\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.awaited ? 'Yes' : 'No (fire-and-forget)'}\n </p>\n </div>\n )}\n\n {event.attributes.timeline_key && (\n <div className=\"col-span-2\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Timeline Key\n </p>\n <p className=\"text-xs font-mono text-text-primary truncate\" title={event.attributes.timeline_key}>\n {event.attributes.timeline_key}\n </p>\n </div>\n )}\n\n {event.attributes.execution_index !== undefined && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Exec Index\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.execution_index}\n </p>\n </div>\n )}\n\n {event.attributes.scheduled_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Scheduled Event\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n #{event.attributes.scheduled_event_id}\n </p>\n </div>\n )}\n {event.attributes.wait_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Wait Started\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n Event #{event.attributes.wait_event_id}\n </p>\n </div>\n )}\n {event.attributes.initiated_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Initiated Event\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n #{event.attributes.initiated_event_id}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nexport function ChildWorkflowSection({ event, childTask }: {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n}) {\n const childInput = childTask ? safeParseJson(childTask.envelope) : null;\n const childOutput = childTask ? safeParseJson(childTask.data) : null;\n\n // Link-only (no matching task record)\n if (!childTask && event.attributes.child_workflow_id) {\n return (\n <div className=\"border-t border-surface-border pt-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Child Workflow\n </span>\n <Link\n to={`/workflows/executions/${event.attributes.child_workflow_id}`}\n className=\"text-xs font-mono text-accent hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {event.attributes.child_workflow_id}\n </Link>\n </div>\n </div>\n );\n }\n\n // Full child task section\n if (childTask) {\n return (\n <div className=\"space-y-3 border-t border-surface-border pt-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Child Workflow\n </span>\n <Link\n to={`/workflows/executions/${childTask.workflow_id}`}\n className=\"text-xs font-mono text-accent hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {childTask.workflow_id}\n </Link>\n <StatusBadge status={childTask.status} />\n {childTask.completed_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n Completed <DateValue date={childTask.completed_at} format=\"relative\" />\n </span>\n )}\n </div>\n\n {(childInput != null || childOutput != null) && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {childInput != null ? (\n <JsonViewer data={childInput} label=\"Input (Envelope)\" variant=\"panel\" />\n ) : <div />}\n {childOutput != null ? (\n <JsonViewer data={childOutput} label=\"Output (Result)\" variant=\"panel\" />\n ) : <div />}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n}\n\nexport function EventPayloadSection({ event, childTask }: {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n}) {\n const input = event.attributes.input;\n const result = event.attributes.result;\n const isSignal = event.category === 'signal';\n const isActivity = event.category === 'activity';\n const isChild = event.category === 'child_workflow';\n const hasInput = input !== undefined && (isActivity || isChild);\n const hasResult = !childTask && result !== undefined && (isActivity || isChild);\n const resultLabel = event.attributes.activity_type === 'ltSignalParent' ? 'Signal Payload' : 'Result';\n\n if (hasInput || hasResult) {\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {hasInput ? (\n <JsonViewer data={input} label=\"Input\" variant=\"panel\" />\n ) : <div />}\n {hasResult ? (\n <JsonViewer data={result} label={resultLabel} variant=\"panel\" />\n ) : <div />}\n </div>\n );\n }\n\n if (isSignal && input !== undefined) {\n return <JsonViewer data={input} label=\"Signal Payload\" variant=\"panel\" />;\n }\n\n return null;\n}\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventMetadataGrid, ChildWorkflowSection, EventPayloadSection } from './EventMetadataGrid';\n\ninterface EventDetailPanelProps {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n /** When true, show a \"Pending\" badge. Caller determines this from the full event list. */\n pending?: boolean;\n onClose?: () => void;\n}\n\n/**\n * Reusable detail panel for a workflow execution event.\n * Renders inline wherever placed — used by both SwimlaneTimeline\n * (below the lane row) and EventTable (below the event row).\n *\n * Shows rich detail for all event categories:\n * - Activities: activity_type, result, scheduled_event_id\n * - Signals: signal_name, payload, wait_event_id\n * - Timers: duration\n * - Child workflows: child_workflow_id link, awaited badge, result\n */\nexport function EventDetailPanel({ event, childTask, pending = false, onClose }: EventDetailPanelProps) {\n return (\n <div className=\"p-4 bg-surface-sunken rounded-md space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <p className=\"font-mono font-medium text-sm text-text-primary\">\n {event.attributes.activity_type\n ?? event.attributes.signal_name\n ?? event.attributes.child_workflow_id\n ?? event.event_type}\n </p>\n {pending && (\n <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-status-warning/15 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n )}\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"text-text-tertiary hover:text-text-primary text-xs\"\n >\n Close\n </button>\n )}\n </div>\n\n {/* Metadata grid */}\n <EventMetadataGrid event={event} />\n\n {/* Child workflow sections */}\n <ChildWorkflowSection event={event} childTask={childTask} />\n\n {/* Input / Result payload */}\n <EventPayloadSection event={event} childTask={childTask} />\n\n {/* Failure detail */}\n {event.attributes.failure !== undefined && (\n <JsonViewer data={event.attributes.failure} label=\"Failure\" />\n )}\n\n {/* Remaining attributes (exclude the fields shown above) */}\n {(() => {\n const {\n kind,\n activity_type,\n result,\n timeline_key,\n execution_index,\n signal_name,\n input,\n child_workflow_id,\n awaited,\n wait_event_id,\n scheduled_event_id,\n initiated_event_id,\n failure,\n trace_id,\n span_id,\n ...rest\n } = event.attributes;\n return Object.keys(rest).length > 0 ? (\n <JsonViewer data={rest} label=\"Attributes\" />\n ) : null;\n })()}\n </div>\n );\n}\n","export { formatDuration, formatDateTime } from '../../../lib/format';\n\nimport type { WorkflowExecutionEvent } from '../../../api/types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface Segment {\n eventId: number;\n startPct: number;\n widthPct: number;\n duration: number | null;\n label: string;\n eventTime: string;\n pending: boolean;\n}\n\nexport interface Lane {\n name: string;\n category: string;\n segments: Segment[];\n}\n\n// ── Constants ────────────────────────────────────────────────────────────────\n\nexport const CATEGORY_COLORS: Record<string, { bar: string; outline: string; text: string; label: string }> = {\n activity: { bar: 'bg-blue-500', outline: 'border-blue-500 bg-transparent', text: 'text-blue-500', label: 'Activities' },\n signal: { bar: 'bg-emerald-500', outline: 'border-emerald-500 bg-transparent', text: 'text-emerald-500', label: 'Signals' },\n timer: { bar: 'bg-status-warning', outline: 'border-status-warning bg-transparent', text: 'text-status-warning', label: 'Timers' },\n child_workflow: { bar: 'bg-violet-500', outline: 'border-violet-500 bg-transparent', text: 'text-violet-500', label: 'Child Workflows' },\n};\n\nexport const PENDING_CLASS = 'bg-stripes animate-pulse opacity-70';\n\n/** Activity names that indicate LLM/MCP tool interaction */\nexport const MCP_ACTIVITY_NAMES = new Set([\n 'callLLM', 'callDbTool', 'callVisionTool', 'callMcpTool', 'getDBTools', 'getVisionTools',\n]);\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Truncate a string in the middle, keeping the start and end visible. */\nexport function middleTruncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n const keep = Math.floor((maxLen - 1) / 2);\n return `${str.slice(0, keep)}…${str.slice(str.length - keep)}`;\n}\n\nexport interface TimelineSpan {\n category: string;\n name: string;\n startTime: number;\n endTime: number | null;\n duration: number | null;\n eventId: number;\n pending: boolean;\n}\n\n/**\n * Group paired events (scheduled→completed, started→fired, wait→signaled)\n * into a single span using timeline_key, or treat standalone events as points.\n */\nexport function buildTimelineSpans(events: WorkflowExecutionEvent[]): TimelineSpan[] {\n const spans: TimelineSpan[] = [];\n\n // Index scheduled/started events by timeline_key for pairing\n const startedMap = new Map<string, WorkflowExecutionEvent>();\n const completedMap = new Map<string, WorkflowExecutionEvent>();\n\n for (const evt of events) {\n const tlKey = evt.attributes.timeline_key;\n if (!tlKey) continue;\n const type = evt.event_type;\n\n if (type === 'activity_task_scheduled'\n || type === 'timer_started'\n || type === 'child_workflow_execution_started'\n || type === 'signal_wait_started') {\n startedMap.set(tlKey, evt);\n } else {\n completedMap.set(tlKey, evt);\n }\n }\n\n // Build spans from pairs\n const seen = new Set<string>();\n\n for (const evt of events) {\n const tlKey = evt.attributes.timeline_key;\n\n // Skip if no timeline_key or already processed\n if (tlKey && seen.has(tlKey)) continue;\n if (tlKey) seen.add(tlKey);\n\n const started = tlKey ? startedMap.get(tlKey) : undefined;\n const completed = tlKey ? completedMap.get(tlKey) : undefined;\n\n // Determine the representative event for this span\n const primary = completed || started || evt;\n const cat = primary.category;\n const name = primary.attributes.activity_type\n || primary.attributes.signal_name\n || primary.attributes.child_workflow_id\n || primary.event_type;\n\n const startEvt = started || primary;\n const endEvt = completed;\n\n const startMs = new Date(startEvt.event_time).getTime();\n let endMs: number | null = null;\n let dur: number | null = null;\n let pending = false;\n\n if (endEvt) {\n endMs = new Date(endEvt.event_time).getTime();\n dur = endEvt.duration_ms ?? (endMs - startMs);\n } else if (primary.duration_ms !== null) {\n dur = primary.duration_ms;\n endMs = startMs + dur;\n } else {\n // Pending — no completion event\n pending = true;\n }\n\n spans.push({\n category: cat,\n name: name || primary.event_type,\n startTime: startMs,\n endTime: endMs,\n duration: dur,\n eventId: primary.event_id,\n pending,\n });\n }\n\n return spans;\n}\n","import { useState } from 'react';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport {\n formatDuration,\n middleTruncate,\n buildTimelineSpans,\n CATEGORY_COLORS,\n PENDING_CLASS,\n MCP_ACTIVITY_NAMES,\n} from './utils';\nimport type { Segment, Lane } from './utils';\n\ninterface SwimlaneTimelineProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n /** Use outline-style bars (border + transparent fill) instead of solid fills */\n outline?: boolean;\n}\n\n// ── Component ────────────────────────────────────────────────────────────────\n\nexport function SwimlaneTimeline({ events, childTasks, outline }: SwimlaneTimelineProps) {\n const [selectedEvents, setSelectedEvents] = useState<Set<number>>(new Set());\n const [hoveredEvent, setHoveredEvent] = useState<number | null>(null);\n\n // Filter out workflow-level events (started/completed) — they aren't operations\n const timelineEvents = events.filter(\n (e) => e.category !== 'workflow',\n );\n\n // Show all activities (user + system), signals, timers, and child workflows.\n const displayEvents = timelineEvents;\n\n if (displayEvents.length === 0) return null;\n\n const spans = buildTimelineSpans(displayEvents);\n if (spans.length === 0) return null;\n\n // Compute time axis bounds\n const now = Date.now();\n const allTimes = spans.flatMap((s) => {\n const times = [s.startTime];\n if (s.endTime) times.push(s.endTime);\n else times.push(now); // pending extends to now\n return times;\n });\n const timeMin = Math.min(...allTimes);\n const timeMax = Math.max(...allTimes);\n const totalSpan = timeMax - timeMin || 1;\n\n // Group spans into lanes by \"category:name\"\n const laneMap = new Map<string, { name: string; category: string; segments: Segment[] }>();\n\n for (const span of spans) {\n const laneKey = `${span.category}:${span.name}`;\n const startOffset = span.startTime - timeMin;\n const endOffset = span.endTime ? span.endTime - timeMin : (now - timeMin);\n const widthMs = endOffset - startOffset;\n\n const segment: Segment = {\n eventId: span.eventId,\n startPct: (startOffset / totalSpan) * 100,\n widthPct: Math.max((widthMs / totalSpan) * 100, 0.5),\n duration: span.duration,\n label: `${span.name} — ${span.duration !== null ? formatDuration(span.duration) : 'pending'} — ${new Date(span.startTime).toLocaleTimeString()}`,\n eventTime: new Date(span.startTime).toISOString(),\n pending: span.pending,\n };\n\n if (!laneMap.has(laneKey)) {\n laneMap.set(laneKey, { name: span.name, category: span.category, segments: [] });\n }\n laneMap.get(laneKey)!.segments.push(segment);\n }\n\n const lanes: Lane[] = Array.from(laneMap.values());\n\n // Time axis ticks\n const tickCount = 5;\n const ticks = Array.from({ length: tickCount + 1 }, (_, i) => ({\n pct: (i / tickCount) * 100,\n label: formatDuration(Math.round((i / tickCount) * totalSpan)),\n }));\n\n // Active categories for legend\n const activeCategories = [...new Set(spans.map((s) => s.category))];\n\n /** Find a matching child task for an event */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setSelectedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allEventIds = spans.map((s) => s.eventId);\n const allExpanded = allEventIds.length > 0 && allEventIds.every((id) => selectedEvents.has(id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setSelectedEvents(new Set());\n } else {\n setSelectedEvents(new Set(allEventIds));\n }\n };\n\n\n\n const barColor = (cat: string, pending: boolean) => {\n if (pending) return PENDING_CLASS;\n if (outline) return CATEGORY_COLORS[cat]?.outline ?? 'border-text-tertiary bg-transparent';\n return CATEGORY_COLORS[cat]?.bar ?? 'bg-text-tertiary';\n };\n\n const textColor = (cat: string) => {\n if (outline) return CATEGORY_COLORS[cat]?.text ?? 'text-text-tertiary';\n return 'text-white';\n };\n\n return (\n <div className=\"px-6 py-6 mb-6\">\n <div className=\"flex items-center gap-4 mb-4 flex-wrap\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Execution Timeline\n </p>\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n\n {/* Legend */}\n <div className=\"flex items-center gap-3 ml-auto\">\n {activeCategories.map((cat) => (\n <div key={cat} className=\"flex items-center gap-1\">\n <span className={`w-2 h-2 rounded-full ${outline ? `border ${CATEGORY_COLORS[cat]?.outline ?? 'border-text-tertiary'}` : CATEGORY_COLORS[cat]?.bar ?? 'bg-text-tertiary'}`} />\n <span className=\"text-[9px] text-text-tertiary\">\n {CATEGORY_COLORS[cat]?.label ?? cat}\n </span>\n </div>\n ))}\n {spans.some((s) => s.pending) && (\n <div className=\"flex items-center gap-1\">\n <span className=\"w-2 h-2 rounded-full bg-status-warning animate-pulse\" />\n <span className=\"text-[9px] text-text-tertiary\">Pending</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Time axis */}\n <div className=\"flex\">\n <div className=\"w-56 shrink-0\" />\n <div className=\"flex-1 relative h-6 border-b border-surface-border\">\n {ticks.map((tick) => (\n <span\n key={tick.pct}\n className=\"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1\"\n style={{ left: `${tick.pct}%` }}\n >\n {tick.label}\n </span>\n ))}\n </div>\n </div>\n\n {/* Lanes */}\n {lanes.map((lane) => {\n const catColor = CATEGORY_COLORS[lane.category];\n\n return (\n <div key={`${lane.category}:${lane.name}`}>\n {/* Lane row */}\n <div className=\"flex items-center border-b border-surface-border\">\n <div className=\"w-56 shrink-0 py-3 pr-4 flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${catColor?.bar ?? 'bg-text-tertiary'}`} />\n <p\n className=\"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden\"\n title={lane.name}\n >\n {middleTruncate(lane.name, 28)}\n </p>\n {MCP_ACTIVITY_NAMES.has(lane.name) && (\n <span className=\"shrink-0 text-accent/60\" title=\"MCP tool interaction\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </span>\n )}\n </div>\n\n <div className=\"flex-1 relative h-10\">\n {ticks.map((tick) => (\n <div\n key={tick.pct}\n className=\"absolute top-0 bottom-0 w-px bg-surface-border opacity-30\"\n style={{ left: `${tick.pct}%` }}\n />\n ))}\n\n {lane.segments.map((seg) => {\n const isHovered = hoveredEvent === seg.eventId;\n const isSelected = selectedEvents.has(seg.eventId);\n const isNarrow = seg.widthPct < 3;\n return (\n <div\n key={seg.eventId}\n className={`absolute top-2 h-6 rounded-sm cursor-pointer transition-all duration-200 origin-center ${outline ? 'border-2' : ''} ${\n isSelected\n ? `${barColor(lane.category, seg.pending)} ring-2 ring-accent ring-offset-1`\n : `${barColor(lane.category, seg.pending)} hover:opacity-80`\n }`}\n style={{\n left: `${seg.startPct}%`,\n width: `${seg.widthPct}%`,\n minWidth: '4px',\n ...(isHovered && isNarrow ? {\n transform: 'scaleX(4) scaleY(1.3) translateY(-2px)',\n zIndex: 20,\n borderRadius: '4px',\n } : {\n zIndex: isSelected ? 10 : 1,\n }),\n }}\n title={seg.label}\n onClick={() => toggleEvent(seg.eventId)}\n onMouseEnter={() => setHoveredEvent(seg.eventId)}\n onMouseLeave={() => setHoveredEvent(null)}\n >\n {seg.widthPct > 8 && (\n <span className={`absolute inset-0 flex items-center px-1.5 text-[9px] font-mono ${textColor(lane.category)} truncate`}>\n {seg.duration !== null ? formatDuration(seg.duration) : 'pending'}\n </span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Inline detail panels */}\n {lane.segments.map((seg) => {\n const isOpen = selectedEvents.has(seg.eventId);\n const evt = displayEvents.find((e) => e.event_id === seg.eventId);\n return (\n <Collapsible key={seg.eventId} open={isOpen}>\n {evt && (\n <div className=\"py-3\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={seg.pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n )}\n </Collapsible>\n );\n })}\n </div>\n );\n })}\n\n </div>\n );\n}\n"],"names":["safeParseJson","raw","EventMetadataGrid","event","jsxs","jsx","DurationValue","DateValue","ChildWorkflowSection","childTask","childInput","childOutput","Link","e","StatusBadge","JsonViewer","EventPayloadSection","input","result","isSignal","isActivity","isChild","hasInput","hasResult","resultLabel","EventDetailPanel","pending","onClose","kind","activity_type","timeline_key","execution_index","signal_name","child_workflow_id","awaited","wait_event_id","scheduled_event_id","initiated_event_id","failure","trace_id","span_id","rest","CATEGORY_COLORS","PENDING_CLASS","MCP_ACTIVITY_NAMES","middleTruncate","str","maxLen","keep","buildTimelineSpans","events","spans","startedMap","completedMap","evt","tlKey","type","seen","started","completed","primary","cat","name","startEvt","endEvt","startMs","endMs","dur","SwimlaneTimeline","childTasks","outline","selectedEvents","setSelectedEvents","useState","hoveredEvent","setHoveredEvent","displayEvents","now","allTimes","s","times","timeMin","totalSpan","laneMap","span","laneKey","startOffset","widthMs","segment","formatDuration","lanes","tickCount","ticks","_","activeCategories","findChildTask","activityType","t","toggleEvent","id","prev","next","allEventIds","allExpanded","toggleAll","barColor","_a","_b","textColor","tick","lane","catColor","seg","isHovered","isSelected","isNarrow","isOpen","Collapsible"],"mappings":"uNAOA,SAASA,EAAcC,EAAyC,CAC9D,GAAI,CAACA,EAAK,OAAO,KACjB,GAAI,CACF,OAAO,KAAK,MAAMA,CAAG,CACvB,MAAQ,CACN,OAAOA,CACT,CACF,CAEO,SAASC,EAAkB,CAAE,MAAAC,GAA4C,CAC9E,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACZ,SAAA,CAAAD,EAAM,WAAW,eAChBC,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,WAEtF,QACC,IAAA,CAAE,UAAU,sCACV,SAAAF,EAAM,WAAW,aAAA,CACpB,CAAA,EACF,SAED,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,OAEtF,QACC,IAAA,CAAE,UAAU,sCACV,SAAAF,EAAM,WAAW,IAAA,CACpB,CAAA,EACF,EACCA,EAAM,cAAgB,MACrBC,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,WAEtF,QACCC,EAAA,CAAc,GAAIH,EAAM,YAAa,UAAU,6BAAA,CAA8B,CAAA,EAChF,SAED,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,OAEtF,EACAA,MAACE,GAAU,KAAMJ,EAAM,WAAY,OAAO,WAAW,UAAU,6BAAA,CAA8B,CAAA,EAC/F,EAECA,EAAM,WAAW,aAChBC,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,SAEtF,QACC,IAAA,CAAE,UAAU,sCACV,SAAAF,EAAM,WAAW,WAAA,CACpB,CAAA,EACF,EAGDA,EAAM,WAAW,UAAY,eAC3B,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,UAEtF,EACAA,EAAAA,IAAC,KAAE,UAAU,sCACV,WAAM,WAAW,QAAU,MAAQ,sBAAA,CACtC,CAAA,EACF,EAGDF,EAAM,WAAW,cAChBC,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,eAEtF,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,+CAA+C,MAAOF,EAAM,WAAW,aACjF,SAAAA,EAAM,WAAW,YAAA,CACpB,CAAA,EACF,EAGDA,EAAM,WAAW,kBAAoB,eACnC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,aAEtF,QACC,IAAA,CAAE,UAAU,sCACV,SAAAF,EAAM,WAAW,eAAA,CACpB,CAAA,EACF,EAGDA,EAAM,WAAW,oBAAsB,aACrC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,kBAEtF,EACAD,EAAAA,KAAC,IAAA,CAAE,UAAU,sCAAsC,SAAA,CAAA,IAC/CD,EAAM,WAAW,kBAAA,CAAA,CACrB,CAAA,EACF,EAEDA,EAAM,WAAW,eAAiB,aAChC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,eAEtF,EACAD,EAAAA,KAAC,IAAA,CAAE,UAAU,sCAAsC,SAAA,CAAA,UACzCD,EAAM,WAAW,aAAA,CAAA,CAC3B,CAAA,EACF,EAEDA,EAAM,WAAW,oBAAsB,aACrC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,kBAEtF,EACAD,EAAAA,KAAC,IAAA,CAAE,UAAU,sCAAsC,SAAA,CAAA,IAC/CD,EAAM,WAAW,kBAAA,CAAA,CACrB,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,CAEO,SAASK,EAAqB,CAAE,MAAAL,EAAO,UAAAM,GAG3C,CACD,MAAMC,EAAaD,EAAYT,EAAcS,EAAU,QAAQ,EAAI,KAC7DE,EAAcF,EAAYT,EAAcS,EAAU,IAAI,EAAI,KAGhE,MAAI,CAACA,GAAaN,EAAM,WAAW,wBAE9B,MAAA,CAAI,UAAU,sCACb,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,yEAAyE,SAAA,iBAEzF,EACAA,EAAAA,IAACO,EAAA,CACC,GAAI,yBAAyBT,EAAM,WAAW,iBAAiB,GAC/D,UAAU,gDACV,QAAUU,GAAMA,EAAE,gBAAA,EAEjB,WAAM,WAAW,iBAAA,CAAA,CACpB,CAAA,CACF,CAAA,CACF,EAKAJ,EAEAL,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,yEAAyE,SAAA,iBAEzF,EACAA,EAAAA,IAACO,EAAA,CACC,GAAI,yBAAyBH,EAAU,WAAW,GAClD,UAAU,gDACV,QAAUI,GAAMA,EAAE,gBAAA,EAEjB,SAAAJ,EAAU,WAAA,CAAA,EAEbJ,EAAAA,IAACS,EAAA,CAAY,OAAQL,EAAU,MAAA,CAAQ,EACtCA,EAAU,cACTL,OAAC,OAAA,CAAK,UAAU,iCAAiC,SAAA,CAAA,mBACpCG,EAAA,CAAU,KAAME,EAAU,aAAc,OAAO,UAAA,CAAW,CAAA,CAAA,CACvE,CAAA,EAEJ,GAEEC,GAAc,MAAQC,GAAe,OACrCP,OAAC,MAAA,CAAI,UAAU,wCACZ,SAAA,CAAAM,GAAc,KACbL,EAAAA,IAACU,EAAA,CAAW,KAAML,EAAY,MAAM,mBAAmB,QAAQ,OAAA,CAAQ,EACrEL,EAAAA,IAAC,MAAA,CAAA,CAAI,EACRM,GAAe,KACdN,EAAAA,IAACU,EAAA,CAAW,KAAMJ,EAAa,MAAM,kBAAkB,QAAQ,OAAA,CAAQ,EACrEN,EAAAA,IAAC,MAAA,CAAA,CAAI,CAAA,CAAA,CACX,CAAA,EAEJ,EAIG,IACT,CAEO,SAASW,EAAoB,CAAE,MAAAb,EAAO,UAAAM,GAG1C,CACD,MAAMQ,EAAQd,EAAM,WAAW,MACzBe,EAASf,EAAM,WAAW,OAC1BgB,EAAWhB,EAAM,WAAa,SAC9BiB,EAAajB,EAAM,WAAa,WAChCkB,EAAUlB,EAAM,WAAa,iBAC7BmB,EAAWL,IAAU,SAAcG,GAAcC,GACjDE,EAAY,CAACd,GAAaS,IAAW,SAAcE,GAAcC,GACjEG,EAAcrB,EAAM,WAAW,gBAAkB,iBAAmB,iBAAmB,SAE7F,OAAImB,GAAYC,EAEZnB,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACZ,SAAA,CAAAkB,EACCjB,EAAAA,IAACU,EAAA,CAAW,KAAME,EAAO,MAAM,QAAQ,QAAQ,OAAA,CAAQ,EACrDZ,EAAAA,IAAC,MAAA,CAAA,CAAI,EACRkB,EACClB,EAAAA,IAACU,EAAA,CAAW,KAAMG,EAAQ,MAAOM,EAAa,QAAQ,OAAA,CAAQ,EAC5DnB,EAAAA,IAAC,MAAA,CAAA,CAAI,CAAA,EACX,EAIAc,GAAYF,IAAU,aAChBF,EAAA,CAAW,KAAME,EAAO,MAAM,iBAAiB,QAAQ,QAAQ,EAGlE,IACT,CC7MO,SAASQ,EAAiB,CAAE,MAAAtB,EAAO,UAAAM,EAAW,QAAAiB,EAAU,GAAO,QAAAC,GAAkC,CACtG,OACEvB,EAAAA,KAAC,MAAA,CAAI,UAAU,6CAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0CACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,kDACV,SAAAF,EAAM,WAAW,eACbA,EAAM,WAAW,aACjBA,EAAM,WAAW,mBACjBA,EAAM,WACb,EACCuB,GACCtB,EAAAA,KAAC,OAAA,CAAK,UAAU,wHACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,0DAAA,CAA2D,EAAE,SAAA,CAAA,CAE/E,CAAA,EAEJ,EACCsB,GACCtB,EAAAA,IAAC,SAAA,CACC,QAASsB,EACT,UAAU,qDACX,SAAA,OAAA,CAAA,CAED,EAEJ,EAGAtB,MAACH,GAAkB,MAAAC,EAAc,EAGjCE,EAAAA,IAACG,EAAA,CAAqB,MAAAL,EAAc,UAAAM,CAAA,CAAsB,EAG1DJ,EAAAA,IAACW,EAAA,CAAoB,MAAAb,EAAc,UAAAM,CAAA,CAAsB,EAGxDN,EAAM,WAAW,UAAY,QAC5BE,EAAAA,IAACU,EAAA,CAAW,KAAMZ,EAAM,WAAW,QAAS,MAAM,SAAA,CAAU,GAI5D,IAAM,CACN,KAAM,CACJ,KAAAyB,EACA,cAAAC,EACA,OAAAX,EACA,aAAAY,EACA,gBAAAC,EACA,YAAAC,EACA,MAAAf,EACA,kBAAAgB,EACA,QAAAC,EACA,cAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,QAAAC,EACA,SAAAC,EACA,QAAAC,EACA,GAAGC,CAAA,EACDtC,EAAM,WACV,OAAO,OAAO,KAAKsC,CAAI,EAAE,OAAS,EAChCpC,EAAAA,IAACU,EAAA,CAAW,KAAM0B,EAAM,MAAM,YAAA,CAAa,EACzC,IACN,GAAA,CAAG,EACL,CAEJ,CCpEO,MAAMC,EAAiG,CAC5G,SAAgB,CAAE,IAAK,cAAqB,QAAS,iCAAuC,KAAM,gBAAsB,MAAO,YAAA,EAC/H,OAAgB,CAAE,IAAK,iBAAqB,QAAS,oCAAuC,KAAM,mBAAsB,MAAO,SAAA,EAC/H,MAAgB,CAAE,IAAK,oBAAqB,QAAS,uCAAwC,KAAM,sBAAuB,MAAO,QAAA,EACjI,eAAgB,CAAE,IAAK,gBAAqB,QAAS,mCAAuC,KAAM,kBAAsB,MAAO,iBAAA,CACjI,EAEaC,EAAgB,sCAGhBC,MAAyB,IAAI,CACxC,UAAW,aAAc,iBAAkB,cAAe,aAAc,gBAC1E,CAAC,EAKM,SAASC,EAAeC,EAAaC,EAAwB,CAClE,GAAID,EAAI,QAAUC,EAAQ,OAAOD,EACjC,MAAME,EAAO,KAAK,OAAOD,EAAS,GAAK,CAAC,EACxC,MAAO,GAAGD,EAAI,MAAM,EAAGE,CAAI,CAAC,IAAIF,EAAI,MAAMA,EAAI,OAASE,CAAI,CAAC,EAC9D,CAgBO,SAASC,EAAmBC,EAAkD,CACnF,MAAMC,EAAwB,CAAA,EAGxBC,MAAiB,IACjBC,MAAmB,IAEzB,UAAWC,KAAOJ,EAAQ,CACxB,MAAMK,EAAQD,EAAI,WAAW,aAC7B,GAAI,CAACC,EAAO,SACZ,MAAMC,EAAOF,EAAI,WAEbE,IAAS,2BACTA,IAAS,iBACTA,IAAS,oCACTA,IAAS,sBACXJ,EAAW,IAAIG,EAAOD,CAAG,EAEzBD,EAAa,IAAIE,EAAOD,CAAG,CAE/B,CAGA,MAAMG,MAAW,IAEjB,UAAWH,KAAOJ,EAAQ,CACxB,MAAMK,EAAQD,EAAI,WAAW,aAG7B,GAAIC,GAASE,EAAK,IAAIF,CAAK,EAAG,SAC1BA,GAAOE,EAAK,IAAIF,CAAK,EAEzB,MAAMG,EAAUH,EAAQH,EAAW,IAAIG,CAAK,EAAI,OAC1CI,EAAYJ,EAAQF,EAAa,IAAIE,CAAK,EAAI,OAG9CK,EAAUD,GAAaD,GAAWJ,EAClCO,EAAMD,EAAQ,SACdE,EAAOF,EAAQ,WAAW,eAC3BA,EAAQ,WAAW,aACnBA,EAAQ,WAAW,mBACnBA,EAAQ,WAEPG,EAAWL,GAAWE,EACtBI,EAASL,EAETM,EAAU,IAAI,KAAKF,EAAS,UAAU,EAAE,QAAA,EAC9C,IAAIG,EAAuB,KACvBC,EAAqB,KACrBzC,EAAU,GAEVsC,GACFE,EAAQ,IAAI,KAAKF,EAAO,UAAU,EAAE,QAAA,EACpCG,EAAMH,EAAO,aAAgBE,EAAQD,GAC5BL,EAAQ,cAAgB,MACjCO,EAAMP,EAAQ,YACdM,EAAQD,EAAUE,GAGlBzC,EAAU,GAGZyB,EAAM,KAAK,CACT,SAAUU,EACV,KAAMC,GAAQF,EAAQ,WACtB,UAAWK,EACX,QAASC,EACT,SAAUC,EACV,QAASP,EAAQ,SACjB,QAAAlC,CAAA,CACD,CACH,CAEA,OAAOyB,CACT,CChHO,SAASiB,GAAiB,CAAE,OAAAlB,EAAQ,WAAAmB,EAAY,QAAAC,GAAkC,CACvF,KAAM,CAACC,EAAgBC,CAAiB,EAAIC,EAAAA,SAAsB,IAAI,GAAK,EACrE,CAACC,EAAcC,CAAe,EAAIF,EAAAA,SAAwB,IAAI,EAQ9DG,EALiB1B,EAAO,OAC3B,GAAM,EAAE,WAAa,UAAA,EAMxB,GAAI0B,EAAc,SAAW,EAAG,OAAO,KAEvC,MAAMzB,EAAQF,EAAmB2B,CAAa,EAC9C,GAAIzB,EAAM,SAAW,EAAG,OAAO,KAG/B,MAAM0B,EAAM,KAAK,IAAA,EACXC,EAAW3B,EAAM,QAAS4B,GAAM,CACpC,MAAMC,EAAQ,CAACD,EAAE,SAAS,EAC1B,OAAIA,EAAE,QAASC,EAAM,KAAKD,EAAE,OAAO,EAC9BC,EAAM,KAAKH,CAAG,EACZG,CACT,CAAC,EACKC,EAAU,KAAK,IAAI,GAAGH,CAAQ,EAE9BI,EADU,KAAK,IAAI,GAAGJ,CAAQ,EACRG,GAAW,EAGjCE,MAAc,IAEpB,UAAWC,KAAQjC,EAAO,CACxB,MAAMkC,EAAU,GAAGD,EAAK,QAAQ,IAAIA,EAAK,IAAI,GACvCE,EAAcF,EAAK,UAAYH,EAE/BM,GADYH,EAAK,QAAUA,EAAK,QAAUH,EAAWJ,EAAMI,GACrCK,EAEtBE,EAAmB,CACvB,QAASJ,EAAK,QACd,SAAWE,EAAcJ,EAAa,IACtC,SAAU,KAAK,IAAKK,EAAUL,EAAa,IAAK,EAAG,EACnD,SAAUE,EAAK,SACf,MAAO,GAAGA,EAAK,IAAI,MAAMA,EAAK,WAAa,KAAOK,EAAeL,EAAK,QAAQ,EAAI,SAAS,MAAM,IAAI,KAAKA,EAAK,SAAS,EAAE,oBAAoB,GAC9I,UAAW,IAAI,KAAKA,EAAK,SAAS,EAAE,YAAA,EACpC,QAASA,EAAK,OAAA,EAGXD,EAAQ,IAAIE,CAAO,GACtBF,EAAQ,IAAIE,EAAS,CAAE,KAAMD,EAAK,KAAM,SAAUA,EAAK,SAAU,SAAU,CAAA,CAAC,CAAG,EAEjFD,EAAQ,IAAIE,CAAO,EAAG,SAAS,KAAKG,CAAO,CAC7C,CAEA,MAAME,EAAgB,MAAM,KAAKP,EAAQ,QAAQ,EAG3CQ,EAAY,EACZC,EAAQ,MAAM,KAAK,CAAE,OAAQD,EAAY,CAAA,EAAK,CAACE,EAAG,KAAO,CAC7D,IAAM,EAAIF,EAAa,IACvB,MAAOF,EAAe,KAAK,MAAO,EAAIE,EAAaT,CAAS,CAAC,CAAA,EAC7D,EAGIY,EAAmB,CAAC,GAAG,IAAI,IAAI3C,EAAM,IAAK4B,GAAMA,EAAE,QAAQ,CAAC,CAAC,EAG5DgB,EAAiBzC,GAA0D,CAC/E,GAAI,EAACe,GAAA,MAAAA,EAAY,QAAQ,OACzB,MAAM2B,EAAe1C,EAAI,WAAW,cACpC,GAAK0C,EACL,OAAO3B,EAAW,KAAM4B,GAAMA,EAAE,gBAAkBD,CAAY,CAChE,EAEME,EAAeC,GAAe,CAClC3B,EAAmB4B,GAAS,CAC1B,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAIC,EAAK,IAAIF,CAAE,EAAGE,EAAK,OAAOF,CAAE,EAC3BE,EAAK,IAAIF,CAAE,EACTE,CACT,CAAC,CACH,EAEMC,EAAcnD,EAAM,IAAK4B,GAAMA,EAAE,OAAO,EACxCwB,EAAcD,EAAY,OAAS,GAAKA,EAAY,MAAOH,GAAO5B,EAAe,IAAI4B,CAAE,CAAC,EAExFK,EAAY,IAAM,CAEpBhC,EADE+B,EACgB,IAAI,IAEJ,IAAI,IAAID,CAAW,CAFV,CAI/B,EAIMG,EAAW,CAAC5C,EAAanC,IAAqB,SAClD,OAAIA,EAAgBiB,EAChB2B,IAAgBoC,EAAAhE,EAAgBmB,CAAG,IAAnB,YAAA6C,EAAsB,UAAW,wCAC9CC,EAAAjE,EAAgBmB,CAAG,IAAnB,YAAA8C,EAAsB,MAAO,kBACtC,EAEMC,EAAa/C,GAAgB,OACjC,OAAIS,IAAgBoC,EAAAhE,EAAgBmB,CAAG,IAAnB,YAAA6C,EAAsB,OAAQ,qBAC3C,YACT,EAEA,OACEtG,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,qBAEtF,EACAA,EAAAA,IAAC,UAAO,QAASmG,EAAW,UAAU,0CACnC,SAAAD,EAAc,eAAiB,YAAA,CAClC,EAGAnG,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACZ,SAAA,CAAA0F,EAAiB,IAAKjC,GAAA,WACrBzD,OAAAA,EAAAA,KAAC,MAAA,CAAc,UAAU,0BACvB,SAAA,CAAAC,MAAC,QAAK,UAAW,wBAAwBiE,EAAU,YAAUoC,EAAAhE,EAAgBmB,CAAG,IAAnB,YAAA6C,EAAsB,UAAW,sBAAsB,KAAKC,EAAAjE,EAAgBmB,CAAG,IAAnB,YAAA8C,EAAsB,MAAO,kBAAkB,GAAI,EAC5KtG,MAAC,QAAK,UAAU,gCACb,eAAgBwD,CAAG,kBAAG,QAASA,CAAA,CAClC,CAAA,CAAA,EAJQA,CAKV,EACD,EACAV,EAAM,KAAM4B,GAAMA,EAAE,OAAO,GAC1B3E,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,sDAAA,CAAuD,EACvEA,EAAAA,IAAC,OAAA,CAAK,UAAU,gCAAgC,SAAA,SAAA,CAAO,CAAA,CAAA,CACzD,CAAA,CAAA,CAEJ,CAAA,EACF,EAGAD,EAAAA,KAAC,MAAA,CAAI,UAAU,OACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAA,CAAgB,QAC9B,MAAA,CAAI,UAAU,qDACZ,SAAAuF,EAAM,IAAKiB,GACVxG,EAAAA,IAAC,OAAA,CAEC,UAAU,6EACV,MAAO,CAAE,KAAM,GAAGwG,EAAK,GAAG,GAAA,EAEzB,SAAAA,EAAK,KAAA,EAJDA,EAAK,GAAA,CAMb,CAAA,CACH,CAAA,EACF,EAGCnB,EAAM,IAAKoB,GAAS,CACnB,MAAMC,EAAWrE,EAAgBoE,EAAK,QAAQ,EAE9C,cACG,MAAA,CAEC,SAAA,CAAA1G,EAAAA,KAAC,MAAA,CAAI,UAAU,mDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAAC,MAAC,QAAK,UAAW,sCAAqC0G,GAAA,YAAAA,EAAU,MAAO,kBAAkB,GAAI,EAC7F1G,EAAAA,IAAC,IAAA,CACC,UAAU,0EACV,MAAOyG,EAAK,KAEX,SAAAjE,EAAeiE,EAAK,KAAM,EAAE,CAAA,CAAA,EAE9BlE,EAAmB,IAAIkE,EAAK,IAAI,GAC/BzG,EAAAA,IAAC,OAAA,CAAK,UAAU,0BAA0B,MAAM,uBAC9C,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,UAAU,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC1F,SAAAA,MAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,kNAAA,CAAmN,EAC1Q,CAAA,CACF,CAAA,EAEJ,EAEAD,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACZ,SAAA,CAAAwF,EAAM,IAAKiB,GACVxG,EAAAA,IAAC,MAAA,CAEC,UAAU,4DACV,MAAO,CAAE,KAAM,GAAGwG,EAAK,GAAG,GAAA,CAAI,EAFzBA,EAAK,GAAA,CAIb,EAEAC,EAAK,SAAS,IAAKE,GAAQ,CAC1B,MAAMC,EAAYvC,IAAiBsC,EAAI,QACjCE,EAAa3C,EAAe,IAAIyC,EAAI,OAAO,EAC3CG,EAAWH,EAAI,SAAW,EAChC,OACE3G,EAAAA,IAAC,MAAA,CAEC,UAAW,0FAA0FiE,EAAU,WAAa,EAAE,IAC5H4C,EACI,GAAGT,EAASK,EAAK,SAAUE,EAAI,OAAO,CAAC,oCACvC,GAAGP,EAASK,EAAK,SAAUE,EAAI,OAAO,CAAC,mBAC7C,GACA,MAAO,CACL,KAAM,GAAGA,EAAI,QAAQ,IACrB,MAAO,GAAGA,EAAI,QAAQ,IACtB,SAAU,MACV,GAAIC,GAAaE,EAAW,CAC1B,UAAW,yCACX,OAAQ,GACR,aAAc,KAAA,EACZ,CACF,OAAQD,EAAa,GAAK,CAAA,CAC5B,EAEF,MAAOF,EAAI,MACX,QAAS,IAAMd,EAAYc,EAAI,OAAO,EACtC,aAAc,IAAMrC,EAAgBqC,EAAI,OAAO,EAC/C,aAAc,IAAMrC,EAAgB,IAAI,EAEvC,WAAI,SAAW,SACb,OAAA,CAAK,UAAW,kEAAkEiC,EAAUE,EAAK,QAAQ,CAAC,YACxG,WAAI,WAAa,KAAOrB,EAAeuB,EAAI,QAAQ,EAAI,SAAA,CAC1D,CAAA,EA1BGA,EAAI,OAAA,CA8Bf,CAAC,CAAA,CAAA,CACH,CAAA,EACF,EAGCF,EAAK,SAAS,IAAKE,GAAQ,CAC1B,MAAMI,EAAS7C,EAAe,IAAIyC,EAAI,OAAO,EACvC1D,EAAMsB,EAAc,KAAM/D,GAAMA,EAAE,WAAamG,EAAI,OAAO,EAChE,OACE3G,EAAAA,IAACgH,GAA8B,KAAMD,EAClC,YACC/G,EAAAA,IAAC,MAAA,CAAI,UAAU,OACb,SAAAA,EAAAA,IAACoB,EAAA,CACC,MAAO6B,EACP,UAAWyC,EAAczC,CAAG,EAC5B,QAAS0D,EAAI,QACb,QAAS,IAAMd,EAAY5C,EAAI,QAAQ,CAAA,CAAA,EAE3C,CAAA,EATc0D,EAAI,OAWtB,CAEJ,CAAC,CAAA,CAAA,EAvFO,GAAGF,EAAK,QAAQ,IAAIA,EAAK,IAAI,EAwFvC,CAEJ,CAAC,CAAA,EAEH,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowPill-DUDDyBsj.js","sources":["../../src/lib/type-color.ts","../../src/components/common/display/WorkflowPill.tsx"],"sourcesContent":["/**\n * Deterministic color assignment for workflow type names.\n *\n * Maps any string to a consistent color from a curated 24-color palette.\n * The same type name always produces the same color across the entire UI.\n * Uses a simple hash to distribute names evenly across the palette.\n *\n * Each entry provides:\n * text — icon and text color (Tailwind class)\n * bg — subtle background tint (Tailwind class)\n */\n\nconst PALETTE: Array<{ text: string; bg: string }> = [\n { text: 'text-rose-400', bg: 'bg-rose-400/[0.08]' },\n { text: 'text-pink-400', bg: 'bg-pink-400/[0.08]' },\n { text: 'text-fuchsia-400', bg: 'bg-fuchsia-400/[0.08]' },\n { text: 'text-purple-400', bg: 'bg-purple-400/[0.08]' },\n { text: 'text-violet-400', bg: 'bg-violet-400/[0.08]' },\n { text: 'text-indigo-400', bg: 'bg-indigo-400/[0.08]' },\n { text: 'text-blue-400', bg: 'bg-blue-400/[0.08]' },\n { text: 'text-sky-400', bg: 'bg-sky-400/[0.08]' },\n { text: 'text-cyan-400', bg: 'bg-cyan-400/[0.08]' },\n { text: 'text-teal-400', bg: 'bg-teal-400/[0.08]' },\n { text: 'text-emerald-400', bg: 'bg-emerald-400/[0.08]' },\n { text: 'text-green-400', bg: 'bg-green-400/[0.08]' },\n { text: 'text-lime-400', bg: 'bg-lime-400/[0.08]' },\n { text: 'text-yellow-400', bg: 'bg-yellow-400/[0.08]' },\n { text: 'text-amber-400', bg: 'bg-amber-400/[0.08]' },\n { text: 'text-orange-400', bg: 'bg-orange-400/[0.08]' },\n { text: 'text-red-400', bg: 'bg-red-400/[0.08]' },\n { text: 'text-stone-400', bg: 'bg-stone-400/[0.08]' },\n { text: 'text-rose-300', bg: 'bg-rose-300/[0.08]' },\n { text: 'text-violet-300', bg: 'bg-violet-300/[0.08]' },\n { text: 'text-sky-300', bg: 'bg-sky-300/[0.08]' },\n { text: 'text-teal-300', bg: 'bg-teal-300/[0.08]' },\n { text: 'text-amber-300', bg: 'bg-amber-300/[0.08]' },\n { text: 'text-pink-300', bg: 'bg-pink-300/[0.08]' },\n];\n\nfunction hash(str: string): number {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n h = ((h << 5) - h + str.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\nexport function typeColor(typeName: string): { text: string; bg: string } {\n return PALETTE[hash(typeName) % PALETTE.length];\n}\n","import { Workflow, ShieldCheck, Settings, Wand2 } from 'lucide-react';\nimport { typeColor } from '../../../lib/type-color';\n\ntype WorkflowVariant = 'durable' | 'configured' | 'certified' | 'pipeline';\n\ninterface WorkflowPillProps {\n type: string;\n size?: 'sm' | 'md';\n /** @deprecated Use `variant` instead */\n certified?: boolean;\n variant?: WorkflowVariant;\n}\n\nconst VARIANT_ICON: Record<WorkflowVariant, typeof Workflow> = {\n certified: ShieldCheck,\n configured: Settings,\n pipeline: Wand2,\n durable: Workflow,\n};\n\nconst VARIANT_FIXED_COLOR: Record<string, string> = {\n certified: 'text-status-success',\n configured: 'text-status-info',\n};\n\nexport function WorkflowPill({ type, size = 'sm', certified, variant }: WorkflowPillProps) {\n const sizeClass = size === 'md'\n ? 'px-2.5 py-0.5 text-[13px] gap-1.5'\n : 'px-2 py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3.5 h-3.5' : 'w-2.5 h-2.5';\n\n const resolved = variant ?? (certified ? 'certified' : 'durable');\n const Icon = VARIANT_ICON[resolved];\n\n // Pipeline and durable variants get a type-name-derived color.\n // Certified and configured keep their fixed semantic colors.\n const fixedColor = VARIANT_FIXED_COLOR[resolved];\n const derived = fixedColor ? null : typeColor(type);\n const iconColor = fixedColor || (derived?.text ?? 'text-accent/75');\n const bgColor = derived?.bg ?? 'bg-accent/[0.06]';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} font-mono ${bgColor} text-text-secondary rounded-lg`}>\n <Icon className={`${iconClass} shrink-0 ${iconColor}`} />\n {type}\n </span>\n );\n}\n"],"names":["PALETTE","hash","str","h","i","typeColor","typeName","VARIANT_ICON","ShieldCheck","Settings","Wand2","Workflow","VARIANT_FIXED_COLOR","WorkflowPill","type","size","certified","variant","sizeClass","iconClass","resolved","Icon","fixedColor","derived","iconColor","bgColor","jsx"],"mappings":"oHAYA,MAAMA,EAA+C,CACnD,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,mBAAqB,GAAI,uBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,eAAqB,GAAI,mBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,mBAAqB,GAAI,uBAAA,EACjC,CAAE,KAAM,iBAAqB,GAAI,qBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,iBAAqB,GAAI,qBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,eAAqB,GAAI,mBAAA,EACjC,CAAE,KAAM,iBAAqB,GAAI,qBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,kBAAqB,GAAI,sBAAA,EACjC,CAAE,KAAM,eAAqB,GAAI,mBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,EACjC,CAAE,KAAM,iBAAqB,GAAI,qBAAA,EACjC,CAAE,KAAM,gBAAqB,GAAI,oBAAA,CACnC,EAEA,SAASC,EAAKC,EAAqB,CACjC,IAAIC,EAAI,EACR,QAASC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAC9BD,GAAMA,GAAK,GAAKA,EAAID,EAAI,WAAWE,CAAC,EAAK,EAE3C,OAAO,KAAK,IAAID,CAAC,CACnB,CAEO,SAASE,EAAUC,EAAgD,CACxE,OAAON,EAAQC,EAAKK,CAAQ,EAAIN,EAAQ,MAAM,CAChD,CCpCA,MAAMO,EAAyD,CAC7D,UAAYC,EACZ,WAAYC,EACZ,SAAYC,EACZ,QAAYC,CACd,EAEMC,EAA8C,CAClD,UAAY,sBACZ,WAAY,kBACd,EAEO,SAASC,EAAa,CAAE,KAAAC,EAAM,KAAAC,EAAO,KAAM,UAAAC,EAAW,QAAAC,GAA8B,CACzF,MAAMC,EAAYH,IAAS,KACvB,oCACA,gCACEI,EAAYJ,IAAS,KAAO,cAAgB,cAE5CK,EAAWH,IAAYD,EAAY,YAAc,WACjDK,EAAOd,EAAaa,CAAQ,EAI5BE,EAAaV,EAAoBQ,CAAQ,EACzCG,EAAUD,EAAa,KAAOjB,EAAUS,CAAI,EAC5CU,EAAYF,KAAeC,GAAA,YAAAA,EAAS,OAAQ,kBAC5CE,GAAUF,GAAA,YAAAA,EAAS,KAAM,mBAE/B,cACG,OAAA,CAAK,UAAW,4BAA4BL,CAAS,cAAcO,CAAO,kCACzE,SAAA,CAAAC,MAACL,GAAK,UAAW,GAAGF,CAAS,aAAaK,CAAS,GAAI,EACtDV,CAAA,EACH,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as u,j as s}from"./vendor-query-B2UbickB.js";import{T as h}from"./TimestampCell-GOFcvE-i.js";import{E as D}from"./ElapsedCell-DrJif03B.js";import{u as R,e as E,b as W}from"./workflows-D6diL54s.js";import{i as z}from"./index-BUjxYyxc.js";import{b as A}from"./useEventHooks-BPjEkCpD.js";import{u as L}from"./useFilterParams-DZCAaBC7.js";import{D as M}from"./DataTable-D3-wSEf0.js";import{W as I}from"./WorkflowPill-DUDDyBsj.js";import{P as U}from"./PageHeader-B-SN5GZ2.js";import{F as O,b as f}from"./FilterBar-Ck4K4rzu.js";import{S as B}from"./StickyPagination-F9FZsRy9.js";import{L as H}from"./ListToolbar-CyEkulVR.js";import{R as G,a as w}from"./RowActions-Dg-Fsm5O.js";import{p as J,S as V}from"./vendor-icons-BkK55L-1.js";import{c as q}from"./vendor-react-CX88sFS5.js";import"./EmptyState-BcsfPq9T.js";const K={running:"in_progress",completed:"completed",failed:"failed"},Q={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},X={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function Y(d,n,p,a,r){return[{key:"workflow_id",label:"Workflow ID / Type",render:e=>{const o=Q[K[e.status]??e.status]??"bg-status-pending",m=e.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[s.jsx("span",{className:`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${o}${m}`,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(I,{type:e.entity,variant:r.get(e.entity)??"durable"})})]})]})}},{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(D,{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(G,{children:[s.jsx(w,{icon:J,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] ${X[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:V,title:"View config",onClick:()=>a(`/workflows/registry/${encodeURIComponent(e.entity)}`)})]}),className:"w-24 text-right"}]}function ge({tier:d="all"}){A();const n=q(),{isSuperAdmin:p}=z(),{filters:a,setFilter:r,pagination:e,sort:o,setSort:m}=L({filters:{search:"",entity:"",status:"",tier:d}}),l=a.tier||"all",v=l==="certified"?"true":l==="durable"?"false":void 0,{data:x}=R(),{data:g}=E(),k=u.useMemo(()=>{const t=new Map;for(const y of g??[])t.set(y.workflow_type,y.tier??"durable");return t},[g]),j=Y(t=>r("entity",t),t=>r("status",t),p,n,k),[c,S]=u.useState(a.search);u.useEffect(()=>{if(c===a.search)return;const t=setTimeout(()=>r("search",c),300);return()=>clearTimeout(t)},[c,r,a.search]);const{data:i,isLoading:C,refetch:_,isFetching:$}=W({limit:e.pageSize,offset:e.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:o.sort_by||void 0,order:o.sort_by?o.order:void 0,registered:v}),b=(i==null?void 0:i.total)??0,N=(i==null?void 0:i.jobs)??[],T=u.useMemo(()=>[...new Set((x??[]).map(t=>t.workflow_type))].sort(),[x]),P="Durable Executions",F=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(U,{title:P,docsHash:"#docs:dashboard.md:durable-executions"}),s.jsxs(O,{actions:s.jsx(H,{onRefresh:()=>_(),isFetching:$,apiPath:`/workflow-states/jobs?limit=${e.pageSize}&offset=${e.offset}${a.entity?`&entity=${a.entity}`:""}${a.search?`&search=${a.search}`:""}${a.status?`&status=${a.status}`:""}${o.sort_by?`&sort_by=${o.sort_by}&order=${o.order}`:""}`}),children:[s.jsx("input",{type:"text",placeholder:"Search workflow ID...",value:c,onChange:t=>S(t.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(f,{label:"Type",value:a.entity,onChange:t=>r("entity",t),options:T.map(t=>({value:t,label:t}))}),s.jsx(f,{label:"Status",value:a.status,onChange:t=>r("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=>r("tier",t||"all"),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]})]}),s.jsx(M,{columns:j,data:N,keyFn:t=>t.workflow_id,onRowClick:t=>n(`/workflows/executions/${t.workflow_id}`),isLoading:C,emptyMessage:F,sort:o,onSort:m}),s.jsx(B,{page:e.page,totalPages:e.totalPages(b),onPageChange:e.setPage,total:b,pageSize:e.pageSize,onPageSizeChange:e.setPageSize})]})}export{ge as WorkflowsDashboard};
|
|
2
|
-
//# sourceMappingURL=WorkflowsDashboard-Be1A1zAT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsDashboard-Be1A1zAT.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${dotClass}${pulseClass}`} title={row.status} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\n );\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: jobsData, isLoading, refetch, isFetching } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n registered: registeredFilter,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Durable Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:durable-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/jobs?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.search ? `&search=${filters.search}` : ''}${filters.status ? `&status=${filters.status}` : ''}${sort.sort_by ? `&sort_by=${sort.sort_by}&order=${sort.order}` : ''}`}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"8yBAoBA,MAAMA,EAAuC,CAC3C,QAAS,cACT,UAAW,YACX,OAAQ,QACV,EAEMC,EAAqC,CACzC,YAAa,mBACb,UAAW,oBACX,OAAQ,iBACV,EAEMC,EAAwC,CAC5C,QAAS,qBACT,UAAW,sBACX,OAAQ,mBACV,EAEA,SAASC,EACPC,EACAC,EACAC,EACAC,EACAC,EACiB,CACjB,MAAO,CACL,CACE,IAAK,cACL,MAAO,qBACP,OAASC,GAAQ,CACf,MAAMC,EAAWT,EAAWD,EAAaS,EAAI,MAAM,GAAKA,EAAI,MAAM,GAAK,oBACjEE,EAAaF,EAAI,SAAW,UAAY,iBAAmB,GACjE,OACEG,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAW,8CAA8CH,CAAQ,GAAGC,CAAU,GAAI,MAAOF,EAAI,MAAA,CAAQ,EAC3GG,EAAAA,KAAC,MAAA,CAAI,UAAU,UACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,qDACb,SAAAJ,EAAI,YACP,QACC,MAAA,CAAI,UAAU,SACb,SAAAI,EAAAA,IAACC,GAAa,KAAML,EAAI,OAAQ,QAASD,EAAQ,IAAIC,EAAI,MAAM,GAAK,UAAW,CAAA,CACjF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAAA,EAEF,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASM,EAAA,CAAc,KAAMN,EAAI,WAAY,EACtD,UAAW,OACX,SAAU,EAAA,EAEZ,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASM,EAAA,CAAc,KAAMN,EAAI,WAAY,EACtD,UAAW,OACX,SAAU,EAAA,EAEZ,CACE,IAAK,WACL,MAAO,WACP,OAASA,GACPI,EAAAA,IAACG,EAAA,CACC,UAAWP,EAAI,WACf,QAASA,EAAI,SAAW,UAAY,KAAOA,EAAI,WAC/C,OAAQA,EAAI,SAAW,SAAA,CAAA,EAG3B,UAAW,MAAA,EAEb,CACE,IAAK,UACL,MAAO,GACP,OAASA,GACPG,EAAAA,KAACK,EAAA,CACC,SAAA,CAAAJ,EAAAA,IAACK,EAAA,CACC,KAAMC,EACN,MAAO,aAAaV,EAAI,MAAM,GAC9B,QAAS,IAAML,EAAeK,EAAI,MAAM,CAAA,CAAA,EAE1CI,EAAAA,IAAC,SAAA,CACC,QAAUO,GAAM,CAAEA,EAAE,gBAAA,EAAmBf,EAAeI,EAAI,MAAM,CAAG,EACnE,UAAU,2DACV,MAAO,aAAaA,EAAI,MAAM,GAE9B,SAAAI,EAAAA,IAAC,OAAI,UAAW,qBAAqBX,EAAcO,EAAI,MAAM,GAAK,oBAAoB,oBAAqB,QAAQ,YAAY,KAAK,eAClI,eAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,GAAA,CAAI,CAAA,CAChC,CAAA,CAAA,EAEDH,GACCO,EAAAA,IAACK,EAAA,CACC,KAAMG,EACN,MAAM,cACN,QAAS,IAAMd,EAAS,uBAAuB,mBAAmBE,EAAI,MAAM,CAAC,EAAE,CAAA,CAAA,CACjF,EAEJ,EAEF,UAAW,iBAAA,CACb,CAEJ,CAEO,SAASa,GAAmB,CAAE,KAAMC,EAAc,OAAoC,CAC3FC,EAAA,EACA,MAAMjB,EAAWkB,EAAA,EACX,CAAE,aAAAnB,CAAA,EAAiBoB,EAAA,EAEnB,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACxE,QAAS,CAAE,OAAQ,GAAI,OAAQ,GAAI,OAAQ,GAAI,KAAMT,CAAA,CAAY,CAClE,EAEKU,EAAcN,EAAQ,MAAQ,MAG9BO,EAAmBD,IAAe,YAAc,OAClDA,IAAe,UAAY,QAC3B,OAEE,CAAE,KAAME,CAAA,EAAYC,EAAA,EACpB,CAAE,KAAMC,CAAA,EAAmBC,EAAA,EAE3B9B,EAAU+B,EAAAA,QAAQ,IAAM,CAC5B,MAAMC,MAAU,IAChB,UAAWC,KAAMJ,GAAkB,GACjCG,EAAI,IAAIC,EAAG,cAAeA,EAAG,MAAQ,SAAS,EAEhD,OAAOD,CACT,EAAG,CAACH,CAAc,CAAC,EAEbK,EAAUvC,EACbwC,GAAWf,EAAU,SAAUe,CAAM,EACrCC,GAAWhB,EAAU,SAAUgB,CAAM,EACtCtC,EACAC,EACAC,CAAA,EAEI,CAACqC,EAAaC,CAAc,EAAIC,EAAAA,SAASpB,EAAQ,MAAM,EAE7DqB,EAAAA,UAAU,IAAM,CACd,GAAIH,IAAgBlB,EAAQ,OAAQ,OACpC,MAAMsB,EAAQ,WAAW,IAAMrB,EAAU,SAAUiB,CAAW,EAAG,GAAG,EACpE,MAAO,IAAM,aAAaI,CAAK,CACjC,EAAG,CAACJ,EAAajB,EAAWD,EAAQ,MAAM,CAAC,EAE3C,KAAM,CAAE,KAAMuB,EAAU,UAAAC,EAAW,QAAAC,EAAS,WAAAC,CAAA,EAAeC,EAAQ,CACjE,MAAOzB,EAAW,SAClB,OAAQA,EAAW,OACnB,OAAQF,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,QAASG,EAAK,SAAW,OACzB,MAAOA,EAAK,QAAUA,EAAK,MAAQ,OACnC,WAAYI,CAAA,CACb,EAEKqB,GAAQL,GAAA,YAAAA,EAAU,QAAS,EAC3BM,GAAON,GAAA,YAAAA,EAAU,OAAQ,CAAA,EAEzBO,EAAWlB,EAAAA,QAAQ,IAChB,CAAC,GAAG,IAAI,KAAKJ,GAAW,CAAA,GAAI,IAAKuB,GAAMA,EAAE,aAAa,CAAC,CAAC,EAAE,KAAA,EAChE,CAACvB,CAAO,CAAC,EAENwB,EAAY,qBAEZC,EAAe3B,IAAe,YAChC,yCACAA,IAAe,UACb,uCACA,+BAEN,cACG,MAAA,CACC,SAAA,CAAApB,EAAAA,IAACgD,EAAA,CAAW,MAAOF,EAAW,SAAS,wCAAwC,EAE/E/C,OAACkD,GAAU,QACTjD,EAAAA,IAACkD,EAAA,CACC,UAAW,IAAMX,EAAA,EACjB,WAAAC,EACA,QAAS,+BAA+BxB,EAAW,QAAQ,WAAWA,EAAW,MAAM,GAAGF,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,GAAGA,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,GAAGA,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,GAAGG,EAAK,QAAU,YAAYA,EAAK,OAAO,UAAUA,EAAK,KAAK,GAAK,EAAE,EAAA,CAAA,EAG1T,SAAA,CAAAjB,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,YAAY,wBACZ,MAAOgC,EACP,SAAWzB,GAAM0B,EAAe1B,EAAE,OAAO,KAAK,EAC9C,UAAU,kCAAA,CAAA,EAEZP,EAAAA,IAACmD,EAAA,CACC,MAAM,OACN,MAAOrC,EAAQ,OACf,SAAWsC,GAAMrC,EAAU,SAAUqC,CAAC,EACtC,QAASR,EAAS,IAAKrC,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,CAAA,EAEvDP,EAAAA,IAACmD,EAAA,CACC,MAAM,SACN,MAAOrC,EAAQ,OACf,SAAWsC,GAAMrC,EAAU,SAAUqC,CAAC,EACtC,QAAS,CACP,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,SAAU,MAAO,QAAA,CAAS,CACrC,CAAA,EAEFpD,EAAAA,IAACmD,EAAA,CACC,MAAM,OACN,MAAOrC,EAAQ,OAAS,MAAQ,GAAKA,EAAQ,KAC7C,SAAWsC,GAAMrC,EAAU,OAAQqC,GAAK,KAAK,EAC7C,QAAS,CACP,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,UAAW,MAAO,SAAA,CAAU,CACvC,CAAA,CACF,EACF,EAEApD,EAAAA,IAACqD,EAAA,CACC,QAAAxB,EACA,KAAMc,EACN,MAAQ/C,GAAQA,EAAI,YACpB,WAAaA,GAAQF,EAAS,yBAAyBE,EAAI,WAAW,EAAE,EACxE,UAAA0C,EACA,aAAAS,EACA,KAAA9B,EACA,OAAQC,CAAA,CAAA,EAGVlB,EAAAA,IAACsD,EAAA,CACC,KAAMtC,EAAW,KACjB,WAAYA,EAAW,WAAW0B,CAAK,EACvC,aAAc1B,EAAW,QACzB,MAAA0B,EACA,SAAU1B,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as u,j as e}from"./vendor-query-B2UbickB.js";import{l as $,n as z,o as F,u as q}from"./yaml-workflows-CAKU7LUu.js";import{a as Y,d as B}from"./useYamlActivityEvents-D3RQjfzo.js";import{u as D}from"./useFilterParams-DZCAaBC7.js";import{u as V}from"./useExpandedRows-CkcEntB-.js";import{P as O}from"./PageHeader-B-SN5GZ2.js";import{F as H,a as U,b as P}from"./FilterBar-Ck4K4rzu.js";import{E as G}from"./EmptyState-BcsfPq9T.js";import{b as J,R as A}from"./RunAsSelector-CD7_Dmb0.js";import{X as L,_ as X,a6 as K,P as E,k as Q,W as Z,b as R,$ as ee}from"./vendor-icons-BkK55L-1.js";import{L as te,c as se}from"./vendor-react-CX88sFS5.js";import{S as w}from"./index-BUjxYyxc.js";import{d as M,C as re}from"./helpers-D50KFFkI.js";import{S as T}from"./StatusBadge-XQlNFwmH.js";import"./BotPicker-C2xR1xay.js";import"./bots-BZPXDh_y.js";import"./TimeAgo-BihIwEbB.js";const I={mcp:{border:"border-blue-500",text:"text-blue-500",icon:"MCP"},db:{border:"border-blue-500",text:"text-blue-500",icon:"DB"},llm:{border:"border-violet-500",text:"text-violet-500",icon:"LLM"},transform:{border:"border-emerald-500",text:"text-emerald-500",icon:"Map"}};function ae({steps:t,manifest:i,isComplete:r}){const a=i.filter(s=>s.type==="worker"),x=a.length,o=a.map(s=>{const l=t.find(d=>d.activityId===s.activity_id),p=s.tool_source||"mcp",f=I[p]||I.mcp;return{activityId:s.activity_id,title:s.title||s.mcp_tool_name||s.activity_id,toolName:s.mcp_tool_name,colors:f,status:(l==null?void 0:l.status)||"pending",error:l==null?void 0:l.error}});return e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] text-text-secondary mb-3",children:r?`All ${x} steps completed`:`Running step ${o.filter(s=>s.status==="completed").length+1} of ${x}...`}),e.jsx("div",{className:"space-y-0",children:o.map((s,l)=>{const p=l===o.length-1;return e.jsxs("div",{className:"flex items-stretch gap-2",children:[e.jsxs("div",{className:"flex flex-col items-center w-4 shrink-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${s.status==="completed"?"bg-status-success border-status-success":s.status==="running"?`${s.colors.border} bg-transparent animate-pulse`:s.status==="failed"?"bg-status-error border-status-error":"bg-surface-sunken border-surface-border"}`}),!p&&e.jsx("span",{className:`w-px flex-1 transition-colors ${s.status==="completed"?"bg-status-success/30":"bg-surface-border"}`})]}),e.jsxs("div",{className:p?"":"pb-3",children:[e.jsx("p",{className:`text-[11px] font-medium ${s.status==="running"?"text-text-primary":s.status==="completed"?"text-text-secondary":s.status==="failed"?"text-status-error":"text-text-tertiary"}`,children:s.title}),s.toolName&&e.jsx("span",{className:"text-[9px] text-text-tertiary font-mono",children:s.toolName}),s.error&&e.jsx("p",{className:"text-[9px] text-status-error mt-0.5",children:s.error})]})]},s.activityId)})})]})}function ne({workflow:t,onClose:i}){const r=$(),[a,x]=u.useState(!1),[o,s]=u.useState({}),[l,p]=u.useState(""),[f,d]=u.useState(""),[m,j]=u.useState(""),[b,N]=u.useState(null),[v,y]=u.useState(null),{steps:k,isComplete:n}=Y(b);u.useEffect(()=>{N(null),y(null),d(""),r.reset();const h=J(t.input_schema);s(h),p(JSON.stringify(h,null,2)),x(!1)},[t.id]),u.useEffect(()=>{if(n&&b){const h=b,g=setTimeout(()=>{y({jobId:h}),N(null)},800);return()=>clearTimeout(g)}},[n,b]);const c=()=>{if(!a)p(JSON.stringify(o,null,2));else try{s(JSON.parse(l))}catch{}x(!a)},S=async()=>{d(""),y(null);let h;if(a)try{h=JSON.parse(l)}catch{d("Invalid JSON");return}else h={...o};try{const g=await r.mutateAsync({id:t.id,data:h,sync:!1,...m?{execute_as:m}:{}});g.job_id&&N(g.job_id)}catch{}},_=!!b,W=t.app_id||"longtail";return e.jsxs("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary truncate",children:t.app_id}),e.jsx("code",{className:"text-[11px] font-mono text-accent truncate block",children:t.graph_topic})]}),e.jsx("button",{onClick:()=>{_||i()},className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsx(L,{className:"w-4 h-4"})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:_?e.jsx(ae,{steps:k,manifest:t.activity_manifest,isComplete:n}):v?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"})}),e.jsx("p",{className:"text-xs font-medium text-status-success",children:"Workflow completed"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(te,{to:`/mcp/executions/${encodeURIComponent(v.jobId)}?namespace=${encodeURIComponent(W)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(X,{size:12})," View execution"]}),e.jsxs("button",{onClick:()=>y(null),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(K,{size:12})," Run again"]})]})]}):e.jsxs(e.Fragment,{children:[e.jsx(A,{selected:m,onChange:j}),t.description&&e.jsx("p",{className:"text-[11px] text-text-secondary leading-relaxed",children:t.description}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Input"}),e.jsx("button",{onClick:c,className:"text-[10px] text-accent hover:underline",children:a?"Form view":"JSON view"})]}),a?e.jsx("textarea",{value:l,onChange:h=>p(h.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1}):e.jsxs("div",{className:"space-y-3 max-h-[300px] overflow-y-auto",children:[Object.entries(o).map(([h,g])=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:h}),typeof g=="boolean"?e.jsxs("select",{value:String(g),onChange:C=>s({...o,[h]:C.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):typeof g=="object"?e.jsx("textarea",{value:JSON.stringify(g,null,2),onChange:C=>{try{s({...o,[h]:JSON.parse(C.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"}):e.jsx("input",{type:typeof g=="number"?"number":"text",value:String(g??""),onChange:C=>s({...o,[h]:typeof g=="number"?Number(C.target.value):C.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"})]},h)),Object.keys(o).length===0&&e.jsx("p",{className:"text-[11px] text-text-tertiary italic",children:"No input fields defined"})]}),f&&e.jsx("p",{className:"text-[11px] text-status-error mt-1",children:f})]}),r.isError&&e.jsx("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsx("p",{className:"text-[11px] text-status-error",children:r.error instanceof Error?r.error.message:"Invocation failed"})}),e.jsx("button",{onClick:S,disabled:r.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:r.isPending?"Starting...":e.jsxs(e.Fragment,{children:[e.jsx(E,{size:12})," Run"]})})]})})]})}function oe({cronInput:t,setCronInput:i,setCron:r,hasCronSchedule:a,onSave:x,onClear:o}){return e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx(w,{className:"mb-3",children:"Schedule"}),e.jsxs("div",{className:"flex gap-3 items-start",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("input",{type:"text",value:t,onChange:s=>{i(s.target.value),r.reset()},placeholder:"0 */6 * * *",className:"input font-mono text-sm w-full"}),t.trim()&&M(t.trim())&&e.jsx("p",{className:"text-xs text-text-secondary mt-1.5",children:M(t.trim())})]}),e.jsx("button",{onClick:x,disabled:r.isPending,className:"btn-primary text-xs shrink-0",children:r.isPending?"Saving...":"Save"}),a&&e.jsx("button",{onClick:o,disabled:r.isPending,className:"btn-ghost text-xs text-status-error shrink-0",children:"Clear"})]}),r.isSuccess&&e.jsx("p",{className:"text-[10px] text-status-success mt-2",children:"Schedule updated"}),r.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-2",children:r.error.message})]}),e.jsxs("div",{className:"bg-surface-sunken rounded-lg p-4",children:[e.jsx(w,{className:"mb-2",children:"Common Patterns"}),e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5",children:re.map(([s,l])=>e.jsxs("button",{type:"button",onClick:()=>{i(s),r.reset()},className:"flex items-center gap-2 text-left py-0.5 group",children:[e.jsx("code",{className:"font-mono text-[11px] text-accent group-hover:text-accent-hover",children:s}),e.jsx("span",{className:"text-[10px] text-text-tertiary",children:l})]},s))})]})]})}function ie({workflow:t,onClose:i}){const r=z(),a=F(),[x,o]=u.useState(""),[s,l]=u.useState(""),[p,f]=u.useState(!1),[d,m]=u.useState({}),[j,b]=u.useState("{}");u.useEffect(()=>{o(t.cron_schedule??""),l(t.execute_as??""),r.reset(),a.reset();const n=t.cron_envelope||{},c=Object.keys(n).length>0?n:J(t.input_schema);m(c),b(JSON.stringify(c,null,2)),f(!1)},[t.id]);const N=()=>{if(!p)b(JSON.stringify(d,null,2));else try{m(JSON.parse(j))}catch{}f(!p)},v=()=>{let n;if(p)try{n=JSON.parse(j)}catch{return}else n={...d};r.mutate({id:t.id,cron_schedule:x.trim(),cron_envelope:Object.keys(n).length>0?n:null,execute_as:s||null})},y=()=>{a.mutate(t.id,{onSuccess:()=>{o("")}})},k={isPending:r.isPending||a.isPending,isSuccess:r.isSuccess||a.isSuccess,error:r.error||a.error,reset:()=>{r.reset(),a.reset()}};return e.jsxs("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary truncate",children:"Cron Schedule"}),e.jsx("code",{className:"text-[11px] font-mono text-accent truncate block",children:t.graph_topic})]}),e.jsx("button",{onClick:i,className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsx(L,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:[e.jsx(A,{selected:s,onChange:l}),e.jsx(oe,{cronInput:x,setCronInput:o,setCron:k,hasCronSchedule:!!t.cron_schedule,onSave:v,onClear:y}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx(w,{children:"Default Input"}),e.jsx("button",{onClick:N,className:"text-[10px] text-accent hover:underline",children:p?"Form view":"JSON view"})]}),p?e.jsx("textarea",{value:j,onChange:n=>b(n.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1}):e.jsxs("div",{className:"space-y-3 max-h-[200px] overflow-y-auto",children:[Object.entries(d).map(([n,c])=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:n}),typeof c=="boolean"?e.jsxs("select",{value:String(c),onChange:S=>m({...d,[n]:S.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):typeof c=="object"?e.jsx("textarea",{value:JSON.stringify(c,null,2),onChange:S=>{try{m({...d,[n]:JSON.parse(S.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"}):e.jsx("input",{type:typeof c=="number"?"number":"text",value:String(c??""),onChange:S=>m({...d,[n]:typeof c=="number"?Number(S.target.value):S.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"})]},n)),Object.keys(d).length===0&&e.jsx("p",{className:"text-[11px] text-text-tertiary italic",children:"No input fields defined"})]})]})]})]})}function ce(t){const i=new Map;for(const r of t){const a=i.get(r.app_id)??[];a.push(r),i.set(r.app_id,a)}return[...i.entries()].map(([r,a])=>{var f;const x={active:0,deployed:1,draft:2,archived:3},o=a.reduce((d,m)=>(x[m.status]??9)<(x[d]??9)?m.status:d,a[0].status),s=a.reduce((d,m)=>m.updated_at>d?m.updated_at:d,a[0].updated_at),l=a.reduce((d,m)=>{const j=parseInt(m.app_version||"0",10);return j>d?j:d},0),p=((f=a.find(d=>d.set_id))==null?void 0:f.set_id)||null;return{appId:r,workflows:a,toolCount:a.length,status:o,updatedAt:s,appVersion:String(l),setId:p}})}function le(t,i){if(!i)return!0;const r=i.toLowerCase();return t.appId.toLowerCase().includes(r)?!0:t.workflows.some(a=>{var x,o;return a.graph_topic.toLowerCase().includes(r)||((x=a.name)==null?void 0:x.toLowerCase().includes(r))||((o=a.description)==null?void 0:o.toLowerCase().includes(r))})}function de(t,i){if(!i)return t;const r=i.toLowerCase();return t.filter(a=>{var x,o;return a.graph_topic.toLowerCase().includes(r)||((x=a.name)==null?void 0:x.toLowerCase().includes(r))||((o=a.description)==null?void 0:o.toLowerCase().includes(r))})}function xe({wf:t,onTry:i,onCron:r}){const a=t.status==="active",x=!!t.cron_schedule;return e.jsxs("tr",{onClick:a?i:void 0,className:`group/row hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15 ${a?"cursor-pointer":""}`,children:[e.jsxs("td",{className:"pl-14 pr-6 py-2.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-0.5 text-[13px] font-mono bg-accent/[0.06] text-text-secondary rounded-lg",children:[e.jsx(R,{className:"w-3 h-3 shrink-0 text-accent/75"}),t.graph_topic]}),t.description&&e.jsx("p",{className:"text-[11px] leading-snug text-text-quaternary mt-0.5",children:t.description})]}),e.jsxs("td",{className:"px-4 py-2.5 w-20 text-[10px] text-text-quaternary font-mono whitespace-nowrap",children:["v",t.content_version]}),e.jsx("td",{className:"px-4 py-2.5 w-28 whitespace-nowrap",children:e.jsx(T,{status:t.status})}),e.jsx("td",{className:"px-4 py-2.5 w-16",children:e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[a&&e.jsx("button",{onClick:o=>{o.stopPropagation(),i()},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Test tool",children:e.jsx(E,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:o=>{o.stopPropagation(),r()},className:x?"text-status-success":"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:x?`Cron: ${t.cron_schedule}`:"Schedule cron",children:e.jsx(ee,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})})]})}function ue({server:t,expanded:i,onToggle:r,onTryTool:a,onWorkbench:x,onCron:o,visibleTools:s}){return e.jsxs(e.Fragment,{children:[e.jsxs("tr",{onClick:r,className:"group/row border-b border-surface-border/50 transition-colors duration-100 cursor-pointer row-hover",children:[e.jsx("td",{className:"px-6 py-2.5",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`transition-transform duration-150 ${i?"rotate-90":""} text-text-tertiary`,children:e.jsx(Q,{size:14})}),e.jsxs("p",{className:"text-sm text-text-primary font-medium font-mono",children:[t.appId,e.jsx("sup",{className:"ml-1 text-[9px] font-normal text-accent/70",children:t.toolCount})]})]})}),e.jsxs("td",{className:"px-4 py-2.5 text-[10px] text-text-quaternary font-mono whitespace-nowrap",children:["v",t.appVersion]}),e.jsx("td",{className:"px-4 py-2.5 whitespace-nowrap",children:e.jsx(T,{status:t.status})}),e.jsx("td",{className:"px-4 py-2.5 w-16",children:e.jsx("div",{className:"flex items-center justify-end gap-1.5",children:t.setId&&e.jsx("button",{onClick:l=>{l.stopPropagation(),x()},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Open workbench",children:e.jsx(Z,{className:"w-3.5 h-3.5",strokeWidth:1.5})})})})]}),i&&s.map(l=>e.jsx(xe,{wf:l,onTry:()=>a(l),onCron:()=>o(l)},l.id))]})}function Me(){const t=se(),{filters:i,setFilter:r}=D({filters:{status:"",server:"",search:""}}),{data:a,isLoading:x}=q({status:i.status||void 0,app_id:i.server||void 0,search:i.search||void 0,limit:200,offset:0}),o=(a==null?void 0:a.workflows)??[],{data:s}=B({limit:100}),l=u.useMemo(()=>{const n=new Map;for(const c of(s==null?void 0:s.sets)??[])c.source_workflow_id&&n.set(c.id,c.source_workflow_id);return n},[s==null?void 0:s.sets]),p=u.useMemo(()=>ce(o),[o]),f=u.useMemo(()=>[...new Set(o.map(c=>c.app_id))].sort().map(c=>({value:c,label:c})),[o]),d=u.useMemo(()=>i.search?p.filter(n=>le(n,i.search)):p,[p,i.search]),{expandedIds:m,toggle:j}=V("lt:expanded:yaml-workflows"),[b,N]=u.useState(null),[v,y]=u.useState(null),k=b||v;return x?e.jsxs("div",{children:[e.jsx(O,{title:"MCP Pipeline Tools",docsHash:"#docs:dashboard.md:mcp-pipeline-tools"}),e.jsx("div",{className:"animate-pulse space-y-0",children:Array.from({length:4}).map((n,c)=>e.jsx("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})},c))})]}):e.jsxs("div",{children:[e.jsx(O,{title:"MCP Pipeline Tools",docsHash:"#docs:dashboard.md:mcp-pipeline-tools",actions:e.jsx("button",{onClick:()=>t("/mcp/queries/new"),className:"btn-primary text-xs",children:"Design Pipeline"})}),e.jsx("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Deterministic tools compiled from dynamic MCP executions. Each tool is a YAML DAG that the router discovers and invokes automatically."}),e.jsxs(H,{children:[e.jsx(U,{label:"Search",value:i.search,onChange:n=>r("search",n),placeholder:"Server or tool name…"}),f.length>1&&e.jsx(P,{label:"Server",value:i.server,onChange:n=>r("server",n),options:f}),e.jsx(P,{label:"Status",value:i.status,onChange:n=>r("status",n),options:[{value:"draft",label:"Draft"},{value:"deployed",label:"Deployed"},{value:"active",label:"Active"},{value:"archived",label:"Archived"}]})]}),e.jsxs("div",{className:"flex gap-0",children:[e.jsx("div",{className:`${k?"flex-1 min-w-0":"w-full"} transition-all`,children:d.length===0?e.jsx("div",{className:"cursor-pointer",onClick:()=>t("/mcp/queries/new"),children:e.jsx(G,{icon:R,title:"No pipelines yet",description:"Click to open the MCP Tool Designer and create your first deterministic tool."})}):e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b",children:[e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-20",children:"Version"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-16"})]})}),e.jsx("tbody",{children:d.map(n=>e.jsx(ue,{server:n,expanded:m.has(n.appId),onToggle:()=>j(n.appId),onTryTool:c=>{y(null),N(c)},onWorkbench:()=>{if(n.setId){const c=l.get(n.setId);c&&t(`/mcp/queries/${c}?mode=plan&set_id=${n.setId}&step=2`)}},onCron:c=>{N(null),y(c)},visibleTools:de(n.workflows,i.search)},n.appId))})]})}),b&&e.jsx("div",{className:"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]",children:e.jsx(ne,{workflow:b,onClose:()=>N(null)})}),v&&e.jsx("div",{className:"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]",children:e.jsx(ie,{workflow:v,onClose:()=>y(null)})})]})]})}export{Me as YamlWorkflowsPage};
|
|
2
|
-
//# sourceMappingURL=YamlWorkflowsPage-C6qzcQcJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"YamlWorkflowsPage-C6qzcQcJ.js","sources":["../../src/components/common/test/WorkflowTestPanel.tsx","../../src/pages/workflows/cron/CronScheduleEditor.tsx","../../src/components/common/test/CronPanel.tsx","../../src/pages/workflows/yaml-helpers.ts","../../src/pages/workflows/yaml-workflow-rows.tsx","../../src/pages/workflows/YamlWorkflowsPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, Play, RotateCcw, ExternalLink } from 'lucide-react';\nimport { useInvokeYamlWorkflow } from '../../../api/yaml-workflows';\nimport { useYamlActivityEvents, type ActivityStep } from '../../../hooks/useYamlActivityEvents';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport type { LTYamlWorkflowRecord, ActivityManifestEntry } from '../../../api/types';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\n\nconst TOOL_SOURCE_COLORS: Record<string, { border: string; text: string; icon: string }> = {\n mcp: { border: 'border-blue-500', text: 'text-blue-500', icon: 'MCP' },\n db: { border: 'border-blue-500', text: 'text-blue-500', icon: 'DB' },\n llm: { border: 'border-violet-500', text: 'text-violet-500', icon: 'LLM' },\n transform: { border: 'border-emerald-500', text: 'text-emerald-500', icon: 'Map' },\n};\n\nfunction LiveTimeline({ steps, manifest, isComplete }: {\n steps: ActivityStep[];\n manifest: ActivityManifestEntry[];\n isComplete: boolean;\n}) {\n const workerActivities = manifest.filter((a) => a.type === 'worker');\n const totalSteps = workerActivities.length;\n\n const merged = workerActivities.map((a) => {\n const live = steps.find((s) => s.activityId === a.activity_id);\n const source = a.tool_source || 'mcp';\n const colors = TOOL_SOURCE_COLORS[source] || TOOL_SOURCE_COLORS.mcp;\n return {\n activityId: a.activity_id,\n title: a.title || a.mcp_tool_name || a.activity_id,\n toolName: a.mcp_tool_name,\n colors,\n status: live?.status || 'pending' as const,\n error: live?.error,\n };\n });\n\n return (\n <div>\n <p className=\"text-[11px] text-text-secondary mb-3\">\n {isComplete\n ? `All ${totalSteps} steps completed`\n : `Running step ${merged.filter((s) => s.status === 'completed').length + 1} of ${totalSteps}...`}\n </p>\n <div className=\"space-y-0\">\n {merged.map((step, idx) => {\n const isLast = idx === merged.length - 1;\n return (\n <div key={step.activityId} className=\"flex items-stretch gap-2\">\n <div className=\"flex flex-col items-center w-4 shrink-0\">\n <span className={`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${\n step.status === 'completed' ? 'bg-status-success border-status-success'\n : step.status === 'running' ? `${step.colors.border} bg-transparent animate-pulse`\n : step.status === 'failed' ? 'bg-status-error border-status-error'\n : 'bg-surface-sunken border-surface-border'\n }`} />\n {!isLast && (\n <span className={`w-px flex-1 transition-colors ${\n step.status === 'completed' ? 'bg-status-success/30' : 'bg-surface-border'\n }`} />\n )}\n </div>\n <div className={isLast ? '' : 'pb-3'}>\n <p className={`text-[11px] font-medium ${\n step.status === 'running' ? 'text-text-primary'\n : step.status === 'completed' ? 'text-text-secondary'\n : step.status === 'failed' ? 'text-status-error'\n : 'text-text-tertiary'\n }`}>{step.title}</p>\n {step.toolName && (\n <span className=\"text-[9px] text-text-tertiary font-mono\">{step.toolName}</span>\n )}\n {step.error && (\n <p className=\"text-[9px] text-status-error mt-0.5\">{step.error}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface WorkflowTestPanelProps {\n workflow: LTYamlWorkflowRecord;\n onClose: () => void;\n}\n\nexport function WorkflowTestPanel({ workflow, onClose }: WorkflowTestPanelProps) {\n const invokeMutation = useInvokeYamlWorkflow();\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 const [activeJobId, setActiveJobId] = useState<string | null>(null);\n const [completedResult, setCompletedResult] = useState<{ jobId: string } | null>(null);\n const { steps, isComplete } = useYamlActivityEvents(activeJobId);\n\n useEffect(() => {\n setActiveJobId(null);\n setCompletedResult(null);\n setJsonError('');\n invokeMutation.reset();\n const skeleton = buildSkeleton(workflow.input_schema);\n setFields(skeleton);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n }, [workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (isComplete && activeJobId) {\n const jobId = activeJobId;\n const timer = setTimeout(() => {\n setCompletedResult({ jobId });\n setActiveJobId(null);\n }, 800);\n return () => clearTimeout(timer);\n }\n }, [isComplete, activeJobId]);\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 = async () => {\n setJsonError('');\n setCompletedResult(null);\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 try {\n const result = await invokeMutation.mutateAsync({\n id: workflow.id,\n data: parsed,\n sync: false,\n ...(executeAs ? { execute_as: executeAs } : {}),\n });\n if (result.job_id) setActiveJobId(result.job_id);\n } catch { /* error shown in panel */ }\n };\n\n const isRunning = !!activeJobId;\n const ns = workflow.app_id || 'longtail';\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">{workflow.app_id}</p>\n <code className=\"text-[11px] font-mono text-accent truncate block\">{workflow.graph_topic}</code>\n </div>\n <button onClick={() => { if (!isRunning) onClose(); }} className=\"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-4\">\n {isRunning ? (\n <LiveTimeline steps={steps} manifest={workflow.activity_manifest} isComplete={isComplete} />\n ) : completedResult ? (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <p className=\"text-xs font-medium text-status-success\">Workflow completed</p>\n </div>\n <div className=\"flex items-center justify-between\">\n <Link\n to={`/mcp/executions/${encodeURIComponent(completedResult.jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} /> View execution\n </Link>\n <button\n onClick={() => setCompletedResult(null)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <RotateCcw size={12} /> Run again\n </button>\n </div>\n </div>\n ) : (\n <>\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n\n {workflow.description && (\n <p className=\"text-[11px] text-text-secondary leading-relaxed\">{workflow.description}</p>\n )}\n\n {/* Form / JSON toggle input */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Input</label>\n <button onClick={toggleMode} className=\"text-[10px] text-accent hover:underline\">\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=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3 max-h-[300px] overflow-y-auto\">\n {Object.entries(fields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\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=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\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=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-[11px] text-text-tertiary italic\">No input fields defined</p>\n )}\n </div>\n )}\n {jsonError && <p className=\"text-[11px] text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {invokeMutation.isError && (\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\">\n {invokeMutation.error instanceof Error ? invokeMutation.error.message : 'Invocation failed'}\n </p>\n </div>\n )}\n <button\n onClick={handleRun}\n disabled={invokeMutation.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {invokeMutation.isPending ? 'Starting...' : <><Play size={12} /> Run</>}\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { describeCron, COMMON_PATTERNS } from './helpers';\n\ninterface CronScheduleEditorProps {\n cronInput: string;\n setCronInput: (value: string) => void;\n setCron: { isPending: boolean; isSuccess: boolean; error: Error | null; reset: () => void };\n hasCronSchedule: boolean;\n onSave: () => void;\n onClear: () => void;\n}\n\nexport function CronScheduleEditor({\n cronInput,\n setCronInput,\n setCron,\n hasCronSchedule,\n onSave,\n onClear,\n}: CronScheduleEditorProps) {\n return (\n <>\n <div>\n <SectionLabel className=\"mb-3\">Schedule</SectionLabel>\n <div className=\"flex gap-3 items-start\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={cronInput}\n onChange={(e) => {\n setCronInput(e.target.value);\n setCron.reset();\n }}\n placeholder=\"0 */6 * * *\"\n className=\"input font-mono text-sm w-full\"\n />\n {cronInput.trim() && describeCron(cronInput.trim()) && (\n <p className=\"text-xs text-text-secondary mt-1.5\">\n {describeCron(cronInput.trim())}\n </p>\n )}\n </div>\n <button\n onClick={onSave}\n disabled={setCron.isPending}\n className=\"btn-primary text-xs shrink-0\"\n >\n {setCron.isPending ? 'Saving...' : 'Save'}\n </button>\n {hasCronSchedule && (\n <button\n onClick={onClear}\n disabled={setCron.isPending}\n className=\"btn-ghost text-xs text-status-error shrink-0\"\n >\n Clear\n </button>\n )}\n </div>\n\n {setCron.isSuccess && (\n <p className=\"text-[10px] text-status-success mt-2\">Schedule updated</p>\n )}\n {setCron.error && (\n <p className=\"text-[10px] text-status-error mt-2\">{setCron.error.message}</p>\n )}\n </div>\n\n {/* Common patterns */}\n <div className=\"bg-surface-sunken rounded-lg p-4\">\n <SectionLabel className=\"mb-2\">Common Patterns</SectionLabel>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5\">\n {COMMON_PATTERNS.map(([expr, desc]) => (\n <button\n key={expr}\n type=\"button\"\n onClick={() => {\n setCronInput(expr);\n setCron.reset();\n }}\n className=\"flex items-center gap-2 text-left py-0.5 group\"\n >\n <code className=\"font-mono text-[11px] text-accent group-hover:text-accent-hover\">\n {expr}\n </code>\n <span className=\"text-[10px] text-text-tertiary\">{desc}</span>\n </button>\n ))}\n </div>\n </div>\n </>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { useSetYamlCron, useClearYamlCron } from '../../../api/yaml-workflows';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport { CronScheduleEditor } from '../../../pages/workflows/cron/CronScheduleEditor';\nimport { SectionLabel } from '../layout/SectionLabel';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\nimport type { LTYamlWorkflowRecord } from '../../../api/types';\n\ninterface CronPanelProps {\n workflow: LTYamlWorkflowRecord;\n onClose: () => void;\n}\n\nexport function CronPanel({ workflow, onClose }: CronPanelProps) {\n const setCronMutation = useSetYamlCron();\n const clearCronMutation = useClearYamlCron();\n\n const [cronInput, setCronInput] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('{}');\n\n // Sync state when workflow changes\n useEffect(() => {\n setCronInput(workflow.cron_schedule ?? '');\n setExecuteAs(workflow.execute_as ?? '');\n setCronMutation.reset();\n clearCronMutation.reset();\n\n const envelope = workflow.cron_envelope || {};\n const skeleton = Object.keys(envelope).length > 0\n ? envelope\n : buildSkeleton(workflow.input_schema);\n setFields(skeleton as Record<string, any>);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n }, [workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\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 handleSave = () => {\n let envelope: Record<string, unknown>;\n if (jsonMode) {\n try { envelope = JSON.parse(argsJson); } catch { return; }\n } else {\n envelope = { ...fields };\n }\n\n setCronMutation.mutate({\n id: workflow.id,\n cron_schedule: cronInput.trim(),\n cron_envelope: Object.keys(envelope).length > 0 ? envelope : null,\n execute_as: executeAs || null,\n });\n };\n\n const handleClear = () => {\n clearCronMutation.mutate(workflow.id, {\n onSuccess: () => {\n setCronInput('');\n },\n });\n };\n\n // Combine mutation states for CronScheduleEditor\n const combinedMutation = {\n isPending: setCronMutation.isPending || clearCronMutation.isPending,\n isSuccess: setCronMutation.isSuccess || clearCronMutation.isSuccess,\n error: setCronMutation.error || clearCronMutation.error,\n reset: () => { setCronMutation.reset(); clearCronMutation.reset(); },\n };\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">Cron Schedule</p>\n <code className=\"text-[11px] font-mono text-accent truncate block\">{workflow.graph_topic}</code>\n </div>\n <button onClick={onClose} className=\"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-4\">\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n\n <CronScheduleEditor\n cronInput={cronInput}\n setCronInput={setCronInput}\n setCron={combinedMutation}\n hasCronSchedule={!!workflow.cron_schedule}\n onSave={handleSave}\n onClear={handleClear}\n />\n\n {/* Default input for cron invocations */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <SectionLabel>Default Input</SectionLabel>\n <button onClick={toggleMode} className=\"text-[10px] text-accent hover:underline\">\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=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3 max-h-[200px] overflow-y-auto\">\n {Object.entries(fields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\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=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\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=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-[11px] text-text-tertiary italic\">No input fields defined</p>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface ProcessServer {\n appId: string;\n workflows: LTYamlWorkflowRecord[];\n toolCount: number;\n status: string;\n updatedAt: string;\n appVersion: string;\n setId: string | null;\n}\n\n// ── Grouping & filtering helpers ──────────────────────────────────────────────\n\nexport function groupByAppId(workflows: LTYamlWorkflowRecord[]): ProcessServer[] {\n const map = new Map<string, LTYamlWorkflowRecord[]>();\n for (const wf of workflows) {\n const list = map.get(wf.app_id) ?? [];\n list.push(wf);\n map.set(wf.app_id, list);\n }\n\n return [...map.entries()].map(([appId, wfs]) => {\n const statusPriority: Record<string, number> = { active: 0, deployed: 1, draft: 2, archived: 3 };\n const bestStatus = wfs.reduce(\n (best, wf) => ((statusPriority[wf.status] ?? 9) < (statusPriority[best] ?? 9) ? wf.status : best),\n wfs[0].status,\n );\n const latest = wfs.reduce((max, wf) => (wf.updated_at > max ? wf.updated_at : max), wfs[0].updated_at);\n\n const maxAppVersion = wfs.reduce((max, wf) => {\n const v = parseInt(wf.app_version || '0', 10);\n return v > max ? v : max;\n }, 0);\n // Use the set_id from any workflow in the group (they all share the same set)\n const setId = wfs.find(wf => wf.set_id)?.set_id || null;\n\n return {\n appId,\n workflows: wfs,\n toolCount: wfs.length,\n status: bestStatus,\n updatedAt: latest,\n appVersion: String(maxAppVersion),\n setId,\n };\n });\n}\n\n/** Client-side search: match server name or any tool's graph_topic/description */\nexport function matchesSearch(server: ProcessServer, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.appId.toLowerCase().includes(q)) return true;\n return server.workflows.some(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(workflows: LTYamlWorkflowRecord[], search: string): LTYamlWorkflowRecord[] {\n if (!search) return workflows;\n const q = search.toLowerCase();\n return workflows.filter(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n","import { ChevronRight, Clock, Play, Wand2, Wrench } from 'lucide-react';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport type { ProcessServer } from './yaml-helpers';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Tool row ────────────────────────────────────────────────────────────────\n\nexport function ToolRow({ wf, onTry, onCron }: {\n wf: LTYamlWorkflowRecord;\n onTry: () => void;\n onCron: () => void;\n}) {\n const canTry = wf.status === 'active';\n const hasCron = !!wf.cron_schedule;\n\n return (\n <tr\n onClick={canTry ? onTry : undefined}\n className={`group/row hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15 ${canTry ? 'cursor-pointer' : ''}`}\n >\n {/* Tool name + description */}\n <td className=\"pl-14 pr-6 py-2.5\">\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-0.5 text-[13px] font-mono bg-accent/[0.06] text-text-secondary rounded-lg\">\n <Wand2 className=\"w-3 h-3 shrink-0 text-accent/75\" />\n {wf.graph_topic}\n </span>\n {wf.description && (\n <p className=\"text-[11px] leading-snug text-text-quaternary mt-0.5\">{wf.description}</p>\n )}\n </td>\n\n {/* Version */}\n <td className=\"px-4 py-2.5 w-20 text-[10px] text-text-quaternary font-mono whitespace-nowrap\">\n v{wf.content_version}\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-2.5 w-28 whitespace-nowrap\">\n <StatusBadge status={wf.status} />\n </td>\n\n {/* Actions — hover reveal */}\n <td className=\"px-4 py-2.5 w-16\">\n <div className=\"flex items-center justify-end gap-1.5\">\n {canTry && (\n <button\n onClick={(e) => { e.stopPropagation(); onTry(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Test tool\"\n >\n <Play className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n )}\n <button\n onClick={(e) => { e.stopPropagation(); onCron(); }}\n className={hasCron\n ? 'text-status-success'\n : 'opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent'}\n title={hasCron ? `Cron: ${wf.cron_schedule}` : 'Schedule cron'}\n >\n <Clock className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </div>\n </td>\n </tr>\n );\n}\n\n// ── Server row ──────────────────────────────────────────────────────────────\n\nexport function ServerRow({\n server,\n expanded,\n onToggle,\n onTryTool,\n onWorkbench,\n onCron,\n visibleTools,\n}: {\n server: ProcessServer;\n expanded: boolean;\n onToggle: () => void;\n onTryTool: (wf: LTYamlWorkflowRecord) => void;\n onWorkbench: () => void;\n onCron: (wf: LTYamlWorkflowRecord) => void;\n visibleTools: LTYamlWorkflowRecord[];\n}) {\n return (\n <>\n <tr\n onClick={onToggle}\n className=\"group/row border-b border-surface-border/50 transition-colors duration-100 cursor-pointer row-hover\"\n >\n {/* Server name */}\n <td className=\"px-6 py-2.5\">\n <div className=\"flex items-center gap-2\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} text-text-tertiary`}>\n <ChevronRight size={14} />\n </span>\n <p className=\"text-sm text-text-primary font-medium font-mono\">\n {server.appId}\n <sup className=\"ml-1 text-[9px] font-normal text-accent/70\">{server.toolCount}</sup>\n </p>\n </div>\n </td>\n\n {/* Version */}\n <td className=\"px-4 py-2.5 text-[10px] text-text-quaternary font-mono whitespace-nowrap\">\n v{server.appVersion}\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-2.5 whitespace-nowrap\">\n <StatusBadge status={server.status} />\n </td>\n\n {/* Actions */}\n <td className=\"px-4 py-2.5 w-16\">\n <div className=\"flex items-center justify-end gap-1.5\">\n {server.setId && (\n <button\n onClick={(e) => { e.stopPropagation(); onWorkbench(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Open workbench\"\n >\n <Wrench className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n </td>\n </tr>\n\n {expanded && visibleTools.map((wf) => (\n <ToolRow key={wf.id} wf={wf} onTry={() => onTryTool(wf)} onCron={() => onCron(wf)} />\n ))}\n </>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useWorkflowSets } from '../../api/workflow-sets';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useExpandedRows } from '../../hooks/useExpandedRows';\n\nimport { Wand2 } from 'lucide-react';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { WorkflowTestPanel } from '../../components/common/test/WorkflowTestPanel';\nimport { CronPanel } from '../../components/common/test/CronPanel';\nimport { groupByAppId, matchesSearch, filterTools } from './yaml-helpers';\nimport { ServerRow } from './yaml-workflow-rows';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function YamlWorkflowsPage() {\n const navigate = useNavigate();\n const { filters, setFilter } = useFilterParams({\n filters: { status: '', server: '', search: '' },\n });\n\n // Fetch a larger page to get all workflows for grouping\n const { data, isLoading } = useYamlWorkflows({\n status: (filters.status || undefined) as any,\n app_id: filters.server || undefined,\n search: filters.search || undefined,\n limit: 200,\n offset: 0,\n });\n\n const workflows = data?.workflows ?? [];\n\n // Fetch workflow sets to resolve workbench links (set_id → planner workflow ID)\n const { data: setsData } = useWorkflowSets({ limit: 100 });\n const setSourceMap = useMemo(() => {\n const map = new Map<string, string>();\n for (const s of setsData?.sets ?? []) {\n if (s.source_workflow_id) map.set(s.id, s.source_workflow_id);\n }\n return map;\n }, [setsData?.sets]);\n\n const servers = useMemo(() => groupByAppId(workflows), [workflows]);\n\n // Build server options from unfiltered results; re-derive when status/search change\n const serverOptions = useMemo(() => {\n const ids = [...new Set(workflows.map((wf) => wf.app_id))].sort();\n return ids.map((id) => ({ value: id, label: id }));\n }, [workflows]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n const { expandedIds, toggle: toggleExpand } = useExpandedRows('lt:expanded:yaml-workflows');\n const [tryWorkflow, setTryWorkflow] = useState<LTYamlWorkflowRecord | null>(null);\n const [cronWorkflow, setCronWorkflow] = useState<LTYamlWorkflowRecord | null>(null);\n\n // Active sidebar: test panel or cron panel (mutually exclusive)\n const sidebarWorkflow = tryWorkflow || cronWorkflow;\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Pipeline Tools\" docsHash=\"#docs:dashboard.md:mcp-pipeline-tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Pipeline Tools\"\n docsHash=\"#docs:dashboard.md:mcp-pipeline-tools\"\n actions={\n <button onClick={() => navigate('/mcp/queries/new')} className=\"btn-primary text-xs\">\n Design Pipeline\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Deterministic tools compiled from dynamic MCP executions. Each tool is a YAML DAG that the router discovers and invokes automatically.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name…\"\n />\n {serverOptions.length > 1 && (\n <FilterSelect\n label=\"Server\"\n value={filters.server}\n onChange={(v) => setFilter('server', v)}\n options={serverOptions}\n />\n )}\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'draft', label: 'Draft' },\n { value: 'deployed', label: 'Deployed' },\n { value: 'active', label: 'Active' },\n { value: 'archived', label: 'Archived' },\n ]}\n />\n </FilterBar>\n\n <div className=\"flex gap-0\">\n <div className={`${sidebarWorkflow ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {filteredServers.length === 0 ? (\n <div className=\"cursor-pointer\" onClick={() => navigate('/mcp/queries/new')}>\n <EmptyState icon={Wand2} title=\"No pipelines yet\" description=\"Click to open the MCP Tool Designer and create your first deterministic tool.\" />\n </div>\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-20\">\n Version\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-16\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.appId}\n server={server}\n expanded={expandedIds.has(server.appId)}\n onToggle={() => toggleExpand(server.appId)}\n onTryTool={(wf) => { setCronWorkflow(null); setTryWorkflow(wf); }}\n onWorkbench={() => {\n if (server.setId) {\n const plannerWfId = setSourceMap.get(server.setId);\n if (plannerWfId) {\n navigate(`/mcp/queries/${plannerWfId}?mode=plan&set_id=${server.setId}&step=2`);\n }\n }\n }}\n onCron={(wf) => { setTryWorkflow(null); setCronWorkflow(wf); }}\n visibleTools={filterTools(server.workflows, filters.search)}\n />\n ))}\n </tbody>\n </table>\n )}\n </div>\n\n {tryWorkflow && (\n <div className=\"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]\">\n <WorkflowTestPanel\n workflow={tryWorkflow}\n onClose={() => setTryWorkflow(null)}\n />\n </div>\n )}\n\n {cronWorkflow && (\n <div className=\"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]\">\n <CronPanel\n workflow={cronWorkflow}\n onClose={() => setCronWorkflow(null)}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["TOOL_SOURCE_COLORS","LiveTimeline","steps","manifest","isComplete","workerActivities","a","totalSteps","merged","live","s","source","colors","jsx","step","idx","isLast","jsxs","WorkflowTestPanel","workflow","onClose","invokeMutation","useInvokeYamlWorkflow","jsonMode","setJsonMode","useState","fields","setFields","argsJson","setArgsJson","jsonError","setJsonError","executeAs","setExecuteAs","activeJobId","setActiveJobId","completedResult","setCompletedResult","useYamlActivityEvents","useEffect","skeleton","buildSkeleton","jobId","timer","toggleMode","handleRun","parsed","result","isRunning","ns","X","Link","ExternalLink","RotateCcw","Fragment","RunAsSelector","e","key","value","Play","CronScheduleEditor","cronInput","setCronInput","setCron","hasCronSchedule","onSave","onClear","SectionLabel","describeCron","COMMON_PATTERNS","expr","desc","CronPanel","setCronMutation","useSetYamlCron","clearCronMutation","useClearYamlCron","envelope","handleSave","handleClear","combinedMutation","groupByAppId","workflows","map","wf","list","appId","wfs","statusPriority","bestStatus","best","latest","max","maxAppVersion","v","setId","_a","matchesSearch","server","search","q","_b","filterTools","ToolRow","onTry","onCron","canTry","hasCron","Wand2","StatusBadge","Clock","ServerRow","expanded","onToggle","onTryTool","onWorkbench","visibleTools","ChevronRight","Wrench","YamlWorkflowsPage","navigate","useNavigate","filters","setFilter","useFilterParams","data","isLoading","useYamlWorkflows","setsData","useWorkflowSets","setSourceMap","useMemo","servers","serverOptions","id","filteredServers","expandedIds","toggleExpand","useExpandedRows","tryWorkflow","setTryWorkflow","cronWorkflow","setCronWorkflow","sidebarWorkflow","PageHeader","_","i","FilterBar","FilterInput","FilterSelect","EmptyState","plannerWfId"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as s}from"./vendor-query-B2UbickB.js";import{F as x,b as l}from"./FilterBar-Ck4K4rzu.js";import{P as m}from"./PriorityBadge-DfQY9St9.js";import{R as p}from"./RolePill-BhVC0cc3.js";import{W as u}from"./WorkflowPill-DUDDyBsj.js";import{T as d}from"./TimestampCell-GOFcvE-i.js";import{C as y,i as h,a as j}from"./escalation-DBUIq1Z4.js";import{_ as v,$ as b,a0 as f,a1 as r}from"./vendor-icons-BkK55L-1.js";import{L as k}from"./vendor-react-CX88sFS5.js";function N({row:e}){if(h(e)){const t=e.status==="resolved"?"text-status-success":"text-text-tertiary";return s.jsx(f,{className:`w-3 h-3 shrink-0 ${t}`})}return e.status==="resolved"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success"}):e.status==="cancelled"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error"}):j(e)?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning"}):s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active"})}const I=[{key:"description",label:"Summary",render:e=>s.jsxs("div",{className:"flex items-start gap-2 overflow-hidden",children:[s.jsx("span",{className:"mt-1 shrink-0",children:s.jsx(N,{row:e})}),s.jsxs("div",{className:"min-w-0 overflow-hidden",children:[s.jsx("p",{className:"text-xs text-text-primary truncate",children:e.description||e.type}),s.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[s.jsx(u,{type:e.type}),e.subtype&&e.subtype!==e.type&&s.jsx("span",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:e.subtype})]})]})]}),className:"max-w-0"},{key:"task_id",label:"Task",render:e=>e.task_id?s.jsxs(k,{to:`/workflows/tasks/detail/${e.task_id}`,onClick:t=>t.stopPropagation(),className:"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors",children:[e.task_id.slice(0,12),"…",s.jsx(v,{size:10,className:"opacity-0 group-hover/task:opacity-100 transition-opacity"})]}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-36 whitespace-nowrap"},{key:"role",label:"Role",render:e=>s.jsx(p,{role:e.role}),className:"w-28"},{key:"priority",label:"Priority",render:e=>s.jsx(m,{priority:e.priority}),className:"w-20",sortable:!0},{key:"created_at",label:"Created",render:e=>s.jsx(d,{date:e.created_at}),className:"w-40",sortable:!0}],A={key:"expires",label:s.jsx(b,{className:"w-3.5 h-3.5 text-text-tertiary"}),render:e=>e.assigned_until?s.jsx(y,{until:e.assigned_until}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-10"},C=[{value:"1",label:"P1"},{value:"2",label:"P2"},{value:"3",label:"P3"},{value:"4",label:"P4"}],g=[{value:"available",label:"Available"},{value:"claimed",label:"Claimed"},{value:"resolved",label:"Resolved"}];function B({filters:e,setFilter:t,roles:i,types:n,showStatus:o=!1,actions:c}){return s.jsxs(x,{actions:c,children:[o&&s.jsx(l,{label:"Status",value:e.status??"",onChange:a=>t("status",a),options:g}),s.jsx(l,{label:"Role",value:e.role,onChange:a=>t("role",a),options:i.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Type",value:e.type,onChange:a=>t("type",a),options:n.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Priority",value:e.priority,onChange:a=>t("priority",a),options:C})]})}export{I as E,A as T,B as a};
|
|
2
|
-
//# sourceMappingURL=escalation-columns-DL4zsR8Y.js.map
|