@hotmeshio/long-tail 0.10.13 → 0.10.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -4
- package/build/api/escalations/metadata.js +1 -1
- package/build/api/escalations/resolve.js +4 -4
- package/build/services/escalation/resolver-validation.d.ts +1 -1
- package/build/services/escalation/resolver-validation.js +12 -5
- package/build/services/escalation/submit-guard.d.ts +29 -0
- package/build/services/escalation/submit-guard.js +57 -0
- package/build/shared/form-validation/index.d.ts +4 -0
- package/build/shared/form-validation/index.js +4 -0
- package/build/shared/form-validation/x-lt-labels.d.ts +28 -0
- package/build/shared/form-validation/x-lt-labels.js +42 -0
- package/build/shared/form-validation/x-lt-query.d.ts +56 -0
- package/build/shared/form-validation/x-lt-query.js +49 -0
- package/build/shared/form-validation/x-lt-submit-guard.d.ts +46 -0
- package/build/shared/form-validation/x-lt-submit-guard.js +25 -0
- package/build/shared/form-validation/x-lt-submit-on-claim.d.ts +22 -0
- package/build/shared/form-validation/x-lt-submit-on-claim.js +28 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/dashboard/dist/assets/{AdminDashboard-Bv3pHBzn.js → AdminDashboard-Chg69wlx.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Bv3pHBzn.js.map → AdminDashboard-Chg69wlx.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-Dk2zlvDb.js → AgentConfigPage-DRTFwbfC.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-Dk2zlvDb.js.map → AgentConfigPage-DRTFwbfC.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DUno6EGs.js → AgentDetailPage-JKByfFIi.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-DUno6EGs.js.map → AgentDetailPage-JKByfFIi.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-BlgEmKhA.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-CToVu1qj.js.map → AgentsPage-BlgEmKhA.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-C_7y692Q.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-DldboL4W.js.map → AvailableEscalationsPage-C_7y692Q.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DQOpVB4M.js → BotPicker-CCVcz4Cq.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DQOpVB4M.js.map → BotPicker-CCVcz4Cq.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-Dmf46PUJ.js → CapabilitiesPage-Czi9jUwD.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-Dmf46PUJ.js.map → CapabilitiesPage-Czi9jUwD.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CDADefUY.js → CollapsibleSection-8YE965QX.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CDADefUY.js.map → CollapsibleSection-8YE965QX.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-Bxvq3D7j.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-Bxvq3D7j.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-8LIEvomi.js → CredentialsPage-Bn7_SX6-.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-8LIEvomi.js.map → CredentialsPage-Bn7_SX6-.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CK3WSsM5.js → CronLabel-Bn4mX_Yn.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CK3WSsM5.js.map → CronLabel-Bn4mX_Yn.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-FPmlA6cE.js → CustomDurationPicker-pMcrFyW6.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-FPmlA6cE.js.map → CustomDurationPicker-pMcrFyW6.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-CL9gA7pu.js → DropZone-zCEGjjk-.js} +2 -2
- package/dashboard/dist/assets/{DropZone-CL9gA7pu.js.map → DropZone-zCEGjjk-.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-BZVkVxE0.js → ElapsedCell-BGO7IXEg.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-BZVkVxE0.js.map → ElapsedCell-BGO7IXEg.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-kYLdUtZX.js → EscalationListSchemaPage-CFDxbd50.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-kYLdUtZX.js.map → EscalationListSchemaPage-CFDxbd50.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-kUmCDivo.js → EscalationSchemaPage-DnXPnDkz.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-kUmCDivo.js.map → EscalationSchemaPage-DnXPnDkz.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-D17auO-m.js → EscalationsOverview-BZMVXrkK.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-D17auO-m.js.map → EscalationsOverview-BZMVXrkK.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-Bfi-f8as.js +2 -0
- package/dashboard/dist/assets/EventTable-Bfi-f8as.js.map +1 -0
- package/dashboard/dist/assets/FilterBar-Do7yR4xM.js +2 -0
- package/dashboard/dist/assets/FilterBar-Do7yR4xM.js.map +1 -0
- package/dashboard/dist/assets/{GraphInvokePage-D11uOnZi.js → GraphInvokePage-d1ie4T7f.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-D11uOnZi.js.map → GraphInvokePage-d1ie4T7f.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-Bcq10Bxx.js → HomePage-BEeodImU.js} +2 -2
- package/dashboard/dist/assets/{HomePage-Bcq10Bxx.js.map → HomePage-BEeodImU.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-IPXsTb3Q.js → ListToolbar-CLtw-1QN.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-IPXsTb3Q.js.map → ListToolbar-CLtw-1QN.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-Dx2j0KkF.js → McpOverview-DIsy9TB3.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-Dx2j0KkF.js.map → McpOverview-DIsy9TB3.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CzF_bna8.js → McpQueryDetailPage-6PomdsyD.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CzF_bna8.js.map → McpQueryDetailPage-6PomdsyD.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-YMdQCXm9.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-CNsuiw_q.js.map → McpQueryPage-YMdQCXm9.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-DsD1Gm2o.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-DsD1Gm2o.js.map +1 -0
- package/dashboard/dist/assets/{McpRunsPage-CK96s3Nt.js → McpRunsPage--a5Jgb33.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-CK96s3Nt.js.map → McpRunsPage--a5Jgb33.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-B9Vc_Pz2.js → NamespacePill-wV6L4VW1.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-B9Vc_Pz2.js.map → NamespacePill-wV6L4VW1.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-B2v9k3DT.js +2 -0
- package/dashboard/dist/assets/{OperationsPage-DvWrLuH6.js.map → OperationsPage-B2v9k3DT.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-CkLfbxEh.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-C-jE0IRA.js.map → OperatorDashboard-CkLfbxEh.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-Ce4GcIYo.js → PageHeader-BtIr6r-8.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Ce4GcIYo.js.map → PageHeader-BtIr6r-8.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-Ck0KZvXD.js → PageHeaderWithStats-C2sGqFQG.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-Ck0KZvXD.js.map → PageHeaderWithStats-C2sGqFQG.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-CJ6jqo7h.js → PersonaDetailPage-CCmOgKQb.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-CJ6jqo7h.js.map → PersonaDetailPage-CCmOgKQb.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-D8hL3kL5.js → PersonasPage-BJkSuDTN.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-D8hL3kL5.js.map → PersonasPage-BJkSuDTN.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-Vnx8Z5_y.js → ProcessDetailPage-DT9BlJXK.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-Vnx8Z5_y.js.map → ProcessDetailPage-DT9BlJXK.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DRYtvS3N.js → ProcessesListPage-DgSGzTDT.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DRYtvS3N.js.map → ProcessesListPage-DgSGzTDT.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-BKkUvTO-.js → RoleDetailPage-DMphTvro.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-BKkUvTO-.js.map → RoleDetailPage-DMphTvro.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-CnuBPhPw.js → RolePill-BBYjhAPj.js} +2 -2
- package/dashboard/dist/assets/{RolePill-CnuBPhPw.js.map → RolePill-BBYjhAPj.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BHzWK9n6.js → RolesPage-gi_kaot1.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BHzWK9n6.js.map → RolesPage-gi_kaot1.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CateuvcC.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-CS3KQ-BF.js.map → RunAsSelector-CateuvcC.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-BW4P4zWf.js → ScanCodesPage-CQ8RxMug.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-BW4P4zWf.js.map → ScanCodesPage-CQ8RxMug.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BLykA4j-.js → ScanSchemeDetailPage-puSbuxcV.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BLykA4j-.js.map → ScanSchemeDetailPage-puSbuxcV.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-BUpYpS3x.js → ScopeBadge-xs2Nhjy4.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-BUpYpS3x.js.map → ScopeBadge-xs2Nhjy4.js.map} +1 -1
- package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js +2 -0
- package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js.map +1 -0
- package/dashboard/dist/assets/StickyPagination-Cg-QdYWL.js +2 -0
- package/dashboard/dist/assets/StickyPagination-Cg-QdYWL.js.map +1 -0
- package/dashboard/dist/assets/{StreamMessageDetail-DyJyZwBl.js → StreamMessageDetail-DEeuh4_-.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-DyJyZwBl.js.map → StreamMessageDetail-DEeuh4_-.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BlzV74V5.js → SwimlaneTimeline-DMY0jL2F.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BlzV74V5.js.map → SwimlaneTimeline-DMY0jL2F.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-BbZ25nNe.js → TagInput-BMmiV-MD.js} +2 -2
- package/dashboard/dist/assets/{TagInput-BbZ25nNe.js.map → TagInput-BMmiV-MD.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-B0p_Z4J_.js → TaskDetailPage-CPbkIvfF.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-B0p_Z4J_.js.map → TaskDetailPage-CPbkIvfF.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-D0QKBrN3.js → TaskQueuePill-DLgYaw1x.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-D0QKBrN3.js.map → TaskQueuePill-DLgYaw1x.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CiGR2QiQ.js → TasksListPage-CtHudKhQ.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CiGR2QiQ.js.map → TasksListPage-CtHudKhQ.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-D_DA9ucC.js → TimeAgo-BdHOizWg.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-D_DA9ucC.js.map → TimeAgo-BdHOizWg.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-C7rkC9nh.js → TimestampCell-FVukzKRe.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-C7rkC9nh.js.map → TimestampCell-FVukzKRe.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-8xY9rkoc.js → ToolPill-BvS53hxP.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-8xY9rkoc.js.map → ToolPill-BvS53hxP.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-E8efYGYs.js → ToolTestPanel-HN0OCYTL.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-E8efYGYs.js.map → ToolTestPanel-HN0OCYTL.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-B455XrRc.js → TopicDetailPage-DHdSpN61.js} +4 -4
- package/dashboard/dist/assets/{TopicDetailPage-B455XrRc.js.map → TopicDetailPage-DHdSpN61.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-1VAc29Qw.js → TopicsPage-Clr6Tl5P.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-1VAc29Qw.js.map → TopicsPage-Clr6Tl5P.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DikzjQHJ.js → UserName-BUVYyIAS.js} +2 -2
- package/dashboard/dist/assets/{UserName-DikzjQHJ.js.map → UserName-BUVYyIAS.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-kncWFfe5.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-kncWFfe5.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowPill-Da406nEj.js → WorkflowPill-BPC_Dc_I.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-Da406nEj.js.map → WorkflowPill-BPC_Dc_I.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-4ypPDGKx.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-BMQd_0tW.js.map → WorkflowsDashboard-4ypPDGKx.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CdxjVifp.js → WorkflowsOverview-CeQlZkkd.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CdxjVifp.js.map → WorkflowsOverview-CeQlZkkd.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DNVffIXa.js → YamlWorkflowDetailPage-DLAlEzwT.js} +10 -10
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DNVffIXa.js.map → YamlWorkflowDetailPage-DLAlEzwT.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BGP8wuos.js → YamlWorkflowsPage-DQhenKFT.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BGP8wuos.js.map → YamlWorkflowsPage-DQhenKFT.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BZJLIJ4h.js → agents-s3feet3W.js} +2 -2
- package/dashboard/dist/assets/{agents-BZJLIJ4h.js.map → agents-s3feet3W.js.map} +1 -1
- package/dashboard/dist/assets/{bots-ClLcDGJb.js → bots-CkSd2rn9.js} +2 -2
- package/dashboard/dist/assets/{bots-ClLcDGJb.js.map → bots-CkSd2rn9.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-DA_r09tM.js +2 -0
- package/dashboard/dist/assets/{capabilities-IaCcS7ge.js.map → capabilities-DA_r09tM.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Zi4m_MSx.js → controlplane-C9c25q21.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Zi4m_MSx.js.map → controlplane-C9c25q21.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BY2mg9DY.js → escalation-columns-Cp3UrT48.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BY2mg9DY.js.map → escalation-columns-Cp3UrT48.js.map} +1 -1
- package/dashboard/dist/assets/{index-CJu2PBNx.js → index--7Vdkzwd.js} +2 -2
- package/dashboard/dist/assets/{index-CJu2PBNx.js.map → index--7Vdkzwd.js.map} +1 -1
- package/dashboard/dist/assets/{index-CfAi1OsI.js → index--DG-qQBT.js} +26 -26
- package/dashboard/dist/assets/index--DG-qQBT.js.map +1 -0
- package/dashboard/dist/assets/{index-CmnNqpWg.js → index-BIcYbDVf.js} +2 -2
- package/dashboard/dist/assets/{index-CmnNqpWg.js.map → index-BIcYbDVf.js.map} +1 -1
- package/dashboard/dist/assets/index-BU5FFAJo.js +2 -0
- package/dashboard/dist/assets/{index-CLmZaNTK.js.map → index-BU5FFAJo.js.map} +1 -1
- package/dashboard/dist/assets/{index-yGNt29V9.js → index-Bo5TtX9l.js} +2 -2
- package/dashboard/dist/assets/{index-yGNt29V9.js.map → index-Bo5TtX9l.js.map} +1 -1
- package/dashboard/dist/assets/{index-BqGnhkh0.js → index-C-MmR-jf.js} +2 -2
- package/dashboard/dist/assets/{index-BqGnhkh0.js.map → index-C-MmR-jf.js.map} +1 -1
- package/dashboard/dist/assets/{index-BzkE48xJ.js → index-C7ABSOU2.js} +2 -2
- package/dashboard/dist/assets/{index-BzkE48xJ.js.map → index-C7ABSOU2.js.map} +1 -1
- package/dashboard/dist/assets/index-Cmxzk4ay.js +5 -0
- package/dashboard/dist/assets/{index-CvNBdkB1.js.map → index-Cmxzk4ay.js.map} +1 -1
- package/dashboard/dist/assets/{index-C3o4OisO.js → index-Cw9poaez.js} +2 -2
- package/dashboard/dist/assets/{index-C3o4OisO.js.map → index-Cw9poaez.js.map} +1 -1
- package/dashboard/dist/assets/index-DEbY57_c.js +3 -0
- package/dashboard/dist/assets/index-DEbY57_c.js.map +1 -0
- package/dashboard/dist/assets/index-DnV6LSeY.css +1 -0
- package/dashboard/dist/assets/{index-D0zFReGL.js → index-DvoMXQqO.js} +2 -2
- package/dashboard/dist/assets/{index-D0zFReGL.js.map → index-DvoMXQqO.js.map} +1 -1
- package/dashboard/dist/assets/{index-kiKZresb.js → index-S13oPvuS.js} +2 -2
- package/dashboard/dist/assets/{index-kiKZresb.js.map → index-S13oPvuS.js.map} +1 -1
- package/dashboard/dist/assets/index-WxE3ONia.js +2 -0
- package/dashboard/dist/assets/{index-Dldi3Q3M.js.map → index-WxE3ONia.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DWLxGTib.js → knowledge-Bpln0zy_.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DWLxGTib.js.map → knowledge-Bpln0zy_.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-B6AARZ2I.js → mcp-BqDq3RZH.js} +2 -2
- package/dashboard/dist/assets/{mcp-B6AARZ2I.js.map → mcp-BqDq3RZH.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-DrkvBU3a.js → mcp-query-DGue75R6.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-DrkvBU3a.js.map → mcp-query-DGue75R6.js.map} +1 -1
- package/dashboard/dist/assets/{personas-Cmz2SAEU.js → personas-B8z_sTiJ.js} +2 -2
- package/dashboard/dist/assets/{personas-Cmz2SAEU.js.map → personas-B8z_sTiJ.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-CSgfVCMy.js → pipelines-DYgNd9nB.js} +2 -2
- package/dashboard/dist/assets/{pipelines-CSgfVCMy.js.map → pipelines-DYgNd9nB.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-UOtUkDk-.js → tasks-CJdjjhgO.js} +2 -2
- package/dashboard/dist/assets/{tasks-UOtUkDk-.js.map → tasks-CJdjjhgO.js.map} +1 -1
- package/dashboard/dist/assets/{topics-Df5hGh6o.js → topics-DPrL8Dtq.js} +2 -2
- package/dashboard/dist/assets/{topics-Df5hGh6o.js.map → topics-DPrL8Dtq.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-PDbuSJ12.js → useEventHooks-DXCgDgiu.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-PDbuSJ12.js.map → useEventHooks-DXCgDgiu.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-tZSOlge3.js → useNamespace-DnFZfy7N.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-tZSOlge3.js.map → useNamespace-DnFZfy7N.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CINLzE32.js → useYamlActivityEvents-kx5CLENv.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CINLzE32.js.map → useYamlActivityEvents-kx5CLENv.js.map} +1 -1
- package/dashboard/dist/assets/{users-G8qwyZKS.js → users-DKng7vAG.js} +2 -2
- package/dashboard/dist/assets/{users-G8qwyZKS.js.map → users-DKng7vAG.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BpZiWH2f.js → vendor-icons-CN-bAo9U.js} +138 -133
- package/dashboard/dist/assets/vendor-icons-CN-bAo9U.js.map +1 -0
- package/dashboard/dist/assets/{workflows-DbPqi1TW.js → workflows-C4V0rMkM.js} +2 -2
- package/dashboard/dist/assets/{workflows-DbPqi1TW.js.map → workflows-C4V0rMkM.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DozD8hpR.js → yaml-workflows-D3PAiJ9d.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DozD8hpR.js.map → yaml-workflows-D3PAiJ9d.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/design-principles.md +9 -7
- package/docs/hitl/x-lt-embed.md +8 -4
- package/docs/hitl/x-lt-footer.md +68 -0
- package/docs/hitl/x-lt-list-schema.md +10 -3
- package/docs/hitl-guide.md +9 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentsPage-CToVu1qj.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js.map +0 -1
- package/dashboard/dist/assets/EventTable-CwPWl163.js +0 -2
- package/dashboard/dist/assets/EventTable-CwPWl163.js.map +0 -1
- package/dashboard/dist/assets/FilterBar-D7GghUsU.js +0 -2
- package/dashboard/dist/assets/FilterBar-D7GghUsU.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-CNsuiw_q.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-BJguEMS0.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-BJguEMS0.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-CS3KQ-BF.js +0 -2
- package/dashboard/dist/assets/StickyPagination-hMrnLXde.js +0 -2
- package/dashboard/dist/assets/StickyPagination-hMrnLXde.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-C15GSAoe.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-C15GSAoe.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BMQd_0tW.js +0 -2
- package/dashboard/dist/assets/capabilities-IaCcS7ge.js +0 -2
- package/dashboard/dist/assets/index-CLmZaNTK.js +0 -2
- package/dashboard/dist/assets/index-CfAi1OsI.js.map +0 -1
- package/dashboard/dist/assets/index-CvNBdkB1.js +0 -5
- package/dashboard/dist/assets/index-Dldi3Q3M.js +0 -2
- package/dashboard/dist/assets/index-mKcQGi2B.js +0 -3
- package/dashboard/dist/assets/index-mKcQGi2B.js.map +0 -1
- package/dashboard/dist/assets/index-zQiUPfxA.css +0 -1
- package/dashboard/dist/assets/vendor-icons-BpZiWH2f.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./vendor-query-RUZdMvN6.js";import{P as j}from"./PageHeader-BtIr6r-8.js";import{D as _}from"./DataTable-Bir0Xs1p.js";import{F as v,b as f}from"./FilterBar-Do7yR4xM.js";import{S as P}from"./StickyPagination-Cg-QdYWL.js";import{L as N}from"./ListToolbar-CLtw-1QN.js";import{b as C}from"./api-path-u2Jf9QXS.js";import{T as h}from"./TimestampCell-FVukzKRe.js";import{E as $}from"./ElapsedCell-BGO7IXEg.js";import{W}from"./WorkflowPill-BPC_Dc_I.js";import{E as S}from"./EmptyState-lpUFYfun.js";import{R as c}from"./RowActions-eYrzgQSj.js";import{u as q}from"./useFilterParams-crmlBw_l.js";import{b as T}from"./useEventHooks-DXCgDgiu.js";import{u as D}from"./mcp-query-DGue75R6.js";import{k as y,Y as B,_ as g,$ as k,a0 as F,a1 as L}from"./vendor-icons-CN-bAo9U.js";import{u as M}from"./vendor-react-CdqEC2zv.js";import"./index--DG-qQBT.js";const E={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"};function p(s){return s.status==="completed"||Number(s.status)===0?"completed":s.is_live?"in_progress":"failed"}function R(s){return[{key:"workflow_id",label:"Workflow ID / Type",render:t=>{const o=p(t),a=E[o]??"bg-status-pending",l=o==="in_progress"?" animate-pulse":"";return e.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring mt-1 ${a}${l}`,title:o}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:t.workflow_id}),e.jsx("div",{className:"mt-0.5",children:e.jsx(W,{type:t.entity||"unknown"})})]})]})}},{key:"created_at",label:"Created",render:t=>e.jsx(h,{date:t.created_at}),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:t=>e.jsx(h,{date:t.updated_at}),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:t=>{const o=p(t);return e.jsx($,{startDate:t.created_at,endDate:o==="in_progress"?null:t.updated_at,isLive:o==="in_progress"})},className:"w-28"},{key:"actions",label:"",className:"w-28",render:t=>{const a=p(t)==="completed",l=t.entity==="mcpWorkflowBuilder";if(t.entity==="mcpWorkflowPlanner"){const r=t.set_id?`/mcp/queries/${t.workflow_id}?mode=plan&set_id=${t.set_id}`:`/mcp/queries/${t.workflow_id}?mode=plan`;return e.jsxs(c,{children:[e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Plan",children:e.jsx(B,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Build":"Planning...",disabled:!a,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}return l?e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Profile":"Building...",disabled:!a,children:e.jsx(F,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]}):e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=2`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all",title:"Discover",children:e.jsx(L,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=3`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Compile":"Complete discovery first",disabled:!a,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}}]}function ae(){const s=M(),t=R(s),{filters:o,setFilter:a,pagination:l,sort:d,setSort:r}=q({filters:{search:"",status:"",type:""},pageSize:20}),{data:n,isLoading:m,refetch:b}=D({limit:l.pageSize,offset:l.offset,search:o.search,status:o.status,entity:o.type||void 0});T();const u=(n==null?void 0:n.jobs)??[],x=(n==null?void 0:n.total)??0;return e.jsxs(e.Fragment,{children:[e.jsx(j,{title:"MCP Tool Designer",docsHash:"#docs:dashboard.md:mcp-tool-designer",actions:e.jsxs("button",{onClick:()=>s("/mcp/queries/new"),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(y,{className:"w-3.5 h-3.5",strokeWidth:1.5}),"Create New MCP Tool"]})}),e.jsxs(v,{actions:e.jsx(N,{onRefresh:()=>b(),apiPath:C("/workflow-states/jobs",{entity:o.type||"mcpQuery,mcpTriage,mcpWorkflowPlanner",limit:l.pageSize,offset:l.offset,sort_by:"created_at",order:"desc",status:o.status||void 0,search:o.search||void 0})}),children:[e.jsx(f,{label:"Type",value:o.type,onChange:i=>a("type",i),options:[{value:"mcpQuery",label:"Discovery"},{value:"mcpWorkflowPlanner",label:"Build"},{value:"mcpTriage",label:"Triage"}]}),e.jsx(f,{label:"Status",value:o.status,onChange:i=>a("status",i),options:[{value:"completed",label:"Completed"},{value:"running",label:"Running"},{value:"failed",label:"Failed"}]})]}),e.jsx(_,{columns:t,data:u,keyFn:i=>i.workflow_id,onRowClick:i=>{if(i.entity==="mcpWorkflowPlanner"){const w=i.set_id?`/mcp/queries/${i.workflow_id}?mode=plan&set_id=${i.set_id}`:`/mcp/queries/${i.workflow_id}?mode=plan`;s(w)}else i.entity==="mcpWorkflowBuilder"?s(`/mcp/queries/${i.workflow_id}?mode=builder`):s(`/mcp/queries/${i.workflow_id}`)},isLoading:m,emptyMessage:"",sort:d,onSort:r}),!m&&u.length===0&&e.jsx("div",{className:"cursor-pointer",onClick:()=>s("/mcp/queries/new"),children:e.jsx(S,{icon:y,title:"No tool designs yet",description:"Click to create your first MCP tool"})}),e.jsx(P,{page:l.page,pageSize:l.pageSize,total:x,totalPages:l.totalPages(x),onPageChange:l.setPage})]})}export{ae as McpQueryPage};
|
|
2
|
+
//# sourceMappingURL=McpQueryPage-YMdQCXm9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpQueryPage-CNsuiw_q.js","sources":["../../src/pages/mcp/McpQueryPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { MessageSquare, Lightbulb, Layers, Wand2, Settings, GitBranch } from 'lucide-react';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { buildApiPath } from '../../lib/api-path';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { RowActionGroup } from '../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useMcpQueryJobs } from '../../api/mcp-query';\nimport type { LTJob } from '../../api/types';\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\nfunction mapStatus(job: LTJob): string {\n if (job.status === 'completed') return 'completed';\n if (Number(job.status) === 0) return 'completed';\n if (job.is_live) return 'in_progress';\n return 'failed';\n}\n\nfunction buildColumns(navigate: ReturnType<typeof useNavigate>): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const s = mapStatus(row);\n const dotClass = STATUS_DOT[s] ?? 'bg-status-pending';\n const pulseClass = s === 'in_progress' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring mt-1 ${dotClass}${pulseClass}`} title={s} />\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 || 'unknown'} />\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 const s = mapStatus(row);\n return (\n <ElapsedCell\n startDate={row.created_at}\n endDate={s === 'in_progress' ? null : row.updated_at}\n isLive={s === 'in_progress'}\n />\n );\n },\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n className: 'w-28',\n render: (row) => {\n const s = mapStatus(row);\n const isComplete = s === 'completed';\n const isBuilder = row.entity === 'mcpWorkflowBuilder';\n const isPlanner = row.entity === 'mcpWorkflowPlanner';\n\n if (isPlanner) {\n const planUrl = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Plan\"\n >\n <GitBranch className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Build' : 'Planning...'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n if (isBuilder) {\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Profile' : 'Building...'}\n disabled={!isComplete}\n >\n <Settings className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=2`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all\"\n title=\"Discover\"\n >\n <Lightbulb className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=3`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Compile' : 'Complete discovery first'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n },\n },\n ];\n}\n\nexport function McpQueryPage() {\n const navigate = useNavigate();\n const columns = buildColumns(navigate);\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', status: '', type: '' },\n pageSize: 20,\n });\n\n const { data, isLoading, refetch } = useMcpQueryJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n search: filters.search,\n status: filters.status,\n entity: filters.type || undefined,\n });\n\n useWorkflowListEvents();\n\n const jobs = data?.jobs ?? [];\n const total = data?.total ?? 0;\n\n return (\n <>\n <PageHeader\n title=\"MCP Tool Designer\"\n docsHash=\"#docs:dashboard.md:mcp-tool-designer\"\n actions={\n <button\n onClick={() => navigate('/mcp/queries/new')}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Wand2 className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n Create New MCP Tool\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n apiPath={buildApiPath('/workflow-states/jobs', {\n entity: filters.type || 'mcpQuery,mcpTriage,mcpWorkflowPlanner',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: 'created_at',\n order: 'desc',\n status: filters.status || undefined,\n search: filters.search || undefined,\n })}\n />\n }>\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={[\n { value: 'mcpQuery', label: 'Discovery' },\n { value: 'mcpWorkflowPlanner', label: 'Build' },\n { value: 'mcpTriage', label: 'Triage' },\n ]}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'completed', label: 'Completed' },\n { value: 'running', label: 'Running' },\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) => {\n if (row.entity === 'mcpWorkflowPlanner') {\n const url = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n navigate(url);\n } else if (row.entity === 'mcpWorkflowBuilder') {\n navigate(`/mcp/queries/${row.workflow_id}?mode=builder`);\n } else {\n navigate(`/mcp/queries/${row.workflow_id}`);\n }\n }}\n isLoading={isLoading}\n emptyMessage=\"\"\n sort={sort}\n onSort={setSort}\n />\n\n {!isLoading && jobs.length === 0 && (\n <div className=\"cursor-pointer\" onClick={() => navigate('/mcp/queries/new')}>\n <EmptyState icon={Wand2} title=\"No tool designs yet\" description=\"Click to create your first MCP tool\" />\n </div>\n )}\n\n <StickyPagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={total}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n />\n </>\n );\n}\n"],"names":["STATUS_DOT","mapStatus","job","buildColumns","navigate","row","s","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","isComplete","isBuilder","planUrl","RowActionGroup","e","GitBranch","Layers","MessageSquare","Settings","Lightbulb","McpQueryPage","useNavigate","columns","filters","setFilter","pagination","sort","setSort","useFilterParams","data","isLoading","refetch","useMcpQueryJobs","useWorkflowListEvents","jobs","total","Fragment","PageHeader","Wand2","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","url","EmptyState","StickyPagination"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"McpQueryPage-YMdQCXm9.js","sources":["../../src/pages/mcp/McpQueryPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { MessageSquare, Lightbulb, Layers, Wand2, Settings, GitBranch } from 'lucide-react';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { buildApiPath } from '../../lib/api-path';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { RowActionGroup } from '../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useMcpQueryJobs } from '../../api/mcp-query';\nimport type { LTJob } from '../../api/types';\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\nfunction mapStatus(job: LTJob): string {\n if (job.status === 'completed') return 'completed';\n if (Number(job.status) === 0) return 'completed';\n if (job.is_live) return 'in_progress';\n return 'failed';\n}\n\nfunction buildColumns(navigate: ReturnType<typeof useNavigate>): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const s = mapStatus(row);\n const dotClass = STATUS_DOT[s] ?? 'bg-status-pending';\n const pulseClass = s === 'in_progress' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring mt-1 ${dotClass}${pulseClass}`} title={s} />\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 || 'unknown'} />\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 const s = mapStatus(row);\n return (\n <ElapsedCell\n startDate={row.created_at}\n endDate={s === 'in_progress' ? null : row.updated_at}\n isLive={s === 'in_progress'}\n />\n );\n },\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n className: 'w-28',\n render: (row) => {\n const s = mapStatus(row);\n const isComplete = s === 'completed';\n const isBuilder = row.entity === 'mcpWorkflowBuilder';\n const isPlanner = row.entity === 'mcpWorkflowPlanner';\n\n if (isPlanner) {\n const planUrl = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Plan\"\n >\n <GitBranch className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Build' : 'Planning...'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n if (isBuilder) {\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Profile' : 'Building...'}\n disabled={!isComplete}\n >\n <Settings className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=2`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all\"\n title=\"Discover\"\n >\n <Lightbulb className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=3`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Compile' : 'Complete discovery first'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n },\n },\n ];\n}\n\nexport function McpQueryPage() {\n const navigate = useNavigate();\n const columns = buildColumns(navigate);\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', status: '', type: '' },\n pageSize: 20,\n });\n\n const { data, isLoading, refetch } = useMcpQueryJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n search: filters.search,\n status: filters.status,\n entity: filters.type || undefined,\n });\n\n useWorkflowListEvents();\n\n const jobs = data?.jobs ?? [];\n const total = data?.total ?? 0;\n\n return (\n <>\n <PageHeader\n title=\"MCP Tool Designer\"\n docsHash=\"#docs:dashboard.md:mcp-tool-designer\"\n actions={\n <button\n onClick={() => navigate('/mcp/queries/new')}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Wand2 className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n Create New MCP Tool\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n apiPath={buildApiPath('/workflow-states/jobs', {\n entity: filters.type || 'mcpQuery,mcpTriage,mcpWorkflowPlanner',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: 'created_at',\n order: 'desc',\n status: filters.status || undefined,\n search: filters.search || undefined,\n })}\n />\n }>\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={[\n { value: 'mcpQuery', label: 'Discovery' },\n { value: 'mcpWorkflowPlanner', label: 'Build' },\n { value: 'mcpTriage', label: 'Triage' },\n ]}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'completed', label: 'Completed' },\n { value: 'running', label: 'Running' },\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) => {\n if (row.entity === 'mcpWorkflowPlanner') {\n const url = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n navigate(url);\n } else if (row.entity === 'mcpWorkflowBuilder') {\n navigate(`/mcp/queries/${row.workflow_id}?mode=builder`);\n } else {\n navigate(`/mcp/queries/${row.workflow_id}`);\n }\n }}\n isLoading={isLoading}\n emptyMessage=\"\"\n sort={sort}\n onSort={setSort}\n />\n\n {!isLoading && jobs.length === 0 && (\n <div className=\"cursor-pointer\" onClick={() => navigate('/mcp/queries/new')}>\n <EmptyState icon={Wand2} title=\"No tool designs yet\" description=\"Click to create your first MCP tool\" />\n </div>\n )}\n\n <StickyPagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={total}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n />\n </>\n );\n}\n"],"names":["STATUS_DOT","mapStatus","job","buildColumns","navigate","row","s","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","isComplete","isBuilder","planUrl","RowActionGroup","e","GitBranch","Layers","MessageSquare","Settings","Lightbulb","McpQueryPage","useNavigate","columns","filters","setFilter","pagination","sort","setSort","useFilterParams","data","isLoading","refetch","useMcpQueryJobs","useWorkflowListEvents","jobs","total","Fragment","PageHeader","Wand2","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","url","EmptyState","StickyPagination"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,b as V,a as m}from"./vendor-query-RUZdMvN6.js";import{b as J,c as B}from"./pipelines-DYgNd9nB.js";import{P as n,b as y,D as F,c as O,d as U,u as $,e as H,J as S,N as K}from"./index--DG-qQBT.js";import{P as k}from"./PageHeader-BtIr6r-8.js";import{S as Q}from"./SegmentedTabs-DXNzY05q.js";import{u as W,E as q}from"./EventTable-Bfi-f8as.js";import{L as z}from"./ListToolbar-CLtw-1QN.js";import{S as X}from"./SwimlaneTimeline-DMY0jL2F.js";import{S as Y}from"./StatusBadge-DkgllZHv.js";import{C as _}from"./CopyableId-4Lqlc5cU.js";import{J as T,K as G,O as Z,Q as ee,V as se,s as te}from"./vendor-icons-CN-bAo9U.js";import{e as ae,f as le}from"./vendor-react-CdqEC2zv.js";import"./FilterBar-Do7yR4xM.js";import"./StreamMessageDetail-DEeuh4_-.js";const ne={running:"in_progress",completed:"completed",failed:"failed"};function ie({execution:s,namespace:c,traceUrl:t,headerActions:o,open:a}){const{summary:l}=s,i=[{id:"details",icon:T,label:"Details",content:e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(n,{label:"Status",children:e.jsx(Y,{status:ne[s.status]??s.status})}),e.jsx(n,{label:"Server",children:e.jsx("span",{className:"font-mono",children:c||"—"})}),e.jsx(n,{label:"Tool",children:e.jsx("span",{className:"font-mono",children:s.workflow_type||"—"})}),e.jsx(n,{label:"Workflow ID",children:e.jsx(_,{bare:!0,value:s.workflow_id})}),e.jsx(n,{label:"Started",children:s.start_time?e.jsx(y,{date:s.start_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(n,{label:"Completed",children:s.close_time?e.jsx(y,{date:s.close_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(n,{label:"Duration",children:e.jsx(F,{ms:s.duration_ms,className:"font-mono"})}),s.trace_id&&e.jsx(n,{label:"Trace",children:e.jsx(_,{bare:!0,value:s.trace_id,href:t?t.replace("{traceId}",s.trace_id):void 0,external:!0})}),e.jsx(n,{label:"Tools",children:l.activities.user}),e.jsx(n,{label:"System",children:l.activities.system}),l.child_workflows.total>0&&e.jsx(n,{label:"Children",children:l.child_workflows.total}),l.timers>0&&e.jsx(n,{label:"Timers",children:l.timers}),l.signals>0&&e.jsx(n,{label:"Signals",children:l.signals})]})}];return e.jsx(O,{open:a,width:384,className:"h-full",children:e.jsx("div",{className:"h-full pl-6",children:e.jsx(U,{views:i,activeId:"details",onViewChange:()=>{},headerActions:o,stickyClassName:"h-full min-h-0",labelInline:!0})})})}const re=["details","timeline","events"],P="lt:mcp-run-detail:tab";function oe({isRunning:s,onTerminate:c}){const[t,o]=m.useState(!1),a=m.useRef(null);return m.useEffect(()=>{if(!t)return;const l=i=>{a.current&&!a.current.contains(i.target)&&o(!1)};return document.addEventListener("mousedown",l),()=>document.removeEventListener("mousedown",l)},[t]),s?e.jsxs("div",{className:"relative",ref:a,children:[e.jsxs("button",{onClick:()=>o(!t),className:"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-accent hover:text-accent-hover hover:bg-surface-hover transition-colors",title:"Actions",children:["Actions",e.jsx(te,{className:`w-3 h-3 transition-transform ${t?"rotate-180":""}`})]}),t&&e.jsx("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]",children:e.jsx("button",{onClick:()=>{c(),o(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"})})]}):null}function ye(){var g,w;const{jobId:s}=ae(),[c]=le(),t=c.get("namespace")||"",o=V(),{data:a,isLoading:l,error:i,refetch:b,isFetching:E}=J(s,t),x=B(),{data:p}=$(),{isCollapsed:I,toggle:C}=W("mcp-run-detail"),h=!I("side-panel"),A=((g=p==null?void 0:p.telemetry)==null?void 0:g.traceUrl)??null,[d,D]=m.useState(()=>{try{const r=localStorage.getItem(P);return r&&re.includes(r)?r:"details"}catch{return"details"}}),R=r=>{D(r);try{localStorage.setItem(P,r)}catch{}},M=m.useCallback(r=>{!s||r.workflowId!==s||o.invalidateQueries({queryKey:["mcpRunExecution",s]})},[s,o]);if(H(`${K}.system.>`,M),l)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(i||!a)return e.jsxs("div",{children:[e.jsx(k,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(w=i==null?void 0:i.message)!=null&&w.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(i==null?void 0:i.message)??"The run could not be resolved."})]})]});const{events:f}=a,j=f.find(r=>{var N;return r.category==="activity"&&((N=r.attributes.kind)==null?void 0:N.includes("completed"))}),L=(j==null?void 0:j.attributes.result)??null,u=a.result,v=(u==null?void 0:u.data)??u??null;return e.jsxs("div",{className:"flex-1 min-h-0 min-w-0 flex items-stretch -mt-8 -mr-page-x -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 flex flex-col min-h-0",children:[e.jsxs("div",{className:"shrink-0 pt-8 pr-page-x",children:[e.jsx(k,{title:"Pipeline Execution",actions:e.jsx("button",{onClick:()=>C("side-panel"),className:"text-accent/60 hover:text-accent transition-colors",title:h?"Hide side panel":"Show side panel",children:h?e.jsx(G,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(Z,{className:"w-5 h-5",strokeWidth:1.5})})}),x.error&&e.jsxs("p",{className:"text-xs text-status-error py-2",children:["Interrupt failed: ",x.error.message]}),e.jsx("div",{className:"mt-2",children:e.jsx(Q,{"aria-label":"Execution section",active:d,onChange:R,tabs:[{key:"details",label:"Details",icon:e.jsx(T,{className:"w-3.5 h-3.5"})},{key:"timeline",label:"Execution Timeline",icon:e.jsx(ee,{className:"w-3.5 h-3.5"})},{key:"events",label:"Events",icon:e.jsx(se,{className:"w-3.5 h-3.5"})}]})})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto pr-page-x pt-6 pb-16 animate-page-in",children:[d==="details"&&e.jsx("div",{className:"@container",children:e.jsxs("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-4",children:[e.jsx(S,{data:L??{},label:"Input"}),v!==null&&e.jsx(S,{data:v,label:"Result"})]})}),d==="timeline"&&e.jsx(X,{events:f,outline:!0,jid:s,appId:t||"durable"}),d==="events"&&e.jsx(q,{events:f,jid:s,appId:t||"durable"})]},d)]}),e.jsx(ie,{execution:a,namespace:t,traceUrl:A,headerActions:e.jsxs(e.Fragment,{children:[e.jsx(z,{onRefresh:()=>b(),isFetching:E,apiPath:`/pipelines/${s}/execution?app_id=${t}`}),e.jsx(oe,{isRunning:a.status==="running",onTerminate:()=>{confirm("Interrupt this pipeline execution? This cannot be undone.")&&x.mutate({jobId:a.workflow_id,topic:a.workflow_type,appId:t},{onSuccess:()=>b()})}})]}),open:h})]})}export{ye as McpRunDetailPage};
|
|
2
|
+
//# sourceMappingURL=McpRunDetailPage-DsD1Gm2o.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpRunDetailPage-DsD1Gm2o.js","sources":["../../src/pages/mcp/McpExecutionSidePanel.tsx","../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { Info } from 'lucide-react';\nimport { SlidePanel, SlidePanelViews, PanelField, type SlidePanelView } from '../../components/common/layout/SlidePanel';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { DurationValue } from '../../components/common/display/DurationValue';\n\nconst STATUS_MAP: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\n/**\n * The pipeline-execution detail side panel — the run's facts beside the timeline,\n * the same shell the workflow-execution page uses. Identity, timing, the trace\n * link, and the activity counts that used to sit in a header card now live here;\n * the page's Actions menu and refresh toolbar ride the panel's header row.\n */\nexport function McpExecutionSidePanel({ execution, namespace, traceUrl, headerActions, open }: {\n execution: {\n workflow_id: string;\n workflow_type: string;\n status: string;\n start_time?: string | null;\n close_time?: string | null;\n duration_ms?: number | null;\n trace_id?: string | null;\n summary: {\n activities: { user: number; system: number };\n child_workflows: { total: number };\n timers: number;\n signals: number;\n };\n };\n namespace: string;\n traceUrl: string | null;\n /** Page controls (toolbar, Actions menu) shown at the right of the panel header. */\n headerActions?: React.ReactNode;\n open: boolean;\n}) {\n const { summary } = execution;\n\n const views: SlidePanelView[] = [\n {\n id: 'details',\n icon: Info,\n label: 'Details',\n content: (\n <dl className=\"space-y-3.5\">\n <PanelField label=\"Status\"><StatusBadge status={STATUS_MAP[execution.status] ?? execution.status} /></PanelField>\n <PanelField label=\"Server\"><span className=\"font-mono\">{namespace || '—'}</span></PanelField>\n <PanelField label=\"Tool\"><span className=\"font-mono\">{execution.workflow_type || '—'}</span></PanelField>\n <PanelField label=\"Workflow ID\"><CopyableId bare value={execution.workflow_id} /></PanelField>\n <PanelField label=\"Started\">\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Completed\">\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Duration\"><DurationValue ms={execution.duration_ms} className=\"font-mono\" /></PanelField>\n {execution.trace_id && (\n <PanelField label=\"Trace\">\n <CopyableId\n bare\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n </PanelField>\n )}\n <PanelField label=\"Tools\">{summary.activities.user}</PanelField>\n <PanelField label=\"System\">{summary.activities.system}</PanelField>\n {summary.child_workflows.total > 0 && <PanelField label=\"Children\">{summary.child_workflows.total}</PanelField>}\n {summary.timers > 0 && <PanelField label=\"Timers\">{summary.timers}</PanelField>}\n {summary.signals > 0 && <PanelField label=\"Signals\">{summary.signals}</PanelField>}\n </dl>\n ),\n },\n ];\n\n return (\n <SlidePanel open={open} width={384} className=\"h-full\">\n <div className=\"h-full pl-6\">\n <SlidePanelViews\n views={views}\n activeId=\"details\"\n onViewChange={() => {}}\n headerActions={headerActions}\n stickyClassName=\"h-full min-h-0\"\n labelInline\n />\n </div>\n </SlidePanel>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution, useInterruptJob } from '../../api/pipelines';\nimport { useSettings } from '../../api/settings';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { SegmentedTabs } from '../../components/common/layout/SegmentedTabs';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { PanelRightClose, PanelRightOpen, ChevronDown, Info, Activity, List } from 'lucide-react';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\nimport { McpExecutionSidePanel } from './McpExecutionSidePanel';\n\ntype McpTab = 'details' | 'timeline' | 'events';\nconst MCP_TABS = ['details', 'timeline', 'events'] as const;\nconst MCP_TAB_KEY = 'lt:mcp-run-detail:tab';\n\n// ── Actions dropdown ────────────────────────────────────────────────────────\n\nfunction ActionsDropdown({ isRunning, onTerminate }: {\n isRunning: boolean;\n onTerminate: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (!isRunning) return null;\n\n return (\n <div className=\"relative\" ref={ref}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-accent hover:text-accent-hover hover:bg-surface-hover transition-colors\"\n title=\"Actions\"\n >\n Actions\n <ChevronDown className={`w-3 h-3 transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]\">\n <button\n onClick={() => { onTerminate(); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || '';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error, refetch, isFetching } = useMcpRunExecution(jobId!, namespace);\n const interruptMutation = useInterruptJob();\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n\n const sidePanelOpen = !isCollapsed('side-panel');\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // The main content is a segmented switch, not an accordion: one section at a\n // time, tabs at the top, the choice persisted across visits.\n const [tab, setTab] = useState<McpTab>(() => {\n try {\n const saved = localStorage.getItem(MCP_TAB_KEY) as McpTab | null;\n return saved && MCP_TABS.includes(saved) ? saved : 'details';\n } catch {\n return 'details';\n }\n });\n const selectTab = (next: McpTab) => {\n setTab(next);\n try { localStorage.setItem(MCP_TAB_KEY, next); } catch { /* private mode */ }\n };\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n // Two fixed-height columns, like the workflow-execution page: the header and\n // tabs stay put while only the active section scrolls, and the panel is\n // affixed with its own internal scroll and bleeds to the page edge.\n <div className=\"flex-1 min-h-0 min-w-0 flex items-stretch -mt-8 -mr-page-x -mb-16\">\n <div className=\"flex-1 min-w-0 flex flex-col min-h-0\">\n {/* Fixed header: title + the panel toggle, then the tab strip. Facts,\n the toolbar, and the Actions menu all live in the panel. */}\n <div className=\"shrink-0 pt-8 pr-page-x\">\n <PageHeader\n title=\"Pipeline Execution\"\n actions={\n <button\n onClick={() => toggle('side-panel')}\n className=\"text-accent/60 hover:text-accent transition-colors\"\n title={sidePanelOpen ? 'Hide side panel' : 'Show side panel'}\n >\n {sidePanelOpen\n ? <PanelRightClose className=\"w-5 h-5\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-5 h-5\" strokeWidth={1.5} />}\n </button>\n }\n />\n\n {interruptMutation.error && (\n <p className=\"text-xs text-status-error py-2\">\n Interrupt failed: {(interruptMutation.error as Error).message}\n </p>\n )}\n\n <div className=\"mt-2\">\n <SegmentedTabs<McpTab>\n aria-label=\"Execution section\"\n active={tab}\n onChange={selectTab}\n tabs={[\n { key: 'details', label: 'Details', icon: <Info className=\"w-3.5 h-3.5\" /> },\n { key: 'timeline', label: 'Execution Timeline', icon: <Activity className=\"w-3.5 h-3.5\" /> },\n { key: 'events', label: 'Events', icon: <List className=\"w-3.5 h-3.5\" /> },\n ]}\n />\n </div>\n </div>\n\n {/* Only the active section scrolls; the key restarts the reveal and\n resets the scroll position on each switch. */}\n <div key={tab} className=\"flex-1 min-h-0 overflow-y-auto pr-page-x pt-6 pb-16 animate-page-in\">\n {tab === 'details' && (\n <div className=\"@container\">\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-4\">\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n {result !== null && <JsonViewer data={result} label=\"Result\" />}\n </div>\n </div>\n )}\n {tab === 'timeline' && (\n <SwimlaneTimeline events={events} outline jid={jobId} appId={namespace || 'durable'} />\n )}\n {tab === 'events' && (\n <EventTable events={events} jid={jobId} appId={namespace || 'durable'} />\n )}\n </div>\n </div>\n\n <McpExecutionSidePanel\n execution={execution}\n namespace={namespace}\n traceUrl={traceUrl}\n headerActions={\n <>\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/pipelines/${jobId}/execution?app_id=${namespace}`}\n />\n <ActionsDropdown\n isRunning={execution.status === 'running'}\n onTerminate={() => {\n if (confirm('Interrupt this pipeline execution? This cannot be undone.')) {\n interruptMutation.mutate(\n { jobId: execution.workflow_id, topic: execution.workflow_type, appId: namespace },\n { onSuccess: () => refetch() },\n );\n }\n }}\n />\n </>\n }\n open={sidePanelOpen}\n />\n </div>\n );\n}\n"],"names":["STATUS_MAP","McpExecutionSidePanel","execution","namespace","traceUrl","headerActions","open","summary","views","Info","jsxs","jsx","PanelField","StatusBadge","CopyableId","DateValue","DurationValue","SlidePanel","SlidePanelViews","MCP_TABS","MCP_TAB_KEY","ActionsDropdown","isRunning","onTerminate","setOpen","useState","ref","useRef","useEffect","handler","e","ChevronDown","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","queryClient","useQueryClient","isLoading","error","refetch","isFetching","useMcpRunExecution","interruptMutation","useInterruptJob","settings","useSettings","isCollapsed","toggle","useCollapsedSections","sidePanelOpen","_a","tab","setTab","saved","selectTab","next","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","PageHeader","_b","events","triggerCompleted","triggerInput","rawResult","result","PanelRightClose","PanelRightOpen","SegmentedTabs","Activity","List","JsonViewer","SwimlaneTimeline","EventTable","Fragment","ListToolbar"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as d,j as s}from"./vendor-query-RUZdMvN6.js";import{a as R,u as T}from"./pipelines-
|
|
2
|
-
//# sourceMappingURL=McpRunsPage
|
|
1
|
+
import{a as d,j as s}from"./vendor-query-RUZdMvN6.js";import{a as R,u as T}from"./pipelines-DYgNd9nB.js";import{a as M}from"./yaml-workflows-D3PAiJ9d.js";import{u as z}from"./useFilterParams-crmlBw_l.js";import{u as E}from"./useNamespace-DnFZfy7N.js";import{b as $}from"./api-path-u2Jf9QXS.js";import{D as A}from"./DataTable-Bir0Xs1p.js";import{W as L}from"./WorkflowPill-BPC_Dc_I.js";import{E as U}from"./ElapsedCell-BGO7IXEg.js";import{b}from"./index--DG-qQBT.js";import{P as W}from"./PageHeader-BtIr6r-8.js";import{F as H,b as g}from"./FilterBar-Do7yR4xM.js";import{S as I}from"./StickyPagination-Cg-QdYWL.js";import{L as O}from"./ListToolbar-CLtw-1QN.js";import{R as B,a as q}from"./RowActions-eYrzgQSj.js";import{H as G}from"./vendor-icons-CN-bAo9U.js";import{u as V}from"./vendor-react-CdqEC2zv.js";import"./controlplane-C9c25q21.js";import"./EmptyState-lpUFYfun.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},D={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},J={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function K(x,f){return[{key:"workflow_id",label:"Run ID",render:t=>{const a=D[Y[t.status]??t.status]??"bg-status-pending",n=t.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[s.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${a}${n}`,title:t.status}),s.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:t.workflow_id})]})}},{key:"entity",label:"Tool",render:t=>t.entity?s.jsx(L,{type:t.entity,variant:"pipeline",size:"xs"}):s.jsx("span",{className:"text-2xs text-text-tertiary",children:"—"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",sortable:!0,render:t=>s.jsx(b,{date:t.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"updated_at",label:"Updated",sortable:!0,render:t=>s.jsx(b,{date:t.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"duration",label:"Duration",render:t=>s.jsx(U,{startDate:t.created_at,endDate:t.status==="running"?null:t.updated_at,isLive:t.status==="running"}),className:"w-28"},{key:"actions",label:"",render:t=>s.jsxs(B,{children:[s.jsx(q,{icon:G,title:`Filter by ${t.entity}`,onClick:()=>x(t.entity)}),s.jsx("button",{onClick:a=>{a.stopPropagation(),f(t.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${t.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${J[t.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function ge(){const x=V(),{namespace:f,available:t}=E("namespace"),{filters:a,setFilter:n,setFilters:v,pagination:o,sort:u,setSort:j}=z({filters:{search:"",entity:"",status:"",namespace:""}}),[m,_]=d.useState(a.search);d.useEffect(()=>{if(m===a.search)return;const e=setTimeout(()=>n("search",m),300);return()=>clearTimeout(e)},[m,n,a.search]);const{data:l}=M(),h=d.useMemo(()=>{const e=new Set(t);for(const r of(l==null?void 0:l.app_ids)??[])e.add(r);return[...e].sort()},[t,l==null?void 0:l.app_ids]),i=a.namespace||f,{data:c}=R(i),{data:p,isLoading:k,refetch:S,isFetching:N}=T({app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"}),y=(p==null?void 0:p.total)??0,w=(p==null?void 0:p.jobs)??[],C=K(e=>n("entity",e),e=>n("status",e)),P=d.useMemo(()=>{const e=new Set(h);return i&&e.add(i),[...e].sort().map(r=>({value:r,label:r}))},[h,i]),F=d.useMemo(()=>{const e=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!e.has(a.entity)&&e.add(a.entity),[...e].sort().map(r=>({value:r,label:r}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(W,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:graph-executions"}),s.jsxs(H,{actions:s.jsx(O,{onRefresh:()=>S(),isFetching:N,apiPath:$("/pipelines",{app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,status:a.status||void 0,search:a.search||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"})}),children:[s.jsx(g,{label:"Namespace",value:i,onChange:e=>{v({namespace:e,entity:""})},options:P,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:m,onChange:e=>_(e.target.value),className:"input text-2xs py-1 px-2 w-56"}),s.jsx(g,{label:"Tool",value:a.entity,onChange:e=>n("entity",e),options:F}),s.jsx(g,{label:"Status",value:a.status,onChange:e=>n("status",e),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(A,{columns:C,data:w,keyFn:e=>e.workflow_id,onRowClick:e=>x(`/mcp/executions/${encodeURIComponent(e.workflow_id)}?namespace=${i}`),isLoading:k,emptyMessage:"No pipeline executions found",sort:u,onSort:j}),s.jsx(I,{page:o.page,totalPages:o.totalPages(y),onPageChange:o.setPage,total:y,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ge as McpRunsPage};
|
|
2
|
+
//# sourceMappingURL=McpRunsPage--a5Jgb33.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpRunsPage-CK96s3Nt.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/pipelines';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\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',\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-center gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Tool',\n render: (row) => row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-2xs text-text-tertiary\">—</span>,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\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=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\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 { namespace: hookNamespace, available } = useNamespace('namespace');\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\n // Merge real HotMesh namespaces (from controlplane/apps) with YAML workflow app_ids\n const allNamespaceNames = useMemo(() => {\n const set = new Set(available);\n for (const id of appIdData?.app_ids ?? []) {\n set.add(id);\n }\n return [...set].sort();\n }, [available, appIdData?.app_ids]);\n\n const activeNamespace = filters.namespace || hookNamespace;\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 || 'created_at',\n order: sort.order || 'desc',\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:graph-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/pipelines', {\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n status: filters.status || undefined,\n search: filters.search || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n })}\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-2xs 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","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","hookNamespace","available","useNamespace","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","allNamespaceNames","useMemo","set","id","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","entities","known","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"McpRunsPage--a5Jgb33.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/pipelines';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\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',\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-center gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Tool',\n render: (row) => row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-2xs text-text-tertiary\">—</span>,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\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=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\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 { namespace: hookNamespace, available } = useNamespace('namespace');\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\n // Merge real HotMesh namespaces (from controlplane/apps) with YAML workflow app_ids\n const allNamespaceNames = useMemo(() => {\n const set = new Set(available);\n for (const id of appIdData?.app_ids ?? []) {\n set.add(id);\n }\n return [...set].sort();\n }, [available, appIdData?.app_ids]);\n\n const activeNamespace = filters.namespace || hookNamespace;\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 || 'created_at',\n order: sort.order || 'desc',\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:graph-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/pipelines', {\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n status: filters.status || undefined,\n search: filters.search || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n })}\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-2xs 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","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","hookNamespace","available","useNamespace","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","allNamespaceNames","useMemo","set","id","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","entities","known","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as t}from"./vendor-query-RUZdMvN6.js";import{
|
|
2
|
-
//# sourceMappingURL=NamespacePill-
|
|
1
|
+
import{j as t}from"./vendor-query-RUZdMvN6.js";import{_ as r}from"./vendor-icons-CN-bAo9U.js";function m({namespace:e,size:s="sm"}){const a=s==="md"?"px-2 py-0.5 text-xs gap-1.5":"px-1.5 py-px text-2xs gap-1",n=s==="md"?"w-2.5 h-2.5":"w-2 h-2";return t.jsxs("span",{className:`inline-flex items-center ${a} font-mono text-text-tertiary bg-surface-sunken/50 rounded-md`,children:[t.jsx(r,{className:`${n} shrink-0 text-text-quaternary`,strokeWidth:1.5}),e]})}export{m as N};
|
|
2
|
+
//# sourceMappingURL=NamespacePill-wV6L4VW1.js.map
|
package/dashboard/dist/assets/{NamespacePill-B9Vc_Pz2.js.map → NamespacePill-wV6L4VW1.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NamespacePill-
|
|
1
|
+
{"version":3,"file":"NamespacePill-wV6L4VW1.js","sources":["../../src/components/common/display/NamespacePill.tsx"],"sourcesContent":["import { Layers } from 'lucide-react';\n\ninterface NamespacePillProps {\n namespace: string;\n size?: 'sm' | 'md';\n}\n\n/**\n * The namespace a workflow belongs to — `graph` for graph flows in the graph\n * app, `durable` for procedural workflows. A subtle attribute pill, never a card.\n */\nexport function NamespacePill({ namespace, size = 'sm' }: NamespacePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2 py-0.5 text-xs gap-1.5'\n : 'px-1.5 py-px text-2xs gap-1';\n const iconClass = size === 'md' ? 'w-2.5 h-2.5' : 'w-2 h-2';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} font-mono text-text-tertiary bg-surface-sunken/50 rounded-md`}>\n <Layers className={`${iconClass} shrink-0 text-text-quaternary`} strokeWidth={1.5} />\n {namespace}\n </span>\n );\n}\n"],"names":["NamespacePill","namespace","size","sizeClass","iconClass","jsxs","jsx","Layers"],"mappings":"8FAWO,SAASA,EAAc,CAAE,UAAAC,EAAW,KAAAC,EAAO,MAA4B,CAC5E,MAAMC,EAAYD,IAAS,KACvB,8BACA,8BACEE,EAAYF,IAAS,KAAO,cAAgB,UAElD,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,gEACpD,SAAA,CAAAG,MAACC,GAAO,UAAW,GAAGH,CAAS,iCAAkC,YAAa,IAAK,EAClFH,CAAA,EACH,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as b,j as e}from"./vendor-query-RUZdMvN6.js";import{L as re,at as Re,I as Ie,a9 as De,x as Be}from"./index--DG-qQBT.js";import{i as ze}from"./useEventHooks-DXCgDgiu.js";import{P as He}from"./PageHeader-BtIr6r-8.js";import{X as Ue,av as Ye,aQ as Ke,s as Ve,aS as Ge,E as Qe,a0 as Xe,an as Le}from"./vendor-icons-CN-bAo9U.js";import{L as A,f as Ze,u as Je}from"./vendor-react-CdqEC2zv.js";const Me=800,Pe=270,F=28,et=60,he=24,tt=72,pe=Me-F-et,fe=Pe-he-tt,L=he+fe,me=F+pe,k="0.5s cubic-bezier(0.4, 0, 0.2, 1)",ve=9;function st(t){return`M ${(t.x-ve).toFixed(1)} ${t.y.toFixed(1)} L ${(t.x+ve).toFixed(1)} ${t.y.toFixed(1)}`}function H(t){if(t.length===0)return"";if(t.length===1)return st(t[0]);const n=[];for(let r=0;r<t.length-1;r++){const x=t[Math.max(0,r-1)],c=t[r],p=t[r+1],a=t[Math.min(t.length-1,r+2)],d=(c.x+(p.x-x.x)/6).toFixed(1),u=(c.y+(p.y-x.y)/6).toFixed(1),o=(p.x-(a.x-c.x)/6).toFixed(1),l=(p.y-(a.y-c.y)/6).toFixed(1);r===0&&n.push(`M ${c.x.toFixed(1)} ${c.y.toFixed(1)}`),n.push(`C ${d} ${u}, ${o} ${l}, ${p.x.toFixed(1)} ${p.y.toFixed(1)}`)}return n.join(" ")}function nt(t,n){if(t.length<2||n.length<2)return"";const r=H(t),x=[...n].reverse(),c=H(x),p=c.slice(c.indexOf("C"));return`${r} L ${x[0].x.toFixed(1)} ${x[0].y.toFixed(1)} ${p} Z`}function ke(t){return t>=1e4?`${Math.round(t/1e3)}k`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function de(t){return t.length>0?t[t.length-1]:void 0}function at(t){return[1,2,5,10,20,50,100,200,500,1e3,2e3,5e3,1e4,2e4,5e4].filter(r=>r>0&&r<t*.98)}function rt(t){return[.25,.5,.75].map(r=>Math.round(r*t)).filter(r=>r>0)}const W="rgb(var(--lt-status-claimed-graphic))",U="rgb(var(--lt-status-queued-graphic))",E="rgb(var(--lt-status-success-graphic))",T="rgb(var(--lt-text-quaternary))",Y="rgb(var(--lt-status-error))";function K(t,n){return t.replace(/\)$/,` / ${n})`)}const ot=13;function lt(t,n){const r=[...t].sort((a,d)=>a.y-d.y);let x=-1/0;const c=r.map(a=>{const d=Math.max(a.y+3,x+ot);return x=d,{...a,labelY:d}}),p=c.length>0?c[c.length-1].labelY-n:0;if(p>0)for(const a of c)a.labelY-=p;return c}function it({stations:t,selectedRole:n,onSelect:r,onUpstreamSelect:x,onCmdClick:c,periodHours:p,logScale:a=!1,fill:d=!1}){const[u,o]=b.useState(null),l=t.length;if(l===0)return null;const f=s=>l===1?F+pe/2:F+s/(l-1)*pe,q=new Map(t.map((s,h)=>[s.role,f(h)])),g=t.map((s,h)=>{var C,te,se,ne;const y=s.target_per_hour??null,O=y!=null?y*p:null;return{idx:h,x:f(h),expected:O,actual:((C=s.metric)==null?void 0:C.resolved)??0,active:((te=s.metric)==null?void 0:te.claimed)??0,pending:((se=s.metric)==null?void 0:se.pending)??0,priorityCount:((ne=s.metric)==null?void 0:ne.priority_count)??0}}),M=g.some(s=>s.expected!=null),N=Math.max(1,...g.map(s=>s.expected??0),...g.map(s=>s.actual),...g.map(s=>s.expected!=null?s.pending:0))*1.15,j=a?s=>{const h=Math.log(1+N);return he+fe*(1-Math.log(1+Math.max(0,s))/h)}:s=>he+fe*(1-Math.max(0,Math.min(s,N))/N),V=a?at(N):rt(N),$=g.filter(s=>s.expected!=null),m=$.map(s=>({...s,y:j(s.expected)})),R=$.map(s=>({...s,y:j(s.actual)})),P=$.map(s=>({...s,y:j(s.active)})),S=$.map(s=>({...s,y:j(s.pending)})),G=H(m),Q=H(R),X=H(P),oe=H(S),D=de(R),le=de(m),B=de(P),ie=de(S),Z=R.length>=2&&D?`${Q} L ${D.x.toFixed(1)} ${L} L ${R[0].x.toFixed(1)} ${L} Z`:"",J=$.some(s=>s.pending>0||s.active>0),ee=J&&P.length>=2&&B?`${X} L ${B.x.toFixed(1)} ${L} L ${P[0].x.toFixed(1)} ${L} Z`:"",i=J?nt(S,P):"",v=$.some(s=>s.active>0),_=$.some(s=>s.pending>s.active),z=lt([le?{key:"target",text:"Target",color:T,y:le.y}:null,D?{key:"actual",text:"Resolved",color:E,y:D.y}:null,v&&B?{key:"active",text:"Claimed",color:W,y:B.y}:null,_&&ie?{key:"queued",text:"Pending",color:U,y:ie.y}:null].filter(Boolean),L+4);return e.jsxs("svg",{viewBox:`0 0 ${Me} ${Pe}`,className:d?"w-full h-full":"w-full",preserveAspectRatio:"xMidYMid meet",style:{display:"block",...d?{}:{height:"auto"}},children:[V.map(s=>{const h=j(s);return e.jsxs("g",{children:[e.jsx("line",{x1:F,y1:h,x2:me,y2:h,className:"stroke-surface-border",strokeWidth:.5,opacity:a?.45:.3,strokeDasharray:a?"2 5":void 0,style:{transition:`y1 ${k}, y2 ${k}`}}),e.jsx("text",{x:F-4,y:h+2.5,textAnchor:"end",fontSize:6,fontFamily:"ui-monospace, monospace",opacity:.35,className:"fill-text-quaternary",children:ke(s)})]},`grid-${s}`)}),t.map(s=>{if(!s.parent_role)return null;const h=q.get(s.parent_role);if(h==null)return null;const y=f(t.findIndex(O=>O.role===s.role));return e.jsx("line",{x1:h,y1:L,x2:y,y2:L,className:"stroke-surface-border",strokeWidth:.75},`dep-${s.role}`)}),Z&&e.jsx("path",{d:Z,opacity:.05,style:{fill:E,transition:`d ${k}`}}),ee&&e.jsx("path",{d:ee,opacity:.12,style:{fill:W,transition:`d ${k}`}}),i&&e.jsx("path",{d:i,opacity:.12,style:{fill:U,transition:`d ${k}`}}),G&&e.jsx("path",{d:G,fill:"none",strokeWidth:.75,strokeDasharray:"2 3",strokeLinecap:"round",opacity:.7,style:{stroke:T,transition:`d ${k}`}}),m.map(s=>e.jsxs("g",{transform:`translate(${s.x} ${s.y})`,style:{transition:`transform ${k}`},children:[e.jsx("circle",{r:2,opacity:.8,style:{fill:T}}),e.jsx("text",{y:-5,textAnchor:"middle",fontSize:6.5,fontFamily:"ui-monospace, monospace",fontWeight:"500",opacity:.7,style:{fill:T},children:Math.round(s.expected)})]},`tval-${s.idx}`)),J&&oe&&e.jsx("path",{d:oe,fill:"none",strokeWidth:.75,strokeDasharray:"2 3",strokeLinecap:"round",opacity:.55,style:{stroke:U,transition:`d ${k}`}}),X&&e.jsx("path",{d:X,fill:"none",strokeWidth:.75,strokeDasharray:"2 3",strokeLinecap:"round",opacity:.5,style:{stroke:W,transition:`d ${k}`}}),Q&&e.jsx("path",{d:Q,fill:"none",strokeWidth:.6,strokeLinejoin:"round",strokeLinecap:"round",opacity:.65,style:{stroke:E,transition:`d ${k}`}}),P.map((s,h)=>{if(s.pending<=0&&s.active<=0)return null;const y=Math.max(2.5,Math.min(5,2.5+s.active/10)),O=s.pending>s.active,C=Math.min(S[h].y-4,s.y-y-4);return e.jsxs("g",{children:[s.pending>0&&e.jsx("text",{x:s.x,y:C,textAnchor:"middle",fontSize:7.5,fontFamily:"ui-monospace, monospace",fontWeight:"600",style:{fill:O?U:"rgb(var(--lt-text-tertiary))",transition:`y ${k}`},children:s.pending}),e.jsxs("g",{transform:`translate(${s.x} ${s.y})`,style:{transition:`transform ${k}`},children:[e.jsx("circle",{r:y,opacity:.85,style:{fill:W}}),s.active>0&&e.jsx("text",{y:y+9,textAnchor:"middle",fontSize:7.5,fontFamily:"ui-monospace, monospace",fontWeight:"600",style:{fill:W},children:s.active})]})]},`active-${s.idx}`)}),g.map(s=>{var Ne;const h=t[s.idx],y=s.x,O=s.expected!=null?j(s.actual):L,C=Math.max(2.25,Math.min(4,2.25+s.actual/160)),te=h.role===n,se=u===s.idx,ne=s.expected==null?"idle · set a target rate to plot pace":`${s.actual} resolved · target ${Math.round(s.expected)}`+(s.pending>s.active?` · ${s.pending-s.active} pending`:"")+(s.active>0?` · ${s.active} claimed`:"")+(s.priorityCount>0?` · ${s.priorityCount} in jeopardy`:""),ce=ne.length*5.5+20,je=Math.max(F+ce/2+4,Math.min(me-ce/2-4,y)),be=O-C-10;return e.jsxs("g",{onClick:ae=>{ae.metaKey||ae.ctrlKey?(ae.stopPropagation(),c==null||c(h.role)):r(h.role)},onMouseEnter:()=>o(s.idx),onMouseLeave:()=>o(null),style:{cursor:"pointer"},children:[e.jsxs("g",{transform:`translate(${y} ${O})`,style:{transition:`transform ${k}`},children:[e.jsx("circle",{r:22,fill:"transparent"}),e.jsx("circle",{r:C,opacity:.9,style:{fill:E,transition:`r ${k}`}}),s.expected!=null&&e.jsx("text",{y:-C-5,textAnchor:"middle",fontSize:9.5,fontFamily:"ui-monospace, monospace",fontWeight:"500",style:{fill:E},children:ke(s.actual)}),se&&!te&&e.jsx("circle",{r:C+3,fill:"none",strokeWidth:1,opacity:.4,style:{stroke:E}}),te&&e.jsx("circle",{r:C+4,fill:"none",className:"stroke-accent",strokeWidth:2})]}),(((Ne=h.upstream_roles)==null?void 0:Ne.length)??0)>0&&e.jsxs("g",{transform:`translate(${y-20} ${L})`,onClick:ae=>{ae.stopPropagation(),x==null||x(h.upstream_roles[0])},style:{cursor:"pointer"},children:[e.jsx("title",{children:`Fed by ${h.upstream_roles.join(", ")} — click to view that sequence`}),e.jsx("circle",{r:9,cy:-6,fill:"transparent"}),e.jsx("path",{d:"M -7 -14 C -3 -14 -1 -9 0 -2",fill:"none",className:"stroke-text-quaternary",strokeWidth:1,strokeDasharray:"2 2",strokeLinecap:"round"}),e.jsx("path",{d:"M 0 -2 L 8 -2",className:"stroke-text-quaternary",strokeWidth:1,strokeLinecap:"round"}),e.jsx("path",{d:"M 8 -2 l -3.5 -2 v 4 z",className:"fill-text-quaternary"})]}),e.jsx("text",{x:y,y:L+(s.idx%2===0?14:27),textAnchor:"middle",fontSize:9.5,className:"fill-text-tertiary",fontFamily:"ui-sans-serif, sans-serif",fontWeight:"500",children:re(h)}),se&&e.jsxs("g",{children:[e.jsx("rect",{x:je-ce/2,y:be-16,width:ce,height:19,rx:3,className:"fill-text-primary",opacity:.88}),e.jsx("text",{x:je,y:be-3,textAnchor:"middle",fontSize:8.5,className:"fill-surface",fontFamily:"ui-monospace, monospace",children:ne})]})]},h.role)}),!M&&e.jsx("text",{x:F+pe/2,y:L+48,textAnchor:"middle",fontSize:8.5,className:"fill-text-quaternary",fontFamily:"ui-sans-serif, sans-serif",children:"Set target_per_hour on each role in Admin → Roles to enable the pace chart"}),z.map(s=>e.jsx("text",{x:me+6,y:s.labelY,fontSize:8,fontFamily:"ui-sans-serif, sans-serif",fontWeight:s.key==="actual"?700:500,opacity:s.key==="active"?.85:1,style:{fill:s.color,transition:`y ${k}`},children:s.text},s.key))]})}function Ce(t){const n=t.priority_facet?`metadata.${t.priority_facet}`:"created_at",r=JSON.stringify([{field:n,direction:"asc"}]);return`/escalations/available?role=${encodeURIComponent(t.role)}&jeopardy=1&view=table&orderBy=${encodeURIComponent(r)}`}const qe=["15m","1h","24h","7d","30d"],ct=t=>qe.includes(t);function xe(t){if(t==null)return"—";if(t<1){const n=Math.round(t*60);return n<=0?"< 1s":`${n}s`}return t<60?`${t.toFixed(0)}m`:`${(t/60).toFixed(1)}h`}function ue({label:t,value:n}){return e.jsxs("div",{className:"flex items-center justify-between py-1.5",children:[e.jsx("span",{className:"text-2xs text-text-tertiary uppercase tracking-wider",children:t}),e.jsx("span",{className:"text-xs font-mono font-medium text-text-primary tabular-nums",children:n})]})}function dt({period:t,onChange:n}){return e.jsx("div",{className:"flex items-center gap-1 mb-4",children:qe.map(r=>e.jsx("button",{onClick:()=>n(r),className:`px-2 py-0.5 text-2xs font-mono rounded transition-colors ${t===r?"bg-accent/10 text-accent font-semibold":"icon-link"}`,children:r},r))})}function xt({role:t,globalPeriod:n,onClose:r}){const[x,c]=b.useState(ct(n)?n:"24h"),{data:p}=Re(x),a=p==null?void 0:p.stations.find(l=>l.role===t.role),d=t.sla_minutes??void 0,u=t.target_per_hour??void 0,o=t.worker_count??void 0;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-baseline gap-1.5 flex-wrap",children:[e.jsx("span",{className:"text-sm font-bold text-text-primary",children:re(t)}),e.jsx("span",{className:"text-2xs font-mono text-text-secondary",children:t.role})]}),t.description&&e.jsx("p",{className:"text-2xs text-text-tertiary mt-1 line-clamp-2 leading-relaxed",children:t.description})]}),e.jsx("button",{onClick:r,className:"icon-link mt-0.5 shrink-0 ml-2",children:e.jsx(Ue,{className:"w-4 h-4"})})]}),a&&a.priority_count>0&&e.jsxs(A,{to:Ce(t),className:"flex items-center justify-between group mb-4",children:[e.jsxs("span",{className:"text-2xs",style:{color:Y},children:[a.priority_count," in jeopardy — pull oldest first"]}),e.jsx(Ye,{className:"w-3 h-3 transition-colors",style:{color:Y}})]}),e.jsx(dt,{period:x,onChange:c}),(u||d||o)&&e.jsxs("div",{className:"flex items-center gap-6 mb-6 text-2xs border-b border-surface-border/30 pb-5",children:[u&&e.jsxs("div",{children:[e.jsxs("div",{className:"font-mono font-semibold text-text-primary text-sm",children:[u,"/h"]}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"target"})]}),d&&e.jsxs("div",{children:[e.jsxs("div",{className:"font-mono font-semibold text-text-primary text-sm",children:[d,"m"]}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"SLA"})]}),o&&e.jsxs("div",{children:[e.jsx("div",{className:"font-mono font-semibold text-text-primary text-sm",children:o}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"workers"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-x-4 mb-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs text-text-quaternary uppercase tracking-wider mb-2",children:"Wait (queue)"}),e.jsx(ue,{label:"P99",value:xe((a==null?void 0:a.wait.p99)??null)}),e.jsx(ue,{label:"avg",value:xe((a==null?void 0:a.wait.avg)??null)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs text-text-quaternary uppercase tracking-wider mb-2",children:"Work (proc.)"}),e.jsx(ue,{label:"P99",value:xe((a==null?void 0:a.work.p99)??null)}),e.jsx(ue,{label:"avg",value:xe((a==null?void 0:a.work.avg)??null)})]})]}),d&&e.jsx("div",{className:"border-t border-surface-border/40 pt-4 mt-5",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-2xs text-text-tertiary",children:"SLA target"}),e.jsxs("span",{className:"text-xs font-mono text-text-secondary",children:[d,"m"]})]})})]})}function ut({allMetrics:t,orderedRoles:n,period:r}){const x=t.reduce((o,l)=>o+l.pending,0),c=t.reduce((o,l)=>o+l.resolved,0),p=t.reduce((o,l)=>o+l.priority_count,0),a=new Map(t.map(o=>[o.role,o])),d=t.filter(o=>o.priority_count>0).length,u=t.filter(o=>o.pending>0).length;return e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-2xs text-text-quaternary uppercase tracking-wider mb-3",children:["Pipeline · ",r]}),e.jsx("div",{className:"mb-4",children:d>0?e.jsxs("p",{className:"text-2xs",style:{color:Y},children:[d," station",d>1?"s":""," with items in jeopardy"]}):u>0?e.jsxs("p",{className:"text-2xs text-status-warning",children:[u," station",u>1?"s":""," with backlog"]}):c>0?e.jsx("p",{className:"text-2xs text-status-success",children:"Flowing — queue clear"}):e.jsx("p",{className:"text-2xs text-text-quaternary",children:"Quiet — awaiting work"})}),e.jsxs("div",{className:"space-y-1.5 mb-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider",children:"Pending"}),e.jsx("span",{className:`text-xs font-mono tabular-nums ${x>0?"text-text-primary font-semibold":"text-text-quaternary"}`,children:x})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider",children:["Resolved · ",r]}),e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:c})]}),p>0&&e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider",children:"Priority"}),e.jsx("span",{className:"text-xs font-mono tabular-nums font-semibold",style:{color:Y},children:p})]})]}),e.jsx("div",{className:"border-t border-surface-border/40 pt-2 mb-1",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider flex-1",children:"Station"}),e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"pend"}),e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"clmd"}),e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"res"})]})}),e.jsx("div",{className:"space-y-0.5",children:n.map(o=>{const l=a.get(o.role),f=(l==null?void 0:l.pending)??0,q=(l==null?void 0:l.claimed)??0,g=(l==null?void 0:l.resolved)??0,M=(l==null?void 0:l.priority_count)??0,w=o.title||o.role,N=M>0,j=f>0;return e.jsxs("div",{className:"flex items-center gap-2 py-0.5",children:[e.jsx("span",{className:`text-2xs font-mono flex-1 truncate ${j?"text-text-primary":"text-text-quaternary"}`,title:w,children:w}),e.jsx("span",{className:"text-[0.625rem] leading-none font-semibold tabular-nums w-4 text-right shrink-0",style:{color:Y},title:N?`${M} priority — pull oldest first`:void 0,children:N?M:""}),e.jsx("span",{className:`text-2xs font-mono tabular-nums w-8 text-right shrink-0 ${j?"text-text-primary font-semibold":"text-text-quaternary"}`,children:f>0?f:"—"}),e.jsx("span",{className:`text-2xs font-mono tabular-nums w-8 text-right shrink-0 ${q>0?"text-accent font-semibold":"text-text-quaternary"}`,children:q>0?q:"—"}),e.jsx("span",{className:`text-2xs font-mono tabular-nums w-8 text-right shrink-0 ${g>0?"text-text-secondary":"text-text-quaternary"}`,children:g>0?g:"—"})]},o.role)})}),e.jsx("p",{className:"text-2xs text-text-quaternary mt-5",children:"Select a station for queue detail."})]})}function pt({role:t,allMetrics:n,orderedRoles:r,globalPeriod:x,onClose:c}){return e.jsx("div",{className:"w-[280px] shrink-0 px-7 py-10 flex flex-col overflow-y-auto min-h-0",children:t?e.jsx(xt,{role:t,globalPeriod:x,onClose:c}):e.jsx(ut,{allMetrics:n,orderedRoles:r,period:x})})}const ht=T,ge="rgb(var(--lt-accent))",Ee=K(T,.09),Oe=K(T,.09),Ae=K(ge,.07),Fe=K(U,.08),We=K(W,.08),Te=K(E,.08),mt=["15m","1h","24h","7d","30d"],we={"15m":.25,"1h":1,"24h":24,"7d":168,"30d":720};function ye(t){const n=t.filter(a=>a.ops_visible),r=new Map(n.map(a=>[a.role,a])),x=new Set,p=n.filter(a=>!a.parent_role||!r.has(a.parent_role)).map(a=>{const d=[],u=[{role:a,depth:0}];for(;u.length>0;){const o=u.shift();x.has(o.role.role)||(x.add(o.role.role),d.push(o),n.filter(l=>l.parent_role===o.role.role&&!x.has(l.role)).forEach(l=>u.push({role:l,depth:o.depth+1})))}return{origin:a,stations:d}});return n.filter(a=>!x.has(a.role)).forEach(a=>p.push({origin:a,stations:[{role:a,depth:0}]})),p.sort((a,d)=>d.stations.length-a.stations.length||a.origin.role.localeCompare(d.origin.role))}function $e(t){if(t==null)return"—";if(t<1){const n=Math.round(t*60);return n<=0?"< 1s":`${n}s`}return t<60?`${t.toFixed(0)}m`:`${(t/60).toFixed(1)}h`}function ft(t,n){if(!n||t===0)return{pct:null,color:"bg-surface-border"};const r=t/n,x=Math.round(r*100),c=r>1?"bg-status-warning":r<.2?"bg-status-draft":"bg-status-success";return{pct:x,color:c}}function _e({value:t,onSave:n}){const[r,x]=b.useState(t!=null?String(t):""),c=b.useRef(void 0),p=a=>{const d=parseInt(a,10);n(!a.trim()||isNaN(d)||d<0?null:d)};return e.jsx("input",{type:"number",min:0,step:1,value:r,onChange:a=>{const d=a.target.value;x(d),clearTimeout(c.current),c.current=setTimeout(()=>p(d),400)},onBlur:a=>{clearTimeout(c.current),p(a.target.value)},onClick:a=>a.stopPropagation(),onKeyDown:a=>a.stopPropagation(),className:"w-full bg-transparent text-xs font-mono tabular-nums text-right focus:outline-none"})}function yt({role:t,metric:n,selected:r,periodHours:x,onClick:c}){var $;const p=De(),{isBuilder:a,isOps:d}=Be(),u=(n==null?void 0:n.pending)??0,o=(n==null?void 0:n.claimed)??0,l=(n==null?void 0:n.resolved)??0,f=(n==null?void 0:n.priority_count)??0,q=t.target_per_hour??null,{pct:g,color:M}=ft(u,q),w=g!=null?Math.min(100,g):0,N=bt(t.target_per_hour??null,t.sla_minutes??null,u,x),j=m=>p.mutate({role:t.role,target_per_hour:m}),V=m=>p.mutate({role:t.role,sla_minutes:m});return e.jsxs("tr",{tabIndex:0,onClick:c,onKeyDown:m=>{m.key==="Enter"&&c()},className:`cursor-pointer border-b border-surface-border/30 last:border-b-0 transition-colors ${r?"border-l-2 !border-l-accent":""}`,children:[e.jsx("td",{className:"pl-3 pr-2 py-1.5 overflow-hidden",children:e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("span",{className:"font-bold text-text-primary truncate text-xs",children:re(t)}),((($=t.upstream_roles)==null?void 0:$.length)??0)>0&&e.jsx("span",{title:`Fed by ${t.upstream_roles.join(", ")}`,className:"shrink-0 leading-none",children:e.jsx(Ge,{className:"w-3 h-3 text-text-quaternary"})})]})}),e.jsx("td",{className:"hidden xl:table-cell pr-2 py-1.5 overflow-hidden",children:e.jsx("span",{className:"block font-mono text-2xs text-text-tertiary truncate",children:t.role})}),e.jsx("td",{className:"px-2 py-1.5",style:{backgroundColor:Ee},children:e.jsx(_e,{value:t.target_per_hour??null,onSave:j})}),e.jsx("td",{className:"px-2 py-1.5",style:{backgroundColor:Oe},children:e.jsx(_e,{value:t.sla_minutes??null,onSave:V})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:Ae},title:N!=null?`~${N} concurrent worker${N===1?"":"s"} to sustain ${t.target_per_hour}/h within ${t.sla_minutes}m SLA`:void 0,children:e.jsx("span",{className:`text-xs font-mono tabular-nums ${N!=null?"":"text-text-quaternary"}`,style:N!=null?{color:ge}:void 0,children:N??"—"})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:Fe},children:e.jsx(A,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=available`,className:`text-xs font-mono tabular-nums hover:underline ${u>0?"text-text-primary font-semibold":"text-text-quaternary"}`,onClick:m=>m.stopPropagation(),children:u})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:We},children:e.jsx(A,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=claimed`,className:`text-xs font-mono tabular-nums hover:underline ${o>0?"font-semibold":"text-text-quaternary"}`,style:o>0?{color:W}:void 0,onClick:m=>m.stopPropagation(),children:o})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:Te},children:e.jsx(A,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=resolved`,className:`text-xs font-mono tabular-nums hover:underline ${l>0?"text-text-secondary":"text-text-quaternary"}`,style:l>0?{color:E}:void 0,onClick:m=>m.stopPropagation(),children:l})}),e.jsx("td",{className:"hidden xl:table-cell px-2 py-1.5 text-right",children:e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:$e((n==null?void 0:n.wait.p99)??null)})}),e.jsx("td",{className:"hidden xl:table-cell px-2 py-1.5 text-right",children:e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:$e((n==null?void 0:n.work.p99)??null)})}),e.jsx("td",{className:"hidden lg:table-cell px-2 py-1.5",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-12 h-1.5 bg-surface-sunken rounded-full overflow-hidden shrink-0",children:e.jsx("div",{className:`h-full rounded-full ${M}`,style:{width:`${w}%`}})}),e.jsx("span",{className:`text-2xs font-mono tabular-nums ${g!=null&&g>100?"text-status-warning font-semibold":"text-text-quaternary"}`,children:g!=null?`${g}%`:"—"})]})}),e.jsx("td",{className:"py-1.5",children:e.jsxs("div",{className:"flex items-center justify-center gap-1.5",children:[e.jsx(A,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=all`,className:"icon-link",title:"View all items in queue",onClick:m=>m.stopPropagation(),children:e.jsx(Qe,{className:"w-3.5 h-3.5"})}),e.jsx("span",{className:"w-3.5 flex items-center justify-center",children:(a||d)&&e.jsx(A,{to:`/admin/roles/${encodeURIComponent(t.role)}`,className:"icon-link",title:"Configure this role",onClick:m=>m.stopPropagation(),children:e.jsx(Xe,{className:"w-3.5 h-3.5"})})}),e.jsx("span",{className:"w-3.5 flex items-center justify-center",children:f>0&&e.jsx(A,{to:Ce(t),className:"text-status-error hover:opacity-70 transition-opacity",title:`${f} item${f===1?"":"s"} in jeopardy — pull oldest first`,onClick:m=>m.stopPropagation(),children:e.jsx(Le,{className:"w-3.5 h-3.5",strokeWidth:2})})})]})})]})}function Se({n:t}){return t<=0?null:e.jsxs("span",{className:"inline-flex items-center gap-0.5 font-semibold tabular-nums",style:{color:Y},title:`${t} in jeopardy`,children:[e.jsx(Le,{className:"w-3 h-3",strokeWidth:2.25}),t>9?"9+":t]})}function gt({fragments:t,aggregates:n,activeOrigin:r,onSelect:x}){const[c,p]=b.useState(!1),a=b.useRef(null);b.useEffect(()=>{if(!c)return;const o=f=>{a.current&&!a.current.contains(f.target)&&p(!1)},l=f=>{f.key==="Escape"&&p(!1)};return document.addEventListener("mousedown",o),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",o),document.removeEventListener("keydown",l)}},[c]);const d=t.find(o=>o.origin.role===r)??t[0];if(!d)return null;const u=n.get(d.origin.role);return e.jsxs("div",{ref:a,className:"relative px-4 pt-2",children:[e.jsxs("button",{type:"button",onClick:()=>p(o=>!o),className:"group flex items-baseline gap-2.5","aria-expanded":c,"aria-haspopup":"listbox",children:[e.jsx("span",{className:"text-sm font-medium text-text-primary group-hover:text-accent transition-colors",children:re(d.origin)}),e.jsxs("span",{className:"text-2xs font-mono text-text-quaternary tabular-nums",children:[(u==null?void 0:u.stations)??d.stations.length," station",((u==null?void 0:u.stations)??d.stations.length)===1?"":"s"," · ",(u==null?void 0:u.pending)??0," pending"]}),e.jsx(Se,{n:(u==null?void 0:u.jeopardy)??0}),e.jsx(Ve,{className:`w-3.5 h-3.5 self-center shrink-0 text-text-tertiary group-hover:text-accent transition-transform ${c?"rotate-180":""}`,strokeWidth:1.5})]}),c&&e.jsx("div",{role:"listbox",className:"absolute z-[100] top-full left-4 mt-1.5 min-w-[20rem] max-h-80 overflow-y-auto bg-surface-raised border border-surface-border rounded-md shadow-lg py-1",children:t.map(o=>{const l=n.get(o.origin.role),f=o.origin.role===d.origin.role;return e.jsxs("button",{type:"button",role:"option","aria-selected":f,onClick:()=>{x(o.origin.role),p(!1)},className:`w-full text-left px-3 py-1.5 flex items-baseline gap-2.5 transition-colors ${f?"text-accent bg-accent/5":"text-text-primary hover:bg-surface-hover"}`,children:[e.jsx("span",{className:"text-xs font-medium truncate",children:re(o.origin)}),e.jsxs("span",{className:"ml-auto text-2xs font-mono text-text-quaternary tabular-nums shrink-0",children:[(l==null?void 0:l.stations)??o.stations.length," st · ",(l==null?void 0:l.pending)??0," pending"]}),e.jsx("span",{className:"w-12 shrink-0 text-left text-2xs",children:e.jsx(Se,{n:(l==null?void 0:l.jeopardy)??0})})]},o.origin.role)})})]})}const jt=[{label:"TARGET/H",band:Ee,hue:T,w:"w-[8%]"},{label:"SLA/M",band:Oe,hue:ht,w:"w-[7%]"},{label:"WORKERS",band:Ae,hue:ge,w:"w-[8%]"},{label:"PENDING",band:Fe,hue:U,w:"w-[8%]"},{label:"CLAIMED",band:We,hue:W,w:"w-[8%]"},{label:"RESOLVED",band:Te,hue:E,w:"w-[8%]"}];function bt(t,n,r,x){if(!t||!n)return null;const c=t*n/60,p=r>0?r*n/(60*x):0;return Math.ceil(c+p)}const I="sticky top-0 z-10 bg-surface border-b border-surface-border py-1.5 text-2xs font-semibold uppercase tracking-wider whitespace-nowrap";function Nt(){return e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{className:`${I} pl-3 pr-2 text-left text-text-quaternary`,children:"NAME"}),e.jsx("th",{className:`${I} hidden xl:table-cell w-[12%] pr-2 text-left text-text-quaternary`,children:"ROLE"}),jt.map(t=>e.jsx("th",{className:`${I} ${t.w} px-2 text-right`,style:{color:t.hue,backgroundImage:`linear-gradient(${t.band}, ${t.band})`},children:t.label},t.label)),e.jsx("th",{className:`${I} hidden xl:table-cell w-[8%] px-2 text-right text-text-quaternary`,children:"P99 WAIT"}),e.jsx("th",{className:`${I} hidden xl:table-cell w-[8%] px-2 text-right text-text-quaternary`,children:"P99 WORK"}),e.jsx("th",{className:`${I} hidden lg:table-cell w-[11%] px-2 text-left text-text-quaternary`,children:"TREND"}),e.jsx("th",{className:`${I} w-20 px-1 text-center text-text-quaternary`,children:"ACTIONS"})]})})}function vt(){var ee;const[t,n]=b.useState("1h"),[r,x]=b.useState(null),[c,p]=b.useState(!1),[a,d]=b.useState(!0);ze();const{data:u,isLoading:o,refetch:l}=Ie(),{data:f,isLoading:q,refetch:g}=Re(t),M=(u==null?void 0:u.roles)??[],w=(f==null?void 0:f.stations)??[],N=b.useMemo(()=>{const i=new Map(w.map(_=>[_.role,_])),v=new Map;for(const _ of ye((u==null?void 0:u.roles)??[])){let z=0,s=0;for(const h of _.stations){const y=i.get(h.role.role);z+=(y==null?void 0:y.pending)??0,s+=(y==null?void 0:y.priority_count)??0}v.set(_.origin.role,{stations:_.stations.length,pending:z,jeopardy:s})}return v},[w,u]),j=b.useMemo(()=>ye(M),[M]),[V,$]=Ze(),m=V.get("fragment"),R=j.find(i=>i.origin.role===m)??j[0]??null,P=b.useCallback(i=>{x(null),$(v=>{const _=new URLSearchParams(v);return _.set("fragment",i),_})},[$]),S=(R==null?void 0:R.stations)??[],G=b.useMemo(()=>new Set(S.map(({role:i})=>i.role)),[S]),Q=b.useMemo(()=>w.filter(i=>G.has(i.role)),[w,G]),X=b.useMemo(()=>S.map(({role:i})=>({role:i.role,title:i.title,parent_role:i.parent_role,target_per_hour:i.target_per_hour??null,upstream_roles:i.upstream_roles??[],metric:w.find(v=>v.role===i.role)})),[S,w]),oe=b.useCallback(i=>{const v=j.find(_=>_.stations.some(({role:z})=>z.role===i));v&&P(v.origin.role)},[j,P]),D=Je(),le=((ee=S.find(({role:i})=>i.role===r))==null?void 0:ee.role)??null,B=o||q,ie=async()=>{p(!0),await Promise.all([l(),g()]),p(!1)},Z=i=>x(v=>v===i?null:i),J=e.jsx("div",{className:"flex items-center gap-0.5",children:mt.map(i=>e.jsx("button",{onClick:()=>n(i),className:`px-2.5 py-1 text-2xs font-mono rounded transition-colors ${t===i?"bg-accent/10 text-accent font-semibold":"icon-link"}`,children:i},i))});return e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[e.jsx(He,{title:"Pace Board",docsHash:"#docs:dashboard.md:pace-board",center:J,actions:e.jsx("button",{onClick:ie,disabled:c,className:"icon-link disabled:opacity-40",children:e.jsx(Ke,{className:`w-3.5 h-3.5 ${c?"animate-spin":""}`})})}),B?e.jsxs("div",{className:"animate-pulse space-y-6 mt-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-64 bg-surface-sunken rounded w-full"}),e.jsx("div",{className:"space-y-3",children:[1,2,3].map(i=>e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-full"},i))})]}):j.length===0?e.jsxs("div",{className:"mt-8",children:[e.jsx("p",{className:"text-sm text-text-secondary mb-2",children:"Stations appear here once roles are marked visible in Operations."}),e.jsxs("p",{className:"text-xs text-text-tertiary",children:["Go to"," ",e.jsx(A,{to:"/admin/roles",className:"text-accent hover:underline",children:"Roles"})," ","and enable ",e.jsx("strong",{children:"Visible in Operations"})," on roles that represent pipeline stations."]})]}):e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[e.jsxs("div",{className:"flex items-end justify-between",children:[e.jsx("div",{className:"flex-1",children:j.length>1&&e.jsx(gt,{fragments:j,aggregates:N,activeOrigin:(R==null?void 0:R.origin.role)??null,onSelect:P})}),e.jsx("div",{className:"flex items-center gap-0.5 px-4 pt-2 pb-0.5",children:["lin","log"].map(i=>e.jsx("button",{onClick:()=>d(i==="log"),className:`px-2 py-0.5 text-2xs font-mono rounded transition-colors ${(a?"log":"lin")===i?"text-accent font-semibold":"icon-link"}`,title:i==="lin"?"Linear Y axis":"Logarithmic Y axis — reveals shape across wide value ranges",children:i},i))})]}),e.jsxs("div",{className:"flex-1 min-h-[40vh] flex items-stretch overflow-hidden",children:[e.jsx("div",{className:"flex-1 min-w-0 min-h-0 flex flex-col justify-center overflow-hidden px-2 py-4",children:e.jsx(it,{stations:X,selectedRole:r,onSelect:Z,onUpstreamSelect:oe,onCmdClick:i=>D(`/escalations/available?role=${encodeURIComponent(i)}`),periodHours:we[t],logScale:a})}),e.jsx("div",{className:"w-px bg-surface-border shrink-0 self-stretch"}),e.jsx(pt,{role:le,allMetrics:Q,orderedRoles:S.map(i=>i.role),globalPeriod:t,onClose:()=>x(null)})]}),e.jsx("div",{className:"max-h-[30vh] flex-none overflow-y-auto border-t border-surface-border",children:e.jsxs("table",{className:"w-full table-fixed",children:[e.jsx(Nt,{}),e.jsx("tbody",{children:S.map(({role:i})=>e.jsx(yt,{role:i,metric:w.find(v=>v.role===i.role),selected:r===i.role,periodHours:we[t],onClick:()=>Z(i.role)},i.role))})]})})]})]})}const Lt=Object.freeze(Object.defineProperty({__proto__:null,OperationsPage:vt,buildFragments:ye},Symbol.toStringTag,{value:"Module"}));export{Lt as O,it as P,ye as b,Ce as j};
|
|
2
|
+
//# sourceMappingURL=OperationsPage-B2v9k3DT.js.map
|