diff --git a/src/vs/workbench/contrib/chat/browser/chatEditorController.ts b/src/vs/workbench/contrib/chat/browser/chatEditorController.ts index c9137403d01..88cb0f857c5 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditorController.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditorController.ts @@ -36,6 +36,7 @@ import { basename, isEqual } from '../../../../base/common/resources.js'; import { ChatAgentLocation, IChatAgentService } from '../common/chatAgents.js'; import { EditorsOrder, IEditorIdentifier, isDiffEditorInput } from '../../../common/editor.js'; import { ChatEditorOverlayController } from './chatEditorOverlay.js'; +import { IChatService } from '../common/chatService.js'; export const ctxIsGlobalEditingSession = new RawContextKey('chat.isGlobalEditingSession', undefined, localize('chat.ctxEditSessionIsGlobal', "The current editor is part of the global edit session")); export const ctxHasEditorModification = new RawContextKey('chat.hasEditorModifications', undefined, localize('chat.hasEditorModifications', "The current editor contains chat modifications")); @@ -82,6 +83,7 @@ export class ChatEditorController extends Disposable implements IEditorContribut @IChatAgentService private readonly _chatAgentService: IChatAgentService, @IEditorService private readonly _editorService: IEditorService, @IContextKeyService contextKeyService: IContextKeyService, + @IChatService chatService: IChatService, ) { super(); @@ -116,8 +118,10 @@ export class ChatEditorController extends Disposable implements IEditorContribut ? entries.findIndex(e => isEqual(e.modifiedURI, model.uri)) : -1; - if (idx >= 0) { - return { session, entry: entries[idx], entries, idx }; + const chatModel = chatService.getSession(session.chatSessionId); + + if (idx >= 0 && chatModel) { + return { session, chatModel, entry: entries[idx], entries, idx }; } } @@ -143,7 +147,13 @@ export class ChatEditorController extends Disposable implements IEditorContribut return; } - const { session, entries, idx, entry } = currentEditorEntry; + const { session, chatModel, entries, idx, entry } = currentEditorEntry; + + store.add(chatModel.onDidChange(e => { + if (e.kind === 'addRequest') { + didReval = false; + } + })); this._ctxIsGlobalEditsSession.set(session.isGlobalEditingSession); this._ctxReviewModelEnabled.set(entry.reviewMode.read(r)); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController2.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController2.ts index e8c36b2084d..1e925be08a2 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController2.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController2.ts @@ -51,6 +51,8 @@ export class InlineChatController2 implements IEditorContribution { private readonly _showWidgetOverrideObs = observableValue(this, false); + private readonly _isActiveController = observableValue(this, false); + constructor( private readonly _editor: ICodeEditor, @@ -114,7 +116,7 @@ export class InlineChatController2 implements IEditorContribution { const sessionObs = derived(r => { sessionsSignal.read(r); const model = editorObs.model.read(r); - const value = model && inlineChatSessions.getSession2(_editor, model.uri); + const value = model && inlineChatSessions.getSession2(model.uri); return value ?? undefined; }); @@ -124,6 +126,7 @@ export class InlineChatController2 implements IEditorContribution { 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)); @@ -136,8 +139,9 @@ export class InlineChatController2 implements IEditorContribution { this._store.add(autorunWithStore((r, store) => { const session = sessionObs.read(r); + const isActive = this._isActiveController.read(r); - if (!session) { + if (!session || !isActive) { visibleSessionObs.set(undefined, undefined); return; } @@ -214,6 +218,10 @@ export class InlineChatController2 implements IEditorContribution { const value = this._showWidgetOverrideObs.get(); this._showWidgetOverrideObs.set(!value, undefined); } + + markActiveController() { + this._isActiveController.set(true, undefined); + } } export class StartSessionAction2 extends EditorAction2 { @@ -251,6 +259,7 @@ export class StartSessionAction2 extends EditorAction2 { } const textModel = editor.getModel(); await inlineChatSessions.createSession2(editor, textModel.uri, CancellationToken.None); + InlineChatController2.get(editor)?.markActiveController(); } } @@ -326,7 +335,7 @@ export class StopSessionAction2 extends AbstractInlineChatAction { return; } const textModel = editor.getModel(); - inlineChatSessions.getSession2(editor, textModel.uri)?.dispose(); + inlineChatSessions.getSession2(textModel.uri)?.dispose(); } } @@ -356,8 +365,9 @@ class RevealWidget extends AbstractInlineChatAction { }); } - runInlineChatCommand(accessor: ServicesAccessor, ctrl: InlineChatController2, editor: ICodeEditor, ...args: any[]): void { + runInlineChatCommand(_accessor: ServicesAccessor, ctrl: InlineChatController2, _editor: ICodeEditor): void { ctrl.toggleWidgetUntilNextRequest(); + ctrl.markActiveController(); } } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.ts index 93be522ac5b..a6e06ad4b36 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.ts @@ -64,6 +64,6 @@ export interface IInlineChatSessionService { createSession2(editor: ICodeEditor, uri: URI, token: CancellationToken): Promise; - getSession2(editor: ICodeEditor, uri: URI): IInlineChatSession2 | undefined; + getSession2(uri: URI): IInlineChatSession2 | undefined; onDidChangeSessions: Event; } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts index 767d074b27e..b502148e9a4 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts @@ -33,6 +33,7 @@ import { ITextFileService } from '../../../services/textfile/common/textfiles.js import { IChatEditingService, WorkingSetEntryState } from '../../chat/common/chatEditingService.js'; import { assertType } from '../../../../base/common/types.js'; import { autorun } from '../../../../base/common/observable.js'; +import { ResourceMap } from '../../../../base/common/map.js'; type SessionData = { @@ -318,7 +319,7 @@ export class InlineChatSessionServiceImpl implements IInlineChatSessionService { // ---- NEW - private readonly _sessions2 = new Map(); + private readonly _sessions2 = new ResourceMap(); private readonly _onDidChangeSessions = this._store.add(new Emitter()); readonly onDidChangeSessions: Event = this._onDidChangeSessions.event; @@ -328,8 +329,7 @@ export class InlineChatSessionServiceImpl implements IInlineChatSessionService { assertType(editor.hasModel()); - const key = this._key(editor, uri); - if (this._sessions2.has(key)) { + if (this._sessions2.has(uri)) { throw new Error('Session already exists'); } @@ -343,7 +343,7 @@ export class InlineChatSessionServiceImpl implements IInlineChatSessionService { const store = new DisposableStore(); store.add(toDisposable(() => { editingSession.reject(); - this._sessions2.delete(key); + this._sessions2.delete(uri); this._onDidChangeSessions.fire(this); })); store.add(editingSession); @@ -365,14 +365,13 @@ export class InlineChatSessionServiceImpl implements IInlineChatSessionService { editingSession, dispose: store.dispose.bind(store) }; - this._sessions2.set(key, result); + this._sessions2.set(uri, result); this._onDidChangeSessions.fire(this); return result; } - getSession2(editor: ICodeEditor, uri: URI): IInlineChatSession2 | undefined { - const key = this._key(editor, uri); - return this._sessions2.get(key); + getSession2(uri: URI): IInlineChatSession2 | undefined { + return this._sessions2.get(uri); } }