Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
9c7daf6
fix: align single-chat session header with tabs
mrleemurray Sep 3, 2026
b8436fa
fix: add accessible empty-state headings
mrleemurray Sep 3, 2026
7eab850
fix: adjust padding for session header bar
mrleemurray Sep 3, 2026
a5b0d74
fix: add high contrast session header separator
mrleemurray Sep 3, 2026
1861d92
voice: preserve mode when creating agent sessions (#334071)
meganrogge Sep 3, 2026
055e2e1
agentHost: ignore host notice turns when resolving the last turn (#33…
benibenj Sep 3, 2026
b6234bd
Merge pull request #334294 from microsoft/mrleemurray/agents-single-c…
mrleemurray Sep 3, 2026
d18a096
Chat: preserve compact Agent Merge icon sizing (#334313)
mrleemurray Sep 3, 2026
7949faf
agentHost: allow turns with unavailable subagent transcripts (#334312)
roblourens Sep 3, 2026
7dc0948
workbench: fix compact activity menu in Modern UI
mrleemurray Sep 3, 2026
5523707
Preserve editor match rules when configuring defaults
hediet Sep 3, 2026
ae6fb7b
Fix editor resolver test typecheck
hediet Sep 3, 2026
f950e42
Preserve editor association precedence
hediet Sep 3, 2026
3c83500
Report a browser tool failure with an empty message as a failure (#33…
RyanEwen Sep 3, 2026
d536fa6
Add node paths for telemetry in region context (#334320)
dbaeumer Sep 3, 2026
25131dd
Add layout density options for modern UI in `Customize Layout` menu (…
mrleemurray Sep 3, 2026
04a72f8
agentHost: Clarify Codex agent description (#334325)
Giuspepe Sep 3, 2026
8918ad7
workbench: address compact activity menu feedback
mrleemurray Sep 3, 2026
7a7037f
chat: Fix pasted GitHub reference interactions (#334310)
meganrogge Sep 3, 2026
3d7dfbd
sessions: Fix duplicate agent mode picker tab stop (#334308)
meganrogge Sep 3, 2026
7bcc021
Fix remote host empty state fixture width
hediet Sep 3, 2026
1e1ee36
Chat: unify Agent Host status pills across chat surfaces (#332982)
justschen Sep 3, 2026
4e7455b
Merge pull request #334295 from microsoft/mrleemurray/agents/accessib…
mrleemurray Sep 3, 2026
bd9e0e4
chore: remove stale error telemetry customizations (#334335)
bryanchen-d Sep 3, 2026
71c72be
test: stabilize empty Agent Host changesets (#334299)
roblourens Sep 3, 2026
2082c5b
Merge pull request #334327 from mrleemurray/mrleemurray/agents/fix-un…
mrleemurray Sep 3, 2026
136f102
Prevent auth replay from blocking provider shutdown (#332824)
roblourens Sep 3, 2026
f64b8bd
Merge pull request #334339 from microsoft/hediet/fix-remote-host-fixt…
hediet Sep 3, 2026
9f1c7bd
chat: Mark consolidated remote workspaces experimental (#334342)
meganrogge Sep 3, 2026
60bb3f6
launch: Encode agent session titles for command safety (#334304)
meganrogge Sep 3, 2026
6afe58b
sessions: align new chat picker typography (#334307)
meganrogge Sep 3, 2026
0fd2d7c
test: avoid restoring archived session during E2E cleanup (#334346)
roblourens Sep 3, 2026
4290bed
agent host: stop chat queues from wedging on a non-settling SDK RPC (…
connor4312 Sep 3, 2026
cec8ce7
Implement subagent default setting to Auto without overriding models …
sbatten Sep 3, 2026
5be7ea0
policy: disable custom terminal tool for managed accounts (#334297)
anthonykim1 Sep 3, 2026
315dcc5
Avoid changing model picker for subagent Auto retries (#334357)
bhavyaus Sep 3, 2026
3fa0c2b
agentHost: remove redundant picker tab stop (#334306)
meganrogge Sep 3, 2026
3e807d9
Unify multi-diff editor presentation variants
hediet Sep 3, 2026
af085bc
Fix multi-diff widget field initialization
hediet Sep 3, 2026
62bdc0b
Update Markdown editor to 0.0.2-88
hediet Sep 3, 2026
b04dcb3
Fix CMD/bat comment spacing (#334205)
Copilot Sep 3, 2026
ac06751
sessions: Add no-workspace option to new session picker (#334356)
meganrogge Sep 3, 2026
cb18f03
chat: Select primary Luna model for dictation cleanup (#334363)
meganrogge Sep 3, 2026
74a1af8
Experimental model picker redesign (#334332)
lramos15 Sep 3, 2026
47c84b8
Agent Host: stop the reconnecting banner nagging on a flapping transp…
connor4312 Sep 3, 2026
61fc631
[cherry-pick] Fix markdown inline comment hover background
vs-code-engineering[bot] Sep 1, 2026
a04df6e
remove example from mock-policy-server (#334361)
joshspicer Sep 3, 2026
68a1501
Agents - enable switching branches for folder sessions (#334354)
lszomoru Sep 3, 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
3 changes: 2 additions & 1 deletion .agents/skills/launch/scripts/launch.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,8 @@ try {
if ($agents) {
$launchArgs.Add('--agents')
if (-not [string]::IsNullOrWhiteSpace($sessionTitle)) {
$launchArgs.Add("--session-title=$sessionTitle")
$sessionTitleBase64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($sessionTitle)).TrimEnd('=').Replace('+', '-').Replace('/', '_')
$launchArgs.Add("--session-title-base64=$sessionTitleBase64")
}
}
$launchArgs.Add("--user-data-dir=$destinationUdd")
Expand Down
3 changes: 2 additions & 1 deletion .agents/skills/launch/scripts/launch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,8 @@ fi
if [[ "$AGENTS" == "1" ]]; then
ARGS=("--agents" "${ARGS[@]}")
if [[ -n "$SESSION_TITLE" ]]; then
ARGS+=("--session-title=$SESSION_TITLE")
SESSION_TITLE_BASE64=$(node -e 'process.stdout.write(Buffer.from(process.argv[1], "utf8").toString("base64url"))' -- "$SESSION_TITLE")
ARGS+=("--session-title-base64=$SESSION_TITLE_BASE64")
fi
fi
if (( ${#EXTRA_ARGS[@]} )); then
Expand Down
60 changes: 0 additions & 60 deletions .github/prompts/fix-error.prompt.md

This file was deleted.

99 changes: 0 additions & 99 deletions .github/skills/fix-errors/SKILL.md

This file was deleted.

15 changes: 15 additions & 0 deletions build/lib/policies/policyData.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,21 @@
"default": false,
"included": true
},
{
"key": "chat.agentHost.customTerminalTool.enabled",
"name": "ChatAgentHostCustomTerminalTool",
"category": "InteractiveSession",
"minimumVersion": "1.137",
"localization": {
"description": {
"key": "chat.agentHost.customTerminalTool.enabled.policy",
"value": "Enable the Agent Host custom terminal tool override for Copilot SDK sessions."
}
},
"type": "boolean",
"default": false,
"included": true
},
{
"key": "chat.agentHost.otel.captureContent",
"name": "CopilotOtelCaptureContent",
Expand Down
2 changes: 1 addition & 1 deletion extensions/bat/language-configuration.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"comments": {
"lineComment": "@REM"
"lineComment": "@REM "
},
"brackets": [
["{", "}"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -298,9 +298,12 @@ Learn more about [GitHub Copilot](https://docs.github.com/copilot/using-github-c
if (!baseLmModel) {
return request;
}
await vscode.commands.executeCommand('workbench.action.chat.changeModel', { vendor: baseLmModel.vendor, id: baseLmModel.id, family: baseLmModel.family });
// Switch to the base model and show a warning
request = { ...request, model: baseLmModel };
if (request.subAgentInvocationId === undefined) {
// A subagent runs inside the main request; changing the picker there would flip every widget mid-turn.
await vscode.commands.executeCommand('workbench.action.chat.changeModel', { vendor: baseLmModel.vendor, id: baseLmModel.id, family: baseLmModel.family });
}
// Switch to the base model and show a warning
let messageString: vscode.MarkdownString;
if (this.authenticationService.copilotToken?.isIndividual) {
messageString = new vscode.MarkdownString(vscode.l10n.t({
Expand All @@ -322,8 +325,10 @@ Learn more about [GitHub Copilot](https://docs.github.com/copilot/using-github-c
if (!autoModel) {
return request;
}
await vscode.commands.executeCommand('workbench.action.chat.changeModel', { vendor: autoModel.vendor, id: autoModel.id, family: autoModel.family });
request = { ...request, model: autoModel };
if (request.subAgentInvocationId === undefined) {
await vscode.commands.executeCommand('workbench.action.chat.changeModel', { vendor: autoModel.vendor, id: autoModel.id, family: autoModel.family });
}
if (alwaysSwitchToAuto) {
await vscode.workspace.getConfiguration('github.copilot').update('chat.rateLimitAutoSwitchToAuto', true, vscode.ConfigurationTarget.Global);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ function buildConfigurationSchema(endpoint: IChatEndpoint, autoTiersEnabled: boo

const DICTATION_CLEANUP_NANO_ALIAS = 'copilot-dictation-cleanup-nano';
const DICTATION_CLEANUP_LUNA_ALIAS = 'copilot-dictation-cleanup-luna';
const DICTATION_CLEANUP_LUNA_MODEL_ID = 'gpt-5.6-luna';
const dictationCleanupAliases: ReadonlySet<string> = new Set([DICTATION_CLEANUP_NANO_ALIAS, DICTATION_CLEANUP_LUNA_ALIAS]);
const utilityAliasFamilies: readonly ChatEndpointFamily[] = ['copilot-utility-small', 'copilot-utility', DICTATION_CLEANUP_NANO_ALIAS, DICTATION_CLEANUP_LUNA_ALIAS];

Expand All @@ -175,7 +176,7 @@ const utilityAliasFamilies: readonly ChatEndpointFamily[] = ['copilot-utility-sm
* normal copilot model entry.
*/
export function buildUtilityAliasModelInfo(
family: ChatEndpointFamily,
family: string,
endpoint: IChatEndpoint,
models: readonly vscode.LanguageModelChatInformation[],
baseCount: number,
Expand Down Expand Up @@ -453,6 +454,14 @@ export class LanguageModelAccess extends Disposable implements IExtensionContrib
}
}

const luna = this._resolvedUtilityEndpoints.get(DICTATION_CLEANUP_LUNA_ALIAS);
if (luna && !models.some(model => model.id === DICTATION_CLEANUP_LUNA_MODEL_ID)) {
this._utilityAliasEndpoints.set(DICTATION_CLEANUP_LUNA_MODEL_ID, luna.endpoint);
const modelInfo = buildUtilityAliasModelInfo(DICTATION_CLEANUP_LUNA_MODEL_ID, luna.endpoint, models, luna.baseCount, requiresAuthorization);
this._logService.trace(`[LanguageModelAccess] Publishing core-only model '${DICTATION_CLEANUP_LUNA_MODEL_ID}' -> ${luna.endpoint.model}.`);
models.push(modelInfo.info);
}

// Resolution may hang (override lookups, base-count tokenization), so keep it off
// the model-info request path. Newly resolved endpoints are published on the next
// request once `_refreshUtilityOverrides` fires `_onDidChange`.
Expand Down Expand Up @@ -546,7 +555,8 @@ export class LanguageModelAccess extends Disposable implements IExtensionContrib
progress: vscode.Progress<vscode.LanguageModelResponsePart2>,
token: vscode.CancellationToken
): Promise<void> {
if (dictationCleanupAliases.has(model.id) && options.requestInitiator !== 'core') {
const isCoreOnlyModel = dictationCleanupAliases.has(model.id) || (model.id === DICTATION_CLEANUP_LUNA_MODEL_ID && this._utilityAliasEndpoints.has(model.id));
if (isCoreOnlyModel && options.requestInitiator !== 'core') {
throw new Error(`Model ${model.id} is only available to VS Code core.`);
}
let endpoint = await this._getEndpointForModel(model, buildAutoRoutingContext(messages, options));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ suite('LanguageModelAccess model info', () => {
}
});

test('publishes core-only aliases for dictation cleanup without publishing hidden models directly', async () => {
test('publishes core-only dictation cleanup models without exposing them in the picker', async () => {
const makeHiddenEndpoint = (model: string): IChatEndpoint => ({
model,
name: model,
Expand Down Expand Up @@ -510,27 +510,30 @@ suite('LanguageModelAccess model info', () => {
assert.ok(modelInfo, 'provideLanguageModelChatInfo did not resolve');
const nanoAlias = modelInfo.find(m => m.id === 'copilot-dictation-cleanup-nano');
const lunaAlias = modelInfo.find(m => m.id === 'copilot-dictation-cleanup-luna');
const lunaModel = modelInfo.find(m => m.id === 'gpt-5.6-luna');
assert.deepStrictEqual({
nanoAliasPublished: Boolean(nanoAlias),
nanoAliasUserSelectable: nanoAlias?.isUserSelectable,
lunaAliasPublished: Boolean(lunaAlias),
lunaAliasUserSelectable: lunaAlias?.isUserSelectable,
nanoPublishedDirectly: modelInfo.some(m => m.id === 'gpt-5.4-nano'),
lunaPublishedDirectly: modelInfo.some(m => m.id === 'gpt-5.6-luna'),
lunaPublishedDirectly: Boolean(lunaModel),
lunaDirectlyUserSelectable: lunaModel?.isUserSelectable,
otherPublished: modelInfo.some(m => m.id === 'some-hidden-model'),
}, {
nanoAliasPublished: true,
nanoAliasUserSelectable: false,
lunaAliasPublished: true,
lunaAliasUserSelectable: false,
nanoPublishedDirectly: false,
lunaPublishedDirectly: false,
lunaPublishedDirectly: true,
lunaDirectlyUserSelectable: false,
otherPublished: false,
});
for (const alias of [nanoAlias!, lunaAlias!]) {
for (const model of [nanoAlias!, lunaAlias!, lunaModel!]) {
await assert.rejects(
testAccess._provideLanguageModelChatResponse(
alias,
model,
[],
{ requestInitiator: 'publisher.extension' } as vscode.ProvideLanguageModelChatResponseOptions,
{ report: () => { } },
Expand Down
Loading
Loading