Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/sessions/contrib/agentHost/browser/agentHostSettingsFileSystemProvider.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 { IJSONSchema } from '../../../../base/common/jsonSchema.js';
7
import { IDisposable } from '../../../../base/common/lifecycle.js';
8
import { URI } from '../../../../base/common/uri.js';
9
import { localize } from '../../../../nls.js';
10
import { ILogService } from '../../../../platform/log/common/log.js';
11
import { RootConfigState } from '../../../../platform/agentHost/common/state/protocol/state.js';
12
import { IAgentHostSessionsProvider } from '../../../common/agentHostSessionsProvider.js';
13
import { ISessionsProvidersService } from '../../../services/sessions/browser/sessionsProvidersService.js';
14
import {
15
AbstractAgentHostConfigFileSystemProvider,
16
AbstractAgentHostConfigSchemaRegistrar,
17
AgentHostConfigPropertyFilter,
18
buildAgentHostConfigJsonSchema,
19
IAgentHostConfigLike,
20
IAgentHostSettingsContext,
21
IAgentHostSettingsLocale,
22
serializeAgentHostConfigDocument,
23
} from './agentHostSettingsShared.js';
24
25
/** Scheme for the synthetic agent-host settings files. */
26
export const AGENT_HOST_SETTINGS_SCHEME = 'agent-host-settings';
27
28
/**
29
* Build the URI used to open the settings file for an agent host provider.
30
*
31
* URI shape: `agent-host-settings://{providerId}/settings.jsonc`
32
*/
33
export function agentHostSettingsUri(providerId: string): URI {
34
return URI.from({
35
scheme: AGENT_HOST_SETTINGS_SCHEME,
36
authority: providerId,
37
path: `/settings.jsonc`,
38
});
39
}
40
41
function parseHostSettingsUri(uri: URI): IAgentHostSettingsContext | undefined {
42
if (uri.scheme !== AGENT_HOST_SETTINGS_SCHEME) {
43
return undefined;
44
}
45
const providerId = uri.authority;
46
if (!providerId) {
47
return undefined;
48
}
49
return { providerId };
50
}
51
52
/** Root (agent host) config exposes no per-property mutability flags — all props are editable. */
53
const hostSettingsPropertyFilter: AgentHostConfigPropertyFilter = () => true;
54
55
const hostSettingsLocale: IAgentHostSettingsLocale = {
56
get header() { return localize('agentHostSettings.header', "Agent host settings."); },
57
get saveHint() { return localize('agentHostSettings.saveHint', "Edit values below and save to apply. Unknown properties are ignored."); },
58
get parseError() { return localize('agentHostSettings.parseError', "Failed to parse agent host settings as JSON."); },
59
get notObject() { return localize('agentHostSettings.notObject', "Agent host settings must be a JSON object."); },
60
};
61
62
/**
63
* Serialize the root config values for an agent host provider into a
64
* commented, pretty-printed JSON document.
65
*/
66
export function serializeHostSettings(provider: IAgentHostSessionsProvider): string {
67
return serializeAgentHostConfigDocument(provider.getRootConfig(), hostSettingsPropertyFilter, hostSettingsLocale);
68
}
69
70
/**
71
* Build a JSON schema describing the root config of an agent host provider.
72
*/
73
export function buildHostSettingsJsonSchema(config: RootConfigState): IJSONSchema {
74
return buildAgentHostConfigJsonSchema(config, hostSettingsPropertyFilter);
75
}
76
77
/**
78
* Filesystem provider serving synthetic JSONC documents representing the
79
* root (agent host) configuration values of agent-host providers.
80
*/
81
export class AgentHostSettingsFileSystemProvider extends AbstractAgentHostConfigFileSystemProvider<IAgentHostSettingsContext> {
82
83
protected readonly _schemeLabel = AGENT_HOST_SETTINGS_SCHEME;
84
protected readonly _traceTag = 'AgentHostSettings';
85
protected readonly _locale = hostSettingsLocale;
86
87
constructor(
88
private readonly _schemaRegistrar: AgentHostSettingsSchemaRegistrar,
89
@ISessionsProvidersService sessionsProvidersService: ISessionsProvidersService,
90
@ILogService logService: ILogService,
91
) {
92
super(sessionsProvidersService, logService);
93
}
94
95
protected _parseUri(resource: URI): IAgentHostSettingsContext | undefined {
96
return parseHostSettingsUri(resource);
97
}
98
99
protected _serialize(provider: IAgentHostSessionsProvider): string {
100
return serializeHostSettings(provider);
101
}
102
103
protected _watchChanges(provider: IAgentHostSessionsProvider, _ctx: IAgentHostSettingsContext, fire: () => void): IDisposable {
104
return provider.onDidChangeRootConfig(() => fire());
105
}
106
107
protected _ensureSchemaRegistered(provider: IAgentHostSessionsProvider): void {
108
this._schemaRegistrar.ensureRegistered(provider, provider);
109
}
110
111
protected _hasConfig(provider: IAgentHostSessionsProvider): boolean {
112
return provider.getRootConfig() !== undefined;
113
}
114
115
protected _replaceConfig(provider: IAgentHostSessionsProvider, _ctx: IAgentHostSettingsContext, values: Record<string, unknown>): Promise<void> {
116
return provider.replaceRootConfig(values);
117
}
118
119
protected _describeForTrace(ctx: IAgentHostSettingsContext): string {
120
return `provider ${ctx.providerId}`;
121
}
122
}
123
124
/**
125
* Keeps per-provider JSON schemas registered so editors of the synthetic
126
* `agent-host-settings://…` files get completions, hover, and validation.
127
*/
128
export class AgentHostSettingsSchemaRegistrar extends AbstractAgentHostConfigSchemaRegistrar<IAgentHostSessionsProvider> {
129
130
protected _propertyFilter(): AgentHostConfigPropertyFilter {
131
return hostSettingsPropertyFilter;
132
}
133
134
protected _settingsUri(provider: IAgentHostSessionsProvider): string {
135
return agentHostSettingsUri(provider.id).toString();
136
}
137
138
protected _schemaId(provider: IAgentHostSessionsProvider): string {
139
return `vscode://schemas/agent-host-settings/${provider.id}.jsonc`;
140
}
141
142
protected _getConfig(_provider: IAgentHostSessionsProvider, target: IAgentHostSessionsProvider): IAgentHostConfigLike | undefined {
143
return target.getRootConfig();
144
}
145
146
protected _targetsForProvider(provider: IAgentHostSessionsProvider): readonly IAgentHostSessionsProvider[] {
147
return [provider];
148
}
149
150
protected _observeProvider(
151
provider: IAgentHostSessionsProvider,
152
onChanged: (target: IAgentHostSessionsProvider) => void,
153
_onRemoved: (target: IAgentHostSessionsProvider) => void,
154
): IDisposable {
155
return provider.onDidChangeRootConfig(() => onChanged(provider));
156
}
157
}
158
159