jiebi/CodeConvo huggingface dataset:
Change:
open a notebook hover over its and actions there is the custom hover but on further move there is also the native hover (maybe because these actions combine text and icon?)

Discussion:
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ThemeIcon } from 'vs/base/common/themables'; <ins> import { ICustomHover, setupCustomHover } from 'vs/base/browser/ui/iconLabel/iconLabelHover'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; </ins> export class CodiconActionViewItem extends MenuEntryActionViewItem {

if (this._actionLabel) { this._actionLabel.classList.add('notebook-label'); this._actionLabel.innerText = this._action.label; <del> this._actionLabel.title = this._action.tooltip.length ? this._action.tooltip : this._action.label; </del> } } } export class UnifiedSubmenuActionView extends SubmenuEntryActionViewItem { private _actionLabel?: HTMLAnchorElement; <ins> private _hover?: ICustomHover; </ins> constructor( action: SubmenuItemAction,

container.classList.add('notebook-action-view-item'); this._actionLabel = document.createElement('a'); container.appendChild(this._actionLabel); <ins> const hoverDelegate = this.options.hoverDelegate ?? getDefaultHoverDelegate('element'); this._hover = this._register(setupCustomHover(hoverDelegate, this._actionLabel, '')); </ins> this.updateLabel(); }

if (this.renderLabel) { this._actionLabel.classList.add('notebook-label'); this._actionLabel.innerText = this._action.label; <del> this._actionLabel.title = primaryAction.tooltip.length ? primaryAction.tooltip : primaryAction.label; </del> <ins> this._hover?.update(primaryAction.tooltip.length ? primaryAction.tooltip : primaryAction.label); </ins> } } else { if (this.renderLabel) { this._actionLabel.classList.add('notebook-label'); this._actionLabel.innerText = this._action.label; <del> this._actionLabel.title = this._action.tooltip.length ? this._action.tooltip : this._action.label; </del> <ins> this._hover?.update(this._action.tooltip.length ? this._action.tooltip : this._action.label); </ins> } } }
Change:
Testing I asked a question and noticed this: ! Empty. Further inspection of my logs yielded: My participant is very straightforward: It throws on the: I was expecting to render in the chat
Currently, when there's an error, the stream is just going to be empty. But you can and that will be the actual failed promise with the error. Not sure if that's right or wrong, it looks like you can make the async iterable throw by calling on the , that might help for errors
Yeah, let's make sure to call but also know that this will be a generic error and that only the extension can make this graceful
This the stream and the result error, this is how my sample extension does it It's important to have for-await also inside try-catch
<!-- AUTHORVERIFICATIONREQUEST --This bug has been fixed in the latest release of ! you can help us out by commenting if things are now working as expected. If things still don't seem right, please ensure you're on version of Insiders (today's or later - you can use in the command palette to check), and leave a comment letting us know what isn't working as expected. Happy Coding!

Discussion:
task.catch(err => { this._logService.error('[CHAT] extension request ERRORED', err, extension.value, requestId); <ins> throw err; </ins> }).finally(() => { this._logService.debug('[CHAT] extension request DONE', extension.value, requestId); });

import { ExtHostAuthentication } from 'vs/workbench/api/common/extHostAuthentication'; import { localize } from 'vs/nls'; import { INTERNAL_AUTH_PROVIDER_PREFIX } from 'vs/workbench/services/authentication/common/authentication'; <ins> import { toErrorMessage } from 'vs/base/common/errorMessage'; </ins> type LanguageModelData = { readonly extension: ExtensionIdentifier;

// responses: AsyncIterable<string>[] // FUTURE responses per N }; <del> promise.finally(() => { this._isDone = true; if (this._responseStreams.size > 0) { for (const [, value] of this._responseStreams) { value.stream.resolve(); } } else { this._defaultStream.resolve(); </del> <ins> promise.then(() => { for (const stream of this._streams()) { stream.resolve(); } }).catch(err => { if (!(err instanceof Error)) { err = new Error(toErrorMessage(err), { cause: err }); } for (const stream of this._streams()) { stream.reject(err); </ins> } <ins> }).finally(() => { this._isDone = true; </ins> }); } <ins> private * _streams() { if (this._responseStreams.size > 0) { for (const [, value] of this._responseStreams) { yield value.stream; } } else { yield this._defaultStream; } } </ins> handleFragment(fragment: IChatResponseFragment): void { if (this._isDone) { return;
Change:
to repro: click notebook indentations statusbar entry run "indent using spaces/tabs" and select a new number entry will not update, however indentations work correctly given the selection that the user made and the current settings.

Discussion:
this._accessor.clear(); return; } <del> const indentSize = cellOptions?.indentSize; const tabSize = cellOptions?.tabSize; const insertSpaces = cellOptions?.insertSpaces; </del> <ins> const cellEditorOverridesRaw = editor.notebookOptions.getDisplayOptions().editorOptionsCustomizations; const indentSize = cellEditorOverridesRaw['editor.indentSize'] ?? cellOptions?.indentSize; const insertSpaces = cellEditorOverridesRaw['editor.insertSpaces'] ?? cellOptions?.tabSize; const tabSize = cellEditorOverridesRaw['editor.tabSize'] ?? cellOptions?.insertSpaces; </ins> const width = typeof indentSize === 'number' ? indentSize : tabSize;

constructor() { super({ <del> id: NotebookIndentUsingSpaces.ID, </del> <ins> id: NotebookIndentUsingTabs.ID, </ins> title: nls.localize('indentUsingTabs', "Indent Using Tabs"), precondition: undefined, });

constructor() { super({ <del> id: NotebookIndentUsingSpaces.ID, </del> <ins> id: NotebookChangeTabDisplaySize.ID, </ins> title: nls.localize('changeTabDisplaySize', "Change Tab Display Size"), precondition: undefined, });

constructor() { super({ <del> id: NotebookIndentUsingSpaces.ID, </del> <ins> id: NotebookIndentationToSpacesAction.ID, </ins> title: nls.localize('convertIndentationToSpaces', "Convert Indentation to Spaces"), precondition: undefined, });

override run(accessor: ServicesAccessor, ...args: any[]): void { convertNotebookIndentation(accessor, true); } }

constructor() { super({ <del> id: NotebookIndentUsingSpaces.ID, </del> <ins> id: NotebookIndentationToTabsAction.ID, </ins> title: nls.localize('convertIndentationToTabs', "Convert Indentation to Tabs"), precondition: undefined, });

bulkEditService.apply(edits, { label: nls.localize('convertIndentation', "Convert Indentation"), code: 'undoredo.convertIndentation', }); <del> })).then((notebookEdits) => { </del> <ins> })).then(() => { </ins> // store the initial values of the configuration const initialConfig = configurationService.getValue(NotebookSetting.cellEditorOptionsCustomizations) as any; const initialIndentSize = initialConfig['editor.indentSize'];

} registerAction2(NotebookIndentUsingSpaces); <ins> registerAction2(NotebookIndentUsingTabs); registerAction2(NotebookChangeTabDisplaySize); registerAction2(NotebookIndentationToSpacesAction); registerAction2(NotebookIndentationToTabsAction); </ins>
Change:
Testing If there's no error case, I now need to return something like:
Hi we have branched off from today, so I am pinging about the milestone here. Would you like to make this issue a candidate or move it out to the milestone?
Moving to March for now. Feel free to move this issue back to February if it turns out to be a candidate.
It's already a , which allows 'undefined' but not void. Is it weird to say ?
+1 on this, I have to explicitly today

Discussion:
const participant = chat.createChatParticipant('api-test.participant', (request, context, _progress, _token) => { emitter.fire({ request, context }); <del> return null; </del> }); participant.isDefault = true; disposables.push(participant);

} satisfies vscode.ChatParticipant; } <del> invoke(request: vscode.ChatRequest, context: vscode.ChatContext, response: vscode.ChatExtendedResponseStream, token: CancellationToken): vscode.ProviderResult<vscode.ChatResult> { </del> <ins> invoke(request: vscode.ChatRequest, context: vscode.ChatContext, response: vscode.ChatExtendedResponseStream, token: CancellationToken): vscode.ProviderResult<vscode.ChatResult | void> { </ins> return this._requestHandler(request, context, response, token); } }

