diff --git a/src/vs/workbench/contrib/chat/browser/chatWidget.ts b/src/vs/workbench/contrib/chat/browser/chatWidget.ts index 1c5601958ad..34354670c0c 100644 --- a/src/vs/workbench/contrib/chat/browser/chatWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/chatWidget.ts @@ -348,10 +348,14 @@ export class ChatWidget extends Disposable implements IChatWidget { this.container.setAttribute('data-session-id', model.sessionId); this.viewModel = this.instantiationService.createInstance(ChatViewModel, model); - this.viewModelDisposables.add(this.viewModel.onDidChange(() => { + this.viewModelDisposables.add(this.viewModel.onDidChange(e => { this.slashCommandsPromise = undefined; this.requestInProgress.set(this.viewModel!.requestInProgress); this.onDidChangeItems(); + if (e?.kind === 'addRequest') { + revealLastElement(this.tree); + this.focusInput(); + } })); this.viewModelDisposables.add(this.viewModel.onDidDisposeModel(() => { // Disposes the viewmodel and listeners @@ -380,7 +384,6 @@ export class ChatWidget extends Disposable implements IChatWidget { const input = query ?? editorValue; const result = await this.chatService.sendRequest(this.viewModel.sessionId, input); if (result) { - revealLastElement(this.tree); this.inputPart.acceptInput(query); result.responseCompletePromise.then(() => { const responses = this.viewModel?.getItems().filter(isResponseVM); diff --git a/src/vs/workbench/contrib/chat/common/chatViewModel.ts b/src/vs/workbench/contrib/chat/common/chatViewModel.ts index fb1cc56bb45..5c3998f7fd0 100644 --- a/src/vs/workbench/contrib/chat/common/chatViewModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatViewModel.ts @@ -19,19 +19,25 @@ export function isRequestVM(item: unknown): item is IChatRequestViewModel { } export function isResponseVM(item: unknown): item is IChatResponseViewModel { - return !!item && typeof (item as IChatResponseViewModel).onDidChange !== 'undefined'; + return !!item && typeof (item as IChatResponseViewModel).setVote !== 'undefined'; } export function isWelcomeVM(item: unknown): item is IChatWelcomeMessageViewModel { return !!item && typeof item === 'object' && 'content' in item; } +export type IChatViewModelChangeEvent = IChatAddRequestEvent | null; + +export interface IChatAddRequestEvent { + kind: 'addRequest'; +} + export interface IChatViewModel { readonly isInitialized: boolean; readonly providerId: string; readonly sessionId: string; readonly onDidDisposeModel: Event; - readonly onDidChange: Event; + readonly onDidChange: Event; readonly requestInProgress: boolean; readonly inputPlaceholder?: string; getItems(): (IChatRequestViewModel | IChatResponseViewModel | IChatWelcomeMessageViewModel)[]; @@ -64,7 +70,6 @@ export interface IChatLiveUpdateData { } export interface IChatResponseViewModel { - readonly onDidChange: Event; readonly id: string; readonly sessionId: string; /** This ID updates every time the underlying data changes */ @@ -91,7 +96,7 @@ export class ChatViewModel extends Disposable implements IChatViewModel { private readonly _onDidDisposeModel = this._register(new Emitter()); readonly onDidDisposeModel = this._onDidDisposeModel.event; - private readonly _onDidChange = this._register(new Emitter()); + private readonly _onDidChange = this._register(new Emitter()); readonly onDidChange = this._onDidChange.event; private readonly _items: (ChatRequestViewModel | ChatResponseViewModel)[] = []; @@ -154,13 +159,13 @@ export class ChatViewModel extends Disposable implements IChatViewModel { } } - this._onDidChange.fire(); + this._onDidChange.fire(e.kind === 'addRequest' ? { kind: 'addRequest' } : null); })); } private onAddResponse(responseModel: IChatResponseModel) { const response = this.instantiationService.createInstance(ChatResponseViewModel, responseModel); - this._register(response.onDidChange(() => this._onDidChange.fire())); + this._register(response.onDidChange(() => this._onDidChange.fire(null))); this._items.push(response); }