@hotmeshio/long-tail 0.8.0 → 0.8.2
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/dashboard/dist/assets/{AdminDashboard-9JLg41f-.js → AdminDashboard-Nvja-XIJ.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-9JLg41f-.js.map → AdminDashboard-Nvja-XIJ.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-Sf2god7q.js +16 -0
- package/dashboard/dist/assets/AgentConfigPage-Sf2god7q.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-DtgDeZJR.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-DtgDeZJR.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-C6zqP_xC.js +2 -0
- package/dashboard/dist/assets/AgentsPage-C6zqP_xC.js.map +1 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-CoZ4Lufr.js → AvailableEscalationsPage-D61kC7Is.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-CoZ4Lufr.js.map → AvailableEscalationsPage-D61kC7Is.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-xGUCxJo-.js → BotPicker-ChgljKHj.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-xGUCxJo-.js.map → BotPicker-ChgljKHj.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-DeybKoZM.js +2 -0
- package/dashboard/dist/assets/CapabilitiesPage-DeybKoZM.js.map +1 -0
- package/dashboard/dist/assets/{CollapsibleSection-CXMPecjj.js → CollapsibleSection-BPiTuPBk.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CXMPecjj.js.map → CollapsibleSection-BPiTuPBk.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-DXOcPWtd.js +2 -0
- package/dashboard/dist/assets/CredentialsPage-DXOcPWtd.js.map +1 -0
- package/dashboard/dist/assets/CronLabel-D3411N8x.js +2 -0
- package/dashboard/dist/assets/CronLabel-D3411N8x.js.map +1 -0
- package/dashboard/dist/assets/{CustomDurationPicker-id6Tq64R.js → CustomDurationPicker-WG2tPSbV.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-id6Tq64R.js.map → CustomDurationPicker-WG2tPSbV.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-CZDmNBn-.js → DropZone-SgiK1WOl.js} +2 -2
- package/dashboard/dist/assets/{DropZone-CZDmNBn-.js.map → DropZone-SgiK1WOl.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-B8TrnyT5.js → ElapsedCell-BFWEGSD7.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-B8TrnyT5.js.map → ElapsedCell-BFWEGSD7.js.map} +1 -1
- package/dashboard/dist/assets/EscalationSchemaPage-D2Y5Yeqn.js +9 -0
- package/dashboard/dist/assets/EscalationSchemaPage-D2Y5Yeqn.js.map +1 -0
- package/dashboard/dist/assets/{EscalationsOverview-CjLyujJ3.js → EscalationsOverview-VlLcX2YM.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CjLyujJ3.js.map → EscalationsOverview-VlLcX2YM.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-3MJw14jp.js +2 -0
- package/dashboard/dist/assets/EventTable-3MJw14jp.js.map +1 -0
- package/dashboard/dist/assets/FilterBar-B4Mk2PvT.js +2 -0
- package/dashboard/dist/assets/FilterBar-B4Mk2PvT.js.map +1 -0
- package/dashboard/dist/assets/GraphInvokePage-QaUUrPnh.js +2 -0
- package/dashboard/dist/assets/GraphInvokePage-QaUUrPnh.js.map +1 -0
- package/dashboard/dist/assets/HomePage-Br0A3iOp.js +2 -0
- package/dashboard/dist/assets/HomePage-Br0A3iOp.js.map +1 -0
- package/dashboard/dist/assets/{ListToolbar--FkPpYDY.js → ListToolbar-d4MGQefV.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar--FkPpYDY.js.map → ListToolbar-d4MGQefV.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CtAFXv-T.js → McpOverview-CUzJD5Z5.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CtAFXv-T.js.map → McpOverview-CUzJD5Z5.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-pYSZmV3M.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-pYSZmV3M.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-CA5C5dss.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-CA5C5dss.js.map +1 -0
- package/dashboard/dist/assets/{McpRunDetailPage-BYIxBcA7.js → McpRunDetailPage-CrRkXwAe.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-BYIxBcA7.js.map → McpRunDetailPage-CrRkXwAe.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-BqRBDbkn.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-BqRBDbkn.js.map +1 -0
- package/dashboard/dist/assets/{NamespacePill-DlqBTvFR.js → NamespacePill-SErKwgkb.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-DlqBTvFR.js.map → NamespacePill-SErKwgkb.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage--uVJxzmP.js +2 -0
- package/dashboard/dist/assets/OperationsPage--uVJxzmP.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-DMQwodfo.js → OperatorDashboard-D-UMrTqI.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DMQwodfo.js.map → OperatorDashboard-D-UMrTqI.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-CFta2VaS.js → PageHeader-DJo7yMUR.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-CFta2VaS.js.map → PageHeader-DJo7yMUR.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-CcVAji-7.js → PageHeaderWithStats-W3akV6nB.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-CcVAji-7.js.map → PageHeaderWithStats-W3akV6nB.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-BV6D_wuR.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-BV6D_wuR.js.map +1 -0
- package/dashboard/dist/assets/{ProcessesListPage-BVtkWVLY.js → ProcessesListPage-BAalEHpx.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-BVtkWVLY.js.map → ProcessesListPage-BAalEHpx.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-ClE7rUoo.js +11 -0
- package/dashboard/dist/assets/RoleDetailPage-ClE7rUoo.js.map +1 -0
- package/dashboard/dist/assets/RolePill-DHWixsQR.js +2 -0
- package/dashboard/dist/assets/RolePill-DHWixsQR.js.map +1 -0
- package/dashboard/dist/assets/RolesPage-DMsgZioQ.js +2 -0
- package/dashboard/dist/assets/RolesPage-DMsgZioQ.js.map +1 -0
- package/dashboard/dist/assets/{RunAsSelector-Cc1i017Z.js → RunAsSelector-VCnEYIwj.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-Cc1i017Z.js.map → RunAsSelector-VCnEYIwj.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-DrdlUeQz.js +2 -0
- package/dashboard/dist/assets/StatCard-DrdlUeQz.js.map +1 -0
- package/dashboard/dist/assets/{StatusBadge-D9MeQHrh.js → StatusBadge-DZ9137bI.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-D9MeQHrh.js.map → StatusBadge-DZ9137bI.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-GQKFFTjL.js → StickyPagination-3eCY2-_V.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-GQKFFTjL.js.map → StickyPagination-3eCY2-_V.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-BYzfjWe_.js → StreamMessageDetail-70kDFH4o.js} +2 -2
- package/dashboard/dist/assets/StreamMessageDetail-70kDFH4o.js.map +1 -0
- package/dashboard/dist/assets/{SwimlaneTimeline-DLVmRrd-.js → SwimlaneTimeline-BOXRit6t.js} +2 -2
- package/dashboard/dist/assets/SwimlaneTimeline-BOXRit6t.js.map +1 -0
- package/dashboard/dist/assets/{TagInput-CQg-TrV9.js → TagInput-CGGC3DTR.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CQg-TrV9.js.map → TagInput-CGGC3DTR.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-HzQpzp6D.js → TaskDetailPage-YxGQE9Qg.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-HzQpzp6D.js.map → TaskDetailPage-YxGQE9Qg.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-DyvtL8X4.js → TaskQueuePill-D6omQJNY.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-DyvtL8X4.js.map → TaskQueuePill-D6omQJNY.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DpqevgTz.js → TasksListPage-DuLJQN7Q.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DpqevgTz.js.map → TasksListPage-DuLJQN7Q.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CftB8aJE.js → TimeAgo-dnc1ZjKc.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CftB8aJE.js.map → TimeAgo-dnc1ZjKc.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BSKj1jqT.js → TimestampCell-CDR6cTyq.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BSKj1jqT.js.map → TimestampCell-CDR6cTyq.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-miuRcj1Q.js → ToolPill-BW0iRwZu.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-miuRcj1Q.js.map → ToolPill-BW0iRwZu.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DVQICZUQ.js → ToolTestPanel-CfwGdRdz.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DVQICZUQ.js.map → ToolTestPanel-CfwGdRdz.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-f2qaeGFz.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-f2qaeGFz.js.map +1 -0
- package/dashboard/dist/assets/TopicsPage-CwYdVmyK.js +2 -0
- package/dashboard/dist/assets/TopicsPage-CwYdVmyK.js.map +1 -0
- package/dashboard/dist/assets/{UserName-Ce9gvlT5.js → UserName-CRE7EZPU.js} +2 -2
- package/dashboard/dist/assets/{UserName-Ce9gvlT5.js.map → UserName-CRE7EZPU.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-BI9NzeaH.js → WorkflowExecutionPage-BjNBu-Zt.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-BI9NzeaH.js.map → WorkflowExecutionPage-BjNBu-Zt.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-BtNBSplz.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-BtNBSplz.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DfpvbzNt.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DfpvbzNt.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-CjBWlwlH.js → WorkflowsOverview-BwD2lQwj.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CjBWlwlH.js.map → WorkflowsOverview-BwD2lQwj.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-Ds5o1UK9.js → YamlWorkflowDetailPage-BhHb7j2s.js} +3 -3
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-Ds5o1UK9.js.map → YamlWorkflowDetailPage-BhHb7j2s.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-SBRpY2dI.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-SBRpY2dI.js.map +1 -0
- package/dashboard/dist/assets/{agents-A1U43853.js → agents-VbkdqWCr.js} +2 -2
- package/dashboard/dist/assets/{agents-A1U43853.js.map → agents-VbkdqWCr.js.map} +1 -1
- package/dashboard/dist/assets/{bots-CyzN6Uxi.js → bots-CsgYcYU_.js} +2 -2
- package/dashboard/dist/assets/{bots-CyzN6Uxi.js.map → bots-CsgYcYU_.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-BE1X5FVI.js → capabilities-CMhFyoDl.js} +2 -2
- package/dashboard/dist/assets/{capabilities-BE1X5FVI.js.map → capabilities-CMhFyoDl.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BrwK_MT8.js → controlplane-BstXtPbV.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BrwK_MT8.js.map → controlplane-BstXtPbV.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-DDdt7UdU.js → escalation-C0BNAeIG.js} +2 -2
- package/dashboard/dist/assets/{escalation-DDdt7UdU.js.map → escalation-C0BNAeIG.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-DajPgfuV.js +2 -0
- package/dashboard/dist/assets/escalation-columns-DajPgfuV.js.map +1 -0
- package/dashboard/dist/assets/index-BWLVqWLU.js +2 -0
- package/dashboard/dist/assets/index-BWLVqWLU.js.map +1 -0
- package/dashboard/dist/assets/index-BY5m8rhE.js +2 -0
- package/dashboard/dist/assets/index-BY5m8rhE.js.map +1 -0
- package/dashboard/dist/assets/{index-CGUBekEU.js → index-BYf0oNSQ.js} +2 -2
- package/dashboard/dist/assets/{index-CGUBekEU.js.map → index-BYf0oNSQ.js.map} +1 -1
- package/dashboard/dist/assets/index-BcaQ_hCz.js +9 -0
- package/dashboard/dist/assets/index-BcaQ_hCz.js.map +1 -0
- package/dashboard/dist/assets/index-BdqKh0UK.css +1 -0
- package/dashboard/dist/assets/{index-CKXSKsVZ.js → index-C8k3Z2su.js} +22 -22
- package/dashboard/dist/assets/index-C8k3Z2su.js.map +1 -0
- package/dashboard/dist/assets/index-CSixdp5W.js +2 -0
- package/dashboard/dist/assets/index-CSixdp5W.js.map +1 -0
- package/dashboard/dist/assets/{index-BNWKksZ6.js → index-CXnSqSFH.js} +2 -2
- package/dashboard/dist/assets/{index-BNWKksZ6.js.map → index-CXnSqSFH.js.map} +1 -1
- package/dashboard/dist/assets/{index-BtrNxebh.js → index-CaSMWhLU.js} +2 -2
- package/dashboard/dist/assets/{index-BtrNxebh.js.map → index-CaSMWhLU.js.map} +1 -1
- package/dashboard/dist/assets/index-Cl1vY8Lg.js +2 -0
- package/dashboard/dist/assets/index-Cl1vY8Lg.js.map +1 -0
- package/dashboard/dist/assets/{index-NnGsWGNS.js → index-CvFQtPWA.js} +2 -2
- package/dashboard/dist/assets/{index-NnGsWGNS.js.map → index-CvFQtPWA.js.map} +1 -1
- package/dashboard/dist/assets/index-DWlPFH3T.js +6 -0
- package/dashboard/dist/assets/index-DWlPFH3T.js.map +1 -0
- package/dashboard/dist/assets/{index-C-rJQ-vB.js → index-D_6JFBiM.js} +2 -2
- package/dashboard/dist/assets/{index-C-rJQ-vB.js.map → index-D_6JFBiM.js.map} +1 -1
- package/dashboard/dist/assets/{index-D4U--3Xo.js → index-fqU_l4dC.js} +2 -2
- package/dashboard/dist/assets/{index-D4U--3Xo.js.map → index-fqU_l4dC.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-B3ZIRTeu.js → knowledge-Bskl1MbC.js} +2 -2
- package/dashboard/dist/assets/{knowledge-B3ZIRTeu.js.map → knowledge-Bskl1MbC.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BJjWiHdc.js → mcp-C_qz25AB.js} +2 -2
- package/dashboard/dist/assets/{mcp-BJjWiHdc.js.map → mcp-C_qz25AB.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-ksjBztwq.js → mcp-query-CJx58s1A.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-ksjBztwq.js.map → mcp-query-CJx58s1A.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DT1astmP.js → pipelines-B6GzpgtG.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DT1astmP.js.map → pipelines-B6GzpgtG.js.map} +1 -1
- package/dashboard/dist/assets/roles-D8lPvFgG.js +2 -0
- package/dashboard/dist/assets/{roles-UboiQxXT.js.map → roles-D8lPvFgG.js.map} +1 -1
- package/dashboard/dist/assets/tasks-BWHakSYf.js +2 -0
- package/dashboard/dist/assets/{tasks-aL0K8WW3.js.map → tasks-BWHakSYf.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CZO06VJl.js → topics-0dXzPX8t.js} +2 -2
- package/dashboard/dist/assets/{topics-CZO06VJl.js.map → topics-0dXzPX8t.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-DlWkui_n.js → useEventHooks-Dpixlgp-.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-DlWkui_n.js.map → useEventHooks-Dpixlgp-.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-BBzCmCIN.js → useNamespace-DQMc77ok.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-BBzCmCIN.js.map → useNamespace-DQMc77ok.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-ZS6wRSSc.js → useYamlActivityEvents-DO5bHOVE.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-ZS6wRSSc.js.map → useYamlActivityEvents-DO5bHOVE.js.map} +1 -1
- package/dashboard/dist/assets/{users-Dzh04pRB.js → users-B_LVbnUk.js} +2 -2
- package/dashboard/dist/assets/{users-Dzh04pRB.js.map → users-B_LVbnUk.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js → vendor-icons-DOIDKgo6.js} +115 -120
- package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js.map → vendor-icons-DOIDKgo6.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-BTkHs6VT.js → workflows-WmmGDAvo.js} +2 -2
- package/dashboard/dist/assets/{workflows-BTkHs6VT.js.map → workflows-WmmGDAvo.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Df8u3lgx.js → yaml-workflows-BS7KHhU1.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Df8u3lgx.js.map → yaml-workflows-BS7KHhU1.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/dashboard.md +58 -42
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentConfigPage-D5P1hcOc.js +0 -16
- package/dashboard/dist/assets/AgentConfigPage-D5P1hcOc.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-DrijeAV8.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-DrijeAV8.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-BW5d0JOt.js +0 -2
- package/dashboard/dist/assets/AgentsPage-BW5d0JOt.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-ChaRJiyg.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-ChaRJiyg.js.map +0 -1
- package/dashboard/dist/assets/CredentialsPage-BbdfZh1D.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-BbdfZh1D.js.map +0 -1
- package/dashboard/dist/assets/CronLabel-CJUL50eO.js +0 -2
- package/dashboard/dist/assets/CronLabel-CJUL50eO.js.map +0 -1
- package/dashboard/dist/assets/EscalationSchemaPage-C6UuZgCD.js +0 -9
- package/dashboard/dist/assets/EscalationSchemaPage-C6UuZgCD.js.map +0 -1
- package/dashboard/dist/assets/EventTable-D_rNmyGG.js +0 -2
- package/dashboard/dist/assets/EventTable-D_rNmyGG.js.map +0 -1
- package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js +0 -2
- package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js.map +0 -1
- package/dashboard/dist/assets/GraphInvokePage-BMyrTnI6.js +0 -2
- package/dashboard/dist/assets/GraphInvokePage-BMyrTnI6.js.map +0 -1
- package/dashboard/dist/assets/HomePage-MBv6pwk4.js +0 -2
- package/dashboard/dist/assets/HomePage-MBv6pwk4.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-5Jzz2q2g.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-5Jzz2q2g.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-DveeRF5I.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-DveeRF5I.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-Cgke6ask.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-Cgke6ask.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-D2i7xrAI.js +0 -2
- package/dashboard/dist/assets/OperationsPage-D2i7xrAI.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-Dodrk5-z.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-Dodrk5-z.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-8NldZI49.js +0 -11
- package/dashboard/dist/assets/RoleDetailPage-8NldZI49.js.map +0 -1
- package/dashboard/dist/assets/RolePill-CXEyPMqb.js +0 -2
- package/dashboard/dist/assets/RolePill-CXEyPMqb.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-BJBjtFNY.js +0 -2
- package/dashboard/dist/assets/RolesPage-BJBjtFNY.js.map +0 -1
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js.map +0 -1
- package/dashboard/dist/assets/StreamMessageDetail-BYzfjWe_.js.map +0 -1
- package/dashboard/dist/assets/SwimlaneTimeline-DLVmRrd-.js.map +0 -1
- package/dashboard/dist/assets/TopicDetailPage-B2LAQDEg.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-B2LAQDEg.js.map +0 -1
- package/dashboard/dist/assets/TopicsPage-SwPAnN2C.js +0 -2
- package/dashboard/dist/assets/TopicsPage-SwPAnN2C.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-BuNkWUVM.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-BuNkWUVM.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-CvWSgQdE.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-CvWSgQdE.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-ChwvZS4Z.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-ChwvZS4Z.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-D_zFY1zF.js +0 -2
- package/dashboard/dist/assets/escalation-columns-D_zFY1zF.js.map +0 -1
- package/dashboard/dist/assets/index-6MALVAEY.js +0 -2
- package/dashboard/dist/assets/index-6MALVAEY.js.map +0 -1
- package/dashboard/dist/assets/index-CKXSKsVZ.js.map +0 -1
- package/dashboard/dist/assets/index-CZ6-l8_0.css +0 -1
- package/dashboard/dist/assets/index-D2dDPGNk.js +0 -2
- package/dashboard/dist/assets/index-D2dDPGNk.js.map +0 -1
- package/dashboard/dist/assets/index-D4gAsCGh.js +0 -2
- package/dashboard/dist/assets/index-D4gAsCGh.js.map +0 -1
- package/dashboard/dist/assets/index-DEXouwBQ.js +0 -2
- package/dashboard/dist/assets/index-DEXouwBQ.js.map +0 -1
- package/dashboard/dist/assets/index-U27KBbTV.js +0 -9
- package/dashboard/dist/assets/index-U27KBbTV.js.map +0 -1
- package/dashboard/dist/assets/index-fwHQSJCp.js +0 -6
- package/dashboard/dist/assets/index-fwHQSJCp.js.map +0 -1
- package/dashboard/dist/assets/roles-UboiQxXT.js +0 -2
- package/dashboard/dist/assets/tasks-aL0K8WW3.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationsPage--uVJxzmP.js","sources":["../../src/pages/operations/PaceChart.tsx","../../src/pages/operations/priority-link.ts","../../src/pages/operations/StationDetailPanel.tsx","../../src/pages/operations/OperationsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { StationMetric } from '../../api/escalations';\n\nexport interface ChartStation {\n role: string;\n title: string | null;\n target_per_hour: number | null;\n parent_role: string | null;\n /** Roles feeding this station from other sequences — drawn as a merge glyph, not a bend in the line. */\n upstream_roles?: string[];\n metric: StationMetric | undefined;\n}\n\ninterface PaceChartProps {\n stations: ChartStation[];\n selectedRole: string | null;\n onSelect: (role: string) => void;\n /** Merge-glyph click — jump to the sequence that feeds this station. */\n onUpstreamSelect?: (upstreamRole: string) => void;\n /** Priority-badge click — open the station's queue oldest-first by its age facet. */\n onPrioritySelect?: (role: string) => void;\n /** Selected window length in hours — target count = target_per_hour × this. */\n periodHours: number;\n}\n\n// ── SVG layout ────────────────────────────────────────────────────────────────\n\nconst W = 800;\nconst H = 270;\nconst ML = 40;\nconst MR = 76;\nconst MT = 24;\nconst MB = 72;\n\nconst chartW = W - ML - MR;\nconst chartH = H - MT - MB;\nconst bottom = MT + chartH;\nconst right = ML + chartW;\n\n// Smooth transition applied when the window changes and values re-scale.\nconst EASE = '0.5s cubic-bezier(0.4, 0, 0.2, 1)';\n\n// ── Path builders ─────────────────────────────────────────────────────────────\n\n// A one-point curve still needs a stroke: a short segment — slightly longer\n// than an em dash — centered through the point. It anchors the dot and its\n// end label in vertical space when a sequence has a single station (or a\n// single station carries a target).\nconst SOLO_HALF = 9;\nfunction soloSegment(p: { x: number; y: number }): string {\n return `M ${(p.x - SOLO_HALF).toFixed(1)} ${p.y.toFixed(1)} L ${(p.x + SOLO_HALF).toFixed(1)} ${p.y.toFixed(1)}`;\n}\n\n/** Straight polyline — the target line is a discrete count per station. */\nfunction linePath(pts: { x: number; y: number }[]): string {\n if (pts.length === 0) return '';\n if (pts.length === 1) return soloSegment(pts[0]);\n return pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x.toFixed(1)} ${p.y.toFixed(1)}`).join(' ');\n}\n\n/** Catmull-Rom → cubic bezier — smooth curves for the actual and active lines. */\nfunction catmullPath(pts: { x: number; y: number }[]): string {\n if (pts.length === 0) return '';\n if (pts.length === 1) return soloSegment(pts[0]);\n const segs: string[] = [];\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[Math.max(0, i - 1)];\n const p1 = pts[i];\n const p2 = pts[i + 1];\n const p3 = pts[Math.min(pts.length - 1, i + 2)];\n const cp1x = (p1.x + (p2.x - p0.x) / 6).toFixed(1);\n const cp1y = (p1.y + (p2.y - p0.y) / 6).toFixed(1);\n const cp2x = (p2.x - (p3.x - p1.x) / 6).toFixed(1);\n const cp2y = (p2.y - (p3.y - p1.y) / 6).toFixed(1);\n if (i === 0) segs.push(`M ${p1.x.toFixed(1)} ${p1.y.toFixed(1)}`);\n segs.push(`C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x.toFixed(1)} ${p2.y.toFixed(1)}`);\n }\n return segs.join(' ');\n}\n\n/**\n * Closed region between two curves — upper spline forward, lower spline back.\n * Used for the queue-composition bands: the vertical thickness at any station\n * is the count difference between the two curves.\n */\nfunction bandPath(upper: { x: number; y: number }[], lower: { x: number; y: number }[]): string {\n if (upper.length < 2 || lower.length < 2) return '';\n const forward = catmullPath(upper);\n const rev = [...lower].reverse();\n const back = catmullPath(rev);\n // Drop the back path's leading M — the L below connects the two curves.\n const backSegs = back.slice(back.indexOf('C'));\n return `${forward} L ${rev[0].x.toFixed(1)} ${rev[0].y.toFixed(1)} ${backSegs} Z`;\n}\n\nfunction compact(n: number): string {\n return n >= 10000 ? `${Math.round(n / 1000)}k` : n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n\nfunction last<T>(a: T[]): T | undefined {\n return a.length > 0 ? a[a.length - 1] : undefined;\n}\n\n// ── Colors ────────────────────────────────────────────────────────────────────\n\n// Shared queue-state palette — the chart bands and the station table columns\n// use the same hues so the two views read as one.\nexport const ACTIVE_COLOR = '#6366f1'; // claimed, being worked right now — indigo\nexport const QUEUED_COLOR = '#0ea5e9'; // pending and unclaimed, waiting in the queue — sky\nexport const RESOLVED_COLOR = '#1E3A8A'; // done — navy, matches the default theme accent\nexport const TARGET_COLOR = '#059669'; // target pace line — emerald\n\n// Priority — unclaimed items past the role's age threshold, the count the\n// floor pulls to the front of the rack. Powder blue for the badge circle;\n// the count text uses the same hue deepened enough to read at chart sizes.\nexport const PRIORITY_COLOR = '#b0e0e6';\nexport const PRIORITY_TEXT_COLOR = '#5b93ad';\n\n// ── End-label stacking — spread close labels so text doesn't collide ────────────\n\nconst MIN_GAP = 13;\nfunction spreadLabels<T extends { y: number }>(labels: T[], maxY: number): (T & { labelY: number })[] {\n const sorted = [...labels].sort((a, b) => a.y - b.y);\n let prev = -Infinity;\n const placed = sorted.map((l) => {\n const labelY = Math.max(l.y + 3, prev + MIN_GAP);\n prev = labelY;\n return { ...l, labelY };\n });\n // On a quiet window every curve sits at zero and the stack would descend\n // past the floor into the station titles — lift the whole stack back above\n // maxY instead.\n const overflow = placed.length > 0 ? placed[placed.length - 1].labelY - maxY : 0;\n if (overflow > 0) {\n for (const l of placed) l.labelY -= overflow;\n }\n return placed;\n}\n\n// ── Chart ─────────────────────────────────────────────────────────────────────\n\nexport function PaceChart({ stations, selectedRole, onSelect, onUpstreamSelect, onPrioritySelect, periodHours }: PaceChartProps) {\n const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);\n\n const n = stations.length;\n if (n === 0) return null;\n\n const xOf = (i: number) => (n === 1 ? ML + chartW / 2 : ML + (i / (n - 1)) * chartW);\n const xMap = new Map(stations.map((s, i) => [s.role, xOf(i)]));\n\n // Per-station counts for the selected window:\n // - target : expected units = target_per_hour × periodHours (e.g. 22/h · 15m ≈ 5).\n // - actual : units resolved in the window (\"the number we see\").\n // - active : units in the queue being worked right now (claimed).\n const rows = stations.map((s, i) => {\n const target = s.target_per_hour ?? null;\n const expected = target != null ? target * periodHours : null;\n return {\n idx: i,\n x: xOf(i),\n expected,\n actual: s.metric?.resolved ?? 0,\n active: s.metric?.claimed ?? 0,\n pending: s.metric?.pending ?? 0,\n priorityCount: s.metric?.priority_count ?? 0,\n };\n });\n\n const hasTargets = rows.some((r) => r.expected != null);\n\n const dataMax = Math.max(\n 1,\n ...rows.map((r) => r.expected ?? 0),\n ...rows.map((r) => r.actual),\n ...rows.map((r) => (r.expected != null ? r.pending : 0)),\n );\n const maxVal = dataMax * 1.15;\n const yScale = (v: number) => MT + chartH * (1 - Math.max(0, Math.min(v, maxVal)) / maxVal);\n\n const withTarget = rows.filter((r) => r.expected != null);\n const targetPts = withTarget.map((r) => ({ ...r, y: yScale(r.expected as number) }));\n const actualPts = withTarget.map((r) => ({ ...r, y: yScale(r.actual) }));\n const activePts = withTarget.map((r) => ({ ...r, y: yScale(r.active) }));\n const pendingPts = withTarget.map((r) => ({ ...r, y: yScale(r.pending) }));\n\n const targetLinePath = linePath(targetPts);\n const actualSplinePath = catmullPath(actualPts);\n const activeSplinePath = catmullPath(activePts);\n const pendingSplinePath = catmullPath(pendingPts);\n\n const lastActual = last(actualPts);\n const lastTarget = last(targetPts);\n const lastActive = last(activePts);\n const lastPending = last(pendingPts);\n\n const areaPath =\n actualPts.length >= 2 && lastActual\n ? `${actualSplinePath} L ${lastActual.x.toFixed(1)} ${bottom} L ${actualPts[0].x.toFixed(1)} ${bottom} Z`\n : '';\n\n // Queue composition — pending splits into two stacked bands:\n // floor → active curve = claimed, being worked (indigo)\n // active → pending curve = waiting, unclaimed (sky)\n // When workers claim everything the instant it lands, the sky band collapses\n // to zero and the whole queue reads as indigo.\n const hasQueue = withTarget.some((r) => r.pending > 0 || r.active > 0);\n const workedBandPath =\n hasQueue && activePts.length >= 2 && lastActive\n ? `${activeSplinePath} L ${lastActive.x.toFixed(1)} ${bottom} L ${activePts[0].x.toFixed(1)} ${bottom} Z`\n : '';\n const queuedBandPath = hasQueue ? bandPath(pendingPts, activePts) : '';\n\n // Quiet lines keep their curves (flat at zero) but skip their end labels —\n // a stack of names pointing at nothing is noise.\n const showActiveLabel = withTarget.some((r) => r.active > 0);\n const showQueuedLabel = withTarget.some((r) => r.pending > r.active);\n const endLabels = spreadLabels(\n [\n lastTarget ? { key: 'target', text: 'Target', color: TARGET_COLOR, y: lastTarget.y } : null,\n lastActual ? { key: 'actual', text: 'Resolved', color: RESOLVED_COLOR, y: lastActual.y } : null,\n showActiveLabel && lastActive\n ? { key: 'active', text: 'Claimed', color: ACTIVE_COLOR, y: lastActive.y }\n : null,\n showQueuedLabel && lastPending\n ? { key: 'queued', text: 'Pending', color: QUEUED_COLOR, y: lastPending.y }\n : null,\n ].filter(Boolean) as { key: string; text: string; color: string; y: number }[],\n bottom + 4,\n );\n\n return (\n <svg viewBox={`0 0 ${W} ${H}`} className=\"w-full h-full\" preserveAspectRatio=\"xMidYMid meet\" style={{ display: 'block' }}>\n {/* Dependency connector lines (parent → child), drawn at chart floor */}\n {stations.map((s) => {\n if (!s.parent_role) return null;\n const px = xMap.get(s.parent_role);\n if (px == null) return null;\n const cx = xOf(stations.findIndex((r) => r.role === s.role));\n return <line key={`dep-${s.role}`} x1={px} y1={bottom} x2={cx} y2={bottom} stroke=\"#e2e8f0\" strokeWidth={0.75} />;\n })}\n\n {/* Area under the actual curve */}\n {areaPath && <path d={areaPath} fill={RESOLVED_COLOR} opacity={0.05} style={{ transition: `d ${EASE}` }} />}\n\n {/* Queue composition bands — the band heights split each station's\n pending total into claimed-and-worked (indigo, floor→active) and\n waiting-unclaimed (sky, active→pending). */}\n {workedBandPath && (\n <path d={workedBandPath} fill={ACTIVE_COLOR} opacity={0.12} style={{ transition: `d ${EASE}` }} />\n )}\n {queuedBandPath && (\n <path d={queuedBandPath} fill={QUEUED_COLOR} opacity={0.12} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Target — thin red solid reference at the window's expected count */}\n {targetLinePath && (\n <path d={targetLinePath} fill=\"none\" stroke={TARGET_COLOR} strokeWidth={0.5} strokeLinejoin=\"round\" opacity={0.9} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Per-role target for the window (target_per_hour × duration), just above the red line */}\n {targetPts.map((tp) => (\n <text\n key={`tval-${tp.idx}`}\n x={tp.x}\n y={tp.y - 3.5}\n textAnchor=\"middle\"\n fontSize={6.5}\n fill={TARGET_COLOR}\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"500\"\n opacity={0.7}\n style={{ transition: `y ${EASE}` }}\n >\n {Math.round(tp.expected as number)}\n </text>\n ))}\n\n {/* Pending — thin dotted sky edge along the queue total (top of the bands) */}\n {hasQueue && pendingSplinePath && (\n <path d={pendingSplinePath} fill=\"none\" stroke={QUEUED_COLOR} strokeWidth={0.75} strokeDasharray=\"2 3\" strokeLinecap=\"round\" opacity={0.55} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Active — thin dotted indigo, how many are claimed and being worked */}\n {activeSplinePath && (\n <path d={activeSplinePath} fill=\"none\" stroke={ACTIVE_COLOR} strokeWidth={0.75} strokeDasharray=\"2 3\" strokeLinecap=\"round\" opacity={0.5} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Actual — thin solid, primary line */}\n {actualSplinePath && (\n <path d={actualSplinePath} fill=\"none\" stroke={RESOLVED_COLOR} strokeWidth={0.6} strokeLinejoin=\"round\" strokeLinecap=\"round\" opacity={0.65} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Queue markers — a dot on the active line per station.\n Above the dot, at the pending edge: the queue total (sky when part of\n it is still waiting, slate when everything is claimed).\n Below the dot: active (claimed, being worked right now). */}\n {activePts.map((ap, i) => {\n if (ap.pending <= 0 && ap.active <= 0) return null;\n const ar = Math.max(2.5, Math.min(5, 2.5 + ap.active / 10));\n const hasWaiting = ap.pending > ap.active;\n // Anchor the queue-total label to the pending edge so it rides the top\n // of the band; keep it clear of the dot when the two curves touch.\n const pendingLabelY = Math.min(pendingPts[i].y - 4, ap.y - ar - 4);\n return (\n <g key={`active-${ap.idx}`}>\n {ap.pending > 0 && (\n <text\n x={ap.x}\n y={pendingLabelY}\n textAnchor=\"middle\"\n fontSize={7.5}\n fill={hasWaiting ? QUEUED_COLOR : '#64748b'}\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"600\"\n style={{ transition: `y ${EASE}` }}\n >\n {ap.pending}\n </text>\n )}\n <g transform={`translate(${ap.x} ${ap.y})`} style={{ transition: `transform ${EASE}` }}>\n <circle r={ar} fill={ACTIVE_COLOR} opacity={0.85} />\n {ap.active > 0 && (\n <text y={ar + 9} textAnchor=\"middle\" fontSize={7.5} fill={ACTIVE_COLOR} fontFamily=\"ui-monospace, monospace\" fontWeight=\"600\">\n {ap.active}\n </text>\n )}\n </g>\n </g>\n );\n })}\n\n {/* Station nodes — actual (resolved) as a dot on the actual line, styled like\n the active dot but a bit larger (actual is the most important number).\n The count sits below the dot so it stays legible as numbers grow. */}\n {rows.map((row) => {\n const s = stations[row.idx];\n const x = row.x;\n const cy = row.expected != null ? yScale(row.actual) : bottom;\n // Same small scale as the active dot — a hair larger.\n const r = Math.max(2.25, Math.min(4, 2.25 + row.actual / 160));\n const isSelected = s.role === selectedRole;\n const isHovered = hoveredIdx === row.idx;\n\n const tooltip =\n row.expected == null\n ? 'idle · set a target rate to plot pace'\n : `${row.actual} resolved · target ${Math.round(row.expected)}`\n + (row.pending > row.active ? ` · ${row.pending - row.active} pending` : '')\n + (row.active > 0 ? ` · ${row.active} claimed` : '')\n + (row.priorityCount > 0 ? ` · ${row.priorityCount} priority` : '');\n const tipW = tooltip.length * 5.5 + 20;\n const tipX = Math.max(ML + tipW / 2 + 4, Math.min(right - tipW / 2 - 4, x));\n const tipY = cy - r - 10;\n\n return (\n <g\n key={s.role}\n onClick={() => onSelect(s.role)}\n onMouseEnter={() => setHoveredIdx(row.idx)}\n onMouseLeave={() => setHoveredIdx(null)}\n style={{ cursor: 'pointer' }}\n >\n {/* Animated marker group — slides vertically as the window rescales */}\n <g transform={`translate(${x} ${cy})`} style={{ transition: `transform ${EASE}` }}>\n <circle r={22} fill=\"transparent\" />\n <circle r={r} fill={RESOLVED_COLOR} opacity={0.9} style={{ transition: `r ${EASE}` }} />\n {row.expected != null && (\n <text y={-r - 5} textAnchor=\"middle\" fontSize={9.5} fill={RESOLVED_COLOR} fontFamily=\"ui-monospace, monospace\" fontWeight=\"500\">\n {compact(row.actual)}\n </text>\n )}\n {isHovered && !isSelected && <circle r={r + 3} fill=\"none\" stroke={RESOLVED_COLOR} strokeWidth={1} opacity={0.4} />}\n {isSelected && <circle r={r + 4} fill=\"none\" stroke=\"#6366f1\" strokeWidth={2} />}\n </g>\n\n {/* Priority badge — powder blue circle carrying the count of\n unclaimed items past the role's age threshold. Clicking opens\n the station's queue oldest-first by the priority facet so the\n runner grabs the top few and moves them to the front. */}\n {row.priorityCount > 0 && (\n <g\n transform={`translate(${x + 15} ${Math.max(cy - 15, 12)})`}\n onClick={(e) => {\n e.stopPropagation();\n onPrioritySelect?.(s.role);\n }}\n style={{ cursor: 'pointer', transition: `transform ${EASE}` }}\n >\n <title>{`${row.priorityCount} past the priority threshold — click to pull oldest first`}</title>\n <circle\n r={6.5 + (String(row.priorityCount).length - 1) * 2}\n fill={PRIORITY_COLOR}\n opacity={0.9}\n />\n <text\n y={2.5}\n textAnchor=\"middle\"\n fontSize={7}\n fill={PRIORITY_TEXT_COLOR}\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"700\"\n >\n {row.priorityCount}\n </text>\n </g>\n )}\n\n {/* Merge affordance — this station also receives input from another\n sequence. The dashed drop into the floor says \"a side-quest\n lands here\"; clicking it opens that sequence. It is a symbol,\n deliberately not a line — the upstream is NOT a descendant. */}\n {(s.upstream_roles?.length ?? 0) > 0 && (\n <g\n transform={`translate(${x - 20} ${bottom})`}\n onClick={(e) => {\n e.stopPropagation();\n onUpstreamSelect?.(s.upstream_roles![0]);\n }}\n style={{ cursor: 'pointer' }}\n >\n <title>{`Fed by ${s.upstream_roles!.join(', ')} — click to view that sequence`}</title>\n <circle r={9} cy={-6} fill=\"transparent\" />\n <path d=\"M -7 -14 C -3 -14 -1 -9 0 -2\" fill=\"none\" stroke=\"#94a3b8\" strokeWidth={1} strokeDasharray=\"2 2\" strokeLinecap=\"round\" />\n <path d=\"M 0 -2 L 8 -2\" stroke=\"#94a3b8\" strokeWidth={1} strokeLinecap=\"round\" />\n <path d=\"M 8 -2 l -3.5 -2 v 4 z\" fill=\"#94a3b8\" />\n </g>\n )}\n\n {/* Station labels (fixed at the floor) */}\n <text x={x} y={bottom + 14} textAnchor=\"middle\" fontSize={9.5} fill=\"#475569\" fontFamily=\"ui-sans-serif, sans-serif\" fontWeight=\"500\">\n {s.title ?? s.role}\n </text>\n <text x={x} y={bottom + 26} textAnchor=\"middle\" fontSize={8} fill=\"#94a3b8\" fontFamily=\"ui-monospace, monospace\">\n {s.role}\n </text>\n\n {/* Tooltip */}\n {isHovered && (\n <g>\n <rect x={tipX - tipW / 2} y={tipY - 16} width={tipW} height={19} rx={3} fill=\"#0f172a\" opacity={0.88} />\n <text x={tipX} y={tipY - 3} textAnchor=\"middle\" fontSize={8.5} fill=\"white\" fontFamily=\"ui-monospace, monospace\">\n {tooltip}\n </text>\n </g>\n )}\n </g>\n );\n })}\n\n {/* No-target hint */}\n {!hasTargets && (\n <text x={ML + chartW / 2} y={bottom + 48} textAnchor=\"middle\" fontSize={8.5} fill=\"#94a3b8\" fontFamily=\"ui-sans-serif, sans-serif\">\n Set target_per_hour on each role in Admin → Roles to enable the pace chart\n </text>\n )}\n\n {/* End labels — text + count, rendered last so they sit above everything */}\n {endLabels.map((l) => (\n <text\n key={l.key}\n x={right + 6}\n y={l.labelY}\n fontSize={8}\n fill={l.color}\n fontFamily=\"ui-sans-serif, sans-serif\"\n fontWeight={l.key === 'actual' ? 700 : 500}\n opacity={l.key === 'active' ? 0.85 : 1}\n style={{ transition: `y ${EASE}` }}\n >\n {l.text}\n </text>\n ))}\n </svg>\n );\n}\n","import type { RoleDetail } from '../../api/roles';\n\n/**\n * Deep link to the available-escalations queue ordered oldest-first by the\n * role's priority age origin: the metadata facet when configured (faceted\n * orderBy, nulls last), else created_at. Mirrors the priority_count SQL so\n * the counted items sit at the top of the list the runner opens.\n */\nexport function priorityQueueLink(role: Pick<RoleDetail, 'role' | 'priority_facet'>): string {\n const base = `/escalations/available?role=${encodeURIComponent(role.role)}`;\n if (role.priority_facet) {\n const orderBy = JSON.stringify([{ field: `metadata.${role.priority_facet}`, direction: 'asc' }]);\n return `${base}&orderBy=${encodeURIComponent(orderBy)}`;\n }\n return `${base}&sort_by=created_at&order=asc`;\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, ExternalLink } from 'lucide-react';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport type { RoleDetail } from '../../api/roles';\nimport { PRIORITY_TEXT_COLOR } from './PaceChart';\nimport { priorityQueueLink } from './priority-link';\n\ninterface StationDetailPanelProps {\n role: RoleDetail | null;\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n globalPeriod: string;\n onClose: () => void;\n}\n\n// Mirrors OperationsPage's selector — the panel reports the same windows the\n// chart can show, and opens on whichever one the chart has selected.\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\nconst isPeriod = (p: string): p is Period => (PERIODS as readonly string[]).includes(p);\n\nfunction fmt(min: number | null): string {\n if (min == null) return '—';\n if (min < 1) {\n const s = Math.round(min * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (min < 60) return `${min.toFixed(0)}m`;\n return `${(min / 60).toFixed(1)}h`;\n}\n\nfunction MetricRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between py-1\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider\">{label}</span>\n <span className=\"text-xs font-mono font-medium text-text-primary tabular-nums\">{value}</span>\n </div>\n );\n}\n\nfunction PeriodSelector({ period, onChange }: { period: Period; onChange: (p: Period) => void }) {\n return (\n <div className=\"flex items-center gap-1 mb-4\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => onChange(p)}\n className={`px-2 py-0.5 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n}\n\nfunction RoleView({ role, globalPeriod, onClose }: { role: RoleDetail; globalPeriod: string; onClose: () => void }) {\n // Open on the chart's selected window so the panel's numbers agree with the\n // chart beside it; the local selector still lets the viewer drill around.\n const [period, setPeriod] = useState<Period>(isPeriod(globalPeriod) ? globalPeriod : '24h');\n const { data } = useStationMetrics(period);\n const metric = data?.stations.find((s) => s.role === role.role);\n const slaMinutes = role.sla_minutes ?? undefined;\n const targetPerHour = role.target_per_hour ?? undefined;\n const workerCount = role.worker_count ?? undefined;\n\n return (\n <>\n {/* Header */}\n <div className=\"flex items-start justify-between mb-1\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline gap-1.5 flex-wrap\">\n <span className=\"text-sm font-mono font-bold text-text-primary\">{role.role}</span>\n {role.title && (\n <span className=\"text-[10px] text-text-secondary\">{role.title}</span>\n )}\n </div>\n {role.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-2 leading-relaxed\">\n {role.description}\n </p>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors mt-0.5 shrink-0 ml-2\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n <Link\n to={`/admin/roles/${encodeURIComponent(role.role)}`}\n className=\"flex items-center gap-1 text-[10px] text-accent hover:underline mb-4\"\n >\n <ExternalLink className=\"w-2.5 h-2.5\" />\n Edit in Roles\n </Link>\n\n <PeriodSelector period={period} onChange={setPeriod} />\n\n {/* Capacity settings */}\n {(targetPerHour || slaMinutes || workerCount) && (\n <div className=\"flex items-center gap-4 mb-4 text-[10px]\">\n {targetPerHour && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{targetPerHour}/h</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">target</div>\n </div>\n )}\n {slaMinutes && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{slaMinutes}m</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">SLA</div>\n </div>\n )}\n {workerCount && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{workerCount}</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">workers</div>\n </div>\n )}\n </div>\n )}\n\n {/* Two-column wait / work grid */}\n <div className=\"grid grid-cols-2 gap-x-3\">\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-1.5\">Wait (queue)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.wait.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.wait.avg ?? null)} />\n </div>\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-1.5\">Work (proc.)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.work.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.work.avg ?? null)} />\n </div>\n </div>\n\n {/* SLA + priority */}\n <div className=\"border-t border-surface-border/40 pt-2 mt-3 space-y-1.5\">\n {slaMinutes && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-text-tertiary\">SLA target</span>\n <span className=\"text-xs font-mono text-text-secondary\">{slaMinutes}m</span>\n </div>\n )}\n {metric && metric.priority_count > 0 && (\n <Link\n to={priorityQueueLink(role)}\n className=\"flex items-center justify-between group\"\n >\n <span className=\"text-[10px]\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {metric.priority_count} priority — pull oldest first\n </span>\n <ExternalLink className=\"w-3 h-3 transition-colors\" style={{ color: PRIORITY_TEXT_COLOR }} />\n </Link>\n )}\n </div>\n\n {/* View queue — `role=` drives the visible filter bar on the escalations\n page (the JSON `roles=` facet param filters silently and leaves the\n bar reading \"all roles\"). */}\n <div className=\"mt-4 border-t border-surface-border/40 pt-3\">\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}`}\n className=\"flex items-center gap-1.5 text-[10px] text-accent hover:underline\"\n >\n View full queue\n <ExternalLink className=\"w-2.5 h-2.5\" />\n </Link>\n </div>\n </>\n );\n}\n\nfunction OverviewPanel({\n allMetrics,\n orderedRoles,\n period,\n}: {\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n period: string;\n}) {\n const totalPending = allMetrics.reduce((s, m) => s + m.pending, 0);\n const totalResolved = allMetrics.reduce((s, m) => s + m.resolved, 0);\n const totalPriority = allMetrics.reduce((s, m) => s + m.priority_count, 0);\n\n const metricByRole = new Map(allMetrics.map((m) => [m.role, m]));\n const stationsAtRisk = allMetrics.filter((m) => m.priority_count > 0).length;\n const stationsWithLoad = allMetrics.filter((m) => m.pending > 0).length;\n\n return (\n <>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-3\">\n Pipeline · {period}\n </p>\n\n {/* Health headline */}\n <div className=\"mb-4\">\n {stationsAtRisk > 0 ? (\n <p className=\"text-[11px]\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {stationsAtRisk} station{stationsAtRisk > 1 ? 's' : ''} with priority items\n </p>\n ) : stationsWithLoad > 0 ? (\n <p className=\"text-[11px] text-status-warning\">\n {stationsWithLoad} station{stationsWithLoad > 1 ? 's' : ''} with backlog\n </p>\n ) : totalResolved > 0 ? (\n <p className=\"text-[11px] text-status-success\">Flowing — queue clear</p>\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">Quiet — awaiting work</p>\n )}\n </div>\n\n {/* Key counters */}\n <div className=\"space-y-1.5 mb-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Pending</span>\n <span className={`text-xs font-mono tabular-nums ${totalPending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'}`}>\n {totalPending}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Resolved · {period}</span>\n <span className=\"text-xs font-mono tabular-nums text-text-secondary\">{totalResolved}</span>\n </div>\n {totalPriority > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Priority</span>\n <span className=\"text-xs font-mono tabular-nums font-semibold\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {totalPriority}\n </span>\n </div>\n )}\n </div>\n\n {/* Divider + column headers */}\n <div className=\"border-t border-surface-border/40 pt-2 mb-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider flex-1\">Station</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">pend</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">clmd</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">res</span>\n </div>\n </div>\n\n {/* Station list in pipeline order */}\n <div className=\"space-y-0.5\">\n {orderedRoles.map((r) => {\n const m = metricByRole.get(r.role);\n const pending = m?.pending ?? 0;\n const claimed = m?.claimed ?? 0;\n const resolved = m?.resolved ?? 0;\n const priorityCount = m?.priority_count ?? 0;\n const label = r.title || r.role;\n const hasAlert = priorityCount > 0;\n const hasLoad = pending > 0;\n\n return (\n <div key={r.role} className=\"flex items-center gap-2 py-0.5\">\n <span\n className={`text-[10px] font-mono flex-1 truncate ${\n hasLoad ? 'text-text-primary' : 'text-text-quaternary'\n }`}\n >\n {label}\n {hasAlert && (\n <span className=\"ml-1 text-[8px] font-semibold\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {priorityCount} PRIORITY\n </span>\n )}\n </span>\n <span\n className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${\n hasLoad ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n >\n {pending > 0 ? pending : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${claimed > 0 ? 'text-accent' : 'text-text-quaternary'}`}>\n {claimed > 0 ? claimed : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${resolved > 0 ? 'text-text-secondary' : 'text-text-quaternary'}`}>\n {resolved > 0 ? resolved : '—'}\n </span>\n </div>\n );\n })}\n </div>\n\n <p className=\"text-[9px] text-text-quaternary mt-5\">\n Select a station for queue detail.\n </p>\n </>\n );\n}\n\nexport function StationDetailPanel({\n role,\n allMetrics,\n orderedRoles,\n globalPeriod,\n onClose,\n}: StationDetailPanelProps) {\n return (\n <div className=\"w-[280px] shrink-0 px-6 py-8 flex flex-col overflow-y-auto min-h-0\">\n {role ? (\n <RoleView role={role} globalPeriod={globalPeriod} onClose={onClose} />\n ) : (\n <OverviewPanel allMetrics={allMetrics} orderedRoles={orderedRoles} period={globalPeriod} />\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Link, useNavigate, useSearchParams } from 'react-router-dom';\nimport { GitMerge, RefreshCw } from 'lucide-react';\nimport { useRoleDetails, type RoleDetail } from '../../api/roles';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport { useStationMetricsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport {\n PaceChart,\n ACTIVE_COLOR,\n QUEUED_COLOR,\n RESOLVED_COLOR,\n TARGET_COLOR,\n PRIORITY_COLOR,\n PRIORITY_TEXT_COLOR,\n type ChartStation,\n} from './PaceChart';\nimport { StationDetailPanel } from './StationDetailPanel';\nimport { priorityQueueLink } from './priority-link';\n\n// Column band tints — the same hues as the chart's queue-composition bands\n// (~8% alpha), so PENDING/ACTIVE/RESOLVED in the table visually continue the\n// sky/indigo/sage story told above.\nconst TARGET_BAND = `${TARGET_COLOR}14`;\nconst PENDING_BAND = `${QUEUED_COLOR}14`;\nconst ACTIVE_BAND = `${ACTIVE_COLOR}14`;\nconst RESOLVED_BAND = `${RESOLVED_COLOR}14`;\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\n// Window length in hours — used to express the target as a count for the\n// selected window (target_per_hour × hours), e.g. 22/h over 15m ≈ 5 expected.\nconst PERIOD_HOURS: Record<Period, number> = {\n '15m': 0.25,\n '1h': 1,\n '24h': 24,\n '7d': 168,\n '30d': 720,\n};\n\ninterface OrderedStation {\n role: RoleDetail;\n depth: number;\n}\n\n/**\n * One sequence of stations, named by its origin role. Execution is a graph;\n * each fragment is the human-readable line the user composed via parent_role.\n * Cross-fragment edges live in upstream_roles and render as a merge affordance\n * on the chart, never as a bend in the line.\n */\ninterface SequenceFragment {\n origin: RoleDetail;\n stations: OrderedStation[];\n}\n\n// ── Fragment builder — BFS per parent_role root, tracking actual depth ────────\n\nexport function buildFragments(roles: RoleDetail[]): SequenceFragment[] {\n const opsRoles = roles.filter((r) => r.ops_visible);\n const roleMap = new Map(opsRoles.map((r) => [r.role, r]));\n const visited = new Set<string>();\n\n // Roots: no parent, or parent not in ops set — each roots its own fragment.\n const roots = opsRoles.filter((r) => !r.parent_role || !roleMap.has(r.parent_role));\n\n const fragments: SequenceFragment[] = roots.map((root) => {\n const stations: OrderedStation[] = [];\n const queue: OrderedStation[] = [{ role: root, depth: 0 }];\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (visited.has(item.role.role)) continue;\n visited.add(item.role.role);\n stations.push(item);\n opsRoles\n .filter((c) => c.parent_role === item.role.role && !visited.has(c.role))\n .forEach((c) => queue.push({ role: c, depth: item.depth + 1 }));\n }\n return { origin: root, stations };\n });\n\n // Unreachable (cycles / dangling) — each stands alone rather than vanishing.\n opsRoles\n .filter((r) => !visited.has(r.role))\n .forEach((r) => fragments.push({ origin: r, stations: [{ role: r, depth: 0 }] }));\n\n // Longest line first — the primary sequence leads; side-quests follow.\n return fragments.sort(\n (a, b) => b.stations.length - a.stations.length || a.origin.role.localeCompare(b.origin.role),\n );\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction fmtMin(v: number | null): string {\n if (v == null) return '—';\n if (v < 1) {\n const s = Math.round(v * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (v < 60) return `${v.toFixed(0)}m`;\n return `${(v / 60).toFixed(1)}h`;\n}\n\nfunction loadBar(pending: number, target: number | null) {\n // No target, or nothing pending — there is no live load to trend. Show the\n // empty state rather than inventing a rate from historical throughput.\n if (!target || pending === 0) return { pct: null, color: 'bg-surface-border' };\n\n const ratio = pending / target;\n const pct = Math.round(ratio * 100);\n // Amber: backlog. Orange: some work but well under pace. Green: healthy.\n const color = ratio > 1.0 ? 'bg-status-warning' : ratio < 0.2 ? 'bg-status-draft' : 'bg-status-success';\n return { pct, color };\n}\n\n// ── Station table row ─────────────────────────────────────────────────────────\n\nfunction StationRow({\n role,\n metric,\n selected,\n onClick,\n}: {\n role: RoleDetail;\n metric: StationMetric | undefined;\n selected: boolean;\n onClick: () => void;\n}) {\n const pending = metric?.pending ?? 0;\n const claimed = metric?.claimed ?? 0;\n const resolved = metric?.resolved ?? 0;\n const priorityCount = metric?.priority_count ?? 0;\n const target = role.target_per_hour ?? null;\n const { pct, color } = loadBar(pending, target);\n const barWidth = pct != null ? Math.min(100, pct) : 0;\n\n return (\n <>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter') onClick(); }}\n className={`grid items-center gap-4 pr-3 cursor-pointer transition-colors ${\n selected ? 'border-l-2 !border-l-accent pl-2.5' : 'pl-3'\n }`}\n style={{ gridTemplateColumns: '1fr 64px 56px 56px 60px 72px 72px 104px' }}\n >\n {/* Role name */}\n <div className=\"flex items-center gap-1.5 min-w-0 py-1.5\">\n <span\n className=\"font-mono font-bold text-text-primary truncate text-[11px]\"\n >\n {role.role}\n </span>\n {role.title && (\n <span className=\"text-[10px] text-text-tertiary truncate\">{role.title}</span>\n )}\n {(role.upstream_roles?.length ?? 0) > 0 && (\n <span title={`Fed by ${role.upstream_roles.join(', ')}`} className=\"shrink-0 leading-none\">\n <GitMerge className=\"w-3 h-3 text-text-quaternary\" />\n </span>\n )}\n </div>\n\n {/* Target / hour — emerald band, same hue as the chart's target line */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: TARGET_BAND }}\n >\n <span\n className={`text-xs font-mono tabular-nums ${\n target != null ? 'text-text-secondary' : 'text-text-quaternary'\n }`}\n >\n {target != null ? target : '—'}\n </span>\n </div>\n\n {/* Pending — sky band, same hue as the chart's waiting band */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: PENDING_BAND }}\n >\n <span\n className={`text-xs font-mono tabular-nums ${\n pending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n >\n {pending}\n </span>\n </div>\n\n {/* Active — indigo band, same hue as the chart's worked band */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: ACTIVE_BAND }}\n >\n <span\n className={`text-xs font-mono tabular-nums ${\n claimed > 0 ? 'text-accent font-semibold' : 'text-text-quaternary'\n }`}\n >\n {claimed}\n </span>\n </div>\n\n {/* Resolved — sage band, same hue as the chart's actual curve */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: RESOLVED_BAND }}\n >\n <span className=\"text-xs font-mono tabular-nums text-text-quaternary\">\n {resolved}\n </span>\n </div>\n\n {/* P99 wait */}\n <span className=\"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary\">\n {fmtMin(metric?.wait.p99 ?? null)}\n </span>\n\n {/* P99 work */}\n <span className=\"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary\">\n {fmtMin(metric?.work.p99 ?? null)}\n </span>\n\n {/* Load mini-bar */}\n <div className=\"flex items-center gap-2 py-1.5\">\n <div className=\"w-12 h-1.5 bg-surface-sunken rounded-full overflow-hidden shrink-0\">\n <div className={`h-full rounded-full ${color}`} style={{ width: `${barWidth}%` }} />\n </div>\n <span\n className={`text-[10px] font-mono tabular-nums ${\n pct != null && pct > 100\n ? 'text-status-warning font-semibold'\n : 'text-text-quaternary'\n }`}\n >\n {pct != null ? `${pct}%` : '—'}\n </span>\n </div>\n </div>\n\n {/* Priority sub-row — unclaimed items past the role's age threshold */}\n {priorityCount > 0 && (\n <div className=\"flex items-center gap-1.5 pb-2 pl-3.5\">\n <span\n className=\"w-2.5 h-2.5 rounded-full dot-ring shrink-0\"\n style={{ backgroundColor: PRIORITY_COLOR }}\n />\n <Link\n to={priorityQueueLink(role)}\n className=\"text-[10px] hover:underline\"\n style={{ color: PRIORITY_TEXT_COLOR }}\n onClick={(e) => e.stopPropagation()}\n >\n {priorityCount} priority — pull oldest first →\n </Link>\n </div>\n )}\n </>\n );\n}\n\n// ── Table header ──────────────────────────────────────────────────────────────\n\nfunction TableHead() {\n // Queue-state columns carry the chart's band hue into the table.\n const cols: { label: string; band?: string; hue?: string }[] = [\n { label: 'ROLE' },\n { label: 'TARGET/H', band: TARGET_BAND, hue: TARGET_COLOR },\n { label: 'PENDING', band: PENDING_BAND, hue: QUEUED_COLOR },\n { label: 'CLAIMED', band: ACTIVE_BAND, hue: ACTIVE_COLOR },\n { label: 'RESOLVED', band: RESOLVED_BAND, hue: RESOLVED_COLOR },\n { label: 'P99 WAIT' },\n { label: 'P99 WORK' },\n { label: 'TREND' },\n ];\n return (\n <div\n className=\"grid items-center gap-4 px-3 border-b border-surface-border mb-0.5\"\n style={{ gridTemplateColumns: '1fr 64px 56px 56px 60px 72px 72px 104px' }}\n >\n {cols.map((col, i) =>\n col.band ? (\n <div\n key={col.label}\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: col.band }}\n >\n <span\n className=\"text-[9px] font-semibold uppercase tracking-wider\"\n style={{ color: col.hue }}\n >\n {col.label}\n </span>\n </div>\n ) : (\n <span\n key={col.label}\n className={`text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5 ${\n i > 0 && i < 7 ? 'text-right' : ''\n }`}\n >\n {col.label}\n </span>\n ),\n )}\n </div>\n );\n}\n\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function OperationsPage() {\n // 1h default: long enough to show a whole simulation shift's shape,\n // short enough that stale history doesn't drown the current run.\n const [period, setPeriod] = useState<Period>('1h');\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n\n // Push-driven refresh: every escalation event invalidates ['stationMetrics']\n // through the central event system (debounced, transport-agnostic). The\n // header's refresh button covers user-initiated reloads.\n useStationMetricsEvents();\n\n const { data: roleData, isLoading: rolesLoading, refetch: refetchRoles } = useRoleDetails();\n const {\n data: metricsData,\n isLoading: metricsLoading,\n refetch: refetchMetrics,\n } = useStationMetrics(period);\n\n const roles = roleData?.roles ?? [];\n const metrics = metricsData?.stations ?? [];\n\n // Sequence fragments, one per parent_role root. The active one is\n // DEEP-LINKED (?fragment=<origin role>) and each switch is a history entry,\n // so a shared link opens the same sequence and back/forward walks them.\n const fragments = useMemo((): SequenceFragment[] => buildFragments(roles), [roles]);\n const [searchParams, setSearchParams] = useSearchParams();\n const fragmentParam = searchParams.get('fragment');\n const activeFragment =\n fragments.find((f) => f.origin.role === fragmentParam) ?? fragments[0] ?? null;\n const selectFragment = useCallback(\n (origin: string) => {\n setSelectedRole(null);\n setSearchParams((prev) => {\n const p = new URLSearchParams(prev);\n p.set('fragment', origin);\n return p;\n });\n },\n [setSearchParams],\n );\n\n const ordered = activeFragment?.stations ?? [];\n const fragmentRoleSet = useMemo(\n () => new Set(ordered.map(({ role }) => role.role)),\n [ordered],\n );\n const fragmentMetrics = useMemo(\n () => metrics.filter((m) => fragmentRoleSet.has(m.role)),\n [metrics, fragmentRoleSet],\n );\n\n const chartStations = useMemo(\n (): ChartStation[] =>\n ordered.map(({ role: r }) => ({\n role: r.role,\n title: r.title,\n parent_role: r.parent_role,\n target_per_hour: r.target_per_hour ?? null,\n upstream_roles: r.upstream_roles ?? [],\n metric: metrics.find((m) => m.role === r.role),\n })),\n [ordered, metrics],\n );\n\n // Jump to the sequence that feeds this station — the merge glyph's click.\n const handleUpstreamSelect = useCallback(\n (upstreamRole: string) => {\n const target = fragments.find((f) =>\n f.stations.some(({ role }) => role.role === upstreamRole),\n );\n if (target) selectFragment(target.origin.role);\n },\n [fragments, selectFragment],\n );\n\n // Priority-badge click — open the station's queue oldest-first by its facet.\n const navigate = useNavigate();\n const handlePrioritySelect = useCallback(\n (roleName: string) => {\n const detail = roles.find((r) => r.role === roleName);\n if (detail) navigate(priorityQueueLink(detail));\n },\n [roles, navigate],\n );\n\n const selectedRoleDetail =\n ordered.find(({ role }) => role.role === selectedRole)?.role ?? null;\n\n const isLoading = rolesLoading || metricsLoading;\n\n const handleRefresh = async () => {\n setRefreshing(true);\n await Promise.all([refetchRoles(), refetchMetrics()]);\n setRefreshing(false);\n };\n\n const handleSelect = (role: string) =>\n setSelectedRole((prev) => (prev === role ? null : role));\n\n const periodSelector = (\n <div className=\"flex items-center gap-0.5\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => setPeriod(p)}\n className={`px-2.5 py-1 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex flex-col flex-1 min-h-0\">\n <PageHeader\n title=\"Pace Board\"\n docsHash=\"#docs:dashboard.md:pace-board\"\n center={periodSelector}\n actions={\n <button\n onClick={handleRefresh}\n disabled={refreshing}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors disabled:opacity-40\"\n >\n <RefreshCw className={`w-3.5 h-3.5 ${refreshing ? 'animate-spin' : ''}`} />\n </button>\n }\n />\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-6 mt-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-64 bg-surface-sunken rounded w-full\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-8 bg-surface-sunken rounded w-full\" />\n ))}\n </div>\n </div>\n ) : fragments.length === 0 ? (\n <div className=\"mt-8\">\n <p className=\"text-sm text-text-secondary mb-2\">Stations appear here once roles are marked visible in Operations.</p>\n <p className=\"text-xs text-text-tertiary\">\n Go to{' '}\n <Link to=\"/admin/roles\" className=\"text-accent hover:underline\">\n Roles\n </Link>{' '}\n and enable <strong>Visible in Operations</strong> on roles that represent pipeline\n stations.\n </p>\n </div>\n ) : (\n /* Console layout: fixed header (above) → flexible middle → fixed table (30vh) */\n <div className=\"flex flex-col flex-1 min-h-0\">\n\n {/* Sequence picker — one tab per fragment, named by its origin role.\n Only rendered when there is more than one story to tell. */}\n {fragments.length > 1 && (\n <div className=\"flex items-center gap-0.5 px-4 pt-2\">\n {fragments.map((f) => {\n const isActive = f.origin.role === activeFragment?.origin.role;\n return (\n <button\n key={f.origin.role}\n onClick={() => selectFragment(f.origin.role)}\n className={`px-2.5 py-1 text-[10px] font-mono rounded transition-colors ${\n isActive\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {f.origin.title ?? f.origin.role}\n <span className={`ml-1.5 tabular-nums ${isActive ? 'text-accent/60' : 'text-text-quaternary/60'}`}>\n {f.stations.length}\n </span>\n </button>\n );\n })}\n </div>\n )}\n\n {/* Middle row: flexible height — SVG fills left, sidebar fixed-width right */}\n <div className=\"flex-1 min-h-0 flex items-stretch overflow-hidden\">\n {/* SVG chart — scales to fill available space */}\n <div className=\"flex-1 min-w-0 min-h-0 flex flex-col justify-center overflow-hidden p-4\">\n <PaceChart\n stations={chartStations}\n selectedRole={selectedRole}\n onSelect={handleSelect}\n onUpstreamSelect={handleUpstreamSelect}\n onPrioritySelect={handlePrioritySelect}\n periodHours={PERIOD_HOURS[period]}\n />\n </div>\n {/* Vertical divider */}\n <div className=\"w-px bg-surface-border shrink-0 self-stretch\" />\n {/* Right sidebar — fixed width, scrolls its own content */}\n <StationDetailPanel\n role={selectedRoleDetail}\n allMetrics={fragmentMetrics}\n orderedRoles={ordered.map((o) => o.role)}\n globalPeriod={period}\n onClose={() => setSelectedRole(null)}\n />\n </div>\n\n {/* Bottom row: sized to its rows up to 45vh — header sticky, rows scroll */}\n <div className=\"max-h-[45vh] flex-none flex flex-col border-t border-surface-border overflow-hidden\">\n <TableHead />\n <div className=\"flex-1 min-h-0 overflow-y-auto divide-y divide-surface-border/30\">\n {ordered.map(({ role }) => (\n <StationRow\n key={role.role}\n role={role}\n metric={metrics.find((m) => m.role === role.role)}\n selected={selectedRole === role.role}\n onClick={() => handleSelect(role.role)}\n />\n ))}\n </div>\n </div>\n\n </div>\n )}\n </div>\n );\n}\n"],"names":["W","H","ML","MR","MT","MB","chartW","chartH","bottom","right","EASE","SOLO_HALF","soloSegment","p","linePath","pts","i","catmullPath","segs","p0","p1","p2","p3","cp1x","cp1y","cp2x","cp2y","bandPath","upper","lower","forward","rev","back","backSegs","compact","n","last","a","ACTIVE_COLOR","QUEUED_COLOR","RESOLVED_COLOR","TARGET_COLOR","PRIORITY_COLOR","PRIORITY_TEXT_COLOR","MIN_GAP","spreadLabels","labels","maxY","sorted","b","prev","placed","l","labelY","overflow","PaceChart","stations","selectedRole","onSelect","onUpstreamSelect","onPrioritySelect","periodHours","hoveredIdx","setHoveredIdx","useState","xOf","xMap","rows","target","expected","_a","_b","_c","_d","hasTargets","r","maxVal","yScale","v","withTarget","targetPts","actualPts","activePts","pendingPts","targetLinePath","actualSplinePath","activeSplinePath","pendingSplinePath","lastActual","lastTarget","lastActive","lastPending","areaPath","hasQueue","workedBandPath","queuedBandPath","showActiveLabel","showQueuedLabel","endLabels","px","cx","jsx","tp","ap","ar","hasWaiting","pendingLabelY","row","s","x","cy","isSelected","isHovered","tooltip","tipW","tipX","tipY","jsxs","e","priorityQueueLink","role","base","orderBy","PERIODS","isPeriod","fmt","min","MetricRow","label","value","PeriodSelector","period","onChange","RoleView","globalPeriod","onClose","setPeriod","data","useStationMetrics","metric","slaMinutes","targetPerHour","workerCount","Fragment","X","Link","ExternalLink","OverviewPanel","allMetrics","orderedRoles","totalPending","m","totalResolved","totalPriority","metricByRole","stationsAtRisk","stationsWithLoad","pending","claimed","resolved","priorityCount","hasAlert","hasLoad","StationDetailPanel","TARGET_BAND","PENDING_BAND","ACTIVE_BAND","RESOLVED_BAND","PERIOD_HOURS","buildFragments","roles","opsRoles","roleMap","visited","fragments","root","queue","item","c","fmtMin","loadBar","ratio","pct","color","StationRow","selected","onClick","barWidth","GitMerge","TableHead","cols","col","OperationsPage","setSelectedRole","refreshing","setRefreshing","useStationMetricsEvents","roleData","rolesLoading","refetchRoles","useRoleDetails","metricsData","metricsLoading","refetchMetrics","metrics","useMemo","searchParams","setSearchParams","useSearchParams","fragmentParam","activeFragment","f","selectFragment","useCallback","origin","ordered","fragmentRoleSet","fragmentMetrics","chartStations","handleUpstreamSelect","upstreamRole","navigate","useNavigate","handlePrioritySelect","roleName","detail","selectedRoleDetail","isLoading","handleRefresh","handleSelect","periodSelector","PageHeader","RefreshCw","isActive","o"],"mappings":"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"}
|
package/dashboard/dist/assets/{OperatorDashboard-DMQwodfo.js → OperatorDashboard-D-UMrTqI.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as s}from"./vendor-query-B2UbickB.js";import{j as v,w as C,r as L,t as R}from"./index-
|
|
2
|
-
//# sourceMappingURL=OperatorDashboard-
|
|
1
|
+
import{j as s}from"./vendor-query-B2UbickB.js";import{j as v,w as C,r as L,t as R}from"./index-C8k3Z2su.js";import{f as F}from"./useEventHooks-Dpixlgp-.js";import{u as N}from"./roles-D8lPvFgG.js";import{u as T}from"./useFilterParams-x-Dg0Vgz.js";import{u as _}from"./useDebouncedValue-BA5S7V54.js";import{b as k}from"./api-path-u2Jf9QXS.js";import{D as w}from"./DataTable-ZWgVQg7F.js";import{P as z}from"./PageHeader-DJo7yMUR.js";import{S as A}from"./StickyPagination-3eCY2-_V.js";import{R as M,a as O}from"./RowActions-BA9L9djf.js";import{a as I,T as U,E as q}from"./escalation-columns-DajPgfuV.js";import{L as D}from"./ListToolbar-d4MGQefV.js";import{a5 as $}from"./vendor-icons-DOIDKgo6.js";import{c as B}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";import"./FilterBar-B4Mk2PvT.js";import"./PriorityBadge-B4ykBH7f.js";import"./RolePill-DHWixsQR.js";import"./WorkflowPill-BtNBSplz.js";import"./escalation-C0BNAeIG.js";function pe(){F();const d=B(),{user:i}=v(),{filters:t,setFilter:u,pagination:e,sort:n,setSort:g}=T({filters:{role:"",type:"",priority:"",search:""}}),f=_(t.search,300),x=C(),{data:l}=N(),{data:c}=L(),m={assigned_to:i==null?void 0:i.userId,status:"pending",role:t.role||void 0,type:t.type||void 0,priority:t.priority?parseInt(t.priority):void 0,search:f||void 0,sort_by:n.sort_by||"created_at",order:n.order||"desc"},{data:o,isLoading:y,error:r,refetch:h,isFetching:b}=R({...m,limit:e.pageSize,offset:e.offset}),S=(o==null?void 0:o.escalations)??[],p=(o==null?void 0:o.total)??0,E=k("/escalations",{...m,limit:e.pageSize,offset:e.offset}),P={key:"actions",label:"",render:a=>s.jsx(M,{children:s.jsx(O,{icon:$,title:"Release escalation",onClick:()=>x.mutate(a.id),colorClass:"text-text-tertiary hover:text-status-warning"})}),className:"w-16 text-right"},j=[U,...q,P];return s.jsxs("div",{children:[s.jsx(z,{title:"My Escalations"}),s.jsx(I,{filters:t,setFilter:u,roles:(l==null?void 0:l.roles)??[],types:(c==null?void 0:c.types)??[],actions:s.jsx(D,{onRefresh:()=>h(),isFetching:b,apiPath:E})}),r&&s.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:r.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${r.message}`}),s.jsx(w,{columns:j,data:S,keyFn:a=>a.id,onRowClick:a=>d(`/escalations/detail/${a.id}`,{state:{from:"/escalations/queue"}}),isLoading:y,emptyMessage:r?"Unable to load data":"No assigned escalations",sort:n,onSort:g}),s.jsx(A,{page:e.page,totalPages:e.totalPages(p),onPageChange:e.setPage,total:p,pageSize:e.pageSize,onPageSizeChange:e.setPageSize})]})}export{pe as OperatorDashboard};
|
|
2
|
+
//# sourceMappingURL=OperatorDashboard-D-UMrTqI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperatorDashboard-
|
|
1
|
+
{"version":3,"file":"OperatorDashboard-D-UMrTqI.js","sources":["../../src/pages/operator/OperatorDashboard.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { LockOpen } from 'lucide-react';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalations, useEscalationTypes, useReleaseEscalation } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useDebouncedValue } from '../../hooks/useDebouncedValue';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ESCALATION_COLUMNS, TIME_LEFT_COLUMN, EscalationFilterBar } from './escalation-columns';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function OperatorDashboard() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { user } = useAuth();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '', search: '' },\n });\n // Debounce so server-side search fires once the user pauses, not per keystroke.\n const debouncedSearch = useDebouncedValue(filters.search, 300);\n const release = useReleaseEscalation();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n const escalationQuery = {\n assigned_to: user?.userId,\n status: 'pending',\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n search: debouncedSearch || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n };\n\n const { data, isLoading, error: queryError, refetch, isFetching } = useEscalations({\n ...escalationQuery,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n // Search is server-side (full result set) — results and total come straight\n // from the query, no client-side filtering of the current page.\n const activeClaims = data?.escalations ?? [];\n const total = data?.total ?? 0;\n\n // Copy-URL/curl path built from the SAME params the query sends.\n const apiPath = buildApiPath('/escalations', {\n ...escalationQuery,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const releaseColumn: Column<LTEscalationRecord> = {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={LockOpen}\n title=\"Release escalation\"\n onClick={() => release.mutate(row.id)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n };\n\n // Time-left first (aligns with checkbox on All Escalations), then summary + base columns + actions\n const columns: Column<LTEscalationRecord>[] = [\n TIME_LEFT_COLUMN,\n ...ESCALATION_COLUMNS,\n releaseColumn,\n ];\n\n return (\n <div>\n <PageHeader title=\"My Escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={apiPath}\n />\n }\n />\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={activeClaims}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/queue' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No assigned escalations'}\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":["OperatorDashboard","useEscalationListEvents","navigate","useNavigate","user","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","debouncedSearch","useDebouncedValue","release","useReleaseEscalation","rolesData","useRoles","typesData","useEscalationTypes","escalationQuery","data","isLoading","queryError","refetch","isFetching","useEscalations","activeClaims","total","apiPath","buildApiPath","releaseColumn","row","jsx","RowActionGroup","RowAction","LockOpen","columns","TIME_LEFT_COLUMN","ESCALATION_COLUMNS","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination"],"mappings":"66BAiBO,SAASA,IAAoB,CAClCC,EAAA,EACA,MAAMC,EAAWC,EAAA,EACX,CAAE,KAAAC,CAAA,EAASC,EAAA,EACX,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACxE,QAAS,CAAE,KAAM,GAAI,KAAM,GAAI,SAAU,GAAI,OAAQ,EAAA,CAAG,CACzD,EAEKC,EAAkBC,EAAkBP,EAAQ,OAAQ,GAAG,EACvDQ,EAAUC,EAAA,EACV,CAAE,KAAMC,CAAA,EAAcC,EAAA,EACtB,CAAE,KAAMC,CAAA,EAAcC,EAAA,EAEtBC,EAAkB,CACtB,YAAahB,GAAA,YAAAA,EAAM,OACnB,OAAQ,UACR,KAAME,EAAQ,MAAQ,OACtB,KAAMA,EAAQ,MAAQ,OACtB,SAAUA,EAAQ,SAAW,SAASA,EAAQ,QAAQ,EAAI,OAC1D,OAAQM,GAAmB,OAC3B,QAASH,EAAK,SAAW,aACzB,MAAOA,EAAK,OAAS,MAAA,EAGjB,CAAE,KAAAY,EAAM,UAAAC,EAAW,MAAOC,EAAY,QAAAC,EAAS,WAAAC,CAAA,EAAeC,EAAe,CACjF,GAAGN,EACH,MAAOZ,EAAW,SAClB,OAAQA,EAAW,MAAA,CACpB,EAIKmB,GAAeN,GAAA,YAAAA,EAAM,cAAe,CAAA,EACpCO,GAAQP,GAAA,YAAAA,EAAM,QAAS,EAGvBQ,EAAUC,EAAa,eAAgB,CAC3C,GAAGV,EACH,MAAOZ,EAAW,SAClB,OAAQA,EAAW,MAAA,CACpB,EAEKuB,EAA4C,CAChD,IAAK,UACL,MAAO,GACP,OAASC,GACPC,EAAAA,IAACC,EAAA,CACC,SAAAD,EAAAA,IAACE,EAAA,CACC,KAAMC,EACN,MAAM,qBACN,QAAS,IAAMtB,EAAQ,OAAOkB,EAAI,EAAE,EACpC,WAAW,8CAAA,CAAA,EAEf,EAEF,UAAW,iBAAA,EAIPK,EAAwC,CAC5CC,EACA,GAAGC,EACHR,CAAA,EAGF,cACG,MAAA,CACC,SAAA,CAAAE,EAAAA,IAACO,EAAA,CAAW,MAAM,gBAAA,CAAiB,EAEnCP,EAAAA,IAACQ,EAAA,CACC,QAAAnC,EACA,UAAAC,EACA,OAAOS,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,OAAOE,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,QACEe,EAAAA,IAACS,EAAA,CACC,UAAW,IAAMlB,EAAA,EACjB,WAAAC,EACA,QAAAI,CAAA,CAAA,CACF,CAAA,EAIHN,GACCU,EAAAA,IAAC,MAAA,CAAI,UAAU,uGACX,SAAAV,EAAqB,UAAY,kBAC/B,iDACA,+BAAgCA,EAAqB,OAAO,GAClE,EAGFU,EAAAA,IAACU,EAAA,CACC,QAAAN,EACA,KAAMV,EACN,MAAQK,GAAQA,EAAI,GACpB,WAAaA,GAAQ9B,EAAS,uBAAuB8B,EAAI,EAAE,GAAI,CAAE,MAAO,CAAE,KAAM,oBAAA,EAAwB,EACxG,UAAAV,EACA,aAAcC,EAAa,sBAAwB,0BACnD,KAAAd,EACA,OAAQC,CAAA,CAAA,EAGVuB,EAAAA,IAACW,EAAA,CACC,KAAMpC,EAAW,KACjB,WAAYA,EAAW,WAAWoB,CAAK,EACvC,aAAcpB,EAAW,QACzB,MAAAoB,EACA,SAAUpB,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-
|
|
2
|
-
//# sourceMappingURL=PageHeader-
|
|
1
|
+
import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-DOIDKgo6.js";function x({title:i,actions:t,center:s,docsHash:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-10",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary",children:i}),a&&e.jsx("button",{onClick:()=>{window.location.hash=a},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Open docs for this page",children:e.jsx(r,{className:"w-4 h-4",strokeWidth:1.5})})]}),s,t&&e.jsx("div",{className:`flex items-center gap-3 ${s?"flex-1 justify-end":""}`,children:t})]})}export{x as P};
|
|
2
|
+
//# sourceMappingURL=PageHeader-DJo7yMUR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeader-
|
|
1
|
+
{"version":3,"file":"PageHeader-DJo7yMUR.js","sources":["../../src/components/common/layout/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { BookOpen } from 'lucide-react';\n\ninterface PageHeaderProps {\n title: string;\n actions?: ReactNode;\n /** Optional element centered between the title and the actions (e.g. a sparkline). */\n center?: ReactNode;\n /** Hash link to open the docs drawer to a specific section, e.g. \"#docs=dashboard.md#workflow-registry\" */\n docsHash?: string;\n}\n\nexport function PageHeader({ title, actions, center, docsHash }: PageHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 mb-10\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <h1 className=\"text-3xl font-light text-text-primary\">{title}</h1>\n {docsHash && (\n <button\n onClick={() => { window.location.hash = docsHash; }}\n className=\"text-text-quaternary hover:text-accent transition-colors mt-1\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n {center}\n {actions && (\n <div className={`flex items-center gap-3 ${center ? 'flex-1 justify-end' : ''}`}>{actions}</div>\n )}\n </div>\n );\n}\n"],"names":["PageHeader","title","actions","center","docsHash","jsxs","jsx","BookOpen"],"mappings":"8FAYO,SAASA,EAAW,CAAE,MAAAC,EAAO,QAAAC,EAAS,OAAAC,EAAQ,SAAAC,GAA6B,CAChF,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCAAyC,SAAAL,EAAM,EAC5DG,GACCE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE,OAAO,SAAS,KAAOF,CAAU,EAClD,UAAU,gEACV,MAAM,0BAEN,SAAAE,EAAAA,IAACC,EAAA,CAAS,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAClD,EAEJ,EACCJ,EACAD,SACE,MAAA,CAAI,UAAW,2BAA2BC,EAAS,qBAAuB,EAAE,GAAK,SAAAD,CAAA,CAAQ,CAAA,EAE9F,CAEJ"}
|
package/dashboard/dist/assets/{PageHeaderWithStats-CcVAji-7.js → PageHeaderWithStats-W3akV6nB.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-
|
|
2
|
-
//# sourceMappingURL=PageHeaderWithStats-
|
|
1
|
+
import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-DOIDKgo6.js";function m({title:n,subtitle:a,stats:s,actions:l,docsHash:i}){return e.jsxs("div",{className:"flex items-baseline justify-between mb-10",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary",children:n}),i&&e.jsx("button",{onClick:()=>{window.location.hash=i},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Open docs for this page",children:e.jsx(r,{className:"w-4 h-4",strokeWidth:1.5})})]}),a&&e.jsx("span",{className:"text-sm text-text-tertiary font-light",children:a})]}),e.jsxs("div",{className:"flex items-center gap-5",children:[s==null?void 0:s.map(t=>e.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-text-tertiary",children:[t.dotClass&&e.jsx("span",{className:`w-1.5 h-1.5 rounded-full dot-ring ${t.dotClass}`}),e.jsx("span",{children:t.label}),e.jsx("span",{className:"font-medium text-text-secondary",children:t.value})]},t.label)),l&&e.jsx("div",{className:"flex items-center gap-3",children:l})]})]})}export{m as P};
|
|
2
|
+
//# sourceMappingURL=PageHeaderWithStats-W3akV6nB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeaderWithStats-
|
|
1
|
+
{"version":3,"file":"PageHeaderWithStats-W3akV6nB.js","sources":["../../src/components/common/layout/PageHeaderWithStats.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { BookOpen } from 'lucide-react';\n\nexport interface InlineStat {\n label: string;\n value: string | number;\n dotClass?: string;\n}\n\ninterface PageHeaderWithStatsProps {\n title: string;\n subtitle?: string;\n stats?: InlineStat[];\n actions?: ReactNode;\n docsHash?: string;\n}\n\nexport function PageHeaderWithStats({\n title,\n subtitle,\n stats,\n actions,\n docsHash,\n}: PageHeaderWithStatsProps) {\n return (\n <div className=\"flex items-baseline justify-between mb-10\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-3xl font-light text-text-primary\">{title}</h1>\n {docsHash && (\n <button\n onClick={() => { window.location.hash = docsHash; }}\n className=\"text-text-quaternary hover:text-accent transition-colors mt-1\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n {subtitle && (\n <span className=\"text-sm text-text-tertiary font-light\">{subtitle}</span>\n )}\n </div>\n <div className=\"flex items-center gap-5\">\n {stats?.map((s) => (\n <div key={s.label} className=\"flex items-center gap-1.5 text-xs text-text-tertiary\">\n {s.dotClass && <span className={`w-1.5 h-1.5 rounded-full dot-ring ${s.dotClass}`} />}\n <span>{s.label}</span>\n <span className=\"font-medium text-text-secondary\">{s.value}</span>\n </div>\n ))}\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n </div>\n );\n}\n"],"names":["PageHeaderWithStats","title","subtitle","stats","actions","docsHash","jsxs","jsx","BookOpen","s"],"mappings":"8FAiBO,SAASA,EAAoB,CAClC,MAAAC,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,CACF,EAA6B,CAC3B,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCAAyC,SAAAN,EAAM,EAC5DI,GACCE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE,OAAO,SAAS,KAAOF,CAAU,EAClD,UAAU,gEACV,MAAM,0BAEN,SAAAE,EAAAA,IAACC,EAAA,CAAS,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAClD,EAEJ,EACCN,GACCK,EAAAA,IAAC,OAAA,CAAK,UAAU,wCAAyC,SAAAL,CAAA,CAAS,CAAA,EAEtE,EACAI,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAAH,GAAA,YAAAA,EAAO,IAAKM,GACXH,EAAAA,KAAC,MAAA,CAAkB,UAAU,uDAC1B,SAAA,CAAAG,EAAE,UAAYF,MAAC,OAAA,CAAK,UAAW,qCAAqCE,EAAE,QAAQ,GAAI,EACnFF,EAAAA,IAAC,OAAA,CAAM,SAAAE,EAAE,KAAA,CAAM,EACfF,EAAAA,IAAC,OAAA,CAAK,UAAU,kCAAmC,WAAE,KAAA,CAAM,CAAA,GAHnDE,EAAE,KAIZ,GAEDL,GAAWG,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAH,CAAA,CAAQ,CAAA,CAAA,CAChE,CAAA,EACF,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as b,j as e}from"./vendor-query-B2UbickB.js";import{a as z}from"./tasks-BWHakSYf.js";import{a as V}from"./useEventHooks-Dpixlgp-.js";import{D as S,f as L,C as J,u as q,a as G,J as P,S as T}from"./index-C8k3Z2su.js";import{P as K}from"./PageHeaderWithStats-W3akV6nB.js";import{S as W}from"./StatusBadge-DZ9137bI.js";import{W as Q}from"./WorkflowPill-BtNBSplz.js";import{T as y}from"./TimestampCell-CDR6cTyq.js";import{L as D,e as X}from"./vendor-react-CXumBFUA.js";import{R as Y}from"./RolePill-DHWixsQR.js";import{U as Z}from"./UserName-CRE7EZPU.js";import"./vendor-icons-DOIDKgo6.js";import"./users-B_LVbnUk.js";const ee="bg-stripes animate-pulse opacity-70";function $(t){switch(t){case"completed":return"text-status-success";case"in_progress":case"pending":return"text-status-warning";case"needs_intervention":return"text-status-error";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function I(t){switch(t){case"resolved":return"text-status-success";case"pending":return"text-status-warning";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function te(t,a,l){return`${t==="task"?"Task":l?"Notification":"Escalation"} is ${a.replace(/_/g," ")}`}function se(t,a){if(a)return ee;switch(t){case"completed":case"resolved":return"bg-status-success";case"pending":case"in_progress":case"needs_intervention":return"bg-status-warning";case"cancelled":return"bg-status-error";default:return"bg-text-tertiary"}}function ae(t){return t.startsWith("mcp")||t.startsWith("Mcp")}function E(t){return!t.workflow_type}function A(t,a){if(t.length<=a)return t;const l=Math.floor((a-1)/2);return`${t.slice(0,l)}…${t.slice(t.length-l)}`}function ne(t,a){const l=Date.now(),c=new Map,x=[];for(const s of a)s.task_id?(c.has(s.task_id)||c.set(s.task_id,[]),c.get(s.task_id).push(s)):x.push(s);const r=[...t].sort((s,d)=>new Date(s.created_at).getTime()-new Date(d.created_at).getTime()),i=[];for(const s of t)i.push(new Date(s.created_at).getTime()),s.completed_at&&i.push(new Date(s.completed_at).getTime());for(const s of a)i.push(new Date(s.created_at).getTime()),s.resolved_at&&i.push(new Date(s.resolved_at).getTime()),s.claimed_at&&i.push(new Date(s.claimed_at).getTime());if(i.length===0)return{lanes:[],timeMin:0,timeMax:1};const o=Math.min(...i),f=t.some(s=>!s.completed_at)||a.some(s=>!s.resolved_at)?Math.max(l,Math.max(...i)):Math.max(...i),p=f-o||1,m=s=>(s-o)/p*100,h=[];for(const s of r){const d=new Date(s.created_at).getTime(),j=s.completed_at?new Date(s.completed_at).getTime():l,g=!s.completed_at;h.push({kind:"task",id:s.id,label:s.workflow_type,taskId:s.id,startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:g,task:s});const v=(c.get(s.id)||[]).sort((n,u)=>new Date(n.created_at).getTime()-new Date(u.created_at).getTime());for(const n of v){const u=new Date(n.created_at).getTime(),N=n.resolved_at?new Date(n.resolved_at).getTime():l,M=!n.resolved_at;let w=null;if(n.claimed_at){const U=new Date(n.claimed_at).getTime(),H=N-u||1;w=(U-u)/H*100}h.push({kind:"escalation",id:n.id,label:n.role,taskId:s.id,startMs:u,endMs:N,startPct:m(u),widthPct:Math.max((N-u)/p*100,.5),durationMs:N-u,isOpen:M,escalation:n,claimPct:w})}}for(const s of x){const d=new Date(s.created_at).getTime(),j=s.resolved_at?new Date(s.resolved_at).getTime():l;let g=null;if(s.claimed_at){const v=new Date(s.claimed_at).getTime(),n=j-d||1;g=(v-d)/n*100}h.push({kind:"escalation",id:s.id,label:s.role,taskId:"",startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:!s.resolved_at,escalation:s,claimPct:g})}return{lanes:h,timeMin:o,timeMax:f}}function re(t,a,l,c=500){const[x,r]=b.useState(0),i=b.useRef(null),o=l-a||1;b.useEffect(()=>{if(t===0)return;i.current=null,r(0);let f;const p=m=>{i.current===null&&(i.current=m);const h=m-i.current,s=Math.min(h/c,1),d=1-Math.pow(1-s,3);r(d),s<1&&(f=requestAnimationFrame(p))};return f=requestAnimationFrame(p),()=>cancelAnimationFrame(f)},[t,c]);const k=b.useCallback(f=>{const p=(f.startMs-a)/o,m=(f.endMs-a)/o;if(x<p)return{width:0,opacity:0};const h=m-p||.001,s=Math.min((x-p)/h,1),d=f.widthPct*s,j=Math.min(s/.1,1);return{width:d,opacity:j}},[x,a,o]);return{progress:x,animatedBar:k}}function R({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"})})}function B({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z"})})}function O({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})})}function F({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}function ie({allExpanded:t,onToggleAll:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[e.jsx("button",{onClick:a,className:"text-[10px] text-accent hover:underline",children:t?"Collapse all":"Expand all"}),e.jsxs("div",{className:"flex items-center gap-4 ml-auto",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(R,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"AI Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Escalation"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(O,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Notification"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full dot-ring bg-status-success"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Done"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full dot-ring bg-status-warning"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Active"})]})]})]})}function oe({ticks:t}){return e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:"w-52 shrink-0"}),e.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:t.map(a=>e.jsx("span",{className:"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1 whitespace-nowrap",style:{left:`${a.pct}%`},children:a.label},a.pct))})]})}function _({label:t,children:a}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:t}),e.jsx("div",{className:"text-xs text-text-primary",children:a})]})}function le({traceId:t,href:a}){const[l,c]=b.useState(!1),x=i=>{i.stopPropagation(),navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),1500)},r=i=>{i.stopPropagation(),a&&window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("span",{className:"group/trace inline-flex items-center gap-1.5",children:[a&&e.jsx("button",{onClick:r,title:"Open trace",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15"})})}),e.jsx("button",{onClick:x,title:"Copy trace ID",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:`w-3 h-3 transition-colors ${l?"text-status-success":"text-text-tertiary hover:text-accent"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:l?e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),e.jsx("span",{className:"text-[11px] text-accent",children:"Trace Details"})]})}function ce({task:t,traceUrl:a}){const l=t.completed_at?new Date(t.completed_at).getTime()-new Date(t.created_at).getTime():Date.now()-new Date(t.created_at).getTime();return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Q,{type:t.workflow_type})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Started",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Completed",children:t.completed_at?e.jsx(y,{date:t.completed_at}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"In progress"})}),e.jsx(_,{label:"Duration",children:e.jsx(S,{ms:l,className:"font-mono text-sm"})})]}),t.milestones.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Milestones"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.milestones.map((c,x)=>e.jsxs("span",{className:"px-2 py-0.5 text-[10px] font-mono bg-accent-faint/50 rounded text-text-secondary",children:[c.name,": ",String(c.value)]},x))})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-[11px] text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/workflows/tasks/detail/${t.id}`,className:"block text-[11px] text-accent hover:underline",children:"Task Details"}),t.trace_id&&e.jsx(le,{traceId:t.trace_id,href:a?a.replace("{traceId}",t.trace_id):void 0})]})]})}function de({escalation:t}){const a=new Date(t.created_at).getTime(),l=t.claimed_at?new Date(t.claimed_at).getTime()-a:null,c=t.resolved_at?new Date(t.resolved_at).getTime()-a:null;return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Y,{role:t.role}),t.type&&e.jsxs("span",{className:"text-[10px] text-text-tertiary",children:[t.type,t.subtype?` / ${t.subtype}`:""]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Created",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Claimed",children:t.claimed_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.claimed_at}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:["after ",e.jsx(S,{ms:l}),t.assigned_to&&e.jsxs(e.Fragment,{children:[" ","by"," ",e.jsx("span",{className:"text-text-secondary font-medium",children:e.jsx(Z,{userId:t.assigned_to})})]})]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Unclaimed"})}),e.jsx(_,{label:"Resolved",children:t.resolved_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.resolved_at}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:[e.jsx(S,{ms:c})," total"]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Pending"})})]}),t.description&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("p",{className:"text-[11px] text-text-secondary leading-relaxed",children:t.description})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[t.workflow_id&&e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-[11px] text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/escalations/detail/${t.id}`,className:"block text-[11px] text-accent hover:underline",children:"Escalation Details"})]})]})}function xe({lane:t,ticks:a,isExpanded:l,onToggle:c,anim:x,animDone:r,traceUrl:i}){var m,h;const o=t.kind==="task",k=o?t.task.status:t.escalation.status,f=se(k,t.isOpen),p=x.opacity>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors",onClick:c,children:[e.jsxs("div",{className:`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${o?"":"pl-6"}`,style:{opacity:p?1:0,transition:"opacity 0.15s ease-out"},children:[o?ae(t.task.workflow_type)?e.jsx(B,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):e.jsx(R,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):E(t.escalation)?e.jsx(O,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}):e.jsx(F,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}),e.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:te(t.kind,o?t.task.status:t.escalation.status,!o&&E(t.escalation)),children:o?A(t.label,24):A(((m=t.escalation)==null?void 0:m.role)??t.label,20)})]}),e.jsxs("div",{className:"flex-1 relative h-10",children:[a.map(s=>e.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${s.pct}%`}},s.pct)),e.jsxs("div",{className:`absolute top-2 h-6 rounded-sm ${l?`${f} ring-2 ring-accent ring-offset-1`:`${f} hover:opacity-80`}`,style:{left:`${t.startPct}%`,width:p?`${Math.max(x.width,.3)}%`:"0%",minWidth:p?"4px":"0px",opacity:x.opacity},title:`${t.label} — ${L(t.durationMs)} — ${new Date(t.startMs).toLocaleTimeString()}`,children:[x.width>8&&r&&e.jsx("span",{className:"absolute inset-0 flex items-center px-1.5 text-[9px] font-mono text-white truncate",children:L(t.durationMs)}),t.claimPct!=null&&r&&e.jsx("div",{className:"absolute top-0 bottom-0 w-px border-l border-dashed border-white/70",style:{left:`${t.claimPct}%`},title:(h=t.escalation)!=null&&h.assigned_to?`Claimed by ${t.escalation.assigned_to}`:"Claimed",children:e.jsx("div",{className:"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-white border border-status-warning"})})]})]})]}),e.jsx(J,{open:l,children:e.jsx("div",{className:"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20",children:o&&t.task?e.jsx(ce,{task:t.task,traceUrl:i}):t.escalation?e.jsx(de,{escalation:t.escalation}):null})})]})}function me({tasks:t,escalations:a,traceUrl:l}){const[c,x]=b.useState(new Set),{lanes:r,timeMin:i,timeMax:o}=b.useMemo(()=>ne(t,a),[t,a]),k=o-i||1,{progress:f,animatedBar:p}=re(r.length,i,o);if(r.length===0)return e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No events in this process."});const m=5,h=Array.from({length:m+1},(n,u)=>({pct:u/m*100,label:L(Math.round(u/m*k))})),s=n=>{x(u=>{const N=new Set(u);return N.has(n)?N.delete(n):N.add(n),N})},d=r.map(n=>n.id),j=d.length>0&&d.every(n=>c.has(n)),g=()=>{x(j?new Set:new Set(d))},v=f>=1;return e.jsxs("div",{className:"py-2",children:[e.jsx(ie,{allExpanded:j,onToggleAll:g}),e.jsx(oe,{ticks:h}),r.map(n=>e.jsx(xe,{lane:n,ticks:h,isExpanded:c.has(n.id),onToggle:()=>s(n.id),anim:p(n),animDone:v,traceUrl:l},`${n.kind}-${n.id}`))]})}function C(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function ue(t){return t.length===0?null:[...t].sort((a,l)=>new Date(a.created_at).getTime()-new Date(l.created_at).getTime())[0]}function De(){var j;const{originId:t}=X();V(t);const{data:a,isLoading:l}=z(t??""),{data:c}=q(),x=((j=c==null?void 0:c.telemetry)==null?void 0:j.traceUrl)??null,r=(a==null?void 0:a.tasks)??[],i=(a==null?void 0:a.escalations)??[],o=b.useMemo(()=>ue(r),[r]),k=b.useMemo(()=>C(o==null?void 0:o.envelope),[o]),f=b.useMemo(()=>{if(o!=null&&o.data)return C(o.data);const g=r.filter(v=>v.status==="completed"&&v.data).sort((v,n)=>new Date(n.completed_at).getTime()-new Date(v.completed_at).getTime());return g.length>0?C(g[0].data):null},[o,r]),p=b.useMemo(()=>r.length>0&&r.some(g=>g.status!=="completed"&&g.status!=="cancelled"),[r]),m=b.useMemo(()=>{const g=r.filter(u=>u.status==="completed").length,v=r.filter(u=>u.status==="needs_intervention").length,n=i.filter(u=>u.status==="resolved").length;return{tasks:r.length,completed:g,escalated:v,escalations:i.length,resolved:n}},[r,i]),h=b.useMemo(()=>{if(r.length===0&&i.length===0)return null;const v=[...r.map(w=>w.created_at),...i.map(w=>w.created_at)].sort()[0],n=r.every(w=>w.status==="completed"||w.status==="cancelled"),u=i.every(w=>w.status==="resolved"),N=r.length>0&&n&&u,M=N?[...r.map(w=>w.completed_at),...i.map(w=>w.resolved_at)].filter(Boolean).sort().pop()??null:null;return{startIso:v,endIso:M,isFinished:N,elapsed:G(v,M)}},[r,i]),s=b.useMemo(()=>{const g=[];return h&&g.push({label:h.isFinished?"Completed":"Running",value:h.elapsed,dotClass:h.isFinished?"bg-status-success":"bg-status-pending animate-pulse"}),g.push({label:"Tasks",value:`${m.completed}/${m.tasks}`},{label:"Escalations",value:`${m.resolved}/${m.escalations}`}),g},[h,m]);if(l&&r.length===0)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});const d=k||f||p;return e.jsxs("div",{children:[e.jsx(K,{title:"Process Detail",docsHash:"#docs:dashboard.md:process-detail",subtitle:t,stats:s}),d&&e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-10",children:[e.jsx("div",{children:k?e.jsx(P,{data:k,label:"Input",defaultMode:"json",defaultCollapsed:!0}):e.jsxs("div",{children:[e.jsx(T,{children:"Input"}),e.jsx("div",{className:"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2",children:"Waiting for task..."})]})}),e.jsx("div",{children:f?e.jsx(P,{data:f,label:"Output",defaultMode:"json",defaultCollapsed:!0}):p?e.jsxs("div",{children:[e.jsx(T,{children:"Output"}),e.jsxs("div",{className:"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full dot-ring bg-status-pending animate-pulse"}),"Processing..."]})]}):null})]}),e.jsx(T,{className:"mb-6",children:"Timeline"}),e.jsx(me,{tasks:r,escalations:i,traceUrl:x})]})}export{De as ProcessDetailPage};
|
|
2
|
+
//# sourceMappingURL=ProcessDetailPage-BV6D_wuR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessDetailPage-BV6D_wuR.js","sources":["../../src/pages/processes/process-swimlane/helpers.ts","../../src/pages/processes/process-swimlane/useTimelineAnimation.ts","../../src/pages/processes/process-swimlane/SwimlaneIcons.tsx","../../src/pages/processes/process-swimlane/SwimlaneHeader.tsx","../../src/pages/processes/process-swimlane/TimeAxis.tsx","../../src/pages/processes/process-swimlane/MetricCell.tsx","../../src/pages/processes/process-swimlane/TraceLink.tsx","../../src/pages/processes/process-swimlane/TaskDetailPanel.tsx","../../src/pages/processes/process-swimlane/EscalationDetailPanel.tsx","../../src/pages/processes/process-swimlane/SwimlaneRow.tsx","../../src/pages/processes/process-swimlane/ProcessSwimlaneTimeline.tsx","../../src/pages/processes/ProcessDetailPage.tsx"],"sourcesContent":["import type { LTTaskRecord, LTEscalationRecord, LTTaskStatus, LTEscalationStatus } from '../../../api/types';\n\nexport interface ProcessLane {\n kind: 'task' | 'escalation';\n id: string;\n label: string;\n taskId: string;\n startMs: number;\n endMs: number;\n startPct: number;\n widthPct: number;\n durationMs: number;\n isOpen: boolean;\n // task fields\n task?: LTTaskRecord;\n // escalation fields\n escalation?: LTEscalationRecord;\n claimPct?: number | null; // percent position of claim within the bar\n}\n\nexport interface ProcessSwimlaneTimelineProps {\n tasks: LTTaskRecord[];\n escalations: LTEscalationRecord[];\n traceUrl?: string | null;\n}\n\nexport const PENDING_CLASS = 'bg-stripes animate-pulse opacity-70';\n\nexport function taskStatusColor(status: LTTaskStatus): string {\n switch (status) {\n case 'completed': return 'text-status-success';\n case 'in_progress': case 'pending': return 'text-status-warning';\n case 'needs_intervention': return 'text-status-error';\n case 'cancelled': return 'text-text-tertiary';\n default: return 'text-text-tertiary';\n }\n}\n\nexport function escStatusColor(status: LTEscalationStatus): string {\n switch (status) {\n case 'resolved': return 'text-status-success';\n case 'pending': return 'text-status-warning';\n case 'cancelled': return 'text-text-tertiary';\n default: return 'text-text-tertiary';\n }\n}\n\nexport function statusLabel(kind: 'task' | 'escalation', status: string, isAck?: boolean): string {\n const noun = kind === 'task' ? 'Task' : isAck ? 'Notification' : 'Escalation';\n return `${noun} is ${status.replace(/_/g, ' ')}`;\n}\n\nexport function barColorForStatus(status: string, isOpen: boolean): string {\n if (isOpen) return PENDING_CLASS;\n switch (status) {\n case 'completed':\n case 'resolved':\n return 'bg-status-success';\n case 'pending':\n case 'in_progress':\n case 'needs_intervention':\n return 'bg-status-warning';\n case 'cancelled':\n return 'bg-status-error';\n default:\n return 'bg-text-tertiary';\n }\n}\n\nexport function isMcpWorkflow(workflowType: string): boolean {\n return workflowType.startsWith('mcp') || workflowType.startsWith('Mcp');\n}\n\nexport function isAckEscalation(esc: LTEscalationRecord): boolean {\n return !esc.workflow_type;\n}\n\nexport function middleTruncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n const keep = Math.floor((maxLen - 1) / 2);\n return `${str.slice(0, keep)}…${str.slice(str.length - keep)}`;\n}\n\nexport function formatAbsoluteTime(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\n// ── Build lanes from raw task + escalation records ──────────────────────────\n\nexport function buildLanes(\n tasks: LTTaskRecord[],\n escalations: LTEscalationRecord[],\n): { lanes: ProcessLane[]; timeMin: number; timeMax: number } {\n const now = Date.now();\n\n // Group escalations by task_id\n const escByTask = new Map<string, LTEscalationRecord[]>();\n const unlinked: LTEscalationRecord[] = [];\n for (const e of escalations) {\n if (e.task_id) {\n if (!escByTask.has(e.task_id)) escByTask.set(e.task_id, []);\n escByTask.get(e.task_id)!.push(e);\n } else {\n unlinked.push(e);\n }\n }\n\n // Sort tasks by created_at\n const sorted = [...tasks].sort(\n (a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime(),\n );\n\n // Collect all timestamps for axis bounds\n const allTimes: number[] = [];\n for (const t of tasks) {\n allTimes.push(new Date(t.created_at).getTime());\n if (t.completed_at) allTimes.push(new Date(t.completed_at).getTime());\n }\n for (const e of escalations) {\n allTimes.push(new Date(e.created_at).getTime());\n if (e.resolved_at) allTimes.push(new Date(e.resolved_at).getTime());\n if (e.claimed_at) allTimes.push(new Date(e.claimed_at).getTime());\n }\n if (allTimes.length === 0) return { lanes: [], timeMin: 0, timeMax: 1 };\n\n const timeMin = Math.min(...allTimes);\n const hasOpen =\n tasks.some((t) => !t.completed_at) || escalations.some((e) => !e.resolved_at);\n const timeMax = hasOpen ? Math.max(now, Math.max(...allTimes)) : Math.max(...allTimes);\n const span = timeMax - timeMin || 1;\n\n const toPct = (ms: number) => ((ms - timeMin) / span) * 100;\n\n const lanes: ProcessLane[] = [];\n\n for (const task of sorted) {\n const tStart = new Date(task.created_at).getTime();\n const tEnd = task.completed_at ? new Date(task.completed_at).getTime() : now;\n const tOpen = !task.completed_at;\n\n lanes.push({\n kind: 'task',\n id: task.id,\n label: task.workflow_type,\n taskId: task.id,\n startMs: tStart,\n endMs: tEnd,\n startPct: toPct(tStart),\n widthPct: Math.max(((tEnd - tStart) / span) * 100, 0.5),\n durationMs: tEnd - tStart,\n isOpen: tOpen,\n task,\n });\n\n const taskEscs = (escByTask.get(task.id) || []).sort(\n (a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime(),\n );\n for (const esc of taskEscs) {\n const eStart = new Date(esc.created_at).getTime();\n const eEnd = esc.resolved_at ? new Date(esc.resolved_at).getTime() : now;\n const eOpen = !esc.resolved_at;\n\n let claimPct: number | null = null;\n if (esc.claimed_at) {\n const claimMs = new Date(esc.claimed_at).getTime();\n const escSpan = eEnd - eStart || 1;\n claimPct = ((claimMs - eStart) / escSpan) * 100;\n }\n\n lanes.push({\n kind: 'escalation',\n id: esc.id,\n label: esc.role,\n taskId: task.id,\n startMs: eStart,\n endMs: eEnd,\n startPct: toPct(eStart),\n widthPct: Math.max(((eEnd - eStart) / span) * 100, 0.5),\n durationMs: eEnd - eStart,\n isOpen: eOpen,\n escalation: esc,\n claimPct,\n });\n }\n }\n\n // Unlinked escalations at the bottom\n for (const esc of unlinked) {\n const eStart = new Date(esc.created_at).getTime();\n const eEnd = esc.resolved_at ? new Date(esc.resolved_at).getTime() : now;\n let claimPct: number | null = null;\n if (esc.claimed_at) {\n const claimMs = new Date(esc.claimed_at).getTime();\n const escSpan = eEnd - eStart || 1;\n claimPct = ((claimMs - eStart) / escSpan) * 100;\n }\n lanes.push({\n kind: 'escalation',\n id: esc.id,\n label: esc.role,\n taskId: '',\n startMs: eStart,\n endMs: eEnd,\n startPct: toPct(eStart),\n widthPct: Math.max(((eEnd - eStart) / span) * 100, 0.5),\n durationMs: eEnd - eStart,\n isOpen: !esc.resolved_at,\n escalation: esc,\n claimPct,\n });\n }\n\n return { lanes, timeMin, timeMax };\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport type { ProcessLane } from './helpers';\n\nexport interface BarAnim {\n width: number;\n opacity: number;\n}\n\nexport function useTimelineAnimation(\n laneCount: number,\n timeMin: number,\n timeMax: number,\n durationMs = 500,\n) {\n const [progress, setProgress] = useState(0); // 0 → 1\n const startRef = useRef<number | null>(null);\n const totalSpanMs = timeMax - timeMin || 1;\n\n useEffect(() => {\n if (laneCount === 0) return;\n startRef.current = null;\n setProgress(0);\n\n let raf: number;\n const step = (ts: number) => {\n if (startRef.current === null) startRef.current = ts;\n const elapsed = ts - startRef.current;\n const t = Math.min(elapsed / durationMs, 1);\n // ease-out cubic for a smooth deceleration\n const eased = 1 - Math.pow(1 - t, 3);\n setProgress(eased);\n if (t < 1) raf = requestAnimationFrame(step);\n };\n raf = requestAnimationFrame(step);\n return () => cancelAnimationFrame(raf);\n }, [laneCount, durationMs]);\n\n const animatedBar = useCallback(\n (lane: ProcessLane): BarAnim => {\n const appearAt = (lane.startMs - timeMin) / totalSpanMs;\n const doneAt = (lane.endMs - timeMin) / totalSpanMs;\n\n if (progress < appearAt) {\n return { width: 0, opacity: 0 };\n }\n\n const laneSpan = doneAt - appearAt || 0.001;\n const fill = Math.min((progress - appearAt) / laneSpan, 1);\n const animatedWidth = lane.widthPct * fill;\n const fadeIn = Math.min(fill / 0.1, 1);\n\n return { width: animatedWidth, opacity: fadeIn };\n },\n [progress, timeMin, totalSpanMs],\n );\n\n return { progress, animatedBar };\n}\n","export function ClipboardIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\" />\n </svg>\n );\n}\n\n/** Sparkle/AI icon for mcp* system workflows */\nexport function SparkleIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z\" />\n </svg>\n );\n}\n\n/** Bell icon for notification/ACK escalations */\nexport function BellIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n );\n}\n\nexport function UserIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\" />\n </svg>\n );\n}\n","import { ClipboardIcon, SparkleIcon, BellIcon, UserIcon } from './SwimlaneIcons';\n\ninterface SwimlaneHeaderProps {\n allExpanded: boolean;\n onToggleAll: () => void;\n}\n\nexport function SwimlaneHeader({ allExpanded, onToggleAll }: SwimlaneHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 mb-4 flex-wrap\">\n <button onClick={onToggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n\n {/* Legend */}\n <div className=\"flex items-center gap-4 ml-auto\">\n <div className=\"flex items-center gap-1\">\n <ClipboardIcon className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-[9px] text-text-tertiary\">Task</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <SparkleIcon className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-[9px] text-text-tertiary\">AI Task</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <UserIcon className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-[9px] text-text-tertiary\">Escalation</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <BellIcon className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-[9px] text-text-tertiary\">Notification</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"w-2 h-2 rounded-full dot-ring bg-status-success\" />\n <span className=\"text-[9px] text-text-tertiary\">Done</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"w-2 h-2 rounded-full dot-ring bg-status-warning\" />\n <span className=\"text-[9px] text-text-tertiary\">Active</span>\n </div>\n </div>\n </div>\n );\n}\n","export interface Tick {\n pct: number;\n label: string;\n}\n\ninterface TimeAxisProps {\n ticks: Tick[];\n}\n\nexport function TimeAxis({ ticks }: TimeAxisProps) {\n return (\n <div className=\"flex\">\n <div className=\"w-52 shrink-0\" />\n <div className=\"flex-1 relative h-6 border-b border-surface-border\">\n {ticks.map((tick) => (\n <span\n key={tick.pct}\n className=\"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1 whitespace-nowrap\"\n style={{ left: `${tick.pct}%` }}\n >\n {tick.label}\n </span>\n ))}\n </div>\n </div>\n );\n}\n","/** Small labeled metric cell used inside detail panels */\nexport function MetricCell({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">\n {label}\n </p>\n <div className=\"text-xs text-text-primary\">{children}</div>\n </div>\n );\n}\n","import { useState } from 'react';\n\nexport function TraceLink({ traceId, href }: { traceId: string; href?: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(traceId);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const handleNav = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (href) window.open(href, '_blank', 'noopener,noreferrer');\n };\n\n return (\n <span className=\"group/trace inline-flex items-center gap-1.5\">\n {href && (\n <button\n onClick={handleNav}\n title=\"Open trace\"\n className=\"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5\"\n >\n <svg className=\"w-3 h-3 text-text-tertiary hover:text-accent\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15\" />\n </svg>\n </button>\n )}\n <button\n onClick={handleCopy}\n title=\"Copy trace ID\"\n className=\"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5\"\n >\n <svg\n className={`w-3 h-3 transition-colors ${copied ? 'text-status-success' : 'text-text-tertiary hover:text-accent'}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n {copied\n ? <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n : <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3\" />\n }\n </svg>\n </button>\n <span className=\"text-[11px] text-accent\">Trace Details</span>\n </span>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { LTTaskRecord } from '../../../api/types';\nimport { MetricCell } from './MetricCell';\nimport { TraceLink } from './TraceLink';\n\nexport function TaskDetailPanel({\n task,\n traceUrl,\n}: {\n task: LTTaskRecord;\n traceUrl?: string | null;\n}) {\n const elapsed = task.completed_at\n ? new Date(task.completed_at).getTime() - new Date(task.created_at).getTime()\n : Date.now() - new Date(task.created_at).getTime();\n\n return (\n <div className=\"grid grid-cols-[3fr_1fr] gap-6\">\n {/* Left: timing metrics */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <StatusBadge status={task.status} />\n <WorkflowPill type={task.workflow_type} />\n </div>\n\n <div className=\"grid grid-cols-3 gap-4\">\n <MetricCell label=\"Started\">\n <TimestampCell date={task.created_at} />\n </MetricCell>\n\n <MetricCell label=\"Completed\">\n {task.completed_at ? (\n <TimestampCell date={task.completed_at} />\n ) : (\n <span className=\"text-text-tertiary italic text-xs\">In progress</span>\n )}\n </MetricCell>\n\n <MetricCell label=\"Duration\">\n <DurationValue ms={elapsed} className=\"font-mono text-sm\" />\n </MetricCell>\n </div>\n\n {task.milestones.length > 0 && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n Milestones\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {task.milestones.map((m, i) => (\n <span\n key={i}\n className=\"px-2 py-0.5 text-[10px] font-mono bg-accent-faint/50 rounded text-text-secondary\"\n >\n {m.name}: {String(m.value)}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Right: links */}\n <div className=\"flex flex-col items-end gap-2\">\n <Link\n to={`/workflows/executions/${encodeURIComponent(task.workflow_id)}`}\n className=\"block text-[11px] text-accent hover:underline\"\n >\n Execution Details\n </Link>\n <Link\n to={`/workflows/tasks/detail/${task.id}`}\n className=\"block text-[11px] text-accent hover:underline\"\n >\n Task Details\n </Link>\n {task.trace_id && (\n <TraceLink\n traceId={task.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', task.trace_id) : undefined}\n />\n )}\n </div>\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { UserName } from '../../../components/common/display/UserName';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { LTEscalationRecord } from '../../../api/types';\nimport { MetricCell } from './MetricCell';\n\nexport function EscalationDetailPanel({\n escalation,\n}: {\n escalation: LTEscalationRecord;\n}) {\n const created = new Date(escalation.created_at).getTime();\n const claimedMs = escalation.claimed_at\n ? new Date(escalation.claimed_at).getTime() - created\n : null;\n const resolvedMs = escalation.resolved_at\n ? new Date(escalation.resolved_at).getTime() - created\n : null;\n\n return (\n <div className=\"grid grid-cols-[3fr_1fr] gap-6\">\n {/* Left: timing metrics */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <StatusBadge status={escalation.status} />\n <RolePill role={escalation.role} />\n {escalation.type && (\n <span className=\"text-[10px] text-text-tertiary\">\n {escalation.type}\n {escalation.subtype ? ` / ${escalation.subtype}` : ''}\n </span>\n )}\n </div>\n\n <div className=\"grid grid-cols-3 gap-4\">\n <MetricCell label=\"Created\">\n <TimestampCell date={escalation.created_at} />\n </MetricCell>\n\n <MetricCell label=\"Claimed\">\n {escalation.claimed_at ? (\n <>\n <TimestampCell date={escalation.claimed_at} />\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n after <DurationValue ms={claimedMs} />\n {escalation.assigned_to && (\n <>\n {' '}by{' '}\n <span className=\"text-text-secondary font-medium\">\n <UserName userId={escalation.assigned_to} />\n </span>\n </>\n )}\n </p>\n </>\n ) : (\n <span className=\"text-text-tertiary italic text-xs\">Unclaimed</span>\n )}\n </MetricCell>\n\n <MetricCell label=\"Resolved\">\n {escalation.resolved_at ? (\n <>\n <TimestampCell date={escalation.resolved_at} />\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n <DurationValue ms={resolvedMs} /> total\n </p>\n </>\n ) : (\n <span className=\"text-text-tertiary italic text-xs\">Pending</span>\n )}\n </MetricCell>\n </div>\n\n {escalation.description && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </p>\n <p className=\"text-[11px] text-text-secondary leading-relaxed\">\n {escalation.description}\n </p>\n </div>\n )}\n </div>\n\n {/* Right: links */}\n <div className=\"flex flex-col items-end gap-2\">\n {escalation.workflow_id && (\n <Link\n to={`/workflows/executions/${encodeURIComponent(escalation.workflow_id)}`}\n className=\"block text-[11px] text-accent hover:underline\"\n >\n Execution Details\n </Link>\n )}\n <Link\n to={`/escalations/detail/${escalation.id}`}\n className=\"block text-[11px] text-accent hover:underline\"\n >\n Escalation Details\n </Link>\n </div>\n </div>\n );\n}\n","import { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { formatDuration } from '../../../lib/format';\nimport {\n taskStatusColor,\n escStatusColor,\n statusLabel,\n barColorForStatus,\n isMcpWorkflow,\n isAckEscalation,\n middleTruncate,\n} from './helpers';\nimport type { ProcessLane } from './helpers';\nimport type { BarAnim } from './useTimelineAnimation';\nimport type { Tick } from './TimeAxis';\nimport { ClipboardIcon, SparkleIcon, BellIcon, UserIcon } from './SwimlaneIcons';\nimport { TaskDetailPanel } from './TaskDetailPanel';\nimport { EscalationDetailPanel } from './EscalationDetailPanel';\n\ninterface SwimlaneRowProps {\n lane: ProcessLane;\n ticks: Tick[];\n isExpanded: boolean;\n onToggle: () => void;\n anim: BarAnim;\n animDone: boolean;\n traceUrl?: string | null;\n}\n\nexport function SwimlaneRow({\n lane,\n ticks,\n isExpanded,\n onToggle,\n anim,\n animDone,\n traceUrl,\n}: SwimlaneRowProps) {\n const isTask = lane.kind === 'task';\n const status = isTask ? lane.task!.status : lane.escalation!.status;\n const barBase = barColorForStatus(status, lane.isOpen);\n const visible = anim.opacity > 0;\n\n return (\n <div>\n {/* Lane row */}\n <div\n className=\"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors\"\n onClick={onToggle}\n >\n {/* Label column */}\n <div\n className={`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${\n isTask ? '' : 'pl-6'\n }`}\n style={{ opacity: visible ? 1 : 0, transition: 'opacity 0.15s ease-out' }}\n >\n {isTask ? (\n isMcpWorkflow(lane.task!.workflow_type) ? (\n <SparkleIcon\n className={`w-4 h-4 shrink-0 ${taskStatusColor(lane.task!.status)}`}\n />\n ) : (\n <ClipboardIcon\n className={`w-4 h-4 shrink-0 ${taskStatusColor(lane.task!.status)}`}\n />\n )\n ) : isAckEscalation(lane.escalation!) ? (\n <BellIcon\n className={`w-4 h-4 shrink-0 ${escStatusColor(lane.escalation!.status)}`}\n />\n ) : (\n <UserIcon\n className={`w-4 h-4 shrink-0 ${escStatusColor(lane.escalation!.status)}`}\n />\n )}\n <p\n className=\"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden\"\n title={statusLabel(lane.kind, isTask ? lane.task!.status : lane.escalation!.status, !isTask && isAckEscalation(lane.escalation!))}\n >\n {isTask\n ? middleTruncate(lane.label, 24)\n : middleTruncate(lane.escalation?.role ?? lane.label, 20)}\n </p>\n </div>\n\n {/* Bar area */}\n <div className=\"flex-1 relative h-10\">\n {/* Tick gridlines */}\n {ticks.map((tick) => (\n <div\n key={tick.pct}\n className=\"absolute top-0 bottom-0 w-px bg-surface-border opacity-30\"\n style={{ left: `${tick.pct}%` }}\n />\n ))}\n\n {/* Duration bar (animated reveal + grow) */}\n <div\n className={`absolute top-2 h-6 rounded-sm ${\n isExpanded\n ? `${barBase} ring-2 ring-accent ring-offset-1`\n : `${barBase} hover:opacity-80`\n }`}\n style={{\n left: `${lane.startPct}%`,\n width: visible ? `${Math.max(anim.width, 0.3)}%` : '0%',\n minWidth: visible ? '4px' : '0px',\n opacity: anim.opacity,\n }}\n title={`${lane.label} — ${formatDuration(lane.durationMs)} — ${new Date(lane.startMs).toLocaleTimeString()}`}\n >\n {/* Duration text inside bar (show only when fully revealed) */}\n {anim.width > 8 && animDone && (\n <span className=\"absolute inset-0 flex items-center px-1.5 text-[9px] font-mono text-white truncate\">\n {formatDuration(lane.durationMs)}\n </span>\n )}\n\n {/* Claim marker (vertical dashed line) — show after animation */}\n {lane.claimPct != null && animDone && (\n <div\n className=\"absolute top-0 bottom-0 w-px border-l border-dashed border-white/70\"\n style={{ left: `${lane.claimPct}%` }}\n title={\n lane.escalation?.assigned_to\n ? `Claimed by ${lane.escalation.assigned_to}`\n : 'Claimed'\n }\n >\n {/* Claim dot */}\n <div className=\"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-white border border-status-warning\" />\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Expandable detail panel */}\n <Collapsible open={isExpanded}>\n <div className=\"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20\">\n {isTask && lane.task ? (\n <TaskDetailPanel task={lane.task} traceUrl={traceUrl} />\n ) : lane.escalation ? (\n <EscalationDetailPanel escalation={lane.escalation} />\n ) : null}\n </div>\n </Collapsible>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { formatDuration } from '../../../lib/format';\nimport { buildLanes } from './helpers';\nimport type { ProcessSwimlaneTimelineProps } from './helpers';\nimport { useTimelineAnimation } from './useTimelineAnimation';\nimport { SwimlaneHeader } from './SwimlaneHeader';\nimport { TimeAxis } from './TimeAxis';\nimport { SwimlaneRow } from './SwimlaneRow';\n\nexport function ProcessSwimlaneTimeline({\n tasks,\n escalations,\n traceUrl,\n}: ProcessSwimlaneTimelineProps) {\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n\n const { lanes, timeMin, timeMax } = useMemo(\n () => buildLanes(tasks, escalations),\n [tasks, escalations],\n );\n\n const totalSpanMs = timeMax - timeMin || 1;\n const { progress, animatedBar } = useTimelineAnimation(lanes.length, timeMin, timeMax);\n\n if (lanes.length === 0) {\n return (\n <p className=\"text-sm text-text-tertiary py-8 text-center\">\n No events in this process.\n </p>\n );\n }\n\n // Time axis ticks\n const tickCount = 5;\n const ticks = Array.from({ length: tickCount + 1 }, (_, i) => ({\n pct: (i / tickCount) * 100,\n label: formatDuration(Math.round((i / tickCount) * totalSpanMs)),\n }));\n\n const toggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allIds = lanes.map((l) => l.id);\n const allExpanded = allIds.length > 0 && allIds.every((id) => expanded.has(id));\n const toggleAll = () => {\n if (allExpanded) setExpanded(new Set());\n else setExpanded(new Set(allIds));\n };\n\n const animDone = progress >= 1;\n\n return (\n <div className=\"py-2\">\n <SwimlaneHeader allExpanded={allExpanded} onToggleAll={toggleAll} />\n <TimeAxis ticks={ticks} />\n\n {lanes.map((lane) => (\n <SwimlaneRow\n key={`${lane.kind}-${lane.id}`}\n lane={lane}\n ticks={ticks}\n isExpanded={expanded.has(lane.id)}\n onToggle={() => toggle(lane.id)}\n anim={animatedBar(lane)}\n animDone={animDone}\n traceUrl={traceUrl}\n />\n ))}\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useProcessDetail } from '../../api/tasks';\nimport { useProcessDetailEvents } from '../../hooks/useEventHooks';\nimport { useSettings } from '../../api/settings';\nimport { PageHeaderWithStats, type InlineStat } from '../../components/common/layout/PageHeaderWithStats';\nimport { SectionLabel } from '../../components/common/layout/SectionLabel';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { ProcessSwimlaneTimeline } from './process-swimlane/ProcessSwimlaneTimeline';\nimport { formatElapsed } from '../../lib/format';\nimport type { LTTaskRecord } from '../../api/types';\n\nfunction safeParseJson(raw: string | null | undefined): Record<string, unknown> | null {\n if (!raw) return null;\n try { return JSON.parse(raw); } catch { return null; }\n}\n\nfunction extractRootTask(tasks: LTTaskRecord[]): LTTaskRecord | null {\n if (tasks.length === 0) return null;\n return [...tasks].sort(\n (a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime(),\n )[0];\n}\n\nexport function ProcessDetailPage() {\n const { originId } = useParams<{ originId: string }>();\n useProcessDetailEvents(originId);\n const { data, isLoading } = useProcessDetail(originId ?? '');\n const { data: settings } = useSettings();\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n const tasks = data?.tasks ?? [];\n const escalations = data?.escalations ?? [];\n\n const rootTask = useMemo(() => extractRootTask(tasks), [tasks]);\n const rootEnvelope = useMemo(() => safeParseJson(rootTask?.envelope), [rootTask]);\n const rootResult = useMemo(() => {\n if (rootTask?.data) return safeParseJson(rootTask.data);\n const completed = tasks\n .filter((t) => t.status === 'completed' && t.data)\n .sort((a, b) => new Date(b.completed_at!).getTime() - new Date(a.completed_at!).getTime());\n return completed.length > 0 ? safeParseJson(completed[0].data) : null;\n }, [rootTask, tasks]);\n\n const isRunning = useMemo(() => {\n return tasks.length > 0 && tasks.some(\n (t) => t.status !== 'completed' && t.status !== 'cancelled',\n );\n }, [tasks]);\n\n const stats = useMemo(() => {\n const completed = tasks.filter((t) => t.status === 'completed').length;\n const escalated = tasks.filter((t) => t.status === 'needs_intervention').length;\n const resolved = escalations.filter((e) => e.status === 'resolved').length;\n return { tasks: tasks.length, completed, escalated, escalations: escalations.length, resolved };\n }, [tasks, escalations]);\n\n const duration = useMemo(() => {\n if (tasks.length === 0 && escalations.length === 0) return null;\n const allDates = [\n ...tasks.map((t) => t.created_at),\n ...escalations.map((e) => e.created_at),\n ].sort();\n const startIso = allDates[0];\n const allCompleted = tasks.every((t) => t.status === 'completed' || t.status === 'cancelled');\n const allResolved = escalations.every((e) => e.status === 'resolved');\n const isFinished = tasks.length > 0 && allCompleted && allResolved;\n const endIso = isFinished\n ? [...tasks.map((t) => t.completed_at), ...escalations.map((e) => e.resolved_at)]\n .filter(Boolean)\n .sort()\n .pop() ?? null\n : null;\n return { startIso, endIso, isFinished, elapsed: formatElapsed(startIso, endIso) };\n }, [tasks, escalations]);\n\n const inlineStats = useMemo<InlineStat[]>(() => {\n const items: InlineStat[] = [];\n if (duration) {\n items.push({\n label: duration.isFinished ? 'Completed' : 'Running',\n value: duration.elapsed,\n dotClass: duration.isFinished ? 'bg-status-success' : 'bg-status-pending animate-pulse',\n });\n }\n items.push(\n { label: 'Tasks', value: `${stats.completed}/${stats.tasks}` },\n { label: 'Escalations', value: `${stats.resolved}/${stats.escalations}` },\n );\n return items;\n }, [duration, stats]);\n\n if (isLoading && tasks.length === 0) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n const hasMessages = rootEnvelope || rootResult || isRunning;\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Process Detail\"\n docsHash=\"#docs:dashboard.md:process-detail\"\n subtitle={originId}\n stats={inlineStats}\n />\n\n {hasMessages && (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-10\">\n <div>\n {rootEnvelope ? (\n <JsonViewer data={rootEnvelope} label=\"Input\" defaultMode=\"json\" defaultCollapsed />\n ) : (\n <div>\n <SectionLabel>Input</SectionLabel>\n <div className=\"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2\">\n Waiting for task...\n </div>\n </div>\n )}\n </div>\n <div>\n {rootResult ? (\n <JsonViewer data={rootResult} label=\"Output\" defaultMode=\"json\" defaultCollapsed />\n ) : isRunning ? (\n <div>\n <SectionLabel>Output</SectionLabel>\n <div className=\"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2\">\n <span className=\"w-1.5 h-1.5 rounded-full dot-ring bg-status-pending animate-pulse\" />\n Processing...\n </div>\n </div>\n ) : null}\n </div>\n </div>\n )}\n\n <SectionLabel className=\"mb-6\">Timeline</SectionLabel>\n\n <ProcessSwimlaneTimeline\n tasks={tasks}\n escalations={escalations}\n traceUrl={traceUrl}\n />\n </div>\n );\n}\n"],"names":["PENDING_CLASS","taskStatusColor","status","escStatusColor","statusLabel","kind","isAck","barColorForStatus","isOpen","isMcpWorkflow","workflowType","isAckEscalation","esc","middleTruncate","str","maxLen","keep","buildLanes","tasks","escalations","now","escByTask","unlinked","e","sorted","a","b","allTimes","t","timeMin","timeMax","span","toPct","ms","lanes","task","tStart","tEnd","tOpen","taskEscs","eStart","eEnd","eOpen","claimPct","claimMs","escSpan","useTimelineAnimation","laneCount","durationMs","progress","setProgress","useState","startRef","useRef","totalSpanMs","useEffect","raf","step","ts","elapsed","eased","animatedBar","useCallback","lane","appearAt","doneAt","laneSpan","fill","animatedWidth","fadeIn","ClipboardIcon","className","jsx","SparkleIcon","BellIcon","UserIcon","SwimlaneHeader","allExpanded","onToggleAll","jsxs","TimeAxis","ticks","tick","MetricCell","label","children","TraceLink","traceId","href","copied","setCopied","handleCopy","handleNav","TaskDetailPanel","traceUrl","StatusBadge","WorkflowPill","TimestampCell","DurationValue","m","i","Link","EscalationDetailPanel","escalation","created","claimedMs","resolvedMs","RolePill","Fragment","UserName","SwimlaneRow","isExpanded","onToggle","anim","animDone","isTask","barBase","visible","_a","formatDuration","_b","Collapsible","ProcessSwimlaneTimeline","expanded","setExpanded","useMemo","tickCount","_","toggle","id","prev","next","allIds","l","toggleAll","safeParseJson","raw","extractRootTask","ProcessDetailPage","originId","useParams","useProcessDetailEvents","data","isLoading","useProcessDetail","settings","useSettings","rootTask","rootEnvelope","rootResult","completed","isRunning","stats","escalated","resolved","duration","startIso","allCompleted","allResolved","isFinished","endIso","formatElapsed","inlineStats","items","hasMessages","PageHeaderWithStats","JsonViewer","SectionLabel"],"mappings":"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"}
|
package/dashboard/dist/assets/{ProcessesListPage-BVtkWVLY.js → ProcessesListPage-BAalEHpx.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as s}from"./vendor-query-B2UbickB.js";import{u as x}from"./tasks-
|
|
2
|
-
//# sourceMappingURL=ProcessesListPage-
|
|
1
|
+
import{j as s}from"./vendor-query-B2UbickB.js";import{u as x}from"./tasks-BWHakSYf.js";import{u as h}from"./workflows-WmmGDAvo.js";import{u as w}from"./useEventHooks-Dpixlgp-.js";import{u as k}from"./useFilterParams-x-Dg0Vgz.js";import{u as y}from"./useDebouncedValue-BA5S7V54.js";import{b as v}from"./api-path-u2Jf9QXS.js";import{D as _}from"./DataTable-ZWgVQg7F.js";import{T as c}from"./TimestampCell-CDR6cTyq.js";import{S as b}from"./StickyPagination-3eCY2-_V.js";import{F as j,a as P,b as p}from"./FilterBar-B4Mk2PvT.js";import{P as S}from"./PageHeader-DJo7yMUR.js";import{L as N}from"./ListToolbar-d4MGQefV.js";import{W as C}from"./WorkflowPill-BtNBSplz.js";import{c as T}from"./vendor-react-CXumBFUA.js";import"./index-C8k3Z2su.js";import"./vendor-icons-DOIDKgo6.js";import"./EmptyState-BcsfPq9T.js";const F=[{value:"active",label:"Active"},{value:"completed",label:"Completed"},{value:"escalated",label:"Escalated"}],z=[{key:"origin_id",label:"Origin",render:e=>s.jsx("span",{className:"font-mono text-xs",title:e.origin_id,children:e.origin_id.length>40?`${e.origin_id.slice(0,40)}…`:e.origin_id})},{key:"workflow_types",label:"Workflows",render:e=>s.jsx("div",{className:"flex flex-wrap gap-1",children:e.workflow_types.map(a=>s.jsx(C,{type:a},a))})},{key:"task_count",label:"Tasks",render:e=>s.jsx("span",{children:e.task_count}),className:"w-20 text-right"},{key:"completed",label:"Completed",render:e=>e.completed>0?s.jsx("span",{className:"text-status-success",children:e.completed}):s.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-24 text-right"},{key:"escalated",label:"Escalated",render:e=>e.escalated>0?s.jsx("span",{className:"text-status-error",children:e.escalated}):s.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-24 text-right"},{key:"started_at",label:"Started",render:e=>s.jsx(c,{date:e.started_at}),className:"w-44"},{key:"last_activity",label:"Last Activity",render:e=>s.jsx(c,{date:e.last_activity}),className:"w-44"}];function Q(){w();const e=T(),{filters:a,setFilter:i,pagination:o}=k({filters:{workflow_type:"",status:"",search:""}}),l=y(a.search,300),{data:m}=h(),d=[...new Set((m??[]).map(t=>t.workflow_type))].sort(),{data:r,isLoading:f,refetch:g,isFetching:u}=x({workflow_type:a.workflow_type||void 0,status:a.status||void 0,search:l||void 0,limit:o.pageSize,offset:o.offset}),n=(r==null?void 0:r.total)??0;return s.jsxs("div",{children:[s.jsx(S,{title:"All Processes",docsHash:"#docs:dashboard.md:processes-overview"}),s.jsxs(j,{actions:s.jsx(N,{onRefresh:()=>g(),isFetching:u,apiPath:v("/tasks/processes",{limit:o.pageSize,offset:o.offset,workflow_type:a.workflow_type||void 0,status:a.status||void 0,search:l||void 0})}),children:[s.jsx(P,{label:"Search",value:a.search,onChange:t=>i("search",t),placeholder:"origin, workflow, or trace ID"}),s.jsx(p,{label:"Status",value:a.status,onChange:t=>i("status",t),options:F}),s.jsx(p,{label:"Workflow Type",value:a.workflow_type,onChange:t=>i("workflow_type",t),options:d.map(t=>({value:t,label:t}))})]}),s.jsx(_,{columns:z,data:(r==null?void 0:r.processes)??[],keyFn:t=>t.origin_id,onRowClick:t=>e(`/processes/detail/${encodeURIComponent(t.origin_id)}`),isLoading:f,emptyMessage:"No business processes found"}),s.jsx(b,{page:o.page,totalPages:o.totalPages(n),onPageChange:o.setPage,total:n,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{Q as ProcessesListPage};
|
|
2
|
+
//# sourceMappingURL=ProcessesListPage-BAalEHpx.js.map
|