Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
b743523
feat: update theme setting defaults based on product quality
mrleemurray Feb 13, 2026
70f35ae
Merge branch 'main' into mrleemurray/distinguished-apricot-eel
mrleemurray Feb 13, 2026
5cbcc58
Update JS-related workspace tags.
DanielRosenwasser Feb 27, 2026
f92d923
Fix package name of `@types/web`.
DanielRosenwasser Feb 27, 2026
ea4c0d8
React to Courtney feedback and improve model label and hover
isidorn Feb 27, 2026
7c76c29
wording polish
isidorn Feb 27, 2026
00ae6e4
Apply suggestion from @Copilot
isidorn Feb 27, 2026
ab978b9
thanks copilot for good feedback
isidorn Feb 27, 2026
f0b390f
Merge branch 'main' into isidorn/noble-chameleon
isidorn Feb 27, 2026
82962ed
Merge branch 'main' into isidorn/noble-chameleon
isidorn Feb 27, 2026
d75a912
Merge branch 'main' into isidorn/noble-chameleon
isidorn Feb 27, 2026
e60934d
Merge pull request #298190 from microsoft/isidorn/noble-chameleon
isidorn Feb 27, 2026
673360f
sessions - add letterpress (#298265)
bpasero Feb 27, 2026
6555034
fix accessibility issue, setting not respected (#298283)
meganrogge Feb 27, 2026
c2328b1
Fix cache issues caused by multiple session types (#298289)
lramos15 Feb 27, 2026
3272ea6
updates screenshot pipeline & baseline
hediet Feb 27, 2026
77ec174
updates baseline
hediet Feb 27, 2026
d228467
Fix flickering when using browser screenshot tool (#298080)
kycutler Feb 27, 2026
03a53d9
sessions: fix trust dialogs for worktree (#298294)
sandy081 Feb 27, 2026
98ad6b6
Bump hono from 4.12.0 to 4.12.2 (#297746)
dependabot[bot] Feb 27, 2026
5b7dafc
Add vscode-extras extension with npm up-to-date feature and related c…
hediet Feb 27, 2026
b01bfca
Bump koa from 3.1.1 to 3.1.2 (#298127)
dependabot[bot] Feb 27, 2026
e2344f9
Bump minimatch from 9.0.6 to 9.0.9 in /test/sanity (#298126)
dependabot[bot] Feb 27, 2026
df40d0e
Bump minimatch from 3.1.2 to 3.1.3 in /extensions/markdown-language-f…
dependabot[bot] Feb 27, 2026
1bd9cbc
sessions: change workbench state to worksapce and do not send workspa…
sandy081 Feb 27, 2026
d013e8c
Bump minimatch from 5.1.6 to 5.1.7 in /extensions/npm (#297523)
dependabot[bot] Feb 27, 2026
5428850
fixes screenshot status (#298303)
hediet Feb 27, 2026
8df7a1f
Merge pull request #298138 from microsoft/updateJsWorkspaceTags
DanielRosenwasser Feb 27, 2026
d752c03
Merge pull request #295188 from microsoft/mrleemurray/distinguished-a…
mrleemurray Feb 27, 2026
0005b2d
Bump minimatch from 10.2.2 to 10.2.4 in /extensions/json-language-fea…
dependabot[bot] Feb 27, 2026
182ee88
Bump minimatch from 10.2.2 to 10.2.4 in /extensions/css-language-feat…
dependabot[bot] Feb 27, 2026
0bf24b7
Enhance git sync command to include worktree URI for better context
osortega Feb 27, 2026
14a4e40
Add debug logging for repository and worktree URI in git sync commands
osortega Feb 27, 2026
9aea26f
Remove debug logging for repository and worktree URI in sync commands
osortega Feb 27, 2026
1b5e046
Improve contrast for chat welcome disclaimer text (#298327)
daviddossett Feb 27, 2026
7a92c70
Merge remote-tracking branch 'origin/main' into copilot-worktree-2026…
connor4312 Feb 27, 2026
e6bed07
Bump fast-xml-parser from 5.3.6 to 5.4.1 in /build (#298316)
dependabot[bot] Feb 27, 2026
4a32ff3
fix issue w tip toolbar (#298333)
meganrogge Feb 27, 2026
0b6ee2b
chat: expose toolResultError as boolean flag (#298320)
connor4312 Feb 27, 2026
0e26d29
exp-enable chat.implicitContext.enabled (#298317)
daviddossett Feb 27, 2026
a45cc3c
Merge pull request #298328 from microsoft/copilot-worktree-2026-02-27…
osortega Feb 27, 2026
12137e8
chat - restore default click behaviour on title action (#298340)
bpasero Feb 27, 2026
6cfe4cc
fix stray checkmarks, consistent opacity, and icon not showing up (#2…
justschen Feb 27, 2026
20c89b0
Polish model picker filter input (#298321)
daviddossett Feb 27, 2026
6c24652
Refine steering/stop button state behavior (#298124)
daviddossett Feb 27, 2026
ca4a24a
sessions: be overly verbose about errors that happen during serializa…
connor4312 Feb 27, 2026
d17f65c
plugins: add a /plugins command to open the plugins view (#298351)
connor4312 Feb 27, 2026
ac857d4
Fix: Honor deprecated `infer: false` in custom agent visibility (#297…
Copilot Feb 27, 2026
f8edf62
distro (#298343)
bpasero Feb 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 5 additions & 30 deletions .github/workflows/screenshot-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ on:

permissions:
contents: read
pull-requests: write
checks: write
statuses: write

concurrency:
Expand Down Expand Up @@ -96,41 +94,18 @@ jobs:
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"
CONCLUSION="neutral"
TITLE="⚠ ${CHANGED} screenshots changed"
else
TITLE="📸 Screenshots match"
CONCLUSION="success"
TITLE="✅ Screenshots match"
fi

SHA="${{ github.event.pull_request.head.sha || github.sha }}"
DETAILS_URL="https://hediet-ghartifactpreview.azurewebsites.net/${{ github.repository }}/run/${{ github.run_id }}/component-explorer/___explorer.html?report=./screenshot-report/report.json"

EXPLORER_PUSHED=false
if gh api "repos/${{ github.repository }}/check-runs" \
--input - <<EOF; then
{"name":"Component Screenshots","head_sha":"$SHA","status":"completed","conclusion":"$CONCLUSION","details_url":"$DETAILS_URL","output":{"title":"$TITLE","summary":"$TITLE"}}
gh api "repos/${{ github.repository }}/statuses/$SHA" \
--input - <<EOF || echo "::warning::Could not create commit status (expected for fork PRs)"
{"state":"success","target_url":"$DETAILS_URL","description":"$TITLE","context":"Component Screenshots"}
EOF
EXPLORER_PUSHED=true
else
echo "::warning::Could not create check run (expected for fork PRs)"
fi

CHECK_RUN_ID=$(gh api "repos/${{ github.repository }}/commits/$SHA/check-runs" \
--jq '.check_runs[] | select(.name == "Checking Component Screenshots / screenshots") | .id')

if [ "$EXPLORER_PUSHED" = true ]; then
CHECK_TITLE="Screenshots"
else
CHECK_TITLE="$TITLE"
fi

if [ -n "$CHECK_RUN_ID" ]; then
gh api "repos/${{ github.repository }}/check-runs/$CHECK_RUN_ID" \
-X PATCH --input - <<EOF || echo "::warning::Could not update check run (expected for fork PRs)"
{"details_url":"$DETAILS_URL","output":{"title":"$CHECK_TITLE","summary":"$CHECK_TITLE"}}
EOF
fi

# - name: Post PR comment
# if: github.event_name == 'pull_request'
Expand Down
16 changes: 16 additions & 0 deletions .vscode/extensions/vscode-extras/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

38 changes: 38 additions & 0 deletions .vscode/extensions/vscode-extras/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"name": "vscode-extras",
"displayName": "VS Code Extras",
"description": "Extra utility features for the VS Code selfhost workspace",
"engines": {
"vscode": "^1.88.0"
},
"version": "0.0.1",
"publisher": "ms-vscode",
"categories": [
"Other"
],
"activationEvents": [
"workspaceContains:src/vscode-dts/vscode.d.ts"
],
"main": "./out/extension.js",
"repository": {
"type": "git",
"url": "https://github.com/microsoft/vscode.git"
},
"license": "MIT",
"scripts": {
"compile": "gulp compile-extension:vscode-extras",
"watch": "gulp watch-extension:vscode-extras"
},
"contributes": {
"configuration": {
"title": "VS Code Extras",
"properties": {
"vscode-extras.npmUpToDateFeature.enabled": {
"type": "boolean",
"default": true,
"description": "Show a status bar warning when npm dependencies are out of date."
}
}
}
}
}
51 changes: 51 additions & 0 deletions .vscode/extensions/vscode-extras/src/extension.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import * as vscode from 'vscode';
import { NpmUpToDateFeature } from './npmUpToDateFeature';

export class Extension extends vscode.Disposable {
private readonly _output: vscode.LogOutputChannel;
private _npmFeature: NpmUpToDateFeature | undefined;

constructor(context: vscode.ExtensionContext) {
const disposables: vscode.Disposable[] = [];
super(() => disposables.forEach(d => d.dispose()));

this._output = vscode.window.createOutputChannel('VS Code Extras', { log: true });
disposables.push(this._output);

this._updateNpmFeature();

disposables.push(
vscode.workspace.onDidChangeConfiguration(e => {
if (e.affectsConfiguration('vscode-extras.npmUpToDateFeature.enabled')) {
this._updateNpmFeature();
}
})
);
}

private _updateNpmFeature(): void {
const enabled = vscode.workspace.getConfiguration('vscode-extras').get<boolean>('npmUpToDateFeature.enabled', true);
if (enabled && !this._npmFeature) {
this._npmFeature = new NpmUpToDateFeature(this._output);
} else if (!enabled && this._npmFeature) {
this._npmFeature.dispose();
this._npmFeature = undefined;
}
}
}

let extension: Extension | undefined;

export function activate(context: vscode.ExtensionContext) {
extension = new Extension(context);
context.subscriptions.push(extension);
}

export function deactivate() {
extension = undefined;
}
176 changes: 176 additions & 0 deletions .vscode/extensions/vscode-extras/src/npmUpToDateFeature.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import * as cp from 'child_process';
import * as fs from 'fs';
import * as path from 'path';
import * as vscode from 'vscode';

interface FileHashes {
readonly [relativePath: string]: string;
}

interface PostinstallState {
readonly nodeVersion: string;
readonly fileHashes: FileHashes;
}

interface InstallState {
readonly root: string;
readonly current: PostinstallState;
readonly saved: PostinstallState | undefined;
readonly files: readonly string[];
}

export class NpmUpToDateFeature extends vscode.Disposable {
private readonly _statusBarItem: vscode.StatusBarItem;
private readonly _disposables: vscode.Disposable[] = [];
private _watchers: fs.FSWatcher[] = [];
private _terminal: vscode.Terminal | undefined;

constructor(private readonly _output: vscode.LogOutputChannel) {
const disposables: vscode.Disposable[] = [];
super(() => {
disposables.forEach(d => d.dispose());
for (const w of this._watchers) {
w.close();
}
});
this._disposables = disposables;

this._statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 10000);
this._statusBarItem.name = 'npm Install State';
this._statusBarItem.text = '$(warning) node_modules is stale - run npm i';
this._statusBarItem.tooltip = 'Dependencies are out of date. Click to run npm install.';
this._statusBarItem.command = 'vscode-extras.runNpmInstall';
this._statusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
this._disposables.push(this._statusBarItem);

this._disposables.push(
vscode.commands.registerCommand('vscode-extras.runNpmInstall', () => this._runNpmInstall())
);

this._disposables.push(
vscode.window.onDidCloseTerminal(t => {
if (t === this._terminal) {
this._terminal = undefined;
this._check();
}
})
);

this._check();
}

private _runNpmInstall(): void {
if (this._terminal) {
this._terminal.show();
return;
}
const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri;
if (!workspaceRoot) {
return;
}
this._terminal = vscode.window.createTerminal({ name: 'npm install', cwd: workspaceRoot });
this._terminal.sendText('node build/npm/fast-install.ts --force');
this._terminal.show();

this._statusBarItem.text = '$(loading~spin) npm i';
this._statusBarItem.tooltip = 'npm install is running...';
this._statusBarItem.backgroundColor = undefined;
this._statusBarItem.command = 'vscode-extras.runNpmInstall';
}

private _queryState(): InstallState | undefined {
const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
if (!workspaceRoot) {
return undefined;
}
try {
const script = path.join(workspaceRoot, 'build', 'npm', 'installStateHash.ts');
const output = cp.execFileSync(process.execPath, [script], {
cwd: workspaceRoot,
timeout: 10_000,
encoding: 'utf8',
});
const parsed = JSON.parse(output.trim());
this._output.trace('raw output:', output.trim());
return parsed;
} catch (e) {
this._output.error('_queryState error:', e as any);
return undefined;
}
}

private _check(): void {
const state = this._queryState();
this._output.trace('state:', JSON.stringify(state, null, 2));
if (!state) {
this._output.trace('no state, hiding');
this._statusBarItem.hide();
return;
}

this._setupWatcher(state);

const changedFiles = this._getChangedFiles(state);
this._output.trace('changedFiles:', JSON.stringify(changedFiles));

if (changedFiles.length === 0) {
this._statusBarItem.hide();
} else {
this._statusBarItem.text = '$(warning) node_modules is stale - run npm i';
const tooltip = new vscode.MarkdownString();
tooltip.appendText('Dependencies are out of date. Click to run npm install.\n\nChanged files:\n');
for (const file of changedFiles) {
tooltip.appendText(` • ${file}\n`);
}
this._statusBarItem.tooltip = tooltip;
this._statusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
this._statusBarItem.show();
}
}

private _getChangedFiles(state: InstallState): string[] {
if (!state.saved) {
return ['(no postinstall state found)'];
}
const changed: string[] = [];
if (state.saved.nodeVersion !== state.current.nodeVersion) {
changed.push(`Node.js version (${state.saved.nodeVersion}${state.current.nodeVersion})`);
}
const allKeys = new Set([...Object.keys(state.current.fileHashes), ...Object.keys(state.saved.fileHashes)]);
for (const key of allKeys) {
if (state.current.fileHashes[key] !== state.saved.fileHashes[key]) {
changed.push(key);
}
}
return changed;
}

private _setupWatcher(state: InstallState): void {
for (const w of this._watchers) {
w.close();
}
this._watchers = [];

let debounceTimer: ReturnType<typeof setTimeout> | undefined;
const scheduleCheck = () => {
if (debounceTimer) {
clearTimeout(debounceTimer);
}
debounceTimer = setTimeout(() => this._check(), 500);
};

for (const file of state.files) {
try {
const watcher = fs.watch(file, scheduleCheck);
this._watchers.push(watcher);
} catch {
// file may not exist yet
}
}
}
}
14 changes: 14 additions & 0 deletions .vscode/extensions/vscode-extras/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"extends": "../../../extensions/tsconfig.base.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./out",
"types": [
"node"
]
},
"include": [
"src/**/*",
"../../../src/vscode-dts/vscode.d.ts"
]
}
3 changes: 3 additions & 0 deletions .vscode/extensions/vscode-selfhost-test-provider/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
"testObserver",
"testRelatedCode"
],
"extensionDependencies": [
"ms-vscode.vscode-extras"
],
"engines": {
"vscode": "^1.88.0"
},
Expand Down
1 change: 1 addition & 0 deletions build/gulpfile.extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ const compilations = [

'.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json',
'.vscode/extensions/vscode-selfhost-import-aid/tsconfig.json',
'.vscode/extensions/vscode-extras/tsconfig.json',
];

const getBaseUrl = (out: string) => `https://main.vscode-cdn.net/sourcemaps/${commit}/${out}`;
Expand Down
1 change: 1 addition & 0 deletions build/npm/dirs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export const dirs = [
'test/mcp',
'.vscode/extensions/vscode-selfhost-import-aid',
'.vscode/extensions/vscode-selfhost-test-provider',
'.vscode/extensions/vscode-extras',
];

if (existsSync(`${import.meta.dirname}/../../.build/distro/npm`)) {
Expand Down
Loading
Loading