Skip to content

Commit b257d47

Browse files
fix NESProvider in chat-lib with an alternative to requiring a full IVSCodeExtensionContext
1 parent 2d76af0 commit b257d47

File tree

4 files changed

+80
-55
lines changed

4 files changed

+80
-55
lines changed

src/extension/extension/vscode/services.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import { GitServiceImpl } from '../../../platform/git/vscode/gitServiceImpl';
4141
import { IOctoKitService } from '../../../platform/github/common/githubService';
4242
import { NullBaseOctoKitService } from '../../../platform/github/common/nullOctokitServiceImpl';
4343
import { OctoKitService } from '../../../platform/github/common/octoKitServiceImpl';
44+
import { IUndesiredModelsManager, UndesiredModels } from '../../../platform/inlineEdits/common/inlineEditsModelService';
4445
import { IInteractiveSessionService } from '../../../platform/interactive/common/interactiveSessionService';
4546
import { InteractiveSessionServiceImpl } from '../../../platform/interactive/vscode/interactiveSessionServiceImpl';
4647
import { ILanguageDiagnosticsService } from '../../../platform/languages/common/languageDiagnosticsService';
@@ -173,4 +174,5 @@ export function registerServices(builder: IInstantiationServiceBuilder, extensio
173174
builder.define(IToolGroupingCache, new SyncDescriptor(ToolGroupingCache));
174175
builder.define(IMergeConflictService, new SyncDescriptor(MergeConflictServiceImpl));
175176
builder.define(IEditToolLearningService, new SyncDescriptor(EditToolLearningService));
177+
builder.define(IUndesiredModelsManager, new SyncDescriptor(UndesiredModels.Manager));
176178
}

src/lib/node/chatLibMain.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ import { NullGitExtensionService } from '../../platform/git/common/nullGitExtens
8080
import { IIgnoreService, NullIgnoreService } from '../../platform/ignore/common/ignoreService';
8181
import { DocumentId } from '../../platform/inlineEdits/common/dataTypes/documentId';
8282
import { InlineEditRequestLogContext } from '../../platform/inlineEdits/common/inlineEditLogContext';
83-
import { IInlineEditsModelService } from '../../platform/inlineEdits/common/inlineEditsModelService';
83+
import { IInlineEditsModelService, IUndesiredModelsManager, NullUndesiredModelsManager } from '../../platform/inlineEdits/common/inlineEditsModelService';
8484
import { ObservableGit } from '../../platform/inlineEdits/common/observableGit';
8585
import { IObservableDocument, ObservableWorkspace } from '../../platform/inlineEdits/common/observableWorkspace';
8686
import { NesHistoryContextProvider } from '../../platform/inlineEdits/common/workspaceEditTracker/nesHistoryContextProvider';
@@ -175,6 +175,7 @@ export interface INESProviderOptions {
175175
* INESProvider.updateTreatmentVariables() must be called to unblock.
176176
*/
177177
readonly waitForTreatmentVariables?: boolean;
178+
readonly undesiredModelsManager?: IUndesiredModelsManager;
178179
}
179180

180181
export interface INESResult {
@@ -373,6 +374,7 @@ function setupServices(options: INESProviderOptions) {
373374
});
374375
builder.define(IProxyModelsService, new SyncDescriptor(ProxyModelsService));
375376
builder.define(IInlineEditsModelService, new SyncDescriptor(InlineEditsModelService));
377+
builder.define(IUndesiredModelsManager, options.undesiredModelsManager || new SyncDescriptor(NullUndesiredModelsManager));
376378
return builder.seal();
377379
}
378380

src/platform/inlineEdits/common/inlineEditsModelService.ts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import type * as vscode from 'vscode';
77
import { createServiceIdentifier } from '../../../util/common/services';
88
import { Event } from '../../../util/vs/base/common/event';
9+
import { IVSCodeExtensionContext } from '../../extContext/common/extensionContext';
910
import { ModelConfiguration } from './dataTypes/xtabPromptOptions';
1011

