diff --git a/ui/src/pages/AgentHealth/AgentHealth.tsx b/ui/src/pages/AgentHealth/AgentHealth.tsx index 94ab1e36..d1281c19 100644 --- a/ui/src/pages/AgentHealth/AgentHealth.tsx +++ b/ui/src/pages/AgentHealth/AgentHealth.tsx @@ -1,6 +1,6 @@ import { useState, useMemo, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router'; -import { ExternalLink, RefreshCw, Pencil } from 'lucide-react'; +import { ExternalLink, RefreshCw, Pencil, UserPlus, UserMinus, Play, Square, Clock, Skull, HeartPulse, Route, Send, Activity } from 'lucide-react'; import { StatCard, StatusDot, Badge, MonoText, GroupCard, DataTable, EventFeed, @@ -195,22 +195,44 @@ export default function AgentHealth() { // Map events to FeedEvent const feedEvents: FeedEvent[] = useMemo(() => { + const eventIcon = (type: string) => { + switch (type) { + case 'REGISTERED': return ; + case 'DEREGISTERED': return ; + case 'AGENT_STARTED': return ; + case 'AGENT_STOPPED': return ; + case 'WENT_STALE': return ; + case 'WENT_DEAD': return ; + case 'RECOVERED': return ; + case 'ROUTE_STATE_CHANGED': return ; + case 'COMMAND_DELIVERED': + case 'COMMAND_ACKNOWLEDGED': return ; + default: return ; + } + }; + + const eventSeverity = (type: string): FeedEvent['severity'] => { + switch (type) { + case 'WENT_DEAD': + case 'AGENT_STOPPED': + case 'DEREGISTERED': return 'error'; + case 'WENT_STALE': return 'warning'; + case 'RECOVERED': + case 'REGISTERED': + case 'AGENT_STARTED': return 'success'; + default: return 'running'; + } + }; + const mapped = (events ?? []).map((e: { id: number; instanceId: string; eventType: string; detail: string; timestamp: string }) => ({ id: String(e.id), - severity: - e.eventType === 'WENT_DEAD' - ? ('error' as const) - : e.eventType === 'WENT_STALE' - ? ('warning' as const) - : e.eventType === 'RECOVERED' - ? ('success' as const) - : ('running' as const), + severity: eventSeverity(e.eventType), + icon: eventIcon(e.eventType), message: `${e.instanceId}: ${e.eventType}${e.detail ? ' \u2014 ' + e.detail : ''}`, timestamp: new Date(e.timestamp), })); return eventSortAsc ? mapped.toReversed() : mapped; - }, [events, eventSortAsc], - ); + }, [events, eventSortAsc]); // Column definitions for the instance DataTable const instanceColumns: Column[] = useMemo( diff --git a/ui/src/pages/AgentInstance/AgentInstance.tsx b/ui/src/pages/AgentInstance/AgentInstance.tsx index 33c8190e..6e05e184 100644 --- a/ui/src/pages/AgentInstance/AgentInstance.tsx +++ b/ui/src/pages/AgentInstance/AgentInstance.tsx @@ -1,6 +1,6 @@ import { useMemo, useState } from 'react'; import { useParams, Link } from 'react-router'; -import { RefreshCw, ChevronRight } from 'lucide-react'; +import { RefreshCw, ChevronRight, UserPlus, UserMinus, Play, Square, Clock, Skull, HeartPulse, Route, Send, Activity } from 'lucide-react'; import { StatCard, StatusDot, Badge, LineChart, AreaChart, BarChart, EventFeed, Spinner, EmptyState, SectionHeader, MonoText, @@ -82,18 +82,41 @@ export default function AgentInstance() { ); const feedEvents = useMemo(() => { + const eventIcon = (type: string) => { + switch (type) { + case 'REGISTERED': return ; + case 'DEREGISTERED': return ; + case 'AGENT_STARTED': return ; + case 'AGENT_STOPPED': return ; + case 'WENT_STALE': return ; + case 'WENT_DEAD': return ; + case 'RECOVERED': return ; + case 'ROUTE_STATE_CHANGED': return ; + case 'COMMAND_DELIVERED': + case 'COMMAND_ACKNOWLEDGED': return ; + default: return ; + } + }; + + const eventSeverity = (type: string): FeedEvent['severity'] => { + switch (type) { + case 'WENT_DEAD': + case 'AGENT_STOPPED': + case 'DEREGISTERED': return 'error'; + case 'WENT_STALE': return 'warning'; + case 'RECOVERED': + case 'REGISTERED': + case 'AGENT_STARTED': return 'success'; + default: return 'running'; + } + }; + const mapped = (events || []) .filter((e: any) => !instanceId || e.instanceId === instanceId) .map((e: any) => ({ id: String(e.id), - severity: - e.eventType === 'WENT_DEAD' - ? ('error' as const) - : e.eventType === 'WENT_STALE' - ? ('warning' as const) - : e.eventType === 'RECOVERED' - ? ('success' as const) - : ('running' as const), + severity: eventSeverity(e.eventType), + icon: eventIcon(e.eventType), message: `${e.eventType}${e.detail ? ' \u2014 ' + e.detail : ''}`, timestamp: new Date(e.timestamp), }));