From 42e43c4e44a5ae783ca6eae51c05d28c2ef3cedf Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Tue, 5 May 2026 15:47:01 +0200 Subject: [PATCH] fix(vscode): keep active terminal for agent manager context --- .changeset/terminal-context-active.md | 5 +++++ .../src/agent-manager/AgentManagerProvider.ts | 2 +- .../src/agent-manager/SessionTerminalManager.ts | 4 ++++ .../kilo-vscode/tests/unit/agent-manager-arch.test.ts | 9 +++++++++ .../tests/unit/session-terminal-manager.test.ts | 5 +++++ 5 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 .changeset/terminal-context-active.md diff --git a/.changeset/terminal-context-active.md b/.changeset/terminal-context-active.md new file mode 100644 index 00000000000..3e364d57398 --- /dev/null +++ b/.changeset/terminal-context-active.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Capture the active VS Code terminal when using `@terminal` in Agent Manager. diff --git a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts index a511ec63c89..ee1c07d69e6 100644 --- a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts +++ b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts @@ -392,7 +392,7 @@ export class AgentManagerProvider implements Disposable { } if (m.type === "requestTerminalContext") { - if (m.sessionID) this.terminalManager.showExisting(m.sessionID) + if (m.sessionID && !this.terminalManager.hasActiveTerminal()) this.terminalManager.showExisting(m.sessionID) return msg } diff --git a/packages/kilo-vscode/src/agent-manager/SessionTerminalManager.ts b/packages/kilo-vscode/src/agent-manager/SessionTerminalManager.ts index 63e310f8bc2..189045d5a76 100644 --- a/packages/kilo-vscode/src/agent-manager/SessionTerminalManager.ts +++ b/packages/kilo-vscode/src/agent-manager/SessionTerminalManager.ts @@ -182,6 +182,10 @@ export class SessionTerminalManager { return entry !== undefined && entry.terminal.exitStatus === undefined } + hasActiveTerminal(): boolean { + return this.host.activeTerminal() !== undefined + } + dispose(): void { void this.host.setContext("kilo-code.agentTerminalFocus", false) for (const entry of this.terminals.values()) entry.terminal.dispose() diff --git a/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts b/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts index e3dd5b33b2f..306cbfb472c 100644 --- a/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts +++ b/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts @@ -229,6 +229,15 @@ describe("Agent Manager Provider — onMessage routing", () => { expect(text).toContain("syncOnSessionSwitch") }) + it("terminal context keeps the current active terminal when present", () => { + const text = body("onSessionMessage") + const check = text.indexOf("!this.terminalManager.hasActiveTerminal()") + const show = text.indexOf("this.terminalManager.showExisting(m.sessionID)") + expect(check).toBeGreaterThan(-1) + expect(show).toBeGreaterThan(-1) + expect(check, "active terminal check must guard session terminal reveal").toBeLessThan(show) + }) + it("session routing handles clearSession for SSE re-registration", () => { const text = body("onSessionMessage") expect(text).toContain("clearSession") diff --git a/packages/kilo-vscode/tests/unit/session-terminal-manager.test.ts b/packages/kilo-vscode/tests/unit/session-terminal-manager.test.ts index 13ccd532f90..bb08e44b828 100644 --- a/packages/kilo-vscode/tests/unit/session-terminal-manager.test.ts +++ b/packages/kilo-vscode/tests/unit/session-terminal-manager.test.ts @@ -87,4 +87,9 @@ describe("SessionTerminalManager structure", () => { expect(text).toContain("if (!this.panelOpen)") expect(text).toContain("this.showExistingLocal()") }) + + it("exposes active terminal state for terminal context routing", () => { + const text = body("hasActiveTerminal") + expect(text).toContain("this.host.activeTerminal()") + }) })