query("SELECT * FROM caching_service_state WHERE id = 1")->fetch(); // Active backfill target (table may not exist yet on fresh start) $active = ['active_pubkey' => '', 'active_relay' => '']; try { $active = $pdo->query("SELECT active_pubkey, active_relay FROM caching_backfill_active WHERE id = 1")->fetch() ?: $active; } catch (PDOException $e) { /* table doesn't exist yet */ } // Error relay summary (consecutive_errors column may not exist yet on fresh start) $error_stats = ['auto_completed' => 0, 'error_count' => 0, 'timeout_count' => 0]; try { $error_stats = $pdo->query(" SELECT COUNT(*) FILTER (WHERE consecutive_errors >= 3) AS auto_completed, COUNT(*) FILTER (WHERE last_status LIKE 'error%') AS error_count, COUNT(*) FILTER (WHERE last_status = 'timeout') AS timeout_count FROM caching_backfill_relay_progress ")->fetch() ?: $error_stats; } catch (PDOException $e) { /* column/table doesn't exist yet */ } // Inbox stats $inbox = $pdo->query(" SELECT COUNT(*) AS pending, COUNT(*) FILTER (WHERE source_class = 'live') AS live, COUNT(*) FILTER (WHERE source_class = 'backfill') AS backfill FROM caching_event_inbox ")->fetch(); // Event count $events = $pdo->query("SELECT COUNT(*) AS total FROM events")->fetch(); // Heartbeat age $hb_age = intval($state['heartbeat_at'] ?? 0); $hb_ago = $hb_age > 0 ? time() - $hb_age : 0; json_response([ 'service_state' => $state['service_state'] ?? 'unknown', 'heartbeat_ago' => $hb_ago > 0 ? $hb_ago . 's ago' : 'never', 'config_generation' => intval($state['config_generation'] ?? 0), 'followed_count' => intval($state['followed_author_count'] ?? 0), 'selected_relays' => intval($state['selected_relay_count'] ?? 0), 'connected_relays' => intval($state['connected_relay_count'] ?? 0), 'bf_complete' => intval($state['backfill_authors_complete'] ?? 0), 'bf_total' => intval($state['backfill_authors_total'] ?? 0), 'events_fetched' => intval($state['events_fetched'] ?? 0), 'inbox_inserts' => intval($state['inbox_inserts'] ?? 0), 'db_events' => intval($events['total'] ?? 0), 'inbox_pending' => intval($inbox['pending'] ?? 0), 'inbox_live' => intval($inbox['live'] ?? 0), 'inbox_backfill' => intval($inbox['backfill'] ?? 0), 'error_count' => intval($error_stats['error_count'] ?? 0), 'timeout_count' => intval($error_stats['timeout_count'] ?? 0), 'auto_completed' => intval($error_stats['auto_completed'] ?? 0), 'active_pubkey' => $active['active_pubkey'] ?? '', 'active_relay' => $active['active_relay'] ?? '', ]);