resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.15.0-beta.4.tgz#d03a98e446372a5dbb7d92075d1f125eec23b030" integrity sha512-W9N0+5i3trQhgBOHDsnNiBbBiJpleFenY668wWaZ9GlvWseCTnjnWis1kfnM9WASDh/0+7aOjWrD089o+QeHGQ== <del> xterm-headless@5.2.0-beta.19: version "5.2.0-beta.19" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.2.0-beta.19.tgz#7603ffe76d42882bf72820791f8d2ba2074d7ace" integrity sha512-MKaObf5tdeEPXfRyhWkvNbiJ4oE57rL4eDV68iXm/0yYHgW3oQf3QO1d4SMGIxWYVx70AulY6EP2VswuInXImg== xterm@5.2.0-beta.19: version "5.2.0-beta.19" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.19.tgz#b3fd2eda3d9aa2672abaf03e864fafe64269c8a0" integrity sha512-3U+NYHjnIdUQf+MXiitmoFAcBOaLFHid3R/LzzvELjMwQx227EFk+3OmQjkBt7eH/IR+A4VlP5aPGmgriyLtGQ== </del> <ins> xterm-headless@5.2.0-beta.20: version "5.2.0-beta.20" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.2.0-beta.20.tgz#5827ac8977b5ae3246cc217dccdd6eaeac01b66e" integrity sha512-D1y4CIRvA8Izo7tAWShbyKTnxVteAy+N1j9Q+xvzcVxsGA4DLa8U7Gr2KXs3e/cjgkDcVHbbYCn7iWEyNTFvWw== xterm@5.2.0-beta.20: version "5.2.0-beta.20" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.20.tgz#52ed300d7077ce394f7656655ad07d90f96c6c64" integrity sha512-UIbFYmUPNTOSYIhAt/2pJ9AF7nc8RxT2k2bBUZOER4VdaeA89FH3xcNC5/3OysPkn6QS9INcYS2dX5gM2RnChg== </ins> yallist@^4.0.0: version "4.0.0"


resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.15.0-beta.4.tgz#d03a98e446372a5dbb7d92075d1f125eec23b030" integrity sha512-W9N0+5i3trQhgBOHDsnNiBbBiJpleFenY668wWaZ9GlvWseCTnjnWis1kfnM9WASDh/0+7aOjWrD089o+QeHGQ== <del> xterm-headless@5.2.0-beta.19: version "5.2.0-beta.19" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.2.0-beta.19.tgz#7603ffe76d42882bf72820791f8d2ba2074d7ace" integrity sha512-MKaObf5tdeEPXfRyhWkvNbiJ4oE57rL4eDV68iXm/0yYHgW3oQf3QO1d4SMGIxWYVx70AulY6EP2VswuInXImg== xterm@5.2.0-beta.19: version "5.2.0-beta.19" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.19.tgz#b3fd2eda3d9aa2672abaf03e864fafe64269c8a0" integrity sha512-3U+NYHjnIdUQf+MXiitmoFAcBOaLFHid3R/LzzvELjMwQx227EFk+3OmQjkBt7eH/IR+A4VlP5aPGmgriyLtGQ== </del> <ins> xterm-headless@5.2.0-beta.20: version "5.2.0-beta.20" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.2.0-beta.20.tgz#5827ac8977b5ae3246cc217dccdd6eaeac01b66e" integrity sha512-D1y4CIRvA8Izo7tAWShbyKTnxVteAy+N1j9Q+xvzcVxsGA4DLa8U7Gr2KXs3e/cjgkDcVHbbYCn7iWEyNTFvWw== xterm@5.2.0-beta.20: version "5.2.0-beta.20" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.20.tgz#52ed300d7077ce394f7656655ad07d90f96c6c64" integrity sha512-UIbFYmUPNTOSYIhAt/2pJ9AF7nc8RxT2k2bBUZOER4VdaeA89FH3xcNC5/3OysPkn6QS9INcYS2dX5gM2RnChg== </ins> y18n@^3.2.1: version "3.2.2"


primary: KeyMod.Alt | KeyCode.F1, weight: KeybindingWeight.WorkbenchContrib, linux: { <del> primary: KeyMod.Shift | KeyCode.F1, secondary: [KeyMod.Shift | KeyCode.F1] }, win: { primary: KeyMod.Shift | KeyCode.F1, secondary: [KeyMod.Shift | KeyCode.F1] </del> <ins> primary: KeyMod.Alt | KeyMod.Shift | KeyCode.F1, secondary: [KeyMod.Alt | KeyCode.F1] </ins> }, when: TerminalContextKeys.focus }


TerminalCommandId.SelectNextPageSuggestion, TerminalCommandId.AcceptSelectedSuggestion, TerminalCommandId.HideSuggestWidget, <ins> TerminalCommandId.ShowTerminalAccessibilityHelp, </ins> 'editor.action.toggleTabFocusMode', 'notifications.hideList', 'notifications.hideToasts',


type: 'string', enum: ['always', 'never', 'whenTriggerCharacter', 'whenQuickSuggestion'], enumDescriptions: [ <del> nls.localize('suggest.insertMode.always', "Always activate the suggest widget when triggering IntelliSense automatically."), nls.localize('suggest.insertMode.never', "Never activate the suggest widget when triggering IntelliSense automatically."), nls.localize('suggest.insertMode.whenTriggerCharacter', "Activate the suggest widget only when triggering IntelliSense from a trigger character."), nls.localize('suggest.insertMode.whenQuickSuggestion', "Activate the suggest widget only when triggering IntelliSense as you type."), </del> <ins> nls.localize('suggest.insertMode.always', "Always select a suggestion when automatically triggering IntelliSense."), nls.localize('suggest.insertMode.never', "Never select a suggestion when automatically triggering IntelliSense."), nls.localize('suggest.insertMode.whenTriggerCharacter', "Select a suggestion only when triggering IntelliSense from a trigger character."), nls.localize('suggest.insertMode.whenQuickSuggestion', "Select a suggestion only when triggering IntelliSense as you type."), </ins> ], default: defaults.selectionMode, <del> markdownDescription: nls.localize('suggest.selectionMode', "Controls whether the suggest widget becomes active when triggered via quick suggest or trigger characters. Note that the widget is always active when explicitly invoked, e.g via `Ctrl+Space`.") </del> <ins> markdownDescription: nls.localize('suggest.selectionMode', "Controls whether a suggestion is selected when the widget shows. Note that this only applies to automatically triggered suggestions (`#editor.quickSuggestions#` and `#editor.suggestOnTriggerCharacters#`) and that a suggestion is always selected when explicitly invoked, e.g via `Ctrl+Space`.") </ins> }, 'editor.suggest.snippetsPreventQuickSuggestions': { type: 'boolean',


this.filterText = this.getFilterText(completionContext.line, tsEntry.insertText); if (completionContext.isMemberCompletion && completionContext.dotAccessorContext && !(this.insertText instanceof vscode.SnippetString)) { <del> this.filterText = completionContext.dotAccessorContext.text + (this.insertText || typeof this.label === 'string' ? this.label : this.label.label); </del> <ins> this.filterText = completionContext.dotAccessorContext.text + (this.insertText || this.textLabel); </ins> if (!this.range) { const replacementRange = this.getFuzzyWordRange(); if (replacementRange) {


}); } <del> return new vscode.CompletionList(newItems); </del> <ins> return new vscode.CompletionList(newItems, true); </ins> }); } }


import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { ICellDto2, INotebookEditorModel, INotebookLoadOptions, IResolvedNotebookEditorModel, NotebookCellsChangeType, NotebookData } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookSerializer, INotebookService, SimpleNotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookService'; <ins> import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; </ins> import { IFileWorkingCopyManager } from 'vs/workbench/services/workingCopy/common/fileWorkingCopyManager'; import { IStoredFileWorkingCopy, IStoredFileWorkingCopyModel, IStoredFileWorkingCopyModelContentChangedEvent, IStoredFileWorkingCopyModelFactory, IStoredFileWorkingCopySaveEvent, StoredFileWorkingCopyState } from 'vs/workbench/services/workingCopy/common/storedFileWorkingCopy'; import { IUntitledFileWorkingCopy, IUntitledFileWorkingCopyModel, IUntitledFileWorkingCopyModelContentChangedEvent, IUntitledFileWorkingCopyModelFactory } from 'vs/workbench/services/workingCopy/common/untitledFileWorkingCopy';


