move chat overlay into workbench grid (#240808)

* make chat editing overlay a workbench editor overlay (not just a code editor overlay), same for editor specific context key, they should not be limited to code editors

* * centralize context key handling into `chatEditoringEditorContextKeys`
*  workbench chat overlay also reacts to inline chat sessions

* fix leak in code lens controller

* 💄

* make sure `EditingSessionAction` find the right widget

* add `IModifiedFileEntryNavigator` to allow change navigation from "the inside"

* remove code editor based chat overlay logic
This commit is contained in:
Johannes Rieken
2025-02-14 17:38:48 +01:00
committed by GitHub
parent bd05fbbcb0
commit ae5010d6ad
15 changed files with 567 additions and 220 deletions

View File

@@ -12,7 +12,7 @@ import { Emitter, Event } from '../../../../base/common/event.js';
import { Lazy } from '../../../../base/common/lazy.js';
import { DisposableStore, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js';
import { MovingAverage } from '../../../../base/common/numbers.js';
import { autorun, autorunWithStore, constObservable, derived, IObservable, observableFromEvent, observableSignalFromEvent, observableValue, transaction } from '../../../../base/common/observable.js';
import { autorun, autorunWithStore, derived, IObservable, observableFromEvent, observableSignalFromEvent, observableValue, transaction } from '../../../../base/common/observable.js';
import { isEqual } from '../../../../base/common/resources.js';
import { StopWatch } from '../../../../base/common/stopwatch.js';
import { assertType } from '../../../../base/common/types.js';
@@ -39,7 +39,6 @@ import { ILogService } from '../../../../platform/log/common/log.js';
import { IEditorService, SIDE_GROUP } from '../../../services/editor/common/editorService.js';
import { IViewsService } from '../../../services/views/common/viewsService.js';
import { showChatView } from '../../chat/browser/chat.js';
import { ChatEditorOverlayController } from '../../chat/browser/chatEditing/chatEditingEditorOverlay.js';
import { IChatWidgetLocationOptions } from '../../chat/browser/chatWidget.js';
import { ChatAgentLocation } from '../../chat/common/chatAgents.js';
import { ChatContextKeys } from '../../chat/common/chatContextKeys.js';
@@ -47,7 +46,7 @@ import { IChatEditingService, WorkingSetEntryState } from '../../chat/common/cha
import { ChatModel, ChatRequestRemovalReason, IChatRequestModel, IChatTextEditGroup, IChatTextEditGroupState, IResponse } from '../../chat/common/chatModel.js';
import { IChatService } from '../../chat/common/chatService.js';
import { INotebookEditorService } from '../../notebook/browser/services/notebookEditorService.js';
import { CTX_HAS_SESSION, CTX_INLINE_CHAT_EDITING, CTX_INLINE_CHAT_HAS_AGENT2, CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, CTX_INLINE_CHAT_RESPONSE_TYPE, CTX_INLINE_CHAT_VISIBLE, INLINE_CHAT_ID, InlineChatConfigKeys, InlineChatResponseType } from '../common/inlineChat.js';
import { CTX_INLINE_CHAT_EDITING, CTX_INLINE_CHAT_HAS_AGENT2, CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, CTX_INLINE_CHAT_RESPONSE_TYPE, CTX_INLINE_CHAT_VISIBLE, INLINE_CHAT_ID, InlineChatConfigKeys, InlineChatResponseType } from '../common/inlineChat.js';
import { HunkInformation, Session, StashedSession } from './inlineChatSession.js';
import { IInlineChatSession2, IInlineChatSessionService } from './inlineChatSessionService.js';
import { InlineChatError } from './inlineChatSessionServiceImpl.js';
@@ -1199,7 +1198,6 @@ export class InlineChatController2 implements IEditorContribution {
@IContextKeyService contextKeyService: IContextKeyService,
) {
const ctxHasSession = CTX_HAS_SESSION.bindTo(contextKeyService);
const ctxInlineChatVisible = CTX_INLINE_CHAT_VISIBLE.bindTo(contextKeyService);
this._zone = new Lazy<InlineChatZoneWidget>(() => {
@@ -1266,12 +1264,7 @@ export class InlineChatController2 implements IEditorContribution {
const session = this._currentSession.read(r);
if (!session) {
ctxHasSession.set(undefined);
this._isActiveController.set(false, undefined);
} else {
const checkRequests = () => ctxHasSession.set(session.chatModel.getRequests().length === 0 ? 'empty' : 'active');
store.add(session.chatModel.onDidChange(checkRequests));
checkRequests();
}
}));
@@ -1350,30 +1343,6 @@ export class InlineChatController2 implements IEditorContribution {
session.editingSession.getEntry(session.uri)?.autoAcceptController.get()?.cancel();
}
}));
this._store.add(autorun(r => {
const overlay = ChatEditorOverlayController.get(_editor)!;
const session = this._currentSession.read(r);
const model = editorObs.model.read(r);
if (!session || !model) {
overlay.hide();
return;
}
const lastResponse = observableFromEvent(this, session.chatModel.onDidChange, () => session.chatModel.getRequests().at(-1)?.response);
const response = lastResponse.read(r);
const isInProgress = response
? observableFromEvent(this, response.onDidChange, () => !response.isComplete)
: constObservable(false);
if (isInProgress.read(r)) {
overlay.showRequest(session.editingSession);
} else if (session.editingSession.getEntry(session.uri)?.state.get() !== WorkingSetEntryState.Modified) {
overlay.hide();
}
}));
}
dispose(): void {