From 155c18ecfc960ddf9fc679ac33bb868d886246e0 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 23 Feb 2026 11:44:35 +0100 Subject: [PATCH 01/28] updates component explorer (#296938) * updates component explorer * updates package.json * fix screenshot CI: install build/ dependencies for jsonc-parser * sets relative base * updates lockfile --- .github/workflows/screenshot-test.yml | 34 +++++++++++++++++++++------ .gitignore | 1 + build/vite/package-lock.json | 14 +++++------ build/vite/package.json | 2 +- build/vite/vite.config.ts | 3 +++ package-lock.json | 16 ++++++------- package.json | 6 ++--- 7 files changed, 50 insertions(+), 26 deletions(-) diff --git a/.github/workflows/screenshot-test.yml b/.github/workflows/screenshot-test.yml index e5a91228a1419..5c1c3cb9310bd 100644 --- a/.github/workflows/screenshot-test.yml +++ b/.github/workflows/screenshot-test.yml @@ -36,10 +36,18 @@ jobs: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Install build dependencies + run: npm ci + working-directory: build + - name: Install build/vite dependencies run: rm -f package-lock.json && npm install working-directory: build/vite + - name: Build vite + run: npm run build + working-directory: build/vite + - name: Install Playwright Chromium run: npx playwright install chromium @@ -51,10 +59,23 @@ jobs: run: | npx component-explorer screenshot:compare \ --project ./test/componentFixtures \ - --report ./test/componentFixtures/.screenshots/report.json \ - --report-markdown ./test/componentFixtures/.screenshots/report.md + --report ./test/componentFixtures/.screenshots/report continue-on-error: true + - name: Prepare explorer artifact + run: | + mkdir -p /tmp/explorer-artifact/screenshot-report + cp -r build/vite/dist/* /tmp/explorer-artifact/ + if [ -d test/componentFixtures/.screenshots/report ]; then + cp -r test/componentFixtures/.screenshots/report/* /tmp/explorer-artifact/screenshot-report/ + fi + + - name: Upload explorer artifact + uses: actions/upload-artifact@v4 + with: + name: component-explorer + path: /tmp/explorer-artifact/ + - name: Upload screenshot report if: steps.compare.outcome == 'failure' uses: actions/upload-artifact@v4 @@ -62,14 +83,13 @@ jobs: name: screenshot-diff path: | test/componentFixtures/.screenshots/current/ - test/componentFixtures/.screenshots/report.json - test/componentFixtures/.screenshots/report.md + test/componentFixtures/.screenshots/report/ - name: Set check title env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - REPORT="test/componentFixtures/.screenshots/report.json" + REPORT="test/componentFixtures/.screenshots/report/report.json" if [ -f "$REPORT" ]; then CHANGED=$(node -e "const r = require('./$REPORT'); console.log(r.summary.added + r.summary.removed + r.summary.changed)") TITLE="${CHANGED} screenshots changed" @@ -90,8 +110,8 @@ jobs: - name: Post summary run: | - if [ -f test/componentFixtures/.screenshots/report.md ]; then - cat test/componentFixtures/.screenshots/report.md >> $GITHUB_STEP_SUMMARY + if [ -f test/componentFixtures/.screenshots/report/report.md ]; then + cat test/componentFixtures/.screenshots/report/report.md >> $GITHUB_STEP_SUMMARY else echo "## Screenshots ✅" >> $GITHUB_STEP_SUMMARY echo "No visual changes detected." >> $GITHUB_STEP_SUMMARY diff --git a/.gitignore b/.gitignore index 7359fbeaa220c..9a9fdcadff97a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ vscode-telemetry-docs/ test-output.json test/componentFixtures/.screenshots/* !test/componentFixtures/.screenshots/baseline/ +dist diff --git a/build/vite/package-lock.json b/build/vite/package-lock.json index f19b6fb6fe7f9..60c863d483b6a 100644 --- a/build/vite/package-lock.json +++ b/build/vite/package-lock.json @@ -8,7 +8,7 @@ "name": "@vscode/sample-source", "version": "0.0.0", "devDependencies": { - "@vscode/component-explorer": "^0.1.1-10", + "@vscode/component-explorer": "^0.1.1-11", "@vscode/component-explorer-vite-plugin": "^0.1.1-10", "@vscode/rollup-plugin-esm-url": "^1.0.1-1", "rollup": "*", @@ -683,9 +683,9 @@ "license": "MIT" }, "node_modules/@vscode/component-explorer": { - "version": "0.1.1-10", - "resolved": "https://registry.npmjs.org/@vscode/component-explorer/-/component-explorer-0.1.1-10.tgz", - "integrity": "sha512-Nokjk2DB1hgKeUL1FW5dHfXySgj17BgxcsiyzcG6etdFIbMpzv85nMQxrW/88aklgmJPrRVefMRHFYSds/F3/g==", + "version": "0.1.1-11", + "resolved": "https://registry.npmjs.org/@vscode/component-explorer/-/component-explorer-0.1.1-11.tgz", + "integrity": "sha512-CP2KlhPApPh8zhFH2A2lD5/Zv/+UR02Id1hGfKgdlPQFyNLdfgTcXfVl55BHiwADGR+YRyNHocsglFuplQX8QQ==", "dev": true, "dependencies": { "react": "^18.2.0", @@ -693,9 +693,9 @@ } }, "node_modules/@vscode/component-explorer-vite-plugin": { - "version": "0.1.1-10", - "resolved": "https://registry.npmjs.org/@vscode/component-explorer-vite-plugin/-/component-explorer-vite-plugin-0.1.1-10.tgz", - "integrity": "sha512-1F2Ier7lpFPvYzWxyNCBy3qYzSwRyTw6k3pm+l6DBMMNT+OTnCZ3+awa7wtijZXMc4O1WooxswjrjBu++Oqftg==", + "version": "0.1.1-11", + "resolved": "https://registry.npmjs.org/@vscode/component-explorer-vite-plugin/-/component-explorer-vite-plugin-0.1.1-11.tgz", + "integrity": "sha512-+rVlilTUK5oMzkU8tagfmLfzZpSbXJANLKaLPBgN6pyBuDzkuRZmH6JzQbUCqeUGbVhHwG+U1thh5ws6ncFeEQ==", "dev": true, "dependencies": { "tinyglobby": "^0.2.0" diff --git a/build/vite/package.json b/build/vite/package.json index b4268fceca1c3..5998c829b2120 100644 --- a/build/vite/package.json +++ b/build/vite/package.json @@ -9,7 +9,7 @@ "preview": "vite preview" }, "devDependencies": { - "@vscode/component-explorer": "^0.1.1-10", + "@vscode/component-explorer": "^0.1.1-11", "@vscode/component-explorer-vite-plugin": "^0.1.1-10", "@vscode/rollup-plugin-esm-url": "^1.0.1-1", "rollup": "*", diff --git a/build/vite/vite.config.ts b/build/vite/vite.config.ts index d6d8931fa315d..cdae205f030df 100644 --- a/build/vite/vite.config.ts +++ b/build/vite/vite.config.ts @@ -164,6 +164,7 @@ logger.warn = (msg, options) => { }; export default defineConfig({ + base: './', plugins: [ rollupEsmUrlPlugin({}), injectBuiltinExtensionsPlugin(), @@ -171,6 +172,7 @@ export default defineConfig({ componentExplorer({ logLevel: 'verbose', include: join(__dirname, '../../src/**/*.fixture.ts'), + build: 'all', }), ], customLogger: logger, @@ -188,6 +190,7 @@ export default defineConfig({ }, root: '../..', // To support /out/... paths build: { + outDir: join(__dirname, 'dist'), rollupOptions: { input: { //index: path.resolve(__dirname, 'index.html'), diff --git a/package-lock.json b/package-lock.json index 2b82a31c00847..260c4aef67e09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,8 +84,8 @@ "@types/yazl": "^2.4.2", "@typescript-eslint/utils": "^8.45.0", "@typescript/native-preview": "^7.0.0-dev.20260130", - "@vscode/component-explorer": "^0.1.1-10", - "@vscode/component-explorer-cli": "^0.1.1-6", + "@vscode/component-explorer": "^0.1.1-11", + "@vscode/component-explorer-cli": "^0.1.1-7", "@vscode/gulp-electron": "https://github.com/microsoft/vscode-gulp-electron.git#405e3df0e4e9c37fcf549cbe6f5cef8d5ba5ddff", "@vscode/l10n-dev": "0.0.35", "@vscode/telemetry-extractor": "^1.10.2", @@ -3065,9 +3065,9 @@ "license": "CC-BY-4.0" }, "node_modules/@vscode/component-explorer": { - "version": "0.1.1-10", - "resolved": "https://registry.npmjs.org/@vscode/component-explorer/-/component-explorer-0.1.1-10.tgz", - "integrity": "sha512-Nokjk2DB1hgKeUL1FW5dHfXySgj17BgxcsiyzcG6etdFIbMpzv85nMQxrW/88aklgmJPrRVefMRHFYSds/F3/g==", + "version": "0.1.1-11", + "resolved": "https://registry.npmjs.org/@vscode/component-explorer/-/component-explorer-0.1.1-11.tgz", + "integrity": "sha512-CP2KlhPApPh8zhFH2A2lD5/Zv/+UR02Id1hGfKgdlPQFyNLdfgTcXfVl55BHiwADGR+YRyNHocsglFuplQX8QQ==", "dev": true, "dependencies": { "react": "^18.2.0", @@ -3075,9 +3075,9 @@ } }, "node_modules/@vscode/component-explorer-cli": { - "version": "0.1.1-6", - "resolved": "https://registry.npmjs.org/@vscode/component-explorer-cli/-/component-explorer-cli-0.1.1-6.tgz", - "integrity": "sha512-OnypYKeBH8ZZh6++2NvVo9lPXFvHpIik6Y/KAa/UVMp4hI58KlQ0zEOWszvwR1i6mESn+BRWERFbQbNlKLec5g==", + "version": "0.1.1-7", + "resolved": "https://registry.npmjs.org/@vscode/component-explorer-cli/-/component-explorer-cli-0.1.1-7.tgz", + "integrity": "sha512-Q+R736ZJtn96k0tClXMFQaa3KUWoqC2LOR7iTaILiKjtgPa3St1d+ZztbT8OiLhk/nhTlymBavVue83068Qm/g==", "dev": true, "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", diff --git a/package.json b/package.json index 14eb04131bde8..e5e265ac8c16a 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "perf": "node scripts/code-perf.js", "update-build-ts-version": "npm install -D typescript@next && npm install -D @typescript/native-preview && (cd build && npm run typecheck)", "install-local-component-explorer": "npm install ../vscode-packages/js-component-explorer/dist/vscode-component-explorer-0.1.0.tgz ../vscode-packages/js-component-explorer/dist/vscode-component-explorer-cli-0.1.0.tgz --no-save && cd build/vite && npm install ../../../vscode-packages/js-component-explorer/dist/vscode-component-explorer-vite-plugin-0.1.0.tgz --no-save", - "install-latest-component-explorer": "npm install @vscode/component-explorer@next @vscode/component-explorer-cli@next && cd build/vite && npm install @vscode/component-explorer-vite-plugin@next" + "install-latest-component-explorer": "npm install @vscode/component-explorer@next @vscode/component-explorer-cli@next && cd build/vite && npm install @vscode/component-explorer-vite-plugin@next && npm install @vscode/component-explorer" }, "dependencies": { "@anthropic-ai/sandbox-runtime": "0.0.23", @@ -152,8 +152,8 @@ "@types/yazl": "^2.4.2", "@typescript-eslint/utils": "^8.45.0", "@typescript/native-preview": "^7.0.0-dev.20260130", - "@vscode/component-explorer": "^0.1.1-10", - "@vscode/component-explorer-cli": "^0.1.1-6", + "@vscode/component-explorer": "^0.1.1-11", + "@vscode/component-explorer-cli": "^0.1.1-7", "@vscode/gulp-electron": "https://github.com/microsoft/vscode-gulp-electron.git#405e3df0e4e9c37fcf549cbe6f5cef8d5ba5ddff", "@vscode/l10n-dev": "0.0.35", "@vscode/telemetry-extractor": "^1.10.2", From 6b820e7b5bed8110eeaa6fb176dfae9e98d2011e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 23 Feb 2026 11:44:40 +0100 Subject: [PATCH 02/28] Add diagnostics support to inline chat and related actions (#296939) - Introduce `selectionHasDiagnostics` context key to track diagnostics in the editor selection. - Implement `FixDiagnosticsAction` to allow users to fix diagnostics directly from inline chat. - Enhance `InlineChatController` to optionally attach diagnostics to chat requests. - Update inline chat configuration to include `FixDiagnostics` setting. - Register new action in the inline chat affordance for fixing diagnostics. --- src/vs/editor/common/editorContextKeys.ts | 1 + .../browser/markerSelectionStatus.ts | 70 +++++++++++++++++++ src/vs/editor/editor.all.ts | 2 +- .../browser/inlineChat.contribution.ts | 1 + .../inlineChat/browser/inlineChatActions.ts | 29 +++++++- .../browser/inlineChatController.ts | 36 +++++----- .../browser/inlineChatEditorAffordance.ts | 2 +- .../browser/inlineChatOverlayWidget.ts | 7 +- .../contrib/inlineChat/common/inlineChat.ts | 11 +++ 9 files changed, 139 insertions(+), 20 deletions(-) create mode 100644 src/vs/editor/contrib/gotoError/browser/markerSelectionStatus.ts diff --git a/src/vs/editor/common/editorContextKeys.ts b/src/vs/editor/common/editorContextKeys.ts index d1e7c0dd95c0a..632f9005347c8 100644 --- a/src/vs/editor/common/editorContextKeys.ts +++ b/src/vs/editor/common/editorContextKeys.ts @@ -93,4 +93,5 @@ export namespace EditorContextKeys { export const hasMultipleDocumentFormattingProvider = new RawContextKey('editorHasMultipleDocumentFormattingProvider', false, nls.localize('editorHasMultipleDocumentFormattingProvider', "Whether the editor has multiple document formatting providers")); export const hasMultipleDocumentSelectionFormattingProvider = new RawContextKey('editorHasMultipleDocumentSelectionFormattingProvider', false, nls.localize('editorHasMultipleDocumentSelectionFormattingProvider', "Whether the editor has multiple document selection formatting providers")); + export const selectionHasDiagnostics = new RawContextKey('editorSelectionHasDiagnostics', false, nls.localize('editorSelectionHasDiagnostics', "Whether any diagnostic is present in the current editor selection")); } diff --git a/src/vs/editor/contrib/gotoError/browser/markerSelectionStatus.ts b/src/vs/editor/contrib/gotoError/browser/markerSelectionStatus.ts new file mode 100644 index 0000000000000..e13f8bd60185f --- /dev/null +++ b/src/vs/editor/contrib/gotoError/browser/markerSelectionStatus.ts @@ -0,0 +1,70 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from '../../../../base/common/lifecycle.js'; +import { isEqual } from '../../../../base/common/resources.js'; +import { ICodeEditor } from '../../../browser/editorBrowser.js'; +import { EditorContributionInstantiation, registerEditorContribution } from '../../../browser/editorExtensions.js'; +import { Range } from '../../../common/core/range.js'; +import { IEditorContribution } from '../../../common/editorCommon.js'; +import { EditorContextKeys } from '../../../common/editorContextKeys.js'; +import { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js'; +import { IMarkerService, MarkerSeverity } from '../../../../platform/markers/common/markers.js'; + +class MarkerSelectionStatus extends Disposable implements IEditorContribution { + + static readonly ID = 'editor.contrib.markerSelectionStatus'; + + private readonly _ctxHasDiagnostics: IContextKey; + + constructor( + private readonly _editor: ICodeEditor, + @IContextKeyService contextKeyService: IContextKeyService, + @IMarkerService private readonly _markerService: IMarkerService, + ) { + super(); + + this._ctxHasDiagnostics = EditorContextKeys.selectionHasDiagnostics.bindTo(contextKeyService); + + this._store.add(this._editor.onDidChangeCursorSelection(() => this._update())); + this._store.add(this._editor.onDidChangeModel(() => this._update())); + this._store.add(this._markerService.onMarkerChanged(e => { + const model = this._editor.getModel(); + if (model && e.some(uri => isEqual(uri, model.uri))) { + this._update(); + } + })); + + this._update(); + } + + override dispose(): void { + this._ctxHasDiagnostics.reset(); + super.dispose(); + } + + private _update(): void { + const model = this._editor.getModel(); + const selection = this._editor.getSelection(); + if (!model || !selection) { + this._ctxHasDiagnostics.reset(); + return; + } + + const markers = this._markerService.read({ + resource: model.uri, + severities: MarkerSeverity.Error | MarkerSeverity.Warning | MarkerSeverity.Info + }); + + const hasIntersecting = markers.some(marker => Range.areIntersecting( + { startLineNumber: marker.startLineNumber, startColumn: marker.startColumn, endLineNumber: marker.endLineNumber, endColumn: marker.endColumn }, + selection + )); + + this._ctxHasDiagnostics.set(hasIntersecting); + } +} + +registerEditorContribution(MarkerSelectionStatus.ID, MarkerSelectionStatus, EditorContributionInstantiation.AfterFirstRender); diff --git a/src/vs/editor/editor.all.ts b/src/vs/editor/editor.all.ts index 916cc40a98014..4802aeb185a03 100644 --- a/src/vs/editor/editor.all.ts +++ b/src/vs/editor/editor.all.ts @@ -30,6 +30,7 @@ import './contrib/inlineProgress/browser/inlineProgress.js'; import './contrib/gotoSymbol/browser/goToCommands.js'; import './contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js'; import './contrib/gotoError/browser/gotoError.js'; +import './contrib/gotoError/browser/markerSelectionStatus.js'; import './contrib/gpu/browser/gpuActions.js'; import './contrib/hover/browser/hoverContribution.js'; import './contrib/indentation/browser/indentation.js'; @@ -70,4 +71,3 @@ import './contrib/floatingMenu/browser/floatingMenu.contribution.js'; import './common/standaloneStrings.js'; import '../base/browser/ui/codicons/codiconStyles.js'; // The codicons are defined here and must be loaded - diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts index 2e6c7a6474b56..def506dfd1a66 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts @@ -94,6 +94,7 @@ registerAction2(InlineChatActions.FocusInlineChat); registerAction2(InlineChatActions.SubmitInlineChatInputAction); registerAction2(InlineChatActions.QueueInChatAction); registerAction2(InlineChatActions.HideInlineChatInputAction); +registerAction2(InlineChatActions.FixDiagnosticsAction); const workbenchContributionsRegistry = Registry.as(WorkbenchExtensions.Workbench); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index 92789d87d0f16..882525d9900af 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -11,7 +11,7 @@ import { EmbeddedDiffEditorWidget } from '../../../../editor/browser/widget/diff import { EmbeddedCodeEditorWidget } from '../../../../editor/browser/widget/codeEditor/embeddedCodeEditorWidget.js'; import { EditorContextKeys } from '../../../../editor/common/editorContextKeys.js'; import { InlineChatController, InlineChatRunOptions } from './inlineChatController.js'; -import { ACTION_ACCEPT_CHANGES, ACTION_ASK_IN_CHAT, CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_VISIBLE, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, CTX_INLINE_CHAT_POSSIBLE, ACTION_START, CTX_INLINE_CHAT_V2_ENABLED, CTX_INLINE_CHAT_V1_ENABLED, CTX_HOVER_MODE, CTX_INLINE_CHAT_INPUT_HAS_TEXT, CTX_INLINE_CHAT_FILE_BELONGS_TO_CHAT, CTX_INLINE_CHAT_INPUT_WIDGET_FOCUSED, InlineChatConfigKeys } from '../common/inlineChat.js'; +import { ACTION_ACCEPT_CHANGES, ACTION_ASK_IN_CHAT, CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_VISIBLE, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, CTX_INLINE_CHAT_POSSIBLE, ACTION_START, CTX_INLINE_CHAT_V2_ENABLED, CTX_INLINE_CHAT_V1_ENABLED, CTX_HOVER_MODE, CTX_INLINE_CHAT_INPUT_HAS_TEXT, CTX_INLINE_CHAT_FILE_BELONGS_TO_CHAT, CTX_INLINE_CHAT_INPUT_WIDGET_FOCUSED, InlineChatConfigKeys, CTX_FIX_DIAGNOSTICS_ENABLED } from '../common/inlineChat.js'; import { ctxHasEditorModification, ctxHasRequestInProgress } from '../../chat/browser/chatEditing/chatEditingEditorContextKeys.js'; import { localize, localize2 } from '../../../../nls.js'; import { Action2, IAction2Options, MenuId, MenuRegistry } from '../../../../platform/actions/common/actions.js'; @@ -246,6 +246,33 @@ export abstract class AbstractInlineChatAction extends EditorAction2 { abstract runInlineChatCommand(accessor: ServicesAccessor, ctrl: InlineChatController, editor: ICodeEditor, ...args: unknown[]): void; } +export class FixDiagnosticsAction extends AbstractInlineChatAction { + + constructor() { + super({ + id: 'inlineChat.fixDiagnostics', + title: localize2('fix', 'Fix'), + icon: Codicon.editSparkle, + precondition: ContextKeyExpr.and(inlineChatContextKey, CTX_FIX_DIAGNOSTICS_ENABLED, EditorContextKeys.selectionHasDiagnostics, CTX_INLINE_CHAT_FILE_BELONGS_TO_CHAT.negate()), + menu: [{ + id: MenuId.InlineChatEditorAffordance, + group: '1_quickfix', + order: 100, + when: ContextKeyExpr.and(CTX_FIX_DIAGNOSTICS_ENABLED, EditorContextKeys.selectionHasDiagnostics, CTX_INLINE_CHAT_FILE_BELONGS_TO_CHAT.negate()), + }, { + id: MenuId.ChatEditorInlineMenu, + group: '2_chat', + order: 1, + when: ContextKeyExpr.and(CTX_FIX_DIAGNOSTICS_ENABLED, EditorContextKeys.selectionHasDiagnostics, CTX_INLINE_CHAT_FILE_BELONGS_TO_CHAT.negate()), + }] + }); + } + + override runInlineChatCommand(_accessor: ServicesAccessor, ctrl: InlineChatController, _editor: ICodeEditor, ..._args: unknown[]): void { + ctrl.run({ autoSend: true, attachDiagnostics: true }); + } +} + class KeepOrUndoSessionAction extends AbstractInlineChatAction { constructor(private readonly _keep: boolean, desc: IAction2Options) { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 7efaea3ee5d90..5b9416ce49d40 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -68,6 +68,7 @@ export abstract class InlineChatRunOptions { position?: IPosition; modelSelector?: ILanguageModelChatSelector; resolveOnResponse?: boolean; + attachDiagnostics?: boolean; static isInlineChatRunOptions(options: unknown): options is InlineChatRunOptions { @@ -75,7 +76,7 @@ export abstract class InlineChatRunOptions { return false; } - const { initialSelection, initialRange, message, autoSend, position, attachments, modelSelector, resolveOnResponse } = options; + const { initialSelection, initialRange, message, autoSend, position, attachments, modelSelector, resolveOnResponse, attachDiagnostics } = options; if ( typeof message !== 'undefined' && typeof message !== 'string' || typeof autoSend !== 'undefined' && typeof autoSend !== 'boolean' @@ -85,6 +86,7 @@ export abstract class InlineChatRunOptions { || typeof attachments !== 'undefined' && (!Array.isArray(attachments) || !attachments.every(item => item instanceof URI)) || typeof modelSelector !== 'undefined' && !isILanguageModelChatSelector(modelSelector) || typeof resolveOnResponse !== 'undefined' && typeof resolveOnResponse !== 'boolean' + || typeof attachDiagnostics !== 'undefined' && typeof attachDiagnostics !== 'boolean' ) { return false; } @@ -506,22 +508,24 @@ export class InlineChatController implements IEditorContribution { try { await this._applyModelDefaults(session, sessionStore); - // ADD diagnostics - const entries: IChatRequestVariableEntry[] = []; - for (const [range, marker] of this._markerDecorationsService.getLiveMarkers(uri)) { - if (range.intersectRanges(this._editor.getSelection())) { - const filter = IDiagnosticVariableEntryFilterData.fromMarker(marker); - entries.push(IDiagnosticVariableEntryFilterData.toEntry(filter)); + // ADD diagnostics (only when explicitly requested) + if (arg?.attachDiagnostics) { + const entries: IChatRequestVariableEntry[] = []; + for (const [range, marker] of this._markerDecorationsService.getLiveMarkers(uri)) { + if (range.intersectRanges(this._editor.getSelection())) { + const filter = IDiagnosticVariableEntryFilterData.fromMarker(marker); + entries.push(IDiagnosticVariableEntryFilterData.toEntry(filter)); + } + } + if (entries.length > 0) { + this._zone.value.widget.chatWidget.attachmentModel.addContext(...entries); + const msg = entries.length > 1 + ? localize('fixN', "Fix the attached problems") + : localize('fix1', "Fix the attached problem"); + this._zone.value.widget.chatWidget.input.setValue(msg, true); + arg.message = msg; + this._zone.value.widget.chatWidget.inputEditor.setSelection(new Selection(1, 1, Number.MAX_SAFE_INTEGER, 1)); } - } - if (entries.length > 0) { - this._zone.value.widget.chatWidget.attachmentModel.addContext(...entries); - this._zone.value.widget.chatWidget.input.setValue(entries.length > 1 - ? localize('fixN', "Fix the attached problems") - : localize('fix1', "Fix the attached problem"), - true - ); - this._zone.value.widget.chatWidget.inputEditor.setSelection(new Selection(1, 1, Number.MAX_SAFE_INTEGER, 1)); } // Check args diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatEditorAffordance.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatEditorAffordance.ts index 1123978c2e85b..e7773395fce86 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatEditorAffordance.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatEditorAffordance.ts @@ -173,7 +173,7 @@ export class InlineChatEditorAffordance extends Disposable implements IContentWi if (action instanceof MenuItemAction && action.id === quickFixCommandId) { return instantiationService.createInstance(QuickFixActionViewItem, action, this._editor); } - if (action instanceof MenuItemAction && (action.id === ACTION_START || action.id === ACTION_ASK_IN_CHAT)) { + if (action instanceof MenuItemAction && (action.id === ACTION_START || action.id === ACTION_ASK_IN_CHAT || action.id === 'inlineChat.fixDiagnostics')) { return instantiationService.createInstance(LabelWithKeybindingActionViewItem, action); } return undefined; diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.ts index 1d27ddb7da5dd..2a997e1555fdb 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.ts @@ -225,9 +225,14 @@ export class InlineChatInputWidget extends Disposable { })); // ArrowUp on first action bar item moves focus back to input editor + // Escape on action bar hides the widget this._store.add(dom.addDisposableListener(actionBar.domNode, 'keydown', (e: KeyboardEvent) => { const event = new StandardKeyboardEvent(e); - if (event.keyCode === KeyCode.UpArrow) { + if (event.keyCode === KeyCode.Escape) { + event.preventDefault(); + event.stopPropagation(); + this.hide(); + } else if (event.keyCode === KeyCode.UpArrow) { const firstItem = actionBar.viewItems[0] as BaseActionViewItem | undefined; if (firstItem?.element && dom.isAncestorOfActiveElement(firstItem.element)) { event.preventDefault(); diff --git a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts index 28c824b62beaf..5eb1312bd5a33 100644 --- a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts +++ b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts @@ -22,6 +22,7 @@ export const enum InlineChatConfigKeys { DefaultModel = 'inlineChat.defaultModel', Affordance = 'inlineChat.affordance', RenderMode = 'inlineChat.renderMode', + FixDiagnostics = 'inlineChat.fixDiagnostics', } Registry.as(Extensions.Configuration).registerConfiguration({ @@ -83,6 +84,15 @@ Registry.as(Extensions.Configuration).registerConfigurat mode: 'auto' }, tags: ['experimental'] + }, + [InlineChatConfigKeys.FixDiagnostics]: { + description: localize('fixDiagnostics', "Controls whether the Fix action is shown for diagnostics in the editor."), + default: false, + type: 'boolean', + experiment: { + mode: 'auto' + }, + tags: ['experimental'] } } }); @@ -130,6 +140,7 @@ export const CTX_INLINE_CHAT_V2_ENABLED = ContextKeyExpr.or( ); export const CTX_HOVER_MODE = ContextKeyExpr.equals('config.inlineChat.renderMode', 'hover'); +export const CTX_FIX_DIAGNOSTICS_ENABLED = ContextKeyExpr.equals('config.inlineChat.fixDiagnostics', true); // --- (selected) action identifier From bdd6e80b9f6686e5cb92efd8cd2ffe4ae6314222 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 23 Feb 2026 12:24:43 +0100 Subject: [PATCH 03/28] update screenshot baselines from CI --- .../baseline/baseUI/InputBoxes/Dark.png | Bin 9232 -> 7097 bytes .../baseline/baseUI/InputBoxes/Light.png | Bin 8957 -> 6869 bytes .../baseline/baseUI/ProgressBars/Dark.png | Bin 11332 -> 8951 bytes .../baseline/baseUI/ProgressBars/Light.png | Bin 11476 -> 9062 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/InputBoxes/Dark.png b/test/componentFixtures/.screenshots/baseline/baseUI/InputBoxes/Dark.png index 721a618d708cd2afabaac79f0b07018a180e6ef7..ba5eb4149bd89490677c5eb114f325a085b899be 100644 GIT binary patch literal 7097 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 literal 9232 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 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/InputBoxes/Light.png b/test/componentFixtures/.screenshots/baseline/baseUI/InputBoxes/Light.png index d35879dc9758376ab5e75a06a6a74e5658780fc5..5cc01688c8f07b960e68e9a83761ca0c053d5277 100644 GIT binary patch literal 6869 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 literal 8957 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 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/ProgressBars/Dark.png b/test/componentFixtures/.screenshots/baseline/baseUI/ProgressBars/Dark.png index bb25647846e3e7ad6ff33c96e5adace9bb2c61ca..25d6dc177151aafe99226102d8e44caa88a8a19f 100644 GIT binary patch literal 8951 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 IF~iUQ1izY#1^@s6 literal 11476 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 Date: Mon, 23 Feb 2026 12:33:18 +0100 Subject: [PATCH 04/28] Post url to review screenshots --- .github/workflows/screenshot-test.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/screenshot-test.yml b/.github/workflows/screenshot-test.yml index 5c1c3cb9310bd..7577c67d6bd2c 100644 --- a/.github/workflows/screenshot-test.yml +++ b/.github/workflows/screenshot-test.yml @@ -101,10 +101,12 @@ jobs: CHECK_RUN_ID=$(gh api "repos/${{ github.repository }}/commits/$SHA/check-runs" \ --jq '.check_runs[] | select(.name == "screenshots") | .id') + DETAILS_URL="https://hediet-ghartifactpreview.azurewebsites.net/${{ github.repository }}/run/${{ github.run_id }}/component-explorer/___explorer.html?report=./screenshot-report/report.json" + if [ -n "$CHECK_RUN_ID" ]; then gh api "repos/${{ github.repository }}/check-runs/$CHECK_RUN_ID" \ -X PATCH --input - < Date: Mon, 23 Feb 2026 11:55:54 +0000 Subject: [PATCH 05/28] fix: update position icon in notifications to use arrowSwap --- .../browser/parts/notifications/notificationsActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/notifications/notificationsActions.ts b/src/vs/workbench/browser/parts/notifications/notificationsActions.ts index eb26d779f06eb..36ccd6f2af856 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsActions.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsActions.ts @@ -22,7 +22,7 @@ const expandIcon = registerIcon('notifications-expand', Codicon.chevronUp, local const collapseIcon = registerIcon('notifications-collapse', Codicon.chevronDown, localize('collapseIcon', 'Icon for the collapse action in notifications.')); const configureIcon = registerIcon('notifications-configure', Codicon.gear, localize('configureIcon', 'Icon for the configure action in notifications.')); const doNotDisturbIcon = registerIcon('notifications-do-not-disturb', Codicon.bellSlash, localize('doNotDisturbIcon', 'Icon for the mute all action in notifications.')); -export const positionIcon = registerIcon('notifications-position', Codicon.move, localize('positionIcon', 'Icon for the position action in notifications.')); +export const positionIcon = registerIcon('notifications-position', Codicon.arrowSwap, localize('positionIcon', 'Icon for the position action in notifications.')); export class ClearNotificationAction extends Action { From 9c2922a85d418f2aebe66d77583bbe15a7888946 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 23 Feb 2026 13:09:29 +0100 Subject: [PATCH 06/28] feat: enhance source map handling in NLS and private field conversion (#296957) * feat: enhance source map handling in NLS and private field conversion - Implemented inline source maps in the NLS plugin to ensure accurate mapping from transformed source back to original. - Modified `transformToPlaceholders` to return edits for source map adjustments. - Added `adjustSourceMap` function to update source maps based on text edits in `convertPrivateFields`. - Introduced tests for source map accuracy in both NLS and private field conversion scenarios. - Updated documentation to reflect changes in source map handling and the rationale behind accepting column imprecision. * address PR review: fix source name collision, guard unmapped segments, reorder mangle before NLS --- build/next/index.ts | 33 +- build/next/nls-plugin.ts | 109 +++++- build/next/private-to-property.ts | 122 ++++++- build/next/test/nls-sourcemap.test.ts | 373 ++++++++++++++++++++ build/next/test/private-to-property.test.ts | 183 +++++++++- build/next/working.md | 45 ++- 6 files changed, 830 insertions(+), 35 deletions(-) create mode 100644 build/next/test/nls-sourcemap.test.ts diff --git a/build/next/index.ts b/build/next/index.ts index e8f5b1f72d1c1..b0120837efa26 100644 --- a/build/next/index.ts +++ b/build/next/index.ts @@ -10,7 +10,7 @@ import { promisify } from 'util'; import glob from 'glob'; import gulpWatch from '../lib/watch/index.ts'; import { nlsPlugin, createNLSCollector, finalizeNLS, postProcessNLS } from './nls-plugin.ts'; -import { convertPrivateFields, type ConvertPrivateFieldsResult } from './private-to-property.ts'; +import { convertPrivateFields, adjustSourceMap, type ConvertPrivateFieldsResult } from './private-to-property.ts'; import { getVersion } from '../lib/getVersion.ts'; import product from '../../product.json' with { type: 'json' }; import packageJson from '../../package.json' with { type: 'json' }; @@ -883,6 +883,8 @@ ${tslib}`, // Post-process and write all output files let bundled = 0; const mangleStats: { file: string; result: ConvertPrivateFieldsResult }[] = []; + // Map from JS file path to pre-mangle content + edits, for source map adjustment + const mangleEdits = new Map(); for (const { result } of buildResults) { if (!result.outputFiles) { continue; @@ -894,22 +896,26 @@ ${tslib}`, if (file.path.endsWith('.js') || file.path.endsWith('.css')) { let content = file.text; - // Apply NLS post-processing if enabled (JS only) - if (file.path.endsWith('.js') && doNls && indexMap.size > 0) { - content = postProcessNLS(content, indexMap, preserveEnglish); - } - - // Convert native #private fields to regular properties. + // Convert native #private fields to regular properties BEFORE NLS + // post-processing, so that the edit offsets align with esbuild's + // source map coordinate system (both reference the raw esbuild output). // Skip extension host bundles - they expose API surface to extensions // where true encapsulation matters more than the perf gain. if (file.path.endsWith('.js') && doManglePrivates && !isExtensionHostBundle(file.path)) { + const preMangleCode = content; const mangleResult = convertPrivateFields(content, file.path); content = mangleResult.code; if (mangleResult.editCount > 0) { mangleStats.push({ file: path.relative(path.join(REPO_ROOT, outDir), file.path), result: mangleResult }); + mangleEdits.set(file.path, { preMangleCode, edits: mangleResult.edits }); } } + // Apply NLS post-processing if enabled (JS only) + if (file.path.endsWith('.js') && doNls && indexMap.size > 0) { + content = postProcessNLS(content, indexMap, preserveEnglish); + } + // Rewrite sourceMappingURL to CDN URL if configured if (sourceMapBaseUrl) { const relativePath = path.relative(path.join(REPO_ROOT, outDir), file.path); @@ -924,8 +930,19 @@ ${tslib}`, } await fs.promises.writeFile(file.path, content); + } else if (file.path.endsWith('.map')) { + // Source maps may need adjustment if private fields were mangled + const jsPath = file.path.replace(/\.map$/, ''); + const editInfo = mangleEdits.get(jsPath); + if (editInfo) { + const mapJson = JSON.parse(file.text); + const adjusted = adjustSourceMap(mapJson, editInfo.preMangleCode, editInfo.edits); + await fs.promises.writeFile(file.path, JSON.stringify(adjusted)); + } else { + await fs.promises.writeFile(file.path, file.contents); + } } else { - // Write other files (source maps, assets) as-is + // Write other files (assets, etc.) as-is await fs.promises.writeFile(file.path, file.contents); } } diff --git a/build/next/nls-plugin.ts b/build/next/nls-plugin.ts index 56cb84fa33a06..7be3faccf2439 100644 --- a/build/next/nls-plugin.ts +++ b/build/next/nls-plugin.ts @@ -6,6 +6,7 @@ import * as esbuild from 'esbuild'; import * as path from 'path'; import * as fs from 'fs'; +import { SourceMapGenerator } from 'source-map'; import { TextModel, analyzeLocalizeCalls, @@ -160,10 +161,17 @@ export function postProcessNLS( // Transformation // ============================================================================ +interface NLSEdit { + line: number; // 0-based line in original source + startCol: number; // 0-based start column in original + endCol: number; // 0-based end column in original + newLength: number; // length of replacement text +} + function transformToPlaceholders( source: string, moduleId: string -): { code: string; entries: NLSEntry[] } { +): { code: string; entries: NLSEntry[]; edits: NLSEdit[] } { const localizeCalls = analyzeLocalizeCalls(source, 'localize'); const localize2Calls = analyzeLocalizeCalls(source, 'localize2'); @@ -176,10 +184,11 @@ function transformToPlaceholders( ); if (allCalls.length === 0) { - return { code: source, entries: [] }; + return { code: source, entries: [], edits: [] }; } const entries: NLSEntry[] = []; + const edits: NLSEdit[] = []; const model = new TextModel(source); // Process in reverse order to preserve positions @@ -201,14 +210,92 @@ function transformToPlaceholders( placeholder }); + const replacementText = `"${placeholder}"`; + + // Track the edit for source map generation (positions are in original source coords) + edits.push({ + line: call.keySpan.start.line, + startCol: call.keySpan.start.character, + endCol: call.keySpan.end.character, + newLength: replacementText.length, + }); + // Replace the key with the placeholder string - model.apply(call.keySpan, `"${placeholder}"`); + model.apply(call.keySpan, replacementText); } - // Reverse entries to match source order + // Reverse entries and edits to match source order entries.reverse(); + edits.reverse(); + + return { code: model.toString(), entries, edits }; +} + +/** + * Generates a source map that maps from the NLS-transformed source back to the + * original source. esbuild composes this with its own bundle source map so that + * the final source map points all the way back to the untransformed TypeScript. + */ +function generateNLSSourceMap( + originalSource: string, + filePath: string, + edits: NLSEdit[] +): string { + const generator = new SourceMapGenerator(); + generator.setSourceContent(filePath, originalSource); + + const lineCount = originalSource.split('\n').length; + + // Group edits by line + const editsByLine = new Map(); + for (const edit of edits) { + let arr = editsByLine.get(edit.line); + if (!arr) { + arr = []; + editsByLine.set(edit.line, arr); + } + arr.push(edit); + } + + for (let line = 0; line < lineCount; line++) { + const smLine = line + 1; // source maps use 1-based lines + + // Always map start of line + generator.addMapping({ + generated: { line: smLine, column: 0 }, + original: { line: smLine, column: 0 }, + source: filePath, + }); + + const lineEdits = editsByLine.get(line); + if (lineEdits) { + lineEdits.sort((a, b) => a.startCol - b.startCol); + + let cumulativeShift = 0; + + for (const edit of lineEdits) { + const origLen = edit.endCol - edit.startCol; + + // Map start of edit: the replacement begins at the same original position + generator.addMapping({ + generated: { line: smLine, column: edit.startCol + cumulativeShift }, + original: { line: smLine, column: edit.startCol }, + source: filePath, + }); + + cumulativeShift += edit.newLength - origLen; + + // Map content after edit: columns resume with the shift applied + generator.addMapping({ + generated: { line: smLine, column: edit.endCol + cumulativeShift }, + original: { line: smLine, column: edit.endCol }, + source: filePath, + }); + } + } + } - return { code: model.toString(), entries }; + return generator.toString(); } function replaceInOutput( @@ -300,7 +387,7 @@ export function nlsPlugin(options: NLSPluginOptions): esbuild.Plugin { .replace(/\.ts$/, ''); // Transform localize() calls to placeholders - const { code, entries: fileEntries } = transformToPlaceholders(source, moduleId); + const { code, entries: fileEntries, edits } = transformToPlaceholders(source, moduleId); // Collect entries for (const entry of fileEntries) { @@ -308,7 +395,15 @@ export function nlsPlugin(options: NLSPluginOptions): esbuild.Plugin { } if (fileEntries.length > 0) { - return { contents: code, loader: 'ts' }; + // Generate a source map that maps from the NLS-transformed source + // back to the original. Embed it inline so esbuild composes it + // with its own bundle source map, making the final map point to + // the original TS source. + const sourceName = relativePath.replace(/\\/g, '/'); + const sourcemap = generateNLSSourceMap(source, sourceName, edits); + const encodedMap = Buffer.from(sourcemap).toString('base64'); + const contentsWithMap = code + `\n//# sourceMappingURL=data:application/json;base64,${encodedMap}\n`; + return { contents: contentsWithMap, loader: 'ts' }; } // No NLS calls, return undefined to let esbuild handle normally diff --git a/build/next/private-to-property.ts b/build/next/private-to-property.ts index 64f1c4e74bf97..11f977774a5fd 100644 --- a/build/next/private-to-property.ts +++ b/build/next/private-to-property.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as ts from 'typescript'; +import { type RawSourceMap, type Mapping, SourceMapConsumer, SourceMapGenerator } from 'source-map'; /** * Converts native ES private fields (`#foo`) into regular JavaScript properties with short, @@ -52,12 +53,20 @@ interface Edit { // Private name → replacement name per class (identified by position in file) type ClassScope = Map; +export interface TextEdit { + readonly start: number; + readonly end: number; + readonly newText: string; +} + export interface ConvertPrivateFieldsResult { readonly code: string; readonly classCount: number; readonly fieldCount: number; readonly editCount: number; readonly elapsed: number; + /** Sorted edits applied to the original code, for source map adjustment. */ + readonly edits: readonly TextEdit[]; } /** @@ -72,7 +81,7 @@ export function convertPrivateFields(code: string, filename: string): ConvertPri const t1 = Date.now(); // Quick bail-out: if there are no `#` characters, nothing to do if (!code.includes('#')) { - return { code, classCount: 0, fieldCount: 0, editCount: 0, elapsed: Date.now() - t1 }; + return { code, classCount: 0, fieldCount: 0, editCount: 0, elapsed: Date.now() - t1, edits: [] }; } const sourceFile = ts.createSourceFile(filename, code, ts.ScriptTarget.ESNext, false, ts.ScriptKind.JS); @@ -92,7 +101,7 @@ export function convertPrivateFields(code: string, filename: string): ConvertPri visit(sourceFile); if (edits.length === 0) { - return { code, classCount: 0, fieldCount: 0, editCount: 0, elapsed: Date.now() - t1 }; + return { code, classCount: 0, fieldCount: 0, editCount: 0, elapsed: Date.now() - t1, edits: [] }; } // Apply edits using substring concatenation (O(N+K), not O(N*K) like char-array splice) @@ -105,7 +114,7 @@ export function convertPrivateFields(code: string, filename: string): ConvertPri lastEnd = edit.end; } parts.push(code.substring(lastEnd)); - return { code: parts.join(''), classCount, fieldCount: nameCounter, editCount: edits.length, elapsed: Date.now() - t1 }; + return { code: parts.join(''), classCount, fieldCount: nameCounter, editCount: edits.length, elapsed: Date.now() - t1, edits }; // --- AST walking --- @@ -189,3 +198,110 @@ export function convertPrivateFields(code: string, filename: string): ConvertPri return undefined; } } + +/** + * Adjusts a source map to account for text edits applied to the generated JS. + * + * Each edit replaced a span `[start, end)` in the original generated JS with `newText`. + * This shifts all subsequent columns on the same line. The source map's generated + * columns are updated so they still point to the correct original positions. + * + * @param sourceMapJson The parsed source map JSON object. + * @param originalCode The original generated JS (before edits were applied). + * @param edits The sorted edits that were applied. + * @returns A new source map JSON object with adjusted generated columns. + */ +export function adjustSourceMap( + sourceMapJson: RawSourceMap, + originalCode: string, + edits: readonly TextEdit[] +): RawSourceMap { + if (edits.length === 0) { + return sourceMapJson; + } + + // Build a line-offset table for the original code to convert byte offsets to line/column + const lineStarts: number[] = [0]; + for (let i = 0; i < originalCode.length; i++) { + if (originalCode.charCodeAt(i) === 10 /* \n */) { + lineStarts.push(i + 1); + } + } + + function offsetToLineCol(offset: number): { line: number; col: number } { + let lo = 0, hi = lineStarts.length - 1; + while (lo < hi) { + const mid = (lo + hi + 1) >> 1; + if (lineStarts[mid] <= offset) { + lo = mid; + } else { + hi = mid - 1; + } + } + return { line: lo, col: offset - lineStarts[lo] }; + } + + // Convert edits from byte offsets to per-line column shifts + interface LineEdit { col: number; origLen: number; newLen: number } + const editsByLine = new Map(); + for (const edit of edits) { + const pos = offsetToLineCol(edit.start); + const origLen = edit.end - edit.start; + let arr = editsByLine.get(pos.line); + if (!arr) { + arr = []; + editsByLine.set(pos.line, arr); + } + arr.push({ col: pos.col, origLen, newLen: edit.newText.length }); + } + + // Use source-map library to read, adjust, and write + const consumer = new SourceMapConsumer(sourceMapJson); + const generator = new SourceMapGenerator({ file: sourceMapJson.file }); + + // Copy sourcesContent + for (let i = 0; i < sourceMapJson.sources.length; i++) { + const content = sourceMapJson.sourcesContent?.[i]; + if (content !== null && content !== undefined) { + generator.setSourceContent(sourceMapJson.sources[i], content); + } + } + + // Walk every mapping, adjust the generated column, and add to the new generator + consumer.eachMapping(mapping => { + const lineEdits = editsByLine.get(mapping.generatedLine - 1); // 0-based for our data + const adjustedCol = adjustColumn(mapping.generatedColumn, lineEdits); + + // Some mappings may be unmapped (no original position/source) - skip those. + if (mapping.source !== null && mapping.originalLine !== null && mapping.originalColumn !== null) { + const newMapping: Mapping = { + generated: { line: mapping.generatedLine, column: adjustedCol }, + original: { line: mapping.originalLine, column: mapping.originalColumn }, + source: mapping.source, + }; + if (mapping.name !== null) { + newMapping.name = mapping.name; + } + generator.addMapping(newMapping); + } + }); + + return JSON.parse(generator.toString()); +} + +function adjustColumn(col: number, lineEdits: { col: number; origLen: number; newLen: number }[] | undefined): number { + if (!lineEdits) { + return col; + } + let shift = 0; + for (const edit of lineEdits) { + if (edit.col + edit.origLen <= col) { + shift += edit.newLen - edit.origLen; + } else if (edit.col < col) { + return edit.col + shift; + } else { + break; + } + } + return col + shift; +} diff --git a/build/next/test/nls-sourcemap.test.ts b/build/next/test/nls-sourcemap.test.ts new file mode 100644 index 0000000000000..fd732b8680217 --- /dev/null +++ b/build/next/test/nls-sourcemap.test.ts @@ -0,0 +1,373 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import assert from 'assert'; +import * as esbuild from 'esbuild'; +import * as path from 'path'; +import * as fs from 'fs'; +import * as os from 'os'; +import { type RawSourceMap, SourceMapConsumer } from 'source-map'; +import { nlsPlugin, createNLSCollector, finalizeNLS, postProcessNLS } from '../nls-plugin.ts'; + +// analyzeLocalizeCalls requires the import path to end with `/nls` +const NLS_STUB = [ + 'export function localize(key: string, message: string, ...args: any[]): string {', + '\treturn message;', + '}', + 'export function localize2(key: string, message: string, ...args: any[]): { value: string; original: string } {', + '\treturn { value: message, original: message };', + '}', +].join('\n'); + +interface BundleResult { + js: string; + mapJson: RawSourceMap; + map: SourceMapConsumer; + cleanup: () => void; +} + +/** + * Helper: create a temp directory with source files, bundle with NLS, and return + * the generated JS + parsed source map. The NLS stub is automatically placed at + * `vs/nls.ts` so test files can import from `../vs/nls` (when placed in `test/`). + */ +async function bundleWithNLS( + files: Record, + entryPoint: string, + opts?: { postProcess?: boolean } +): Promise { + const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'nls-sm-test-')); + const srcDir = path.join(tmpDir, 'src'); + const outDir = path.join(tmpDir, 'out'); + await fs.promises.mkdir(srcDir, { recursive: true }); + await fs.promises.mkdir(outDir, { recursive: true }); + + // Write source files (always include the NLS stub at vs/nls.ts) + const allFiles = { 'vs/nls.ts': NLS_STUB, ...files }; + for (const [name, content] of Object.entries(allFiles)) { + const filePath = path.join(srcDir, name); + await fs.promises.mkdir(path.dirname(filePath), { recursive: true }); + await fs.promises.writeFile(filePath, content); + } + + const collector = createNLSCollector(); + + const result = await esbuild.build({ + entryPoints: [path.join(srcDir, entryPoint)], + outfile: path.join(outDir, entryPoint.replace(/\.ts$/, '.js')), + bundle: true, + format: 'esm', + platform: 'neutral', + target: ['es2024'], + packages: 'external', + sourcemap: 'linked', + sourcesContent: true, + write: false, + plugins: [ + nlsPlugin({ baseDir: srcDir, collector }), + ], + tsconfigRaw: JSON.stringify({ + compilerOptions: { + experimentalDecorators: true, + useDefineForClassFields: false + } + }), + logLevel: 'warning', + }); + + let jsContent = ''; + let mapContent = ''; + + for (const file of result.outputFiles!) { + if (file.path.endsWith('.js')) { + jsContent = file.text; + } else if (file.path.endsWith('.map')) { + mapContent = file.text; + } + } + + // Optionally apply NLS post-processing (replaces placeholders with indices) + if (opts?.postProcess) { + const nlsResult = await finalizeNLS(collector, outDir); + jsContent = postProcessNLS(jsContent, nlsResult.indexMap, false); + } + + assert.ok(jsContent, 'Expected JS output'); + assert.ok(mapContent, 'Expected source map output'); + + const mapJson = JSON.parse(mapContent); + const map = new SourceMapConsumer(mapJson); + const cleanup = () => { + fs.rmSync(tmpDir, { recursive: true, force: true }); + }; + + return { js: jsContent, mapJson, map, cleanup }; +} + +/** + * Find the 1-based line number in `text` that contains `needle`. + */ +function findLine(text: string, needle: string): number { + const lines = text.split('\n'); + for (let i = 0; i < lines.length; i++) { + if (lines[i].includes(needle)) { + return i + 1; // 1-based + } + } + throw new Error(`Could not find "${needle}" in text`); +} + +/** + * Find the 0-based column of `needle` within the line that contains it. + */ +function findColumn(text: string, needle: string): number { + const lines = text.split('\n'); + for (const line of lines) { + const col = line.indexOf(needle); + if (col !== -1) { + return col; + } + } + throw new Error(`Could not find "${needle}" in text`); +} + +suite('NLS plugin source maps', () => { + + test('NLS plugin transforms localize calls into placeholders', async () => { + const source = [ + 'import { localize } from "../vs/nls";', + 'export const msg = localize("testKey", "Test Message");', + ].join('\n'); + + const { js, cleanup } = await bundleWithNLS( + { 'test/verify.ts': source }, + 'test/verify.ts', + ); + + try { + assert.ok(js.includes('%%NLS:'), + 'Bundle should contain %%NLS: placeholder.\nActual JS (first 500 chars):\n' + js.substring(0, 500)); + } finally { + cleanup(); + } + }); + + test('file without localize calls has correct source map', async () => { + const source = [ + 'export function add(a: number, b: number): number {', + '\treturn a + b;', + '}', + ].join('\n'); + + const { js, map, cleanup } = await bundleWithNLS( + { 'simple.ts': source }, + 'simple.ts', + ); + + try { + const bundleLine = findLine(js, 'return a + b'); + const bundleCol = findColumn(js, 'return a + b'); + const pos = map.originalPositionFor({ line: bundleLine, column: bundleCol }); + assert.ok(pos.source, 'Should have source'); + assert.strictEqual(pos.line, 2, 'Should map to line 2 of original'); + } finally { + cleanup(); + } + }); + + test('sourcesContent should contain original source, not NLS-transformed', async () => { + const source = [ + 'import { localize } from "../vs/nls";', + 'export const msg = localize("myKey", "Hello World");', + 'export function greet(): string {', + '\treturn msg;', + '}', + ].join('\n'); + + const { mapJson, cleanup } = await bundleWithNLS( + { 'test/greeting.ts': source }, + 'test/greeting.ts', + ); + + try { + const sourcesContent: string[] = mapJson.sourcesContent ?? []; + const sources: string[] = mapJson.sources ?? []; + const greetingIdx = sources.findIndex((s: string) => s.includes('greeting')); + assert.ok(greetingIdx >= 0, 'Should find greeting.ts in sources'); + + const greetingContent = sourcesContent[greetingIdx]; + assert.ok(greetingContent, 'Should have sourcesContent for greeting.ts'); + + assert.ok(!greetingContent.includes('%%NLS:'), + 'sourcesContent should NOT contain NLS placeholder.\nActual:\n' + greetingContent); + assert.ok(greetingContent.includes('localize("myKey", "Hello World")'), + 'sourcesContent should contain the exact original localize call.\nActual:\n' + greetingContent); + } finally { + cleanup(); + } + }); + + test('line mapping correct for code after localize calls', async () => { + const source = [ + 'import { localize } from "../vs/nls";', // 1 + 'const label = localize("key1", "A long message");', // 2 + 'const label2 = localize("key2", "Another message");', // 3 + 'export function computeResult(x: number): number {', // 4 + '\treturn x * 42;', // 5 + '}', // 6 + ].join('\n'); + + const { js, map, cleanup } = await bundleWithNLS( + { 'test/multi.ts': source }, + 'test/multi.ts', + ); + + try { + const bundleLine = findLine(js, 'return x * 42'); + const bundleCol = findColumn(js, 'return x * 42'); + const pos = map.originalPositionFor({ line: bundleLine, column: bundleCol }); + assert.ok(pos.source, 'Should have source'); + assert.strictEqual(pos.line, 5, 'Should map back to line 5'); + } finally { + cleanup(); + } + }); + + test('column mapping for code on same line after localize call', async () => { + // The NLS placeholder is longer than the original key, so column offsets + // for tokens AFTER the localize call on the same line will drift if + // source map mappings point to the NLS-transformed source positions. + const source = [ + 'import { localize } from "../vs/nls";', + 'const x = localize("k", "m"); const z = "FINDME"; export { x, z };', + ].join('\n'); + + const { js, map, cleanup } = await bundleWithNLS( + { 'test/coldrift.ts': source }, + 'test/coldrift.ts', + ); + + try { + assert.ok(js.includes('%%NLS:'), 'Bundle should contain NLS placeholders'); + + const bundleLine = findLine(js, 'FINDME'); + const bundleCol = findColumn(js, '"FINDME"'); + const pos = map.originalPositionFor({ line: bundleLine, column: bundleCol }); + + assert.ok(pos.source, 'Should have source'); + assert.strictEqual(pos.line, 2, 'Should map to line 2'); + + // The original column of "FINDME" in the source + const originalCol = findColumn(source, '"FINDME"'); + + // The mapped column should match the ORIGINAL source positions. + // Allow drift from TS->JS transform (const->var, export removal, etc.) + // but NOT the large NLS placeholder drift (~100+ chars) from before the fix. + const columnDrift = Math.abs(pos.column! - originalCol); + assert.ok(columnDrift <= 20, + `Column should be close to original. Expected ~${originalCol}, got ${pos.column} (drift: ${columnDrift}). ` + + `A drift > 20 indicates the NLS placeholder shift leaked into the source map.`); + } finally { + cleanup(); + } + }); + + test('class with localize - method positions map correctly', async () => { + const source = [ + 'import { localize } from "../vs/nls";', // 1 + '', // 2 + 'export class MyWidget {', // 3 + '\tprivate readonly label = localize("widgetLabel", "My Cool Widget");', // 4 + '', // 5 + '\tconstructor(private readonly name: string) {}', // 6 + '', // 7 + '\tgetDescription(): string {', // 8 + '\t\treturn this.name + ": " + this.label;', // 9 + '\t}', // 10 + '', // 11 + '\tdispose(): void {', // 12 + '\t\tconsole.log("disposed");', // 13 + '\t}', // 14 + '}', // 15 + ].join('\n'); + + const { js, map, cleanup } = await bundleWithNLS( + { 'test/widget.ts': source }, + 'test/widget.ts', + ); + + try { + const bundleLine = findLine(js, '"disposed"'); + const bundleCol = findColumn(js, 'console.log'); + const pos = map.originalPositionFor({ line: bundleLine, column: bundleCol }); + assert.ok(pos.source, 'Should have source'); + assert.strictEqual(pos.line, 13, 'Should map dispose method body to line 13'); + } finally { + cleanup(); + } + }); + + test('many localize calls - line mappings remain correct', async () => { + const source = [ + 'import { localize } from "../vs/nls";', // 1 + '', // 2 + 'const a = localize("a", "Alpha");', // 3 + 'const b = localize("b", "Bravo with a longer message");', // 4 + 'const c = localize("c", "Charlie");', // 5 + 'const d = localize("d", "Delta is the fourth");', // 6 + 'const e = localize("e", "Echo");', // 7 + '', // 8 + 'export function getAll(): string {', // 9 + '\treturn [a, b, c, d, e].join(", ");', // 10 + '}', // 11 + ].join('\n'); + + const { js, map, cleanup } = await bundleWithNLS( + { 'test/many.ts': source }, + 'test/many.ts', + ); + + try { + const bundleLine = findLine(js, '.join(", ")'); + const bundleCol = findColumn(js, '.join(", ")'); + const pos = map.originalPositionFor({ line: bundleLine, column: bundleCol }); + assert.ok(pos.source, 'Should have source'); + assert.strictEqual(pos.line, 10, 'Should map join() back to line 10'); + } finally { + cleanup(); + } + }); + + test('post-processed NLS - source map still has original content', async () => { + const source = [ + 'import { localize } from "../vs/nls";', + 'export const msg = localize("greeting", "Hello World");', + ].join('\n'); + + const { js, mapJson, cleanup } = await bundleWithNLS( + { 'test/post.ts': source }, + 'test/post.ts', + { postProcess: true } + ); + + try { + assert.ok(!js.includes('%%NLS:'), 'JS should not contain NLS placeholders after post-processing'); + + const sources: string[] = mapJson.sources ?? []; + const postIdx = sources.findIndex((s: string) => s.includes('post')); + assert.ok(postIdx >= 0, 'Should find post.ts in sources'); + + const postContent = (mapJson.sourcesContent ?? [])[postIdx]; + assert.ok(postContent, 'Should have sourcesContent for post.ts'); + + assert.ok(postContent.includes('localize("greeting"'), + 'sourcesContent should still contain original localize("greeting") call'); + assert.ok(!postContent.includes('%%NLS:'), + 'sourcesContent should not contain NLS placeholders'); + } finally { + cleanup(); + } + }); +}); diff --git a/build/next/test/private-to-property.test.ts b/build/next/test/private-to-property.test.ts index 3cde63a4bdaf4..aa9da72ce9a51 100644 --- a/build/next/test/private-to-property.test.ts +++ b/build/next/test/private-to-property.test.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; -import { convertPrivateFields } from '../private-to-property.ts'; +import { convertPrivateFields, adjustSourceMap } from '../private-to-property.ts'; +import { SourceMapConsumer, SourceMapGenerator, type RawSourceMap } from 'source-map'; suite('convertPrivateFields', () => { @@ -272,4 +273,184 @@ suite('convertPrivateFields', () => { assert.ok(result.code.includes('$aa')); }); }); + + test('returns edits array', () => { + const code = 'class Foo { #x = 1; get() { return this.#x; } }'; + const result = convertPrivateFields(code, 'test.js'); + assert.strictEqual(result.edits.length, 2); + // Edits should be sorted by start position + assert.ok(result.edits[0].start < result.edits[1].start); + // First edit is the declaration #x, second is the usage this.#x + assert.strictEqual(result.edits[0].newText, '$a'); + assert.strictEqual(result.edits[1].newText, '$a'); + }); + + test('no edits when no private fields', () => { + const code = 'class Foo { x = 1; }'; + const result = convertPrivateFields(code, 'test.js'); + assert.deepStrictEqual(result.edits, []); + }); +}); + +suite('adjustSourceMap', () => { + + /** + * Helper: creates a source map with dense 1:1 mappings (every character) + * for a single-source file. Each column maps generated -> original identity. + */ + function createIdentitySourceMap(code: string, sourceName: string): RawSourceMap { + const gen = new SourceMapGenerator(); + gen.setSourceContent(sourceName, code); + const lines = code.split('\n'); + for (let line = 0; line < lines.length; line++) { + for (let col = 0; col < lines[line].length; col++) { + gen.addMapping({ + generated: { line: line + 1, column: col }, + original: { line: line + 1, column: col }, + source: sourceName, + }); + } + } + return JSON.parse(gen.toString()); + } + + test('no edits - returns mappings unchanged', () => { + const code = 'class Foo { x = 1; }'; + const map = createIdentitySourceMap(code, 'test.js'); + const originalMappings = map.mappings; + const result = adjustSourceMap(map, code, []); + assert.strictEqual(result.mappings, originalMappings); + }); + + test('single edit shrinks token - columns after edit shift left', () => { + // "var #longName = 1; var y = 2;" + // 0 4 14 22 + // After: "var $a = 1; var y = 2;" + // 0 4 7 15 + const code = 'var #longName = 1; var y = 2;'; + // Create a sparse map with mappings only at known token positions + const gen = new SourceMapGenerator(); + gen.setSourceContent('test.js', code); + // Map 'var' at col 0 + gen.addMapping({ generated: { line: 1, column: 0 }, original: { line: 1, column: 0 }, source: 'test.js' }); + // Map '#longName' at col 4 + gen.addMapping({ generated: { line: 1, column: 4 }, original: { line: 1, column: 4 }, source: 'test.js' }); + // Map '=' at col 14 + gen.addMapping({ generated: { line: 1, column: 14 }, original: { line: 1, column: 14 }, source: 'test.js' }); + // Map 'var' at col 19 + gen.addMapping({ generated: { line: 1, column: 19 }, original: { line: 1, column: 19 }, source: 'test.js' }); + // Map 'y' at col 23 + gen.addMapping({ generated: { line: 1, column: 23 }, original: { line: 1, column: 23 }, source: 'test.js' }); + const map = JSON.parse(gen.toString()); + + const result = adjustSourceMap(map, code, [{ start: 4, end: 13, newText: '$a' }]); + + const consumer = new SourceMapConsumer(result); + // 'y' was at gen col 23, edit shrunk 9->2 chars (delta -7), so now at gen col 16 + const pos = consumer.originalPositionFor({ line: 1, column: 16 }); + assert.strictEqual(pos.column, 23, 'y should map back to original column 23'); + + // '=' was at gen col 14, edit shrunk by 7, so now at gen col 7 + const pos2 = consumer.originalPositionFor({ line: 1, column: 7 }); + assert.strictEqual(pos2.column, 14, '= should map back to original column 14'); + }); + + test('edit on line does not affect other lines', () => { + const code = 'class Foo {\n #x = 1;\n get() { return 42; }\n}'; + const map = createIdentitySourceMap(code, 'test.js'); + + const hashPos = code.indexOf('#x'); + const result = adjustSourceMap(map, code, [{ start: hashPos, end: hashPos + 2, newText: '$a' }]); + + const consumer = new SourceMapConsumer(result); + // Line 3 (1-based) should be completely unaffected + const pos = consumer.originalPositionFor({ line: 3, column: 0 }); + assert.strictEqual(pos.line, 3); + assert.strictEqual(pos.column, 0); + }); + + test('multiple edits on same line accumulate shifts', () => { + // "this.#aaa + this.#bbb + this.#ccc;" + // 0 5 11 17 23 29 + const code = 'this.#aaa + this.#bbb + this.#ccc;'; + // Sparse map at token boundaries (not inside edit spans) + const gen = new SourceMapGenerator(); + gen.setSourceContent('test.js', code); + gen.addMapping({ generated: { line: 1, column: 0 }, original: { line: 1, column: 0 }, source: 'test.js' }); // 'this' + gen.addMapping({ generated: { line: 1, column: 5 }, original: { line: 1, column: 5 }, source: 'test.js' }); // '#aaa' + gen.addMapping({ generated: { line: 1, column: 10 }, original: { line: 1, column: 10 }, source: 'test.js' }); // '+' + gen.addMapping({ generated: { line: 1, column: 12 }, original: { line: 1, column: 12 }, source: 'test.js' }); // 'this' + gen.addMapping({ generated: { line: 1, column: 17 }, original: { line: 1, column: 17 }, source: 'test.js' }); // '#bbb' + gen.addMapping({ generated: { line: 1, column: 22 }, original: { line: 1, column: 22 }, source: 'test.js' }); // '+' + gen.addMapping({ generated: { line: 1, column: 24 }, original: { line: 1, column: 24 }, source: 'test.js' }); // 'this' + gen.addMapping({ generated: { line: 1, column: 29 }, original: { line: 1, column: 29 }, source: 'test.js' }); // '#ccc' + gen.addMapping({ generated: { line: 1, column: 33 }, original: { line: 1, column: 33 }, source: 'test.js' }); // ';' + const map = JSON.parse(gen.toString()); + + const edits = [ + { start: 5, end: 9, newText: '$a' }, // #aaa(4) -> $a(2), delta -2 + { start: 17, end: 21, newText: '$b' }, // #bbb(4) -> $b(2), delta -2 + { start: 29, end: 33, newText: '$c' }, // #ccc(4) -> $c(2), delta -2 + ]; + const result = adjustSourceMap(map, code, edits); + + const consumer = new SourceMapConsumer(result); + // After edits: "this.$a + this.$b + this.$c;" + // '#ccc' was at gen col 29, now at 29-2-2=25 + const pos = consumer.originalPositionFor({ line: 1, column: 25 }); + assert.strictEqual(pos.column, 29, 'third edit position should map to original column'); + + // '+' after #bbb was at gen col 22, both prior edits shift by -2 each: 22-4=18 + const pos2 = consumer.originalPositionFor({ line: 1, column: 18 }); + assert.strictEqual(pos2.column, 22, 'plus after second edit should map correctly'); + }); + + test('end-to-end: convertPrivateFields + adjustSourceMap', () => { + const code = [ + 'class MyWidget {', + ' #count = 0;', + ' increment() { this.#count++; }', + ' getValue() { return this.#count; }', + '}', + ].join('\n'); + + const map = createIdentitySourceMap(code, 'widget.js'); + const result = convertPrivateFields(code, 'widget.js'); + + assert.ok(result.edits.length > 0, 'should have edits'); + assert.ok(!result.code.includes('#count'), 'should not contain #count'); + + // Adjust the source map + const adjusted = adjustSourceMap(map, code, result.edits); + const consumer = new SourceMapConsumer(adjusted); + + // Find 'getValue' in the edited output and verify it maps back correctly + const editedLines = result.code.split('\n'); + const getValueLine = editedLines.findIndex(l => l.includes('getValue')); + assert.ok(getValueLine >= 0, 'should find getValue in edited code'); + + const getValueCol = editedLines[getValueLine].indexOf('getValue'); + const pos = consumer.originalPositionFor({ line: getValueLine + 1, column: getValueCol }); + + // getValue was on line 4 (1-based), same column in original + const origLines = code.split('\n'); + const origGetValueCol = origLines[3].indexOf('getValue'); + assert.strictEqual(pos.line, 4, 'getValue should map to original line 4'); + assert.strictEqual(pos.column, origGetValueCol, 'getValue column should match original'); + }); + + test('brand check: #field in obj -> string replacement adjusts map', () => { + const code = 'class C { #x; check(o) { return #x in o; } }'; + const map = createIdentitySourceMap(code, 'test.js'); + + const result = convertPrivateFields(code, 'test.js'); + const adjusted = adjustSourceMap(map, code, result.edits); + const consumer = new SourceMapConsumer(adjusted); + + // 'check' method should still map correctly + const editedCheckCol = result.code.indexOf('check'); + const pos = consumer.originalPositionFor({ line: 1, column: editedCheckCol }); + assert.strictEqual(pos.line, 1); + assert.strictEqual(pos.column, code.indexOf('check')); + }); }); diff --git a/build/next/working.md b/build/next/working.md index 71aac3fbdaf4c..b59b347611dbd 100644 --- a/build/next/working.md +++ b/build/next/working.md @@ -202,31 +202,44 @@ npm run gulp vscode-reh-web-darwin-arm64-min ## Source Maps +### Principle: Every Code Transform Must Preserve Source Maps + +Any step that modifies JS output - whether in an esbuild plugin or in post-processing - **must** update the source map accordingly. Failing to do so causes column drift that makes debuggers, crash reporters, and breakpoints point to wrong positions. The `source-map` library (v0.6.1, already a dependency) provides the `SourceMapConsumer`/`SourceMapGenerator` APIs for this. + +### Root Causes (before fixes) + +Source maps worked in transpile mode but failed in bundle mode. The observed pattern was "class-heavy files fail, simple utilities work" but the real cause was **"files with NLS calls vs files without"**. Class-heavy UI components use `localize()` extensively; utility files in `vs/base/` don't. + +Two categories of corruption: + +1. **NLS plugin `onLoad`** returned modified source without a source map. esbuild treated the NLS-transformed text as the "original" - `sourcesContent` embedded placeholders, and column mappings pointed to wrong positions. + +2. **Post-processing** (`postProcessNLS`, `convertPrivateFields`) modified bundled JS output without updating `.map` files. Column positions drifted by the cumulative length deltas of all replacements. + ### Fixes Applied -1. **`sourcesContent: true`** — Production bundles now embed original TypeScript source content in `.map` files, matching the old build's `includeContent: true` behavior. Without this, crash reports from CDN-hosted source maps can't show original source. +1. **`sourcesContent: true`** - Production bundles embed original TypeScript source content in `.map` files, matching the old build's `includeContent: true` behavior. + +2. **`--source-map-base-url` option** - Rewrites `sourceMappingURL` comments to point to CDN URLs. + +3. **NLS plugin inline source maps** (`nls-plugin.ts`) - The `onLoad` handler now generates an inline source map (`//# sourceMappingURL=data:...`) mapping from NLS-transformed source back to original. esbuild composes this with its own bundle source map. `SourceMapGenerator.setSourceContent` embeds the original source so `sourcesContent` in the final `.map` has the real TypeScript. Tests in `test/nls-sourcemap.test.ts`. -2. **`--source-map-base-url` option** — The `bundle` command accepts an optional `--source-map-base-url ` flag. When set, post-processing rewrites `sourceMappingURL` comments in `.js` and `.css` output files to point to the CDN (e.g., `https://main.vscode-cdn.net/sourcemaps//core/vs/...`). This matches the old build's `sourceMappingURL` function in `minifyTask()`. Wired up in `gulpfile.vscode.ts` for `core-ci-esbuild` and `vscode-esbuild-min` tasks. +4. **`convertPrivateFields` source map adjustment** (`private-to-property.ts`) - `convertPrivateFields` returns its sorted edits as `TextEdit[]`. `adjustSourceMap()` uses `SourceMapConsumer` to walk every mapping, adjusts generated columns based on cumulative edit shifts per line, and rebuilds with `SourceMapGenerator`. The post-processing loop in `index.ts` saves pre-mangle content + edits per JS file, then applies `adjustSourceMap` to the corresponding `.map`. Tests in `test/private-to-property.test.ts`. -### NLS Source Map Accuracy (Decision: Accept Imprecision) +### Not Yet Fixed -**Problem:** `postProcessNLS()` replaces `"%%NLS:moduleId#key%%"` placeholders (~40 chars) with short index values like `null` (4 chars) in the final JS output. This shifts column positions without updating the `.map` files. +**`postProcessNLS` column drift** - Replaces NLS placeholders with short indices in bundled output without updating `.map` files. Shifts columns but never lines, so line-level debugging and crash reporting work correctly. Fixing would require tracking replacement offsets through regex matches and adjusting the source map, similar to `adjustSourceMap`. -**Options considered:** +### Key Technical Details -| Option | Description | Effort | Accuracy | -|--------|-------------|--------|----------| -| A. Fixed-width placeholders | Pad placeholders to match replacement length | Hard — indices unknown until all modules are collected across parallel bundles | Perfect | -| B. Post-process source map | Parse `.map`, track replacement offsets per line, adjust VLQ mappings | Medium | Perfect | -| C. Two-pass build | Assign NLS indices during plugin phase | Not feasible with parallel bundling | N/A | -| **D. Accept imprecision** | NLS replacements only affect column positions; line-level debugging works | Zero | Line-level | +**esbuild `onLoad` source map composition:** esbuild's `onLoad` return type does NOT have a `sourcemap` field (as of v0.27.2). The only way to provide input source maps is to embed them inline in the returned `contents`. esbuild reads this and composes it with its own transform/bundle map. With `sourcesContent: true`, esbuild uses the source content from the inline map, not the `contents` string. -**Decision: Option D — accept imprecision.** Rationale: +**`adjustColumn` algorithm** handles three cases per edit on a line: +1. Edit entirely before the column: accumulate the delta (newLen - origLen) +2. Column falls inside the edit span: map to the start of the edit +3. Edit is after the column: stop (edits are sorted) -- NLS replacements only shift **columns**, never lines — line-level stack traces and breakpoints remain correct. -- Production crash reporting (the primary consumer of CDN source maps) uses line numbers; column-level accuracy is rarely needed. -- The old gulp build had the same fundamental issue in its `nls.nls()` step and used `SourceMapConsumer`/`SourceMapGenerator` to fix it — but that approach was fragile and slow. -- If column-level precision becomes important later (e.g., for minified+NLS bundles), Option B can be implemented: after NLS replacement, re-parse the source map, walk replacement sites, and adjust column offsets. This is a localized change in the post-processing loop. +**Plugin interaction:** Both the NLS plugin and `fileContentMapperPlugin` register `onLoad({ filter: /\.ts$/ })`. In esbuild, the first `onLoad` to return non-`undefined` wins. The NLS plugin is `unshift`ed (runs first), so files with NLS calls skip `fileContentMapperPlugin`. This is safe in practice since `product.ts` (which has `BUILD->INSERT_PRODUCT_CONFIGURATION`) has no localize calls. --- From 234d552954d7ef9e4b619b4defee9c1b27f22262 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Mon, 23 Feb 2026 04:21:39 -0800 Subject: [PATCH 07/28] Use static product info for Show Release Notes command (#296708) --- .../update/browser/update.contribution.ts | 20 +++++++++++-------- .../contrib/update/browser/update.ts | 12 ----------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/contrib/update/browser/update.contribution.ts b/src/vs/workbench/contrib/update/browser/update.contribution.ts index b013e577beb14..35a6855e8f9e4 100644 --- a/src/vs/workbench/contrib/update/browser/update.contribution.ts +++ b/src/vs/workbench/contrib/update/browser/update.contribution.ts @@ -9,7 +9,7 @@ import { Registry } from '../../../../platform/registry/common/platform.js'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from '../../../common/contributions.js'; import { Categories } from '../../../../platform/action/common/actionCommonCategories.js'; import { MenuId, registerAction2, Action2 } from '../../../../platform/actions/common/actions.js'; -import { ProductContribution, UpdateContribution, CONTEXT_UPDATE_STATE, SwitchProductQualityContribution, RELEASE_NOTES_URL, showReleaseNotesInEditor, DOWNLOAD_URL, DefaultAccountUpdateContribution } from './update.js'; +import { ProductContribution, UpdateContribution, CONTEXT_UPDATE_STATE, SwitchProductQualityContribution, showReleaseNotesInEditor, DefaultAccountUpdateContribution } from './update.js'; import { UpdateStatusBarEntryContribution } from './updateStatusBarEntry.js'; import { LifecyclePhase } from '../../../services/lifecycle/common/lifecycle.js'; import product from '../../../../platform/product/common/product.js'; @@ -23,7 +23,6 @@ import { IsWebContext } from '../../../../platform/contextkey/common/contextkeys import { IOpenerService } from '../../../../platform/opener/common/opener.js'; import { IProductService } from '../../../../platform/product/common/productService.js'; import { URI } from '../../../../base/common/uri.js'; -import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js'; const workbench = Registry.as(WorkbenchExtensions.Workbench); @@ -37,6 +36,8 @@ workbench.registerWorkbenchContribution(UpdateStatusBarEntryContribution, Lifecy export class ShowReleaseNotesAction extends Action2 { + static readonly AVAILABLE = !!product.releaseNotesUrl; + constructor() { super({ id: ShowCurrentReleaseNotesActionId, @@ -46,12 +47,10 @@ export class ShowReleaseNotesAction extends Action2 { }, category: { value: product.nameShort, original: product.nameShort }, f1: true, - precondition: RELEASE_NOTES_URL, menu: [{ id: MenuId.MenubarHelpMenu, group: '1_welcome', order: 5, - when: RELEASE_NOTES_URL, }] }); } @@ -100,7 +99,9 @@ export class ShowCurrentReleaseNotesFromCurrentFileAction extends Action2 { } } -registerAction2(ShowReleaseNotesAction); +if (ShowReleaseNotesAction.AVAILABLE) { + registerAction2(ShowReleaseNotesAction); +} registerAction2(ShowCurrentReleaseNotesFromCurrentFileAction); // Update @@ -174,16 +175,17 @@ class RestartToUpdateAction extends Action2 { class DownloadAction extends Action2 { static readonly ID = 'workbench.action.download'; + static readonly AVAILABLE = !!product.downloadUrl; constructor() { super({ id: DownloadAction.ID, title: localize2('openDownloadPage', "Download {0}", product.nameLong), - precondition: ContextKeyExpr.and(IsWebContext, DOWNLOAD_URL), // Only show when running in a web browser and a download url is available + precondition: IsWebContext, // Only show when running in a web browser f1: true, menu: [{ id: MenuId.StatusBarWindowIndicatorMenu, - when: ContextKeyExpr.and(IsWebContext, DOWNLOAD_URL) + when: IsWebContext }] }); } @@ -198,7 +200,9 @@ class DownloadAction extends Action2 { } } -registerAction2(DownloadAction); +if (DownloadAction.AVAILABLE) { + registerAction2(DownloadAction); +} registerAction2(CheckForUpdateAction); registerAction2(DownloadUpdateAction); registerAction2(InstallUpdateAction); diff --git a/src/vs/workbench/contrib/update/browser/update.ts b/src/vs/workbench/contrib/update/browser/update.ts index f21d2bb70abe2..a9a3ee1932ec6 100644 --- a/src/vs/workbench/contrib/update/browser/update.ts +++ b/src/vs/workbench/contrib/update/browser/update.ts @@ -34,8 +34,6 @@ import { IDefaultAccountService } from '../../../../platform/defaultAccount/comm export const CONTEXT_UPDATE_STATE = new RawContextKey('updateState', StateType.Uninitialized); export const MAJOR_MINOR_UPDATE_AVAILABLE = new RawContextKey('majorMinorUpdateAvailable', false); -export const RELEASE_NOTES_URL = new RawContextKey('releaseNotesUrl', ''); -export const DOWNLOAD_URL = new RawContextKey('downloadUrl', ''); let releaseNotesManager: ReleaseNotesManager | undefined = undefined; @@ -184,17 +182,7 @@ export class ProductContribution implements IWorkbenchContribution { @IConfigurationService configurationService: IConfigurationService, @IHostService hostService: IHostService, @IProductService productService: IProductService, - @IContextKeyService contextKeyService: IContextKeyService, ) { - if (productService.releaseNotesUrl) { - const releaseNotesUrlKey = RELEASE_NOTES_URL.bindTo(contextKeyService); - releaseNotesUrlKey.set(productService.releaseNotesUrl); - } - if (productService.downloadUrl) { - const downloadUrlKey = DOWNLOAD_URL.bindTo(contextKeyService); - downloadUrlKey.set(productService.downloadUrl); - } - if (isWeb) { return; } From f8f66efd485089af774f9e51231410a937f44c29 Mon Sep 17 00:00:00 2001 From: mrleemurray Date: Mon, 23 Feb 2026 12:22:35 +0000 Subject: [PATCH 08/28] Remove bottom border from chat tip widget for improved styling --- .../browser/widget/chatContentParts/media/chatTipContent.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTipContent.css b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTipContent.css index fb688523bde10..43a9186f4978c 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTipContent.css +++ b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTipContent.css @@ -67,7 +67,6 @@ background-color: var(--vscode-editorWidget-background); border-radius: var(--vscode-cornerRadius-small) var(--vscode-cornerRadius-small) 0 0; border: 1px solid var(--vscode-editorWidget-border, var(--vscode-input-border, transparent)); - border-bottom: none; font-size: var(--vscode-chat-font-size-body-s); font-family: var(--vscode-chat-font-family, inherit); color: var(--vscode-descriptionForeground); From 89cd7ec4bbca756aca9ccf7891eceb5c93f5e8ae Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 23 Feb 2026 13:00:30 +0100 Subject: [PATCH 09/28] adds screenshot status with url, updates skill --- .github/skills/update-screenshots/SKILL.md | 12 ++++++------ .github/workflows/screenshot-test.yml | 7 +++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/skills/update-screenshots/SKILL.md b/.github/skills/update-screenshots/SKILL.md index f4cac151d61d8..46172cfee2d9b 100644 --- a/.github/skills/update-screenshots/SKILL.md +++ b/.github/skills/update-screenshots/SKILL.md @@ -38,17 +38,17 @@ Pick the most recent run that has a `screenshot-diff` artifact (runs where scree gh run download --name screenshot-diff --dir .tmp/screenshot-diff ``` -This downloads: -- `test/componentFixtures/.screenshots/current/` — the CI-captured screenshots -- `test/componentFixtures/.screenshots/report.json` — structured diff report -- `test/componentFixtures/.screenshots/report.md` — human-readable diff report +The artifact is uploaded from two paths (`test/componentFixtures/.screenshots/current/` and `test/componentFixtures/.screenshots/report/`), but GitHub Actions strips the common prefix. So the downloaded structure is: +- `current/` — the CI-captured screenshots (e.g. `current/baseUI/Buttons/Dark.png`) +- `report/report.json` — structured diff report +- `report/report.md` — human-readable diff report ### 3. Review the changes Show the user what changed by reading the markdown report: ```bash -cat .tmp/screenshot-diff/test/componentFixtures/.screenshots/report.md +cat .tmp/screenshot-diff/report/report.md ``` ### 4. Copy CI screenshots to baseline @@ -56,7 +56,7 @@ cat .tmp/screenshot-diff/test/componentFixtures/.screenshots/report.md ```bash # Remove old baselines and replace with CI screenshots rm -rf test/componentFixtures/.screenshots/baseline/ -cp -r .tmp/screenshot-diff/test/componentFixtures/.screenshots/current/ test/componentFixtures/.screenshots/baseline/ +cp -r .tmp/screenshot-diff/current/ test/componentFixtures/.screenshots/baseline/ ``` ### 5. Clean up diff --git a/.github/workflows/screenshot-test.yml b/.github/workflows/screenshot-test.yml index 7577c67d6bd2c..d6f7edb1cbe88 100644 --- a/.github/workflows/screenshot-test.yml +++ b/.github/workflows/screenshot-test.yml @@ -12,6 +12,7 @@ permissions: contents: read pull-requests: write checks: write + statuses: write concurrency: group: screenshots-${{ github.event.pull_request.number || github.sha }} @@ -110,6 +111,12 @@ jobs: EOF fi + DETAILS_URL="https://hediet-ghartifactpreview.azurewebsites.net/${{ github.repository }}/run/${{ github.run_id }}/component-explorer/___explorer.html?report=./screenshot-report/report.json" + gh api "repos/${{ github.repository }}/statuses/$SHA" \ + --input - < Date: Mon, 23 Feb 2026 14:55:53 +0100 Subject: [PATCH 10/28] feedback (#296979) * feedback * feedback --- .../actionWidget/browser/actionList.ts | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/actionWidget/browser/actionList.ts b/src/vs/platform/actionWidget/browser/actionList.ts index d212e4cd14a0c..6d2cfda35684d 100644 --- a/src/vs/platform/actionWidget/browser/actionList.ts +++ b/src/vs/platform/actionWidget/browser/actionList.ts @@ -617,6 +617,8 @@ export class ActionList extends Disposable { // Keep focus on the filter input if the user is typing a filter. if (filterInputHasFocus) { this._filterInput?.focus(); + // Keep a highlighted item in the list so Enter works without pressing DownArrow first + this._focusCheckedOrFirst(); } else { this._list.domFocus(); // Restore focus to the previously focused item @@ -660,6 +662,8 @@ export class ActionList extends Disposable { focus(): void { if (this._filterInput && this._options?.focusFilterOnOpen) { this._filterInput.focus(); + // Highlight the first item so Enter works immediately + this._focusCheckedOrFirst(); return; } this._list.domFocus(); @@ -678,7 +682,12 @@ export class ActionList extends Disposable { return; } } - this.focusNext(); + // Set focus on the first focusable item without moving DOM focus + this._list.focusFirst(undefined, this.focusCondition); + const focused = this._list.getFocus(); + if (focused.length > 0) { + this._list.reveal(focused[0]); + } } finally { this._suppressHover = false; } @@ -853,7 +862,24 @@ export class ActionList extends Disposable { focusPrevious() { if (this._filterInput && dom.isActiveElement(this._filterInput)) { this._list.domFocus(); - this._list.focusLast(undefined, this.focusCondition); + // An item is already highlighted; advance from it instead of jumping to last + const current = this._list.getFocus(); + if (current.length > 0) { + this._list.focusPrevious(1, false, undefined, this.focusCondition); + const focused = this._list.getFocus(); + // If we couldn't move (already at first), go to filter + if (focused.length > 0 && focused[0] >= current[0]) { + this._filterInput.focus(); + } else if (focused.length > 0) { + this._list.reveal(focused[0]); + } + } else { + this._list.focusLast(undefined, this.focusCondition); + const focused = this._list.getFocus(); + if (focused.length > 0) { + this._list.reveal(focused[0]); + } + } return; } const previousFocus = this._list.getFocus(); @@ -873,7 +899,21 @@ export class ActionList extends Disposable { focusNext() { if (this._filterInput && dom.isActiveElement(this._filterInput)) { this._list.domFocus(); - this._list.focusFirst(undefined, this.focusCondition); + // An item is already highlighted; advance from it instead of jumping to first + const current = this._list.getFocus(); + if (current.length > 0) { + this._list.focusNext(1, false, undefined, this.focusCondition); + const focused = this._list.getFocus(); + if (focused.length > 0) { + this._list.reveal(focused[0]); + } + } else { + this._list.focusFirst(undefined, this.focusCondition); + const focused = this._list.getFocus(); + if (focused.length > 0) { + this._list.reveal(focused[0]); + } + } return; } const previousFocus = this._list.getFocus(); From 66c03bd8e297e58b6680e5cdf6fe95d02be55311 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 23 Feb 2026 14:57:17 +0100 Subject: [PATCH 11/28] handle worktrees in folder picker (#296981) * feat: add folder removal functionality and filter copilot worktrees from recent folders * fix: update hover background color for action list item toolbar --- .../actionWidget/browser/actionWidget.css | 2 +- .../contrib/chat/browser/folderPicker.ts | 32 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/actionWidget/browser/actionWidget.css b/src/vs/platform/actionWidget/browser/actionWidget.css index 41db8e8d87ed1..96fc6cbf50661 100644 --- a/src/vs/platform/actionWidget/browser/actionWidget.css +++ b/src/vs/platform/actionWidget/browser/actionWidget.css @@ -228,7 +228,7 @@ } .action-widget .monaco-list-row .action-list-item-toolbar .monaco-action-bar:not(.vertical) .action-label:not(.disabled):hover{ - background-color: var(--vscode-list-activeSelectionBackground); + background-color: var(--vscode-toolbar-hoverBackground); } .action-widget-delegate-label { diff --git a/src/vs/sessions/contrib/chat/browser/folderPicker.ts b/src/vs/sessions/contrib/chat/browser/folderPicker.ts index dddc95aed2bc1..1080d93df7dce 100644 --- a/src/vs/sessions/contrib/chat/browser/folderPicker.ts +++ b/src/vs/sessions/contrib/chat/browser/folderPicker.ts @@ -18,6 +18,8 @@ import { IWorkspaceContextService } from '../../../../platform/workspace/common/ import { IWorkspacesService, isRecentFolder } from '../../../../platform/workspaces/common/workspaces.js'; import { renderIcon } from '../../../../base/browser/ui/iconLabel/iconLabels.js'; import { INewSession } from './newSession.js'; +import { toAction } from '../../../../base/common/actions.js'; +import { ThemeIcon } from '../../../../base/common/themables.js'; const STORAGE_KEY_LAST_FOLDER = 'agentSessions.lastPickedFolder'; const STORAGE_KEY_RECENT_FOLDERS = 'agentSessions.recentlyPickedFolders'; @@ -83,10 +85,11 @@ export class FolderPicker extends Disposable { } } catch { /* ignore */ } - // Pre-fetch recently opened folders + // Pre-fetch recently opened folders, filtering out copilot worktrees this.workspacesService.getRecentlyOpened().then(recent => { this._cachedRecentFolders = recent.workspaces .filter(isRecentFolder) + .filter(r => !this._isCopilotWorktree(r.folderUri)) .slice(0, MAX_RECENT_FOLDERS) .map(r => ({ uri: r.folderUri, label: r.label })); }).catch(() => { /* ignore */ }); @@ -245,6 +248,12 @@ export class FolderPicker extends Disposable { label, group: { title: '', icon: Codicon.blank }, item: { uri: folder.uri, label }, + toolbarActions: [toAction({ + id: 'folderPicker.remove', + label: localize('folderPicker.remove', "Remove"), + class: ThemeIcon.asClassName(Codicon.close), + run: () => this._removeFolder(folder.uri), + })], }); } @@ -265,6 +274,27 @@ export class FolderPicker extends Disposable { return items; } + private _removeFolder(folderUri: URI): void { + // Remove from recently picked folders + this._recentlyPickedFolders = this._recentlyPickedFolders.filter(f => !isEqual(f, folderUri)); + this.storageService.store(STORAGE_KEY_RECENT_FOLDERS, JSON.stringify(this._recentlyPickedFolders.map(f => f.toString())), StorageScope.PROFILE, StorageTarget.MACHINE); + + // Remove from cached recent folders + this._cachedRecentFolders = this._cachedRecentFolders.filter(f => !isEqual(f.uri, folderUri)); + + // Remove from globally recently opened + this.workspacesService.removeRecentlyOpened([folderUri]); + + // Re-show the picker with updated items + this.actionWidgetService.hide(); + this.showPicker(); + } + + private _isCopilotWorktree(uri: URI): boolean { + const name = basename(uri); + return name.startsWith('copilot-worktree-'); + } + private _updateTriggerLabel(trigger: HTMLElement | undefined): void { if (!trigger) { return; From 059d431feae569cb468998d64ed002b46f22cc5c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 23 Feb 2026 15:03:44 +0100 Subject: [PATCH 12/28] improve opening new session (#296977) * improve opening new session * feedback --- .../contrib/chat/browser/chat.contribution.ts | 2 +- .../contrib/chat/browser/newChatViewPane.ts | 33 ++++-- .../browser/sessionsManagementService.ts | 110 +++++++----------- .../sessions/browser/sessionsViewPane.ts | 2 +- 4 files changed, 69 insertions(+), 78 deletions(-) diff --git a/src/vs/sessions/contrib/chat/browser/chat.contribution.ts b/src/vs/sessions/contrib/chat/browser/chat.contribution.ts index e85e6824b5fc9..53a74696410d5 100644 --- a/src/vs/sessions/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/sessions/contrib/chat/browser/chat.contribution.ts @@ -107,7 +107,7 @@ class NewChatInSessionsWindowAction extends Action2 { override run(accessor: ServicesAccessor): void { const sessionsManagementService = accessor.get(ISessionsManagementService); - sessionsManagementService.openNewSession(); + sessionsManagementService.openNewSessionView(); } } diff --git a/src/vs/sessions/contrib/chat/browser/newChatViewPane.ts b/src/vs/sessions/contrib/chat/browser/newChatViewPane.ts index 521b2e0b00cec..8c8617ccd9b93 100644 --- a/src/vs/sessions/contrib/chat/browser/newChatViewPane.ts +++ b/src/vs/sessions/contrib/chat/browser/newChatViewPane.ts @@ -94,6 +94,7 @@ class NewChatWidget extends Disposable { // Send button private _sendButton: Button | undefined; + private _sending = false; // Repository loading private readonly _openRepositoryCts = this._register(new MutableDisposable()); @@ -324,12 +325,12 @@ class NewChatWidget extends Disposable { } private _updateInputLoadingState(): void { - const loading = this._repositoryLoading || this._branchLoading; + const loading = this._repositoryLoading || this._branchLoading || this._sending; if (loading) { if (!this._loadingDelayDisposable.value) { const timer = setTimeout(() => { this._loadingDelayDisposable.clear(); - if (this._repositoryLoading || this._branchLoading) { + if (this._repositoryLoading || this._branchLoading || this._sending) { this._loadingSpinner?.classList.add('visible'); } }, 500); @@ -759,13 +760,13 @@ class NewChatWidget extends Disposable { return; } const hasText = !!this._editor?.getModel()?.getValue().trim(); - this._sendButton.enabled = hasText && !(this._newSession.value?.disabled ?? true); + this._sendButton.enabled = !this._sending && hasText && !(this._newSession.value?.disabled ?? true); } private _send(): void { const query = this._editor.getModel()?.getValue().trim(); const session = this._newSession.value; - if (!query || !session || session.disabled) { + if (!query || !session || session.disabled || this._sending) { return; } @@ -774,14 +775,26 @@ class NewChatWidget extends Disposable { this._contextAttachments.attachments.length > 0 ? [...this._contextAttachments.attachments] : undefined ); + this._sending = true; + this._editor.updateOptions({ readOnly: true }); + this._updateSendButtonState(); + this._updateInputLoadingState(); + this.sessionsManagementService.sendRequestForNewSession( session.resource - ).catch(e => this.logService.error('Failed to send request:', e)); - - // Clear sent session so a fresh one is created next time - this._newSession.clear(); - this._newSessionListener.clear(); - this._contextAttachments.clear(); + ).then(() => { + // Release ref without disposing - the service owns disposal + this._newSession.clearAndLeak(); + this._newSessionListener.clear(); + this._contextAttachments.clear(); + }, e => { + this.logService.error('Failed to send request:', e); + }).finally(() => { + this._sending = false; + this._editor.updateOptions({ readOnly: false }); + this._updateSendButtonState(); + this._updateInputLoadingState(); + }); } // --- Layout --- diff --git a/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.ts b/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.ts index d6bdaaa60b6d7..6aacdfccc6ce6 100644 --- a/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.ts +++ b/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable, IDisposable } from '../../../../base/common/lifecycle.js'; +import { Disposable, IDisposable, MutableDisposable } from '../../../../base/common/lifecycle.js'; import { CancellationToken } from '../../../../base/common/cancellation.js'; import { IObservable, observableValue } from '../../../../base/common/observable.js'; import { URI } from '../../../../base/common/uri.js'; @@ -12,19 +12,16 @@ import { IContextKey, IContextKeyService, RawContextKey } from '../../../../plat import { ILogService } from '../../../../platform/log/common/log.js'; import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js'; import { ISessionOpenOptions, openSession as openSessionDefault } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessionsOpener.js'; -import { ChatViewId, ChatViewPaneTarget, IChatWidgetService } from '../../../../workbench/contrib/chat/browser/chat.js'; -import { ChatViewPane } from '../../../../workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.js'; -import { IChatSessionItem, IChatSessionProviderOptionItem, IChatSessionsService } from '../../../../workbench/contrib/chat/common/chatSessionsService.js'; +import { ChatViewPaneTarget, IChatWidgetService } from '../../../../workbench/contrib/chat/browser/chat.js'; +import { IChatSessionProviderOptionItem, IChatSessionsService } from '../../../../workbench/contrib/chat/common/chatSessionsService.js'; import { IChatService, IChatSendRequestOptions } from '../../../../workbench/contrib/chat/common/chatService/chatService.js'; import { ChatAgentLocation, ChatModeKind } from '../../../../workbench/contrib/chat/common/constants.js'; import { IAgentSession, isAgentSession } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessionsModel.js'; import { IAgentSessionsService } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessionsService.js'; -import { LocalChatSessionUri } from '../../../../workbench/contrib/chat/common/model/chatUri.js'; import { ICommandService } from '../../../../platform/commands/common/commands.js'; -import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js'; -import { IViewsService } from '../../../../workbench/services/views/common/viewsService.js'; import { AgentSessionProviders } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessions.js'; import { INewSession, LocalNewSession, RemoteNewSession } from '../../chat/browser/newSession.js'; +import { IUriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentity.js'; export const IsNewChatSessionContext = new RawContextKey('isNewChatSession', true); @@ -38,7 +35,8 @@ const repositoryOptionId = 'repository'; * - For agent session items: repository is the workingDirectory from metadata * - For new sessions: repository comes from the session option with id 'repository' */ -export type IActiveSessionItem = (IChatSessionItem | IAgentSession) & { +export type IActiveSessionItem = (INewSession | IAgentSession) & { + readonly label?: string; /** * The repository URI for this session. */ @@ -73,7 +71,7 @@ export interface ISessionsManagementService { * Switch to the new-session view. * No-op if the current session is already a new session. */ - openNewSession(): void; + openNewSessionView(): void; /** * Create a pending session object for the given target type. @@ -103,12 +101,13 @@ export class SessionsManagementService extends Disposable implements ISessionsMa private readonly _activeSession = observableValue(this, undefined); readonly activeSession: IObservable = this._activeSession; - private readonly _newSessions = new Map(); + private readonly _newSession = this._register(new MutableDisposable()); private lastSelectedSession: URI | undefined; private readonly isNewChatSessionContext: IContextKey; constructor( @IStorageService private readonly storageService: IStorageService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, @IAgentSessionsService private readonly agentSessionsService: IAgentSessionsService, @IChatSessionsService private readonly chatSessionsService: IChatSessionsService, @IChatWidgetService private readonly chatWidgetService: IChatWidgetService, @@ -116,8 +115,6 @@ export class SessionsManagementService extends Disposable implements ISessionsMa @IInstantiationService private readonly instantiationService: IInstantiationService, @ILogService private readonly logService: ILogService, @IContextKeyService contextKeyService: IContextKeyService, - @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, - @IViewsService private readonly viewsService: IViewsService, @ICommandService private readonly commandService: ICommandService, ) { super(); @@ -183,7 +180,7 @@ export class SessionsManagementService extends Disposable implements ISessionsMa this.setActiveSession(sessions[0]); this.instantiationService.invokeFunction(openSessionDefault, sessions[0]); } else { - this.openNewSession(); + this.openNewSessionView(); } } @@ -228,25 +225,31 @@ export class SessionsManagementService extends Disposable implements ISessionsMa async openSession(sessionResource: URI, openOptions?: ISessionOpenOptions): Promise { this.isNewChatSessionContext.set(false); - const existingSession = this.agentSessionsService.model.getSession(sessionResource); if (existingSession) { await this.openExistingSession(existingSession, openOptions); - } else if (LocalChatSessionUri.isLocalSession(sessionResource)) { - await this.openLocalSession(); - } else { - await this.openNewRemoteSession(sessionResource); + } else if (this._newSession.value && this.uriIdentityService.extUri.isEqual(sessionResource, this._newSession.value.resource)) { + await this.openNewSession(this._newSession.value); } } async createNewSessionForTarget(target: AgentSessionProviders, sessionResource: URI, defaultRepoUri?: URI): Promise { + if (!this.isNewChatSessionContext.get()) { + this.isNewChatSessionContext.set(true); + } + let newSession: INewSession; if (target === AgentSessionProviders.Background || target === AgentSessionProviders.Local) { newSession = new LocalNewSession(sessionResource, defaultRepoUri, this.chatSessionsService, this.logService); } else { newSession = new RemoteNewSession(sessionResource, target, this.chatSessionsService, this.logService); } - this._newSessions.set(newSession.resource.toString(), newSession); + this._newSession.value = newSession; + this._activeSession.set({ + ...newSession, + repository: newSession.repoUri, + worktree: undefined, + }, undefined); return newSession; } @@ -258,57 +261,37 @@ export class SessionsManagementService extends Disposable implements ISessionsMa await this.instantiationService.invokeFunction(openSessionDefault, session, openOptions); } - /** - * Open a fresh local chat session - show the ChatViewPane and clear the widget. - */ - private async openLocalSession(): Promise { - const view = await this.viewsService.openView(ChatViewId) as ChatViewPane | undefined; - if (view) { - await view.widget.clear(); - if (view.widget.viewModel) { - const folder = this.workspaceContextService.getWorkspace().folders[0]; - const activeSessionItem: IActiveSessionItem = { - resource: view.widget.viewModel.sessionResource, - label: view.widget.viewModel.model.title || '', - timing: view.widget.viewModel.model.timing, - repository: folder?.uri, - worktree: undefined - }; - this._activeSession.set(activeSessionItem, undefined); - } - } - } - /** * Open a new remote session - load the model first, then show it in the ChatViewPane. */ - private async openNewRemoteSession(sessionResource: URI): Promise { - const modelRef = await this.chatService.acquireOrLoadSession(sessionResource, ChatAgentLocation.Chat, CancellationToken.None); + private async openNewSession(newSession: INewSession): Promise { + this._activeSession.set({ + ...newSession, + repository: newSession.repoUri, + worktree: undefined, + }, undefined); + const sessionResource = newSession.resource; const chatWidget = await this.chatWidgetService.openSession(sessionResource, ChatViewPaneTarget); if (!chatWidget?.viewModel) { this.logService.warn(`[ActiveSessionService] Failed to open session: ${sessionResource.toString()}`); - modelRef?.dispose(); return; } const repository = this.getRepositoryFromSessionOption(sessionResource); - const activeSessionItem: IActiveSessionItem = { - resource: sessionResource, - label: chatWidget.viewModel.model.title || '', - timing: chatWidget.viewModel.model.timing, - repository, - worktree: undefined - }; this.logService.info(`[ActiveSessionService] Active session changed (new): ${sessionResource.toString()}, repository: ${repository?.toString() ?? 'none'}`); - this._activeSession.set(activeSessionItem, undefined); } async sendRequestForNewSession(sessionResource: URI): Promise { - const session = this._newSessions.get(sessionResource.toString()); + const session = this._newSession.value; if (!session) { this.logService.error(`[SessionsManagementService] No new session found for resource: ${sessionResource.toString()}`); return; } + if (!this.uriIdentityService.extUri.isEqual(sessionResource, session.resource)) { + this.logService.error(`[SessionsManagementService] Session resource mismatch. Expected: ${session.resource.toString()}, received: ${sessionResource.toString()}`); + return; + } + const query = session.query; if (!query) { this.logService.error('[SessionsManagementService] No query set on session'); @@ -330,25 +313,20 @@ export class SessionsManagementService extends Disposable implements ISessionsMa attachedContext: session.attachedContext, }; - await this.sendCustomSession(sessionResource, query, sendOptions, session.selectedOptions); + await this.chatSessionsService.getOrCreateChatSession(session.resource, CancellationToken.None); + await this.doSendRequestForNewSession(session, query, sendOptions, session.selectedOptions); - // Clean up the session after sending - this._newSessions.delete(sessionResource.toString()); - session.dispose(); + // Clean up the session after sending (setter disposes the previous value) + this._newSession.value = undefined; } - /** - * Custom sessions (worktree, cloud, etc.) go through the chat service. - * Options have already been applied via setOption during session configuration. - * Send the request, then wait for the extension to create an agent session. - */ - private async sendCustomSession(sessionResource: URI, query: string, sendOptions: IChatSendRequestOptions, selectedOptions?: ReadonlyMap): Promise { + private async doSendRequestForNewSession(session: INewSession, query: string, sendOptions: IChatSendRequestOptions, selectedOptions?: ReadonlyMap): Promise { // 1. Open the session - loads the model and shows the ChatViewPane - await this.openSession(sessionResource); + await this.openSession(session.resource); // 2. Apply selected options (repository, branch, etc.) to the contributed session if (selectedOptions && selectedOptions.size > 0) { - const modelRef = this.chatService.acquireExistingSession(sessionResource); + const modelRef = this.chatService.acquireExistingSession(session.resource); if (modelRef) { const model = modelRef.object; const contributedSession = model.contributedChatSession; @@ -369,7 +347,7 @@ export class SessionsManagementService extends Disposable implements ISessionsMa const existingResources = new Set( this.agentSessionsService.model.sessions.map(s => s.resource.toString()) ); - const result = await this.chatService.sendRequest(sessionResource, query, sendOptions); + const result = await this.chatService.sendRequest(session.resource, query, sendOptions); if (result.kind === 'rejected') { this.logService.error(`[ActiveSessionService] sendRequest rejected: ${result.reason}`); return; @@ -403,7 +381,7 @@ export class SessionsManagementService extends Disposable implements ISessionsMa } } - openNewSession(): void { + openNewSessionView(): void { // No-op if the current session is already a new session if (this.isNewChatSessionContext.get()) { return; diff --git a/src/vs/sessions/contrib/sessions/browser/sessionsViewPane.ts b/src/vs/sessions/contrib/sessions/browser/sessionsViewPane.ts index d9860c68197ee..367ee4382c68a 100644 --- a/src/vs/sessions/contrib/sessions/browser/sessionsViewPane.ts +++ b/src/vs/sessions/contrib/sessions/browser/sessionsViewPane.ts @@ -104,7 +104,7 @@ export class AgenticSessionsViewPane extends ViewPane { const newSessionButtonContainer = DOM.append(sessionsContent, $('.agent-sessions-new-button-container')); const newSessionButton = this._register(new Button(newSessionButtonContainer, { ...defaultButtonStyles, secondary: true })); newSessionButton.label = localize('newSession', "New Session"); - this._register(newSessionButton.onDidClick(() => this.activeSessionService.openNewSession())); + this._register(newSessionButton.onDidClick(() => this.activeSessionService.openNewSessionView())); // Keybinding hint inside the button const keybinding = this.keybindingService.lookupKeybinding(ACTION_ID_NEW_CHAT); From a609cbda949dc2142159099522f2217890603a94 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 23 Feb 2026 15:25:55 +0100 Subject: [PATCH 13/28] sessions - support to open a session in a protocol link opened window (#296962) --- src/vs/code/electron-main/app.ts | 15 +++++++++++++++ .../contrib/chat/browser/chat.contribution.ts | 6 +++++- .../chat/electron-browser/chat.contribution.ts | 13 +++++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index f80b86e9a8c51..05de6d1c46f1e 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -110,6 +110,7 @@ import { ExtensionsScannerService } from '../../platform/extensionManagement/nod import { UserDataProfilesHandler } from '../../platform/userDataProfile/electron-main/userDataProfilesHandler.js'; import { ProfileStorageChangesListenerChannel } from '../../platform/userDataProfile/electron-main/userDataProfileStorageIpc.js'; import { Promises, RunOnceScheduler, runWhenGlobalIdle } from '../../base/common/async.js'; +import { CancellationToken } from '../../base/common/cancellation.js'; import { resolveMachineId, resolveSqmId, resolveDevDeviceId, validateDevDeviceId } from '../../platform/telemetry/electron-main/telemetryUtils.js'; import { ExtensionsProfileScannerService } from '../../platform/extensionManagement/node/extensionsProfileScannerService.js'; import { LoggerChannel } from '../../platform/log/electron-main/logIpc.js'; @@ -927,6 +928,15 @@ export class CodeApplication extends Disposable { this.environmentMainService.continueOn = continueOn ?? undefined; } + // Extract session parameter to open a specific chat session in the target window + const session = params.get('session'); + if (session !== null) { + this.logService.trace(`app#handleProtocolUrl() found 'session' as parameter:`, uri.toString(true)); + + params.delete('session'); + uri = uri.with({ query: params.toString() }); + } + // Check if the protocol URL is a window openable to open... const windowOpenableFromProtocolUrl = this.getWindowOpenableFromProtocolUrl(uri); if (windowOpenableFromProtocolUrl) { @@ -948,6 +958,11 @@ export class CodeApplication extends Disposable { window?.focus(); // this should help ensuring that the right window gets focus when multiple are opened + // Open chat session in the target window if requested + if (window && session) { + window.sendWhenReady('vscode:openChatSession', CancellationToken.None, session); + } + return true; } } diff --git a/src/vs/sessions/contrib/chat/browser/chat.contribution.ts b/src/vs/sessions/contrib/chat/browser/chat.contribution.ts index 53a74696410d5..f0276cdacdc55 100644 --- a/src/vs/sessions/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/sessions/contrib/chat/browser/chat.contribution.ts @@ -76,11 +76,15 @@ export class OpenSessionWorktreeInVSCodeAction extends Action2 { ? 'vscode-exploration' : 'vscode-insiders'; + const params = new URLSearchParams(); + params.set('windowId', '_blank'); + params.set('session', activeSession.resource.toString()); + await openerService.open(URI.from({ scheme, authority: Schemas.file, path: folderUri.path, - query: 'windowId=_blank', + query: params.toString(), }), { openExternal: true }); } } diff --git a/src/vs/workbench/contrib/chat/electron-browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/electron-browser/chat.contribution.ts index ae0c91cc93444..4ec33cc52a33a 100644 --- a/src/vs/workbench/contrib/chat/electron-browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/electron-browser/chat.contribution.ts @@ -24,7 +24,7 @@ import { IExtensionService } from '../../../services/extensions/common/extension import { IWorkbenchLayoutService } from '../../../services/layout/browser/layoutService.js'; import { ILifecycleService, ShutdownReason } from '../../../services/lifecycle/common/lifecycle.js'; import { ACTION_ID_NEW_CHAT, CHAT_OPEN_ACTION_ID, IChatViewOpenOptions } from '../browser/actions/chatActions.js'; -import { IChatWidgetService } from '../browser/chat.js'; +import { ChatViewPaneTarget, IChatWidgetService } from '../browser/chat.js'; import { AgentSessionProviders } from '../browser/agentSessions/agentSessions.js'; import { isSessionInProgressStatus } from '../browser/agentSessions/agentSessionsModel.js'; import { IAgentSessionsService } from '../browser/agentSessions/agentSessionsService.js'; @@ -47,7 +47,8 @@ class ChatCommandLineHandler extends Disposable { @IWorkspaceTrustRequestService private readonly workspaceTrustRequestService: IWorkspaceTrustRequestService, @ILogService private readonly logService: ILogService, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, - @IContextKeyService private readonly contextKeyService: IContextKeyService + @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IChatWidgetService private readonly chatWidgetService: IChatWidgetService ) { super(); @@ -61,6 +62,14 @@ class ChatCommandLineHandler extends Disposable { this.prompt(chatArgs); }); + + ipcRenderer.on('vscode:openChatSession', (_, ...args: unknown[]) => { + const sessionUriString = args[0] as string; + this.logService.trace('vscode:openChatSession', sessionUriString); + + const sessionResource = URI.parse(sessionUriString); + this.chatWidgetService.openSession(sessionResource, ChatViewPaneTarget); + }); } private async prompt(args: typeof this.environmentService.args.chat): Promise { From 68703b589081faf9f6b33c7f84be39e5c8c0658e Mon Sep 17 00:00:00 2001 From: Kyle Cutler <67761731+kycutler@users.noreply.github.com> Date: Mon, 23 Feb 2026 06:57:07 -0800 Subject: [PATCH 14/28] Agentic browser (#296665) * Browser: preparation for tools * feedback, fix build * fix * fix * Agentic browser * feedback * feedback * feedback --- .../common/browserViewTelemetry.ts | 50 +++++++ .../electron-main/browserViewMainService.ts | 7 +- .../browserView/node/playwrightService.ts | 20 +-- .../contrib/browserView/common/browserView.ts | 65 ++++++++- .../electron-browser/browserEditor.ts | 96 ++++++++++++- .../electron-browser/browserEditorInput.ts | 2 +- .../browserView.contribution.ts | 15 +- .../electron-browser/browserViewActions.ts | 2 +- .../electron-browser/browserViewTelemetry.ts | 45 ------ .../electron-browser/media/browser.css | 95 ++++++++++++- .../tools/browserToolHelpers.ts | 40 ++++++ .../tools/browserTools.contribution.ts | 134 ++++++++++++++++++ .../tools/clickBrowserTool.ts | 95 +++++++++++++ .../electron-browser/tools/dragElementTool.ts | 95 +++++++++++++ .../tools/handleDialogBrowserTool.ts | 85 +++++++++++ .../tools/hoverElementTool.ts | 78 ++++++++++ .../tools/navigateBrowserTool.ts | 109 ++++++++++++++ .../electron-browser/tools/openBrowserTool.ts | 73 ++++++++++ .../electron-browser/tools/readBrowserTool.ts | 72 ++++++++++ .../tools/runPlaywrightCodeTool.ts | 107 ++++++++++++++ .../tools/screenshotBrowserTool.ts | 92 ++++++++++++ .../electron-browser/tools/typeBrowserTool.ts | 107 ++++++++++++++ 22 files changed, 1413 insertions(+), 71 deletions(-) create mode 100644 src/vs/platform/browserView/common/browserViewTelemetry.ts delete mode 100644 src/vs/workbench/contrib/browserView/electron-browser/browserViewTelemetry.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/browserToolHelpers.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/browserTools.contribution.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/clickBrowserTool.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/dragElementTool.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/handleDialogBrowserTool.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/hoverElementTool.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/navigateBrowserTool.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/openBrowserTool.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/readBrowserTool.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/runPlaywrightCodeTool.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/screenshotBrowserTool.ts create mode 100644 src/vs/workbench/contrib/browserView/electron-browser/tools/typeBrowserTool.ts diff --git a/src/vs/platform/browserView/common/browserViewTelemetry.ts b/src/vs/platform/browserView/common/browserViewTelemetry.ts new file mode 100644 index 0000000000000..f261d0261a20b --- /dev/null +++ b/src/vs/platform/browserView/common/browserViewTelemetry.ts @@ -0,0 +1,50 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ITelemetryService } from '../../telemetry/common/telemetry.js'; + +/** Source of an Integrated Browser open event. */ +export type IntegratedBrowserOpenSource = + /** Created via CDP, such as by the agent using Playwright tools. */ + | 'cdpCreated' + /** Opened via the "Open Integrated Browser" command without a URL argument. + * This typically means the user ran the command manually from the Command Palette. */ + | 'commandWithoutUrl' + /** Opened via the "Open Integrated Browser" command with a URL argument. + * This typically means another extension or component invoked the command programmatically. */ + | 'commandWithUrl' + /** Opened via the "New Tab" command from an existing tab. */ + | 'newTabCommand' + /** Opened via the localhost link opener when the `workbench.browser.openLocalhostLinks` setting + * is enabled. This happens when clicking localhost links from the terminal, chat, or other sources. */ + | 'localhostLinkOpener' + /** Opened when clicking a link inside the Integrated Browser that opens in a new focused editor + * (e.g., links with target="_blank"). */ + | 'browserLinkForeground' + /** Opened when clicking a link inside the Integrated Browser that opens in a new background editor + * (e.g., Ctrl/Cmd+click). */ + | 'browserLinkBackground' + /** Opened when clicking a link inside the Integrated Browser that opens in a new window + * (e.g., Shift+click). */ + | 'browserLinkNewWindow' + /** Opened when the user copies a browser editor to a new window via "Copy into New Window". */ + | 'copyToNewWindow'; + +type IntegratedBrowserOpenEvent = { + source: IntegratedBrowserOpenSource; +}; + +type IntegratedBrowserOpenClassification = { + source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'How the Integrated Browser was opened' }; + owner: 'jruales'; + comment: 'Tracks how users open the Integrated Browser'; +}; + +export function logBrowserOpen(telemetryService: ITelemetryService, source: IntegratedBrowserOpenSource): void { + telemetryService.publicLog2( + 'integratedBrowser.open', + { source } + ); +} diff --git a/src/vs/platform/browserView/electron-main/browserViewMainService.ts b/src/vs/platform/browserView/electron-main/browserViewMainService.ts index 68e97b58b4f47..7db0af2ac3451 100644 --- a/src/vs/platform/browserView/electron-main/browserViewMainService.ts +++ b/src/vs/platform/browserView/electron-main/browserViewMainService.ts @@ -17,6 +17,8 @@ import { IWindowsMainService } from '../../windows/electron-main/windows.js'; import { BrowserSession } from './browserSession.js'; import { IProductService } from '../../product/common/productService.js'; import { CDPBrowserProxy } from '../common/cdp/proxy.js'; +import { logBrowserOpen } from '../common/browserViewTelemetry.js'; +import { ITelemetryService } from '../../telemetry/common/telemetry.js'; export const IBrowserViewMainService = createDecorator('browserViewMainService'); @@ -50,7 +52,8 @@ export class BrowserViewMainService extends Disposable implements IBrowserViewMa @IEnvironmentMainService private readonly environmentMainService: IEnvironmentMainService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IWindowsMainService private readonly windowsMainService: IWindowsMainService, - @IProductService private readonly productService: IProductService + @IProductService private readonly productService: IProductService, + @ITelemetryService private readonly telemetryService: ITelemetryService ) { super(); } @@ -162,6 +165,8 @@ export class BrowserViewMainService extends Disposable implements IBrowserViewMa // Create the browser view (fires onTargetCreated) const view = this.createBrowserView(targetId, browserSession); + logBrowserOpen(this.telemetryService, 'cdpCreated'); + // Request the workbench to open the editor this.windowsMainService.sendToFocused('vscode:runAction', { id: 'vscode.open', diff --git a/src/vs/platform/browserView/node/playwrightService.ts b/src/vs/platform/browserView/node/playwrightService.ts index a2b807cf01b27..283fc610895d5 100644 --- a/src/vs/platform/browserView/node/playwrightService.ts +++ b/src/vs/platform/browserView/node/playwrightService.ts @@ -141,7 +141,12 @@ export class PlaywrightService extends Disposable implements IPlaywrightService result = err instanceof Error ? err.message : String(err); } - const summary = await this._pages.getSummary(pageId); + let summary; + try { + summary = await this._pages.getSummary(pageId); + } catch (err: unknown) { + summary = err instanceof Error ? err.message : String(err); + } return { result, summary }; } catch (err: unknown) { const errorMessage = err instanceof Error ? err.message : String(err); @@ -292,7 +297,7 @@ class PlaywrightPageManager extends Disposable { this._trackedPages.add(viewId); this._fireTrackedPagesChanged(); - await page.goto(url, { waitUntil: 'domcontentloaded' }); + await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 }); return viewId; } @@ -434,12 +439,7 @@ class PlaywrightPageManager extends Disposable { return queued.page.p; } - if (this._trackedPages.has(viewId) && this._group) { - await this._addPageToGroup(viewId); - return this.getPage(viewId); - } - - throw new Error(`Page "${viewId}" has not been added to the Playwright service`); + throw new Error(`Page "${viewId}" not found`); } /** @@ -481,6 +481,8 @@ class PlaywrightPageManager extends Disposable { this._pageToViewId.delete(page); } this._viewIdToPage.delete(viewId); + this._trackedPages.delete(viewId); + this._fireTrackedPagesChanged(); } private onPageAdded(page: Page, timeoutMs = 10000): Promise { @@ -516,6 +518,8 @@ class PlaywrightPageManager extends Disposable { const viewId = this._pageToViewId.get(page); if (viewId) { this._viewIdToPage.delete(viewId); + this._trackedPages.delete(viewId); + this._fireTrackedPagesChanged(); } this._pageToViewId.delete(page); } diff --git a/src/vs/workbench/contrib/browserView/common/browserView.ts b/src/vs/workbench/contrib/browserView/common/browserView.ts index 8615e08cc6717..c231150b6030a 100644 --- a/src/vs/workbench/contrib/browserView/common/browserView.ts +++ b/src/vs/workbench/contrib/browserView/common/browserView.ts @@ -8,6 +8,9 @@ import { Emitter, Event } from '../../../../base/common/event.js'; import { Disposable, IDisposable } from '../../../../base/common/lifecycle.js'; import { VSBuffer } from '../../../../base/common/buffer.js'; import { IPlaywrightService } from '../../../../platform/browserView/common/playwrightService.js'; +import { IDialogService } from '../../../../platform/dialogs/common/dialogs.js'; +import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js'; +import { localize } from '../../../../nls.js'; import { IBrowserViewBounds, IBrowserViewNavigationEvent, @@ -44,6 +47,19 @@ type IntegratedBrowserNavigationClassification = { comment: 'Tracks navigation patterns in integrated browser'; }; + +type IntegratedBrowserShareWithAgentEvent = { + shared: boolean; + dontAskAgain: boolean; +}; + +type IntegratedBrowserShareWithAgentClassification = { + shared: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the content was shared with the agent' }; + dontAskAgain: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Whether the user chose to not be asked again' }; + owner: 'kycutler'; + comment: 'Tracks user choices around sharing browser content with agents'; +}; + export const IBrowserViewWorkbenchService = createDecorator('browserViewWorkbenchService'); /** @@ -154,7 +170,9 @@ export class BrowserViewModel extends Disposable implements IBrowserViewModel { @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService, @ITelemetryService private readonly telemetryService: ITelemetryService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IPlaywrightService private readonly playwrightService: IPlaywrightService + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + @IDialogService private readonly dialogService: IDialogService, + @IStorageService private readonly storageService: IStorageService, ) { super(); } @@ -360,8 +378,53 @@ export class BrowserViewModel extends Disposable implements IBrowserViewModel { return this.browserViewService.clearStorage(this.id); } + private static readonly SHARE_DONT_ASK_KEY = 'browserView.shareWithAgent.dontAskAgain'; + async setSharedWithAgent(shared: boolean): Promise { if (shared) { + const storedChoice = this.storageService.getBoolean(BrowserViewModel.SHARE_DONT_ASK_KEY, StorageScope.PROFILE); + + if (!storedChoice) { + // First time (or no stored preference) -- ask. + const result = await this.dialogService.confirm({ + type: 'question', + title: localize('browserView.shareWithAgent.title', 'Share with Agent?'), + message: localize('browserView.shareWithAgent.message', 'Share this browser page with the agent?'), + detail: localize( + 'browserView.shareWithAgent.detail', + 'The agent will be able to read and modify browser content and saved data, including cookies.' + ), + primaryButton: localize('browserView.shareWithAgent.allow', '&&Allow'), + cancelButton: localize('browserView.shareWithAgent.deny', 'Deny'), + checkbox: { label: localize('browserView.shareWithAgent.dontAskAgain', "Don't ask again"), checked: false }, + }); + + // Only persist "don't ask again" if user accepted sharing, so the button doesn't just do nothing. + if (result.confirmed && result.checkboxChecked) { + this.storageService.store(BrowserViewModel.SHARE_DONT_ASK_KEY, result.confirmed, StorageScope.PROFILE, StorageTarget.USER); + } + + this.telemetryService.publicLog2( + 'integratedBrowser.shareWithAgent', + { + shared: result.confirmed, + dontAskAgain: result.checkboxChecked ?? false + } + ); + + if (!result.confirmed) { + return; + } + } else { + this.telemetryService.publicLog2( + 'integratedBrowser.shareWithAgent', + { + shared: true, + dontAskAgain: true + } + ); + } + await this.playwrightService.startTrackingPage(this.id); } else { await this.playwrightService.stopTrackingPage(this.id); diff --git a/src/vs/workbench/contrib/browserView/electron-browser/browserEditor.ts b/src/vs/workbench/contrib/browserView/electron-browser/browserEditor.ts index 28c2dd24f25ee..4adcebc35a11f 100644 --- a/src/vs/workbench/contrib/browserView/electron-browser/browserEditor.ts +++ b/src/vs/workbench/contrib/browserView/electron-browser/browserEditor.ts @@ -6,9 +6,10 @@ import './media/browser.css'; import { localize } from '../../../../nls.js'; import { $, addDisposableListener, Dimension, EventType, IDomPosition, registerExternalFocusChecker } from '../../../../base/browser/dom.js'; +import { Button } from '../../../../base/browser/ui/button/button.js'; import { renderIcon } from '../../../../base/browser/ui/iconLabel/iconLabels.js'; import { CancellationToken, CancellationTokenSource } from '../../../../base/common/cancellation.js'; -import { RawContextKey, IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js'; +import { RawContextKey, IContextKey, IContextKeyService, ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js'; import { MenuId } from '../../../../platform/actions/common/actions.js'; import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; import { ServiceCollection } from '../../../../platform/instantiation/common/serviceCollection.js'; @@ -44,8 +45,10 @@ import { Codicon } from '../../../../base/common/codicons.js'; import { encodeBase64, VSBuffer } from '../../../../base/common/buffer.js'; import { IChatRequestVariableEntry } from '../../chat/common/attachments/chatVariableEntries.js'; import { IElementAncestor, IElementData, IBrowserTargetLocator, getDisplayNameFromOuterHTML } from '../../../../platform/browserElements/common/browserElements.js'; -import { logBrowserOpen } from './browserViewTelemetry.js'; +import { logBrowserOpen } from '../../../../platform/browserView/common/browserViewTelemetry.js'; import { URI } from '../../../../base/common/uri.js'; +import { ChatConfiguration } from '../../chat/common/constants.js'; +import { Event } from '../../../../base/common/event.js'; export const CONTEXT_BROWSER_CAN_GO_BACK = new RawContextKey('browserCanGoBack', false, localize('browser.canGoBack', "Whether the browser can go back")); export const CONTEXT_BROWSER_CAN_GO_FORWARD = new RawContextKey('browserCanGoForward', false, localize('browser.canGoForward', "Whether the browser can go forward")); @@ -59,6 +62,16 @@ export const CONTEXT_BROWSER_ELEMENT_SELECTION_ACTIVE = new RawContextKey { + const agentSharingKeys = new Set(canShareBrowserWithAgentContext.keys()); + return Event.filter(contextKeyService.onDidChangeContext, e => e.affectsSome(agentSharingKeys)); +} + /** * Get the original implementation of HTMLElement focus (without window auto-focusing) * before it gets overridden by the workbench. @@ -67,12 +80,15 @@ const originalHtmlElementFocus = HTMLElement.prototype.focus; class BrowserNavigationBar extends Disposable { private readonly _urlInput: HTMLInputElement; + private readonly _shareButton: Button; + private readonly _shareButtonContainer: HTMLElement; constructor( editor: BrowserEditor, container: HTMLElement, instantiationService: IInstantiationService, - scopedContextKeyService: IContextKeyService + scopedContextKeyService: IContextKeyService, + configurationService: IConfigurationService ) { super(); @@ -104,11 +120,28 @@ class BrowserNavigationBar extends Disposable { } )); + // URL input container (wraps input + share toggle) + const urlContainer = $('.browser-url-container'); + // URL input this._urlInput = $('input.browser-url-input'); this._urlInput.type = 'text'; this._urlInput.placeholder = localize('browser.urlPlaceholder', "Enter a URL"); + // Share toggle button (inside URL bar, right side) + this._shareButtonContainer = $('.browser-share-toggle-container'); + this._shareButton = this._register(new Button(this._shareButtonContainer, { + supportIcons: true, + title: localize('browser.shareWithAgent', "Share with Agent"), + small: true, + hoverDelegate + })); + this._shareButton.element.classList.add('browser-share-toggle'); + this._shareButton.label = '$(agent)'; + + urlContainer.appendChild(this._urlInput); + urlContainer.appendChild(this._shareButtonContainer); + // Create actions toolbar (right side) with scoped context const actionsContainer = $('.browser-actions-toolbar'); const actionsToolbar = this._register(scopedInstantiationService.createInstance( @@ -126,9 +159,9 @@ class BrowserNavigationBar extends Disposable { navToolbar.context = editor; actionsToolbar.context = editor; - // Assemble layout: nav | url | actions + // Assemble layout: nav | url container | actions container.appendChild(navContainer); - container.appendChild(this._urlInput); + container.appendChild(urlContainer); container.appendChild(actionsContainer); // Setup URL input handler @@ -145,6 +178,33 @@ class BrowserNavigationBar extends Disposable { this._register(addDisposableListener(this._urlInput, EventType.FOCUS, () => { this._urlInput.select(); })); + + // Share toggle click handler + this._register(this._shareButton.onDidClick(() => { + editor.toggleShareWithAgent(); + })); + + // Show share button only when chat is enabled and browser tools are enabled + const updateShareButtonVisibility = () => { + this._shareButtonContainer.style.display = scopedContextKeyService.contextMatchesRules(canShareBrowserWithAgentContext) ? '' : 'none'; + }; + updateShareButtonVisibility(); + this._register(watchForAgentSharingContextChanges(scopedContextKeyService)(() => { + updateShareButtonVisibility(); + })); + } + + /** + * Update the share toggle visual state + */ + setShared(isShared: boolean): void { + this._shareButton.checked = isShared; + this._shareButton.label = isShared + ? localize('browser.sharingWithAgent', "Sharing with Agent") + ' $(agent)' + : '$(agent)'; + this._shareButton.setTitle(isShared + ? localize('browser.unshareWithAgent', "Stop Sharing with Agent") + : localize('browser.shareWithAgent', "Share with Agent")); } /** @@ -244,7 +304,7 @@ export class BrowserEditor extends EditorPane { const toolbar = $('.browser-toolbar'); // Create navigation bar widget with scoped context - this._navigationBar = this._register(new BrowserNavigationBar(this, toolbar, this.instantiationService, contextKeyService)); + this._navigationBar = this._register(new BrowserNavigationBar(this, toolbar, this.instantiationService, contextKeyService, this.configurationService)); root.appendChild(toolbar); @@ -332,6 +392,7 @@ export class BrowserEditor extends EditorPane { this._storageScopeContext.set(this._model.storageScope); this._devToolsOpenContext.set(this._model.isDevToolsOpen); + this._updateSharingState(); // Update find widget with new model this._findWidget.rawValue?.setModel(this._model); @@ -341,6 +402,14 @@ export class BrowserEditor extends EditorPane { this._model = undefined; })); + // Listen for sharing state changes on the model + this._inputDisposables.add(this._model.onDidChangeSharedWithAgent(() => { + this._updateSharingState(); + })); + this._inputDisposables.add(watchForAgentSharingContextChanges(this.contextKeyService)(() => { + this._updateSharingState(); + })); + // Initialize UI state and context keys from model this.updateNavigationState({ url: this._model.url, @@ -578,6 +647,21 @@ export class BrowserEditor extends EditorPane { return this._model?.url; } + private _updateSharingState(): void { + const sharingEnabled = this.contextKeyService.contextMatchesRules(canShareBrowserWithAgentContext); + const isShared = sharingEnabled && !!this._model && this._model.sharedWithAgent; + + this._browserContainer.classList.toggle('shared', isShared); + this._navigationBar.setShared(isShared); + } + + toggleShareWithAgent(): void { + if (!this._model) { + return; + } + this._model.setSharedWithAgent(!this._model.sharedWithAgent); + } + async navigateToUrl(url: string): Promise { if (this._model) { this.group.pinEditor(this.input); // pin editor on navigation diff --git a/src/vs/workbench/contrib/browserView/electron-browser/browserEditorInput.ts b/src/vs/workbench/contrib/browserView/electron-browser/browserEditorInput.ts index ed50b7d847999..8fdd335c19441 100644 --- a/src/vs/workbench/contrib/browserView/electron-browser/browserEditorInput.ts +++ b/src/vs/workbench/contrib/browserView/electron-browser/browserEditorInput.ts @@ -20,7 +20,7 @@ import { hasKey } from '../../../../base/common/types.js'; import { ILifecycleService, ShutdownReason } from '../../../services/lifecycle/common/lifecycle.js'; import { BrowserEditor } from './browserEditor.js'; import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; -import { logBrowserOpen } from './browserViewTelemetry.js'; +import { logBrowserOpen } from '../../../../platform/browserView/common/browserViewTelemetry.js'; const LOADING_SPINNER_SVG = (color: string | undefined) => ` diff --git a/src/vs/workbench/contrib/browserView/electron-browser/browserView.contribution.ts b/src/vs/workbench/contrib/browserView/electron-browser/browserView.contribution.ts index c259cb4061fb1..359ef56102026 100644 --- a/src/vs/workbench/contrib/browserView/electron-browser/browserView.contribution.ts +++ b/src/vs/workbench/contrib/browserView/electron-browser/browserView.contribution.ts @@ -28,10 +28,11 @@ import { IEditorService } from '../../../services/editor/common/editorService.js import { Disposable } from '../../../../base/common/lifecycle.js'; import { URI } from '../../../../base/common/uri.js'; import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; -import { logBrowserOpen } from './browserViewTelemetry.js'; +import { logBrowserOpen } from '../../../../platform/browserView/common/browserViewTelemetry.js'; -// Register actions +// Register actions and browser tools import './browserViewActions.js'; +import './tools/browserTools.contribution.js'; Registry.as(EditorExtensions.EditorPane).registerEditorPane( EditorPaneDescriptor.create( @@ -156,6 +157,16 @@ Registry.as(ConfigurationExtensions.Configuration).regis 'When enabled, localhost links from the terminal, chat, and other sources will open in the Integrated Browser instead of the system browser.' ) }, + 'workbench.browser.enableChatTools': { + type: 'boolean', + default: false, + experiment: { mode: 'startup' }, + tags: ['experimental'], + markdownDescription: localize( + { comment: ['This is the description for a setting.'], key: 'browser.enableChatTools' }, + 'When enabled, chat agents can use browser tools to open and interact with pages in the Integrated Browser.' + ) + }, 'workbench.browser.dataStorage': { type: 'string', enum: [ diff --git a/src/vs/workbench/contrib/browserView/electron-browser/browserViewActions.ts b/src/vs/workbench/contrib/browserView/electron-browser/browserViewActions.ts index 39305f4c57bce..66f0f46827704 100644 --- a/src/vs/workbench/contrib/browserView/electron-browser/browserViewActions.ts +++ b/src/vs/workbench/contrib/browserView/electron-browser/browserViewActions.ts @@ -19,7 +19,7 @@ import { ChatContextKeys } from '../../chat/common/actions/chatContextKeys.js'; import { IOpenerService } from '../../../../platform/opener/common/opener.js'; import { IPreferencesService } from '../../../services/preferences/common/preferences.js'; import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; -import { logBrowserOpen } from './browserViewTelemetry.js'; +import { logBrowserOpen } from '../../../../platform/browserView/common/browserViewTelemetry.js'; // Context key expression to check if browser editor is active const BROWSER_EDITOR_ACTIVE = ContextKeyExpr.equals('activeEditor', BrowserEditor.ID); diff --git a/src/vs/workbench/contrib/browserView/electron-browser/browserViewTelemetry.ts b/src/vs/workbench/contrib/browserView/electron-browser/browserViewTelemetry.ts deleted file mode 100644 index 3f6a4f848f3b5..0000000000000 --- a/src/vs/workbench/contrib/browserView/electron-browser/browserViewTelemetry.ts +++ /dev/null @@ -1,45 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; - -/** - * Source of an Integrated Browser open event. - * - * - `'commandWithoutUrl'`: opened via the "Open Integrated Browser" command without a URL argument. - * This typically means the user ran the command manually from the Command Palette. - * - `'commandWithUrl'`: opened via the "Open Integrated Browser" command with a URL argument. - * This typically means another extension or component invoked the command programmatically. - * - `'newTabCommand'`: opened via the "New Tab" command from an existing tab. - * - `'localhostLinkOpener'`: opened via the localhost link opener when the - * `workbench.browser.openLocalhostLinks` setting is enabled. This happens when clicking - * localhost links from the terminal, chat, or other sources. - * - `'browserLinkForeground'`: opened when clicking a link inside the Integrated Browser that - * opens in a new focused editor (e.g., links with target="_blank"). - * - `'browserLinkBackground'`: opened when clicking a link inside the Integrated Browser that - * opens in a new background editor (e.g., Ctrl/Cmd+click). - * - `'browserLinkNewWindow'`: opened when clicking a link inside the Integrated Browser that - * opens in a new window (e.g., Shift+click). - * - `'copyToNewWindow'`: opened when the user copies a browser editor to a new window - * via "Copy into New Window". - */ -export type IntegratedBrowserOpenSource = 'commandWithoutUrl' | 'commandWithUrl' | 'newTabCommand' | 'localhostLinkOpener' | 'browserLinkForeground' | 'browserLinkBackground' | 'browserLinkNewWindow' | 'copyToNewWindow'; - -type IntegratedBrowserOpenEvent = { - source: IntegratedBrowserOpenSource; -}; - -type IntegratedBrowserOpenClassification = { - source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'How the Integrated Browser was opened' }; - owner: 'jruales'; - comment: 'Tracks how users open the Integrated Browser'; -}; - -export function logBrowserOpen(telemetryService: ITelemetryService, source: IntegratedBrowserOpenSource): void { - telemetryService.publicLog2( - 'integratedBrowser.open', - { source } - ); -} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/media/browser.css b/src/vs/workbench/contrib/browserView/electron-browser/media/browser.css index e040c1a17416e..958e00af4ab0b 100644 --- a/src/vs/workbench/contrib/browserView/electron-browser/media/browser.css +++ b/src/vs/workbench/contrib/browserView/electron-browser/media/browser.css @@ -31,18 +31,69 @@ } } + .browser-url-container { + flex: 1; + display: flex; + align-items: center; + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + border-radius: var(--vscode-cornerRadius-small); + + &:has(.browser-url-input:focus) { + border-color: var(--vscode-focusBorder); + } + } + .browser-url-input { flex: 1; padding: 4px 8px; - background-color: var(--vscode-input-background); + background-color: transparent; color: var(--vscode-input-foreground); - border: 1px solid var(--vscode-input-border); + border: none; border-radius: var(--vscode-cornerRadius-small); - outline: none; + outline: none !important; font-size: 13px; + } - &:focus { - border-color: var(--vscode-focusBorder); + .browser-share-toggle-container { + display: flex; + align-items: center; + margin: 2px 4px; + flex-shrink: 0; + + .browser-share-toggle { + padding: 2px 4px; + border-radius: var(--vscode-cornerRadius-small); + border-width: 0; + color: var(--vscode-descriptionForeground); + white-space: nowrap; + gap: 4px; + + .codicon { + margin: 0; + } + + &:hover { + background-color: var(--vscode-toolbar-hoverBackground) !important; + color: var(--vscode-foreground); + } + + &.checked { + background: linear-gradient(135deg in lab, + color-mix(in srgb, #51a2ff 25%, transparent), + color-mix(in srgb, #4af0c0 25%, transparent), + color-mix(in srgb, #b44aff 25%, transparent) + ) !important; + color: var(--vscode-foreground); + + &:hover { + background: linear-gradient(135deg in lab, + color-mix(in srgb, #51a2ff 35%, transparent), + color-mix(in srgb, #4af0c0 35%, transparent), + color-mix(in srgb, #b44aff 35%, transparent) + ) !important; + } + } } } @@ -50,9 +101,41 @@ flex: 1; min-height: 0; margin: 0 2px 2px; - overflow: hidden; + overflow: visible; position: relative; + z-index: 0; /* Important: creates a new stacking context for the gradient border trick */ outline: none !important; + border-radius: 2px; + + &.shared { + &::before { + content: ''; + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + z-index: -2; + background: linear-gradient(135deg in lab, + color-mix(in srgb, #51a2ff 100%, transparent), + color-mix(in srgb, #4af0c0 100%, transparent), + color-mix(in srgb, #b44aff 100%, transparent) + ) !important; + pointer-events: none; + } + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; + background-color: var(--vscode-editor-background); + pointer-events: none; + } + } } .browser-placeholder-screenshot { diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/browserToolHelpers.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/browserToolHelpers.ts new file mode 100644 index 0000000000000..e6981287fe2f1 --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/browserToolHelpers.ts @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { IToolResult } from '../../../chat/common/tools/languageModelToolsService.js'; + +// eslint-disable-next-line local/code-import-patterns +import type { Page } from 'playwright-core'; + +/** + * Shared helper for running a Playwright function against a page and returning + * a tool result. Handles success/error formatting. + */ +export async function playwrightInvoke( + playwrightService: IPlaywrightService, + pageId: string, + fn: (page: Page, ...args: TArgs) => Promise, + ...args: TArgs +): Promise { + try { + const result = await playwrightService.invokeFunction(pageId, fn.toString(), ...args); + return { + content: [ + { kind: 'text', value: result.result ? JSON.stringify(result.result) : 'Script executed successfully' }, + { kind: 'text', value: result.summary } + ] + }; + } catch (e) { + return errorResult(e instanceof Error ? e.message : String(e)); + } +} + +export function errorResult(message: string): IToolResult { + return { + content: [{ kind: 'text', value: message }], + toolResultError: message, + }; +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/browserTools.contribution.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/browserTools.contribution.ts new file mode 100644 index 0000000000000..340a48a10c1e9 --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/browserTools.contribution.ts @@ -0,0 +1,134 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Codicon } from '../../../../../base/common/codicons.js'; +import { Disposable, DisposableStore } from '../../../../../base/common/lifecycle.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js'; +import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js'; +import { registerWorkbenchContribution2, WorkbenchPhase, type IWorkbenchContribution } from '../../../../common/contributions.js'; +import { IEditorService } from '../../../../services/editor/common/editorService.js'; +import { IChatContextService } from '../../../chat/browser/contextContrib/chatContextService.js'; +import { ILanguageModelToolsService, ToolDataSource } from '../../../chat/common/tools/languageModelToolsService.js'; +import { BrowserEditorInput } from '../browserEditorInput.js'; +import { ClickBrowserTool, ClickBrowserToolData } from './clickBrowserTool.js'; +import { DragElementTool, DragElementToolData } from './dragElementTool.js'; +import { HandleDialogBrowserTool, HandleDialogBrowserToolData } from './handleDialogBrowserTool.js'; +import { HoverElementTool, HoverElementToolData } from './hoverElementTool.js'; +import { NavigateBrowserTool, NavigateBrowserToolData } from './navigateBrowserTool.js'; +import { OpenBrowserTool, OpenBrowserToolData } from './openBrowserTool.js'; +import { ReadBrowserTool, ReadBrowserToolData } from './readBrowserTool.js'; +import { RunPlaywrightCodeTool, RunPlaywrightCodeToolData } from './runPlaywrightCodeTool.js'; +import { ScreenshotBrowserTool, ScreenshotBrowserToolData } from './screenshotBrowserTool.js'; +import { TypeBrowserTool, TypeBrowserToolData } from './typeBrowserTool.js'; + +class BrowserChatAgentToolsContribution extends Disposable implements IWorkbenchContribution { + + static readonly ID = 'browserView.chatAgentTools'; + private static readonly CONTEXT_ID = 'browserView.trackedPages'; + + private readonly _toolsStore = this._register(new DisposableStore()); + + private _trackedIds: ReadonlySet = new Set(); + + constructor( + @IInstantiationService private readonly instantiationService: IInstantiationService, + @ILanguageModelToolsService private readonly toolsService: ILanguageModelToolsService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + @IChatContextService private readonly chatContextService: IChatContextService, + @IEditorService private readonly editorService: IEditorService, + ) { + super(); + + this._updateToolRegistrations(); + + this._register(configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('workbench.browser.enableChatTools')) { + this._updateToolRegistrations(); + } + })); + } + + private _updateToolRegistrations(): void { + this._toolsStore.clear(); + + if (!this.configurationService.getValue('workbench.browser.enableChatTools')) { + this.chatContextService.updateWorkspaceContextItems(BrowserChatAgentToolsContribution.CONTEXT_ID, []); + return; + } + + const browserToolSet = this._toolsStore.add(this.toolsService.createToolSet( + ToolDataSource.Internal, + 'browser', + 'browser', + { + icon: Codicon.globe, + description: localize('browserToolSet.description', 'Open and interact with integrated browser pages'), + } + )); + + this._toolsStore.add(this.toolsService.registerTool(OpenBrowserToolData, this.instantiationService.createInstance(OpenBrowserTool))); + this._toolsStore.add(this.toolsService.registerTool(ReadBrowserToolData, this.instantiationService.createInstance(ReadBrowserTool))); + this._toolsStore.add(this.toolsService.registerTool(ScreenshotBrowserToolData, this.instantiationService.createInstance(ScreenshotBrowserTool))); + this._toolsStore.add(this.toolsService.registerTool(NavigateBrowserToolData, this.instantiationService.createInstance(NavigateBrowserTool))); + this._toolsStore.add(this.toolsService.registerTool(ClickBrowserToolData, this.instantiationService.createInstance(ClickBrowserTool))); + this._toolsStore.add(this.toolsService.registerTool(DragElementToolData, this.instantiationService.createInstance(DragElementTool))); + this._toolsStore.add(this.toolsService.registerTool(HoverElementToolData, this.instantiationService.createInstance(HoverElementTool))); + this._toolsStore.add(this.toolsService.registerTool(TypeBrowserToolData, this.instantiationService.createInstance(TypeBrowserTool))); + this._toolsStore.add(this.toolsService.registerTool(RunPlaywrightCodeToolData, this.instantiationService.createInstance(RunPlaywrightCodeTool))); + this._toolsStore.add(this.toolsService.registerTool(HandleDialogBrowserToolData, this.instantiationService.createInstance(HandleDialogBrowserTool))); + + this._toolsStore.add(browserToolSet.addTool(OpenBrowserToolData)); + this._toolsStore.add(browserToolSet.addTool(ReadBrowserToolData)); + this._toolsStore.add(browserToolSet.addTool(ScreenshotBrowserToolData)); + this._toolsStore.add(browserToolSet.addTool(NavigateBrowserToolData)); + this._toolsStore.add(browserToolSet.addTool(ClickBrowserToolData)); + this._toolsStore.add(browserToolSet.addTool(DragElementToolData)); + this._toolsStore.add(browserToolSet.addTool(HoverElementToolData)); + this._toolsStore.add(browserToolSet.addTool(TypeBrowserToolData)); + this._toolsStore.add(browserToolSet.addTool(RunPlaywrightCodeToolData)); + this._toolsStore.add(browserToolSet.addTool(HandleDialogBrowserToolData)); + + // Publish tracked browser pages as workspace context for chat requests + this.playwrightService.getTrackedPages().then(ids => { + this._trackedIds = new Set(ids); + this._updateBrowserContext(); + }); + this._toolsStore.add(this.playwrightService.onDidChangeTrackedPages(ids => { + this._trackedIds = new Set(ids); + this._updateBrowserContext(); + })); + this._toolsStore.add(this.editorService.onDidEditorsChange(() => this._updateBrowserContext())); + } + + private _updateBrowserContext(): void { + const lines: string[] = []; + const activeEditor = this.editorService.activeEditor; + const visibleEditors = new Set(this.editorService.visibleEditors); + for (const editor of this.editorService.editors) { + if (editor instanceof BrowserEditorInput && this._trackedIds.has(editor.id)) { + const title = editor.getTitle() || 'Untitled'; + const url = editor.getDescription() || 'about:blank'; + const hint = editor === activeEditor ? ' (active)' : visibleEditors.has(editor) ? ' (visible)' : ''; + lines.push(`- [${editor.id}] ${title} (${url})${hint}`); + } + } + + if (lines.length === 0) { + this.chatContextService.updateWorkspaceContextItems(BrowserChatAgentToolsContribution.CONTEXT_ID, []); + return; + } + + this.chatContextService.updateWorkspaceContextItems(BrowserChatAgentToolsContribution.CONTEXT_ID, [{ + handle: 0, + label: localize('browserContext.label', "Browser Pages"), + modelDescription: `The following browser pages are currently available and can be interacted with using the browser tools:`, + value: lines.join('\n'), + }]); + } +} +registerWorkbenchContribution2(BrowserChatAgentToolsContribution.ID, BrowserChatAgentToolsContribution, WorkbenchPhase.AfterRestored); diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/clickBrowserTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/clickBrowserTool.ts new file mode 100644 index 0000000000000..bd911b192fada --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/clickBrowserTool.ts @@ -0,0 +1,95 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult, playwrightInvoke } from './browserToolHelpers.js'; +import { OpenPageToolId } from './openBrowserTool.js'; + +export const ClickBrowserToolData: IToolData = { + id: 'click_element', + toolReferenceName: 'clickElement', + displayName: localize('clickBrowserTool.displayName', 'Click Element'), + userDescription: localize('clickBrowserTool.userDescription', 'Click an element in a browser page'), + modelDescription: 'Click on an element in a browser page.', + icon: Codicon.cursor, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + pageId: { + type: 'string', + description: `The browser page ID, acquired from context or ${OpenPageToolId}.` + }, + selector: { + type: 'string', + description: 'Playwright selector of the element to click.' + }, + ref: { + type: 'string', + description: 'Element reference to click. One of "selector" or "ref" must be provided.' + }, + dblClick: { + type: 'boolean', + description: 'Set to true for double clicks. Default is false.' + }, + button: { + type: 'string', + enum: ['left', 'right', 'middle'], + description: 'Mouse button to click with. Default is "left".' + }, + }, + required: ['pageId'], + }, +}; + +interface IClickBrowserToolParams { + pageId: string; + selector?: string; + ref?: string; + dblClick?: boolean; + button?: 'left' | 'right' | 'middle'; +} + +export class ClickBrowserTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(_context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + return { + invocationMessage: localize('browser.click.invocation', "Clicking element in browser"), + pastTenseMessage: localize('browser.click.past', "Clicked element in browser"), + }; + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as IClickBrowserToolParams; + + if (!params.pageId) { + return errorResult(`No page ID provided. Use '${OpenPageToolId}' first.`); + } + + let selector = params.selector; + if (params.ref) { + selector = `aria-ref=${params.ref}`; + } + + if (!selector) { + return errorResult('Either a "selector" or "ref" parameter is required.'); + } + + const button = params.button ?? 'left'; + + if (params.dblClick) { + return playwrightInvoke(this.playwrightService, params.pageId, (page, sel, btn) => page.locator(sel).dblclick({ button: btn }), selector, button); + } + + return playwrightInvoke(this.playwrightService, params.pageId, (page, sel, btn) => page.locator(sel).click({ button: btn }), selector, button); + } +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/dragElementTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/dragElementTool.ts new file mode 100644 index 0000000000000..15feb72f5ae86 --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/dragElementTool.ts @@ -0,0 +1,95 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult, playwrightInvoke } from './browserToolHelpers.js'; +import { OpenPageToolId } from './openBrowserTool.js'; + +export const DragElementToolData: IToolData = { + id: 'drag_element', + toolReferenceName: 'dragElement', + displayName: localize('dragElementTool.displayName', 'Drag Element'), + userDescription: localize('dragElementTool.userDescription', 'Drag an element over another element'), + modelDescription: 'Drag an element over another element in a browser page.', + icon: Codicon.move, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + pageId: { + type: 'string', + description: `The browser page ID, acquired from context or ${OpenPageToolId}.` + }, + fromSelector: { + type: 'string', + description: 'Playwright selector of the element to drag.' + }, + fromRef: { + type: 'string', + description: 'Element reference of the element to drag. One of "fromSelector" or "fromRef" must be provided.' + }, + toSelector: { + type: 'string', + description: 'Playwright selector of the element to drop onto.' + }, + toRef: { + type: 'string', + description: 'Element reference of the element to drop onto. One of "toSelector" or "toRef" must be provided.' + }, + }, + required: ['pageId'], + }, +}; + +interface IDragElementToolParams { + pageId: string; + fromSelector?: string; + fromRef?: string; + toSelector?: string; + toRef?: string; +} + +export class DragElementTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(_context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + return { + invocationMessage: localize('browser.drag.invocation', "Dragging element in browser"), + pastTenseMessage: localize('browser.drag.past', "Dragged element in browser"), + }; + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as IDragElementToolParams; + + if (!params.pageId) { + return errorResult(`No page ID provided. Use '${OpenPageToolId}' first.`); + } + + let fromSelector = params.fromSelector; + if (params.fromRef) { + fromSelector = `aria-ref=${params.fromRef}`; + } + if (!fromSelector) { + return errorResult('Either a "fromSelector" or "fromRef" parameter is required for the source element.'); + } + + let toSelector = params.toSelector; + if (params.toRef) { + toSelector = `aria-ref=${params.toRef}`; + } + if (!toSelector) { + return errorResult('Either a "toSelector" or "toRef" parameter is required for the target element.'); + } + + return playwrightInvoke(this.playwrightService, params.pageId, (page, from, to) => page.dragAndDrop(from, to), fromSelector, toSelector); + } +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/handleDialogBrowserTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/handleDialogBrowserTool.ts new file mode 100644 index 0000000000000..34d8798bc72f9 --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/handleDialogBrowserTool.ts @@ -0,0 +1,85 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult } from './browserToolHelpers.js'; +import { OpenPageToolId } from './openBrowserTool.js'; + +export const HandleDialogBrowserToolData: IToolData = { + id: 'handle_dialog', + toolReferenceName: 'handleDialog', + displayName: localize('handleDialogBrowserTool.displayName', 'Handle Dialog'), + userDescription: localize('handleDialogBrowserTool.userDescription', 'Respond to a dialog in a browser page'), + modelDescription: 'Respond to a pending dialog (alert, confirm, prompt) or file chooser dialog on a browser page.', + icon: Codicon.comment, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + pageId: { + type: 'string', + description: `The browser page ID, acquired from context or ${OpenPageToolId}.` + }, + accept: { + type: 'boolean', + description: 'Whether to accept (true) or dismiss (false) the dialog.' + }, + promptText: { + type: 'string', + description: 'Text to enter into a prompt dialog. Only applicable for prompt dialogs.' + }, + files: { + type: 'array', + items: { type: 'string' }, + description: 'Absolute paths of files to select. Required for file chooser dialogs.' + }, + }, + required: ['pageId', 'accept'], + }, +}; + +interface IHandleDialogBrowserToolParams { + pageId: string; + accept: boolean; + promptText?: string; + files?: string[]; +} + +export class HandleDialogBrowserTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(_context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + return { + invocationMessage: localize('browser.handleDialog.invocation', "Handling browser dialog"), + pastTenseMessage: localize('browser.handleDialog.past', "Handled browser dialog"), + }; + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as IHandleDialogBrowserToolParams; + + if (!params.pageId) { + return errorResult(`No page ID provided. Use '${OpenPageToolId}' first.`); + } + + try { + let result; + if (params.files !== undefined) { + result = await this.playwrightService.replyToFileChooser(params.pageId, params.accept ? params.files : []); + } else { + result = await this.playwrightService.replyToDialog(params.pageId, params.accept, params.promptText); + } + return { content: [{ kind: 'text', value: result.summary }] }; + } catch (e) { + return errorResult(e instanceof Error ? e.message : String(e)); + } + } +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/hoverElementTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/hoverElementTool.ts new file mode 100644 index 0000000000000..16c3ed50c9ee6 --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/hoverElementTool.ts @@ -0,0 +1,78 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult, playwrightInvoke } from './browserToolHelpers.js'; +import { OpenPageToolId } from './openBrowserTool.js'; + +export const HoverElementToolData: IToolData = { + id: 'hover_element', + toolReferenceName: 'hoverElement', + displayName: localize('hoverElementTool.displayName', 'Hover Element'), + userDescription: localize('hoverElementTool.userDescription', 'Hover over an element in a browser page'), + modelDescription: 'Hover over an element in a browser page. Provide either a Playwright selector or an element reference.', + icon: Codicon.cursor, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + pageId: { + type: 'string', + description: `The browser page ID, acquired from context or ${OpenPageToolId}.` + }, + selector: { + type: 'string', + description: 'Playwright selector of the element to hover over.' + }, + ref: { + type: 'string', + description: 'Element reference to hover over. One of "selector" or "ref" must be provided.' + }, + }, + required: ['pageId'], + }, +}; + +interface IHoverElementToolParams { + pageId: string; + selector?: string; + ref?: string; +} + +export class HoverElementTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(_context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + return { + invocationMessage: localize('browser.hover.invocation', "Hovering over element in browser"), + pastTenseMessage: localize('browser.hover.past', "Hovered over element in browser"), + }; + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as IHoverElementToolParams; + + if (!params.pageId) { + return errorResult(`No page ID provided. Use '${OpenPageToolId}' first.`); + } + + let selector = params.selector; + if (params.ref) { + selector = `aria-ref=${params.ref}`; + } + + if (!selector) { + return errorResult('Either a "selector" or "ref" parameter is required.'); + } + + return playwrightInvoke(this.playwrightService, params.pageId, (page, sel) => page.locator(sel).hover(), selector); + } +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/navigateBrowserTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/navigateBrowserTool.ts new file mode 100644 index 0000000000000..dbad2b31af63f --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/navigateBrowserTool.ts @@ -0,0 +1,109 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult, playwrightInvoke } from './browserToolHelpers.js'; +import { OpenPageToolId } from './openBrowserTool.js'; + +export const NavigateBrowserToolData: IToolData = { + id: 'navigate_page', + toolReferenceName: 'navigatePage', + displayName: localize('navigateBrowserTool.displayName', 'Navigate Page'), + userDescription: localize('navigateBrowserTool.userDescription', 'Navigate or reload a browser page'), + modelDescription: 'Navigate a browser page by URL, history, or reload.', + icon: Codicon.arrowRight, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + pageId: { + type: 'string', + description: `The browser page ID to navigate, acquired from context or ${OpenPageToolId}.` + }, + type: { + type: 'string', + enum: ['url', 'back', 'forward', 'reload'], + description: 'Navigation type: "url" to navigate to a URL (default, requires "url" param), "back" or "forward" for history, "reload" to refresh.' + }, + url: { + type: 'string', + description: 'The URL to navigate to. Required when type is "url".' + }, + }, + required: ['pageId'], + }, +}; + +interface INavigateBrowserToolParams { + pageId: string; + type?: 'url' | 'back' | 'forward' | 'reload'; + url?: string; +} + +export class NavigateBrowserTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + const params = context.parameters as INavigateBrowserToolParams; + switch (params.type) { + case 'reload': + return { + invocationMessage: localize('browser.reload.invocation', "Reloading browser page"), + pastTenseMessage: localize('browser.reload.past', "Reloaded browser page"), + }; + case 'back': + return { + invocationMessage: localize('browser.goBack.invocation', "Going back in browser history"), + pastTenseMessage: localize('browser.goBack.past', "Went back in browser history"), + }; + case 'forward': + return { + invocationMessage: localize('browser.goForward.invocation', "Going forward in browser history"), + pastTenseMessage: localize('browser.goForward.past', "Went forward in browser history"), + }; + default: + return { + invocationMessage: localize('browser.navigate.invocation', "Navigating browser to {0}", params.url), + pastTenseMessage: localize('browser.navigate.past', "Navigated browser to {0}", params.url), + confirmationMessages: { + title: localize('browser.navigate.confirmTitle', 'Navigate Browser?'), + message: localize('browser.navigate.confirmMessage', 'This will navigate the browser to {0} and allow the agent to access its contents.', params.url), + allowAutoConfirm: true, + }, + }; + } + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as INavigateBrowserToolParams; + + if (!params.pageId) { + return errorResult(`No page ID provided. Use '${OpenPageToolId}' first.`); + } + + switch (params.type) { + case 'reload': + return playwrightInvoke(this.playwrightService, params.pageId, (page) => page.reload({ waitUntil: 'domcontentloaded' })); + case 'back': + return playwrightInvoke(this.playwrightService, params.pageId, (page) => page.goBack({ waitUntil: 'domcontentloaded' })); + case 'forward': + return playwrightInvoke(this.playwrightService, params.pageId, (page) => page.goForward({ waitUntil: 'domcontentloaded' })); + default: { + if (!params.url) { + return errorResult('The "url" parameter is required when type is "url".'); + } + return playwrightInvoke(this.playwrightService, params.pageId, (page, url) => { + return page.goto(url, { waitUntil: 'domcontentloaded' }); + }, params.url); + } + } + } +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/openBrowserTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/openBrowserTool.ts new file mode 100644 index 0000000000000..09cc303f188ef --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/openBrowserTool.ts @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult } from './browserToolHelpers.js'; + +export const OpenPageToolId = 'open_browser_page'; + +export const OpenBrowserToolData: IToolData = { + id: OpenPageToolId, + toolReferenceName: 'openBrowserPage', + displayName: localize('openBrowserTool.displayName', 'Open Browser Page'), + userDescription: localize('openBrowserTool.userDescription', 'Open a URL in the integrated browser'), + modelDescription: 'Open a new browser page in the integrated browser at the given URL. Returns a page ID that must be used with other browser tools to interact with the page.', + icon: Codicon.openInProduct, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + url: { + type: 'string', + description: 'The URL to open in the browser.' + }, + }, + required: ['url'], + }, +}; + +interface IOpenBrowserToolParams { + url: string; +} + +export class OpenBrowserTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + const params = context.parameters as IOpenBrowserToolParams; + return { + invocationMessage: localize('browser.open.invocation', "Opening browser page at {0}", params.url ?? 'about:blank'), + pastTenseMessage: localize('browser.open.past', "Opened browser page at {0}", params.url ?? 'about:blank'), + confirmationMessages: { + title: localize('browser.open.confirmTitle', 'Open Browser Page?'), + message: localize('browser.open.confirmMessage', 'This will open {0} in the integrated browser. The agent will be able to read and interact with its contents.', params.url ?? 'about:blank'), + allowAutoConfirm: true, + }, + }; + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as IOpenBrowserToolParams; + + if (!params.url) { + return errorResult('The "url" parameter is required.'); + } + + const { pageId, summary } = await this.playwrightService.openPage(params.url); + + return { + content: [{ + kind: 'text', + value: `Page ID: ${pageId}\n${summary}`, + }], + }; + } +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/readBrowserTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/readBrowserTool.ts new file mode 100644 index 0000000000000..f7b379e926fdd --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/readBrowserTool.ts @@ -0,0 +1,72 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { MarkdownString } from '../../../../../base/common/htmlContent.js'; +import { localize } from '../../../../../nls.js'; +import { BrowserViewUri } from '../../../../../platform/browserView/common/browserViewUri.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult } from './browserToolHelpers.js'; +import { OpenPageToolId } from './openBrowserTool.js'; + +export const ReadBrowserToolData: IToolData = { + id: 'read_page', + toolReferenceName: 'readPage', + displayName: localize('readBrowserTool.displayName', 'Read Page'), + userDescription: localize('readBrowserTool.userDescription', 'Read the content of a browser page'), + modelDescription: 'Get a snapshot of the current browser page state. This is better than screenshot.', + icon: Codicon.fileText, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + pageId: { + type: 'string', + description: `The browser page ID to read, acquired from context or ${OpenPageToolId}.` + }, + }, + required: ['pageId'], + }, +}; + +interface IReadBrowserToolParams { + pageId: string; +} + +export class ReadBrowserTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(_context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + const link = `[browser page](${BrowserViewUri.forUrl('', _context.parameters.pageId).toString()})`; + return { + invocationMessage: new MarkdownString(localize('browser.read.invocation', "Reading {0}", link)), + pastTenseMessage: new MarkdownString(localize('browser.read.past', "Read {0}", link)), + }; + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as IReadBrowserToolParams; + + if (!params.pageId) { + return errorResult(`No page ID provided. Use '${OpenPageToolId}' first.`); + } + + const summary = await this.playwrightService.getSummary(params.pageId); + if (!summary) { + return errorResult('No page summary available.'); + } + + return { + content: [{ + kind: 'text', + value: summary, + }], + }; + } +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/runPlaywrightCodeTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/runPlaywrightCodeTool.ts new file mode 100644 index 0000000000000..0e3d46a1b8adb --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/runPlaywrightCodeTool.ts @@ -0,0 +1,107 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { MarkdownString } from '../../../../../base/common/htmlContent.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult } from './browserToolHelpers.js'; +import { OpenPageToolId } from './openBrowserTool.js'; + +export const RunPlaywrightCodeToolData: IToolData = { + id: 'run_playwright_code', + toolReferenceName: 'runPlaywrightCode', + displayName: localize('runPlaywrightCodeTool.displayName', 'Run Playwright Code'), + userDescription: localize('runPlaywrightCodeTool.userDescription', 'Run a Playwright code snippet against a browser page'), + modelDescription: `Run a Playwright code snippet to control a browser page. Only use this if other browser tools are insufficient.`, + icon: Codicon.terminal, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + pageId: { + type: 'string', + description: `The browser page ID, acquired from context or ${OpenPageToolId}.` + }, + code: { + type: 'string', + description: `The Playwright code to execute. The code must be concise, serve one clear purpose, and be self-contained. You **must not** directly access \`document\` or \`window\` using this tool. You must access it via the provided \`page\` object, e.g. "return page.evaluate(() => document.title)".` + }, + }, + required: ['pageId', 'code'], + }, +}; + +interface IRunPlaywrightCodeToolParams { + pageId: string; + code: string; +} + +export class RunPlaywrightCodeTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + const params = context.parameters as IRunPlaywrightCodeToolParams; + const code = params.code ?? ''; + return { + invocationMessage: new MarkdownString(localize('browser.runCode.invocation', "Running Playwright code...")), + pastTenseMessage: new MarkdownString(localize('browser.runCode.past', "Ran Playwright code")), + confirmationMessages: { + title: localize('browser.runCode.confirmTitle', 'Run Playwright Code?'), + message: new MarkdownString(`\`\`\`javascript\n${code.trim()}\n\`\`\``), + disclaimer: localize('browser.runCode.confirmDisclaimer', 'Make sure you trust the code before continuing.'), + allowAutoConfirm: true, + } + }; + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as IRunPlaywrightCodeToolParams; + + if (!params.pageId) { + return errorResult(`No page ID provided. Use '${OpenPageToolId}' first.`); + } + + if (!params.code) { + return errorResult('The "code" parameter is required.'); + } + + let result; + try { + result = await this.playwrightService.invokeFunction(params.pageId, `async (page) => { ${params.code} }`); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + return errorResult(`Code execution failed: ${message}`); + } + + const json = JSON.stringify(result.result || null); + + let outputMessage; + if (result.result) { + outputMessage = new MarkdownString(); + outputMessage.appendMarkdown(localize('browser.runCode.outputLabel', 'Output:')); + outputMessage.appendText('\n'); + outputMessage.appendCodeblock('json', json); + } + + return { + content: [ + { kind: 'text', value: result.result ? json : 'Code executed successfully' }, + { kind: 'text', value: result.summary } + ], + toolResultDetails: { + input: params.code.trim(), + output: result.result + ? [{ type: 'embed', isText: true, value: JSON.stringify(result.result, null, 2) }] + : [], + isError: false, + }, + }; + } +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/screenshotBrowserTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/screenshotBrowserTool.ts new file mode 100644 index 0000000000000..e0664e36a32f4 --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/screenshotBrowserTool.ts @@ -0,0 +1,92 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult } from './browserToolHelpers.js'; +import { OpenPageToolId } from './openBrowserTool.js'; +import { ReadBrowserToolData } from './readBrowserTool.js'; + +export const ScreenshotBrowserToolData: IToolData = { + id: 'screenshot_page', + toolReferenceName: 'screenshotPage', + displayName: localize('screenshotBrowserTool.displayName', 'Screenshot Page'), + userDescription: localize('screenshotBrowserTool.userDescription', 'Capture a screenshot of a browser page'), + modelDescription: `Capture a screenshot of the current browser page. You can't perform actions based on the screenshot; use ${ReadBrowserToolData.id} for actions.`, + icon: Codicon.deviceCamera, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + pageId: { + type: 'string', + description: `The browser page ID to capture, acquired from context or ${OpenPageToolId}.` + }, + selector: { + type: 'string', + description: 'Playwright selector of an element to capture. If omitted, captures the whole page.' + }, + ref: { + type: 'string', + description: 'Element reference to capture. If omitted, captures the whole page.' + }, + fullPage: { + type: 'boolean', + description: 'Set to true to capture the full scrollable page instead of just the viewport. Incompatible with selector/ref.' + }, + }, + required: ['pageId'], + }, +}; + +interface IScreenshotBrowserToolParams { + pageId: string; + selector?: string; + ref?: string; + fullPage?: boolean; +} + +export class ScreenshotBrowserTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(_context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + return { + invocationMessage: localize('browser.screenshot.invocation', "Capturing browser screenshot"), + pastTenseMessage: localize('browser.screenshot.past', "Captured browser screenshot"), + }; + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as IScreenshotBrowserToolParams; + + if (!params.pageId) { + return errorResult(`No page ID provided. Use '${OpenPageToolId}' first.`); + } + + let selector = params.selector; + if (params.ref) { + selector = `aria-ref=${params.ref}`; + } + + const screenshot = await this.playwrightService.captureScreenshot(params.pageId, selector, params.fullPage); + + return { + content: [ + { + kind: 'data', + value: { + mimeType: 'image/jpeg', + data: screenshot, + }, + }, + ], + }; + } +} diff --git a/src/vs/workbench/contrib/browserView/electron-browser/tools/typeBrowserTool.ts b/src/vs/workbench/contrib/browserView/electron-browser/tools/typeBrowserTool.ts new file mode 100644 index 0000000000000..a6e156e91a5ef --- /dev/null +++ b/src/vs/workbench/contrib/browserView/electron-browser/tools/typeBrowserTool.ts @@ -0,0 +1,107 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { CancellationToken } from '../../../../../base/common/cancellation.js'; +import { Codicon } from '../../../../../base/common/codicons.js'; +import { localize } from '../../../../../nls.js'; +import { IPlaywrightService } from '../../../../../platform/browserView/common/playwrightService.js'; +import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../chat/common/tools/languageModelToolsService.js'; +import { errorResult, playwrightInvoke } from './browserToolHelpers.js'; +import { OpenPageToolId } from './openBrowserTool.js'; + +export const TypeBrowserToolData: IToolData = { + id: 'type_in_page', + toolReferenceName: 'typeInPage', + displayName: localize('typeBrowserTool.displayName', 'Type in Page'), + userDescription: localize('typeBrowserTool.userDescription', 'Type text or press keys in a browser page'), + modelDescription: 'Type text or press keys in a browser page.', + icon: Codicon.symbolText, + source: ToolDataSource.Internal, + inputSchema: { + type: 'object', + properties: { + pageId: { + type: 'string', + description: `The browser page ID, acquired from context or ${OpenPageToolId}.` + }, + text: { + type: 'string', + description: 'The text to type. One of "text" or "key" must be provided.' + }, + key: { + type: 'string', + description: 'A key or key combination to press (e.g., "Enter", "Tab", "Control+c"). One of "text" or "key" must be provided.' + }, + selector: { + type: 'string', + description: 'Playwright selector of element to target. If omitted, types into the focused element.' + }, + ref: { + type: 'string', + description: 'Element reference to target. If omitted, types into the focused element.' + }, + }, + required: ['pageId'], + }, +}; + +interface ITypeBrowserToolParams { + pageId: string; + text?: string; + key?: string; + selector?: string; + ref?: string; +} + +export class TypeBrowserTool implements IToolImpl { + constructor( + @IPlaywrightService private readonly playwrightService: IPlaywrightService, + ) { } + + async prepareToolInvocation(context: IToolInvocationPreparationContext, _token: CancellationToken): Promise { + const params = context.parameters as ITypeBrowserToolParams; + if (params.key) { + return { + invocationMessage: localize('browser.pressKey.invocation', "Pressing key {0} in browser", params.key), + pastTenseMessage: localize('browser.pressKey.past', "Pressed key {0} in browser", params.key), + }; + } + return { + invocationMessage: localize('browser.type.invocation', "Typing text in browser"), + pastTenseMessage: localize('browser.type.past', "Typed text in browser"), + }; + } + + async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, _token: CancellationToken): Promise { + const params = invocation.parameters as ITypeBrowserToolParams; + + if (!params.pageId) { + return errorResult(`No page ID provided. Use '${OpenPageToolId}' first.`); + } + + let selector = params.selector; + if (params.ref) { + selector = `aria-ref=${params.ref}`; + } + + if (!params.text && !params.key) { + return errorResult('Either a "text" or "key" parameter is required.'); + } + + // Press key + if (params.key) { + if (selector) { + return playwrightInvoke(this.playwrightService, params.pageId, (page, sel, key) => page.locator(sel).press(key), selector, params.key); + } + return playwrightInvoke(this.playwrightService, params.pageId, (page, key) => page.keyboard.press(key), params.key); + } + + // Type text + if (selector) { + return playwrightInvoke(this.playwrightService, params.pageId, (page, sel, text) => page.locator(sel).fill(text), selector, params.text!); + } + return playwrightInvoke(this.playwrightService, params.pageId, (page, text) => page.keyboard.type(text), params.text!); + } +} From 0bafbc18b3a2c0d8b85053f59e274fd5506388a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:58:16 +0100 Subject: [PATCH 15/28] Bump hono from 4.11.7 to 4.12.0 in /test/mcp (#296460) Bumps [hono](https://github.com/honojs/hono) from 4.11.7 to 4.12.0. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.11.7...v4.12.0) --- updated-dependencies: - dependency-name: hono dependency-version: 4.12.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/mcp/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/mcp/package-lock.json b/test/mcp/package-lock.json index 9672580dfd896..f3a0ceb0bfffd 100644 --- a/test/mcp/package-lock.json +++ b/test/mcp/package-lock.json @@ -702,9 +702,9 @@ } }, "node_modules/hono": { - "version": "4.11.7", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.7.tgz", - "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.0.tgz", + "integrity": "sha512-NekXntS5M94pUfiVZ8oXXK/kkri+5WpX2/Ik+LVsl+uvw+soj4roXIsPqO+XsWrAw20mOzaXOZf3Q7PfB9A/IA==", "license": "MIT", "engines": { "node": ">=16.9.0" From a35852cca36d7f11ebfd123ee601e14f3d493c7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:58:26 +0100 Subject: [PATCH 16/28] Bump lodash-es and mermaid in /extensions/mermaid-chat-features (#296669) Bumps [lodash-es](https://github.com/lodash/lodash) to 4.17.23 and updates ancestor dependency [mermaid](https://github.com/mermaid-js/mermaid). These dependencies need to be updated together. Updates `lodash-es` from 4.17.21 to 4.17.23 - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23) Updates `mermaid` from 11.11.0 to 11.12.3 - [Release notes](https://github.com/mermaid-js/mermaid/releases) - [Commits](https://github.com/mermaid-js/mermaid/compare/mermaid@11.11.0...mermaid@11.12.3) --- updated-dependencies: - dependency-name: lodash-es dependency-version: 4.17.23 dependency-type: indirect - dependency-name: mermaid dependency-version: 11.12.3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../mermaid-chat-features/package-lock.json | 133 +++++++++--------- extensions/mermaid-chat-features/package.json | 2 +- 2 files changed, 68 insertions(+), 67 deletions(-) diff --git a/extensions/mermaid-chat-features/package-lock.json b/extensions/mermaid-chat-features/package-lock.json index 3d502443d2a2d..0d0bb2a582beb 100644 --- a/extensions/mermaid-chat-features/package-lock.json +++ b/extensions/mermaid-chat-features/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "dompurify": "^3.2.7", - "mermaid": "^11.11.0" + "mermaid": "^11.12.3" }, "devDependencies": { "@types/node": "^22.18.10", @@ -49,42 +49,42 @@ "license": "MIT" }, "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.1.tgz", + "integrity": "sha512-fRHyv6/f542qQqiRGalrfJl/evD39mAvbJLCekPazhiextEatq1Jx1K/i9gSd5NNO0ds03ek0Cbo/4uVKmOBcw==", "license": "Apache-2.0", "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" + "@chevrotain/gast": "11.1.1", + "@chevrotain/types": "11.1.1", + "lodash-es": "4.17.23" } }, "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.1.tgz", + "integrity": "sha512-Ko/5vPEYy1vn5CbCjjvnSO4U7GgxyGm+dfUZZJIWTlQFkXkyym0jFYrWEU10hyCjrA7rQtiHtBr0EaZqvHFZvg==", "license": "Apache-2.0", "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" + "@chevrotain/types": "11.1.1", + "lodash-es": "4.17.23" } }, "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.1.tgz", + "integrity": "sha512-ctRw1OKSXkOrR8VTvOxrQ5USEc4sNrfwXHa1NuTcR7wre4YbjPcKw+82C2uylg/TEwFRgwLmbhlln4qkmDyteg==", "license": "Apache-2.0" }, "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.1.tgz", + "integrity": "sha512-wb2ToxG8LkgPYnKe9FH8oGn3TMCBdnwiuNC5l5y+CtlaVRbCytU0kbVsk6CGrqTL4ZN4ksJa0TXOYbxpbthtqw==", "license": "Apache-2.0" }, "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.1.tgz", + "integrity": "sha512-71eTYMzYXYSFPrbg/ZwftSaSDld7UYlS8OQa3lNnn9jzNtpFbaReRRyghzqS7rI3CDaorqpPJJcXGHK+FE1TVQ==", "license": "Apache-2.0" }, "node_modules/@iconify/types": { @@ -122,12 +122,12 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", - "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.0.tgz", + "integrity": "sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw==", "license": "MIT", "dependencies": { - "langium": "3.3.1" + "langium": "^4.0.0" } }, "node_modules/@types/d3": { @@ -426,17 +426,17 @@ } }, "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.1.tgz", + "integrity": "sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ==", "license": "Apache-2.0", "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" + "@chevrotain/cst-dts-gen": "11.1.1", + "@chevrotain/gast": "11.1.1", + "@chevrotain/regexp-to-ast": "11.1.1", + "@chevrotain/types": "11.1.1", + "@chevrotain/utils": "11.1.1", + "lodash-es": "4.17.23" } }, "node_modules/chevrotain-allstar": { @@ -738,9 +738,9 @@ } }, "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", "license": "ISC", "engines": { "node": ">=12" @@ -974,9 +974,9 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", - "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", "license": "MIT", "dependencies": { "d3": "^7.9.0", @@ -1085,19 +1085,20 @@ "license": "MIT" }, "node_modules/langium": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", - "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz", + "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==", "license": "MIT", "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", + "chevrotain": "~11.1.1", + "chevrotain-allstar": "~0.3.1", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" + "vscode-uri": "~3.1.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.10.0", + "npm": ">=10.2.3" } }, "node_modules/layout-base": { @@ -1124,45 +1125,45 @@ } }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", "license": "MIT" }, "node_modules/marked": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", - "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", "license": "MIT", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/mermaid": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.11.0.tgz", - "integrity": "sha512-9lb/VNkZqWTRjVgCV+l1N+t4kyi94y+l5xrmBmbbxZYkfRl5hEDaTPMOcaWKCl1McG8nBEaMlWwkcAEEgjhBgg==", + "version": "11.12.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.3.tgz", + "integrity": "sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==", "license": "MIT", "dependencies": { - "@braintree/sanitize-url": "^7.0.4", + "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.1", - "@mermaid-js/parser": "^0.6.2", + "@mermaid-js/parser": "^1.0.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.11", - "dayjs": "^1.11.13", + "dagre-d3-es": "7.0.13", + "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^15.0.7", + "lodash-es": "^4.17.23", + "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", @@ -1386,9 +1387,9 @@ "license": "MIT" }, "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "license": "MIT" } } diff --git a/extensions/mermaid-chat-features/package.json b/extensions/mermaid-chat-features/package.json index fed905d2651ec..811bff8076d1f 100644 --- a/extensions/mermaid-chat-features/package.json +++ b/extensions/mermaid-chat-features/package.json @@ -131,6 +131,6 @@ }, "dependencies": { "dompurify": "^3.2.7", - "mermaid": "^11.11.0" + "mermaid": "^11.12.3" } } From 022061df7152d326c492d8d8fdb9d01d0a0ed710 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:58:37 +0100 Subject: [PATCH 17/28] Bump minimatch from 10.0.3 to 10.2.2 in /extensions/css-language-features (#296798) Bump minimatch in /extensions/css-language-features Bumps [minimatch](https://github.com/isaacs/minimatch) from 10.0.3 to 10.2.2. - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v10.0.3...v10.2.2) --- updated-dependencies: - dependency-name: minimatch dependency-version: 10.2.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../css-language-features/package-lock.json | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/extensions/css-language-features/package-lock.json b/extensions/css-language-features/package-lock.json index af7a789d5a2db..3b3ff93fa4d3d 100644 --- a/extensions/css-language-features/package-lock.json +++ b/extensions/css-language-features/package-lock.json @@ -19,47 +19,47 @@ "vscode": "^1.77.0" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, "license": "MIT", - "engines": { - "node": "20 || >=22" + "dependencies": { + "undici-types": "~6.20.0" } }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", + "node_modules/balanced-match": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", + "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, "engines": { "node": "20 || >=22" } }, - "node_modules/@types/node": { - "version": "22.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", - "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", - "dev": true, + "node_modules/brace-expansion": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", + "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "license": "ISC", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" From 845a614c1d9c1788fb70ed9362d7b066a812d5eb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 23 Feb 2026 16:01:33 +0100 Subject: [PATCH 18/28] feat - allow to use all workbench commands in sessions window from modal editors (#296966) feat - add environment service to modal editor part --- src/vs/workbench/browser/parts/editor/modalEditorPart.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/modalEditorPart.ts b/src/vs/workbench/browser/parts/editor/modalEditorPart.ts index d75fcd17e5a17..593056b414a9f 100644 --- a/src/vs/workbench/browser/parts/editor/modalEditorPart.ts +++ b/src/vs/workbench/browser/parts/editor/modalEditorPart.ts @@ -27,6 +27,7 @@ import { IEditorService } from '../../../services/editor/common/editorService.js import { EditorPartModalContext, EditorPartModalMaximizedContext, EditorPartModalNavigationContext } from '../../../common/contextkeys.js'; import { EditorResourceAccessor, SideBySideEditor, Verbosity } from '../../../common/editor.js'; import { ResourceLabel } from '../../labels.js'; +import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js'; import { IHostService } from '../../../services/host/browser/host.js'; import { IWorkbenchLayoutService, Parts } from '../../../services/layout/browser/layoutService.js'; import { mainWindow } from '../../../../base/browser/window.js'; @@ -65,6 +66,7 @@ export class ModalEditorPart { @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @IKeybindingService private readonly keybindingService: IKeybindingService, @IHostService private readonly hostService: IHostService, + @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, ) { } @@ -95,8 +97,8 @@ export class ModalEditorPart { editorPart.close(); } - // Prevent unsupported commands - else { + // Prevent unsupported commands (not in sessions windows) + else if (!this.environmentService.isSessionsWindow) { const resolved = this.keybindingService.softDispatch(event, this.layoutService.mainContainer); if (resolved.kind === ResultKind.KbFound && resolved.commandId) { if ( From 72f8999ea49e0bbcbbb923baf60a627e4943c0be Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 23 Feb 2026 16:01:49 +0100 Subject: [PATCH 19/28] modal - increase minimal size (#296984) * style - update dimensions for `modal-editor-part` * style - adjust dimensions for `modal-editor-part` * style - update max dimensions for `modalEditorPart` * undo unrelated change --- src/vs/workbench/browser/parts/editor/modalEditorPart.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/modalEditorPart.ts b/src/vs/workbench/browser/parts/editor/modalEditorPart.ts index 593056b414a9f..3e3270d3ee67d 100644 --- a/src/vs/workbench/browser/parts/editor/modalEditorPart.ts +++ b/src/vs/workbench/browser/parts/editor/modalEditorPart.ts @@ -246,8 +246,8 @@ export class ModalEditorPart { width = Math.max(containerDimension.width - horizontalPadding, 0); height = Math.max(availableHeight - verticalPadding, 0); } else { - const maxWidth = 1200; - const maxHeight = 800; + const maxWidth = 1400; + const maxHeight = 900; const targetWidth = containerDimension.width * 0.8; const targetHeight = availableHeight * 0.8; width = Math.min(targetWidth, maxWidth, containerDimension.width); From 6c8628dbfba59d168f1b0ed7d4f34f04c262a81d Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:03:46 +0000 Subject: [PATCH 20/28] Disable unregistered session types in session type picker (#296974) * Initial plan * fix: disable non-local session types in picker when provider is not registered The session type picker now shows non-local session types as disabled in the dropdown when their provider is not yet registered. Uses getChatSessionContribution to check registration status. Local is always enabled as it's always registered. Co-authored-by: benibenj <44439583+benibenj@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: benibenj <44439583+benibenj@users.noreply.github.com> --- .../browser/widget/input/sessionTargetPickerActionItem.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.ts b/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.ts index 7095abd9ecdb4..5a31e7f187cb8 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.ts @@ -185,7 +185,11 @@ export class SessionTypePickerActionItem extends ChatInputPickerActionViewItem { } protected _isSessionTypeEnabled(type: AgentSessionProviders): boolean { - return true; + if (type === AgentSessionProviders.Local) { + return true; // Local is always available + } + // Disable non-local session types when their provider is not registered yet + return !!this.chatSessionsService.getChatSessionContribution(type); } protected _getSessionCategory(sessionTypeItem: ISessionTypeItem) { From 4eb8565469217f6c5994150bd2d5f3c4e5d924fd Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Mon, 23 Feb 2026 07:06:56 -0800 Subject: [PATCH 21/28] Get accurate Windows version info from registry instead of os.release() (#295842) Used Windows registry to retrieve Windows release and build numbers. Added passing User-Agent header to update service. Updated installer launch env to ignore compat mode. --- package-lock.json | 8 +- package.json | 2 +- remote/package-lock.json | 8 +- remote/package.json | 2 +- src/vs/base/node/windowsVersion.ts | 113 ++++++++++++++++++ src/vs/code/electron-main/main.ts | 6 +- src/vs/platform/remote/node/wsl.ts | 14 +-- src/vs/platform/terminal/node/ptyService.ts | 15 +-- .../terminal/node/terminalEnvironment.ts | 15 +-- .../platform/terminal/node/terminalProcess.ts | 7 +- .../terminal/node/terminalProfiles.ts | 4 +- .../test/node/terminalEnvironment.test.ts | 7 +- .../electron-main/abstractUpdateService.ts | 21 +++- .../electron-main/updateService.win32.ts | 11 +- 14 files changed, 177 insertions(+), 56 deletions(-) create mode 100644 src/vs/base/node/windowsVersion.ts diff --git a/package-lock.json b/package-lock.json index 260c4aef67e09..eb3f6db49fff4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@vscode/vscode-languagedetection": "1.0.23", "@vscode/windows-mutex": "^0.5.0", "@vscode/windows-process-tree": "^0.6.0", - "@vscode/windows-registry": "^1.1.0", + "@vscode/windows-registry": "^1.2.0", "@xterm/addon-clipboard": "^0.3.0-beta.167", "@xterm/addon-image": "^0.10.0-beta.167", "@xterm/addon-ligatures": "^0.11.0-beta.167", @@ -3818,9 +3818,9 @@ } }, "node_modules/@vscode/windows-registry": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@vscode/windows-registry/-/windows-registry-1.1.3.tgz", - "integrity": "sha512-si8+b+2Wh0x2X6W2+kgDyLJD9hyGIrjUo1X/7RWlvsxyI5+Pg+bpdHJrVYtIW4cHOPVB0FYFaN1UZndbUbU5lQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vscode/windows-registry/-/windows-registry-1.2.0.tgz", + "integrity": "sha512-IouvAGIIjPDKsLlBkdjVgfHrE+s4aESXzyQWwEPzbzHumKbCqIL5n54PNX0R4PHkYQlbinVrXn282KGSO4cr9A==", "hasInstallScript": true, "license": "MIT" }, diff --git a/package.json b/package.json index e5e265ac8c16a..d82bf82e5de48 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "@vscode/vscode-languagedetection": "1.0.23", "@vscode/windows-mutex": "^0.5.0", "@vscode/windows-process-tree": "^0.6.0", - "@vscode/windows-registry": "^1.1.0", + "@vscode/windows-registry": "^1.2.0", "@xterm/addon-clipboard": "^0.3.0-beta.167", "@xterm/addon-image": "^0.10.0-beta.167", "@xterm/addon-ligatures": "^0.11.0-beta.167", diff --git a/remote/package-lock.json b/remote/package-lock.json index 625b7143211ee..49b97cb47d00d 100644 --- a/remote/package-lock.json +++ b/remote/package-lock.json @@ -21,7 +21,7 @@ "@vscode/tree-sitter-wasm": "^0.3.0", "@vscode/vscode-languagedetection": "1.0.23", "@vscode/windows-process-tree": "^0.6.0", - "@vscode/windows-registry": "^1.1.0", + "@vscode/windows-registry": "^1.2.0", "@xterm/addon-clipboard": "^0.3.0-beta.167", "@xterm/addon-image": "^0.10.0-beta.167", "@xterm/addon-ligatures": "^0.11.0-beta.167", @@ -571,9 +571,9 @@ } }, "node_modules/@vscode/windows-registry": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@vscode/windows-registry/-/windows-registry-1.1.3.tgz", - "integrity": "sha512-si8+b+2Wh0x2X6W2+kgDyLJD9hyGIrjUo1X/7RWlvsxyI5+Pg+bpdHJrVYtIW4cHOPVB0FYFaN1UZndbUbU5lQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vscode/windows-registry/-/windows-registry-1.2.0.tgz", + "integrity": "sha512-IouvAGIIjPDKsLlBkdjVgfHrE+s4aESXzyQWwEPzbzHumKbCqIL5n54PNX0R4PHkYQlbinVrXn282KGSO4cr9A==", "hasInstallScript": true, "license": "MIT" }, diff --git a/remote/package.json b/remote/package.json index ecc25ae5590e0..2de8217e16d43 100644 --- a/remote/package.json +++ b/remote/package.json @@ -16,7 +16,7 @@ "@vscode/tree-sitter-wasm": "^0.3.0", "@vscode/vscode-languagedetection": "1.0.23", "@vscode/windows-process-tree": "^0.6.0", - "@vscode/windows-registry": "^1.1.0", + "@vscode/windows-registry": "^1.2.0", "@xterm/addon-clipboard": "^0.3.0-beta.167", "@xterm/addon-image": "^0.10.0-beta.167", "@xterm/addon-ligatures": "^0.11.0-beta.167", diff --git a/src/vs/base/node/windowsVersion.ts b/src/vs/base/node/windowsVersion.ts new file mode 100644 index 0000000000000..95dd8e78c478e --- /dev/null +++ b/src/vs/base/node/windowsVersion.ts @@ -0,0 +1,113 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as os from 'os'; +import { isWindows } from '../common/platform.js'; + +let versionInfo: { release: string; buildNumber: number } | undefined; + +/** + * Initializes the Windows version cache by reading from the registry. + * + * On Windows 8.1+, the `os.release()` function may return incorrect version numbers + * due to the deprecated GetVersionEx API returning compatibility-shimmed values + * when the application doesn't have a proper manifest. Reading from the registry + * gives us the real version. + * + * See: https://github.com/microsoft/vscode/issues/197444 + */ +export async function initWindowsVersionInfo() { + if (versionInfo) { + return; + } + + if (!isWindows) { + versionInfo = { release: os.release(), buildNumber: 0 }; + return; + } + + let buildNumber: number | undefined; + let release: string | undefined; + try { + const Registry = await import('@vscode/windows-registry'); + const versionKey = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion'; + + const build = Registry.GetStringRegKey('HKEY_LOCAL_MACHINE', versionKey, 'CurrentBuild'); + if (build !== undefined) { + buildNumber = parseInt(build, 10); + if (isNaN(buildNumber)) { + buildNumber = undefined; + } + } + + const major = Registry.GetDWORDRegKey('HKEY_LOCAL_MACHINE', versionKey, 'CurrentMajorVersionNumber'); + const minor = Registry.GetDWORDRegKey('HKEY_LOCAL_MACHINE', versionKey, 'CurrentMinorVersionNumber'); + if (major !== undefined && minor !== undefined && build !== undefined) { + release = `${major}.${minor}.${build}`; + } + } catch { + // ignore + } finally { + versionInfo = { + release: release || os.release(), + buildNumber: buildNumber || getWindowsBuildNumberFromOsRelease() + }; + } +} + +/** + * Gets Windows version information from the registry. + * @returns The Windows version in Major.Minor.Build format (e.g., "10.0.19041") + */ +export async function getWindowsRelease(): Promise { + if (!versionInfo) { + await initWindowsVersionInfo(); + } + return versionInfo!.release; +} + +/** + * Gets the Windows build number from the registry. + * @returns The Windows build number (e.g., 19041 for Windows 10 2004) + */ +export async function getWindowsBuildNumberAsync(): Promise { + if (!versionInfo) { + await initWindowsVersionInfo(); + } + return versionInfo!.buildNumber; +} + +/** + * Synchronous version of getWindowsBuildNumberAsync(). + * @returns The Windows build number (e.g., 19041 for Windows 10 2004) + */ +export function getWindowsBuildNumberSync(): number { + if (versionInfo) { + return versionInfo.buildNumber; + } else { + return isWindows ? getWindowsBuildNumberFromOsRelease() : 0; + } +} + +/** + * Gets the cached Windows release string synchronously. + * Falls back to os.release() if the cache hasn't been initialized yet. + * @returns The Windows version in Major.Minor.Build format (e.g., "10.0.19041") + */ +export function getWindowsReleaseSync(): string { + return versionInfo?.release ?? os.release(); +} + +/** + * Parses the Windows build number from os.release(). + * This is used as a fallback when registry reading is not available. + */ +function getWindowsBuildNumberFromOsRelease(): number { + const osVersion = (/(\d+)\.(\d+)\.(\d+)/g).exec(os.release()); + if (osVersion && osVersion.length === 4) { + return parseInt(osVersion[3], 10); + } + return 0; +} diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index eb7e0193373b8..82d80db5bdcb9 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -22,6 +22,7 @@ import { IProcessEnvironment, isLinux, isMacintosh, isWindows, OS } from '../../ import { cwd } from '../../base/common/process.js'; import { rtrim, trim } from '../../base/common/strings.js'; import { Promises as FSPromises } from '../../base/node/pfs.js'; +import { initWindowsVersionInfo } from '../../base/node/windowsVersion.js'; import { ProxyChannel } from '../../base/parts/ipc/common/ipc.js'; import { Client as NodeIPCClient } from '../../base/parts/ipc/common/ipc.net.js'; import { connect as nodeIPCConnect, serve as nodeIPCServe, Server as NodeIPCServer, XDG_RUNTIME_DIR } from '../../base/parts/ipc/node/ipc.net.js'; @@ -282,7 +283,10 @@ class CodeMain { stateService.init(), // Configuration service - configurationService.initialize() + configurationService.initialize(), + + // Accurate Windows version info. + isWindows ? initWindowsVersionInfo() : Promise.resolve() ]); // Initialize user data profiles after initializing the state diff --git a/src/vs/platform/remote/node/wsl.ts b/src/vs/platform/remote/node/wsl.ts index 12935846db9a8..60b96f3dd789a 100644 --- a/src/vs/platform/remote/node/wsl.ts +++ b/src/vs/platform/remote/node/wsl.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as fs from 'fs'; -import * as os from 'os'; import * as cp from 'child_process'; import { join } from '../../../base/common/path.js'; +import { getWindowsBuildNumberAsync } from '../../../base/node/windowsVersion.js'; let hasWSLFeaturePromise: Promise | undefined; @@ -18,8 +18,8 @@ export async function hasWSLFeatureInstalled(refresh = false): Promise } async function testWSLFeatureInstalled(): Promise { - const windowsBuildNumber = getWindowsBuildNumber(); - if (windowsBuildNumber === undefined) { + const windowsBuildNumber = await getWindowsBuildNumberAsync(); + if (windowsBuildNumber === 0) { return false; } if (windowsBuildNumber >= 22000) { @@ -47,14 +47,6 @@ async function testWSLFeatureInstalled(): Promise { return false; } -function getWindowsBuildNumber(): number | undefined { - const osVersion = (/(\d+)\.(\d+)\.(\d+)/g).exec(os.release()); - if (osVersion) { - return parseInt(osVersion[3]); - } - return undefined; -} - function getSystem32Path(subPath: string): string | undefined { const systemRoot = process.env['SystemRoot']; if (systemRoot) { diff --git a/src/vs/platform/terminal/node/ptyService.ts b/src/vs/platform/terminal/node/ptyService.ts index e73086df28c9e..2f8d40d6ac0dd 100644 --- a/src/vs/platform/terminal/node/ptyService.ts +++ b/src/vs/platform/terminal/node/ptyService.ts @@ -18,7 +18,7 @@ import { escapeNonWindowsPath } from '../common/terminalEnvironment.js'; import type { ISerializeOptions, SerializeAddon as XtermSerializeAddon } from '@xterm/addon-serialize'; import type { Unicode11Addon as XtermUnicode11Addon } from '@xterm/addon-unicode11'; import { IGetTerminalLayoutInfoArgs, IProcessDetails, ISetTerminalLayoutInfoArgs, ITerminalTabLayoutInfoDto } from '../common/terminalProcess.js'; -import { getWindowsBuildNumber, sanitizeEnvForLogging } from './terminalEnvironment.js'; +import { sanitizeEnvForLogging } from './terminalEnvironment.js'; import { TerminalProcess } from './terminalProcess.js'; import { localize } from '../../../nls.js'; import { ignoreProcessNames } from './childProcessMonitor.js'; @@ -33,6 +33,7 @@ import * as performance from '../../../base/common/performance.js'; import pkg from '@xterm/headless'; import { AutoRepliesPtyServiceContribution } from './terminalContrib/autoReplies/autoRepliesContribController.js'; import { hasKey, isFunction, isNumber, isString } from '../../../base/common/types.js'; +import { getWindowsBuildNumberAsync } from '../../../base/node/windowsVersion.js'; type XtermTerminal = pkg.Terminal; const { Terminal: XtermTerminal } = pkg; @@ -510,10 +511,10 @@ export class PtyService extends Disposable implements IPtyService { if (!isWindows) { return original; } - if (getWindowsBuildNumber() < 17063) { + if (await getWindowsBuildNumberAsync() < 17063) { return original.replace(/\\/g, '/'); } - const wslExecutable = this._getWSLExecutablePath(); + const wslExecutable = await this._getWSLExecutablePath(); if (!wslExecutable) { return original; } @@ -528,10 +529,10 @@ export class PtyService extends Disposable implements IPtyService { // The backend is Windows, for example a local Windows workspace with a wsl session in // the terminal. if (isWindows) { - if (getWindowsBuildNumber() < 17063) { + if (await getWindowsBuildNumberAsync() < 17063) { return original; } - const wslExecutable = this._getWSLExecutablePath(); + const wslExecutable = await this._getWSLExecutablePath(); if (!wslExecutable) { return original; } @@ -547,8 +548,8 @@ export class PtyService extends Disposable implements IPtyService { return original; } - private _getWSLExecutablePath(): string | undefined { - const useWSLexe = getWindowsBuildNumber() >= 16299; + private async _getWSLExecutablePath(): Promise { + const useWSLexe = await getWindowsBuildNumberAsync() >= 16299; const is32ProcessOn64Windows = process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'); const systemRoot = process.env['SystemRoot']; if (systemRoot) { diff --git a/src/vs/platform/terminal/node/terminalEnvironment.ts b/src/vs/platform/terminal/node/terminalEnvironment.ts index 62a0c53bb8850..5aa0a0dd13a6e 100644 --- a/src/vs/platform/terminal/node/terminalEnvironment.ts +++ b/src/vs/platform/terminal/node/terminalEnvironment.ts @@ -18,15 +18,7 @@ import { MergedEnvironmentVariableCollection } from '../common/environmentVariab import { chmod, realpathSync, mkdirSync } from 'fs'; import { promisify } from 'util'; import { isString, SingleOrMany } from '../../../base/common/types.js'; - -export function getWindowsBuildNumber(): number { - const osVersion = (/(\d+)\.(\d+)\.(\d+)/g).exec(os.release()); - let buildNumber: number = 0; - if (osVersion && osVersion.length === 4) { - buildNumber = parseInt(osVersion[3]); - } - return buildNumber; -} +import { getWindowsBuildNumberAsync } from '../../../base/node/windowsVersion.js'; export interface IShellIntegrationConfigInjection { readonly type: 'injection'; @@ -83,7 +75,8 @@ export async function getShellIntegrationInjection( return { type: 'failure', reason: ShellIntegrationInjectionFailureReason.IgnoreShellIntegrationFlag }; } // Shell integration requires Windows 10 build 18309+ (ConPTY support) - if (isWindows && getWindowsBuildNumber() < 18309) { + const windowsBuildNumber = isWindows ? await getWindowsBuildNumberAsync() : 0; + if (isWindows && windowsBuildNumber < 18309) { return { type: 'failure', reason: ShellIntegrationInjectionFailureReason.UnsupportedWindowsBuild }; } @@ -103,7 +96,7 @@ export async function getShellIntegrationInjection( const scopedDownShellEnvs = ['PATH', 'VIRTUAL_ENV', 'HOME', 'SHELL', 'PWD']; if (shellLaunchConfig.shellIntegrationEnvironmentReporting) { if (isWindows) { - const enableWindowsEnvReporting = options.windowsUseConptyDll || getWindowsBuildNumber() >= 22631 && shell !== 'bash.exe'; + const enableWindowsEnvReporting = options.windowsUseConptyDll || windowsBuildNumber >= 22631 && shell !== 'bash.exe'; if (enableWindowsEnvReporting) { envMixin['VSCODE_SHELL_ENV_REPORTING'] = scopedDownShellEnvs.join(','); } diff --git a/src/vs/platform/terminal/node/terminalProcess.ts b/src/vs/platform/terminal/node/terminalProcess.ts index 1f49fa67daa7f..60563ff6487a8 100644 --- a/src/vs/platform/terminal/node/terminalProcess.ts +++ b/src/vs/platform/terminal/node/terminalProcess.ts @@ -17,10 +17,11 @@ import { ILogService, LogLevel } from '../../log/common/log.js'; import { IProductService } from '../../product/common/productService.js'; import { FlowControlConstants, IShellLaunchConfig, ITerminalChildProcess, ITerminalLaunchError, IProcessProperty, IProcessPropertyMap, ProcessPropertyType, TerminalShellType, IProcessReadyEvent, ITerminalProcessOptions, PosixShellType, IProcessReadyWindowsPty, GeneralShellType, ITerminalLaunchResult } from '../common/terminal.js'; import { ChildProcessMonitor } from './childProcessMonitor.js'; -import { getShellIntegrationInjection, getWindowsBuildNumber, IShellIntegrationConfigInjection, sanitizeEnvForLogging } from './terminalEnvironment.js'; +import { getShellIntegrationInjection, IShellIntegrationConfigInjection, sanitizeEnvForLogging } from './terminalEnvironment.js'; import { WindowsShellHelper } from './windowsShellHelper.js'; import { IPty, IPtyForkOptions, IWindowsPtyForkOptions, spawn } from 'node-pty'; import { isNumber } from '../../../base/common/types.js'; +import { getWindowsBuildNumberSync } from '../../../base/node/windowsVersion.js'; const enum ShutdownConstants { /** @@ -150,7 +151,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess this._initialCwd = cwd; this._properties[ProcessPropertyType.InitialCwd] = this._initialCwd; this._properties[ProcessPropertyType.Cwd] = this._initialCwd; - const useConpty = process.platform === 'win32' && getWindowsBuildNumber() >= 18309; + const useConpty = process.platform === 'win32' && getWindowsBuildNumberSync() >= 18309; const useConptyDll = useConpty && this._options.windowsUseConptyDll; this._ptyOptions = { name, @@ -625,7 +626,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess getWindowsPty(): IProcessReadyWindowsPty | undefined { return isWindows ? { backend: 'conpty', - buildNumber: getWindowsBuildNumber() + buildNumber: getWindowsBuildNumberSync() } : undefined; } } diff --git a/src/vs/platform/terminal/node/terminalProfiles.ts b/src/vs/platform/terminal/node/terminalProfiles.ts index ea98eb66fb018..e3198558e6841 100644 --- a/src/vs/platform/terminal/node/terminalProfiles.ts +++ b/src/vs/platform/terminal/node/terminalProfiles.ts @@ -16,8 +16,8 @@ import { enumeratePowerShellInstallations } from '../../../base/node/powershell. import { IConfigurationService } from '../../configuration/common/configuration.js'; import { ILogService } from '../../log/common/log.js'; import { ITerminalEnvironment, ITerminalExecutable, ITerminalProfile, ITerminalProfileSource, ITerminalUnsafePath, ProfileSource, TerminalIcon, TerminalSettingId } from '../common/terminal.js'; -import { getWindowsBuildNumber } from './terminalEnvironment.js'; import { ThemeIcon } from '../../../base/common/themables.js'; +import { getWindowsBuildNumberAsync } from '../../../base/node/windowsVersion.js'; const enum Constants { UnixShellsPath = '/etc/shells' @@ -86,7 +86,7 @@ async function detectAvailableWindowsProfiles( // WSL 2 released in the May 2020 Update, this is where the `-d` flag was added that we depend // upon - const allowWslDiscovery = getWindowsBuildNumber() >= 19041; + const allowWslDiscovery = await getWindowsBuildNumberAsync() >= 19041; await initializeWindowsProfiles(testPwshSourcePaths); diff --git a/src/vs/platform/terminal/test/node/terminalEnvironment.test.ts b/src/vs/platform/terminal/test/node/terminalEnvironment.test.ts index bb03a05958b4b..4b7ab9e50c74d 100644 --- a/src/vs/platform/terminal/test/node/terminalEnvironment.test.ts +++ b/src/vs/platform/terminal/test/node/terminalEnvironment.test.ts @@ -10,7 +10,8 @@ import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/c import { NullLogService } from '../../../log/common/log.js'; import { IProductService } from '../../../product/common/productService.js'; import { ITerminalProcessOptions } from '../../common/terminal.js'; -import { getShellIntegrationInjection, getWindowsBuildNumber, IShellIntegrationConfigInjection, type IShellIntegrationInjectionFailure, sanitizeEnvForLogging } from '../../node/terminalEnvironment.js'; +import { getShellIntegrationInjection, IShellIntegrationConfigInjection, type IShellIntegrationInjectionFailure, sanitizeEnvForLogging } from '../../node/terminalEnvironment.js'; +import { getWindowsBuildNumberSync } from '../../../../base/node/windowsVersion.js'; const enabledProcessOptions: ITerminalProcessOptions = { shellIntegration: { enabled: true, suggestEnabled: false, nonce: '' }, windowsUseConptyDll: false, environmentVariableCollections: undefined, workspaceFolder: undefined, isScreenReaderOptimized: false }; const disabledProcessOptions: ITerminalProcessOptions = { shellIntegration: { enabled: false, suggestEnabled: false, nonce: '' }, windowsUseConptyDll: false, environmentVariableCollections: undefined, workspaceFolder: undefined, isScreenReaderOptimized: false }; @@ -32,14 +33,14 @@ suite('platform - terminalEnvironment', async () => { suite('getShellIntegrationInjection', async () => { suite('should not enable', async () => { // This test is only expected to work on Windows 10 build 18309 and above - (getWindowsBuildNumber() < 18309 ? test.skip : test)('when isFeatureTerminal or when no executable is provided', async () => { + (getWindowsBuildNumberSync() < 18309 ? test.skip : test)('when isFeatureTerminal or when no executable is provided', async () => { strictEqual((await getShellIntegrationInjection({ executable: pwshExe, args: ['-l', '-NoLogo'], isFeatureTerminal: true }, enabledProcessOptions, defaultEnvironment, logService, productService, true)).type, 'failure'); strictEqual((await getShellIntegrationInjection({ executable: pwshExe, args: ['-l', '-NoLogo'], isFeatureTerminal: false }, enabledProcessOptions, defaultEnvironment, logService, productService, true)).type, 'injection'); }); }); // These tests are only expected to work on Windows 10 build 18309 and above - (getWindowsBuildNumber() < 18309 ? suite.skip : suite)('pwsh', async () => { + (getWindowsBuildNumberSync() < 18309 ? suite.skip : suite)('pwsh', async () => { const expectedPs1 = process.platform === 'win32' ? `try { . "${repoRoot}\\out\\vs\\workbench\\contrib\\terminal\\common\\scripts\\shellIntegration.ps1" } catch {}` : `. "${repoRoot}/out/vs/workbench/contrib/terminal/common/scripts/shellIntegration.ps1"`; diff --git a/src/vs/platform/update/electron-main/abstractUpdateService.ts b/src/vs/platform/update/electron-main/abstractUpdateService.ts index 05c4489758b68..698d277ca288b 100644 --- a/src/vs/platform/update/electron-main/abstractUpdateService.ts +++ b/src/vs/platform/update/electron-main/abstractUpdateService.ts @@ -7,7 +7,8 @@ import * as os from 'os'; import { IntervalTimer, timeout } from '../../../base/common/async.js'; import { CancellationToken, CancellationTokenSource } from '../../../base/common/cancellation.js'; import { Emitter, Event } from '../../../base/common/event.js'; -import { isMacintosh } from '../../../base/common/platform.js'; +import { isMacintosh, isWindows } from '../../../base/common/platform.js'; +import { getWindowsReleaseSync } from '../../../base/node/windowsVersion.js'; import { IMeteredConnectionService } from '../../meteredConnection/common/meteredConnection.js'; import { IConfigurationService } from '../../configuration/common/configuration.js'; import { IEnvironmentMainService } from '../../environment/electron-main/environmentMainService.js'; @@ -32,10 +33,13 @@ export function createUpdateURL(baseUpdateUrl: string, platform: string, quality } /** - * Builds common headers for macOS update requests, including those issued + * Builds common headers for update requests, including those issued * via Electron's auto-updater (e.g. setFeedURL({ url, headers })) and - * manual HTTP requests that bypass the auto-updater. On macOS, this includes - * the Darwin kernel version which the update server uses for EOL detection. + * manual HTTP requests that bypass the auto-updater. The headers include + * OS version information which the update server uses for EOL detection. + * + * On macOS, the User-Agent includes the Darwin kernel version. + * On Windows, the User-Agent includes accurate Windows version from the registry. */ export function getUpdateRequestHeaders(productVersion: string): Record | undefined { if (isMacintosh) { @@ -45,6 +49,15 @@ export function getUpdateRequestHeaders(productVersion: string): Record(asJson) .then(update => { const updateType = getUpdateType(); @@ -362,7 +363,8 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun { detached: true, stdio: ['ignore', 'ignore', 'ignore'], - windowsVerbatimArguments: true + windowsVerbatimArguments: true, + env: { ...process.env, __COMPAT_LAYER: 'RunAsInvoker' } } ); @@ -494,7 +496,8 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun } else { spawn(this.availableUpdate.packagePath, ['/silent', '/log', '/mergetasks=runcode,!desktopicon,!quicklaunchicon'], { detached: true, - stdio: ['ignore', 'ignore', 'ignore'] + stdio: ['ignore', 'ignore', 'ignore'], + env: { ...process.env, __COMPAT_LAYER: 'RunAsInvoker' } }); } } From b482c860530f65c75fc7fc1e66e296980e194ca0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 23 Feb 2026 16:25:06 +0100 Subject: [PATCH 22/28] chat - update instructions (#296995) * chat - update instructions * Update .github/copilot-instructions.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/copilot-instructions.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index f121b855a0d42..62d002fc4564b 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -141,6 +141,7 @@ function f(x: number, y: string): void { } - You MUST deal with disposables by registering them immediately after creation for later disposal. Use helpers such as `DisposableStore`, `MutableDisposable` or `DisposableMap`. Do NOT register a disposable to the containing class if the object is created within a method that is called repeadedly to avoid leaks. Instead, return a `IDisposable` from such method and let the caller register it. - You MUST NOT use storage keys of another component only to make changes to that component. You MUST come up with proper API to change another component. - Use `IEditorService` to open editors instead of `IEditorGroupsService.activeGroup.openEditor` to ensure that the editor opening logic is properly followed and to avoid bypassing important features such as `revealIfOpened` or `preserveFocus`. +- Avoid using `bind()`, `call()` and `apply()` solely to control `this` or partially apply arguments; prefer arrow functions or closures to capture the necessary context, and use these methods only when required by an API or interoperability. ## Learnings - Minimize the amount of assertions in tests. Prefer one snapshot-style `assert.deepStrictEqual` over multiple precise assertions, as they are much more difficult to understand and to update. From 28056c3e90f780da7c98ba38026643f41162ed9b Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 23 Feb 2026 09:28:00 -0600 Subject: [PATCH 23/28] Revert "Raise keybinding precedence for chat question carousel and confirmation focus actions" (#297000) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revert "Raise keybinding precedence for chat question carousel and confirmati…" This reverts commit 6955692b89755803beb8585b2a25f6126f3f8549. --- .../contrib/chat/browser/actions/chatAccessibilityActions.ts | 2 +- src/vs/workbench/contrib/chat/browser/actions/chatActions.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts index bc789fbed6df9..99bad32ce49b2 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts @@ -31,7 +31,7 @@ class AnnounceChatConfirmationAction extends Action2 { precondition: ChatContextKeys.enabled, f1: true, keybinding: { - weight: KeybindingWeight.ExternalExtension + 1, + weight: KeybindingWeight.WorkbenchContrib, primary: KeyMod.CtrlCmd | KeyCode.KeyA | KeyMod.Shift, when: ContextKeyExpr.and(CONTEXT_ACCESSIBILITY_MODE_ENABLED, ChatContextKeys.Editing.hasQuestionCarousel.negate()) } diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts index 1472e7f34c197..4903908dd4997 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts @@ -894,7 +894,7 @@ export function registerChatActions() { f1: true, precondition: ChatContextKeys.inChatSession, keybinding: [{ - weight: KeybindingWeight.ExternalExtension + 1, + weight: KeybindingWeight.WorkbenchContrib, primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyA, when: ContextKeyExpr.and(ChatContextKeys.inChatSession, ChatContextKeys.Editing.hasQuestionCarousel), }] From 9bd29418e03e679aa64dd0d0d9278b2daadc53ce Mon Sep 17 00:00:00 2001 From: mrleemurray Date: Mon, 23 Feb 2026 15:33:53 +0000 Subject: [PATCH 24/28] Update @vscode/codicons to version 0.0.45-10 in package.json and package-lock.json --- package-lock.json | 8 ++++---- package.json | 2 +- remote/web/package-lock.json | 8 ++++---- remote/web/package.json | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb3f6db49fff4..8b1b67551abd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "^2.5.6", "@types/semver": "^7.5.8", - "@vscode/codicons": "^0.0.45-8", + "@vscode/codicons": "^0.0.45-10", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/native-watchdog": "^1.4.6", @@ -3059,9 +3059,9 @@ ] }, "node_modules/@vscode/codicons": { - "version": "0.0.45-8", - "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.45-8.tgz", - "integrity": "sha512-5MfjQ+LBXnzLB/+nfpB8EpvHPdUkoW57cFcrIAHz52L/sBjwOxZER3+K2+nwb+/ejAiPmogTBDoJP/NM85uBtQ==", + "version": "0.0.45-10", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.45-10.tgz", + "integrity": "sha512-05CYIpwSYKEQN0qBnfmLC/5VcasOwmeLsl3SGj944UyJ1/vJQpqL153A+0xh4geYEeqcOtIc42emmCizsCzf0Q==", "license": "CC-BY-4.0" }, "node_modules/@vscode/component-explorer": { diff --git a/package.json b/package.json index d82bf82e5de48..8561680d37c23 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "^2.5.6", "@types/semver": "^7.5.8", - "@vscode/codicons": "^0.0.45-8", + "@vscode/codicons": "^0.0.45-10", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/native-watchdog": "^1.4.6", diff --git a/remote/web/package-lock.json b/remote/web/package-lock.json index 8ee7ddeb9bd32..1b80d4aedeac4 100644 --- a/remote/web/package-lock.json +++ b/remote/web/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@vscode/codicons": "^0.0.45-8", + "@vscode/codicons": "^0.0.45-10", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/tree-sitter-wasm": "^0.3.0", "@vscode/vscode-languagedetection": "1.0.23", @@ -73,9 +73,9 @@ "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, "node_modules/@vscode/codicons": { - "version": "0.0.45-8", - "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.45-8.tgz", - "integrity": "sha512-5MfjQ+LBXnzLB/+nfpB8EpvHPdUkoW57cFcrIAHz52L/sBjwOxZER3+K2+nwb+/ejAiPmogTBDoJP/NM85uBtQ==", + "version": "0.0.45-10", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.45-10.tgz", + "integrity": "sha512-05CYIpwSYKEQN0qBnfmLC/5VcasOwmeLsl3SGj944UyJ1/vJQpqL153A+0xh4geYEeqcOtIc42emmCizsCzf0Q==", "license": "CC-BY-4.0" }, "node_modules/@vscode/iconv-lite-umd": { diff --git a/remote/web/package.json b/remote/web/package.json index 37b14b0114ffd..69493c7779ade 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -5,7 +5,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@vscode/codicons": "^0.0.45-8", + "@vscode/codicons": "^0.0.45-10", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/tree-sitter-wasm": "^0.3.0", "@vscode/vscode-languagedetection": "1.0.23", From 2650c907f6ccdc05a7eda06515a1cf379162025d Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 23 Feb 2026 17:11:15 +0100 Subject: [PATCH 25/28] use git lfs (#297013) --- .gitattributes | 2 ++ .../baseline/aiStats/AiStatsHover/Dark.png | Bin 15185 -> 130 bytes .../baseline/aiStats/AiStatsHover/Light.png | Bin 14312 -> 130 bytes .../aiStats/AiStatsHoverNoData/Dark.png | Bin 13527 -> 130 bytes .../aiStats/AiStatsHoverNoData/Light.png | Bin 12674 -> 130 bytes .../baseline/baseUI/ActionBar/Dark.png | Bin 7564 -> 129 bytes .../baseline/baseUI/ActionBar/Light.png | Bin 7687 -> 129 bytes .../baseline/baseUI/ButtonBar/Dark.png | Bin 6834 -> 129 bytes .../baseline/baseUI/ButtonBar/Light.png | Bin 6827 -> 129 bytes .../baseline/baseUI/Buttons/Dark.png | Bin 9641 -> 129 bytes .../baseline/baseUI/Buttons/Light.png | Bin 9661 -> 129 bytes .../baseline/baseUI/CountBadges/Dark.png | Bin 4424 -> 129 bytes .../baseline/baseUI/CountBadges/Light.png | Bin 4258 -> 129 bytes .../baseUI/HighlightedLabels/Dark.png | Bin 18284 -> 130 bytes .../baseUI/HighlightedLabels/Light.png | Bin 17757 -> 130 bytes .../baseline/baseUI/InputBoxes/Dark.png | Bin 7097 -> 129 bytes .../baseline/baseUI/InputBoxes/Light.png | Bin 6869 -> 129 bytes .../baseline/baseUI/ProgressBars/Dark.png | Bin 8951 -> 129 bytes .../baseline/baseUI/ProgressBars/Light.png | Bin 9062 -> 129 bytes .../baseline/baseUI/Toggles/Dark.png | Bin 7010 -> 129 bytes .../baseline/baseUI/Toggles/Light.png | Bin 7030 -> 129 bytes .../baseline/codeEditor/CodeEditor/Dark.png | Bin 38205 -> 130 bytes .../baseline/codeEditor/CodeEditor/Light.png | Bin 36998 -> 130 bytes .../inlineCompletions/InsertionView/Dark.png | Bin 11188 -> 130 bytes .../inlineCompletions/InsertionView/Light.png | Bin 11067 -> 130 bytes .../inlineCompletions/SideBySideView/Dark.png | Bin 11036 -> 130 bytes .../SideBySideView/Light.png | Bin 10906 -> 130 bytes .../WordReplacementView/Dark.png | Bin 10179 -> 130 bytes .../WordReplacementView/Light.png | Bin 10049 -> 130 bytes 29 files changed, 2 insertions(+) diff --git a/.gitattributes b/.gitattributes index f6263094d01a2..3df26d6a42897 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9,3 +9,5 @@ ThirdPartyNotices.txt eol=crlf *.sh eol=lf *.rtf -text **/*.json linguist-language=jsonc + +test/componentFixtures/.screenshots/**/*.png filter=lfs diff=lfs merge=lfs -text diff --git a/test/componentFixtures/.screenshots/baseline/aiStats/AiStatsHover/Dark.png b/test/componentFixtures/.screenshots/baseline/aiStats/AiStatsHover/Dark.png index 2d42f424f6b8809bb3eb28284f83937918f6cc63..bfe8d842cf7fea425c55456a0c81d0ce3a78e828 100644 GIT binary patch literal 130 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 JDp8|={|8TGH^cw{ diff --git a/test/componentFixtures/.screenshots/baseline/aiStats/AiStatsHover/Light.png b/test/componentFixtures/.screenshots/baseline/aiStats/AiStatsHover/Light.png index 7fb858eae279f016798d70e896c22b7ca078fc80..dde67257b6050dd30dc9627cd5c9078138ebdf00 100644 GIT binary patch literal 130 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 XkPj7i+EXO|EC6Xq1&L}g!{Gk`v_19l diff --git a/test/componentFixtures/.screenshots/baseline/aiStats/AiStatsHoverNoData/Dark.png b/test/componentFixtures/.screenshots/baseline/aiStats/AiStatsHoverNoData/Dark.png index 9ebb23a380665113e8441e496a2351b65355f460..5657241a83eb78cd794b3eb756f4f117bdfc4840 100644 GIT binary patch literal 130 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 Y=LfOp%ikmazQD*zDoWId{RsMh0K;!Pt^fc4 diff --git a/test/componentFixtures/.screenshots/baseline/aiStats/AiStatsHoverNoData/Light.png b/test/componentFixtures/.screenshots/baseline/aiStats/AiStatsHoverNoData/Light.png index e631cc0c3c30bbd1435440976b5fcd8940f2948d..b09c6acc05a065fa5c83b97f58fe0496929e8cb3 100644 GIT binary patch literal 130 zcmWN?%MrpL5CG6SRnUMzmd`Hf1{M%zR5C(xuzG!$ca_iV<1O1-$J~{A^mTjIx&3cv z+IYOwJPNBzi_x>3ErRpADcONT)(|s9pS`7;lM95Fz-lnT-UH~s#B4NGN(C@ggJ>Nj N%3}6!ks3T&@dL@TCc6Lt literal 12674 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 U$)KO1e|Iivsp+d$D!+dJKOMUO^8f$< diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/ActionBar/Light.png b/test/componentFixtures/.screenshots/baseline/baseUI/ActionBar/Light.png index 6523771ae702a8fcf726e8285ee6b16e3a2018cd..813f2881117ec6dd616294e21b9ea6bd07890c07 100644 GIT binary patch literal 129 zcmWN?%MHUI3;@tOQ?Nh-CVaCEIHn-AC8|jdoxYKt^e*~xA0OG~Ja|*;+2`X`dAV MT5$i73_b?&2eSbuDgXcg literal 7687 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 NBoL$hvc#~0_yempCddE) literal 6834 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 WgfVJ0qB-&~f}x_IDG!mg2>&;ZlQl&E diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/ButtonBar/Light.png b/test/componentFixtures/.screenshots/baseline/baseUI/ButtonBar/Light.png index 9afb35e184937e915b51e25091b2a58d91177741..8ba87df3aa87cadcad1b5a8766db7bd63167289c 100644 GIT binary patch literal 129 zcmWN?%MrpL5CG6SRnUNeUH<6?0xQg@WL(U_>h)dT)!sbjOZK%+-j%wKb$bwR|NEzG z$9yV2+o3KHb5zMaqw{;9Kt5+vV$=b%(+LQSgIKLE4kG~7O4Jg@OvyT^p&47e&c32; MTJZQb=_3a51GOwC4*&oF literal 6827 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 D{87=t diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/Buttons/Dark.png b/test/componentFixtures/.screenshots/baseline/baseUI/Buttons/Dark.png index cd2a52efff43b212e555ed68ef3edd4098f085f8..0d199f49f958da468f444decd511d3d552cc1df2 100644 GIT binary patch literal 129 zcmWN?%MrpL5CG6SRnUNe<+DP%VHXf)R5C(xuzG!$ca_iV<1O1-$J~{A^mTjIx&3b^ zZ9HCT9);BfV)QI$OUC1FOZDjQh!!z2)fgCvoX=WUQ-fyfl0nF5GdWBp*#Lx&b!JTw MyqNu4WJCwz2f02cEdT%j literal 9641 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 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/Buttons/Light.png b/test/componentFixtures/.screenshots/baseline/baseUI/Buttons/Light.png index 9651d1f2d57b05d5eb2953eee1db9f45a5b8b344..fe6af01eca08e263971c33de0c307a2a25937f7d 100644 GIT binary patch literal 129 zcmWN?K@!3s3;@78uiyg~36e^GLqZT{R5}KG@bz}~u!nrKkGE}e?z%bm==1Wdx}3K! zEj(UMcVTyUGkUSwGDO@URU(2bm4K3|dV!EJruzznNX&uqDonz$Ks|BI7)q%(qyz*; K`%i2_^yUu?Ybgf+ literal 9661 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 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/CountBadges/Dark.png b/test/componentFixtures/.screenshots/baseline/baseUI/CountBadges/Dark.png index e6cc74cdfc2c5820631108932f0269a3e661c5aa..9dff836eb821b4725970a0bce54937150c72def2 100644 GIT binary patch literal 129 zcmWN`OA>=13;@tQr{Dq=h4Aw>l7zxcTb%}7^z?Q07VqM(^!=mT7>BIJJo|XOs!X@- zEEDc;BL}0o7PWWM(l+bE$}v_B>}+r;7L4=acq2$mnG-s~SSigVW{)jKjOD1^8f$< literal 4424 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 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/CountBadges/Light.png b/test/componentFixtures/.screenshots/baseline/baseUI/CountBadges/Light.png index 8e9cd825d1fd1218c2e4482a46f8903778a7e1ba..d7035b0ed58adce58108d31d6bd38e2df786c508 100644 GIT binary patch literal 129 zcmWN?%MrpL5CG6SRnUN81IsVnEU*YODjC5XtX|*cUHqPXykuMJoQG2PzHW~?xBu;v zwmhC{o}AUSi_wdmjkI-#cagKJo|3o5Mi&u%U;rQlpAe%j5P-p9EjA^pyKyn@!BFO; M3B>GQmZ)tIKb&zUt^fc4 literal 4258 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 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/HighlightedLabels/Dark.png b/test/componentFixtures/.screenshots/baseline/baseUI/HighlightedLabels/Dark.png index 36ed40b5266b741e98c677fd2aae3d812231b7ef..ee0b9f27b9786eae1861bd18426b71ebb6899387 100644 GIT binary patch literal 130 zcmWN?%MHUI3;@u3reJ{vF#l{5gDFUDiE5HVr*EVuy^Frw$49g|58kAF_W5{KUhmt9 zYaVaO2W5HbW%MGr?cn@oqEf-e9RQ5M>T50ztPhB&C}0K(9&WBgowO=0MMSD5DOFPN Ne&PNjp(8}Q`~kwzCa?ei literal 18284 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 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/HighlightedLabels/Light.png b/test/componentFixtures/.screenshots/baseline/baseUI/HighlightedLabels/Light.png index cfca6a3329a9ab7f8e19dd817a9ccd7421dbfe05..3798f28702dbb6e6447269ca53befaedea6d6ab1 100644 GIT binary patch literal 130 zcmWN?NfN>!5CFh?Ucm

#*cE%rFR5Dk;Gne7*LiFMiKHUZSma&O^$3U$;k{`~UXA zoyJqnlSy8B8@-6xvH^b>oxmWts+vxGywvDOVscqYKr?zc#I<=?m)VA$T%@nC^8>c@$>zqH}IeD?~yvoYT z+AGQZ-JfemDJe)I!r{SzfPf%MONps~fPm(FJx_-L`#RP_7v6w?pnyn=39ET#pLH?0 z?&!P4pug|F9+(OQ??4Dh z?QB%Jm#9}Psn7Qr!2d$WUH{JJB13YO4}W8;&kF6b*;kcJJOCcs>w*#V-iDLTd2d~{ zScko7fraAi(9HZYa!-x09r zLve9%b?)OqjOUKm;oyNE(=sZKmMZc2(mnQmH^#7<-W}GHL>vw6>97C0?guIWzzgj4 z$MMCORt4tmBMvh_fr-zSjz7+R!$WLm_$ z(rW1z%GF`p@cFIt*K%)uS#o*wMiW6c9GnS#Vl3Tx?c% zceepkuG(U=D8!H>*%bdzI02I)H7l!XwO~|qpA~u1tNLZmGoVIHk!;hcP+^@|tgHE- zrTH~=!vhIW`WCfAKjJnoe2EFc@vWFGrgv0B1H_?E zcSYfaL0a^02y{~jnr=*|@{Yo(`R+O-eaMRHU?*#a>~&djp}ty;=7uz?a5tCPR3Cgy z27jRL-pmKIzr+C11yg{u*P5s zEb0~XPmx5fa;(;au<;IPHh<}#Z(?}d%1cI?{{k~Eo80L(=80$Ss`OJRVUm-GHc#SP z0)@n$qjJ}Xto3~(F(pi8bEoUrpF^|dyuIC!l+MsQEOj*gyJ8Dr3EPYWce-$UtP+tx zRSz4EV5CrE$J6@?uP(sm)+8xQz?}%3!1I}H8OGW34S3xE49eT9$rb=34iLi?Hn%f#;V=?Q#yyv4q}BOwSHV?i27ZP7o93k71eee@-T6W_Gidm*xHH~U{Ei) ziEiY+mmNU0oINfUt0ajUBPxOMenICw9s&C=^hS!3)DCisOH(H8!1}Sxy?55nThmQ) ziYQ-y-Ws{Vhed03x6lb~Co|&+vmk}bg>son9Q-w?=3kp{l!Eh^v^pPf!+dw8OK0D+ zN=gd(=_z7t-8=s9&w2^|Wub_FB;BEsd+7ME>nh$>srDtf@zpzGZ%gW~q)iktGfDaB zOojbObQLb=WP?zB+Rlyf<}P_^Y@3Yu^MeFsajzp@^oDFVptAF@org`QDYYq;hb~^O z<0pl$^kue3Nm`a6W5+_*2|wgv#XYZ;qEQH+_!id~{Hfw4L^sHY3n;;ewgF0O)OCqR ztr1sB)NLVCsN0z~7k^s1r_JkHw2RC`sC$bd%Am+%5z3MQv{ zI#7chSXs?jP>v((%&=*_yV;AO;|6cphF+6j#UF7AsGPy^`6o+zxsqNXim=mEb%>m) zLour0Lz1v6C?j>)#xv^d=!X>kJhSh8h(Y!F%k!zy!aL^FiO6W6e|BFoMRC%$Yq!!( z{AISTW<7GT$DO6Yx7~TyEqwr!=tjN{yoWRT`flYUAj^hS@Bom&{rzqar<$oO|acP^#?d}!#0)N!D zv<&z3g#hjH)Lw$&G568Wuv&OO0xY%uAjl)eIFQhQh;Lm8>Ta#JN9DW3V;1<$S$X1b zae_jalzS!8GpnxH64Z-8xC6nj{>$`HNE M@S*Hs@`(Ix{i^{{zgo_15H}6DCod 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 MS&a5$37SCs0kM-NQUCw| literal 7097 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 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/InputBoxes/Light.png b/test/componentFixtures/.screenshots/baseline/baseUI/InputBoxes/Light.png index 5cc01688c8f07b960e68e9a83761ca0c053d5277..d247eb3f93ddab5690fc35f552b85c90890655e0 100644 GIT binary patch literal 129 zcmWN`xe>!45CFiODrmrhJ2)P7!)utajm97auHK3^*sFYJA0OVCc^*# literal 6869 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 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/ProgressBars/Dark.png b/test/componentFixtures/.screenshots/baseline/baseUI/ProgressBars/Dark.png index 25d6dc177151aafe99226102d8e44caa88a8a19f..c1901de3f12a4a84bc8d0915a18bacb1a0daaecd 100644 GIT binary patch literal 129 zcmWN?%MpVh5CG6SRnS1h<-6Do!fs$D2~I!{sXo5TyXZSw|HwM$F*c>1Z9ZN+miv0{ zOYUzq4$A5R(OZ$DChh#jg-nRZpsBc9M(+yl1V|-#iwU)k$)GoDF2P!Dc-0;OjRj`o L#ArW~7#)Z|vO6Yf literal 8951 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 IF~iUQ1izY#1^@s6 diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/Toggles/Dark.png b/test/componentFixtures/.screenshots/baseline/baseUI/Toggles/Dark.png index a59cc7894d20e6a52b5598019e3076976c0d26cc..4c15594792160660c4faf4e4e686ead0e6e66978 100644 GIT binary patch literal 129 zcmWN?NfN>!5CFh?Ucm?FXnyCkOxl literal 7010 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 bjEOdDJZ|qjzbW@m?Mzu-<4u{YMacgEKOT&f diff --git a/test/componentFixtures/.screenshots/baseline/baseUI/Toggles/Light.png b/test/componentFixtures/.screenshots/baseline/baseUI/Toggles/Light.png index 49c44de392fcae9c36a85b24817e68b05a5d08c6..4345d2aa11d79aa9e3157eeb40b2128a859f614e 100644 GIT binary patch literal 129 zcmWN?%MrpL5CG6SRnUOpyStEXU?IYcN=7gTtJimVSAEYuUb3xq&RwZ{U$@6GxBu;v zHy%$l&&ujDV)P>?N}q!FN&To}>#Xfharlza>^5ctFv MvzYx`C26O{52I8jh5!Hn literal 7030 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 diff --git a/test/componentFixtures/.screenshots/baseline/codeEditor/CodeEditor/Dark.png b/test/componentFixtures/.screenshots/baseline/codeEditor/CodeEditor/Dark.png index b5d9569f906bd105f4f5f7c158432fa06734ffb6..339aeb80c75bab39beed7f23e5cb7436c48984f0 100644 GIT binary patch literal 130 zcmWN?K@!3s3;@7;U%>|~gaD!a4TK=fsO<>$;OliSd&ztB?O@&n7LCjkHe literal 38205 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 NyUqS(VKBz9{Q%bXCv5-# literal 36998 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 TAIq$>fFcZ@u6{1-oD!M<-uoAL diff --git a/test/componentFixtures/.screenshots/baseline/inlineCompletions/InsertionView/Dark.png b/test/componentFixtures/.screenshots/baseline/inlineCompletions/InsertionView/Dark.png index b10535a2ffd01d10e178ace205234214abc80c70..ebee6a6096cdf226b6e024788a9a71579396aca9 100644 GIT binary patch literal 130 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 LYBEr%&%yr(P*CeH diff --git a/test/componentFixtures/.screenshots/baseline/inlineCompletions/InsertionView/Light.png b/test/componentFixtures/.screenshots/baseline/inlineCompletions/InsertionView/Light.png index a6fd87499a81477d52b3e207fb9a30918df5e2a6..63b05939a6dbd20e7809ff9952d9d031d3e7f34d 100644 GIT binary patch literal 130 zcmWN`yAi`63;@vHQ?NjcB);}GARus;1Yf`|GJRaV;$8VWTK|YT=P`CEpKU%~WvsXL zj4SuI97kq(;nG_YqXsf|hfn~KveFvU=2c?glp##MgOB9y N-ImdQSs;RS%OB^2CqMuI literal 11067 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 diff --git a/test/componentFixtures/.screenshots/baseline/inlineCompletions/SideBySideView/Dark.png b/test/componentFixtures/.screenshots/baseline/inlineCompletions/SideBySideView/Dark.png index 52a2280560a1d43e2683e48857af53a383b7d035..ad2595b04837a3d7c3d37c164f58ddc35d55f27f 100644 GIT binary patch literal 130 zcmWN{OA^8$3;@tQr{Dq>k_L#q4PRkKrDJLrp5CtB=AHE;W4?7ij$Jlm9^<$@n=F_8 zo0dFZM)sP`32Kg_rAKsrYnc)zh=f( M5R{Bx)o^96{=L>FA^-pY literal 11036 zcmeHNWm6o$vP~etEf7KoE*so~yUXIfus|TV>*5gHo#5^c!QI{6-4|Hg_2u5GSMN`} zFH=)f)7@1)J>5NLPKctsBs$7Bly~pmp-W4NDZhL7{`%j%1PSinI4ene`tBXpJ83at zRhP7rHFU7b&Evasc$YwHT2Xvj6`v2P=f2-#P_heR3(WlS$b8^lO4oX^8S;*S?eY4d zpaiDk&jvZgtBtW@ZsNVF-9iS@zgb7+))WJ)-}AOUXVz>Hp1~Vc_guY1N7U4$oZ_uYohqgh~CeSg}^y+nmyH{CGu> zSfW{czL7tihRvS^b7L3?I38d>ieI+P51eT6q{uPjTkaj{q#mpsd(ti4UU8mj!uqII zZfJe2cIq5oB0YmJ&$Lbp&M4rrFLsa4(HXFAArl-`8xW0#fP!p^a&f@!?;bi{AS?dl*L@mbCZ%<-Ah$q{>ehum(ETLwAOc2ZQ$k@Z$;6#j@xHawLW1p{U z?-z5StRu;#4T0eX#l}c0o_uJp&d0kY!KRPmt2tef`?j4*P)i;}T~Pa+P{W zs#S2lo>aW(`&jwn&LO zm6uGO5jXQwvu@_5ebUQQ6wND9k=iiAi8*O>+p__gPc{o z1ehXWZ)r8O$p4Agh+`d?h%kzSL>>o~>V}|bwk?N^hDT^Ygo}2$T^s*y)so=?Dy|gr zMp#qfsF?KCc6yLV<=NLr*`gP|5keHK%U;o#Gs{9t z3Esa)oRq6NUL24ah)>$VK2htTsB)9FO+xstf>yhLKND9q8@Y}ckL$-#R7{F_@$aFG zmLQkx*Uv7j1}X+SHRuBnv`hf^QsZUsw&t?!%&qk@#oueK)>%#$`^Y1(jJ@XN=zY7rC47TS6E?lAU>uUyeZ7k+;(O4klK;A@qA%>xtyH9g#Q zEv({KmEzXu0VYxXg*}hDT;DQ5%Z3Tl&$&|2|$dyNcoZiF5&+l8m)3I>q z4&t*d`2eF6a`o`Vjfg|#W$|RhKhjA4>?7n`UA8QtsxC>N{#l-|Bps>Yx z4<$Ol7@$PRY9;rgA<&QHZUM2saITP7Sn5moWxMtijg95qB8ybx<1&(yll6vuoxf{= z_0eS*Y1Hhq9t%|T5g0pHP2{S{D8-fiY>oL&0&{k!A0I=&j2iZfC4-{&4~p|x zd%+p4H|Xo3z~L)#dne|2puh6)P^>_}7cjuh>zZ+utYWZy{W(w#8!*AZ#sEStSW43|Y)FhrOUW27LZ z7b2sp)d7eXk^lQ|6CJ+zrG)#~)vdi>bz*Z8V8XD}k5zo?OjsD7@HO{PPkPY}5=Mt+ zqyAQU6hQxFilbiTd>_3Ap@-%N)!S#H$JkCNx0)g_)u4_v5v(?Q>1K`2oOfrg#AY!=%Hd~&wm(4yR`JU6 zG}4Sf+!^V}d_dut#-JEEcaUJ{hDQ`{XvIdg<8j4%8$d3XhnMH4_p~#7)vD9k*zYOt zlmUjT2`7&YzJv{9iNSeeHb|Zyg_2i z?l6580s|PVTq#R)>B@w=84ZU*#aPqH*#Wqe1BFP)?eHCAg1jO+A^MI1KVWQCZ$jipYkKqeb1bov znue%5JtbrdMJYk3dut`>7;9}yjP%!qnir9@ClfEsZd4`2DoszohD68mKnM_&M|rEEOAjFKgPO)#QkY`meA{y0cP z^;I6>fX4ywHF@T;k{YTnCXzW)3FxbPRPRd%Fz*=_NK&_wWJ6Jgh}#@jQic+49Ll)4 z@WJBlf7Bz%k5$ z0{l$xMS+X8O>}GYPLd{3iZbWArewR3-gBY=mfzL>o&XY59iNXKBNhGJSivBzAe-9C zXXy;q%&my_Cx1HuDK(}N2y(ZVa~O*YKaazw^>wA*F_FhtKi5FH^H0SHv~=}x>&t@( zG~zutGP^b?g@TQLSS|k`#I4rOQJ~U)HdNDth;%es12vv#e=VGjO*;qgH8bc5X7bcp zo4B`|p)f5s$9r?w!^qxeU{BUix+_-fbn0VZU}!p=sb{&dZn($d#D_|?rzYZn;u9X| zd3*+0qk1!N?M9v65)M^F><6EF4=Ivi$9V=)kikz?j1skoKF5wWTNoOOkf$ zIle^|f%o!RkkE(MEXEpieAYa#1CjA{xsLp)o?4GyLOI*Y-@htmI&a?Zo;b_Os_KOb zTb1Ud*uct*$^mFHK!Qt0{7LKLAFSUrRp7hYR0QotMU_-j-ODs8b&n8ly4n)fG7l?` z7GID&eMUoBy^PlsmLi1-=0`VYFvSJSK?EB2AKL1r!;1AY8NSMS1N2^>D%6yU0lhPw zP8i6T+Zm51rL(bxgc#aj{b{$`6!h0yM{^492G_My%hmPcOdUGoG3Zv=q z-G+bjyfY6K17FXbXNPM&`;rfCK`73A`yNT{k*zRQ6cmV&@#cD8Sc$pIGq!$VHCU>S z0FKR)smK^61s}LALtjc!q)ZU7R^c-bUR?|Am%MFAhGXSwjy-7?wGuTVjx?TfjQmVr z+kxyp&8+n={uf`i9g6$z`4t)X8|9f=1mV-UvUigR}_Qi^+IVoruPitw@ z{=y0nKDM!}XSDOCZ8kK*BQk|TwaK^xEs-2zbaAgFy6LE=&X5r?D0fSk0+;4h{NM_C zS7y#AN821}PZx7L2c6Q0vAI_I5Y~b5PCV9c7vc58gn4r=Z$c!RbQrA~65X#a(nOWZ zwY841$6OSYhPS95*k5AE>QXyf?w2IwoPw=(jx5zXcxEvwnye zCc(Uq2~`?!qR-#Crko$>8ePc0?>lC%Pw=%)SmC~Og||J=jHhD6>b z7@Bo8`L)bRe)6;(ONT*EOeYEvS82xY&tAWB9nB)*0RZJ?MZOLixRE&E#cj5hTnv+$ z4J(VA=&U^a03(%j9jnErCKuMzSTxIfpXKJ}6s?@HYFJ<{o$}5(uuP6gz2*8$t6Ww+ zBfC^XcF%CY3eEGNZ7_)rr5<0$#CNzmwo1svb-Ermn+~F|Bl6xuLA(T!12$C)5lU89bgcSlBN|jDN46s;-y5SZVgkc z2vB|oG#LOE#w#w$`?Jx1_1p#B1-L_U<>z$b$mU)iQ@%0XRRxd5u6Y&BAi{4yl>m1S zc8d4#q=d~hxFee6o%E40&IHnAs8j*fGkr_fs?(!(trVqPWT&bevUnt6Kqm|m&h^OD z7-79^YQPdQGJbS?m_jDw`E|{XU9iaD+EM~oBt}P*I)MfW)DPW$1VpPd;#kHvu>?)* ziFBvAZ8wHl6kRpWv(m>N@Xf_EH$VMUM(~u5b~{maM)~%?Sb%?o!{P^xQa0p1n7pgD zF3-x617#@}&8aM-WzMzBG*_Y!EDM+dN{&&@&Y1!vgU^q@_#7!Yj-D+mRE<)VEwT$+ z_(s159UpQhPz93yk*RFvg4+6yAY_I>R!_oj8=mc8{ZYFzDtCmr&ir_P+?0n z`!_D9rpHWEY=%`D9vJ_@O%&#mQ#WZLJNyUj~LB@+rUj zSE5S-wB)DDxQ0{#cXMOhN(~)gWx(U;v9wM;YE>ORS&Q;wcKD7<4n4UVw|8j-oYj$QvTN>n=F zrU8&Q+^fuOW|dz^?x0Y(DSm7s@C`mC>1uC_`-A7mx}Lz}p@&6}3+$; z`Gea&8b#xsF+SA?^u4NZDsOF7ttr`LBMF16zbj+aw=;NuQY*fCqp)Xf&Idg$NC@P&Cr`-cGhg&lf%vy5cucoT+v~eY3~KV{{Ht5@#`O78 zT{CJ^svZAysC6Yb4i<%jSw`3$U$AxKmQq(2>Tg7ScWtHN#wqXfBN&I@nV%9)Q`7V= zw?Q*)qq55#Z z*B2vVTlx%=!?m@!H4E1CevHj4Um-lQm9i}lwEwdWhs;q3QTkV)ci@8}cayDo^;oA8 zu9|<5+~ZHSz%ZD9xz=e@O>#f=wdhz7sNk^f-Z~`SyNj^I@A8c6V(*#@2lcLoHOU-9 zz1Y&q>C3Oyq)51Fn~TW9z-h4ccE{WFDI8 z>mNJ>M$t*8cuE%`p91=n0TW9zdv-oP*m^R`O^i_~pXBYn;(lV<+Hts60rumnq=L#bXZ$bVF) z2F8$2d2CSOKVqebOFbkI$GKu7GN2{Meg+rzR<_J^SZB2I4Au2kF6P=<-J#1eR@Z#- zCqL`W*jdHuhl1utY$F*!6c6y%cLj6jPcZJ6SZT<{V0K zl$Rd)it2R$`S4{t_B(|~gfiz^p0l3SJZN@G49&IqgS7-HrAntV=2dUIPQL3{W`i;F z*_&i(&qmvPm({&%A`RZee4+aS8V)BCSAW+Z&t-3lqDM9`DR^dzN=ihqalWPW-B+Re z7_Kf;!+a2=j+eHwDVW5?i+S_VEV7+$+!7aq^5(A3(H%m55m3Y}AF2M3W%@O8Xx9)8 zsaf#nF%c8zfGHSl;n(ZGKb!84U@7+obVlab+e!^WruU4Aj{X`2qTx?RSl28l8%nzM zK+=vl-CG}7H=II=)Ld8^w)WnudGIi9(RRTM^ad<5lG7;^5@H;S8=s7dD1-9vVJ@ps zV~%uGbmG}L6~Uc_@XV&i>hQnYx(!6Uqf&O6LT+6KQPx`!!?Zp}WY!O#0IT|Mk!ua$!~hN{s&NyU~#?9TpUsTejFXX1v<=D2=psS@$-XU-v*P2?#<$(F=0C@4f#}<`3;Iogz9;81U$$am)PDwAP@M&fqU2REp z-asbU*+#+inrLh^+0f|4IZt^kIa___qNwHe<`X!;E*D)ccnGRoEp={?YZDp zpEQXVq@TO)#db2jrfrt!{jhWNkx1|6uKf5_;Or#yHE(yF2nOx%?@#6Q{Djk@5S=QQ zWrD(Xce;11qlB8+>be)@xE%t>e8pd?=8TSt#`7r-zbCY>gohDAE9HeHlGebJ)=ZU zWEo6tX)h-GJ(vA^E4;DVnPP1UUmFiBB}UWsIsMnao)J#IX;W=x}u_Z zyj3hLHw`7S4s~0n>H+#+zv7m)bO!eQesnC!zHRT-a=xs8V_Ah(T1@=Zjz&PZGx^#1 zTiELjt@bazu^5(bt00a%aff>%ao#JpHm~3YsereX>qAdi;`kfYmgLPdZ$0egWf-8H zs_%zz8D_K2Xs+;uFh+UJm&Hd(x4h+&%)U2De`bI3h@f{m7HhTv%6QLU~C(tx&CK0uw#}a zxx@L;3h9g4H&$<>>12{hyuA=>R5>~K`PmpGeu1<3NHsSB!$Gy(cH0?uzpm3KHLXuWbmMWJ>VJ?U8u?&9|u;S);elMGJU7 zenGCpQ7|62a99HmytzD2mdu^$G<%R;>yZeVe&_iBdD4FWmS}&vfJu=cqUmii^;BgN zjNy}_T$y2M%28BN9EisM66Nrb^IQDd5HTg++;xC$^_!dX?6^&R1R;z0Hjt^5>K67Z zAvN)8>EM{t=0Q`79670@^M2|sZ`0$}LAkrOxN;wFw+sIow=($%3Vf@>UdDxZw*2ZT zd}E}G3uwdBFT0tey~%OEcHz-!+Ke*g9Lr8z&Qz^oj&HuM}C(}K|tpH zVf^Y@`c=75Z{pd5K@hK?<8a^F!17si)ftmGUYO8Fbza(V@6GZ0mWU;d4_o2o;DLon=-%3B?Poc0{7@t@ zFJ;VnTS8`{?d2jDCuWYQ7U=Qbj!Ea`3Ul$pqV3?M`w#jBjITn8v-<3g;K@!Obu5}$ zLEFCEWQ+q$slRMBtUndHPXk`iMgTk?Di}zS1F(?)kh@IqI@`FrwaPjo{ooUD(L@nH z@=5SZ72tI|uR2Iy>vQ&(%Y5X9QZ2?sC-rO?9bysO^j_hO7Zkiy=84$@9dVT3FCN%d zs|tQZoFD;R@AdTo&7x24*b0MieZoW#pFTb1I_q>~U`l=hKXp=aiI$LYXE4 z_E#n76g4z}vvrl2PcPF?UtV0T#?>`Ue(I?+(`zP7HTb|Ig!Fo=$OR(TR#nl{#LyN$ zJ}n1}c}ID^ijURoVIGf6?(OYa%D*&xt=ORU*L=P>ny~+%akj?fgXv*L!!M5!@42~= z>Ww;A(*;jKL6Nj5qs%vHk7XDfu}nEO_Efx4rK1IE=5EM*ltmzAE*|(bNvdX+t6Y4X z?s>Y=f#*=<#SEY59iGfL6sDMdp0)kgRG<3Ubf3P7>YodhUpw9y=bup))cAA}nc(78 z)n++KT;*=@d6$3r`-Pnwdx=bE^E$r;7V4&R*n}PsiiJ1ozVhRtq-Ts#c8%!PS6J@v-c5H+865!yXG$tR{zZ5m1Uh^ zpy#c#ZQOpn8^&wV5RLn7Tu*CcByRK+_`bBHjC9C2Fg)ni0}hJ%FXsvk`1b|7Jj1${ zmzN7>vg>PHM|g^2qagUaR>P&y#$K)ZYE7*VOmSc9czWT=u)+A2YwI9RYmRCC-$96& z&?kXwcD9*|aJV`huF_%>Ox1KH(-NKEOVPOR-k~)8hZpeVIx8{g5F-Ec`U8a;A3YQA z>jwO}O|k4F<^bN84`t7W1pNK;6CK1&>d`NcqghZD&yJ^TyZh4eQmf|cy96&y5D0m} zmD|@6QmMPraLO{T#c~7uA&F1Oe0~=o^mba^pU+Vv39X|krTTHJ+irim5bpw7;)l7$ z!!S=L4=<~p-}_|H{3qLimqjCGIq=;GSV5?$8OA)L4rg8~5Bohqn48nQ-ys|O6AQwy z_5OYCq$2B#In|&oEn$+qoUlPwpzHW8*BdH5aWq9gykI z+JcyVqq5nL56X6SpVE4=F6H^&Q{M{(@|HFE+5qXw-ZKpG%YF+-Mc+H|fk!m++S5iq zJs1C7UyXP-q4%6mlDJT+@v_;!5a6m&JsqgIbaZ){!SCLE8u11loI4TR{2+L*BwT6R8n7)3WJ4ol?wzgGFt7*b4q^y|xV@Q=19JE`qg;;X<>2^LzOLSg#g!N4J)BHNtqj1!r?9aD-2zZMPj0+?lWgrNV$r6Uiv4E8;tcVS@hsP6B&E(8i(gQEcyoj zLgiwNJgK52_2ALvsjH96|0$VGcVf7mJW;US8Mn4cxJ^x^^W%ZCg6KG^#YY^nTj7y| z%RBPgMBE?VT~q`)TxtC~T0(Ph<{x)-J-}HuMo>JabZ0wa)N<6Sh^u{sALfGo3Gmdm z4cNaOuaA>eW(vnrm`?$wxq&4ge{8pH^0fcKo&U|Yy2xT(Wt~D(eDG$%X?Z^q*P2Cx z4PpPB_%rkt$WgWi2V%>H56)m~d!~1FboI9|W|?|XlMeYBN|u6OWFC4lbsI7I5224n z30EcJP;~O)2;|Tsr*DtB(->dz36qGl_01h$x4vJF5}31IR9)yTIx;plctZhQwTAId z5o2IbkR6!v@SDDhP`{v0@et@QwO#!LNoVsY%}DFh)7fh8upxSx4{h#u(lP>OCY-GW&B7iE()|1m{e-5?lo_4g zI0~KlLv%C7A3r{4*6uR?D3!@~*4EQ!FS2jNz4y+vc|~EgSl9de6$NaY5E}Awi(9#{ zdFFIb@wFZ}laSSK>>!hetuv1jDkb_bX@1njevGJg;(N@Eh+#F8@!sB65npy}k zdhBYJJ&qh3GdMR=yQ9p-P<;$}raEqbt+!C@M2%RDmn|hE1d@EUK4@h=?_tpMB5jjg zsJpK5NvU(&Gs?89V5;1hzG$g4SO2;UZ@vE6yxl$NUY;FMZpW_B7zqu%@s?wB_vmb!YnWuZXx*%|a+#a^2QR3C3^ z=|kjo`%CT`te#DovL!KkB&=5MdnoTf(k79g6wu5Csubh_R6jgX#sd`RpUx&OK1`#I zuHNJcI5e1c(FjC`)5KuADDM+jK^kPjA@gb>;@n?};tT)6jyP*N26OB@*%~Z`$Yf-*)Mn zW#Q&nX&V=IHt9oWMz8NJdcl-#$}gStzF*^!Ns_$YHrGtk@bE~d{hlY_{uT`O!VaLu z!)5|C(+<kFzBGAk+eR*2t zu$aw%bj`o0HQANBrFA|}nxt;GP@uv(B0e`= zfbaR{)!AG7=I|x$TVGpsp$_X*P99RMxa0mi<_I?o(pjQS{Yn#r=`8bAo88$3qQlf- zwM5+X3F_7je0F?X8QRY@CQYsi@=*eG(GcrWT69cDe?=2!d=AUSe|J5Yu|l4vgNm_< zDp&ULy5ZZXo2|;F(313;4DH#ojv1TLxJBi7$|zoeF18vr64@-SsydB(%F&NQ@3+?% z^n5x)xquUl=haVNWcnvu*Sl_;4<``Q9w83!bY9|1bE56S-sbWR9Mb%Qx zBeGQWi{$=_g>3#6(PEYF$K!}p1HQ{JHhJD$*Bx{67Lrhs&V6JEhar*q&ENRB%Qc;Q zgr4(dlUM=?2psZdDXFkT27hlYvVOZ>WF;_0|GxV`MP8Ga)cnsnK7up4nHh`( z-%I}&8aaL~|3IeykV=JLN#4DCd&8Hf!YMfgt>3;#}x5oS`A8*}`W1pKbkAB>qbuRzg znHL@}Gxx&gLN&VR*^+gBLy4T%N{OHdb7e0Cck(VH5U(Kyu?Z!M<-jomVyWPSLbR@u N^=kHS(FiMe^#cg5C$Inj literal 10906 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 Q-3mZaR!yc{`g7p_0zB9g2><{9 diff --git a/test/componentFixtures/.screenshots/baseline/inlineCompletions/WordReplacementView/Light.png b/test/componentFixtures/.screenshots/baseline/inlineCompletions/WordReplacementView/Light.png index 3d564e02878d555edc855f96d804139e370cee1b..4d303775e26468fdf67fe4326aa394d1e7726b33 100644 GIT binary patch literal 130 zcmWN?K@x)?3;@8puiyifARvjqNn)tXwACrrLto$SWiNa8w!hqVo=0E2zqj-DsD1pu zePq=A>HA^ouQ2Rwb$#P0&kLrAibxX&5|UKN3d~joU^0!MB%q;aT|+KeffFM}omsdf NLmGPfnhOAlh9BELCu;xz literal 10049 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 From 4273cad57888eb108feb4cdf3bc3b22265cd5088 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 23 Feb 2026 17:11:34 +0100 Subject: [PATCH 26/28] add promptFilePickers.fixture.ts (#297005) --- .../promptFilePickers.fixture.ts | 211 ++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 src/vs/workbench/test/browser/componentFixtures/promptFilePickers.fixture.ts diff --git a/src/vs/workbench/test/browser/componentFixtures/promptFilePickers.fixture.ts b/src/vs/workbench/test/browser/componentFixtures/promptFilePickers.fixture.ts new file mode 100644 index 0000000000000..6c3b453b0a6ba --- /dev/null +++ b/src/vs/workbench/test/browser/componentFixtures/promptFilePickers.fixture.ts @@ -0,0 +1,211 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CancellationToken } from '../../../../base/common/cancellation.js'; +import { Event } from '../../../../base/common/event.js'; +import { ResourceSet } from '../../../../base/common/map.js'; +import { URI } from '../../../../base/common/uri.js'; +import { mock } from '../../../../base/test/common/mock.js'; +import { ICommandService } from '../../../../platform/commands/common/commands.js'; +import { IContextMenuService, IContextViewService } from '../../../../platform/contextview/browser/contextView.js'; +import { IDialogService } from '../../../../platform/dialogs/common/dialogs.js'; +import { IFileService } from '../../../../platform/files/common/files.js'; +import { ILayoutService } from '../../../../platform/layout/browser/layoutService.js'; +import { ILabelService } from '../../../../platform/label/common/label.js'; +import { IListService, ListService } from '../../../../platform/list/browser/listService.js'; +import { IOpenerService } from '../../../../platform/opener/common/opener.js'; +import { IProductService } from '../../../../platform/product/common/productService.js'; +import { IQuickInputService, IQuickPick, IQuickPickItem } from '../../../../platform/quickinput/common/quickInput.js'; +import { QuickInputService } from '../../../../platform/quickinput/browser/quickInputService.js'; +import { PromptFilePickers } from '../../../contrib/chat/browser/promptSyntax/pickers/promptFilePickers.js'; +import { PromptsType } from '../../../contrib/chat/common/promptSyntax/promptTypes.js'; +import { AgentFileType, IExtensionPromptPath, IResolvedAgentFile, IPromptPath, IPromptsService, PromptsStorage } from '../../../contrib/chat/common/promptSyntax/service/promptsService.js'; +import { ComponentFixtureContext, createEditorServices, defineComponentFixture, defineThemedFixtureGroup } from './fixtureUtils.js'; +import { ParsedPromptFile } from '../../../contrib/chat/common/promptSyntax/promptFileParser.js'; + +interface IFixturePromptsState { + localPromptFiles: IPromptPath[]; + userPromptFiles: IPromptPath[]; + extensionPromptFiles: IExtensionPromptPath[]; + agentInstructionFiles: IResolvedAgentFile[]; + disabled: ResourceSet; +} + +interface RenderPromptPickerOptions extends ComponentFixtureContext { + type: PromptsType; + placeholder: string; + seedData: (state: IFixturePromptsState) => void; +} + +class FixtureQuickInputService extends QuickInputService { + override createQuickPick(options: { useSeparators: true }): IQuickPick; + override createQuickPick(options?: { useSeparators: boolean }): IQuickPick; + override createQuickPick(options: { useSeparators: boolean } = { useSeparators: false }): IQuickPick { + const quickPick = super.createQuickPick(options) as IQuickPick; + quickPick.ignoreFocusOut = true; + return quickPick; + } +} + +export default defineThemedFixtureGroup({ + PromptFiles: defineComponentFixture({ + render: context => renderPromptFilePickerFixture({ + ...context, + type: PromptsType.prompt, + placeholder: 'Select the prompt file to run', + seedData: promptsService => { + promptsService.localPromptFiles = [ + { uri: URI.file('/workspace/.github/prompts/refactor.prompt.md'), storage: PromptsStorage.local, type: PromptsType.prompt, name: 'Refactor Prompt', description: 'Refactor selected code' }, + { uri: URI.file('/workspace/.github/prompts/docs.prompt.md'), storage: PromptsStorage.local, type: PromptsType.prompt, name: 'Docs Prompt', description: 'Generate docs for symbols' }, + ]; + promptsService.userPromptFiles = [ + { uri: URI.file('/home/dev/.copilot/prompts/review.prompt.md'), storage: PromptsStorage.user, type: PromptsType.prompt, name: 'Review Prompt', description: 'Review this change' }, + ]; + }, + }), + }), + + InstructionFilesWithAgentInstructions: defineComponentFixture({ + render: context => renderPromptFilePickerFixture({ + ...context, + type: PromptsType.instructions, + placeholder: 'Select instruction files', + seedData: promptsService => { + promptsService.localPromptFiles = [ + { uri: URI.file('/workspace/.github/instructions/repo.instructions.md'), storage: PromptsStorage.local, type: PromptsType.instructions, name: 'Repo Rules', description: 'Repository-wide coding rules' }, + ]; + promptsService.agentInstructionFiles = [ + { uri: URI.file('/workspace/AGENTS.md'), realPath: undefined, type: AgentFileType.agentsMd }, + { uri: URI.file('/workspace/.github/copilot-instructions.md'), realPath: undefined, type: AgentFileType.copilotInstructionsMd }, + ]; + }, + }), + }), +}); + +async function renderPromptFilePickerFixture({ container, disposableStore, theme, type, placeholder, seedData }: RenderPromptPickerOptions): Promise { + container.style.width = 'fit-content'; + container.style.minHeight = '0'; + container.style.padding = '8px'; + container.style.boxSizing = 'border-box'; + container.style.background = 'var(--vscode-editor-background)'; + container.style.border = '1px solid var(--vscode-editorWidget-border)'; + container.style.position = 'relative'; + + const quickInputHost = document.createElement('div'); + quickInputHost.style.position = 'relative'; + const hostWidth = 800; + const hostHeight = 600; + quickInputHost.style.width = `${hostWidth}px`; + quickInputHost.style.height = `${hostHeight}px`; + quickInputHost.style.minHeight = `${hostHeight}px`; + quickInputHost.style.overflow = 'hidden'; + container.appendChild(quickInputHost); + + const promptsState: IFixturePromptsState = { + localPromptFiles: [], + userPromptFiles: [], + extensionPromptFiles: [], + agentInstructionFiles: [], + disabled: new ResourceSet(), + }; + seedData(promptsState); + + const promptsService = new class extends mock() { + override async listPromptFilesForStorage(type: PromptsType, storage: PromptsStorage, _token: CancellationToken): Promise { + switch (storage) { + case PromptsStorage.local: + return promptsState.localPromptFiles.filter(file => file.type === type); + case PromptsStorage.user: + return promptsState.userPromptFiles.filter(file => file.type === type); + case PromptsStorage.extension: + return promptsState.extensionPromptFiles.filter(file => file.type === type); + } + } + + override async listAgentInstructions(_token: CancellationToken): Promise { + return promptsState.agentInstructionFiles; + } + + override async parseNew(_uri: URI, _token: CancellationToken): Promise { + throw new Error('Not implemented'); + } + + override getDisabledPromptFiles(_type: PromptsType): ResourceSet { + return promptsState.disabled; + } + + override setDisabledPromptFiles(_type: PromptsType, uris: ResourceSet): void { + promptsState.disabled = uris; + } + }; + + const layoutService = new class extends mock() { + override activeContainer = quickInputHost; + override get activeContainerDimension() { return { width: hostWidth, height: hostHeight }; } + override activeContainerOffset = { top: 0, quickPickTop: 20 }; + override mainContainer = quickInputHost; + override get mainContainerDimension() { return { width: hostWidth, height: hostHeight }; } + override mainContainerOffset = { top: 0, quickPickTop: 20 }; + override containers = [quickInputHost]; + override onDidLayoutMainContainer = Event.None; + override onDidLayoutContainer = Event.None; + override onDidLayoutActiveContainer = Event.None; + override onDidAddContainer = Event.None; + override onDidChangeActiveContainer = Event.None; + override getContainer(): HTMLElement { + return quickInputHost; + } + override whenContainerStylesLoaded(): Promise | undefined { + return undefined; + } + override focus(): void { } + }; + + const contextMenuService = new class extends mock() { + override onDidShowContextMenu = Event.None; + override onDidHideContextMenu = Event.None; + override showContextMenu(): void { } + }; + + const contextViewService = new class extends mock() { + override anchorAlignment = 0; + override showContextView() { return { close: () => { } }; } + override hideContextView(): void { } + override getContextViewElement(): HTMLElement { return quickInputHost; } + override layout(): void { } + }; + + const instantiationService = createEditorServices(disposableStore, { + colorTheme: theme, + additionalServices: registration => { + registration.defineInstance(ILayoutService, layoutService); + registration.defineInstance(IContextMenuService, contextMenuService); + registration.defineInstance(IContextViewService, contextViewService); + registration.define(IListService, ListService); + registration.define(IQuickInputService, FixtureQuickInputService); + registration.defineInstance(IPromptsService, promptsService); + registration.defineInstance(IOpenerService, new class extends mock() { }); + registration.defineInstance(IFileService, new class extends mock() { }); + registration.defineInstance(IDialogService, new class extends mock() { }); + registration.defineInstance(ICommandService, new class extends mock() { }); + registration.defineInstance(ILabelService, new class extends mock() { + override getUriLabel(uri: URI): string { + return uri.path; + } + }); + registration.defineInstance(IProductService, new class extends mock() { }); + } + }); + + const pickers = instantiationService.createInstance(PromptFilePickers); + + void pickers.selectPromptFile({ + placeholder, + type, + }); + + return container; +} From db8faee5ffd6ffe016bca0ae439db3c862709e79 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:13:36 +0000 Subject: [PATCH 27/28] Show `/create-*` chat tip only in local sessions (#297016) --- .../contrib/chat/browser/chatTipService.ts | 5 ++++- .../chat/test/browser/chatTipService.test.ts | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatTipService.ts b/src/vs/workbench/contrib/chat/browser/chatTipService.ts index a2a7c065c6cfc..d6c1702645bab 100644 --- a/src/vs/workbench/contrib/chat/browser/chatTipService.ts +++ b/src/vs/workbench/contrib/chat/browser/chatTipService.ts @@ -182,7 +182,10 @@ const TIP_CATALOG: ITipDefinition[] = [ 'tip.createSlashCommands', "Tip: Use [/create-instruction](command:workbench.action.chat.generateInstruction), [/create-prompt](command:workbench.action.chat.generatePrompt), [/create-agent](command:workbench.action.chat.generateAgent), or [/create-skill](command:workbench.action.chat.generateSkill) to generate reusable agent customization files." ), - when: ChatContextKeys.hasUsedCreateSlashCommands.negate(), + when: ContextKeyExpr.and( + ChatContextKeys.chatSessionType.isEqualTo(localChatSessionType), + ChatContextKeys.hasUsedCreateSlashCommands.negate(), + ), enabledCommands: [ 'workbench.action.chat.generateInstruction', 'workbench.action.chat.generatePrompt', diff --git a/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts b/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts index b1c79a5e6e621..831a6292bae74 100644 --- a/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts +++ b/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts @@ -33,6 +33,7 @@ import { OffsetRange } from '../../../../../editor/common/core/ranges/offsetRang import { Range } from '../../../../../editor/common/core/range.js'; import { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js'; import { NullTelemetryService } from '../../../../../platform/telemetry/common/telemetryUtils.js'; +import { localChatSessionType } from '../../common/chatSessionsService.js'; class MockContextKeyServiceWithRulesMatching extends MockContextKeyService { override contextMatchesRules(rules: ContextKeyExpression): boolean { @@ -769,6 +770,7 @@ suite('ChatTipService', () => { test('shows tip.createSlashCommands when context key is false', () => { const service = createService(); contextKeyService.createKey(ChatContextKeys.hasUsedCreateSlashCommands.key, false); + contextKeyService.createKey(ChatContextKeys.chatSessionType.key, localChatSessionType); // Dismiss tips until we find createSlashCommands or run out let found = false; @@ -787,6 +789,21 @@ suite('ChatTipService', () => { assert.ok(found, 'Should eventually show tip.createSlashCommands when context key is false'); }); + test('does not show tip.createSlashCommands in non-local chat sessions', () => { + const service = createService(); + contextKeyService.createKey(ChatContextKeys.hasUsedCreateSlashCommands.key, false); + contextKeyService.createKey(ChatContextKeys.chatSessionType.key, 'cloud'); + + for (let i = 0; i < 100; i++) { + const tip = service.getWelcomeTip(contextKeyService); + if (!tip) { + break; + } + assert.notStrictEqual(tip.id, 'tip.createSlashCommands', 'Should not show tip.createSlashCommands in non-local sessions'); + service.dismissTip(); + } + }); + test('does not show tip.createSlashCommands when context key is true', () => { storageService.store('chat.tips.usedCreateSlashCommands', true, StorageScope.APPLICATION, StorageTarget.MACHINE); const service = createService(); From d311bc97b0fa98e3002fb28769efb5dea4c8ae32 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Mon, 23 Feb 2026 08:19:42 -0800 Subject: [PATCH 28/28] Remove cli.js argument when running as administrator on Windows (#296690) * fix: handle stray cli.js argument when running as administrator on Windows * Handle version subdirectory. --- src/vs/platform/environment/node/argvHelper.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/environment/node/argvHelper.ts b/src/vs/platform/environment/node/argvHelper.ts index eb645fc902f1a..8927472c2bdf3 100644 --- a/src/vs/platform/environment/node/argvHelper.ts +++ b/src/vs/platform/environment/node/argvHelper.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; -import { IProcessEnvironment } from '../../../base/common/platform.js'; +import { dirname, resolve } from '../../../base/common/path.js'; +import { IProcessEnvironment, isWindows } from '../../../base/common/platform.js'; import { localize } from '../../../nls.js'; import { NativeParsedArgs } from '../common/argv.js'; import { ErrorReporter, NATIVE_CLI_COMMANDS, OPTIONS, parseArgs } from './argv.js'; @@ -63,6 +64,17 @@ function stripAppPath(argv: string[]): string[] | undefined { export function parseMainProcessArgv(processArgv: string[]): NativeParsedArgs { let [, ...args] = processArgv; + // When code.exe is configured to 'Run as administrator' on Windows, the CLI launcher (code.cmd) sets ELECTRON_RUN_AS_NODE=1 and passes + // cli.js as the first argument. The elevated process does not inherit the environment variable so Electron starts as a GUI app with cli.js + // as a stray positional argument. Detect and strip it. The path may include a version subdirectory (e.g., 2ca3b2734b\resources\app\out\cli.js). + if (isWindows && args.length > 0) { + const resolvedArg = resolve(args[0]).toLowerCase(); + const installDir = dirname(process.execPath).toLowerCase() + '\\'; + if (resolvedArg.startsWith(installDir) && resolvedArg.endsWith('\\resources\\app\\out\\cli.js')) { + args.shift(); + } + } + // If dev, remove the first non-option argument: it's the app location if (process.env['VSCODE_DEV']) { args = stripAppPath(args) || [];