1112
export interface IInlineEditsModelService {
@@ -23,3 +24,75 @@ export interface IInlineEditsModelService {
2324
}
2425

2526
export const IInlineEditsModelService = createServiceIdentifier<IInlineEditsModelService>('IInlineEditsModelService');
27+
28+
export interface IUndesiredModelsManager {
29+
readonly _serviceBrand: undefined;
30+
isUndesiredModelId(modelId: string): boolean;
31+
addUndesiredModelId(modelId: string): Promise<void>;
32+
removeUndesiredModelId(modelId: string): Promise<void>;
33+
}
34+
35+
export const IUndesiredModelsManager = createServiceIdentifier<IUndesiredModelsManager>('IUndesiredModelsManager');
36+
37+
export namespace UndesiredModels {
38+
39+
const UNDESIRED_MODELS_KEY = 'copilot.chat.nextEdits.undesiredModelIds';
40+
type UndesiredModelsValue = string[];
41+
42+
export class Manager implements IUndesiredModelsManager {
43+
declare _serviceBrand: undefined;
44+
45+
constructor(
46+
@IVSCodeExtensionContext private readonly _vscodeExtensionContext: IVSCodeExtensionContext,
47+
) {
48+
}
49+
50+
isUndesiredModelId(modelId: string) {
51+
const models = this._getModels();
52+
return models.includes(modelId);
53+
}
54+
55+
addUndesiredModelId(modelId: string): Promise<void> {
56+
const models = this._getModels();
57+
if (!models.includes(modelId)) {
58+
models.push(modelId);
59+
return this._setModels(models);
60+
}
61+
return Promise.resolve();
62+
}
63+
64+
removeUndesiredModelId(modelId: string): Promise<void> {
65+
const models = this._getModels();
66+
const index = models.indexOf(modelId);
67+
if (index !== -1) {
68+
models.splice(index, 1);
69+
return this._setModels(models);
70+
}
71+
return Promise.resolve();
72+
}
73+
74+
private _getModels(): string[] {
75+
return this._vscodeExtensionContext.globalState.get<UndesiredModelsValue>(UNDESIRED_MODELS_KEY) ?? [];
76+
}
77+
78+
private _setModels(models: string[]): Promise<void> {
79+
return new Promise((resolve, reject) => {
80+
this._vscodeExtensionContext.globalState.update(UNDESIRED_MODELS_KEY, models).then(resolve, reject);
81+
});
82+
}
83+
}
84+
}
85+
86+
export class NullUndesiredModelsManager implements IUndesiredModelsManager {
87+
declare _serviceBrand: undefined;
88+
89+
isUndesiredModelId(_modelId: string): boolean {
90+
return false;
91+
}
92+
addUndesiredModelId(_modelId: string): Promise<void> {
93+
return Promise.resolve();
94+
}
95+
removeUndesiredModelId(_modelId: string): Promise<void> {
96+
return Promise.resolve();
97+
}
98+
}

src/platform/inlineEdits/node/inlineEditsModelService.ts

Lines changed: 2 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@ import { derived, IObservable, observableFromEvent } from '../../../util/vs/base
1515
import { CopilotToken } from '../../authentication/common/copilotToken';
1616
import { ICopilotTokenStore } from '../../authentication/common/copilotTokenStore';
1717
import { ConfigKey, ExperimentBasedConfig, IConfigurationService } from '../../configuration/common/configurationService';
18-
import { IVSCodeExtensionContext } from '../../extContext/common/extensionContext';
1918
import { ILogService } from '../../log/common/logService';
2019
import { IProxyModelsService } from '../../proxyModels/common/proxyModelsService';
2120
import { IExperimentationService } from '../../telemetry/common/nullExperimentationService';
2221
import { ITelemetryService } from '../../telemetry/common/telemetry';
2322
import { WireTypes } from '../common/dataTypes/inlineEditsModelsTypes';
2423
import { isPromptingStrategy, ModelConfiguration, PromptingStrategy } from '../common/dataTypes/xtabPromptOptions';
25-
import { IInlineEditsModelService } from '../common/inlineEditsModelService';
24+
import { IInlineEditsModelService, IUndesiredModelsManager } from '../common/inlineEditsModelService';
2625

2726
const enum ModelSource {
2827
LocalConfig = 'localConfig',
@@ -80,12 +79,10 @@ export class InlineEditsModelService extends Disposable implements IInlineEditsM
8079

8180
private _tracer = createTracer(['NES', 'ModelsService'], (msg) => this._logService.trace(msg));
8281

83-
private _undesiredModelsManager: UndesiredModels.Manager;
84-
8582
constructor(
8683
@ICopilotTokenStore private readonly _tokenStore: ICopilotTokenStore,
8784
@IProxyModelsService private readonly _proxyModelsService: IProxyModelsService,
88-
@IVSCodeExtensionContext private readonly _vscodeExtensionContext: IVSCodeExtensionContext,
85+
@IUndesiredModelsManager private readonly _undesiredModelsManager: IUndesiredModelsManager,
8986
@IConfigurationService private readonly _configService: IConfigurationService,
9087
@IExperimentationService private readonly _expService: IExperimentationService,
9188
@ITelemetryService private readonly _telemetryService: ITelemetryService,
@@ -95,8 +92,6 @@ export class InlineEditsModelService extends Disposable implements IInlineEditsM
9592

9693
const tracer = this._tracer.sub('constructor');
9794

98-
this._undesiredModelsManager = new UndesiredModels.Manager(this._vscodeExtensionContext);
99-
10095
this._modelsObs = derived((reader) => {
10196
tracer.trace('computing models');
10297
return this.aggregateModels({
@@ -392,50 +387,3 @@ export class InlineEditsModelService extends Disposable implements IInlineEditsM
392387
}
393388
}
394389

395-
namespace UndesiredModels {
396-
397-
const UNDESIRED_MODELS_KEY = 'copilot.chat.nextEdits.undesiredModelIds';
398-
type UndesiredModelsValue = string[];
399-
400-
export class Manager {
401-
402-
constructor(
403-
private readonly _vscodeExtensionContext: IVSCodeExtensionContext,
404-
) {
405-
}
406-
407-
isUndesiredModelId(modelId: string) {
408-
const models = this._getModels();
409-
return models.includes(modelId);
410-
}
411-
412-
addUndesiredModelId(modelId: string): Promise<void> {
413-
const models = this._getModels();
414-
if (!models.includes(modelId)) {
415-
models.push(modelId);
416-
return this._setModels(models);
417-
}
418-
return Promise.resolve();
419-
}
420-
421-
removeUndesiredModelId(modelId: string): Promise<void> {
422-
const models = this._getModels();
423-
const index = models.indexOf(modelId);
424-
if (index !== -1) {
425-
models.splice(index, 1);
426-
return this._setModels(models);
427-
}
428-
return Promise.resolve();
429-
}
430-
431-
private _getModels(): string[] {
432-
return this._vscodeExtensionContext.globalState.get<UndesiredModelsValue>(UNDESIRED_MODELS_KEY) ?? [];
433-
}
434-
435-
private _setModels(models: string[]): Promise<void> {
436-
return new Promise((resolve, reject) => {
437-
this._vscodeExtensionContext.globalState.update(UNDESIRED_MODELS_KEY, models).then(resolve, reject);
438-
});
439-
}
440-
}
441-
}

0 commit comments

Comments
 (0)