From edf13e1f494f542c5cf148b4dee6dd3779340c9b Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Thu, 30 Jul 2026 13:50:14 +0200 Subject: [PATCH] fix(agent-manager): open terminal when switching worktrees --- .changeset/quiet-terminals-switch.md | 5 +++++ .../tests/unit/agent-manager-terminal-side.test.ts | 14 ++++++++++++++ .../webview-ui/agent-manager/AgentManagerApp.tsx | 1 + .../webview-ui/agent-manager/terminal/side.ts | 8 +++++++- 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changeset/quiet-terminals-switch.md diff --git a/.changeset/quiet-terminals-switch.md b/.changeset/quiet-terminals-switch.md new file mode 100644 index 00000000000..0306eb34755 --- /dev/null +++ b/.changeset/quiet-terminals-switch.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Open an embedded terminal automatically when switching to a worktree without one. diff --git a/packages/kilo-vscode/tests/unit/agent-manager-terminal-side.test.ts b/packages/kilo-vscode/tests/unit/agent-manager-terminal-side.test.ts index 3043b1c9065..572cad965a8 100644 --- a/packages/kilo-vscode/tests/unit/agent-manager-terminal-side.test.ts +++ b/packages/kilo-vscode/tests/unit/agent-manager-terminal-side.test.ts @@ -73,6 +73,20 @@ describe("Agent Manager side terminal controller", () => { expect(hidden.calls.hide).toBe(0) }) + it("ensures an open terminal panel has a terminal after switching contexts", () => { + const visible = scene({ visible: true }) + visible.ctl.syncContext("wt-2", "wt-1") + expect(visible.calls.requestSide).toBe(1) + + visible.ctl.syncContext("wt-2", "wt-2") + visible.ctl.syncContext("wt-2", undefined) + expect(visible.calls.requestSide).toBe(1) + + const hidden = scene() + hidden.ctl.syncContext("wt-2", "wt-1") + expect(hidden.calls.requestSide).toBe(0) + }) + it("kills the focused terminal and refocuses the chat", () => { const focused = scene({ focusedId: "terminal:two" }) expect(focused.ctl.close()).toBe(true) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx index 551a3a1cd70..74f647d8f82 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx @@ -1870,6 +1870,7 @@ const AgentManagerContent: Component = () => { ) as never, ), }) + createEffect(on(terms.sideKey, (key, previous) => sideCtl.syncContext(key, previous), { defer: true })) const handleReviewTabMouseDown = (e: MouseEvent) => { if (e.button !== 1) return diff --git a/packages/kilo-vscode/webview-ui/agent-manager/terminal/side.ts b/packages/kilo-vscode/webview-ui/agent-manager/terminal/side.ts index 4856da504cb..d15bdb4a303 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/terminal/side.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/terminal/side.ts @@ -109,6 +109,12 @@ export function createSideTerminal(deps: SideTerminalDeps) { deps.handlers.requestSide() } + /** Keep an open terminal panel useful when its worktree context changes. */ + const syncContext = (key: string, previous: string | undefined) => { + if (!previous || key === previous || !deps.visible()) return + deps.handlers.requestSide() + } + /** Kill the focused side terminal (Cmd/Ctrl+W). The panel stays open * on the remaining terminals, or on the empty state when this was * the last one. */ @@ -159,5 +165,5 @@ export function createSideTerminal(deps: SideTerminalDeps) { setDestination(target) } - return { destination, syncDefault, toggle, close, openPreferred, choose } + return { destination, syncDefault, syncContext, toggle, close, openPreferred, choose } }