diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 7de11cc4d42..c4b4e640f50 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -4,6 +4,7 @@ ### Fixed +- Fixed the temporary model selector (`Alt+P` / `/switch` / `/model --temporary`) ignoring custom role-specific thinking level overrides from `config.yml` (e.g. `:high`), reverting to the model's native default level instead - Improved search reliability for Perplexity provider by forcing retrieval for all queries - Fixed JS eval cells losing top-level `function` and `var` declarations across cells when the defining cell contained top-level `await` — the async wrapper scoped them to the cell's IIFE instead of publishing them to the worker global diff --git a/packages/coding-agent/src/modes/controllers/selector-controller.ts b/packages/coding-agent/src/modes/controllers/selector-controller.ts index e101bbc5fa3..7d5bf8ed671 100644 --- a/packages/coding-agent/src/modes/controllers/selector-controller.ts +++ b/packages/coding-agent/src/modes/controllers/selector-controller.ts @@ -12,7 +12,12 @@ import { resolveAdvisorConfigEditPath, saveWatchdogConfigFile, } from "../../advisor"; -import { formatModelSelectorValue, resolveAdvisorRoleSelection } from "../../config/model-resolver"; +import { + formatModelSelectorValue, + getModelMatchPreferences, + resolveAdvisorRoleSelection, + resolveModelRoleValue, +} from "../../config/model-resolver"; import { getRoleInfo } from "../../config/model-roles"; import { settings } from "../../config/settings"; import { disableProvider, enableProvider } from "../../discovery"; @@ -688,8 +693,30 @@ export class SelectorController { }, onPick: async (model, selector) => { try { + // Resolve configured thinking level from settings roles if it matches this model + const availableModels = this.ctx.session.modelRegistry.getAvailable(); + const matchPreferences = getModelMatchPreferences(this.ctx.settings); + let resolvedThinkingLevel: ConfiguredThinkingLevel | undefined; + + for (const [, roleModelStr] of Object.entries(this.ctx.settings.getModelRoles())) { + const resolved = resolveModelRoleValue(roleModelStr, availableModels, { + settings: this.ctx.settings, + matchPreferences, + }); + if ( + resolved.model && + resolved.model.provider === model.provider && + resolved.model.id === model.id + ) { + if (resolved.explicitThinkingLevel && resolved.thinkingLevel !== undefined) { + resolvedThinkingLevel = resolved.thinkingLevel; + break; + } + } + } + // Session-only: update agent state but don't persist the model to settings. - await this.ctx.session.setModelTemporary(model); + await this.ctx.session.setModelTemporary(model, resolvedThinkingLevel); this.ctx.statusLine.invalidate(); this.ctx.updateEditorBorderColor(); const roleSelectorHint = this.ctx.keybindings.getKeys("app.model.select")[0] ?? "Alt+M";