From beecac5671327f00cd08c718496a2f05202111cf Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Fri, 19 Dec 2025 01:44:46 +0300 Subject: [PATCH] fix: memory leak in terminal chat widget (#284325) --- .../terminalContrib/chat/browser/terminalChatWidget.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts index f980b6ab2ee..f501656ede6 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts @@ -8,7 +8,7 @@ import { Dimension, getActiveWindow, IFocusTracker, trackFocus } from '../../../ import { CancelablePromise, createCancelablePromise, DeferredPromise } from '../../../../../base/common/async.js'; import { CancellationTokenSource } from '../../../../../base/common/cancellation.js'; import { Emitter, Event } from '../../../../../base/common/event.js'; -import { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../../../../../base/common/lifecycle.js'; +import { Disposable, DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../../base/common/lifecycle.js'; import { autorun, observableValue, type IObservable } from '../../../../../base/common/observable.js'; import { MicrotaskDelay } from '../../../../../base/common/symbols.js'; import { localize } from '../../../../../nls.js'; @@ -82,6 +82,7 @@ export class TerminalChatWidget extends Disposable { private _terminalAgentName = 'terminal'; private readonly _model: MutableDisposable = this._register(new MutableDisposable()); + private readonly _sessionDisposables: MutableDisposable = this._register(new MutableDisposable()); private _sessionCtor: CancelablePromise | undefined; @@ -334,7 +335,7 @@ export class TerminalChatWidget extends Disposable { this._resetPlaceholder(); } }); - this._register(toDisposable(() => this._sessionCtor?.cancel())); + this._sessionDisposables.value = toDisposable(() => this._sessionCtor?.cancel()); } private _saveViewState() {