Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
1c11056
fix: reduce listener leak from per-part show-checkmarks subscriptions…
bryanchen-d Mar 17, 2026
e0e7706
fix: update instructions for handling Copilot review comments in PRs
bryanchen-d Mar 17, 2026
8526083
Remove alwaysQueue from chat input options (#302747)
jrieken Mar 18, 2026
29b2353
Hide Pin/Unpin actions on archived sessions (#302752)
bpasero Mar 18, 2026
df2d7dd
fix: update feedback command input format in SubmitFeedbackAction
benibenj Mar 18, 2026
3888a55
editors - update comment on modal close (#302757)
bpasero Mar 18, 2026
1d2ebda
Merge pull request #302769 from microsoft/benibenj/roasted-tahr
benibenj Mar 18, 2026
1516a39
Add configuration updates for preferred light and dark themes (#302764)
mrleemurray Mar 18, 2026
946a1d5
debt - stop the log spam (#302793)
bpasero Mar 18, 2026
a9b0358
style - update hover state for agent session toolbar (#302799)
bpasero Mar 18, 2026
eba8d57
sessions terminal ensure instance exists
benibenj Mar 18, 2026
452061c
Don't show agent feedback editor input at diff hunk boundaries (#302798)
benibenj Mar 18, 2026
6dbea28
Agent feedback editing (#302790)
benibenj Mar 18, 2026
aeb06c3
Permissions picker styling (#302753)
benibenj Mar 18, 2026
331c3ba
Implement OS color scheme auto-detection for new users (#302761)
mrleemurray Mar 18, 2026
db0a6b7
feat - add rule to prevent static imports in critical startup path (#…
bpasero Mar 18, 2026
3b16486
feat - add watcher exclusions for performance improvement (#302800)
bpasero Mar 18, 2026
778ef35
Update hover background color in 2026 Dark theme (#302802)
mrleemurray Mar 18, 2026
3e9085f
Add shadow configuration setting and streamline layout behavior (#302…
mrleemurray Mar 18, 2026
f7b1318
chore - remove deprecated setting `chat.viewSessions.enabled` (#302806)
bpasero Mar 18, 2026
e8df039
Add per-model configuration support for language models (#302771)
sandy081 Mar 18, 2026
819f0cd
Merge pull request #302812 from microsoft/benibenj/unexpected-bird
benibenj Mar 18, 2026
44264fd
Refactor new chat view: rename to workspace, separate session type an…
sandy081 Mar 18, 2026
4863bec
Fix spinning icon for in-progress CI status checks in sessions window…
benibenj Mar 18, 2026
41075b8
feat - update task labels for OSS compatibility (#302819)
bpasero Mar 18, 2026
4363457
Enhance ListenerLeakError and ListenerRefusalError to include detaile…
jrieken Mar 18, 2026
c0c11c5
Hide cancel button when displaying modified file confirmation (#302821)
DonJayamanne Mar 18, 2026
3c17522
fix - update session icon rendering logic (#302824)
bpasero Mar 18, 2026
4f23fab
Layer notifications above modal editor backdrop (#302749)
Copilot Mar 18, 2026
fa4879a
Merge pull request #302589 from microsoft/bryanchen-d/fix-listener-le…
bryanchen-d Mar 18, 2026
a76935c
[TerminalSandboxing]: Include workspace folders as default in the san…
dileepyavan Mar 18, 2026
120ef0a
Merge pull request #302835 from microsoft/copilot/narrow-eagle
jrieken Mar 18, 2026
8ea04e4
Implement conditional blocks processing in release notes (#302811)
ntrogh Mar 18, 2026
7c3e23d
chore: add telemetry for network process lifetime (#302836)
deepak1556 Mar 18, 2026
a727b55
build(deps-dev): bump fast-xml-parser from 5.4.1 to 5.5.6 in /build (…
dependabot[bot] Mar 18, 2026
6428add
Add telemetry for update actions in title bar (#302832)
dmitrivMS Mar 18, 2026
055de42
Add configurable severity levels for JSON validation (#297911)
joeljohansson99 Mar 18, 2026
e32215e
aiCustomization: make plugin/extension/builtin files read-only (#302592)
connor4312 Mar 18, 2026
fed6799
Fix panel toggle focus in sessions window (#302862)
benibenj Mar 18, 2026
1f4b1a7
Fixes ChatResponseResource.parseUri bug
hediet Mar 18, 2026
342fd3c
implements artifact view
hediet Mar 18, 2026
f590d9b
Fixes font size css linting error.
hediet Mar 18, 2026
7e1b034
build(deps-dev): bump fast-xml-parser from 5.4.2 to 5.5.6 (#302608)
dependabot[bot] Mar 18, 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
79 changes: 79 additions & 0 deletions .eslint-plugin-local/code-no-static-node-module-import.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { TSESTree } from '@typescript-eslint/typescript-estree';
import * as eslint from 'eslint';
import { builtinModules } from 'module';
import { join, normalize, relative } from 'path';
import minimatch from 'minimatch';
import { createImportRuleListener } from './utils.ts';

const nodeBuiltins = new Set([
...builtinModules,
...builtinModules.map(m => `node:${m}`)
]);

const REPO_ROOT = normalize(join(import.meta.dirname, '../'));

export default new class implements eslint.Rule.RuleModule {

readonly meta: eslint.Rule.RuleMetaData = {
messages: {
staticImport: 'Static imports of \'{{module}}\' are not allowed here because they are loaded synchronously on startup. Use a dynamic `await import(...)` or `import type` instead.'
},
docs: {
description: 'Disallow static imports of node_modules packages to prevent synchronous loading on startup. Allows Node.js built-ins, electron, relative imports, and whitelisted file paths.'
},
schema: {
type: 'array',
items: {
type: 'string'
}
}
};

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
const allowedPaths = context.options as string[];
const filePath = normalize(relative(REPO_ROOT, normalize(context.getFilename()))).replace(/\\/g, '/');

// Skip whitelisted files
if (allowedPaths.some(pattern => filePath === pattern || minimatch(filePath, pattern))) {
return {};
}

return createImportRuleListener((node, value) => {
// Allow `import type` and `export type` declarations
if (node.parent?.type === TSESTree.AST_NODE_TYPES.ImportDeclaration && node.parent.importKind === 'type') {
return;
}
if (node.parent && 'exportKind' in node.parent && node.parent.exportKind === 'type') {
return;
}

// Allow relative imports
if (value.startsWith('.')) {
return;
}

// Allow Node.js built-in modules
if (nodeBuiltins.has(value)) {
return;
}

// Allow electron
if (value === 'electron') {
return;
}

context.report({
loc: node.parent!.loc,
messageId: 'staticImport',
data: {
module: value
}
});
});
}
};
4 changes: 2 additions & 2 deletions .github/prompts/fix-error.prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ After the fix is validated (compilation clean, tests pass):
- Steps a user can follow to manually validate the fix.
- How the fix addresses the issue, with a brief note per changed file.
5. **Monitor the PR** for Copilot review comments. Wait 1-2 minutes after each push for Copilot to leave its review, then check for new comments. Evaluate each comment:
- If valid, apply the fix, amend the commit, and force-push.
- If valid, apply the fix in a new commit, push, and **resolve the comment thread**.
- If not applicable, leave a reply explaining why.
- After addressing comments, update the PR description if the changes affect the summary, code flow explanation, or per-file notes.
6. **Repeat monitoring** after each force-push: wait 1-2 minutes, check for new Copilot comments, and address them. Continue this loop until no new comments appear.
6. **Repeat monitoring** after each push: wait 1-2 minutes, check for new Copilot comments, and address them. Continue this loop until no new comments appear.
7. **Re-run tests** after addressing review comments to confirm nothing regressed.
1 change: 0 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
"chat.tools.edits.autoApprove": {
".github/skills/azure-pipelines/azure-pipeline.ts": false
},
"chat.viewSessions.enabled": true,
"chat.editing.explainChanges.enabled": true,
// --- Editor ---
"editor.insertSpaces": false,
Expand Down
12 changes: 11 additions & 1 deletion .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@
"problemMatcher": []
},
{
"label": "Run and Compile Dev Sessions",
"label": "Run and Compile Sessions - OSS",
"type": "shell",
"command": "npm run transpile-client && ./scripts/code.sh",
"windows": {
Expand All @@ -252,6 +252,16 @@
"inSessions": true,
"problemMatcher": []
},
{
"label": "Run and Compile Code - OSS",
"type": "shell",
"command": "npm run transpile-client && ./scripts/code.sh",
"windows": {
"command": "npm run transpile-client && .\\scripts\\code.bat"
},
"inSessions": true,
"problemMatcher": []
},
{
"type": "npm",
"script": "electron",
Expand Down
36 changes: 28 additions & 8 deletions build/package-lock.json

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

27 changes: 27 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -1042,6 +1042,33 @@ export default tseslint.config(
]
}
},
// electron-main layer: prevent static imports of heavy node_modules
// that would be synchronously loaded on startup
{
files: [
'src/vs/code/electron-main/**/*.ts',
'src/vs/code/node/**/*.ts',
'src/vs/platform/*/electron-main/**/*.ts',
'src/vs/platform/*/node/**/*.ts',
],
languageOptions: {
parser: tseslint.parser,
},
plugins: {
'local': pluginLocal,
},
rules: {
'local/code-no-static-node-module-import': [
'error',
// Files that run in separate processes, not on the electron-main startup path
'src/vs/platform/agentHost/node/copilot/**/*.ts',
'src/vs/platform/files/node/watcher/**/*.ts',
'src/vs/platform/terminal/node/**/*.ts',
// Files that use small, safe modules
'src/vs/platform/environment/node/argv.ts',
]
}
},
// browser/electron-browser layer
{
files: [
Expand Down
25 changes: 22 additions & 3 deletions extensions/json-language-features/server/src/jsonServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {

import { runSafe, runSafeAsync } from './utils/runner';
import { DiagnosticsSupport, registerDiagnosticsPullSupport, registerDiagnosticsPushSupport } from './utils/validation';
import { TextDocument, JSONDocument, JSONSchema, getLanguageService, DocumentLanguageSettings, SchemaConfiguration, ClientCapabilities, Range, Position, SortOptions } from 'vscode-json-languageservice';
import { TextDocument, JSONDocument, JSONSchema, getLanguageService, DocumentLanguageSettings, SchemaConfiguration, ClientCapabilities, Range, Position, SortOptions, SeverityLevel } from 'vscode-json-languageservice';
import { getLanguageModelCache } from './languageModelCache';
import { Utils, URI } from 'vscode-uri';
import * as l10n from '@vscode/l10n';
Expand Down Expand Up @@ -216,7 +216,13 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment)
schemas?: JSONSchemaSettings[];
format?: { enable?: boolean };
keepLines?: { enable?: boolean };
validate?: { enable?: boolean };
validate?: {
enable?: boolean;
comments?: SeverityLevel;
trailingCommas?: SeverityLevel;
schemaValidation?: SeverityLevel;
schemaRequest?: SeverityLevel;
};
resultLimit?: number;
jsonFoldingLimit?: number;
jsoncFoldingLimit?: number;
Expand All @@ -242,6 +248,10 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment)
let schemaAssociations: ISchemaAssociations | SchemaConfiguration[] | undefined = undefined;
let formatterRegistrations: Thenable<Disposable>[] | null = null;
let validateEnabled = true;
let commentsSeverity: SeverityLevel | undefined = undefined;
let trailingCommasSeverity: SeverityLevel | undefined = undefined;
let schemaValidationSeverity: SeverityLevel | undefined = undefined;
let schemaRequestSeverity: SeverityLevel | undefined = undefined;
let keepLinesEnabled = false;

// The settings have changed. Is sent on server activation as well.
Expand All @@ -250,6 +260,10 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment)
runtime.configureHttpRequests?.(settings?.http?.proxy, !!settings.http?.proxyStrictSSL);
jsonConfigurationSettings = settings.json?.schemas;
validateEnabled = !!settings.json?.validate?.enable;
commentsSeverity = settings.json?.validate?.comments;
trailingCommasSeverity = settings.json?.validate?.trailingCommas;
schemaValidationSeverity = settings.json?.validate?.schemaValidation;
schemaRequestSeverity = settings.json?.validate?.schemaRequest;
keepLinesEnabled = settings.json?.keepLines?.enable || false;
updateConfiguration();

Expand Down Expand Up @@ -388,7 +402,12 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment)
return []; // ignore empty documents
}
const jsonDocument = getJSONDocument(textDocument);
const documentSettings: DocumentLanguageSettings = textDocument.languageId === 'jsonc' ? { comments: 'ignore', trailingCommas: 'warning' } : { comments: 'error', trailingCommas: 'error' };
const documentSettings: DocumentLanguageSettings = {
comments: commentsSeverity ?? (textDocument.languageId === 'jsonc' ? 'ignore' : 'error'),
trailingCommas: trailingCommasSeverity ?? (textDocument.languageId === 'jsonc' ? 'warning' : 'error'),
schemaValidation: schemaValidationSeverity,
schemaRequest: schemaRequestSeverity
};
return await languageService.doValidation(textDocument, jsonDocument, documentSettings);
}

Expand Down
2 changes: 1 addition & 1 deletion extensions/theme-defaults/themes/2026-dark.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
"list.activeSelectionForeground": "#ededed",
"list.inactiveSelectionBackground": "#2C2D2E",
"list.inactiveSelectionForeground": "#ededed",
"list.hoverBackground": "#262728",
"list.hoverBackground": "#FFFFFF0D",
"list.hoverForeground": "#bfbfbf",
"list.dropBackground": "#3994BC1A",
"toolbar.hoverBackground": "#FFFFFF18",
Expand Down
36 changes: 28 additions & 8 deletions package-lock.json

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

22 changes: 18 additions & 4 deletions src/vs/base/common/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1071,19 +1071,33 @@ class Stacktrace {

// error that is logged when going over the configured listener threshold
export class ListenerLeakError extends Error {
constructor(message: string, stack: string) {
super(message);
/**
* The detailed message including listener count and most frequent stack.
* Available locally for debugging but intentionally not used as the error
* `message` so that all leak errors group under the same title in telemetry.
*/
readonly details: string;
constructor(details: string, stack: string) {
super('potential listener LEAK detected');
this.name = 'ListenerLeakError';
this.details = details;
this.stack = stack;
}
}

// SEVERE error that is logged when having gone way over the configured listener
// threshold so that the emitter refuses to accept more listeners
export class ListenerRefusalError extends Error {
constructor(message: string, stack: string) {
super(message);
/**
* The detailed message including listener count and most frequent stack.
* Available locally for debugging but intentionally not used as the error
* `message` so that all refusal errors group under the same title in telemetry.
*/
readonly details: string;
constructor(details: string, stack: string) {
super('potential listener LEAK detected (REFUSED to add)');
this.name = 'ListenerRefusalError';
this.details = details;
this.stack = stack;
}
}
Expand Down
Loading
Loading