import { useQuery } from '@tanstack/react-query'; import { getAgents } from '../api/client'; import PageHeader from '../components/PageHeader'; import DataTable from '../components/DataTable'; import type { Column } from '../components/DataTable'; import StatusBadge from '../components/StatusBadge'; import ErrorState from '../components/ErrorState'; import { timeAgo } from '../api/utils'; import type { Agent } from '../api/types'; function heartbeatStatus(lastHeartbeat: string): string { if (!lastHeartbeat) return 'Offline'; const ago = Date.now() - new Date(lastHeartbeat).getTime(); if (ago < 5 * 60 * 1000) return 'Online'; if (ago < 15 * 60 * 1000) return 'Stale'; return 'Offline'; } export default function AgentsPage() { const { data, isLoading, error, refetch } = useQuery({ queryKey: ['agents'], queryFn: () => getAgents(), refetchInterval: 15000, }); const columns: Column[] = [ { key: 'name', label: 'Agent', render: (a) => (
{a.name}
{a.id}
), }, { key: 'status', label: 'Health', render: (a) => , }, { key: 'hostname', label: 'Hostname', render: (a) => {a.hostname || '—'} }, { key: 'ip', label: 'IP Address', render: (a) => {a.ip_address || '—'} }, { key: 'version', label: 'Version', render: (a) => {a.version || '—'} }, { key: 'heartbeat', label: 'Last Heartbeat', render: (a) => {timeAgo(a.last_heartbeat)}, }, ]; return ( <>
{error ? ( refetch()} /> ) : ( )}
); }