diff --git a/src/vs/workbench/contrib/chat/browser/chat.ts b/src/vs/workbench/contrib/chat/browser/chat.ts index 7c8900defcf0c..3615c5de859f5 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.ts @@ -161,6 +161,7 @@ export interface IChatListItemRendererOptions { readonly renderCodeBlockPills?: boolean; readonly renderDetectedCommandsWithRequest?: boolean; readonly renderTextEditsAsSummary?: (uri: URI) => boolean; + readonly referencesExpandedWhenEmptyResponse?: boolean; } export interface IChatWidgetViewOptions { diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts index 04ec43faa61ad..5ef216ffdd4a4 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts @@ -57,6 +57,10 @@ export interface IChatReferenceListItem extends IChatContentReference { export type IChatCollapsibleListItem = IChatReferenceListItem | IChatWarningMessage; +export interface IChatCollapsibleListOptions { + expandedWhenEmptyResponse?: boolean; +} + export class ChatCollapsibleListContentPart extends Disposable implements IChatContentPart { public readonly domNode: HTMLElement; @@ -70,6 +74,7 @@ export class ChatCollapsibleListContentPart extends Disposable implements IChatC labelOverride: string | undefined, context: IChatContentPartRenderContext, contentReferencesListPool: CollapsibleListPool, + options: IChatCollapsibleListOptions, @IOpenerService openerService: IOpenerService, @IMenuService menuService: IMenuService, @IInstantiationService private readonly instantiationService: IInstantiationService, @@ -83,7 +88,13 @@ export class ChatCollapsibleListContentPart extends Disposable implements IChatC localize('usedReferencesPlural', "Used {0} references", data.length) : localize('usedReferencesSingular', "Used {0} reference", 1)); const iconElement = $('.chat-used-context-icon'); - const icon = (element: IChatResponseViewModel) => element.usedReferencesExpanded ? Codicon.chevronDown : Codicon.chevronRight; + const isExpanded = () => + element.usedReferencesExpanded ?? ( + options.expandedWhenEmptyResponse && element.response.value.length === 0 + ); + const icon = (element: IChatResponseViewModel) => { + return isExpanded() ? Codicon.chevronDown : Codicon.chevronRight; + }; iconElement.classList.add(...ThemeIcon.asClassNameArray(icon(element))); const buttonElement = $('.chat-used-context-label', undefined); @@ -100,15 +111,15 @@ export class ChatCollapsibleListContentPart extends Disposable implements IChatC this.domNode = $('.chat-used-context', undefined, buttonElement); collapseButton.label = referencesLabel; collapseButton.element.prepend(iconElement); - this.updateAriaLabel(collapseButton.element, referencesLabel, element.usedReferencesExpanded); - this.domNode.classList.toggle('chat-used-context-collapsed', !element.usedReferencesExpanded); + this.updateAriaLabel(collapseButton.element, referencesLabel, isExpanded()); + this.domNode.classList.toggle('chat-used-context-collapsed', !isExpanded()); this._register(collapseButton.onDidClick(() => { iconElement.classList.remove(...ThemeIcon.asClassNameArray(icon(element))); - element.usedReferencesExpanded = !element.usedReferencesExpanded; + element.usedReferencesExpanded = !isExpanded(); iconElement.classList.add(...ThemeIcon.asClassNameArray(icon(element))); - this.domNode.classList.toggle('chat-used-context-collapsed', !element.usedReferencesExpanded); + this.domNode.classList.toggle('chat-used-context-collapsed', !isExpanded()); this._onDidChangeHeight.fire(); - this.updateAriaLabel(collapseButton.element, referencesLabel, element.usedReferencesExpanded); + this.updateAriaLabel(collapseButton.element, referencesLabel, isExpanded()); })); const ref = this._register(contentReferencesListPool.get()); diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts index 8510cb1350790..4e306372b46e2 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts @@ -28,7 +28,7 @@ export class ChatTaskContentPart extends Disposable implements IChatContentPart super(); if (task.progress.length) { - const refsPart = this._register(instantiationService.createInstance(ChatCollapsibleListContentPart, task.progress, task.content.value, context, contentReferencesListPool)); + const refsPart = this._register(instantiationService.createInstance(ChatCollapsibleListContentPart, task.progress, task.content.value, context, contentReferencesListPool, {})); this.domNode = dom.$('.chat-progress-task'); this.domNode.appendChild(refsPart.domNode); this.onDidChangeHeight = refsPart.onDidChangeHeight; diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 84b7734190ad8..f95b614d52168 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -878,7 +878,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { this.updateItemHeight(templateData); })); diff --git a/src/vs/workbench/contrib/chat/browser/chatViewPane.ts b/src/vs/workbench/contrib/chat/browser/chatViewPane.ts index 8455f189e6e36..c5664239a6b3e 100644 --- a/src/vs/workbench/contrib/chat/browser/chatViewPane.ts +++ b/src/vs/workbench/contrib/chat/browser/chatViewPane.ts @@ -182,6 +182,7 @@ export class ChatViewPane extends ViewPane implements IViewWelcomeDelegate { renderTextEditsAsSummary: (uri) => { return this.chatOptions.location === ChatAgentLocation.EditingSession; }, + referencesExpandedWhenEmptyResponse: this.chatOptions.location !== ChatAgentLocation.EditingSession, }, enableImplicitContext: this.chatOptions.location === ChatAgentLocation.Panel, editorOverflowWidgetsDomNode: editorOverflowNode, diff --git a/src/vs/workbench/contrib/chat/common/chatViewModel.ts b/src/vs/workbench/contrib/chat/common/chatViewModel.ts index 6f58726d1679b..e5f2abcc3b1f8 100644 --- a/src/vs/workbench/contrib/chat/common/chatViewModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatViewModel.ts @@ -538,7 +538,7 @@ export class ChatResponseViewModel extends Disposable implements IChatResponseVi return this._usedReferencesExpanded; } - return this.response.value.length === 0 && !this.errorDetails; + return undefined; } set usedReferencesExpanded(v: boolean) {