import React, { useEffect, useState } from 'react' import { Link } from 'react-router-dom' interface DaemonSummary { id: string ownerId: string connectionId: string hostname: string | null machineId: string | null maxConcurrentTasks: number currentTaskCount: number status: string lastHeartbeatAt: string connectedAt: string disconnectedAt: string | null } function statusDotColor(status: string): string { switch (status.toLowerCase()) { case 'connected': return 'green' case 'disconnected': return 'red' case 'unhealthy': return 'yellow' default: return 'gray' } } export function DaemonList() { const [daemons, setDaemons] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { async function fetchDaemons() { try { setLoading(true) const response = await fetch('/api/v1/mesh/daemons') if (!response.ok) { throw new Error(`Failed to fetch daemons: ${response.statusText}`) } const data = await response.json() setDaemons(data.daemons || []) } catch (err) { setError(err instanceof Error ? err.message : 'Unknown error') } finally { setLoading(false) } } fetchDaemons() const interval = setInterval(async () => { try { const response = await fetch('/api/v1/mesh/daemons') if (response.ok) { const data = await response.json() setDaemons(data.daemons || []) } } catch { // Silently ignore refresh errors } }, 10000) return () => clearInterval(interval) }, []) if (loading) { return (
Loading daemons...
) } if (error) { return (
Error: {error}
) } return (
Back to Home

Daemons

{daemons.length === 0 ? (

No daemons found

) : (
    {daemons.map((daemon) => (
  • {daemon.hostname || 'Unknown Host'}

    {daemon.status}
    Tasks: {daemon.currentTaskCount} / {daemon.maxConcurrentTasks} Connected: {new Date(daemon.connectedAt).toLocaleString()} {daemon.machineId && ( Machine: {daemon.machineId} )}
  • ))}
)}
) }