jiebi/CodeConvo huggingface dataset:
Change:
In the recent Edit Sessions UX study we ran, we saw several participants searching in vain for the terminal item in the compact menu on , sometimes for minutes: ! Could we consider bringing it back? I'm guessing we intentionally suppressed it because terminals can't run in the web, but participants were simply confused that it wasn't there without connecting its absence to the fact that was a browser application. Additionally, RemoteHub contributes a welcome view for the terminal which is one of the primary ways we explain that users must continue working elsewhere to run or debug code, and the fact that the terminal is completely suppressed means one less opportunity for users to organically learn the limitations of through our welcome views. ! cc
Yes that is why it was removed. It doesn't do much but if it helps reduce confusion I guess it's worth it?
Not against the idea of having the terminal menu in web but in its current form it's useless and doesn't allow me to actually show a terminal pane, it just deadends all over https://user-
Reverting in
when I enable the menu again and fix up the terminal command, the run/customize task items give this on the scripts/code-web sample-folder: <img width="1229" alt="image" src="https://user-"That does actually run, not sure what it's doing exactly though. Is that a custom execution task running in the web worker ext host? If so you might need a context key on those menu items to only show them when a custom execution task is registered?
Unless I'm missing something, I believe only registered tasks will show there - if they're running when you select them, then I don't think there's an issue.
I think there's a built-in fake task when running code-web is what I mean, when run in actual then running it might do nothing. In that case it should hide similar to how we're changing the behavior of New Terminal depending on whether extension contributed profiles exist

