diff --git a/ui/src/pages/AgentHealth/AgentHealth.module.css b/ui/src/pages/AgentHealth/AgentHealth.module.css index f5e220a9..0c7fa67f 100644 --- a/ui/src/pages/AgentHealth/AgentHealth.module.css +++ b/ui/src/pages/AgentHealth/AgentHealth.module.css @@ -244,3 +244,36 @@ font-size: 12px; color: var(--text-muted); } + +/* Status breakdown in stat card */ +.statusBreakdown { + display: flex; + gap: 8px; + font-size: 11px; +} + +.statusLive { color: var(--success); } +.statusStale { color: var(--warning); } +.statusDead { color: var(--error); } + +/* Scope trail */ +.scopeLabel { + font-size: 13px; + font-weight: 600; + color: var(--text-secondary); +} + +/* DetailPanel override */ +.detailPanelOverride { + position: fixed; + top: 0; + right: 0; + height: 100vh; + z-index: 100; + box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12); +} + +.panelDivider { + border-top: 1px solid var(--border-subtle); + margin: 16px 0; +} diff --git a/ui/src/pages/AgentHealth/AgentHealth.tsx b/ui/src/pages/AgentHealth/AgentHealth.tsx index 19d69ad1..de3b217d 100644 --- a/ui/src/pages/AgentHealth/AgentHealth.tsx +++ b/ui/src/pages/AgentHealth/AgentHealth.tsx @@ -2,7 +2,7 @@ import { useMemo, useState } from 'react'; import { useParams, useNavigate } from 'react-router'; import { StatCard, StatusDot, Badge, MonoText, - GroupCard, EventFeed, Breadcrumb, Alert, + GroupCard, EventFeed, Alert, DetailPanel, ProgressBar, LineChart, } from '@cameleer/design-system'; import styles from './AgentHealth.module.css'; @@ -189,24 +189,6 @@ export default function AgentHealth() { const activeRoutes = (agents || []).filter((a: any) => a.status === 'LIVE').reduce((sum: number, a: any) => sum + (a.activeRoutes || 0), 0); const totalTps = (agents || []).filter((a: any) => a.status === 'LIVE').reduce((sum: number, a: any) => sum + (a.tps || 0), 0); - const groupHealth: 'live' | 'stale' | 'dead' = useMemo(() => { - if (!appId) return 'live'; - const groupAgents = agentsByApp[appId] || []; - if (groupAgents.some((a: any) => a.status === 'DEAD')) return 'dead'; - if (groupAgents.some((a: any) => a.status === 'STALE')) return 'stale'; - return 'live'; - }, [appId, agentsByApp]); - - const scopeItems = useMemo(() => { - const items: { label: string; href?: string }[] = [ - { label: 'Agent Health', href: '/agents' }, - ]; - if (appId) { - items.push({ label: appId }); - } - return items; - }, [appId]); - const feedEvents = useMemo(() => (events || []).map((e: any) => ({ id: String(e.id), @@ -225,22 +207,25 @@ export default function AgentHealth() { return (