diff --git a/ui/src/pages/Exchanges/ExchangeHeader.module.css b/ui/src/pages/Exchanges/ExchangeHeader.module.css index 346f235e..756d436e 100644 --- a/ui/src/pages/Exchanges/ExchangeHeader.module.css +++ b/ui/src/pages/Exchanges/ExchangeHeader.module.css @@ -41,6 +41,21 @@ flex-shrink: 0; } +.iconLive { + color: var(--success); + flex-shrink: 0; +} + +.iconStale { + color: var(--warning); + flex-shrink: 0; +} + +.iconDead { + color: var(--error); + flex-shrink: 0; +} + .linkBtn { display: inline-flex; align-items: center; diff --git a/ui/src/pages/Exchanges/ExchangeHeader.tsx b/ui/src/pages/Exchanges/ExchangeHeader.tsx index 0772be24..7da195f0 100644 --- a/ui/src/pages/Exchanges/ExchangeHeader.tsx +++ b/ui/src/pages/Exchanges/ExchangeHeader.tsx @@ -1,7 +1,9 @@ +import { useMemo } from 'react'; import { useNavigate } from 'react-router'; import { GitBranch, Server } from 'lucide-react'; import { StatusDot, MonoText, Badge } from '@cameleer/design-system'; import { useCorrelationChain } from '../../api/queries/correlation'; +import { useAgents } from '../../api/queries/agents'; import type { ExecutionDetail } from '../../components/ExecutionDiagram/types'; import styles from './ExchangeHeader.module.css'; @@ -42,6 +44,14 @@ export function ExchangeHeader({ detail }: ExchangeHeaderProps) { const showChain = chain && chain.length > 1; const attrs = Object.entries(detail.attributes ?? {}); + // Look up agent state for icon coloring + const { data: agents } = useAgents(undefined, detail.applicationName); + const agentState = useMemo(() => { + if (!agents || !detail.agentId) return undefined; + const agent = (agents as any[]).find((a: any) => a.id === detail.agentId); + return agent?.state?.toLowerCase() as 'live' | 'stale' | 'dead' | undefined; + }, [agents, detail.agentId]); + return (