Discussion:
import { IMenuService, MenuId, IMenu, SubmenuItemAction, registerAction2, Action2, MenuItemAction, MenuRegistry } from 'vs/platform/actions/common/actions'; import { registerThemingParticipant, IThemeService } from 'vs/platform/theme/common/themeService'; import { MenuBarVisibility, getTitleBarStyle, IWindowOpenable, getMenuBarVisibility } from 'vs/platform/window/common/window'; <del> import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; </del> <ins> import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; </ins> import { IAction, Action, SubmenuAction, Separator, IActionRunner, ActionRunner, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { addDisposableListener, Dimension, EventType } from 'vs/base/browser/dom'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';

original: 'Terminal', mnemonicTitle: localize({ key: 'mTerminal', comment: ['&& denotes a mnemonic'] }, "&&Terminal") }, <del> order: 7, when: ContextKeyExpr.has('terminalProcessSupported') </del> <ins> order: 7 </ins> }); MenuRegistry.appendMenuItem(MenuId.MenubarMainMenu, {
Change:
This is a follow-up on and where I simply make the model-property of the tree public. Tho, a better fix might be needed here

Discussion:
} if (node.collapsible) { <del> const model = this.tree.model; // internal const location = model.getNodeLocation(node); </del> <ins> const location = this.tree.getNodeLocation(node); </ins> const recursive = e.browserEvent.altKey; this.tree.setFocus([location]); <del> model.setCollapsed(location, undefined, recursive); </del> <ins> this.tree.toggleCollapsed(location, recursive); </ins> if (expandOnlyOnTwistieClick && onTwistie) { return;

protected view: TreeNodeList<T, TFilterData, TRef>; private renderers: TreeRenderer<T, TFilterData, TRef, any>[]; <del> model: ITreeModel<T, TFilterData, TRef>; // used in MouseController </del> <ins> protected model: ITreeModel<T, TFilterData, TRef>; </ins> private focus: Trait<T>; private selection: Trait<T>; private anchor: Trait<T>;

return this.model.getNode(location); } <ins> getNodeLocation(node: ITreeNode<T, TFilterData>): TRef { return this.model.getNodeLocation(node); } </ins> collapse(location: TRef, recursive: boolean = false): boolean { return this.model.setCollapsed(location, true, recursive); }

export class DataTree<TInput, T, TFilterData = void> extends AbstractTree<T | null, TFilterData, T | null> { <del> declare model: ObjectTreeModel<T, TFilterData>; </del> <ins> protected declare model: ObjectTreeModel<T, TFilterData>; </ins> private input: TInput | undefined; private identityProvider: IIdentityProvider<T> | undefined;

export class IndexTree<T, TFilterData = void> extends AbstractTree<T, TFilterData, number[]> { <del> declare model: IndexTreeModel<T, TFilterData>; </del> <ins> protected declare model: IndexTreeModel<T, TFilterData>; </ins> constructor( user: string,

export class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends AbstractTree<T | null, TFilterData, T | null> { <del> declare model: IObjectTreeModel<T, TFilterData>; </del> <ins> protected declare model: IObjectTreeModel<T, TFilterData>; </ins> override get onDidChangeCollapseState(): Event<ICollapseStateChangeEvent<T | null, TFilterData>> { return this.model.onDidChangeCollapseState; }

export class CompressibleObjectTree<T extends NonNullable<any>, TFilterData = void> extends ObjectTree<T, TFilterData> implements ICompressedTreeNodeProvider<T, TFilterData> { <del> declare model: CompressibleObjectTreeModel<T, TFilterData>; </del> <ins> protected declare model: CompressibleObjectTreeModel<T, TFilterData>; </ins> constructor( user: string,
Change:
a new empty txt file <kbdCtrl Space</kbdtwice There's a warning notification. !

Discussion:
focusSelected(): void { const selection = this._list.getSelection(); <del> if (selection.length !== 1) { this._list.setFocus([0]); } else { </del> <ins> if (selection.length === 1) { </ins> this._list.setFocus([selection[0]]); } }
Change:
the command palette, set log level to the window the current log level in the command palette It wrongly indicates . !

Discussion:
all: this.userDataProfilesService.profiles, profile: this.profile || this.userDataProfilesService.defaultProfile }; <ins> configuration.logLevel = this.logService.getLevel(); </ins> // Load config this.load(configuration, { isReload: true, disableExtensions: cli?.['disable-extensions'] });

readonly extension: IExtensionDescription, ) { super(); <ins> this.setLevel(logger.getLevel()); </ins> this._register(logger.onDidChangeLogLevel(level => this.setLevel(level))); } get logLevel(): LogLevel { <del> return this.logger.getLevel(); </del> <ins> return this.getLevel(); </ins> } appendLine(value: string): void {
Change:
In my default profile with gitlens installed, move 3 gitlens views to a new view container (in secondary side bar) Create an empty profile Switch back to default profile gitlens view are back in SCM instead of in their new view container CC
Works great, thank you!

Discussion:
private readonly viewsRegistry: IViewsRegistry; private readonly viewContainersRegistry: IViewContainersRegistry; <del> private readonly viewContainersCustomLocations: Map<string, ViewContainerLocation>; private readonly viewDescriptorsCustomLocations: Map<string, string>; </del> <ins> private viewContainersCustomLocations: Map<string, ViewContainerLocation>; private viewDescriptorsCustomLocations: Map<string, string>; </ins> private readonly _onDidChangeViewContainers = this._register(new Emitter<{ added: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }>; removed: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }> }>()); readonly onDidChangeViewContainers = this._onDidChangeViewContainers.event;

for (const { views, from, to } of viewsToMove) { this.moveViewsWithoutSaving(views, from, to); } <ins> this.viewContainersCustomLocations = newViewContainerCustomizations; this.viewDescriptorsCustomLocations = newViewDescriptorCustomizations; </ins> } // Generated Container Id Format

assert.deepStrictEqual(actual, viewsCustomizations); }); <ins> test('storage change also updates locations even if views do not exists and views are registered later', async function () { const storageService = instantiationService.get(IStorageService); const testObject = aViewDescriptorService(); const generateViewContainerId = `workbench.views.service.${ViewContainerLocationToString(ViewContainerLocation.AuxiliaryBar)}.${generateUuid()}`; const viewsCustomizations = { viewContainerLocations: { [generateViewContainerId]: ViewContainerLocation.AuxiliaryBar, }, viewLocations: { 'view1': generateViewContainerId } }; storageService.store('views.customizations', JSON.stringify(viewsCustomizations), StorageScope.PROFILE, StorageTarget.USER); const viewContainer = ViewContainersRegistry.registerViewContainer({ id: `${viewContainerIdPrefix}-${generateUuid()}`, title: 'test', ctorDescriptor: new SyncDescriptor(<any>{}) }, ViewContainerLocation.Sidebar); const viewDescriptors: IViewDescriptor[] = [ { id: 'view1', ctorDescriptor: null!, name: 'Test View 1', canMoveView: true }, { id: 'view2', ctorDescriptor: null!, name: 'Test View 2', canMoveView: true } ]; ViewsRegistry.registerViews(viewDescriptors, viewContainer); testObject.onDidRegisterExtensions(); const viewContainer1Views = testObject.getViewContainerModel(viewContainer); assert.deepStrictEqual(viewContainer1Views.allViewDescriptors.map(v => v.id), ['view2']); const generateViewContainer = testObject.getViewContainerById(generateViewContainerId)!; assert.deepStrictEqual(testObject.getViewContainerLocation(generateViewContainer), ViewContainerLocation.AuxiliaryBar); const generatedViewContainerModel = testObject.getViewContainerModel(generateViewContainer); assert.deepStrictEqual(generatedViewContainerModel.allViewDescriptors.map(v => v.id), ['view1']); }); </ins> });
Change:
Found while working on a file tracked by git and make two distinct changes in separate lines the same file on the other side the dirty diff gutter marker on each of the editors to open the dirty diff views the outer editor on the right-hand side the action on the left-hand side dirty diff editor The right-hand side dirty diff editor jumps to the next change !

