Skip to content

Commit 6209372

Browse files
authored
Dispose chat session on editor close. (microsoft#258747)
1 parent df05c85 commit 6209372

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

src/vs/workbench/api/browser/mainThreadChatSessions.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,11 @@ export class MainThreadChatSessions extends Disposable implements MainThreadChat
133133
};
134134
}
135135

136+
const onWillDisposeEventEmitter = new Emitter<void>();
137+
136138
return {
137139
id: sessionContent.id,
140+
onWillDispose: onWillDisposeEventEmitter.event,
138141
history: sessionContent.history.map(turn => {
139142
if (turn.type === 'request') {
140143
return { type: 'request', prompt: turn.prompt };
@@ -149,6 +152,8 @@ export class MainThreadChatSessions extends Disposable implements MainThreadChat
149152
requestHandler: requestHandler,
150153
interruptActiveResponseCallback: interruptActiveResponseCallback,
151154
dispose: () => {
155+
onWillDisposeEventEmitter.fire();
156+
onWillDisposeEventEmitter.dispose();
152157
progressEmitter.dispose();
153158
completionEmitter.dispose();
154159
this._proxy.$disposeChatSessionContent(providerHandle, sessionContent.id);

src/vs/workbench/contrib/chat/browser/chatSessions.contribution.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { CancellationToken } from '../../../../base/common/cancellation.js';
77
import { Codicon } from '../../../../base/common/codicons.js';
88
import { Emitter, Event } from '../../../../base/common/event.js';
9-
import { Disposable, IDisposable } from '../../../../base/common/lifecycle.js';
9+
import { Disposable, DisposableStore, IDisposable } from '../../../../base/common/lifecycle.js';
1010
import { localize } from '../../../../nls.js';
1111
import { ContextKeyExpr, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
1212
import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';
@@ -102,17 +102,22 @@ const workbenchRegistry = Registry.as<IWorkbenchContributionsRegistry>(Workbench
102102
workbenchRegistry.registerWorkbenchContribution(ChatSessionsContribution, LifecyclePhase.Restored);
103103

104104
class ContributedChatSessionData implements IDisposable {
105+
private readonly _disposableStore: DisposableStore;
106+
105107
constructor(
106108
readonly session: ChatSession,
107109
readonly chatSessionType: string,
108110
readonly id: string,
109111
private readonly onWillDispose: (session: ChatSession, chatSessionType: string, id: string) => void
110112
) {
113+
this._disposableStore = new DisposableStore();
114+
this._disposableStore.add(this.session.onWillDispose(() => {
115+
this.onWillDispose(this.session, this.chatSessionType, this.id);
116+
}));
111117
}
112118

113119
dispose(): void {
114-
this.onWillDispose(this.session, this.chatSessionType, this.id);
115-
this.session.dispose();
120+
this._disposableStore.dispose();
116121
}
117122
}
118123

@@ -411,7 +416,9 @@ export class ChatSessionsService extends Disposable implements IChatSessionsServ
411416
this._sessions.set(sessionKey, sessionData);
412417

413418
return session;
414-
} private _onWillDisposeSession(session: ChatSession, chatSessionType: string, id: string): void {
419+
}
420+
421+
private _onWillDisposeSession(session: ChatSession, chatSessionType: string, id: string): void {
415422
const sessionKey = `${chatSessionType}_${id}`;
416423
this._sessions.delete(sessionKey);
417424
}

src/vs/workbench/contrib/chat/common/chatSessionsService.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export interface IChatSessionItem {
3434

3535
export interface ChatSession extends IDisposable {
3636
readonly id: string;
37+
readonly onWillDispose: Event<void>;
3738

3839
history: Array<
3940
| { type: 'request'; prompt: string }

0 commit comments

Comments
 (0)