diff --git a/src/vs/workbench/contrib/chat/browser/chatViewPane.ts b/src/vs/workbench/contrib/chat/browser/chatViewPane.ts index cf16001e255..4c92a7e5aea 100644 --- a/src/vs/workbench/contrib/chat/browser/chatViewPane.ts +++ b/src/vs/workbench/contrib/chat/browser/chatViewPane.ts @@ -26,7 +26,7 @@ import { SIDE_BAR_FOREGROUND } from '../../../common/theme.js'; import { IViewDescriptorService } from '../../../common/views.js'; import { IChatViewTitleActionContext } from '../common/chatActions.js'; import { IChatAgentService } from '../common/chatAgents.js'; -import { ChatModelInitState, IChatModel } from '../common/chatModel.js'; +import { IChatModel } from '../common/chatModel.js'; import { CHAT_PROVIDER_ID } from '../common/chatParticipantContribTypes.js'; import { IChatService } from '../common/chatService.js'; import { ChatAgentLocation, ChatMode } from '../common/constants.js'; @@ -47,8 +47,6 @@ export class ChatViewPane extends ViewPane implements IViewWelcomeDelegate { private readonly modelDisposables = this._register(new DisposableStore()); private memento: Memento; private readonly viewState: IViewPaneState; - private defaultParticipantRegistrationFailed = false; - private didUnregisterProvider = false; private _restoringSession: Promise | undefined; @@ -112,18 +110,12 @@ export class ChatViewPane extends ViewPane implements IViewWelcomeDelegate { try { this._widget.setVisible(false); await this.updateModel(model, info.inputValue || info.mode ? { inputState: { chatMode: info.mode }, inputValue: info.inputValue } : undefined); - this.defaultParticipantRegistrationFailed = false; - this.didUnregisterProvider = false; - this._onDidChangeViewWelcomeState.fire(); } finally { this.widget.setVisible(wasVisible); } }); this._restoringSession.finally(() => this._restoringSession = undefined); } - } else if (this._widget?.viewModel?.initState === ChatModelInitState.Initialized) { - // Model is initialized, and the default agent disappeared, so show welcome view - this.didUnregisterProvider = true; } this._onDidChangeViewWelcomeState.fire(); @@ -161,8 +153,9 @@ export class ChatViewPane extends ViewPane implements IViewWelcomeDelegate { override shouldShowWelcome(): boolean { const noPersistedSessions = !this.chatService.hasSessions(); const hasCoreAgent = this.chatAgentService.getAgents().some(agent => agent.isCore && agent.locations.includes(this.chatOptions.location)); - const shouldShow = !hasCoreAgent && (this.didUnregisterProvider || !this._widget?.viewModel && noPersistedSessions || this.defaultParticipantRegistrationFailed); - this.logService.trace(`ChatViewPane#shouldShowWelcome(${this.chatOptions.location}) = ${shouldShow}: hasCoreAgent=${hasCoreAgent} didUnregister=${this.didUnregisterProvider} || noViewModel=${!this._widget?.viewModel} && noPersistedSessions=${noPersistedSessions} || defaultParticipantRegistrationFailed=${this.defaultParticipantRegistrationFailed}`); + const hasDefaultAgent = this.chatAgentService.getDefaultAgent(this.chatOptions.location) !== undefined; // only false when Hide Copilot has run and unregistered the setup agents + const shouldShow = !hasCoreAgent && (!hasDefaultAgent || !this._widget?.viewModel && noPersistedSessions); + this.logService.trace(`ChatViewPane#shouldShowWelcome(${this.chatOptions.location}) = ${shouldShow}: hasCoreAgent=${hasCoreAgent} hasDefaultAgent=${hasDefaultAgent} || noViewModel=${!this._widget?.viewModel} && noPersistedSessions=${noPersistedSessions}`); return !!shouldShow; } @@ -225,14 +218,6 @@ export class ChatViewPane extends ViewPane implements IViewWelcomeDelegate { this._widget.render(parent); const info = this.getTransferredOrPersistedSessionInfo(); - const disposeListener = this._register(this.chatService.onDidDisposeSession((e) => { - // Render the welcome view if provider registration fails, eg when signed out. This activates for any session, but the problem is the same regardless - if (e.reason === 'initializationFailed') { - this.defaultParticipantRegistrationFailed = true; - disposeListener?.dispose(); - this._onDidChangeViewWelcomeState.fire(); - } - })); const model = info.sessionId ? await this.chatService.getOrRestoreSession(info.sessionId) : undefined; await this.updateModel(model, info.inputValue || info.mode ? { inputState: { chatMode: info.mode }, inputValue: info.inputValue } : undefined); diff --git a/src/vs/workbench/contrib/chat/common/chatAgents.ts b/src/vs/workbench/contrib/chat/common/chatAgents.ts index ccf6f3baff0..ceb43de6a63 100644 --- a/src/vs/workbench/contrib/chat/common/chatAgents.ts +++ b/src/vs/workbench/contrib/chat/common/chatAgents.ts @@ -341,7 +341,7 @@ export class ChatAgentService extends Disposable implements IChatAgentService { this._onDidChangeAgents.fire(undefined); if (entry.data.isDefault) { - this._hasDefaultAgent.set(false); + this._hasDefaultAgent.set(Iterable.some(this._agents.values(), agent => agent.data.isDefault)); } }); } diff --git a/src/vs/workbench/contrib/chat/common/chatModel.ts b/src/vs/workbench/contrib/chat/common/chatModel.ts index a7eb8fa38a4..3a8f5cf7097 100644 --- a/src/vs/workbench/contrib/chat/common/chatModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatModel.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { asArray } from '../../../../base/common/arrays.js'; -import { DeferredPromise } from '../../../../base/common/async.js'; import { Codicon } from '../../../../base/common/codicons.js'; import { Emitter, Event } from '../../../../base/common/event.js'; import { IMarkdownString, MarkdownString, isMarkdownString } from '../../../../base/common/htmlContent.js'; @@ -13,13 +12,13 @@ import { ResourceMap } from '../../../../base/common/map.js'; import { revive } from '../../../../base/common/marshalling.js'; import { Schemas } from '../../../../base/common/network.js'; import { equals } from '../../../../base/common/objects.js'; -import { IObservable, ITransaction, observableFromEvent, ObservablePromise, observableSignalFromEvent, observableValue } from '../../../../base/common/observable.js'; +import { IObservable, ITransaction, ObservablePromise, observableFromEvent, observableSignalFromEvent, observableValue } from '../../../../base/common/observable.js'; import { basename, isEqual } from '../../../../base/common/resources.js'; import { ThemeIcon } from '../../../../base/common/themables.js'; import { URI, UriComponents, UriDto, isUriComponents } from '../../../../base/common/uri.js'; import { generateUuid } from '../../../../base/common/uuid.js'; -import { IOffsetRange, OffsetRange } from '../../../../editor/common/core/ranges/offsetRange.js'; import { IRange } from '../../../../editor/common/core/range.js'; +import { IOffsetRange, OffsetRange } from '../../../../editor/common/core/ranges/offsetRange.js'; import { Location, SymbolKind, TextEdit } from '../../../../editor/common/languages.js'; import { localize } from '../../../../nls.js'; import { ILogService } from '../../../../platform/log/common/log.js'; @@ -1075,7 +1074,6 @@ export interface IChatModel { readonly onDidDispose: Event; readonly onDidChange: Event; readonly sessionId: string; - readonly initState: ChatModelInitState; readonly initialLocation: ChatAgentLocation; readonly title: string; readonly requestInProgress: boolean; @@ -1320,12 +1318,6 @@ export interface IChatInitEvent { kind: 'initialize'; } -export enum ChatModelInitState { - Created, - Initializing, - Initialized -} - export class ChatModel extends Disposable implements IChatModel { static getDefaultTitle(requests: (ISerializableChatRequestData | IChatRequestModel)[]): string { const firstRequestMessage = requests.at(0)?.message ?? ''; @@ -1342,8 +1334,6 @@ export class ChatModel extends Disposable implements IChatModel { readonly onDidChange = this._onDidChange.event; private _requests: ChatRequestModel[]; - private _initState: ChatModelInitState = ChatModelInitState.Created; - private _isInitializedDeferred = new DeferredPromise(); // TODO to be clear, this is not the same as the id from the session object, which belongs to the provider. // It's easier to be able to identify this model before its async initialization is complete @@ -1411,10 +1401,6 @@ export class ChatModel extends Disposable implements IChatModel { this._initialResponderAvatarIconUri; } - get initState(): ChatModelInitState { - return this._initState; - } - private _isImported = false; get isImported(): boolean { return this._isImported; @@ -1605,44 +1591,6 @@ export class ChatModel extends Disposable implements IChatModel { } } - startInitialize(): void { - if (this.initState !== ChatModelInitState.Created) { - throw new Error(`ChatModel is in the wrong state for startInitialize: ${ChatModelInitState[this.initState]}`); - } - this._initState = ChatModelInitState.Initializing; - } - - deinitialize(): void { - this._initState = ChatModelInitState.Created; - this._isInitializedDeferred = new DeferredPromise(); - } - - initialize(): void { - if (this.initState !== ChatModelInitState.Initializing) { - // Must call startInitialize before initialize, and only call it once - throw new Error(`ChatModel is in the wrong state for initialize: ${ChatModelInitState[this.initState]}`); - } - - this._initState = ChatModelInitState.Initialized; - - this._isInitializedDeferred.complete(); - this._onDidChange.fire({ kind: 'initialize' }); - } - - setInitializationError(error: Error): void { - if (this.initState !== ChatModelInitState.Initializing) { - throw new Error(`ChatModel is in the wrong state for setInitializationError: ${ChatModelInitState[this.initState]}`); - } - - if (!this._isInitializedDeferred.isSettled) { - this._isInitializedDeferred.error(error); - } - } - - waitForInitialization(): Promise { - return this._isInitializedDeferred.p; - } - getRequests(): ChatRequestModel[] { return this._requests; } diff --git a/src/vs/workbench/contrib/chat/common/chatService.ts b/src/vs/workbench/contrib/chat/common/chatService.ts index 4823da981bb..b43c25ac8a0 100644 --- a/src/vs/workbench/contrib/chat/common/chatService.ts +++ b/src/vs/workbench/contrib/chat/common/chatService.ts @@ -531,7 +531,7 @@ export interface IChatService { onDidPerformUserAction: Event; notifyUserAction(event: IChatUserActionEvent): void; - onDidDisposeSession: Event<{ sessionId: string; reason: 'initializationFailed' | 'cleared' }>; + onDidDisposeSession: Event<{ sessionId: string; reason: 'cleared' }>; transferChatSession(transferredSessionData: IChatTransferredSessionData, toWorkspace: URI): void; diff --git a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts index 1c93225df81..c5fb0f58036 100644 --- a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts @@ -124,7 +124,7 @@ export class ChatService extends Disposable implements IChatService { private readonly _onDidPerformUserAction = this._register(new Emitter()); public readonly onDidPerformUserAction: Event = this._onDidPerformUserAction.event; - private readonly _onDidDisposeSession = this._register(new Emitter<{ sessionId: string; reason: 'initializationFailed' | 'cleared' }>()); + private readonly _onDidDisposeSession = this._register(new Emitter<{ sessionId: string; reason: 'cleared' }>()); public readonly onDidDisposeSession = this._onDidDisposeSession.event; private readonly _sessionFollowupCancelTokens = this._register(new DisposableMap()); @@ -473,23 +473,13 @@ export class ChatService extends Disposable implements IChatService { return model; } - private async initializeSession(model: ChatModel, token: CancellationToken): Promise { - try { - this.trace('initializeSession', `Initialize session ${model.sessionId}`); - model.startInitialize(); + private initializeSession(model: ChatModel, token: CancellationToken): void { + this.trace('initializeSession', `Initialize session ${model.sessionId}`); - // Activate the default extension provided agent but do not wait - // for it to be ready so that the session can be used immediately - // without having to wait for the agent to be ready. - this.activateDefaultAgent(model.initialLocation).catch(e => this.logService.error(e)); - - model.initialize(); - } catch (err) { - this.trace('startSession', `initializeSession failed: ${err}`); - model.setInitializationError(err); - this._sessionModels.deleteAndDispose(model.sessionId); - this._onDidDisposeSession.fire({ sessionId: model.sessionId, reason: 'initializationFailed' }); - } + // Activate the default extension provided agent but do not wait + // for it to be ready so that the session can be used immediately + // without having to wait for the agent to be ready. + this.activateDefaultAgent(model.initialLocation).catch(e => this.logService.error(e)); } async activateDefaultAgent(location: ChatAgentLocation): Promise { @@ -565,8 +555,6 @@ export class ChatService extends Disposable implements IChatService { throw new Error(`Unknown session: ${request.session.sessionId}`); } - await model.waitForInitialization(); - const cts = this._pendingRequests.get(request.session.sessionId); if (cts) { this.trace('resendRequest', `Session ${request.session.sessionId} already has a pending request, cancelling...`); @@ -602,8 +590,6 @@ export class ChatService extends Disposable implements IChatService { throw new Error(`Unknown session: ${sessionId}`); } - await model.waitForInitialization(); - if (this._pendingRequests.has(sessionId)) { this.trace('sendRequest', `Session ${sessionId} already has a pending request`); return; @@ -1022,8 +1008,6 @@ export class ChatService extends Disposable implements IChatService { throw new Error(`Unknown session: ${sessionId}`); } - await model.waitForInitialization(); - const pendingRequest = this._pendingRequests.get(sessionId); if (pendingRequest?.requestId === requestId) { pendingRequest.cancel(); @@ -1042,8 +1026,6 @@ export class ChatService extends Disposable implements IChatService { throw new Error(`Unknown session: ${sessionId}`); } - await target.waitForInitialization(); - const oldOwner = request.session; target.adoptRequest(request); @@ -1064,7 +1046,6 @@ export class ChatService extends Disposable implements IChatService { throw new Error(`Unknown session: ${sessionId}`); } - await model.waitForInitialization(); const parsedRequest = typeof message === 'string' ? this.instantiationService.createInstance(ChatRequestParser).parseChatRequest(sessionId, message) : message; diff --git a/src/vs/workbench/contrib/chat/common/chatViewModel.ts b/src/vs/workbench/contrib/chat/common/chatViewModel.ts index cab2fd082c2..38cbf7ca8e9 100644 --- a/src/vs/workbench/contrib/chat/common/chatViewModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatViewModel.ts @@ -15,7 +15,7 @@ import { IInstantiationService } from '../../../../platform/instantiation/common import { ILogService } from '../../../../platform/log/common/log.js'; import { annotateVulnerabilitiesInText } from './annotations.js'; import { getFullyQualifiedId, IChatAgentCommand, IChatAgentData, IChatAgentNameService, IChatAgentResult } from './chatAgents.js'; -import { ChatModelInitState, ChatPauseState, IChatModel, IChatProgressRenderableResponseContent, IChatRequestDisablement, IChatRequestModel, IChatRequestVariableEntry, IChatResponseModel, IChatTextEditGroup, IResponse } from './chatModel.js'; +import { ChatPauseState, IChatModel, IChatProgressRenderableResponseContent, IChatRequestDisablement, IChatRequestModel, IChatRequestVariableEntry, IChatResponseModel, IChatTextEditGroup, IResponse } from './chatModel.js'; import { IParsedChatRequest } from './chatParserTypes.js'; import { ChatAgentVoteDirection, ChatAgentVoteDownReason, IChatCodeCitation, IChatContentReference, IChatFollowup, IChatProgressMessage, IChatResponseErrorDetails, IChatTask, IChatUsedContext } from './chatService.js'; import { countWords } from './chatWordCounter.js'; @@ -49,7 +49,6 @@ export interface IChatSetHiddenEvent { export interface IChatViewModel { readonly model: IChatModel; - readonly initState: ChatModelInitState; readonly sessionId: string; readonly onDidDisposeModel: Event; readonly onDidChange: Event; @@ -240,10 +239,6 @@ export class ChatViewModel extends Disposable implements IChatViewModel { return this._model.requestPausibility; } - get initState() { - return this._model.initState; - } - constructor( private readonly _model: IChatModel, public readonly codeBlockModelCollection: CodeBlockModelCollection, @@ -344,7 +339,7 @@ export class ChatRequestViewModel implements IChatRequestViewModel { } get dataId() { - return this.id + `_${ChatModelInitState[this._model.session.initState]}_${hash(this.variables)}_${hash(this.isComplete)}`; + return this.id + `_${hash(this.variables)}_${hash(this.isComplete)}`; } get sessionId() { @@ -427,7 +422,6 @@ export class ChatResponseViewModel extends Disposable implements IChatResponseVi get dataId() { return this._model.id + `_${this._modelChangeCount}` + - `_${ChatModelInitState[this._model.session.initState]}` + (this.isLast ? '_last' : ''); } diff --git a/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts b/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts index 18ba24e242e..4ccbeaaa588 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts @@ -4,26 +4,25 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; -import { timeout } from '../../../../../base/common/async.js'; import { MarkdownString } from '../../../../../base/common/htmlContent.js'; import { URI } from '../../../../../base/common/uri.js'; import { assertSnapshot } from '../../../../../base/test/common/snapshot.js'; import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js'; -import { OffsetRange } from '../../../../../editor/common/core/ranges/offsetRange.js'; import { Range } from '../../../../../editor/common/core/range.js'; +import { OffsetRange } from '../../../../../editor/common/core/ranges/offsetRange.js'; +import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js'; +import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js'; import { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js'; import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js'; import { MockContextKeyService } from '../../../../../platform/keybinding/test/common/mockKeybindingService.js'; import { ILogService, NullLogService } from '../../../../../platform/log/common/log.js'; import { IStorageService } from '../../../../../platform/storage/common/storage.js'; +import { IExtensionService } from '../../../../services/extensions/common/extensions.js'; +import { TestExtensionService, TestStorageService } from '../../../../test/common/workbenchTestServices.js'; import { ChatAgentService, IChatAgentService } from '../../common/chatAgents.js'; import { ChatModel, ISerializableChatData1, ISerializableChatData2, ISerializableChatData3, normalizeSerializableChatData, Response } from '../../common/chatModel.js'; import { ChatRequestTextPart } from '../../common/chatParserTypes.js'; -import { IExtensionService } from '../../../../services/extensions/common/extensions.js'; -import { TestExtensionService, TestStorageService } from '../../../../test/common/workbenchTestServices.js'; import { ChatAgentLocation } from '../../common/constants.js'; -import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js'; -import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js'; suite('ChatModel', () => { const testDisposables = ensureNoDisposablesAreLeakedInTestSuite(); @@ -40,83 +39,9 @@ suite('ChatModel', () => { instantiationService.stub(IConfigurationService, new TestConfigurationService()); }); - test('Waits for initialization', async () => { - const model = testDisposables.add(instantiationService.createInstance(ChatModel, undefined, ChatAgentLocation.Panel)); - - let hasInitialized = false; - model.waitForInitialization().then(() => { - hasInitialized = true; - }); - - await timeout(0); - assert.strictEqual(hasInitialized, false); - - model.startInitialize(); - model.initialize(); - await timeout(0); - assert.strictEqual(hasInitialized, true); - }); - - test('must call startInitialize before initialize', async () => { - const model = testDisposables.add(instantiationService.createInstance(ChatModel, undefined, ChatAgentLocation.Panel)); - - let hasInitialized = false; - model.waitForInitialization().then(() => { - hasInitialized = true; - }); - - await timeout(0); - assert.strictEqual(hasInitialized, false); - - assert.throws(() => model.initialize()); - assert.strictEqual(hasInitialized, false); - }); - - test('deinitialize/reinitialize', async () => { - const model = testDisposables.add(instantiationService.createInstance(ChatModel, undefined, ChatAgentLocation.Panel)); - - let hasInitialized = false; - model.waitForInitialization().then(() => { - hasInitialized = true; - }); - - model.startInitialize(); - model.initialize(); - await timeout(0); - assert.strictEqual(hasInitialized, true); - - model.deinitialize(); - let hasInitialized2 = false; - model.waitForInitialization().then(() => { - hasInitialized2 = true; - }); - - model.startInitialize(); - model.initialize(); - await timeout(0); - assert.strictEqual(hasInitialized2, true); - }); - - test('cannot initialize twice', async () => { - const model = testDisposables.add(instantiationService.createInstance(ChatModel, undefined, ChatAgentLocation.Panel)); - - model.startInitialize(); - model.initialize(); - assert.throws(() => model.initialize()); - }); - - test('Initialization fails when model is disposed', async () => { - const model = testDisposables.add(instantiationService.createInstance(ChatModel, undefined, ChatAgentLocation.Panel)); - model.dispose(); - - assert.throws(() => model.initialize()); - }); - test('removeRequest', async () => { const model = testDisposables.add(instantiationService.createInstance(ChatModel, undefined, ChatAgentLocation.Panel)); - model.startInitialize(); - model.initialize(); const text = 'hello'; model.addRequest({ text, parts: [new ChatRequestTextPart(new OffsetRange(0, text.length), new Range(1, text.length, 1, text.length), text)] }, { variables: [] }, 0); const requests = model.getRequests(); @@ -130,12 +55,6 @@ suite('ChatModel', () => { const model1 = testDisposables.add(instantiationService.createInstance(ChatModel, undefined, ChatAgentLocation.Editor)); const model2 = testDisposables.add(instantiationService.createInstance(ChatModel, undefined, ChatAgentLocation.Panel)); - model1.startInitialize(); - model1.initialize(); - - model2.startInitialize(); - model2.initialize(); - const text = 'hello'; const request1 = model1.addRequest({ text, parts: [new ChatRequestTextPart(new OffsetRange(0, text.length), new Range(1, text.length, 1, text.length), text)] }, { variables: [] }, 0); @@ -159,9 +78,6 @@ suite('ChatModel', () => { test('addCompleteRequest', async function () { const model1 = testDisposables.add(instantiationService.createInstance(ChatModel, undefined, ChatAgentLocation.Panel)); - model1.startInitialize(); - model1.initialize(); - const text = 'hello'; const request1 = model1.addRequest({ text, parts: [new ChatRequestTextPart(new OffsetRange(0, text.length), new Range(1, text.length, 1, text.length), text)] }, { variables: [] }, 0, undefined, undefined, undefined, undefined, undefined, true); diff --git a/src/vs/workbench/contrib/chat/test/common/chatService.test.ts b/src/vs/workbench/contrib/chat/test/common/chatService.test.ts index 0d06d63cdfb..8f5c8e3bc06 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatService.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatService.test.ts @@ -162,19 +162,15 @@ suite('ChatService', () => { test('retrieveSession', async () => { const testService = testDisposables.add(instantiationService.createInstance(ChatService)); const session1 = testDisposables.add(testService.startSession(ChatAgentLocation.Panel, CancellationToken.None)); - await session1.waitForInitialization(); session1.addRequest({ parts: [], text: 'request 1' }, { variables: [] }, 0); const session2 = testDisposables.add(testService.startSession(ChatAgentLocation.Panel, CancellationToken.None)); - await session2.waitForInitialization(); session2.addRequest({ parts: [], text: 'request 2' }, { variables: [] }, 0); storageService.flush(); const testService2 = testDisposables.add(instantiationService.createInstance(ChatService)); const retrieved1 = testDisposables.add((await testService2.getOrRestoreSession(session1.sessionId))!); - await retrieved1.waitForInitialization(); const retrieved2 = testDisposables.add((await testService2.getOrRestoreSession(session2.sessionId))!); - await retrieved2.waitForInitialization(); assert.deepStrictEqual(retrieved1.getRequests()[0]?.message.text, 'request 1'); assert.deepStrictEqual(retrieved2.getRequests()[0]?.message.text, 'request 2'); }); diff --git a/src/vs/workbench/contrib/chat/test/common/mockChatService.ts b/src/vs/workbench/contrib/chat/test/common/mockChatService.ts index 346e678252d..b3dbb032861 100644 --- a/src/vs/workbench/contrib/chat/test/common/mockChatService.ts +++ b/src/vs/workbench/contrib/chat/test/common/mockChatService.ts @@ -82,7 +82,7 @@ export class MockChatService implements IChatService { notifyUserAction(event: IChatUserActionEvent): void { throw new Error('Method not implemented.'); } - onDidDisposeSession: Event<{ sessionId: string; reason: 'initializationFailed' | 'cleared' }> = undefined!; + onDidDisposeSession: Event<{ sessionId: string; reason: 'cleared' }> = undefined!; transferChatSession(transferredSessionData: IChatTransferredSessionData, toWorkspace: URI): void { throw new Error('Method not implemented.'); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 7d68a1c937c..9ae4a8b1bda 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -434,8 +434,6 @@ export class InlineChatController1 implements IEditorContribution { return State.CANCEL; } - await session.chatModel.waitForInitialization(); - // create a new strategy this._strategy = this._instaService.createInstance(LiveStrategy, session, this._editor, this._ui.value, session.headless); diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts index 3a8cde6a962..acad1225d79 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts @@ -331,12 +331,7 @@ export class TerminalChatWidget extends Disposable { const model = this._model.value; if (model) { this._inlineChatWidget.setChatModel(model, this._loadViewState()); - model.waitForInitialization().then(() => { - if (token.isCancellationRequested) { - return; - } - this._resetPlaceholder(); - }); + this._resetPlaceholder(); } if (!this._model.value) { throw new Error('Failed to start chat session');