When entering plan mode, the thinking level configured on the plan role (e.g., 'anthropic/claude-sonnet-4-5:xhigh') was discarded because #resolveRoleModel() called resolveModelRoleValue() but only returned .model, dropping the thinking level. This is the same class of bug that was fixed in cycleRoleModels (which correctly preserves and applies thinking level from role configs). #applyPlanModeModel was the remaining unfixed call site. Changes: - Refactor #resolveRoleModel to #resolveRoleModelFull returning the full ResolvedModelRoleValue instead of just Model - Add resolveRoleModelWithThinking() public method exposing the full resolution result - Add optional thinkingLevel param to setModelTemporary() for atomic model+thinking switches (eliminates two-step set-then-apply pattern) - Bundle model+thinking into paired state objects in InteractiveMode (#planModePreviousModelState, #pendingModelSwitch) — eliminates 4 parallel fields that could desync - Simplify #applyPlanModeModel, flushPendingModelSwitch, #exitPlanMode to single setModelTemporary calls - Collapse cycleRoleModels two-step into single setModelTemporary call - Add 6 tests for resolveRoleModelWithThinking
@oh-my-pi/pi-coding-agent
Core implementation package for the omp coding agent in the oh-my-pi monorepo.
For installation, setup, provider configuration, model roles, slash commands, and full CLI reference, see:
Package-specific references: