diff --git a/extensions/git/src/askpass.ts b/extensions/git/src/askpass.ts index 317d9cd4563ff..d9c852031e384 100644 --- a/extensions/git/src/askpass.ts +++ b/extensions/git/src/askpass.ts @@ -107,8 +107,14 @@ export class Askpass implements IIPCHandler, ITerminalEnvironmentProvider { // passphrase if (/passphrase/i.test(request)) { // Commit signing - Enter passphrase: + // Commit signing - Enter passphrase for '/c/Users//.ssh/id_ed25519': // Git operation - Enter passphrase for key '/c/Users//.ssh/id_ed25519': - const file = extractFilePathFromArgs(argv, 6); + let file: string | undefined = undefined; + if (argv[5] && !/key/i.test(argv[5])) { + file = extractFilePathFromArgs(argv, 5); + } else if (argv[6]) { + file = extractFilePathFromArgs(argv, 6); + } this.logger.trace(`[Askpass][handleSSHAskpass] request: ${request}, file: ${file}`); diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index def9c6c3be3f4..044039c2d4118 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -8,6 +8,7 @@ import { groupBy } from './collections.js'; import { SetMap } from './map.js'; import { createSingleCallFunction } from './functional.js'; import { Iterable } from './iterator.js'; +import { BugIndicatingError, onUnexpectedError } from './errors.js'; // #region Disposable Tracking @@ -486,6 +487,12 @@ export class DisposableStore implements IDisposable { setParentOfDisposable(o, null); } } + + public assertNotDisposed(): void { + if (this._isDisposed) { + onUnexpectedError(new BugIndicatingError('Object disposed')); + } + } } /** diff --git a/src/vs/editor/common/core/text/textLength.ts b/src/vs/editor/common/core/text/textLength.ts index 8a404b7da8f1d..a401a556afccb 100644 --- a/src/vs/editor/common/core/text/textLength.ts +++ b/src/vs/editor/common/core/text/textLength.ts @@ -5,6 +5,7 @@ import { LineRange } from '../ranges/lineRange.js'; import { Position } from '../position.js'; import { Range } from '../range.js'; +import { OffsetRange } from '../ranges/offsetRange.js'; /** * Represents a non-negative length of text in terms of line and column count. @@ -53,6 +54,14 @@ export class TextLength { return new TextLength(line, column); } + public static ofSubstr(str: string, range: OffsetRange): TextLength { + return TextLength.ofText(range.substring(str)); + } + + public static sum(fragments: readonly T[], getLength: (f: T) => TextLength): TextLength { + return fragments.reduce((acc, f) => acc.add(getLength(f)), TextLength.zero); + } + constructor( public readonly lineCount: number, public readonly columnCount: number diff --git a/src/vs/editor/common/languages.ts b/src/vs/editor/common/languages.ts index a50330e101954..b4ea7a752cf54 100644 --- a/src/vs/editor/common/languages.ts +++ b/src/vs/editor/common/languages.ts @@ -832,6 +832,11 @@ export interface InlineCompletion { readonly warning?: InlineCompletionWarning; readonly displayLocation?: InlineCompletionDisplayLocation; + + /** + * Used for telemetry. + */ + readonly correlationId?: string | undefined; } export interface InlineCompletionWarning { @@ -1000,6 +1005,7 @@ export type InlineCompletionEndOfLifeReason(id: ServiceIdentifier): T | undefined { + const value = this.services.get(id); + return value; + } } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 622d73f903492..f5ecb28bbea7f 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -7527,6 +7527,10 @@ declare namespace monaco.languages { readonly showRange?: IRange; readonly warning?: InlineCompletionWarning; readonly displayLocation?: InlineCompletionDisplayLocation; + /** + * Used for telemetry. + */ + readonly correlationId?: string | undefined; } export interface InlineCompletionWarning { @@ -7633,6 +7637,7 @@ declare namespace monaco.languages { export type LifetimeSummary = { requestUuid: string; + correlationId: string | undefined; partiallyAccepted: number; partiallyAcceptedCountSinceOriginal: number; partiallyAcceptedRatioSinceOriginal: number; diff --git a/src/vs/platform/instantiation/common/instantiation.ts b/src/vs/platform/instantiation/common/instantiation.ts index 04e6e3166494e..ab7ec310b211e 100644 --- a/src/vs/platform/instantiation/common/instantiation.ts +++ b/src/vs/platform/instantiation/common/instantiation.ts @@ -31,6 +31,7 @@ export interface IConstructorSignature { export interface ServicesAccessor { get(id: ServiceIdentifier): T; + getIfExists(id: ServiceIdentifier): T | undefined; } export const IInstantiationService = createDecorator('instantiationService'); diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index 77950178326e5..b92c820135c93 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -104,6 +104,13 @@ export class InstantiationService implements IInstantiationService { throw new Error(`[invokeFunction] unknown service '${id}'`); } return result; + }, + getIfExists: (id: ServiceIdentifier) => { + if (_done) { + throw illegalState('service accessor is only valid during the invocation of its target method'); + } + const result = this._getOrCreateServiceInstance(id, _trace); + return result; } }; return fn(accessor, ...args); diff --git a/src/vs/platform/instantiation/test/common/instantiationServiceMock.ts b/src/vs/platform/instantiation/test/common/instantiationServiceMock.ts index 0e90a07d1ca26..0ef8a76932b64 100644 --- a/src/vs/platform/instantiation/test/common/instantiationServiceMock.ts +++ b/src/vs/platform/instantiation/test/common/instantiationServiceMock.ts @@ -6,7 +6,7 @@ import * as sinon from 'sinon'; import { DisposableStore, IDisposable, toDisposable } from '../../../../base/common/lifecycle.js'; import { SyncDescriptor } from '../../common/descriptors.js'; -import { ServiceIdentifier } from '../../common/instantiation.js'; +import { ServiceIdentifier, ServicesAccessor } from '../../common/instantiation.js'; import { InstantiationService, Trace } from '../../common/instantiationService.js'; import { ServiceCollection } from '../../common/serviceCollection.js'; @@ -17,7 +17,7 @@ interface IServiceMock { const isSinonSpyLike = (fn: Function): fn is sinon.SinonSpy => fn && 'callCount' in fn; -export class TestInstantiationService extends InstantiationService implements IDisposable { +export class TestInstantiationService extends InstantiationService implements IDisposable, ServicesAccessor { private _servciesMap: Map, any>; @@ -31,6 +31,14 @@ export class TestInstantiationService extends InstantiationService implements ID return super._getOrCreateServiceInstance(service, Trace.traceCreation(false, TestInstantiationService)); } + public getIfExists(service: ServiceIdentifier): T | undefined { + try { + return super._getOrCreateServiceInstance(service, Trace.traceCreation(false, TestInstantiationService)); + } catch (e) { + return undefined; + } + } + public set(service: ServiceIdentifier, instance: T): T { return this._serviceCollection.set(service, instance); } diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 8c50306bfa469..76deba8858da9 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -652,6 +652,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread const endOfLifeSummary: InlineCompletionEndOfLifeEvent = { id: lifetimeSummary.requestUuid, opportunityId: lifetimeSummary.requestUuid, + correlationId: lifetimeSummary.correlationId, shown: lifetimeSummary.shown, shownDuration: lifetimeSummary.shownDuration, shownDurationUncollapsed: lifetimeSummary.shownDurationUncollapsed, @@ -1315,6 +1316,7 @@ type InlineCompletionEndOfLifeEvent = { */ id: string; opportunityId: string; + correlationId: string | undefined; extensionId: string; extensionVersion: string; shown: boolean; @@ -1352,6 +1354,7 @@ type InlineCompletionsEndOfLifeClassification = { comment: 'Inline completions ended'; id: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The identifier for the inline completion request' }; opportunityId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Unique identifier for an opportunity to show an inline completion or NES' }; + correlationId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The correlation identifier for the inline completion' }; extensionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The identifier for the extension that contributed the inline completion' }; extensionVersion: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The version of the extension that contributed the inline completion' }; shown: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the inline completion was shown to the user' }; diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index 3b7d8d34fa2e3..21220c18fc344 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -1437,6 +1437,7 @@ class InlineCompletionAdapter { message: typeConvert.MarkdownString.from(item.warning.message), icon: item.warning.icon ? typeConvert.IconPath.fromThemeIcon(item.warning.icon) : undefined, } : undefined, + correlationId: this._isAdditionsProposedApiEnabled ? item.correlationId : undefined, }); }), commands: commands.map(c => { diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts new file mode 100644 index 0000000000000..5c5274c30a7b5 --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts @@ -0,0 +1,83 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { alert } from '../../../../../base/browser/ui/aria/aria.js'; +import { localize } from '../../../../../nls.js'; +import { Action2, MenuId, registerAction2 } from '../../../../../platform/actions/common/actions.js'; +import { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js'; +import { ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js'; +import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js'; +import { KeyCode, KeyMod } from '../../../../../base/common/keyCodes.js'; +import { IChatWidgetService } from '../chat.js'; +import { ChatContextKeys } from '../../common/chatContextKeys.js'; +import { ChatAgentLocation } from '../../common/constants.js'; +import { isResponseVM } from '../../common/chatViewModel.js'; +import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from '../../../../../platform/accessibility/common/accessibility.js'; + +export const ACTION_ID_FOCUS_CHAT_CONFIRMATION = 'workbench.action.chat.focusConfirmation'; + +class AnnounceChatConfirmationAction extends Action2 { + constructor() { + super({ + id: ACTION_ID_FOCUS_CHAT_CONFIRMATION, + title: { value: localize('focusChatConfirmation', 'Focus Chat Confirmation'), original: 'Focus Chat Confirmation' }, + category: { value: localize('chat.category', 'Chat'), original: 'Chat' }, + f1: true, + keybinding: { + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.Alt | KeyCode.KeyA, + when: ContextKeyExpr.and( + ChatContextKeys.location.isEqualTo(ChatAgentLocation.Panel), + ChatContextKeys.inChatSession, + CONTEXT_ACCESSIBILITY_MODE_ENABLED + ) + }, + menu: [ + { + id: MenuId.ChatConfirmationMenu, + when: ChatContextKeys.inChatSession, + group: '0_main' + } + ] + }); + } + + async run(accessor: ServicesAccessor): Promise { + const chatWidgetService = accessor.get(IChatWidgetService); + const lastFocusedWidget = chatWidgetService.lastFocusedWidget; + + if (!lastFocusedWidget) { + alert(localize('noChatSession', 'No active chat session found.')); + return; + } + + const viewModel = lastFocusedWidget.viewModel; + if (!viewModel) { + alert(localize('chatNotReady', 'Chat interface not ready.')); + return; + } + + // Check for active confirmations in the chat responses + let firstConfirmationElement: HTMLElement | undefined; + + const lastResponse = viewModel.getItems()[viewModel.getItems().length - 1]; + if (isResponseVM(lastResponse)) { + const confirmationWidgets = lastFocusedWidget.domNode.querySelectorAll('.chat-confirmation-widget-container'); + if (confirmationWidgets.length > 0) { + firstConfirmationElement = confirmationWidgets[0] as HTMLElement; + } + } + + if (firstConfirmationElement) { + firstConfirmationElement.focus(); + } else { + alert(localize('noConfirmationRequired', 'No chat confirmation required')); + } + } +} + +export function registerChatAccessibilityActions(): void { + registerAction2(AnnounceChatConfirmationAction); +} diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts index a5fa17b59152a..c3dee6334991f 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts @@ -79,6 +79,7 @@ export function getAccessibilityHelpText(type: 'panelChat' | 'inlineChat' | 'qui content.push(localize('workbench.action.chat.focus', 'To focus the chat request/response list, which can be navigated with up and down arrows, invoke the Focus Chat command{0}.', getChatFocusKeybindingLabel(keybindingService, type, false))); content.push(localize('workbench.action.chat.focusInput', 'To focus the input box for chat requests, invoke the Focus Chat Input command{0}.', getChatFocusKeybindingLabel(keybindingService, type, true))); content.push(localize('workbench.action.chat.nextCodeBlock', 'To focus the next code block within a response, invoke the Chat: Next Code Block command{0}.', '')); + content.push(localize('workbench.action.chat.announceConfirmation', 'To focus pending chat confirmation dialogs, invoke the Focus Chat Confirmation Status command{0}.', '')); if (type === 'panelChat') { content.push(localize('workbench.action.chat.newChat', 'To create a new chat session, invoke the New Chat command{0}.', '')); } diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index 2a2b14672e8cc..6000175b8756a 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -59,6 +59,7 @@ import { LanguageModelToolsExtensionPointHandler } from '../common/tools/languag import { BuiltinToolsContribution } from '../common/tools/tools.js'; import { IVoiceChatService, VoiceChatService } from '../common/voiceChatService.js'; import { AgentChatAccessibilityHelp, EditsChatAccessibilityHelp, PanelChatAccessibilityHelp, QuickChatAccessibilityHelp } from './actions/chatAccessibilityHelp.js'; +import { registerChatAccessibilityActions } from './actions/chatAccessibilityActions.js'; import { ACTION_ID_NEW_CHAT, CopilotTitleBarMenuRendering, registerChatActions } from './actions/chatActions.js'; import { registerNewChatActions } from './actions/chatClearActions.js'; import { CodeBlockActionRendering, registerChatCodeBlockActions, registerChatCodeCompareBlockActions } from './actions/chatCodeblockActions.js'; @@ -802,6 +803,7 @@ registerWorkbenchContribution2(PromptUrlHandler.ID, PromptUrlHandler, WorkbenchP registerWorkbenchContribution2(ChatSessionsView.ID, ChatSessionsView, WorkbenchPhase.AfterRestored); registerChatActions(); +registerChatAccessibilityActions(); registerChatCopyActions(); registerChatCodeBlockActions(); registerChatCodeCompareBlockActions(); diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationWidget.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationWidget.ts index 2ded1521b9c0c..1a42f5b63e6d4 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationWidget.ts @@ -40,6 +40,7 @@ export interface IChatConfirmationButton { export interface IChatConfirmationWidgetOptions { title: string | IMarkdownString; + message: string | IMarkdownString; subtitle?: string | IMarkdownString; buttons: IChatConfirmationButton[]; toolbarData?: { arg: any; partType: string; partSource?: string }; @@ -144,9 +145,10 @@ abstract class BaseSimpleChatConfirmationWidget extends Disposable { ) { super(); - const { title, subtitle, buttons } = options; + const { title, subtitle, message, buttons } = options; this.title = title; + const elements = dom.h('.chat-confirmation-widget@root', [ dom.h('.chat-confirmation-widget-title@title'), dom.h('.chat-confirmation-widget-message@message'), @@ -155,7 +157,9 @@ abstract class BaseSimpleChatConfirmationWidget extends Disposable { dom.h('.chat-toolbar@toolbar'), ]), ]); - this._domNode = elements.root; + const container = createAccessibilityContainer(title, message); + container.appendChild(elements.root); + this._domNode = container; this.markdownRenderer = this.instantiationService.createInstance(MarkdownRenderer, {}); const titlePart = this._register(instantiationService.createInstance( @@ -302,6 +306,7 @@ export class SimpleChatConfirmationWidget extends BaseSimpleChatConfirmationWidg export interface IChatConfirmationWidget2Options { title: string | IMarkdownString; + message: string | IMarkdownString | HTMLElement; icon?: ThemeIcon; subtitle?: string | IMarkdownString; buttons: IChatConfirmationButton[]; @@ -345,7 +350,7 @@ abstract class BaseChatConfirmationWidget extends Disposable { ) { super(); - const { title, subtitle, buttons, icon } = options; + const { title, subtitle, message, buttons, icon } = options; this.title = title; const elements = dom.h('.chat-confirmation-widget2@root', [ @@ -360,7 +365,9 @@ abstract class BaseChatConfirmationWidget extends Disposable { dom.h('.chat-buttons@buttons'), ]), ]); - this._domNode = elements.root; + const container = createAccessibilityContainer(title, message); + container.appendChild(elements.root); + this._domNode = container; this.markdownRenderer = this.instantiationService.createInstance(MarkdownRenderer, {}); const titlePart = this._register(instantiationService.createInstance( @@ -538,3 +545,13 @@ export class ChatCustomConfirmationWidget extends BaseChatConfirmationWidget { this.renderMessage(options.message, container); } } + +function createAccessibilityContainer(title: string | IMarkdownString, message?: string | IMarkdownString | HTMLElement): HTMLElement { + const container = document.createElement('div'); + container.tabIndex = 0; + const titleAsString = typeof title === 'string' ? title : title.value; + const messageAsString = typeof message === 'string' ? message : message && 'value' in message ? message.value : message && 'textContent' in message ? message.textContent : ''; + container.setAttribute('aria-label', localize('chat.confirmationWidget.ariaLabel', "Chat Confirmation Dialog {0} {1}", titleAsString, messageAsString)); + container.classList.add('chat-confirmation-widget-container'); + return container; +} diff --git a/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts b/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts index 2784bfce7f081..7f1e082e7fdef 100644 --- a/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts +++ b/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts @@ -86,8 +86,8 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr private remoteStatusEntry: IStatusbarEntryAccessor | undefined; - private readonly legacyIndicatorMenu: IMenu; // to be removed once migration completed - private readonly remoteIndicatorMenu: IMenu; + private readonly remoteIndicatorMenu: IMenu; // filters its entries based on the current remote name of the window + private readonly unrestrictedRemoteIndicatorMenu: IMenu; // does not filter its entries based on the current remote name of the window private remoteMenuActionsGroups: ActionGroup[] | undefined; @@ -161,7 +161,7 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr ) { super(); - this.legacyIndicatorMenu = this._register(this.menuService.createMenu(MenuId.StatusBarWindowIndicatorMenu, this.contextKeyService)); // to be removed once migration completed + this.unrestrictedRemoteIndicatorMenu = this._register(this.menuService.createMenu(MenuId.StatusBarWindowIndicatorMenu, this.contextKeyService)); // to be removed once migration completed this.remoteIndicatorMenu = this._register(this.menuService.createMenu(MenuId.StatusBarRemoteIndicatorMenu, this.contextKeyService)); this.connectionStateContextKey = new RawContextKey<'' | 'initializing' | 'disconnected' | 'connected'>('remoteConnectionState', '').bindTo(this.contextKeyService); @@ -254,7 +254,7 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr this.updateRemoteStatusIndicator(); }; - this._register(this.legacyIndicatorMenu.onDidChange(updateRemoteActions)); + this._register(this.unrestrictedRemoteIndicatorMenu.onDidChange(updateRemoteActions)); this._register(this.remoteIndicatorMenu.onDidChange(updateRemoteActions)); // Update indicator when formatter changes as it may have an impact on the remote label @@ -482,7 +482,7 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr private getRemoteMenuActions(doNotUseCache?: boolean): ActionGroup[] { if (!this.remoteMenuActionsGroups || doNotUseCache) { - this.remoteMenuActionsGroups = this.remoteIndicatorMenu.getActions().filter(a => this.validatedGroup(a[0])).concat(this.legacyIndicatorMenu.getActions()); + this.remoteMenuActionsGroups = this.remoteIndicatorMenu.getActions().filter(a => this.validatedGroup(a[0])).concat(this.unrestrictedRemoteIndicatorMenu.getActions()); } return this.remoteMenuActionsGroups; } @@ -842,7 +842,7 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr })); // refresh the items when actions change - disposables.add(this.legacyIndicatorMenu.onDidChange(() => quickPick.items = computeItems())); + disposables.add(this.unrestrictedRemoteIndicatorMenu.onDidChange(() => quickPick.items = computeItems())); disposables.add(this.remoteIndicatorMenu.onDidChange(() => quickPick.items = computeItems())); disposables.add(quickPick.onDidHide(() => disposables.dispose())); diff --git a/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts b/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts index 8c91e6850f0cc..34c9bdc7dce0f 100644 --- a/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts +++ b/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts @@ -46,6 +46,9 @@ declare module 'vscode' { action?: Command; displayLocation?: InlineCompletionDisplayLocation; + + /** Used for telemetry. Can be an arbitrary string. */ + correlationId?: string; } export enum InlineCompletionDisplayLocationKind { diff --git a/test/integration/browser/package-lock.json b/test/integration/browser/package-lock.json index 811c9c410546a..5d6ce3dc57e6d 100644 --- a/test/integration/browser/package-lock.json +++ b/test/integration/browser/package-lock.json @@ -13,7 +13,7 @@ "@types/rimraf": "^2.0.4", "@types/tmp": "0.1.0", "rimraf": "^2.6.1", - "tmp": "0.0.33", + "tmp": "0.2.4", "tree-kill": "1.2.2", "vscode-uri": "^3.0.2" } @@ -154,15 +154,6 @@ "wrappy": "1" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -186,15 +177,13 @@ } }, "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz", + "integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==", "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, + "license": "MIT", "engines": { - "node": ">=0.6.0" + "node": ">=14.14" } }, "node_modules/tree-kill": { diff --git a/test/integration/browser/package.json b/test/integration/browser/package.json index 2dce9946570c6..b69cf976c68f4 100644 --- a/test/integration/browser/package.json +++ b/test/integration/browser/package.json @@ -11,7 +11,7 @@ "@types/rimraf": "^2.0.4", "@types/tmp": "0.1.0", "rimraf": "^2.6.1", - "tmp": "0.0.33", + "tmp": "0.2.4", "tree-kill": "1.2.2", "vscode-uri": "^3.0.2" }