From e362e192ac6f64c27e38fbda3fe11d999c1c1cda Mon Sep 17 00:00:00 2001 From: Aarav Sharma Date: Sat, 9 May 2026 10:05:22 -0600 Subject: [PATCH 1/4] agent-manager: use configModel for new worktree dialog and clear stale overrides on config change - Replace session.selected() with session.configModel() in NewWorktreeDialog to reflect the configured model rather than the selected session model. - Add configModel to SessionContext and implement an effect that clears session overrides matching the old config model when the global config model changes, ensuring sessions pick up the new config model. --- .../agent-manager/NewWorktreeDialog.tsx | 2 +- .../webview-ui/src/context/session.tsx | 62 ++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx b/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx index 5f3e40399ee..8a0f6fa2d38 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx @@ -79,7 +79,7 @@ export const NewWorktreeDialog: Component<{ onClose: () => void; defaultBaseBran const cached = vscode.getState>() const [prompt, setPrompt] = createSignal((cached?.advancedDialogPrompt as string) ?? "") const [versions, setVersions] = createSignal(1) - const [model, setModel] = createSignal<{ providerID: string; modelID: string } | null>(session.selected()) + const [model, setModel] = createSignal<{ providerID: string; modelID: string } | null>(session.configModel()) const [compareMode, setCompareMode] = createSignal(false) const [modelAllocations, setModelAllocations] = createSignal(new Map()) const [agent, setAgent] = createSignal(session.selectedAgent()) diff --git a/packages/kilo-vscode/webview-ui/src/context/session.tsx b/packages/kilo-vscode/webview-ui/src/context/session.tsx index 8ebe0d41edf..698b63ef680 100644 --- a/packages/kilo-vscode/webview-ui/src/context/session.tsx +++ b/packages/kilo-vscode/webview-ui/src/context/session.tsx @@ -4,7 +4,7 @@ * Also owns global (extension-lifetime) model selection (provider context is catalog-only). */ -import { createContext, useContext, createSignal, createMemo, createEffect, onMount, onCleanup, batch } from "solid-js" +import { createContext, useContext, createSignal, createMemo, createEffect, onMount, onCleanup, batch, untrack } from "solid-js" import type { ParentComponent, Accessor } from "solid-js" import { createStore, produce, reconcile } from "solid-js/store" import { useVSCode } from "./vscode" @@ -152,6 +152,7 @@ interface SessionContextValue { // Model selection (global, extension-lifetime) selected: (sessionID?: string) => ModelSelection | null + configModel: (sessionID?: string) => ModelSelection | null selectModel: (providerID: string, modelID: string, sessionID?: string) => void hasModelOverride: (sessionID?: string) => boolean clearModelOverride: (sessionID?: string) => void @@ -746,6 +747,64 @@ export const SessionProvider: ParentComponent = (props) => { vscode.postMessage({ type: "requestFavorites" }) onCleanup(unsubFavorites) + // Clear model overrides that match the previous config model (not intentional user overrides). + // When config.model changes, old overrides that were just default values should be cleared + // so sessions fall through to resolveModel() and pick up the new config model. + const [lastConfigModel, setLastConfigModel] = createSignal(getGlobalModel()) + createEffect(() => { + const newConfigModel = getGlobalModel() + // Use untrack to read previous value without making this effect re-trigger on its own updates + const oldConfigModel = untrack(() => lastConfigModel()) + if (oldConfigModel) { + // Also clear when newConfigModel is null (user removed model from config) + if (newConfigModel) { + const modelChanged = + oldConfigModel.providerID !== newConfigModel.providerID || oldConfigModel.modelID !== newConfigModel.modelID + if (modelChanged) { + // Clear overrides that match the OLD config model - these were likely defaults, + // not intentional user overrides. Overrides that differ from both old and new + // config are preserved (intentional user selections). + setStore( + "sessionOverrides", + produce((overrides) => { + for (const sid of Object.keys(overrides)) { + const override = overrides[sid] + if ( + override && + override.providerID === oldConfigModel.providerID && + override.modelID === oldConfigModel.modelID + ) { + delete overrides[sid] + } + } + }), + ) + } + } else { + // newConfigModel is null - clear all overrides that matched the old config model + // since the config no longer specifies a model. This ensures sessions fall through + // to provider defaults rather than using a stale removed model. + setStore( + "sessionOverrides", + produce((overrides) => { + for (const sid of Object.keys(overrides)) { + const override = overrides[sid] + if ( + override && + override.providerID === oldConfigModel.providerID && + override.modelID === oldConfigModel.modelID + ) { + delete overrides[sid] + } + } + }), + ) + } + } + // Update the tracked config model + setLastConfigModel(newConfigModel) + }) + function handleError(message: Extract) { if (!message.sessionID || message.sessionID === currentSessionID()) setLoading(false) if (message.sessionID) patchPage(message.sessionID, { loadingInitial: false, loadingOlder: false }) @@ -2285,6 +2344,7 @@ export const SessionProvider: ParentComponent = (props) => { scopedQuestions, scopedSuggestions, selected, + configModel, selectModel, hasModelOverride, clearModelOverride, From e1e75a382d09ade5137d7a23b28fd430db861ad3 Mon Sep 17 00:00:00 2001 From: Aarav Sharma Date: Sat, 9 May 2026 11:17:12 -0600 Subject: [PATCH 2/4] style: format imports in session.tsx --- .../kilo-vscode/webview-ui/src/context/session.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/kilo-vscode/webview-ui/src/context/session.tsx b/packages/kilo-vscode/webview-ui/src/context/session.tsx index 698b63ef680..7e0372a090a 100644 --- a/packages/kilo-vscode/webview-ui/src/context/session.tsx +++ b/packages/kilo-vscode/webview-ui/src/context/session.tsx @@ -4,7 +4,17 @@ * Also owns global (extension-lifetime) model selection (provider context is catalog-only). */ -import { createContext, useContext, createSignal, createMemo, createEffect, onMount, onCleanup, batch, untrack } from "solid-js" +import { + createContext, + useContext, + createSignal, + createMemo, + createEffect, + onMount, + onCleanup, + batch, + untrack, +} from "solid-js" import type { ParentComponent, Accessor } from "solid-js" import { createStore, produce, reconcile } from "solid-js/store" import { useVSCode } from "./vscode" From 7ac7c1e2832235e418eb7d27f4defdb6a3d139c6 Mon Sep 17 00:00:00 2001 From: Aarav Sharma Date: Sat, 16 May 2026 10:24:02 -0600 Subject: [PATCH 3/4] chore: add changeset for agent-manager model sync --- .changeset/agent-manager-model-sync.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/agent-manager-model-sync.md diff --git a/.changeset/agent-manager-model-sync.md b/.changeset/agent-manager-model-sync.md new file mode 100644 index 00000000000..2971b1b325c --- /dev/null +++ b/.changeset/agent-manager-model-sync.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Fix agent-manager model sync on config change From a8f3a69444c5acf318c59a280296ab859b04db1c Mon Sep 17 00:00:00 2001 From: Aarav Sharma Date: Fri, 22 May 2026 17:11:50 -0600 Subject: [PATCH 4/4] fix(agent-manager): compare and reset worktree model against configModel Use session.configModel() instead of session.selected() in NewWorktreeDialog so the overridden comparison (line 124) and the reset handler (line 444) both use the config-based model. This prevents stale overridden states from session.selected() from leaking into the worktree dialog's override detection and reset behaviour. Partially fixes #9349. --- .../webview-ui/agent-manager/NewWorktreeDialog.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx b/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx index e3f9c439c89..74d68b28d7b 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx @@ -121,7 +121,7 @@ export const NewWorktreeDialog: Component<{ onClose: () => void; defaultBaseBran // True when the user has changed the model from the session/config default const overridden = createMemo(() => { const sel = model() - const cfg = session.selected() + const cfg = session.configModel() if (!sel || !cfg) return false return sel.providerID !== cfg.providerID || sel.modelID !== cfg.modelID }) @@ -441,7 +441,7 @@ export const NewWorktreeDialog: Component<{ onClose: () => void; defaultBaseBran