From babc769a73c8b6f7c8fb4575ffbf9af6af01ba90 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Tue, 19 May 2026 17:46:02 -0700 Subject: [PATCH 01/17] Enable BYOK if air-gapped scenarios wthiout GitHub auth Co-authored-by: Copilot --- extensions/copilot/package.json | 16 ++--- .../authentication.contribution.ts | 14 +++-- .../copilotcli/node/copilotCli.ts | 4 ++ .../vscode-node/chatParticipants.ts | 2 +- .../vscode-node/conversationFeature.ts | 60 ++++++++++++++----- .../vscode-node/languageModelAccess.ts | 5 ++ .../extension/prompt/node/chatMLFetcher.ts | 17 +++--- .../prompts/node/base/promptRenderer.ts | 25 +++++++- .../common/remoteEmbeddingsComputer.ts | 4 ++ .../endpoint/node/modelMetadataFetcher.ts | 10 +++- .../chatSetup/chatSetupContributions.ts | 3 +- 11 files changed, 121 insertions(+), 39 deletions(-) diff --git a/extensions/copilot/package.json b/extensions/copilot/package.json index 2f91fc62e126b..f0fbea475d66f 100644 --- a/extensions/copilot/package.json +++ b/extensions/copilot/package.json @@ -2259,49 +2259,49 @@ "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.individual.expired%", - "when": "github.copilot.interactiveSession.individual.expired" + "when": "github.copilot.interactiveSession.individual.expired && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.enterprise%", - "when": "github.copilot.interactiveSession.enterprise.disabled" + "when": "github.copilot.interactiveSession.enterprise.disabled && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.offline%", - "when": "github.copilot.offline" + "when": "github.copilot.offline && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.invalidToken%", - "when": "github.copilot.interactiveSession.invalidToken" + "when": "github.copilot.interactiveSession.invalidToken && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.rateLimited%", - "when": "github.copilot.interactiveSession.rateLimited" + "when": "github.copilot.interactiveSession.rateLimited && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.gitHubLoginFailed%", - "when": "github.copilot.interactiveSession.gitHubLoginFailed" + "when": "github.copilot.interactiveSession.gitHubLoginFailed && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.contactSupport%", - "when": "github.copilot.interactiveSession.contactSupport" + "when": "github.copilot.interactiveSession.contactSupport && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.chatDisabled%", - "when": "github.copilot.interactiveSession.chatDisabled" + "when": "github.copilot.interactiveSession.chatDisabled && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", diff --git a/extensions/copilot/src/extension/authentication/vscode-node/authentication.contribution.ts b/extensions/copilot/src/extension/authentication/vscode-node/authentication.contribution.ts index 43cfbbfebd072..82c9e8a1ac015 100644 --- a/extensions/copilot/src/extension/authentication/vscode-node/authentication.contribution.ts +++ b/extensions/copilot/src/extension/authentication/vscode-node/authentication.contribution.ts @@ -50,11 +50,15 @@ class AuthUpgradeAsk extends Disposable { } private async waitForChatEnabled() { - try { - await this._authenticationService.getCopilotToken(); - } catch (error) { - // likely due to the user canceling the auth flow - this._logService.error(error, 'Failed to get copilot token'); + if (!this._authenticationService.anyGitHubSession) { + this._logService.debug('No GitHub session found, waiting for authentication to be ready...'); + } else { + try { + await this._authenticationService.getCopilotToken(); + } catch (error) { + // likely due to the user canceling the auth flow + this._logService.error(error, 'Failed to get copilot token'); + } } await Event.toPromise( diff --git a/extensions/copilot/src/extension/chatSessions/copilotcli/node/copilotCli.ts b/extensions/copilot/src/extension/chatSessions/copilotcli/node/copilotCli.ts index bc69b2c103a66..bda684a9a0c1e 100644 --- a/extensions/copilot/src/extension/chatSessions/copilotcli/node/copilotCli.ts +++ b/extensions/copilot/src/extension/chatSessions/copilotcli/node/copilotCli.ts @@ -96,6 +96,10 @@ export class CopilotCLIModels extends Disposable implements ICopilotCLIModels { } private _fetchAndCacheModels(): void { + if (!this._authenticationService.anyGitHubSession) { + this.logService.info('[CopilotCLIModels] Skipping model fetch since there is no GitHub session'); + return; + } const availableModels = this._availableModels = this._getAvailableModels(); availableModels.then(models => { // Bail out if a newer fetch has superseded this one (e.g. auth changed mid-flight). diff --git a/extensions/copilot/src/extension/conversation/vscode-node/chatParticipants.ts b/extensions/copilot/src/extension/conversation/vscode-node/chatParticipants.ts index bdd21c798f1c6..9c286973e8994 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/chatParticipants.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/chatParticipants.ts @@ -277,7 +277,6 @@ Learn more about [GitHub Copilot](https://docs.github.com/copilot/using-github-c private async switchToBaseModel(request: vscode.ChatRequest, stream: vscode.ChatResponseStream): Promise { const endpoint = await this.endpointProvider.getChatEndpoint(request); - const baseEndpoint = await this.endpointProvider.getChatEndpoint('copilot-utility'); // If it has a 0x multipler, it's free so don't switch them. If it's BYOK, it's free so don't switch them. if (endpoint.multiplier === 0 || request.model.vendor !== 'copilot' || endpoint.multiplier === undefined) { return request; @@ -285,6 +284,7 @@ Learn more about [GitHub Copilot](https://docs.github.com/copilot/using-github-c if (this._chatQuotaService.additionalUsageEnabled || !this._chatQuotaService.quotaExhausted) { return request; } + const baseEndpoint = await this.endpointProvider.getChatEndpoint('copilot-utility'); const baseLmModel = (await vscode.lm.selectChatModels({ id: baseEndpoint.model, family: baseEndpoint.family, vendor: 'copilot' }))[0]; if (!baseLmModel) { return request; diff --git a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts index f2f7913837fb1..a3bfc3c5d2ae6 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts @@ -90,27 +90,52 @@ export class ConversationFeature implements IExtensionContribution { const activationBlockerDeferred = new DeferredPromise(); this.activationBlocker = activationBlockerDeferred.p; + + // Activation can be unblocked by either a Copilot token OR the presence of a BYOK model. + let hasByokModels = false; + const reevaluate = () => { + const hasToken = !!authenticationService.copilotToken; + const shouldActivate = hasToken || hasByokModels; + this.activated = shouldActivate; + if (shouldActivate && !activationBlockerDeferred.isSettled) { + if (hasToken) { + markChatExtGlobal(ChatExtGlobalPerfMark.DidWaitForCopilotToken); + } + activationBlockerDeferred.complete(); + } + }; + if (authenticationService.copilotToken) { this.logService.info(`ConversationFeature: Copilot token already available`); - this.activated = true; - activationBlockerDeferred.complete(); } else { markChatExtGlobal(ChatExtGlobalPerfMark.WillWaitForCopilotToken); - this.logService.info(`ConversationFeature: Waiting for copilot token to activate conversation feature`); + this.logService.info(`ConversationFeature: Waiting for copilot token or BYOK model to activate conversation feature`); } - this._disposables.add(authenticationService.onDidAuthenticationChange(async () => { - const hasSession = !!authenticationService.copilotToken; - this.logService.info(`ConversationFeature: onDidAuthenticationChange has token: ${hasSession}`); - if (hasSession) { - markChatExtGlobal(ChatExtGlobalPerfMark.DidWaitForCopilotToken); - this.activated = true; - } else { - this.activated = false; + const refreshHasByokModels = async () => { + try { + const models = await vscode.lm.selectChatModels({}); + const value = models.some(m => m.vendor !== 'copilot'); + if (value !== hasByokModels) { + hasByokModels = value; + this.logService.info(`ConversationFeature: BYOK models ${value ? 'available' : 'unavailable'}`); + reevaluate(); + } + } catch (e) { + this.logService.warn(`ConversationFeature: failed to query language models: ${e}`); } + }; + void refreshHasByokModels(); + this._disposables.add(vscode.lm.onDidChangeChatModels(() => void refreshHasByokModels())); - activationBlockerDeferred.complete(); + this._disposables.add(authenticationService.onDidAuthenticationChange(async () => { + reevaluate(); + if (!activationBlockerDeferred.isSettled) { + activationBlockerDeferred.complete(); + } })); + + reevaluate(); } get enabled() { @@ -170,8 +195,8 @@ export class ConversationFeature implements IExtensionContribution { } else { this._searchProviderRegistered = true; - // Don't register for no auth user - if (this.authenticationService.copilotToken?.isNoAuthUser) { + // Don't register for no auth user or BYOK-only users + if (!this.authenticationService.anyGithubSession || this.authenticationService.copilotToken?.isNoAuthUser) { this.logService.debug('ConversationFeature: Skipping search provider registration - no GitHub session available'); return; } @@ -190,6 +215,13 @@ export class ConversationFeature implements IExtensionContribution { } this._settingsSearchProviderRegistered = true; + + // Don't register for no auth user or or BYOK-only users + if (!this.authenticationService.anyGithubSession || this.authenticationService.copilotToken?.isNoAuthUser) { + this.logService.debug('ConversationFeature: Skipping settings search provider registration - no GitHub session available'); + return; + } + return vscode.ai.registerSettingsSearchProvider(this.settingsEditorSearchService); } diff --git a/extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts b/extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts index 67e4d1d6e83be..c0f2aa6c6341d 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts @@ -572,6 +572,11 @@ export class LanguageModelAccess extends Disposable implements IExtensionContrib } private async _getToken(): Promise { + if (!this._authenticationService.anyGitHubSession) { + this._logService.warn('[LanguageModelAccess] LanguageModel/Embeddings are not available without auth session'); + return undefined; + } + try { const copilotToken = await this._authenticationService.getCopilotToken(); return copilotToken; diff --git a/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts b/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts index bc5a3920c3acb..6b8c077891834 100644 --- a/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts +++ b/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts @@ -218,8 +218,10 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { } else { let tokenCountPromise: Promise | undefined; const countTokens = () => tokenCountPromise ??= chatEndpoint.acquireTokenizer().countMessagesTokens(messages); - const copilotToken = await this._authenticationService.getCopilotToken(); - usernameToScrub = copilotToken.username; + const copilotToken = chatEndpoint.modelProvider === 'copilot' && !chatEndpoint.isExtensionContributed + ? await this._authenticationService.getCopilotToken() + : undefined; + usernameToScrub = copilotToken?.username ?? this._authenticationService.copilotToken?.username; const fetchResult = await this._fetchAndStreamChat( chatEndpoint, @@ -886,7 +888,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { baseTelemetryData: TelemetryData, finishedCb: FinishedCallback, secretKey: string | undefined, - copilotToken: CopilotToken, + copilotToken: CopilotToken | undefined, location: ChatLocation, ourRequestId: string, nChoices: number | undefined, @@ -965,7 +967,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { baseTelemetryData: TelemetryData, finishedCb: FinishedCallback, secretKey: string | undefined, - copilotToken: CopilotToken, + copilotToken: CopilotToken | undefined, location: ChatLocation, ourRequestId: string, nChoices: number | undefined, @@ -1020,9 +1022,9 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { this._logService.debug(`modelMaxResponseTokens ${request.max_tokens ?? 2048}`); this._logService.debug(`chat model ${chatEndpointInfo.model}`); - secretKey ??= copilotToken.token; - if (!secretKey) { - // If no key is set we error + secretKey ??= copilotToken?.token; + // BYOK endpoints may not need a secret key (e.g., Ollama local), they use getExtraHeaders instead. + if (!secretKey && !chatEndpointInfo.getExtraHeaders) { const urlOrRequestMetadata = stringifyUrlOrRequestMetadata(chatEndpointInfo.urlOrRequestMetadata); this._logService.error(`Failed to send request to ${urlOrRequestMetadata} due to missing key`); sendCommunicationErrorTelemetry(this._telemetryService, `Failed to send request to ${urlOrRequestMetadata} due to missing key`); @@ -1035,6 +1037,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { } }; } + secretKey ??= ''; // WebSocket path: use persistent WebSocket connection for Responses API endpoints if (useWebSocket && turnId && conversationId) { diff --git a/extensions/copilot/src/extension/prompts/node/base/promptRenderer.ts b/extensions/copilot/src/extension/prompts/node/base/promptRenderer.ts index 3b4506792e042..0e01cadaf5c05 100644 --- a/extensions/copilot/src/extension/prompts/node/base/promptRenderer.ts +++ b/extensions/copilot/src/extension/prompts/node/base/promptRenderer.ts @@ -213,9 +213,32 @@ export async function renderPromptElementJSON

( // todo@lramos15: We should pass in endpoint provider rather than doing invoke function, but this was easier const endpoint = await instantiationService.invokeFunction(async (accessor) => { const endpointProvider = accessor.get(IEndpointProvider); - return await endpointProvider.getChatEndpoint('copilot-utility'); + try { + return await endpointProvider.getChatEndpoint('copilot-utility'); + } catch { + // JSON rendering issues no chat requests; fall back to a stub so + // tools keep working when no utility model is available. + return createStubPromptEndpoint(); + } }); const hydratedInstaService = instantiationService.createChild(new ServiceCollection([IPromptEndpoint, endpoint])); const renderer = new PromptRendererForJSON(ctor as any, props, tokenOptions, endpoint, hydratedInstaService); return await renderer.renderElementJSON(token); } + +function createStubPromptEndpoint(): IChatEndpoint { + const notImplemented = () => { throw new Error('No utility model available.'); }; + return { + modelMaxPromptTokens: 8192, + name: 'utility', + family: 'unknown', + model: 'copilot-utility', + isFallback: true, + acquireTokenizer: notImplemented, + makeChatRequest: notImplemented, + makeChatRequest2: notImplemented, + createRequestBody: notImplemented, + cloneWithTokenOverride: notImplemented, + processResponseFromChatEndpoint: notImplemented, + } as unknown as IChatEndpoint; +} diff --git a/extensions/copilot/src/platform/embeddings/common/remoteEmbeddingsComputer.ts b/extensions/copilot/src/platform/embeddings/common/remoteEmbeddingsComputer.ts index 15f9771648a26..4cd2aabee4d61 100644 --- a/extensions/copilot/src/platform/embeddings/common/remoteEmbeddingsComputer.ts +++ b/extensions/copilot/src/platform/embeddings/common/remoteEmbeddingsComputer.ts @@ -64,6 +64,10 @@ export class RemoteEmbeddingsComputer implements IEmbeddingsComputer { }); try { return await logExecTime(this._logService, 'RemoteEmbeddingsComputer::computeEmbeddings', async () => { + // The remote embeddings endpoint requires GitHub authentication. + if (!this._authService.anyGitHubSession) { + return { type: embeddingType, values: [] }; + } // Determine endpoint type: use CAPI for no-auth users, otherwise use GitHub const copilotToken = await this._authService.getCopilotToken(); diff --git a/extensions/copilot/src/platform/endpoint/node/modelMetadataFetcher.ts b/extensions/copilot/src/platform/endpoint/node/modelMetadataFetcher.ts index 16cc9a39103ef..f3a06e49cd014 100644 --- a/extensions/copilot/src/platform/endpoint/node/modelMetadataFetcher.ts +++ b/extensions/copilot/src/platform/endpoint/node/modelMetadataFetcher.ts @@ -254,7 +254,15 @@ export class ModelMetadataFetcher extends Disposable implements IModelMetadataFe } const requestStartTime = Date.now(); - const copilotToken = (await this._authService.getCopilotToken()).token; + let copilotToken: string; + try { + copilotToken = (await this._authService.getCopilotToken()).token; + } catch (e) { + // No Copilot auth (e.g. signed-out BYOK-only mode). + this._lastFetchError = e; + return; + } + const requestId = generateUuid(); const requestMetadata: RequestMetadata = { type: RequestType.Models, isModelLab: this._isModelLab }; diff --git a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts index e209805841136..dbdfec1f86cff 100644 --- a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts +++ b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts @@ -363,7 +363,7 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr constructor() { super({ id: 'workbench.action.chat.triggerSetupFromAccounts', - title: localize2('triggerChatSetupFromAccounts', "Sign in to use AI features..."), + title: localize2('triggerChatSetupFromAccounts', "Sign in to use GitHub AI features..."), menu: { id: MenuId.AccountsContext, group: '2_copilot', @@ -371,7 +371,6 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr ChatContextKeys.Setup.hidden.negate(), ChatContextKeys.Setup.disabledInWorkspace.negate(), ChatContextKeys.Setup.completed.negate(), - ChatEntitlementContextKeys.hasByokModels.negate(), ChatContextKeys.Entitlement.signedOut ) } From 1303bfb4d58676ae71aabe493fcf6acff49c4760 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Tue, 19 May 2026 17:58:28 -0700 Subject: [PATCH 02/17] Add some tests, update message. --- .../test/conversationFeature.test.ts | 16 ++++++++ .../node/base/test/promptRenderer.spec.ts | 37 +++++++++++++++++++ .../chatSetup/chatSetupContributions.ts | 2 +- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 extensions/copilot/src/extension/prompts/node/base/test/promptRenderer.spec.ts diff --git a/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts b/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts index 90afbdcb4fab4..8a462383f8dbf 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts @@ -135,4 +135,20 @@ suite('Conversation feature test suite', function () { conversationFeature.dispose(); } }); + + test('The feature activates without a Copilot token when a non-copilot (BYOK) language model is available', async function () { + sandbox.stub(vscode.lm, 'selectChatModels').resolves([ + { vendor: 'ollama', id: 'llama3', name: 'llama3', family: 'llama3' } as any + ]); + sandbox.stub(vscode.lm, 'onDidChangeChatModels').returns({ dispose: () => { } }); + + const conversationFeature = instaService.createInstance(ConversationFeature); + try { + // No Copilot token is set; activation should be driven by BYOK availability. + await conversationFeature.activationBlocker; + assert.deepStrictEqual(conversationFeature.activated, true); + } finally { + conversationFeature.dispose(); + } + }); }); diff --git a/extensions/copilot/src/extension/prompts/node/base/test/promptRenderer.spec.ts b/extensions/copilot/src/extension/prompts/node/base/test/promptRenderer.spec.ts new file mode 100644 index 0000000000000..82ee938372b72 --- /dev/null +++ b/extensions/copilot/src/extension/prompts/node/base/test/promptRenderer.spec.ts @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { describe, expect, test } from 'vitest'; +import { IEndpointProvider } from '../../../../../platform/endpoint/common/endpointProvider'; +import { Event } from '../../../../../util/vs/base/common/event'; +import { IInstantiationService } from '../../../../../util/vs/platform/instantiation/common/instantiation'; +import { createExtensionUnitTestingServices } from '../../../../test/node/services'; +import { CompositeElement } from '../common'; +import { renderPromptElementJSON } from '../promptRenderer'; + +class ThrowingEndpointProvider implements IEndpointProvider { + declare readonly _serviceBrand: undefined; + readonly onDidModelsRefresh = Event.None; + async getChatEndpoint(): Promise { throw new Error('no utility model'); } + async getEmbeddingsEndpoint(): Promise { throw new Error('not implemented'); } + async getAllChatEndpoints(): Promise { return []; } + async getAllCompletionModels(): Promise { return []; } +} + +describe('renderPromptElementJSON', () => { + test('falls back to a stub endpoint when no utility model is available', async () => { + const testingServiceCollection = createExtensionUnitTestingServices(); + testingServiceCollection.define(IEndpointProvider, new ThrowingEndpointProvider()); + const accessor = testingServiceCollection.createTestingAccessor(); + + const result = await renderPromptElementJSON( + accessor.get(IInstantiationService), + CompositeElement, + {}, + ); + + expect(result.node).toBeDefined(); + }); +}); diff --git a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts index dbdfec1f86cff..9992894016633 100644 --- a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts +++ b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts @@ -363,7 +363,7 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr constructor() { super({ id: 'workbench.action.chat.triggerSetupFromAccounts', - title: localize2('triggerChatSetupFromAccounts', "Sign in to use GitHub AI features..."), + title: localize2('triggerChatSetupFromAccounts', "Sign in to use GitHub Copilot..."), menu: { id: MenuId.AccountsContext, group: '2_copilot', From bc94f515606606667882864e4d3021a55f6a51ab Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Tue, 19 May 2026 17:59:42 -0700 Subject: [PATCH 03/17] Build break --- .../extension/conversation/vscode-node/conversationFeature.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts index a3bfc3c5d2ae6..03b3911bfe521 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts @@ -196,7 +196,7 @@ export class ConversationFeature implements IExtensionContribution { this._searchProviderRegistered = true; // Don't register for no auth user or BYOK-only users - if (!this.authenticationService.anyGithubSession || this.authenticationService.copilotToken?.isNoAuthUser) { + if (!this.authenticationService.anyGitHubSession || this.authenticationService.copilotToken?.isNoAuthUser) { this.logService.debug('ConversationFeature: Skipping search provider registration - no GitHub session available'); return; } @@ -217,7 +217,7 @@ export class ConversationFeature implements IExtensionContribution { this._settingsSearchProviderRegistered = true; // Don't register for no auth user or or BYOK-only users - if (!this.authenticationService.anyGithubSession || this.authenticationService.copilotToken?.isNoAuthUser) { + if (!this.authenticationService.anyGitHubSession || this.authenticationService.copilotToken?.isNoAuthUser) { this.logService.debug('ConversationFeature: Skipping settings search provider registration - no GitHub session available'); return; } From 278830194610c8c4f68acca152865fbc1c6c542c Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Tue, 19 May 2026 18:16:44 -0700 Subject: [PATCH 04/17] Make code resilient to empty embeddings results --- .../src/extension/context/node/resolvers/extensionApi.tsx | 3 +++ .../prompts/node/panel/newWorkspace/newWorkspace.tsx | 3 +++ .../copilot/src/extension/prompts/node/panel/vscode.tsx | 3 +++ .../copilot/src/platform/embeddings/common/vscodeIndex.ts | 4 ++++ .../urlChunkSearch/node/urlChunkEmbeddingsIndex.ts | 8 ++++++-- 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/extensions/copilot/src/extension/context/node/resolvers/extensionApi.tsx b/extensions/copilot/src/extension/context/node/resolvers/extensionApi.tsx index 1f11ff3a750ce..db57b8976ff46 100644 --- a/extensions/copilot/src/extension/context/node/resolvers/extensionApi.tsx +++ b/extensions/copilot/src/extension/context/node/resolvers/extensionApi.tsx @@ -96,6 +96,9 @@ export class VSCodeAPIContextElement extends PromptElement 0) { diff --git a/extensions/copilot/src/extension/prompts/node/panel/vscode.tsx b/extensions/copilot/src/extension/prompts/node/panel/vscode.tsx index 1b917dc99af68..4c17b93517398 100644 --- a/extensions/copilot/src/extension/prompts/node/panel/vscode.tsx +++ b/extensions/copilot/src/extension/prompts/node/panel/vscode.tsx @@ -140,6 +140,9 @@ export class VscodePrompt extends PromptElement new UrlContent(file.uri, file.content)), EmbeddingsComputeQos.Batch, token) ]), token); + if (!queryEmbedding) { + return files.map(() => []); + } + return this.computeChunkScores(fileChunksAndEmbeddings, queryEmbedding); } - private async computeEmbeddings(embeddingType: EmbeddingType, str: string, inputType: EmbeddingInputType, token: CancellationToken): Promise { + private async computeEmbeddings(embeddingType: EmbeddingType, str: string, inputType: EmbeddingInputType, token: CancellationToken): Promise { const embeddings = await this._embeddingsComputer.computeEmbeddings(embeddingType, [str], { inputType }, new TelemetryCorrelationId('UrlChunkEmbeddingsIndex::computeEmbeddings'), token); return embeddings.values[0]; } @@ -155,4 +159,4 @@ class SimpleUrlContentCache { const hash = await content.getContentHash(); this._cache.set(content.uri, { hash, value }); } -} \ No newline at end of file +} From 7a6ff57fe94c16cd6e737983f11c9ecdcc346130 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Tue, 19 May 2026 18:22:32 -0700 Subject: [PATCH 05/17] Allow missing Authorization header when secretKey is undefined in network requests --- .../extension/prompt/node/chatMLFetcher.ts | 9 +++--- .../platform/networking/common/networking.ts | 4 +-- .../networking/test/node/networking.spec.ts | 28 +++++++++++++++++++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts b/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts index 6b8c077891834..9d577f37d3906 100644 --- a/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts +++ b/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts @@ -1037,7 +1037,6 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { } }; } - secretKey ??= ''; // WebSocket path: use persistent WebSocket connection for Responses API endpoints if (useWebSocket && turnId && conversationId) { @@ -1105,7 +1104,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { request: IEndpointBody, baseTelemetryData: TelemetryData, finishedCb: FinishedCallback, - secretKey: string, + secretKey: string | undefined, location: ChatLocation, ourRequestId: string, turnId: string, @@ -1121,7 +1120,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { const intent = locationToIntent(location); const agentInteractionType = interactionTypeOverride ?? intent; const additionalHeaders: Record = { - 'Authorization': `Bearer ${secretKey}`, + ...(secretKey ? { 'Authorization': `Bearer ${secretKey}` } : {}), 'X-Request-Id': ourRequestId, 'OpenAI-Intent': intent, 'X-GitHub-Api-Version': '2025-05-01', @@ -1291,7 +1290,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { request: IEndpointBody, baseTelemetryData: TelemetryData, finishedCb: FinishedCallback, - secretKey: string, + secretKey: string | undefined, location: ChatLocation, ourRequestId: string, nChoices: number | undefined, @@ -1408,7 +1407,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { chatEndpoint: IChatEndpoint, ourRequestId: string, request: IEndpointBody, - secretKey: string, + secretKey: string | undefined, location: ChatLocation, cancellationToken: CancellationToken, userInitiatedRequest?: boolean, diff --git a/extensions/copilot/src/platform/networking/common/networking.ts b/extensions/copilot/src/platform/networking/common/networking.ts index dbd70ff320fd8..1737edccb9249 100644 --- a/extensions/copilot/src/platform/networking/common/networking.ts +++ b/extensions/copilot/src/platform/networking/common/networking.ts @@ -383,7 +383,7 @@ export function createCapiRequestBody(options: ICreateEndpointBodyOptions, model export interface INetworkRequestOptions { readonly requestType: 'GET' | 'POST'; readonly endpointOrUrl: IEndpoint | string | RequestMetadata; - readonly secretKey: string; + readonly secretKey: string | undefined; readonly intent: string; readonly requestId: string; readonly body?: IEndpointBody; @@ -435,7 +435,7 @@ function networkRequest( const agentInteractionType = options.interactionTypeOverride ?? intent; const headers: ReqHeaders = { - Authorization: `Bearer ${secretKey}`, + ...(secretKey ? { Authorization: `Bearer ${secretKey}` } : {}), 'X-Request-Id': requestId, 'OpenAI-Intent': intent, // Tells CAPI who flighted this request. Helps find buggy features 'X-GitHub-Api-Version': '2026-01-09', diff --git a/extensions/copilot/src/platform/networking/test/node/networking.spec.ts b/extensions/copilot/src/platform/networking/test/node/networking.spec.ts index 4f5fcf0e8c9fb..044901f9d7821 100644 --- a/extensions/copilot/src/platform/networking/test/node/networking.spec.ts +++ b/extensions/copilot/src/platform/networking/test/node/networking.spec.ts @@ -73,4 +73,32 @@ suite('Networking test Suite', function () { assert.strictEqual(headerBuffer!['VScode-MachineId'], 'test-machine'); assert.strictEqual(headerBuffer!['Editor-Version'], `vscode/test-version`); }); + + test('sets Authorization header when secretKey is provided', async function () { + const testingServiceCollection = createPlatformServices(); + testingServiceCollection.define(IFetcherService, new StaticFetcherService()); + const accessor = testingServiceCollection.createTestingAccessor(); + await accessor.get(IInstantiationService).invokeFunction(postRequest, { + endpointOrUrl: { type: RequestType.Models }, + secretKey: 'abc', + intent: 'test', + requestId: 'id', + }); + + assert.strictEqual(headerBuffer!['Authorization'], 'Bearer abc'); + }); + + test('omits Authorization header when secretKey is undefined', async function () { + const testingServiceCollection = createPlatformServices(); + testingServiceCollection.define(IFetcherService, new StaticFetcherService()); + const accessor = testingServiceCollection.createTestingAccessor(); + await accessor.get(IInstantiationService).invokeFunction(postRequest, { + endpointOrUrl: { type: RequestType.Models }, + secretKey: undefined, + intent: 'test', + requestId: 'id', + }); + + assert.strictEqual('Authorization' in headerBuffer!, false); + }); }); From 694e49773a2dd200a43501c5bf38ad80475ed07a Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Tue, 19 May 2026 20:04:53 -0700 Subject: [PATCH 06/17] Use more netural error message style. Co-authored-by: Copilot --- extensions/copilot/src/platform/chat/common/commonTypes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/copilot/src/platform/chat/common/commonTypes.ts b/extensions/copilot/src/platform/chat/common/commonTypes.ts index 7a2acb01683c4..5e535b5fceebc 100644 --- a/extensions/copilot/src/platform/chat/common/commonTypes.ts +++ b/extensions/copilot/src/platform/chat/common/commonTypes.ts @@ -428,8 +428,8 @@ function getErrorDetailsFromChatFetchErrorInner(fetchResult: ChatFetchError, cop case ChatFetchResponseType.BadRequest: case ChatFetchResponseType.Failed: details = fetchResult.serverRequestId - ? { message: l10n.t(`Sorry, your request failed. Please try again.\n\nCopilot Request id: {0}\n\nGH Request Id: {1}\n\nReason: {2}`, fetchResult.requestId, fetchResult.serverRequestId, fetchResult.reason) } - : { message: l10n.t(`Sorry, your request failed. Please try again.\n\nCopilot Request id: {0}\n\nReason: {1}`, fetchResult.requestId, fetchResult.reason) }; + ? { message: l10n.t(`Sorry, your request failed. Please try again.\n\nClient Request Id: {0}\n\nGH Request Id: {1}\n\nReason: {2}`, fetchResult.requestId, fetchResult.serverRequestId, fetchResult.reason) } + : { message: l10n.t(`Sorry, your request failed. Please try again.\n\nClient Request Id: {0}\n\nReason: {1}`, fetchResult.requestId, fetchResult.reason) }; break; case ChatFetchResponseType.NetworkError: details = { message: l10n.t(`Sorry, there was a network error. Please try again later. Request id: {0}\n\nReason: {1}`, fetchResult.requestId, fetchResult.reason) }; From f515b2a20a13e323456abe52857d1b4864a10cf4 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Tue, 19 May 2026 20:27:06 -0700 Subject: [PATCH 07/17] Test fixes --- .../vscode-node/test/conversationFeature.test.ts | 2 +- .../copilot/src/extension/prompt/node/chatMLFetcher.ts | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts b/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts index 8a462383f8dbf..990a75307e11a 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts @@ -138,7 +138,7 @@ suite('Conversation feature test suite', function () { test('The feature activates without a Copilot token when a non-copilot (BYOK) language model is available', async function () { sandbox.stub(vscode.lm, 'selectChatModels').resolves([ - { vendor: 'ollama', id: 'llama3', name: 'llama3', family: 'llama3' } as any + { vendor: 'ollama', id: 'llama3', name: 'llama3', family: 'llama3' } as unknown as vscode.LanguageModelChat ]); sandbox.stub(vscode.lm, 'onDidChangeChatModels').returns({ dispose: () => { } }); diff --git a/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts b/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts index 9d577f37d3906..b3eec52354817 100644 --- a/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts +++ b/extensions/copilot/src/extension/prompt/node/chatMLFetcher.ts @@ -218,9 +218,12 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { } else { let tokenCountPromise: Promise | undefined; const countTokens = () => tokenCountPromise ??= chatEndpoint.acquireTokenizer().countMessagesTokens(messages); - const copilotToken = chatEndpoint.modelProvider === 'copilot' && !chatEndpoint.isExtensionContributed - ? await this._authenticationService.getCopilotToken() - : undefined; + let copilotToken: CopilotToken | undefined; + try { + copilotToken = await this._authenticationService.getCopilotToken(); + } catch { + // BYOK / air-gapped: no Copilot token available. Continue without one. + } usernameToScrub = copilotToken?.username ?? this._authenticationService.copilotToken?.username; const fetchResult = await this._fetchAndStreamChat( From 9889234e9a22850a9838d0d308293b3987f210d8 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Tue, 19 May 2026 23:59:14 -0700 Subject: [PATCH 08/17] PR feedback --- .../authentication.contribution.ts | 17 +++++++------ .../vscode-node/conversationFeature.ts | 24 +++++------------- .../test/conversationFeature.test.ts | 3 ++- .../node/urlChunkEmbeddingsIndex.ts | 25 +++++++++---------- 4 files changed, 29 insertions(+), 40 deletions(-) diff --git a/extensions/copilot/src/extension/authentication/vscode-node/authentication.contribution.ts b/extensions/copilot/src/extension/authentication/vscode-node/authentication.contribution.ts index 82c9e8a1ac015..8d283a40762c2 100644 --- a/extensions/copilot/src/extension/authentication/vscode-node/authentication.contribution.ts +++ b/extensions/copilot/src/extension/authentication/vscode-node/authentication.contribution.ts @@ -51,14 +51,15 @@ class AuthUpgradeAsk extends Disposable { private async waitForChatEnabled() { if (!this._authenticationService.anyGitHubSession) { - this._logService.debug('No GitHub session found, waiting for authentication to be ready...'); - } else { - try { - await this._authenticationService.getCopilotToken(); - } catch (error) { - // likely due to the user canceling the auth flow - this._logService.error(error, 'Failed to get copilot token'); - } + // BYOK / air-gapped: do not wait for a Copilot token that may never arrive. + return; + } + + try { + await this._authenticationService.getCopilotToken(); + } catch (error) { + // likely due to the user canceling the auth flow + this._logService.error(error, 'Failed to get copilot token'); } await Event.toPromise( diff --git a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts index 03b3911bfe521..d33d94030fe32 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts @@ -85,17 +85,18 @@ export class ConversationFeature implements IExtensionContribution { this._enabled = false; this._activated = false; - // Register Copilot token listener - this.registerCopilotTokenListener(); - const activationBlockerDeferred = new DeferredPromise(); this.activationBlocker = activationBlockerDeferred.p; - // Activation can be unblocked by either a Copilot token OR the presence of a BYOK model. + // Activation and chat enablement can be driven by either a Copilot token OR the presence of a BYOK model. let hasByokModels = false; const reevaluate = () => { const hasToken = !!authenticationService.copilotToken; const shouldActivate = hasToken || hasByokModels; + if (hasToken) { + this.logService.info(`copilot token sku: ${authenticationService.copilotToken?.sku ?? ''}`); + } + this.enabled = shouldActivate; this.activated = shouldActivate; if (shouldActivate && !activationBlockerDeferred.isSettled) { if (hasToken) { @@ -128,12 +129,7 @@ export class ConversationFeature implements IExtensionContribution { void refreshHasByokModels(); this._disposables.add(vscode.lm.onDidChangeChatModels(() => void refreshHasByokModels())); - this._disposables.add(authenticationService.onDidAuthenticationChange(async () => { - reevaluate(); - if (!activationBlockerDeferred.isSettled) { - activationBlockerDeferred.complete(); - } - })); + this._disposables.add(authenticationService.onDidAuthenticationChange(() => reevaluate())); reevaluate(); } @@ -376,14 +372,6 @@ export class ConversationFeature implements IExtensionContribution { return disposables; } - private registerCopilotTokenListener() { - this._disposables.add(this.authenticationService.onDidAuthenticationChange(() => { - const chatEnabled = this.authenticationService.copilotToken !== undefined; - this.logService.info(`copilot token sku: ${this.authenticationService.copilotToken?.sku ?? ''}`); - this.enabled = chatEnabled ?? false; - })); - } - private registerTerminalQuickFixProviders() { const isEnabled = () => this.enabled; return combinedDisposable( diff --git a/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts b/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts index 990a75307e11a..19b169ff98e5b 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts @@ -144,9 +144,10 @@ suite('Conversation feature test suite', function () { const conversationFeature = instaService.createInstance(ConversationFeature); try { - // No Copilot token is set; activation should be driven by BYOK availability. + // No Copilot token is set; activation and enablement should be driven by BYOK availability. await conversationFeature.activationBlocker; assert.deepStrictEqual(conversationFeature.activated, true); + assert.deepStrictEqual(conversationFeature.enabled, true); } finally { conversationFeature.dispose(); } diff --git a/extensions/copilot/src/platform/urlChunkSearch/node/urlChunkEmbeddingsIndex.ts b/extensions/copilot/src/platform/urlChunkSearch/node/urlChunkEmbeddingsIndex.ts index da4ac7863b2ff..86b98a712c6ad 100644 --- a/extensions/copilot/src/platform/urlChunkSearch/node/urlChunkEmbeddingsIndex.ts +++ b/extensions/copilot/src/platform/urlChunkSearch/node/urlChunkEmbeddingsIndex.ts @@ -68,9 +68,18 @@ export class UrlChunkEmbeddingsIndex extends Disposable { throw new Error('No embedding types available'); } + // Acquire auth up front (this may prompt sign-in) so the parallel query embedding doesn't race against it + // and return empty results from the "no GitHub session" guard while file embeddings concurrently succeed. + this._logService.trace(`urlChunkEmbeddingsIndex: Getting auth token `); + const authToken = await raceCancellationError(this.tryGetAuthToken(), token); + if (!authToken) { + this._logService.error('urlChunkEmbeddingsIndex: Unable to get auth token'); + throw new Error('Unable to get auth token'); + } + const [queryEmbedding, fileChunksAndEmbeddings] = await raceCancellationError(Promise.all([ this.computeEmbeddings(embeddingType, query, 'query', token), - this.getEmbeddingsForFiles(embeddingType, files.map(file => new UrlContent(file.uri, file.content)), EmbeddingsComputeQos.Batch, token) + this.getEmbeddingsForFiles(authToken, embeddingType, files.map(file => new UrlContent(file.uri, file.content)), EmbeddingsComputeQos.Batch, token) ]), token); if (!queryEmbedding) { @@ -85,26 +94,16 @@ export class UrlChunkEmbeddingsIndex extends Disposable { return embeddings.values[0]; } - private async getEmbeddingsForFiles(embeddingType: EmbeddingType, files: readonly UrlContent[], qos: EmbeddingsComputeQos, token: CancellationToken): Promise<(readonly FileChunkWithEmbedding[])[]> { + private async getEmbeddingsForFiles(authToken: string, embeddingType: EmbeddingType, files: readonly UrlContent[], qos: EmbeddingsComputeQos, token: CancellationToken): Promise<(readonly FileChunkWithEmbedding[])[]> { if (!files.length) { return []; } const batchInfo = new ComputeBatchInfo(); - this._logService.trace(`urlChunkEmbeddingsIndex: Getting auth token `); - const authToken = await this.tryGetAuthToken(); - if (!authToken) { - this._logService.error('urlChunkEmbeddingsIndex: Unable to get auth token'); - throw new Error('Unable to get auth token'); - } - const result = await Promise.all(files.map(async file => { const result = await this.getChunksAndEmbeddings(authToken, embeddingType, file, batchInfo, qos, token); - if (!result) { - return []; - } - return result; + return result ?? []; })); return result; } From 8dcc7df5fd38cb567e21207544e7e50c03bf282e Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 20 May 2026 00:16:15 -0700 Subject: [PATCH 09/17] Remerge --- extensions/copilot/package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/copilot/package.json b/extensions/copilot/package.json index 4d9967c02ea31..f13054d54e214 100644 --- a/extensions/copilot/package.json +++ b/extensions/copilot/package.json @@ -2259,49 +2259,49 @@ "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.individual.expired%", - "when": "github.copilot.interactiveSession.individual.expired" + "when": "github.copilot.interactiveSession.individual.expired && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.enterprise%", - "when": "github.copilot.interactiveSession.enterprise.disabled" + "when": "github.copilot.interactiveSession.enterprise.disabled && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.offline%", - "when": "github.copilot.offline" + "when": "github.copilot.offline && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.invalidToken%", - "when": "github.copilot.interactiveSession.invalidToken" + "when": "github.copilot.interactiveSession.invalidToken && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.rateLimited%", - "when": "github.copilot.interactiveSession.rateLimited" + "when": "github.copilot.interactiveSession.rateLimited && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.gitHubLoginFailed%", - "when": "github.copilot.interactiveSession.gitHubLoginFailed" + "when": "github.copilot.interactiveSession.gitHubLoginFailed && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.contactSupport%", - "when": "github.copilot.interactiveSession.contactSupport" + "when": "github.copilot.interactiveSession.contactSupport && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", "title": "%copilot.title%", "content": "%github.copilot.viewsWelcome.chatDisabled%", - "when": "github.copilot.interactiveSession.chatDisabled" + "when": "github.copilot.interactiveSession.chatDisabled && !github.copilot.hasByokModels" }, { "icon": "$(chat-sparkle)", From d2583ce25eaa95bbf690f12746021914528320f3 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 20 May 2026 00:19:51 -0700 Subject: [PATCH 10/17] Restore copilot package.json from main; keep BYOK welcome-view gating --- extensions/copilot/package.json | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/extensions/copilot/package.json b/extensions/copilot/package.json index f13054d54e214..f0fbea475d66f 100644 --- a/extensions/copilot/package.json +++ b/extensions/copilot/package.json @@ -6621,13 +6621,6 @@ "sessionTypes": [ "local" ] - }, - { - "path": "./assets/prompts/chronicle-search.prompt.md", - "when": "github.copilot.sessionSearch.enabled", - "sessionTypes": [ - "local" - ] } ], "chatSkills": [ @@ -6781,7 +6774,7 @@ "@fluentui/react-icons": "^2.0.305", "@hediet/node-reload": "^0.8.0", "@keyv/sqlite": "^4.0.5", - "@octokit/types": "^14.1.0", + "@octokit/types": "^16.0.0", "@stylistic/eslint-plugin": "^3.0.1", "@types/eslint": "^9.0.0", "@types/express": "^5.0.6", From db176d3c5a30dc6d60736504b17b88eedbffb5f8 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 20 May 2026 00:22:55 -0700 Subject: [PATCH 11/17] Reapply BYOK welcome-view gating against latest main --- extensions/copilot/package.json | 13841 +++++++++++++++--------------- 1 file changed, 6926 insertions(+), 6915 deletions(-) diff --git a/extensions/copilot/package.json b/extensions/copilot/package.json index f0fbea475d66f..5bde2059394a9 100644 --- a/extensions/copilot/package.json +++ b/extensions/copilot/package.json @@ -1,6917 +1,6928 @@ { - "name": "copilot-chat", - "displayName": "GitHub Copilot Chat", - "description": "AI chat features powered by Copilot", - "version": "0.50.0", - "build": "1", - "completionsCoreVersion": "1.378.1799", - "internalLargeStorageAriaKey": "ec712b3202c5462fb6877acae7f1f9d7-c19ad55e-3e3c-4f99-984b-827f6d95bd9e-6917", - "ariaKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255", - "buildType": "dev", - "publisher": "GitHub", - "homepage": "https://github.com/features/copilot?editor=vscode", - "license": "SEE LICENSE IN LICENSE.txt", - "repository": { - "type": "git", - "url": "https://github.com/microsoft/vscode-copilot-chat" - }, - "bugs": { - "url": "https://github.com/microsoft/vscode/issues" - }, - "qna": "https://github.com/github-community/community/discussions/categories/copilot", - "icon": "assets/copilot.png", - "pricing": "Trial", - "engines": { - "vscode": "^1.122.0", - "npm": ">=9.0.0", - "node": ">=22.14.0" - }, - "categories": [ - "AI", - "Chat", - "Programming Languages", - "Machine Learning" - ], - "keywords": [ - "ai", - "openai", - "codex", - "pilot", - "snippets", - "documentation", - "autocomplete", - "intellisense", - "refactor", - "javascript", - "python", - "typescript", - "php", - "go", - "golang", - "ruby", - "c++", - "c#", - "java", - "kotlin", - "co-pilot" - ], - "badges": [ - { - "url": "https://img.shields.io/badge/GitHub%20Copilot-Subscription%20Required-orange", - "href": "https://github.com/github-copilot/signup?editor=vscode", - "description": "%github.copilot.badge.signUp%" - }, - { - "url": "https://img.shields.io/github/stars/github/copilot-docs?style=social", - "href": "https://github.com/github/copilot-docs", - "description": "%github.copilot.badge.star%" - }, - { - "url": "https://img.shields.io/youtube/channel/views/UC7c3Kb6jYCRj4JOHHZTxKsQ?style=social", - "href": "https://www.youtube.com/@GitHub/search?query=copilot", - "description": "%github.copilot.badge.youtube%" - }, - { - "url": "https://img.shields.io/twitter/follow/github?style=social", - "href": "https://twitter.com/github", - "description": "%github.copilot.badge.twitter%" - } - ], - "activationEvents": [ - "onStartupFinished", - "onLanguageModelChat:copilot", - "onUri", - "onFileSystem:ccreq", - "onFileSystem:ccsettings" - ], - "main": "./dist/extension", - "l10n": "./l10n", - "enabledApiProposals": [ - "agentSessionsWorkspace", - "agentsWindowConfiguration", - "chatDebug", - "chatHooks", - "extensionsAny", - "newSymbolNamesProvider", - "interactive", - "codeActionAI", - "activeComment", - "commentReveal", - "contribCommentThreadAdditionalMenu", - "contribCommentsViewThreadMenus", - "contribChatEditorInlineGutterMenu", - "documentFiltersExclusive", - "embeddings", - "findTextInFiles", - "findTextInFiles2", - "languageModelToolSupportsModel", - "findFiles2", - "textSearchProvider", - "terminalDataWriteEvent", - "terminalExecuteCommandEvent", - "terminalSelection", - "terminalQuickFixProvider", - "mappedEditsProvider", - "aiRelatedInformation", - "aiSettingsSearch", - "chatParticipantAdditions", - "defaultChatParticipant", - "contribSourceControlInputBoxMenu", - "authLearnMore", - "testObserver", - "aiTextSearchProvider", - "chatParticipantPrivate", - "chatProvider", - "contribDebugCreateConfiguration", - "chatReferenceDiagnostic", - "textSearchProvider2", - "chatReferenceBinaryData", - "languageModelSystem", - "languageModelCapabilities", - "languageModelPricing", - "inlineCompletionsAdditions", - "chatStatusItem", - "chatInputNotification", - "taskProblemMatcherStatus", - "contribLanguageModelToolSets", - "textDocumentChangeReason", - "resolvers", - "taskExecutionTerminal", - "dataChannels", - "languageModelThinkingPart", - "chatSessionsProvider", - "devDeviceId", - "contribEditorContentMenu", - "chatPromptFiles", - "mcpServerDefinitions", - "tabInputMultiDiff", - "workspaceTrust", - "environmentPower", - "terminalTitle", - "toolInvocationApproveCombination", - "chatSessionCustomizationProvider" - ], - "contributes": { - "languageModelTools": [ - { - "name": "copilot_searchCodebase", - "toolReferenceName": "codebase", - "displayName": "%copilot.tools.searchCodebase.name%", - "icon": "$(folder)", - "userDescription": "%copilot.codebase.tool.description%", - "modelDescription": "Run a natural language search for relevant code or documentation comments from the user's current workspace. Returns relevant code snippets from the user's current workspace if it is large, or the full contents of the workspace if it is small.", - "tags": [ - "codesearch", - "vscode_codesearch" - ], - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "The query to search the codebase for. Should contain all relevant context. Should ideally be text that might appear in the codebase, such as function names, variable names, or comments." - } - }, - "required": [ - "query" - ] - } - }, - { - "name": "execution_subagent", - "toolReferenceName": "executionSubagent", - "displayName": "%copilot.tools.executionSubagent.name%", - "icon": "$(play)", - "userDescription": "%copilot.tools.executionSubagent.description%", - "modelDescription": "Launch an iterative execution-focused subagent that performs an execution-based task.\nUSE THIS INSTEAD OF RUNNING INDIVIDUAL COMMANDS WITH run_in_terminal EXCEPT IN THE RARE CASES THAT YOU NEED THE FULL OUTPUT OF A COMMAND.\nHere are some examples of how it can be used:\n- Run tests and filter the output to summarize which tests failed and why.\n- Install all dependencies of a project.\nReturns: A list of commands that were run, along with relevant excerpts of each command's output.\nInput fields:\n- query: What to execute, and what to look for in the output. Can include exact commands to run, or a description of an execution task.\n- description: Short user-visible invocation message.\nNOTE: In the subagent query, make sure to specify any restrictions or guidelines on running commands provided by the user earlier in the conversation.\nFor example, if the user instructs the agent to not edit files in a particular directory, make sure to include that instruction in the subagent query when relevant.", - "when": "config.github.copilot.chat.executionSubagent.enabled", - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "What to execute, and what to look for in the output. Can include exact commands to run, or a description of an execution task." - }, - "description": { - "type": "string", - "description": "User-visible invocation message shown while the subagent runs." - } - }, - "required": [ - "query", - "description" - ] - } - }, - { - "name": "search_subagent", - "toolReferenceName": "searchSubagent", - "displayName": "%copilot.tools.searchSubagent.name%", - "icon": "$(search)", - "userDescription": "%copilot.tools.searchSubagent.description%", - "modelDescription": "Launch a fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (eg. \"src/components/**/*.tsx\"), search code for keywords (eg. \"API endpoints\"), or answer questions about the codebase (eg. \"how do API endpoints work?\").\nReturns: A list of relevant files/snippet locations in the workspace.\n\nInput fields:\n- query: Natural language description of what to search for.\n- description: Short user-visible invocation message. \n- details: 2-3 sentences detailing the objective of the search agent.", - "when": "config.github.copilot.chat.searchSubagent.enabled && config.github.copilot.chat.exploreAgent.enabled", - "tags": [ - "vscode_codesearch" - ], - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "Natural language description of what to search for." - }, - "description": { - "type": "string", - "description": "A short (3-5 word) description of the task." - }, - "details": { - "type": "string", - "description": "A more detailed description of the objective for the search subagent. This helps the sub-agent remain on task and understand its purpose." - } - }, - "required": [ - "query", - "description", - "details" - ] - } - }, - { - "name": "explore_subagent", - "toolReferenceName": "exploreSubagent", - "displayName": "%copilot.tools.searchSubagent.name%", - "icon": "$(search)", - "userDescription": "%copilot.tools.searchSubagent.description%", - "modelDescription": "Launch a fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (eg. \"src/components/**/*.tsx\"), search code for keywords (eg. \"API endpoints\"), or answer questions about the codebase (eg. \"how do API endpoints work?\").\nReturns: A list of relevant files/snippet locations in the workspace.\n\nInput fields:\n- query: Natural language description of what to search for.\n- description: Short user-visible invocation message. \n- details: 2-3 sentences detailing the objective of the search agent.", - "when": "config.github.copilot.chat.searchSubagent.enabled && !config.github.copilot.chat.exploreAgent.enabled", - "tags": [ - "vscode_codesearch" - ], - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "Natural language description of what to search for." - }, - "description": { - "type": "string", - "description": "A short (3-5 word) description of the task." - }, - "details": { - "type": "string", - "description": "A more detailed description of the objective for the search subagent. This helps the sub-agent remain on task and understand its purpose." - } - }, - "required": [ - "query", - "description", - "details" - ] - } - }, - { - "name": "skill", - "toolReferenceName": "skill", - "displayName": "%copilot.tools.skill.name%", - "icon": "$(book)", - "userDescription": "%copilot.tools.skill.description%", - "modelDescription": "Invoke a skill to handle a user's request with specialized instructions and workflows.\n\nSkills are domain-specific capabilities discovered from SKILL.md files. When a user's task matches an available skill, call this tool to load and apply it. If the user types a slash command (e.g. \"/deploy\", \"/test\"), treat it as a skill invocation.\n\nUsage:\n- Pass the skill name only (no arguments).\n- Examples: skill: \"docx\", skill: \"deploy\", skill: \"fix-ci-failures\"\n\nRules:\n- Available skills appear in system-reminder messages earlier in the conversation.\n- BLOCKING: When a matching skill exists, you MUST call this tool before producing any other output about the task.\n- Never reference a skill without calling this tool.\n- Do not call this tool for a skill that is already active in the current turn (indicated by a tag).\n- Do not use this tool for built-in commands such as /help or /clear.", - "when": "config.github.copilot.chat.skillTool.enabled", - "inputSchema": { - "type": "object", - "properties": { - "skill": { - "type": "string", - "description": "The skill name. E.g., \"commit\", \"review-pr\", or \"pdf\"" - } - }, - "required": [ - "skill" - ] - } - }, - { - "name": "copilot_searchWorkspaceSymbols", - "toolReferenceName": "symbols", - "displayName": "%copilot.tools.searchWorkspaceSymbols.name%", - "icon": "$(symbol)", - "userDescription": "%copilot.workspaceSymbols.tool.description%", - "modelDescription": "Search the user's workspace for code symbols using language services. Use this tool when the user is looking for a specific symbol in their workspace.", - "tags": [ - "vscode_codesearch" - ], - "inputSchema": { - "type": "object", - "properties": { - "symbolName": { - "type": "string", - "description": "The symbol to search for, such as a function name, class name, or variable name." - } - }, - "required": [ - "symbolName" - ] - } - }, - { - "name": "copilot_getVSCodeAPI", - "toolReferenceName": "vscodeAPI", - "displayName": "%copilot.tools.getVSCodeAPI.name%", - "icon": "$(references)", - "userDescription": "%copilot.vscode.tool.description%", - "modelDescription": "Get comprehensive VS Code API documentation and references for extension development. This tool provides authoritative documentation for VS Code's extensive API surface, including proposed APIs, contribution points, and best practices. Use this tool for understanding complex VS Code API interactions.\n\nWhen to use this tool:\n- User asks about specific VS Code APIs, interfaces, or extension capabilities\n- Need documentation for VS Code extension contribution points (commands, views, settings, etc.)\n- Questions about proposed APIs and their usage patterns\n- Understanding VS Code extension lifecycle, activation events, and packaging\n- Best practices for VS Code extension development architecture\n- API examples and code patterns for extension features\n- Troubleshooting extension-specific issues or API limitations\n\nWhen NOT to use this tool:\n- Creating simple standalone files or scripts unrelated to VS Code extensions\n- General programming questions not specific to VS Code extension development\n- Questions about using VS Code as an editor (user-facing features)\n- Non-extension related development tasks\n- File creation or editing that doesn't involve VS Code extension APIs\n\nCRITICAL usage guidelines:\n1. Always include specific API names, interfaces, or concepts in your query\n2. Mention the extension feature you're trying to implement\n3. Include context about proposed vs stable APIs when relevant\n4. Reference specific contribution points when asking about extension manifest\n5. Be specific about the VS Code version or API version when known\n\nScope: This tool is for EXTENSION DEVELOPMENT ONLY - building tools that extend VS Code itself, not for general file creation or non-extension programming tasks.", - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "The query to search vscode documentation for. Should contain all relevant context." - } - }, - "required": [ - "query" - ] - }, - "tags": [] - }, - { - "name": "copilot_findFiles", - "toolReferenceName": "fileSearch", - "displayName": "%copilot.tools.findFiles.name%", - "userDescription": "%copilot.tools.findFiles.userDescription%", - "modelDescription": "Search for files in the workspace by glob pattern. This only returns the paths of matching files. Use this tool when you know the exact filename pattern of the files you're searching for. Glob patterns match from the root of the workspace folder. Examples:\n- **/*.{js,ts} to match all js/ts files in the workspace.\n- src/** to match all files under the top-level src folder.\n- **/foo/**/*.js to match all js files under any foo folder in the workspace.\n\nIn a multi-root workspace, you can scope the search to a specific workspace folder by using the absolute path to the folder as the query, e.g. /path/to/folder/**/*.ts.", - "tags": [ - "vscode_codesearch" - ], - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "Search for files with names or paths matching this glob pattern. Can also be an absolute path to a workspace folder to scope the search in a multi-root workspace." - }, - "maxResults": { - "type": "number", - "description": "The maximum number of results to return. Do not use this unless necessary, it can slow things down. By default, only some matches are returned. If you use this and don't see what you're looking for, you can try again with a more specific query or a larger maxResults." - } - }, - "required": [ - "query" - ] - } - }, - { - "name": "copilot_findTextInFiles", - "toolReferenceName": "textSearch", - "displayName": "%copilot.tools.findTextInFiles.name%", - "userDescription": "%copilot.tools.findTextInFiles.userDescription%", - "modelDescription": "Do a fast text search in the workspace. Use this tool when you want to search with an exact string or regex. If you are not sure what words will appear in the workspace, prefer using regex patterns with alternation (|) or character classes to search for multiple potential words at once instead of making separate searches. For example, use 'function|method|procedure' to look for all of those words at once. Use includePattern to search within files matching a specific pattern, or in a specific file, using a relative path. Use 'includeIgnoredFiles' to include files normally ignored by .gitignore, other ignore files, and `files.exclude` and `search.exclude` settings. Warning: using this may cause the search to be slower, only set it when you want to search in ignored folders like node_modules or build outputs. Use this tool when you want to see an overview of a particular file, instead of using read_file many times to look for code within a file.\n\nIn a multi-root workspace, you can scope the search to a specific workspace folder by using the absolute path to the folder as the includePattern, e.g. /path/to/folder.", - "tags": [ - "vscode_codesearch" - ], - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "The pattern to search for in files in the workspace. Use regex with alternation (e.g., 'word1|word2|word3') or character classes to find multiple potential words in a single search. Be sure to set the isRegexp property properly to declare whether it's a regex or plain text pattern. Is case-insensitive." - }, - "isRegexp": { - "type": "boolean", - "description": "Whether the pattern is a regex." - }, - "includePattern": { - "type": "string", - "description": "Search files matching this glob pattern. Will be applied to the relative path of files within the workspace. To search recursively inside a folder, use a proper glob pattern like \"src/folder/**\". Do not use | in includePattern. Can also be an absolute path to a workspace folder to scope the search in a multi-root workspace." - }, - "maxResults": { - "type": "number", - "description": "The maximum number of results to return. Do not use this unless necessary, it can slow things down. By default, only some matches are returned. If you use this and don't see what you're looking for, you can try again with a more specific query or a larger maxResults." - }, - "includeIgnoredFiles": { - "type": "boolean", - "description": "Whether to include files that would normally be ignored according to .gitignore, other ignore files and `files.exclude` and `search.exclude` settings. Warning: using this may cause the search to be slower. Only set it when you want to search in ignored folders like node_modules or build outputs." - } - }, - "required": [ - "query", - "isRegexp" - ] - } - }, - { - "name": "copilot_applyPatch", - "displayName": "%copilot.tools.applyPatch.name%", - "toolReferenceName": "applyPatch", - "userDescription": "%copilot.tools.applyPatch.description%", - "modelDescription": "Edit text files. Do not use this tool to edit Jupyter notebooks. `apply_patch` allows you to execute a diff/patch against a text file, but the format of the diff specification is unique to this task, so pay careful attention to these instructions. To use the `apply_patch` command, you should pass a message of the following structure as \"input\":\n\n*** Begin Patch\n[YOUR_PATCH]\n*** End Patch\n\nWhere [YOUR_PATCH] is the actual content of your patch, specified in the following V4A diff format.\n\n*** [ACTION] File: [/absolute/path/to/file] -> ACTION can be one of Add, Update, or Delete.\nAn example of a message that you might pass as \"input\" to this function, in order to apply a patch, is shown below.\n\n*** Begin Patch\n*** Update File: /Users/someone/pygorithm/searching/binary_search.py\n@@class BaseClass\n@@ def search():\n- pass\n+ raise NotImplementedError()\n\n@@class Subclass\n@@ def search():\n- pass\n+ raise NotImplementedError()\n\n*** End Patch\nDo not use line numbers in this diff format.", - "inputSchema": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "The edit patch to apply." - }, - "explanation": { - "type": "string", - "description": "A short description of what the tool call is aiming to achieve." - } - }, - "required": [ - "input", - "explanation" - ] - } - }, - { - "name": "copilot_readFile", - "toolReferenceName": "readFile", - "legacyToolReferenceFullNames": [ - "search/readFile" - ], - "displayName": "%copilot.tools.readFile.name%", - "userDescription": "%copilot.tools.readFile.userDescription%", - "modelDescription": "Read the contents of a file.\n\nYou must specify the line range you're interested in. Line numbers are 1-indexed. If the file contents returned are insufficient for your task, you may call this tool again to retrieve more content. Prefer reading larger ranges over doing many small reads. Binary files use startLine/endLine as byte offsets.", - "tags": [ - "vscode_codesearch" - ], - "inputSchema": { - "type": "object", - "properties": { - "filePath": { - "description": "The absolute path of the file to read.", - "type": "string" - }, - "startLine": { - "type": "number", - "description": "The line number to start reading from, 1-based." - }, - "endLine": { - "type": "number", - "description": "The inclusive line number to end reading at, 1-based." - } - }, - "required": [ - "filePath", - "startLine", - "endLine" - ] - } - }, - { - "name": "copilot_viewImage", - "toolReferenceName": "viewImage", - "displayName": "%copilot.tools.viewImage.name%", - "userDescription": "%copilot.tools.viewImage.userDescription%", - "when": "config.github.copilot.chat.tools.viewImage.enabled", - "modelDescription": "View the contents of an image file. Use this instead of read_file for supported image files such as png, jpg, jpeg, gif, and webp. The tool returns the image directly to multimodal models and does not take line ranges or offsets.", - "inputSchema": { - "type": "object", - "properties": { - "filePath": { - "description": "The absolute path of the image file to view.", - "type": "string" - } - }, - "required": [ - "filePath" - ] - } - }, - { - "name": "copilot_listDirectory", - "toolReferenceName": "listDirectory", - "displayName": "%copilot.tools.listDirectory.name%", - "userDescription": "%copilot.tools.listDirectory.userDescription%", - "modelDescription": "List the contents of a directory. Result will have the name of the child. If the name ends in /, it's a folder, otherwise a file", - "tags": [ - "vscode_codesearch" - ], - "inputSchema": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "The absolute path to the directory to list." - } - }, - "required": [ - "path" - ] - } - }, - { - "name": "copilot_getErrors", - "displayName": "%copilot.tools.getErrors.name%", - "toolReferenceName": "problems", - "legacyToolReferenceFullNames": [ - "problems" - ], - "icon": "$(error)", - "userDescription": "%copilot.tools.errors.description%", - "modelDescription": "Get any compile or lint errors in a specific file or across all files. If the user mentions errors or problems in a file, they may be referring to these. Use the tool to see the same errors that the user is seeing. If the user asks you to analyze all errors, or does not specify a file, use this tool to gather errors for all files. Also use this tool after editing a file to validate the change.", - "tags": [], - "inputSchema": { - "type": "object", - "properties": { - "filePaths": { - "description": "The absolute paths to the files or folders to check for errors. Omit 'filePaths' when retrieving all errors.", - "type": "array", - "items": { - "type": "string" - } - } - } - } - }, - { - "name": "copilot_readProjectStructure", - "displayName": "%copilot.tools.readProjectStructure.name%", - "modelDescription": "Get a file tree representation of the workspace.", - "tags": [] - }, - { - "name": "copilot_getChangedFiles", - "displayName": "%copilot.tools.getChangedFiles.name%", - "toolReferenceName": "changes", - "legacyToolReferenceFullNames": [ - "changes" - ], - "icon": "$(diff)", - "userDescription": "%copilot.tools.changes.description%", - "modelDescription": "Get git diffs of current file changes in a git repository. Don't forget that you can use run_in_terminal to run git commands in a terminal as well.", - "when": "config.github.copilot.chat.getChangedFilesTool.enabled", - "tags": [ - "vscode_codesearch" - ], - "inputSchema": { - "type": "object", - "properties": { - "repositoryPath": { - "type": "string", - "description": "The absolute path to the git repository to look for changes in. If not provided, the active git repository will be used." - }, - "sourceControlState": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "staged", - "unstaged", - "merge-conflicts" - ] - }, - "description": "The kinds of git state to filter by. Allowed values are: 'staged', 'unstaged', and 'merge-conflicts'. If not provided, all states will be included." - } - } - } - }, - { - "name": "copilot_createNewWorkspace", - "displayName": "%github.copilot.tools.createNewWorkspace.name%", - "toolReferenceName": "newWorkspace", - "legacyToolReferenceFullNames": [ - "new/newWorkspace" - ], - "icon": "$(new-folder)", - "userDescription": "%github.copilot.tools.createNewWorkspace.userDescription%", - "when": "config.github.copilot.chat.newWorkspaceCreation.enabled", - "modelDescription": "Get comprehensive setup steps to help the user create complete project structures in a VS Code workspace. This tool is designed for full project initialization and scaffolding, not for creating individual files.\n\nWhen to use this tool:\n- User wants to create a new complete project from scratch\n- Setting up entire project frameworks (TypeScript projects, React apps, Node.js servers, etc.)\n- Initializing Model Context Protocol (MCP) servers with full structure\n- Creating VS Code extensions with proper scaffolding\n- Setting up Next.js, Vite, or other framework-based projects\n- User asks for \"new project\", \"create a workspace\", \"set up a [framework] project\"\n- Need to establish complete development environment with dependencies, config files, and folder structure\n\nWhen NOT to use this tool:\n- Creating single files or small code snippets\n- Adding individual files to existing projects\n- Making modifications to existing codebases\n- User asks to \"create a file\" or \"add a component\"\n- Simple code examples or demonstrations\n- Debugging or fixing existing code\n\nThis tool provides complete project setup including:\n- Folder structure creation\n- Package.json and dependency management\n- Configuration files (tsconfig, eslint, etc.)\n- Initial boilerplate code\n- Development environment setup\n- Build and run instructions\n\nUse other file creation tools for individual files within existing projects.", - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "The query to use to generate the new workspace. This should be a clear and concise description of the workspace the user wants to create." - } - }, - "required": [ - "query" - ] - }, - "tags": [ - "enable_other_tool_install_extension" - ] - }, - { - "name": "copilot_installExtension", - "displayName": "Install Extension in VS Code", - "when": "!config.github.copilot.chat.installExtensionSkill.enabled", - "toolReferenceName": "installExtension", - "legacyToolReferenceFullNames": [ - "new/installExtension" - ], - "modelDescription": "Install an extension in VS Code. Use this tool to install an extension in Visual Studio Code as part of a new workspace creation process only.", - "inputSchema": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The ID of the extension to install. This should be in the format .." - }, - "name": { - "type": "string", - "description": "The name of the extension to install. This should be a clear and concise description of the extension." - } - }, - "required": [ - "id", - "name" - ] - }, - "tags": [] - }, - { - "name": "copilot_runVscodeCommand", - "displayName": "Run VS Code Command", - "when": "config.github.copilot.chat.newWorkspaceCreation.enabled", - "toolReferenceName": "runCommand", - "legacyToolReferenceFullNames": [ - "new/runVscodeCommand" - ], - "modelDescription": "Run a command in VS Code. Use this tool to run a command in Visual Studio Code as part of a new workspace creation process only.", - "inputSchema": { - "type": "object", - "properties": { - "commandId": { - "type": "string", - "description": "The ID of the command to execute. This should be in the format ." - }, - "name": { - "type": "string", - "description": "The name of the command to execute. This should be a clear and concise description of the command." - }, - "args": { - "type": "array", - "description": "The arguments to pass to the command. This should be an array of strings.", - "items": { - "type": "string" - } - }, - "skipCheck": { - "type": "boolean", - "description": "If true, skip checking whether the command exists before executing it." - } - }, - "required": [ - "commandId", - "name" - ] - }, - "tags": [] - }, - { - "name": "copilot_createNewJupyterNotebook", - "displayName": "Create New Jupyter Notebook", - "icon": "$(notebook)", - "toolReferenceName": "createJupyterNotebook", - "legacyToolReferenceFullNames": [ - "newJupyterNotebook" - ], - "modelDescription": "Generates a new Jupyter Notebook (.ipynb) in VS Code. Jupyter Notebooks are interactive documents commonly used for data exploration, analysis, visualization, and combining code with narrative text. Prefer creating plain Python files or similar unless a user explicitly requests creating a new Jupyter Notebook or already has a Jupyter Notebook opened or exists in the workspace.", - "userDescription": "%copilot.tools.newJupyterNotebook.description%", - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "The query to use to generate the jupyter notebook. This should be a clear and concise description of the notebook the user wants to create." - } - }, - "required": [ - "query" - ] - }, - "tags": [] - }, - { - "name": "copilot_insertEdit", - "toolReferenceName": "insertEdit", - "displayName": "%copilot.tools.insertEdit.name%", - "modelDescription": "Insert new code into an existing file in the workspace. Use this tool once per file that needs to be modified, even if there are multiple changes for a file. Generate the \"explanation\" property first.\nThe system is very smart and can understand how to apply your edits to the files, you just need to provide minimal hints.\nAvoid repeating existing code, instead use comments to represent regions of unchanged code. Be as concise as possible. For example:\n// ...existing code...\n{ changed code }\n// ...existing code...\n{ changed code }\n// ...existing code...\n\nHere is an example of how you should use format an edit to an existing Person class:\nclass Person {\n\t// ...existing code...\n\tage: number;\n\t// ...existing code...\n\tgetAge() {\n\treturn this.age;\n\t}\n}", - "tags": [], - "inputSchema": { - "type": "object", - "properties": { - "explanation": { - "type": "string", - "description": "A short explanation of the edit being made." - }, - "filePath": { - "type": "string", - "description": "An absolute path to the file to edit." - }, - "code": { - "type": "string", - "description": "The code change to apply to the file.\nThe system is very smart and can understand how to apply your edits to the files, you just need to provide minimal hints.\nAvoid repeating existing code, instead use comments to represent regions of unchanged code. Be as concise as possible. For example:\n// ...existing code...\n{ changed code }\n// ...existing code...\n{ changed code }\n// ...existing code...\n\nHere is an example of how you should use format an edit to an existing Person class:\nclass Person {\n\t// ...existing code...\n\tage: number;\n\t// ...existing code...\n\tgetAge() {\n\t\treturn this.age;\n\t}\n}" - } - }, - "required": [ - "explanation", - "filePath", - "code" - ] - } - }, - { - "name": "copilot_createFile", - "toolReferenceName": "createFile", - "legacyToolReferenceFullNames": [ - "createFile" - ], - "displayName": "%copilot.tools.createFile.name%", - "userDescription": "%copilot.tools.createFile.description%", - "modelDescription": "This is a tool for creating a new file in the workspace. The file will be created with the specified content. The directory will be created if it does not already exist. Never use this tool to edit a file that already exists.", - "tags": [], - "inputSchema": { - "type": "object", - "properties": { - "filePath": { - "type": "string", - "description": "The absolute path to the file to create." - }, - "content": { - "type": "string", - "description": "The content to write to the file." - } - }, - "required": [ - "filePath", - "content" - ] - } - }, - { - "name": "copilot_createDirectory", - "toolReferenceName": "createDirectory", - "legacyToolReferenceFullNames": [ - "createDirectory" - ], - "displayName": "%copilot.tools.createDirectory.name%", - "userDescription": "%copilot.tools.createDirectory.description%", - "modelDescription": "Create a new directory structure in the workspace. Will recursively create all directories in the path, like mkdir -p. You do not need to use this tool before using create_file, that tool will automatically create the needed directories.", - "tags": [], - "inputSchema": { - "type": "object", - "properties": { - "dirPath": { - "type": "string", - "description": "The absolute path to the directory to create." - } - }, - "required": [ - "dirPath" - ] - } - }, - { - "name": "copilot_replaceString", - "toolReferenceName": "replaceString", - "displayName": "%copilot.tools.replaceString.name%", - "modelDescription": "This is a tool for making edits in an existing file in the workspace. For moving or renaming files, use run in terminal tool with the 'mv' command instead. For larger edits, split them into smaller edits and call the edit tool multiple times to ensure accuracy. Before editing, always ensure you have the context to understand the file's contents and context. To edit a file, provide: 1) filePath (absolute path), 2) oldString (MUST be the exact literal text to replace including all whitespace, indentation, newlines, and surrounding code etc), and 3) newString (MUST be the exact literal text to replace \\`oldString\\` with (also including all whitespace, indentation, newlines, and surrounding code etc.). Ensure the resulting code is correct and idiomatic.). Each use of this tool replaces exactly ONE occurrence of oldString.\n\nCRITICAL for \\`oldString\\`: Must uniquely identify the single instance to change. Include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. If this string matches multiple locations, or does not match exactly, the tool will fail. Never use 'Lines 123-456 omitted' from summarized documents or ...existing code... comments in the oldString or newString.", - "when": "!config.github.copilot.chat.disableReplaceTool", - "inputSchema": { - "type": "object", - "properties": { - "filePath": { - "type": "string", - "description": "An absolute path to the file to edit." - }, - "oldString": { - "type": "string", - "description": "The exact literal text to replace, preferably unescaped. For single replacements (default), include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. For multiple replacements, specify expected_replacements parameter. If this string is not the exact literal text (i.e. you escaped it) or does not match exactly, the tool will fail." - }, - "newString": { - "type": "string", - "description": "The exact literal text to replace `old_string` with, preferably unescaped. Provide the EXACT text. Ensure the resulting code is correct and idiomatic." - } - }, - "required": [ - "filePath", - "oldString", - "newString" - ] - } - }, - { - "name": "copilot_multiReplaceString", - "toolReferenceName": "multiReplaceString", - "displayName": "%copilot.tools.multiReplaceString.name%", - "modelDescription": "This tool allows you to apply multiple replace_string_in_file operations in a single call, which is more efficient than calling replace_string_in_file multiple times. It takes an array of replacement operations and applies them sequentially. Each replacement operation has the same parameters as replace_string_in_file: filePath, oldString, newString, and explanation. This tool is ideal when you need to make multiple edits across different files or multiple edits in the same file. The tool will provide a summary of successful and failed operations.", - "when": "!config.github.copilot.chat.disableReplaceTool", - "inputSchema": { - "type": "object", - "properties": { - "explanation": { - "type": "string", - "description": "A brief explanation of what the multi-replace operation will accomplish." - }, - "replacements": { - "type": "array", - "description": "An array of replacement operations to apply sequentially.", - "items": { - "type": "object", - "properties": { - "filePath": { - "type": "string", - "description": "An absolute path to the file to edit." - }, - "oldString": { - "type": "string", - "description": "The exact literal text to replace, preferably unescaped. Include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. If this string is not the exact literal text or does not match exactly, this replacement will fail." - }, - "newString": { - "type": "string", - "description": "The exact literal text to replace `oldString` with, preferably unescaped. Provide the EXACT text. Ensure the resulting code is correct and idiomatic." - } - }, - "required": [ - "filePath", - "oldString", - "newString" - ] - }, - "minItems": 1 - } - }, - "required": [ - "explanation", - "replacements" - ] - } - }, - { - "name": "copilot_editNotebook", - "toolReferenceName": "editNotebook", - "icon": "$(pencil)", - "displayName": "%copilot.tools.editNotebook.name%", - "userDescription": "%copilot.tools.editNotebook.userDescription%", - "modelDescription": "This is a tool for editing an existing Notebook file in the workspace. Generate the \"explanation\" property first.\nThe system is very smart and can understand how to apply your edits to the notebooks.\nWhen updating the content of an existing cell, ensure newCode preserves whitespace and indentation exactly and does NOT include any code markers such as (...existing code...).", - "tags": [ - "enable_other_tool_copilot_getNotebookSummary" - ], - "inputSchema": { - "type": "object", - "properties": { - "filePath": { - "type": "string", - "description": "An absolute path to the notebook file to edit, or the URI of a untitled, not yet named, file, such as `untitled:Untitled-1." - }, - "cellId": { - "type": "string", - "description": "Id of the cell that needs to be deleted or edited. Use the value `TOP`, `BOTTOM` when inserting a cell at the top or bottom of the notebook, else provide the id of the cell after which a new cell is to be inserted. Remember, if a cellId is provided and editType=insert, then a cell will be inserted after the cell with the provided cellId." - }, - "newCode": { - "anyOf": [ - { - "type": "string", - "description": "The code for the new or existing cell to be edited. Code should not be wrapped within tags. Do NOT include code markers such as (...existing code...) to indicate existing code." - }, - { - "type": "array", - "items": { - "type": "string", - "description": "The code for the new or existing cell to be edited. Code should not be wrapped within tags" - } - } - ] - }, - "language": { - "type": "string", - "description": "The language of the cell. `markdown`, `python`, `javascript`, `julia`, etc." - }, - "editType": { - "type": "string", - "enum": [ - "insert", - "delete", - "edit" - ], - "description": "The operation peformed on the cell, whether `insert`, `delete` or `edit`.\nUse the `editType` field to specify the operation: `insert` to add a new cell, `edit` to modify an existing cell's content, and `delete` to remove a cell." - } - }, - "required": [ - "filePath", - "editType", - "cellId" - ] - } - }, - { - "name": "copilot_runNotebookCell", - "displayName": "%copilot.tools.runNotebookCell.name%", - "toolReferenceName": "runNotebookCell", - "legacyToolReferenceFullNames": [ - "runNotebooks/runCell" - ], - "icon": "$(play)", - "modelDescription": "This is a tool for running a code cell in a notebook file directly in the notebook editor. The output from the execution will be returned. Code cells should be run as they are added or edited when working through a problem to bring the kernel state up to date and ensure the code executes successfully. Code cells are ready to run and don't require any pre-processing. If asked to run the first cell in a notebook, you should run the first code cell since markdown cells cannot be executed. NOTE: Avoid executing Markdown cells or providing Markdown cell IDs, as Markdown cells cannot be executed.", - "userDescription": "%copilot.tools.runNotebookCell.description%", - "tags": [ - "enable_other_tool_copilot_getNotebookSummary" - ], - "inputSchema": { - "type": "object", - "properties": { - "filePath": { - "type": "string", - "description": "An absolute path to the notebook file with the cell to run, or the URI of a untitled, not yet named, file, such as `untitled:Untitled-1.ipynb" - }, - "reason": { - "type": "string", - "description": "An optional explanation of why the cell is being run. This will be shown to the user before the tool is run and is not necessary if it's self-explanatory." - }, - "cellId": { - "type": "string", - "description": "The ID for the code cell to execute. Avoid providing markdown cell IDs as nothing will be executed." - }, - "continueOnError": { - "type": "boolean", - "description": "Whether or not execution should continue for remaining cells if an error is encountered. Default to false unless instructed otherwise." - } - }, - "required": [ - "filePath", - "cellId" - ] - } - }, - { - "name": "copilot_getNotebookSummary", - "toolReferenceName": "getNotebookSummary", - "legacyToolReferenceFullNames": [ - "runNotebooks/getNotebookSummary" - ], - "displayName": "Get the structure of a notebook", - "modelDescription": "This is a tool returns the list of the Notebook cells along with the id, cell types, line ranges, language, execution information and output mime types for each cell. This is useful to get Cell Ids when executing a notebook or determine what cells have been executed and what order, or what cells have outputs. If required to read contents of a cell use this to determine the line range of a cells, and then use read_file tool to read a specific line range. Requery this tool if the contents of the notebook change.", - "tags": [], - "inputSchema": { - "type": "object", - "properties": { - "filePath": { - "type": "string", - "description": "An absolute path to the notebook file with the cell to run, or the URI of a untitled, not yet named, file, such as `untitled:Untitled-1.ipynb" - } - }, - "required": [ - "filePath" - ] - } - }, - { - "name": "copilot_readNotebookCellOutput", - "displayName": "%copilot.tools.getNotebookCellOutput.name%", - "toolReferenceName": "readNotebookCellOutput", - "legacyToolReferenceFullNames": [ - "runNotebooks/readNotebookCellOutput" - ], - "icon": "$(notebook-render-output)", - "modelDescription": "This tool will retrieve the output for a notebook cell from its most recent execution or restored from disk. The cell may have output even when it has not been run in the current kernel session. This tool has a higher token limit for output length than the runNotebookCell tool.", - "userDescription": "%copilot.tools.getNotebookCellOutput.description%", - "tags": [], - "inputSchema": { - "type": "object", - "properties": { - "filePath": { - "type": "string", - "description": "An absolute path to the notebook file with the cell to run, or the URI of a untitled, not yet named, file, such as `untitled:Untitled-1.ipynb" - }, - "cellId": { - "type": "string", - "description": "The ID of the cell for which output should be retrieved." - } - }, - "required": [ - "filePath", - "cellId" - ] - } - }, - { - "name": "copilot_fetchWebPage", - "displayName": "%copilot.tools.fetchWebPage.name%", - "toolReferenceName": "fetch", - "legacyToolReferenceFullNames": [ - "fetch" - ], - "when": "!isWeb", - "icon": "$(globe)", - "userDescription": "%copilot.tools.fetchWebPage.description%", - "modelDescription": "Fetches the main content from a web page. This tool is useful for summarizing or analyzing the content of a webpage. You should use this tool when you think the user is looking for information from a specific webpage.", - "tags": [], - "inputSchema": { - "type": "object", - "properties": { - "urls": { - "type": "array", - "items": { - "type": "string" - }, - "description": "An array of URLs to fetch content from." - }, - "query": { - "type": "string", - "description": "The query to search for in the web page's content. This should be a clear and concise description of the content you want to find." - } - }, - "required": [ - "urls", - "query" - ] - } - }, - { - "name": "copilot_findTestFiles", - "displayName": "%copilot.tools.findTestFiles.name%", - "icon": "$(beaker)", - "canBeReferencedInPrompt": false, - "toolReferenceName": "findTestFiles", - "userDescription": "%copilot.tools.findTestFiles.description%", - "modelDescription": "For a source code file, find the file that contains the tests. For a test file find the file that contains the code under test.", - "tags": [], - "inputSchema": { - "type": "object", - "properties": { - "filePaths": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "filePaths" - ] - } - }, - { - "name": "copilot_githubRepo", - "toolReferenceName": "githubRepo", - "legacyToolReferenceFullNames": [ - "githubRepo" - ], - "displayName": "%github.copilot.tools.githubRepo.name%", - "modelDescription": "Searches a GitHub repository for relevant source code snippets. Only use this tool if the user is very clearly asking for code snippets from a specific GitHub repository. Do not use this tool for Github repos that the user has open in their workspace.", - "userDescription": "%github.copilot.tools.githubRepo.userDescription%", - "icon": "$(repo)", - "when": "!config.github.copilot.chat.githubMcpServer.enabled", - "inputSchema": { - "type": "object", - "properties": { - "repo": { - "type": "string", - "description": "The name of the Github repository to search for code in. Should must be formatted as '/'." - }, - "query": { - "type": "string", - "description": "The query to search for repo. Should contain all relevant context." - } - }, - "required": [ - "repo", - "query" - ] - } - }, - { - "name": "copilot_githubTextSearch", - "legacyToolReferenceFullNames": [ - "githubTextSearch" - ], - "toolReferenceName": "githubTextSearch", - "displayName": "%github.copilot.tools.githubTextSearch.name%", - "modelDescription": "Lexically searches a GitHub repository or organization for files containing specific keywords or code patterns. Use this when looking for exact strings, function names, or identifiers in a GitHub repo or org. Unlike the semantic search tool, this uses keyword matching rather than meaning-based search.", - "userDescription": "%github.copilot.tools.githubTextSearch.userDescription%", - "icon": "$(search)", - "inputSchema": { - "type": "object", - "properties": { - "scope": { - "type": "string", - "description": "The GitHub scope to search. Use 'owner/repo' to search a single repository, or an org name (no slash) to search across an entire organization." - }, - "query": { - "type": "string", - "description": "The keyword search query. Supports GitHub code search syntax such as 'language:typescript', 'extension:ts', 'path:src/', etc." - }, - "maxResults": { - "type": "number", - "description": "Optional. The maximum number of search results to return. Defaults to 100." - } - }, - "required": [ - "scope", - "query" - ] - } - }, - { - "name": "copilot_switchAgent", - "toolReferenceName": "switchAgent", - "displayName": "%copilot.tools.switchAgent.name%", - "userDescription": "%copilot.tools.switchAgent.description%", - "modelDescription": "Switch to the Plan agent to align on approach before implementing. Plan will explore the codebase, gathers context, clarifies requirements with the user, and creates an actionable implementation plan.\n\nSWITCH TO PLAN when ANY of these apply:\n1. Adding new functionality - where should it go? What patterns to follow?\n2. Multiple valid approaches exist - choosing between technologies, patterns, or strategies\n3. Modifying existing behavior - unclear what should change or what side effects exist\n4. Architectural decisions required - choosing between design patterns or integration approaches\n5. Changes span multiple files - refactoring, migrations, or cross-cutting concerns\n6. Requirements are underspecified - need to explore before understanding scope\n\nEXAMPLES:\n✓ Switch to Plan:\n- \"Add authentication to the app\" → architectural decisions needed (session vs JWT, middleware)\n- \"Refactor this data flow\" → must understand component dependencies first\n- \"Migrate from X to Y\" → requires understanding current structure\n\n✗ Do NOT switch to Plan:\n- User attached a detailed spec, plan, or requirements doc → context already provided\n- You already started editing files in this conversation → too late to switch\n- Single obvious change like fixing a typo or renaming → just do it\n- User gave explicit step-by-step instructions → follow them directly", - "when": "config.github.copilot.chat.switchAgent.enabled", - "icon": "$(arrow-swap)", - "inputSchema": { - "type": "object", - "properties": { - "agentName": { - "type": "string", - "description": "The name of the agent to switch to. Currently only 'Plan' is supported.", - "enum": [ - "Plan" - ] - } - }, - "required": [ - "agentName" - ] - } - }, - { - "name": "copilot_memory", - "displayName": "Memory", - "toolReferenceName": "memory", - "userDescription": "Manage persistent memory across conversations", - "modelDescription": "Manage a persistent memory system with three scopes for storing notes and information across conversations.\n\nMemory is organized under /memories/ with three tiers:\n- `/memories/` — User memory: persistent notes that survive across all workspaces and conversations. Store preferences, patterns, and general insights here.\n- `/memories/session/` — Session memory: notes scoped to the current conversation. Store task-specific context and in-progress notes here. Cleared after the conversation ends.\n- `/memories/repo/` — Repository memory: repository-scoped notes stored locally in the workspace. Store codebase conventions, build commands, project structure facts, and verified practices here.\n\nIMPORTANT: Before creating new memory files, first view the /memories/ directory to understand what already exists. This helps avoid duplicates and maintain organized notes.\n\nCommands:\n- `view`: View contents of a file or list directory contents. Can be used on files or directories (e.g., \"/memories/\" to see all top-level items).\n- `create`: Create a new file at the specified path with the given content. Fails if the file already exists.\n- `str_replace`: Replace an exact string in a file with a new string. The old_str must appear exactly once in the file.\n- `insert`: Insert text at a specific line number in a file. Line 0 inserts at the beginning.\n- `delete`: Delete a file or directory (and all its contents).\n- `rename`: Rename or move a file or directory from path to new_path. Cannot rename across scopes.", - "inputSchema": { - "type": "object", - "properties": { - "command": { - "type": "string", - "enum": [ - "view", - "create", - "str_replace", - "insert", - "delete", - "rename" - ], - "description": "The operation to perform on the memory file system." - }, - "path": { - "type": "string", - "description": "The absolute path to the file or directory inside /memories/, e.g. \"/memories/notes.md\". Used by all commands except `rename`." - }, - "file_text": { - "type": "string", - "description": "Required for `create`. The content of the file to create." - }, - "old_str": { - "type": "string", - "description": "Required for `str_replace`. The exact string in the file to replace. Must appear exactly once." - }, - "new_str": { - "type": "string", - "description": "Required for `str_replace`. The new string to replace old_str with." - }, - "insert_line": { - "type": "number", - "description": "Required for `insert`. The 0-based line number to insert text at. 0 inserts before the first line." - }, - "insert_text": { - "type": "string", - "description": "Required for `insert`. The text to insert at the specified line." - }, - "view_range": { - "type": "array", - "items": { - "type": "number" - }, - "minItems": 2, - "maxItems": 2, - "description": "Optional for `view`. A two-element array [start_line, end_line] (1-indexed) to view a specific range of lines." - }, - "old_path": { - "type": "string", - "description": "Required for `rename`. The current path of the file or directory to rename." - }, - "new_path": { - "type": "string", - "description": "Required for `rename`. The new path for the file or directory." - } - }, - "required": [ - "command" - ] - } - }, - { - "name": "copilot_resolveMemoryFileUri", - "displayName": "Resolve Memory File URI", - "toolReferenceName": "resolveMemoryFileUri", - "userDescription": "Resolve a memory file path to its actual URI", - "modelDescription": "Resolve a memory file path (like /memories/session/plan.md or /memories/repo/notes.md) to its fully qualified URI. Use this when you need the actual URI for a memory file, for example to pass it to setArtifacts. The path must start with /memories/.", - "tags": [], - "inputSchema": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "The memory file path to resolve (e.g. /memories/session/plan.md)." - } - }, - "required": [ - "path" - ] - } - }, - { - "name": "copilot_editFiles", - "modelDescription": "This is a placeholder tool, do not use", - "userDescription": "Edit files", - "icon": "$(pencil)", - "displayName": "Edit Files", - "toolReferenceName": "editFiles", - "legacyToolReferenceFullNames": [ - "editFiles" - ] - }, - { - "name": "copilot_sessionStoreSql", - "displayName": "Session Store SQL", - "toolReferenceName": "sessionStoreSql", - "when": "github.copilot.sessionSearch.enabled", - "userDescription": "Query your Copilot session history using SQL", - "modelDescription": "Query the local session store containing history from past coding sessions. Uses SQLite SQL syntax.\n\nActions: 'query' (execute SQL — supports JOINs, FTS5 MATCH, aggregations), 'standup' (pre-fetch last 24h data), 'reindex' (rebuild index from debug logs).", - "tags": [], - "canBeReferencedInPrompt": false, - "inputSchema": { - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": ["query", "standup", "reindex"], - "description": "The action to perform. 'query' (default) executes a SQL query. 'standup' pre-fetches last 24h session data for standup reports. 'reindex' rebuilds the local session index and syncs to cloud if enabled." - }, - "query": { - "type": "string", - "description": "A single read-only SQL query to execute. Required when action is 'query'. Supports SELECT, WITH, JOINs, aggregations, and FTS5 MATCH. Only one statement per call — do not combine multiple queries with semicolons." - }, - "force": { - "type": "boolean", - "description": "When true with action 'reindex', re-processes all sessions including already-indexed ones. Default false (skips already-indexed sessions)." - }, - "description": { - "type": "string", - "description": "A 2-5 word summary of what this call does (e.g. 'Recent sessions overview', 'Generate standup', 'Reindex sessions')." - } - }, - "required": [ - "description" - ] - } - } - ], - "languageModelToolSets": [ - { - "name": "edit", - "description": "%copilot.toolSet.editing.description%", - "icon": "$(pencil)", - "tools": [ - "createDirectory", - "createFile", - "createJupyterNotebook", - "editFiles", - "editNotebook", - "rename" - ] - }, - { - "name": "execute", - "description": "", - "tools": [ - "runNotebookCell", - "executionSubagent" - ] - }, - { - "name": "read", - "description": "%copilot.toolSet.read.description%", - "icon": "$(eye)", - "tools": [ - "getNotebookSummary", - "problems", - "readFile", - "viewImage", - "readNotebookCellOutput", - "skill" - ] - }, - { - "name": "search", - "description": "%copilot.toolSet.search.description%", - "icon": "$(search)", - "tools": [ - "changes", - "codebase", - "fileSearch", - "listDirectory", - "textSearch", - "searchSubagent", - "usages" - ] - }, - { - "name": "vscode", - "description": "", - "tools": [ - "installExtension", - "memory", - "newWorkspace", - "resolveMemoryFileUri", - "runCommand", - "switchAgent", - "toolSearch", - "vscodeAPI" - ] - }, - { - "name": "web", - "description": "%copilot.toolSet.web.description%", - "icon": "$(globe)", - "tools": [ - "fetch", - "githubRepo", - "githubTextSearch" - ] - } - ], - "chatParticipants": [ - { - "id": "github.copilot.default", - "name": "GitHubCopilot", - "fullName": "GitHub Copilot", - "description": "%copilot.description%", - "isDefault": true, - "locations": [ - "panel" - ], - "modes": [ - "ask" - ], - "disambiguation": [ - { - "category": "generate_code_sample", - "description": "The user wants to generate code snippets without referencing the contents of the current workspace. This category does not include generating entire projects.", - "examples": [ - "Write an example of computing a SHA256 hash." - ] - }, - { - "category": "add_feature_to_file", - "description": "The user wants to change code in a file that is provided in their request, without referencing the contents of the current workspace. This category does not include generating entire projects.", - "examples": [ - "Add a refresh button to the table widget." - ] - }, - { - "category": "question_about_specific_files", - "description": "The user has a question about a specific file or code snippet that they have provided as part of their query, and the question does not require additional workspace context to answer.", - "examples": [ - "What does this file do?" - ] - } - ], - "commands": [ - { - "name": "explain", - "description": "%copilot.workspace.explain.description%" - }, - { - "name": "review", - "description": "%copilot.workspace.review.description%", - "when": "github.copilot.advanced.review.intent" - }, - { - "name": "tests", - "description": "%copilot.workspace.tests.description%", - "disambiguation": [ - { - "category": "create_tests", - "description": "The user wants to generate unit tests.", - "examples": [ - "Generate tests for my selection using pytest." - ] - } - ] - }, - { - "name": "fix", - "description": "%copilot.workspace.fix.description%", - "sampleRequest": "%copilot.workspace.fix.sampleRequest%" - }, - { - "name": "new", - "description": "%copilot.workspace.new.description%", - "sampleRequest": "%copilot.workspace.new.sampleRequest%", - "isSticky": true, - "disambiguation": [ - { - "category": "create_new_workspace_or_extension", - "description": "The user wants to create a complete Visual Studio Code workspace from scratch, such as a new application or a Visual Studio Code extension. Use this category only if the question relates to generating or creating new workspaces in Visual Studio Code. Do not use this category for updating existing code or generating sample code snippets", - "examples": [ - "Scaffold a Node server.", - "Create a sample project which uses the fileSystemProvider API.", - "react application" - ] - } - ] - }, - { - "name": "newNotebook", - "description": "%copilot.workspace.newNotebook.description%", - "sampleRequest": "%copilot.workspace.newNotebook.sampleRequest%", - "disambiguation": [ - { - "category": "create_jupyter_notebook", - "description": "The user wants to create a new Jupyter notebook in Visual Studio Code.", - "examples": [ - "Create a notebook to analyze this CSV file." - ] - } - ] - }, - { - "name": "semanticSearch", - "description": "%copilot.workspace.semanticSearch.description%", - "sampleRequest": "%copilot.workspace.semanticSearch.sampleRequest%", - "when": "config.github.copilot.semanticSearch.enabled" - }, - { - "name": "setupTests", - "description": "%copilot.vscode.setupTests.description%", - "sampleRequest": "%copilot.vscode.setupTests.sampleRequest%", - "when": "config.github.copilot.chat.setupTests.enabled", - "disambiguation": [ - { - "category": "set_up_tests", - "description": "The user wants to configure project test setup, framework, or test runner. The user does not want to fix their existing tests.", - "examples": [ - "Set up tests for this project." - ] - } - ] - } - ] - }, - { - "id": "github.copilot.editingSession", - "name": "GitHubCopilot", - "fullName": "GitHub Copilot", - "description": "%copilot.edits.description%", - "isDefault": true, - "locations": [ - "panel" - ], - "modes": [ - "edit" - ] - }, - { - "id": "github.copilot.editingSessionEditor", - "name": "GitHubCopilot", - "fullName": "GitHub Copilot", - "description": "%copilot.edits.description%", - "isDefault": true, - "locations": [ - "editor" - ], - "commands": [] - }, - { - "id": "github.copilot.editsAgent", - "name": "agent", - "fullName": "GitHub Copilot", - "description": "%copilot.agent.description%", - "locations": [ - "panel" - ], - "modes": [ - "agent" - ], - "isEngine": true, - "isDefault": true, - "isAgent": true, - "when": "config.chat.agent.enabled", - "commands": [ - { - "name": "error", - "description": "Make a model request which will result in an error", - "when": "github.copilot.chat.debug" - }, - { - "name": "compact", - "description": "%copilot.agent.compact.description%" - }, - { - "name": "explain", - "description": "%copilot.workspace.explain.description%" - }, - { - "name": "review", - "description": "%copilot.workspace.review.description%", - "when": "github.copilot.advanced.review.intent" - }, - { - "name": "tests", - "description": "%copilot.workspace.tests.description%", - "disambiguation": [ - { - "category": "create_tests", - "description": "The user wants to generate unit tests.", - "examples": [ - "Generate tests for my selection using pytest." - ] - } - ] - }, - { - "name": "fix", - "description": "%copilot.workspace.fix.description%", - "sampleRequest": "%copilot.workspace.fix.sampleRequest%" - }, - { - "name": "new", - "description": "%copilot.workspace.new.description%", - "sampleRequest": "%copilot.workspace.new.sampleRequest%", - "isSticky": true, - "disambiguation": [ - { - "category": "create_new_workspace_or_extension", - "description": "The user wants to create a complete Visual Studio Code workspace from scratch, such as a new application or a Visual Studio Code extension. Use this category only if the question relates to generating or creating new workspaces in Visual Studio Code. Do not use this category for updating existing code or generating sample code snippets", - "examples": [ - "Scaffold a Node server.", - "Create a sample project which uses the fileSystemProvider API.", - "react application" - ] - } - ] - }, - { - "name": "newNotebook", - "description": "%copilot.workspace.newNotebook.description%", - "sampleRequest": "%copilot.workspace.newNotebook.sampleRequest%", - "disambiguation": [ - { - "category": "create_jupyter_notebook", - "description": "The user wants to create a new Jupyter notebook in Visual Studio Code.", - "examples": [ - "Create a notebook to analyze this CSV file." - ] - } - ] - }, - { - "name": "semanticSearch", - "description": "%copilot.workspace.semanticSearch.description%", - "sampleRequest": "%copilot.workspace.semanticSearch.sampleRequest%", - "when": "config.github.copilot.semanticSearch.enabled" - }, - { - "name": "setupTests", - "description": "%copilot.vscode.setupTests.description%", - "sampleRequest": "%copilot.vscode.setupTests.sampleRequest%", - "when": "config.github.copilot.chat.setupTests.enabled", - "disambiguation": [ - { - "category": "set_up_tests", - "description": "The user wants to configure project test setup, framework, or test runner. The user does not want to fix their existing tests.", - "examples": [ - "Set up tests for this project." - ] - } - ] - } - ] - }, - { - "id": "github.copilot.notebook", - "name": "GitHubCopilot", - "fullName": "GitHub Copilot", - "description": "%copilot.description%", - "isDefault": true, - "locations": [ - "notebook" - ], - "when": "!config.inlineChat.notebookAgent", - "commands": [ - { - "name": "fix", - "description": "%copilot.workspace.fix.description%" - }, - { - "name": "explain", - "description": "%copilot.workspace.explain.description%" - } - ] - }, - { - "id": "github.copilot.notebookEditorAgent", - "name": "GitHubCopilot", - "fullName": "GitHub Copilot", - "description": "%copilot.description%", - "isDefault": true, - "locations": [ - "notebook" - ], - "when": "config.inlineChat.notebookAgent", - "commands": [ - { - "name": "fix", - "description": "%copilot.workspace.fix.description%" - }, - { - "name": "explain", - "description": "%copilot.workspace.explain.description%" - } - ] - }, - { - "id": "github.copilot.vscode", - "name": "vscode", - "fullName": "VS Code", - "description": "%copilot.vscode.description%", - "when": "!github.copilot.interactiveSession.disabled", - "sampleRequest": "%copilot.vscode.sampleRequest%", - "locations": [ - "panel" - ], - "disambiguation": [ - { - "category": "vscode_configuration_questions", - "description": "The user wants to learn about, use, or configure the Visual Studio Code. Use this category if the users question is specifically about commands, settings, keybindings, extensions and other features available in Visual Studio Code. Do not use this category to answer questions about generating code or creating new projects including Visual Studio Code extensions.", - "examples": [ - "Switch to light mode.", - "Keyboard shortcut to toggle terminal visibility.", - "Settings to enable minimap.", - "Whats new in the latest release?" - ] - }, - { - "category": "configure_python_environment", - "description": "The user wants to set up their Python environment.", - "examples": [ - "Create a virtual environment for my project." - ] - } - ], - "commands": [ - { - "name": "search", - "description": "%copilot.vscode.search.description%", - "sampleRequest": "%copilot.vscode.search.sampleRequest%" - } - ] - }, - { - "id": "github.copilot.terminal", - "name": "terminal", - "fullName": "Terminal", - "description": "%copilot.terminal.description%", - "when": "!github.copilot.interactiveSession.disabled", - "sampleRequest": "%copilot.terminal.sampleRequest%", - "isDefault": true, - "locations": [ - "terminal" - ], - "commands": [ - { - "name": "explain", - "description": "%copilot.terminal.explain.description%", - "sampleRequest": "%copilot.terminal.explain.sampleRequest%" - } - ] - }, - { - "id": "github.copilot.terminalPanel", - "name": "terminal", - "fullName": "Terminal", - "description": "%copilot.terminalPanel.description%", - "when": "!github.copilot.interactiveSession.disabled", - "sampleRequest": "%copilot.terminal.sampleRequest%", - "locations": [ - "panel" - ], - "commands": [ - { - "name": "explain", - "description": "%copilot.terminal.explain.description%", - "sampleRequest": "%copilot.terminal.explain.sampleRequest%", - "disambiguation": [ - { - "category": "terminal_state_questions", - "description": "The user wants to learn about specific state such as the selection, command, or failed command in the integrated terminal in Visual Studio Code.", - "examples": [ - "Why did the latest terminal command fail?" - ] - } - ] - } - ] - } - ], - "languageModelChatProviders": [ - { - "vendor": "copilot", - "displayName": "Copilot" - }, - { - "vendor": "copilotcli", - "displayName": "Copilot CLI", - "when": "false" - }, - { - "vendor": "claude-code", - "displayName": "Claude Code", - "when": "false" - }, - { - "vendor": "anthropic", - "displayName": "Anthropic", - "configuration": { - "properties": { - "apiKey": { - "type": "string", - "secret": true, - "description": "API key for Anthropic", - "title": "API Key" - } - }, - "required": [ - "apiKey" - ] - } - }, - { - "vendor": "xai", - "displayName": "xAI", - "configuration": { - "properties": { - "apiKey": { - "type": "string", - "secret": true, - "description": "API key for xAI", - "title": "API Key" - } - }, - "required": [ - "apiKey" - ] - } - }, - { - "vendor": "gemini", - "displayName": "Google", - "configuration": { - "properties": { - "apiKey": { - "type": "string", - "secret": true, - "description": "API key for Google Gemini", - "title": "API Key" - } - }, - "required": [ - "apiKey" - ] - } - }, - { - "vendor": "openrouter", - "displayName": "OpenRouter", - "configuration": { - "properties": { - "apiKey": { - "type": "string", - "secret": true, - "description": "API key for OpenRouter", - "title": "API Key" - } - }, - "required": [ - "apiKey" - ] - } - }, - { - "vendor": "openai", - "displayName": "OpenAI", - "configuration": { - "properties": { - "apiKey": { - "type": "string", - "secret": true, - "description": "API key for OpenAI", - "title": "API Key" - } - }, - "required": [ - "apiKey" - ] - } - }, - { - "vendor": "ollama", - "displayName": "Ollama", - "configuration": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The endpoint URL for the Ollama server", - "default": "http://localhost:11434", - "title": "URL" - } - }, - "required": [ - "url" - ] - } - }, - { - "vendor": "customoai", - "when": "productQualityType != 'stable'", - "displayName": "OpenAI Compatible (Deprecated)", - "configuration": { - "type": "object", - "properties": { - "apiKey": { - "type": "string", - "secret": true, - "description": "API key for the models", - "title": "API Key", - "markdownDeprecationMessage": "**Deprecated.** Use the `customendpoint` provider (\"Custom Endpoint\") instead. It supports the Chat Completions API, the Responses API, and the Messages API — selectable per model via the `apiType` property." - }, - "models": { - "type": "array", - "markdownDeprecationMessage": "**Deprecated.** Use the `customendpoint` provider (\"Custom Endpoint\") instead. It supports the Chat Completions API, the Responses API, and the Messages API — selectable per model via the `apiType` property.", - "defaultSnippets": [ - { - "label": "New Model", - "description": "Add a new custom model configuration", - "body": [ - { - "id": "$1", - "name": "$2", - "url": "$3", - "toolCalling": "^${4|true,false|}", - "vision": "^${5|true,false|}", - "maxInputTokens": "^${6:128000}", - "maxOutputTokens": "^${7:16000}" - } - ] - } - ], - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Unique identifier for the model" - }, - "name": { - "type": "string", - "description": "Display name of the custom OpenAI model" - }, - "url": { - "type": "string", - "markdownDescription": "URL endpoint for the custom OpenAI-compatible model.\n\n**Important:** Base URLs default to Chat Completions API. Explicit API paths including `/responses` or `/chat/completions` are respected." - }, - "toolCalling": { - "type": "boolean", - "description": "Whether the model supports tool calling" - }, - "vision": { - "type": "boolean", - "description": "Whether the model supports vision capabilities" - }, - "maxInputTokens": { - "type": "number", - "description": "Maximum number of input tokens supported by the model" - }, - "maxOutputTokens": { - "type": "number", - "description": "Maximum number of output tokens supported by the model" - }, - "editTools": { - "type": "array", - "description": "List of edit tools supported by the model. If this is not configured, the editor will try multiple edit tools and pick the best one.\n\n- 'find-replace': Find and replace text in a document.\n- 'multi-find-replace': Find and replace text in a document.\n- 'apply-patch': A file-oriented diff format used by some OpenAI models\n- 'code-rewrite': A general but slower editing tool that allows the model to rewrite and code snippet and provide only the replacement to the editor.", - "items": { - "type": "string", - "enum": [ - "find-replace", - "multi-find-replace", - "apply-patch", - "code-rewrite" - ] - } - }, - "thinking": { - "type": "boolean", - "default": false, - "description": "Whether the model supports thinking capabilities" - }, - "streaming": { - "type": "boolean", - "default": true, - "description": "Whether the model supports streaming responses. Defaults to true." - }, - "zeroDataRetentionEnabled": { - "type": "boolean", - "default": false, - "markdownDescription": "Whether Zero Data Retention (ZDR) is enabled for this endpoint. When `true`, `previous_response_id` will not be sent in requests via Responses API." - }, - "supportsReasoningEffort": { - "type": "array", - "markdownDescription": "Reasoning effort levels the model accepts (e.g. `[\"low\", \"medium\", \"high\"]`). When set, a `Thinking Effort` picker is shown in the model picker and the chosen value is forwarded to the model. Levels supported by mainstream OpenAI-compatible servers are `minimal`, `low`, `medium`, `high`.", - "items": { - "type": "string" - } - }, - "reasoningEffortFormat": { - "type": "string", - "enum": [ - "chat-completions", - "responses" - ], - "markdownDescription": "Body shape used to forward the reasoning effort to the model. `chat-completions` sends a top-level `reasoning_effort` string. `responses` sends a nested `reasoning.effort` object. When unset the format follows the URL: `/responses` \u2192 nested, otherwise top-level." - }, - "requestHeaders": { - "type": "object", - "description": "Additional HTTP headers to include with requests to this model. These reserved headers are not allowed and ignored if present: forbidden request headers (https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_request_header), forwarding headers ('forwarded', 'x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto'), and others ('api-key', 'authorization', 'content-type', 'openai-intent', 'x-github-api-version', 'x-initiator', 'x-interaction-id', 'x-interaction-type', 'x-onbehalf-extension-id', 'x-request-id', 'x-vscode-user-agent-library-version'). Pattern-based forbidden headers ('proxy-*', 'sec-*', 'x-http-method*' with forbidden methods) are also blocked.", - "additionalProperties": { - "type": "string" - } - } - }, - "required": [ - "id", - "name", - "url", - "toolCalling", - "vision", - "maxInputTokens", - "maxOutputTokens" - ] - } - } - } - } - }, - { - "vendor": "customendpoint", - "when": "productQualityType != 'stable'", - "displayName": "Custom Endpoint", - "configuration": { - "type": "object", - "properties": { - "apiKey": { - "type": "string", - "secret": true, - "minLength": 1, - "description": "API key for the models", - "title": "API Key" - }, - "apiType": { - "type": "string", - "enum": [ - "chat-completions", - "responses", - "messages" - ], - "enumDescriptions": [ - "Chat Completions API.", - "Responses API.", - "Messages API." - ], - "default": "chat-completions", - "title": "API Type", - "markdownDescription": "Default request/response format for models in this group. Individual models can override this with their own `apiType` property; when both are unset the type is inferred from the URL path." - }, - "models": { - "type": "array", - "defaultSnippets": [ - { - "label": "New Model", - "description": "Add a new custom model configuration", - "body": [ - { - "id": "$1", - "name": "$2", - "url": "$3", - "toolCalling": "^${4|true,false|}", - "vision": "^${5|true,false|}", - "maxInputTokens": "^${6:128000}", - "maxOutputTokens": "^${7:16000}" - } - ] - } - ], - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Unique identifier for the model" - }, - "name": { - "type": "string", - "description": "Display name of the model" - }, - "url": { - "type": "string", - "pattern": "^https?://.+", - "patternErrorMessage": "URL must start with http:// or https://", - "markdownDescription": "URL endpoint for the model.\n\n**Important:** Base URLs default to Chat Completions API. Explicit API paths are respected: `/chat/completions`, `/responses`, and `/v1/messages` (Anthropic-compatible). Use the `apiType` property to override the request/response format independently of the URL." - }, - "apiType": { - "type": "string", - "enum": [ - "chat-completions", - "responses", - "messages" - ], - "markdownDescription": "Request/response format used to talk to this endpoint:\n- `chat-completions`: Chat Completions API (default).\n- `responses`: Responses API.\n- `messages`: Messages API.\n\nWhen omitted, falls back to the group-level `apiType`, then to the URL path." - }, - "toolCalling": { - "type": "boolean", - "description": "Whether the model supports tool calling" - }, - "vision": { - "type": "boolean", - "description": "Whether the model supports vision capabilities" - }, - "maxInputTokens": { - "type": "number", - "description": "Maximum number of input tokens supported by the model" - }, - "maxOutputTokens": { - "type": "number", - "description": "Maximum number of output tokens supported by the model" - }, - "editTools": { - "type": "array", - "description": "List of edit tools supported by the model. If this is not configured, the editor will try multiple edit tools and pick the best one.\n\n- 'find-replace': Find and replace text in a document.\n- 'multi-find-replace': Find and replace text in a document.\n- 'apply-patch': A file-oriented diff format used by some OpenAI models\n- 'code-rewrite': A general but slower editing tool that allows the model to rewrite and code snippet and provide only the replacement to the editor.", - "items": { - "type": "string", - "enum": [ - "find-replace", - "multi-find-replace", - "apply-patch", - "code-rewrite" - ] - } - }, - "thinking": { - "type": "boolean", - "default": false, - "description": "Whether the model supports thinking capabilities" - }, - "streaming": { - "type": "boolean", - "default": true, - "description": "Whether the model supports streaming responses. Defaults to true." - }, - "zeroDataRetentionEnabled": { - "type": "boolean", - "default": false, - "markdownDescription": "Whether Zero Data Retention (ZDR) is enabled for this endpoint. When `true`, `previous_response_id` will not be sent in requests via Responses API." - }, - "supportsReasoningEffort": { - "type": "array", - "markdownDescription": "Reasoning effort levels the model accepts (e.g. `[\"low\", \"medium\", \"high\"]`). When set, a `Thinking Effort` picker is shown in the model picker and the chosen value is forwarded to the model. Levels supported by mainstream OpenAI-compatible servers are `minimal`, `low`, `medium`, `high`.", - "items": { - "type": "string" - } - }, - "reasoningEffortFormat": { - "type": "string", - "enum": [ - "chat-completions", - "responses" - ], - "markdownDescription": "Body shape used to forward the reasoning effort to the model. `chat-completions` sends a top-level `reasoning_effort` string. `responses` sends a nested `reasoning.effort` object. When unset the format follows the URL: `/responses` \u2192 nested, otherwise top-level." - }, - "requestHeaders": { - "type": "object", - "description": "Additional HTTP headers to include with requests to this model. These reserved headers are not allowed and ignored if present: forbidden request headers (https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_request_header), forwarding headers ('forwarded', 'x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto'), and others ('api-key', 'authorization', 'content-type', 'openai-intent', 'x-github-api-version', 'x-initiator', 'x-interaction-id', 'x-interaction-type', 'x-onbehalf-extension-id', 'x-request-id', 'x-vscode-user-agent-library-version'). Pattern-based forbidden headers ('proxy-*', 'sec-*', 'x-http-method*' with forbidden methods) are also blocked.", - "additionalProperties": { - "type": "string" - } - } - }, - "required": [ - "id", - "name", - "url", - "toolCalling", - "vision", - "maxInputTokens", - "maxOutputTokens" - ] - } - } - } - } - }, - { - "vendor": "azure", - "displayName": "Azure", - "configuration": { - "type": "object", - "properties": { - "apiKey": { - "type": "string", - "secret": true, - "description": "API key for the models. If not set then Entra ID (Azure AD) authentication with your Microsoft account credentials will be used.", - "title": "API Key" - }, - "models": { - "type": "array", - "defaultSnippets": [ - { - "label": "New Model", - "description": "Add a new custom model configuration", - "body": [ - { - "id": "$1", - "name": "$2", - "url": "$3", - "toolCalling": "^${4|true,false|}", - "vision": "^${5|true,false|}", - "maxInputTokens": "^${6:128000}", - "maxOutputTokens": "^${7:16000}" - } - ] - } - ], - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Unique identifier for the model" - }, - "name": { - "type": "string", - "description": "Display name of the custom OpenAI model" - }, - "url": { - "type": "string", - "markdownDescription": "URL endpoint for the custom OpenAI-compatible model.\n\n**Important:** Base URLs default to Chat Completions API. Explicit API paths including `/responses` or `/chat/completions` are respected." - }, - "toolCalling": { - "type": "boolean", - "description": "Whether the model supports tool calling" - }, - "vision": { - "type": "boolean", - "description": "Whether the model supports vision capabilities" - }, - "maxInputTokens": { - "type": "number", - "description": "Maximum number of input tokens supported by the model" - }, - "maxOutputTokens": { - "type": "number", - "description": "Maximum number of output tokens supported by the model" - }, - "thinking": { - "type": "boolean", - "default": false, - "description": "Whether the model supports thinking capabilities" - }, - "streaming": { - "type": "boolean", - "default": true, - "description": "Whether the model supports streaming responses. Defaults to true." - }, - "zeroDataRetentionEnabled": { - "type": "boolean", - "default": false, - "markdownDescription": "Whether Zero Data Retention (ZDR) is enabled for this endpoint. When `true`, `previous_response_id` will not be sent in requests via Responses API." - }, - "supportsReasoningEffort": { - "type": "array", - "markdownDescription": "Reasoning effort levels the model accepts (e.g. `[\"low\", \"medium\", \"high\"]`). When set, a `Thinking Effort` picker is shown in the model picker and the chosen value is forwarded to the model. Levels supported by mainstream OpenAI-compatible servers are `minimal`, `low`, `medium`, `high`.", - "items": { - "type": "string" - } - }, - "reasoningEffortFormat": { - "type": "string", - "enum": [ - "chat-completions", - "responses" - ], - "markdownDescription": "Body shape used to forward the reasoning effort to the model. `chat-completions` sends a top-level `reasoning_effort` string. `responses` sends a nested `reasoning.effort` object. When unset the format follows the URL: `/responses` \u2192 nested, otherwise top-level." - }, - "requestHeaders": { - "type": "object", - "description": "Additional HTTP headers to include with requests to this model. These reserved headers are not allowed and ignored if present: forbidden request headers (https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_request_header), forwarding headers ('forwarded', 'x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto'), and others ('api-key', 'authorization', 'content-type', 'openai-intent', 'x-github-api-version', 'x-initiator', 'x-interaction-id', 'x-interaction-type', 'x-onbehalf-extension-id', 'x-request-id', 'x-vscode-user-agent-library-version'). Pattern-based forbidden headers ('proxy-*', 'sec-*', 'x-http-method*' with forbidden methods) are also blocked.", - "additionalProperties": { - "type": "string" - } - } - }, - "required": [ - "id", - "name", - "url", - "toolCalling", - "vision", - "maxInputTokens", - "maxOutputTokens" - ] - } - } - } - } - } - ], - "interactiveSession": [ - { - "label": "GitHub Copilot", - "id": "copilot", - "icon": "", - "when": "!github.copilot.interactiveSession.disabled" - } - ], - "mcpServerDefinitionProviders": [ - { - "id": "github", - "label": "GitHub" - } - ], - "viewsWelcome": [ - { - "view": "debug", - "when": "github.copilot-chat.activated", - "contents": "%github.copilot.viewsWelcome.debug%" - } - ], - "chatViewsWelcome": [ - { - "icon": "$(chat-sparkle)", - "title": "%copilot.title%", - "content": "%github.copilot.viewsWelcome.individual.expired%", - "when": "github.copilot.interactiveSession.individual.expired && !github.copilot.hasByokModels" - }, - { - "icon": "$(chat-sparkle)", - "title": "%copilot.title%", - "content": "%github.copilot.viewsWelcome.enterprise%", - "when": "github.copilot.interactiveSession.enterprise.disabled && !github.copilot.hasByokModels" - }, - { - "icon": "$(chat-sparkle)", - "title": "%copilot.title%", - "content": "%github.copilot.viewsWelcome.offline%", - "when": "github.copilot.offline && !github.copilot.hasByokModels" - }, - { - "icon": "$(chat-sparkle)", - "title": "%copilot.title%", - "content": "%github.copilot.viewsWelcome.invalidToken%", - "when": "github.copilot.interactiveSession.invalidToken && !github.copilot.hasByokModels" - }, - { - "icon": "$(chat-sparkle)", - "title": "%copilot.title%", - "content": "%github.copilot.viewsWelcome.rateLimited%", - "when": "github.copilot.interactiveSession.rateLimited && !github.copilot.hasByokModels" - }, - { - "icon": "$(chat-sparkle)", - "title": "%copilot.title%", - "content": "%github.copilot.viewsWelcome.gitHubLoginFailed%", - "when": "github.copilot.interactiveSession.gitHubLoginFailed && !github.copilot.hasByokModels" - }, - { - "icon": "$(chat-sparkle)", - "title": "%copilot.title%", - "content": "%github.copilot.viewsWelcome.contactSupport%", - "when": "github.copilot.interactiveSession.contactSupport && !github.copilot.hasByokModels" - }, - { - "icon": "$(chat-sparkle)", - "title": "%copilot.title%", - "content": "%github.copilot.viewsWelcome.chatDisabled%", - "when": "github.copilot.interactiveSession.chatDisabled && !github.copilot.hasByokModels" - }, - { - "icon": "$(chat-sparkle)", - "title": "%copilot.title%", - "content": "%github.copilot.viewsWelcome.switchToReleaseChannel%", - "when": "github.copilot.interactiveSession.switchToReleaseChannel" - } - ], - "commands": [ - { - "command": "github.copilot.chat.triggerPermissiveSignIn", - "title": "%github.copilot.command.triggerPermissiveSignIn%" - }, - { - "command": "copilot.claude.agents", - "title": "Manage Agents", - "category": "Claude Agent" - }, - { - "command": "copilot.claude.hooks", - "title": "Configure Hooks", - "category": "Claude Agent" - }, - { - "command": "copilot.claude.memory", - "title": "Open Memory Files", - "category": "Claude Agent" - }, - { - "command": "github.copilot.cli.sessions.delete", - "title": "%github.copilot.command.deleteAgentSession%", - "icon": "$(close)", - "category": "Copilot CLI" - }, - { - "command": "agents.github.copilot.cli.deleteSessions", - "title": "%github.copilot.command.deleteAgentSession%", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.cli.sessions.resumeInTerminal", - "title": "%github.copilot.command.cli.sessions.resumeInTerminal%", - "icon": "$(terminal)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.cli.sessions.rename", - "title": "%github.copilot.command.cli.sessions.rename%", - "icon": "$(edit)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.cli.sessions.setTitle", - "title": "%github.copilot.command.cli.sessions.setTitle%", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.claude.sessions.rename", - "title": "%github.copilot.command.claude.sessions.rename%", - "icon": "$(edit)", - "category": "Claude" - }, - { - "command": "github.copilot.cli.sessions.openRepository", - "title": "%github.copilot.command.cli.sessions.openRepository%", - "icon": "$(folder-opened)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.cli.sessions.openWorktreeInNewWindow", - "title": "%github.copilot.command.cli.sessions.openWorktreeInNewWindow%", - "icon": "$(folder-opened)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.cli.sessions.openWorktreeInTerminal", - "title": "%github.copilot.command.cli.sessions.openWorktreeInTerminal%", - "icon": "$(terminal)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.cli.sessions.copyWorktreeBranchName", - "title": "%github.copilot.command.cli.sessions.copyWorktreeBranchName%", - "icon": "$(copy)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.cli.sessions.commitToWorktree", - "title": "%github.copilot.command.cli.sessions.commitToWorktree%", - "icon": "$(git-commit)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.cli.sessions.commitToRepository", - "title": "%github.copilot.command.cli.sessions.commitToRepository%", - "icon": "$(git-commit)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.cli.newSession", - "title": "%github.copilot.command.cli.newSession%", - "icon": "$(terminal)", - "category": "Chat" - }, - { - "command": "github.copilot.cli.newSessionToSide", - "title": "%github.copilot.command.cli.newSessionToSide%", - "icon": "$(terminal)", - "category": "Chat" - }, - { - "command": "github.copilot.cli.openInCopilotCLI", - "title": "%github.copilot.command.cli.openInCopilotCLI%", - "icon": "$(terminal)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.chat.compact", - "title": "%github.copilot.command.compactConversation%" - }, - { - "command": "github.copilot.chat.explain", - "title": "%github.copilot.command.explainThis%", - "enablement": "!github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.chat.explain.palette", - "title": "%github.copilot.command.explainThis%", - "enablement": "!github.copilot.interactiveSession.disabled && !editorReadonly", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review", - "title": "%github.copilot.command.reviewAndComment%", - "enablement": "config.github.copilot.chat.reviewSelection.enabled && !github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.apply", - "title": "%github.copilot.command.applyReviewSuggestion%", - "icon": "$(sparkle)", - "enablement": "commentThread =~ /hasSuggestion/", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.applyAndNext", - "title": "%github.copilot.command.applyReviewSuggestionAndNext%", - "icon": "$(sparkle)", - "enablement": "commentThread =~ /hasSuggestion/", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.discard", - "title": "%github.copilot.command.discardReviewSuggestion%", - "icon": "$(close)", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.discardAndNext", - "title": "%github.copilot.command.discardReviewSuggestionAndNext%", - "icon": "$(close)", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.discardAll", - "title": "%github.copilot.command.discardAllReviewSuggestion%", - "icon": "$(close-all)", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.stagedChanges", - "title": "%github.copilot.command.reviewStagedChanges%", - "icon": "$(code-review)", - "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.unstagedChanges", - "title": "%github.copilot.command.reviewUnstagedChanges%", - "icon": "$(code-review)", - "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.changes", - "title": "%github.copilot.command.reviewChanges%", - "icon": "$(code-review)", - "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.stagedFileChange", - "title": "%github.copilot.command.reviewFileChange%", - "icon": "$(code-review)", - "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.unstagedFileChange", - "title": "%github.copilot.command.reviewFileChange%", - "icon": "$(code-review)", - "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.chat.codeReview.run", - "title": "%github.copilot.command.codeReviewRun%", - "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.previous", - "title": "%github.copilot.command.gotoPreviousReviewSuggestion%", - "icon": "$(arrow-up)", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.next", - "title": "%github.copilot.command.gotoNextReviewSuggestion%", - "icon": "$(arrow-down)", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.continueInInlineChat", - "title": "%github.copilot.command.continueReviewInInlineChat%", - "icon": "$(comment-discussion)", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.continueInChat", - "title": "%github.copilot.command.continueReviewInChat%", - "icon": "$(comment-discussion)", - "category": "Chat" - }, - { - "command": "github.copilot.chat.review.markHelpful", - "title": "%github.copilot.command.helpfulReviewSuggestion%", - "icon": "$(thumbsup)", - "enablement": "!(commentThread =~ /markedAsHelpful/)", - "category": "Chat" - }, - { - "command": "github.copilot.chat.openUserPreferences", - "title": "%github.copilot.command.openUserPreferences%", - "category": "Chat", - "enablement": "config.github.copilot.chat.enableUserPreferences" - }, - { - "command": "github.copilot.chat.review.markUnhelpful", - "title": "%github.copilot.command.unhelpfulReviewSuggestion%", - "icon": "$(thumbsdown)", - "enablement": "!(commentThread =~ /markedAsUnhelpful/)", - "category": "Chat" - }, - { - "command": "github.copilot.chat.generate", - "title": "%github.copilot.command.generateThis%", - "icon": "$(sparkle)", - "enablement": "!github.copilot.interactiveSession.disabled && !editorReadonly", - "category": "Chat" - }, - { - "command": "github.copilot.chat.fix", - "title": "%github.copilot.command.fixThis%", - "enablement": "!github.copilot.interactiveSession.disabled && !editorReadonly", - "category": "Chat" - }, - { - "command": "github.copilot.interactiveSession.feedback", - "title": "%github.copilot.command.sendChatFeedback%", - "enablement": "github.copilot-chat.activated && !github.copilot.interactiveSession.disabled", - "icon": "$(feedback)", - "category": "Chat" - }, - { - "command": "github.copilot.debug.workbenchState", - "title": "%github.copilot.command.logWorkbenchState%", - "category": "Developer" - }, - { - "command": "github.copilot.debug.togglePowerSaveBlocker", - "title": "%github.copilot.command.togglePowerSaveBlocker%", - "category": "Developer" - }, - { - "command": "github.copilot.debug.showChatLogView", - "title": "%github.copilot.command.showChatLogView%", - "category": "Developer" - }, - { - "command": "github.copilot.debug.showOutputChannel", - "title": "%github.copilot.command.showOutputChannel%", - "category": "Developer" - }, - { - "command": "github.copilot.debug.showContextInspectorView", - "title": "%github.copilot.command.showContextInspectorView%", - "icon": "$(inspect)", - "category": "Developer" - }, - { - "command": "github.copilot.debug.validateNesRename", - "title": "%github.copilot.command.validateNesRename%", - "category": "Developer" - }, - { - "command": "github.copilot.debug.resetVirtualToolGroups", - "title": "%github.copilot.command.resetVirtualToolGroups%", - "icon": "$(inspect)", - "category": "Developer" - }, - { - "command": "github.copilot.debug.extensionState", - "title": "%github.copilot.command.extensionState%", - "category": "Developer" - }, - { - "command": "github.copilot.chat.tools.memory.showMemories", - "title": "%github.copilot.command.showMemories%", - "category": "Chat" - }, - { - "command": "github.copilot.chat.tools.memory.clearMemories", - "title": "%github.copilot.command.clearMemories%", - "category": "Chat" - }, - { - "command": "github.copilot.terminal.explainTerminalLastCommand", - "title": "%github.copilot.command.explainTerminalLastCommand%", - "category": "Chat" - }, - { - "command": "github.copilot.git.generateCommitMessage", - "title": "%github.copilot.git.generateCommitMessage%", - "icon": "$(sparkle)", - "enablement": "!github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.git.resolveMergeConflicts", - "title": "%github.copilot.git.resolveMergeConflicts%", - "icon": "$(chat-sparkle)", - "enablement": "!github.copilot.interactiveSession.disabled", - "category": "Chat" - }, - { - "command": "github.copilot.devcontainer.generateDevContainerConfig", - "title": "%github.copilot.devcontainer.generateDevContainerConfig%", - "category": "Chat" - }, - { - "command": "github.copilot.tests.fixTestFailure", - "icon": "$(sparkle)", - "title": "%github.copilot.command.fixTestFailure%", - "category": "Chat" - }, - { - "command": "github.copilot.tests.fixTestFailure.fromInline", - "icon": "$(sparkle)", - "title": "%github.copilot.command.fixTestFailure%" - }, - { - "command": "github.copilot.chat.attachFile", - "title": "%github.copilot.chat.attachFile%", - "category": "Chat" - }, - { - "command": "github.copilot.chat.attachSelection", - "title": "%github.copilot.chat.attachSelection%", - "icon": "$(comment-discussion)", - "category": "Chat" - }, - { - "command": "github.copilot.debug.collectDiagnostics", - "title": "%github.copilot.command.collectDiagnostics%", - "category": "Developer" - }, - { - "command": "github.copilot.debug.inlineEdit.clearCache", - "title": "%github.copilot.command.inlineEdit.clearCache%", - "category": "Developer" - }, - { - "command": "github.copilot.debug.inlineEdit.reportNotebookNESIssue", - "title": "%github.copilot.command.inlineEdit.reportNotebookNESIssue%", - "enablement": "config.github.copilot.chat.advanced.notebook.alternativeNESFormat.enabled || github.copilot.chat.enableEnhancedNotebookNES", - "category": "Developer" - }, - { - "command": "github.copilot.debug.generateSTest", - "title": "%github.copilot.command.generateSTest%", - "enablement": "github.copilot.debugReportFeedback", - "category": "Developer" - }, - { - "command": "github.copilot.open.walkthrough", - "title": "%github.copilot.command.openWalkthrough%", - "category": "Chat" - }, - { - "command": "github.copilot.debug.generateInlineEditTests", - "title": "Generate Inline Edit Tests", - "category": "Chat", - "enablement": "resourceScheme == 'ccreq'" - }, - { - "command": "github.copilot.buildRemoteWorkspaceIndex", - "title": "%github.copilot.command.buildRemoteWorkspaceIndex%", - "category": "Chat", - "enablement": "github.copilot-chat.activated" - }, - { - "command": "github.copilot.deleteExternalIngestWorkspaceIndex", - "title": "%github.copilot.command.deleteExternalIngestWorkspaceIndex%", - "category": "Developer", - "enablement": "github.copilot-chat.activated && !github.copilot.blackbirdExternalIndexingDisabled" - }, - { - "command": "github.copilot.report", - "title": "Report Issue", - "category": "Chat" - }, - { - "command": "github.copilot.chat.rerunWithCopilotDebug", - "title": "%github.copilot.command.rerunWithCopilotDebug%", - "category": "Chat" - }, - { - "command": "github.copilot.chat.startCopilotDebugCommand", - "title": "Start Copilot Debug" - }, - { - "command": "github.copilot.chat.clearTemporalContext", - "title": "Clear Temporal Context", - "category": "Developer" - }, - { - "command": "github.copilot.search.markHelpful", - "title": "Helpful", - "icon": "$(thumbsup)", - "enablement": "!github.copilot.search.feedback.sent" - }, - { - "command": "github.copilot.search.markUnhelpful", - "title": "Unhelpful", - "icon": "$(thumbsdown)", - "enablement": "!github.copilot.search.feedback.sent" - }, - { - "command": "github.copilot.search.feedback", - "title": "Feedback", - "icon": "$(feedback)", - "enablement": "!github.copilot.search.feedback.sent" - }, - { - "command": "github.copilot.chat.debug.showElements", - "title": "Show Rendered Elements" - }, - { - "command": "github.copilot.chat.debug.hideElements", - "title": "Hide Rendered Elements" - }, - { - "command": "github.copilot.chat.debug.showTools", - "title": "Show Tools" - }, - { - "command": "github.copilot.chat.debug.hideTools", - "title": "Hide Tools" - }, - { - "command": "github.copilot.chat.debug.showNesRequests", - "title": "Show NES Requests" - }, - { - "command": "github.copilot.chat.debug.hideNesRequests", - "title": "Hide NES Requests" - }, - { - "command": "github.copilot.chat.debug.showGhostRequests", - "title": "Show Ghost Requests" - }, - { - "command": "github.copilot.chat.debug.hideGhostRequests", - "title": "Hide Ghost Requests" - }, - { - "command": "github.copilot.chat.debug.showRawRequestBody", - "title": "Show Raw Request Body" - }, - { - "command": "github.copilot.chat.debug.exportLogItem", - "title": "Export as...", - "icon": "$(export)" - }, - { - "command": "github.copilot.chat.debug.exportPromptArchive", - "title": "Export All as Archive...", - "icon": "$(archive)" - }, - { - "command": "github.copilot.chat.debug.exportPromptLogsAsJson", - "title": "Export All as JSON...", - "icon": "$(export)" - }, - { - "command": "github.copilot.chat.debug.exportAllPromptLogsAsJson", - "title": "Export All Prompt Logs as JSON...", - "icon": "$(export)" - }, - { - "command": "github.copilot.chat.otel.exportAgentTracesDB", - "title": "Export Agent Traces DB", - "category": "Chat", - "enablement": "config.github.copilot.chat.otel.dbSpanExporter.enabled" - }, - { - "command": "github.copilot.sessionSync.deleteSessions", - "title": "%github.copilot.command.sessionSync.deleteSessions%", - "category": "Chat", - "enablement": "github.copilot.sessionSearch.enabled && config.chat.sessionSync.enabled" - }, - { - "command": "github.copilot.chronicle.reindex", - "title": "%github.copilot.command.chronicle.reindex%", - "category": "Chat", - "enablement": "github.copilot.sessionSearch.enabled" - }, - { - "command": "github.copilot.nes.captureExpected.start", - "title": "Record Expected Edit (NES)", - "category": "Copilot" - }, - { - "command": "github.copilot.nes.captureExpected.confirm", - "title": "Confirm and Save Expected Edit Capture", - "category": "Copilot" - }, - { - "command": "github.copilot.nes.captureExpected.abort", - "title": "Cancel Expected Edit Capture", - "category": "Copilot" - }, - { - "command": "github.copilot.nes.captureExpected.submit", - "title": "Submit NES Captures", - "category": "Copilot" - }, - { - "command": "github.copilot.debug.collectWorkspaceIndexDiagnostics", - "title": "%github.copilot.command.collectWorkspaceIndexDiagnostics%", - "category": "Developer" - }, - { - "command": "github.copilot.chat.mcp.setup.check", - "title": "MCP Check: is supported" - }, - { - "command": "github.copilot.chat.mcp.setup.validatePackage", - "title": "MCP Check: validate package" - }, - { - "command": "github.copilot.chat.mcp.setup.flow", - "title": "MCP Check: do prompts" - }, - { - "command": "github.copilot.chat.generateAltText", - "title": "Generate/Refine Alt Text" - }, - { - "command": "github.copilot.chat.notebook.enableFollowCellExecution", - "title": "Enable Follow Cell Execution from Chat", - "shortTitle": "Follow", - "icon": "$(pinned)" - }, - { - "command": "github.copilot.chat.notebook.disableFollowCellExecution", - "title": "Disable Follow Cell Execution from Chat", - "shortTitle": "Unfollow", - "icon": "$(pinned-dirty)" - }, - { - "command": "github.copilot.cloud.resetWorkspaceConfirmations", - "title": "%github.copilot.command.resetCloudAgentWorkspaceConfirmations%" - }, - { - "command": "github.copilot.cloud.sessions.openInBrowser", - "title": "%github.copilot.command.openCopilotAgentSessionsInBrowser%", - "icon": "$(link-external)" - }, - { - "command": "github.copilot.cloud.sessions.proxy.closeChatSessionPullRequest", - "title": "%github.copilot.command.closeChatSessionPullRequest.title%" - }, - { - "command": "github.copilot.cloud.sessions.installPRExtension", - "title": "%github.copilot.command.installPRExtension.title%", - "icon": "$(extensions)" - }, - { - "command": "github.copilot.chat.openSuggestionsPanel", - "title": "Open Completions Panel", - "enablement": "github.copilot.extensionUnification.activated && !isWeb", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.toggleStatusMenu", - "title": "Open Status Menu", - "enablement": "github.copilot.extensionUnification.activated", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.completions.disable", - "title": "Disable Inline Suggestions", - "enablement": "github.copilot.extensionUnification.activated && github.copilot.activated && config.editor.inlineSuggest.enabled && github.copilot.completions.enabled", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.completions.enable", - "title": "Enable Inline Suggestions", - "enablement": "github.copilot.extensionUnification.activated && github.copilot.activated && !(config.editor.inlineSuggest.enabled && github.copilot.completions.enabled)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.completions.toggle", - "title": "Toggle (Enable/Disable) Inline Suggestions", - "enablement": "github.copilot.extensionUnification.activated && github.copilot.activated", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.openModelPicker", - "title": "Change Completions Model", - "category": "GitHub Copilot", - "enablement": "github.copilot.extensionUnification.activated && !isWeb && github.copilot.completions.hasMultipleModels" - }, - { - "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges", - "title": "%github.copilot.command.applyCopilotCLIAgentSessionChanges%", - "enablement": "!chatSessionRequestInProgress", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges.apply", - "title": "%github.copilot.chat.applyCopilotCLIAgentSessionChanges.apply%", - "enablement": "!chatSessionRequestInProgress", - "icon": "$(git-stash-pop)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.merge", - "title": "%github.copilot.chat.mergeCopilotCLIAgentSessionChanges.merge%", - "enablement": "!chatSessionRequestInProgress", - "icon": "$(git-merge)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.mergeAndSync", - "title": "%github.copilot.chat.mergeCopilotCLIAgentSessionChanges.mergeAndSync%", - "enablement": "!chatSessionRequestInProgress", - "icon": "$(sync)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.sessions.commit", - "title": "%github.copilot.command.sessions.commit%", - "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", - "icon": "$(git-commit)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.sessions.commitAndSync", - "title": "%github.copilot.command.sessions.commitAndSync%", - "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", - "icon": "$(sync)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.sessions.sync", - "title": "%github.copilot.command.sessions.sync%", - "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", - "icon": "$(sync)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.createPullRequestCopilotCLIAgentSession.createPR", - "title": "%github.copilot.chat.createPullRequestCopilotCLIAgentSession.createPR%", - "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", - "icon": "$(git-pull-request-create)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.createDraftPullRequestCopilotCLIAgentSession.createDraftPR", - "title": "%github.copilot.chat.createDraftPullRequestCopilotCLIAgentSession.createDraftPR%", - "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", - "icon": "$(git-pull-request-draft)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.sessions.discardChanges", - "title": "%github.copilot.command.sessions.discardChanges%", - "enablement": "!chatSessionRequestInProgress", - "icon": "$(discard)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.copilotCLI.addFileReference", - "title": "%github.copilot.command.chat.copilotCLI.addFileReference%", - "enablement": "github.copilot.chat.copilotCLI.hasSession", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.chat.copilotCLI.addSelection", - "title": "%github.copilot.command.chat.copilotCLI.addSelection%", - "enablement": "github.copilot.chat.copilotCLI.hasSession", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.chat.copilotCLI.acceptDiff", - "title": "%github.copilot.command.chat.copilotCLI.acceptDiff%", - "enablement": "github.copilot.chat.copilotCLI.hasActiveDiff", - "icon": "$(check)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.chat.copilotCLI.rejectDiff", - "title": "%github.copilot.command.chat.copilotCLI.rejectDiff%", - "enablement": "github.copilot.chat.copilotCLI.hasActiveDiff", - "icon": "$(close)", - "category": "Copilot CLI" - }, - { - "command": "github.copilot.chat.checkoutPullRequestReroute", - "title": "%github.copilot.command.checkoutPullRequestReroute.title%", - "icon": "$(git-pull-request)", - "category": "GitHub Pull Request" - }, - { - "command": "github.copilot.chat.cloudSessions.openRepository", - "title": "%github.copilot.command.cloudSessions.openRepository.title%", - "icon": "$(repo)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.chat.cloudSessions.clearCaches", - "title": "%github.copilot.command.cloudSessions.clearCaches.title%", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.sessions.refreshChanges", - "title": "%github.copilot.command.sessions.refreshChanges%", - "icon": "$(refresh)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.sessions.initializeRepository", - "title": "%github.copilot.command.sessions.initializeRepository%", - "enablement": "!chatSessionRequestInProgress", - "icon": "$(repo)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.claude.sessions.commit", - "title": "%github.copilot.command.claude.sessions.commit%", - "enablement": "!chatSessionRequestInProgress", - "icon": "$(git-commit)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.claude.sessions.commitAndSync", - "title": "%github.copilot.command.claude.sessions.commitAndSync%", - "enablement": "!chatSessionRequestInProgress", - "icon": "$(sync)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.claude.sessions.sync", - "title": "%github.copilot.command.claude.sessions.sync%", - "enablement": "!chatSessionRequestInProgress", - "icon": "$(sync)", - "category": "GitHub Copilot" - }, - { - "command": "github.copilot.claude.sessions.initializeRepository", - "title": "%github.copilot.command.claude.sessions.initializeRepository%", - "enablement": "!chatSessionRequestInProgress", - "icon": "$(repo)", - "category": "GitHub Copilot" - } - ], - "configuration": [ - { - "title": "GitHub Copilot Chat", - "id": "stable", - "properties": { - "github.copilot.chat.backgroundAgent.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.backgroundAgent.enabled%" - }, - "github.copilot.chat.cloudAgent.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cloudAgent.enabled%" - }, - "github.copilot.chat.codeGeneration.useInstructionFiles": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.codeGeneration.useInstructionFiles%" - }, - "github.copilot.editor.enableCodeActions": { - "type": "boolean", - "default": true, - "description": "%github.copilot.config.enableCodeActions%" - }, - "github.copilot.renameSuggestions.triggerAutomatically": { - "type": "boolean", - "default": true, - "description": "%github.copilot.config.renameSuggestions.triggerAutomatically%" - }, - "github.copilot.chat.localeOverride": { - "type": "string", - "enum": [ - "auto", - "en", - "fr", - "it", - "de", - "es", - "ru", - "zh-CN", - "zh-TW", - "ja", - "ko", - "cs", - "pt-br", - "tr", - "pl" - ], - "enumDescriptions": [ - "Use VS Code's configured display language", - "English", - "français", - "italiano", - "Deutsch", - "español", - "русский", - "中文(简体)", - "中文(繁體)", - "日本語", - "한국어", - "čeština", - "português", - "Türkçe", - "polski" - ], - "default": "auto", - "markdownDescription": "%github.copilot.config.localeOverride%" - }, - "github.copilot.chat.terminalChatLocation": { - "type": "string", - "default": "chatView", - "markdownDescription": "%github.copilot.config.terminalChatLocation%", - "markdownEnumDescriptions": [ - "%github.copilot.config.terminalChatLocation.chatView%", - "%github.copilot.config.terminalChatLocation.quickChat%", - "%github.copilot.config.terminalChatLocation.terminal%" - ], - "enum": [ - "chatView", - "quickChat", - "terminal" - ] - }, - "github.copilot.chat.scopeSelection": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.scopeSelection%" - }, - "github.copilot.chat.useProjectTemplates": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.useProjectTemplates%" - }, - "github.copilot.nextEditSuggestions.enabled": { - "type": "boolean", - "default": true, - "tags": [ - "nextEditSuggestions", - "onExp" - ], - "markdownDescription": "%github.copilot.nextEditSuggestions.enabled%", - "scope": "language-overridable" - }, - "github.copilot.nextEditSuggestions.extendedRange": { - "type": "boolean", - "default": false, - "tags": [ - "nextEditSuggestions", - "onExp" - ], - "markdownDescription": "%github.copilot.nextEditSuggestions.extendedRange%" - }, - "github.copilot.nextEditSuggestions.fixes": { - "type": "boolean", - "default": true, - "tags": [ - "nextEditSuggestions", - "onExp" - ], - "markdownDescription": "%github.copilot.nextEditSuggestions.fixes%", - "scope": "language-overridable" - }, - "github.copilot.nextEditSuggestions.allowWhitespaceOnlyChanges": { - "type": "boolean", - "default": true, - "tags": [ - "nextEditSuggestions", - "onExp" - ], - "markdownDescription": "%github.copilot.nextEditSuggestions.allowWhitespaceOnlyChanges%", - "scope": "language-overridable" - }, - "github.copilot.chat.agent.autoFix": { - "type": "boolean", - "default": false, - "description": "%github.copilot.config.autoFix%", - "tags": [ - "onExp" - ] - }, - "github.copilot.chat.rateLimitAutoSwitchToAuto": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.rateLimitAutoSwitchToAuto%", - "tags": [ - "onExp" - ] - }, - "github.copilot.chat.customInstructionsInSystemMessage": { - "type": "boolean", - "default": true, - "description": "%github.copilot.config.customInstructionsInSystemMessage%" - }, - "github.copilot.chat.organizationCustomAgents.enabled": { - "type": "boolean", - "default": true, - "description": "%github.copilot.config.organizationCustomAgents.enabled%" - }, - "github.copilot.chat.organizationInstructions.enabled": { - "type": "boolean", - "default": true, - "description": "%github.copilot.config.organizationInstructions.enabled%" - }, - "github.copilot.chat.additionalReadAccessPaths": { - "type": "array", - "default": [], - "items": { - "type": "string" - }, - "markdownDescription": "%github.copilot.config.additionalReadAccessPaths%", - "scope": "window" - }, - "github.copilot.chat.agent.currentEditorContext.enabled": { - "type": "boolean", - "default": true, - "description": "%github.copilot.config.agent.currentEditorContext.enabled%" - }, - "github.copilot.enable": { - "type": "object", - "scope": "window", - "default": { - "*": true, - "plaintext": false, - "markdown": false, - "scminput": false - }, - "additionalProperties": { - "type": "boolean" - }, - "markdownDescription": "Enable or disable auto triggering of Copilot completions for specified [languages](https://code.visualstudio.com/docs/languages/identifiers). You can still trigger suggestions manually using `Alt + \\`", - "agentsWindow": { - "default": { - "markdown": true, - "plaintext": true - } - } - }, - "github.copilot.selectedCompletionModel": { - "type": "string", - "default": "", - "markdownDescription": "The currently selected completion model ID. To select from a list of available models, use the __\"Change Completions Model\"__ command or open the model picker (from the Copilot menu in the VS Code title bar, select __\"Configure Code Completions\"__ then __\"Change Completions Model\"__. The value must be a valid model ID. An empty value indicates that the default model will be used." - }, - "github.copilot.chat.claudeAgent.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.claudeAgent.enabled%" - }, - "github.copilot.chat.claudeAgent.allowDangerouslySkipPermissions": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.claudeAgent.allowDangerouslySkipPermissions%" - }, - "github.copilot.chat.reviewAgent.enabled": { - "type": "boolean", - "default": true, - "description": "%github.copilot.config.reviewAgent.enabled%" - }, - "github.copilot.chat.reviewSelection.enabled": { - "type": "boolean", - "default": true, - "description": "%github.copilot.config.reviewSelection.enabled%" - }, - "github.copilot.chat.reviewSelection.instructions": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "markdownDescription": "%github.copilot.config.reviewSelection.instruction.file%", - "properties": { - "file": { - "type": "string", - "examples": [ - ".copilot-review-instructions.md" - ] - }, - "language": { - "type": "string" - } - }, - "examples": [ - { - "file": ".copilot-review-instructions.md" - } - ], - "required": [ - "file" - ] - }, - { - "type": "object", - "markdownDescription": "%github.copilot.config.reviewSelection.instruction.text%", - "properties": { - "text": { - "type": "string", - "examples": [ - "Use underscore for field names." - ] - }, - "language": { - "type": "string" - } - }, - "required": [ - "text" - ], - "examples": [ - { - "text": "Use underscore for field names." - }, - { - "text": "Resolve all TODO tasks." - } - ] - } - ] - }, - "default": [], - "markdownDescription": "%github.copilot.config.reviewSelection.instructions%", - "examples": [ - [ - { - "file": ".copilot-review-instructions.md" - }, - { - "text": "Resolve all TODO tasks." - } - ] - ] - }, - "github.copilot.chat.anthropic.useMessagesApi": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.useMessagesApi%", - "tags": [ - "onExp" - ] - } - } - }, - { - "id": "preview", - "properties": { - "github.copilot.chat.claudeAgent.allowAutoPermissions": { - "type": "boolean", - "default": false, - "tags": [ - "preview", - "onExp" - ], - "markdownDescription": "%github.copilot.config.claudeAgent.allowAutoPermissions%" - }, - "github.copilot.chat.copilotDebugCommand.enabled": { - "type": "boolean", - "default": true, - "tags": [ - "preview" - ], - "description": "%github.copilot.chat.copilotDebugCommand.enabled%" - }, - "github.copilot.chat.codesearch.enabled": { - "type": "boolean", - "default": false, - "tags": [ - "preview" - ], - "markdownDescription": "%github.copilot.config.codesearch.enabled%" - }, - "github.copilot.chat.tools.viewImage.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.tools.viewImage.enabled%", - "tags": [ - "preview", - "onExp" - ] - } - } - }, - { - "id": "experimental", - "properties": { - "github.copilot.chat.githubMcpServer.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.githubMcpServer.enabled%", - "tags": [ - "experimental" - ], - "agentsWindow": { - "default": true - } - }, - "github.copilot.chat.githubMcpServer.toolsets": { - "type": "array", - "default": [ - "default" - ], - "markdownDescription": "%github.copilot.config.githubMcpServer.toolsets%", - "items": { - "type": "string" - }, - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.githubMcpServer.readonly": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.githubMcpServer.readonly%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.githubMcpServer.lockdown": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.githubMcpServer.lockdown%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.githubMcpServer.channel": { - "type": "string", - "default": "stable", - "enum": [ - "stable", - "insiders" - ], - "enumDescriptions": [ - "%github.copilot.config.githubMcpServer.channel.stable%", - "%github.copilot.config.githubMcpServer.channel.insiders%" - ], - "markdownDescription": "%github.copilot.config.githubMcpServer.channel%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.cloudAgentBackend.version": { - "type": "string", - "default": "v1", - "enum": [ - "v1", - "v2" - ], - "enumDescriptions": [ - "%github.copilot.config.cloudAgentBackend.version.v1%", - "%github.copilot.config.cloudAgentBackend.version.v2%" - ], - "markdownDescription": "%github.copilot.config.cloudAgentBackend.version%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.switchAgent.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.switchAgent.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.imageUpload.enabled": { - "type": "boolean", - "default": true, - "tags": [ - "experimental", - "onExp" - ], - "markdownDescription": "%github.copilot.config.imageUpload.enabled%" - }, - "github.copilot.chat.codeGeneration.instructions": { - "markdownDeprecationMessage": "%github.copilot.config.codeGeneration.instructions.deprecated%", - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "markdownDescription": "%github.copilot.config.codeGeneration.instruction.file%", - "properties": { - "file": { - "type": "string", - "examples": [ - ".copilot-codeGeneration-instructions.md" - ] - }, - "language": { - "type": "string" - } - }, - "examples": [ - { - "file": ".copilot-codeGeneration-instructions.md" - } - ], - "required": [ - "file" - ] - }, - { - "type": "object", - "markdownDescription": "%github.copilot.config.codeGeneration.instruction.text%", - "properties": { - "text": { - "type": "string", - "examples": [ - "Use underscore for field names." - ] - }, - "language": { - "type": "string" - } - }, - "required": [ - "text" - ], - "examples": [ - { - "text": "Use underscore for field names." - }, - { - "text": "Always add a comment: 'Generated by Copilot'." - } - ] - } - ] - }, - "default": [], - "markdownDescription": "%github.copilot.config.codeGeneration.instructions%", - "examples": [ - [ - { - "file": ".copilot-codeGeneration-instructions.md" - }, - { - "text": "Always add a comment: 'Generated by Copilot'." - } - ] - ], - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.testGeneration.instructions": { - "markdownDeprecationMessage": "%github.copilot.config.testGeneration.instructions.deprecated%", - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "markdownDescription": "%github.copilot.config.experimental.testGeneration.instruction.file%", - "properties": { - "file": { - "type": "string", - "examples": [ - ".copilot-test-instructions.md" - ] - }, - "language": { - "type": "string" - } - }, - "examples": [ - { - "file": ".copilot-test-instructions.md" - } - ], - "required": [ - "file" - ] - }, - { - "type": "object", - "markdownDescription": "%github.copilot.config.experimental.testGeneration.instruction.text%", - "properties": { - "text": { - "type": "string", - "examples": [ - "Use suite and test instead of describe and it." - ] - }, - "language": { - "type": "string" - } - }, - "required": [ - "text" - ], - "examples": [ - { - "text": "Always try uniting related tests in a suite." - } - ] - } - ] - }, - "default": [], - "markdownDescription": "%github.copilot.config.testGeneration.instructions%", - "examples": [ - [ - { - "file": ".copilot-test-instructions.md" - }, - { - "text": "Always try uniting related tests in a suite." - } - ] - ], - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.commitMessageGeneration.instructions": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "markdownDescription": "%github.copilot.config.commitMessageGeneration.instruction.file%", - "properties": { - "file": { - "type": "string", - "examples": [ - ".copilot-commit-message-instructions.md" - ] - } - }, - "examples": [ - { - "file": ".copilot-commit-message-instructions.md" - } - ], - "required": [ - "file" - ] - }, - { - "type": "object", - "markdownDescription": "%github.copilot.config.commitMessageGeneration.instruction.text%", - "properties": { - "text": { - "type": "string", - "examples": [ - "Use conventional commit message format." - ] - } - }, - "required": [ - "text" - ], - "examples": [ - { - "text": "Use conventional commit message format." - } - ] - } - ] - }, - "default": [], - "markdownDescription": "%github.copilot.config.commitMessageGeneration.instructions%", - "examples": [ - [ - { - "file": ".copilot-commit-message-instructions.md" - }, - { - "text": "Use conventional commit message format." - } - ] - ], - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.pullRequestDescriptionGeneration.instructions": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "markdownDescription": "%github.copilot.config.pullRequestDescriptionGeneration.instruction.file%", - "properties": { - "file": { - "type": "string", - "examples": [ - ".copilot-pull-request-description-instructions.md" - ] - } - }, - "examples": [ - { - "file": ".copilot-pull-request-description-instructions.md" - } - ], - "required": [ - "file" - ] - }, - { - "type": "object", - "markdownDescription": "%github.copilot.config.pullRequestDescriptionGeneration.instruction.text%", - "properties": { - "text": { - "type": "string", - "examples": [ - "Include every commit message in the pull request description." - ] - } - }, - "required": [ - "text" - ], - "examples": [ - { - "text": "Include every commit message in the pull request description." - } - ] - } - ] - }, - "default": [], - "markdownDescription": "%github.copilot.config.pullRequestDescriptionGeneration.instructions%", - "examples": [ - [ - { - "file": ".copilot-pull-request-description-instructions.md" - }, - { - "text": "Use conventional commit message format." - } - ] - ], - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.setupTests.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.setupTests.enabled%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.languageContext.typescript.enabled": { - "type": "boolean", - "default": true, - "scope": "resource", - "tags": [ - "experimental", - "onExP" - ], - "markdownDescription": "%github.copilot.chat.languageContext.typescript.enabled%", - "agentsWindow": { - "default": true - } - }, - "github.copilot.chat.languageContext.typescript.items": { - "type": "string", - "enum": [ - "minimal", - "double", - "fillHalf", - "fill" - ], - "default": "double", - "scope": "resource", - "tags": [ - "experimental", - "onExP" - ], - "markdownDescription": "%github.copilot.chat.languageContext.typescript.items%" - }, - "github.copilot.chat.languageContext.typescript.includeDocumentation": { - "type": "boolean", - "default": false, - "scope": "resource", - "tags": [ - "experimental", - "onExP" - ], - "markdownDescription": "%github.copilot.chat.languageContext.typescript.includeDocumentation%" - }, - "github.copilot.chat.languageContext.typescript.cacheTimeout": { - "type": "number", - "default": 500, - "scope": "resource", - "tags": [ - "experimental", - "onExP" - ], - "markdownDescription": "%github.copilot.chat.languageContext.typescript.cacheTimeout%" - }, - "github.copilot.chat.languageContext.fix.typescript.enabled": { - "type": "boolean", - "default": false, - "scope": "resource", - "tags": [ - "experimental", - "onExP" - ], - "markdownDescription": "%github.copilot.chat.languageContext.fix.typescript.enabled%" - }, - "github.copilot.chat.languageContext.inline.typescript.enabled": { - "type": "boolean", - "default": false, - "scope": "resource", - "tags": [ - "experimental", - "onExP" - ], - "markdownDescription": "%github.copilot.chat.languageContext.inline.typescript.enabled%" - }, - "github.copilot.chat.newWorkspaceCreation.enabled": { - "type": "boolean", - "default": true, - "tags": [ - "experimental" - ], - "description": "%github.copilot.config.newWorkspaceCreation.enabled%" - }, - "github.copilot.chat.newWorkspace.useContext7": { - "type": "boolean", - "default": false, - "tags": [ - "experimental" - ], - "markdownDescription": "%github.copilot.config.newWorkspace.useContext7%" - }, - "github.copilot.chat.notebook.followCellExecution.enabled": { - "type": "boolean", - "default": false, - "tags": [ - "experimental" - ], - "description": "%github.copilot.config.notebook.followCellExecution%" - }, - "github.copilot.chat.notebook.enhancedNextEditSuggestions.enabled": { - "type": "boolean", - "default": false, - "tags": [ - "experimental", - "onExp" - ], - "description": "%github.copilot.config.notebook.enhancedNextEditSuggestions%" - }, - "github.copilot.chat.summarizeAgentConversationHistory.enabled": { - "type": "boolean", - "default": true, - "tags": [ - "experimental" - ], - "description": "%github.copilot.config.summarizeAgentConversationHistory.enabled%" - }, - "github.copilot.chat.virtualTools.threshold": { - "type": "number", - "minimum": 0, - "maximum": 128, - "default": 128, - "tags": [ - "experimental" - ], - "markdownDescription": "%github.copilot.config.virtualTools.threshold%" - }, - "github.copilot.chat.alternateGptPrompt.enabled": { - "type": "boolean", - "default": false, - "tags": [ - "experimental" - ], - "description": "%github.copilot.config.alternateGptPrompt.enabled%" - }, - "github.copilot.chat.alternateGeminiModelFPrompt.enabled": { - "type": "boolean", - "default": false, - "tags": [ - "experimental", - "onExp" - ], - "description": "%github.copilot.config.alternateGeminiModelFPrompt.enabled%" - }, - "github.copilot.chat.anthropic.contextEditing.mode": { - "type": "string", - "default": "off", - "markdownDescription": "%github.copilot.config.anthropic.contextEditing.mode%", - "tags": [ - "experimental", - "onExp" - ], - "enum": [ - "off", - "clear-thinking", - "clear-tooluse", - "clear-both" - ] - }, - "github.copilot.chat.responsesApiReasoningSummary": { - "type": "string", - "default": "detailed", - "markdownDescription": "%github.copilot.config.responsesApiReasoningSummary%", - "tags": [ - "experimental", - "onExp" - ], - "enum": [ - "off", - "detailed" - ] - }, - "github.copilot.chat.responsesApiContextManagement.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.responsesApiContextManagement.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.responsesApi.promptCacheKey.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.responsesApi.promptCacheKey.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.updated53CodexPrompt.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.updated53CodexPrompt.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.claude47OpusPrompt.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.claude47OpusPrompt.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.gpt55GetChangedFilesTool.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.gpt55GetChangedFilesTool.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.gpt55ReadFileTool.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.gpt55ReadFileTool.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.gpt55EconomicalSearchAndEdit.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.gpt55EconomicalSearchAndEdit.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.gpt55LargePromptSections.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.gpt55LargePromptSections.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.anthropic.tools.websearch.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.anthropic.tools.websearch.maxUses": { - "type": "number", - "default": 5, - "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.maxUses%", - "minimum": 1, - "maximum": 20, - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.anthropic.tools.websearch.allowedDomains": { - "type": "array", - "default": [], - "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.allowedDomains%", - "items": { - "type": "string" - }, - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.anthropic.tools.websearch.blockedDomains": { - "type": "array", - "default": [], - "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.blockedDomains%", - "items": { - "type": "string" - }, - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.anthropic.tools.websearch.userLocation": { - "type": [ - "object", - "null" - ], - "default": null, - "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.userLocation%", - "properties": { - "city": { - "type": "string", - "description": "City name (e.g., 'San Francisco')" - }, - "region": { - "type": "string", - "description": "State or region (e.g., 'California')" - }, - "country": { - "type": "string", - "description": "ISO country code (e.g., 'US')" - }, - "timezone": { - "type": "string", - "description": "IANA timezone identifier (e.g., 'America/Los_Angeles')" - } - }, - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.completionsFetcher": { - "type": [ - "string", - "null" - ], - "markdownDescription": "%github.copilot.config.completionsFetcher%", - "tags": [ - "experimental", - "onExp" - ], - "enum": [ - "electron-fetch", - "node-fetch" - ] - }, - "github.copilot.chat.nesFetcher": { - "type": [ - "string", - "null" - ], - "markdownDescription": "%github.copilot.config.nesFetcher%", - "tags": [ - "experimental", - "onExp" - ], - "enum": [ - "electron-fetch", - "node-fetch" - ] - }, - "github.copilot.chat.planAgent.additionalTools": { - "type": "array", - "items": { - "type": "string" - }, - "default": [], - "scope": "resource", - "markdownDescription": "%github.copilot.config.planAgent.additionalTools%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.implementAgent.model": { - "type": "string", - "default": "", - "scope": "resource", - "markdownDescription": "%github.copilot.config.implementAgent.model%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.askAgent.additionalTools": { - "type": "array", - "items": { - "type": "string" - }, - "default": [], - "scope": "resource", - "markdownDescription": "%github.copilot.config.askAgent.additionalTools%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.askAgent.model": { - "type": "string", - "default": "", - "scope": "resource", - "markdownDescription": "%github.copilot.config.askAgent.model%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.exploreAgent.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.exploreAgent.enabled%", - "tags": [ - "experimental", - "onExp" - ] - }, - "github.copilot.chat.exploreAgent.model": { - "type": "string", - "default": "", - "scope": "resource", - "markdownDescription": "%github.copilot.config.exploreAgent.model%", - "tags": [ - "experimental" - ] - }, - "github.copilot.chat.localIndex.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.localIndex.enabled%", - "tags": [ - "experimental", - "onExp" - ] - } - } - }, - { - "id": "advanced", - "properties": { - "github.copilot.chat.inlineEdits.xtabProvider.modelConfiguration": { - "type": [ - "object", - "null" - ], - "default": null, - "markdownDescription": "Advanced model configuration for the next edit suggestions xtab provider.\n\n**Note**: This is an advanced setting.", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.reasoningEffortOverride": { - "type": [ - "string", - "null" - ], - "default": null, - "markdownDescription": "Overrides the reasoning/thinking effort sent to model APIs. The configured value must match a reasoning-effort value supported by the selected model or endpoint (for example, `low`, `medium`, `high`, or other model-specific values). Used by evals.\n\n**Note**: This is an advanced debugging setting.", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.anthropic.promptCaching.extendedTtl": { - "type": "boolean", - "default": false, - "tags": [ - "advanced", - "experimental", - "onExp" - ], - "description": "%github.copilot.config.anthropic.promptCaching.extendedTtl%" - }, - "github.copilot.chat.anthropic.promptCaching.extendedTtlMessages": { - "type": "boolean", - "default": false, - "tags": [ - "advanced", - "experimental", - "onExp" - ], - "description": "%github.copilot.config.anthropic.promptCaching.extendedTtlMessages%" - }, - "github.copilot.chat.modelCapabilityOverrides": { - "type": "object", - "default": {}, - "markdownDescription": "%github.copilot.config.modelCapabilityOverrides%", - "additionalProperties": { - "type": "object", - "properties": { - "family": { - "type": "string", - "description": "Alias the model's family for capability routing (e.g. 'claude-opus-4.7')." - } - }, - "additionalProperties": false - }, - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.freezeCustomizationsIndex": { - "type": "boolean", - "default": true, - "tags": [ - "advanced", - "experimental", - "onExp" - ], - "description": "%github.copilot.config.freezeCustomizationsIndex%" - }, - "github.copilot.chat.installExtensionSkill.enabled": { - "type": "boolean", - "default": false, - "tags": [ - "advanced", - "experimental", - "onExp" - ], - "description": "%github.copilot.config.installExtensionSkill.enabled%" - }, - "github.copilot.chat.debug.promptOverrideString": { - "type": [ - "string", - "null" - ], - "default": null, - "markdownDescription": "YAML string that overrides the system prompt and/or tool descriptions sent to the model. When both this setting and `github.copilot.chat.debug.promptOverrideFile` are configured, this setting takes precedence.\n\n**Note**: This is an advanced debugging setting.", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.debug.promptOverrideFile": { - "type": [ - "string", - "null" - ], - "default": null, - "markdownDescription": "Path to a YAML file that overrides the system prompt and/or tool descriptions sent to the model.\n\n**Note**: This is an advanced debugging setting.", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.edits.gemini3MultiReplaceString": { - "type": "boolean", - "default": false, - "markdownDescription": "Enable the modern `multi_replace_string_in_file` edit tool when generating edits with Gemini 3 models.", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.edits.batchReplaceStringDescriptions": { - "type": "boolean", - "default": false, - "markdownDescription": "Update tool descriptions to promote `multi_replace_string_in_file` as the primary multi-edit tool.", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.projectLabels.expanded": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.projectLabels.expanded%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.projectLabels.chat": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.projectLabels.chat%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.projectLabels.inline": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.projectLabels.inline%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.workspace.maxLocalIndexSize": { - "type": "number", - "default": 100000, - "markdownDescription": "%github.copilot.config.workspace.maxLocalIndexSize%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.workspace.enableCodeSearch": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.workspace.enableCodeSearch%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.workspace.preferredEmbeddingsModel": { - "type": "string", - "default": "", - "markdownDescription": "%github.copilot.config.workspace.preferredEmbeddingsModel%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.workspace.prototypeAdoCodeSearchEndpointOverride": { - "type": "string", - "default": "", - "markdownDescription": "%github.copilot.config.workspace.prototypeAdoCodeSearchEndpointOverride%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.feedback.onChange": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.feedback.onChange%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.review.intent": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.review.intent%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.notebook.summaryExperimentEnabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.notebook.summaryExperimentEnabled%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.notebook.variableFilteringEnabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.notebook.variableFilteringEnabled%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.notebook.alternativeFormat": { - "type": "string", - "default": "xml", - "enum": [ - "xml", - "markdown" - ], - "markdownDescription": "%github.copilot.config.notebook.alternativeFormat%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.notebook.alternativeNESFormat.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.notebook.alternativeNESFormat.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.debugTerminalCommandPatterns": { - "type": "array", - "default": [], - "items": { - "type": "string" - }, - "markdownDescription": "%github.copilot.config.debugTerminalCommandPatterns%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.localWorkspaceRecording.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.localWorkspaceRecording.enabled%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.editRecording.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.editRecording.enabled%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.inlineChat.reasoningEffort": { - "type": "string", - "default": "low", - "enum": [ - "none", - "minimal", - "low", - "medium", - "high" - ], - "markdownDescription": "%github.copilot.config.inlineChat.reasoningEffort%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.inlineChat.enableThinking": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.inlineChat.enableThinking%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.debug.requestLogger.maxEntries": { - "type": "number", - "default": 100, - "markdownDescription": "%github.copilot.config.debug.requestLogger.maxEntries%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.inlineEdits.diagnosticsContextProvider.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.inlineEdits.diagnosticsContextProvider.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.inlineEdits.chatSessionContextProvider.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.inlineEdits.chatSessionContextProvider.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.codesearch.agent.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.codesearch.agent.enabled%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.agent.temperature": { - "type": [ - "number", - "null" - ], - "markdownDescription": "%github.copilot.config.agent.temperature%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.agent.omitFileAttachmentContents": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.agent.omitFileAttachmentContents%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.agent.backgroundTodoAgent.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.agent.backgroundTodoAgent.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.agent.largeToolResultsToDisk.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.agent.largeToolResultsToDisk.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.agent.largeToolResultsToDisk.thresholdBytes": { - "type": "number", - "default": 8192, - "markdownDescription": "%github.copilot.config.agent.largeToolResultsToDisk.thresholdBytes%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.instantApply.shortContextModelName": { - "type": "string", - "default": "gpt-4o-instant-apply-full-ft-v66-short", - "markdownDescription": "%github.copilot.config.instantApply.shortContextModelName%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.instantApply.shortContextLimit": { - "type": "number", - "default": 8000, - "markdownDescription": "%github.copilot.config.instantApply.shortContextLimit%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.enableUserPreferences": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.enableUserPreferences%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.skillTool.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.skill.enabled%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.getChangedFilesTool.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.getChangedFilesTool.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.executionSubagent.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.executionSubagent.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.executionSubagent.model": { - "type": "string", - "default": "", - "markdownDescription": "%github.copilot.config.executionSubagent.model%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.executionSubagent.useAgenticProxy": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.executionSubagent.useAgenticProxy%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.executionSubagent.toolCallLimit": { - "type": "number", - "default": 10, - "markdownDescription": "%github.copilot.config.executionSubagent.toolCallLimit%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.summarizeAgentConversationHistoryThreshold": { - "type": [ - "number", - "null" - ], - "markdownDescription": "%github.copilot.config.summarizeAgentConversationHistoryThreshold%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.agentHistorySummarizationMode": { - "type": [ - "string", - "null" - ], - "markdownDescription": "%github.copilot.config.agentHistorySummarizationMode%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.useResponsesApiTruncation": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.useResponsesApiTruncation%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.omitBaseAgentInstructions": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.omitBaseAgentInstructions%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.promptFileContextProvider.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.promptFileContextProvider.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.tools.defaultToolsGrouped": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.tools.defaultToolsGrouped%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.gpt5AlternativePatch": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.gpt5AlternativePatch%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.inlineEdits.triggerOnEditorChangeAfterSeconds": { - "type": [ - "number", - "null" - ], - "default": 10, - "markdownDescription": "%github.copilot.config.inlineEdits.triggerOnEditorChangeAfterSeconds%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.inlineEdits.nextCursorPrediction.displayLine": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.inlineEdits.nextCursorPrediction.displayLine%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.inlineEdits.nextCursorPrediction.currentFileMaxTokens": { - "type": "number", - "default": 3000, - "markdownDescription": "%github.copilot.config.inlineEdits.nextCursorPrediction.currentFileMaxTokens%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.inlineEdits.renameSymbolSuggestions": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.inlineEdits.renameSymbolSuggestions%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.nextEditSuggestions.preferredModel": { - "type": "string", - "default": "none", - "markdownDescription": "%github.copilot.config.nextEditSuggestions.preferredModel%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.nextEditSuggestions.eagerness": { - "type": "string", - "default": "auto", - "enum": [ - "auto", - "low", - "medium", - "high" - ], - "enumItemLabels": [ - "%github.copilot.config.nextEditSuggestions.eagerness.auto.label%", - "%github.copilot.config.nextEditSuggestions.eagerness.low.label%", - "%github.copilot.config.nextEditSuggestions.eagerness.medium.label%", - "%github.copilot.config.nextEditSuggestions.eagerness.high.label%" - ], - "enumDescriptions": [ - "%github.copilot.config.nextEditSuggestions.eagerness.auto%", - "%github.copilot.config.nextEditSuggestions.eagerness.low%", - "%github.copilot.config.nextEditSuggestions.eagerness.medium%", - "%github.copilot.config.nextEditSuggestions.eagerness.high%" - ], - "markdownDescription": "%github.copilot.config.nextEditSuggestions.eagerness%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.cli.mcp.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.mcp.enabled%", - "tags": [ - "advanced", - "experimental" - ], - "agentsWindow": { - "default": true - } - }, - "github.copilot.chat.cli.branchSupport.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.cli.branchSupport.enabled%", - "tags": [ - "advanced" - ], - "agentsWindow": { - "default": true - } - }, - "github.copilot.chat.cli.showExternalSessions": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.showExternalSessions%", - "tags": [ - "advanced" - ], - "agentsWindow": { - "default": false - } - }, - "github.copilot.chat.cli.planExitMode.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.planExitMode.enabled%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.cli.autoModel.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.cli.autoModel.enabled%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.agent.modelDetails.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.chat.agent.modelDetails.enabled%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.cli.planCommand.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.planCommand.enabled%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.cli.lazyLoadSessionItem.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.lazyLoadSessionItem.enabled%", - "tags": [ - "advanced" - ], - "agentsWindow": { - "default": false - } - }, - "github.copilot.chat.cli.aiGenerateBranchNames.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.aiGenerateBranchNames.enabled%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.cli.forkSessions.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.forkSessions.enabled%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.cli.isolationOption.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.isolationOption.enabled%", - "tags": [ - "advanced" - ], - "agentsWindow": { - "default": true - } - }, - "github.copilot.chat.cli.autoCommit.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.autoCommit.enabled%", - "tags": [ - "advanced", - "experimental" - ], - "agentsWindow": { - "default": false - } - }, - "github.copilot.chat.cli.sessionController.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.cli.sessionController.enabled%", - "tags": [ - "advanced" - ], - "agentsWindow": { - "default": false, - "readOnly": true - } - }, - "github.copilot.chat.cli.thinkingEffort.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.thinkingEffort.enabled%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.cli.sessionControllerForSessionsApp.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.cli.sessionControllerForSessionsApp.enabled%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.cli.terminalLinks.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.terminalLinks.enabled%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.cli.remote.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.cli.remote.enabled%", - "tags": [ - "advanced" - ], - "agentsWindow": { - "default": false - } - }, - "github.copilot.chat.searchSubagent.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.searchSubagent.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.searchSubagent.useAgenticProxy": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.searchSubagent.useAgenticProxy%", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.searchSubagent.model": { - "type": "string", - "default": "", - "markdownDescription": "%github.copilot.config.searchSubagent.model%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.searchSubagent.toolCallLimit": { - "type": "number", - "default": 4, - "markdownDescription": "%github.copilot.config.searchSubagent.toolCallLimit%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.searchSubagent.thoroughnessEnabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.searchSubagent.thoroughnessEnabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.agentDebugLog.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.chat.agentDebugLog.enabled%", - "deprecationMessage": "%github.copilot.config.chat.agentDebugLog.enabled.deprecated%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.agentDebugLog.fileLogging.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "%github.copilot.config.chat.agentDebugLog.fileLogging.enabled%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.agentDebugLog.fileLogging.flushIntervalMs": { - "type": "number", - "default": 4000, - "minimum": 2000, - "markdownDescription": "%github.copilot.config.chat.agentDebugLog.fileLogging.flushIntervalMs%", - "tags": [ - "advanced", - "experimental" - ] - }, - "github.copilot.chat.agentDebugLog.fileLogging.maxRetainedSessionLogs": { - "type": "number", - "default": 50, - "minimum": 1, - "markdownDescription": "%github.copilot.config.chat.agentDebugLog.fileLogging.maxRetainedSessionLogs%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.agentDebugLog.fileLogging.maxSessionLogSizeMB": { - "type": "number", - "default": 100, - "minimum": 1, - "markdownDescription": "%github.copilot.config.chat.agentDebugLog.fileLogging.maxSessionLogSizeMB%", - "tags": [ - "advanced", - "experimental", - "onExp" - ] - }, - "github.copilot.chat.otel.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "Enable OpenTelemetry trace/metric/log emission for Copilot Chat operations. Env var `COPILOT_OTEL_ENABLED` takes precedence. Requires window reload.", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.otel.exporterType": { - "type": "string", - "enum": [ - "otlp-grpc", - "otlp-http", - "console", - "file" - ], - "default": "otlp-http", - "markdownDescription": "OTel exporter type for Copilot Chat telemetry. Requires window reload.", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.otel.otlpEndpoint": { - "type": "string", - "default": "http://localhost:4318", - "markdownDescription": "OTLP collector endpoint URL for Copilot Chat OTel data. Env var `OTEL_EXPORTER_OTLP_ENDPOINT` takes precedence. Requires window reload.", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.otel.captureContent": { - "type": "boolean", - "default": false, - "markdownDescription": "Capture input/output messages, system instructions, and tool definitions in OTel telemetry. **Contains potentially sensitive data.** Env var `COPILOT_OTEL_CAPTURE_CONTENT` takes precedence. Requires window reload.", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.otel.maxAttributeSizeChars": { - "type": "integer", - "default": 0, - "minimum": 0, - "markdownDescription": "Maximum size **in characters** for free-form OTel content attributes (prompts, responses, tool arguments/results, hook input/output). `0` (the default) disables truncation so backends without per-attribute size limits receive full JSON payloads. Set to a positive value when your OTel backend caps attribute size — consult your backend's documentation for its per-attribute limit. Truncated values are suffixed with `...[truncated, original N chars]`. Env var `COPILOT_OTEL_MAX_ATTRIBUTE_SIZE_CHARS` takes precedence. Requires window reload.", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.otel.outfile": { - "type": "string", - "default": "", - "markdownDescription": "File path for file-based OTel exporter output (JSON-lines). When set, overrides exporter type to `file`. Requires window reload.", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.otel.dbSpanExporter.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "Enable SQLite DB span exporter. Persists OTel spans to a local SQLite database. Automatically enables OTel when set to true. Requires window reload.", - "tags": [ - "advanced" - ] - }, - "github.copilot.chat.workspace.codeSearchExternalIngest.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "%github.copilot.config.workspace.codeSearchExternalIngest.enabled%", - "tags": [ - "advanced", - "onExp" - ] - } - } - } - ], - "submenus": [ - { - "id": "copilot/reviewComment/additionalActions/applyAndNext", - "label": "%github.copilot.submenu.reviewComment.applyAndNext.label%" - }, - { - "id": "copilot/reviewComment/additionalActions/discardAndNext", - "label": "%github.copilot.submenu.reviewComment.discardAndNext.label%" - }, - { - "id": "copilot/reviewComment/additionalActions/discard", - "label": "%github.copilot.submenu.reviewComment.discard.label%" - }, - { - "id": "github.copilot.chat.debug.filter", - "label": "Filter", - "icon": "$(filter)" - }, - { - "id": "github.copilot.chat.debug.exportAllPromptLogsAsJson", - "label": "Export All Logs as JSON", - "icon": "$(file-export)" - } - ], - "menus": { - "editor/title": [ - { - "command": "github.copilot.debug.generateInlineEditTests", - "when": "resourceScheme == 'ccreq'" - }, - { - "command": "github.copilot.chat.notebook.enableFollowCellExecution", - "when": "config.github.copilot.chat.notebook.followCellExecution.enabled && !github.copilot.notebookFollowInSessionEnabled && github.copilot.notebookAgentModeUsage && !config.notebook.globalToolbar", - "group": "navigation@10" - }, - { - "command": "github.copilot.chat.notebook.disableFollowCellExecution", - "when": "config.github.copilot.chat.notebook.followCellExecution.enabled && github.copilot.notebookFollowInSessionEnabled && github.copilot.notebookAgentModeUsage && !config.notebook.globalToolbar", - "group": "navigation@10" - }, - { - "command": "github.copilot.chat.copilotCLI.acceptDiff", - "group": "navigation@1", - "when": "github.copilot.chat.copilotCLI.hasActiveDiff" - }, - { - "command": "github.copilot.chat.copilotCLI.rejectDiff", - "group": "navigation@2", - "when": "github.copilot.chat.copilotCLI.hasActiveDiff" - } - ], - "editor/title/context": [ - { - "command": "github.copilot.chat.copilotCLI.addFileReference", - "group": "copilot", - "when": "github.copilot.chat.copilotCLI.hasSession && !inOutput && resourceScheme != 'vscode-webview' && resourceScheme != 'webview-panel'" - } - ], - "explorer/context": [ - { - "command": "github.copilot.chat.copilotCLI.addFileReference", - "group": "copilot", - "when": "github.copilot.chat.copilotCLI.hasSession && !explorerResourceIsFolder" - } - ], - "editor/context": [ - { - "command": "github.copilot.chat.fix", - "when": "!github.copilot.interactiveSession.disabled && chatSetupCompleted && !editorReadonly && editorSelectionHasDiagnostics", - "group": "1_chat@4" - }, - { - "command": "github.copilot.chat.explain", - "when": "!github.copilot.interactiveSession.disabled && chatSetupCompleted", - "group": "1_chat@5" - }, - { - "command": "github.copilot.chat.review", - "when": "config.github.copilot.chat.reviewSelection.enabled && !github.copilot.interactiveSession.disabled && chatSetupCompleted && resourceScheme != 'vscode-chat-code-block'", - "group": "1_chat@6" - }, - { - "command": "github.copilot.chat.copilotCLI.addFileReference", - "group": "copilot", - "when": "github.copilot.chat.copilotCLI.hasSession && !inOutput && resourceScheme != 'vscode-webview' && resourceScheme != 'webview-panel'" - }, - { - "command": "github.copilot.chat.copilotCLI.addSelection", - "group": "copilot", - "when": "github.copilot.chat.copilotCLI.hasSession && editorHasSelection && !inOutput && resourceScheme != 'vscode-webview' && resourceScheme != 'webview-panel'" - } - ], - "chat/editor/inlineGutter": [ - { - "command": "github.copilot.chat.explain", - "when": "!github.copilot.interactiveSession.disabled && editor.hasSelection && !inlineChatFileBelongsToChat", - "group": "2_chat@2" - }, - { - "command": "github.copilot.chat.review", - "when": "!github.copilot.interactiveSession.disabled && editor.hasSelection && config.github.copilot.chat.reviewSelection.enabled && !inlineChatFileBelongsToChat", - "group": "2_chat@3" - } - ], - "chat/input/editing/sessionToolbar": [ - { - "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges.apply", - "when": "chatSessionType == copilotcli && workbenchState != empty && !isSessionsWindow", - "group": "navigation@0" - }, - { - "command": "github.copilot.chat.checkoutPullRequestReroute", - "when": "chatSessionType == copilot-cloud-agent && !github.vscode-pull-request-github.activated && gitOpenRepositoryCount != 0", - "group": "navigation@0" - } - ], - "agents/changes/actions/primary": [ - { - "command": "github.copilot.sessions.initializeRepository", - "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == workspace && !sessions.hasGitRepository && !sessions.isAgentHostSession", - "group": "0_init@1" - }, - { - "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.merge", - "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == worktree && sessions.hasGitRepository && !sessions.isMergeBaseBranchProtected && !sessions.hasPullRequest && (sessions.hasUncommittedChanges || sessions.hasOutgoingChanges) && !sessions.isAgentHostSession", - "group": "1_merge@1" - }, - { - "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.mergeAndSync", - "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == worktree && sessions.hasGitRepository && !sessions.isMergeBaseBranchProtected && !sessions.hasPullRequest && (sessions.hasUncommittedChanges || sessions.hasOutgoingChanges) && !sessions.isAgentHostSession", - "group": "1_merge@2" - }, - { - "command": "github.copilot.chat.createPullRequestCopilotCLIAgentSession.createPR", - "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == worktree && sessions.hasGitRepository && sessions.hasGitHubRemote && !sessions.hasPullRequest && sessions.hasBranchChanges && !sessions.isAgentHostSession", - "group": "2_pull_request@1" - }, - { - "command": "github.copilot.chat.createDraftPullRequestCopilotCLIAgentSession.createDraftPR", - "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == worktree && sessions.hasGitRepository && sessions.hasGitHubRemote && !sessions.hasPullRequest && sessions.hasBranchChanges && !sessions.isAgentHostSession", - "group": "2_pull_request@2" - }, - { - "command": "github.copilot.sessions.commit", - "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.hasGitRepository && sessions.hasUncommittedChanges && !sessions.isAgentHostSession", - "group": "3_commit@1" - }, - { - "command": "github.copilot.sessions.commitAndSync", - "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.hasGitRepository && sessions.hasUncommittedChanges && !sessions.isAgentHostSession", - "group": "3_commit@2" - }, - { - "command": "github.copilot.sessions.sync", - "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.hasGitRepository && sessions.hasUpstream && !sessions.hasUncommittedChanges && (sessions.hasIncomingChanges || sessions.hasOutgoingChanges) && !sessions.isAgentHostSession", - "group": "4_sync@1" - }, - { - "command": "github.copilot.claude.sessions.initializeRepository", - "when": "chatSessionType == claude-code && isSessionsWindow && !sessions.hasGitRepository", - "group": "init@1" - }, - { - "command": "github.copilot.claude.sessions.commit", - "when": "chatSessionType == claude-code && isSessionsWindow && sessions.hasGitRepository && sessions.hasUncommittedChanges", - "group": "commit@1" - }, - { - "command": "github.copilot.claude.sessions.commitAndSync", - "when": "chatSessionType == claude-code && isSessionsWindow && sessions.hasGitRepository && sessions.hasUncommittedChanges && sessions.hasUpstream", - "group": "commit@2" - }, - { - "command": "github.copilot.claude.sessions.sync", - "when": "chatSessionType == claude-code && isSessionsWindow && sessions.hasGitRepository && !sessions.hasUncommittedChanges && sessions.hasUpstream", - "group": "sync@1" - } - ], - "agents/change/inline": [ - { - "command": "github.copilot.sessions.discardChanges", - "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.hasGitRepository && !isActiveSessionArchived && !sessions.isAgentHostSession", - "group": "navigation@2" - } - ], - "chat/contextUsage/actions": [ - { - "command": "github.copilot.chat.compact" - } - ], - "chat/newSession": [ - { - "command": "github.copilot.cli.newSession", - "group": "4_recommendations@0" - } - ], - "testing/item/result": [ - { - "command": "github.copilot.tests.fixTestFailure.fromInline", - "when": "testResultState == failed && !testResultOutdated", - "group": "inline@2" - } - ], - "testing/item/context": [ - { - "command": "github.copilot.tests.fixTestFailure.fromInline", - "when": "testResultState == failed && !testResultOutdated", - "group": "inline@2" - } - ], - "commandPalette": [ - { - "command": "github.copilot.cli.openInCopilotCLI", - "when": "false" - }, - { - "command": "github.copilot.debug.extensionState", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.commitToWorktree", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.commitToRepository", - "when": "false" - }, - { - "command": "github.copilot.chat.triggerPermissiveSignIn", - "when": "false" - }, - { - "command": "github.copilot.interactiveSession.feedback", - "when": "github.copilot-chat.activated && !github.copilot.interactiveSession.disabled" - }, - { - "command": "github.copilot.debug.workbenchState", - "when": "true" - }, - { - "command": "github.copilot.chat.rerunWithCopilotDebug", - "when": "false" - }, - { - "command": "github.copilot.chat.startCopilotDebugCommand", - "when": "false" - }, - { - "command": "github.copilot.git.generateCommitMessage", - "when": "false" - }, - { - "command": "github.copilot.git.resolveMergeConflicts", - "when": "false" - }, - { - "command": "github.copilot.chat.explain", - "when": "false" - }, - { - "command": "github.copilot.chat.review", - "when": "!github.copilot.interactiveSession.disabled" - }, - { - "command": "github.copilot.chat.review.apply", - "when": "false" - }, - { - "command": "github.copilot.chat.review.applyAndNext", - "when": "false" - }, - { - "command": "github.copilot.chat.review.discard", - "when": "false" - }, - { - "command": "github.copilot.chat.review.discardAndNext", - "when": "false" - }, - { - "command": "github.copilot.chat.review.discardAll", - "when": "false" - }, - { - "command": "github.copilot.chat.review.stagedChanges", - "when": "false" - }, - { - "command": "github.copilot.chat.review.unstagedChanges", - "when": "false" - }, - { - "command": "github.copilot.chat.review.changes", - "when": "false" - }, - { - "command": "github.copilot.chat.review.stagedFileChange", - "when": "false" - }, - { - "command": "github.copilot.chat.review.unstagedFileChange", - "when": "false" - }, - { - "command": "github.copilot.chat.review.previous", - "when": "false" - }, - { - "command": "github.copilot.chat.review.next", - "when": "false" - }, - { - "command": "github.copilot.chat.review.continueInInlineChat", - "when": "false" - }, - { - "command": "github.copilot.chat.review.continueInChat", - "when": "false" - }, - { - "command": "github.copilot.chat.review.markHelpful", - "when": "false" - }, - { - "command": "github.copilot.chat.review.markUnhelpful", - "when": "false" - }, - { - "command": "github.copilot.devcontainer.generateDevContainerConfig", - "when": "false" - }, - { - "command": "github.copilot.tests.fixTestFailure", - "when": "false" - }, - { - "command": "github.copilot.tests.fixTestFailure.fromInline", - "when": "false" - }, - { - "command": "github.copilot.search.markHelpful", - "when": "false" - }, - { - "command": "github.copilot.search.markUnhelpful", - "when": "false" - }, - { - "command": "github.copilot.search.feedback", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.showElements", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.hideElements", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.showTools", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.hideTools", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.showNesRequests", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.hideNesRequests", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.showGhostRequests", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.hideGhostRequests", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.exportLogItem", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.exportPromptArchive", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.exportPromptLogsAsJson", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.exportAllPromptLogsAsJson", - "when": "false" - }, - { - "command": "github.copilot.chat.mcp.setup.check", - "when": "false" - }, - { - "command": "github.copilot.chat.mcp.setup.validatePackage", - "when": "false" - }, - { - "command": "github.copilot.chat.mcp.setup.flow", - "when": "false" - }, - { - "command": "github.copilot.chat.debug.showRawRequestBody", - "when": "false" - }, - { - "command": "github.copilot.debug.showOutputChannel", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.delete", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.resumeInTerminal", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.rename", - "when": "false" - }, - { - "command": "github.copilot.claude.sessions.rename", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.setTitle", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.openRepository", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.openWorktreeInNewWindow", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.openWorktreeInTerminal", - "when": "false" - }, - { - "command": "github.copilot.cli.sessions.copyWorktreeBranchName", - "when": "false" - }, - { - "command": "github.copilot.cloud.sessions.openInBrowser", - "when": "false" - }, - { - "command": "github.copilot.cloud.sessions.proxy.closeChatSessionPullRequest", - "when": "false" - }, - { - "command": "github.copilot.cloud.sessions.installPRExtension", - "when": "false" - }, - { - "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges", - "when": "false" - }, - { - "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges.apply", - "when": "false" - }, - { - "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.merge", - "when": "false" - }, - { - "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.mergeAndSync", - "when": "false" - }, - { - "command": "github.copilot.chat.createPullRequestCopilotCLIAgentSession.createPR", - "when": "false" - }, - { - "command": "github.copilot.chat.createDraftPullRequestCopilotCLIAgentSession.createDraftPR", - "when": "false" - }, - { - "command": "github.copilot.chat.checkoutPullRequestReroute", - "when": "false" - }, - { - "command": "github.copilot.chat.cloudSessions.openRepository", - "when": "false" - }, - { - "command": "github.copilot.nes.captureExpected.start", - "when": "github.copilot.inlineEditsEnabled" - }, - { - "command": "github.copilot.nes.captureExpected.submit", - "when": "github.copilot.inlineEditsEnabled" - }, - { - "command": "github.copilot.sessions.commit", - "when": "false" - }, - { - "command": "github.copilot.sessions.commitAndSync", - "when": "false" - }, - { - "command": "github.copilot.sessions.sync", - "when": "false" - }, - { - "command": "github.copilot.sessions.discardChanges", - "when": "false" - }, - { - "command": "github.copilot.sessions.refreshChanges", - "when": "false" - }, - { - "command": "github.copilot.sessions.initializeRepository", - "when": "false" - }, - { - "command": "github.copilot.claude.sessions.commit", - "when": "false" - }, - { - "command": "github.copilot.claude.sessions.commitAndSync", - "when": "false" - }, - { - "command": "github.copilot.claude.sessions.sync", - "when": "false" - }, - { - "command": "github.copilot.claude.sessions.initializeRepository", - "when": "false" - } - ], - "view/title": [ - { - "submenu": "github.copilot.chat.debug.filter", - "when": "view == copilot-chat", - "group": "navigation" - }, - { - "command": "github.copilot.chat.debug.exportAllPromptLogsAsJson", - "when": "view == copilot-chat", - "group": "export@1" - }, - { - "command": "workbench.action.chat.openAgentDebugPanel", - "when": "view == copilot-chat", - "group": "3_show@0" - }, - { - "command": "github.copilot.debug.showOutputChannel", - "when": "view == copilot-chat", - "group": "3_show@1" - }, - { - "command": "github.copilot.debug.showChatLogView", - "when": "view == workbench.panel.chat.view.copilot", - "group": "3_show" - } - ], - "view/item/context": [ - { - "command": "github.copilot.chat.debug.showRawRequestBody", - "when": "view == copilot-chat && viewItem == request", - "group": "export@0" - }, - { - "command": "github.copilot.chat.debug.exportLogItem", - "when": "view == copilot-chat && (viewItem == toolcall || viewItem == request)", - "group": "export@1" - }, - { - "command": "github.copilot.chat.debug.exportPromptArchive", - "when": "view == copilot-chat && viewItem == chatprompt", - "group": "export@2" - }, - { - "command": "github.copilot.chat.debug.exportPromptLogsAsJson", - "when": "view == copilot-chat && viewItem == chatprompt", - "group": "export@3" - } - ], - "searchPanel/aiResults/commands": [ - { - "command": "github.copilot.search.markHelpful", - "group": "inline@0", - "when": "aiResultsTitle && aiResultsRequested" - }, - { - "command": "github.copilot.search.markUnhelpful", - "group": "inline@1", - "when": "aiResultsTitle && aiResultsRequested" - }, - { - "command": "github.copilot.search.feedback", - "group": "inline@2", - "when": "aiResultsTitle && aiResultsRequested && github.copilot.debugReportFeedback" - } - ], - "comments/comment/title": [ - { - "command": "github.copilot.chat.review.markHelpful", - "group": "inline@0", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.markUnhelpful", - "group": "inline@1", - "when": "commentController == github-copilot-review" - } - ], - "commentsView/commentThread/context": [ - { - "command": "github.copilot.chat.review.apply", - "group": "context@1", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.discard", - "group": "context@2", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.discardAll", - "group": "context@3", - "when": "commentController == github-copilot-review" - } - ], - "comments/commentThread/additionalActions": [ - { - "submenu": "copilot/reviewComment/additionalActions/applyAndNext", - "group": "inline@1", - "when": "commentController == github-copilot-review && github.copilot.chat.review.numberOfComments > 1" - }, - { - "command": "github.copilot.chat.review.apply", - "group": "inline@1", - "when": "commentController == github-copilot-review && github.copilot.chat.review.numberOfComments == 1" - }, - { - "submenu": "copilot/reviewComment/additionalActions/discardAndNext", - "group": "inline@2", - "when": "commentController == github-copilot-review && github.copilot.chat.review.numberOfComments > 1" - }, - { - "submenu": "copilot/reviewComment/additionalActions/discard", - "group": "inline@2", - "when": "commentController == github-copilot-review && github.copilot.chat.review.numberOfComments == 1" - } - ], - "copilot/reviewComment/additionalActions/applyAndNext": [ - { - "command": "github.copilot.chat.review.applyAndNext", - "group": "inline@1", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.apply", - "group": "inline@2", - "when": "commentController == github-copilot-review" - } - ], - "copilot/reviewComment/additionalActions/discardAndNext": [ - { - "command": "github.copilot.chat.review.discardAndNext", - "group": "inline@1", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.discard", - "group": "inline@2", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.continueInInlineChat", - "group": "inline@3", - "when": "commentController == github-copilot-review" - } - ], - "copilot/reviewComment/additionalActions/discard": [ - { - "command": "github.copilot.chat.review.discard", - "group": "inline@2", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.continueInInlineChat", - "group": "inline@3", - "when": "commentController == github-copilot-review" - } - ], - "comments/commentThread/title": [ - { - "command": "github.copilot.chat.review.previous", - "group": "inline@1", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.next", - "group": "inline@2", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.continueInChat", - "group": "inline@3", - "when": "commentController == github-copilot-review" - }, - { - "command": "github.copilot.chat.review.discardAll", - "group": "inline@4", - "when": "commentController == github-copilot-review" - } - ], - "scm/title": [ - { - "command": "github.copilot.chat.review.changes", - "group": "navigation", - "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmProviderRootUri in github.copilot.chat.reviewDiff.enabledRootUris" - } - ], - "scm/sourceControl": [ - { - "command": "github.copilot.cli.openInCopilotCLI", - "group": "3_worktree@1", - "when": "scmProvider == git" - } - ], - "scm/resourceGroup/context": [ - { - "command": "github.copilot.chat.review.stagedChanges", - "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmResourceGroup == index", - "group": "inline@-3" - }, - { - "command": "github.copilot.chat.review.unstagedChanges", - "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmResourceGroup == workingTree", - "group": "inline@-3" - } - ], - "scm/resourceState/context": [ - { - "command": "github.copilot.git.resolveMergeConflicts", - "when": "scmProvider == git && scmResourceGroup == merge && git.activeResourceHasMergeConflicts", - "group": "z_chat@1" - }, - { - "command": "github.copilot.chat.review.stagedFileChange", - "group": "3_copilot", - "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmResourceGroup == index" - }, - { - "command": "github.copilot.chat.review.unstagedFileChange", - "group": "3_copilot", - "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmResourceGroup == workingTree" - } - ], - "scm/inputBox": [ - { - "command": "github.copilot.git.generateCommitMessage", - "when": "scmProvider == git && chatSetupCompleted" - } - ], - "testing/message/context": [ - { - "command": "github.copilot.tests.fixTestFailure", - "when": "testing.testItemHasUri", - "group": "inline@1" - } - ], - "issue/reporter": [ - { - "command": "github.copilot.report" - } - ], - "github.copilot.chat.debug.filter": [ - { - "command": "github.copilot.chat.debug.showElements", - "when": "github.copilot.chat.debug.elementsHidden", - "group": "commands@0" - }, - { - "command": "github.copilot.chat.debug.hideElements", - "when": "!github.copilot.chat.debug.elementsHidden", - "group": "commands@0" - }, - { - "command": "github.copilot.chat.debug.showTools", - "when": "github.copilot.chat.debug.toolsHidden", - "group": "commands@1" - }, - { - "command": "github.copilot.chat.debug.hideTools", - "when": "!github.copilot.chat.debug.toolsHidden", - "group": "commands@1" - }, - { - "command": "github.copilot.chat.debug.showNesRequests", - "when": "github.copilot.chat.debug.nesRequestsHidden", - "group": "commands@2" - }, - { - "command": "github.copilot.chat.debug.hideNesRequests", - "when": "!github.copilot.chat.debug.nesRequestsHidden", - "group": "commands@2" - }, - { - "command": "github.copilot.chat.debug.showGhostRequests", - "when": "github.copilot.chat.debug.ghostRequestsHidden", - "group": "commands@3" - }, - { - "command": "github.copilot.chat.debug.hideGhostRequests", - "when": "!github.copilot.chat.debug.ghostRequestsHidden", - "group": "commands@3" - } - ], - "notebook/toolbar": [ - { - "command": "github.copilot.chat.notebook.enableFollowCellExecution", - "when": "config.github.copilot.chat.notebook.followCellExecution.enabled && !github.copilot.notebookFollowInSessionEnabled && github.copilot.notebookAgentModeUsage && config.notebook.globalToolbar", - "group": "navigation/execute@15" - }, - { - "command": "github.copilot.chat.notebook.disableFollowCellExecution", - "when": "config.github.copilot.chat.notebook.followCellExecution.enabled && github.copilot.notebookFollowInSessionEnabled && github.copilot.notebookAgentModeUsage && config.notebook.globalToolbar", - "group": "navigation/execute@15" - } - ], - "editor/content": [ - { - "command": "github.copilot.git.resolveMergeConflicts", - "group": "z_chat@1", - "when": "config.git.enabled && !git.missing && !isInDiffEditor && !isMergeEditor && resource in git.mergeChanges && git.activeResourceHasMergeConflicts && chatSetupCompleted" - } - ], - "multiDiffEditor/content": [ - { - "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges", - "when": "resourceScheme == copilotcli-worktree-changes && workbenchState != empty && !isSessionsWindow" - } - ], - "chat/chatSessions": [ - { - "command": "github.copilot.claude.sessions.rename", - "when": "chatSessionType == claude-code", - "group": "1_edit@4" - }, - { - "command": "github.copilot.cli.sessions.delete", - "when": "chatSessionType == copilotcli", - "group": "1_edit@10" - }, - { - "command": "github.copilot.cli.sessions.rename", - "when": "chatSessionType == copilotcli", - "group": "1_edit@4" - }, - { - "command": "github.copilot.cli.sessions.openWorktreeInNewWindow", - "when": "chatSessionType == copilotcli && !isSessionsWindow", - "group": "2_open@1" - }, - { - "command": "github.copilot.cli.sessions.openWorktreeInTerminal", - "when": "chatSessionType == copilotcli", - "group": "2_open@2" - }, - { - "command": "github.copilot.cli.sessions.copyWorktreeBranchName", - "when": "chatSessionType == copilotcli", - "group": "2_open@3" - }, - { - "command": "github.copilot.cli.sessions.resumeInTerminal", - "when": "chatSessionType == copilotcli", - "group": "2_open@4" - }, - { - "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges", - "when": "chatSessionType == copilotcli && workbenchState != empty && !isSessionsWindow", - "group": "3_apply@0" - }, - { - "command": "github.copilot.cloud.sessions.openInBrowser", - "when": "chatSessionType == copilot-cloud-agent", - "group": "navigation@10" - }, - { - "command": "github.copilot.cloud.sessions.proxy.closeChatSessionPullRequest", - "when": "chatSessionType == copilot-cloud-agent", - "group": "1_edit@10" - } - ], - "chat/multiDiff/context": [ - { - "command": "github.copilot.cloud.sessions.installPRExtension", - "when": "chatSessionType == copilot-cloud-agent && !github.copilot.prExtensionInstalled", - "group": "inline@1" - } - ], - "chat/input/editing/sessionTitleToolbar": [ - { - "command": "github.copilot.sessions.refreshChanges", - "when": "chatSessionType == copilotcli && isSessionsWindow && !sessions.isAgentHostSession", - "group": "9_refresh@1" - } - ], - "chat/customizations/create": [ - { - "command": "copilot.claude.agents", - "when": "chatCustomizationSessionType == claude-code && chatCustomizationSection == agents", - "group": "navigation@1" - }, - { - "command": "copilot.claude.hooks", - "when": "chatCustomizationSessionType == claude-code && chatCustomizationSection == hooks", - "group": "navigation@1" - }, - { - "command": "copilot.claude.memory", - "when": "chatCustomizationSessionType == claude-code && chatCustomizationSection == instructions", - "group": "navigation@1" - } - ] - }, - "icons": { - "copilot-logo": { - "description": "%github.copilot.icon%", - "default": { - "fontPath": "assets/copilot.woff", - "fontCharacter": "\\0041" - } - }, - "copilot-warning": { - "description": "%github.copilot.icon%", - "default": { - "fontPath": "assets/copilot.woff", - "fontCharacter": "\\0042" - } - }, - "copilot-notconnected": { - "description": "%github.copilot.icon%", - "default": { - "fontPath": "assets/copilot.woff", - "fontCharacter": "\\0043" - } - } - }, - "iconFonts": [ - { - "id": "copilot-font", - "src": [ - { - "path": "assets/copilot.woff", - "format": "woff" - } - ] - } - ], - "terminalQuickFixes": [ - { - "id": "copilot-chat.fixWithCopilot", - "commandLineMatcher": ".+", - "commandExitResult": "error", - "outputMatcher": { - "anchor": "bottom", - "length": 1, - "lineMatcher": ".+", - "offset": 0 - }, - "kind": "explain" - }, - { - "id": "copilot-chat.generateCommitMessage", - "commandLineMatcher": "git add .+", - "commandExitResult": "success", - "kind": "explain", - "outputMatcher": { - "anchor": "bottom", - "length": 1, - "lineMatcher": ".+", - "offset": 0 - } - }, - { - "id": "copilot-chat.terminalToDebugging", - "commandLineMatcher": ".+", - "kind": "explain", - "commandExitResult": "error", - "outputMatcher": { - "anchor": "bottom", - "length": 1, - "lineMatcher": "", - "offset": 0 - } - }, - { - "id": "copilot-chat.terminalToDebuggingSuccess", - "commandLineMatcher": ".+", - "kind": "explain", - "commandExitResult": "success", - "outputMatcher": { - "anchor": "bottom", - "length": 1, - "lineMatcher": "", - "offset": 0 - } - } - ], - "languages": [ - { - "id": "ignore", - "filenamePatterns": [ - ".copilotignore" - ], - "aliases": [] - }, - { - "id": "markdown", - "extensions": [ - ".copilotmd" - ] - } - ], - "views": { - "copilot-chat": [ - { - "id": "copilot-chat", - "name": "Chat Debug", - "icon": "assets/debug-icon.svg", - "when": "github.copilot.chat.showLogView" - } - ], - "context-inspector": [ - { - "id": "context-inspector", - "name": "Language Context Inspector", - "icon": "$(inspect)", - "when": "github.copilot.chat.showContextInspectorView" - } - ] - }, - "viewsContainers": { - "activitybar": [ - { - "id": "copilot-chat", - "title": "Chat Debug", - "icon": "assets/debug-icon.svg" - }, - { - "id": "context-inspector", - "title": "Language Context Inspector", - "icon": "$(inspect)" - } - ] - }, - "configurationDefaults": { - "workbench.editorAssociations": { - "*.copilotmd": "vscode.markdown.preview.editor" - } - }, - "keybindings": [ - { - "command": "github.copilot.chat.copilotCLI.addFileReference", - "key": "ctrl+shift+.", - "mac": "cmd+shift+.", - "when": "github.copilot.chat.copilotCLI.hasSession && editorTextFocus" - }, - { - "command": "github.copilot.chat.rerunWithCopilotDebug", - "key": "ctrl+alt+.", - "mac": "cmd+alt+.", - "when": "github.copilot-chat.activated && terminalShellIntegrationEnabled && terminalFocus && !terminalAltBufferActive" - }, - { - "command": "github.copilot.nes.captureExpected.confirm", - "key": "ctrl+enter", - "mac": "cmd+enter", - "when": "copilotNesCaptureMode && editorTextFocus" - }, - { - "command": "github.copilot.nes.captureExpected.abort", - "key": "escape", - "when": "copilotNesCaptureMode && editorTextFocus" - } - ], - "walkthroughs": [ - { - "id": "copilotWelcome", - "title": "%github.copilot.walkthrough.title%", - "description": "%github.copilot.walkthrough.description%", - "when": "!isWeb", - "steps": [ - { - "id": "copilot.setup.signIn", - "title": "%github.copilot.walkthrough.setup.signIn.title%", - "description": "%github.copilot.walkthrough.setup.signIn.description%", - "when": "chatEntitlementSignedOut && !view.workbench.panel.chat.view.copilot.visible && !github.copilot-chat.activated && !github.copilot.offline && !github.copilot.interactiveSession.individual.disabled && !github.copilot.interactiveSession.individual.expired && !github.copilot.interactiveSession.enterprise.disabled && !github.copilot.interactiveSession.contactSupport && !github.copilot.interactiveSession.invalidToken && !github.copilot.interactiveSession.rateLimited && !github.copilot.interactiveSession.gitHubLoginFailed", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.panelChat.media.altText%" - } - }, - { - "id": "copilot.setup.signInNoAction", - "title": "%github.copilot.walkthrough.setup.signIn.title%", - "description": "%github.copilot.walkthrough.setup.noAction.description%", - "when": "chatEntitlementSignedOut && view.workbench.panel.chat.view.copilot.visible && !github.copilot-chat.activated && !github.copilot.offline && !github.copilot.interactiveSession.individual.disabled && !github.copilot.interactiveSession.individual.expired && !github.copilot.interactiveSession.enterprise.disabled && !github.copilot.interactiveSession.contactSupport && !github.copilot.interactiveSession.invalidToken && !github.copilot.interactiveSession.rateLimited && !github.copilot.interactiveSession.gitHubLoginFailed", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.panelChat.media.altText%" - } - }, - { - "id": "copilot.setup.signUp", - "title": "%github.copilot.walkthrough.setup.signUp.title%", - "description": "%github.copilot.walkthrough.setup.signUp.description%", - "when": "chatPlanCanSignUp && !view.workbench.panel.chat.view.copilot.visible && !github.copilot-chat.activated && !github.copilot.offline && (github.copilot.interactiveSession.individual.disabled || github.copilot.interactiveSession.individual.expired) && !github.copilot.interactiveSession.enterprise.disabled && !github.copilot.interactiveSession.contactSupport && !github.copilot.interactiveSession.invalidToken && !github.copilot.interactiveSession.rateLimited && !github.copilot.interactiveSession.gitHubLoginFailed", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.panelChat.media.altText%" - } - }, - { - "id": "copilot.setup.signUpNoAction", - "title": "%github.copilot.walkthrough.setup.signUp.title%", - "description": "%github.copilot.walkthrough.setup.noAction.description%", - "when": "chatPlanCanSignUp && view.workbench.panel.chat.view.copilot.visible && !github.copilot-chat.activated && !github.copilot.offline && (github.copilot.interactiveSession.individual.disabled || github.copilot.interactiveSession.individual.expired) && !github.copilot.interactiveSession.enterprise.disabled && !github.copilot.interactiveSession.contactSupport && !github.copilot.interactiveSession.invalidToken && !github.copilot.interactiveSession.rateLimited && !github.copilot.interactiveSession.gitHubLoginFailed", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.panelChat.media.altText%" - } - }, - { - "id": "copilot.panelChat", - "title": "%github.copilot.walkthrough.panelChat.title%", - "description": "%github.copilot.walkthrough.panelChat.description%", - "when": "!chatEntitlementSignedOut || chatIsEnabled ", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.panelChat.media.altText%" - } - }, - { - "id": "copilot.edits", - "title": "%github.copilot.walkthrough.edits.title%", - "description": "%github.copilot.walkthrough.edits.description%", - "when": "!chatEntitlementSignedOut || chatIsEnabled ", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/edits.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/edits-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/edits-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/edits-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.edits.media.altText%" - } - }, - { - "id": "copilot.firstSuggest", - "title": "%github.copilot.walkthrough.firstSuggest.title%", - "description": "%github.copilot.walkthrough.firstSuggest.description%", - "when": "!chatEntitlementSignedOut || chatIsEnabled ", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/ghost-text.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/ghost-text-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/ghost-text-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/ghost-text-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.firstSuggest.media.altText%" - } - }, - { - "id": "copilot.inlineChatNotMac", - "title": "%github.copilot.walkthrough.inlineChatNotMac.title%", - "description": "%github.copilot.walkthrough.inlineChatNotMac.description%", - "when": "!isMac && (!chatEntitlementSignedOut || chatIsEnabled )", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.inlineChatNotMac.media.altText%" - } - }, - { - "id": "copilot.inlineChatMac", - "title": "%github.copilot.walkthrough.inlineChatMac.title%", - "description": "%github.copilot.walkthrough.inlineChatMac.description%", - "when": "isMac && (!chatEntitlementSignedOut || chatIsEnabled )", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.inlineChatMac.media.altText%" - } - }, - { - "id": "copilot.sparkle", - "title": "%github.copilot.walkthrough.sparkle.title%", - "description": "%github.copilot.walkthrough.sparkle.description%", - "when": "!chatEntitlementSignedOut || chatIsEnabled", - "media": { - "video": { - "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/git-commit.mp4", - "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/git-commit-light.mp4", - "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/git-commit-hc.mp4", - "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/git-commit-hclight.mp4" - }, - "altText": "%github.copilot.walkthrough.sparkle.media.altText%" - } - } - ] - } - ], - "jsonValidation": [ - { - "fileMatch": "settings.json", - "url": "ccsettings://root/schema.json" - } - ], - "typescriptServerPlugins": [ - { - "name": "@vscode/copilot-typescript-server-plugin", - "enableForWorkspaceTypeScriptVersions": true - } - ], - "chatSessions": [ - { - "type": "claude-code", - "name": "claude", - "displayName": "Claude", - "icon": "$(claude)", - "welcomeTitle": "Claude Agent", - "welcomeMessage": "Powered by the same agent as Claude Code", - "inputPlaceholder": "Run local tasks with Claude, type `#` for adding context", - "order": 3, - "description": "%github.copilot.session.providerDescription.claude%", - "when": "config.github.copilot.chat.claudeAgent.enabled", - "canDelegate": true, - "requiresCustomModels": true, - "capabilities": { - "supportsFileAttachments": true, - "supportsImageAttachments": true - }, - "commands": [ - { - "name": "init", - "description": "Initialize a new CLAUDE.md file with codebase documentation" - }, - { - "name": "pr-comments", - "description": "Get comments from a GitHub pull request" - }, - { - "name": "review", - "description": "Review a pull request" - }, - { - "name": "security-review", - "description": "Complete a security review of the pending changes on the current branch" - }, - { - "name": "simplify", - "description": "Review changed code for reuse, quality, and efficiency" - }, - { - "name": "claude-api", - "description": "Help building with Claude API or Anthropic SDK" - }, - { - "name": "agents", - "description": "Create and manage specialized Claude agents" - }, - { - "name": "hooks", - "description": "Configure Claude Code hooks for tool execution and events" - }, - { - "name": "memory", - "description": "Open memory files (CLAUDE.md) for editing" - }, - { - "name": "compact", - "description": "Compact the conversation history to save context tokens" - } - ] - }, - { - "type": "copilotcli", - "name": "cli", - "displayName": "Copilot CLI", - "icon": "$(copilot)", - "welcomeTitle": "Copilot CLI", - "welcomeMessage": "Run tasks in the background with the Copilot CLI", - "inputPlaceholder": "Run tasks in the background with the Copilot CLI, type `#` for adding context", - "order": 1, - "canDelegate": true, - "description": "%github.copilot.session.providerDescription.background%", - "when": "config.github.copilot.chat.backgroundAgent.enabled", - "capabilities": { - "supportsFileAttachments": true, - "supportsProblemAttachments": true, - "supportsToolAttachments": false, - "supportsImageAttachments": true, - "supportsSymbolAttachments": true, - "supportsSearchResultAttachments": true, - "supportsSourceControlAttachments": true, - "supportsPromptAttachments": true, - "supportsHandOffs": true - }, - "commands": [ - { - "name": "delegate", - "description": "Delegate chat session to cloud agent and create associated PR", - "when": "config.github.copilot.chat.cloudAgent.enabled" - }, - { - "name": "compact", - "description": "%github.copilot.command.cli.compact.description%" - }, - { - "name": "plan", - "description": "%github.copilot.command.cli.plan.description%", - "when": "config.github.copilot.chat.cli.planCommand.enabled" - }, - { - "name": "fleet", - "description": "%github.copilot.command.cli.fleet.description%", - "when": "false" - }, - { - "name": "remote", - "description": "%github.copilot.command.cli.remote.description%", - "when": "config.github.copilot.chat.cli.remote.enabled" - } - ], - "customAgentTarget": "github-copilot", - "requiresCustomModels": true, - "autoAttachReferences": true, - "useRequestToPopulateBuiltInPickers": true - }, - { - "type": "copilot-cloud-agent", - "alternativeIds": [ - "copilot-swe-agent" - ], - "name": "cloud", - "displayName": "Cloud", - "icon": "$(cloud)", - "welcomeTitle": "Cloud Agent", - "welcomeMessage": "Delegate tasks to the cloud", - "inputPlaceholder": "Delegate tasks to the cloud, type `#` for adding context", - "order": 2, - "canDelegate": true, - "description": "%github.copilot.session.providerDescription.cloud%", - "when": "config.github.copilot.chat.cloudAgent.enabled", - "capabilities": { - "supportsFileAttachments": true - }, - "autoAttachReferences": true - } - ], - "chatAgents": [], - "chatPromptFiles": [ - { - "path": "./assets/prompts/plan.prompt.md", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/chronicle-standup.prompt.md", - "when": "github.copilot.sessionSearch.enabled", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/chronicle-tips.prompt.md", - "when": "github.copilot.sessionSearch.enabled", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/chronicle-reindex.prompt.md", - "when": "github.copilot.sessionSearch.enabled", - "sessionTypes": [ - "local" - ] - } - ], - "chatSkills": [ - { - "path": "./assets/prompts/skills/project-setup-info-local/SKILL.md", - "when": "!config.github.copilot.chat.newWorkspace.useContext7", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/project-setup-info-context7/SKILL.md", - "when": "config.github.copilot.chat.newWorkspace.useContext7", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/install-vscode-extension/SKILL.md", - "when": "config.github.copilot.chat.installExtensionSkill.enabled && config.github.copilot.chat.newWorkspaceCreation.enabled", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/get-search-view-results/SKILL.md", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/troubleshoot/SKILL.md", - "sessionTypes": [ - "local", - "copilotcli" - ] - }, - { - "path": "./assets/prompts/skills/agent-customization/SKILL.md", - "sessionTypes": [ - "local", - "copilotcli" - ] - }, - { - "path": "./assets/prompts/skills/init/SKILL.md", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/create-prompt/SKILL.md", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/create-instructions/SKILL.md", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/create-skill/SKILL.md", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/create-agent/SKILL.md", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/create-hook/SKILL.md", - "sessionTypes": [ - "local" - ] - }, - { - "path": "./assets/prompts/skills/chronicle/SKILL.md", - "when": "github.copilot.sessionSearch.enabled", - "sessionTypes": [ - "local" - ] - } - ], - "terminal": { - "profiles": [ - { - "icon": "copilot", - "id": "copilot-cli", - "title": "GitHub Copilot CLI", - "titleTemplate": "${sequence}" - } - ] - } - }, - "prettier": { - "useTabs": true, - "tabWidth": 4, - "singleQuote": true - }, - "scripts": { - "postinstall": "tsx ./script/postinstall.ts", - "build": "node .esbuild.mts --sourcemaps", - "compile": "node .esbuild.mts --dev", - "watch": "npm-run-all -lp watch:esbuild watch:typecheck", - "watch:esbuild": "node .esbuild.mts --watch --dev", - "watch:typecheck": "npx tsgo --noEmit --watch --preserveWatchOutput --project tsconfig.json", - "watch:typecheck-extension": "npx tsgo --noEmit --watch --project tsconfig.json", - "watch:typecheck-extension-web": "npx tsgo --noEmit --watch --project tsconfig.worker.json", - "watch:typecheck-simulation-workbench": "npx tsgo --noEmit --watch --project test/simulation/workbench/tsconfig.json", - "typecheck": "npx tsgo --noEmit --project tsconfig.json && npx tsgo --noEmit --project test/simulation/workbench/tsconfig.json && npx tsgo --noEmit --project tsconfig.worker.json && npx tsgo --noEmit --project src/extension/completions-core/vscode-node/extension/src/copilotPanel/webView/tsconfig.json", - "lint": "npx eslint . --max-warnings=0", - "lint-staged": "npx eslint --max-warnings=0", - "tsfmt": "npx tsfmt -r --verify", - "test": "npm-run-all test:*", - "test:extension": "vscode-test", - "test:sanity": "vscode-test --sanity", - "test:unit": "vitest --run --pool=forks", - "vitest": "vitest", - "bench": "vitest bench", - "get_env": "tsx script/setup/getEnv.mts", - "get_token": "tsx script/setup/getToken.mts", - "prettier": "prettier --list-different --write --cache .", - "simulate": "node dist/simulationMain.js", - "simulate-require-cache": "node dist/simulationMain.js --require-cache", - "simulate-ci": "node dist/simulationMain.js --ci --require-cache", - "simulate-update-baseline": "node dist/simulationMain.js --update-baseline", - "simulate-gc": "node dist/simulationMain.js --require-cache --gc", - "setup": "npm run get_env && npm run get_token", - "setup:dotnet": "run-script-os", - "setup:dotnet:darwin:linux": "curl -O https://raw.githubusercontent.com/dotnet/install-scripts/main/src/dotnet-install.sh && chmod u+x dotnet-install.sh && ./dotnet-install.sh --channel 10.0 && rm dotnet-install.sh", - "setup:dotnet:win32": "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command \"Invoke-WebRequest -Uri https://raw.githubusercontent.com/dotnet/install-scripts/main/src/dotnet-install.ps1 -OutFile dotnet-install.ps1; ./dotnet-install.ps1 -channel 10.0; Remove-Item dotnet-install.ps1\"", - "analyze-edits": "tsx script/analyzeEdits.ts", - "extract-chat-lib": "tsx script/build/extractChatLib.ts", - "create_venv": "tsx script/setup/createVenv.mts", - "package": "vsce package", - "web": "vscode-test-web --headless --extensionDevelopmentPath=. .", - "test:prompt": "mocha \"src/extension/completions-core/vscode-node/prompt/**/test/**/*.test.{ts,tsx}\"", - "test:completions-core": "tsx src/extension/completions-core/vscode-node/extension/test/runTest.ts" - }, - "devDependencies": { - "@azure/identity": "4.9.1", - "@azure/keyvault-secrets": "^4.10.0", - "@azure/msal-node": "^3.6.3", - "@c4312/scip": "^0.1.0", - "@fluentui/react-components": "^9.66.6", - "@fluentui/react-icons": "^2.0.305", - "@hediet/node-reload": "^0.8.0", - "@keyv/sqlite": "^4.0.5", - "@octokit/types": "^16.0.0", - "@stylistic/eslint-plugin": "^3.0.1", - "@types/eslint": "^9.0.0", - "@types/express": "^5.0.6", - "@types/google-protobuf": "^3.15.12", - "@types/js-yaml": "^4.0.9", - "@types/markdown-it": "^14.0.0", - "@types/minimist": "^1.2.5", - "@types/mocha": "^10.0.10", - "@types/node": "^22.16.3", - "@types/picomatch": "^4.0.0", - "@types/react": "17.0.44", - "@types/react-dom": "^18.2.17", - "@types/sinon": "^17.0.4", - "@types/source-map-support": "^0.5.10", - "@types/tar": "^6.1.13", - "@types/vinyl": "^2.0.12", - "@types/vscode-webview": "^1.57.5", - "@types/ws": "^8.5.3", - "@types/yargs": "^17.0.24", - "@typescript-eslint/eslint-plugin": "^8.35.0", - "@typescript-eslint/parser": "^8.32.0", - "@typescript-eslint/typescript-estree": "^8.26.1", - "@vitest/coverage-v8": "^3.2.4", - "@vitest/snapshot": "^1.5.0", - "@vscode/debugadapter": "^1.68.0", - "@vscode/debugprotocol": "^1.68.0", - "@vscode/dts": "^0.4.1", - "@vscode/lsif-language-service": "^0.1.0-pre.4", - "@vscode/test-cli": "^0.0.11", - "@vscode/test-electron": "^2.5.2", - "@vscode/test-web": "^0.0.80", - "@vscode/vsce": "3.6.0", - "copyfiles": "^2.4.1", - "csv-parse": "^6.0.0", - "dotenv": "^17.2.0", - "electron": "^39.8.5", - "esbuild": "0.27.2", - "fastq": "^1.19.1", - "glob": "^11.1.0", - "js-yaml": "^4.1.1", - "keyv": "^5.3.2", - "minimist": "^1.2.8", - "mobx": "^6.13.7", - "mobx-react-lite": "^4.1.0", - "mocha": "^11.7.1", - "mocha-junit-reporter": "^2.2.1", - "mocha-multi-reporters": "^1.5.1", - "monaco-editor": "0.44.0", - "npm-run-all": "^4.1.5", - "open": "^10.1.2", - "openai": "^6.7.0", - "outdent": "^0.8.0", - "picomatch": "^4.0.4", - "playwright": "^1.58.2", - "prettier": "^3.6.2", - "react": "^17.0.2", - "react-dom": "17.0.2", - "rimraf": "^6.0.1", - "run-script-os": "^1.1.6", - "shiki": "~1.15.0", - "sinon": "^21.0.0", - "source-map-support": "^0.5.21", - "tar": "^7.5.11", - "ts-dedent": "^2.2.0", - "tsx": "^4.20.3", - "typescript": "^5.8.3", - "vite-plugin-top-level-await": "^1.5.0", - "vite-plugin-wasm": "^3.5.0", - "vitest": "^3.0.5", - "vscode-languageserver-protocol": "^3.17.5", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-languageserver-types": "^3.17.5", - "yaml": "^2.8.0", - "yargs": "^17.7.2", - "zod": "3.25.76" - }, - "dependencies": { - "@anthropic-ai/claude-agent-sdk": "0.2.112", - "@anthropic-ai/sdk": "^0.82.0", - "@github/blackbird-external-ingest-utils": "^0.3.0", - "@github/copilot": "^1.0.48", - "@google/genai": "^1.22.0", - "@humanwhocodes/gitignore-to-minimatch": "1.0.2", - "@microsoft/tiktokenizer": "^1.0.10", - "@modelcontextprotocol/sdk": "^1.25.2", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/api-logs": "^0.212.0", - "@opentelemetry/exporter-logs-otlp-grpc": "^0.214.0", - "@opentelemetry/exporter-logs-otlp-http": "^0.214.0", - "@opentelemetry/exporter-metrics-otlp-grpc": "^0.214.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.214.0", - "@opentelemetry/exporter-trace-otlp-grpc": "^0.214.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.214.0", - "@opentelemetry/resources": "^2.5.1", - "@opentelemetry/sdk-logs": "^0.212.0", - "@opentelemetry/sdk-metrics": "^2.5.1", - "@opentelemetry/sdk-trace-node": "^2.5.1", - "@opentelemetry/semantic-conventions": "^1.39.0", - "@sinclair/typebox": "^0.34.41", - "@vscode/copilot-api": "^0.3.0", - "@vscode/extension-telemetry": "^1.5.1", - "@vscode/l10n": "^0.0.18", - "@vscode/prompt-tsx": "^0.4.0-alpha.8", - "@vscode/tree-sitter-wasm": "0.0.5-php.2", - "@vscode/webview-ui-toolkit": "^1.3.1", - "@xterm/headless": "^5.5.0", - "ajv": "^8.18.0", - "applicationinsights": "^2.9.7", - "best-effort-json-parser": "^1.2.1", - "diff": "^8.0.3", - "dompurify": "^3.4.1", - "express": "^5.2.1", - "ignore": "^7.0.5", - "isbinaryfile": "^5.0.4", - "jsonc-parser": "^3.3.1", - "lru-cache": "^11.1.0", - "markdown-it": "^14.1.1", - "minimatch": "^10.2.1", - "undici": "^7.24.1", - "vscode-tas-client": "^0.1.84", - "web-tree-sitter": "^0.23.0" - }, - "overrides": { - "@aminya/node-gyp-build": "npm:node-gyp-build@4.8.1", - "string_decoder": "npm:string_decoder@1.2.0", - "node-gyp": "npm:node-gyp@10.3.1", - "zod": "3.25.76" - }, - "vscodeCommit": "94c8e2adc50e26ef70af85a0de3a9efed757acaa", - "__metadata": { - "id": "7ec7d6e6-b89e-4cc5-a59b-d6c4d238246f", - "publisherId": { - "publisherId": "7c1c19cd-78eb-4dfb-8999-99caf7679002", - "publisherName": "github", - "displayName": "GitHub", - "flags": "verified" - }, - "publisherDisplayName": "GitHub" - } + "name": "copilot-chat", + "displayName": "GitHub Copilot Chat", + "description": "AI chat features powered by Copilot", + "version": "0.50.0", + "build": "1", + "completionsCoreVersion": "1.378.1799", + "internalLargeStorageAriaKey": "ec712b3202c5462fb6877acae7f1f9d7-c19ad55e-3e3c-4f99-984b-827f6d95bd9e-6917", + "ariaKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255", + "buildType": "dev", + "publisher": "GitHub", + "homepage": "https://github.com/features/copilot?editor=vscode", + "license": "SEE LICENSE IN LICENSE.txt", + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode-copilot-chat" + }, + "bugs": { + "url": "https://github.com/microsoft/vscode/issues" + }, + "qna": "https://github.com/github-community/community/discussions/categories/copilot", + "icon": "assets/copilot.png", + "pricing": "Trial", + "engines": { + "vscode": "^1.122.0", + "npm": ">=9.0.0", + "node": ">=22.14.0" + }, + "categories": [ + "AI", + "Chat", + "Programming Languages", + "Machine Learning" + ], + "keywords": [ + "ai", + "openai", + "codex", + "pilot", + "snippets", + "documentation", + "autocomplete", + "intellisense", + "refactor", + "javascript", + "python", + "typescript", + "php", + "go", + "golang", + "ruby", + "c++", + "c#", + "java", + "kotlin", + "co-pilot" + ], + "badges": [ + { + "url": "https://img.shields.io/badge/GitHub%20Copilot-Subscription%20Required-orange", + "href": "https://github.com/github-copilot/signup?editor=vscode", + "description": "%github.copilot.badge.signUp%" + }, + { + "url": "https://img.shields.io/github/stars/github/copilot-docs?style=social", + "href": "https://github.com/github/copilot-docs", + "description": "%github.copilot.badge.star%" + }, + { + "url": "https://img.shields.io/youtube/channel/views/UC7c3Kb6jYCRj4JOHHZTxKsQ?style=social", + "href": "https://www.youtube.com/@GitHub/search?query=copilot", + "description": "%github.copilot.badge.youtube%" + }, + { + "url": "https://img.shields.io/twitter/follow/github?style=social", + "href": "https://twitter.com/github", + "description": "%github.copilot.badge.twitter%" + } + ], + "activationEvents": [ + "onStartupFinished", + "onLanguageModelChat:copilot", + "onUri", + "onFileSystem:ccreq", + "onFileSystem:ccsettings" + ], + "main": "./dist/extension", + "l10n": "./l10n", + "enabledApiProposals": [ + "agentSessionsWorkspace", + "agentsWindowConfiguration", + "chatDebug", + "chatHooks", + "extensionsAny", + "newSymbolNamesProvider", + "interactive", + "codeActionAI", + "activeComment", + "commentReveal", + "contribCommentThreadAdditionalMenu", + "contribCommentsViewThreadMenus", + "contribChatEditorInlineGutterMenu", + "documentFiltersExclusive", + "embeddings", + "findTextInFiles", + "findTextInFiles2", + "languageModelToolSupportsModel", + "findFiles2", + "textSearchProvider", + "terminalDataWriteEvent", + "terminalExecuteCommandEvent", + "terminalSelection", + "terminalQuickFixProvider", + "mappedEditsProvider", + "aiRelatedInformation", + "aiSettingsSearch", + "chatParticipantAdditions", + "defaultChatParticipant", + "contribSourceControlInputBoxMenu", + "authLearnMore", + "testObserver", + "aiTextSearchProvider", + "chatParticipantPrivate", + "chatProvider", + "contribDebugCreateConfiguration", + "chatReferenceDiagnostic", + "textSearchProvider2", + "chatReferenceBinaryData", + "languageModelSystem", + "languageModelCapabilities", + "languageModelPricing", + "inlineCompletionsAdditions", + "chatStatusItem", + "chatInputNotification", + "taskProblemMatcherStatus", + "contribLanguageModelToolSets", + "textDocumentChangeReason", + "resolvers", + "taskExecutionTerminal", + "dataChannels", + "languageModelThinkingPart", + "chatSessionsProvider", + "devDeviceId", + "contribEditorContentMenu", + "chatPromptFiles", + "mcpServerDefinitions", + "tabInputMultiDiff", + "workspaceTrust", + "environmentPower", + "terminalTitle", + "toolInvocationApproveCombination", + "chatSessionCustomizationProvider" + ], + "contributes": { + "languageModelTools": [ + { + "name": "copilot_searchCodebase", + "toolReferenceName": "codebase", + "displayName": "%copilot.tools.searchCodebase.name%", + "icon": "$(folder)", + "userDescription": "%copilot.codebase.tool.description%", + "modelDescription": "Run a natural language search for relevant code or documentation comments from the user's current workspace. Returns relevant code snippets from the user's current workspace if it is large, or the full contents of the workspace if it is small.", + "tags": [ + "codesearch", + "vscode_codesearch" + ], + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "The query to search the codebase for. Should contain all relevant context. Should ideally be text that might appear in the codebase, such as function names, variable names, or comments." + } + }, + "required": [ + "query" + ] + } + }, + { + "name": "execution_subagent", + "toolReferenceName": "executionSubagent", + "displayName": "%copilot.tools.executionSubagent.name%", + "icon": "$(play)", + "userDescription": "%copilot.tools.executionSubagent.description%", + "modelDescription": "Launch an iterative execution-focused subagent that performs an execution-based task.\nUSE THIS INSTEAD OF RUNNING INDIVIDUAL COMMANDS WITH run_in_terminal EXCEPT IN THE RARE CASES THAT YOU NEED THE FULL OUTPUT OF A COMMAND.\nHere are some examples of how it can be used:\n- Run tests and filter the output to summarize which tests failed and why.\n- Install all dependencies of a project.\nReturns: A list of commands that were run, along with relevant excerpts of each command's output.\nInput fields:\n- query: What to execute, and what to look for in the output. Can include exact commands to run, or a description of an execution task.\n- description: Short user-visible invocation message.\nNOTE: In the subagent query, make sure to specify any restrictions or guidelines on running commands provided by the user earlier in the conversation.\nFor example, if the user instructs the agent to not edit files in a particular directory, make sure to include that instruction in the subagent query when relevant.", + "when": "config.github.copilot.chat.executionSubagent.enabled", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "What to execute, and what to look for in the output. Can include exact commands to run, or a description of an execution task." + }, + "description": { + "type": "string", + "description": "User-visible invocation message shown while the subagent runs." + } + }, + "required": [ + "query", + "description" + ] + } + }, + { + "name": "search_subagent", + "toolReferenceName": "searchSubagent", + "displayName": "%copilot.tools.searchSubagent.name%", + "icon": "$(search)", + "userDescription": "%copilot.tools.searchSubagent.description%", + "modelDescription": "Launch a fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (eg. \"src/components/**/*.tsx\"), search code for keywords (eg. \"API endpoints\"), or answer questions about the codebase (eg. \"how do API endpoints work?\").\nReturns: A list of relevant files/snippet locations in the workspace.\n\nInput fields:\n- query: Natural language description of what to search for.\n- description: Short user-visible invocation message. \n- details: 2-3 sentences detailing the objective of the search agent.", + "when": "config.github.copilot.chat.searchSubagent.enabled && config.github.copilot.chat.exploreAgent.enabled", + "tags": [ + "vscode_codesearch" + ], + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Natural language description of what to search for." + }, + "description": { + "type": "string", + "description": "A short (3-5 word) description of the task." + }, + "details": { + "type": "string", + "description": "A more detailed description of the objective for the search subagent. This helps the sub-agent remain on task and understand its purpose." + } + }, + "required": [ + "query", + "description", + "details" + ] + } + }, + { + "name": "explore_subagent", + "toolReferenceName": "exploreSubagent", + "displayName": "%copilot.tools.searchSubagent.name%", + "icon": "$(search)", + "userDescription": "%copilot.tools.searchSubagent.description%", + "modelDescription": "Launch a fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (eg. \"src/components/**/*.tsx\"), search code for keywords (eg. \"API endpoints\"), or answer questions about the codebase (eg. \"how do API endpoints work?\").\nReturns: A list of relevant files/snippet locations in the workspace.\n\nInput fields:\n- query: Natural language description of what to search for.\n- description: Short user-visible invocation message. \n- details: 2-3 sentences detailing the objective of the search agent.", + "when": "config.github.copilot.chat.searchSubagent.enabled && !config.github.copilot.chat.exploreAgent.enabled", + "tags": [ + "vscode_codesearch" + ], + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Natural language description of what to search for." + }, + "description": { + "type": "string", + "description": "A short (3-5 word) description of the task." + }, + "details": { + "type": "string", + "description": "A more detailed description of the objective for the search subagent. This helps the sub-agent remain on task and understand its purpose." + } + }, + "required": [ + "query", + "description", + "details" + ] + } + }, + { + "name": "skill", + "toolReferenceName": "skill", + "displayName": "%copilot.tools.skill.name%", + "icon": "$(book)", + "userDescription": "%copilot.tools.skill.description%", + "modelDescription": "Invoke a skill to handle a user's request with specialized instructions and workflows.\n\nSkills are domain-specific capabilities discovered from SKILL.md files. When a user's task matches an available skill, call this tool to load and apply it. If the user types a slash command (e.g. \"/deploy\", \"/test\"), treat it as a skill invocation.\n\nUsage:\n- Pass the skill name only (no arguments).\n- Examples: skill: \"docx\", skill: \"deploy\", skill: \"fix-ci-failures\"\n\nRules:\n- Available skills appear in system-reminder messages earlier in the conversation.\n- BLOCKING: When a matching skill exists, you MUST call this tool before producing any other output about the task.\n- Never reference a skill without calling this tool.\n- Do not call this tool for a skill that is already active in the current turn (indicated by a tag).\n- Do not use this tool for built-in commands such as /help or /clear.", + "when": "config.github.copilot.chat.skillTool.enabled", + "inputSchema": { + "type": "object", + "properties": { + "skill": { + "type": "string", + "description": "The skill name. E.g., \"commit\", \"review-pr\", or \"pdf\"" + } + }, + "required": [ + "skill" + ] + } + }, + { + "name": "copilot_searchWorkspaceSymbols", + "toolReferenceName": "symbols", + "displayName": "%copilot.tools.searchWorkspaceSymbols.name%", + "icon": "$(symbol)", + "userDescription": "%copilot.workspaceSymbols.tool.description%", + "modelDescription": "Search the user's workspace for code symbols using language services. Use this tool when the user is looking for a specific symbol in their workspace.", + "tags": [ + "vscode_codesearch" + ], + "inputSchema": { + "type": "object", + "properties": { + "symbolName": { + "type": "string", + "description": "The symbol to search for, such as a function name, class name, or variable name." + } + }, + "required": [ + "symbolName" + ] + } + }, + { + "name": "copilot_getVSCodeAPI", + "toolReferenceName": "vscodeAPI", + "displayName": "%copilot.tools.getVSCodeAPI.name%", + "icon": "$(references)", + "userDescription": "%copilot.vscode.tool.description%", + "modelDescription": "Get comprehensive VS Code API documentation and references for extension development. This tool provides authoritative documentation for VS Code's extensive API surface, including proposed APIs, contribution points, and best practices. Use this tool for understanding complex VS Code API interactions.\n\nWhen to use this tool:\n- User asks about specific VS Code APIs, interfaces, or extension capabilities\n- Need documentation for VS Code extension contribution points (commands, views, settings, etc.)\n- Questions about proposed APIs and their usage patterns\n- Understanding VS Code extension lifecycle, activation events, and packaging\n- Best practices for VS Code extension development architecture\n- API examples and code patterns for extension features\n- Troubleshooting extension-specific issues or API limitations\n\nWhen NOT to use this tool:\n- Creating simple standalone files or scripts unrelated to VS Code extensions\n- General programming questions not specific to VS Code extension development\n- Questions about using VS Code as an editor (user-facing features)\n- Non-extension related development tasks\n- File creation or editing that doesn't involve VS Code extension APIs\n\nCRITICAL usage guidelines:\n1. Always include specific API names, interfaces, or concepts in your query\n2. Mention the extension feature you're trying to implement\n3. Include context about proposed vs stable APIs when relevant\n4. Reference specific contribution points when asking about extension manifest\n5. Be specific about the VS Code version or API version when known\n\nScope: This tool is for EXTENSION DEVELOPMENT ONLY - building tools that extend VS Code itself, not for general file creation or non-extension programming tasks.", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "The query to search vscode documentation for. Should contain all relevant context." + } + }, + "required": [ + "query" + ] + }, + "tags": [] + }, + { + "name": "copilot_findFiles", + "toolReferenceName": "fileSearch", + "displayName": "%copilot.tools.findFiles.name%", + "userDescription": "%copilot.tools.findFiles.userDescription%", + "modelDescription": "Search for files in the workspace by glob pattern. This only returns the paths of matching files. Use this tool when you know the exact filename pattern of the files you're searching for. Glob patterns match from the root of the workspace folder. Examples:\n- **/*.{js,ts} to match all js/ts files in the workspace.\n- src/** to match all files under the top-level src folder.\n- **/foo/**/*.js to match all js files under any foo folder in the workspace.\n\nIn a multi-root workspace, you can scope the search to a specific workspace folder by using the absolute path to the folder as the query, e.g. /path/to/folder/**/*.ts.", + "tags": [ + "vscode_codesearch" + ], + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Search for files with names or paths matching this glob pattern. Can also be an absolute path to a workspace folder to scope the search in a multi-root workspace." + }, + "maxResults": { + "type": "number", + "description": "The maximum number of results to return. Do not use this unless necessary, it can slow things down. By default, only some matches are returned. If you use this and don't see what you're looking for, you can try again with a more specific query or a larger maxResults." + } + }, + "required": [ + "query" + ] + } + }, + { + "name": "copilot_findTextInFiles", + "toolReferenceName": "textSearch", + "displayName": "%copilot.tools.findTextInFiles.name%", + "userDescription": "%copilot.tools.findTextInFiles.userDescription%", + "modelDescription": "Do a fast text search in the workspace. Use this tool when you want to search with an exact string or regex. If you are not sure what words will appear in the workspace, prefer using regex patterns with alternation (|) or character classes to search for multiple potential words at once instead of making separate searches. For example, use 'function|method|procedure' to look for all of those words at once. Use includePattern to search within files matching a specific pattern, or in a specific file, using a relative path. Use 'includeIgnoredFiles' to include files normally ignored by .gitignore, other ignore files, and `files.exclude` and `search.exclude` settings. Warning: using this may cause the search to be slower, only set it when you want to search in ignored folders like node_modules or build outputs. Use this tool when you want to see an overview of a particular file, instead of using read_file many times to look for code within a file.\n\nIn a multi-root workspace, you can scope the search to a specific workspace folder by using the absolute path to the folder as the includePattern, e.g. /path/to/folder.", + "tags": [ + "vscode_codesearch" + ], + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "The pattern to search for in files in the workspace. Use regex with alternation (e.g., 'word1|word2|word3') or character classes to find multiple potential words in a single search. Be sure to set the isRegexp property properly to declare whether it's a regex or plain text pattern. Is case-insensitive." + }, + "isRegexp": { + "type": "boolean", + "description": "Whether the pattern is a regex." + }, + "includePattern": { + "type": "string", + "description": "Search files matching this glob pattern. Will be applied to the relative path of files within the workspace. To search recursively inside a folder, use a proper glob pattern like \"src/folder/**\". Do not use | in includePattern. Can also be an absolute path to a workspace folder to scope the search in a multi-root workspace." + }, + "maxResults": { + "type": "number", + "description": "The maximum number of results to return. Do not use this unless necessary, it can slow things down. By default, only some matches are returned. If you use this and don't see what you're looking for, you can try again with a more specific query or a larger maxResults." + }, + "includeIgnoredFiles": { + "type": "boolean", + "description": "Whether to include files that would normally be ignored according to .gitignore, other ignore files and `files.exclude` and `search.exclude` settings. Warning: using this may cause the search to be slower. Only set it when you want to search in ignored folders like node_modules or build outputs." + } + }, + "required": [ + "query", + "isRegexp" + ] + } + }, + { + "name": "copilot_applyPatch", + "displayName": "%copilot.tools.applyPatch.name%", + "toolReferenceName": "applyPatch", + "userDescription": "%copilot.tools.applyPatch.description%", + "modelDescription": "Edit text files. Do not use this tool to edit Jupyter notebooks. `apply_patch` allows you to execute a diff/patch against a text file, but the format of the diff specification is unique to this task, so pay careful attention to these instructions. To use the `apply_patch` command, you should pass a message of the following structure as \"input\":\n\n*** Begin Patch\n[YOUR_PATCH]\n*** End Patch\n\nWhere [YOUR_PATCH] is the actual content of your patch, specified in the following V4A diff format.\n\n*** [ACTION] File: [/absolute/path/to/file] -> ACTION can be one of Add, Update, or Delete.\nAn example of a message that you might pass as \"input\" to this function, in order to apply a patch, is shown below.\n\n*** Begin Patch\n*** Update File: /Users/someone/pygorithm/searching/binary_search.py\n@@class BaseClass\n@@ def search():\n- pass\n+ raise NotImplementedError()\n\n@@class Subclass\n@@ def search():\n- pass\n+ raise NotImplementedError()\n\n*** End Patch\nDo not use line numbers in this diff format.", + "inputSchema": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "The edit patch to apply." + }, + "explanation": { + "type": "string", + "description": "A short description of what the tool call is aiming to achieve." + } + }, + "required": [ + "input", + "explanation" + ] + } + }, + { + "name": "copilot_readFile", + "toolReferenceName": "readFile", + "legacyToolReferenceFullNames": [ + "search/readFile" + ], + "displayName": "%copilot.tools.readFile.name%", + "userDescription": "%copilot.tools.readFile.userDescription%", + "modelDescription": "Read the contents of a file.\n\nYou must specify the line range you're interested in. Line numbers are 1-indexed. If the file contents returned are insufficient for your task, you may call this tool again to retrieve more content. Prefer reading larger ranges over doing many small reads. Binary files use startLine/endLine as byte offsets.", + "tags": [ + "vscode_codesearch" + ], + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "description": "The absolute path of the file to read.", + "type": "string" + }, + "startLine": { + "type": "number", + "description": "The line number to start reading from, 1-based." + }, + "endLine": { + "type": "number", + "description": "The inclusive line number to end reading at, 1-based." + } + }, + "required": [ + "filePath", + "startLine", + "endLine" + ] + } + }, + { + "name": "copilot_viewImage", + "toolReferenceName": "viewImage", + "displayName": "%copilot.tools.viewImage.name%", + "userDescription": "%copilot.tools.viewImage.userDescription%", + "when": "config.github.copilot.chat.tools.viewImage.enabled", + "modelDescription": "View the contents of an image file. Use this instead of read_file for supported image files such as png, jpg, jpeg, gif, and webp. The tool returns the image directly to multimodal models and does not take line ranges or offsets.", + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "description": "The absolute path of the image file to view.", + "type": "string" + } + }, + "required": [ + "filePath" + ] + } + }, + { + "name": "copilot_listDirectory", + "toolReferenceName": "listDirectory", + "displayName": "%copilot.tools.listDirectory.name%", + "userDescription": "%copilot.tools.listDirectory.userDescription%", + "modelDescription": "List the contents of a directory. Result will have the name of the child. If the name ends in /, it's a folder, otherwise a file", + "tags": [ + "vscode_codesearch" + ], + "inputSchema": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "The absolute path to the directory to list." + } + }, + "required": [ + "path" + ] + } + }, + { + "name": "copilot_getErrors", + "displayName": "%copilot.tools.getErrors.name%", + "toolReferenceName": "problems", + "legacyToolReferenceFullNames": [ + "problems" + ], + "icon": "$(error)", + "userDescription": "%copilot.tools.errors.description%", + "modelDescription": "Get any compile or lint errors in a specific file or across all files. If the user mentions errors or problems in a file, they may be referring to these. Use the tool to see the same errors that the user is seeing. If the user asks you to analyze all errors, or does not specify a file, use this tool to gather errors for all files. Also use this tool after editing a file to validate the change.", + "tags": [], + "inputSchema": { + "type": "object", + "properties": { + "filePaths": { + "description": "The absolute paths to the files or folders to check for errors. Omit 'filePaths' when retrieving all errors.", + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + { + "name": "copilot_readProjectStructure", + "displayName": "%copilot.tools.readProjectStructure.name%", + "modelDescription": "Get a file tree representation of the workspace.", + "tags": [] + }, + { + "name": "copilot_getChangedFiles", + "displayName": "%copilot.tools.getChangedFiles.name%", + "toolReferenceName": "changes", + "legacyToolReferenceFullNames": [ + "changes" + ], + "icon": "$(diff)", + "userDescription": "%copilot.tools.changes.description%", + "modelDescription": "Get git diffs of current file changes in a git repository. Don't forget that you can use run_in_terminal to run git commands in a terminal as well.", + "when": "config.github.copilot.chat.getChangedFilesTool.enabled", + "tags": [ + "vscode_codesearch" + ], + "inputSchema": { + "type": "object", + "properties": { + "repositoryPath": { + "type": "string", + "description": "The absolute path to the git repository to look for changes in. If not provided, the active git repository will be used." + }, + "sourceControlState": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "staged", + "unstaged", + "merge-conflicts" + ] + }, + "description": "The kinds of git state to filter by. Allowed values are: 'staged', 'unstaged', and 'merge-conflicts'. If not provided, all states will be included." + } + } + } + }, + { + "name": "copilot_createNewWorkspace", + "displayName": "%github.copilot.tools.createNewWorkspace.name%", + "toolReferenceName": "newWorkspace", + "legacyToolReferenceFullNames": [ + "new/newWorkspace" + ], + "icon": "$(new-folder)", + "userDescription": "%github.copilot.tools.createNewWorkspace.userDescription%", + "when": "config.github.copilot.chat.newWorkspaceCreation.enabled", + "modelDescription": "Get comprehensive setup steps to help the user create complete project structures in a VS Code workspace. This tool is designed for full project initialization and scaffolding, not for creating individual files.\n\nWhen to use this tool:\n- User wants to create a new complete project from scratch\n- Setting up entire project frameworks (TypeScript projects, React apps, Node.js servers, etc.)\n- Initializing Model Context Protocol (MCP) servers with full structure\n- Creating VS Code extensions with proper scaffolding\n- Setting up Next.js, Vite, or other framework-based projects\n- User asks for \"new project\", \"create a workspace\", \"set up a [framework] project\"\n- Need to establish complete development environment with dependencies, config files, and folder structure\n\nWhen NOT to use this tool:\n- Creating single files or small code snippets\n- Adding individual files to existing projects\n- Making modifications to existing codebases\n- User asks to \"create a file\" or \"add a component\"\n- Simple code examples or demonstrations\n- Debugging or fixing existing code\n\nThis tool provides complete project setup including:\n- Folder structure creation\n- Package.json and dependency management\n- Configuration files (tsconfig, eslint, etc.)\n- Initial boilerplate code\n- Development environment setup\n- Build and run instructions\n\nUse other file creation tools for individual files within existing projects.", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "The query to use to generate the new workspace. This should be a clear and concise description of the workspace the user wants to create." + } + }, + "required": [ + "query" + ] + }, + "tags": [ + "enable_other_tool_install_extension" + ] + }, + { + "name": "copilot_installExtension", + "displayName": "Install Extension in VS Code", + "when": "!config.github.copilot.chat.installExtensionSkill.enabled", + "toolReferenceName": "installExtension", + "legacyToolReferenceFullNames": [ + "new/installExtension" + ], + "modelDescription": "Install an extension in VS Code. Use this tool to install an extension in Visual Studio Code as part of a new workspace creation process only.", + "inputSchema": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The ID of the extension to install. This should be in the format .." + }, + "name": { + "type": "string", + "description": "The name of the extension to install. This should be a clear and concise description of the extension." + } + }, + "required": [ + "id", + "name" + ] + }, + "tags": [] + }, + { + "name": "copilot_runVscodeCommand", + "displayName": "Run VS Code Command", + "when": "config.github.copilot.chat.newWorkspaceCreation.enabled", + "toolReferenceName": "runCommand", + "legacyToolReferenceFullNames": [ + "new/runVscodeCommand" + ], + "modelDescription": "Run a command in VS Code. Use this tool to run a command in Visual Studio Code as part of a new workspace creation process only.", + "inputSchema": { + "type": "object", + "properties": { + "commandId": { + "type": "string", + "description": "The ID of the command to execute. This should be in the format ." + }, + "name": { + "type": "string", + "description": "The name of the command to execute. This should be a clear and concise description of the command." + }, + "args": { + "type": "array", + "description": "The arguments to pass to the command. This should be an array of strings.", + "items": { + "type": "string" + } + }, + "skipCheck": { + "type": "boolean", + "description": "If true, skip checking whether the command exists before executing it." + } + }, + "required": [ + "commandId", + "name" + ] + }, + "tags": [] + }, + { + "name": "copilot_createNewJupyterNotebook", + "displayName": "Create New Jupyter Notebook", + "icon": "$(notebook)", + "toolReferenceName": "createJupyterNotebook", + "legacyToolReferenceFullNames": [ + "newJupyterNotebook" + ], + "modelDescription": "Generates a new Jupyter Notebook (.ipynb) in VS Code. Jupyter Notebooks are interactive documents commonly used for data exploration, analysis, visualization, and combining code with narrative text. Prefer creating plain Python files or similar unless a user explicitly requests creating a new Jupyter Notebook or already has a Jupyter Notebook opened or exists in the workspace.", + "userDescription": "%copilot.tools.newJupyterNotebook.description%", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "The query to use to generate the jupyter notebook. This should be a clear and concise description of the notebook the user wants to create." + } + }, + "required": [ + "query" + ] + }, + "tags": [] + }, + { + "name": "copilot_insertEdit", + "toolReferenceName": "insertEdit", + "displayName": "%copilot.tools.insertEdit.name%", + "modelDescription": "Insert new code into an existing file in the workspace. Use this tool once per file that needs to be modified, even if there are multiple changes for a file. Generate the \"explanation\" property first.\nThe system is very smart and can understand how to apply your edits to the files, you just need to provide minimal hints.\nAvoid repeating existing code, instead use comments to represent regions of unchanged code. Be as concise as possible. For example:\n// ...existing code...\n{ changed code }\n// ...existing code...\n{ changed code }\n// ...existing code...\n\nHere is an example of how you should use format an edit to an existing Person class:\nclass Person {\n\t// ...existing code...\n\tage: number;\n\t// ...existing code...\n\tgetAge() {\n\treturn this.age;\n\t}\n}", + "tags": [], + "inputSchema": { + "type": "object", + "properties": { + "explanation": { + "type": "string", + "description": "A short explanation of the edit being made." + }, + "filePath": { + "type": "string", + "description": "An absolute path to the file to edit." + }, + "code": { + "type": "string", + "description": "The code change to apply to the file.\nThe system is very smart and can understand how to apply your edits to the files, you just need to provide minimal hints.\nAvoid repeating existing code, instead use comments to represent regions of unchanged code. Be as concise as possible. For example:\n// ...existing code...\n{ changed code }\n// ...existing code...\n{ changed code }\n// ...existing code...\n\nHere is an example of how you should use format an edit to an existing Person class:\nclass Person {\n\t// ...existing code...\n\tage: number;\n\t// ...existing code...\n\tgetAge() {\n\t\treturn this.age;\n\t}\n}" + } + }, + "required": [ + "explanation", + "filePath", + "code" + ] + } + }, + { + "name": "copilot_createFile", + "toolReferenceName": "createFile", + "legacyToolReferenceFullNames": [ + "createFile" + ], + "displayName": "%copilot.tools.createFile.name%", + "userDescription": "%copilot.tools.createFile.description%", + "modelDescription": "This is a tool for creating a new file in the workspace. The file will be created with the specified content. The directory will be created if it does not already exist. Never use this tool to edit a file that already exists.", + "tags": [], + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "type": "string", + "description": "The absolute path to the file to create." + }, + "content": { + "type": "string", + "description": "The content to write to the file." + } + }, + "required": [ + "filePath", + "content" + ] + } + }, + { + "name": "copilot_createDirectory", + "toolReferenceName": "createDirectory", + "legacyToolReferenceFullNames": [ + "createDirectory" + ], + "displayName": "%copilot.tools.createDirectory.name%", + "userDescription": "%copilot.tools.createDirectory.description%", + "modelDescription": "Create a new directory structure in the workspace. Will recursively create all directories in the path, like mkdir -p. You do not need to use this tool before using create_file, that tool will automatically create the needed directories.", + "tags": [], + "inputSchema": { + "type": "object", + "properties": { + "dirPath": { + "type": "string", + "description": "The absolute path to the directory to create." + } + }, + "required": [ + "dirPath" + ] + } + }, + { + "name": "copilot_replaceString", + "toolReferenceName": "replaceString", + "displayName": "%copilot.tools.replaceString.name%", + "modelDescription": "This is a tool for making edits in an existing file in the workspace. For moving or renaming files, use run in terminal tool with the 'mv' command instead. For larger edits, split them into smaller edits and call the edit tool multiple times to ensure accuracy. Before editing, always ensure you have the context to understand the file's contents and context. To edit a file, provide: 1) filePath (absolute path), 2) oldString (MUST be the exact literal text to replace including all whitespace, indentation, newlines, and surrounding code etc), and 3) newString (MUST be the exact literal text to replace \\`oldString\\` with (also including all whitespace, indentation, newlines, and surrounding code etc.). Ensure the resulting code is correct and idiomatic.). Each use of this tool replaces exactly ONE occurrence of oldString.\n\nCRITICAL for \\`oldString\\`: Must uniquely identify the single instance to change. Include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. If this string matches multiple locations, or does not match exactly, the tool will fail. Never use 'Lines 123-456 omitted' from summarized documents or ...existing code... comments in the oldString or newString.", + "when": "!config.github.copilot.chat.disableReplaceTool", + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "type": "string", + "description": "An absolute path to the file to edit." + }, + "oldString": { + "type": "string", + "description": "The exact literal text to replace, preferably unescaped. For single replacements (default), include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. For multiple replacements, specify expected_replacements parameter. If this string is not the exact literal text (i.e. you escaped it) or does not match exactly, the tool will fail." + }, + "newString": { + "type": "string", + "description": "The exact literal text to replace `old_string` with, preferably unescaped. Provide the EXACT text. Ensure the resulting code is correct and idiomatic." + } + }, + "required": [ + "filePath", + "oldString", + "newString" + ] + } + }, + { + "name": "copilot_multiReplaceString", + "toolReferenceName": "multiReplaceString", + "displayName": "%copilot.tools.multiReplaceString.name%", + "modelDescription": "This tool allows you to apply multiple replace_string_in_file operations in a single call, which is more efficient than calling replace_string_in_file multiple times. It takes an array of replacement operations and applies them sequentially. Each replacement operation has the same parameters as replace_string_in_file: filePath, oldString, newString, and explanation. This tool is ideal when you need to make multiple edits across different files or multiple edits in the same file. The tool will provide a summary of successful and failed operations.", + "when": "!config.github.copilot.chat.disableReplaceTool", + "inputSchema": { + "type": "object", + "properties": { + "explanation": { + "type": "string", + "description": "A brief explanation of what the multi-replace operation will accomplish." + }, + "replacements": { + "type": "array", + "description": "An array of replacement operations to apply sequentially.", + "items": { + "type": "object", + "properties": { + "filePath": { + "type": "string", + "description": "An absolute path to the file to edit." + }, + "oldString": { + "type": "string", + "description": "The exact literal text to replace, preferably unescaped. Include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. If this string is not the exact literal text or does not match exactly, this replacement will fail." + }, + "newString": { + "type": "string", + "description": "The exact literal text to replace `oldString` with, preferably unescaped. Provide the EXACT text. Ensure the resulting code is correct and idiomatic." + } + }, + "required": [ + "filePath", + "oldString", + "newString" + ] + }, + "minItems": 1 + } + }, + "required": [ + "explanation", + "replacements" + ] + } + }, + { + "name": "copilot_editNotebook", + "toolReferenceName": "editNotebook", + "icon": "$(pencil)", + "displayName": "%copilot.tools.editNotebook.name%", + "userDescription": "%copilot.tools.editNotebook.userDescription%", + "modelDescription": "This is a tool for editing an existing Notebook file in the workspace. Generate the \"explanation\" property first.\nThe system is very smart and can understand how to apply your edits to the notebooks.\nWhen updating the content of an existing cell, ensure newCode preserves whitespace and indentation exactly and does NOT include any code markers such as (...existing code...).", + "tags": [ + "enable_other_tool_copilot_getNotebookSummary" + ], + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "type": "string", + "description": "An absolute path to the notebook file to edit, or the URI of a untitled, not yet named, file, such as `untitled:Untitled-1." + }, + "cellId": { + "type": "string", + "description": "Id of the cell that needs to be deleted or edited. Use the value `TOP`, `BOTTOM` when inserting a cell at the top or bottom of the notebook, else provide the id of the cell after which a new cell is to be inserted. Remember, if a cellId is provided and editType=insert, then a cell will be inserted after the cell with the provided cellId." + }, + "newCode": { + "anyOf": [ + { + "type": "string", + "description": "The code for the new or existing cell to be edited. Code should not be wrapped within tags. Do NOT include code markers such as (...existing code...) to indicate existing code." + }, + { + "type": "array", + "items": { + "type": "string", + "description": "The code for the new or existing cell to be edited. Code should not be wrapped within tags" + } + } + ] + }, + "language": { + "type": "string", + "description": "The language of the cell. `markdown`, `python`, `javascript`, `julia`, etc." + }, + "editType": { + "type": "string", + "enum": [ + "insert", + "delete", + "edit" + ], + "description": "The operation peformed on the cell, whether `insert`, `delete` or `edit`.\nUse the `editType` field to specify the operation: `insert` to add a new cell, `edit` to modify an existing cell's content, and `delete` to remove a cell." + } + }, + "required": [ + "filePath", + "editType", + "cellId" + ] + } + }, + { + "name": "copilot_runNotebookCell", + "displayName": "%copilot.tools.runNotebookCell.name%", + "toolReferenceName": "runNotebookCell", + "legacyToolReferenceFullNames": [ + "runNotebooks/runCell" + ], + "icon": "$(play)", + "modelDescription": "This is a tool for running a code cell in a notebook file directly in the notebook editor. The output from the execution will be returned. Code cells should be run as they are added or edited when working through a problem to bring the kernel state up to date and ensure the code executes successfully. Code cells are ready to run and don't require any pre-processing. If asked to run the first cell in a notebook, you should run the first code cell since markdown cells cannot be executed. NOTE: Avoid executing Markdown cells or providing Markdown cell IDs, as Markdown cells cannot be executed.", + "userDescription": "%copilot.tools.runNotebookCell.description%", + "tags": [ + "enable_other_tool_copilot_getNotebookSummary" + ], + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "type": "string", + "description": "An absolute path to the notebook file with the cell to run, or the URI of a untitled, not yet named, file, such as `untitled:Untitled-1.ipynb" + }, + "reason": { + "type": "string", + "description": "An optional explanation of why the cell is being run. This will be shown to the user before the tool is run and is not necessary if it's self-explanatory." + }, + "cellId": { + "type": "string", + "description": "The ID for the code cell to execute. Avoid providing markdown cell IDs as nothing will be executed." + }, + "continueOnError": { + "type": "boolean", + "description": "Whether or not execution should continue for remaining cells if an error is encountered. Default to false unless instructed otherwise." + } + }, + "required": [ + "filePath", + "cellId" + ] + } + }, + { + "name": "copilot_getNotebookSummary", + "toolReferenceName": "getNotebookSummary", + "legacyToolReferenceFullNames": [ + "runNotebooks/getNotebookSummary" + ], + "displayName": "Get the structure of a notebook", + "modelDescription": "This is a tool returns the list of the Notebook cells along with the id, cell types, line ranges, language, execution information and output mime types for each cell. This is useful to get Cell Ids when executing a notebook or determine what cells have been executed and what order, or what cells have outputs. If required to read contents of a cell use this to determine the line range of a cells, and then use read_file tool to read a specific line range. Requery this tool if the contents of the notebook change.", + "tags": [], + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "type": "string", + "description": "An absolute path to the notebook file with the cell to run, or the URI of a untitled, not yet named, file, such as `untitled:Untitled-1.ipynb" + } + }, + "required": [ + "filePath" + ] + } + }, + { + "name": "copilot_readNotebookCellOutput", + "displayName": "%copilot.tools.getNotebookCellOutput.name%", + "toolReferenceName": "readNotebookCellOutput", + "legacyToolReferenceFullNames": [ + "runNotebooks/readNotebookCellOutput" + ], + "icon": "$(notebook-render-output)", + "modelDescription": "This tool will retrieve the output for a notebook cell from its most recent execution or restored from disk. The cell may have output even when it has not been run in the current kernel session. This tool has a higher token limit for output length than the runNotebookCell tool.", + "userDescription": "%copilot.tools.getNotebookCellOutput.description%", + "tags": [], + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "type": "string", + "description": "An absolute path to the notebook file with the cell to run, or the URI of a untitled, not yet named, file, such as `untitled:Untitled-1.ipynb" + }, + "cellId": { + "type": "string", + "description": "The ID of the cell for which output should be retrieved." + } + }, + "required": [ + "filePath", + "cellId" + ] + } + }, + { + "name": "copilot_fetchWebPage", + "displayName": "%copilot.tools.fetchWebPage.name%", + "toolReferenceName": "fetch", + "legacyToolReferenceFullNames": [ + "fetch" + ], + "when": "!isWeb", + "icon": "$(globe)", + "userDescription": "%copilot.tools.fetchWebPage.description%", + "modelDescription": "Fetches the main content from a web page. This tool is useful for summarizing or analyzing the content of a webpage. You should use this tool when you think the user is looking for information from a specific webpage.", + "tags": [], + "inputSchema": { + "type": "object", + "properties": { + "urls": { + "type": "array", + "items": { + "type": "string" + }, + "description": "An array of URLs to fetch content from." + }, + "query": { + "type": "string", + "description": "The query to search for in the web page's content. This should be a clear and concise description of the content you want to find." + } + }, + "required": [ + "urls", + "query" + ] + } + }, + { + "name": "copilot_findTestFiles", + "displayName": "%copilot.tools.findTestFiles.name%", + "icon": "$(beaker)", + "canBeReferencedInPrompt": false, + "toolReferenceName": "findTestFiles", + "userDescription": "%copilot.tools.findTestFiles.description%", + "modelDescription": "For a source code file, find the file that contains the tests. For a test file find the file that contains the code under test.", + "tags": [], + "inputSchema": { + "type": "object", + "properties": { + "filePaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "filePaths" + ] + } + }, + { + "name": "copilot_githubRepo", + "toolReferenceName": "githubRepo", + "legacyToolReferenceFullNames": [ + "githubRepo" + ], + "displayName": "%github.copilot.tools.githubRepo.name%", + "modelDescription": "Searches a GitHub repository for relevant source code snippets. Only use this tool if the user is very clearly asking for code snippets from a specific GitHub repository. Do not use this tool for Github repos that the user has open in their workspace.", + "userDescription": "%github.copilot.tools.githubRepo.userDescription%", + "icon": "$(repo)", + "when": "!config.github.copilot.chat.githubMcpServer.enabled", + "inputSchema": { + "type": "object", + "properties": { + "repo": { + "type": "string", + "description": "The name of the Github repository to search for code in. Should must be formatted as '/'." + }, + "query": { + "type": "string", + "description": "The query to search for repo. Should contain all relevant context." + } + }, + "required": [ + "repo", + "query" + ] + } + }, + { + "name": "copilot_githubTextSearch", + "legacyToolReferenceFullNames": [ + "githubTextSearch" + ], + "toolReferenceName": "githubTextSearch", + "displayName": "%github.copilot.tools.githubTextSearch.name%", + "modelDescription": "Lexically searches a GitHub repository or organization for files containing specific keywords or code patterns. Use this when looking for exact strings, function names, or identifiers in a GitHub repo or org. Unlike the semantic search tool, this uses keyword matching rather than meaning-based search.", + "userDescription": "%github.copilot.tools.githubTextSearch.userDescription%", + "icon": "$(search)", + "inputSchema": { + "type": "object", + "properties": { + "scope": { + "type": "string", + "description": "The GitHub scope to search. Use 'owner/repo' to search a single repository, or an org name (no slash) to search across an entire organization." + }, + "query": { + "type": "string", + "description": "The keyword search query. Supports GitHub code search syntax such as 'language:typescript', 'extension:ts', 'path:src/', etc." + }, + "maxResults": { + "type": "number", + "description": "Optional. The maximum number of search results to return. Defaults to 100." + } + }, + "required": [ + "scope", + "query" + ] + } + }, + { + "name": "copilot_switchAgent", + "toolReferenceName": "switchAgent", + "displayName": "%copilot.tools.switchAgent.name%", + "userDescription": "%copilot.tools.switchAgent.description%", + "modelDescription": "Switch to the Plan agent to align on approach before implementing. Plan will explore the codebase, gathers context, clarifies requirements with the user, and creates an actionable implementation plan.\n\nSWITCH TO PLAN when ANY of these apply:\n1. Adding new functionality - where should it go? What patterns to follow?\n2. Multiple valid approaches exist - choosing between technologies, patterns, or strategies\n3. Modifying existing behavior - unclear what should change or what side effects exist\n4. Architectural decisions required - choosing between design patterns or integration approaches\n5. Changes span multiple files - refactoring, migrations, or cross-cutting concerns\n6. Requirements are underspecified - need to explore before understanding scope\n\nEXAMPLES:\n✓ Switch to Plan:\n- \"Add authentication to the app\" → architectural decisions needed (session vs JWT, middleware)\n- \"Refactor this data flow\" → must understand component dependencies first\n- \"Migrate from X to Y\" → requires understanding current structure\n\n✗ Do NOT switch to Plan:\n- User attached a detailed spec, plan, or requirements doc → context already provided\n- You already started editing files in this conversation → too late to switch\n- Single obvious change like fixing a typo or renaming → just do it\n- User gave explicit step-by-step instructions → follow them directly", + "when": "config.github.copilot.chat.switchAgent.enabled", + "icon": "$(arrow-swap)", + "inputSchema": { + "type": "object", + "properties": { + "agentName": { + "type": "string", + "description": "The name of the agent to switch to. Currently only 'Plan' is supported.", + "enum": [ + "Plan" + ] + } + }, + "required": [ + "agentName" + ] + } + }, + { + "name": "copilot_memory", + "displayName": "Memory", + "toolReferenceName": "memory", + "userDescription": "Manage persistent memory across conversations", + "modelDescription": "Manage a persistent memory system with three scopes for storing notes and information across conversations.\n\nMemory is organized under /memories/ with three tiers:\n- `/memories/` — User memory: persistent notes that survive across all workspaces and conversations. Store preferences, patterns, and general insights here.\n- `/memories/session/` — Session memory: notes scoped to the current conversation. Store task-specific context and in-progress notes here. Cleared after the conversation ends.\n- `/memories/repo/` — Repository memory: repository-scoped notes stored locally in the workspace. Store codebase conventions, build commands, project structure facts, and verified practices here.\n\nIMPORTANT: Before creating new memory files, first view the /memories/ directory to understand what already exists. This helps avoid duplicates and maintain organized notes.\n\nCommands:\n- `view`: View contents of a file or list directory contents. Can be used on files or directories (e.g., \"/memories/\" to see all top-level items).\n- `create`: Create a new file at the specified path with the given content. Fails if the file already exists.\n- `str_replace`: Replace an exact string in a file with a new string. The old_str must appear exactly once in the file.\n- `insert`: Insert text at a specific line number in a file. Line 0 inserts at the beginning.\n- `delete`: Delete a file or directory (and all its contents).\n- `rename`: Rename or move a file or directory from path to new_path. Cannot rename across scopes.", + "inputSchema": { + "type": "object", + "properties": { + "command": { + "type": "string", + "enum": [ + "view", + "create", + "str_replace", + "insert", + "delete", + "rename" + ], + "description": "The operation to perform on the memory file system." + }, + "path": { + "type": "string", + "description": "The absolute path to the file or directory inside /memories/, e.g. \"/memories/notes.md\". Used by all commands except `rename`." + }, + "file_text": { + "type": "string", + "description": "Required for `create`. The content of the file to create." + }, + "old_str": { + "type": "string", + "description": "Required for `str_replace`. The exact string in the file to replace. Must appear exactly once." + }, + "new_str": { + "type": "string", + "description": "Required for `str_replace`. The new string to replace old_str with." + }, + "insert_line": { + "type": "number", + "description": "Required for `insert`. The 0-based line number to insert text at. 0 inserts before the first line." + }, + "insert_text": { + "type": "string", + "description": "Required for `insert`. The text to insert at the specified line." + }, + "view_range": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 2, + "maxItems": 2, + "description": "Optional for `view`. A two-element array [start_line, end_line] (1-indexed) to view a specific range of lines." + }, + "old_path": { + "type": "string", + "description": "Required for `rename`. The current path of the file or directory to rename." + }, + "new_path": { + "type": "string", + "description": "Required for `rename`. The new path for the file or directory." + } + }, + "required": [ + "command" + ] + } + }, + { + "name": "copilot_resolveMemoryFileUri", + "displayName": "Resolve Memory File URI", + "toolReferenceName": "resolveMemoryFileUri", + "userDescription": "Resolve a memory file path to its actual URI", + "modelDescription": "Resolve a memory file path (like /memories/session/plan.md or /memories/repo/notes.md) to its fully qualified URI. Use this when you need the actual URI for a memory file, for example to pass it to setArtifacts. The path must start with /memories/.", + "tags": [], + "inputSchema": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "The memory file path to resolve (e.g. /memories/session/plan.md)." + } + }, + "required": [ + "path" + ] + } + }, + { + "name": "copilot_editFiles", + "modelDescription": "This is a placeholder tool, do not use", + "userDescription": "Edit files", + "icon": "$(pencil)", + "displayName": "Edit Files", + "toolReferenceName": "editFiles", + "legacyToolReferenceFullNames": [ + "editFiles" + ] + }, + { + "name": "copilot_sessionStoreSql", + "displayName": "Session Store SQL", + "toolReferenceName": "sessionStoreSql", + "when": "github.copilot.sessionSearch.enabled", + "userDescription": "Query your Copilot session history using SQL", + "modelDescription": "Query the local session store containing history from past coding sessions. Uses SQLite syntax (NOT DuckDB or Postgres). SQL queries are read-only — only SELECT and WITH are allowed. Use `datetime('now', '-1 day')` for date math (NOT `now() - INTERVAL '1 day'`), FTS5 `MATCH` for text search.\n\nTables: `sessions`, `turns`, `session_files`, `session_refs`, `checkpoints`, `search_index`. For column details and query patterns, use the **chronicle** skill.\n\nActions: 'query' (execute SQL — supports JOINs, FTS5 MATCH, aggregations), 'standup' (pre-fetch last 24h data), 'reindex' (rebuild index from debug logs).", + "tags": [], + "canBeReferencedInPrompt": false, + "inputSchema": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "query", + "standup", + "reindex" + ], + "description": "The action to perform. 'query' (default) executes a SQL query. 'standup' pre-fetches last 24h session data for standup reports. 'reindex' rebuilds the local session index and syncs to cloud if enabled." + }, + "query": { + "type": "string", + "description": "A single read-only SQL query to execute. Required when action is 'query'. Supports SELECT, WITH, JOINs, aggregations, and FTS5 MATCH. Only one statement per call — do not combine multiple queries with semicolons." + }, + "force": { + "type": "boolean", + "description": "When true with action 'reindex', re-processes all sessions including already-indexed ones. Default false (skips already-indexed sessions)." + }, + "description": { + "type": "string", + "description": "A 2-5 word summary of what this call does (e.g. 'Recent sessions overview', 'Generate standup', 'Reindex sessions')." + } + }, + "required": [ + "description" + ] + } + } + ], + "languageModelToolSets": [ + { + "name": "edit", + "description": "%copilot.toolSet.editing.description%", + "icon": "$(pencil)", + "tools": [ + "createDirectory", + "createFile", + "createJupyterNotebook", + "editFiles", + "editNotebook", + "rename" + ] + }, + { + "name": "execute", + "description": "", + "tools": [ + "runNotebookCell", + "executionSubagent" + ] + }, + { + "name": "read", + "description": "%copilot.toolSet.read.description%", + "icon": "$(eye)", + "tools": [ + "getNotebookSummary", + "problems", + "readFile", + "viewImage", + "readNotebookCellOutput", + "skill" + ] + }, + { + "name": "search", + "description": "%copilot.toolSet.search.description%", + "icon": "$(search)", + "tools": [ + "changes", + "codebase", + "fileSearch", + "listDirectory", + "textSearch", + "searchSubagent", + "usages" + ] + }, + { + "name": "vscode", + "description": "", + "tools": [ + "installExtension", + "memory", + "newWorkspace", + "resolveMemoryFileUri", + "runCommand", + "switchAgent", + "toolSearch", + "vscodeAPI" + ] + }, + { + "name": "web", + "description": "%copilot.toolSet.web.description%", + "icon": "$(globe)", + "tools": [ + "fetch", + "githubRepo", + "githubTextSearch" + ] + } + ], + "chatParticipants": [ + { + "id": "github.copilot.default", + "name": "GitHubCopilot", + "fullName": "GitHub Copilot", + "description": "%copilot.description%", + "isDefault": true, + "locations": [ + "panel" + ], + "modes": [ + "ask" + ], + "disambiguation": [ + { + "category": "generate_code_sample", + "description": "The user wants to generate code snippets without referencing the contents of the current workspace. This category does not include generating entire projects.", + "examples": [ + "Write an example of computing a SHA256 hash." + ] + }, + { + "category": "add_feature_to_file", + "description": "The user wants to change code in a file that is provided in their request, without referencing the contents of the current workspace. This category does not include generating entire projects.", + "examples": [ + "Add a refresh button to the table widget." + ] + }, + { + "category": "question_about_specific_files", + "description": "The user has a question about a specific file or code snippet that they have provided as part of their query, and the question does not require additional workspace context to answer.", + "examples": [ + "What does this file do?" + ] + } + ], + "commands": [ + { + "name": "explain", + "description": "%copilot.workspace.explain.description%" + }, + { + "name": "review", + "description": "%copilot.workspace.review.description%", + "when": "github.copilot.advanced.review.intent" + }, + { + "name": "tests", + "description": "%copilot.workspace.tests.description%", + "disambiguation": [ + { + "category": "create_tests", + "description": "The user wants to generate unit tests.", + "examples": [ + "Generate tests for my selection using pytest." + ] + } + ] + }, + { + "name": "fix", + "description": "%copilot.workspace.fix.description%", + "sampleRequest": "%copilot.workspace.fix.sampleRequest%" + }, + { + "name": "new", + "description": "%copilot.workspace.new.description%", + "sampleRequest": "%copilot.workspace.new.sampleRequest%", + "isSticky": true, + "disambiguation": [ + { + "category": "create_new_workspace_or_extension", + "description": "The user wants to create a complete Visual Studio Code workspace from scratch, such as a new application or a Visual Studio Code extension. Use this category only if the question relates to generating or creating new workspaces in Visual Studio Code. Do not use this category for updating existing code or generating sample code snippets", + "examples": [ + "Scaffold a Node server.", + "Create a sample project which uses the fileSystemProvider API.", + "react application" + ] + } + ] + }, + { + "name": "newNotebook", + "description": "%copilot.workspace.newNotebook.description%", + "sampleRequest": "%copilot.workspace.newNotebook.sampleRequest%", + "disambiguation": [ + { + "category": "create_jupyter_notebook", + "description": "The user wants to create a new Jupyter notebook in Visual Studio Code.", + "examples": [ + "Create a notebook to analyze this CSV file." + ] + } + ] + }, + { + "name": "semanticSearch", + "description": "%copilot.workspace.semanticSearch.description%", + "sampleRequest": "%copilot.workspace.semanticSearch.sampleRequest%", + "when": "config.github.copilot.semanticSearch.enabled" + }, + { + "name": "setupTests", + "description": "%copilot.vscode.setupTests.description%", + "sampleRequest": "%copilot.vscode.setupTests.sampleRequest%", + "when": "config.github.copilot.chat.setupTests.enabled", + "disambiguation": [ + { + "category": "set_up_tests", + "description": "The user wants to configure project test setup, framework, or test runner. The user does not want to fix their existing tests.", + "examples": [ + "Set up tests for this project." + ] + } + ] + } + ] + }, + { + "id": "github.copilot.editingSession", + "name": "GitHubCopilot", + "fullName": "GitHub Copilot", + "description": "%copilot.edits.description%", + "isDefault": true, + "locations": [ + "panel" + ], + "modes": [ + "edit" + ] + }, + { + "id": "github.copilot.editingSessionEditor", + "name": "GitHubCopilot", + "fullName": "GitHub Copilot", + "description": "%copilot.edits.description%", + "isDefault": true, + "locations": [ + "editor" + ], + "commands": [] + }, + { + "id": "github.copilot.editsAgent", + "name": "agent", + "fullName": "GitHub Copilot", + "description": "%copilot.agent.description%", + "locations": [ + "panel" + ], + "modes": [ + "agent" + ], + "isEngine": true, + "isDefault": true, + "isAgent": true, + "when": "config.chat.agent.enabled", + "commands": [ + { + "name": "error", + "description": "Make a model request which will result in an error", + "when": "github.copilot.chat.debug" + }, + { + "name": "compact", + "description": "%copilot.agent.compact.description%" + }, + { + "name": "explain", + "description": "%copilot.workspace.explain.description%" + }, + { + "name": "review", + "description": "%copilot.workspace.review.description%", + "when": "github.copilot.advanced.review.intent" + }, + { + "name": "tests", + "description": "%copilot.workspace.tests.description%", + "disambiguation": [ + { + "category": "create_tests", + "description": "The user wants to generate unit tests.", + "examples": [ + "Generate tests for my selection using pytest." + ] + } + ] + }, + { + "name": "fix", + "description": "%copilot.workspace.fix.description%", + "sampleRequest": "%copilot.workspace.fix.sampleRequest%" + }, + { + "name": "new", + "description": "%copilot.workspace.new.description%", + "sampleRequest": "%copilot.workspace.new.sampleRequest%", + "isSticky": true, + "disambiguation": [ + { + "category": "create_new_workspace_or_extension", + "description": "The user wants to create a complete Visual Studio Code workspace from scratch, such as a new application or a Visual Studio Code extension. Use this category only if the question relates to generating or creating new workspaces in Visual Studio Code. Do not use this category for updating existing code or generating sample code snippets", + "examples": [ + "Scaffold a Node server.", + "Create a sample project which uses the fileSystemProvider API.", + "react application" + ] + } + ] + }, + { + "name": "newNotebook", + "description": "%copilot.workspace.newNotebook.description%", + "sampleRequest": "%copilot.workspace.newNotebook.sampleRequest%", + "disambiguation": [ + { + "category": "create_jupyter_notebook", + "description": "The user wants to create a new Jupyter notebook in Visual Studio Code.", + "examples": [ + "Create a notebook to analyze this CSV file." + ] + } + ] + }, + { + "name": "semanticSearch", + "description": "%copilot.workspace.semanticSearch.description%", + "sampleRequest": "%copilot.workspace.semanticSearch.sampleRequest%", + "when": "config.github.copilot.semanticSearch.enabled" + }, + { + "name": "setupTests", + "description": "%copilot.vscode.setupTests.description%", + "sampleRequest": "%copilot.vscode.setupTests.sampleRequest%", + "when": "config.github.copilot.chat.setupTests.enabled", + "disambiguation": [ + { + "category": "set_up_tests", + "description": "The user wants to configure project test setup, framework, or test runner. The user does not want to fix their existing tests.", + "examples": [ + "Set up tests for this project." + ] + } + ] + } + ] + }, + { + "id": "github.copilot.notebook", + "name": "GitHubCopilot", + "fullName": "GitHub Copilot", + "description": "%copilot.description%", + "isDefault": true, + "locations": [ + "notebook" + ], + "when": "!config.inlineChat.notebookAgent", + "commands": [ + { + "name": "fix", + "description": "%copilot.workspace.fix.description%" + }, + { + "name": "explain", + "description": "%copilot.workspace.explain.description%" + } + ] + }, + { + "id": "github.copilot.notebookEditorAgent", + "name": "GitHubCopilot", + "fullName": "GitHub Copilot", + "description": "%copilot.description%", + "isDefault": true, + "locations": [ + "notebook" + ], + "when": "config.inlineChat.notebookAgent", + "commands": [ + { + "name": "fix", + "description": "%copilot.workspace.fix.description%" + }, + { + "name": "explain", + "description": "%copilot.workspace.explain.description%" + } + ] + }, + { + "id": "github.copilot.vscode", + "name": "vscode", + "fullName": "VS Code", + "description": "%copilot.vscode.description%", + "when": "!github.copilot.interactiveSession.disabled", + "sampleRequest": "%copilot.vscode.sampleRequest%", + "locations": [ + "panel" + ], + "disambiguation": [ + { + "category": "vscode_configuration_questions", + "description": "The user wants to learn about, use, or configure the Visual Studio Code. Use this category if the users question is specifically about commands, settings, keybindings, extensions and other features available in Visual Studio Code. Do not use this category to answer questions about generating code or creating new projects including Visual Studio Code extensions.", + "examples": [ + "Switch to light mode.", + "Keyboard shortcut to toggle terminal visibility.", + "Settings to enable minimap.", + "Whats new in the latest release?" + ] + }, + { + "category": "configure_python_environment", + "description": "The user wants to set up their Python environment.", + "examples": [ + "Create a virtual environment for my project." + ] + } + ], + "commands": [ + { + "name": "search", + "description": "%copilot.vscode.search.description%", + "sampleRequest": "%copilot.vscode.search.sampleRequest%" + } + ] + }, + { + "id": "github.copilot.terminal", + "name": "terminal", + "fullName": "Terminal", + "description": "%copilot.terminal.description%", + "when": "!github.copilot.interactiveSession.disabled", + "sampleRequest": "%copilot.terminal.sampleRequest%", + "isDefault": true, + "locations": [ + "terminal" + ], + "commands": [ + { + "name": "explain", + "description": "%copilot.terminal.explain.description%", + "sampleRequest": "%copilot.terminal.explain.sampleRequest%" + } + ] + }, + { + "id": "github.copilot.terminalPanel", + "name": "terminal", + "fullName": "Terminal", + "description": "%copilot.terminalPanel.description%", + "when": "!github.copilot.interactiveSession.disabled", + "sampleRequest": "%copilot.terminal.sampleRequest%", + "locations": [ + "panel" + ], + "commands": [ + { + "name": "explain", + "description": "%copilot.terminal.explain.description%", + "sampleRequest": "%copilot.terminal.explain.sampleRequest%", + "disambiguation": [ + { + "category": "terminal_state_questions", + "description": "The user wants to learn about specific state such as the selection, command, or failed command in the integrated terminal in Visual Studio Code.", + "examples": [ + "Why did the latest terminal command fail?" + ] + } + ] + } + ] + } + ], + "languageModelChatProviders": [ + { + "vendor": "copilot", + "displayName": "Copilot" + }, + { + "vendor": "copilotcli", + "displayName": "Copilot CLI", + "when": "false" + }, + { + "vendor": "claude-code", + "displayName": "Claude Code", + "when": "false" + }, + { + "vendor": "anthropic", + "displayName": "Anthropic", + "configuration": { + "properties": { + "apiKey": { + "type": "string", + "secret": true, + "description": "API key for Anthropic", + "title": "API Key" + } + }, + "required": [ + "apiKey" + ] + } + }, + { + "vendor": "xai", + "displayName": "xAI", + "configuration": { + "properties": { + "apiKey": { + "type": "string", + "secret": true, + "description": "API key for xAI", + "title": "API Key" + } + }, + "required": [ + "apiKey" + ] + } + }, + { + "vendor": "gemini", + "displayName": "Google", + "configuration": { + "properties": { + "apiKey": { + "type": "string", + "secret": true, + "description": "API key for Google Gemini", + "title": "API Key" + } + }, + "required": [ + "apiKey" + ] + } + }, + { + "vendor": "openrouter", + "displayName": "OpenRouter", + "configuration": { + "properties": { + "apiKey": { + "type": "string", + "secret": true, + "description": "API key for OpenRouter", + "title": "API Key" + } + }, + "required": [ + "apiKey" + ] + } + }, + { + "vendor": "openai", + "displayName": "OpenAI", + "configuration": { + "properties": { + "apiKey": { + "type": "string", + "secret": true, + "description": "API key for OpenAI", + "title": "API Key" + } + }, + "required": [ + "apiKey" + ] + } + }, + { + "vendor": "ollama", + "displayName": "Ollama", + "configuration": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The endpoint URL for the Ollama server", + "default": "http://localhost:11434", + "title": "URL" + } + }, + "required": [ + "url" + ] + } + }, + { + "vendor": "customoai", + "when": "productQualityType != 'stable'", + "displayName": "OpenAI Compatible (Deprecated)", + "configuration": { + "type": "object", + "properties": { + "apiKey": { + "type": "string", + "secret": true, + "description": "API key for the models", + "title": "API Key", + "markdownDeprecationMessage": "**Deprecated.** Use the `customendpoint` provider (\"Custom Endpoint\") instead. It supports the Chat Completions API, the Responses API, and the Messages API — selectable per model via the `apiType` property." + }, + "models": { + "type": "array", + "markdownDeprecationMessage": "**Deprecated.** Use the `customendpoint` provider (\"Custom Endpoint\") instead. It supports the Chat Completions API, the Responses API, and the Messages API — selectable per model via the `apiType` property.", + "defaultSnippets": [ + { + "label": "New Model", + "description": "Add a new custom model configuration", + "body": [ + { + "id": "$1", + "name": "$2", + "url": "$3", + "toolCalling": "^${4|true,false|}", + "vision": "^${5|true,false|}", + "maxInputTokens": "^${6:128000}", + "maxOutputTokens": "^${7:16000}" + } + ] + } + ], + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the model" + }, + "name": { + "type": "string", + "description": "Display name of the custom OpenAI model" + }, + "url": { + "type": "string", + "markdownDescription": "URL endpoint for the custom OpenAI-compatible model.\n\n**Important:** Base URLs default to Chat Completions API. Explicit API paths including `/responses` or `/chat/completions` are respected." + }, + "toolCalling": { + "type": "boolean", + "description": "Whether the model supports tool calling" + }, + "vision": { + "type": "boolean", + "description": "Whether the model supports vision capabilities" + }, + "maxInputTokens": { + "type": "number", + "description": "Maximum number of input tokens supported by the model" + }, + "maxOutputTokens": { + "type": "number", + "description": "Maximum number of output tokens supported by the model" + }, + "editTools": { + "type": "array", + "description": "List of edit tools supported by the model. If this is not configured, the editor will try multiple edit tools and pick the best one.\n\n- 'find-replace': Find and replace text in a document.\n- 'multi-find-replace': Find and replace text in a document.\n- 'apply-patch': A file-oriented diff format used by some OpenAI models\n- 'code-rewrite': A general but slower editing tool that allows the model to rewrite and code snippet and provide only the replacement to the editor.", + "items": { + "type": "string", + "enum": [ + "find-replace", + "multi-find-replace", + "apply-patch", + "code-rewrite" + ] + } + }, + "thinking": { + "type": "boolean", + "default": false, + "description": "Whether the model supports thinking capabilities" + }, + "streaming": { + "type": "boolean", + "default": true, + "description": "Whether the model supports streaming responses. Defaults to true." + }, + "zeroDataRetentionEnabled": { + "type": "boolean", + "default": false, + "markdownDescription": "Whether Zero Data Retention (ZDR) is enabled for this endpoint. When `true`, `previous_response_id` will not be sent in requests via Responses API." + }, + "supportsReasoningEffort": { + "type": "array", + "markdownDescription": "Reasoning effort levels the model accepts (e.g. `[\"low\", \"medium\", \"high\"]`). When set, a `Thinking Effort` picker is shown in the model picker and the chosen value is forwarded to the model. Levels supported by mainstream OpenAI-compatible servers are `minimal`, `low`, `medium`, `high`.", + "items": { + "type": "string" + } + }, + "reasoningEffortFormat": { + "type": "string", + "enum": [ + "chat-completions", + "responses" + ], + "markdownDescription": "Body shape used to forward the reasoning effort to the model. `chat-completions` sends a top-level `reasoning_effort` string. `responses` sends a nested `reasoning.effort` object. When unset the format follows the URL: `/responses` \u2192 nested, otherwise top-level." + }, + "requestHeaders": { + "type": "object", + "description": "Additional HTTP headers to include with requests to this model. These reserved headers are not allowed and ignored if present: forbidden request headers (https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_request_header), forwarding headers ('forwarded', 'x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto'), and others ('api-key', 'authorization', 'content-type', 'openai-intent', 'x-github-api-version', 'x-initiator', 'x-interaction-id', 'x-interaction-type', 'x-onbehalf-extension-id', 'x-request-id', 'x-vscode-user-agent-library-version'). Pattern-based forbidden headers ('proxy-*', 'sec-*', 'x-http-method*' with forbidden methods) are also blocked.", + "additionalProperties": { + "type": "string" + } + } + }, + "required": [ + "id", + "name", + "url", + "toolCalling", + "vision", + "maxInputTokens", + "maxOutputTokens" + ] + } + } + } + } + }, + { + "vendor": "customendpoint", + "when": "productQualityType != 'stable'", + "displayName": "Custom Endpoint", + "configuration": { + "type": "object", + "properties": { + "apiKey": { + "type": "string", + "secret": true, + "minLength": 1, + "description": "API key for the models", + "title": "API Key" + }, + "apiType": { + "type": "string", + "enum": [ + "chat-completions", + "responses", + "messages" + ], + "enumDescriptions": [ + "Chat Completions API.", + "Responses API.", + "Messages API." + ], + "default": "chat-completions", + "title": "API Type", + "markdownDescription": "Default request/response format for models in this group. Individual models can override this with their own `apiType` property; when both are unset the type is inferred from the URL path." + }, + "models": { + "type": "array", + "defaultSnippets": [ + { + "label": "New Model", + "description": "Add a new custom model configuration", + "body": [ + { + "id": "$1", + "name": "$2", + "url": "$3", + "toolCalling": "^${4|true,false|}", + "vision": "^${5|true,false|}", + "maxInputTokens": "^${6:128000}", + "maxOutputTokens": "^${7:16000}" + } + ] + } + ], + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the model" + }, + "name": { + "type": "string", + "description": "Display name of the model" + }, + "url": { + "type": "string", + "pattern": "^https?://.+", + "patternErrorMessage": "URL must start with http:// or https://", + "markdownDescription": "URL endpoint for the model.\n\n**Important:** Base URLs default to Chat Completions API. Explicit API paths are respected: `/chat/completions`, `/responses`, and `/v1/messages` (Anthropic-compatible). Use the `apiType` property to override the request/response format independently of the URL." + }, + "apiType": { + "type": "string", + "enum": [ + "chat-completions", + "responses", + "messages" + ], + "markdownDescription": "Request/response format used to talk to this endpoint:\n- `chat-completions`: Chat Completions API (default).\n- `responses`: Responses API.\n- `messages`: Messages API.\n\nWhen omitted, falls back to the group-level `apiType`, then to the URL path." + }, + "toolCalling": { + "type": "boolean", + "description": "Whether the model supports tool calling" + }, + "vision": { + "type": "boolean", + "description": "Whether the model supports vision capabilities" + }, + "maxInputTokens": { + "type": "number", + "description": "Maximum number of input tokens supported by the model" + }, + "maxOutputTokens": { + "type": "number", + "description": "Maximum number of output tokens supported by the model" + }, + "editTools": { + "type": "array", + "description": "List of edit tools supported by the model. If this is not configured, the editor will try multiple edit tools and pick the best one.\n\n- 'find-replace': Find and replace text in a document.\n- 'multi-find-replace': Find and replace text in a document.\n- 'apply-patch': A file-oriented diff format used by some OpenAI models\n- 'code-rewrite': A general but slower editing tool that allows the model to rewrite and code snippet and provide only the replacement to the editor.", + "items": { + "type": "string", + "enum": [ + "find-replace", + "multi-find-replace", + "apply-patch", + "code-rewrite" + ] + } + }, + "thinking": { + "type": "boolean", + "default": false, + "description": "Whether the model supports thinking capabilities" + }, + "streaming": { + "type": "boolean", + "default": true, + "description": "Whether the model supports streaming responses. Defaults to true." + }, + "zeroDataRetentionEnabled": { + "type": "boolean", + "default": false, + "markdownDescription": "Whether Zero Data Retention (ZDR) is enabled for this endpoint. When `true`, `previous_response_id` will not be sent in requests via Responses API." + }, + "supportsReasoningEffort": { + "type": "array", + "markdownDescription": "Reasoning effort levels the model accepts (e.g. `[\"low\", \"medium\", \"high\"]`). When set, a `Thinking Effort` picker is shown in the model picker and the chosen value is forwarded to the model. Levels supported by mainstream OpenAI-compatible servers are `minimal`, `low`, `medium`, `high`.", + "items": { + "type": "string" + } + }, + "reasoningEffortFormat": { + "type": "string", + "enum": [ + "chat-completions", + "responses" + ], + "markdownDescription": "Body shape used to forward the reasoning effort to the model. `chat-completions` sends a top-level `reasoning_effort` string. `responses` sends a nested `reasoning.effort` object. When unset the format follows the URL: `/responses` \u2192 nested, otherwise top-level." + }, + "requestHeaders": { + "type": "object", + "description": "Additional HTTP headers to include with requests to this model. These reserved headers are not allowed and ignored if present: forbidden request headers (https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_request_header), forwarding headers ('forwarded', 'x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto'), and others ('api-key', 'authorization', 'content-type', 'openai-intent', 'x-github-api-version', 'x-initiator', 'x-interaction-id', 'x-interaction-type', 'x-onbehalf-extension-id', 'x-request-id', 'x-vscode-user-agent-library-version'). Pattern-based forbidden headers ('proxy-*', 'sec-*', 'x-http-method*' with forbidden methods) are also blocked.", + "additionalProperties": { + "type": "string" + } + } + }, + "required": [ + "id", + "name", + "url", + "toolCalling", + "vision", + "maxInputTokens", + "maxOutputTokens" + ] + } + } + } + } + }, + { + "vendor": "azure", + "displayName": "Azure", + "configuration": { + "type": "object", + "properties": { + "apiKey": { + "type": "string", + "secret": true, + "description": "API key for the models. If not set then Entra ID (Azure AD) authentication with your Microsoft account credentials will be used.", + "title": "API Key" + }, + "models": { + "type": "array", + "defaultSnippets": [ + { + "label": "New Model", + "description": "Add a new custom model configuration", + "body": [ + { + "id": "$1", + "name": "$2", + "url": "$3", + "toolCalling": "^${4|true,false|}", + "vision": "^${5|true,false|}", + "maxInputTokens": "^${6:128000}", + "maxOutputTokens": "^${7:16000}" + } + ] + } + ], + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the model" + }, + "name": { + "type": "string", + "description": "Display name of the custom OpenAI model" + }, + "url": { + "type": "string", + "markdownDescription": "URL endpoint for the custom OpenAI-compatible model.\n\n**Important:** Base URLs default to Chat Completions API. Explicit API paths including `/responses` or `/chat/completions` are respected." + }, + "toolCalling": { + "type": "boolean", + "description": "Whether the model supports tool calling" + }, + "vision": { + "type": "boolean", + "description": "Whether the model supports vision capabilities" + }, + "maxInputTokens": { + "type": "number", + "description": "Maximum number of input tokens supported by the model" + }, + "maxOutputTokens": { + "type": "number", + "description": "Maximum number of output tokens supported by the model" + }, + "thinking": { + "type": "boolean", + "default": false, + "description": "Whether the model supports thinking capabilities" + }, + "streaming": { + "type": "boolean", + "default": true, + "description": "Whether the model supports streaming responses. Defaults to true." + }, + "zeroDataRetentionEnabled": { + "type": "boolean", + "default": false, + "markdownDescription": "Whether Zero Data Retention (ZDR) is enabled for this endpoint. When `true`, `previous_response_id` will not be sent in requests via Responses API." + }, + "supportsReasoningEffort": { + "type": "array", + "markdownDescription": "Reasoning effort levels the model accepts (e.g. `[\"low\", \"medium\", \"high\"]`). When set, a `Thinking Effort` picker is shown in the model picker and the chosen value is forwarded to the model. Levels supported by mainstream OpenAI-compatible servers are `minimal`, `low`, `medium`, `high`.", + "items": { + "type": "string" + } + }, + "reasoningEffortFormat": { + "type": "string", + "enum": [ + "chat-completions", + "responses" + ], + "markdownDescription": "Body shape used to forward the reasoning effort to the model. `chat-completions` sends a top-level `reasoning_effort` string. `responses` sends a nested `reasoning.effort` object. When unset the format follows the URL: `/responses` \u2192 nested, otherwise top-level." + }, + "requestHeaders": { + "type": "object", + "description": "Additional HTTP headers to include with requests to this model. These reserved headers are not allowed and ignored if present: forbidden request headers (https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_request_header), forwarding headers ('forwarded', 'x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto'), and others ('api-key', 'authorization', 'content-type', 'openai-intent', 'x-github-api-version', 'x-initiator', 'x-interaction-id', 'x-interaction-type', 'x-onbehalf-extension-id', 'x-request-id', 'x-vscode-user-agent-library-version'). Pattern-based forbidden headers ('proxy-*', 'sec-*', 'x-http-method*' with forbidden methods) are also blocked.", + "additionalProperties": { + "type": "string" + } + } + }, + "required": [ + "id", + "name", + "url", + "toolCalling", + "vision", + "maxInputTokens", + "maxOutputTokens" + ] + } + } + } + } + } + ], + "interactiveSession": [ + { + "label": "GitHub Copilot", + "id": "copilot", + "icon": "", + "when": "!github.copilot.interactiveSession.disabled" + } + ], + "mcpServerDefinitionProviders": [ + { + "id": "github", + "label": "GitHub" + } + ], + "viewsWelcome": [ + { + "view": "debug", + "when": "github.copilot-chat.activated", + "contents": "%github.copilot.viewsWelcome.debug%" + } + ], + "chatViewsWelcome": [ + { + "icon": "$(chat-sparkle)", + "title": "%copilot.title%", + "content": "%github.copilot.viewsWelcome.individual.expired%", + "when": "github.copilot.interactiveSession.individual.expired && !github.copilot.hasByokModels" + }, + { + "icon": "$(chat-sparkle)", + "title": "%copilot.title%", + "content": "%github.copilot.viewsWelcome.enterprise%", + "when": "github.copilot.interactiveSession.enterprise.disabled && !github.copilot.hasByokModels" + }, + { + "icon": "$(chat-sparkle)", + "title": "%copilot.title%", + "content": "%github.copilot.viewsWelcome.offline%", + "when": "github.copilot.offline && !github.copilot.hasByokModels" + }, + { + "icon": "$(chat-sparkle)", + "title": "%copilot.title%", + "content": "%github.copilot.viewsWelcome.invalidToken%", + "when": "github.copilot.interactiveSession.invalidToken && !github.copilot.hasByokModels" + }, + { + "icon": "$(chat-sparkle)", + "title": "%copilot.title%", + "content": "%github.copilot.viewsWelcome.rateLimited%", + "when": "github.copilot.interactiveSession.rateLimited && !github.copilot.hasByokModels" + }, + { + "icon": "$(chat-sparkle)", + "title": "%copilot.title%", + "content": "%github.copilot.viewsWelcome.gitHubLoginFailed%", + "when": "github.copilot.interactiveSession.gitHubLoginFailed && !github.copilot.hasByokModels" + }, + { + "icon": "$(chat-sparkle)", + "title": "%copilot.title%", + "content": "%github.copilot.viewsWelcome.contactSupport%", + "when": "github.copilot.interactiveSession.contactSupport && !github.copilot.hasByokModels" + }, + { + "icon": "$(chat-sparkle)", + "title": "%copilot.title%", + "content": "%github.copilot.viewsWelcome.chatDisabled%", + "when": "github.copilot.interactiveSession.chatDisabled && !github.copilot.hasByokModels" + }, + { + "icon": "$(chat-sparkle)", + "title": "%copilot.title%", + "content": "%github.copilot.viewsWelcome.switchToReleaseChannel%", + "when": "github.copilot.interactiveSession.switchToReleaseChannel" + } + ], + "commands": [ + { + "command": "github.copilot.chat.triggerPermissiveSignIn", + "title": "%github.copilot.command.triggerPermissiveSignIn%" + }, + { + "command": "copilot.claude.agents", + "title": "Manage Agents", + "category": "Claude Agent" + }, + { + "command": "copilot.claude.hooks", + "title": "Configure Hooks", + "category": "Claude Agent" + }, + { + "command": "copilot.claude.memory", + "title": "Open Memory Files", + "category": "Claude Agent" + }, + { + "command": "github.copilot.cli.sessions.delete", + "title": "%github.copilot.command.deleteAgentSession%", + "icon": "$(close)", + "category": "Copilot CLI" + }, + { + "command": "agents.github.copilot.cli.deleteSessions", + "title": "%github.copilot.command.deleteAgentSession%", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.cli.sessions.resumeInTerminal", + "title": "%github.copilot.command.cli.sessions.resumeInTerminal%", + "icon": "$(terminal)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.cli.sessions.rename", + "title": "%github.copilot.command.cli.sessions.rename%", + "icon": "$(edit)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.cli.sessions.setTitle", + "title": "%github.copilot.command.cli.sessions.setTitle%", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.claude.sessions.rename", + "title": "%github.copilot.command.claude.sessions.rename%", + "icon": "$(edit)", + "category": "Claude" + }, + { + "command": "github.copilot.cli.sessions.openRepository", + "title": "%github.copilot.command.cli.sessions.openRepository%", + "icon": "$(folder-opened)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.cli.sessions.openWorktreeInNewWindow", + "title": "%github.copilot.command.cli.sessions.openWorktreeInNewWindow%", + "icon": "$(folder-opened)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.cli.sessions.openWorktreeInTerminal", + "title": "%github.copilot.command.cli.sessions.openWorktreeInTerminal%", + "icon": "$(terminal)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.cli.sessions.copyWorktreeBranchName", + "title": "%github.copilot.command.cli.sessions.copyWorktreeBranchName%", + "icon": "$(copy)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.cli.sessions.commitToWorktree", + "title": "%github.copilot.command.cli.sessions.commitToWorktree%", + "icon": "$(git-commit)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.cli.sessions.commitToRepository", + "title": "%github.copilot.command.cli.sessions.commitToRepository%", + "icon": "$(git-commit)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.cli.newSession", + "title": "%github.copilot.command.cli.newSession%", + "icon": "$(terminal)", + "category": "Chat" + }, + { + "command": "github.copilot.cli.newSessionToSide", + "title": "%github.copilot.command.cli.newSessionToSide%", + "icon": "$(terminal)", + "category": "Chat" + }, + { + "command": "github.copilot.cli.openInCopilotCLI", + "title": "%github.copilot.command.cli.openInCopilotCLI%", + "icon": "$(terminal)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.chat.compact", + "title": "%github.copilot.command.compactConversation%" + }, + { + "command": "github.copilot.chat.explain", + "title": "%github.copilot.command.explainThis%", + "enablement": "!github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.chat.explain.palette", + "title": "%github.copilot.command.explainThis%", + "enablement": "!github.copilot.interactiveSession.disabled && !editorReadonly", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review", + "title": "%github.copilot.command.reviewAndComment%", + "enablement": "config.github.copilot.chat.reviewSelection.enabled && !github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.apply", + "title": "%github.copilot.command.applyReviewSuggestion%", + "icon": "$(sparkle)", + "enablement": "commentThread =~ /hasSuggestion/", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.applyAndNext", + "title": "%github.copilot.command.applyReviewSuggestionAndNext%", + "icon": "$(sparkle)", + "enablement": "commentThread =~ /hasSuggestion/", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.discard", + "title": "%github.copilot.command.discardReviewSuggestion%", + "icon": "$(close)", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.discardAndNext", + "title": "%github.copilot.command.discardReviewSuggestionAndNext%", + "icon": "$(close)", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.discardAll", + "title": "%github.copilot.command.discardAllReviewSuggestion%", + "icon": "$(close-all)", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.stagedChanges", + "title": "%github.copilot.command.reviewStagedChanges%", + "icon": "$(code-review)", + "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.unstagedChanges", + "title": "%github.copilot.command.reviewUnstagedChanges%", + "icon": "$(code-review)", + "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.changes", + "title": "%github.copilot.command.reviewChanges%", + "icon": "$(code-review)", + "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.stagedFileChange", + "title": "%github.copilot.command.reviewFileChange%", + "icon": "$(code-review)", + "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.unstagedFileChange", + "title": "%github.copilot.command.reviewFileChange%", + "icon": "$(code-review)", + "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.chat.codeReview.run", + "title": "%github.copilot.command.codeReviewRun%", + "enablement": "github.copilot.chat.reviewDiff.enabled && !github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.previous", + "title": "%github.copilot.command.gotoPreviousReviewSuggestion%", + "icon": "$(arrow-up)", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.next", + "title": "%github.copilot.command.gotoNextReviewSuggestion%", + "icon": "$(arrow-down)", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.continueInInlineChat", + "title": "%github.copilot.command.continueReviewInInlineChat%", + "icon": "$(comment-discussion)", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.continueInChat", + "title": "%github.copilot.command.continueReviewInChat%", + "icon": "$(comment-discussion)", + "category": "Chat" + }, + { + "command": "github.copilot.chat.review.markHelpful", + "title": "%github.copilot.command.helpfulReviewSuggestion%", + "icon": "$(thumbsup)", + "enablement": "!(commentThread =~ /markedAsHelpful/)", + "category": "Chat" + }, + { + "command": "github.copilot.chat.openUserPreferences", + "title": "%github.copilot.command.openUserPreferences%", + "category": "Chat", + "enablement": "config.github.copilot.chat.enableUserPreferences" + }, + { + "command": "github.copilot.chat.review.markUnhelpful", + "title": "%github.copilot.command.unhelpfulReviewSuggestion%", + "icon": "$(thumbsdown)", + "enablement": "!(commentThread =~ /markedAsUnhelpful/)", + "category": "Chat" + }, + { + "command": "github.copilot.chat.generate", + "title": "%github.copilot.command.generateThis%", + "icon": "$(sparkle)", + "enablement": "!github.copilot.interactiveSession.disabled && !editorReadonly", + "category": "Chat" + }, + { + "command": "github.copilot.chat.fix", + "title": "%github.copilot.command.fixThis%", + "enablement": "!github.copilot.interactiveSession.disabled && !editorReadonly", + "category": "Chat" + }, + { + "command": "github.copilot.interactiveSession.feedback", + "title": "%github.copilot.command.sendChatFeedback%", + "enablement": "github.copilot-chat.activated && !github.copilot.interactiveSession.disabled", + "icon": "$(feedback)", + "category": "Chat" + }, + { + "command": "github.copilot.debug.workbenchState", + "title": "%github.copilot.command.logWorkbenchState%", + "category": "Developer" + }, + { + "command": "github.copilot.debug.togglePowerSaveBlocker", + "title": "%github.copilot.command.togglePowerSaveBlocker%", + "category": "Developer" + }, + { + "command": "github.copilot.debug.showChatLogView", + "title": "%github.copilot.command.showChatLogView%", + "category": "Developer" + }, + { + "command": "github.copilot.debug.showOutputChannel", + "title": "%github.copilot.command.showOutputChannel%", + "category": "Developer" + }, + { + "command": "github.copilot.debug.showContextInspectorView", + "title": "%github.copilot.command.showContextInspectorView%", + "icon": "$(inspect)", + "category": "Developer" + }, + { + "command": "github.copilot.debug.validateNesRename", + "title": "%github.copilot.command.validateNesRename%", + "category": "Developer" + }, + { + "command": "github.copilot.debug.resetVirtualToolGroups", + "title": "%github.copilot.command.resetVirtualToolGroups%", + "icon": "$(inspect)", + "category": "Developer" + }, + { + "command": "github.copilot.debug.extensionState", + "title": "%github.copilot.command.extensionState%", + "category": "Developer" + }, + { + "command": "github.copilot.chat.tools.memory.showMemories", + "title": "%github.copilot.command.showMemories%", + "category": "Chat" + }, + { + "command": "github.copilot.chat.tools.memory.clearMemories", + "title": "%github.copilot.command.clearMemories%", + "category": "Chat" + }, + { + "command": "github.copilot.terminal.explainTerminalLastCommand", + "title": "%github.copilot.command.explainTerminalLastCommand%", + "category": "Chat" + }, + { + "command": "github.copilot.git.generateCommitMessage", + "title": "%github.copilot.git.generateCommitMessage%", + "icon": "$(sparkle)", + "enablement": "!github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.git.resolveMergeConflicts", + "title": "%github.copilot.git.resolveMergeConflicts%", + "icon": "$(chat-sparkle)", + "enablement": "!github.copilot.interactiveSession.disabled", + "category": "Chat" + }, + { + "command": "github.copilot.devcontainer.generateDevContainerConfig", + "title": "%github.copilot.devcontainer.generateDevContainerConfig%", + "category": "Chat" + }, + { + "command": "github.copilot.tests.fixTestFailure", + "icon": "$(sparkle)", + "title": "%github.copilot.command.fixTestFailure%", + "category": "Chat" + }, + { + "command": "github.copilot.tests.fixTestFailure.fromInline", + "icon": "$(sparkle)", + "title": "%github.copilot.command.fixTestFailure%" + }, + { + "command": "github.copilot.chat.attachFile", + "title": "%github.copilot.chat.attachFile%", + "category": "Chat" + }, + { + "command": "github.copilot.chat.attachSelection", + "title": "%github.copilot.chat.attachSelection%", + "icon": "$(comment-discussion)", + "category": "Chat" + }, + { + "command": "github.copilot.debug.collectDiagnostics", + "title": "%github.copilot.command.collectDiagnostics%", + "category": "Developer" + }, + { + "command": "github.copilot.debug.inlineEdit.clearCache", + "title": "%github.copilot.command.inlineEdit.clearCache%", + "category": "Developer" + }, + { + "command": "github.copilot.debug.inlineEdit.reportNotebookNESIssue", + "title": "%github.copilot.command.inlineEdit.reportNotebookNESIssue%", + "enablement": "config.github.copilot.chat.advanced.notebook.alternativeNESFormat.enabled || github.copilot.chat.enableEnhancedNotebookNES", + "category": "Developer" + }, + { + "command": "github.copilot.debug.generateSTest", + "title": "%github.copilot.command.generateSTest%", + "enablement": "github.copilot.debugReportFeedback", + "category": "Developer" + }, + { + "command": "github.copilot.open.walkthrough", + "title": "%github.copilot.command.openWalkthrough%", + "category": "Chat" + }, + { + "command": "github.copilot.debug.generateInlineEditTests", + "title": "Generate Inline Edit Tests", + "category": "Chat", + "enablement": "resourceScheme == 'ccreq'" + }, + { + "command": "github.copilot.buildRemoteWorkspaceIndex", + "title": "%github.copilot.command.buildRemoteWorkspaceIndex%", + "category": "Chat", + "enablement": "github.copilot-chat.activated" + }, + { + "command": "github.copilot.deleteExternalIngestWorkspaceIndex", + "title": "%github.copilot.command.deleteExternalIngestWorkspaceIndex%", + "category": "Developer", + "enablement": "github.copilot-chat.activated && !github.copilot.blackbirdExternalIndexingDisabled" + }, + { + "command": "github.copilot.report", + "title": "Report Issue", + "category": "Chat" + }, + { + "command": "github.copilot.chat.rerunWithCopilotDebug", + "title": "%github.copilot.command.rerunWithCopilotDebug%", + "category": "Chat" + }, + { + "command": "github.copilot.chat.startCopilotDebugCommand", + "title": "Start Copilot Debug" + }, + { + "command": "github.copilot.chat.clearTemporalContext", + "title": "Clear Temporal Context", + "category": "Developer" + }, + { + "command": "github.copilot.search.markHelpful", + "title": "Helpful", + "icon": "$(thumbsup)", + "enablement": "!github.copilot.search.feedback.sent" + }, + { + "command": "github.copilot.search.markUnhelpful", + "title": "Unhelpful", + "icon": "$(thumbsdown)", + "enablement": "!github.copilot.search.feedback.sent" + }, + { + "command": "github.copilot.search.feedback", + "title": "Feedback", + "icon": "$(feedback)", + "enablement": "!github.copilot.search.feedback.sent" + }, + { + "command": "github.copilot.chat.debug.showElements", + "title": "Show Rendered Elements" + }, + { + "command": "github.copilot.chat.debug.hideElements", + "title": "Hide Rendered Elements" + }, + { + "command": "github.copilot.chat.debug.showTools", + "title": "Show Tools" + }, + { + "command": "github.copilot.chat.debug.hideTools", + "title": "Hide Tools" + }, + { + "command": "github.copilot.chat.debug.showNesRequests", + "title": "Show NES Requests" + }, + { + "command": "github.copilot.chat.debug.hideNesRequests", + "title": "Hide NES Requests" + }, + { + "command": "github.copilot.chat.debug.showGhostRequests", + "title": "Show Ghost Requests" + }, + { + "command": "github.copilot.chat.debug.hideGhostRequests", + "title": "Hide Ghost Requests" + }, + { + "command": "github.copilot.chat.debug.showRawRequestBody", + "title": "Show Raw Request Body" + }, + { + "command": "github.copilot.chat.debug.exportLogItem", + "title": "Export as...", + "icon": "$(export)" + }, + { + "command": "github.copilot.chat.debug.exportPromptArchive", + "title": "Export All as Archive...", + "icon": "$(archive)" + }, + { + "command": "github.copilot.chat.debug.exportPromptLogsAsJson", + "title": "Export All as JSON...", + "icon": "$(export)" + }, + { + "command": "github.copilot.chat.debug.exportAllPromptLogsAsJson", + "title": "Export All Prompt Logs as JSON...", + "icon": "$(export)" + }, + { + "command": "github.copilot.chat.otel.exportAgentTracesDB", + "title": "Export Agent Traces DB", + "category": "Chat", + "enablement": "config.github.copilot.chat.otel.dbSpanExporter.enabled" + }, + { + "command": "github.copilot.sessionSync.deleteSessions", + "title": "%github.copilot.command.sessionSync.deleteSessions%", + "category": "Chat", + "enablement": "github.copilot.sessionSearch.enabled && config.chat.sessionSync.enabled" + }, + { + "command": "github.copilot.chronicle.reindex", + "title": "%github.copilot.command.chronicle.reindex%", + "category": "Chat", + "enablement": "github.copilot.sessionSearch.enabled" + }, + { + "command": "github.copilot.nes.captureExpected.start", + "title": "Record Expected Edit (NES)", + "category": "Copilot" + }, + { + "command": "github.copilot.nes.captureExpected.confirm", + "title": "Confirm and Save Expected Edit Capture", + "category": "Copilot" + }, + { + "command": "github.copilot.nes.captureExpected.abort", + "title": "Cancel Expected Edit Capture", + "category": "Copilot" + }, + { + "command": "github.copilot.nes.captureExpected.submit", + "title": "Submit NES Captures", + "category": "Copilot" + }, + { + "command": "github.copilot.debug.collectWorkspaceIndexDiagnostics", + "title": "%github.copilot.command.collectWorkspaceIndexDiagnostics%", + "category": "Developer" + }, + { + "command": "github.copilot.chat.mcp.setup.check", + "title": "MCP Check: is supported" + }, + { + "command": "github.copilot.chat.mcp.setup.validatePackage", + "title": "MCP Check: validate package" + }, + { + "command": "github.copilot.chat.mcp.setup.flow", + "title": "MCP Check: do prompts" + }, + { + "command": "github.copilot.chat.generateAltText", + "title": "Generate/Refine Alt Text" + }, + { + "command": "github.copilot.chat.notebook.enableFollowCellExecution", + "title": "Enable Follow Cell Execution from Chat", + "shortTitle": "Follow", + "icon": "$(pinned)" + }, + { + "command": "github.copilot.chat.notebook.disableFollowCellExecution", + "title": "Disable Follow Cell Execution from Chat", + "shortTitle": "Unfollow", + "icon": "$(pinned-dirty)" + }, + { + "command": "github.copilot.cloud.resetWorkspaceConfirmations", + "title": "%github.copilot.command.resetCloudAgentWorkspaceConfirmations%" + }, + { + "command": "github.copilot.cloud.sessions.openInBrowser", + "title": "%github.copilot.command.openCopilotAgentSessionsInBrowser%", + "icon": "$(link-external)" + }, + { + "command": "github.copilot.cloud.sessions.proxy.closeChatSessionPullRequest", + "title": "%github.copilot.command.closeChatSessionPullRequest.title%" + }, + { + "command": "github.copilot.cloud.sessions.installPRExtension", + "title": "%github.copilot.command.installPRExtension.title%", + "icon": "$(extensions)" + }, + { + "command": "github.copilot.chat.openSuggestionsPanel", + "title": "Open Completions Panel", + "enablement": "github.copilot.extensionUnification.activated && !isWeb", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.toggleStatusMenu", + "title": "Open Status Menu", + "enablement": "github.copilot.extensionUnification.activated", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.completions.disable", + "title": "Disable Inline Suggestions", + "enablement": "github.copilot.extensionUnification.activated && github.copilot.activated && config.editor.inlineSuggest.enabled && github.copilot.completions.enabled", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.completions.enable", + "title": "Enable Inline Suggestions", + "enablement": "github.copilot.extensionUnification.activated && github.copilot.activated && !(config.editor.inlineSuggest.enabled && github.copilot.completions.enabled)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.completions.toggle", + "title": "Toggle (Enable/Disable) Inline Suggestions", + "enablement": "github.copilot.extensionUnification.activated && github.copilot.activated", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.openModelPicker", + "title": "Change Completions Model", + "category": "GitHub Copilot", + "enablement": "github.copilot.extensionUnification.activated && !isWeb && github.copilot.completions.hasMultipleModels" + }, + { + "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges", + "title": "%github.copilot.command.applyCopilotCLIAgentSessionChanges%", + "enablement": "!chatSessionRequestInProgress", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges.apply", + "title": "%github.copilot.chat.applyCopilotCLIAgentSessionChanges.apply%", + "enablement": "!chatSessionRequestInProgress", + "icon": "$(git-stash-pop)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.merge", + "title": "%github.copilot.chat.mergeCopilotCLIAgentSessionChanges.merge%", + "enablement": "!chatSessionRequestInProgress", + "icon": "$(git-merge)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.mergeAndSync", + "title": "%github.copilot.chat.mergeCopilotCLIAgentSessionChanges.mergeAndSync%", + "enablement": "!chatSessionRequestInProgress", + "icon": "$(sync)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.sessions.commit", + "title": "%github.copilot.command.sessions.commit%", + "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", + "icon": "$(git-commit)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.sessions.commitAndSync", + "title": "%github.copilot.command.sessions.commitAndSync%", + "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", + "icon": "$(sync)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.sessions.sync", + "title": "%github.copilot.command.sessions.sync%", + "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", + "icon": "$(sync)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.createPullRequestCopilotCLIAgentSession.createPR", + "title": "%github.copilot.chat.createPullRequestCopilotCLIAgentSession.createPR%", + "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", + "icon": "$(git-pull-request-create)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.createDraftPullRequestCopilotCLIAgentSession.createDraftPR", + "title": "%github.copilot.chat.createDraftPullRequestCopilotCLIAgentSession.createDraftPR%", + "enablement": "!chatSessionRequestInProgress && !sessions.hasGitOperationInProgress", + "icon": "$(git-pull-request-draft)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.sessions.discardChanges", + "title": "%github.copilot.command.sessions.discardChanges%", + "enablement": "!chatSessionRequestInProgress", + "icon": "$(discard)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.copilotCLI.addFileReference", + "title": "%github.copilot.command.chat.copilotCLI.addFileReference%", + "enablement": "github.copilot.chat.copilotCLI.hasSession", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.chat.copilotCLI.addSelection", + "title": "%github.copilot.command.chat.copilotCLI.addSelection%", + "enablement": "github.copilot.chat.copilotCLI.hasSession", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.chat.copilotCLI.acceptDiff", + "title": "%github.copilot.command.chat.copilotCLI.acceptDiff%", + "enablement": "github.copilot.chat.copilotCLI.hasActiveDiff", + "icon": "$(check)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.chat.copilotCLI.rejectDiff", + "title": "%github.copilot.command.chat.copilotCLI.rejectDiff%", + "enablement": "github.copilot.chat.copilotCLI.hasActiveDiff", + "icon": "$(close)", + "category": "Copilot CLI" + }, + { + "command": "github.copilot.chat.checkoutPullRequestReroute", + "title": "%github.copilot.command.checkoutPullRequestReroute.title%", + "icon": "$(git-pull-request)", + "category": "GitHub Pull Request" + }, + { + "command": "github.copilot.chat.cloudSessions.openRepository", + "title": "%github.copilot.command.cloudSessions.openRepository.title%", + "icon": "$(repo)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.chat.cloudSessions.clearCaches", + "title": "%github.copilot.command.cloudSessions.clearCaches.title%", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.sessions.refreshChanges", + "title": "%github.copilot.command.sessions.refreshChanges%", + "icon": "$(refresh)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.sessions.initializeRepository", + "title": "%github.copilot.command.sessions.initializeRepository%", + "enablement": "!chatSessionRequestInProgress", + "icon": "$(repo)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.claude.sessions.commit", + "title": "%github.copilot.command.claude.sessions.commit%", + "enablement": "!chatSessionRequestInProgress", + "icon": "$(git-commit)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.claude.sessions.commitAndSync", + "title": "%github.copilot.command.claude.sessions.commitAndSync%", + "enablement": "!chatSessionRequestInProgress", + "icon": "$(sync)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.claude.sessions.sync", + "title": "%github.copilot.command.claude.sessions.sync%", + "enablement": "!chatSessionRequestInProgress", + "icon": "$(sync)", + "category": "GitHub Copilot" + }, + { + "command": "github.copilot.claude.sessions.initializeRepository", + "title": "%github.copilot.command.claude.sessions.initializeRepository%", + "enablement": "!chatSessionRequestInProgress", + "icon": "$(repo)", + "category": "GitHub Copilot" + } + ], + "configuration": [ + { + "title": "GitHub Copilot Chat", + "id": "stable", + "properties": { + "github.copilot.chat.backgroundAgent.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.backgroundAgent.enabled%" + }, + "github.copilot.chat.cloudAgent.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cloudAgent.enabled%" + }, + "github.copilot.chat.codeGeneration.useInstructionFiles": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.codeGeneration.useInstructionFiles%" + }, + "github.copilot.editor.enableCodeActions": { + "type": "boolean", + "default": true, + "description": "%github.copilot.config.enableCodeActions%" + }, + "github.copilot.renameSuggestions.triggerAutomatically": { + "type": "boolean", + "default": true, + "description": "%github.copilot.config.renameSuggestions.triggerAutomatically%" + }, + "github.copilot.chat.localeOverride": { + "type": "string", + "enum": [ + "auto", + "en", + "fr", + "it", + "de", + "es", + "ru", + "zh-CN", + "zh-TW", + "ja", + "ko", + "cs", + "pt-br", + "tr", + "pl" + ], + "enumDescriptions": [ + "Use VS Code's configured display language", + "English", + "français", + "italiano", + "Deutsch", + "español", + "русский", + "中文(简体)", + "中文(繁體)", + "日本語", + "한국어", + "čeština", + "português", + "Türkçe", + "polski" + ], + "default": "auto", + "markdownDescription": "%github.copilot.config.localeOverride%" + }, + "github.copilot.chat.terminalChatLocation": { + "type": "string", + "default": "chatView", + "markdownDescription": "%github.copilot.config.terminalChatLocation%", + "markdownEnumDescriptions": [ + "%github.copilot.config.terminalChatLocation.chatView%", + "%github.copilot.config.terminalChatLocation.quickChat%", + "%github.copilot.config.terminalChatLocation.terminal%" + ], + "enum": [ + "chatView", + "quickChat", + "terminal" + ] + }, + "github.copilot.chat.scopeSelection": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.scopeSelection%" + }, + "github.copilot.chat.useProjectTemplates": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.useProjectTemplates%" + }, + "github.copilot.nextEditSuggestions.enabled": { + "type": "boolean", + "default": true, + "tags": [ + "nextEditSuggestions", + "onExp" + ], + "markdownDescription": "%github.copilot.nextEditSuggestions.enabled%", + "scope": "language-overridable" + }, + "github.copilot.nextEditSuggestions.extendedRange": { + "type": "boolean", + "default": false, + "tags": [ + "nextEditSuggestions", + "onExp" + ], + "markdownDescription": "%github.copilot.nextEditSuggestions.extendedRange%" + }, + "github.copilot.nextEditSuggestions.fixes": { + "type": "boolean", + "default": true, + "tags": [ + "nextEditSuggestions", + "onExp" + ], + "markdownDescription": "%github.copilot.nextEditSuggestions.fixes%", + "scope": "language-overridable" + }, + "github.copilot.nextEditSuggestions.allowWhitespaceOnlyChanges": { + "type": "boolean", + "default": true, + "tags": [ + "nextEditSuggestions", + "onExp" + ], + "markdownDescription": "%github.copilot.nextEditSuggestions.allowWhitespaceOnlyChanges%", + "scope": "language-overridable" + }, + "github.copilot.chat.agent.autoFix": { + "type": "boolean", + "default": false, + "description": "%github.copilot.config.autoFix%", + "tags": [ + "onExp" + ] + }, + "github.copilot.chat.rateLimitAutoSwitchToAuto": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.rateLimitAutoSwitchToAuto%", + "tags": [ + "onExp" + ] + }, + "github.copilot.chat.customInstructionsInSystemMessage": { + "type": "boolean", + "default": true, + "description": "%github.copilot.config.customInstructionsInSystemMessage%" + }, + "github.copilot.chat.organizationCustomAgents.enabled": { + "type": "boolean", + "default": true, + "description": "%github.copilot.config.organizationCustomAgents.enabled%" + }, + "github.copilot.chat.organizationInstructions.enabled": { + "type": "boolean", + "default": true, + "description": "%github.copilot.config.organizationInstructions.enabled%" + }, + "github.copilot.chat.additionalReadAccessPaths": { + "type": "array", + "default": [], + "items": { + "type": "string" + }, + "markdownDescription": "%github.copilot.config.additionalReadAccessPaths%", + "scope": "window" + }, + "github.copilot.chat.agent.currentEditorContext.enabled": { + "type": "boolean", + "default": true, + "description": "%github.copilot.config.agent.currentEditorContext.enabled%" + }, + "github.copilot.enable": { + "type": "object", + "scope": "window", + "default": { + "*": true, + "plaintext": false, + "markdown": false, + "scminput": false + }, + "additionalProperties": { + "type": "boolean" + }, + "markdownDescription": "Enable or disable auto triggering of Copilot completions for specified [languages](https://code.visualstudio.com/docs/languages/identifiers). You can still trigger suggestions manually using `Alt + \\`", + "agentsWindow": { + "default": { + "markdown": true, + "plaintext": true + } + } + }, + "github.copilot.selectedCompletionModel": { + "type": "string", + "default": "", + "markdownDescription": "The currently selected completion model ID. To select from a list of available models, use the __\"Change Completions Model\"__ command or open the model picker (from the Copilot menu in the VS Code title bar, select __\"Configure Code Completions\"__ then __\"Change Completions Model\"__. The value must be a valid model ID. An empty value indicates that the default model will be used." + }, + "github.copilot.chat.claudeAgent.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.claudeAgent.enabled%" + }, + "github.copilot.chat.claudeAgent.allowDangerouslySkipPermissions": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.claudeAgent.allowDangerouslySkipPermissions%" + }, + "github.copilot.chat.reviewAgent.enabled": { + "type": "boolean", + "default": true, + "description": "%github.copilot.config.reviewAgent.enabled%" + }, + "github.copilot.chat.reviewSelection.enabled": { + "type": "boolean", + "default": true, + "description": "%github.copilot.config.reviewSelection.enabled%" + }, + "github.copilot.chat.reviewSelection.instructions": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "markdownDescription": "%github.copilot.config.reviewSelection.instruction.file%", + "properties": { + "file": { + "type": "string", + "examples": [ + ".copilot-review-instructions.md" + ] + }, + "language": { + "type": "string" + } + }, + "examples": [ + { + "file": ".copilot-review-instructions.md" + } + ], + "required": [ + "file" + ] + }, + { + "type": "object", + "markdownDescription": "%github.copilot.config.reviewSelection.instruction.text%", + "properties": { + "text": { + "type": "string", + "examples": [ + "Use underscore for field names." + ] + }, + "language": { + "type": "string" + } + }, + "required": [ + "text" + ], + "examples": [ + { + "text": "Use underscore for field names." + }, + { + "text": "Resolve all TODO tasks." + } + ] + } + ] + }, + "default": [], + "markdownDescription": "%github.copilot.config.reviewSelection.instructions%", + "examples": [ + [ + { + "file": ".copilot-review-instructions.md" + }, + { + "text": "Resolve all TODO tasks." + } + ] + ] + }, + "github.copilot.chat.anthropic.useMessagesApi": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.useMessagesApi%", + "tags": [ + "onExp" + ] + } + } + }, + { + "id": "preview", + "properties": { + "github.copilot.chat.claudeAgent.allowAutoPermissions": { + "type": "boolean", + "default": false, + "tags": [ + "preview", + "onExp" + ], + "markdownDescription": "%github.copilot.config.claudeAgent.allowAutoPermissions%" + }, + "github.copilot.chat.copilotDebugCommand.enabled": { + "type": "boolean", + "default": true, + "tags": [ + "preview" + ], + "description": "%github.copilot.chat.copilotDebugCommand.enabled%" + }, + "github.copilot.chat.codesearch.enabled": { + "type": "boolean", + "default": false, + "tags": [ + "preview" + ], + "markdownDescription": "%github.copilot.config.codesearch.enabled%" + }, + "github.copilot.chat.tools.viewImage.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.tools.viewImage.enabled%", + "tags": [ + "preview", + "onExp" + ] + } + } + }, + { + "id": "experimental", + "properties": { + "github.copilot.chat.githubMcpServer.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.githubMcpServer.enabled%", + "tags": [ + "experimental" + ], + "agentsWindow": { + "default": true + } + }, + "github.copilot.chat.githubMcpServer.toolsets": { + "type": "array", + "default": [ + "default" + ], + "markdownDescription": "%github.copilot.config.githubMcpServer.toolsets%", + "items": { + "type": "string" + }, + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.githubMcpServer.readonly": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.githubMcpServer.readonly%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.githubMcpServer.lockdown": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.githubMcpServer.lockdown%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.githubMcpServer.channel": { + "type": "string", + "default": "stable", + "enum": [ + "stable", + "insiders" + ], + "enumDescriptions": [ + "%github.copilot.config.githubMcpServer.channel.stable%", + "%github.copilot.config.githubMcpServer.channel.insiders%" + ], + "markdownDescription": "%github.copilot.config.githubMcpServer.channel%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.cloudAgentBackend.version": { + "type": "string", + "default": "v1", + "enum": [ + "v1", + "v2" + ], + "enumDescriptions": [ + "%github.copilot.config.cloudAgentBackend.version.v1%", + "%github.copilot.config.cloudAgentBackend.version.v2%" + ], + "markdownDescription": "%github.copilot.config.cloudAgentBackend.version%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.switchAgent.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.switchAgent.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.imageUpload.enabled": { + "type": "boolean", + "default": true, + "tags": [ + "experimental", + "onExp" + ], + "markdownDescription": "%github.copilot.config.imageUpload.enabled%" + }, + "github.copilot.chat.codeGeneration.instructions": { + "markdownDeprecationMessage": "%github.copilot.config.codeGeneration.instructions.deprecated%", + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "markdownDescription": "%github.copilot.config.codeGeneration.instruction.file%", + "properties": { + "file": { + "type": "string", + "examples": [ + ".copilot-codeGeneration-instructions.md" + ] + }, + "language": { + "type": "string" + } + }, + "examples": [ + { + "file": ".copilot-codeGeneration-instructions.md" + } + ], + "required": [ + "file" + ] + }, + { + "type": "object", + "markdownDescription": "%github.copilot.config.codeGeneration.instruction.text%", + "properties": { + "text": { + "type": "string", + "examples": [ + "Use underscore for field names." + ] + }, + "language": { + "type": "string" + } + }, + "required": [ + "text" + ], + "examples": [ + { + "text": "Use underscore for field names." + }, + { + "text": "Always add a comment: 'Generated by Copilot'." + } + ] + } + ] + }, + "default": [], + "markdownDescription": "%github.copilot.config.codeGeneration.instructions%", + "examples": [ + [ + { + "file": ".copilot-codeGeneration-instructions.md" + }, + { + "text": "Always add a comment: 'Generated by Copilot'." + } + ] + ], + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.testGeneration.instructions": { + "markdownDeprecationMessage": "%github.copilot.config.testGeneration.instructions.deprecated%", + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "markdownDescription": "%github.copilot.config.experimental.testGeneration.instruction.file%", + "properties": { + "file": { + "type": "string", + "examples": [ + ".copilot-test-instructions.md" + ] + }, + "language": { + "type": "string" + } + }, + "examples": [ + { + "file": ".copilot-test-instructions.md" + } + ], + "required": [ + "file" + ] + }, + { + "type": "object", + "markdownDescription": "%github.copilot.config.experimental.testGeneration.instruction.text%", + "properties": { + "text": { + "type": "string", + "examples": [ + "Use suite and test instead of describe and it." + ] + }, + "language": { + "type": "string" + } + }, + "required": [ + "text" + ], + "examples": [ + { + "text": "Always try uniting related tests in a suite." + } + ] + } + ] + }, + "default": [], + "markdownDescription": "%github.copilot.config.testGeneration.instructions%", + "examples": [ + [ + { + "file": ".copilot-test-instructions.md" + }, + { + "text": "Always try uniting related tests in a suite." + } + ] + ], + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.commitMessageGeneration.instructions": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "markdownDescription": "%github.copilot.config.commitMessageGeneration.instruction.file%", + "properties": { + "file": { + "type": "string", + "examples": [ + ".copilot-commit-message-instructions.md" + ] + } + }, + "examples": [ + { + "file": ".copilot-commit-message-instructions.md" + } + ], + "required": [ + "file" + ] + }, + { + "type": "object", + "markdownDescription": "%github.copilot.config.commitMessageGeneration.instruction.text%", + "properties": { + "text": { + "type": "string", + "examples": [ + "Use conventional commit message format." + ] + } + }, + "required": [ + "text" + ], + "examples": [ + { + "text": "Use conventional commit message format." + } + ] + } + ] + }, + "default": [], + "markdownDescription": "%github.copilot.config.commitMessageGeneration.instructions%", + "examples": [ + [ + { + "file": ".copilot-commit-message-instructions.md" + }, + { + "text": "Use conventional commit message format." + } + ] + ], + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.pullRequestDescriptionGeneration.instructions": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "markdownDescription": "%github.copilot.config.pullRequestDescriptionGeneration.instruction.file%", + "properties": { + "file": { + "type": "string", + "examples": [ + ".copilot-pull-request-description-instructions.md" + ] + } + }, + "examples": [ + { + "file": ".copilot-pull-request-description-instructions.md" + } + ], + "required": [ + "file" + ] + }, + { + "type": "object", + "markdownDescription": "%github.copilot.config.pullRequestDescriptionGeneration.instruction.text%", + "properties": { + "text": { + "type": "string", + "examples": [ + "Include every commit message in the pull request description." + ] + } + }, + "required": [ + "text" + ], + "examples": [ + { + "text": "Include every commit message in the pull request description." + } + ] + } + ] + }, + "default": [], + "markdownDescription": "%github.copilot.config.pullRequestDescriptionGeneration.instructions%", + "examples": [ + [ + { + "file": ".copilot-pull-request-description-instructions.md" + }, + { + "text": "Use conventional commit message format." + } + ] + ], + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.setupTests.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.setupTests.enabled%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.languageContext.typescript.enabled": { + "type": "boolean", + "default": true, + "scope": "resource", + "tags": [ + "experimental", + "onExP" + ], + "markdownDescription": "%github.copilot.chat.languageContext.typescript.enabled%", + "agentsWindow": { + "default": true + } + }, + "github.copilot.chat.languageContext.typescript.items": { + "type": "string", + "enum": [ + "minimal", + "double", + "fillHalf", + "fill" + ], + "default": "double", + "scope": "resource", + "tags": [ + "experimental", + "onExP" + ], + "markdownDescription": "%github.copilot.chat.languageContext.typescript.items%" + }, + "github.copilot.chat.languageContext.typescript.includeDocumentation": { + "type": "boolean", + "default": false, + "scope": "resource", + "tags": [ + "experimental", + "onExP" + ], + "markdownDescription": "%github.copilot.chat.languageContext.typescript.includeDocumentation%" + }, + "github.copilot.chat.languageContext.typescript.cacheTimeout": { + "type": "number", + "default": 500, + "scope": "resource", + "tags": [ + "experimental", + "onExP" + ], + "markdownDescription": "%github.copilot.chat.languageContext.typescript.cacheTimeout%" + }, + "github.copilot.chat.languageContext.fix.typescript.enabled": { + "type": "boolean", + "default": false, + "scope": "resource", + "tags": [ + "experimental", + "onExP" + ], + "markdownDescription": "%github.copilot.chat.languageContext.fix.typescript.enabled%" + }, + "github.copilot.chat.languageContext.inline.typescript.enabled": { + "type": "boolean", + "default": false, + "scope": "resource", + "tags": [ + "experimental", + "onExP" + ], + "markdownDescription": "%github.copilot.chat.languageContext.inline.typescript.enabled%" + }, + "github.copilot.chat.newWorkspaceCreation.enabled": { + "type": "boolean", + "default": true, + "tags": [ + "experimental" + ], + "description": "%github.copilot.config.newWorkspaceCreation.enabled%" + }, + "github.copilot.chat.newWorkspace.useContext7": { + "type": "boolean", + "default": false, + "tags": [ + "experimental" + ], + "markdownDescription": "%github.copilot.config.newWorkspace.useContext7%" + }, + "github.copilot.chat.notebook.followCellExecution.enabled": { + "type": "boolean", + "default": false, + "tags": [ + "experimental" + ], + "description": "%github.copilot.config.notebook.followCellExecution%" + }, + "github.copilot.chat.notebook.enhancedNextEditSuggestions.enabled": { + "type": "boolean", + "default": false, + "tags": [ + "experimental", + "onExp" + ], + "description": "%github.copilot.config.notebook.enhancedNextEditSuggestions%" + }, + "github.copilot.chat.summarizeAgentConversationHistory.enabled": { + "type": "boolean", + "default": true, + "tags": [ + "experimental" + ], + "description": "%github.copilot.config.summarizeAgentConversationHistory.enabled%" + }, + "github.copilot.chat.virtualTools.threshold": { + "type": "number", + "minimum": 0, + "maximum": 128, + "default": 128, + "tags": [ + "experimental" + ], + "markdownDescription": "%github.copilot.config.virtualTools.threshold%" + }, + "github.copilot.chat.alternateGptPrompt.enabled": { + "type": "boolean", + "default": false, + "tags": [ + "experimental" + ], + "description": "%github.copilot.config.alternateGptPrompt.enabled%" + }, + "github.copilot.chat.alternateGeminiModelFPrompt.enabled": { + "type": "boolean", + "default": false, + "tags": [ + "experimental", + "onExp" + ], + "description": "%github.copilot.config.alternateGeminiModelFPrompt.enabled%" + }, + "github.copilot.chat.anthropic.contextEditing.mode": { + "type": "string", + "default": "off", + "markdownDescription": "%github.copilot.config.anthropic.contextEditing.mode%", + "tags": [ + "experimental", + "onExp" + ], + "enum": [ + "off", + "clear-thinking", + "clear-tooluse", + "clear-both" + ] + }, + "github.copilot.chat.responsesApiReasoningSummary": { + "type": "string", + "default": "detailed", + "markdownDescription": "%github.copilot.config.responsesApiReasoningSummary%", + "tags": [ + "experimental", + "onExp" + ], + "enum": [ + "off", + "detailed" + ] + }, + "github.copilot.chat.responsesApiContextManagement.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.responsesApiContextManagement.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.responsesApi.promptCacheKey.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.responsesApi.promptCacheKey.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.updated53CodexPrompt.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.updated53CodexPrompt.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.claude47OpusPrompt.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.claude47OpusPrompt.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.gpt55GetChangedFilesTool.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.gpt55GetChangedFilesTool.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.gpt55ReadFileTool.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.gpt55ReadFileTool.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.gpt55EconomicalSearchAndEdit.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.gpt55EconomicalSearchAndEdit.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.gpt55LargePromptSections.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.gpt55LargePromptSections.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.anthropic.tools.websearch.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.anthropic.tools.websearch.maxUses": { + "type": "number", + "default": 5, + "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.maxUses%", + "minimum": 1, + "maximum": 20, + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.anthropic.tools.websearch.allowedDomains": { + "type": "array", + "default": [], + "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.allowedDomains%", + "items": { + "type": "string" + }, + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.anthropic.tools.websearch.blockedDomains": { + "type": "array", + "default": [], + "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.blockedDomains%", + "items": { + "type": "string" + }, + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.anthropic.tools.websearch.userLocation": { + "type": [ + "object", + "null" + ], + "default": null, + "markdownDescription": "%github.copilot.config.anthropic.tools.websearch.userLocation%", + "properties": { + "city": { + "type": "string", + "description": "City name (e.g., 'San Francisco')" + }, + "region": { + "type": "string", + "description": "State or region (e.g., 'California')" + }, + "country": { + "type": "string", + "description": "ISO country code (e.g., 'US')" + }, + "timezone": { + "type": "string", + "description": "IANA timezone identifier (e.g., 'America/Los_Angeles')" + } + }, + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.completionsFetcher": { + "type": [ + "string", + "null" + ], + "markdownDescription": "%github.copilot.config.completionsFetcher%", + "tags": [ + "experimental", + "onExp" + ], + "enum": [ + "electron-fetch", + "node-fetch" + ] + }, + "github.copilot.chat.nesFetcher": { + "type": [ + "string", + "null" + ], + "markdownDescription": "%github.copilot.config.nesFetcher%", + "tags": [ + "experimental", + "onExp" + ], + "enum": [ + "electron-fetch", + "node-fetch" + ] + }, + "github.copilot.chat.planAgent.additionalTools": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "scope": "resource", + "markdownDescription": "%github.copilot.config.planAgent.additionalTools%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.implementAgent.model": { + "type": "string", + "default": "", + "scope": "resource", + "markdownDescription": "%github.copilot.config.implementAgent.model%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.askAgent.additionalTools": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "scope": "resource", + "markdownDescription": "%github.copilot.config.askAgent.additionalTools%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.askAgent.model": { + "type": "string", + "default": "", + "scope": "resource", + "markdownDescription": "%github.copilot.config.askAgent.model%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.exploreAgent.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.exploreAgent.enabled%", + "tags": [ + "experimental", + "onExp" + ] + }, + "github.copilot.chat.exploreAgent.model": { + "type": "string", + "default": "", + "scope": "resource", + "markdownDescription": "%github.copilot.config.exploreAgent.model%", + "tags": [ + "experimental" + ] + }, + "github.copilot.chat.localIndex.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.localIndex.enabled%", + "tags": [ + "experimental", + "onExp" + ] + } + } + }, + { + "id": "advanced", + "properties": { + "github.copilot.chat.inlineEdits.xtabProvider.modelConfiguration": { + "type": [ + "object", + "null" + ], + "default": null, + "markdownDescription": "Advanced model configuration for the next edit suggestions xtab provider.\n\n**Note**: This is an advanced setting.", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.reasoningEffortOverride": { + "type": [ + "string", + "null" + ], + "default": null, + "markdownDescription": "Overrides the reasoning/thinking effort sent to model APIs. The configured value must match a reasoning-effort value supported by the selected model or endpoint (for example, `low`, `medium`, `high`, or other model-specific values). Used by evals.\n\n**Note**: This is an advanced debugging setting.", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.anthropic.promptCaching.extendedTtl": { + "type": "boolean", + "default": false, + "tags": [ + "advanced", + "experimental", + "onExp" + ], + "description": "%github.copilot.config.anthropic.promptCaching.extendedTtl%" + }, + "github.copilot.chat.anthropic.promptCaching.extendedTtlMessages": { + "type": "boolean", + "default": false, + "tags": [ + "advanced", + "experimental", + "onExp" + ], + "description": "%github.copilot.config.anthropic.promptCaching.extendedTtlMessages%" + }, + "github.copilot.chat.modelCapabilityOverrides": { + "type": "object", + "default": {}, + "markdownDescription": "%github.copilot.config.modelCapabilityOverrides%", + "additionalProperties": { + "type": "object", + "properties": { + "family": { + "type": "string", + "description": "Alias the model's family for capability routing (e.g. 'claude-opus-4.7')." + } + }, + "additionalProperties": false + }, + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.freezeCustomizationsIndex": { + "type": "boolean", + "default": true, + "tags": [ + "advanced", + "experimental", + "onExp" + ], + "description": "%github.copilot.config.freezeCustomizationsIndex%" + }, + "github.copilot.chat.installExtensionSkill.enabled": { + "type": "boolean", + "default": false, + "tags": [ + "advanced", + "experimental", + "onExp" + ], + "description": "%github.copilot.config.installExtensionSkill.enabled%" + }, + "github.copilot.chat.debug.promptOverrideString": { + "type": [ + "string", + "null" + ], + "default": null, + "markdownDescription": "YAML string that overrides the system prompt and/or tool descriptions sent to the model. When both this setting and `github.copilot.chat.debug.promptOverrideFile` are configured, this setting takes precedence.\n\n**Note**: This is an advanced debugging setting.", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.debug.promptOverrideFile": { + "type": [ + "string", + "null" + ], + "default": null, + "markdownDescription": "Path to a YAML file that overrides the system prompt and/or tool descriptions sent to the model.\n\n**Note**: This is an advanced debugging setting.", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.edits.gemini3MultiReplaceString": { + "type": "boolean", + "default": false, + "markdownDescription": "Enable the modern `multi_replace_string_in_file` edit tool when generating edits with Gemini 3 models.", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.edits.batchReplaceStringDescriptions": { + "type": "boolean", + "default": false, + "markdownDescription": "Update tool descriptions to promote `multi_replace_string_in_file` as the primary multi-edit tool.", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.projectLabels.expanded": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.projectLabels.expanded%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.projectLabels.chat": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.projectLabels.chat%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.projectLabels.inline": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.projectLabels.inline%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.workspace.maxLocalIndexSize": { + "type": "number", + "default": 100000, + "markdownDescription": "%github.copilot.config.workspace.maxLocalIndexSize%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.workspace.enableCodeSearch": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.workspace.enableCodeSearch%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.workspace.preferredEmbeddingsModel": { + "type": "string", + "default": "", + "markdownDescription": "%github.copilot.config.workspace.preferredEmbeddingsModel%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.workspace.prototypeAdoCodeSearchEndpointOverride": { + "type": "string", + "default": "", + "markdownDescription": "%github.copilot.config.workspace.prototypeAdoCodeSearchEndpointOverride%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.feedback.onChange": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.feedback.onChange%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.review.intent": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.review.intent%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.notebook.summaryExperimentEnabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.notebook.summaryExperimentEnabled%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.notebook.variableFilteringEnabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.notebook.variableFilteringEnabled%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.notebook.alternativeFormat": { + "type": "string", + "default": "xml", + "enum": [ + "xml", + "markdown" + ], + "markdownDescription": "%github.copilot.config.notebook.alternativeFormat%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.notebook.alternativeNESFormat.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.notebook.alternativeNESFormat.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.debugTerminalCommandPatterns": { + "type": "array", + "default": [], + "items": { + "type": "string" + }, + "markdownDescription": "%github.copilot.config.debugTerminalCommandPatterns%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.localWorkspaceRecording.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.localWorkspaceRecording.enabled%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.editRecording.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.editRecording.enabled%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.inlineChat.reasoningEffort": { + "type": "string", + "default": "low", + "enum": [ + "none", + "minimal", + "low", + "medium", + "high" + ], + "markdownDescription": "%github.copilot.config.inlineChat.reasoningEffort%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.inlineChat.enableThinking": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.inlineChat.enableThinking%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.debug.requestLogger.maxEntries": { + "type": "number", + "default": 100, + "markdownDescription": "%github.copilot.config.debug.requestLogger.maxEntries%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.inlineEdits.diagnosticsContextProvider.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.inlineEdits.diagnosticsContextProvider.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.inlineEdits.chatSessionContextProvider.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.inlineEdits.chatSessionContextProvider.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.codesearch.agent.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.codesearch.agent.enabled%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.agent.temperature": { + "type": [ + "number", + "null" + ], + "markdownDescription": "%github.copilot.config.agent.temperature%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.agent.omitFileAttachmentContents": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.agent.omitFileAttachmentContents%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.agent.backgroundTodoAgent.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.agent.backgroundTodoAgent.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.agent.largeToolResultsToDisk.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.agent.largeToolResultsToDisk.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.agent.largeToolResultsToDisk.thresholdBytes": { + "type": "number", + "default": 8192, + "markdownDescription": "%github.copilot.config.agent.largeToolResultsToDisk.thresholdBytes%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.instantApply.shortContextModelName": { + "type": "string", + "default": "gpt-4o-instant-apply-full-ft-v66-short", + "markdownDescription": "%github.copilot.config.instantApply.shortContextModelName%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.instantApply.shortContextLimit": { + "type": "number", + "default": 8000, + "markdownDescription": "%github.copilot.config.instantApply.shortContextLimit%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.enableUserPreferences": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.enableUserPreferences%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.skillTool.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.skill.enabled%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.getChangedFilesTool.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.getChangedFilesTool.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.executionSubagent.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.executionSubagent.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.executionSubagent.model": { + "type": "string", + "default": "", + "markdownDescription": "%github.copilot.config.executionSubagent.model%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.executionSubagent.useAgenticProxy": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.executionSubagent.useAgenticProxy%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.executionSubagent.toolCallLimit": { + "type": "number", + "default": 10, + "markdownDescription": "%github.copilot.config.executionSubagent.toolCallLimit%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.summarizeAgentConversationHistoryThreshold": { + "type": [ + "number", + "null" + ], + "markdownDescription": "%github.copilot.config.summarizeAgentConversationHistoryThreshold%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.agentHistorySummarizationMode": { + "type": [ + "string", + "null" + ], + "markdownDescription": "%github.copilot.config.agentHistorySummarizationMode%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.useResponsesApiTruncation": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.useResponsesApiTruncation%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.omitBaseAgentInstructions": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.omitBaseAgentInstructions%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.promptFileContextProvider.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.promptFileContextProvider.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.tools.defaultToolsGrouped": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.tools.defaultToolsGrouped%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.gpt5AlternativePatch": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.gpt5AlternativePatch%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.inlineEdits.triggerOnEditorChangeAfterSeconds": { + "type": [ + "number", + "null" + ], + "default": 10, + "markdownDescription": "%github.copilot.config.inlineEdits.triggerOnEditorChangeAfterSeconds%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.inlineEdits.nextCursorPrediction.displayLine": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.inlineEdits.nextCursorPrediction.displayLine%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.inlineEdits.nextCursorPrediction.currentFileMaxTokens": { + "type": "number", + "default": 3000, + "markdownDescription": "%github.copilot.config.inlineEdits.nextCursorPrediction.currentFileMaxTokens%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.inlineEdits.renameSymbolSuggestions": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.inlineEdits.renameSymbolSuggestions%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.nextEditSuggestions.preferredModel": { + "type": "string", + "default": "none", + "markdownDescription": "%github.copilot.config.nextEditSuggestions.preferredModel%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.nextEditSuggestions.eagerness": { + "type": "string", + "default": "auto", + "enum": [ + "auto", + "low", + "medium", + "high" + ], + "enumItemLabels": [ + "%github.copilot.config.nextEditSuggestions.eagerness.auto.label%", + "%github.copilot.config.nextEditSuggestions.eagerness.low.label%", + "%github.copilot.config.nextEditSuggestions.eagerness.medium.label%", + "%github.copilot.config.nextEditSuggestions.eagerness.high.label%" + ], + "enumDescriptions": [ + "%github.copilot.config.nextEditSuggestions.eagerness.auto%", + "%github.copilot.config.nextEditSuggestions.eagerness.low%", + "%github.copilot.config.nextEditSuggestions.eagerness.medium%", + "%github.copilot.config.nextEditSuggestions.eagerness.high%" + ], + "markdownDescription": "%github.copilot.config.nextEditSuggestions.eagerness%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.cli.mcp.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.mcp.enabled%", + "tags": [ + "advanced", + "experimental" + ], + "agentsWindow": { + "default": true + } + }, + "github.copilot.chat.cli.branchSupport.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.cli.branchSupport.enabled%", + "tags": [ + "advanced" + ], + "agentsWindow": { + "default": true + } + }, + "github.copilot.chat.cli.showExternalSessions": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.showExternalSessions%", + "tags": [ + "advanced" + ], + "agentsWindow": { + "default": false + } + }, + "github.copilot.chat.cli.planExitMode.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.planExitMode.enabled%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.cli.autoModel.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.cli.autoModel.enabled%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.agent.modelDetails.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.chat.agent.modelDetails.enabled%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.cli.planCommand.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.planCommand.enabled%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.cli.lazyLoadSessionItem.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.lazyLoadSessionItem.enabled%", + "tags": [ + "advanced" + ], + "agentsWindow": { + "default": false + } + }, + "github.copilot.chat.cli.aiGenerateBranchNames.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.aiGenerateBranchNames.enabled%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.cli.forkSessions.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.forkSessions.enabled%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.cli.isolationOption.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.isolationOption.enabled%", + "tags": [ + "advanced" + ], + "agentsWindow": { + "default": true + } + }, + "github.copilot.chat.cli.autoCommit.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.autoCommit.enabled%", + "tags": [ + "advanced", + "experimental" + ], + "agentsWindow": { + "default": false + } + }, + "github.copilot.chat.cli.sessionController.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.cli.sessionController.enabled%", + "tags": [ + "advanced" + ], + "agentsWindow": { + "default": false, + "readOnly": true + } + }, + "github.copilot.chat.cli.thinkingEffort.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.thinkingEffort.enabled%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.cli.sessionControllerForSessionsApp.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.cli.sessionControllerForSessionsApp.enabled%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.cli.terminalLinks.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.terminalLinks.enabled%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.cli.remote.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.cli.remote.enabled%", + "tags": [ + "advanced" + ], + "agentsWindow": { + "default": false + } + }, + "github.copilot.chat.searchSubagent.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.searchSubagent.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.searchSubagent.useAgenticProxy": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.searchSubagent.useAgenticProxy%", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.searchSubagent.model": { + "type": "string", + "default": "", + "markdownDescription": "%github.copilot.config.searchSubagent.model%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.searchSubagent.toolCallLimit": { + "type": "number", + "default": 4, + "markdownDescription": "%github.copilot.config.searchSubagent.toolCallLimit%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.searchSubagent.thoroughnessEnabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.searchSubagent.thoroughnessEnabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.agentDebugLog.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.chat.agentDebugLog.enabled%", + "deprecationMessage": "%github.copilot.config.chat.agentDebugLog.enabled.deprecated%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.agentDebugLog.fileLogging.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.chat.agentDebugLog.fileLogging.enabled%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.agentDebugLog.fileLogging.flushIntervalMs": { + "type": "number", + "default": 4000, + "minimum": 2000, + "markdownDescription": "%github.copilot.config.chat.agentDebugLog.fileLogging.flushIntervalMs%", + "tags": [ + "advanced", + "experimental" + ] + }, + "github.copilot.chat.agentDebugLog.fileLogging.maxRetainedSessionLogs": { + "type": "number", + "default": 50, + "minimum": 1, + "markdownDescription": "%github.copilot.config.chat.agentDebugLog.fileLogging.maxRetainedSessionLogs%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.agentDebugLog.fileLogging.maxSessionLogSizeMB": { + "type": "number", + "default": 100, + "minimum": 1, + "markdownDescription": "%github.copilot.config.chat.agentDebugLog.fileLogging.maxSessionLogSizeMB%", + "tags": [ + "advanced", + "experimental", + "onExp" + ] + }, + "github.copilot.chat.otel.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "Enable OpenTelemetry trace/metric/log emission for Copilot Chat operations. Env var `COPILOT_OTEL_ENABLED` takes precedence. Requires window reload.", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.otel.exporterType": { + "type": "string", + "enum": [ + "otlp-grpc", + "otlp-http", + "console", + "file" + ], + "default": "otlp-http", + "markdownDescription": "OTel exporter type for Copilot Chat telemetry. Requires window reload.", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.otel.otlpEndpoint": { + "type": "string", + "default": "http://localhost:4318", + "markdownDescription": "OTLP collector endpoint URL for Copilot Chat OTel data. Env var `OTEL_EXPORTER_OTLP_ENDPOINT` takes precedence. Requires window reload.", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.otel.captureContent": { + "type": "boolean", + "default": false, + "markdownDescription": "Capture input/output messages, system instructions, and tool definitions in OTel telemetry. **Contains potentially sensitive data.** Env var `COPILOT_OTEL_CAPTURE_CONTENT` takes precedence. Requires window reload.", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.otel.maxAttributeSizeChars": { + "type": "integer", + "default": 0, + "minimum": 0, + "markdownDescription": "Maximum size **in characters** for free-form OTel content attributes (prompts, responses, tool arguments/results, hook input/output). `0` (the default) disables truncation so backends without per-attribute size limits receive full JSON payloads. Set to a positive value when your OTel backend caps attribute size — consult your backend's documentation for its per-attribute limit. Truncated values are suffixed with `...[truncated, original N chars]`. Env var `COPILOT_OTEL_MAX_ATTRIBUTE_SIZE_CHARS` takes precedence. Requires window reload.", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.otel.outfile": { + "type": "string", + "default": "", + "markdownDescription": "File path for file-based OTel exporter output (JSON-lines). When set, overrides exporter type to `file`. Requires window reload.", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.otel.dbSpanExporter.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "Enable SQLite DB span exporter. Persists OTel spans to a local SQLite database. Automatically enables OTel when set to true. Requires window reload.", + "tags": [ + "advanced" + ] + }, + "github.copilot.chat.workspace.codeSearchExternalIngest.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%github.copilot.config.workspace.codeSearchExternalIngest.enabled%", + "tags": [ + "advanced", + "onExp" + ] + } + } + } + ], + "submenus": [ + { + "id": "copilot/reviewComment/additionalActions/applyAndNext", + "label": "%github.copilot.submenu.reviewComment.applyAndNext.label%" + }, + { + "id": "copilot/reviewComment/additionalActions/discardAndNext", + "label": "%github.copilot.submenu.reviewComment.discardAndNext.label%" + }, + { + "id": "copilot/reviewComment/additionalActions/discard", + "label": "%github.copilot.submenu.reviewComment.discard.label%" + }, + { + "id": "github.copilot.chat.debug.filter", + "label": "Filter", + "icon": "$(filter)" + }, + { + "id": "github.copilot.chat.debug.exportAllPromptLogsAsJson", + "label": "Export All Logs as JSON", + "icon": "$(file-export)" + } + ], + "menus": { + "editor/title": [ + { + "command": "github.copilot.debug.generateInlineEditTests", + "when": "resourceScheme == 'ccreq'" + }, + { + "command": "github.copilot.chat.notebook.enableFollowCellExecution", + "when": "config.github.copilot.chat.notebook.followCellExecution.enabled && !github.copilot.notebookFollowInSessionEnabled && github.copilot.notebookAgentModeUsage && !config.notebook.globalToolbar", + "group": "navigation@10" + }, + { + "command": "github.copilot.chat.notebook.disableFollowCellExecution", + "when": "config.github.copilot.chat.notebook.followCellExecution.enabled && github.copilot.notebookFollowInSessionEnabled && github.copilot.notebookAgentModeUsage && !config.notebook.globalToolbar", + "group": "navigation@10" + }, + { + "command": "github.copilot.chat.copilotCLI.acceptDiff", + "group": "navigation@1", + "when": "github.copilot.chat.copilotCLI.hasActiveDiff" + }, + { + "command": "github.copilot.chat.copilotCLI.rejectDiff", + "group": "navigation@2", + "when": "github.copilot.chat.copilotCLI.hasActiveDiff" + } + ], + "editor/title/context": [ + { + "command": "github.copilot.chat.copilotCLI.addFileReference", + "group": "copilot", + "when": "github.copilot.chat.copilotCLI.hasSession && !inOutput && resourceScheme != 'vscode-webview' && resourceScheme != 'webview-panel'" + } + ], + "explorer/context": [ + { + "command": "github.copilot.chat.copilotCLI.addFileReference", + "group": "copilot", + "when": "github.copilot.chat.copilotCLI.hasSession && !explorerResourceIsFolder" + } + ], + "editor/context": [ + { + "command": "github.copilot.chat.fix", + "when": "!github.copilot.interactiveSession.disabled && chatSetupCompleted && !editorReadonly && editorSelectionHasDiagnostics", + "group": "1_chat@4" + }, + { + "command": "github.copilot.chat.explain", + "when": "!github.copilot.interactiveSession.disabled && chatSetupCompleted", + "group": "1_chat@5" + }, + { + "command": "github.copilot.chat.review", + "when": "config.github.copilot.chat.reviewSelection.enabled && !github.copilot.interactiveSession.disabled && chatSetupCompleted && resourceScheme != 'vscode-chat-code-block'", + "group": "1_chat@6" + }, + { + "command": "github.copilot.chat.copilotCLI.addFileReference", + "group": "copilot", + "when": "github.copilot.chat.copilotCLI.hasSession && !inOutput && resourceScheme != 'vscode-webview' && resourceScheme != 'webview-panel'" + }, + { + "command": "github.copilot.chat.copilotCLI.addSelection", + "group": "copilot", + "when": "github.copilot.chat.copilotCLI.hasSession && editorHasSelection && !inOutput && resourceScheme != 'vscode-webview' && resourceScheme != 'webview-panel'" + } + ], + "chat/editor/inlineGutter": [ + { + "command": "github.copilot.chat.explain", + "when": "!github.copilot.interactiveSession.disabled && editor.hasSelection && !inlineChatFileBelongsToChat", + "group": "2_chat@2" + }, + { + "command": "github.copilot.chat.review", + "when": "!github.copilot.interactiveSession.disabled && editor.hasSelection && config.github.copilot.chat.reviewSelection.enabled && !inlineChatFileBelongsToChat", + "group": "2_chat@3" + } + ], + "chat/input/editing/sessionToolbar": [ + { + "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges.apply", + "when": "chatSessionType == copilotcli && workbenchState != empty && !isSessionsWindow", + "group": "navigation@0" + }, + { + "command": "github.copilot.chat.checkoutPullRequestReroute", + "when": "chatSessionType == copilot-cloud-agent && !github.vscode-pull-request-github.activated && gitOpenRepositoryCount != 0", + "group": "navigation@0" + } + ], + "agents/changes/actions/primary": [ + { + "command": "github.copilot.sessions.initializeRepository", + "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == workspace && !sessions.hasGitRepository && !sessions.isAgentHostSession", + "group": "0_init@1" + }, + { + "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.merge", + "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == worktree && sessions.hasGitRepository && !sessions.isMergeBaseBranchProtected && !sessions.hasPullRequest && (sessions.hasUncommittedChanges || sessions.hasOutgoingChanges) && !sessions.isAgentHostSession", + "group": "1_merge@1" + }, + { + "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.mergeAndSync", + "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == worktree && sessions.hasGitRepository && !sessions.isMergeBaseBranchProtected && !sessions.hasPullRequest && (sessions.hasUncommittedChanges || sessions.hasOutgoingChanges) && !sessions.isAgentHostSession", + "group": "1_merge@2" + }, + { + "command": "github.copilot.chat.createPullRequestCopilotCLIAgentSession.createPR", + "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == worktree && sessions.hasGitRepository && sessions.hasGitHubRemote && !sessions.hasPullRequest && sessions.hasBranchChanges && !sessions.isAgentHostSession", + "group": "2_pull_request@1" + }, + { + "command": "github.copilot.chat.createDraftPullRequestCopilotCLIAgentSession.createDraftPR", + "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.isolationMode == worktree && sessions.hasGitRepository && sessions.hasGitHubRemote && !sessions.hasPullRequest && sessions.hasBranchChanges && !sessions.isAgentHostSession", + "group": "2_pull_request@2" + }, + { + "command": "github.copilot.sessions.commit", + "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.hasGitRepository && sessions.hasUncommittedChanges && !sessions.isAgentHostSession", + "group": "3_commit@1" + }, + { + "command": "github.copilot.sessions.commitAndSync", + "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.hasGitRepository && sessions.hasUncommittedChanges && !sessions.isAgentHostSession", + "group": "3_commit@2" + }, + { + "command": "github.copilot.sessions.sync", + "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.hasGitRepository && sessions.hasUpstream && !sessions.hasUncommittedChanges && (sessions.hasIncomingChanges || sessions.hasOutgoingChanges) && !sessions.isAgentHostSession", + "group": "4_sync@1" + }, + { + "command": "github.copilot.claude.sessions.initializeRepository", + "when": "chatSessionType == claude-code && isSessionsWindow && !sessions.hasGitRepository", + "group": "init@1" + }, + { + "command": "github.copilot.claude.sessions.commit", + "when": "chatSessionType == claude-code && isSessionsWindow && sessions.hasGitRepository && sessions.hasUncommittedChanges", + "group": "commit@1" + }, + { + "command": "github.copilot.claude.sessions.commitAndSync", + "when": "chatSessionType == claude-code && isSessionsWindow && sessions.hasGitRepository && sessions.hasUncommittedChanges && sessions.hasUpstream", + "group": "commit@2" + }, + { + "command": "github.copilot.claude.sessions.sync", + "when": "chatSessionType == claude-code && isSessionsWindow && sessions.hasGitRepository && !sessions.hasUncommittedChanges && sessions.hasUpstream", + "group": "sync@1" + } + ], + "agents/change/inline": [ + { + "command": "github.copilot.sessions.discardChanges", + "when": "chatSessionType == copilotcli && isSessionsWindow && sessions.hasGitRepository && !isActiveSessionArchived && !sessions.isAgentHostSession", + "group": "navigation@2" + } + ], + "chat/contextUsage/actions": [ + { + "command": "github.copilot.chat.compact" + } + ], + "chat/newSession": [ + { + "command": "github.copilot.cli.newSession", + "group": "4_recommendations@0" + } + ], + "testing/item/result": [ + { + "command": "github.copilot.tests.fixTestFailure.fromInline", + "when": "testResultState == failed && !testResultOutdated", + "group": "inline@2" + } + ], + "testing/item/context": [ + { + "command": "github.copilot.tests.fixTestFailure.fromInline", + "when": "testResultState == failed && !testResultOutdated", + "group": "inline@2" + } + ], + "commandPalette": [ + { + "command": "github.copilot.cli.openInCopilotCLI", + "when": "false" + }, + { + "command": "github.copilot.debug.extensionState", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.commitToWorktree", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.commitToRepository", + "when": "false" + }, + { + "command": "github.copilot.chat.triggerPermissiveSignIn", + "when": "false" + }, + { + "command": "github.copilot.interactiveSession.feedback", + "when": "github.copilot-chat.activated && !github.copilot.interactiveSession.disabled" + }, + { + "command": "github.copilot.debug.workbenchState", + "when": "true" + }, + { + "command": "github.copilot.chat.rerunWithCopilotDebug", + "when": "false" + }, + { + "command": "github.copilot.chat.startCopilotDebugCommand", + "when": "false" + }, + { + "command": "github.copilot.git.generateCommitMessage", + "when": "false" + }, + { + "command": "github.copilot.git.resolveMergeConflicts", + "when": "false" + }, + { + "command": "github.copilot.chat.explain", + "when": "false" + }, + { + "command": "github.copilot.chat.review", + "when": "!github.copilot.interactiveSession.disabled" + }, + { + "command": "github.copilot.chat.review.apply", + "when": "false" + }, + { + "command": "github.copilot.chat.review.applyAndNext", + "when": "false" + }, + { + "command": "github.copilot.chat.review.discard", + "when": "false" + }, + { + "command": "github.copilot.chat.review.discardAndNext", + "when": "false" + }, + { + "command": "github.copilot.chat.review.discardAll", + "when": "false" + }, + { + "command": "github.copilot.chat.review.stagedChanges", + "when": "false" + }, + { + "command": "github.copilot.chat.review.unstagedChanges", + "when": "false" + }, + { + "command": "github.copilot.chat.review.changes", + "when": "false" + }, + { + "command": "github.copilot.chat.review.stagedFileChange", + "when": "false" + }, + { + "command": "github.copilot.chat.review.unstagedFileChange", + "when": "false" + }, + { + "command": "github.copilot.chat.review.previous", + "when": "false" + }, + { + "command": "github.copilot.chat.review.next", + "when": "false" + }, + { + "command": "github.copilot.chat.review.continueInInlineChat", + "when": "false" + }, + { + "command": "github.copilot.chat.review.continueInChat", + "when": "false" + }, + { + "command": "github.copilot.chat.review.markHelpful", + "when": "false" + }, + { + "command": "github.copilot.chat.review.markUnhelpful", + "when": "false" + }, + { + "command": "github.copilot.devcontainer.generateDevContainerConfig", + "when": "false" + }, + { + "command": "github.copilot.tests.fixTestFailure", + "when": "false" + }, + { + "command": "github.copilot.tests.fixTestFailure.fromInline", + "when": "false" + }, + { + "command": "github.copilot.search.markHelpful", + "when": "false" + }, + { + "command": "github.copilot.search.markUnhelpful", + "when": "false" + }, + { + "command": "github.copilot.search.feedback", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.showElements", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.hideElements", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.showTools", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.hideTools", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.showNesRequests", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.hideNesRequests", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.showGhostRequests", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.hideGhostRequests", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.exportLogItem", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.exportPromptArchive", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.exportPromptLogsAsJson", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.exportAllPromptLogsAsJson", + "when": "false" + }, + { + "command": "github.copilot.chat.mcp.setup.check", + "when": "false" + }, + { + "command": "github.copilot.chat.mcp.setup.validatePackage", + "when": "false" + }, + { + "command": "github.copilot.chat.mcp.setup.flow", + "when": "false" + }, + { + "command": "github.copilot.chat.debug.showRawRequestBody", + "when": "false" + }, + { + "command": "github.copilot.debug.showOutputChannel", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.delete", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.resumeInTerminal", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.rename", + "when": "false" + }, + { + "command": "github.copilot.claude.sessions.rename", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.setTitle", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.openRepository", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.openWorktreeInNewWindow", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.openWorktreeInTerminal", + "when": "false" + }, + { + "command": "github.copilot.cli.sessions.copyWorktreeBranchName", + "when": "false" + }, + { + "command": "github.copilot.cloud.sessions.openInBrowser", + "when": "false" + }, + { + "command": "github.copilot.cloud.sessions.proxy.closeChatSessionPullRequest", + "when": "false" + }, + { + "command": "github.copilot.cloud.sessions.installPRExtension", + "when": "false" + }, + { + "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges", + "when": "false" + }, + { + "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges.apply", + "when": "false" + }, + { + "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.merge", + "when": "false" + }, + { + "command": "github.copilot.chat.mergeCopilotCLIAgentSessionChanges.mergeAndSync", + "when": "false" + }, + { + "command": "github.copilot.chat.createPullRequestCopilotCLIAgentSession.createPR", + "when": "false" + }, + { + "command": "github.copilot.chat.createDraftPullRequestCopilotCLIAgentSession.createDraftPR", + "when": "false" + }, + { + "command": "github.copilot.chat.checkoutPullRequestReroute", + "when": "false" + }, + { + "command": "github.copilot.chat.cloudSessions.openRepository", + "when": "false" + }, + { + "command": "github.copilot.nes.captureExpected.start", + "when": "github.copilot.inlineEditsEnabled" + }, + { + "command": "github.copilot.nes.captureExpected.submit", + "when": "github.copilot.inlineEditsEnabled" + }, + { + "command": "github.copilot.sessions.commit", + "when": "false" + }, + { + "command": "github.copilot.sessions.commitAndSync", + "when": "false" + }, + { + "command": "github.copilot.sessions.sync", + "when": "false" + }, + { + "command": "github.copilot.sessions.discardChanges", + "when": "false" + }, + { + "command": "github.copilot.sessions.refreshChanges", + "when": "false" + }, + { + "command": "github.copilot.sessions.initializeRepository", + "when": "false" + }, + { + "command": "github.copilot.claude.sessions.commit", + "when": "false" + }, + { + "command": "github.copilot.claude.sessions.commitAndSync", + "when": "false" + }, + { + "command": "github.copilot.claude.sessions.sync", + "when": "false" + }, + { + "command": "github.copilot.claude.sessions.initializeRepository", + "when": "false" + } + ], + "view/title": [ + { + "submenu": "github.copilot.chat.debug.filter", + "when": "view == copilot-chat", + "group": "navigation" + }, + { + "command": "github.copilot.chat.debug.exportAllPromptLogsAsJson", + "when": "view == copilot-chat", + "group": "export@1" + }, + { + "command": "workbench.action.chat.openAgentDebugPanel", + "when": "view == copilot-chat", + "group": "3_show@0" + }, + { + "command": "github.copilot.debug.showOutputChannel", + "when": "view == copilot-chat", + "group": "3_show@1" + }, + { + "command": "github.copilot.debug.showChatLogView", + "when": "view == workbench.panel.chat.view.copilot", + "group": "3_show" + } + ], + "view/item/context": [ + { + "command": "github.copilot.chat.debug.showRawRequestBody", + "when": "view == copilot-chat && viewItem == request", + "group": "export@0" + }, + { + "command": "github.copilot.chat.debug.exportLogItem", + "when": "view == copilot-chat && (viewItem == toolcall || viewItem == request)", + "group": "export@1" + }, + { + "command": "github.copilot.chat.debug.exportPromptArchive", + "when": "view == copilot-chat && viewItem == chatprompt", + "group": "export@2" + }, + { + "command": "github.copilot.chat.debug.exportPromptLogsAsJson", + "when": "view == copilot-chat && viewItem == chatprompt", + "group": "export@3" + } + ], + "searchPanel/aiResults/commands": [ + { + "command": "github.copilot.search.markHelpful", + "group": "inline@0", + "when": "aiResultsTitle && aiResultsRequested" + }, + { + "command": "github.copilot.search.markUnhelpful", + "group": "inline@1", + "when": "aiResultsTitle && aiResultsRequested" + }, + { + "command": "github.copilot.search.feedback", + "group": "inline@2", + "when": "aiResultsTitle && aiResultsRequested && github.copilot.debugReportFeedback" + } + ], + "comments/comment/title": [ + { + "command": "github.copilot.chat.review.markHelpful", + "group": "inline@0", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.markUnhelpful", + "group": "inline@1", + "when": "commentController == github-copilot-review" + } + ], + "commentsView/commentThread/context": [ + { + "command": "github.copilot.chat.review.apply", + "group": "context@1", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.discard", + "group": "context@2", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.discardAll", + "group": "context@3", + "when": "commentController == github-copilot-review" + } + ], + "comments/commentThread/additionalActions": [ + { + "submenu": "copilot/reviewComment/additionalActions/applyAndNext", + "group": "inline@1", + "when": "commentController == github-copilot-review && github.copilot.chat.review.numberOfComments > 1" + }, + { + "command": "github.copilot.chat.review.apply", + "group": "inline@1", + "when": "commentController == github-copilot-review && github.copilot.chat.review.numberOfComments == 1" + }, + { + "submenu": "copilot/reviewComment/additionalActions/discardAndNext", + "group": "inline@2", + "when": "commentController == github-copilot-review && github.copilot.chat.review.numberOfComments > 1" + }, + { + "submenu": "copilot/reviewComment/additionalActions/discard", + "group": "inline@2", + "when": "commentController == github-copilot-review && github.copilot.chat.review.numberOfComments == 1" + } + ], + "copilot/reviewComment/additionalActions/applyAndNext": [ + { + "command": "github.copilot.chat.review.applyAndNext", + "group": "inline@1", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.apply", + "group": "inline@2", + "when": "commentController == github-copilot-review" + } + ], + "copilot/reviewComment/additionalActions/discardAndNext": [ + { + "command": "github.copilot.chat.review.discardAndNext", + "group": "inline@1", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.discard", + "group": "inline@2", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.continueInInlineChat", + "group": "inline@3", + "when": "commentController == github-copilot-review" + } + ], + "copilot/reviewComment/additionalActions/discard": [ + { + "command": "github.copilot.chat.review.discard", + "group": "inline@2", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.continueInInlineChat", + "group": "inline@3", + "when": "commentController == github-copilot-review" + } + ], + "comments/commentThread/title": [ + { + "command": "github.copilot.chat.review.previous", + "group": "inline@1", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.next", + "group": "inline@2", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.continueInChat", + "group": "inline@3", + "when": "commentController == github-copilot-review" + }, + { + "command": "github.copilot.chat.review.discardAll", + "group": "inline@4", + "when": "commentController == github-copilot-review" + } + ], + "scm/title": [ + { + "command": "github.copilot.chat.review.changes", + "group": "navigation", + "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmProviderRootUri in github.copilot.chat.reviewDiff.enabledRootUris" + } + ], + "scm/sourceControl": [ + { + "command": "github.copilot.cli.openInCopilotCLI", + "group": "3_worktree@1", + "when": "scmProvider == git" + } + ], + "scm/resourceGroup/context": [ + { + "command": "github.copilot.chat.review.stagedChanges", + "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmResourceGroup == index", + "group": "inline@-3" + }, + { + "command": "github.copilot.chat.review.unstagedChanges", + "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmResourceGroup == workingTree", + "group": "inline@-3" + } + ], + "scm/resourceState/context": [ + { + "command": "github.copilot.git.resolveMergeConflicts", + "when": "scmProvider == git && scmResourceGroup == merge && git.activeResourceHasMergeConflicts", + "group": "z_chat@1" + }, + { + "command": "github.copilot.chat.review.stagedFileChange", + "group": "3_copilot", + "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmResourceGroup == index" + }, + { + "command": "github.copilot.chat.review.unstagedFileChange", + "group": "3_copilot", + "when": "config.github.copilot.chat.reviewAgent.enabled && github.copilot.chat.reviewDiff.enabled && scmProvider == git && scmResourceGroup == workingTree" + } + ], + "scm/inputBox": [ + { + "command": "github.copilot.git.generateCommitMessage", + "when": "scmProvider == git && chatSetupCompleted" + } + ], + "testing/message/context": [ + { + "command": "github.copilot.tests.fixTestFailure", + "when": "testing.testItemHasUri", + "group": "inline@1" + } + ], + "issue/reporter": [ + { + "command": "github.copilot.report" + } + ], + "github.copilot.chat.debug.filter": [ + { + "command": "github.copilot.chat.debug.showElements", + "when": "github.copilot.chat.debug.elementsHidden", + "group": "commands@0" + }, + { + "command": "github.copilot.chat.debug.hideElements", + "when": "!github.copilot.chat.debug.elementsHidden", + "group": "commands@0" + }, + { + "command": "github.copilot.chat.debug.showTools", + "when": "github.copilot.chat.debug.toolsHidden", + "group": "commands@1" + }, + { + "command": "github.copilot.chat.debug.hideTools", + "when": "!github.copilot.chat.debug.toolsHidden", + "group": "commands@1" + }, + { + "command": "github.copilot.chat.debug.showNesRequests", + "when": "github.copilot.chat.debug.nesRequestsHidden", + "group": "commands@2" + }, + { + "command": "github.copilot.chat.debug.hideNesRequests", + "when": "!github.copilot.chat.debug.nesRequestsHidden", + "group": "commands@2" + }, + { + "command": "github.copilot.chat.debug.showGhostRequests", + "when": "github.copilot.chat.debug.ghostRequestsHidden", + "group": "commands@3" + }, + { + "command": "github.copilot.chat.debug.hideGhostRequests", + "when": "!github.copilot.chat.debug.ghostRequestsHidden", + "group": "commands@3" + } + ], + "notebook/toolbar": [ + { + "command": "github.copilot.chat.notebook.enableFollowCellExecution", + "when": "config.github.copilot.chat.notebook.followCellExecution.enabled && !github.copilot.notebookFollowInSessionEnabled && github.copilot.notebookAgentModeUsage && config.notebook.globalToolbar", + "group": "navigation/execute@15" + }, + { + "command": "github.copilot.chat.notebook.disableFollowCellExecution", + "when": "config.github.copilot.chat.notebook.followCellExecution.enabled && github.copilot.notebookFollowInSessionEnabled && github.copilot.notebookAgentModeUsage && config.notebook.globalToolbar", + "group": "navigation/execute@15" + } + ], + "editor/content": [ + { + "command": "github.copilot.git.resolveMergeConflicts", + "group": "z_chat@1", + "when": "config.git.enabled && !git.missing && !isInDiffEditor && !isMergeEditor && resource in git.mergeChanges && git.activeResourceHasMergeConflicts && chatSetupCompleted" + } + ], + "multiDiffEditor/content": [ + { + "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges", + "when": "resourceScheme == copilotcli-worktree-changes && workbenchState != empty && !isSessionsWindow" + } + ], + "chat/chatSessions": [ + { + "command": "github.copilot.claude.sessions.rename", + "when": "chatSessionType == claude-code", + "group": "1_edit@4" + }, + { + "command": "github.copilot.cli.sessions.delete", + "when": "chatSessionType == copilotcli", + "group": "1_edit@10" + }, + { + "command": "github.copilot.cli.sessions.rename", + "when": "chatSessionType == copilotcli", + "group": "1_edit@4" + }, + { + "command": "github.copilot.cli.sessions.openWorktreeInNewWindow", + "when": "chatSessionType == copilotcli && !isSessionsWindow", + "group": "2_open@1" + }, + { + "command": "github.copilot.cli.sessions.openWorktreeInTerminal", + "when": "chatSessionType == copilotcli", + "group": "2_open@2" + }, + { + "command": "github.copilot.cli.sessions.copyWorktreeBranchName", + "when": "chatSessionType == copilotcli", + "group": "2_open@3" + }, + { + "command": "github.copilot.cli.sessions.resumeInTerminal", + "when": "chatSessionType == copilotcli", + "group": "2_open@4" + }, + { + "command": "github.copilot.chat.applyCopilotCLIAgentSessionChanges", + "when": "chatSessionType == copilotcli && workbenchState != empty && !isSessionsWindow", + "group": "3_apply@0" + }, + { + "command": "github.copilot.cloud.sessions.openInBrowser", + "when": "chatSessionType == copilot-cloud-agent", + "group": "navigation@10" + }, + { + "command": "github.copilot.cloud.sessions.proxy.closeChatSessionPullRequest", + "when": "chatSessionType == copilot-cloud-agent", + "group": "1_edit@10" + } + ], + "chat/multiDiff/context": [ + { + "command": "github.copilot.cloud.sessions.installPRExtension", + "when": "chatSessionType == copilot-cloud-agent && !github.copilot.prExtensionInstalled", + "group": "inline@1" + } + ], + "chat/input/editing/sessionTitleToolbar": [ + { + "command": "github.copilot.sessions.refreshChanges", + "when": "chatSessionType == copilotcli && isSessionsWindow && !sessions.isAgentHostSession", + "group": "9_refresh@1" + } + ], + "chat/customizations/create": [ + { + "command": "copilot.claude.agents", + "when": "chatCustomizationSessionType == claude-code && chatCustomizationSection == agents", + "group": "navigation@1" + }, + { + "command": "copilot.claude.hooks", + "when": "chatCustomizationSessionType == claude-code && chatCustomizationSection == hooks", + "group": "navigation@1" + }, + { + "command": "copilot.claude.memory", + "when": "chatCustomizationSessionType == claude-code && chatCustomizationSection == instructions", + "group": "navigation@1" + } + ] + }, + "icons": { + "copilot-logo": { + "description": "%github.copilot.icon%", + "default": { + "fontPath": "assets/copilot.woff", + "fontCharacter": "\\0041" + } + }, + "copilot-warning": { + "description": "%github.copilot.icon%", + "default": { + "fontPath": "assets/copilot.woff", + "fontCharacter": "\\0042" + } + }, + "copilot-notconnected": { + "description": "%github.copilot.icon%", + "default": { + "fontPath": "assets/copilot.woff", + "fontCharacter": "\\0043" + } + } + }, + "iconFonts": [ + { + "id": "copilot-font", + "src": [ + { + "path": "assets/copilot.woff", + "format": "woff" + } + ] + } + ], + "terminalQuickFixes": [ + { + "id": "copilot-chat.fixWithCopilot", + "commandLineMatcher": ".+", + "commandExitResult": "error", + "outputMatcher": { + "anchor": "bottom", + "length": 1, + "lineMatcher": ".+", + "offset": 0 + }, + "kind": "explain" + }, + { + "id": "copilot-chat.generateCommitMessage", + "commandLineMatcher": "git add .+", + "commandExitResult": "success", + "kind": "explain", + "outputMatcher": { + "anchor": "bottom", + "length": 1, + "lineMatcher": ".+", + "offset": 0 + } + }, + { + "id": "copilot-chat.terminalToDebugging", + "commandLineMatcher": ".+", + "kind": "explain", + "commandExitResult": "error", + "outputMatcher": { + "anchor": "bottom", + "length": 1, + "lineMatcher": "", + "offset": 0 + } + }, + { + "id": "copilot-chat.terminalToDebuggingSuccess", + "commandLineMatcher": ".+", + "kind": "explain", + "commandExitResult": "success", + "outputMatcher": { + "anchor": "bottom", + "length": 1, + "lineMatcher": "", + "offset": 0 + } + } + ], + "languages": [ + { + "id": "ignore", + "filenamePatterns": [ + ".copilotignore" + ], + "aliases": [] + }, + { + "id": "markdown", + "extensions": [ + ".copilotmd" + ] + } + ], + "views": { + "copilot-chat": [ + { + "id": "copilot-chat", + "name": "Chat Debug", + "icon": "assets/debug-icon.svg", + "when": "github.copilot.chat.showLogView" + } + ], + "context-inspector": [ + { + "id": "context-inspector", + "name": "Language Context Inspector", + "icon": "$(inspect)", + "when": "github.copilot.chat.showContextInspectorView" + } + ] + }, + "viewsContainers": { + "activitybar": [ + { + "id": "copilot-chat", + "title": "Chat Debug", + "icon": "assets/debug-icon.svg" + }, + { + "id": "context-inspector", + "title": "Language Context Inspector", + "icon": "$(inspect)" + } + ] + }, + "configurationDefaults": { + "workbench.editorAssociations": { + "*.copilotmd": "vscode.markdown.preview.editor" + } + }, + "keybindings": [ + { + "command": "github.copilot.chat.copilotCLI.addFileReference", + "key": "ctrl+shift+.", + "mac": "cmd+shift+.", + "when": "github.copilot.chat.copilotCLI.hasSession && editorTextFocus" + }, + { + "command": "github.copilot.chat.rerunWithCopilotDebug", + "key": "ctrl+alt+.", + "mac": "cmd+alt+.", + "when": "github.copilot-chat.activated && terminalShellIntegrationEnabled && terminalFocus && !terminalAltBufferActive" + }, + { + "command": "github.copilot.nes.captureExpected.confirm", + "key": "ctrl+enter", + "mac": "cmd+enter", + "when": "copilotNesCaptureMode && editorTextFocus" + }, + { + "command": "github.copilot.nes.captureExpected.abort", + "key": "escape", + "when": "copilotNesCaptureMode && editorTextFocus" + } + ], + "walkthroughs": [ + { + "id": "copilotWelcome", + "title": "%github.copilot.walkthrough.title%", + "description": "%github.copilot.walkthrough.description%", + "when": "!isWeb", + "steps": [ + { + "id": "copilot.setup.signIn", + "title": "%github.copilot.walkthrough.setup.signIn.title%", + "description": "%github.copilot.walkthrough.setup.signIn.description%", + "when": "chatEntitlementSignedOut && !view.workbench.panel.chat.view.copilot.visible && !github.copilot-chat.activated && !github.copilot.offline && !github.copilot.interactiveSession.individual.disabled && !github.copilot.interactiveSession.individual.expired && !github.copilot.interactiveSession.enterprise.disabled && !github.copilot.interactiveSession.contactSupport && !github.copilot.interactiveSession.invalidToken && !github.copilot.interactiveSession.rateLimited && !github.copilot.interactiveSession.gitHubLoginFailed", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.panelChat.media.altText%" + } + }, + { + "id": "copilot.setup.signInNoAction", + "title": "%github.copilot.walkthrough.setup.signIn.title%", + "description": "%github.copilot.walkthrough.setup.noAction.description%", + "when": "chatEntitlementSignedOut && view.workbench.panel.chat.view.copilot.visible && !github.copilot-chat.activated && !github.copilot.offline && !github.copilot.interactiveSession.individual.disabled && !github.copilot.interactiveSession.individual.expired && !github.copilot.interactiveSession.enterprise.disabled && !github.copilot.interactiveSession.contactSupport && !github.copilot.interactiveSession.invalidToken && !github.copilot.interactiveSession.rateLimited && !github.copilot.interactiveSession.gitHubLoginFailed", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.panelChat.media.altText%" + } + }, + { + "id": "copilot.setup.signUp", + "title": "%github.copilot.walkthrough.setup.signUp.title%", + "description": "%github.copilot.walkthrough.setup.signUp.description%", + "when": "chatPlanCanSignUp && !view.workbench.panel.chat.view.copilot.visible && !github.copilot-chat.activated && !github.copilot.offline && (github.copilot.interactiveSession.individual.disabled || github.copilot.interactiveSession.individual.expired) && !github.copilot.interactiveSession.enterprise.disabled && !github.copilot.interactiveSession.contactSupport && !github.copilot.interactiveSession.invalidToken && !github.copilot.interactiveSession.rateLimited && !github.copilot.interactiveSession.gitHubLoginFailed", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.panelChat.media.altText%" + } + }, + { + "id": "copilot.setup.signUpNoAction", + "title": "%github.copilot.walkthrough.setup.signUp.title%", + "description": "%github.copilot.walkthrough.setup.noAction.description%", + "when": "chatPlanCanSignUp && view.workbench.panel.chat.view.copilot.visible && !github.copilot-chat.activated && !github.copilot.offline && (github.copilot.interactiveSession.individual.disabled || github.copilot.interactiveSession.individual.expired) && !github.copilot.interactiveSession.enterprise.disabled && !github.copilot.interactiveSession.contactSupport && !github.copilot.interactiveSession.invalidToken && !github.copilot.interactiveSession.rateLimited && !github.copilot.interactiveSession.gitHubLoginFailed", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.panelChat.media.altText%" + } + }, + { + "id": "copilot.panelChat", + "title": "%github.copilot.walkthrough.panelChat.title%", + "description": "%github.copilot.walkthrough.panelChat.description%", + "when": "!chatEntitlementSignedOut || chatIsEnabled ", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/workspace-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.panelChat.media.altText%" + } + }, + { + "id": "copilot.edits", + "title": "%github.copilot.walkthrough.edits.title%", + "description": "%github.copilot.walkthrough.edits.description%", + "when": "!chatEntitlementSignedOut || chatIsEnabled ", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/edits.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/edits-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/edits-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/edits-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.edits.media.altText%" + } + }, + { + "id": "copilot.firstSuggest", + "title": "%github.copilot.walkthrough.firstSuggest.title%", + "description": "%github.copilot.walkthrough.firstSuggest.description%", + "when": "!chatEntitlementSignedOut || chatIsEnabled ", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/ghost-text.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/ghost-text-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/ghost-text-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/ghost-text-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.firstSuggest.media.altText%" + } + }, + { + "id": "copilot.inlineChatNotMac", + "title": "%github.copilot.walkthrough.inlineChatNotMac.title%", + "description": "%github.copilot.walkthrough.inlineChatNotMac.description%", + "when": "!isMac && (!chatEntitlementSignedOut || chatIsEnabled )", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.inlineChatNotMac.media.altText%" + } + }, + { + "id": "copilot.inlineChatMac", + "title": "%github.copilot.walkthrough.inlineChatMac.title%", + "description": "%github.copilot.walkthrough.inlineChatMac.description%", + "when": "isMac && (!chatEntitlementSignedOut || chatIsEnabled )", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/inline-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.inlineChatMac.media.altText%" + } + }, + { + "id": "copilot.sparkle", + "title": "%github.copilot.walkthrough.sparkle.title%", + "description": "%github.copilot.walkthrough.sparkle.description%", + "when": "!chatEntitlementSignedOut || chatIsEnabled", + "media": { + "video": { + "dark": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/git-commit.mp4", + "light": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/git-commit-light.mp4", + "hc": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/git-commit-hc.mp4", + "hcLight": "https://vscodewalkthroughs.z1.web.core.windows.net/v0.26/git-commit-hclight.mp4" + }, + "altText": "%github.copilot.walkthrough.sparkle.media.altText%" + } + } + ] + } + ], + "jsonValidation": [ + { + "fileMatch": "settings.json", + "url": "ccsettings://root/schema.json" + } + ], + "typescriptServerPlugins": [ + { + "name": "@vscode/copilot-typescript-server-plugin", + "enableForWorkspaceTypeScriptVersions": true + } + ], + "chatSessions": [ + { + "type": "claude-code", + "name": "claude", + "displayName": "Claude", + "icon": "$(claude)", + "welcomeTitle": "Claude Agent", + "welcomeMessage": "Powered by the same agent as Claude Code", + "inputPlaceholder": "Run local tasks with Claude, type `#` for adding context", + "order": 3, + "description": "%github.copilot.session.providerDescription.claude%", + "when": "config.github.copilot.chat.claudeAgent.enabled", + "canDelegate": true, + "requiresCustomModels": true, + "capabilities": { + "supportsFileAttachments": true, + "supportsImageAttachments": true + }, + "commands": [ + { + "name": "init", + "description": "Initialize a new CLAUDE.md file with codebase documentation" + }, + { + "name": "pr-comments", + "description": "Get comments from a GitHub pull request" + }, + { + "name": "review", + "description": "Review a pull request" + }, + { + "name": "security-review", + "description": "Complete a security review of the pending changes on the current branch" + }, + { + "name": "simplify", + "description": "Review changed code for reuse, quality, and efficiency" + }, + { + "name": "claude-api", + "description": "Help building with Claude API or Anthropic SDK" + }, + { + "name": "agents", + "description": "Create and manage specialized Claude agents" + }, + { + "name": "hooks", + "description": "Configure Claude Code hooks for tool execution and events" + }, + { + "name": "memory", + "description": "Open memory files (CLAUDE.md) for editing" + }, + { + "name": "compact", + "description": "Compact the conversation history to save context tokens" + } + ] + }, + { + "type": "copilotcli", + "name": "cli", + "displayName": "Copilot CLI", + "icon": "$(copilot)", + "welcomeTitle": "Copilot CLI", + "welcomeMessage": "Run tasks in the background with the Copilot CLI", + "inputPlaceholder": "Run tasks in the background with the Copilot CLI, type `#` for adding context", + "order": 1, + "canDelegate": true, + "description": "%github.copilot.session.providerDescription.background%", + "when": "config.github.copilot.chat.backgroundAgent.enabled", + "capabilities": { + "supportsFileAttachments": true, + "supportsProblemAttachments": true, + "supportsToolAttachments": false, + "supportsImageAttachments": true, + "supportsSymbolAttachments": true, + "supportsSearchResultAttachments": true, + "supportsSourceControlAttachments": true, + "supportsPromptAttachments": true, + "supportsHandOffs": true + }, + "commands": [ + { + "name": "delegate", + "description": "Delegate chat session to cloud agent and create associated PR", + "when": "config.github.copilot.chat.cloudAgent.enabled" + }, + { + "name": "compact", + "description": "%github.copilot.command.cli.compact.description%" + }, + { + "name": "plan", + "description": "%github.copilot.command.cli.plan.description%", + "when": "config.github.copilot.chat.cli.planCommand.enabled" + }, + { + "name": "fleet", + "description": "%github.copilot.command.cli.fleet.description%", + "when": "false" + }, + { + "name": "remote", + "description": "%github.copilot.command.cli.remote.description%", + "when": "config.github.copilot.chat.cli.remote.enabled" + } + ], + "customAgentTarget": "github-copilot", + "requiresCustomModels": true, + "autoAttachReferences": true, + "useRequestToPopulateBuiltInPickers": true + }, + { + "type": "copilot-cloud-agent", + "alternativeIds": [ + "copilot-swe-agent" + ], + "name": "cloud", + "displayName": "Cloud", + "icon": "$(cloud)", + "welcomeTitle": "Cloud Agent", + "welcomeMessage": "Delegate tasks to the cloud", + "inputPlaceholder": "Delegate tasks to the cloud, type `#` for adding context", + "order": 2, + "canDelegate": true, + "description": "%github.copilot.session.providerDescription.cloud%", + "when": "config.github.copilot.chat.cloudAgent.enabled", + "capabilities": { + "supportsFileAttachments": true + }, + "autoAttachReferences": true + } + ], + "chatAgents": [], + "chatPromptFiles": [ + { + "path": "./assets/prompts/plan.prompt.md", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/chronicle-standup.prompt.md", + "when": "github.copilot.sessionSearch.enabled", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/chronicle-tips.prompt.md", + "when": "github.copilot.sessionSearch.enabled", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/chronicle-reindex.prompt.md", + "when": "github.copilot.sessionSearch.enabled", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/chronicle-search.prompt.md", + "when": "github.copilot.sessionSearch.enabled", + "sessionTypes": [ + "local" + ] + } + ], + "chatSkills": [ + { + "path": "./assets/prompts/skills/project-setup-info-local/SKILL.md", + "when": "!config.github.copilot.chat.newWorkspace.useContext7", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/project-setup-info-context7/SKILL.md", + "when": "config.github.copilot.chat.newWorkspace.useContext7", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/install-vscode-extension/SKILL.md", + "when": "config.github.copilot.chat.installExtensionSkill.enabled && config.github.copilot.chat.newWorkspaceCreation.enabled", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/get-search-view-results/SKILL.md", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/troubleshoot/SKILL.md", + "sessionTypes": [ + "local", + "copilotcli" + ] + }, + { + "path": "./assets/prompts/skills/agent-customization/SKILL.md", + "sessionTypes": [ + "local", + "copilotcli" + ] + }, + { + "path": "./assets/prompts/skills/init/SKILL.md", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/create-prompt/SKILL.md", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/create-instructions/SKILL.md", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/create-skill/SKILL.md", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/create-agent/SKILL.md", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/create-hook/SKILL.md", + "sessionTypes": [ + "local" + ] + }, + { + "path": "./assets/prompts/skills/chronicle/SKILL.md", + "when": "github.copilot.sessionSearch.enabled", + "sessionTypes": [ + "local" + ] + } + ], + "terminal": { + "profiles": [ + { + "icon": "copilot", + "id": "copilot-cli", + "title": "GitHub Copilot CLI", + "titleTemplate": "${sequence}" + } + ] + } + }, + "prettier": { + "useTabs": true, + "tabWidth": 4, + "singleQuote": true + }, + "scripts": { + "postinstall": "tsx ./script/postinstall.ts", + "build": "node .esbuild.mts --sourcemaps", + "compile": "node .esbuild.mts --dev", + "watch": "npm-run-all -lp watch:esbuild watch:typecheck", + "watch:esbuild": "node .esbuild.mts --watch --dev", + "watch:typecheck": "npx tsgo --noEmit --watch --preserveWatchOutput --project tsconfig.json", + "watch:typecheck-extension": "npx tsgo --noEmit --watch --project tsconfig.json", + "watch:typecheck-extension-web": "npx tsgo --noEmit --watch --project tsconfig.worker.json", + "watch:typecheck-simulation-workbench": "npx tsgo --noEmit --watch --project test/simulation/workbench/tsconfig.json", + "typecheck": "npx tsgo --noEmit --project tsconfig.json && npx tsgo --noEmit --project test/simulation/workbench/tsconfig.json && npx tsgo --noEmit --project tsconfig.worker.json && npx tsgo --noEmit --project src/extension/completions-core/vscode-node/extension/src/copilotPanel/webView/tsconfig.json", + "lint": "npx eslint . --max-warnings=0", + "lint-staged": "npx eslint --max-warnings=0", + "tsfmt": "npx tsfmt -r --verify", + "test": "npm-run-all test:*", + "test:extension": "vscode-test", + "test:sanity": "vscode-test --sanity", + "test:unit": "vitest --run --pool=forks", + "vitest": "vitest", + "bench": "vitest bench", + "get_env": "tsx script/setup/getEnv.mts", + "get_token": "tsx script/setup/getToken.mts", + "prettier": "prettier --list-different --write --cache .", + "simulate": "node dist/simulationMain.js", + "simulate-require-cache": "node dist/simulationMain.js --require-cache", + "simulate-ci": "node dist/simulationMain.js --ci --require-cache", + "simulate-update-baseline": "node dist/simulationMain.js --update-baseline", + "simulate-gc": "node dist/simulationMain.js --require-cache --gc", + "setup": "npm run get_env && npm run get_token", + "setup:dotnet": "run-script-os", + "setup:dotnet:darwin:linux": "curl -O https://raw.githubusercontent.com/dotnet/install-scripts/main/src/dotnet-install.sh && chmod u+x dotnet-install.sh && ./dotnet-install.sh --channel 10.0 && rm dotnet-install.sh", + "setup:dotnet:win32": "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command \"Invoke-WebRequest -Uri https://raw.githubusercontent.com/dotnet/install-scripts/main/src/dotnet-install.ps1 -OutFile dotnet-install.ps1; ./dotnet-install.ps1 -channel 10.0; Remove-Item dotnet-install.ps1\"", + "analyze-edits": "tsx script/analyzeEdits.ts", + "extract-chat-lib": "tsx script/build/extractChatLib.ts", + "create_venv": "tsx script/setup/createVenv.mts", + "package": "vsce package", + "web": "vscode-test-web --headless --extensionDevelopmentPath=. .", + "test:prompt": "mocha \"src/extension/completions-core/vscode-node/prompt/**/test/**/*.test.{ts,tsx}\"", + "test:completions-core": "tsx src/extension/completions-core/vscode-node/extension/test/runTest.ts" + }, + "devDependencies": { + "@azure/identity": "4.9.1", + "@azure/keyvault-secrets": "^4.10.0", + "@azure/msal-node": "^3.6.3", + "@c4312/scip": "^0.1.0", + "@fluentui/react-components": "^9.66.6", + "@fluentui/react-icons": "^2.0.305", + "@hediet/node-reload": "^0.8.0", + "@keyv/sqlite": "^4.0.5", + "@octokit/types": "^14.1.0", + "@stylistic/eslint-plugin": "^3.0.1", + "@types/eslint": "^9.0.0", + "@types/express": "^5.0.6", + "@types/google-protobuf": "^3.15.12", + "@types/js-yaml": "^4.0.9", + "@types/markdown-it": "^14.0.0", + "@types/minimist": "^1.2.5", + "@types/mocha": "^10.0.10", + "@types/node": "^22.16.3", + "@types/picomatch": "^4.0.0", + "@types/react": "17.0.44", + "@types/react-dom": "^18.2.17", + "@types/sinon": "^17.0.4", + "@types/source-map-support": "^0.5.10", + "@types/tar": "^6.1.13", + "@types/vinyl": "^2.0.12", + "@types/vscode-webview": "^1.57.5", + "@types/ws": "^8.5.3", + "@types/yargs": "^17.0.24", + "@typescript-eslint/eslint-plugin": "^8.35.0", + "@typescript-eslint/parser": "^8.32.0", + "@typescript-eslint/typescript-estree": "^8.26.1", + "@vitest/coverage-v8": "^3.2.4", + "@vitest/snapshot": "^1.5.0", + "@vscode/debugadapter": "^1.68.0", + "@vscode/debugprotocol": "^1.68.0", + "@vscode/dts": "^0.4.1", + "@vscode/lsif-language-service": "^0.1.0-pre.4", + "@vscode/test-cli": "^0.0.11", + "@vscode/test-electron": "^2.5.2", + "@vscode/test-web": "^0.0.80", + "@vscode/vsce": "3.6.0", + "copyfiles": "^2.4.1", + "csv-parse": "^6.0.0", + "dotenv": "^17.2.0", + "electron": "^39.8.5", + "esbuild": "0.27.2", + "fastq": "^1.19.1", + "glob": "^11.1.0", + "js-yaml": "^4.1.1", + "keyv": "^5.3.2", + "minimist": "^1.2.8", + "mobx": "^6.13.7", + "mobx-react-lite": "^4.1.0", + "mocha": "^11.7.1", + "mocha-junit-reporter": "^2.2.1", + "mocha-multi-reporters": "^1.5.1", + "monaco-editor": "0.44.0", + "npm-run-all": "^4.1.5", + "open": "^10.1.2", + "openai": "^6.7.0", + "outdent": "^0.8.0", + "picomatch": "^4.0.4", + "playwright": "^1.58.2", + "prettier": "^3.6.2", + "react": "^17.0.2", + "react-dom": "17.0.2", + "rimraf": "^6.0.1", + "run-script-os": "^1.1.6", + "shiki": "~1.15.0", + "sinon": "^21.0.0", + "source-map-support": "^0.5.21", + "tar": "^7.5.11", + "ts-dedent": "^2.2.0", + "tsx": "^4.20.3", + "typescript": "^5.8.3", + "vite-plugin-top-level-await": "^1.5.0", + "vite-plugin-wasm": "^3.5.0", + "vitest": "^3.0.5", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "yaml": "^2.8.0", + "yargs": "^17.7.2", + "zod": "3.25.76" + }, + "dependencies": { + "@anthropic-ai/claude-agent-sdk": "0.2.112", + "@anthropic-ai/sdk": "^0.82.0", + "@github/blackbird-external-ingest-utils": "^0.3.0", + "@github/copilot": "^1.0.48", + "@google/genai": "^1.22.0", + "@humanwhocodes/gitignore-to-minimatch": "1.0.2", + "@microsoft/tiktokenizer": "^1.0.10", + "@modelcontextprotocol/sdk": "^1.25.2", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.212.0", + "@opentelemetry/exporter-logs-otlp-grpc": "^0.214.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.214.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "^0.214.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.214.0", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.214.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.214.0", + "@opentelemetry/resources": "^2.5.1", + "@opentelemetry/sdk-logs": "^0.212.0", + "@opentelemetry/sdk-metrics": "^2.5.1", + "@opentelemetry/sdk-trace-node": "^2.5.1", + "@opentelemetry/semantic-conventions": "^1.39.0", + "@sinclair/typebox": "^0.34.41", + "@vscode/copilot-api": "^0.3.0", + "@vscode/extension-telemetry": "^1.5.1", + "@vscode/l10n": "^0.0.18", + "@vscode/prompt-tsx": "^0.4.0-alpha.8", + "@vscode/tree-sitter-wasm": "0.0.5-php.2", + "@vscode/webview-ui-toolkit": "^1.3.1", + "@xterm/headless": "^5.5.0", + "ajv": "^8.18.0", + "applicationinsights": "^2.9.7", + "best-effort-json-parser": "^1.2.1", + "diff": "^8.0.3", + "dompurify": "^3.4.1", + "express": "^5.2.1", + "ignore": "^7.0.5", + "isbinaryfile": "^5.0.4", + "jsonc-parser": "^3.3.1", + "lru-cache": "^11.1.0", + "markdown-it": "^14.1.1", + "minimatch": "^10.2.1", + "undici": "^7.24.1", + "vscode-tas-client": "^0.1.84", + "web-tree-sitter": "^0.23.0" + }, + "overrides": { + "@aminya/node-gyp-build": "npm:node-gyp-build@4.8.1", + "string_decoder": "npm:string_decoder@1.2.0", + "node-gyp": "npm:node-gyp@10.3.1", + "zod": "3.25.76" + }, + "vscodeCommit": "94c8e2adc50e26ef70af85a0de3a9efed757acaa", + "__metadata": { + "id": "7ec7d6e6-b89e-4cc5-a59b-d6c4d238246f", + "publisherId": { + "publisherId": "7c1c19cd-78eb-4dfb-8999-99caf7679002", + "publisherName": "github", + "displayName": "GitHub", + "flags": "verified" + }, + "publisherDisplayName": "GitHub" + } } From 4d63410ada546c83d198f0c5e07119df031e42e3 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 20 May 2026 00:45:46 -0700 Subject: [PATCH 12/17] PR feedback --- .../copilot/src/platform/endpoint/node/modelMetadataFetcher.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/copilot/src/platform/endpoint/node/modelMetadataFetcher.ts b/extensions/copilot/src/platform/endpoint/node/modelMetadataFetcher.ts index f3a06e49cd014..54616af75c57d 100644 --- a/extensions/copilot/src/platform/endpoint/node/modelMetadataFetcher.ts +++ b/extensions/copilot/src/platform/endpoint/node/modelMetadataFetcher.ts @@ -259,6 +259,7 @@ export class ModelMetadataFetcher extends Disposable implements IModelMetadataFe copilotToken = (await this._authService.getCopilotToken()).token; } catch (e) { // No Copilot auth (e.g. signed-out BYOK-only mode). + this._lastFetchTime = Date.now(); this._lastFetchError = e; return; } From e189d9cf16589a7999f9ee7133c3371f0bcf1dbd Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 20 May 2026 01:48:19 -0700 Subject: [PATCH 13/17] Bug fixes --- .../vscode-node/contextKeys.contribution.ts | 11 ++++++----- .../vscode-node/conversationFeature.ts | 10 +++++++++- .../platform/github/common/octoKitServiceImpl.ts | 16 +++++++++++++--- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts b/extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts index f5845546173d4..1e2320faf573f 100644 --- a/extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts +++ b/extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts @@ -141,11 +141,12 @@ export class ContextKeysContribution extends Disposable { const reason = e.message || e; const data = TelemetryData.createAndMarkAsIssued({ reason }); this._telemetryService.sendGHTelemetryErrorEvent('activationFailed', data.properties, data.measurements); - const message = - reason === 'GitHubLoginFailed' - ? SESSION_LOGIN_MESSAGE - : `GitHub Copilot could not connect to server. Extension activation failed: "${reason}"`; - this._logService.error(message); + if (reason === 'GitHubLoginFailed') { + // Expected in BYOK / air-gapped flows where the user is not signed in to GitHub. + this._logService.debug(SESSION_LOGIN_MESSAGE); + } else { + this._logService.error(`GitHub Copilot could not connect to server. Extension activation failed: "${reason}"`); + } } if (error instanceof NotSignedUpError) { diff --git a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts index d33d94030fe32..73e4425792450 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts @@ -129,7 +129,15 @@ export class ConversationFeature implements IExtensionContribution { void refreshHasByokModels(); this._disposables.add(vscode.lm.onDidChangeChatModels(() => void refreshHasByokModels())); - this._disposables.add(authenticationService.onDidAuthenticationChange(() => reevaluate())); + // Always unblock activation when auth settles; chat enablement is driven by `reevaluate` independently. + // Without this, BYOK-only sessions can deadlock (the BYOK query needs this extension fully activated, + // while activation waits for the BYOK query to set `hasByokModels`). + this._disposables.add(authenticationService.onDidAuthenticationChange(() => { + reevaluate(); + if (!activationBlockerDeferred.isSettled) { + activationBlockerDeferred.complete(); + } + })); reevaluate(); } diff --git a/extensions/copilot/src/platform/github/common/octoKitServiceImpl.ts b/extensions/copilot/src/platform/github/common/octoKitServiceImpl.ts index 7210d9489fd1f..b52f20f3416db 100644 --- a/extensions/copilot/src/platform/github/common/octoKitServiceImpl.ts +++ b/extensions/copilot/src/platform/github/common/octoKitServiceImpl.ts @@ -240,7 +240,9 @@ export class OctoKitService extends BaseOctoKitService implements IOctoKitServic this._logService.debug(`[getAllSessions] Got ${Array.isArray(result) ? result.length : 'non-array'} sessions for nwo=${nwo}`); return result; } catch (e) { - if (e instanceof Error) { + if (e instanceof PermissiveAuthRequiredError) { + this._logService.trace(`[getAllSessions] No permissive GitHub session (nwo=${nwo})`); + } else if (e instanceof Error) { this._logService.error(e, 'Error in getAllSessions'); this._logService.debug(`[getAllSessions] Error for nwo=${nwo}: ${e.message}`); } else { @@ -292,7 +294,11 @@ export class OctoKitService extends BaseOctoKitService implements IOctoKitServic } throw new Error('Invalid response format'); } catch (e) { - this._logService.error(e); + if (e instanceof PermissiveAuthRequiredError) { + this._logService.trace('[getCustomAgents] No permissive GitHub session'); + } else { + this._logService.error(e); + } return []; } } @@ -463,7 +469,11 @@ export class OctoKitService extends BaseOctoKitService implements IOctoKitServic } return []; } catch (e) { - this._logService.error(e); + if (e instanceof PermissiveAuthRequiredError) { + this._logService.trace('[getCopilotAgentModels] No permissive GitHub session'); + } else { + this._logService.error(e); + } return []; } } From de7962ebeb8fbb52c794886d737da59a2f2d2370 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 20 May 2026 01:50:47 -0700 Subject: [PATCH 14/17] Added test --- .../test/conversationFeature.test.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts b/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts index 19b169ff98e5b..4b7ba413009bb 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/test/conversationFeature.test.ts @@ -152,4 +152,26 @@ suite('Conversation feature test suite', function () { conversationFeature.dispose(); } }); + + test('activationBlocker resolves on an auth change even when the BYOK query never settles', async function () { + // Reproduces the air-gapped startup deadlock: the BYOK detection query (which itself + // activates this extension's language-model providers) can hang until extension + // activation completes, while extension activation is waiting for `activationBlocker`. + // The auth-change event must unconditionally unblock activation regardless of token + // or BYOK availability. + sandbox.stub(vscode.lm, 'selectChatModels').returns(new Promise(() => { /* never resolves */ })); + sandbox.stub(vscode.lm, 'onDidChangeChatModels').returns({ dispose: () => { } }); + + const conversationFeature = instaService.createInstance(ConversationFeature); + try { + const authService = accessor.get(IAuthenticationService) as unknown as { fireAuthenticationChange(source: string): void }; + authService.fireAuthenticationChange('test'); + + await conversationFeature.activationBlocker; + assert.deepStrictEqual(conversationFeature.activated, false); + assert.deepStrictEqual(conversationFeature.enabled, false); + } finally { + conversationFeature.dispose(); + } + }); }); From 978ccca9694f1eb720fb4b0290c5585d1ae84fc1 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 20 May 2026 16:27:25 -0700 Subject: [PATCH 15/17] PR feedback Co-authored-by: Copilot --- .../byokUtilityModel.contribution.ts | 125 +++++++++++ .../byokUtilityModel.contribution.spec.ts | 199 ++++++++++++++++++ .../completionsCoreContribution.ts | 7 +- .../vscode-node/contextKeys.contribution.ts | 3 +- .../vscode-node/conversationFeature.ts | 5 + .../extension/vscode-node/contributions.ts | 2 + .../browser/chatStatus/chatStatusDashboard.ts | 8 +- .../browser/chatStatus/chatStatusEntry.ts | 5 +- 8 files changed, 347 insertions(+), 7 deletions(-) create mode 100644 extensions/copilot/src/extension/chatInputNotification/vscode-node/byokUtilityModel.contribution.ts create mode 100644 extensions/copilot/src/extension/chatInputNotification/vscode-node/test/byokUtilityModel.contribution.spec.ts diff --git a/extensions/copilot/src/extension/chatInputNotification/vscode-node/byokUtilityModel.contribution.ts b/extensions/copilot/src/extension/chatInputNotification/vscode-node/byokUtilityModel.contribution.ts new file mode 100644 index 0000000000000..8b282e80b4ee7 --- /dev/null +++ b/extensions/copilot/src/extension/chatInputNotification/vscode-node/byokUtilityModel.contribution.ts @@ -0,0 +1,125 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { IAuthenticationService } from '../../../platform/authentication/common/authentication'; +import { IConfigurationService } from '../../../platform/configuration/common/configurationService'; +import { ILogService } from '../../../platform/log/common/logService'; +import { Disposable } from '../../../util/vs/base/common/lifecycle'; + +const NOTIFICATION_ID = 'copilot.byokUtilityModelHint'; +const UTILITY_MODEL_SETTING = 'chat.utilityModel'; +const UTILITY_SMALL_MODEL_SETTING = 'chat.utilitySmallModel'; + +/** + * Shows a chat input notification in air-gapped BYOK scenarios (no GitHub + * session) when at least one BYOK model is available but the utility model + * settings are still defaults. The default utility models require GitHub + * Copilot access, so without it the utility slots silently fall back and + * degrade the experience until the user points them at a BYOK model. + * + * The notification hides automatically once the user signs in, BYOK models + * disappear, or both utility settings are configured. + */ +export class ByokUtilityModelNotificationContribution extends Disposable { + + private _notification: vscode.ChatInputNotification | undefined; + private _hasByokModels = false; + private _refreshing = false; + + constructor( + @IAuthenticationService private readonly _authService: IAuthenticationService, + @IConfigurationService private readonly _configService: IConfigurationService, + @ILogService private readonly _logService: ILogService, + ) { + super(); + + this._register(this._authService.onDidAuthenticationChange(() => this._update())); + this._register(vscode.lm.onDidChangeChatModels(() => this._update())); + this._register(this._configService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(UTILITY_MODEL_SETTING) || e.affectsConfiguration(UTILITY_SMALL_MODEL_SETTING)) { + this._update(); + } + })); + + this._update(); + } + + private async _refreshHasByokModels(): Promise { + if (this._refreshing) { + return; + } + this._refreshing = true; + try { + const models = await vscode.lm.selectChatModels({}); + this._hasByokModels = models.some(m => m.vendor !== 'copilot'); + } catch (err) { + this._logService.warn(`[ByokUtilityModelNotification] Failed to query language models: ${err}`); + } finally { + this._refreshing = false; + } + } + + private async _update(): Promise { + await this._refreshHasByokModels(); + + const signedOut = !this._authService.anyGitHubSession; + const utilityUnset = !this._isUtilityOverrideSet(UTILITY_MODEL_SETTING); + const utilitySmallUnset = !this._isUtilityOverrideSet(UTILITY_SMALL_MODEL_SETTING); + + if (!signedOut || !this._hasByokModels || (!utilityUnset && !utilitySmallUnset)) { + this._hideNotification(); + return; + } + + this._showNotification(utilityUnset, utilitySmallUnset); + } + + private _isUtilityOverrideSet(configKey: string): boolean { + const raw = this._configService.getNonExtensionConfig(configKey); + return typeof raw === 'string' && raw.length > 0; + } + + private _showNotification(utilityUnset: boolean, utilitySmallUnset: boolean): void { + const notification = this._ensureNotification(); + notification.severity = vscode.ChatInputNotificationSeverity.Info; + notification.dismissible = true; + notification.autoDismissOnMessage = false; + + if (utilityUnset && utilitySmallUnset) { + notification.message = vscode.l10n.t('Set BYOK utility models'); + notification.description = vscode.l10n.t('Unlocks full AI features.'); + notification.actions = [ + { label: vscode.l10n.t('Configure'), commandId: 'workbench.action.openSettings', commandArgs: ['chat.utility'] }, + ]; + } else if (utilityUnset) { + notification.message = vscode.l10n.t('Set BYOK utility model'); + notification.description = vscode.l10n.t('Unlocks full AI features.'); + notification.actions = [ + { label: vscode.l10n.t('Configure'), commandId: 'workbench.action.openSettings', commandArgs: [UTILITY_MODEL_SETTING] }, + ]; + } else { + notification.message = vscode.l10n.t('Set BYOK small utility model'); + notification.description = vscode.l10n.t('Unlocks full AI features.'); + notification.actions = [ + { label: vscode.l10n.t('Configure'), commandId: 'workbench.action.openSettings', commandArgs: [UTILITY_SMALL_MODEL_SETTING] }, + ]; + } + + notification.show(); + } + + private _ensureNotification(): vscode.ChatInputNotification { + if (!this._notification) { + this._notification = vscode.chat.createInputNotification(NOTIFICATION_ID); + this._register({ dispose: () => this._notification?.dispose() }); + } + return this._notification; + } + + private _hideNotification(): void { + this._notification?.hide(); + } +} diff --git a/extensions/copilot/src/extension/chatInputNotification/vscode-node/test/byokUtilityModel.contribution.spec.ts b/extensions/copilot/src/extension/chatInputNotification/vscode-node/test/byokUtilityModel.contribution.spec.ts new file mode 100644 index 0000000000000..eecc446340038 --- /dev/null +++ b/extensions/copilot/src/extension/chatInputNotification/vscode-node/test/byokUtilityModel.contribution.spec.ts @@ -0,0 +1,199 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; +import { IAuthenticationService } from '../../../../platform/authentication/common/authentication'; +import { IConfigurationService } from '../../../../platform/configuration/common/configurationService'; +import { ILogService } from '../../../../platform/log/common/logService'; +import { Emitter } from '../../../../util/vs/base/common/event'; + +// ---- vscode mock ----------------------------------------------------------- + +const mockNotification = { + severity: 0, + dismissible: false, + autoDismissOnMessage: false, + message: '', + description: '', + actions: [] as { label: string; commandId: string; commandArgs?: unknown[] }[], + show: vi.fn(), + hide: vi.fn(), + dispose: vi.fn(), +}; + +const onDidChangeChatModelsEmitter = new Emitter(); +const selectChatModelsMock = vi.fn(); + +vi.mock('vscode', () => ({ + ChatInputNotificationSeverity: { Info: 1 }, + chat: { + createInputNotification: vi.fn(() => mockNotification), + }, + lm: { + get onDidChangeChatModels() { return onDidChangeChatModelsEmitter.event; }, + selectChatModels: (...args: unknown[]) => selectChatModelsMock(...args), + }, + l10n: { t: (str: string, ...args: unknown[]) => str.replace(/\{(\d+)\}/g, (_, i) => String(args[Number(i)])) }, +})); + +import { ByokUtilityModelNotificationContribution } from '../byokUtilityModel.contribution'; + +// ---- helpers --------------------------------------------------------------- + +function createAuthService(opts?: { anyGitHubSession?: unknown }) { + const emitter = new Emitter(); + const hasSession = opts && 'anyGitHubSession' in opts; + const authService = { + _serviceBrand: undefined, + anyGitHubSession: hasSession ? opts!.anyGitHubSession : undefined, + onDidAuthenticationChange: emitter.event, + } as unknown as IAuthenticationService; + return { authService, emitter }; +} + +function createConfigService(values: Record = {}) { + const emitter = new Emitter<{ affectsConfiguration: (key: string) => boolean }>(); + const store = new Map(Object.entries(values)); + const configService = { + _serviceBrand: undefined, + getNonExtensionConfig: (key: string) => store.get(key) as T | undefined, + onDidChangeConfiguration: emitter.event, + } as unknown as IConfigurationService; + const set = (key: string, value: unknown) => { + if (value === undefined) { + store.delete(key); + } else { + store.set(key, value); + } + emitter.fire({ affectsConfiguration: (k: string) => k === key }); + }; + return { configService, set }; +} + +const noopLog = { + _serviceBrand: undefined, + trace: vi.fn(), debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), show: vi.fn(), +} as unknown as ILogService; + +async function flushAsync() { + // Drain microtasks so async _update() observers complete. + await Promise.resolve(); + await Promise.resolve(); + await Promise.resolve(); +} + +// ---- tests ----------------------------------------------------------------- + +describe('ByokUtilityModelNotificationContribution', () => { + let contribution: ByokUtilityModelNotificationContribution | undefined; + + beforeEach(() => { + vi.clearAllMocks(); + mockNotification.show.mockClear(); + mockNotification.hide.mockClear(); + mockNotification.message = ''; + mockNotification.description = ''; + mockNotification.actions = []; + selectChatModelsMock.mockResolvedValue([{ vendor: 'ollama', id: 'llama3' }]); + }); + + afterEach(() => { + contribution?.dispose(); + contribution = undefined; + }); + + test('shows notification when signed out + BYOK + both utility settings unset', async () => { + const { authService } = createAuthService({ anyGitHubSession: undefined }); + const { configService } = createConfigService(); + contribution = new ByokUtilityModelNotificationContribution(authService, configService, noopLog); + + await flushAsync(); + + expect(mockNotification.show).toHaveBeenCalled(); + expect(mockNotification.message).toBe('Set BYOK utility models'); + expect(mockNotification.actions).toHaveLength(1); + expect(mockNotification.actions[0].commandId).toBe('workbench.action.openSettings'); + expect(mockNotification.actions[0].commandArgs).toEqual(['chat.utility']); + }); + + test('shows notification with single action when only chat.utilityModel is unset', async () => { + const { authService } = createAuthService({ anyGitHubSession: undefined }); + const { configService } = createConfigService({ 'chat.utilitySmallModel': 'ollama/llama3' }); + contribution = new ByokUtilityModelNotificationContribution(authService, configService, noopLog); + + await flushAsync(); + + expect(mockNotification.show).toHaveBeenCalled(); + expect(mockNotification.message).toBe('Set BYOK utility model'); + expect(mockNotification.actions).toHaveLength(1); + expect(mockNotification.actions[0].commandArgs).toEqual(['chat.utilityModel']); + }); + + test('does not show notification when signed in', async () => { + const { authService } = createAuthService({ anyGitHubSession: { accessToken: 'tok' } }); + const { configService } = createConfigService(); + contribution = new ByokUtilityModelNotificationContribution(authService, configService, noopLog); + + await flushAsync(); + + expect(mockNotification.show).not.toHaveBeenCalled(); + }); + + test('does not show notification when no BYOK models are registered', async () => { + selectChatModelsMock.mockResolvedValue([{ vendor: 'copilot', id: 'gpt-4' }]); + const { authService } = createAuthService({ anyGitHubSession: undefined }); + const { configService } = createConfigService(); + contribution = new ByokUtilityModelNotificationContribution(authService, configService, noopLog); + + await flushAsync(); + + expect(mockNotification.show).not.toHaveBeenCalled(); + }); + + test('does not show notification when both utility settings are configured', async () => { + const { authService } = createAuthService({ anyGitHubSession: undefined }); + const { configService } = createConfigService({ + 'chat.utilityModel': 'ollama/llama3', + 'chat.utilitySmallModel': 'ollama/llama3', + }); + contribution = new ByokUtilityModelNotificationContribution(authService, configService, noopLog); + + await flushAsync(); + + expect(mockNotification.show).not.toHaveBeenCalled(); + }); + + test('hides notification once both utility settings are configured', async () => { + const { authService } = createAuthService({ anyGitHubSession: undefined }); + const { configService, set } = createConfigService(); + contribution = new ByokUtilityModelNotificationContribution(authService, configService, noopLog); + + await flushAsync(); + expect(mockNotification.show).toHaveBeenCalled(); + + set('chat.utilityModel', 'ollama/llama3'); + await flushAsync(); + expect(mockNotification.hide).not.toHaveBeenCalled(); // small model still unset → still showing + + set('chat.utilitySmallModel', 'ollama/llama3'); + await flushAsync(); + expect(mockNotification.hide).toHaveBeenCalled(); + }); + + test('hides notification when user signs in', async () => { + const { authService, emitter } = createAuthService({ anyGitHubSession: undefined }); + const { configService } = createConfigService(); + contribution = new ByokUtilityModelNotificationContribution(authService, configService, noopLog); + + await flushAsync(); + expect(mockNotification.show).toHaveBeenCalled(); + + (authService as unknown as { anyGitHubSession: unknown }).anyGitHubSession = { accessToken: 'tok' }; + emitter.fire(); + await flushAsync(); + + expect(mockNotification.hide).toHaveBeenCalled(); + }); +}); diff --git a/extensions/copilot/src/extension/completions/vscode-node/completionsCoreContribution.ts b/extensions/copilot/src/extension/completions/vscode-node/completionsCoreContribution.ts index a082e4902451c..e43c6ad91dccf 100644 --- a/extensions/copilot/src/extension/completions/vscode-node/completionsCoreContribution.ts +++ b/extensions/copilot/src/extension/completions/vscode-node/completionsCoreContribution.ts @@ -31,9 +31,14 @@ export class CompletionsCoreContribution extends Disposable { const unificationStateValue = unificationState.read(reader); const configEnabled = configurationService.getExperimentBasedConfigObservable(ConfigKey.TeamInternal.InlineEditsEnableGhCompletionsProvider, experimentationService).read(reader); const extensionUnification = unificationStateValue?.extensionUnification ?? false; + const copilotToken = this._copilotToken.read(reader); let hasInstantiatedProvider = false; - if (unificationStateValue?.codeUnification || extensionUnification || configEnabled || this._copilotToken.read(reader)?.isNoAuthUser) { + // Completions require a Copilot token to call the completions endpoint, so don't + // register the provider in air-gapped / signed-out scenarios — it would just fail + // with GitHubLoginFailedError on every keystroke. + const wantsProvider = unificationStateValue?.codeUnification || extensionUnification || configEnabled || copilotToken?.isNoAuthUser; + if (wantsProvider && copilotToken) { const provider = _copilotInlineCompletionItemProviderService.getOrCreateProvider(); reader.store.add( languages.registerInlineCompletionItemProvider( diff --git a/extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts b/extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts index 1e2320faf573f..3ef512cb0ad27 100644 --- a/extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts +++ b/extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { commands, extensions, window } from 'vscode'; import { IAuthenticationService, MinimalModeError } from '../../../platform/authentication/common/authentication'; +import { TokenErrorReason } from '../../../platform/authentication/common/copilotToken'; import { ContactSupportError, EnterpriseManagedError, GitHubLoginFailedError, InvalidTokenError, NotSignedUpError, RateLimitedError, SubscriptionExpiredError } from '../../../platform/authentication/vscode-node/copilotTokenManager'; import { SESSION_LOGIN_MESSAGE } from '../../../platform/authentication/vscode-node/session'; import { ConfigKey, IConfigurationService } from '../../../platform/configuration/common/configurationService'; @@ -141,7 +142,7 @@ export class ContextKeysContribution extends Disposable { const reason = e.message || e; const data = TelemetryData.createAndMarkAsIssued({ reason }); this._telemetryService.sendGHTelemetryErrorEvent('activationFailed', data.properties, data.measurements); - if (reason === 'GitHubLoginFailed') { + if (reason === ('GitHubLoginFailed' satisfies TokenErrorReason)) { // Expected in BYOK / air-gapped flows where the user is not signed in to GitHub. this._logService.debug(SESSION_LOGIN_MESSAGE); } else { diff --git a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts index 73e4425792450..cf6d03c886e98 100644 --- a/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts +++ b/extensions/copilot/src/extension/conversation/vscode-node/conversationFeature.ts @@ -253,6 +253,11 @@ export class ConversationFeature implements IExtensionContribution { } private registerParticipantDetectionProvider() { + // Many BYOK models are slow and we don't want to risk invalid detection with those, at least for now. + if (!this.authenticationService.anyGitHubSession) { + return; + } + if ('registerChatParticipantDetectionProvider' in vscode.chat) { const provider = this.instantiationService.createInstance(IntentDetector); return vscode.chat.registerChatParticipantDetectionProvider(provider); diff --git a/extensions/copilot/src/extension/extension/vscode-node/contributions.ts b/extensions/copilot/src/extension/extension/vscode-node/contributions.ts index 778eab94c7d55..0c4579083e3c2 100644 --- a/extensions/copilot/src/extension/extension/vscode-node/contributions.ts +++ b/extensions/copilot/src/extension/extension/vscode-node/contributions.ts @@ -17,6 +17,7 @@ import { IExtensionContributionFactory, asContributionFactory } from '../../comm import { CompletionsUnificationContribution } from '../../completions/vscode-node/completionsUnificationContribution'; import { ConfigurationMigrationContribution } from '../../configuration/vscode-node/configurationMigration'; import { ContextKeysContribution } from '../../contextKeys/vscode-node/contextKeys.contribution'; +import { ByokUtilityModelNotificationContribution } from '../../chatInputNotification/vscode-node/byokUtilityModel.contribution'; import { ChatInputNotificationContribution } from '../../chatInputNotification/vscode-node/chatInputNotification.contribution'; import { AiMappedEditsContrib } from '../../conversation/vscode-node/aiMappedEditsContrib'; import { ConversationFeature } from '../../conversation/vscode-node/conversationFeature'; @@ -76,6 +77,7 @@ export const vscodeNodeContributions: IExtensionContributionFactory[] = [ asContributionFactory(PowerStateLogger), asContributionFactory(ContextKeysContribution), asContributionFactory(ChatInputNotificationContribution), + asContributionFactory(ByokUtilityModelNotificationContribution), asContributionFactory(CopilotDebugCommandContribution), asContributionFactory(DebugCommandsContribution), asContributionFactory(LanguageModelAccess), diff --git a/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.ts b/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.ts index 1493a525227bb..55f6f89c49b8b 100644 --- a/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.ts +++ b/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.ts @@ -518,7 +518,9 @@ export class ChatStatusDashboard extends DomWidget { const newUser = isNewUser(this.chatEntitlementService) && !hasByokModels; const anonymousUser = this.chatEntitlementService.anonymous; const disabled = this.chatEntitlementService.sentiment.disabled || this.chatEntitlementService.sentiment.untrusted; - const signedOut = this.chatEntitlementService.entitlement === ChatEntitlement.Unknown && !hasByokModels; + // Keep the Sign-in entry visible even when BYOK models are present so air-gapped + // users can still authenticate to unlock the full Copilot experience. + const signedOut = this.chatEntitlementService.entitlement === ChatEntitlement.Unknown; if (!(newUser || signedOut || disabled)) { return; } @@ -537,7 +539,7 @@ export class ChatStatusDashboard extends DomWidget { } else if (disabled) { descriptionText = localize('enableDescription', "Enable Copilot to use AI features."); } else { - descriptionText = localize('signInDescription', "Sign in to use Copilot AI features."); + descriptionText = localize('signInDescription', "Sign in to use GitHub Copilot AI features."); } let buttonLabel: string; @@ -548,7 +550,7 @@ export class ChatStatusDashboard extends DomWidget { } else if (disabled) { buttonLabel = localize('enableCopilotButton', "Enable AI Features"); } else { - buttonLabel = localize('signInToUseAIFeatures', "Sign in to use AI Features"); + buttonLabel = localize('signInToUseAIFeatures', "Sign in to use GitHub Copilot"); } let commandId: string; diff --git a/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.ts b/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.ts index e7239ff59de9c..1a21aec2e9a80 100644 --- a/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.ts +++ b/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.ts @@ -177,8 +177,9 @@ export class ChatStatusBarEntry extends Disposable implements IWorkbenchContribu } } - // Signed out - else if (this.chatEntitlementService.entitlement === ChatEntitlement.Unknown && !this.chatEntitlementService.hasByokModels) { + // Signed out — keep showing Sign-in affordance even when BYOK models are present + // so air-gapped users can still authenticate to unlock the full Copilot experience. + else if (this.chatEntitlementService.entitlement === ChatEntitlement.Unknown) { return this.getSetupEntryProps(); } From 08c6856dad8c8ef47d09e1112c7b5368531afefb Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 20 May 2026 16:37:26 -0700 Subject: [PATCH 16/17] Change default for chat.offlineByok to true, allowing BYOK features without GitHub sign-in. --- .../workbench/contrib/chat/browser/chat.shared.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts index 10debd9df0cb6..0f98e2de6f395 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts @@ -1621,7 +1621,7 @@ configurationRegistry.registerConfiguration({ [ChatConfiguration.OfflineByok]: { type: 'boolean', description: nls.localize('chat.offlineByok', "Experimental: enable BYOK chat features without GitHub sign-in."), - default: false, + default: true, scope: ConfigurationScope.WINDOW, included: false, }, From 972c7a9eb8732e3d54038dc2796e1390e4eb73b0 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 20 May 2026 16:38:34 -0700 Subject: [PATCH 17/17] Update default for chat.offlineByok to depend on product quality Co-authored-by: Copilot --- .../workbench/contrib/chat/browser/chat.shared.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts index 0f98e2de6f395..39fb781ce40cd 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts @@ -1621,7 +1621,7 @@ configurationRegistry.registerConfiguration({ [ChatConfiguration.OfflineByok]: { type: 'boolean', description: nls.localize('chat.offlineByok', "Experimental: enable BYOK chat features without GitHub sign-in."), - default: true, + default: product.quality !== 'stable', scope: ConfigurationScope.WINDOW, included: false, },