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", ); });