Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e190bdf
feat: add chat settings in their own section
rzhao271 Feb 5, 2026
bcdcd5b
feat: sort settings by experimental status
rzhao271 Feb 5, 2026
70f5cb9
chore: combine comments
rzhao271 Feb 5, 2026
5bfd501
Revert "chore: replace legacy watcher with @parcel/watcher for build …
bpasero Feb 5, 2026
5b63ed8
Update src/vs/workbench/contrib/preferences/browser/settingsLayout.ts
rzhao271 Feb 5, 2026
e32b285
Warn about distro commit and compat check early (#293104)
alexr00 Feb 5, 2026
fc61509
Merge pull request #292989 from microsoft/rzhao271/public-lion
rzhao271 Feb 5, 2026
1a8d39c
Update input validation colors in 2026 theme files
mrleemurray Feb 5, 2026
57bad9e
add a bunch of logs for output monitor (#292732)
meganrogge Feb 5, 2026
82714b5
Merge pull request #293186 from microsoft/mrleemurray/outstanding-gra…
mrleemurray Feb 5, 2026
2bb11a0
fix: filter interaction with settings search regressed (#293187)
rzhao271 Feb 5, 2026
3ef1567
editors - open MCP server modal as well (#293189)
bpasero Feb 5, 2026
22d90ca
modal editor - style and size tweaks (#293193)
bpasero Feb 5, 2026
6f5c1ea
Add my name for sanity tests in CODENOTIFY (#293197)
dmitrivMS Feb 5, 2026
f47e17c
Normalize Windows drive letter when comparing cwd and userHome (fix #…
gjsjohnmurray Feb 5, 2026
6e029c3
mcp: initial data flow for MCP gateway
connor4312 Feb 5, 2026
3832ddc
fix: associate extHost lifecycle to window (#293144)
deepak1556 Feb 5, 2026
4c3d9c1
modal editor - copilot feedback addressed (#293208)
bpasero Feb 5, 2026
ba42721
modal editor - introduce real menu and actions for title toolbar (#29…
bpasero Feb 5, 2026
4d4ae5f
Merge pull request #293209 from microsoft/connor4312/mcp-gateway-1
connor4312 Feb 5, 2026
5220198
Remove inline action buttons from update status bar entry tooltip. (#…
dmitrivMS Feb 5, 2026
be51f7b
Fix text clipping in Copilot Chat inline terminal for alternate buffe…
Copilot Feb 5, 2026
2b09c1f
Fix terminal task system memory leaks (#292937)
Copilot Feb 5, 2026
8470b2c
move questions carousel above input part + many ux fixes (#292990)
justschen Feb 5, 2026
b46de1b
feat(accessibility): Add Accessibility Help System for find/filter di…
accesswatch Feb 5, 2026
610de18
fix: allows to run apps that leverage Apple's CoreAudio Tap api (#293…
deepak1556 Feb 5, 2026
f4a698c
Fix F7 keybinding conflict for accessible diff view (#293163)
Copilot Feb 5, 2026
a0d45d3
moves share button to the left of command palette
eli-w-king Feb 5, 2026
d37ccd6
Merge pull request #293220 from microsoft/eli/share-move
eli-w-king Feb 5, 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
4 changes: 4 additions & 0 deletions .github/CODENOTIFY
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ src/vs/workbench/contrib/preferences/** @rzhao271

# Build
build/azure-pipelines/** @lszomoru
build/azure-pipelines/common/sanity-tests.yml @dmitrivMS
build/lib/i18n.ts @TylerLeonhardt
resources/linux/debian/** @rzhao271
resources/linux/rpm/** @rzhao271
Expand Down Expand Up @@ -144,3 +145,6 @@ extensions/github/** @lszomoru
# Chat Editing, Inline Chat
src/vs/workbench/contrib/chat/browser/chatEditing/** @jrieken
src/vs/workbench/contrib/inlineChat/** @jrieken

# Testing
test/sanity/** @dmitrivMS
213 changes: 0 additions & 213 deletions .github/instructions/modal-editor-part.instructions.md

This file was deleted.

137 changes: 137 additions & 0 deletions build/azure-pipelines/common/checkCopilotChatCompatibility.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import path from 'path';
import fs from 'fs';
import { retry } from './retry.ts';
import { type IExtensionManifest, parseApiProposalsFromSource, checkExtensionCompatibility, areAllowlistedApiProposalsMatching } from './versionCompatibility.ts';

const root = path.dirname(path.dirname(path.dirname(import.meta.dirname)));

async function fetchLatestExtensionManifest(extensionId: string): Promise<IExtensionManifest> {
// Use the vscode-unpkg service to get the latest extension package.json
const [publisher, name] = extensionId.split('.');

// First, get the latest version from the gallery endpoint
const galleryUrl = `https://main.vscode-unpkg.net/_gallery/${publisher}/${name}/latest`;
const galleryResponse = await fetch(galleryUrl, {
headers: { 'User-Agent': 'VSCode Build' }
});

if (!galleryResponse.ok) {
throw new Error(`Failed to fetch latest version for ${extensionId}: ${galleryResponse.status} ${galleryResponse.statusText}`);
}

const galleryData = await galleryResponse.json() as { versions: { version: string }[] };
const version = galleryData.versions[0].version;

// Now fetch the package.json using the actual version
const url = `https://${publisher}.vscode-unpkg.net/${publisher}/${name}/${version}/extension/package.json`;

const response = await fetch(url, {
headers: { 'User-Agent': 'VSCode Build' }
});

if (!response.ok) {
throw new Error(`Failed to fetch extension ${extensionId} from unpkg: ${response.status} ${response.statusText}`);
}

return await response.json() as IExtensionManifest;
}

export async function checkCopilotChatCompatibility(): Promise<void> {
const extensionId = 'github.copilot-chat';

console.log(`Checking compatibility of ${extensionId}...`);

// Get product version from package.json
const packageJson = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
const productVersion = packageJson.version;

console.log(`Product version: ${productVersion}`);

// Get API proposals from the generated file
const apiProposalsPath = path.join(root, 'src/vs/platform/extensions/common/extensionsApiProposals.ts');
const apiProposalsContent = fs.readFileSync(apiProposalsPath, 'utf8');
const allApiProposals = parseApiProposalsFromSource(apiProposalsContent);

const proposalCount = Object.keys(allApiProposals).length;
if (proposalCount === 0) {
throw new Error('Failed to load API proposals from source');
}

console.log(`Loaded ${proposalCount} API proposals from source`);

// Load product.json to check allowlisted API proposals
const productJsonPath = path.join(root, 'product.json');
let productJson;
try {
productJson = JSON.parse(fs.readFileSync(productJsonPath, 'utf8'));
} catch (error) {
throw new Error(`Failed to load or parse product.json: ${error}`);
}
const extensionEnabledApiProposals = productJson?.extensionEnabledApiProposals;
const extensionIdKey = extensionEnabledApiProposals ? Object.keys(extensionEnabledApiProposals).find(key => key.toLowerCase() === extensionId.toLowerCase()) : undefined;
const productAllowlistedProposals = extensionIdKey ? extensionEnabledApiProposals[extensionIdKey] : undefined;

if (productAllowlistedProposals) {
console.log(`Product.json allowlisted proposals for ${extensionId}:`);
for (const proposal of productAllowlistedProposals) {
console.log(` ${proposal}`);
}
} else {
console.log(`Product.json allowlisted proposals for ${extensionId}: none`);
}

// Fetch the latest extension manifest
const manifest = await retry(() => fetchLatestExtensionManifest(extensionId));

console.log(`Extension ${extensionId}@${manifest.version}:`);
console.log(` engines.vscode: ${manifest.engines.vscode}`);
console.log(` enabledApiProposals:\n ${manifest.enabledApiProposals?.join('\n ') || 'none'}`);

// Check compatibility
const result = checkExtensionCompatibility(productVersion, allApiProposals, manifest);
if (!result.compatible) {
throw new Error(`Compatibility check failed:\n ${result.errors.join('\n ')}`);
}

console.log(` ✓ Engine version compatible`);
if (manifest.enabledApiProposals?.length) {
console.log(` ✓ API proposals compatible`);
}

// Check that product.json allowlist matches package.json declarations
const allowlistResult = areAllowlistedApiProposalsMatching(extensionId, productAllowlistedProposals, manifest.enabledApiProposals);
if (!allowlistResult.compatible) {
throw new Error(`Allowlist check failed:\n ${allowlistResult.errors.join('\n ')}`);
}

console.log(` ✓ Product.json allowlist matches package.json`);
console.log(`✓ ${extensionId} is compatible with this build`);
}

if (import.meta.main) {
const warnOnly = process.argv.includes('--warn-only');

checkCopilotChatCompatibility().then(() => {
console.log('Copilot Chat compatibility check passed');
process.exit(0);
}, err => {
if (warnOnly) {
// Issue a warning using Azure DevOps logging commands but don't fail the build
console.log(`##vso[task.logissue type=warning]Copilot Chat compatibility check failed: ${err.message}`);
console.log(`##vso[task.complete result=SucceededWithIssues;]Copilot Chat compatibility check failed`);
console.log('');
console.log(`⚠️ WARNING: ${err.message}`);
console.log('');
console.log('The build will continue, but the release step will fail if this is not resolved.');
process.exit(0);
} else {
console.error(err);
process.exit(1);
}
});
}
Loading
Loading