diff --git a/frontend-modern/src/App.tsx b/frontend-modern/src/App.tsx index bbdc184..ebb7dd2 100644 --- a/frontend-modern/src/App.tsx +++ b/frontend-modern/src/App.tsx @@ -109,8 +109,64 @@ function HostsRoute() { return
Loading...
; } const { state } = wsContext; + + // Use unified resources if available, fall back to legacy state.hosts + // During migration: resources may be empty initially, so we need the fallback + const hosts = createMemo(() => { + const unifiedHosts = state.resources?.filter(r => r.type === 'host') ?? []; + + // If we have unified resources, convert them to legacy Host format + // (This will be simplified once HostsOverview is migrated to use resources directly) + if (unifiedHosts.length > 0) { + return unifiedHosts.map(r => { + const platformData = r.platformData as Record | undefined; + return { + id: r.id, + hostname: r.identity?.hostname ?? r.name, + displayName: r.displayName || r.name, + platform: platformData?.platform as string | undefined, + osName: platformData?.osName as string | undefined, + osVersion: platformData?.osVersion as string | undefined, + kernelVersion: platformData?.kernelVersion as string | undefined, + architecture: platformData?.architecture as string | undefined, + cpuCount: platformData?.cpuCount as number | undefined, + cpuUsage: r.cpu?.current, + loadAverage: platformData?.loadAverage as number[] | undefined, + memory: r.memory ? { + total: r.memory.total ?? 0, + used: r.memory.used ?? 0, + free: r.memory.free ?? 0, + usage: r.memory.current, + } : { total: 0, used: 0, free: 0, usage: 0 }, + disks: platformData?.disks as Array<{ + total: number; + used: number; + free: number; + usage: number; + mountpoint?: string; + }> | undefined, + diskIO: platformData?.diskIO, + networkInterfaces: platformData?.networkInterfaces, + sensors: platformData?.sensors, + raid: platformData?.raid, + status: r.status === 'online' || r.status === 'running' ? 'online' : r.status, + uptimeSeconds: r.uptime, + lastSeen: r.lastSeen, + intervalSeconds: platformData?.intervalSeconds as number | undefined, + agentVersion: platformData?.agentVersion as string | undefined, + tokenId: platformData?.tokenId as string | undefined, + tokenName: platformData?.tokenName as string | undefined, + tags: r.tags, + }; + }); + } + + // Fall back to legacy data + return state.hosts ?? []; + }); + return ( - + ); } diff --git a/frontend-modern/src/hooks/useResources.ts b/frontend-modern/src/hooks/useResources.ts index 0f77855..5473d90 100644 --- a/frontend-modern/src/hooks/useResources.ts +++ b/frontend-modern/src/hooks/useResources.ts @@ -303,10 +303,85 @@ export function useResourcesAsLegacy() { })); }); + // Convert resources to legacy Host format + const asHosts = createMemo(() => { + return byType('host').map(r => { + // Extract platform-specific data if available + const platformData = r.platformData as Record | undefined; + + return { + id: r.id, + hostname: r.identity?.hostname ?? r.name, + displayName: r.displayName || r.name, + platform: platformData?.platform as string | undefined, + osName: platformData?.osName as string | undefined, + osVersion: platformData?.osVersion as string | undefined, + kernelVersion: platformData?.kernelVersion as string | undefined, + architecture: platformData?.architecture as string | undefined, + cpuCount: platformData?.cpuCount as number | undefined, + cpuUsage: r.cpu?.current, + loadAverage: platformData?.loadAverage as number[] | undefined, + memory: r.memory ? { + total: r.memory.total ?? 0, + used: r.memory.used ?? 0, + free: r.memory.free ?? 0, + usage: r.memory.current, + } : { total: 0, used: 0, free: 0, usage: 0 }, + disks: platformData?.disks as Array<{ + total: number; + used: number; + free: number; + usage: number; + mountpoint?: string; + type?: string; + device?: string; + }> | undefined, + diskIO: platformData?.diskIO as Array<{ + device: string; + readBytes?: number; + writeBytes?: number; + }> | undefined, + networkInterfaces: platformData?.networkInterfaces as Array<{ + name: string; + mac?: string; + addresses?: string[]; + rxBytes?: number; + txBytes?: number; + }> | undefined, + sensors: platformData?.sensors as { + temperatureCelsius?: Record; + fanRpm?: Record; + } | undefined, + raid: platformData?.raid as Array<{ + device: string; + name?: string; + level: string; + state: string; + totalDevices: number; + activeDevices: number; + workingDevices: number; + failedDevices: number; + spareDevices: number; + devices: Array<{ device: string; state: string; slot: number }>; + rebuildPercent: number; + }> | undefined, + status: r.status === 'online' || r.status === 'running' ? 'online' : r.status, + uptimeSeconds: r.uptime, + lastSeen: r.lastSeen, + intervalSeconds: platformData?.intervalSeconds as number | undefined, + agentVersion: platformData?.agentVersion as string | undefined, + tokenId: platformData?.tokenId as string | undefined, + tokenName: platformData?.tokenName as string | undefined, + tags: r.tags, + }; + }); + }); + return { resources, asVMs, asContainers, + asHosts, }; }