Discussion:
protected override _fillHead(container: HTMLElement): void { super._fillHead(container, true); <del> const previous = this.instantiationService.createInstance(UIEditorAction, this.editor, new ShowPreviousChangeAction(), ThemeIcon.asClassName(gotoPreviousLocation)); const next = this.instantiationService.createInstance(UIEditorAction, this.editor, new ShowNextChangeAction(), ThemeIcon.asClassName(gotoNextLocation)); </del> <ins> const previous = this.instantiationService.createInstance(UIEditorAction, this.editor, new ShowPreviousChangeAction(this.editor), ThemeIcon.asClassName(gotoPreviousLocation)); const next = this.instantiationService.createInstance(UIEditorAction, this.editor, new ShowNextChangeAction(this.editor), ThemeIcon.asClassName(gotoNextLocation)); </ins> this._disposables.add(previous); this._disposables.add(next);

export class ShowPreviousChangeAction extends EditorAction { <del> constructor() { </del> <ins> constructor(private readonly outerEditor?: ICodeEditor) { </ins> super({ id: 'editor.action.dirtydiff.previous', label: nls.localize('show previous change', "Show Previous Change"),

export class ShowNextChangeAction extends EditorAction { <del> constructor() { </del> <ins> constructor(private readonly outerEditor?: ICodeEditor) { </ins> super({ id: 'editor.action.dirtydiff.next', label: nls.localize('show next change', "Show Next Change"),

}); } <del> run(accessor: ServicesAccessor, editor: ICodeEditor): void { const outerEditor = getOuterEditorFromDiffEditor(accessor); </del> <ins> run(accessor: ServicesAccessor): void { const outerEditor = this.outerEditor ?? getOuterEditorFromDiffEditor(accessor); </ins> if (!outerEditor) { return;

}); } <del> run(accessor: ServicesAccessor, editor: ICodeEditor): void { </del> <ins> run(accessor: ServicesAccessor): void { </ins> const outerEditor = getOuterEditorFromDiffEditor(accessor); if (!outerEditor || !outerEditor.hasModel()) {
Change:
As explored in , I think the walkthrough experience could have less friction if steps were checked off once viewed rather than waiting for the user to actually perform the specific action. https://user- We could even think about removing the "checkbox" metaphor and instead only listening for a view event.
Here is a previously related conversation around walkthrough checkboxes:

Discussion:
stepElement.classList.add('expanded'); stepElement.setAttribute('aria-expanded', 'true'); this.buildMediaComponent(id); <del> this.gettingStartedService.progressByEvent('stepSelected:' + id); </del> <ins> this.gettingStartedService.progressStep(id); </ins> } else { this.editorInput.selectedStep = undefined; }
Change:
In this state: <img width="418" alt="image" src="https://user-"I expect to be able to hit the up arrow to loop around to the last refactor action, but I cannot
I think this may have been introduced by the refactoring
the actions are getting registered and the context key looks correct, but never happens of the action
that's because the key input isn't getting sent to the workbench https://user-

Discussion:
new ActionItemRenderer<IListMenuItem<IActionItem>>(resolver, this._keybindingService), new HeaderRenderer() ], { <del> keyboardSupport: true, </del> <ins> keyboardSupport: false, </ins> accessibilityProvider: { getAriaLabel: element => { if (element.kind === 'action') {

set(_target: T, p: PropertyKey, value: any): boolean { idle.value[p] = value; return true; <ins> }, getPrototypeOf(_target: T) { return ctor.prototype; </ins> } }); }
Change:
In the shared service, in , I create a logger () and listen to it for log level changes: In the renderer, that logger that log file is registered to a channel with the name When I open the command and pick and change the level, I don't get a change event in the shared service as I would have expected. Shouldn't that work?

Discussion:
import { remotePtyHostLog, remoteServerLog, sharedLogChannelId, userDataSyncLogChannelId } from 'vs/workbench/contrib/logs/common/logConstants'; import { LogLevelChannelClient } from 'vs/platform/log/common/logIpc'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; <ins> import { LOG_CHANNEL_ID as remoteTunnelLogChannelId } from 'vs/platform/remoteTunnel/common/remoteTunnel'; </ins> export class LogLevelService extends CommonLogLevelService {

const resource = channel?.log ? channel.file : undefined; LogLevelChannelClient.setLevel(this.mainProcessService.getChannel('logLevel'), logLevel, resource); <del> if (id === sharedLogChannelId || id === userDataSyncLogChannelId) { </del> <ins> if (id === sharedLogChannelId || id === userDataSyncLogChannelId || id === remoteTunnelLogChannelId) { </ins> LogLevelChannelClient.setLevel(this.sharedProcessService.getChannel('logLevel'), logLevel, resource); return true; }
Change:
The folder is now empty on my machine and around 20 extensions I wrote to troubleshoot various issues are gone . If I create a folder at with the contents an extension would have, it is not found by vscode anymore.
steps to reproduce: create an extension at start close vscode start observe how your files get deleted

Discussion:
await this.beforeRemovingExtension(await this.toLocalExtension(latest)); } })); <del> const toRemove = extensions.filter(e => uninstalled[ExtensionKey.create(e).toString()]); </del> <ins> const toRemove = extensions.filter(e => e.metadata /* Installed by VS Code */ && uninstalled[ExtensionKey.create(e).toString()]); </ins> await Promises.settled(toRemove.map(e => this.removeUninstalledExtension(e))); }

private async uninstallExtensionsNotInProfiles(): Promise<void> { const installed = await this.extensionManagementService.getAllUserInstalled(); <del> const toUninstall = installed.filter(installedExtension => !this.allExtensions.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); </del> <ins> const toUninstall = installed.filter(installedExtension => installedExtension.installedTimestamp /* Installed by VS Code */ && !this.allExtensions.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); </ins> if (toUninstall.length) { await this.extensionManagementService.markAsUninstalled(...toUninstall); }
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.73.1 OS Version: macOS 12.0.1 Steps to Reproduce: a markdown and add a link on the link, drag the link rendered in hover widget to the editor https://user- It seems that markdown renderer removes property and uses instead. I'm glad if I can help but I don't know if it's by design. Can we keep both and on links?
The described behavior is how it is expected to work. If you disagree, please explain what is expected and what is not in more detail. See also our . Happy Coding!
Fix actually seems pretty easy here so reopening

Discussion:
markdownHtmlDoc.body.querySelectorAll('a') .forEach(a => { const href = a.getAttribute('href'); // Get the raw 'href' attribute value as text, not the resolved 'href' <del> a.setAttribute('href', ''); // Clear out href. We use the `data-href` for handling clicks instead </del> <ins> a.removeAttribute('href'); // Clear out href. We use the `data-href` for handling clicks instead </ins> if ( !href || /^data:|javascript:/i.test(href)

mds.appendMarkdown(`[$(zap)-link](#link)`); const result: HTMLElement = renderMarkdown(mds).element; <del> assert.strictEqual(result.innerHTML, `<p><a data-href="#link" href="" title="#link"><span class="codicon codicon-zap"></span>-link</a></p>`); </del> <ins> assert.strictEqual(result.innerHTML, `<p><a data-href="#link" title="#link"><span class="codicon codicon-zap"></span>-link</a></p>`); </ins> }); test('render icon in table', () => {

</thead> <tbody><tr> <td><span class="codicon codicon-zap"></span></td> <del> <td><a data-href="#link" href="" title="#link"><span class="codicon codicon-zap"></span>-link</a></td> </del> <ins> <td><a data-href="#link" title="#link"><span class="codicon codicon-zap"></span>-link</a></td> </ins> </tr> </tbody></table> `);

}); const result: HTMLElement = renderMarkdown(md).element; <del> assert.strictEqual(result.innerHTML, `<p><a data-href="command:doFoo" href="" title="command:doFoo">command1</a> <a data-href="command:doFoo" href="">command2</a></p>`); </del> <ins> assert.strictEqual(result.innerHTML, `<p><a data-href="command:doFoo" title="command:doFoo">command1</a> <a data-href="command:doFoo">command2</a></p>`); </ins> }); suite('PlaintextMarkdownRender', () => {
Change:
Type: <bBug</brust-analyzer 0.3.1293 or a similar version a new file containing the source , which causes rust-analyzer to generate a with newline characters to show call hierarchy on the function Expected: Call hierarchy shows function name and signature as normal: ! Actual: Call hierarchy shows only the middle line of the signature: ! This occurs because: are not stripped from the detail CSS for includes CSS for includes I do not believe this is a rust-analyzer extension bug because the description of this field in the does not prohibit characters, and the problem is clearly caused by the CSS that VSCode uses to render the text. VS Code version: Code 1.73.1 (, 2022-11-09T02:08:38.961Z) OS version: Darwin x64 18.7.0 Modes: Sandboxed: No <!-- generated by issue reporter --
Thank you for the quick turnaround on this fix!
<!-- 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:
if (description || this.descriptionNode) { const descriptionNode = this.getOrCreateDescriptionNode(); if (descriptionNode instanceof HighlightedLabel) { <del> descriptionNode.set(description || '', options ? options.descriptionMatches : undefined); </del> <ins> descriptionNode.set(description || '', options ? options.descriptionMatches : undefined, undefined, options?.labelEscapeNewLines); </ins> this.setupHover(descriptionNode.element, options?.descriptionTitle); } else { <del> descriptionNode.textContent = description || ''; </del> <ins> descriptionNode.textContent = description && options?.labelEscapeNewLines ? HighlightedLabel.escapeNewLines(description, []) : (description || ''); </ins> this.setupHover(descriptionNode.element, options?.descriptionTitle || ''); descriptionNode.empty = !description; }
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.74.0-insider OS Version: Windows_NT x64 10.0. Steps to Reproduce: this snippet into a fresh VS Code buffer and make sure it's recognized as JavaScript: "use strict"; const foo = "abc"; (foo); the cursor onto an occurence of the identifier. F2 to rename and type . Don't hit Enter. Alt+Tab twice to switch to another window and back to VS Code. (Practical use case: Look for information in browser helping with deciding on the new name.) input focus of the text buffer is now lost. To regain the ability to continue typing into the buffer or to initiate a second renaming attempt with F2, I have to click on the buffer's tab. Furthermore, the text I entered into the little overlayed renaming textbox is gone. Suggestion: Keep overlayed renaming textbox alive when switching windows. If unwanted, at least make the buffer regain focus.
The rename box is designed to hide on focus lost but the editor should regain then

Discussion:
}; disposeOnDone.add(token.onCancellationRequested(() => this.cancelInput(true))); <del> disposeOnDone.add(this._editor.onDidBlurEditorWidget(() => this.cancelInput(false))); </del> <ins> disposeOnDone.add(this._editor.onDidBlurEditorWidget(() => this.cancelInput(!document.hasFocus()))); </ins> this._show();