Change:
When inline chat changes more than one hunk it just shows "N changes". We should make that more explicit, e.g that it is todo-list-like and something that we need to accept explicit per change
I made the message more explicit, the info icon, and a hover message. This is how it now looks <img width="1136" alt="image" src=""

Discussion:
// if (data.message) { // 	progress({ kind: 'progressMessage', content: new MarkdownString(data.message) }); // } <del> if (data.slashCommand) { </del> <ins> // TODO@ulugbekna,jrieken should we only send data.slashCommand when having detected one? if (data.slashCommand && !inlineRequest.prompt.startsWith('/')) { </ins> const command = this._data.slashCommands.find(c => c.name === data.slashCommand); progress({ kind: 'agentDetection', agentId: this._data.id, command }); }

this._editor.revealPositionInCenterIfOutsideViewport(widgetData.position); const remainingHunks = this._session.hunkData.pending; <del> this._updateSummaryMessage(remainingHunks); </del> <ins> this._updateSummaryMessage(remainingHunks, this._session.hunkData.size); </ins> const mode = this._configService.getValue<'on' | 'off' | 'auto'>(InlineChatConfigKeys.AccessibleDiffView);

return renderHunks()?.position; } <del> protected _updateSummaryMessage(hunkCount: number) { </del> <ins> private _updateSummaryMessage(remaining: number, total: number) { const needsReview = this._configService.getValue<boolean>(InlineChatConfigKeys.AcceptedOrDiscardBeforeSave); </ins> let message: string; <del> if (hunkCount === 0) { message = localize('change.0', "Nothing changed"); } else if (hunkCount === 1) { message = localize('change.1', "1 change"); </del> <ins> if (total === 0) { message = localize('change.0', "Nothing changed."); } else if (remaining === 1) { message = needsReview ? localize('review.1', "$(info) Accept or Discard 1 change.") : localize('change.1', "1 change"); </ins> } else { <del> message = localize('lines.NM', "{0} changes", hunkCount); </del> <ins> message = needsReview ? localize('review.N', "$(info) Accept or Discard {0} changes.", remaining) : localize('change.N', "{0} changes", total); } let title: string | undefined; if (needsReview) { title = localize('review', "Review (accept or discard) all changes before continuing."); </ins> } <del> this._zone.widget.updateStatus(message); </del> <ins> this._zone.widget.updateStatus(message, { title }); </ins> } hasFocus(): boolean {

import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { IChatService } from 'vs/workbench/contrib/chat/common/chatService'; <ins> import { setupCustomHover } from 'vs/base/browser/ui/hover/updatableHoverWidget'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; </ins> export interface InlineChatWidgetViewState {

this._elements.followUps.tabIndex = 0; this._elements.followUps.ariaLabel = this._accessibleViewService.getOpenAriaHint(AccessibilityVerbositySettingId.InlineChat); this._elements.statusLabel.tabIndex = 0; <ins> // this._elements.status this._store.add(setupCustomHover(getDefaultHoverDelegate('element'), this._elements.statusLabel, () => { return this._elements.statusLabel.dataset['title']; })); </ins> this._store.add(this._chatService.onDidPerformUserAction(e => { if (e.sessionId === this._chatWidget.viewModel?.model.sessionId && e.action.kind === 'vote') { this.updateStatus('Thank you for your feedback!', { resetAfter: 1250 });

this._onDidChangeHeight.fire(); } <del> updateStatus(message: string, ops: { classes?: string[]; resetAfter?: number; keepMessage?: boolean } = {}) { </del> <ins> updateStatus(message: string, ops: { classes?: string[]; resetAfter?: number; keepMessage?: boolean; title?: string } = {}) { </ins> const isTempMessage = typeof ops.resetAfter === 'number'; if (isTempMessage && !this._elements.statusLabel.dataset['state']) { const statusLabel = this._elements.statusLabel.innerText;

this.updateStatus(statusLabel, { classes, keepMessage: true }); }, ops.resetAfter); } <del> reset(this._elements.statusLabel, message); </del> <ins> const renderedMessage = renderLabelWithIcons(message); reset(this._elements.statusLabel, ...renderedMessage); </ins> this._elements.statusLabel.className = `label status ${(ops.classes ?? []).join(' ')}`; this._elements.statusLabel.classList.toggle('hidden', !message); if (isTempMessage) {

} else { delete this._elements.statusLabel.dataset['state']; } <ins> this._elements.statusLabel.dataset['title'] = ops.title; </ins> this._onDidChangeHeight.fire(); }

color: var(--vscode-descriptionForeground); font-size: 11px; align-self: baseline; <del> display: inline-flex; </del> <ins> padding-left: 10px; margin-left: auto; </ins> } .monaco-workbench .inline-chat .status .label.hidden { display: none; } <del> .monaco-workbench .inline-chat .status .label.info { margin-right: auto; padding-left: 2px; </del> <ins> .monaco-workbench .inline-chat .status .label.error { color: var(--vscode-errorForeground); </ins> } <del> .monaco-workbench .inline-chat .status .label.info > .codicon { </del> <ins> .monaco-workbench .inline-chat .status .label.warn { color: var(--vscode-editorWarning-foreground); } .monaco-workbench .inline-chat .status .label > .codicon { </ins> padding: 0 5px; font-size: 12px; line-height: 18px; } <del> .monaco-workbench .inline-chat .status .label.status { padding-left: 10px; padding-right: 4px; margin-left: auto; } .monaco-workbench .inline-chat .status .label .slash-command-pill CODE { border-radius: 3px; padding: 0 1px; background-color: var(--vscode-chat-slashCommandBackground); color: var(--vscode-chat-slashCommandForeground); } .monaco-workbench .inline-chat .detectedIntent { color: var(--vscode-descriptionForeground); padding: 5px 0px 5px 5px; } .monaco-workbench .inline-chat .detectedIntent.hidden { display: none; } .monaco-workbench .inline-chat .detectedIntent .slash-command-pill CODE { border-radius: 3px; padding: 0 1px; background-color: var(--vscode-chat-slashCommandBackground); color: var(--vscode-chat-slashCommandForeground); } .monaco-workbench .inline-chat .detectedIntent .slash-command-pill a { color: var(--vscode-textLink-foreground); cursor: pointer; } </del> .monaco-workbench .inline-chat .chatMessage .chatMessageContent .value { overflow: hidden; -webkit-user-select: text;

display: none; } <del> .monaco-workbench .inline-chat .status .label A { color: var(--vscode-textLink-foreground); cursor: pointer; } .monaco-workbench .inline-chat .status .label.error { color: var(--vscode-errorForeground); } .monaco-workbench .inline-chat .status .label.warn { color: var(--vscode-editorWarning-foreground); } </del> .monaco-workbench .inline-chat .status .actions { display: flex; }