/** * A chat request handler is a callback that will be invoked when a request is made to a chat participant. */ <del> export type ChatRequestHandler = (request: ChatRequest, context: ChatContext, response: ChatResponseStream, token: CancellationToken) => ProviderResult<ChatResult>; </del> <ins> export type ChatRequestHandler = (request: ChatRequest, context: ChatContext, response: ChatResponseStream, token: CancellationToken) => ProviderResult<ChatResult | void>; </ins> /** * A chat participant can be invoked by the user in a chat session, using the `@` prefix. When it is invoked, it handles the chat request and is solely

constructor(label: string | CompletionItemLabel, values: ChatVariableValue[]); } <del> export type ChatExtendedRequestHandler = (request: ChatRequest, context: ChatContext, response: ChatExtendedResponseStream, token: CancellationToken) => ProviderResult<ChatResult>; </del> <ins> export type ChatExtendedRequestHandler = (request: ChatRequest, context: ChatContext, response: ChatExtendedResponseStream, token: CancellationToken) => ProviderResult<ChatResult | void>; </ins> export namespace chat { /**
Change:
Testing With all the files in the multi-diff editor collapsed to make it easy to see: ! To repro, try to rename this:
I see, that's a good point thanks!
To verify: Do a rename but do not accept rename Click on The refactor preview should open Open the multi diff editor from there by clicking on any change in the refactor preveiw Check that the order of the files in the refactor preview matches the order of the files in the multi diff editor

Discussion:
import 'vs/css!./bulkEdit'; import { WorkbenchAsyncDataTree, IOpenEvent } from 'vs/platform/list/browser/listService'; <del> import { BulkEditElement, BulkEditDelegate, TextEditElementRenderer, FileElementRenderer, BulkEditDataSource, BulkEditIdentityProvider, FileElement, TextEditElement, BulkEditAccessibilityProvider, CategoryElementRenderer, BulkEditNaviLabelProvider, CategoryElement, BulkEditSorter } from 'vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree'; </del> <ins> import { BulkEditElement, BulkEditDelegate, TextEditElementRenderer, FileElementRenderer, BulkEditDataSource, BulkEditIdentityProvider, FileElement, TextEditElement, BulkEditAccessibilityProvider, CategoryElementRenderer, BulkEditNaviLabelProvider, CategoryElement, BulkEditSorter, compareBulkFileOperations } from 'vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree'; </ins> import { FuzzyScore } from 'vs/base/common/filters'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IThemeService } from 'vs/platform/theme/common/themeService';

if (this._fileOperations === fileOperations && this._resources) { return this._resources; } <ins> const sortedFileOperations = fileOperations.sort(compareBulkFileOperations); </ins> const resources: IResourceDiffEditorInput[] = []; <del> for (const operation of fileOperations) { </del> <ins> for (const operation of sortedFileOperations) { </ins> const operationUri = operation.uri; const previewUri = this._currentProvider!.asPreviewUri(operationUri); // delete -> show single editor

compare(a: BulkEditElement, b: BulkEditElement): number { if (a instanceof FileElement && b instanceof FileElement) { <del> return compare(a.edit.uri.toString(), b.edit.uri.toString()); </del> <ins> return compareBulkFileOperations(a.edit, b.edit); </ins> } if (a instanceof TextEditElement && b instanceof TextEditElement) {

} } <ins> export function compareBulkFileOperations(a: BulkFileOperation, b: BulkFileOperation): number { return compare(a.uri.toString(), b.uri.toString()); } </ins> // --- ACCESSI export class BulkEditAccessibilityProvider implements IListAccessibilityProvider<BulkEditElement> {
Change:
have the -setting open settings editor and notice a warning It seems that we are missing a settings migration. That's something we usually do when "breaking" a setting. <img width="715" alt="Screenshot 2024-02-22 at 11 30 06" src=""
This was by design this iteration to be overly cautious with the migration with plans to do that next iteration Now that it's been tested via a TPI, I think it's safe to do this. cc who also requested this during testing.
Verifier: Pls add a bunch of alert and audio cue settings such as: in various orders and combinations. Verify that they're transformed into settings and the deprecated settings are all removed.
It looks like I have to reload the window for the User settings to be migrated. Is that behaviour expected?
Yes because that will happen automatically for users when they download the vs code update

Discussion:
announcement = announcement ? 'auto' : 'off'; } } <ins> configurationKeyValuePairs.push([`${item.legacySoundSettingsKey}`, { value: undefined }]); </ins> configurationKeyValuePairs.push([`${item.settingsKey}`, { value: announcement !== undefined ? { announcement, sound } : { sound } }]); return configurationKeyValuePairs; }

key: item.legacyAnnouncementSettingsKey!, migrateFn: (announcement, accessor) => { const configurationKeyValuePairs: ConfigurationKeyValuePairs = []; <del> const sound = accessor(item.legacySoundSettingsKey); </del> <ins> const sound = accessor(item.settingsKey)?.sound || accessor(item.legacySoundSettingsKey); </ins> if (announcement !== undefined && typeof announcement !== 'string') { announcement = announcement ? 'auto' : 'off'; } configurationKeyValuePairs.push([`${item.settingsKey}`, { value: announcement !== undefined ? { announcement, sound } : { sound } }]); <ins> configurationKeyValuePairs.push([`${item.legacyAnnouncementSettingsKey}`, { value: undefined }]); configurationKeyValuePairs.push([`${item.legacySoundSettingsKey}`, { value: undefined }]); </ins> return configurationKeyValuePairs; } })));
Change:
There is a injected text that is left over on line 52: <img width="883" alt="image" src=""Saw this stack-trace, I'm not sure if it's related or not:
I am trying to reproduce this issue but am currently not able to. Do you know what is the file you were triggering inline completions on, and what inline completions you saw ?

Discussion:
*--------------------------------------------------------------------------------------------*/ import { mapFindFirst } from 'vs/base/common/arraysFind'; <del> import { BugIndicatingError, onUnexpectedExternalError } from 'vs/base/common/errors'; </del> <ins> import { BugIndicatingError, onUnexpectedError, onUnexpectedExternalError } from 'vs/base/common/errors'; </ins> import { Disposable } from 'vs/base/common/lifecycle'; import { IObservable, IReader, ITransaction, autorun, derived, derivedHandleChanges, derivedOpts, recomputeInitiallyAndOnChange, observableSignal, observableValue, subtransaction, transaction } from 'vs/base/common/observable'; import { commonPrefixLength, splitLinesIncludeSeparators } from 'vs/base/common/strings';

} export function getSecondaryEdits(textModel: ITextModel, positions: readonly Position[], primaryEdit: SingleTextEdit): SingleTextEdit[] { <ins> if (positions.length === 1) { // No secondary cursor positions return []; } </ins> const primaryPosition = positions[0]; const secondaryPositions = positions.slice(1); const primaryEditStartPosition = primaryEdit.range.getStartPosition();

Range.fromPositions(primaryPosition, primaryEditEndPosition) ); const positionWithinTextEdit = subtractPositions(primaryPosition, primaryEditStartPosition); <ins> if (positionWithinTextEdit.lineNumber < 1) { onUnexpectedError(new BugIndicatingError( `positionWithinTextEdit line number should be bigger than 0. Invalid subtraction between ${primaryPosition.toString()} and ${primaryEditStartPosition.toString()}` )); return []; } </ins> const secondaryEditText = substringPos(primaryEdit.text, positionWithinTextEdit); return secondaryPositions.map(pos => { const posEnd = addPositions(subtractPositions(pos, primaryEditStartPosition), primaryEditEndPosition);
Change:
When I changed the hover delegate for treeview I forgot to it .
Reopening this issue because it is a candidate
Approved and merged into release branch

Discussion:
@IInstantiationService instantiationService: IInstantiationService, ) { super(); <del> this._hoverDelegate = instantiationService.createInstance(WorkbenchHoverDelegate, 'mouse', false, { persistence: undefined /* use default persistence behaviour */ }); </del> <ins> this._hoverDelegate = this._register(instantiationService.createInstance(WorkbenchHoverDelegate, 'mouse', false, { persistence: undefined /* use default persistence behaviour */ })); </ins> this._register(this.themeService.onDidFileIconThemeChange(() => this.rerender())); this._register(this.themeService.onDidColorThemeChange(() => this.rerender())); this._register(checkboxStateHandler.onDidChangeCheckboxState(items => {
Change:
Originally from
This was originally introduced in and already has a fix via However since the fix is late, we may want to revert the indentation rules change for stable release.
closedWith

Discussion:
], "indentationRules": { "increaseIndentPattern": "^s*((begin|class|(private|protected)s+def|def|else|elsif|ensure|for|if|module|rescue|unless|until|when|in|while|case)|([^#]*sdob)|([^#]*=s*(case|if|unless)))b([^#{;]|("|'|/).*4)*(#.*)?$", <del> "decreaseIndentPattern": "^s*([}]]([,)]?s*(#|$)|.[a-zA-Z_]w*b)|(end|rescue|ensure|else|elsif)b)|((in|when)s)" </del> <ins> "decreaseIndentPattern": "^s*([}]]([,)]?s*(#|$)|.[a-zA-Z_]w*b)|(end|rescue|ensure|else|elsif|when|in)b)" </ins> } }
Change:
Repro: Add a long string item to a list setting, e.g., . Try an item without spaces (like a really long identifier) or with spaces. Expected: Overflow of the item is handled somehow, e.g., elision, broken to separate lines with enough spaces. Actual: The item text overflows horizontally and vertically (depending on spaces in the item), overlapping other UI elements. E.g., <img width="854" alt="Screenshot 2024-02-27 at 11 31 47" src=""<img width="815" alt="image" src=""Version: 1.86.2 Commit: User Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Embedder: <!-- generated by web issue reporter --

Discussion:
.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-sibling, .settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, .settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { <del> white-space: normal; overflow-wrap: normal; </del> <ins> white-space: nowrap; text-overflow: ellipsis; overflow: hidden; </ins> } .settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-value-checkbox {
Change:
Looks like a one time fluke, given 30d statistics and 5000+ runs pass rate. <img width="1357" alt="image" src=""

Discussion:
async function test77735(withOpenedEditor: boolean): Promise<void> { const docUriOriginal = await createRandomFile(); const docUriMoved = docUriOriginal.with({ path: `${docUriOriginal.path}.moved` }); <del> await deleteFile(docUriMoved); // ensure target does not exist </del> <ins> await deleteFile(docUriMoved); </ins> if (withOpenedEditor) { const document = await vscode.workspace.openTextDocument(docUriOriginal);

const document = await vscode.workspace.openTextDocument(newUri); assert.strictEqual(document.isDirty, true); <del> await document.save(); assert.strictEqual(document.isDirty, false); </del> <ins> const result = await document.save(); assert.strictEqual(result, true, `save failed in iteration: ${i} (docUriOriginal: ${docUriOriginal.fsPath})`); assert.strictEqual(document.isDirty, false, `document still dirty in iteration: ${i} (docUriOriginal: ${docUriOriginal.fsPath})`); </ins> assert.strictEqual(document.getText(), expected);
Change:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Read our guide about submitting issues: --<!-- Search existing issues to avoid creating duplicates. --<!-- Test using the latest Insiders build to see if your issue has already been fixed: --<!-- Instead of creating your report here, use 'Report Issue' from the 'Help' menu in VS Code to pre-fill useful information. --<!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes <!-- If you answered No above, use 'Help: Start Extension Bisect' from Command Palette to try to identify the cause. --<!-- Issues caused by an extension need to be reported directly to the extension publisher. The 'Help Report Issue' dialog can assist with this. --- VS Code Version: 1.86.2 OS Version: Not relevant Steps to Reproduce: a new file <kbdCTRL</kbd<kbdSHIFT</kbd<kbdP</kbdand choose YAML <kbdCTRL</kbd<kbdS</kbdthat the extension is ! YAML's documentation recommends the extension: see

Discussion:
"yaml" ], "extensions": [ <ins> ".yaml", </ins> ".yml", ".eyaml", ".eyml", <del> ".yaml", </del> ".cff", ".yaml-tmlanguage", ".yaml-tmpreferences",
Change:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Read our guide about submitting issues: --<!-- Search existing issues to avoid creating duplicates. --<!-- Test using the latest Insiders build to see if your issue has already been fixed: --<!-- Instead of creating your report here, use 'Report Issue' from the 'Help' menu in VS Code to pre-fill useful information. --<!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes <!-- If you answered No above, use 'Help: Start Extension Bisect' from Command Palette to try to identify the cause. --<!-- Issues caused by an extension need to be reported directly to the extension publisher. The 'Help Report Issue' dialog can assist with this. --- VS Code Version: 1.87.0 OS Version: Linux x64 6.5.13-7-MANJARO Steps to Reproduce: the welcome page. all the walkthough suggestions. a lot of empty space on the right: ! Normally after closing all walkthroughs the "recent" list moves to the second column, to have a more balanced layout. This was broken a few versions ago, then fixed, and now it's broken again.
same here, it was discussed for example in
Looks the same to me, is that right? <img width="1218" alt="image" src=""

Discussion:
if (gettingStartedList.itemCount) { this.container.classList.remove('noWalkthroughs'); if (videoList?.itemCount > 0) { <ins> this.container.classList.remove('noVideos'); </ins> reset(rightColumn, videoList?.getDomElement(), gettingStartedList.getDomElement()); } else { <ins> this.container.classList.add('noVideos'); </ins> reset(rightColumn, gettingStartedList.getDomElement()); } } else { this.container.classList.add('noWalkthroughs'); if (videoList?.itemCount > 0) { <ins> this.container.classList.remove('noVideos'); </ins> reset(rightColumn, videoList?.getDomElement()); } else { <ins> this.container.classList.add('noVideos'); </ins> reset(rightColumn); } }

}; const layoutRecentList = () => { <del> if (this.container.classList.contains('noWalkthroughs') && videoList?.itemCount === 0) { </del> <ins> if (this.container.classList.contains('noWalkthroughs') && this.container.classList.contains('noVideos')) { </ins> recentList.setLimit(10); reset(leftColumn, startList.getDomElement()); reset(rightColumn, recentList.getDomElement());