From 51fdd6e973d9f6b4d294b721917a82e80699621a Mon Sep 17 00:00:00 2001 From: Jeremy Date: Tue, 14 Apr 2026 22:58:56 -0500 Subject: [PATCH] fix(chat): cap claude reasoning blocks to keep chat visible --- .../modes/interactive/components/assistant-message.ts | 6 +++++- .../assistant-message-thinking-visibility.test.ts | 10 ++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts b/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts index 996354512..1b32fa6c7 100644 --- a/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +++ b/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts @@ -89,6 +89,10 @@ export class AssistantMessageComponent extends Container { ); const hasTextContent = message.content.some((c) => c.type === "text" && c.text.trim().length > 0); const hasToolContent = message.content.some((c) => c.type === "toolCall" || c.type === "serverToolUse"); + // Claude Code often emits long reasoning blocks ahead of user-visible text/tool + // output in the same lifecycle. Keep chat output visible without requiring a + // manual thinking toggle every turn. + const shouldCapThinking = hasTextContent || hasToolContent || message.provider === "claude-code"; if (hasVisibleContent) { this.contentContainer.addChild(new Spacer(1)); @@ -122,7 +126,7 @@ export class AssistantMessageComponent extends Container { }); // Keep visible chat output readable when thinking traces are long. // Tool-bearing turns can stream text in a later assistant message. - if (hasTextContent || hasToolContent) { + if (shouldCapThinking) { thinkingMarkdown.maxLines = 8; } this.contentContainer.addChild(thinkingMarkdown); diff --git a/src/tests/assistant-message-thinking-visibility.test.ts b/src/tests/assistant-message-thinking-visibility.test.ts index 2821cf64a..0891f1223 100644 --- a/src/tests/assistant-message-thinking-visibility.test.ts +++ b/src/tests/assistant-message-thinking-visibility.test.ts @@ -34,7 +34,13 @@ test("assistant-message caps thinking block height when text content is present" assert.match( src, - /if \(hasTextContent \|\| hasToolContent\)\s*\{\s*thinkingMarkdown\.maxLines = 8;\s*\}/s, - "assistant-message should cap visible thinking lines when assistant text exists or tool blocks are present", + /const shouldCapThinking = hasTextContent \|\| hasToolContent \|\| message\.provider === "claude-code";/, + "assistant-message should derive a cap policy that also covers claude-code long reasoning traces", + ); + + assert.match( + src, + /if \(shouldCapThinking\)\s*\{\s*thinkingMarkdown\.maxLines = 8;\s*\}/s, + "assistant-message should cap visible thinking lines when the cap policy is active", ); });