Skip to content

Commit b10b0bb

Browse files
authored
make sure inline chat restore state after switching files and but dismisses empty sessions (#280000)
* 💄 * make sure inline chat restore state after switching files and but dismisses empty sessions fixes #278060
1 parent eb7f068 commit b10b0bb

File tree

4 files changed

+43
-31
lines changed

4 files changed

+43
-31
lines changed

src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,7 +1272,7 @@ export class InlineChatController2 implements IEditorContribution {
12721272
private readonly _editor: ICodeEditor,
12731273
@IInstantiationService private readonly _instaService: IInstantiationService,
12741274
@INotebookEditorService private readonly _notebookEditorService: INotebookEditorService,
1275-
@IInlineChatSessionService private readonly _inlineChatSessions: IInlineChatSessionService,
1275+
@IInlineChatSessionService private readonly _inlineChatSessionService: IInlineChatSessionService,
12761276
@ICodeEditorService codeEditorService: ICodeEditorService,
12771277
@IContextKeyService contextKeyService: IContextKeyService,
12781278
@ISharedWebContentExtractorService private readonly _webContentExtractorService: ISharedWebContentExtractorService,
@@ -1360,22 +1360,35 @@ export class InlineChatController2 implements IEditorContribution {
13601360

13611361
const editorObs = observableCodeEditor(_editor);
13621362

1363-
const sessionsSignal = observableSignalFromEvent(this, _inlineChatSessions.onDidChangeSessions);
1363+
const sessionsSignal = observableSignalFromEvent(this, _inlineChatSessionService.onDidChangeSessions);
13641364

13651365
this._currentSession = derived(r => {
13661366
sessionsSignal.read(r);
13671367
const model = editorObs.model.read(r);
1368-
const value = model && _inlineChatSessions.getSession2(model.uri);
1369-
return value ?? undefined;
1368+
const session = model && _inlineChatSessionService.getSession2(model.uri);
1369+
return session ?? undefined;
13701370
});
13711371

13721372

1373+
let lastSession: IInlineChatSession2 | undefined = undefined;
1374+
13731375
this._store.add(autorun(r => {
13741376
const session = this._currentSession.read(r);
13751377
if (!session) {
13761378
this._isActiveController.set(false, undefined);
1379+
1380+
if (lastSession && !lastSession.chatModel.hasRequests) {
1381+
const state = lastSession.chatModel.inputModel.state.read(undefined);
1382+
if (!state || (!state.inputText && state.attachments.length === 0)) {
1383+
lastSession.dispose();
1384+
lastSession = undefined;
1385+
}
1386+
}
13771387
return;
13781388
}
1389+
1390+
lastSession = session;
1391+
13791392
let foundOne = false;
13801393
for (const editor of codeEditorService.listCodeEditors()) {
13811394
if (Boolean(InlineChatController2.get(editor)?._isActiveController.read(undefined))) {
@@ -1409,11 +1422,12 @@ export class InlineChatController2 implements IEditorContribution {
14091422
const session = visibleSessionObs.read(r);
14101423
if (!session) {
14111424
this._zone.rawValue?.hide();
1425+
this._zone.value.widget.chatWidget.setModel(undefined);
14121426
_editor.focus();
14131427
ctxInlineChatVisible.reset();
14141428
} else {
14151429
ctxInlineChatVisible.set(true);
1416-
this._zone.value.widget.setChatModel(session.chatModel);
1430+
this._zone.value.widget.chatWidget.setModel(session.chatModel);
14171431
if (!this._zone.value.position) {
14181432
this._zone.value.widget.chatWidget.input.renderAttachedContext(); // TODO - fights layout bug
14191433
this._zone.value.show(session.initialPosition);
@@ -1537,15 +1551,15 @@ export class InlineChatController2 implements IEditorContribution {
15371551

15381552
const uri = this._editor.getModel().uri;
15391553

1540-
const existingSession = this._inlineChatSessions.getSession2(uri);
1554+
const existingSession = this._inlineChatSessionService.getSession2(uri);
15411555
if (existingSession) {
15421556
await existingSession.editingSession.accept();
15431557
existingSession.dispose();
15441558
}
15451559

15461560
this._isActiveController.set(true, undefined);
15471561

1548-
const session = await this._inlineChatSessions.createSession2(this._editor, uri, CancellationToken.None);
1562+
const session = await this._inlineChatSessionService.createSession2(this._editor, uri, CancellationToken.None);
15491563

15501564
// ADD diagnostics
15511565
const entries: IChatRequestVariableEntry[] = [];

src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export interface IInlineChatSessionService {
6767

6868
createSession2(editor: ICodeEditor, uri: URI, token: CancellationToken): Promise<IInlineChatSession2>;
6969
getSession2(uri: URI): IInlineChatSession2 | undefined;
70-
getSession2(sessionId: string): IInlineChatSession2 | undefined;
70+
getSessionBySessionUri(uri: URI): IInlineChatSession2 | undefined;
7171
readonly onDidChangeSessions: Event<this>;
7272
}
7373

src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -408,26 +408,25 @@ export class InlineChatSessionServiceImpl implements IInlineChatSessionService {
408408
return result;
409409
}
410410

411-
getSession2(uriOrSessionId: URI | string): IInlineChatSession2 | undefined {
412-
if (URI.isUri(uriOrSessionId)) {
413-
414-
let result = this._sessions2.get(uriOrSessionId);
415-
if (!result) {
416-
// no direct session, try to find an editing session which has a file entry for the uri
417-
for (const [_, candidate] of this._sessions2) {
418-
const entry = candidate.editingSession.getEntry(uriOrSessionId);
419-
if (entry) {
420-
result = candidate;
421-
break;
422-
}
411+
getSession2(uri: URI): IInlineChatSession2 | undefined {
412+
let result = this._sessions2.get(uri);
413+
if (!result) {
414+
// no direct session, try to find an editing session which has a file entry for the uri
415+
for (const [_, candidate] of this._sessions2) {
416+
const entry = candidate.editingSession.getEntry(uri);
417+
if (entry) {
418+
result = candidate;
419+
break;
423420
}
424421
}
425-
return result;
426-
} else {
427-
for (const session of this._sessions2.values()) {
428-
if (session.chatModel.sessionId === uriOrSessionId) {
429-
return session;
430-
}
422+
}
423+
return result;
424+
}
425+
426+
getSessionBySessionUri(sessionResource: URI): IInlineChatSession2 | undefined {
427+
for (const session of this._sessions2.values()) {
428+
if (isEqual(session.chatModel.sessionResource, sessionResource)) {
429+
return session;
431430
}
432431
}
433432
return undefined;
@@ -523,17 +522,17 @@ export class InlineChatEscapeToolContribution extends Disposable {
523522
this._store.add(lmTools.registerTool(InlineChatEscapeToolContribution._data, {
524523
invoke: async (invocation, _tokenCountFn, _progress, _token) => {
525524

526-
const sessionId = invocation.context?.sessionId;
525+
const sessionResource = invocation.context?.sessionResource;
527526

528-
if (!sessionId) {
527+
if (!sessionResource) {
529528
logService.warn('InlineChatEscapeToolContribution: no sessionId in tool invocation context');
530529
return { content: [{ kind: 'text', value: 'Cancel' }] };
531530
}
532531

533-
const session = inlineChatSessionService.getSession2(sessionId);
532+
const session = inlineChatSessionService.getSessionBySessionUri(sessionResource);
534533

535534
if (!session) {
536-
logService.warn(`InlineChatEscapeToolContribution: no session found for id ${sessionId}`);
535+
logService.warn(`InlineChatEscapeToolContribution: no session found for id ${sessionResource}`);
537536
return { content: [{ kind: 'text', value: 'Cancel' }] };
538537
}
539538

src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,6 @@ export class InlineChatZoneWidget extends ZoneWidget {
290290
const scrollState = StableEditorBottomScrollState.capture(this.editor);
291291
this._scrollUp.disable();
292292
this._ctxCursorPosition.reset();
293-
this.widget.reset();
294293
this.widget.chatWidget.setVisible(false);
295294
super.hide();
296295
aria.status(localize('inlineChatClosed', 'Closed inline chat widget'));

0 commit comments

Comments
 (0)