'Unauthorized', 'code' => 401]); exit; } } } if ($endpoint !== 'auth') session_write_close(); // Skip for auth so login can write session token $body = file_get_contents('php://input'); $data = json_decode($body, true) ?? []; switch ($endpoint) { case 'ping': echo json_encode(['status' => 'online', 'time' => date('c'), 'codename' => JARVIS_CODENAME]); break; case 'auth': require __DIR__ . '/../api/endpoints/auth.php'; break; case 'chat': require __DIR__ . '/../api/endpoints/chat.php'; break; case 'system': require __DIR__ . '/../api/endpoints/system.php'; break; case 'netscan': require __DIR__ . '/../api/endpoints/netscan.php'; break; case 'network': require __DIR__ . '/../api/endpoints/network.php'; break; case 'proxmox': require __DIR__ . '/../api/endpoints/proxmox.php'; break; case 'ha': require __DIR__ . '/../api/endpoints/ha.php'; break; case 'tts': require __DIR__ . '/../api/endpoints/tts.php'; break; case 'do': require __DIR__ . '/../api/endpoints/do_server.php'; break; case 'alerts': require __DIR__ . '/../api/endpoints/alerts.php'; break; case 'facts': require __DIR__ . '/../api/endpoints/facts_collector.php'; break; case 'weather': require __DIR__ . '/../api/endpoints/weather.php'; break; case 'news': require __DIR__ . '/../api/endpoints/news.php'; break; case 'sites': require __DIR__ . '/../api/endpoints/sites.php'; break; case "agent": require __DIR__ . '/../api/endpoints/agent.php'; break; default: http_response_code(404); echo json_encode(['error' => 'Unknown endpoint: ' . $endpoint]); }