Path: blob/main/src/vs/sessions/contrib/agentHost/browser/agentHostSettingsFileSystemProvider.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { IJSONSchema } from '../../../../base/common/jsonSchema.js';6import { IDisposable } from '../../../../base/common/lifecycle.js';7import { URI } from '../../../../base/common/uri.js';8import { localize } from '../../../../nls.js';9import { ILogService } from '../../../../platform/log/common/log.js';10import { RootConfigState } from '../../../../platform/agentHost/common/state/protocol/state.js';11import { IAgentHostSessionsProvider } from '../../../common/agentHostSessionsProvider.js';12import { ISessionsProvidersService } from '../../../services/sessions/browser/sessionsProvidersService.js';13import {14AbstractAgentHostConfigFileSystemProvider,15AbstractAgentHostConfigSchemaRegistrar,16AgentHostConfigPropertyFilter,17buildAgentHostConfigJsonSchema,18IAgentHostConfigLike,19IAgentHostSettingsContext,20IAgentHostSettingsLocale,21serializeAgentHostConfigDocument,22} from './agentHostSettingsShared.js';2324/** Scheme for the synthetic agent-host settings files. */25export const AGENT_HOST_SETTINGS_SCHEME = 'agent-host-settings';2627/**28* Build the URI used to open the settings file for an agent host provider.29*30* URI shape: `agent-host-settings://{providerId}/settings.jsonc`31*/32export function agentHostSettingsUri(providerId: string): URI {33return URI.from({34scheme: AGENT_HOST_SETTINGS_SCHEME,35authority: providerId,36path: `/settings.jsonc`,37});38}3940function parseHostSettingsUri(uri: URI): IAgentHostSettingsContext | undefined {41if (uri.scheme !== AGENT_HOST_SETTINGS_SCHEME) {42return undefined;43}44const providerId = uri.authority;45if (!providerId) {46return undefined;47}48return { providerId };49}5051/** Root (agent host) config exposes no per-property mutability flags — all props are editable. */52const hostSettingsPropertyFilter: AgentHostConfigPropertyFilter = () => true;5354const hostSettingsLocale: IAgentHostSettingsLocale = {55get header() { return localize('agentHostSettings.header', "Agent host settings."); },56get saveHint() { return localize('agentHostSettings.saveHint', "Edit values below and save to apply. Unknown properties are ignored."); },57get parseError() { return localize('agentHostSettings.parseError', "Failed to parse agent host settings as JSON."); },58get notObject() { return localize('agentHostSettings.notObject', "Agent host settings must be a JSON object."); },59};6061/**62* Serialize the root config values for an agent host provider into a63* commented, pretty-printed JSON document.64*/65export function serializeHostSettings(provider: IAgentHostSessionsProvider): string {66return serializeAgentHostConfigDocument(provider.getRootConfig(), hostSettingsPropertyFilter, hostSettingsLocale);67}6869/**70* Build a JSON schema describing the root config of an agent host provider.71*/72export function buildHostSettingsJsonSchema(config: RootConfigState): IJSONSchema {73return buildAgentHostConfigJsonSchema(config, hostSettingsPropertyFilter);74}7576/**77* Filesystem provider serving synthetic JSONC documents representing the78* root (agent host) configuration values of agent-host providers.79*/80export class AgentHostSettingsFileSystemProvider extends AbstractAgentHostConfigFileSystemProvider<IAgentHostSettingsContext> {8182protected readonly _schemeLabel = AGENT_HOST_SETTINGS_SCHEME;83protected readonly _traceTag = 'AgentHostSettings';84protected readonly _locale = hostSettingsLocale;8586constructor(87private readonly _schemaRegistrar: AgentHostSettingsSchemaRegistrar,88@ISessionsProvidersService sessionsProvidersService: ISessionsProvidersService,89@ILogService logService: ILogService,90) {91super(sessionsProvidersService, logService);92}9394protected _parseUri(resource: URI): IAgentHostSettingsContext | undefined {95return parseHostSettingsUri(resource);96}9798protected _serialize(provider: IAgentHostSessionsProvider): string {99return serializeHostSettings(provider);100}101102protected _watchChanges(provider: IAgentHostSessionsProvider, _ctx: IAgentHostSettingsContext, fire: () => void): IDisposable {103return provider.onDidChangeRootConfig(() => fire());104}105106protected _ensureSchemaRegistered(provider: IAgentHostSessionsProvider): void {107this._schemaRegistrar.ensureRegistered(provider, provider);108}109110protected _hasConfig(provider: IAgentHostSessionsProvider): boolean {111return provider.getRootConfig() !== undefined;112}113114protected _replaceConfig(provider: IAgentHostSessionsProvider, _ctx: IAgentHostSettingsContext, values: Record<string, unknown>): Promise<void> {115return provider.replaceRootConfig(values);116}117118protected _describeForTrace(ctx: IAgentHostSettingsContext): string {119return `provider ${ctx.providerId}`;120}121}122123/**124* Keeps per-provider JSON schemas registered so editors of the synthetic125* `agent-host-settings://…` files get completions, hover, and validation.126*/127export class AgentHostSettingsSchemaRegistrar extends AbstractAgentHostConfigSchemaRegistrar<IAgentHostSessionsProvider> {128129protected _propertyFilter(): AgentHostConfigPropertyFilter {130return hostSettingsPropertyFilter;131}132133protected _settingsUri(provider: IAgentHostSessionsProvider): string {134return agentHostSettingsUri(provider.id).toString();135}136137protected _schemaId(provider: IAgentHostSessionsProvider): string {138return `vscode://schemas/agent-host-settings/${provider.id}.jsonc`;139}140141protected _getConfig(_provider: IAgentHostSessionsProvider, target: IAgentHostSessionsProvider): IAgentHostConfigLike | undefined {142return target.getRootConfig();143}144145protected _targetsForProvider(provider: IAgentHostSessionsProvider): readonly IAgentHostSessionsProvider[] {146return [provider];147}148149protected _observeProvider(150provider: IAgentHostSessionsProvider,151onChanged: (target: IAgentHostSessionsProvider) => void,152_onRemoved: (target: IAgentHostSessionsProvider) => void,153): IDisposable {154return provider.onDidChangeRootConfig(() => onChanged(provider));155}156}157158159