diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts index 3a7a96f9..ce4875e8 100644 --- a/packages/coding-agent/src/main.ts +++ b/packages/coding-agent/src/main.ts @@ -1,4 +1,4 @@ -import { Agent, ProviderTransport } from "@mariozechner/pi-agent"; +import { Agent, ProviderTransport, type ThinkingLevel } from "@mariozechner/pi-agent"; import { getModel } from "@mariozechner/pi-ai"; import chalk from "chalk"; import { readFileSync } from "fs"; @@ -227,6 +227,13 @@ export async function main(args: string[]) { console.log(chalk.dim(`Loaded ${messages.length} messages from previous session`)); agent.replaceMessages(messages); } + + // Load and restore thinking level + const thinkingLevel = sessionManager.loadThinkingLevel() as ThinkingLevel; + if (thinkingLevel && thinkingLevel !== "off") { + agent.setThinkingLevel(thinkingLevel); + console.log(chalk.dim(`Restored thinking level: ${thinkingLevel}`)); + } } // Start session diff --git a/packages/coding-agent/src/session-manager.ts b/packages/coding-agent/src/session-manager.ts index 21f5a791..df084a3a 100644 --- a/packages/coding-agent/src/session-manager.ts +++ b/packages/coding-agent/src/session-manager.ts @@ -19,6 +19,7 @@ export interface SessionHeader { cwd: string; systemPrompt: string; model: string; + thinkingLevel: string; } export interface SessionMessageEntry { @@ -115,6 +116,7 @@ export class SessionManager { cwd: process.cwd(), systemPrompt: state.systemPrompt, model: `${state.model.provider}/${state.model.id}`, + thinkingLevel: state.thinkingLevel, }; appendFileSync(this.sessionFile, JSON.stringify(entry) + "\n"); } @@ -157,6 +159,27 @@ export class SessionManager { return messages; } + loadThinkingLevel(): string { + if (!existsSync(this.sessionFile)) return "off"; + + const lines = readFileSync(this.sessionFile, "utf8").trim().split("\n"); + + // Find the most recent session header with thinking level + let lastThinkingLevel = "off"; + for (const line of lines) { + try { + const entry = JSON.parse(line); + if (entry.type === "session" && entry.thinkingLevel) { + lastThinkingLevel = entry.thinkingLevel; + } + } catch { + // Skip malformed lines + } + } + + return lastThinkingLevel; + } + getSessionId(): string { return this.sessionId; } diff --git a/packages/coding-agent/src/tui/assistant-message.ts b/packages/coding-agent/src/tui/assistant-message.ts index 95529012..0f87fe50 100644 --- a/packages/coding-agent/src/tui/assistant-message.ts +++ b/packages/coding-agent/src/tui/assistant-message.ts @@ -41,9 +41,9 @@ export class AssistantMessageComponent extends Container { this.contentContainer.addChild(new Markdown(content.text.trim(), undefined, undefined, undefined, 1, 0)); } else if (content.type === "thinking" && content.thinking.trim()) { // Thinking traces in dark gray italic - // Apply styling to entire block so wrapping preserves it + // Use Markdown component because it preserves ANSI codes across wrapped lines const thinkingText = chalk.gray.italic(content.thinking); - this.contentContainer.addChild(new Text(thinkingText, 1, 0)); + this.contentContainer.addChild(new Markdown(thinkingText, undefined, undefined, undefined, 1, 0)); this.contentContainer.addChild(new Spacer(1)); } } diff --git a/packages/coding-agent/src/tui/tui-renderer.ts b/packages/coding-agent/src/tui/tui-renderer.ts index 7ab024fc..8e9d9564 100644 --- a/packages/coding-agent/src/tui/tui-renderer.ts +++ b/packages/coding-agent/src/tui/tui-renderer.ts @@ -98,6 +98,7 @@ export class TuiRenderer { // Setup UI layout this.ui.addChild(new Spacer(1)); this.ui.addChild(header); + this.ui.addChild(new Spacer(1)); this.ui.addChild(this.chatContainer); this.ui.addChild(this.statusContainer); this.ui.addChild(new Spacer(1)); @@ -377,11 +378,10 @@ export class TuiRenderer { // Apply the selected thinking level this.agent.setThinkingLevel(level); - // Show confirmation message with padding and blue color - this.chatContainer.addChild(new Text("", 0, 0)); // Blank line before - const confirmText = new Text(chalk.blue(`Thinking level set to: ${level}`), 0, 0); + // Show confirmation message with proper spacing + this.chatContainer.addChild(new Spacer(1)); + const confirmText = new Text(chalk.dim(`Thinking level: ${level}`), 1, 0); this.chatContainer.addChild(confirmText); - this.chatContainer.addChild(new Text("", 0, 0)); // Blank line after // Hide selector and show editor again this.hideThinkingSelector();