Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
65054fc
Fix typo in README: remove extra 'and' in contributing section
Lefgk May 19, 2026
d67b2d8
remove copilot models from the list
vritant24 May 19, 2026
a35750c
Add model insertion ranges to language model config
vritant24 May 19, 2026
7da6310
Add provider group model management actions
vritant24 May 19, 2026
f1e5c76
Expose provider group actions in Manage Models
vritant24 May 19, 2026
7579173
Sanity test: tighten agent-mode prompt so the model can't skip the to…
bryanchen-d May 20, 2026
a27a0f7
More consistent upgrade button rendering (#317556)
lramos15 May 20, 2026
7d7e951
Use copilot/copilot-utility-small for terminal-tool steering messages…
meganrogge May 20, 2026
4e538f2
Issue reporter wizard
Giuspepe May 20, 2026
6732cf7
fix: forward async isInstallationPure into wizard model
Giuspepe May 20, 2026
f4cf1a6
ci: retrigger pipeline
Giuspepe May 20, 2026
9ecd1e9
Merge pull request #317577 from microsoft/agents/issue-reporting-flow…
Giuspepe May 20, 2026
1e7597c
sessions: workspace picker emits folder URI, session type picker span…
sandy081 May 20, 2026
628f432
rename and reorder actions
vritant24 May 20, 2026
0d944f4
Address GHE onboarding issues (#317205)
cwebster-99 May 20, 2026
97a41a0
Fix model insertion for empty arrays and skip API key update when val…
vritant24 May 20, 2026
0741dcb
Merge branch 'main' into dev/vritant24/manageModelsContext
vritant24 May 20, 2026
3522b12
Merge branch 'main' into dev/vrbhardw/utility-no-copilot
vritant24 May 20, 2026
b36c628
Add agent (grok build, cursor) and agy (antigravity) CLIs to ignoredC…
Tyriar May 20, 2026
aead057
chat: persist installed plugin identity (#317585)
connor4312 May 20, 2026
f666f19
add ChatSessionCustomizationItem.source, clean up AICustomizationProm…
aeschli May 20, 2026
382e40a
fix: handle corrupted session files gracefully in getChatHistoryImpl …
vs-code-engineering[bot] May 20, 2026
9f1d336
use constant
vritant24 May 20, 2026
e359553
Merge branch 'main' into dev/vrbhardw/utility-no-copilot
vritant24 May 20, 2026
5af3ef5
add comment
vritant24 May 20, 2026
2e3819a
Fix sudo -S sensitive input detection (#317594)
meganrogge May 20, 2026
5e51382
don't show fun messages if we are replacing them for thinking phrases…
justschen May 20, 2026
83ab76d
Merge pull request #317595 from microsoft/dev/vrbhardw/utility-no-cop…
vritant24 May 20, 2026
57ff4a0
sessions: fix worktree-created task dispatch (#317598)
connor4312 May 20, 2026
bc7d325
"Open Browser Settings" simplified to just "Browser Settings" (#317217)
jruales May 20, 2026
2e8b995
agents: add smoke test for Agents Window with mocked LLM server (#317…
sandy081 May 20, 2026
80afb57
Add new VS Code theme for mermaid diagrams
mjbvz May 20, 2026
35e7549
Merge branch 'main' into dev/vritant24/manageModelsContext
vritant24 May 20, 2026
2b1baa0
Update notebook file too
mjbvz May 20, 2026
2207fb5
Merge pull request #317252 from Lefgk/fix/readme-typo-to-and
mjbvz May 20, 2026
4ec65be
test(mcp): avoid spurious sinon FakeTimers console warning
bryanchen-d May 20, 2026
8166ded
Fix fallback logic
mjbvz May 20, 2026
223302f
fixup: widen sinon fake-timer config type
bryanchen-d May 20, 2026
fe825e9
sessions: use per-agent icon for agent host sessions (#317620)
sandy081 May 20, 2026
59772e8
fix: enable logging condition in state model change logging (#317626)
DonJayamanne May 20, 2026
e993390
Merge pull request #317419 from microsoft/dev/vritant24/manageModelsC…
vritant24 May 20, 2026
5608b5f
Merge pull request #317426 from microsoft/brchen/sanity-agent-prompt-fix
bryanchen-d May 20, 2026
c0f1f05
Merge pull request #317631 from microsoft/brchen/mcp-sampling-log-fak…
bryanchen-d May 20, 2026
fb7459a
Merge pull request #317617 from microsoft/dev/mjbvz/remote-donkey
mjbvz May 20, 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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ There are many ways in which you can participate in this project, for example:

* [Submit bugs and feature requests](https://github.com/microsoft/vscode/issues), and help us verify as they are checked in
* Review [source code changes](https://github.com/microsoft/vscode/pulls)
* Review the [documentation](https://github.com/microsoft/vscode-docs) and make pull requests for anything from typos to and new content.
* Review the [documentation](https://github.com/microsoft/vscode-docs) and make pull requests for anything from typos to new content.

If you are interested in fixing issues and contributing directly to the code base,
please see the document [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute), which covers the following:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ export class CopilotCLIModels extends Disposable implements ICopilotCLIModels {
} satisfies CopilotCLIModelInfo));
} catch (ex) {
this.logService.error(`[CopilotCLISession] Failed to fetch models`, ex);
// Clear cached promise so subsequent calls retry instead of
// permanently returning an empty list after a transient failure.
this._availableModels = undefined;
return [];
}
}
Expand Down Expand Up @@ -280,8 +283,9 @@ export interface CLIAgentInfo {
readonly agent: Readonly<SweCustomAgent>;
/** File URI for prompt-file agents, synthetic `copilotcli:` URI for SDK-only agents. */
readonly sourceUri: URI;
readonly extensionId?: string;
readonly pluginUri?: URI;
readonly source: vscode.ChatResourceSource;
readonly extensionId: string | undefined;
readonly pluginUri: URI | undefined;
}

export interface ICopilotCLIAgents {
Expand Down Expand Up @@ -374,7 +378,7 @@ export class CopilotCLIAgents extends Disposable implements ICopilotCLIAgents {
});
}

return this._agentsPromise.then(infos => infos.map(i => ({ agent: this.cloneAgent(i.agent), sourceUri: i.sourceUri })));
return this._agentsPromise.then(infos => infos.map(i => ({ agent: this.cloneAgent(i.agent), sourceUri: i.sourceUri, source: i.source, extensionId: i.extensionId, pluginUri: i.pluginUri })));
}

async getAgentsImpl(): Promise<readonly CLIAgentInfo[]> {
Expand Down Expand Up @@ -435,6 +439,9 @@ export class CopilotCLIAgents extends Disposable implements ICopilotCLIAgents {
...(model ? { model } : {}),
},
sourceUri: customAgent.uri,
source: customAgent.source,
extensionId: customAgent.extensionId,
pluginUri: customAgent.pluginUri
};
}

Expand Down Expand Up @@ -563,7 +570,12 @@ export class CopilotCLISDK implements ICopilotCLISDK {
host: 'https://github.com',
copilotUser: {
endpoints: {
api: overrideProxyUrl
api: overrideProxyUrl,
// `proxy` must also point at the mock server so that SDK
// calls to /copilot_internal/v2/token and /models/session
// are routed to the mock instead of the real GitHub API
// (which would reject the fake HMAC with a 401).
proxy: overrideProxyUrl,
}
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1037,6 +1037,9 @@ export class CopilotCLISessionService extends Disposable implements ICopilotCLIS
shutdown = sessionManager.closeSession(sessionId).catch(error => {
this.logService.error(`[CopilotCLISession] Failed to close session ${sessionId} after fetching chat history: ${error}`);
});
} catch (error) {
this.logService.error(`[CopilotCLISession] Failed to read session ${sessionId}, it may be corrupted: ${error}`);
return { history: [], events: [] };
} finally {
await shutdown;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,14 @@ export class CopilotCLICustomizationProvider extends Disposable implements vscod
*/
private async getAgentItems(_token: vscode.CancellationToken): Promise<vscode.ChatSessionCustomizationItem[]> {
const agentInfos = await this.copilotCLIAgents.getAgents();
return agentInfos.map(({ agent, sourceUri, pluginUri, extensionId }) => ({
return agentInfos.map(({ agent, sourceUri, pluginUri, extensionId, source }) => ({
uri: sourceUri,
type: vscode.ChatSessionCustomizationType.Agent,
name: agent.displayName || agent.name,
description: agent.description,
extensionId,
pluginUri
pluginUri,
source
}));
}

Expand Down Expand Up @@ -137,6 +138,7 @@ export class CopilotCLICustomizationProvider extends Disposable implements vscod
name: basename(uri),
description: undefined,
groupKey: 'agent-instructions',
source: 'local', // these are surfaced by the extension, even if they come from the workspace
extensionId: undefined,
pluginUri: undefined
});
Expand Down Expand Up @@ -172,7 +174,8 @@ export class CopilotCLICustomizationProvider extends Disposable implements vscod
badge,
badgeTooltip,
extensionId: instruction.extensionId,
pluginUri: instruction.pluginUri
pluginUri: instruction.pluginUri,
source: instruction.source
});
} else {
items.push({
Expand All @@ -182,7 +185,8 @@ export class CopilotCLICustomizationProvider extends Disposable implements vscod
description,
groupKey: 'on-demand-instructions',
extensionId: instruction.extensionId,
pluginUri: instruction.pluginUri
pluginUri: instruction.pluginUri,
source: instruction.source
});
}
}
Expand All @@ -201,6 +205,7 @@ export class CopilotCLICustomizationProvider extends Disposable implements vscod
description: s.description,
extensionId: s.extensionId,
pluginUri: s.pluginUri,
source: s.source
}));
}

Expand All @@ -216,6 +221,7 @@ export class CopilotCLICustomizationProvider extends Disposable implements vscod
description: undefined,
extensionId: h.extensionId,
pluginUri: h.pluginUri,
source: h.source
}));
}

