Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
ae05d99
Add candidateModel and stickyOverride to automode.routerDecision tele…
Apr 8, 2026
8fbd3eb
Update strings for Upgrades
cwebster-99 Apr 9, 2026
c179fd5
Add more correlation ids for external ingest
mjbvz Apr 10, 2026
8a98e1e
Merge pull request #309037 from microsoft/copilot/fix-test-coverage-t…
Copilot Apr 10, 2026
208d403
Merge pull request #308597 from microsoft/aashnagarg/router-candidate…
aashna Apr 10, 2026
88e21a0
handle edge cases while updating built in extensions (#308991)
sandy081 Apr 10, 2026
8f146c8
Merge pull request #308885 from microsoft/thick-rook
cwebster-99 Apr 10, 2026
58064d8
Merge pull request #309051 from mjbvz/dev/mjbvz/convincing-perch
mjbvz Apr 10, 2026
6f39ac9
Revert "feat: enable agents app for stable" (#309055)
deepak1556 Apr 10, 2026
46933de
Merge pull request #308925 from yogeshwaran-c/fix/debug-repl-copy-sou…
yogeshwaran-c Apr 10, 2026
72cfebb
Fix --prof-startup never being able to profile renderer/extension hos…
winstliu Apr 10, 2026
f5c39cb
sessions: show restore button instead of checkmark for done sessions …
osortega Apr 10, 2026
bb77ece
add terminal button to questions tool, detailed progress messages, hi…
meganrogge Apr 10, 2026
ec116f3
Update agent prompts to require intermediary update before analysis c…
dileepyavan Apr 10, 2026
46be515
fix agent customizations fixture (#309054)
joshspicer Apr 10, 2026
f0baeed
Add Ctrl+Alt+/ global keyboard shortcut for View → Browser (#308950)
Copilot Apr 10, 2026
b2f1ae7
sessions: use focus border for chat inputs (#309060)
hawkticehurst Apr 10, 2026
dede8c6
Background - add repository state to the metadata (#309034)
lszomoru Apr 10, 2026
bcb148a
show toolbar when locked to coding agent (#309071)
justschen Apr 10, 2026
f689309
sessions: add Cmd+/ / Ctrl+/ keybinding to open context picker (#309070)
osortega Apr 10, 2026
d1ed77a
chore: cleanup recovery extension publish pipeline (#309013)
joaomoreno Apr 10, 2026
a37ccb4
chore: run npm audit fix (#309045)
rzhao271 Apr 10, 2026
023cc9a
Add browser tool instructions to agent prompts (#309075)
kycutler Apr 10, 2026
c58d92d
add a11y hint to navigate to kb editor results (#309074)
meganrogge Apr 10, 2026
87433b2
address screen reader feedback on Agents App (#309085)
meganrogge Apr 10, 2026
4c01ed2
Stop fetching GHCR pat (#309086)
lramos15 Apr 10, 2026
7938dfe
hygiene: add check for Copilot engines.vscode version consistency (#3…
joaomoreno Apr 10, 2026
e2f2e83
Agents - switch over to using metadata for the changes view (#309091)
lszomoru Apr 10, 2026
f104e8d
use better message when questions tool skipped bc user is replying to…
meganrogge Apr 10, 2026
6cf846c
Don't remove model ref on disposal (#309093)
roblourens Apr 10, 2026
0121b3d
sessions: ellipsize sidebar session headers (#309069)
hawkticehurst Apr 10, 2026
aeca54a
feat(editTelemetry): add experiment mode to configuration for AI stat…
hediet Apr 10, 2026
a19305e
Show historical debug sessions in Agent Debug Panel (#309073)
vijayupadya Apr 10, 2026
b713893
carousel improvements: monaco scrollable + expand button (#308909)
justschen Apr 10, 2026
fad4734
Sessions: filter out Claude customization directories (#309105)
joshspicer Apr 10, 2026
0999c0e
fix: update OS display name of the agents app (#308992)
deepak1556 Apr 10, 2026
3e37192
product: rename GHE.com label to GHE (#309106)
hawkticehurst Apr 10, 2026
6e637e5
fix: AI customization welcome page - prefill active session & update …
joshspicer Apr 10, 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
158 changes: 0 additions & 158 deletions build/azure-pipelines/common/updateCopilotChatRecoveryVersion.ts

This file was deleted.

14 changes: 4 additions & 10 deletions build/azure-pipelines/product-copilot-recovery.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@ parameters:
displayName: Publish Stable Recovery Extension
type: boolean
default: false
- name: confirm
displayName: This will publish a new recovery Copilot Chat version to the VS Marketplace. You need to run it from a 'release/X.Y' branch. The pipeline will figure out the exact version number based on the branch, eg. 'X.Y.1'. Do you want to continue? Type 'yes' to proceed.
type: string

variables:
- name: VSCODE_QUALITY
value: stable

extends:
template: azure-pipelines/extension/stable.yml@templates
Expand All @@ -44,15 +45,8 @@ extends:
echo "##vso[task.logissue type=error]publishExtension requires a release/* branch"
exit 1
displayName: Validate release branch
- ${{ if ne(parameters.confirm, 'yes') }}:
- script: |
echo "##vso[task.logissue type=error]publishExtension requires confirm to be 'yes'"
exit 1
displayName: Validate confirm parameter

- template: copilot/setup-steps.yml
- script: node build/azure-pipelines/common/updateCopilotChatRecoveryVersion.ts
displayName: Update Copilot Chat recovery version
- template: copilot/build-steps.yml

uploadSourceMaps:
Expand Down
20 changes: 8 additions & 12 deletions build/darwin/sign.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@ import { spawn } from '@malept/cross-spawn-promise';
const root = path.dirname(path.dirname(import.meta.dirname));
const baseDir = path.dirname(import.meta.dirname);
const product = JSON.parse(fs.readFileSync(path.join(root, 'product.json'), 'utf8'));
const helperAppBaseName = product.nameShort;
const gpuHelperAppName = helperAppBaseName + ' Helper (GPU).app';
const rendererHelperAppName = helperAppBaseName + ' Helper (Renderer).app';
const pluginHelperAppName = helperAppBaseName + ' Helper (Plugin).app';

function getElectronVersion(): string {
const npmrc = fs.readFileSync(path.join(root, '.npmrc'), 'utf8');
Expand All @@ -23,11 +19,11 @@ function getElectronVersion(): string {
}

function getEntitlementsForFile(filePath: string): string {
if (filePath.includes(gpuHelperAppName)) {
if (filePath.includes(' Helper (GPU).app')) {
return path.join(baseDir, 'azure-pipelines', 'darwin', 'helper-gpu-entitlements.plist');
} else if (filePath.includes(rendererHelperAppName)) {
} else if (filePath.includes(' Helper (Renderer).app')) {
return path.join(baseDir, 'azure-pipelines', 'darwin', 'helper-renderer-entitlements.plist');
} else if (filePath.includes(pluginHelperAppName)) {
} else if (filePath.includes(' Helper (Plugin).app')) {
return path.join(baseDir, 'azure-pipelines', 'darwin', 'helper-plugin-entitlements.plist');
}
return path.join(baseDir, 'azure-pipelines', 'darwin', 'app-entitlements.plist');
Expand Down Expand Up @@ -79,7 +75,7 @@ async function main(buildDir?: string): Promise<void> {
const appName = product.nameLong + '.app';
const infoPlistPath = path.resolve(appRoot, appName, 'Contents', 'Info.plist');
const embeddedInfoPlistPath = product.embedded
? path.resolve(appRoot, appName, 'Contents', 'Applications', `${product.embedded.nameShort}.app`, 'Contents', 'Info.plist')
? path.resolve(appRoot, appName, 'Contents', 'Applications', `${product.embedded.nameLong}.app`, 'Contents', 'Info.plist')
: undefined;

const appOpts: SignOptions = {
Expand Down Expand Up @@ -140,28 +136,28 @@ async function main(buildDir?: string): Promise<void> {
'-insert',
'NSAppleEventsUsageDescription',
'-string',
`An application in ${product.embedded.nameShort} wants to use AppleScript.`,
`An application in ${product.embedded.nameLong} wants to use AppleScript.`,
`${embeddedInfoPlistPath}`
]);
await spawn('plutil', [
'-replace',
'NSMicrophoneUsageDescription',
'-string',
`An application in ${product.embedded.nameShort} wants to use the Microphone.`,
`An application in ${product.embedded.nameLong} wants to use the Microphone.`,
`${embeddedInfoPlistPath}`
]);
await spawn('plutil', [
'-replace',
'NSCameraUsageDescription',
'-string',
`An application in ${product.embedded.nameShort} wants to use the Camera.`,
`An application in ${product.embedded.nameLong} wants to use the Camera.`,
`${embeddedInfoPlistPath}`
]);
await spawn('plutil', [
'-replace',
'NSAudioCaptureUsageDescription',
'-string',
`An application in ${product.embedded.nameShort} wants to use Audio Capture.`,
`An application in ${product.embedded.nameLong} wants to use Audio Capture.`,
`${embeddedInfoPlistPath}`
]);
await spawn('plutil', [
Expand Down
8 changes: 7 additions & 1 deletion build/gulpfile.hygiene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import es from 'event-stream';
import path from 'path';
import fs from 'fs';
import * as task from './lib/task.ts';
import { hygiene } from './hygiene.ts';
import { checkCopilotEnginesVersion, hygiene } from './hygiene.ts';

const dirName = path.dirname(new URL(import.meta.url).pathname);

Expand Down Expand Up @@ -41,6 +41,12 @@ const checkPackageJSONTask = task.define('check-package-json', () => {
checkPackageJSON.call(this, 'remote/package.json');
checkPackageJSON.call(this, 'remote/web/package.json');
checkPackageJSON.call(this, 'build/package.json');

const repoRoot = path.join(dirName, '..');
const copilotError = checkCopilotEnginesVersion(repoRoot);
if (copilotError) {
this.emit('error', copilotError);
}
})
);
});
Expand Down
8 changes: 5 additions & 3 deletions build/gulpfile.vscode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,8 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
}));


const embedded = quality
const isInsiderOrExploration = quality === 'insider' || quality === 'exploration';
const embedded = isInsiderOrExploration
? (product as typeof product & { embedded?: EmbeddedProductInfo }).embedded
: undefined;

Expand Down Expand Up @@ -539,6 +540,7 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
ffmpegChromium: false,
...(embedded ? {
darwinMiniAppName: embedded.nameShort,
darwinMiniAppDisplayName: embedded.nameLong,
darwinMiniAppBundleIdentifier: embedded.darwinBundleIdentifier,
darwinMiniAppIcon: 'resources/darwin/agents.icns',
darwinMiniAppAssetsCar: 'resources/darwin/agents.car',
Expand All @@ -561,8 +563,8 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
'**',
'!LICENSE',
'!version',
...(platform === 'darwin' && !quality ? ['!**/Contents/Applications', '!**/Contents/Applications/**'] : []),
...(platform === 'win32' && !quality ? ['!**/electron_proxy.exe'] : []),
...(platform === 'darwin' && !isInsiderOrExploration ? ['!**/Contents/Applications', '!**/Contents/Applications/**'] : []),
...(platform === 'win32' && !isInsiderOrExploration ? ['!**/electron_proxy.exe'] : []),
], { dot: true }));

if (platform === 'linux') {
Expand Down
3 changes: 2 additions & 1 deletion build/gulpfile.vscode.win32.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ function buildWin32Setup(arch: string, target: string): task.CallbackTask {
Quality: quality
};

const embedded = quality
const isInsiderOrExploration = quality === 'insider' || quality === 'exploration';
const embedded = isInsiderOrExploration
? (product as typeof product & { embedded?: EmbeddedProductInfo }).embedded
: undefined;

Expand Down
24 changes: 24 additions & 0 deletions build/hygiene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,21 @@ interface VinylFileWithLines extends VinylFile {
__lines: string[];
}

/**
* Checks that engines.vscode in extensions/copilot/package.json matches ^{version} from the root package.json.
* Returns an error message if mismatched, or undefined if OK.
*/
export function checkCopilotEnginesVersion(repoRoot: string): string | undefined {
const rootPkg = JSON.parse(fs.readFileSync(path.join(repoRoot, 'package.json'), 'utf8'));
const copilotPkg = JSON.parse(fs.readFileSync(path.join(repoRoot, 'extensions/copilot/package.json'), 'utf8'));
const expected = `^${rootPkg.version}`;
const actual = copilotPkg?.engines?.vscode;
if (actual !== expected) {
return `engines.vscode in 'extensions/copilot/package.json' must be "${expected}" (the version from the root package.json), but found "${actual ?? '<missing>'}"`;
}
return undefined;
}

/**
* Main hygiene function that runs checks on files
*/
Expand Down Expand Up @@ -290,6 +305,15 @@ if (import.meta.main) {
const some = out.split(/\r?\n/).filter((l) => !!l);

if (some.length > 0) {
// Check copilot engines.vscode version if relevant files are staged
if (some.some(f => f === 'package.json' || f.startsWith('extensions/copilot/'))) {
const copilotError = checkCopilotEnginesVersion(process.cwd());
if (copilotError) {
console.error(copilotError);
process.exit(1);
}
}

// Run copilot pre-commit checks if copilot files are staged
if (some.some(f => f.startsWith('extensions/copilot/'))) {
console.log('Running copilot pre-commit checks...');
Expand Down
6 changes: 3 additions & 3 deletions build/npm/gyp/package-lock.json

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

6 changes: 5 additions & 1 deletion build/win32/code.iss
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ Type: filesandordirs; Name: "{app}\{#VersionedResourcesFolder}\resources\app\nod
Type: filesandordirs; Name: "{app}\{#VersionedResourcesFolder}\resources\app\node_modules.asar.unpacked"; Check: IsNotBackgroundUpdate
Type: files; Name: "{app}\{#VersionedResourcesFolder}\resources\app\node_modules.asar"; Check: IsNotBackgroundUpdate
Type: files; Name: "{app}\{#VersionedResourcesFolder}\resources\app\Credits_45.0.2454.85.html"; Check: IsNotBackgroundUpdate
#ifdef ProxyExeBasename
; Clean up legacy Start Menu shortcut that used ProxyExeBasename instead of ProxyNameLong
Type: files; Name: "{group}\{#ProxyExeBasename}.lnk"
#endif

[UninstallDelete]
Type: filesandordirs; Name: "{app}\_"
Expand Down Expand Up @@ -117,7 +121,7 @@ Name: "{group}\{#NameLong}"; Filename: "{app}\{#ExeBasename}.exe"; AppUserModelI
Name: "{autodesktop}\{#NameLong}"; Filename: "{app}\{#ExeBasename}.exe"; Tasks: desktopicon; AppUserModelID: "{#AppUserId}"; Check: ShouldUpdateShortcut(ExpandConstant('{autodesktop}\{#NameLong}.lnk'))
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#NameLong}"; Filename: "{app}\{#ExeBasename}.exe"; Tasks: quicklaunchicon; AppUserModelID: "{#AppUserId}"; Check: ShouldUpdateShortcut(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#NameLong}.lnk'))
#ifdef ProxyExeBasename
Name: "{group}\{#ProxyExeBasename}"; Filename: "{app}\{#ProxyExeBasename}.exe"; AppUserModelID: "{#ProxyAppUserId}"; Check: ShouldUpdateShortcut(ExpandConstant('{group}\{#ProxyExeBasename}.lnk'))
Name: "{group}\{#ProxyNameLong}"; Filename: "{app}\{#ProxyExeBasename}.exe"; AppUserModelID: "{#ProxyAppUserId}"; Check: ShouldUpdateShortcut(ExpandConstant('{group}\{#ProxyNameLong}.lnk'))
Name: "{autodesktop}\{#ProxyNameLong}"; Filename: "{app}\{#ProxyExeBasename}.exe"; Tasks: desktopicon; AppUserModelID: "{#ProxyAppUserId}"; Check: ShouldUpdateShortcut(ExpandConstant('{autodesktop}\{#ProxyNameLong}.lnk'))
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#ProxyNameLong}"; Filename: "{app}\{#ProxyExeBasename}.exe"; Tasks: quicklaunchicon; AppUserModelID: "{#ProxyAppUserId}"; Check: ShouldUpdateShortcut(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#ProxyNameLong}.lnk'))
#endif
Expand Down
Loading
Loading