diff --git a/gui/ollie9pclient.cpp b/gui/ollie9pclient.cpp index 0dd6075..834cc48 100644 --- a/gui/ollie9pclient.cpp +++ b/gui/ollie9pclient.cpp @@ -14,8 +14,12 @@ Ollie9pClient::Ollie9pClient(QObject *parent) m_9p = new Lib9pClient(this); m_9p->connectDefault(); - // Chat stream — one-shot, reads agent chat log. Starts/stops with agent switch. - m_chat = new NativeStreamer(NativeStreamer::Oneshot, this); + // Chat stream — guarded, reads agent chat log. Runs continuously while + // an agent is selected; stops on agent switch or daemon disconnect. + m_chat = new NativeStreamer(NativeStreamer::Guarded, this); + m_chat->setGuard([this]() { + return m_daemonConnected && !m_activeSessionId.isEmpty() && !m_agentId.isEmpty(); + }); connect(m_chat, &NativeStreamer::dataReady, this, [this](const QByteArray &data) { if (!data.isEmpty()) emit chatReceived(QString::fromUtf8(data)); @@ -223,13 +227,6 @@ void Ollie9pClient::handleEvent(const QString &eventLine) m_agentStateValues[key] = payloadStr; emit agentStateChanged(sidStr, aidStr, payloadStr); emit activeStateChanged(); - - // Demand-driven chat: stop on idle, start on activity. - if (payloadStr == QLatin1String("idle")) { - m_chat->stop(); - } else if (!m_chat->isRunning()) { - m_chat->start(agentPath() + "/chat"); - } } else { // Non-active agent: need to check cache const QString sidStr = sessionId.toString(); @@ -386,11 +383,6 @@ bool Ollie9pClient::submit(const QString &prompt) if (m_activeSessionId.isEmpty() || m_agentId.isEmpty() || prompt.trimmed().isEmpty()) return false; if (!m_9p || !m_9p->isConnected()) return false; - // Start chat stream before submitting — agent will become active. - if (!m_chat->isRunning()) { - m_chat->start(agentPath() + "/chat"); - } - return m_9p->write(agentPath() + "/prompt", prompt.toUtf8()); } @@ -686,11 +678,7 @@ void Ollie9pClient::startActiveAgentStreams() if (!m_daemonConnected) return; if (m_activeSessionId.isEmpty() || m_agentId.isEmpty()) return; - // Chat stream is demand-driven: started on submit(), stopped on idle. - // If the agent is already active (e.g. switching to a busy agent), start chat now. - if (m_activeState != "idle") { - m_chat->start(agentPath() + "/chat"); - } + m_chat->start(agentPath() + "/chat"); m_state->start(agentPath() + "/statewait"); }