diff --git a/packages/coding-agent/src/core/defaults.ts b/packages/coding-agent/src/core/defaults.ts new file mode 100644 index 00000000..2d239179 --- /dev/null +++ b/packages/coding-agent/src/core/defaults.ts @@ -0,0 +1,3 @@ +import type { ThinkingLevel } from "@mariozechner/pi-agent-core"; + +export const DEFAULT_THINKING_LEVEL: ThinkingLevel = "medium"; diff --git a/packages/coding-agent/src/core/model-resolver.ts b/packages/coding-agent/src/core/model-resolver.ts index b7631725..b2051fb9 100644 --- a/packages/coding-agent/src/core/model-resolver.ts +++ b/packages/coding-agent/src/core/model-resolver.ts @@ -7,6 +7,7 @@ import { type Api, type KnownProvider, type Model, modelsAreEqual } from "@mario import chalk from "chalk"; import { minimatch } from "minimatch"; import { isValidThinkingLevel } from "../cli/args.js"; +import { DEFAULT_THINKING_LEVEL } from "./defaults.js"; import type { ModelRegistry } from "./model-registry.js"; /** Default model IDs for each known provider */ @@ -273,7 +274,7 @@ export async function findInitialModel(options: { } = options; let model: Model | undefined; - let thinkingLevel: ThinkingLevel = "off"; + let thinkingLevel: ThinkingLevel = DEFAULT_THINKING_LEVEL; // 1. CLI args take priority if (cliProvider && cliModel) { @@ -282,14 +283,14 @@ export async function findInitialModel(options: { console.error(chalk.red(`Model ${cliProvider}/${cliModel} not found`)); process.exit(1); } - return { model: found, thinkingLevel: "off", fallbackMessage: undefined }; + return { model: found, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined }; } // 2. Use first model from scoped models (skip if continuing/resuming) if (scopedModels.length > 0 && !isContinuing) { return { model: scopedModels[0].model, - thinkingLevel: scopedModels[0].thinkingLevel ?? defaultThinkingLevel ?? "off", + thinkingLevel: scopedModels[0].thinkingLevel ?? defaultThinkingLevel ?? DEFAULT_THINKING_LEVEL, fallbackMessage: undefined, }; } @@ -315,16 +316,16 @@ export async function findInitialModel(options: { const defaultId = defaultModelPerProvider[provider]; const match = availableModels.find((m) => m.provider === provider && m.id === defaultId); if (match) { - return { model: match, thinkingLevel: "off", fallbackMessage: undefined }; + return { model: match, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined }; } } // If no default found, use first available - return { model: availableModels[0], thinkingLevel: "off", fallbackMessage: undefined }; + return { model: availableModels[0], thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined }; } // 5. No model found - return { model: undefined, thinkingLevel: "off", fallbackMessage: undefined }; + return { model: undefined, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined }; } /** diff --git a/packages/coding-agent/src/core/sdk.ts b/packages/coding-agent/src/core/sdk.ts index 9acbab8f..2f8c9959 100644 --- a/packages/coding-agent/src/core/sdk.ts +++ b/packages/coding-agent/src/core/sdk.ts @@ -4,6 +4,7 @@ import type { Message, Model } from "@mariozechner/pi-ai"; import { getAgentDir, getDocsPath } from "../config.js"; import { AgentSession } from "./agent-session.js"; import { AuthStorage } from "./auth-storage.js"; +import { DEFAULT_THINKING_LEVEL } from "./defaults.js"; import type { ExtensionRunner, LoadExtensionsResult, ToolDefinition } from "./extensions/index.js"; import { convertToLlm } from "./messages.js"; import { ModelRegistry } from "./model-registry.js"; @@ -50,7 +51,7 @@ export interface CreateAgentSessionOptions { /** Model to use. Default: from settings, else first available */ model?: Model; - /** Thinking level. Default: from settings, else 'off' (clamped to model capabilities) */ + /** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */ thinkingLevel?: ThinkingLevel; /** Models available for cycling (Ctrl+P in interactive mode) */ scopedModels?: Array<{ model: Model; thinkingLevel: ThinkingLevel }>; @@ -223,7 +224,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {} // Fall back to settings default if (thinkingLevel === undefined) { - thinkingLevel = settingsManager.getDefaultThinkingLevel() ?? "off"; + thinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL; } // Clamp to model capabilities diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts index ed8798ac..35ec57d4 100644 --- a/packages/coding-agent/src/main.ts +++ b/packages/coding-agent/src/main.ts @@ -15,6 +15,7 @@ import { listModels } from "./cli/list-models.js"; import { selectSession } from "./cli/session-picker.js"; import { getAgentDir, getModelsPath, VERSION } from "./config.js"; import { AuthStorage } from "./core/auth-storage.js"; +import { DEFAULT_THINKING_LEVEL } from "./core/defaults.js"; import { exportFromFile } from "./core/export-html/index.js"; import type { LoadExtensionsResult } from "./core/extensions/index.js"; import { KeybindingsManager } from "./core/keybindings.js"; @@ -399,7 +400,7 @@ function buildSessionOptions( // Scoped models for Ctrl+P cycling - fill in default thinking level for models without explicit level if (scopedModels.length > 0) { - const defaultThinkingLevel = settingsManager.getDefaultThinkingLevel() ?? "off"; + const defaultThinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL; options.scopedModels = scopedModels.map((sm) => ({ model: sm.model, thinkingLevel: sm.thinkingLevel ?? defaultThinkingLevel, diff --git a/packages/coding-agent/src/modes/interactive/components/footer.ts b/packages/coding-agent/src/modes/interactive/components/footer.ts index 2ccbb5c9..f8865d2d 100644 --- a/packages/coding-agent/src/modes/interactive/components/footer.ts +++ b/packages/coding-agent/src/modes/interactive/components/footer.ts @@ -172,13 +172,12 @@ export class FooterComponent implements Component { // Calculate available space for padding (minimum 2 spaces between stats and model) const minPadding = 2; - // Add thinking level hint if model supports reasoning and thinking is enabled + // Add thinking level indicator if model supports reasoning let rightSideWithoutProvider = modelName; if (state.model?.reasoning) { const thinkingLevel = state.thinkingLevel || "off"; - if (thinkingLevel !== "off") { - rightSideWithoutProvider = `${modelName} • ${thinkingLevel}`; - } + rightSideWithoutProvider = + thinkingLevel === "off" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`; } // Prepend the provider in parentheses if there are multiple providers and there's enough room