From f3834dfce862be4aed3924c311c8f6fff15bcbb9 Mon Sep 17 00:00:00 2001 From: roboomp Date: Thu, 2 Jul 2026 11:27:47 +0000 Subject: [PATCH] fix(agent): rebuilt advisor on explicit enable Rebuilt live advisor runtimes when the explicit enable path runs so changed modelRoles.advisor values are re-resolved without restarting the session. Added a regression test covering a live advisor moving from one role model to another through setAdvisorEnabled(true). Fixes #4302 --- packages/coding-agent/CHANGELOG.md | 4 ++++ .../coding-agent/src/session/agent-session.ts | 1 + .../coding-agent/test/advisor-toggle.test.ts | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 64c3c57ae..356f22df3 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed explicit `/advisor on` to rebuild the live advisor runtime after `modelRoles.advisor` changes so it rebinds to the newly configured model. ([#4302](https://github.com/can1357/oh-my-pi/issues/4302)) + ## [16.3.1] - 2026-07-02 ### Breaking Changes diff --git a/packages/coding-agent/src/session/agent-session.ts b/packages/coding-agent/src/session/agent-session.ts index fbb2c6fad..54e3a749b 100644 --- a/packages/coding-agent/src/session/agent-session.ts +++ b/packages/coding-agent/src/session/agent-session.ts @@ -15187,6 +15187,7 @@ export class AgentSession { setAdvisorEnabled(enabled: boolean): boolean { this.#advisorEnabled = enabled; if (enabled) { + if (this.#advisors.length > 0) this.#stopAdvisorRuntime(); return this.#buildAdvisorRuntime(true); } this.#stopAdvisorRuntime(); diff --git a/packages/coding-agent/test/advisor-toggle.test.ts b/packages/coding-agent/test/advisor-toggle.test.ts index b1edf5cc8..9d47091e4 100644 --- a/packages/coding-agent/test/advisor-toggle.test.ts +++ b/packages/coding-agent/test/advisor-toggle.test.ts @@ -15,15 +15,20 @@ describe("AgentSession advisor toggle", () => { let authStorage: AuthStorage; let modelRegistry: ModelRegistry; let model: Model; + let replacementModel: Model; beforeAll(async () => { sharedDir = TempDir.createSync("@pi-advisor-toggle-shared-"); authStorage = await AuthStorage.create(path.join(sharedDir.path(), "testauth.db")); authStorage.setRuntimeApiKey("anthropic", "test-key"); + authStorage.setRuntimeApiKey("openai", "test-key"); modelRegistry = new ModelRegistry(authStorage); const bundled = getBundledModel("anthropic", "claude-sonnet-4-5"); + const replacement = getBundledModel("openai", "gpt-4o-mini"); if (!bundled) throw new Error("Expected built-in anthropic model to exist"); + if (!replacement) throw new Error("Expected built-in OpenAI model to exist"); model = bundled; + replacementModel = replacement; }); afterAll(async () => { @@ -80,6 +85,19 @@ describe("AgentSession advisor toggle", () => { expect(session.formatAdvisorStatus()).toContain("Advisor is enabled (anthropic/claude-sonnet-4-5)"); }); + it("explicit enable rebuilds the runtime when the advisor role changes", () => { + session.settings.setModelRole("advisor", `${model.provider}/${model.id}`); + expect(session.setAdvisorEnabled(true)).toBe(true); + expect(session.getAdvisorAgent()?.state.model.provider).toBe(model.provider); + expect(session.getAdvisorAgent()?.state.model.id).toBe(model.id); + + session.settings.setModelRole("advisor", `${replacementModel.provider}/${replacementModel.id}`); + expect(session.setAdvisorEnabled(true)).toBe(true); + + expect(session.getAdvisorAgent()?.state.model.provider).toBe(replacementModel.provider); + expect(session.getAdvisorAgent()?.state.model.id).toBe(replacementModel.id); + }); + it("explicit enable overrides default-off setting for the session only", () => { session.settings.setModelRole("advisor", "anthropic/claude-sonnet-4-5"); session.settings.override("advisor.enabled", false);