DATE_SUB(NOW(), INTERVAL ? HOUR)", [$hours] ) ?? []; $out = []; foreach ($agents as $a) { $rows = JarvisDB::query( "SELECT CAST(JSON_EXTRACT(metric_data, '$.cpu_percent') AS DECIMAL(5,1)) as cpu, CAST(JSON_EXTRACT(metric_data, '$.memory.percent') AS DECIMAL(5,1)) as mem, recorded_at FROM agent_metrics WHERE agent_id = ? AND recorded_at > DATE_SUB(NOW(), INTERVAL ? HOUR) ORDER BY recorded_at ASC", [$a['agent_id'], $hours] ) ?? []; if ($rows) { $out[$a['agent_id']] = array_map(fn($r) => [ 'cpu' => (float)($r['cpu'] ?? 0), 'mem' => (float)($r['mem'] ?? 0), ], $rows); } } echo json_encode($out); } else { $rows = JarvisDB::query( "SELECT CAST(JSON_EXTRACT(metric_data, '$.cpu_percent') AS DECIMAL(5,1)) as cpu, CAST(JSON_EXTRACT(metric_data, '$.memory.percent') AS DECIMAL(5,1)) as mem, recorded_at FROM agent_metrics WHERE agent_id = ? AND recorded_at > DATE_SUB(NOW(), INTERVAL ? HOUR) ORDER BY recorded_at ASC", [$agentId, $hours] ) ?? []; echo json_encode(array_map(fn($r) => [ 'cpu' => (float)($r['cpu'] ?? 0), 'mem' => (float)($r['mem'] ?? 0), ], $rows)); }