Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
0609d9d
Polish context size picker wording
Copilot May 29, 2026
d06e5bb
feat: add /research slash command to agent host (#318861)
digitarald May 29, 2026
5dcafbd
agentHost: batch AHP log writes and skip URI deep clone (#318864)
roblourens May 29, 2026
43f8971
remove policy codeowners (#319038)
joshspicer May 29, 2026
5b0f4fc
Include http in Xaa Issuer (#319041)
TylerLeonhardt May 29, 2026
57a397f
Merge pull request #319020 from microsoft/copilot/change-context-size…
eli-w-king May 29, 2026
841d3b6
Agents - fix disposable leak in the account widget (#319046)
lszomoru May 29, 2026
ef7fbda
build(deps-dev): bump tmp from 0.2.4 to 0.2.6 in /test/integration/br…
dependabot[bot] May 29, 2026
3633ce0
Support model hovers in cloud model picker (#318657)
pwang347 May 29, 2026
f4adf70
Improvements to Area/FullPage Screenshot to Chat (#318932)
jruales May 29, 2026
0669c96
Fix system notification command rendering as literal backtick (#31860…
roblourens May 29, 2026
e281de6
build(deps): bump tar from 0.4.45 to 0.4.46 in /cli (#319053)
dependabot[bot] May 29, 2026
b24c5e3
policy: enterprise managed_settings for Copilot clients (#318623)
joshspicer May 29, 2026
ffbcb7c
agentfeedback logs
benibenj May 29, 2026
b365ecd
Chronicle: per-subcommand telemetry attribution for sessionStoreSql t…
vijayupadya May 29, 2026
fa6f6bd
remove some experimental settings (#319056)
justschen May 29, 2026
1091536
agent host: hydrate snapshot controller for Restore Checkpoint (#319051)
connor4312 May 29, 2026
87cf64a
Merge pull request #319057 from microsoft/benibenj/elegant-damselfly
benibenj May 29, 2026
f834625
Bump version to 1.123.0 (#318253)
vs-code-engineering[bot] May 29, 2026
4293b05
chat: avoid reverting model to auto when editing messages (#319063)
connor4312 May 29, 2026
77c870d
maximize and sticky logs
benibenj May 29, 2026
0d42e11
chat (sessions): fix forking AHP chats so the new session opens with …
connor4312 May 29, 2026
7295144
Suggest upgrade if out of additional budget (#319055)
pwang347 May 29, 2026
e53b01b
Merge pull request #319069 from microsoft/benibenj/elaborate-bedbug
benibenj May 29, 2026
e1a9625
[Windows_Sandboxing]Refactoring config creation for windows sandboxin…
dileepyavan May 29, 2026
918b342
more perf improvements for pixel spinner (#319030)
justschen May 29, 2026
ca1cfd5
Browser: Favorites (#319040)
kycutler May 29, 2026
a733226
feat: add getWorkingDirectory method to agent host session providers …
aeschli May 29, 2026
82e07a4
Forward GitHub token in createSession/resumeSession RPC (#319029)
roblourens May 29, 2026
0905b9d
Agent Host Copilot CLI: Support async shell completion notifications …
anthonykim1 May 30, 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: 0 additions & 3 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@
.github/workflows/pr.yml @lszomoru @alexdima @joaomoreno @TylerLeonhardt @rzhao271 @Yoyokrazy
.github/workflows/telemetry.yml @lramos15 @lszomoru @alexdima @joaomoreno

# Ensure those that manage generated policy are aware of changes
build/lib/policies/policyData.jsonc @joshspicer @rebornix @alexdima @joaomoreno @pwang347 @sandy081

# VS Code API
# Ensure the API team is aware of changes to the vscode-dts file
# this is only about the final API, not about proposed API changes
Expand Down
2 changes: 1 addition & 1 deletion .github/skills/chat-customizations-editor/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ Without all three, built-in regrouping silently doesn't run and the fixture only
### Editor contribution service mocks

The management editor embeds a `CodeEditorWidget`. Electron-side editor contributions (e.g., `AgentFeedbackEditorWidgetContribution`) are instantiated automatically and crash if their injected services aren't registered. The fixture must mock at minimum:
- `IAgentFeedbackService` — needs `onDidChangeFeedback`, `onDidChangeNavigation` as `Event.None`
- `IAgentFeedbackService` — needs `onDidChangeFeedback`, `onDidChangeNavigation`, `onDidAddFeedback`, `onDidConvertFeedback`, `onDidAddReply`, `onDidSubmitFeedback` as `Event.None`
- `ICodeReviewService` — needs `getReviewState()` / `getPRReviewState()` returning idle observables
- `IChatEditingService` — needs `editingSessionsObs` as empty observable
- `IAgentSessionsService` — needs `model.sessions` as empty array
Expand Down
45 changes: 45 additions & 0 deletions build/lib/policies/policyData.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,21 @@
"default": {},
"included": false
},
{
"key": "chat.plugins.extraMarketplaces",
"name": "ChatExtraMarketplaces",
"category": "InteractiveSession",
"minimumVersion": "1.122",
"localization": {
"description": {
"key": "chat.plugins.extraMarketplaces.policy",
"value": "Additional plugin marketplaces to query. Keys are marketplace names; values are GitHub shorthand (`owner/repo[#ref]`) or Git URIs (`<url>[#ref]`)."
}
},
"type": "object",
"default": {},
"included": false
},
{
"key": "chat.mcp.gallery.serviceUrl",
"name": "McpGalleryServiceUrl",
Expand Down Expand Up @@ -222,6 +237,36 @@
"default": true,
"included": true
},
{
"key": "chat.plugins.enabledPlugins",
"name": "ChatEnabledPlugins",
"category": "InteractiveSession",
"minimumVersion": "1.122",
"localization": {
"description": {
"key": "chat.plugins.enabledPlugins.policy",
"value": "Plugin enablement. Keys are plugin IDs in `<plugin>@<marketplace>` form; values enable or disable the plugin."
}
},
"type": "object",
"default": {},
"included": true
},
{
"key": "chat.plugins.strictMarketplaces",
"name": "ChatStrictMarketplaces",
"category": "InteractiveSession",
"minimumVersion": "1.122",
"localization": {
"description": {
"key": "chat.plugins.strictMarketplaces.policy",
"value": "Only trust marketplaces supplied via enterprise policy; plugins from any other marketplace will not load."
}
},
"type": "boolean",
"default": false,
"included": true
},
{
"key": "chat.agent.enabled",
"name": "ChatAgentMode",
Expand Down
4 changes: 2 additions & 2 deletions cli/Cargo.lock

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

2 changes: 1 addition & 1 deletion cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ cfg-if = "1.0.0"
pin-project = "1.1.0"
console = "0.15.7"
bytes = "1.11.1"
tar = "0.4.45"
tar = "0.4.46"
local-ip-address = "0.6"
ahp = "0.1"
ahp-types = "0.1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ name: chronicle:cost-tips
description: Get personalized tips to reduce token usage and Copilot cost
---
Analyze my recent chat session history and give me personalized, data-grounded tips to reduce token usage and Copilot cost. Use the **chronicle** skill — it documents the `copilot_sessionStoreSql` tool, the session-store schema, and the Cost Tips workflow for finding expensive sessions, token-heavy patterns, and concrete habit changes.

When you invoke `copilot_sessionStoreSql`, set `subcommand: "cost-tips"` on every call.
2 changes: 2 additions & 0 deletions extensions/copilot/assets/prompts/chronicle-improve.prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ name: chronicle:improve
description: Improve agent instructions based on friction patterns in your session history
---
Analyze my recent chat session history for friction patterns and suggest improvements to my agent instructions file. Use the **chronicle** skill — it documents the `copilot_sessionStoreSql` tool, the session-store schema, and the Improve workflow for detecting repeated failures, user corrections, and recurring friction across sessions, then proposing data-grounded additions to the project's agent instructions.

When you invoke `copilot_sessionStoreSql`, set `subcommand: "improve"` on every call.
2 changes: 2 additions & 0 deletions extensions/copilot/assets/prompts/chronicle-reindex.prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ name: chronicle:reindex
description: Rebuild the local session index and sync to cloud
---
Reindex my session store to pick up any missing sessions. Add 'force' to re-process already indexed sessions.

When you invoke `copilot_sessionStoreSql`, set `subcommand: "reindex"`.
2 changes: 2 additions & 0 deletions extensions/copilot/assets/prompts/chronicle-search.prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ name: chronicle:search
description: Search recent chat sessions by keyword, file path, or PR/issue ref
---
Search my Copilot session history for the query I provide — a keyword, a file path, or a PR/issue/commit ref — and list the matching sessions. Use the **chronicle** skill — it documents the `copilot_sessionStoreSql` tool, the session-store schema (the `sessions` table primary key is `id`; conversation content lives in `turns`, not on `sessions`; on local SQLite use the FTS5 `search_index` table and select `session_id` directly — never join `search_index.rowid` to `turns.rowid`), and the Search workflow including the cloud perf rules (aggregate-once via `WITH hits ... JOIN sessions`, default 90-day window on `turns`).

When you invoke `copilot_sessionStoreSql`, set `subcommand: "search"` on every call.
2 changes: 2 additions & 0 deletions extensions/copilot/assets/prompts/chronicle-standup.prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ name: chronicle:standup
description: Generate a standup report from recent chat sessions
---
Generate a standup report from my recent coding sessions. Use the **chronicle** skill — it documents the `copilot_sessionStoreSql` tool and the Standup workflow (call with `action: "standup"` to pre-fetch the last 24h of sessions, turns, files, and refs).

When you invoke `copilot_sessionStoreSql`, set `subcommand: "standup"`.
2 changes: 2 additions & 0 deletions extensions/copilot/assets/prompts/chronicle-tips.prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ name: chronicle:tips
description: Get personalized tips based on your chat session usage patterns
---
Analyze my recent chat session history and give me personalized tips to improve my workflow. Use the **chronicle** skill — it documents the `copilot_sessionStoreSql` tool, the session-store schema, and the Tips workflow for investigating usage patterns from `sessions`, `turns`, `session_files`, and `session_refs`.

When you invoke `copilot_sessionStoreSql`, set `subcommand: "tips"` on every call.
14 changes: 7 additions & 7 deletions extensions/copilot/package-lock.json

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

18 changes: 15 additions & 3 deletions extensions/copilot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "copilot-chat",
"displayName": "GitHub Copilot Chat",
"description": "AI chat features powered by Copilot",
"version": "0.50.0",
"version": "0.51.0",
"build": "1",
"completionsCoreVersion": "1.378.1799",
"internalLargeStorageAriaKey": "ec712b3202c5462fb6877acae7f1f9d7-c19ad55e-3e3c-4f99-984b-827f6d95bd9e-6917",
Expand All @@ -22,7 +22,7 @@
"icon": "assets/copilot.png",
"pricing": "Trial",
"engines": {
"vscode": "^1.122.0",
"vscode": "^1.123.0",
"npm": ">=9.0.0",
"node": ">=22.14.0"
},
Expand Down Expand Up @@ -1262,6 +1262,18 @@
"description": {
"type": "string",
"description": "A 2-5 word summary of what this call does (e.g. 'Recent sessions overview', 'Generate standup', 'Reindex sessions')."
},
"subcommand": {
"type": "string",
"enum": [
"standup",
"tips",
"cost-tips",
"search",
"improve",
"reindex"
],
"description": "The chronicle subcommand that triggered this call (e.g. 'tips' for /chronicle tips). Used for telemetry attribution only — pass this whenever the call originates from a /chronicle slash command."
}
},
"required": [
Expand Down Expand Up @@ -6921,7 +6933,7 @@
"@opentelemetry/sdk-trace-node": "^2.5.1",
"@opentelemetry/semantic-conventions": "^1.39.0",
"@sinclair/typebox": "^0.34.41",
"@vscode/copilot-api": "^0.4.2",
"@vscode/copilot-api": "^0.4.3",
"@vscode/extension-telemetry": "^1.5.1",
"@vscode/l10n": "^0.0.18",
"@vscode/prompt-tsx": "^0.4.0-alpha.8",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import { IInstantiationService } from '../../../../util/vs/platform/instantiatio
import { ensureNodePtyShim } from './nodePtyShim';
import { ensureRipgrepShim } from './ripgrepShim';
import { CancellationToken } from '../../../../util/vs/base/common/cancellation';
import { getModelCapabilitiesDescription } from '../../../conversation/common/languageModelAccess';
import { getModelCapabilitiesDescription, normalizeTokenPrices } from '../../../conversation/common/languageModelAccess';

export const COPILOT_CLI_REASONING_EFFORT_PROPERTY = 'reasoningEffort';
const COPILOT_CLI_MODEL_MEMENTO_KEY = 'github.copilot.cli.sessionModel';
Expand Down Expand Up @@ -160,16 +160,15 @@ export class CopilotCLIModels extends Disposable implements ICopilotCLIModels {
try {
const models = await getAvailableModels(authInfo);
return models.map(model => {
const tokenPrices = model.billing?.token_prices;
const normalizedPricing = normalizeTokenPricing(tokenPrices);
const pricing = normalizeTokenPrices(model.billing?.token_prices);
return {
id: model.id,
name: model.name,
multiplier: model.billing?.multiplier,
priceCategory: model.model_picker_price_category,
inputCost: normalizedPricing?.inputPrice,
outputCost: normalizedPricing?.outputPrice,
cacheCost: normalizedPricing?.cachePrice,
inputCost: pricing?.default.inputPrice,
outputCost: pricing?.default.outputPrice,
cacheCost: pricing?.default.cachePrice,
maxInputTokens: model.capabilities.limits.max_prompt_tokens,
maxOutputTokens: model.capabilities.limits.max_output_tokens,
maxContextWindowTokens: model.capabilities.limits.max_context_window_tokens,
Expand All @@ -192,7 +191,7 @@ export class CopilotCLIModels extends Disposable implements ICopilotCLIModels {
const provider: vscode.LanguageModelChatProvider = {
onDidChangeLanguageModelChatInformation: this._onDidChange.event,
provideLanguageModelChatInformation: async (_options, _token) => {
return this._resolvedModelInfos?? [];
return this._resolvedModelInfos ?? [];
},
provideLanguageModelChatResponse: async (_model, _messages, _options, _progress, _token) => {
// Implemented via chat participants.
Expand Down Expand Up @@ -633,25 +632,3 @@ export function isEnabledForCopilotCLI(customization: { sessionTypes?: readonly
const sessionTypes = customization.sessionTypes;
return sessionTypes === undefined || sessionTypes.includes('copilotcli') || false;
}

const AIC_DIVISOR = 1_000_000_000;
const TOKENS_PER_MILLION = 1_000_000;

/**
* Converts raw billing token prices (nano-AICs with a batch_size) into
* normalized AICs per million tokens, matching the normalization in
* chatEndpoint.ts for non-CLI models.
*/
function normalizeTokenPricing(tokenPrices: { input_price?: number; output_price?: number; cache_price?: number; batch_size?: number } | undefined): { inputPrice: number; outputPrice: number; cachePrice: number | undefined } | undefined {
if (!tokenPrices || tokenPrices.input_price === undefined || tokenPrices.output_price === undefined) {
return undefined;
}
const batchSize = tokenPrices.batch_size ?? TOKENS_PER_MILLION;
const scale = TOKENS_PER_MILLION / batchSize;
return {
inputPrice: (tokenPrices.input_price / AIC_DIVISOR) * scale,
outputPrice: (tokenPrices.output_price / AIC_DIVISOR) * scale,
cachePrice: tokenPrices.cache_price !== undefined ? (tokenPrices.cache_price / AIC_DIVISOR) * scale : undefined,
};
}

Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { IGitExtensionService } from '../../../platform/git/common/gitExtensionS
import { GithubRepoId, IGitService } from '../../../platform/git/common/gitService';
import { derivePullRequestState, PullRequestSearchItem, SessionInfo } from '../../../platform/github/common/githubAPI';
import { AuthOptions, CCAEnabledResult, IGithubRepositoryService, IOctoKitService } from '../../../platform/github/common/githubService';
import { getModelCapabilitiesDescription, normalizeTokenPrices } from '../../conversation/common/languageModelAccess';
import { ILogService } from '../../../platform/log/common/logService';
import { emitCloudSessionInvokeEvent } from '../../../platform/otel/common/genAiEvents';
import { GenAiMetrics } from '../../../platform/otel/common/genAiMetrics';
Expand Down Expand Up @@ -996,13 +997,56 @@ export class CopilotCloudSessionsProvider extends Disposable implements vscode.C

if (models.status === 'fulfilled' && models.value.length > 0) {
const isUBB = !!this._authenticationService.copilotToken?.isUsageBasedBilling;
const modelItems: vscode.ChatSessionProviderOptionItem[] = models.value.map(model => ({
id: model.id,
name: model.name,
...(!isUBB && model.billing?.multiplier !== undefined ? { description: `${model.billing.multiplier}x` } : {}),
}));

const modelItems: vscode.ChatSessionProviderOptionItem[] = models.value.map(model => {
const limits = model.capabilities?.limits;
const multiplier = model.billing?.multiplier;
const pricing = normalizeTokenPrices(model.billing?.token_prices);
const family = model.capabilities?.family ?? model.id;
const tooltip = getModelCapabilitiesDescription({ name: model.name, family });

return {
id: model.id,
name: model.name,
...(!isUBB && multiplier !== undefined ? { description: `${multiplier}x` } : {}),
tooltip,
modelMetadata: {
name: model.name,
id: model.id,
vendor: model.vendor,
version: model.version,
family,
tooltip,
multiplierNumeric: multiplier,
pricing: !isUBB && multiplier !== undefined ? `${multiplier}x` : undefined,
maxInputTokens: limits?.max_prompt_tokens ?? 0,
maxOutputTokens: limits?.max_output_tokens ?? 0,
inputCost: pricing?.default.inputPrice,
outputCost: pricing?.default.outputPrice,
cacheCost: pricing?.default.cachePrice,
longContextInputCost: pricing?.longContext?.inputPrice,
longContextOutputCost: pricing?.longContext?.outputPrice,
longContextCacheCost: pricing?.longContext?.cachePrice,
priceCategory: model.model_picker_price_category,
capabilities: {
vision: model.capabilities?.supports?.vision ?? false,
toolCalling: model.capabilities?.supports?.tool_calls ?? false,
},
},
};
});
if (!models.value.find(m => m.id === DEFAULT_MODEL_ID)) {
modelItems.unshift({ id: DEFAULT_MODEL_ID, name: vscode.l10n.t('Auto'), description: vscode.l10n.t('Automatically select the best model') });
modelItems.unshift({
id: DEFAULT_MODEL_ID,
name: vscode.l10n.t('Auto'),
description: vscode.l10n.t('Automatically select the best model'),
tooltip: vscode.l10n.t('Automatically select the best model'),
modelMetadata: {
name: vscode.l10n.t('Auto'),
id: DEFAULT_MODEL_ID,
tooltip: vscode.l10n.t('Automatically select the best model'),
},
});
}
optionGroups.push({
id: MODELS_OPTION_GROUP_ID,
Expand Down
Loading
Loading