Skip to content

Commit d948d37

Browse files
authored
Fix codeblock streaming (microsoft#208952)
* Suggestion for microsoft/vscode-copilot-release#983 * Update codeblock when response is done, in case it wasn't rendered * Clean up
1 parent b065dc2 commit d948d37

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

src/vs/workbench/contrib/chat/browser/chatListRenderer.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import { IMarkdownRenderResult, MarkdownRenderer } from 'vs/editor/browser/widge
3333
import { Range } from 'vs/editor/common/core/range';
3434
import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService';
3535
import { localize } from 'vs/nls';
36-
import { createActionViewItem, IMenuEntryActionViewItemOptions, MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
36+
import { IMenuEntryActionViewItemOptions, MenuEntryActionViewItem, createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
3737
import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar';
3838
import { MenuId, MenuItemAction } from 'vs/platform/actions/common/actions';
3939
import { ICommandService } from 'vs/platform/commands/common/commands';
@@ -918,17 +918,13 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
918918
}
919919

920920
const sessionId = isResponseVM(element) || isRequestVM(element) ? element.sessionId : '';
921-
const modelEntry = this.codeBlockModelCollection.get(sessionId, element, index);
922-
if (!modelEntry) {
923-
console.error('Trying to render code block without model', element.id, index);
924-
return $('div');
925-
}
921+
const modelEntry = this.codeBlockModelCollection.getOrCreate(sessionId, element, index);
926922
vulns = modelEntry.vulns;
927923
textModel = modelEntry.model;
928924
}
929925

930926
const hideToolbar = isResponseVM(element) && element.errorDetails?.responseIsFiltered;
931-
const ref = this.renderCodeBlock({ languageId, textModel, codeBlockIndex: index, element, range, hideToolbar, parentContextKeyService: templateData.contextKeyService, vulns });
927+
const ref = this.renderCodeBlock({ languageId, textModel, codeBlockIndex: index, element, range, hideToolbar, parentContextKeyService: templateData.contextKeyService, vulns }, text);
932928

933929
// Attach this after updating text/layout of the editor, so it should only be fired when the size updates later (horizontal scrollbar, wrapping)
934930
// not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render)
@@ -975,9 +971,13 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
975971
};
976972
}
977973

978-
private renderCodeBlock(data: ICodeBlockData): IDisposableReference<CodeBlockPart> {
974+
private renderCodeBlock(data: ICodeBlockData, text: string): IDisposableReference<CodeBlockPart> {
979975
const ref = this._editorPool.get();
980976
const editorInfo = ref.object;
977+
if (isResponseVM(data.element)) {
978+
this.codeBlockModelCollection.update(data.element.sessionId, data.element, data.codeBlockIndex, { text, languageId: data.languageId });
979+
}
980+
981981
editorInfo.render(data, this._currentLayoutWidth, this.rendererOptions.editableCodeBlock);
982982

983983
return ref;

src/vs/workbench/contrib/chat/common/chatViewModel.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,9 @@ export class ChatViewModel extends Disposable implements IChatViewModel {
241241
private onAddResponse(responseModel: IChatResponseModel) {
242242
const response = this.instantiationService.createInstance(ChatResponseViewModel, responseModel);
243243
this._register(response.onDidChange(() => {
244-
this.updateCodeBlockTextModels(response);
244+
if (response.isComplete) {
245+
this.updateCodeBlockTextModels(response);
246+
}
245247
return this._onDidChange.fire(null);
246248
}));
247249
this._items.push(response);

0 commit comments

Comments
 (0)