private readonly _hasAssociatedFilePath: boolean, readonly viewType: string, private readonly _workingCopyManager: IFileWorkingCopyManager<NotebookFileWorkingCopyModel, NotebookFileWorkingCopyModel>, <del> @IFileService private readonly _fileService: IFileService </del> <ins> @IFileService private readonly _fileService: IFileService, @ILifecycleService lifecycleService: ILifecycleService </ins> ) { super(); <ins> if (this.viewType === 'interactive') { lifecycleService.onBeforeShutdown(async e => e.veto(this.onBeforeShutdown(), 'veto.InteractiveWindow')); } } private async onBeforeShutdown() { if (this._workingCopy?.isDirty()) { await this._workingCopy.save(); } return false; </ins> } override dispose(): void {


if (uri !== undefined) { // Launch desktop client if currently in web <ins> let target = `${env.uriScheme}://vscode.git/clone?url=${encodeURIComponent(uri)}`; </ins> if (env.uiKind === UIKind.Web) { <del> let target = `${env.uriScheme}://vscode.git/clone?url=${encodeURIComponent(uri)}`; </del> if (ref !== undefined) { target += `&ref=${encodeURIComponent(ref)}`; } return Uri.parse(target); } <del> // If already in desktop client, directly clone </del> <ins> // If already in desktop client but in a remote window, we need to force a new window // so that the git extension can access the local filesystem for cloning if (env.remoteName !== undefined) { target += `&windowId=_blank`; return Uri.parse(target); } // Otherwise, directly clone </ins> void this.clone(uri, undefined, { ref: ref }); } }


if (configuration.enableTsServerTracing) { if (tsServerTraceDirectory) { <del> this._logger.info(`<${kind}> Trace directory: ${tsServerTraceDirectory}`); </del> <ins> this._logger.info(`<${kind}> Trace directory: ${tsServerTraceDirectory.fsPath}`); </ins> } else { this._logger.error(`<${kind}> Could not create trace directory`); }


if (configuration.enableTsServerTracing && !isWeb()) { tsServerTraceDirectory = this._logDirectoryProvider.getNewLogDirectory(); if (tsServerTraceDirectory) { <del> args.push('--traceDirectory', tsServerTraceDirectory.path); </del> <ins> args.push('--traceDirectory', tsServerTraceDirectory.fsPath); </ins> } }


const languageContributions = findNodeAtLocation(tree, ['contributes', 'languages']); languageContributions?.children?.forEach(child => { const id = findNodeAtLocation(child, ['id']); <del> if (id && id.type === 'string') { </del> <ins> const configuration = findNodeAtLocation(child, ['configuration']); if (id && id.type === 'string' && configuration && configuration.type === 'string') { </ins> activationEvents.add(`onLanguage:${id.value}`); } });


}, activationEventsGenerator: (languageContributions, result) => { for (const languageContribution of languageContributions) { <del> if (languageContribution.id) { </del> <ins> if (languageContribution.id && languageContribution.configuration) { </ins> result.push(`onLanguage:${languageContribution.id}`); } }


const parent = this._options.parentSession; if (parent) { toDispose.add(parent.onDidEndAdapter(() => { <del> // copy the parent repl and get a new detached repl for this child if (!this.hasSeparateRepl()) { </del> <ins> // copy the parent repl and get a new detached repl for this child, and // remove its parent, if it's still running if (!this.hasSeparateRepl() && this.raw?.isInShutdown === false) { </ins> this.repl = this.repl.clone(); replListener.value = this.repl.onDidChangeElements(() => this._onDidChangeREPLElements.fire()); <ins> this.parentSession = undefined; </ins> } <del> this.parentSession = undefined; </del> })); } }


this.debugAdapter.onRequest(request => this.dispatchRequest(request)); } <ins> get isInShutdown() { return this.inShutdown; } </ins> get onDidExitAdapter(): Event<AdapterEndEvent> { return this._onDidExitAdapter.event; }


if (typeof raw.sourceReference === 'number' && raw.sourceReference > 0) { return URI.from({ scheme: DEBUG_SCHEME, <del> path, </del> <ins> path: path?.replace(/^/+/g, '/'), // #174054 </ins> query: `session=${sessionId}&ref=${raw.sourceReference}` }); }


const newWithProfile = nls.localize('newWithProfile', 'The Create New Terminal (With Profile) ({0}) command allows for easy terminal creation using a specific profile.'); const newWithProfileNoKb = nls.localize('newWithProfileNoKb', 'The Create New Terminal (With Profile) command allows for easy terminal creation using a specific profile and is currently not triggerable by a keybinding.'); const accessibilitySettings = nls.localize('accessibilitySettings', 'Access accessibility settings such as `terminal.integrated.tabFocusMode` via the Preferences: Open Accessibility Settings command.'); <ins> const commandPrompt = nls.localize('commandPromptMigration', "Consider using powershell instead of command prompt for an improved experience"); </ins> class AccessibilityHelpWidget extends Widget implements ITerminalWidget { readonly id = 'help'; private _container: HTMLElement | undefined;


private readonly _markdownRenderer: MarkdownRenderer; constructor( <del> instance: ITerminalInstance, </del> <ins> private readonly _instance: ITerminalInstance, </ins> @IKeybindingService private readonly _keybindingService: IKeybindingService, @IInstantiationService instantiationService: IInstantiationService, @IOpenerService private readonly _openerService: IOpenerService ) { super(); <del> this._hasShellIntegration = instance.xterm?.shellIntegration.status === ShellIntegrationStatus.VSCode; </del> <ins> this._hasShellIntegration = _instance.xterm?.shellIntegration.status === ShellIntegrationStatus.VSCode; </ins> this._domNode = createFastDomNode(document.createElement('div')); this._contentDomNode = createFastDomNode(document.createElement('div')); this._contentDomNode.setClassName('terminal-accessibility-help');


this._register(dom.addStandardDisposableListener(this._contentDomNode.domNode, 'keydown', (e) => { if (e.keyCode === KeyCode.Escape) { this.hide(); <del> instance.focus(); </del> <ins> _instance.focus(); </ins> } })); <del> this._register(instance.onDidFocus(() => this.hide())); </del> <ins> this._register(_instance.onDidFocus(() => this.hide())); </ins> this._markdownRenderer = this._register(instantiationService.createInstance(MarkdownRenderer, {})); }


private _buildContent(): void { const content = []; content.push(this._descriptionForCommand(TerminalCommandId.FocusAccessibleBuffer, focusAccessibleBufferNls, focusAccessibleBufferNoKb)); <ins> if (this._instance.shellType === WindowsShellType.CommandPrompt) { content.push(commandPrompt); } </ins> if (this._hasShellIntegration) { content.push(shellIntegration); content.push('- ' + this._descriptionForCommand(TerminalCommandId.RunRecentCommand, runRecentCommand, runRecentCommandNoKb) + 'n- ' + this._descriptionForCommand(TerminalCommandId.GoToRecentDirectory, goToRecent, goToRecentNoKb));


const dismiss = nls.localize('dismiss', "You can dismiss this dialog by pressing Escape or focusing elsewhere."); const openDetectedLink = nls.localize('openDetectedLink', 'The Open Detected Link ({0}) command enables screen readers to easily open links found in the terminal.'); const openDetectedLinkNoKb = nls.localize('openDetectedLinkNoKb', 'The Open Detected Link command enables screen readers to easily open links found in the terminal and is currently not triggerable by a keybinding.'); <ins> const newWithProfile = nls.localize('newWithProfile', 'The Create New Terminal (With Profile) ({0}) command allows for easy terminal creation using a specific profile.'); const newWithProfileNoKb = nls.localize('newWithProfileNoKb', 'The Create New Terminal (With Profile) command command allows for easy terminal creation using a specific profile and is currently not triggerable by a keybinding.'); const accessibilitySettings = nls.localize('accessibilitySettings', 'Access accessibility settings such as `terminal.integrated.tabFocusMode` via the Preferences: Open Accessibility Settings command.'); </ins> class AccessibilityHelpWidget extends Widget implements ITerminalWidget { readonly id = 'help';


content.push('- ' + this._descriptionForCommand(TerminalCommandId.RunRecentCommand, runRecentCommand, runRecentCommandNoKb) + 'n- ' + this._descriptionForCommand(TerminalCommandId.GoToRecentDirectory, goToRecent, goToRecentNoKb)); } content.push(this._descriptionForCommand(TerminalCommandId.OpenDetectedLink, openDetectedLink, openDetectedLinkNoKb)); <ins> content.push(this._descriptionForCommand(TerminalCommandId.NewWithProfile, newWithProfile, newWithProfileNoKb)); content.push(accessibilitySettings); </ins> content.push(readMoreLink, dismiss); const element = renderElementAsMarkdown(this._markdownRenderer, this._openerService, content.join('nn'), this._register(new DisposableStore())); const anchorElements = element.querySelectorAll('a');


.traceback.wordWrap span { white-space: pre-wrap; } <del> .output > .scrollable { </del> <ins> .output .scrollable { </ins> overflow-y: scroll; max-height: var(--notebook-cell-output-max-height); border: var(--vscode-editorWidget-border);


} function scrollableArrayOfString(id: string, buffer: string[], container: HTMLElement, trustHtml: boolean) { <del> container.classList.add('scrollable'); </del> <ins> const scrollableDiv = document.createElement('div'); scrollableDiv.classList.add('scrollable'); </ins> if (buffer.length > 5000) { container.appendChild(generateViewMoreElement(id, false)); } <del> const div = document.createElement('div'); container.appendChild(div); div.appendChild(handleANSIOutput(buffer.slice(0, 5000).join('n'), trustHtml)); </del> <ins> container.appendChild(scrollableDiv); scrollableDiv.appendChild(handleANSIOutput(buffer.slice(0, 5000).join('n'), trustHtml)); </ins> } export function insertOutput(id: string, outputs: string[], linesLimit: number, scrollable: boolean, container: HTMLElement, trustHtml: boolean) {


storageId: 'workbench.explorer.views.state', icon: explorerViewIcon, alwaysUseContainerInfo: true, <ins> hideIfEmpty: true, </ins> order: 0, openCommandActionDescriptor: { id: VIEWLET_ID,


} }; <del> function scrollWillGoToParent(event: WheelEvent) { </del> <ins> let scrollTimeout: any /* NodeJS.Timeout */ | undefined; let scrolledElement: Element | undefined; function flagRecentlyScrolled(node: Element) { scrolledElement = node; node.setAttribute('recentlyScrolled', 'true'); clearTimeout(scrollTimeout); scrollTimeout = setTimeout(() => { scrolledElement?.removeAttribute('recentlyScrolled'); }, 300); } function eventTargetShouldHandleScroll(event: WheelEvent) { </ins> for (let node = event.target as Node | null; node; node = node.parentNode) { if (!(node instanceof Element) || node.id === 'container' || node.classList.contains('cell_container') || node.classList.contains('markup') || node.classList.contains('output_container')) { return false; } <ins> if (node.hasAttribute('recentlyScrolled') && scrolledElement === node) { flagRecentlyScrolled(node); return true; } </ins> // scroll up if (event.deltaY < 0 && node.scrollTop > 0) { // there is still some content to scroll <ins> flagRecentlyScrolled(node); </ins> return true; }


continue; } <ins> flagRecentlyScrolled(node); </ins> return true; } }


} const handleWheel = (event: WheelEvent & { wheelDeltaX?: number; wheelDeltaY?: number; wheelDelta?: number }) => { <del> if (event.defaultPrevented || scrollWillGoToParent(event)) { </del> <ins> if (event.defaultPrevented || eventTargetShouldHandleScroll(event)) { </ins> return; } postNotebookMessage<webviewMessages.IWheelMessage>('did-scroll-wheel', {


} if (node.hasAttribute('recentlyScrolled')) { <del> if (lastTimeScrolled && Date.now() - lastTimeScrolled > 300) { </del> <ins> if (lastTimeScrolled && Date.now() - lastTimeScrolled > 400) { </ins> // it has been a while since we actually scrolled <del> // if scroll velocity increases, it's likely a new scroll event if (!!previousDelta && deltaY < 0 && deltaY < previousDelta - 2) { </del> <ins> // if scroll velocity increases significantly, it's likely a new scroll event if (!!previousDelta && deltaY < 0 && deltaY < previousDelta - 8) { </ins> clearTimeout(scrollTimeout); scrolledElement?.removeAttribute('recentlyScrolled'); return false; <del> } else if (!!previousDelta && deltaY > 0 && deltaY > previousDelta + 2) { </del> <ins> } else if (!!previousDelta && deltaY > 0 && deltaY > previousDelta + 8) { </ins> clearTimeout(scrollTimeout); scrolledElement?.removeAttribute('recentlyScrolled'); return false;


private _tabFocusTerminal: boolean = false; private _tabFocusEditor: boolean = false; <del> private readonly _onDidChangeTabFocus = new Emitter<boolean>(); public readonly onDidChangeTabFocus: Event<boolean> = this._onDidChangeTabFocus.event; </del> <ins> private readonly _onDidChangeTabFocus = new Emitter<void>(); public readonly onDidChangeTabFocus: Event<void> = this._onDidChangeTabFocus.event; </ins> public getTabFocusMode(context: TabFocusContext): boolean { return context === TabFocusContext.Terminal ? this._tabFocusTerminal : this._tabFocusEditor; } public setTabFocusMode(tabFocusMode: boolean, context: TabFocusContext): void { <del> if ((context === TabFocusContext.Terminal && this._tabFocusTerminal === tabFocusMode) || (context === TabFocusContext.Editor && this._tabFocusEditor === tabFocusMode)) { return; } </del> if (context === TabFocusContext.Terminal) { this._tabFocusTerminal = tabFocusMode; } else { this._tabFocusEditor = tabFocusMode; } <del> this._onDidChangeTabFocus.fire(this._tabFocusTerminal); </del> <ins> this._onDidChangeTabFocus.fire(); </ins> } }


private readonly languageElement = this._register(new MutableDisposable<IStatusbarEntryAccessor>()); private readonly metadataElement = this._register(new MutableDisposable<IStatusbarEntryAccessor>()); private readonly currentProblemStatus: ShowCurrentMarkerInStatusbarContribution = this._register(this.instantiationService.createInstance(ShowCurrentMarkerInStatusbarContribution)); <ins> private _previousViewContext: 'terminal' | 'editor' | undefined; </ins> private readonly state = new State(); private readonly activeEditorListeners = this._register(new DisposableStore()); private readonly delayedRender = this._register(new MutableDisposable());


this._register(this.textFileService.untitled.onDidChangeEncoding(model => this.onResourceEncodingChange(model.resource))); this._register(this.textFileService.files.onDidChangeEncoding(model => this.onResourceEncodingChange((model.resource)))); this._register(Event.runAndSubscribe(TabFocus.onDidChangeTabFocus, () => this.onTabFocusModeChange())); <ins> const viewKey = new Set<string>(); viewKey.add('focusedView'); this._register(this.contextKeyService.onDidChangeContext((c) => { if (c.affectsSome(viewKey)) { const terminalFocus = this.contextKeyService.getContextKeyValue('focusedView') === 'terminal'; const context = terminalFocus ? 'terminal' : 'editor'; if (this._previousViewContext === context) { return; } this._previousViewContext = context; this.onTabFocusModeChange(); } })); </ins> } private registerCommands(): void {


import { Schemas } from 'vs/base/common/network'; import { TabFocus, TabFocusContext } from 'vs/editor/browser/config/tabFocus'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; <del> import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; </del> import { ILabelService } from 'vs/platform/label/common/label'; import { TerminalSettingId } from 'vs/platform/terminal/common/terminal'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions';


@ITerminalService terminalService: ITerminalService, @ITerminalEditorService terminalEditorService: ITerminalEditorService, @ITerminalGroupService terminalGroupService: ITerminalGroupService, <del> @IConfigurationService configurationService: IConfigurationService, @IContextKeyService contextKeyService: IContextKeyService </del> <ins> @IConfigurationService configurationService: IConfigurationService </ins> ) { super();


} }); <del> const viewKey = new Set<string>(); viewKey.add('focusedView'); </del> TabFocus.setTabFocusMode(configurationService.getValue('editor.tabFocusMode'), TabFocusContext.Editor); TabFocus.setTabFocusMode(configurationService.getValue(TerminalSettingId.TabFocusMode), TabFocusContext.Terminal); <del> this._register(contextKeyService.onDidChangeContext((c) => { if (c.affectsSome(viewKey)) { if (contextKeyService.getContextKeyValue('focusedView') === 'terminal') { TabFocus.setTabFocusMode(configurationService.getValue(TerminalSettingId.TabFocusMode), TabFocusContext.Terminal); } else { TabFocus.setTabFocusMode(configurationService.getValue('editor.tabFocusMode'), TabFocusContext.Editor); } } })); </del> } }


switch (changeType) { case ChangeType.Add: audioCueService.playAudioCue(AudioCue.diffLineInserted, true); <ins> break; </ins> case ChangeType.Delete: audioCueService.playAudioCue(AudioCue.diffLineDeleted, true); <ins> break; </ins> case ChangeType.Modify: audioCueService.playAudioCue(AudioCue.diffLineModified, true); <ins> break; </ins> } }


const sound = this.sounds.get(url); if (sound) { sound.volume = this.getVolumeInPercent() / 100; <ins> sound.currentTime = 0; </ins> await sound.play(); } else { const playedSound = await playAudio(url, this.getVolumeInPercent() / 100);


function areLanguageDiagnosticSettingsEqual(currentSettings: LanguageDiagnosticSettings, newSettings: LanguageDiagnosticSettings): boolean { return currentSettings.validate === newSettings.validate <del> && currentSettings.enableSuggestions && currentSettings.enableSuggestions; </del> <ins> && currentSettings.enableSuggestions === newSettings.enableSuggestions; </ins> } class DiagnosticSettings {


import { CancellationToken } from 'vs/base/common/cancellation'; import { FuzzyScore } from 'vs/base/common/filters'; import { Iterable } from 'vs/base/common/iterator'; <del> import { RefCountedDisposable } from 'vs/base/common/lifecycle'; </del> <ins> import { Disposable, RefCountedDisposable } from 'vs/base/common/lifecycle'; </ins> import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EditorOption } from 'vs/editor/common/config/editorOptions';


} <del> export class SuggestInlineCompletions implements InlineCompletionsProvider<InlineCompletionResults> { </del> <ins> export class SuggestInlineCompletions extends Disposable implements InlineCompletionsProvider<InlineCompletionResults> { </ins> private _lastResult?: InlineCompletionResults;


@IClipboardService private readonly _clipboardService: IClipboardService, @ISuggestMemoryService private readonly _suggestMemoryService: ISuggestMemoryService, @ICodeEditorService private readonly _editorService: ICodeEditorService, <del> ) { } </del> <ins> ) { super(); this._store.add(_languageFeatureService.inlineCompletionsProvider.register('*', this)); } </ins> async provideInlineCompletions(model: ITextModel, position: Position, context: InlineCompletionContext, token: CancellationToken): Promise<InlineCompletionResults | undefined> {


test('Aggressive inline completions when typing within line #146948', async function () { <del> const completions: SuggestInlineCompletions = insta.createInstance(SuggestInlineCompletions); </del> <ins> const completions: SuggestInlineCompletions = disposables.add(insta.createInstance(SuggestInlineCompletions)); </ins> { // (1,3), end of word -> suggestions


}); test('Snippets show in inline suggestions even though they are turned off #175190', async function () { <del> const completions: SuggestInlineCompletions = insta.createInstance(SuggestInlineCompletions); </del> <ins> const completions: SuggestInlineCompletions = disposables.add(insta.createInstance(SuggestInlineCompletions)); </ins> { // unfiltered


/** * Value-object describing what options formatting should use. */ <del> export interface SortingOptions { /** * Size of a tab in spaces. */ tabSize: number; /** * Prefer spaces over tabs. */ insertSpaces: boolean; /** * Signature for further properties. */ [key: string]: boolean | number | string; } /** * Value-object describing what options formatting should use. */ </del> export interface FormattingOptions { /**


export const editorErrorBorder = registerColor('editorError.border', { dark: null, light: null, hcDark: Color.fromHex('#E47777').transparent(0.8), hcLight: '#B5200D' }, nls.localize('errorBorder', 'Border color of error boxes in the editor.')); export const editorWarningBackground = registerColor('editorWarning.background', { dark: null, light: null, hcDark: null, hcLight: null }, nls.localize('editorWarning.background', 'Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations.'), true); <del> export const editorWarningForeground = registerColor('editorWarning.foreground', { dark: '#CCA700', light: '#BF8803', hcDark: '#FFD37', hcLight: '#895503' }, nls.localize('editorWarning.foreground', 'Foreground color of warning squigglies in the editor.')); </del> <ins> export const editorWarningForeground = registerColor('editorWarning.foreground', { dark: '#CCA700', light: '#BF8803', hcDark: '#FFD370', hcLight: '#895503' }, nls.localize('editorWarning.foreground', 'Foreground color of warning squigglies in the editor.')); </ins> export const editorWarningBorder = registerColor('editorWarning.border', { dark: null, light: null, hcDark: Color.fromHex('#FFCC00').transparent(0.8), hcLight: '#' }, nls.localize('warningBorder', 'Border color of warning boxes in the editor.')); export const editorInfoBackground = registerColor('editorInfo.background', { dark: null, light: null, hcDark: null, hcLight: null }, nls.localize('editorInfo.background', 'Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations.'), true);


try { const userDataProfilesExportState = disposables.add(this.instantiationService.createInstance(UserDataProfileExportState, this.userDataProfileService.currentProfile)); const barrier = new Barrier(); <del> const exportAction = new BarrierAction(barrier, new Action('export', localize('export', "Export"), undefined, true, () => { </del> <ins> const exportAction = new BarrierAction(barrier, new Action('export', localize('export', "Export"), undefined, true, async () => { </ins> exportAction.enabled = false; <del> return this.doExportProfile(userDataProfilesExportState); })); const closeAction = new BarrierAction(barrier, new Action('close', localize('close', "Close"))); </del> <ins> try { await this.doExportProfile(userDataProfilesExportState); } catch (error) { this.notificationService.error(error); throw error; } }), this.notificationService); const closeAction = new BarrierAction(barrier, new Action('close', localize('close', "Close")), this.notificationService); </ins> await this.showProfilePreviewView(EXPORT_PROFILE_PREVIEW_VIEW, userDataProfilesExportState.profile.name, exportAction, closeAction, true, userDataProfilesExportState); disposables.add(this.userDataProfileService.onDidChangeCurrentProfile(e => barrier.open())); await barrier.wait();


if (!profileContentHandler) { return; } <del> const saveResult = await profileContentHandler.saveProfile(profile.name, JSON.stringify(profile), CancellationToken.None); </del> <ins> const saveResult = await profileContentHandler.saveProfile(profile.name.replace('/', '-'), JSON.stringify(profile), CancellationToken.None); </ins> if (!saveResult) { return; }


: importAction; const secondaryAction = isWeb ? importAction <del> : new BarrierAction(barrier, new Action('close', localize('close', "Close"))); </del> <ins> : new BarrierAction(barrier, new Action('close', localize('close', "Close")), this.notificationService); </ins> const view = await this.showProfilePreviewView(IMPORT_PROFILE_PREVIEW_VIEW, importedProfile.name, primaryAction, secondaryAction, false, userDataProfileImportState); const message = new MarkdownString();


if (userDataProfileImportState.isEmpty()) { await importAction.run(); } else { <del> await this.showProfilePreviewView(IMPORT_PROFILE_PREVIEW_VIEW, profileTemplate.name, importAction, new BarrierAction(barrier, new Action('cancel', localize('cancel', "Cancel"))), false, userDataProfileImportState); </del> <ins> await this.showProfilePreviewView(IMPORT_PROFILE_PREVIEW_VIEW, profileTemplate.name, importAction, new BarrierAction(barrier, new Action('cancel', localize('cancel', "Cancel")), this.notificationService), false, userDataProfileImportState); </ins> } await barrier.wait(); await this.hideProfilePreviewView(IMPORT_PROFILE_PREVIEW_VIEW);


location: IMPORT_PROFILE_PREVIEW_VIEW, }, () => importProfileFn()); } <del> })); </del> <ins> }), this.notificationService); </ins> return importAction; }


} class BarrierAction extends Action { <del> constructor(barrier: Barrier, action: Action) { </del> <ins> constructor(barrier: Barrier, action: Action, notificationService: INotificationService) { </ins> super(action.id, action.label, action.class, action.enabled, async () => { <del> await action.run(); </del> <ins> try { await action.run(); } catch (error) { notificationService.error(error); throw error; } </ins> barrier.open(); }); }


*--------------------------------------------------------------------------------------------*/ import { networkInterfaces } from 'os'; <del> import * as errors from 'vs/base/common/errors'; </del> import { TernarySearchTree } from 'vs/base/common/ternarySearchTree'; import * as uuid from 'vs/base/common/uuid'; import { getMac } from 'vs/base/node/macAddress';


}; let machineId: Promise<string>; <del> export async function getMachineId(): Promise<string> { </del> <ins> export async function getMachineId(errorLogger: (error: any) => void): Promise<string> { </ins> if (!machineId) { machineId = (async () => { <del> const id = await getMacMachineId(); </del> <ins> const id = await getMacMachineId(errorLogger); </ins> return id || uuid.generateUuid(); // fallback, generate a UUID })();


return machineId; } <del> async function getMacMachineId(): Promise<string | undefined> { </del> <ins> async function getMacMachineId(errorLogger: (error: any) => void): Promise<string | undefined> { </ins> try { const crypto = await import('crypto'); const macAddress = getMac(); return crypto.createHash('sha256').update(macAddress, 'utf8').digest('hex'); } catch (err) { <del> errors.onUnexpectedError(err); </del> <ins> errorLogger(err); </ins> return undefined; } }


flakySuite('ID', () => { test('getMachineId', async function () { <del> const id = await getMachineId(); </del> <ins> const errors = []; const id = await getMachineId(err => errors.push(err)); </ins> assert.ok(id); <ins> assert.strictEqual(errors.length, 0); </ins> }); test('getMac', async () => {


// Resolve unique machine ID this.logService.trace('Resolving machine identifier...'); <del> const machineId = await resolveMachineId(this.stateService); </del> <ins> const machineId = await resolveMachineId(this.stateService, this.logService); </ins> this.logService.trace(`Resolved machine identifier: ${machineId}`); // Shared process


commonProperties: (async () => { let machineId: string | undefined = undefined; try { <del> machineId = await resolveMachineId(stateService); </del> <ins> machineId = await resolveMachineId(stateService, logService); </ins> } catch (error) { if (error.code !== 'ENOENT') { logService.error(error);


*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <ins> import { ILogService } from 'vs/platform/log/common/log'; </ins> import { IStateService } from 'vs/platform/state/node/state'; import { machineIdKey } from 'vs/platform/telemetry/common/telemetry'; import { resolveMachineId as resolveNodeMachineId } from 'vs/platform/telemetry/node/telemetryUtils'; <del> export async function resolveMachineId(stateService: IStateService) { </del> <ins> export async function resolveMachineId(stateService: IStateService, logService: ILogService) { </ins> // Call the node layers implementation to avoid code duplication <del> const machineId = await resolveNodeMachineId(stateService); </del> <ins> const machineId = await resolveNodeMachineId(stateService, logService); </ins> stateService.setItem(machineIdKey, machineId); return machineId; }


import { isMacintosh } from 'vs/base/common/platform'; import { getMachineId } from 'vs/base/node/id'; <ins> import { ILogService } from 'vs/platform/log/common/log'; </ins> import { IStateReadService } from 'vs/platform/state/node/state'; import { machineIdKey } from 'vs/platform/telemetry/common/telemetry'; <del> export async function resolveMachineId(stateService: IStateReadService) { </del> <ins> export async function resolveMachineId(stateService: IStateReadService, logService: ILogService) { </ins> // We cache the machineId for faster lookups // and resolve it only once initially if not cached or we need to replace the macOS iBridge device let machineId = stateService.getItem<string>(machineIdKey); if (typeof machineId !== 'string' || (isMacintosh && machineId === '6c9d2bc8f91b89624add29c0abeae7fb42bf539fa1cdb2e3e57cd668fa9bcead')) { <del> machineId = await getMachineId(); </del> <ins> machineId = await getMachineId(logService.error.bind(logService)); </ins> } return machineId;


} const { installSourcePath } = this.environmentMainService; <del> const machineId = await resolveMachineId(this.stateService); </del> <ins> const machineId = await resolveMachineId(this.stateService, this.logService); </ins> const config: ITelemetryServiceConfig = { appenders,


const [, , machineId] = await Promise.all([ configurationService.initialize(), userDataProfilesService.init(), <del> getMachineId() </del> <ins> getMachineId(logService.error.bind(logService)) </ins> ]); const extensionHostStatusService = new ExtensionHostStatusService();


"default": false, "description": "%config.followTagsWhenSync%" }, <ins> "git.replaceTagsWhenPull": { "type": "boolean", "scope": "resource", "default": false, "description": "%config.replaceTagsWhenPull%" }, </ins> "git.promptToSaveFilesBeforeStash": { "type": "string", "enum": [


"config.decorations.enabled": "Controls whether Git contributes colors and badges to the Explorer and the Open Editors view.", "config.enableStatusBarSync": "Controls whether the Git Sync command appears in the status bar.", "config.followTagsWhenSync": "Push all annotated tags when running the sync command.", <ins> "config.replaceTagsWhenPull": "Automatically replace the local tags with the remote tags in case of a conflict when running the pull command.", </ins> "config.promptToSaveFilesBeforeStash": "Controls whether Git should check for unsaved files before stashing changes.", "config.promptToSaveFilesBeforeStash.always": "Check for any unsaved files.", "config.promptToSaveFilesBeforeStash.staged": "Check only for unsaved staged files.",


throw new Error(`Unable to extract tag names from error message: ${raw}`); } <del> // Notification const replaceLocalTags = l10n.t('Replace Local Tag(s)'); const message = l10n.t('Unable to pull from remote repository due to conflicting tag(s): {0}. Would you like to resolve the conflict by replacing the local tag(s)?', tags.join(', ')); const choice = await window.showErrorMessage(message, { modal: true }, replaceLocalTags); </del> <ins> const config = workspace.getConfiguration('git', Uri.file(this.repository.root)); const replaceTagsWhenPull = config.get<boolean>('replaceTagsWhenPull', false) === true; if (!replaceTagsWhenPull) { // Notification const replaceLocalTags = l10n.t('Replace Local Tag(s)'); const replaceLocalTagsAlways = l10n.t('Always Replace Local Tag(s)'); const message = l10n.t('Unable to pull from remote repository due to conflicting tag(s): {0}. Would you like to resolve the conflict by replacing the local tag(s)?', tags.join(', ')); const choice = await window.showErrorMessage(message, { modal: true }, replaceLocalTags, replaceLocalTagsAlways); if (choice !== replaceLocalTags && choice !== replaceLocalTagsAlways) { return false; } </ins> <del> if (choice !== replaceLocalTags) { return false; </del> <ins> if (choice === replaceLocalTagsAlways) { await config.update('replaceTagsWhenPull', true, true); } </ins> } // Force fetch tags


import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewPaneContainer, IExtensionContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP } from 'vs/workbench/contrib/extensions/common/extensions'; import { ExtensionsConfigurationInitialContent } from 'vs/workbench/contrib/extensions/common/extensionsFileTemplate'; import { IGalleryExtension, IExtensionGalleryService, ILocalExtension, InstallOptions, InstallOperation, TargetPlatformToString, ExtensionManagementErrorCode } from 'vs/platform/extensionManagement/common/extensionManagement'; <del> import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; </del> <ins> import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; </ins> import { ExtensionRecommendationReason, IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; import { areSameExtensions, getExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionType, ExtensionIdentifier, IExtensionDescription, IExtensionManifest, isLanguagePackExtension, getWorkspaceSupportTypeMessage, TargetPlatform } from 'vs/platform/extensions/common/extensions';


import { IActionViewItemOptions, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { EXTENSIONS_CONFIG, IExtensionsConfigContent } from 'vs/workbench/services/extensionRecommendations/common/workspaceExtensionsConfig'; import { getErrorMessage, isCancellationError } from 'vs/base/common/errors'; <del> import { IUserDataSyncEnablementService, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; </del> <ins> import { IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; </ins> import { ActionWithDropdownActionViewItem, IActionWithDropdownActionViewItemOptions } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem'; import { IContextMenuProvider } from 'vs/base/browser/contextmenu'; import { ILogService } from 'vs/platform/log/common/log';


buttons: [{ label: localize('install anyway', "Install Anyway"), run: () => { <del> const installAction = this.installOptions?.isMachineScoped ? this.instantiationService.createInstance(InstallAction, { donotVerifySignature: true }) : this.instantiationService.createInstance(InstallAndSyncAction, { donotVerifySignature: true }); </del> <ins> const installAction = this.instantiationService.createInstance(InstallAction, { donotVerifySignature: true }); </ins> installAction.extension = this.extension; return installAction.run(); }


promptChoices.push({ label: localize('install release version', "Install Release Version"), run: () => { <del> const installAction = this.installOptions?.isMachineScoped ? this.instantiationService.createInstance(InstallAction, { installPreReleaseVersion: !!this.installOptions.installPreReleaseVersion }) : this.instantiationService.createInstance(InstallAndSyncAction, { installPreReleaseVersion: !!this.installOptions?.installPreReleaseVersion }); </del> <ins> const installAction = this.instantiationService.createInstance(InstallAction, { installPreReleaseVersion: !!this.installOptions?.installPreReleaseVersion }); </ins> installAction.extension = this.extension; return installAction.run(); }


} } <del> export abstract class AbstractInstallAction extends ExtensionAction { </del> <ins> export class InstallAction extends ExtensionAction { </ins> static readonly Class = `${ExtensionAction.LABEL_ACTION_CLASS} prominent install`;


} private readonly updateThrottler = new Throttler(); <ins> public readonly options: InstallOptions; </ins> constructor( <del> id: string, readonly options: InstallOptions, cssClass: string, </del> <ins> options: InstallOptions, </ins> @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IExtensionService private readonly runtimeExtensionService: IExtensionService,


@IPreferencesService private readonly preferencesService: IPreferencesService, @ITelemetryService private readonly telemetryService: ITelemetryService, ) { <del> super(id, localize('install', "Install"), cssClass, false); </del> <ins> super('extensions.install', localize('install', "Install"), InstallAction.Class, false); this.options = { ...options, isMachineScoped: false }; </ins> this.update(); this._register(this.labelService.onDidChangeFormatters(() => this.updateLabel(), this)); }


} private async install(extension: IExtension): Promise<IExtension | undefined> { <del> const installOptions = this.getInstallOptions(); </del> try { <del> return await this.extensionsWorkbenchService.install(extension, installOptions); </del> <ins> return await this.extensionsWorkbenchService.install(extension, this.options); </ins> } catch (error) { <del> await this.instantiationService.createInstance(PromptExtensionInstallFailureAction, extension, extension.latestVersion, InstallOperation.Install, installOptions, error).run(); </del> <ins> await this.instantiationService.createInstance(PromptExtensionInstallFailureAction, extension, extension.latestVersion, InstallOperation.Install, this.options, error).run(); </ins> return undefined; } }


return localize('install', "Install"); } <del> protected getInstallOptions(): InstallOptions { return this.options; } } export class InstallAction extends AbstractInstallAction { constructor( options: InstallOptions, @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, @IInstantiationService instantiationService: IInstantiationService, @IExtensionService runtimeExtensionService: IExtensionService, @IWorkbenchThemeService workbenchThemeService: IWorkbenchThemeService, @ILabelService labelService: ILabelService, @IDialogService dialogService: IDialogService, @IPreferencesService preferencesService: IPreferencesService, @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IWorkbenchExtensionManagementService private readonly workbenchExtensionManagementService: IWorkbenchExtensionManagementService, @IUserDataSyncEnablementService protected readonly userDataSyncEnablementService: IUserDataSyncEnablementService, @ITelemetryService telemetryService: ITelemetryService, ) { super(`extensions.install`, options, InstallAction.Class, extensionsWorkbenchService, instantiationService, runtimeExtensionService, workbenchThemeService, labelService, dialogService, preferencesService, telemetryService); this.updateLabel(); this._register(labelService.onDidChangeFormatters(() => this.updateLabel(), this)); this._register(Event.any(userDataSyncEnablementService.onDidChangeEnablement, Event.filter(userDataSyncEnablementService.onDidChangeResourceEnablement, e => e[0] === SyncResource.Extensions))(() => this.update())); } override getLabel(primary?: boolean): string { const baseLabel = super.getLabel(primary); const donotSyncLabel = localize('do no sync', "Do not sync"); const isMachineScoped = this.getInstallOptions().isMachineScoped; // When remote connection exists if (this._manifest && this.extensionManagementServerService.remoteExtensionManagementServer) { const server = this.workbenchExtensionManagementService.getExtensionManagementServerToInstall(this._manifest); if (server === this.extensionManagementServerService.remoteExtensionManagementServer) { const host = this.extensionManagementServerService.remoteExtensionManagementServer.label; return isMachineScoped ? localize({ key: 'install extension in remote and do not sync', comment: [ 'First placeholder is install action label.', 'Second placeholder is the name of the action to install an extension in remote server and do not sync it. Placeholder is for the name of remote server.', 'Third placeholder is do not sync label.', ] }, "{0} in {1} ({2})", baseLabel, host, donotSyncLabel) : localize({ key: 'install extension in remote', comment: [ 'First placeholder is install action label.', 'Second placeholder is the name of the action to install an extension in remote server and do not sync it. Placeholder is for the name of remote server.', ] }, "{0} in {1}", baseLabel, host); } return isMachineScoped ? localize('install extension locally and do not sync', "{0} Locally ({1})", baseLabel, donotSyncLabel) : localize('install extension locally', "{0} Locally", baseLabel); } return isMachineScoped ? `${baseLabel} (${donotSyncLabel})` : baseLabel; } protected override getInstallOptions(): InstallOptions { return { ...super.getInstallOptions(), isMachineScoped: this.userDataSyncEnablementService.isEnabled() && this.userDataSyncEnablementService.isResourceEnabled(SyncResource.Extensions) }; } } export class InstallAndSyncAction extends AbstractInstallAction { constructor( options: InstallOptions, @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, @IInstantiationService instantiationService: IInstantiationService, @IExtensionService runtimeExtensionService: IExtensionService, @IWorkbenchThemeService workbenchThemeService: IWorkbenchThemeService, @ILabelService labelService: ILabelService, @IDialogService dialogService: IDialogService, @IPreferencesService preferencesService: IPreferencesService, @IProductService productService: IProductService, @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, @ITelemetryService telemetryService: ITelemetryService, ) { super('extensions.installAndSync', options, AbstractInstallAction.Class, extensionsWorkbenchService, instantiationService, runtimeExtensionService, workbenchThemeService, labelService, dialogService, preferencesService, telemetryService); this.tooltip = localize({ key: 'install everywhere tooltip', comment: ['Placeholder is the name of the product. Eg: Visual Studio Code or Visual Studio Code - Insiders'] }, "Install this extension in all your synced {0} instances", productService.nameLong); this._register(Event.any(userDataSyncEnablementService.onDidChangeEnablement, Event.filter(userDataSyncEnablementService.onDidChangeResourceEnablement, e => e[0] === SyncResource.Extensions))(() => this.update())); } protected override async computeAndUpdateEnablement(): Promise<void> { await super.computeAndUpdateEnablement(); if (this.enabled) { this.enabled = this.userDataSyncEnablementService.isEnabled() && this.userDataSyncEnablementService.isResourceEnabled(SyncResource.Extensions); } } protected override getInstallOptions(): InstallOptions { return { ...super.getInstallOptions(), isMachineScoped: false }; } </del> } export class InstallDropdownAction extends ActionWithDropDownAction { set manifest(manifest: IExtensionManifest | null) { <del> this.extensionActions.forEach(a => (<AbstractInstallAction>a).manifest = manifest); </del> <ins> this.extensionActions.forEach(a => (<InstallAction>a).manifest = manifest); </ins> this.update(); }


) { super(`extensions.installActions`, '', [ [ <del> instantiationService.createInstance(InstallAndSyncAction, { installPreReleaseVersion: extensionsWorkbenchService.preferPreReleases }), instantiationService.createInstance(InstallAndSyncAction, { installPreReleaseVersion: !extensionsWorkbenchService.preferPreReleases }), ], [ </del> instantiationService.createInstance(InstallAction, { installPreReleaseVersion: extensionsWorkbenchService.preferPreReleases }), instantiationService.createInstance(InstallAction, { installPreReleaseVersion: !extensionsWorkbenchService.preferPreReleases }), ] ]); } <del> protected override getLabel(action: AbstractInstallAction): string { </del> <ins> protected override getLabel(action: InstallAction): string { </ins> return action.getLabel(true); }


const range = match.range(); const matchText = match.text().substr(0, range.endColumn + 150); if (replace) { <del> return nls.localize('replacePreviewResultAria', "'{0}' at column {1} replace {2} with {3}", matchText, range.startColumn + 1, matchString, match.replaceString); </del> <ins> return nls.localize('replacePreviewResultAria', "'{0}' at column {1} replace {2} with {3}", matchText, range.startColumn, matchString, match.replaceString); </ins> } <del> return nls.localize('searchResultAria', "'{0}' at column {1} found {2}", matchText, range.startColumn + 1, matchString); </del> <ins> return nls.localize('searchResultAria', "'{0}' at column {1} found {2}", matchText, range.startColumn, matchString); </ins> } return null; }


if (editorWidget) { // Ensure that the editor widget is binded. If if is, then this should return immediately. // Otherwise, it will bind the widget. <del> await elemParent.bindNotebookEditorWidget(editorWidget); </del> <ins> elemParent.bindNotebookEditorWidget(editorWidget); </ins> await elemParent.updateMatchesForEditorWidget(); const matchIndex = oldParentMatches.findIndex(e => e.id() === element.id());


if (!this.tree.getFocus().includes(match) || !this.tree.getSelection().includes(match)) { this.tree.setSelection([match], getSelectionKeyboardEvent()); <ins> this.tree.setFocus([match]); </ins> } }


return; } <del> this._webview.focusOutput(cell.id, this._webviewFocused); </del> <ins> if (!options?.skipReveal) { this._webview.focusOutput(cell.id, this._webviewFocused); } </ins> cell.updateEditState(CellEditState.Preview, 'focusNotebookCell'); cell.focusMode = CellFocusMode.Output;


if (e.ctrlKey || e.shiftKey) { return; } <del> if (e.code === 'ArrowDown' || e.code === 'End' || e.code === 'ArrowUp' || e.code === 'Home') { </del> <ins> if (e.code === 'ArrowDown' || e.code === 'ArrowUp' || e.code === 'End' || e.code === 'Home' || e.code === 'PageUp' || e.code === 'PageDown') { </ins> // These should change the scroll position, not adjust the selected cell in the notebook e.stopPropagation(); }


*--------------------------------------------------------------------------------------------*/ import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; <del> import { IEditorMouseEvent, IMouseTarget, IPartialEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; </del> <ins> import { IEditorMouseEvent, IMouseTarget, IMouseTargetViewZoneData, IPartialEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; </ins> import { ICoordinatesConverter } from 'vs/editor/common/viewModel'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; <ins> import { Position } from 'vs/editor/common/core/position'; </ins> export interface EventCallback<T> { (event: T): void;


if (result.range) { result.range = coordinatesConverter.convertViewRangeToModelRange(result.range); } <ins> if (result.type === MouseTargetType.GUTTER_VIEW_ZONE || result.type === MouseTargetType.CONTENT_VIEW_ZONE) { result.detail = this.convertViewToModelViewZoneData(result.detail, coordinatesConverter); } </ins> return result; } <ins> private static convertViewToModelViewZoneData(data: IMouseTargetViewZoneData, coordinatesConverter: ICoordinatesConverter): IMouseTargetViewZoneData { return { viewZoneId: data.viewZoneId, positionBefore: data.positionBefore ? coordinatesConverter.convertViewPositionToModelPosition(data.positionBefore) : data.positionBefore, positionAfter: data.positionAfter ? coordinatesConverter.convertViewPositionToModelPosition(data.positionAfter) : data.positionAfter, position: coordinatesConverter.convertViewPositionToModelPosition(data.position), afterLineNumber: coordinatesConverter.convertViewPositionToModelPosition(new Position(data.afterLineNumber, 1)).lineNumber, }; } </ins> }


})); // Revert change when an arrow is clicked. <del> this._register(editor.onMouseUp(event => { </del> <ins> this._register(editor.onMouseDown(event => { </ins> if (!event.event.rightButton && event.target.position && event.target.element?.className.includes('arrow-revert-change')) { const lineNumber = event.target.position.lineNumber; const viewZone = event.target as editorBrowser.IMouseTargetViewZone | undefined;


} })); <del> this._register(editor.onMouseUp((e: IEditorMouseEvent) => { </del> <ins> this._register(editor.onMouseDown((e: IEditorMouseEvent) => { </ins> if (!e.event.rightButton) { return; }


// group controllers by extension for (const group of groupBy(others, (a, b) => a.extension.value === b.extension.value ? 0 : 1)) { const extension = this._extensionService.extensions.find(extension => extension.identifier.value === group[0].extension.value); <del> const source = extension?.description ?? group[0].extension.value; </del> <ins> const source = extension?.displayName ?? extension?.description ?? group[0].extension.value; </ins> if (group.length > 1) { quickPickItems.push({ label: source,


"inputOption.activeBackground": "#2489db82", "inputOption.activeBorder": "#2488db", "keybindingLabel.foreground": "#cccccc", <del> "list.activeSelectionBackground": "#ffffff0f", </del> <ins> "list.activeSelectionBackground": "#323232", </ins> "list.activeSelectionIconForeground": "#ffffff", "list.activeSelectionForeground": "#ffffff", "menu.background": "#1f1f1f",


return cloneAndChange(data, value => { // If it's a trusted value it means it's okay to skip cleaning so we don't clean it <del> if (value instanceof TelemetryTrustedValue || value.hasOwnProperty('isTrustedTelemetryValue')) { </del> <ins> if (value instanceof TelemetryTrustedValue || Object.hasOwnProperty.call(value, 'isTrustedTelemetryValue')) { </ins> return value.value; }


} let index: number; <del> if (this.editor.hasModel() && (typeof lineNumber === 'number')) { </del> <ins> if (this.editor.hasModel() && (typeof lineNumber === 'number' || !this.widget.provider)) { </ins> index = this.model.findNextClosestChange(typeof lineNumber === 'number' ? lineNumber : this.editor.getPosition().lineNumber, true, this.widget.provider); } else { const providerChanges: number[] = this.model.mapChanges.get(this.widget.provider) ?? this.model.mapChanges.values().next().value;


const possibleChangesLength = possibleChanges.length; if (inclusive) { <del> if ((getModifiedEndLineNumber(change.change) >= lineNumber) && (change.change.modifiedStartLineNumber <= lineNumber)) { </del> <ins> if (getModifiedEndLineNumber(change.change) >= lineNumber) { </ins> if (preferredProvider && change.label !== preferredProvider) { possibleChanges.push(i); } else {


const lineResult = parseSearchResults(document, token)[position.line]; if (!lineResult) { return []; } if (lineResult.type === 'file') { <del> return lineResult.allLocations; </del> <ins> return lineResult.allLocations.map(l => ({ ...l, originSelectionRange: lineResult.location.originSelectionRange })); </ins> } const location = lineResult.locations.find(l => l.originSelectionRange.contains(position));


{ label: 'fileBasename', detail: vscode.l10n.t("The current opened file's basename") }, { label: 'fileBasenameNoExtension', detail: vscode.l10n.t("The current opened file's basename with no file extension") }, { label: 'defaultBuildTask', detail: vscode.l10n.t("The name of the default build task. If there is not a single default build task then a quick pick is shown to choose the build task.") }, <del> { label: 'pathSeparator', detail: vscode.l10n.t("The character used by the operating system to separate components in file paths") }, </del> <ins> { label: 'pathSeparator', detail: vscode.l10n.t("The character used by the operating system to separate components in file paths. Is also aliased to '/'.") }, </ins> { label: 'extensionInstallFolder', detail: vscode.l10n.t("The path where an an extension is installed."), param: 'publisher.extension' }, ].map(variable => ({ label: `${${variable.label}}`,


FileDirnameBasename = 'fileDirnameBasename', ExecPath = 'execPath', ExecInstallFolder = 'execInstallFolder', <del> PathSeparator = 'pathSeparator' </del> <ins> PathSeparator = 'pathSeparator', PathSeparatorAlias = '/' </ins> } export class VariableError extends Error {


return match; } case 'pathSeparator': <ins> case '/': </ins> return paths.sep; default:


import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { Extensions, IViewContainersRegistry, IViewsRegistry, ViewContainer, ViewContainerLocation } from 'vs/workbench/common/views'; <del> import { Attributes, AutoTunnelSource, IRemoteExplorerService, makeAddress, mapHasAddressLocalhostOrAllInterfaces, OnPortForward, PORT_AUTO_FORWARD_SETTING, PORT_AUTO_SOURCE_SETTING, PORT_AUTO_SOURCE_SETTING_HYBRID, PORT_AUTO_SOURCE_SETTING_OUTPUT, PORT_AUTO_SOURCE_SETTING_PROCESS, TUNNEL_VIEW_CONTAINER_ID, TUNNEL_VIEW_ID, TunnelSource } from 'vs/workbench/services/remote/common/remoteExplorerService'; </del> <ins> import { Attributes, AutoTunnelSource, IRemoteExplorerService, makeAddress, mapHasAddressLocalhostOrAllInterfaces, OnPortForward, PORT_AUTO_FORWARD_SETTING, PORT_AUTO_SOURCE_SETTING, PORT_AUTO_SOURCE_SETTING_HYBRID, PORT_AUTO_SOURCE_SETTING_OUTPUT, PORT_AUTO_SOURCE_SETTING_PROCESS, Tunnel, TUNNEL_VIEW_CONTAINER_ID, TUNNEL_VIEW_ID, TunnelSource } from 'vs/workbench/services/remote/common/remoteExplorerService'; </ins> import { forwardedPortsViewEnabled, ForwardPortAction, OpenPortInBrowserAction, TunnelPanel, TunnelPanelDescriptor, TunnelViewModel, OpenPortInPreviewAction, openPreviewEnabledContext } from 'vs/workbench/contrib/remote/browser/tunnelView'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';


private async handleCandidateUpdate(removed: Map<string, { host: string; port: number }>) { const removedPorts: number[] = []; <del> let autoForwarded: Set<string>; </del> <ins> let autoForwarded: Map<string, string | Tunnel>; </ins> if (this.unforwardOnly) { <del> autoForwarded = new Set(); </del> <ins> autoForwarded = new Map(); </ins> for (const entry of this.remoteExplorerService.tunnelModel.forwarded.entries()) { if (entry[1].source.source === TunnelSource.Auto) { <del> autoForwarded.add(entry[0]); </del> <ins> autoForwarded.set(entry[0], entry[1]); </ins> } } } else { <del> autoForwarded = this.autoForwarded; </del> <ins> autoForwarded = new Map(this.autoForwarded.entries()); </ins> } for (const removedPort of removed) { const key = removedPort[0]; <del> const value = removedPort[1]; if (autoForwarded.has(key)) { </del> <ins> let value = removedPort[1]; const forwardedValue = mapHasAddressLocalhostOrAllInterfaces(autoForwarded, value.host, value.port); if (forwardedValue) { if (typeof forwardedValue === 'string') { this.autoForwarded.delete(key); } else { value = { host: forwardedValue.remoteHost, port: forwardedValue.remotePort }; } </ins> await this.remoteExplorerService.close(value); <del> autoForwarded.delete(key); </del> removedPorts.push(value.port); } else if (this.notifiedOnly.has(key)) { this.notifiedOnly.delete(key);


import { IWorkbenchConstructionOptions, IWorkbench, ITunnel } from 'vs/workbench/browser/web.api'; import { BrowserStorageService } from 'vs/workbench/services/storage/browser/storageService'; import { IStorageService } from 'vs/platform/storage/common/storage'; <del> import { BufferLogger } from 'vs/platform/log/common/bufferLog'; import { FileLoggerService } from 'vs/platform/log/common/fileLog'; </del> import { toLocalISOString } from 'vs/base/common/date'; import { isWorkspaceToOpen, isFolderToOpen } from 'vs/platform/window/common/window'; import { getSingleFolderWorkspaceIdentifier, getWorkspaceIdentifier } from 'vs/workbench/services/workspaces/browser/workspaces';


import { IStoredWorkspace } from 'vs/platform/workspaces/common/workspaces'; import { UserDataProfileInitializer } from 'vs/workbench/services/userDataProfile/browser/userDataProfileInit'; import { UserDataSyncInitializer } from 'vs/workbench/services/userDataSync/browser/userDataSyncInit'; <ins> import { BufferLogger } from 'vs/platform/log/common/bufferLog'; import { FileLoggerService } from 'vs/platform/log/common/fileLog'; </ins> export class BrowserMain extends Disposable {


const environmentService = new BrowserWorkbenchEnvironmentService(workspace.id, logsPath, this.configuration, productService); serviceCollection.set(IBrowserWorkbenchEnvironmentService, environmentService); <del> // Log const logLevel = getLogLevel(environmentService); const bufferLogger = new BufferLogger(logLevel); const otherLoggers: ILogger[] = [new ConsoleLogger(logLevel)]; </del> <ins> // Files const fileLogger = new BufferLogger(); const fileService = this._register(new FileService(fileLogger)); serviceCollection.set(IWorkbenchFileService, fileService); // Logger const loggerService = new FileLoggerService(getLogLevel(environmentService), logsPath, fileService); serviceCollection.set(ILoggerService, loggerService); // Log Service const otherLoggers: ILogger[] = [new ConsoleLogger(loggerService.getLogLevel())]; </ins> if (environmentService.isExtensionDevelopment && !!environmentService.extensionTestsLocationURI) { <del> otherLoggers.push(new ConsoleLogInAutomationLogger(logLevel)); </del> <ins> otherLoggers.push(new ConsoleLogInAutomationLogger(loggerService.getLogLevel())); </ins> } <del> const logService = new LogService(bufferLogger, otherLoggers); </del> <ins> const logger = loggerService.createLogger(environmentService.logFile, { id: windowLogId, name: localize('rendererLog', "Window") }); const logService = new LogService(logger, otherLoggers); </ins> serviceCollection.set(ILogService, logService); <ins> // Set the logger of the fileLogger after the log service is ready. // This is to avoid cyclic dependency fileLogger.logger = logService; // Register File System Providers depending on IndexedDB support // Register them early because they are needed for the profiles initialization await this.registerIndexedDBFileSystemProviders(environmentService, fileService, logService, loggerService, logsPath); </ins> // Remote const connectionToken = environmentService.options.connectionToken || getCookieValue(connectionTokenCookieName); const remoteAuthorityResolverService = new RemoteAuthorityResolverService(!environmentService.expectsResolverExtension, connectionToken, this.configuration.resourceUriProvider, productService, logService);


// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! <del> // Files const fileService = this._register(new FileService(logService)); serviceCollection.set(IWorkbenchFileService, fileService); // Logger const loggerService = new FileLoggerService(logLevel, logsPath, fileService); serviceCollection.set(ILoggerService, loggerService); // Register File System Providers depending on IndexedDB support // Register them early because they are needed for the profiles initialization await this.registerIndexedDBFileSystemProviders(environmentService, fileService, bufferLogger, logService, loggerService, logsPath); </del> // URI Identity const uriIdentityService = new UriIdentityService(fileService); serviceCollection.set(IUriIdentityService, uriIdentityService);


} } <del> private async registerIndexedDBFileSystemProviders(environmentService: IWorkbenchEnvironmentService, fileService: IWorkbenchFileService, bufferLogger: BufferLogger, logService: ILogService, loggerService: ILoggerService, logsPath: URI): Promise<void> { </del> <ins> private async registerIndexedDBFileSystemProviders(environmentService: IWorkbenchEnvironmentService, fileService: IWorkbenchFileService, logService: ILogService, loggerService: ILoggerService, logsPath: URI): Promise<void> { </ins> // IndexedDB is used for logging and user data let indexedDB: IndexedDB | undefined; const userDataStore = 'vscode-userdata-store';


fileService.registerProvider(logsPath.scheme, new InMemoryFileSystemProvider()); } <del> bufferLogger.logger = loggerService.createLogger(environmentService.logFile, { id: windowLogId, name: localize('rendererLog', "Window") }); </del> // User data let userDataProvider; if (indexedDB) {


const inputWidget = this.instantiationService.createInstance(SCMInputWidget, inputElement, this.overflowWidgetsDomNode); templateDisposable.add(inputWidget); <del> return { inputWidget, elementDisposables: templateDisposable.add(new DisposableStore()), templateDisposable }; </del> <ins> return { inputWidget, elementDisposables: new DisposableStore(), templateDisposable }; </ins> } renderElement(node: ITreeNode<ISCMInput, FuzzyScore>, index: number, templateData: InputTemplate): void {


// Remember widget this.inputWidgets.set(input, templateData.inputWidget); <del> templateData.elementDisposables.add({ dispose: () => this.inputWidgets.delete(input) }); </del> <ins> templateData.elementDisposables.add({ dispose: () => { this.inputWidgets.delete(input); this.contentHeights.delete(input); } }); </ins> // Widget cursor selections const selections = this.editorSelections.get(input);


/** * Adds a status to the list. <ins> * @param status The status object. Ideally a single status object that does not change will be * shared as this call will no-op if the status is already set (checked by by object reference). </ins> * @param duration An optional duration in milliseconds of the status, when specified the status * will remove itself when the duration elapses unless the status gets re-added. */


const timeout = window.setTimeout(() => this.remove(status), duration); this._statusTimeouts.set(status.id, timeout); } <ins> const existingStatus = this._statuses.get(status.id); if (existingStatus && existingStatus !== status) { this._onDidRemoveStatus.fire(existingStatus); this._statuses.delete(existingStatus.id); } </ins> if (!this._statuses.has(status.id)) { const oldPrimary = this.primary; this._statuses.set(status.id, status);


if (oldPrimary !== newPrimary) { this._onDidChangePrimaryStatus.fire(newPrimary); } <del> } else { this._statuses.set(status.id, status); // It maybe the case that status hasn't changed, there isn't a good way to check this based on // `ITerminalStatus`, so just fire the event anyway. this._onDidAddStatus.fire(status); </del> } }


strictEqual(list.statuses[1].icon!.id, Codicon.zap.id, 'zap~spin should have animation removed only'); }); <ins> test('add should fire onDidRemoveStatus if same status id with a different object reference was added', () => { const eventCalls: string[] = []; list.onDidAddStatus(() => eventCalls.push('add')); list.onDidRemoveStatus(() => eventCalls.push('remove')); list.add({ id: 'test', severity: Severity.Info }); list.add({ id: 'test', severity: Severity.Info }); deepStrictEqual(eventCalls, [ 'add', 'remove', 'add' ]); }); </ins> test('remove', () => { list.add({ id: 'info', severity: Severity.Info }); list.add({ id: 'warning', severity: Severity.Warning });


if (response === 2) { shell.openExternal('https://aka.ms/vscode-windows-unc'); <ins> return this.onUNCHostNotAllowed(path, options); // keep showing the dialog until decision (https://github.com/microsoft/vscode/issues/181956) </ins> } return undefined;


import { Categories } from 'vs/platform/action/common/actionCommonCategories'; import { IWorkingCopyBackupService } from 'vs/workbench/services/workingCopy/common/workingCopyBackup'; import { ResolutionResult, ResultKind } from 'vs/platform/keybinding/common/keybindingResolver'; <ins> import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IOutputService } from 'vs/workbench/services/output/common/output'; import { windowLogId } from 'vs/workbench/services/log/common/logConstants'; </ins> class InspectContextKeysAction extends Action2 {


} run(accessor: ServicesAccessor): void { <del> accessor.get(IStorageService).log(); </del> <ins> const storageService = accessor.get(IStorageService); const dialogService = accessor.get(IDialogService); storageService.log(); dialogService.info(localize('storageLogDialogMessage', "The storage database contents have been logged to the developer tools."), localize('storageLogDialogDetails', "Open developer tools from the menu and select the Console tab.")); </ins> } }


const workingCopyService = accessor.get(IWorkingCopyService); const workingCopyBackupService = accessor.get(IWorkingCopyBackupService); const logService = accessor.get(ILogService); <ins> const outputService = accessor.get(IOutputService); </ins> const backups = await workingCopyBackupService.getBackups();


]; logService.info(msg.join('n')); <ins> outputService.showChannel(windowLogId, true); </ins> } }


EditorOption.ariaLabel, 'ariaLabel', nls.localize('editorViewAccessibleLabel', "Editor content") )), screenReaderAnnounceInlineSuggestion: register(new EditorBooleanOption( <del> EditorOption.screenReaderAnnounceInlineSuggestion, 'screenReaderAnnounceInlineSuggestion', false, </del> <ins> EditorOption.screenReaderAnnounceInlineSuggestion, 'screenReaderAnnounceInlineSuggestion', true, </ins> { description: nls.localize('screenReaderAnnounceInlineSuggestion', "Control whether inline suggestions are announced by a screen reader."), tags: ['accessibility']


'xterm-addon-canvas': `${baseNodeModulesPath}/xterm-addon-canvas/lib/xterm-addon-canvas.js`, 'xterm-addon-image': `${baseNodeModulesPath}/xterm-addon-image/lib/xterm-addon-image.js`, 'xterm-addon-search': `${baseNodeModulesPath}/xterm-addon-search/lib/xterm-addon-search.js`, <ins> 'xterm-addon-serialize': `${baseNodeModulesPath}/xterm-addon-serialize/lib/xterm-addon-serialize.js`, </ins> 'xterm-addon-unicode11': `${baseNodeModulesPath}/xterm-addon-unicode11/lib/xterm-addon-unicode11.js`, 'xterm-addon-webgl': `${baseNodeModulesPath}/xterm-addon-webgl/lib/xterm-addon-webgl.js`, '@vscode/iconv-lite-umd': `${baseNodeModulesPath}/@vscode/iconv-lite-umd/lib/iconv-lite-umd.js`,


entryId, name: item.entry.name, text: item.entry.text, <del> command: typeof item.entry.command === 'string' ? item.entry.command : undefined, </del> <ins> command: typeof item.entry.command === 'string' ? item.entry.command : typeof item.entry.command === 'object' ? item.entry.command.id : undefined, </ins> priority: item.priority, alignLeft: item.alignment === StatusbarAlignment.LEFT };


ExtensionIdentifier.toKey(entry.description.identifier), candidate.name ?? entry.description.displayName ?? entry.description.name, candidate.text, <del> undefined, undefined, undefined, undefined, </del> <ins> undefined, candidate.command ? { id: candidate.command, title: candidate.name } : undefined, undefined, undefined, </ins> candidate.alignment === 'left', candidate.priority, undefined


throw e; } <del> let label; if (claims.name && claims.email) { label = `${claims.name} - ${claims.email}`; } else { label = claims.email ?? claims.unique_name ?? claims.preferred_username ?? 'user@example.com'; } </del> const id = `${claims.tid}/${(claims.oid ?? (claims.altsecid ?? '' + claims.ipd ?? ''))}`; const sessionId = existingId || `${id}/${randomUUID()}`; this._logger.trace(`[${scopeData.scopeStr}] '${sessionId}' Token response parsed successfully.`);


scope: scopeData.scopeStr, sessionId, account: { <del> label, </del> <ins> label: claims.email ?? claims.preferred_username ?? claims.unique_name ?? 'user@example.com', </ins> id, type: claims.tid === MSA_TID || claims.tid === MSA_PASSTHRU_TID ? MicrosoftAccountType.MSA : MicrosoftAccountType.AAD }


if (account.canSignOut) { const signOutAction = disposables.add(new Action('signOut', localize('signOut', "Sign Out"), undefined, true, async () => { const allSessions = await this.authenticationService.getSessions(providerId); <del> const sessionsForAccount = allSessions.filter(s => s.account.id === account.id); </del> <ins> const sessionsForAccount = allSessions.filter(s => s.account.label === account.label); </ins> return await this.authenticationService.removeAccountSessions(providerId, account.label, sessionsForAccount); })); providerSubMenuActions.push(signOutAction);


private async addOrUpdateAccount(providerId: string, account: AuthenticationSessionAccount): Promise<void> { let accounts = this.groupedAccounts.get(providerId); <del> if (accounts) { const existingAccount = accounts.find(a => a.id === account.id); if (existingAccount) { // Update the label if it has changed if (existingAccount.label !== account.label) { existingAccount.label = account.label; } return; } } else { </del> <ins> if (!accounts) { </ins> accounts = []; this.groupedAccounts.set(providerId, accounts); } const sessionFromEmbedder = await this.sessionFromEmbedder.value; <del> // If the session stored from the embedder allows sign out, then we can treat it and all others as sign out-able let canSignOut = !!sessionFromEmbedder?.canSignOut; if (!canSignOut) { if (sessionFromEmbedder?.id) { const sessions = (await this.authenticationService.getSessions(providerId)).filter(s => s.account.id === account.id); canSignOut = !sessions.some(s => s.id === sessionFromEmbedder.id); } else { // The default if we don't have a session from the embedder is to allow sign out canSignOut = true; } </del> <ins> let canSignOut = true; if ( sessionFromEmbedder												// if we have a session from the embedder && !sessionFromEmbedder.canSignOut								// and that session says we can't sign out && (await this.authenticationService.getSessions(providerId))	// and that session is associated with the account we are adding/updating .some(s => s.id === sessionFromEmbedder.id && s.account.id === account.id ) ) { canSignOut = false; </ins> } <del> accounts.push({ ...account, canSignOut }); </del> <ins> const existingAccount = accounts.find(a => a.label === account.label); if (existingAccount) { // if we have an existing account and we discover that we // can't sign out of it, update the account to mark it as "can't sign out" if (!canSignOut) { existingAccount.canSignOut = canSignOut; } } else { accounts.push({ ...account, canSignOut }); } </ins> } private removeAccount(providerId: string, account: AuthenticationSessionAccount): void {


"ts-loader": "^9.4.2", "ts-node": "^10.9.1", "tsec": "0.1.4", <del> "typescript": "^5.2.0-dev.20230524", </del> <ins> "typescript": "^5.2.0-dev.20230602", </ins> "typescript-formatter": "7.1.0", "underscore": "^1.12.1", "util": "^0.12.4",


resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== <del> typescript@^5.2.0-dev.20230524: version "5.2.0-dev.20230524" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.0-dev.20230524.tgz#c2714b82f5ef8c63328a253692ae0b8c244c86d6" integrity sha512-1XzSUJCt31jm7jIZ3vBKzK46ZxnmqX2VdVg/dur9AIaz9WmidrABs7F8H8d4onpIV8RYD/L6xW6MXR5EHjl+LA== </del> <ins> typescript@^5.2.0-dev.20230602: version "5.2.0-dev.20230602" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.0-dev.20230602.tgz#01e2055aa8d8bde4431947c0c048c07c23cc6027" integrity sha512-LenKdxmkwzZRmEKzShAq83TvEuvCGR8pCYBe0VpUTuJ7NMSK4r2yV2GTmJrSqtk8IoJAmc+PfymMQIfwX1JGQQ== </ins> typical@^4.0.0: version "4.0.0"


})); } <ins> stopWebviewFind() { this._notebookEditor.findStop(); } </ins> override dispose() { this.clearDecorations(); super.dispose();


this._notebookUpdateScheduler.schedule(); }) ?? null; <ins> this._findMatchDecorationModel?.stopWebviewFind(); </ins> this._findMatchDecorationModel?.dispose(); this._findMatchDecorationModel = new FindMatchDecorationModel(this._notebookEditorWidget); }


} if (this._findMatchDecorationModel) { <ins> this._findMatchDecorationModel?.stopWebviewFind(); </ins> this._findMatchDecorationModel?.dispose(); this._findMatchDecorationModel = undefined; }


get title(): string { const firstRequestMessage = this._requests[0]?.message; <del> if (typeof firstRequestMessage === 'string') { return firstRequestMessage; } else if (firstRequestMessage) { return firstRequestMessage.message; } else { return ''; } </del> <ins> const message = typeof firstRequestMessage === 'string' ? firstRequestMessage : firstRequestMessage?.message ?? ''; return message.split('n')[0].substring(0, 50); </ins> } constructor(


const model = this.model.read(reader); const suggestion = model?.selectedInlineCompletion.read(reader); const ghostText = model?.ghostText.read(reader); <del> const selectedSuggestItem = model?.selectedSuggestItem.read(reader); this.inlineCompletionVisible.set(selectedSuggestItem === undefined && ghostText !== undefined && !ghostText.isEmpty()); </del> <ins> this.inlineCompletionVisible.set(ghostText !== undefined && !ghostText.isEmpty()); </ins> if (ghostText && suggestion) { this.suppressSuggestions.set(suggestion.inlineCompletion.source.inlineCompletions.suppressSuggestions);


*--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; <ins> import { Lazy } from 'vs/base/common/lazy'; </ins> import { IDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService';


export class LivePreviewStrategy extends LiveStrategy { <del> private readonly _diffZone: InlineChatLivePreviewWidget; private readonly _previewZone: InlineChatFileCreatePreviewWidget; </del> <ins> private readonly _diffZone: Lazy<InlineChatLivePreviewWidget>; private readonly _previewZone: Lazy<InlineChatFileCreatePreviewWidget>; </ins> constructor( session: Session,


) { super(session, editor, widget, contextKeyService, storageService, bulkEditService, editorWorkerService, instaService); <del> this._diffZone = instaService.createInstance(InlineChatLivePreviewWidget, editor, session); this._previewZone = instaService.createInstance(InlineChatFileCreatePreviewWidget, editor); </del> <ins> this._diffZone = new Lazy(() => instaService.createInstance(InlineChatLivePreviewWidget, editor, session)); this._previewZone = new Lazy(() => instaService.createInstance(InlineChatFileCreatePreviewWidget, editor)); </ins> } override dispose(): void { <del> this._diffZone.hide(); this._diffZone.dispose(); this._previewZone.hide(); this._previewZone.dispose(); </del> <ins> this._diffZone.rawValue?.hide(); this._diffZone.rawValue?.dispose(); this._previewZone.rawValue?.hide(); this._previewZone.rawValue?.dispose(); </ins> super.dispose(); }


this._updateSummaryMessage(); if (this._diffEnabled) { <del> this._diffZone.show(); </del> <ins> this._diffZone.value.show(); </ins> } if (response.singleCreateFileEdit) { <del> this._previewZone.showCreation(this._session.wholeRange.value, response.singleCreateFileEdit.uri, await Promise.all(response.singleCreateFileEdit.edits)); </del> <ins> this._previewZone.value.showCreation(this._session.wholeRange.value, response.singleCreateFileEdit.uri, await Promise.all(response.singleCreateFileEdit.edits)); </ins> } else { <del> this._previewZone.hide(); </del> <ins> this._previewZone.value.hide(); </ins> } } override async undoChanges(response: EditResponse): Promise<void> { <del> this._diffZone.lockToDiff(); </del> <ins> this._diffZone.value.lockToDiff(); </ins> super.undoChanges(response); } protected override _doToggleDiff(): void { const scrollState = StableEditorScrollState.capture(this._editor); if (this._diffEnabled) { <del> this._diffZone.show(); </del> <ins> this._diffZone.value.show(); </ins> } else { <del> this._diffZone.hide(); </del> <ins> this._diffZone.value.hide(); </ins> } scrollState.restore(this._editor); } override hasFocus(): boolean { <del> return super.hasFocus() || this._diffZone.hasFocus() || this._previewZone.hasFocus(); </del> <ins> return super.hasFocus() || this._diffZone.value.hasFocus() || this._previewZone.value.hasFocus(); </ins> } }


async getLocalExtensions(profile: IUserDataProfile): Promise<IProfileExtension[]> { return this.withProfileScopedServices(profile, async (extensionEnablementService) => { <del> const result: Array<IProfileExtension & { displayName?: string }> = []; </del> <ins> const result = new Map<string, IProfileExtension & { displayName?: string }>(); </ins> const installedExtensions = await this.extensionManagementService.getInstalled(undefined, profile.extensionsResource); const disabledExtensions = extensionEnablementService.getDisabledExtensions(); for (const extension of installedExtensions) {


continue; } } <ins> const existing = result.get(identifier.id.toLowerCase()); if (existing?.disabled) { // Remove the duplicate disabled extension result.delete(identifier.id.toLowerCase()); } </ins> const profileExtension: IProfileExtension = { identifier, displayName: extension.manifest.displayName }; if (disabled) { profileExtension.disabled = true;


if (!profileExtension.version && preRelease) { profileExtension.preRelease = true; } <del> result.push(profileExtension); </del> <ins> result.set(profileExtension.identifier.id.toLowerCase(), profileExtension); </ins> } <del> return result; </del> <ins> return [...result.values()]; </ins> }); }


export class ContentHoverWidget extends ResizableContentWidget { public static ID = 'editor.contrib.resizableContentHoverWidget'; <ins> private static _lastDimensions: dom.Dimension = new dom.Dimension(0, 0); </ins> private _visibleData: ContentHoverVisibleData | undefined; private _positionPreference: ContentWidgetPositionPreference | undefined;


} protected override _resize(size: dom.Dimension): void { <ins> ContentHoverWidget._lastDimensions = new dom.Dimension(size.width, size.height); </ins> this._setAdjustedHoverWidgetDimensions(size); this._resizableNode.layout(size.height, size.width); this._setResizableNodeMaxDimensions();


} private _layout(): void { <del> const height = Math.max(this._editor.getLayoutInfo().height / 4, 250); </del> <ins> const height = Math.max(this._editor.getLayoutInfo().height / 4, 250, ContentHoverWidget._lastDimensions.height); const width = Math.max(this._editor.getLayoutInfo().width * 0.66, 500, ContentHoverWidget._lastDimensions.width); </ins> const { fontSize, lineHeight } = this._editor.getOption(EditorOption.fontInfo); const contentsDomNode = this._hover.contentsDomNode; contentsDomNode.style.fontSize = `${fontSize}px`; contentsDomNode.style.lineHeight = `${lineHeight / fontSize}`; <del> this._setContentsDomNodeMaxDimensions(Math.max(this._editor.getLayoutInfo().width * 0.66, 500), height); </del> <ins> this._setContentsDomNodeMaxDimensions(width, height); </ins> } private _updateFont(): void {


} private _updateContentsDomNodeMaxDimensions() { <del> const width = Math.max(this._editor.getLayoutInfo().width * 0.66, 500); const height = Math.max(this._editor.getLayoutInfo().height / 4, 250); </del> <ins> const height = Math.max(this._editor.getLayoutInfo().height / 4, 250, ContentHoverWidget._lastDimensions.height); const width = Math.max(this._editor.getLayoutInfo().width * 0.66, 500, ContentHoverWidget._lastDimensions.width); </ins> this._setContentsDomNodeMaxDimensions(width, height); }


} const originalProfile = this.userDataProfileService.currentProfile; <del> await this.userDataProfileImportExportService.createTemporaryProfile(this.userDataProfileService.currentProfile, localize('troubleshoot issue', "Troubleshoot Issue"), true); </del> <ins> await this.userDataProfileImportExportService.createTroubleshootProfile(); </ins> this.state = new TroubleShootState(TroubleshootStage.EXTENSIONS, originalProfile.id); await this.resume(); }


} } <del> async createTemporaryProfile(profile: IUserDataProfile, name: string, extensionsDisabled: boolean): Promise<void> { const userDataProfilesExportState = this.instantiationService.createInstance(UserDataProfileExportState, profile, extensionsDisabled); </del> <ins> async createTroubleshootProfile(): Promise<void> { const userDataProfilesExportState = this.instantiationService.createInstance(UserDataProfileExportState, this.userDataProfileService.currentProfile, true); </ins> try { <del> const profileTemplate = await userDataProfilesExportState.getProfileTemplate(name, undefined); await this.importAndSwitch(profileTemplate, true, true, extensionsDisabled, localize('import', "Create Profile")); </del> <ins> const profileTemplate = await userDataProfilesExportState.getProfileTemplate(localize('troubleshoot issue', "Troubleshoot Issue"), undefined); await this.progressService.withProgress({ location: ProgressLocation.Notification, delay: 1000, sticky: true, }, progress => this.importAndSwitchWithProgress(profileTemplate, true, true, true, message => progress.report({ message: localize('troubleshoot profile progress', "Setting up Troubleshoot Profile: {0}", message) }))); </ins> } finally { userDataProfilesExportState.dispose(); }


command: showWindowLogActionId, }, async (progress) => { progress.report({ message: localize('Importing profile', "{0} ({1})...", title, profileTemplate.name) }); <del> const profile = await this.getProfileToImport(profileTemplate, temporaryProfile); if (!profile) { return undefined; } </del> <ins> return this.importAndSwitchWithProgress(profileTemplate, temporaryProfile, extensions, extensionsDisabled, message => progress.report({ message: `${title} (${profileTemplate.name}): ${message}` })); }); } </ins> <del> if (profileTemplate.settings) { progress.report({ message: localize('progress settings', "{0} ({1}): Applying Settings...", title, profileTemplate.name) }); await this.instantiationService.createInstance(SettingsResource).apply(profileTemplate.settings, profile); } if (profileTemplate.keybindings) { progress.report({ message: localize('progress keybindings', "{0} ({1}): Applying Keyboard Shortcuts...", title, profileTemplate.name) }); await this.instantiationService.createInstance(KeybindingsResource).apply(profileTemplate.keybindings, profile); } if (profileTemplate.tasks) { progress.report({ message: localize('progress tasks', "{0} ({1}): Applying Tasks...", title, profileTemplate.name) }); await this.instantiationService.createInstance(TasksResource).apply(profileTemplate.tasks, profile); } if (profileTemplate.snippets) { progress.report({ message: localize('progress snippets', "{0} ({1}): Applying Snippets...", title, profileTemplate.name) }); await this.instantiationService.createInstance(SnippetsResource).apply(profileTemplate.snippets, profile); } if (profileTemplate.globalState) { progress.report({ message: localize('progress global state', "{0} ({1}): Applying State...", title, profileTemplate.name) }); await this.instantiationService.createInstance(GlobalStateResource).apply(profileTemplate.globalState, profile); } if (profileTemplate.extensions && extensions) { progress.report({ message: localize('progress extensions', "{0} ({1}): Applying Extensions...", title, profileTemplate.name) }); await this.instantiationService.createInstance(ExtensionsResource, extensionsDisabled).apply(profileTemplate.extensions, profile); } </del> <ins> private async importAndSwitchWithProgress(profileTemplate: IUserDataProfileTemplate, temporaryProfile: boolean, extensions: boolean, extensionsDisabled: boolean, progress: (message: string) => void): Promise<IUserDataProfile | undefined> { const profile = await this.getProfileToImport(profileTemplate, temporaryProfile); if (!profile) { return undefined; } </ins> <del> progress.report({ message: localize('switching profile', "{0} ({1}): Applying...", title, profileTemplate.name) }); await this.userDataProfileManagementService.switchProfile(profile); return profile; }); </del> <ins> if (profileTemplate.settings) { progress(localize('progress settings', "Applying Settings...")); await this.instantiationService.createInstance(SettingsResource).apply(profileTemplate.settings, profile); } if (profileTemplate.keybindings) { progress(localize('progress keybindings', "{0}ying Keyboard Shortcuts...")); await this.instantiationService.createInstance(KeybindingsResource).apply(profileTemplate.keybindings, profile); } if (profileTemplate.tasks) { progress(localize('progress tasks', "Applying Tasks...")); await this.instantiationService.createInstance(TasksResource).apply(profileTemplate.tasks, profile); } if (profileTemplate.snippets) { progress(localize('progress snippets', "Applying Snippets...")); await this.instantiationService.createInstance(SnippetsResource).apply(profileTemplate.snippets, profile); } if (profileTemplate.globalState) { progress(localize('progress global state', "Applying State...")); await this.instantiationService.createInstance(GlobalStateResource).apply(profileTemplate.globalState, profile); } if (profileTemplate.extensions && extensions) { progress(localize('progress extensions', "Applying Extensions...")); await this.instantiationService.createInstance(ExtensionsResource, extensionsDisabled).apply(profileTemplate.extensions, profile); } progress(localize('switching profile', " Applying...")); await this.userDataProfileManagementService.switchProfile(profile); return profile; </ins> } private async resolveProfileContent(resource: URI): Promise<string | null> {


importProfile(uri: URI, options?: IProfileImportOptions): Promise<void>; showProfileContents(): Promise<void>; createFromCurrentProfile(name: string): Promise<void>; <del> createTemporaryProfile(from: IUserDataProfile, name: string, extensionsDisabled: boolean): Promise<void>; </del> <ins> createTroubleshootProfile(): Promise<void>; </ins> setProfile(profile: IUserDataProfileTemplate): Promise<void>; }


return markdownTooltip; } <del> private async installAndRunStartCommand(metadata: RemoteExtensionMetadata) { const extensionId = metadata.id; </del> <ins> private async installExtension(extensionId: string) { </ins> const galleryExtension = (await this.extensionGalleryService.getExtensions([{ id: extensionId }], CancellationToken.None))[0]; await this.extensionManagementService.installFromGallery(galleryExtension, {


donotIncludePackAndDependencies: false, context: { [EXTENSION_INSTALL_SKIP_WALKTHROUGH_CONTEXT]: true } }); <ins> } private async runRemoteStartCommand(extensionId: string, startCommand: string) { // check to ensure the extension is installed </ins> await retry(async () => { <del> const ext = await this.extensionService.getExtension(metadata.id); </del> <ins> const ext = await this.extensionService.getExtension(extensionId); </ins> if (!ext) { throw Error('Failed to find installed remote extension'); } return ext; }, 300, 10); <del> this.commandService.executeCommand(metadata.startCommand); </del> <ins> this.commandService.executeCommand(startCommand); </ins> this.telemetryService.publicLog2<WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification>('workbenchActionExecuted', { id: 'remoteInstallAndRun', detail: extensionId,


quickPick.items = []; quickPick.busy = true; quickPick.placeholder = nls.localize('remote.startActions.installingExtension', 'Installing extension... '); <del> await this.installAndRunStartCommand(remoteExtension); </del> <ins> await this.installExtension(remoteExtension.id); quickPick.hide(); await this.runRemoteStartCommand(remoteExtension.id, remoteExtension.startCommand); </ins> } else { this.telemetryService.publicLog2<WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification>('workbenchActionExecuted', {


from: 'remote indicator' }); this.commandService.executeCommand(commandId); <ins> quickPick.hide(); </ins> } <del> quickPick.hide(); </del> } }));


import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { AriaRole } from 'vs/base/browser/ui/aria/aria'; import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; <del> import { IHoverWidget } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate'; </del> <ins> import { IHoverDelegate, IHoverWidget } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate'; </ins> import { IconLabel, IIconLabelValueOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list';


static readonly ID = 'listelement'; <del> constructor(private readonly themeService: IThemeService) { } </del> <ins> constructor( private readonly themeService: IThemeService, private readonly hoverDelegate: IHoverDelegate | undefined, ) { } </ins> get templateId() { return ListElementRenderer.ID;


const row2 = dom.append(rows, $('.quick-input-list-row')); // Label <del> data.label = new IconLabel(row1, { supportHighlights: true, supportDescriptionHighlights: true, supportIcons: true }); </del> <ins> data.label = new IconLabel(row1, { supportHighlights: true, supportDescriptionHighlights: true, supportIcons: true, hoverDelegate: this.hoverDelegate }); </ins> data.toDisposeTemplate.push(data.label); data.icon = <HTMLInputElement>dom.prepend(data.label.element, $('.quick-input-list-icon'));


// Detail const detailContainer = dom.append(row2, $('.quick-input-list-label-meta')); <del> data.detail = new IconLabel(detailContainer, { supportHighlights: true, supportIcons: true }); </del> <ins> data.detail = new IconLabel(detailContainer, { supportHighlights: true, supportIcons: true, hoverDelegate: this.hoverDelegate }); </ins> data.toDisposeTemplate.push(data.detail); // Separator data.separator = dom.append(data.entry, $('.quick-input-list-separator')); // Actions <del> data.actionBar = new ActionBar(data.entry); </del> <ins> data.actionBar = new ActionBar(data.entry, this.hoverDelegate ? { hoverDelegate: this.hoverDelegate } : undefined); </ins> data.actionBar.domNode.classList.add('quick-input-list-entry-action-bar'); data.toDisposeTemplate.push(data.actionBar);


// Label const options: IIconLabelValueOptions = { matches: labelHighlights || [], <del> descriptionTitle: element.saneDescription, </del> <ins> // If we have a tooltip, we want that to be shown and not any other hover descriptionTitle: element.saneTooltip ? undefined : element.saneDescription, </ins> descriptionMatches: descriptionHighlights || [], labelEscapeNewLines: true };


data.detail.element.style.display = ''; data.detail.setLabel(element.saneDetail, undefined, { matches: detailHighlights, <del> title: element.saneDetail, </del> <ins> // If we have a tooltip, we want that to be shown and not any other hover title: element.saneTooltip ? undefined : element.saneDetail, </ins> labelEscapeNewLines: true }); } else {


this.container = dom.append(this.parent, $('.quick-input-list')); const delegate = new ListElementDelegate(); const accessibilityProvider = new QuickInputAccessibilityProvider(); <del> this.list = options.createList('QuickInput', this.container, delegate, [new ListElementRenderer(themeService)], { </del> <ins> this.list = options.createList('QuickInput', this.container, delegate, [new ListElementRenderer(themeService, options.hoverDelegate)], { </ins> identityProvider: { getId: element => { // always prefer item over separator because if item is defined, it must be the main item type


async function copyVscodeDevLink(gitAPI: GitAPI, useSelection: boolean, context: LinkContext, includeRange = true) { try { <del> const permalink = await getLink(gitAPI, useSelection, getVscodeDevHost(), 'headlink', context, includeRange); </del> <ins> const permalink = await getLink(gitAPI, useSelection, true, getVscodeDevHost(), 'headlink', context, includeRange); </ins> if (permalink) { return vscode.env.clipboard.writeText(permalink); }


async function openVscodeDevLink(gitAPI: GitAPI): Promise<vscode.Uri | undefined> { try { <del> const headlink = await getLink(gitAPI, true, getVscodeDevHost(), 'headlink'); </del> <ins> const headlink = await getLink(gitAPI, true, false, getVscodeDevHost(), 'headlink'); </ins> return headlink ? vscode.Uri.parse(headlink) : undefined; } catch (err) { if (!(err instanceof vscode.CancellationError)) {