Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/configuration/common/configurationService.ts
13401 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import type { ConfigurationChangeEvent, ConfigurationScope } from 'vscode';
7
import { createServiceIdentifier } from '../../../util/common/services';
8
import { BugIndicatingError } from '../../../util/vs/base/common/errors';
9
import { Emitter, Event } from '../../../util/vs/base/common/event';
10
import { Disposable } from '../../../util/vs/base/common/lifecycle';
11
import * as objects from '../../../util/vs/base/common/objects';
12
import { IObservable, observableFromEventOpts } from '../../../util/vs/base/common/observable';
13
import * as types from '../../../util/vs/base/common/types';
14
import { ICopilotTokenStore } from '../../authentication/common/copilotTokenStore';
15
import { packageJson } from '../../env/common/packagejson';
16
import { ImportChanges } from '../../inlineEdits/common/dataTypes/importFilteringOptions';
17
import { JointCompletionsProviderStrategy, JointCompletionsProviderTriggerChangeStrategy } from '../../inlineEdits/common/dataTypes/jointCompletionsProviderOptions';
18
import { NextCursorLinePredictionCursorPlacement } from '../../inlineEdits/common/dataTypes/nextCursorLinePrediction';
19
import * as triggerOptions from '../../inlineEdits/common/dataTypes/triggerOptions';
20
import * as xtabHistoryOptions from '../../inlineEdits/common/dataTypes/xtabHistoryOptions';
21
import * as xtabPromptOptions from '../../inlineEdits/common/dataTypes/xtabPromptOptions';
22
import { EarlyDivergenceCancellationMode, LANGUAGE_CONTEXT_ENABLED_LANGUAGES, LanguageContextLanguages, SpeculativeRequestsAutoExpandEditWindowLines, SpeculativeRequestsCursorPlacement, SpeculativeRequestsEnablement } from '../../inlineEdits/common/dataTypes/xtabPromptOptions';
23
import { ResponseProcessor } from '../../inlineEdits/common/responseProcessor';
24
import { FetcherId } from '../../networking/common/fetcherService';
25
import { AlternativeNotebookFormat } from '../../notebook/common/alternativeContentFormat';
26
import { IExperimentationService } from '../../telemetry/common/nullExperimentationService';
27
import { IValidator, vBoolean, vNumber, vString } from './validator';
28
29
export const CopilotConfigPrefix = 'github.copilot';
30
31
export const IConfigurationService = createServiceIdentifier<IConfigurationService>('IConfigurationService');
32
33
export type ExperimentBasedConfigType = boolean | number | (string | undefined);
34
35
export interface InspectConfigResult<T> {
36
37
/**
38
* The default value which is used when no other value is defined
39
*/
40
defaultValue?: T;
41
42
/**
43
* The global or installation-wide value.
44
*/
45
globalValue?: T;
46
47
/**
48
* The workspace-specific value.
49
*/
50
workspaceValue?: T;
51
52
/**
53
* The workspace-folder-specific value.
54
*/
55
workspaceFolderValue?: T;
56
57
/**
58
* Language specific default value when this configuration value is created for a {@link ConfigurationScope language scope}.
59
*/
60
defaultLanguageValue?: T;
61
62
/**
63
* Language specific global value when this configuration value is created for a {@link ConfigurationScope language scope}.
64
*/
65
globalLanguageValue?: T;
66
67
/**
68
* Language specific workspace value when this configuration value is created for a {@link ConfigurationScope language scope}.
69
*/
70
workspaceLanguageValue?: T;
71
72
/**
73
* Language specific workspace-folder value when this configuration value is created for a {@link ConfigurationScope language scope}.
74
*/
75
workspaceFolderLanguageValue?: T;
76
77
/**
78
* All language identifiers for which this configuration is defined.
79
*/
80
languageIds?: string[];
81
}
82
83
export interface IConfigurationService {
84
85
readonly _serviceBrand: undefined;
86
87
/**
88
* Gets user configuration for a key from vscode (which if not defined, pulls default value from package.json).
89
* If not defined, returns the default value.
90
*
91
* @remark For object values, the user config will replace the default config.
92
*/
93
getConfig<T>(key: Config<T>, scope?: ConfigurationScope): T;
94
95
/**
96
* Gets an observable for the configuration of a key from vscode (which if not defined, pulls default value from package.json).
97
* If not defined, returns the default value.
98
*
99
* @remark For object values, the user config will replace the default config.
100
*/
101
getConfigObservable<T>(key: Config<T>): IObservable<T>;
102
103
/**
104
* Retrieve all information about a configuration setting. A configuration value
105
* often consists of a *default* value, a global or installation-wide value,
106
* a workspace-specific value and folder-specific value
107
* @param configKey The config key to look up
108
* @returns Information about a configuration setting or `undefined`.
109
*/
110
inspectConfig<T>(key: BaseConfig<T>, scope?: ConfigurationScope): InspectConfigResult<T> | undefined;
111
112
/**
113
* Checks if the key is configured by the user in any of the configuration scopes.
114
*/
115
isConfigured<T>(key: BaseConfig<T>, scope?: ConfigurationScope): boolean;
116
117
/**
118
* Proxies vscode.workspace.getConfiguration to allow getting a configuration value that is not in the Copilot namespace.
119
* @param configKey The config key to look up
120
*/
121
getNonExtensionConfig<T>(configKey: string): T | undefined;
122
123
/**
124
* Sets user configuration for a key in vscode.
125
*/
126
setConfig<T>(key: BaseConfig<T>, value: T): Thenable<void>;
127
128
/**
129
* Gets user configuration for a key from vscode (which if not defined, pulls default value from package.json).
130
* If not defined, returns the experimentation based value or falls back to the default value.
131
*
132
* @remark For object values, the user config will replace the default config.
133
*/
134
getExperimentBasedConfig<T extends ExperimentBasedConfigType>(key: ExperimentBasedConfig<T>, experimentationService: IExperimentationService, scope?: ConfigurationScope): T;
135
136
/**
137
* Gets the observable of a user configuration for a key from vscode (which if not defined, pulls default value from package.json).
138
* If not defined, returns the experimentation based value or falls back to the default value.
139
*
140
* @remark For object values, the user config will replace the default config.
141
*/
142
getExperimentBasedConfigObservable<T extends ExperimentBasedConfigType>(key: ExperimentBasedConfig<T>, experimentationService: IExperimentationService): IObservable<T>;
143
144
/**
145
* For object values, the user config will be mixed in with the default config.
146
*/
147
getConfigMixedWithDefaults<T>(key: Config<T>): T;
148
149
getDefaultValue<T>(key: Config<T>): T;
150
getDefaultValue<T extends ExperimentBasedConfigType>(key: ExperimentBasedConfig<T>): T;
151
152
/**
153
* Emitted whenever a configuration value changes.
154
* This emits for all changes, not just changes to the Copilot settings.
155
*/
156
onDidChangeConfiguration: Event<ConfigurationChangeEvent>;
157
158
159
/**
160
* Called by experimentation service to trigger updates to ExP based configurations
161
*
162
* @param treatments List of treatments that have been changed
163
*/
164
updateExperimentBasedConfiguration(treatments: string[]): void;
165
166
dumpConfig(): { [key: string]: string };
167
}
168
169
170
171
export abstract class AbstractConfigurationService extends Disposable implements IConfigurationService {
172
declare readonly _serviceBrand: undefined;
173
174
protected _onDidChangeConfiguration = this._register(new Emitter<ConfigurationChangeEvent>());
175
readonly onDidChangeConfiguration = this._onDidChangeConfiguration.event;
176
177
protected _isInternal: boolean = false;
178
179
constructor(copilotTokenStore?: ICopilotTokenStore) {
180
super();
181
if (copilotTokenStore) {
182
this._register(copilotTokenStore.onDidStoreUpdate(() => {
183
this._setUserInfo({
184
isInternal: !!copilotTokenStore.copilotToken?.isInternal
185
});
186
}));
187
}
188
}
189
190
getConfigMixedWithDefaults<T>(key: Config<T>): T {
191
if (key.options?.valueIgnoredForExternals && !this._isInternal) {
192
return this.getDefaultValue(key);
193
}
194
195
const userValue = this.getConfig(key);
196
197
// if user doesn't override the setting, return the default
198
if (userValue === undefined) {
199
return this.getDefaultValue(key);
200
}
201
202
// if user overrides the setting and the setting is an object, combine default with user value, with the preference to user settings
203
if (types.isObject(userValue) && types.isObject(key.defaultValue)) {
204
// If default is an object apply the default and then apply the setting
205
return { ...key.defaultValue, ...userValue };
206
}
207
208
return userValue;
209
}
210
211
public getDefaultValue<T>(key: BaseConfig<T>): T {
212
const defaultValueFromConfig = this.getDefaultValueForConfig(key);
213
214
// Preserve legacy behavior for settings whose code default is undefined.
215
// VS Code may return type-default sentinels (false/0/''/null/undefined) from inspect().defaultValue,
216
// which should not override an intentional undefined default in code.
217
const isTypeDefaultSentinel = defaultValueFromConfig === undefined || defaultValueFromConfig === null || defaultValueFromConfig === false || defaultValueFromConfig === 0 || defaultValueFromConfig === '';
218
if (key.defaultValue === undefined && isTypeDefaultSentinel) {
219
return key.defaultValue;
220
}
221
222
if (defaultValueFromConfig !== undefined) {
223
return defaultValueFromConfig;
224
}
225
226
return key.defaultValue;
227
}
228
229
protected _setUserInfo(userInfo: { isInternal: boolean }): void {
230
if (this._isInternal === userInfo.isInternal) {
231
// no change
232
return;
233
}
234
235
const internalChanged = this._isInternal !== userInfo.isInternal;
236
237
this._isInternal = userInfo.isInternal;
238
239
// collect potential affected settings
240
const potentialAffectedKeys = new Set<string>();
241
for (const config of globalConfigRegistry.configs.values()) {
242
if (internalChanged && config.options?.valueIgnoredForExternals) {
243
potentialAffectedKeys.add(config.fullyQualifiedId);
244
}
245
}
246
247
if (potentialAffectedKeys.size > 0) {
248
// fire a fake change event to refresh potential affected settings
249
this._onDidChangeConfiguration.fire({
250
affectsConfiguration: (section) => {
251
// Check for exact match or prefix match with dot separator
252
for (const key of potentialAffectedKeys) {
253
if (key === section || key.startsWith(section + '.') || section.startsWith(key + '.')) {
254
return true;
255
}
256
}
257
return false;
258
}
259
});
260
}
261
}
262
263
abstract getConfig<T>(key: Config<T>, scope?: ConfigurationScope): T;
264
abstract inspectConfig<T>(key: BaseConfig<T>, scope?: ConfigurationScope): InspectConfigResult<T> | undefined;
265
abstract getNonExtensionConfig<T>(configKey: string): T | undefined;
266
abstract setConfig<T>(key: BaseConfig<T>, value: T): Thenable<void>;
267
abstract getExperimentBasedConfig<T extends ExperimentBasedConfigType>(key: ExperimentBasedConfig<T>, experimentationService: IExperimentationService): T;
268
abstract dumpConfig(): { [key: string]: string };
269
public updateExperimentBasedConfiguration(treatments: string[]): void {
270
if (treatments.length === 0) {
271
return;
272
}
273
this._onDidChangeConfiguration.fire({ affectsConfiguration: () => true });
274
}
275
276
public getConfigObservable<T>(key: Config<T>): IObservable<T> {
277
return this._getObservable_$show2FramesUp(key, () => this.getConfig(key));
278
}
279
280
public getExperimentBasedConfigObservable<T extends ExperimentBasedConfigType>(key: ExperimentBasedConfig<T>, experimentationService: IExperimentationService): IObservable<T> {
281
return this._getObservable_$show2FramesUp(key, () => this.getExperimentBasedConfig(key, experimentationService));
282
}
283
284
private observables = new Map<string, IObservable<any>>();
285
286
private _getObservable_$show2FramesUp<T>(key: BaseConfig<T>, getValue: () => T): IObservable<T> {
287
let observable = this.observables.get(key.id);
288
if (!observable) {
289
observable = observableFromEventOpts(
290
{ debugName: () => `Configuration Key "${key.id}"` },
291
(handleChange) => this._register(this.onDidChangeConfiguration(e => {
292
if (e.affectsConfiguration(key.fullyQualifiedId)) {
293
handleChange(e);
294
}
295
})),
296
getValue
297
);
298
this.observables.set(key.id, observable);
299
}
300
return observable;
301
}
302
303
/**
304
* Checks if the key is configured by the user in any of the configuration scopes.
305
*/
306
public isConfigured<T>(key: BaseConfig<T>, scope?: ConfigurationScope): boolean {
307
const inspect = this.inspectConfig<T>(key, scope);
308
const isConfigured = (
309
inspect?.globalValue !== undefined
310
|| inspect?.globalLanguageValue !== undefined
311
|| inspect?.workspaceFolderValue !== undefined
312
|| inspect?.workspaceFolderLanguageValue !== undefined
313
|| inspect?.workspaceValue !== undefined
314
|| inspect?.workspaceLanguageValue !== undefined
315
);
316
return isConfigured;
317
}
318
319
protected getDefaultValueForConfig<T>(key: BaseConfig<T>): T | undefined {
320
return undefined;
321
}
322
323
}
324
325
export interface BaseConfig<T> {
326
/**
327
* Key as it appears in settings.json minus the "github.copilot." prefix.
328
* e.g. "advanced.debug.overrideProxyUrl"
329
*/
330
readonly id: string;
331
332
/**
333
* The old key as it appears in settings.json minus the "github.copilot." prefix.
334
*/
335
readonly oldId?: string;
336
337
/**
338
* This setting is present in package.json and is visible to the general public.
339
*/
340
readonly isPublic: boolean;
341
342
/**
343
* The fully qualified id, e.g. "github.copilot.advanced.debug.overrideProxyUrl".
344
* Use this with `affectsConfiguration` from the ConfigurationChangeEvent
345
*/
346
readonly fullyQualifiedId: string;
347
348
/**
349
* The fully qualified old id, e.g. "github.copilot.advanced.debug.overrideProxyUrl".
350
*/
351
readonly fullyQualifiedOldId?: string | undefined;
352
353
/**
354
* The `X` in `github.copilot.advanced.X` settings.
355
*/
356
readonly advancedSubKey: string | undefined;
357
358
/**
359
* The default value (defined either in code for hidden settings, or in package.json for non-hidden settings)
360
*/
361
readonly defaultValue: T;
362
363
/**
364
* Setting options
365
*/
366
readonly options?: ConfigOptions;
367
368
readonly validator?: IValidator<T>;
369
}
370
371
export const enum ConfigType {
372
Simple,
373
ExperimentBased
374
}
375
376
export interface ConfigOptions {
377
readonly oldKey?: string;
378
readonly valueIgnoredForExternals?: boolean;
379
}
380
381
export interface Config<T> extends BaseConfig<T> {
382
readonly configType: ConfigType.Simple;
383
}
384
385
export interface ExperimentBasedConfig<T extends ExperimentBasedConfigType> extends BaseConfig<T> {
386
readonly configType: ConfigType.ExperimentBased;
387
readonly experimentName: string | undefined;
388
}
389
390
let packageJsonDefaults: Map<string, any> | undefined = undefined;
391
function getPackageJsonDefaults(): Map<string, any> {
392
if (!packageJsonDefaults) {
393
packageJsonDefaults = new Map<string, any>();
394
395
// Use the information in packageJson
396
const config = packageJson.contributes.configuration;
397
const propertyGroups = config.map((c) => c.properties);
398
const configProps = Object.assign({}, ...propertyGroups);
399
for (const key in configProps) {
400
packageJsonDefaults.set(key, configProps[key].default);
401
}
402
}
403
return packageJsonDefaults;
404
}
405
406
function toBaseConfig<T>(key: string, defaultValue: T, options: ConfigOptions | undefined): BaseConfig<T> {
407
const fullyQualifiedId = `${CopilotConfigPrefix}.${key}`;
408
const fullyQualifiedOldId = options?.oldKey ? `${CopilotConfigPrefix}.${options.oldKey}` : undefined;
409
const packageJsonDefaults = getPackageJsonDefaults();
410
const isPublic = packageJsonDefaults.has(fullyQualifiedId);
411
const packageJsonDefaultValue = packageJsonDefaults.get(fullyQualifiedId);
412
if (isPublic) {
413
// make sure the default in the code matches the default in packageJson
414
if (!objects.equals(defaultValue, packageJsonDefaultValue)) {
415
throw new BugIndicatingError(`The default value for setting ${key} is different in packageJson and in code`);
416
}
417
}
418
if (isPublic && options?.valueIgnoredForExternals) {
419
throw new BugIndicatingError(`The setting ${key} is public, it therefore cannot be restricted to internal!`);
420
}
421
const advancedSubKey = fullyQualifiedId.startsWith('github.copilot.advanced.') ? fullyQualifiedId.substring('github.copilot.advanced.'.length) : undefined;
422
return { id: key, oldId: options?.oldKey, isPublic, fullyQualifiedId, fullyQualifiedOldId, advancedSubKey, defaultValue, options };
423
}
424
425
class ConfigRegistry {
426
/**
427
* A map of all registered configs, keyed by their full id, eg `github.copilot.advanced.debug.overrideProxyUrl`.
428
*/
429
public readonly configs: Map<string, Config<any> | ExperimentBasedConfig<any>> = new Map();
430
431
registerConfig(config: Config<any> | ExperimentBasedConfig<any>): void {
432
this.configs.set(config.fullyQualifiedId, config);
433
}
434
}
435
436
export const globalConfigRegistry = new ConfigRegistry();
437
438
// Configuration Migration Types and Registry
439
export type ConfigurationValue = { value: any | undefined /* Remove */ };
440
export type ConfigurationKeyValuePairs = [string, ConfigurationValue][];
441
export type ConfigurationMigrationFn = (value: any) => ConfigurationValue | ConfigurationKeyValuePairs | Promise<ConfigurationValue | ConfigurationKeyValuePairs>;
442
export type ConfigurationMigration = { key: string; migrateFn: ConfigurationMigrationFn };
443
444
export interface IConfigurationMigrationRegistry {
445
registerConfigurationMigrations(configurationMigrations: ConfigurationMigration[]): void;
446
}
447
448
class ConfigurationMigrationRegistryImpl implements IConfigurationMigrationRegistry {
449
readonly migrations: ConfigurationMigration[] = [];
450
451
private readonly _onDidRegisterConfigurationMigrations = new Emitter<ConfigurationMigration[]>();
452
readonly onDidRegisterConfigurationMigration = this._onDidRegisterConfigurationMigrations.event;
453
454
registerConfigurationMigrations(configurationMigrations: ConfigurationMigration[]): void {
455
this.migrations.push(...configurationMigrations);
456
this._onDidRegisterConfigurationMigrations.fire(configurationMigrations);
457
}
458
}
459
460
export const ConfigurationMigrationRegistry = new ConfigurationMigrationRegistryImpl();
461
462
function defineSetting<T>(key: string, configType: ConfigType.Simple, defaultValue: T, validator?: IValidator<T>, options?: ConfigOptions): Config<T>;
463
function defineSetting<T extends ExperimentBasedConfigType>(key: string, configType: ConfigType.ExperimentBased, defaultValue: T, validator?: IValidator<T>, options?: ConfigOptions, expOptions?: { experimentName?: string }): ExperimentBasedConfig<T>;
464
function defineSetting<T extends ExperimentBasedConfigType>(key: string, configType: ConfigType, defaultValue: T, validator?: IValidator<T>, options?: ConfigOptions, expOptions?: { experimentName?: string }): Config<T> | ExperimentBasedConfig<T> {
465
if (configType === ConfigType.ExperimentBased) {
466
const value: ExperimentBasedConfig<T> = { ...toBaseConfig(key, defaultValue, options), configType: ConfigType.ExperimentBased, experimentName: expOptions?.experimentName, validator };
467
if (value.advancedSubKey) {
468
// This is a `github.copilot.advanced.*` setting
469
throw new BugIndicatingError('Shared settings cannot be experiment based');
470
}
471
globalConfigRegistry.registerConfig(value);
472
return value;
473
}
474
475
const value: Config<T> = { ...toBaseConfig(key, defaultValue, options), configType: ConfigType.Simple, validator };
476
globalConfigRegistry.registerConfig(value);
477
return value;
478
}
479
480
function defineTeamInternalSetting<T>(key: string, configType: ConfigType.Simple, defaultValue: T, validator?: IValidator<T>, options?: ConfigOptions): Config<T>;
481
function defineTeamInternalSetting<T extends ExperimentBasedConfigType>(key: string, configType: ConfigType.ExperimentBased, defaultValue: T, validator?: IValidator<T>, options?: ConfigOptions, expOptions?: { experimentName?: string }): ExperimentBasedConfig<T>;
482
function defineTeamInternalSetting<T extends ExperimentBasedConfigType>(key: string, configType: ConfigType, defaultValue: T, validator?: IValidator<T>, options?: ConfigOptions, expOptions?: { experimentName?: string }): Config<T> | ExperimentBasedConfig<T> {
483
options = { ...options, valueIgnoredForExternals: true };
484
return configType === ConfigType.Simple ? defineSetting(key, configType, defaultValue, validator, options) : defineSetting(key, configType, defaultValue, validator, options, expOptions);
485
}
486
487
function migrateSetting(newKey: string, oldKey: string): void {
488
ConfigurationMigrationRegistry.registerConfigurationMigrations([{
489
key: `${CopilotConfigPrefix}.${oldKey}`,
490
migrateFn: async (migrationValue: any) => {
491
return [
492
[`${CopilotConfigPrefix}.${newKey}`, { value: migrationValue }],
493
[`${CopilotConfigPrefix}.${oldKey}`, { value: undefined }]
494
];
495
}
496
}]);
497
}
498
499
function defineAndMigrateSetting<T>(oldKey: string, newKey: string, defaultValue: T, options?: ConfigOptions): Config<T> {
500
migrateSetting(newKey, oldKey);
501
return defineSetting(newKey, ConfigType.Simple, defaultValue, undefined, { ...options, oldKey });
502
}
503
504
function defineAndMigrateExpSetting<T extends ExperimentBasedConfigType>(oldKey: string, newKey: string, defaultValue: T, options?: ConfigOptions, expOptions?: { experimentName?: string }): ExperimentBasedConfig<T> {
505
migrateSetting(newKey, oldKey);
506
return defineSetting(newKey, ConfigType.ExperimentBased, defaultValue, undefined, { ...options, oldKey }, expOptions);
507
}
508
509
// Max CAPI tool count limit
510
export const HARD_TOOL_LIMIT = 128;
511
512
// WARNING
513
// These values are used in the request and are case sensitive. Do not change them unless advised by CAPI.
514
// It is also not recommended to use this as a type as it will never be an exhaustive list
515
export const enum CHAT_MODEL {
516
GPT41 = 'gpt-4.1-2025-04-14',
517
GPT4OMINI = 'gpt-4o-mini',
518
NES_XTAB = 'copilot-nes-xtab', // xtab model hosted in prod in proxy
519
CUSTOM_NES = 'custom-nes',
520
XTAB_4O_MINI_FINETUNED = 'xtab-4o-mini-finetuned',
521
GPT4OPROXY = 'gpt-4o-instant-apply-full-ft-v66',
522
SHORT_INSTANT_APPLY = 'gpt-4o-instant-apply-full-ft-v66-short',
523
CLAUDE_SONNET = 'claude-3.5-sonnet',
524
CLAUDE_37_SONNET = 'claude-3.7-sonnet',
525
DEEPSEEK_CHAT = 'deepseek-chat',
526
GEMINI_25_PRO = 'gemini-2.5-pro',
527
GEMINI_20_PRO = 'gemini-2.0-pro-exp-02-05',
528
GEMINI_FLASH = 'gemini-2.0-flash-001',
529
O1 = 'o1',
530
O3MINI = 'o3-mini',
531
O1MINI = 'o1-mini',
532
// A placeholder model that is used for just quickly testing new Azure endpoints.
533
// This model is not intended to be used for any real work.
534
EXPERIMENTAL = 'experimental-01'
535
}
536
537
export enum AuthProviderId {
538
GitHub = 'github',
539
GitHubEnterprise = 'github-enterprise',
540
Microsoft = 'microsoft',
541
}
542
543
export enum AuthPermissionMode {
544
Default = 'default',
545
Minimal = 'minimal'
546
}
547
548
export enum AzureAuthMode {
549
EntraId = 'entraId',
550
ApiKey = 'apiKey'
551
}
552
553
export namespace AzureAuthMode {
554
/** Microsoft authentication provider ID for VS Code authentication API */
555
export const MICROSOFT_AUTH_PROVIDER = 'microsoft';
556
/** Azure Cognitive Services scope for Entra ID authentication */
557
export const COGNITIVE_SERVICES_SCOPE = 'https://cognitiveservices.azure.com/.default';
558
}
559
560
export type CodeGenerationImportInstruction = { language?: string; file: string };
561
export type CodeGenerationTextInstruction = { language?: string; text: string };
562
export type CodeGenerationInstruction = CodeGenerationImportInstruction | CodeGenerationTextInstruction;
563
564
export type CommitMessageGenerationInstruction = { file: string } | { text: string };
565
566
export const XTabProviderId = 'XtabProvider';
567
568
export namespace ConfigKey {
569
570
/**
571
* These settings are defined in the completions extensions and shared.
572
*
573
* We should not change the names of these settings without coordinating with Completions extension.
574
*/
575
export namespace Shared {
576
/** Allows for overriding the base domain we use for making requests to the CAPI. This helps CAPI devs develop against a local instance. */
577
export const DebugOverrideProxyUrl = defineSetting<string | undefined>('advanced.debug.overrideProxyUrl', ConfigType.Simple, undefined);
578
export const DebugOverrideCAPIUrl = defineSetting<string | undefined>('advanced.debug.overrideCapiUrl', ConfigType.Simple, undefined);
579
export const DebugUseNodeFetchFetcher = defineSetting('advanced.debug.useNodeFetchFetcher', ConfigType.Simple, true);
580
export const DebugUseNodeFetcher = defineSetting('advanced.debug.useNodeFetcher', ConfigType.Simple, false);
581
export const DebugUseElectronFetcher = defineSetting('advanced.debug.useElectronFetcher', ConfigType.Simple, true);
582
export const AuthProvider = defineSetting<AuthProviderId>('advanced.authProvider', ConfigType.Simple, AuthProviderId.GitHub);
583
export const AuthPermissions = defineSetting<AuthPermissionMode>('advanced.authPermissions', ConfigType.Simple, AuthPermissionMode.Default);
584
}
585
586
/**
587
* Advanced settings that are available for all users to configure.
588
*/
589
export namespace Advanced {
590
/** Allows forcing a particular model.
591
* Note: this should not be used while self-hosting because it might lead to
592
* a fundamental different experience compared to our end-users.
593
*/
594
export const DebugPromptOverrideString = defineSetting<string | null>('chat.debug.promptOverrideString', ConfigType.Simple, null);
595
export const DebugPromptOverrideFile = defineSetting<string | null>('chat.debug.promptOverrideFile', ConfigType.Simple, null);
596
export const WorkspacePrototypeAdoCodeSearchEndpointOverride = defineAndMigrateSetting<string>('chat.advanced.workspace.prototypeAdoCodeSearchEndpointOverride', 'chat.workspace.prototypeAdoCodeSearchEndpointOverride', '');
597
export const FeedbackOnChange = defineAndMigrateSetting('chat.advanced.feedback.onChange', 'chat.feedback.onChange', false);
598
export const ReviewIntent = defineAndMigrateSetting('chat.advanced.review.intent', 'chat.review.intent', false);
599
/** Enable the new notebook priorities experiment */
600
export const NotebookSummaryExperimentEnabled = defineAndMigrateSetting('chat.advanced.notebook.summaryExperimentEnabled', 'chat.notebook.summaryExperimentEnabled', false);
601
/** Enable filtering variables by cell document symbols */
602
export const NotebookVariableFilteringEnabled = defineAndMigrateSetting('chat.advanced.notebook.variableFilteringEnabled', 'chat.notebook.variableFilteringEnabled', false);
603
export const TerminalToDebuggerPatterns = defineAndMigrateSetting<string[]>('chat.advanced.debugTerminalCommandPatterns', 'chat.debugTerminalCommandPatterns', []);
604
export const WorkspaceRecordingEnabled = defineAndMigrateSetting('chat.advanced.localWorkspaceRecording.enabled', 'chat.localWorkspaceRecording.enabled', false);
605
export const EditRecordingEnabled = defineAndMigrateSetting('chat.advanced.editRecording.enabled', 'chat.editRecording.enabled', false);
606
export const CodeSearchAgentEnabled = defineAndMigrateSetting<boolean | undefined>('chat.advanced.codesearch.agent.enabled', 'chat.codesearch.agent.enabled', true);
607
export const AgentTemperature = defineAndMigrateSetting<number | undefined>('chat.advanced.agent.temperature', 'chat.agent.temperature', undefined);
608
export const EnableUserPreferences = defineAndMigrateSetting<boolean>('chat.advanced.enableUserPreferences', 'chat.enableUserPreferences', false);
609
export const SummarizeAgentConversationHistoryThreshold = defineAndMigrateSetting<number | undefined>('chat.advanced.summarizeAgentConversationHistoryThreshold', 'chat.summarizeAgentConversationHistoryThreshold', undefined);
610
export const AgentHistorySummarizationMode = defineAndMigrateSetting<string | undefined>('chat.advanced.agentHistorySummarizationMode', 'chat.agentHistorySummarizationMode', undefined);
611
export const UseResponsesApiTruncation = defineAndMigrateSetting<boolean | undefined>('chat.advanced.useResponsesApiTruncation', 'chat.useResponsesApiTruncation', false);
612
export const OmitBaseAgentInstructions = defineAndMigrateSetting<boolean>('chat.advanced.omitBaseAgentInstructions', 'chat.omitBaseAgentInstructions', false);
613
export const CLIShowExternalSessions = defineSetting<boolean>('chat.cli.showExternalSessions', ConfigType.Simple, true);
614
export const CLIPlanExitModeEnabled = defineSetting<boolean>('chat.cli.planExitMode.enabled', ConfigType.Simple, true);
615
export const CLIAutoModelEnabled = defineSetting<boolean>('chat.cli.autoModel.enabled', ConfigType.Simple, true);
616
export const CLIPlanCommandEnabled = defineSetting<boolean>('chat.cli.planCommand.enabled', ConfigType.Simple, true);
617
export const CLIChatLazyLoadSessionItem = defineSetting<boolean>('chat.cli.lazyLoadSessionItem.enabled', ConfigType.Simple, true);
618
export const CLIAIGenerateBranchNames = defineSetting<boolean>('chat.cli.aiGenerateBranchNames.enabled', ConfigType.Simple, true);
619
export const CLIForkSessionsEnabled = defineSetting<boolean>('chat.cli.forkSessions.enabled', ConfigType.Simple, true);
620
export const CLIMCPServerEnabled = defineAndMigrateSetting<boolean | undefined>('chat.advanced.cli.mcp.enabled', 'chat.cli.mcp.enabled', true);
621
export const CLIBranchSupport = defineSetting<boolean>('chat.cli.branchSupport.enabled', ConfigType.Simple, false);
622
export const CLIIsolationOption = defineSetting<boolean>('chat.cli.isolationOption.enabled', ConfigType.Simple, true);
623
export const CLIAutoCommitEnabled = defineSetting<boolean>('chat.cli.autoCommit.enabled', ConfigType.Simple, true);
624
export const CLISessionController = defineSetting<boolean>('chat.cli.sessionController.enabled', ConfigType.Simple, true);
625
export const CLIThinkingEffortEnabled = defineSetting<boolean>('chat.cli.thinkingEffort.enabled', ConfigType.Simple, true);
626
export const CLIRemoteEnabled = defineSetting<boolean>('chat.cli.remote.enabled', ConfigType.Simple, false);
627
export const CLISessionControllerForSessionsApp = defineSetting<boolean>('chat.cli.sessionControllerForSessionsApp.enabled', ConfigType.Simple, false);
628
export const CLITerminalLinks = defineSetting<boolean>('chat.cli.terminalLinks.enabled', ConfigType.Simple, true);
629
export const RequestLoggerMaxEntries = defineAndMigrateSetting<number>('chat.advanced.debug.requestLogger.maxEntries', 'chat.debug.requestLogger.maxEntries', 100);
630
631
// Experiment-based settings
632
/** Uses new expanded project labels */
633
export const ProjectLabelsExpanded = defineAndMigrateExpSetting<boolean>('chat.advanced.projectLabels.expanded', 'chat.projectLabels.expanded', false);
634
/** Add project labels in default agent */
635
export const ProjectLabelsChat = defineAndMigrateExpSetting<boolean>('chat.advanced.projectLabels.chat', 'chat.projectLabels.chat', false);
636
/** Add project labels in default agent */
637
export const ProjectLabelsInline = defineAndMigrateExpSetting<boolean>('chat.advanced.projectLabels.inline', 'chat.projectLabels.inline', false);
638
export const WorkspaceMaxLocalIndexSize = defineAndMigrateExpSetting<number>('chat.advanced.workspace.maxLocalIndexSize', 'chat.workspace.maxLocalIndexSize', 100_000);
639
export const WorkspaceEnableCodeSearch = defineAndMigrateExpSetting<boolean>('chat.advanced.workspace.enableCodeSearch', 'chat.workspace.enableCodeSearch', true);
640
export const WorkspaceEnableCodeSearchExternalIngest = defineSetting<boolean>('chat.workspace.codeSearchExternalIngest.enabled', ConfigType.ExperimentBased, false, undefined, undefined, { experimentName: 'copilotchat.config.chat.advanced.workspace.codeSearchExternalIngest.enabled' });
641
export const WorkspacePreferredEmbeddingsModel = defineAndMigrateExpSetting<string>('chat.advanced.workspace.preferredEmbeddingsModel', 'chat.workspace.preferredEmbeddingsModel', '');
642
export const NotebookAlternativeDocumentFormat = defineAndMigrateExpSetting<AlternativeNotebookFormat>('chat.advanced.notebook.alternativeFormat', 'chat.notebook.alternativeFormat', AlternativeNotebookFormat.xml);
643
export const UseAlternativeNESNotebookFormat = defineAndMigrateExpSetting<boolean>('chat.advanced.notebook.alternativeNESFormat.enabled', 'chat.notebook.alternativeNESFormat.enabled', false);
644
645
export const InlineChatReasoningEffort = defineSetting<string>('chat.inlineChat.reasoningEffort', ConfigType.ExperimentBased, 'low');
646
export const InlineChatEnableThinking = defineSetting<boolean>('chat.inlineChat.enableThinking', ConfigType.ExperimentBased, false);
647
648
export const InstantApplyShortModelName = defineAndMigrateExpSetting<string>('chat.advanced.instantApply.shortContextModelName', 'chat.instantApply.shortContextModelName', CHAT_MODEL.SHORT_INSTANT_APPLY);
649
export const InstantApplyShortContextLimit = defineAndMigrateExpSetting<number>('chat.advanced.instantApply.shortContextLimit', 'chat.instantApply.shortContextLimit', 8000);
650
export const AgentHistorySummarizationInline = defineAndMigrateExpSetting<boolean>('chat.advanced.agentHistorySummarizationInline', 'chat.agentHistorySummarizationInline', true);
651
export const PromptFileContext = defineAndMigrateExpSetting<boolean>('chat.advanced.promptFileContextProvider.enabled', 'chat.promptFileContextProvider.enabled', true);
652
export const DefaultToolsGrouped = defineAndMigrateExpSetting<boolean>('chat.advanced.tools.defaultToolsGrouped', 'chat.tools.defaultToolsGrouped', false);
653
export const Gpt5AlternativePatch = defineAndMigrateExpSetting<boolean>('chat.advanced.gpt5AlternativePatch', 'chat.gpt5AlternativePatch', false);
654
export const SearchSubagentToolEnabled = defineSetting<boolean>('chat.searchSubagent.enabled', ConfigType.ExperimentBased, false);
655
/** Use the agentic proxy for the search subagent tool */
656
export const SearchSubagentUseAgenticProxy = defineSetting<boolean>('chat.searchSubagent.useAgenticProxy', ConfigType.ExperimentBased, false);
657
/** Model to use for the search subagent. When useAgenticProxy is true, defaults to 'vscode-agentic-search-router-a'. When false, defaults to the main agent model. */
658
export const SearchSubagentModel = defineSetting<string>('chat.searchSubagent.model', ConfigType.ExperimentBased, '');
659
/** Maximum number of tool calls the search subagent can make */
660
export const SearchSubagentToolCallLimit = defineSetting<number>('chat.searchSubagent.toolCallLimit', ConfigType.ExperimentBased, 4);
661
/** Enable the thoroughness parameter on the search subagent tool, which adjusts turn limits based on requested thoroughness */
662
export const SearchSubagentThoroughnessEnabled = defineSetting<boolean>('chat.searchSubagent.thoroughnessEnabled', ConfigType.ExperimentBased, false);
663
664
export const ExecutionSubagentToolEnabled = defineSetting<boolean>('chat.executionSubagent.enabled', ConfigType.ExperimentBased, false);
665
export const SkillToolEnabled = defineSetting<boolean>('chat.skillTool.enabled', ConfigType.ExperimentBased, false);
666
/** Model to use for the execution subagent */
667
/** Use the agentic proxy for the execution subagent */
668
export const ExecutionSubagentUseAgenticProxy = defineSetting<boolean>('chat.executionSubagent.useAgenticProxy', ConfigType.ExperimentBased, false);
669
/** Model to use for the execution subagent. When useAgenticProxy is true, defaults to 'exec-subagent-router-a'. When false, defaults to the main agent model. */
670
export const ExecutionSubagentModel = defineSetting<string>('chat.executionSubagent.model', ConfigType.ExperimentBased, '');
671
/** Maximum number of tool calls the execution subagent can make */
672
export const ExecutionSubagentToolCallLimit = defineSetting<number>('chat.executionSubagent.toolCallLimit', ConfigType.ExperimentBased, 10);
673
674
export const InlineEditsTriggerOnEditorChangeAfterSeconds = defineAndMigrateExpSetting<number | undefined>('chat.advanced.inlineEdits.triggerOnEditorChangeAfterSeconds', 'chat.inlineEdits.triggerOnEditorChangeAfterSeconds', 10);
675
export const InlineEditsNextCursorPredictionDisplayLine = defineAndMigrateExpSetting<boolean>('chat.advanced.inlineEdits.nextCursorPrediction.displayLine', 'chat.inlineEdits.nextCursorPrediction.displayLine', true);
676
export const InlineEditsNextCursorPredictionCurrentFileMaxTokens = defineAndMigrateExpSetting<number>('chat.advanced.inlineEdits.nextCursorPrediction.currentFileMaxTokens', 'chat.inlineEdits.nextCursorPrediction.currentFileMaxTokens', 3000);
677
export const InlineEditsRenameSymbolSuggestions = defineSetting<boolean>('chat.inlineEdits.renameSymbolSuggestions', ConfigType.ExperimentBased, true);
678
export const InlineEditsPreferredModel = defineSetting<string | 'none'>('nextEditSuggestions.preferredModel', ConfigType.ExperimentBased, 'none');
679
export const InlineEditsAggressiveness = defineSetting<xtabPromptOptions.AggressivenessSetting>('nextEditSuggestions.eagerness', ConfigType.ExperimentBased, xtabPromptOptions.AggressivenessSetting.Default, xtabPromptOptions.AggressivenessSetting.VALIDATOR);
680
export const DiagnosticsContextProvider = defineAndMigrateExpSetting<boolean>('chat.advanced.inlineEdits.diagnosticsContextProvider.enabled', 'chat.inlineEdits.diagnosticsContextProvider.enabled', false);
681
export const ChatSessionContextProvider = defineSetting<boolean>('chat.inlineEdits.chatSessionContextProvider.enabled', ConfigType.ExperimentBased, false);
682
export const Gemini3MultiReplaceString = defineSetting<boolean>('chat.edits.gemini3MultiReplaceString', ConfigType.ExperimentBased, false);
683
export const BatchReplaceStringDescriptions = defineSetting<boolean>('chat.edits.batchReplaceStringDescriptions', ConfigType.ExperimentBased, false);
684
export const AgentOmitFileAttachmentContents = defineSetting<boolean>('chat.agent.omitFileAttachmentContents', ConfigType.ExperimentBased, false);
685
686
/**
687
* Settings for switch between old tools and new skills
688
*/
689
export const InstallExtensionSkillEnabled = defineSetting<boolean>('chat.installExtensionSkill.enabled', ConfigType.ExperimentBased, false);
690
export const ProjectSetupInfoSkillEnabled = defineSetting<boolean>('chat.projectSetupInfoSkill.enabled', ConfigType.ExperimentBased, false);
691
692
/**
693
* When enabled, large tool results (above the threshold in bytes) are written to disk
694
* instead of being included directly in the prompt. This helps manage context window usage.
695
*/
696
export const LargeToolResultsToDiskEnabled = defineSetting<boolean>('chat.agent.largeToolResultsToDisk.enabled', ConfigType.ExperimentBased, true);
697
/**
698
* The size threshold in bytes above which tool results are written to disk.
699
* Only applies when LargeToolResultsToDiskEnabled is true.
700
*/
701
export const LargeToolResultsToDiskThreshold = defineSetting<number>('chat.agent.largeToolResultsToDisk.thresholdBytes', ConfigType.ExperimentBased, 8 * 1024);
702
703
/** Simulate GitHub authentication failures for testing. Can't be TeamInternal because we lose these flags as part of testing. */
704
export const DebugGitHubAuthFailWith = defineSetting<'NotAuthorized' | 'RequestFailed' | 'ParseFailed' | 'HTTP401' | 'RateLimited' | 'GitHubLoginFailed' | null>('chat.debug.githubAuthFailWith', ConfigType.Simple, null);
705
706
// Agent debug logging settings — fileLogging.enabled is the canonical toggle
707
/** @deprecated Use ChatDebugFileLogging instead. Kept during experiment transition. */
708
export const AgentDebugLogEnabled = defineAndMigrateExpSetting<boolean>('agentDebugLog.enabled', 'chat.agentDebugLog.enabled', false);
709
export const ChatDebugFileLogging = defineAndMigrateExpSetting<boolean>('chat.chatDebug.fileLogging.enabled', 'chat.agentDebugLog.fileLogging.enabled', false);
710
export const ChatDebugFileLoggingFlushInterval = defineAndMigrateSetting<number>('chat.chatDebug.fileLogging.flushIntervalMs', 'chat.agentDebugLog.fileLogging.flushIntervalMs', 4000);
711
export const ChatDebugFileLoggingMaxRetainedSessionLogs = defineSetting<number>('chat.agentDebugLog.fileLogging.maxRetainedSessionLogs', ConfigType.ExperimentBased, 50);
712
export const ChatDebugFileLoggingMaxSessionLogSizeMB = defineSetting<number>('chat.agentDebugLog.fileLogging.maxSessionLogSizeMB', ConfigType.ExperimentBased, 100);
713
714
// OTel settings
715
export const OTelEnabled = defineSetting<boolean>('chat.otel.enabled', ConfigType.Simple, false);
716
export const OTelExporterType = defineSetting<string>('chat.otel.exporterType', ConfigType.Simple, 'otlp-http');
717
export const OTelOtlpEndpoint = defineSetting<string>('chat.otel.otlpEndpoint', ConfigType.Simple, 'http://localhost:4318');
718
export const OTelCaptureContent = defineSetting<boolean>('chat.otel.captureContent', ConfigType.Simple, false);
719
export const OTelOutfile = defineSetting<string>('chat.otel.outfile', ConfigType.Simple, '');
720
export const OTelDbSpanExporter = defineSetting<boolean>('chat.otel.dbSpanExporter.enabled', ConfigType.Simple, false);
721
722
/** Internal: override reasoning/thinking effort sent to model APIs (e.g. Responses API, Messages API). Used by evals. */
723
export const ReasoningEffortOverride = defineSetting<string | null>('chat.reasoningEffortOverride', ConfigType.Simple, null);
724
725
export const InlineEditsXtabProviderModelConfiguration = (() => {
726
const oldKey = 'chat.advanced.inlineEdits.xtabProvider.modelConfiguration';
727
const newKey = 'chat.inlineEdits.xtabProvider.modelConfiguration';
728
migrateSetting(newKey, oldKey);
729
return defineSetting<xtabPromptOptions.ModelConfiguration | null>(newKey, ConfigType.Simple, null, xtabPromptOptions.MODEL_CONFIGURATION_VALIDATOR, { oldKey });
730
})();
731
}
732
733
/**
734
* Internal settings those only team members can configure
735
* Features should only be in this list temporarily, moving on to experimental to be accessible to early adopters.
736
*/
737
export namespace TeamInternal {
738
/** Allows forcing a particular context window size.
739
* This setting doesn't validate values so large windows may not be supported by the model.
740
* Note: this should not be used while self-hosting because it might lead to
741
* a fundamental different experience compared to our end-users.
742
*/
743
export const DebugOverrideChatMaxTokenNum = defineTeamInternalSetting<number>('chat.advanced.debug.overrideChatMaxTokenNum', ConfigType.Simple, 0);
744
/** Allow reporting issue when clicking on the Unhelpful button
745
* Requires a window reload to take effect
746
*/
747
export const DebugReportFeedback = defineTeamInternalSetting<boolean>('chat.advanced.debug.reportFeedback', ConfigType.Simple, false);
748
export const DisableRepoInfoTelemetry = defineTeamInternalSetting<boolean>('chat.advanced.debug.disableRepoInfoTelemetry', ConfigType.Simple, false);
749
export const InlineEditsIgnoreCompletionsDisablement = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.ignoreCompletionsDisablement', ConfigType.Simple, false, vBoolean());
750
export const InlineEditsModelPickerEnabled = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.modelPicker.enabled', ConfigType.ExperimentBased, false, vBoolean());
751
export const InlineEditsUseSlashModels = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.useSlashModels', ConfigType.ExperimentBased, true);
752
export const InlineEditsLogContextRecorderEnabled = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.logContextRecorder.enabled', ConfigType.Simple, false);
753
export const InlineEditsHideInternalInterface = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.hideInternalInterface', ConfigType.Simple, false, vBoolean());
754
export const InlineEditsLogCancelledRequests = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.logCancelledRequests', ConfigType.Simple, false, vBoolean());
755
export const InlineEditsNextCursorPredictionUrl = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.nextCursorPrediction.url', ConfigType.Simple, undefined, vString());
756
export const InlineEditsNextCursorPredictionApiKey = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.nextCursorPrediction.apiKey', ConfigType.Simple, undefined, vString());
757
export const InlineEditsXtabProviderUrl = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.xtabProvider.url', ConfigType.Simple, undefined, vString());
758
export const InlineEditsXtabProviderApiKey = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.xtabProvider.apiKey', ConfigType.Simple, undefined, vString());
759
export const InlineEditsNextCursorPredictionLintOptions = defineTeamInternalSetting<Partial<xtabPromptOptions.LintOptions> | undefined>('chat.advanced.inlineEdits.nextCursorPrediction.lintOptions', ConfigType.Simple, undefined, xtabPromptOptions.LINT_OPTIONS_VALIDATOR);
760
export const InlineEditsInlineCompletionsEnabled = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.inlineCompletions.enabled', ConfigType.Simple, true, vBoolean());
761
export const InlineEditsInlineCompletionsAdvanced = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.inlineCompletions.advancedDetection', ConfigType.ExperimentBased, true, vBoolean());
762
/**
763
* When enabled, a cached NES suggestion that was once rendered as an inline
764
* (ghost text at cursor) suggestion will not be re-served from cache unless
765
* it can again be rendered as an inline suggestion. The cache entry is not
766
* evicted — it is simply gated until the cursor returns to an
767
* inline-renderable position.
768
*/
769
export const InlineEditsNesMimicGhostTextBehavior = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.nesMimicGhostTextBehavior', ConfigType.ExperimentBased, false, vBoolean());
770
export const InlineEditsXtabProviderUsePrediction = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.usePrediction', ConfigType.ExperimentBased, true, vBoolean());
771
export const InlineEditsXtabLanguageContextEnabledLanguages = defineTeamInternalSetting<LanguageContextLanguages>('chat.advanced.inlineEdits.xtabProvider.languageContext.enabledLanguages', ConfigType.Simple, LANGUAGE_CONTEXT_ENABLED_LANGUAGES);
772
export const InlineEditsXtabLanguageContextTraitsPosition = defineTeamInternalSetting<'before' | 'after'>('chat.advanced.inlineEdits.xtabProvider.languageContext.traitsPosition', ConfigType.ExperimentBased, 'before');
773
export const InlineEditsDiagnosticsExplorationEnabled = defineTeamInternalSetting<boolean | undefined>('chat.advanced.inlineEdits.inlineEditsDiagnosticsExplorationEnabled', ConfigType.Simple, false);
774
export const InternalWelcomeHintEnabled = defineTeamInternalSetting<boolean>('chat.advanced.welcomePageHint.enabled', ConfigType.Simple, false);
775
export const InlineChatUseCodeMapper = defineTeamInternalSetting<boolean>('chat.advanced.inlineChat.useCodeMapper', ConfigType.Simple, false);
776
export const EnablePromptRendererTracing = defineTeamInternalSetting<boolean>('chat.advanced.promptRenderer.trace', ConfigType.Simple, false);
777
// Backed by Experiments
778
export const DebugCollectFetcherTelemetry = defineTeamInternalSetting<boolean>('chat.advanced.debug.collectFetcherTelemetry', ConfigType.ExperimentBased, true);
779
export const DebugShowNetworkStatus = defineTeamInternalSetting<boolean>('chat.advanced.debug.showNetworkStatus', ConfigType.ExperimentBased, false);
780
export const GeminiFunctionCallingMode = defineTeamInternalSetting<'auto' | 'none' | 'required' | 'validated' | undefined>('chat.advanced.gemini.functionCallingMode', ConfigType.ExperimentBased, 'validated');
781
export const ModelProviderPreference = defineTeamInternalSetting<string | undefined>('chat.advanced.modelProviderPreference', ConfigType.Simple, undefined, vString());
782
export const UseVSCodeTelemetryLibForGH = defineTeamInternalSetting<boolean>('chat.advanced.telemetry.useVSCodeTelemetryLibForGH', ConfigType.ExperimentBased, false);
783
784
export const DebugExpUseNodeFetchFetcher = defineTeamInternalSetting<boolean | undefined>('chat.advanced.debug.useNodeFetchFetcher', ConfigType.ExperimentBased, undefined);
785
export const DebugExpUseNodeFetcher = defineTeamInternalSetting<boolean | undefined>('chat.advanced.debug.useNodeFetcher', ConfigType.ExperimentBased, undefined);
786
export const DebugExpUseElectronFetcher = defineTeamInternalSetting<boolean | undefined>('chat.advanced.debug.useElectronFetcher', ConfigType.ExperimentBased, undefined);
787
export const InlineEditsAsyncCompletions = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.asyncCompletions', ConfigType.ExperimentBased, true);
788
export const InlineEditsEagerBackupRequest = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.eagerBackupRequest', ConfigType.ExperimentBased, false);
789
export const InlineEditsDebounceUseCoreRequestTime = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.debounceUseCoreRequestTime', ConfigType.ExperimentBased, false);
790
export const InlineEditsYieldToCopilot = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.yieldToCopilot', ConfigType.ExperimentBased, false);
791
export const InlineEditsExcludedProviders = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.excludedProviders', ConfigType.ExperimentBased, undefined);
792
export const InlineEditsEnableGhCompletionsProvider = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.githubCompletionsProvider.enabled', ConfigType.ExperimentBased, false);
793
export const InlineEditsCompletionsUrl = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.completionsProvider.url', ConfigType.ExperimentBased, undefined);
794
export const InlineEditsDebounce = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.debounce', ConfigType.ExperimentBased, 100);
795
export const InlineEditsCacheCursorDistanceCheck = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.cacheCursorDistanceCheck', ConfigType.ExperimentBased, false);
796
export const InlineEditsCacheDelay = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.cacheDelay', ConfigType.ExperimentBased, 200);
797
export const InlineEditsSubsequentCacheDelay = defineTeamInternalSetting<number | undefined>('chat.advanced.inlineEdits.subsequentCacheDelay', ConfigType.ExperimentBased, 0);
798
export const InlineEditsSpeculativeRequestDelay = defineTeamInternalSetting<number | undefined>('chat.advanced.inlineEdits.speculativeRequestDelay', ConfigType.ExperimentBased, 0);
799
export const InlineEditsRebasedCacheDelay = defineTeamInternalSetting<number | undefined>('chat.advanced.inlineEdits.rebasedCacheDelay', ConfigType.ExperimentBased, 0);
800
export const InlineEditsAbsorbSubsequenceTyping = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.absorbSubsequenceTyping', ConfigType.ExperimentBased, false);
801
export const InlineEditsReverseAgreement = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.reverseAgreement', ConfigType.ExperimentBased, false);
802
export const InlineEditsMaxImperfectAgreementLength = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.maxImperfectAgreementLength', ConfigType.ExperimentBased, 5, vNumber());
803
export const InlineEditsBackoffDebounceEnabled = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.backoffDebounceEnabled', ConfigType.ExperimentBased, true);
804
export const InlineEditsExtraDebounceEndOfLine = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.extraDebounceEndOfLine', ConfigType.ExperimentBased, 2000);
805
export const InlineEditsSpeculativeRequests = defineTeamInternalSetting<SpeculativeRequestsEnablement>('chat.advanced.inlineEdits.speculativeRequests', ConfigType.ExperimentBased, SpeculativeRequestsEnablement.Off, SpeculativeRequestsEnablement.VALIDATOR);
806
export const InlineEditsSpeculativeRequestsCursorPlacement = defineTeamInternalSetting<SpeculativeRequestsCursorPlacement>('chat.advanced.inlineEdits.speculativeRequestsCursorPlacement', ConfigType.ExperimentBased, SpeculativeRequestsCursorPlacement.AfterEditApplied, SpeculativeRequestsCursorPlacement.VALIDATOR);
807
export const InlineEditsSpeculativeRequestsAutoExpandEditWindowLines = defineTeamInternalSetting<SpeculativeRequestsAutoExpandEditWindowLines>('chat.advanced.inlineEdits.speculativeRequestsAutoExpandEditWindowLines', ConfigType.ExperimentBased, SpeculativeRequestsAutoExpandEditWindowLines.Off, SpeculativeRequestsAutoExpandEditWindowLines.VALIDATOR);
808
export const InlineEditsExtraDebounceInlineSuggestion = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.extraDebounceInlineSuggestion', ConfigType.ExperimentBased, 0);
809
export const InlineEditsDebounceOnSelectionChange = defineTeamInternalSetting<number | undefined>('chat.advanced.inlineEdits.debounceOnSelectionChange', ConfigType.ExperimentBased, undefined);
810
export const InlineEditsTriggerOnEditorChangeStrategy = defineTeamInternalSetting<triggerOptions.DocumentSwitchTriggerStrategy>('chat.advanced.inlineEdits.triggerOnEditorChangeStrategy', ConfigType.ExperimentBased, triggerOptions.DocumentSwitchTriggerStrategy.AfterAcceptance, triggerOptions.DocumentSwitchTriggerStrategy.VALIDATOR);
811
export const InlineEditsProviderId = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.providerId', ConfigType.ExperimentBased, undefined);
812
export const InlineEditsUnification = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.unification', ConfigType.ExperimentBased, false);
813
export const InlineEditsNextCursorPredictionModelName = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.nextCursorPrediction.modelName', ConfigType.ExperimentBased, 'copilot-suggestions-himalia-001');
814
export const InlineEditsNextCursorPredictionUseEndpointProvider = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.nextCursorPrediction.useEndpointProvider', ConfigType.Simple, false, vBoolean());
815
export const InlineEditsNextCursorPredictionMaxResponseTokens = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.nextCursorPrediction.maxResponseTokens', ConfigType.ExperimentBased, 40);
816
export const InlineEditsNextCursorPredictionLintOptionsString = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.nextCursorPrediction.lintOptionsString', ConfigType.ExperimentBased, undefined);
817
export const InlineEditsXtabProviderModelConfigurationString = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.xtabProvider.modelConfigurationString', ConfigType.ExperimentBased, undefined);
818
export const InlineEditsXtabProviderDefaultModelConfigurationString = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.xtabProvider.defaultModelConfigurationString', ConfigType.ExperimentBased, undefined);
819
export const InlineEditsXtabProviderUseVaryingLinesAbove = defineTeamInternalSetting<boolean | undefined>('chat.advanced.inlineEdits.xtabProvider.useVaryingLinesAbove', ConfigType.ExperimentBased, undefined);
820
export const InlineEditsXtabProviderNLinesAbove = defineTeamInternalSetting<number | undefined>('chat.advanced.inlineEdits.xtabProvider.nLinesAbove', ConfigType.ExperimentBased, undefined);
821
export const InlineEditsXtabProviderNLinesBelow = defineTeamInternalSetting<number | undefined>('chat.advanced.inlineEdits.xtabProvider.nLinesBelow', ConfigType.ExperimentBased, undefined);
822
export const InlineEditsAutoExpandEditWindowLines = defineTeamInternalSetting<number | undefined>('chat.advanced.inlineEdits.autoExpandEditWindowLines', ConfigType.ExperimentBased, 10);
823
export const InlineEditsXtabNRecentlyViewedDocuments = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.nRecentlyViewedDocuments', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.recentlyViewedDocuments.nDocuments);
824
export const InlineEditsXtabRecentlyViewedDocumentsMaxTokens = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.recentlyViewedDocuments.maxTokens', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.recentlyViewedDocuments.maxTokens);
825
export const InlineEditsXtabRecentlyViewedIncludeLineNumbers = defineTeamInternalSetting<xtabPromptOptions.IncludeLineNumbersOption>('chat.advanced.inlineEdits.xtabProvider.recentlyViewedDocuments.includeLineNumbers', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.recentlyViewedDocuments.includeLineNumbers);
826
export const InlineEditsNextCursorPredictionRecentSnippetsIncludeLineNumbers = defineTeamInternalSetting<xtabPromptOptions.IncludeLineNumbersOption>('chat.advanced.inlineEdits.nextCursorPrediction.recentSnippets.includeLineNumbers', ConfigType.ExperimentBased, xtabPromptOptions.IncludeLineNumbersOption.None);
827
export const InlineEditsNextCursorPredictionCursorPlacement = defineTeamInternalSetting<NextCursorLinePredictionCursorPlacement>('chat.advanced.inlineEdits.nextCursorPrediction.cursorPlacement', ConfigType.ExperimentBased, NextCursorLinePredictionCursorPlacement.AfterLine, NextCursorLinePredictionCursorPlacement.VALIDATOR);
828
export const InlineEditsXtabDiffNEntries = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.diffNEntries', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.diffHistory.nEntries);
829
export const InlineEditsXtabDiffMaxTokens = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.diffMaxTokens', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.diffHistory.maxTokens);
830
export const InlineEditsXtabDiffMergeStrategy = defineTeamInternalSetting<xtabHistoryOptions.DiffHistoryMergeStrategy>('chat.advanced.inlineEdits.xtabProvider.diffMergeStrategy', ConfigType.ExperimentBased, xtabHistoryOptions.DiffHistoryMergeStrategy.SameStartLine, xtabHistoryOptions.DiffHistoryMergeStrategy.VALIDATOR);
831
export const InlineEditsXtabDiffMergeLineGap = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.diffMergeLineGap', ConfigType.ExperimentBased, 0, vNumber());
832
export const InlineEditsXtabDiffMergeSplitAfterMs = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.diffMergeSplitAfterMs', ConfigType.ExperimentBased, 100, vNumber());
833
export const InlineEditsXtabProviderEmitFastCursorLineChange = defineTeamInternalSetting<ResponseProcessor.EmitFastCursorLineChange>('chat.advanced.inlineEdits.xtabProvider.emitFastCursorLineChange', ConfigType.ExperimentBased, ResponseProcessor.EmitFastCursorLineChange.AdditiveOnly);
834
export const InlineEditsXtabIncludeViewedFiles = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.includeViewedFiles', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.recentlyViewedDocuments.includeViewedFiles);
835
export const InlineEditsXtabRecentlyViewedClippingStrategy = defineTeamInternalSetting<xtabPromptOptions.RecentFileClippingStrategy>('chat.advanced.inlineEdits.xtabProvider.recentlyViewedDocuments.clippingStrategy', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.recentlyViewedDocuments.clippingStrategy, xtabPromptOptions.RecentFileClippingStrategy.VALIDATOR);
836
export const InlineEditsXtabPageSize = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.pageSize', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.pagedClipping.pageSize);
837
export const InlineEditsXtabEditWindowMaxTokens = defineTeamInternalSetting<number | undefined>('chat.advanced.inlineEdits.xtabProvider.editWindowMaxTokens', ConfigType.ExperimentBased, 2000);
838
export const InlineEditsXtabIncludeTagsInCurrentFile = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.includeTagsInCurrentFile', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.currentFile.includeTags);
839
export const InlineEditsXtabIncludeLineNumbersInCurrentFile = defineTeamInternalSetting<xtabPromptOptions.IncludeLineNumbersOption>('chat.advanced.inlineEdits.xtabProvider.includeLineNumbersInCurrentFile', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.currentFile.includeLineNumbers);
840
export const InlineEditsXtabIncludeCursorTagInCurrentFile = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.includeCursorTagInCurrentFile', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.currentFile.includeCursorTag);
841
export const InlineEditsXtabCurrentFileMaxTokens = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.currentFileMaxTokens', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.currentFile.maxTokens);
842
export const InlineEditsXtabPrioritizeAboveCursor = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.currentFile.prioritizeAboveCursor', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.currentFile.prioritizeAboveCursor);
843
export const InlineEditsXtabDiffOnlyForDocsInPrompt = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.diffOnlyForDocsInPrompt', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.diffHistory.onlyForDocsInPrompt);
844
export const InlineEditsXtabDiffUseRelativePaths = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.diffUseRelativePaths', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.diffHistory.useRelativePaths);
845
export const InlineEditsXtabNNonSignificantLinesToConverge = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.nNonSignificantLinesToConverge', ConfigType.ExperimentBased, ResponseProcessor.DEFAULT_DIFF_PARAMS.nLinesToConverge);
846
export const InlineEditsXtabNSignificantLinesToConverge = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.nSignificantLinesToConverge', ConfigType.ExperimentBased, ResponseProcessor.DEFAULT_DIFF_PARAMS.nSignificantLinesToConverge);
847
export const InlineEditsXtabEarlyCursorLineDivergenceCancellation = defineTeamInternalSetting<EarlyDivergenceCancellationMode>('chat.advanced.inlineEdits.xtabProvider.earlyCursorLineDivergenceCancellation', ConfigType.ExperimentBased, EarlyDivergenceCancellationMode.Off, EarlyDivergenceCancellationMode.VALIDATOR);
848
export const InlineEditsXtabLanguageContextEnabled = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.languageContext.enabled', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.languageContext.enabled);
849
export const InlineEditsXtabLanguageContextMaxTokens = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.languageContext.maxTokens', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.languageContext.maxTokens);
850
export const InlineEditsXtabIncludeNeighborFiles = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.neighborFiles.enabled', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.neighborFiles.enabled);
851
export const InlineEditsXtabNeighborFilesMaxTokens = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.xtabProvider.neighborFiles.maxTokens', ConfigType.ExperimentBased, xtabPromptOptions.DEFAULT_OPTIONS.neighborFiles.maxTokens);
852
export const InlineEditsXtabMaxMergeConflictLines = defineTeamInternalSetting<number | undefined>('chat.advanced.inlineEdits.xtabProvider.maxMergeConflictLines', ConfigType.ExperimentBased, undefined);
853
export const InlineEditsXtabOnlyMergeConflictLines = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.xtabProvider.onlyMergeConflictLines', ConfigType.ExperimentBased, false);
854
export const InlineEditsXtabAggressivenessLevel = defineTeamInternalSetting<xtabPromptOptions.AggressivenessLevel | undefined>('chat.advanced.inlineEdits.xtabProvider.aggressivenessLevel', ConfigType.ExperimentBased, undefined);
855
export const InlineEditsAggressivenessLowMinResponseTimeMs = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.aggressiveness.lowMinResponseTimeMs', ConfigType.ExperimentBased, 1500);
856
export const InlineEditsAggressivenessMediumMinResponseTimeMs = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.aggressiveness.mediumMinResponseTimeMs', ConfigType.ExperimentBased, 700);
857
export const InlineEditsAggressivenessHighDebounceMs = defineTeamInternalSetting<number>('chat.advanced.inlineEdits.aggressiveness.highDebounceMs', ConfigType.ExperimentBased, 0);
858
export const InlineEditsUserHappinessScoreConfigurationString = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineEdits.adaptiveAggressivenessConfigurationString', ConfigType.ExperimentBased, undefined);
859
export const InlineEditsUndoInsertionFiltering = defineTeamInternalSetting<'v1' | 'v2' | undefined>('chat.advanced.inlineEdits.undoInsertionFiltering', ConfigType.ExperimentBased, 'v1');
860
export const InlineEditsFilterOutEditsWithSubstrings = defineTeamInternalSetting<string>('chat.advanced.inlineEdits.filterOutEditsWithSubstrings', ConfigType.ExperimentBased, '<|current_file_content|>,<|/current_file_content|>,<|diff_marker|>');
861
export const InlineEditsAllowImportChanges = defineTeamInternalSetting<ImportChanges>('chat.advanced.inlineEdits.allowImportChanges', ConfigType.ExperimentBased, ImportChanges.None, ImportChanges.VALIDATOR);
862
export const InlineEditsIgnoreWhenSuggestVisible = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.ignoreWhenSuggestVisible', ConfigType.ExperimentBased, true);
863
export const InlineEditsJointCompletionsProviderEnabled = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.jointCompletionsProvider.enabled', ConfigType.ExperimentBased, false);
864
export const InlineEditsJointCompletionsProviderStrategy = defineTeamInternalSetting<JointCompletionsProviderStrategy>('chat.advanced.inlineEdits.jointCompletionsProvider.strategy', ConfigType.ExperimentBased, JointCompletionsProviderStrategy.Regular);
865
export const InlineEditsJointCompletionsProviderTriggerChangeStrategy = defineTeamInternalSetting<JointCompletionsProviderTriggerChangeStrategy>('chat.advanced.inlineEdits.jointCompletionsProvider.triggerChangeStrategy', ConfigType.ExperimentBased, JointCompletionsProviderTriggerChangeStrategy.NoTriggerOnCompletionsRequestInFlight);
866
export const InstantApplyModelName = defineTeamInternalSetting<string>('chat.advanced.instantApply.modelName', ConfigType.ExperimentBased, CHAT_MODEL.GPT4OPROXY);
867
export const VerifyTextDocumentChanges = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.verifyTextDocumentChanges', ConfigType.ExperimentBased, false);
868
export const UseAutoModeRouting = defineTeamInternalSetting<boolean>('chat.advanced.useAutoModeRouter', ConfigType.ExperimentBased, false);
869
/** Controls which `routing_method` value is sent to the auto-intent-service per request
870
* when `UseAutoModeRouting` is enabled.
871
* '' (empty/default) = omit `routing_method` and use the server default.
872
* 'binary' = binary classifier v1.
873
* 'hydra' = HYDRA multi-head capability matching.
874
* For experiments, this setting selects the routing method only when router usage is enabled;
875
* it does not by itself determine whether the router is called. */
876
export const AutoModeRoutingMethod = defineTeamInternalSetting<string>('chat.advanced.autoModeRoutingMethod', ConfigType.ExperimentBased, '', undefined, undefined, { experimentName: 'copilotchat.autoModeRoutingMethod' });
877
878
/** Inline Completions */
879
export const InlineCompletionsDefaultDiagnosticsOptions = defineTeamInternalSetting<string | undefined>('chat.advanced.inlineCompletions.defaultDiagnosticsOptionsString', ConfigType.ExperimentBased, undefined);
880
export const RecordExpectedEditEnabled = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.recordExpectedEdit.enabled', ConfigType.Simple, false);
881
export const RecordExpectedEditOnReject = defineTeamInternalSetting<boolean>('chat.advanced.inlineEdits.recordExpectedEdit.onReject', ConfigType.Simple, false);
882
883
export const ReadFileCodeFences = defineTeamInternalSetting<boolean>('chat.advanced.readFileCodeFences', ConfigType.ExperimentBased, false);
884
885
// TODO: @sandy081 - These should be moved away from this namespace
886
export const EnableReadFileV2 = defineSetting<boolean>('chat.advanced.enableReadFileV2', ConfigType.ExperimentBased, false);
887
export const AskAgent = defineSetting<boolean>('chat.advanced.enableAskAgent', ConfigType.ExperimentBased, false);
888
export const RetryNetworkErrors = defineSetting<boolean>('chat.advanced.enableRetryNetworkErrors', ConfigType.ExperimentBased, true);
889
export const RetryServerErrorStatusCodes = defineSetting<string>('chat.advanced.retryServerErrorStatusCodes', ConfigType.ExperimentBased, '500,502');
890
export const FallbackNodeFetchOnNetworkProcessCrash = defineSetting<boolean>('chat.advanced.enableFallbackNodeFetchOnNetworkProcessCrash', ConfigType.ExperimentBased, true);
891
export const ChatRequestPowerSaveBlocker = defineTeamInternalSetting<boolean>('chat.advanced.chatRequestPowerSaveBlocker', ConfigType.ExperimentBased, true);
892
/** Enable WebSocket transport for Responses API requests. When enabled, uses a persistent WebSocket connection per conversation instead of individual HTTP requests. */
893
export const ResponsesApiWebSocketEnabled = defineTeamInternalSetting<boolean>('chat.advanced.responsesApi.webSocket.enabled', ConfigType.ExperimentBased, true);
894
export const DebugSimulateWebSocketResponse = defineTeamInternalSetting<string>('chat.advanced.debug.simulateWebSocketResponse', ConfigType.Simple, '');
895
896
/** Enable cloud sync of session data to cloud. */
897
export const SessionSearchCloudSyncEnabled = defineTeamInternalSetting<boolean>('chat.advanced.sessionSearch.cloudSync.enabled', ConfigType.Simple, false, vBoolean());
898
/** Repository patterns to exclude from cloud sync (exact owner/repo or glob patterns like my-org/*). */
899
export const SessionSearchCloudSyncExcludeRepositories = defineTeamInternalSetting<string[]>('chat.advanced.sessionSearch.cloudSync.excludeRepositories', ConfigType.Simple, []);
900
}
901
902
/**
903
* Deprecated settings that are no longer in use.
904
*/
905
export namespace Deprecated {
906
/** Model override for Plan agent — migrated to core `chat.planAgent.defaultModel` */
907
export const PlanAgentModel = defineSetting<string>('chat.planAgent.model', ConfigType.Simple, '');
908
export const OllamaEndpoint = defineSetting<string>('chat.byok.ollamaEndpoint', ConfigType.Simple, 'http://localhost:11434');
909
export const AzureModels = defineSetting<Record<string, { name: string; url: string; toolCalling: boolean; vision: boolean; maxInputTokens: number; maxOutputTokens: number; requiresAPIKey?: boolean; thinking?: boolean; streaming?: boolean; zeroDataRetentionEnabled?: boolean }>>('chat.azureModels', ConfigType.Simple, {});
910
export const CustomOAIModels = defineSetting<Record<string, { name: string; url: string; toolCalling: boolean; vision: boolean; maxInputTokens: number; maxOutputTokens: number; requiresAPIKey?: boolean; thinking?: boolean; streaming?: boolean; requestHeaders?: Record<string, string>; zeroDataRetentionEnabled?: boolean }>>('chat.customOAIModels', ConfigType.Simple, {});
911
export const AzureAuthType = defineSetting<AzureAuthMode>('chat.azureAuthType', ConfigType.Simple, AzureAuthMode.EntraId);
912
}
913
914
export const Enable = defineSetting<{ [key: string]: boolean }>('enable', ConfigType.Simple, {
915
'*': true,
916
'plaintext': false,
917
'markdown': false,
918
'scminput': false
919
});
920
export const selectedCompletionsModel = defineSetting<string>('selectedCompletionModel', ConfigType.Simple, '');
921
922
export const RateLimitAutoSwitchToAuto = defineSetting<boolean>('chat.rateLimitAutoSwitchToAuto', ConfigType.Simple, false, vBoolean());
923
924
/** Use the Messages API instead of Chat Completions when supported */
925
export const UseAnthropicMessagesApi = defineSetting<boolean | undefined>('chat.anthropic.useMessagesApi', ConfigType.ExperimentBased, true);
926
/** Use "last two messages" cache breakpoint strategy instead of heuristic-based placement */
927
export const AnthropicCacheBreakpointsLastTwoMessages = defineSetting<boolean>('chat.anthropic.cacheBreakpoints.lastTwoMessages', ConfigType.ExperimentBased, false);
928
/** Context editing mode for Anthropic Messages API. 'off' disables context editing. */
929
export const AnthropicContextEditingMode = defineSetting<'off' | 'clear-thinking' | 'clear-tooluse' | 'clear-both'>('chat.anthropic.contextEditing.mode', ConfigType.ExperimentBased, 'off');
930
/** Configure reasoning summary style sent to Responses API */
931
export const ResponsesApiReasoningSummary = defineSetting<'off' | 'detailed'>('chat.responsesApiReasoningSummary', ConfigType.ExperimentBased, 'detailed');
932
/** Enable context_management sent to Responses API */
933
export const ResponsesApiContextManagementEnabled = defineSetting<boolean>('chat.responsesApiContextManagement.enabled', ConfigType.ExperimentBased, false);
934
/** Enable client-side prompt_cache_key (conversationId:modelFamily) sent to Responses API */
935
export const ResponsesApiPromptCacheKeyEnabled = defineSetting<boolean>('chat.responsesApi.promptCacheKey.enabled', ConfigType.ExperimentBased, false);
936
/** Enable tool search for Responses API (client-side deferred tool loading). */
937
export const ResponsesApiToolSearchEnabled = defineSetting<boolean>('chat.responsesApi.toolSearchTool.enabled', ConfigType.ExperimentBased, false);
938
/** Enable updated prompt for 5.3Codex model */
939
export const Updated53CodexPromptEnabled = defineSetting<boolean>('chat.updated53CodexPrompt.enabled', ConfigType.ExperimentBased, true);
940
/** Enable concise prompt experiment for GPT-5.4 model */
941
export const EnableGpt54ConcisePromptExp = defineSetting<boolean>('chat.gpt54ConcisePrompt.enabled', ConfigType.ExperimentBased, false);
942
/** Enable large prompt experiment for GPT-5.4 model */
943
export const EnableGpt54LargePromptExp = defineSetting<boolean>('chat.gpt54LargePrompt.enabled', ConfigType.ExperimentBased, false);
944
export const EnableChatImageUpload = defineSetting<boolean>('chat.imageUpload.enabled', ConfigType.ExperimentBased, true);
945
/** Enable Anthropic web search tool for BYOK Claude models */
946
export const AnthropicWebSearchToolEnabled = defineSetting<boolean>('chat.anthropic.tools.websearch.enabled', ConfigType.ExperimentBased, false);
947
/** Maximum number of web searches allowed per request */
948
export const AnthropicWebSearchMaxUses = defineSetting<number>('chat.anthropic.tools.websearch.maxUses', ConfigType.Simple, 5);
949
/** List of domains to restrict web search results to */
950
export const AnthropicWebSearchAllowedDomains = defineSetting<string[]>('chat.anthropic.tools.websearch.allowedDomains', ConfigType.Simple, []);
951
/** List of domains to exclude from web search results */
952
export const AnthropicWebSearchBlockedDomains = defineSetting<string[]>('chat.anthropic.tools.websearch.blockedDomains', ConfigType.Simple, []);
953
/** User location for personalizing web search results */
954
export const AnthropicWebSearchUserLocation = defineSetting<{
955
city?: string;
956
region?: string;
957
country?: string;
958
timezone?: string;
959
} | null>('chat.anthropic.tools.websearch.userLocation', ConfigType.Simple, null);
960
961
/** User provided code generation instructions for the chat */
962
export const CodeGenerationInstructions = defineSetting('chat.codeGeneration.instructions', ConfigType.Simple, [] as CodeGenerationInstruction[]);
963
export const TestGenerationInstructions = defineSetting('chat.testGeneration.instructions', ConfigType.Simple, [] as CodeGenerationInstruction[]);
964
export const CommitMessageGenerationInstructions = defineSetting('chat.commitMessageGeneration.instructions', ConfigType.Simple, [] as CommitMessageGenerationInstruction[]);
965
export const PullRequestDescriptionGenerationInstructions = defineSetting('chat.pullRequestDescriptionGeneration.instructions', ConfigType.Simple, [] as CommitMessageGenerationInstruction[]);
966
/** Whether new flows around setting up tests are enabled */
967
export const SetupTests = defineSetting<boolean>('chat.setupTests.enabled', ConfigType.Simple, true);
968
/** Whether the Copilot TypeScript context provider is enabled and if how */
969
export const TypeScriptLanguageContext = defineSetting<boolean>('chat.languageContext.typescript.enabled', ConfigType.ExperimentBased, true);
970
export const TypeScriptLanguageContextMode = defineSetting<'minimal' | 'double' | 'fillHalf' | 'fill'>('chat.languageContext.typescript.items', ConfigType.ExperimentBased, 'double');
971
export const TypeScriptLanguageContextIncludeDocumentation = defineSetting<boolean>('chat.languageContext.typescript.includeDocumentation', ConfigType.ExperimentBased, false);
972
export const TypeScriptLanguageContextCacheTimeout = defineSetting<number>('chat.languageContext.typescript.cacheTimeout', ConfigType.ExperimentBased, 500);
973
export const TypeScriptLanguageContextFix = defineSetting<boolean>('chat.languageContext.fix.typescript.enabled', ConfigType.ExperimentBased, false);
974
export const TypeScriptLanguageContextInline = defineSetting<boolean>('chat.languageContext.inline.typescript.enabled', ConfigType.ExperimentBased, false);
975
976
export const UseInstructionFiles = defineSetting('chat.codeGeneration.useInstructionFiles', ConfigType.Simple, true);
977
export const ReviewAgent = defineSetting('chat.reviewAgent.enabled', ConfigType.Simple, true);
978
export const CodeFeedback = defineSetting('chat.reviewSelection.enabled', ConfigType.Simple, true);
979
export const CodeFeedbackInstructions = defineSetting('chat.reviewSelection.instructions', ConfigType.Simple, [] as CodeGenerationInstruction[]);
980
981
export const UseProjectTemplates = defineSetting('chat.useProjectTemplates', ConfigType.Simple, true);
982
export const ExplainScopeSelection = defineSetting('chat.scopeSelection', ConfigType.Simple, false);
983
export const EnableCodeActions = defineSetting('editor.enableCodeActions', ConfigType.Simple, true);
984
export const LocaleOverride = defineSetting('chat.localeOverride', ConfigType.Simple, 'auto');
985
export const TerminalChatLocation = defineSetting('chat.terminalChatLocation', ConfigType.Simple, 'chatView');
986
export const AutomaticRenameSuggestions = defineSetting('renameSuggestions.triggerAutomatically', ConfigType.Simple, true);
987
export const TerminalToDebuggerEnabled = defineSetting('chat.copilotDebugCommand.enabled', ConfigType.Simple, true);
988
export const CodeSearchAgentEnabled = defineSetting<boolean>('chat.codesearch.enabled', ConfigType.Simple, false);
989
export const ClaudeAgentEnabled = defineSetting<boolean>('chat.claudeAgent.enabled', ConfigType.Simple, true);
990
export const ClaudeAgentAllowDangerouslySkipPermissions = defineSetting<boolean>('chat.claudeAgent.allowDangerouslySkipPermissions', ConfigType.Simple, false);
991
export const InlineEditsEnabled = defineSetting<boolean>('nextEditSuggestions.enabled', ConfigType.ExperimentBased, true);
992
export const InlineEditsEnableDiagnosticsProvider = defineSetting<boolean>('nextEditSuggestions.fixes', ConfigType.ExperimentBased, true);
993
export const InlineEditsAllowWhitespaceOnlyChanges = defineSetting<boolean>('nextEditSuggestions.allowWhitespaceOnlyChanges', ConfigType.ExperimentBased, true);
994
/** Because of migration the value returned may be `boolean | "onlyWithEdit" | "jump" | undefined` */
995
export const InlineEditsNextCursorPredictionEnabled = defineSetting<boolean>('nextEditSuggestions.extendedRange', ConfigType.ExperimentBased, false, undefined, { oldKey: 'chat.advanced.inlineEdits.nextCursorPrediction.enabled' });
996
export const NewWorkspaceCreationAgentEnabled = defineSetting<boolean>('chat.newWorkspaceCreation.enabled', ConfigType.Simple, true);
997
export const NewWorkspaceUseContext7 = defineSetting<boolean>('chat.newWorkspace.useContext7', ConfigType.Simple, false);
998
export const SummarizeAgentConversationHistory = defineSetting<boolean>('chat.summarizeAgentConversationHistory.enabled', ConfigType.Simple, true);
999
export const VirtualToolThreshold = defineSetting<number>('chat.virtualTools.threshold', ConfigType.ExperimentBased, HARD_TOOL_LIMIT);
1000
export const CurrentEditorAgentContext = defineSetting<boolean>('chat.agent.currentEditorContext.enabled', ConfigType.Simple, true);
1001
/** BYOK */
1002
export const AutoFixDiagnostics = defineSetting<boolean>('chat.agent.autoFix', ConfigType.ExperimentBased, false);
1003
export const NotebookFollowCellExecution = defineSetting<boolean>('chat.notebook.followCellExecution.enabled', ConfigType.Simple, false);
1004
export const UseAlternativeNESNotebookFormat = defineSetting<boolean>('chat.notebook.enhancedNextEditSuggestions.enabled', ConfigType.ExperimentBased, false);
1005
export const CustomInstructionsInSystemMessage = defineSetting<boolean>('chat.customInstructionsInSystemMessage', ConfigType.Simple, true);
1006
1007
export const EnableAlternateGptPrompt = defineSetting<boolean>('chat.alternateGptPrompt.enabled', ConfigType.ExperimentBased, false);
1008
export const EnableAlternateGeminiModelFPrompt = defineSetting<boolean>('chat.alternateGeminiModelFPrompt.enabled', ConfigType.ExperimentBased, false);
1009
1010
export const EnableOrganizationCustomAgents = defineSetting<boolean>('chat.organizationCustomAgents.enabled', ConfigType.Simple, true);
1011
export const EnableOrganizationInstructions = defineSetting<boolean>('chat.organizationInstructions.enabled', ConfigType.Simple, true);
1012
1013
export const CompletionsFetcher = defineSetting<FetcherId | undefined>('chat.completionsFetcher', ConfigType.ExperimentBased, undefined);
1014
export const NextEditSuggestionsFetcher = defineSetting<FetcherId | undefined>('chat.nesFetcher', ConfigType.ExperimentBased, undefined);
1015
1016
export const GitHubMcpEnabled = defineSetting<boolean>('chat.githubMcpServer.enabled', ConfigType.ExperimentBased, false);
1017
export const GitHubMcpToolsets = defineSetting<string[]>('chat.githubMcpServer.toolsets', ConfigType.Simple, ['default']);
1018
export const GitHubMcpReadonly = defineSetting<boolean>('chat.githubMcpServer.readonly', ConfigType.Simple, false);
1019
export const GitHubMcpLockdown = defineSetting<boolean>('chat.githubMcpServer.lockdown', ConfigType.Simple, false);
1020
export type GitHubMcpChannelValue = 'stable' | 'insiders';
1021
export const GitHubMcpChannel = defineSetting<GitHubMcpChannelValue>('chat.githubMcpServer.channel', ConfigType.Simple, 'stable');
1022
1023
export const GetSearchResultsViewSkill = defineSetting<boolean>('chat.getSearchViewResultsSkill.enabled', ConfigType.ExperimentBased, false);
1024
1025
export const BackgroundAgentEnabled = defineSetting<boolean>('chat.backgroundAgent.enabled', ConfigType.Simple, true);
1026
export const CloudAgentEnabled = defineSetting<boolean>('chat.cloudAgent.enabled', ConfigType.Simple, true);
1027
export const AdditionalReadAccessPaths = defineSetting<string[]>('chat.additionalReadAccessPaths', ConfigType.Simple, []);
1028
export const SwitchAgentEnabled = defineSetting<boolean>('chat.switchAgent.enabled', ConfigType.ExperimentBased, false);
1029
1030
/** Additional tools to enable for the Plan agent (additive to base tools) */
1031
export const PlanAgentAdditionalTools = defineSetting<string[]>('chat.planAgent.additionalTools', ConfigType.Simple, []);
1032
1033
/** Model override for Implement agent (empty = use default) */
1034
export const ImplementAgentModel = defineSetting<string>('chat.implementAgent.model', ConfigType.Simple, '');
1035
1036
/** Additional tools to enable for the Ask agent (additive to base tools) */
1037
export const AskAgentAdditionalTools = defineSetting<string[]>('chat.askAgent.additionalTools', ConfigType.Simple, []);
1038
/** Model override for Ask agent (empty = use default) */
1039
export const AskAgentModel = defineSetting<string>('chat.askAgent.model', ConfigType.Simple, '');
1040
1041
/** Whether the Explore (Code Research) subagent is enabled */
1042
export const ExploreAgentEnabled = defineSetting<boolean>('chat.exploreAgent.enabled', ConfigType.ExperimentBased, true);
1043
/** Model override for Explore (Code Research) agent — reads from core `chat.exploreAgent.defaultModel` */
1044
export const ExploreAgentModel = defineSetting<string>('chat.exploreAgent.model', ConfigType.Simple, '');
1045
1046
export const CopilotMemoryEnabled = defineSetting<boolean>('chat.copilotMemory.enabled', ConfigType.ExperimentBased, false);
1047
export const MemoryToolEnabled = defineSetting<boolean>('chat.tools.memory.enabled', ConfigType.ExperimentBased, true);
1048
export const ViewImageToolEnabled = defineSetting<boolean>('chat.tools.viewImage.enabled', ConfigType.ExperimentBased, true);
1049
1050
/** Enable local session search index — tracks sessions locally and enables chronicle commands.*/
1051
export const LocalIndexEnabled = defineSetting<boolean>('chat.localIndex.enabled', ConfigType.ExperimentBased, false);
1052
}
1053
1054
export function getAllConfigKeys(): string[] {
1055
return Object.values(ConfigKey).flatMap(namespace =>
1056
Object.values(namespace).map(setting => setting.fullyQualifiedId)
1057
);
1058
}
1059
1060
const nextEditProviderIds: string[] = [];
1061
export function registerNextEditProviderId(providerId: string): string {
1062
nextEditProviderIds.push(providerId);
1063
return providerId;
1064
}
1065
1066