diff --git a/src/agent/cli/commands/run.ts b/src/agent/cli/commands/run.ts index e404013b4..df7127ab2 100644 --- a/src/agent/cli/commands/run.ts +++ b/src/agent/cli/commands/run.ts @@ -7,6 +7,7 @@ */ import { Agent } from "../../runner.js"; +import type { AgentOptions } from "../../types.js"; import type { ToolsConfig } from "../../tools/policy.js"; import { cyan, yellow, dim } from "../colors.js"; @@ -198,7 +199,7 @@ export async function runCommand(args: string[]): Promise { baseUrl: opts.baseUrl, systemPrompt: opts.system, thinkingLevel: opts.thinking as any, - reasoningMode: (opts.reasoning as any) ?? undefined, + reasoningMode: opts.reasoning as AgentOptions["reasoningMode"], cwd: opts.cwd, sessionId: opts.session, debug: opts.debug, diff --git a/src/agent/cli/interactive.ts b/src/agent/cli/interactive.ts index bd6131aba..3a4e36591 100644 --- a/src/agent/cli/interactive.ts +++ b/src/agent/cli/interactive.ts @@ -349,7 +349,7 @@ class InteractiveCLI { model: this.opts.model, systemPrompt: this.opts.system, thinkingLevel: this.opts.thinking as AgentOptions["thinkingLevel"], - reasoningMode: (this.opts.reasoning as AgentOptions["reasoningMode"]) ?? undefined, + reasoningMode: this.opts.reasoning as AgentOptions["reasoningMode"], cwd: this.opts.cwd, sessionId, }); diff --git a/src/agent/cli/non-interactive.ts b/src/agent/cli/non-interactive.ts index 004facfc5..2cff5c4f0 100644 --- a/src/agent/cli/non-interactive.ts +++ b/src/agent/cli/non-interactive.ts @@ -177,7 +177,7 @@ async function main() { baseUrl: opts.baseUrl, systemPrompt: opts.system, thinkingLevel: opts.thinking as any, - reasoningMode: (opts.reasoning as any) ?? undefined, + reasoningMode: opts.reasoning as any, cwd: opts.cwd, sessionId: opts.session, debug: opts.debug, diff --git a/src/agent/cli/output.ts b/src/agent/cli/output.ts index b47468aca..fe4fa058a 100644 --- a/src/agent/cli/output.ts +++ b/src/agent/cli/output.ts @@ -249,8 +249,8 @@ export function createAgentOutput(params: { state.streaming = false; state.lastAssistantText = text; - // Extract and store thinking content - const thinking = extractThinking(msg); + // Extract and store thinking content (skip when off) + const thinking = reasoningMode !== "off" ? extractThinking(msg) : ""; state.lastAssistantThinking = thinking; // Show thinking at end for "on" mode diff --git a/src/agent/runner.ts b/src/agent/runner.ts index c395e3952..4440f2376 100644 --- a/src/agent/runner.ts +++ b/src/agent/runner.ts @@ -70,7 +70,7 @@ export class Agent { private readonly skillManager?: SkillManager; private readonly contextWindowGuard: ContextWindowGuardResult; private readonly debug: boolean; - private readonly reasoningMode: ReasoningMode; + private reasoningMode: ReasoningMode; private toolsOptions: AgentOptions; private readonly originalToolsConfig?: ToolsConfig; private readonly stderr: NodeJS.WritableStream; @@ -267,6 +267,18 @@ export class Agent { this.agent.setThinkingLevel(options.thinkingLevel); } + // Resolve reasoningMode: options > profile config > storedMeta > default "stream" + if (!options.reasoningMode) { + const profileReasoningMode = this.profile?.getProfile()?.config?.reasoningMode; + const metaReasoningMode = storedMeta?.reasoningMode as ReasoningMode | undefined; + const resolved = profileReasoningMode ?? metaReasoningMode ?? "stream"; + if (resolved !== this.reasoningMode) { + this.reasoningMode = resolved; + // Re-create output with correct reasoningMode + this.output = createAgentOutput({ stdout, stderr: this.stderr, reasoningMode: this.reasoningMode }); + } + } + this.agent.setModel(model); // Save original tools config from options (for later merging during reload)