Expand All @@ -230,6 +236,7 @@ export class CopilotCLICustomizationProvider extends Disposable implements vscod
description: undefined,
extensionId: undefined,
pluginUri: undefined,
source: 'plugin'
}));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ function makeAgentInfo(name: string, description = '', displayName?: string): CL
return {
agent: makeSweAgent(name, description, displayName),
sourceUri: URI.from({ scheme: 'copilotcli', path: `/agents/${name}` }),
source: 'local',
extensionId: undefined,
pluginUri: undefined,
};
}

Expand All @@ -50,6 +53,9 @@ function makeFileAgentInfo(name: string, fileUri: URI, description = ''): CLIAge
return {
agent: makeSweAgent(name, description),
sourceUri: fileUri,
source: 'local',
extensionId: undefined,
pluginUri: undefined,
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ export class ClaudeCustomizationProvider extends Disposable implements vscode.Ch
description: agent.description,
extensionId: undefined,
pluginUri: undefined,
source: 'builtin'
// No groupKey — vscode infers Built-in from non-file: scheme
});
}
Expand All @@ -126,6 +127,7 @@ export class ClaudeCustomizationProvider extends Disposable implements vscode.Ch
description: agent.description,
extensionId: agent.extensionId,
pluginUri: agent.pluginUri,
source: agent.source
});
}
}
Expand All @@ -150,6 +152,7 @@ export class ClaudeCustomizationProvider extends Disposable implements vscode.Ch
description: skill.description,
extensionId: skill.extensionId,
pluginUri: skill.pluginUri,
source: skill.source
};
skillItems.push(item);
}
Expand All @@ -168,23 +171,23 @@ export class ClaudeCustomizationProvider extends Disposable implements vscode.Ch

