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 309bc466269..f8602ef792e 100644 --- a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts +++ b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts @@ -417,7 +417,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 cd51acefe52..7dfcad47bbf 100644 --- a/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts +++ b/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts @@ -262,6 +262,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()") + }) })