diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index f7d4c41e5d..719ba879d8 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -1453,6 +1453,8 @@ export class Task extends EventEmitter implements TaskLike { try { // Release any terminals associated with this task. TerminalRegistry.releaseTerminalsForTask(this.taskId) + // Clear the lastUsedTerminal reference to prevent memory leaks + this.lastUsedTerminal = undefined } catch (error) { console.error("Error releasing terminals:", error) } diff --git a/src/core/task/__tests__/Task.dispose.test.ts b/src/core/task/__tests__/Task.dispose.test.ts index 850b050fb8..6c42cc3f5f 100644 --- a/src/core/task/__tests__/Task.dispose.test.ts +++ b/src/core/task/__tests__/Task.dispose.test.ts @@ -198,4 +198,25 @@ describe("Task dispose method", () => { // Verify total listener count is 0 expect(task.eventNames().length).toBe(0) }) + + test("should clear lastUsedTerminal reference to prevent memory leaks", () => { + // Mock a terminal object + const mockTerminal = { + id: "test-terminal-id", + name: "Test Terminal", + dispose: vi.fn(), + } + + // Set lastUsedTerminal on the task + ;(task as any).lastUsedTerminal = mockTerminal + + // Verify it's set + expect((task as any).lastUsedTerminal).toBe(mockTerminal) + + // Call dispose + task.dispose() + + // Verify lastUsedTerminal is cleared + expect((task as any).lastUsedTerminal).toBeUndefined() + }) })