private async discoverInstructions(): Promise<vscode.ChatSessionCustomizationItem[]> {
const items: vscode.ChatSessionCustomizationItem[] = [];
const candidates: URI[] = [];
const candidates: { uri: URI; source: vscode.ChatResourceSource }[] = [];

for (const folder of this.workspaceService.getWorkspaceFolders()) {
for (const entry of WORKSPACE_INSTRUCTION_PATHS) {
if (typeof entry === 'string') {
candidates.push(URI.joinPath(folder, entry));
candidates.push({ uri: URI.joinPath(folder, entry), source: 'local' });
} else {
candidates.push(URI.joinPath(folder, ...entry));
candidates.push({ uri: URI.joinPath(folder, ...entry), source: 'local' });
}
}
}

for (const entry of HOME_INSTRUCTION_PATHS) {
candidates.push(URI.joinPath(this.envService.userHome, ...entry));
candidates.push({ uri: URI.joinPath(this.envService.userHome, ...entry), source: 'user' });
}

for (const uri of candidates) {
for (const { uri, source } of candidates) {
if (await this.fileExists(uri)) {
const name = basename(uri).replace(/\.md$/i, '');
items.push({
Expand All @@ -194,10 +197,10 @@ export class ClaudeCustomizationProvider extends Disposable implements vscode.Ch
description: undefined,
extensionId: undefined,
pluginUri: undefined,
source,
});
}
}

return items;
}

Expand All @@ -214,9 +217,9 @@ export class ClaudeCustomizationProvider extends Disposable implements vscode.Ch
const items: vscode.ChatSessionCustomizationItem[] = [];
const settingsPaths = this.getSettingsFilePaths();

for (const settingsUri of settingsPaths) {
for (const { uri, source } of settingsPaths) {
try {
const content = await this.fileSystemService.readFile(settingsUri);
const content = await this.fileSystemService.readFile(uri);
const settings: HooksSettings = JSON.parse(new TextDecoder().decode(content));
if (!settings.hooks) {
continue;
Expand All @@ -232,12 +235,13 @@ export class ClaudeCustomizationProvider extends Disposable implements vscode.Ch
for (const hook of matcher.hooks) {
const matcherLabel = matcher.matcher === '*' ? '' : ` (${matcher.matcher})`;
items.push({
uri: settingsUri,
uri,
type: vscode.ChatSessionCustomizationType.Hook,
name: `${eventId}${matcherLabel}`,
description: hook.command,
extensionId: undefined,
pluginUri: undefined,
source
});
}
}
Expand All @@ -250,15 +254,15 @@ export class ClaudeCustomizationProvider extends Disposable implements vscode.Ch
return items;
}

private getSettingsFilePaths(): URI[] {
const paths: URI[] = [];
private getSettingsFilePaths(): { uri: URI; source: vscode.ChatResourceSource }[] {
const paths: { uri: URI; source: vscode.ChatResourceSource }[] = [];

for (const folder of this.workspaceService.getWorkspaceFolders()) {
paths.push(URI.joinPath(folder, '.claude', 'settings.json'));
paths.push(URI.joinPath(folder, '.claude', 'settings.local.json'));
paths.push({ uri: URI.joinPath(folder, '.claude', 'settings.json'), source: 'local' });
paths.push({ uri: URI.joinPath(folder, '.claude', 'settings.local.json'), source: 'local' });
}

paths.push(URI.joinPath(this.envService.userHome, '.claude', 'settings.json'));
paths.push({ uri: URI.joinPath(this.envService.userHome, '.claude', 'settings.json'), source: 'user' });
return paths;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,10 @@ suite('Copilot Chat Sanity Test', function () {
// (and what kind of parts).
const runAgentRequest = async (): Promise<SpyChatResponseStream> => {
const stream = new SpyChatResponseStream();
const testRequest = new TestChatRequest(`You must use the get_errors tool to check the window for errors. It may fail, that's ok, just testing, don't retry.`);
// Keep the instruction unconditional. Any hedging language ("it may
// fail, that's ok", "it's fine if it errors") gives newer models cover
// to skip the invocation entirely and just narrate a plausible failure.
const testRequest = new TestChatRequest(`Call the get_errors tool now to check the current window for errors. You must invoke the tool exactly once, then reply with a brief summary of whatever it returned.`);
testRequest.tools.set(ContributedToolName.GetErrors, true);
const interactiveSession = instaService.createInstance(ChatParticipantRequestHandler, [], testRequest, stream, fakeToken, { agentName: '', agentId: '', intentId: Intent.Agent }, () => false, undefined);

Expand Down
23 changes: 21 additions & 2 deletions extensions/mermaid-markdown-features/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,26 +82,44 @@
"order": 0,
"type": "string",
"enum": [
"vscode",
"base",
"forest",
"dark",
"default",
"neutral"
],
"default": "default",
"enumDescriptions": [
"%config.markdown-mermaid.theme.vscode.description%",
"%config.markdown-mermaid.theme.base.description%",
"%config.markdown-mermaid.theme.forest.description%",
"%config.markdown-mermaid.theme.dark.description%",
"%config.markdown-mermaid.theme.default.description%",
"%config.markdown-mermaid.theme.neutral.description%"
],
"default": "vscode",
"description": "%config.markdown-mermaid.lightModeTheme.description%"
},
"markdown-mermaid.darkModeTheme": {
"order": 1,
"type": "string",
"enum": [
"vscode",
"base",
"forest",
"dark",
"default",
"neutral"
],
"default": "dark",
"enumDescriptions": [
"%config.markdown-mermaid.theme.vscode.description%",
"%config.markdown-mermaid.theme.base.description%",
"%config.markdown-mermaid.theme.forest.description%",
"%config.markdown-mermaid.theme.dark.description%",
"%config.markdown-mermaid.theme.default.description%",
"%config.markdown-mermaid.theme.neutral.description%"
],
"default": "vscode",
"description": "%config.markdown-mermaid.darkModeTheme.description%"
},
"markdown-mermaid.languages": {
Expand Down Expand Up @@ -170,6 +188,7 @@
{
"id": "vscode.markdown-it.mermaid-extension",
"displayName": "Markdown-It Mermaid Renderer",
"requiresMessaging": "optional",
"entrypoint": {
"extends": "vscode.markdown-it-renderer",
"path": "./notebook-out/index.js"
Expand Down
6 changes: 6 additions & 0 deletions extensions/mermaid-markdown-features/package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@
"config.title": "Mermaid",
"config.markdown-mermaid.lightModeTheme.description": "Default Mermaid theme for light mode.",
"config.markdown-mermaid.darkModeTheme.description": "Default Mermaid theme for dark mode.",
"config.markdown-mermaid.theme.vscode.description": "Mermaid theme derived from the current VS Code color theme.",
"config.markdown-mermaid.theme.base.description": "Built-in Mermaid theme. The only Mermaid theme that can be customized with theme variables.",
"config.markdown-mermaid.theme.forest.description": "Built-in Mermaid theme using shades of green.",
"config.markdown-mermaid.theme.dark.description": "Built-in Mermaid theme for dark backgrounds.",
"config.markdown-mermaid.theme.default.description": "The default built-in Mermaid theme. Works well with light backgrounds.",
"config.markdown-mermaid.theme.neutral.description": "Built-in Mermaid theme using a neutral grayscale palette. Suitable for black and white prints.",
"config.markdown-mermaid.languages.description": "Default languages in Markdown.",
"config.markdown-mermaid.maxTextSize.description": "The maximum allowed size of the user's text diagram.",
"config.markdown-mermaid.mouseNavigation.enabled.description": "Controls when mouse-based navigation is enabled on Mermaid diagrams.",
Expand Down
Loading
Loading