From 6210fccf30d142e54975006ce25613fd63e1ac98 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Mon, 3 Aug 2026 18:14:03 +0200 Subject: [PATCH] feat: session color reflects RPC connection health - Green: connected and not paused (healthy) - Gray: paused (intentional) - Red: not paused but disconnected (crashed/broken) - Yellow: paused but still connected (zombie) --- gui/ollie9pclient.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/gui/ollie9pclient.cpp b/gui/ollie9pclient.cpp index 9347850..08979d0 100644 --- a/gui/ollie9pclient.cpp +++ b/gui/ollie9pclient.cpp @@ -172,12 +172,17 @@ QString Ollie9pClient::sessionConnectionColor(const QString &sessionId) const for (const QVariant &v : m_sessions) { const QVariantMap s = v.toMap(); if (s.value("id").toString() != sessionId) continue; - // Paused sessions show gray (RPC connection intentionally stopped) - if (s.value("paused").toBool()) return "gray"; - // Session maintains its own RPC connection, independent of agent count. - // For now, assume connected if not paused. Agent-level connection - // status is tracked separately for per-agent indicators. - return "green"; + const bool paused = s.value("paused").toBool(); + const bool connected = s.value("connected").toBool(); + // Color logic: + // - Gray: paused (intentionally stopped) + // - Green: not paused AND connected + // - Red: not paused AND disconnected (crashed/broken) + // - Yellow: paused BUT still connected (zombie - shouldn't happen) + if (paused && connected) return "yellow"; // zombie + if (paused) return "gray"; // intentionally paused + if (connected) return "green"; // healthy + return "red"; // crashed/broken } return "gray"; } @@ -312,6 +317,9 @@ void Ollie9pClient::refreshSessions() // Check if session is paused QString pausedStr = QString::fromUtf8(run9p({"read", "session/" + sessionId + "/paused"})).trimmed(); session["paused"] = (pausedStr == "true"); + // Check RPC connection status + QString connectedStr = QString::fromUtf8(run9p({"read", "session/" + sessionId + "/connected"})).trimmed(); + session["connected"] = (connectedStr == "true"); QVariantList agents; for (const QString &name : QString::fromUtf8(run9p({"ls", "session/" + sessionId + "/agent"})).trimmed().split('\n', Qt::SkipEmptyParts)) { if (name == "new") continue;