From d95f3e9445df28c899b4a2977c80b8518ff500e6 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 23 Apr 2026 23:41:38 -0400 Subject: [PATCH] user/chat: route Thinking to a new Autonomous pane Thinking content was silently dropped in the UI (empty Vec). Now that Thinking is prompt-visible, surface it in a dedicated Autonomous pane rendered in gray so it's visually distinct from conversation and tool-call output. Co-Authored-By: Proof of Concept --- src/user/chat.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/user/chat.rs b/src/user/chat.rs index fe3db5b..bd2df25 100644 --- a/src/user/chat.rs +++ b/src/user/chat.rs @@ -167,6 +167,7 @@ enum PaneTarget { ConversationAssistant, Tools, ToolResult, + Autonomous, } const MAX_PANE_LINES: usize = 10_000; @@ -472,8 +473,11 @@ impl InteractScreen { AstNode::Leaf(leaf) => { let text = leaf.body().text().to_string(); match leaf.body() { - NodeBody::Memory { .. } | NodeBody::Thinking(_) - | NodeBody::Log(_) | NodeBody::Dmn(_) => vec![], + NodeBody::Memory { .. } | NodeBody::Log(_) | NodeBody::Dmn(_) => vec![], + NodeBody::Thinking(_) => { + if text.is_empty() { vec![] } + else { vec![(PaneTarget::Autonomous, text, Marker::None)] } + } NodeBody::Content(_) => { if text.is_empty() || text.starts_with("") { vec![] } else { vec![(PaneTarget::Conversation, text, Marker::User)] } @@ -547,6 +551,12 @@ impl InteractScreen { self.tools.push_line(format!(" {}", line), Color::DarkGray); } } + PaneTarget::Autonomous => { + self.autonomous.current_color = Color::Gray; + self.autonomous.append_text(&text); + self.autonomous.pending_marker = marker; + self.autonomous.flush_pending(); + } } } } @@ -558,6 +568,8 @@ impl InteractScreen { => self.conversation.pop_line(), PaneTarget::Tools | PaneTarget::ToolResult => self.tools.pop_line(), + PaneTarget::Autonomous + => self.autonomous.pop_line(), } } }