import { useMemo } from 'react'; import { useParams } from 'react-router'; import { StatCard, StatusDot, Badge, LineChart, AreaChart, EventFeed, Breadcrumb, Spinner, CodeBlock, } from '@cameleer/design-system'; import styles from './AgentInstance.module.css'; import { useAgents, useAgentEvents } from '../../api/queries/agents'; import { useStatsTimeseries } from '../../api/queries/executions'; import { useGlobalFilters } from '@cameleer/design-system'; export default function AgentInstance() { const { appId, instanceId } = useParams(); const { timeRange } = useGlobalFilters(); const timeFrom = timeRange.start.toISOString(); const timeTo = timeRange.end.toISOString(); const { data: agents, isLoading } = useAgents(undefined, appId); const { data: events } = useAgentEvents(appId, instanceId); const { data: timeseries } = useStatsTimeseries(timeFrom, timeTo, undefined, appId); const agent = useMemo(() => (agents || []).find((a: any) => a.id === instanceId), [agents, instanceId], ); const chartData = useMemo(() => (timeseries?.buckets || []).map((b: any) => ({ time: new Date(b.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }), throughput: b.totalCount, latency: b.avgDurationMs, errors: b.failedCount, })), [timeseries], ); const feedEvents = useMemo(() => (events || []).filter((e: any) => !instanceId || e.agentId === 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, message: `${e.eventType}${e.detail ? ' — ' + e.detail : ''}`, timestamp: new Date(e.timestamp), })), [events, instanceId], ); if (isLoading) return ; return (
{agent && ( <>

{agent.name}

0.05 ? 'error' : undefined} />
Routes
{(agent.routeIds || []).map((r: string) => ( ))}
)} {chartData.length > 0 && ( <>
Performance
Throughput
({ x: i, y: d.throughput })) }]} height={200} />
Latency
({ x: i, y: d.latency })) }]} height={200} />
)} {feedEvents.length > 0 && (
Events
)} {agent && ( <>
Agent Info
)}
); } function formatUptime(seconds: number): string { if (seconds < 60) return `${seconds}s`; if (seconds < 3600) return `${Math.floor(seconds / 60)}m`; if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m`; return `${Math.floor(seconds / 86400)}d ${Math.floor((seconds % 86400) / 3600)}h`; }