Skip to content

Commit 5f37021

Browse files
authored
Implement "delete" action for chat history (microsoft#183609)
1 parent 78643b0 commit 5f37021

File tree

3 files changed

+31
-16
lines changed

3 files changed

+31
-16
lines changed

src/vs/workbench/contrib/chat/browser/actions/chatActions.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import { Codicon } from 'vs/base/common/codicons';
77
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
8+
import { ThemeIcon } from 'vs/base/common/themables';
89
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
910
import { EditorAction, EditorAction2, ServicesAccessor, registerEditorAction } from 'vs/editor/browser/editorExtensions';
1011
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
@@ -185,9 +186,20 @@ export function getHistoryAction(viewId: string, providerId: string) {
185186
const items = chatService.getHistory();
186187
const picks = items.map(i => (<IQuickPickItem & { chat: IChatDetail }>{
187188
label: i.title,
188-
chat: i
189+
chat: i,
190+
buttons: [{
191+
iconClass: ThemeIcon.asClassName(Codicon.x),
192+
tooltip: localize('interactiveSession.history.delete', "Delete"),
193+
}]
189194
}));
190-
const selection = await quickInputService.pick(picks, { placeHolder: localize('interactiveSession.history.pick', "Select a chat session to restore") });
195+
const selection = await quickInputService.pick(picks,
196+
{
197+
placeHolder: localize('interactiveSession.history.pick', "Select a chat session to restore"),
198+
onDidTriggerItemButton: context => {
199+
chatService.removeHistoryEntry(context.item.chat.sessionId);
200+
context.removeItem();
201+
}
202+
});
191203
if (selection) {
192204
const sessionId = selection.chat.sessionId;
193205
await editorService.openEditor({

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ export interface IChatService {
195195
addCompleteRequest(sessionId: string, message: string, response: IChatCompleteResponse): void;
196196
sendRequestToProvider(sessionId: string, message: IChatDynamicRequest): void;
197197
getHistory(): IChatDetail[];
198+
removeHistoryEntry(sessionId: string): void;
198199

199200
onDidPerformUserAction: Event<IChatUserActionEvent>;
200201
notifyUserAction(event: IChatUserActionEvent): void;

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

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ type ChatTerminalClassification = {
103103
comment: 'Provides insight into the usage of Chat features.';
104104
};
105105

106-
const maxPersistedSessions = 20;
106+
const maxPersistedSessions = 25;
107107

108108
export class ChatService extends Disposable implements IChatService {
109109
declare _serviceBrand: undefined;
@@ -147,7 +147,9 @@ export class ChatService extends Disposable implements IChatService {
147147
let allSessions: (ChatModel | ISerializableChatData)[] = Array.from(this._sessionModels.values())
148148
.filter(session => session.getRequests().length > 0);
149149
allSessions = allSessions.concat(
150-
Object.values(this._persistedSessions).filter(session => session.requests.length));
150+
Object.values(this._persistedSessions)
151+
.filter(session => !this._sessionModels.has(session.sessionId))
152+
.filter(session => session.requests.length));
151153
allSessions.sort((a, b) => (b.creationDate ?? 0) - (a.creationDate ?? 0));
152154
allSessions = allSessions.slice(0, maxPersistedSessions);
153155
this.trace('onWillSaveState', `Persisting ${allSessions.length} sessions`);
@@ -219,12 +221,18 @@ export class ChatService extends Disposable implements IChatService {
219221
const sessions = Object.values(this._persistedSessions);
220222
sessions.sort((a, b) => (b.creationDate ?? 0) - (a.creationDate ?? 0));
221223

222-
return sessions.map(item => {
223-
return <IChatDetail>{
224-
sessionId: item.sessionId,
225-
title: item.requests[0]?.message || '',
226-
};
227-
});
224+
return sessions
225+
.filter(session => !this._sessionModels.has(session.sessionId))
226+
.map(item => {
227+
return <IChatDetail>{
228+
sessionId: item.sessionId,
229+
title: item.requests[0]?.message || '',
230+
};
231+
});
232+
}
233+
234+
removeHistoryEntry(sessionId: string): void {
235+
delete this._persistedSessions[sessionId];
228236
}
229237

230238
startSession(providerId: string, token: CancellationToken): ChatModel {
@@ -267,11 +275,6 @@ export class ChatService extends Disposable implements IChatService {
267275
}
268276

269277
if (!session) {
270-
if (sessionHistory) {
271-
// sessionHistory was not used, so store it for later
272-
this._persistedSessions[sessionHistory.sessionId] = sessionHistory;
273-
}
274-
275278
this.trace('startSession', 'Provider returned no session');
276279
return undefined;
277280
}
@@ -301,7 +304,6 @@ export class ChatService extends Disposable implements IChatService {
301304
return undefined;
302305
}
303306

304-
delete this._persistedSessions[sessionId];
305307
return this._startSession(sessionData.providerId, sessionData, CancellationToken.None);
306308
}
307309

0 commit comments

Comments
 (0)