fix duplicate fs registerr

This commit is contained in:
Connor Peet
2026-03-27 11:30:49 -07:00
parent 9a3723d54a
commit ad6d559165
4 changed files with 56 additions and 33 deletions

View File

@@ -86,7 +86,7 @@ export class CopilotAgent extends Disposable implements IAgent {
resource: 'https://api.github.com',
resource_name: 'GitHub Copilot',
authorization_servers: ['https://github.com/login/oauth'],
scopes_supported: ['read:user', 'user:email'],
scopes_supported: ['user:email'],
}];
}

View File

@@ -6,8 +6,7 @@
import { Disposable, DisposableMap, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';
import { URI } from '../../../../base/common/uri.js';
import * as nls from '../../../../nls.js';
import { AgentHostFileSystemProvider } from '../../../../platform/agentHost/common/agentHostFileSystemProvider.js';
import { AGENT_HOST_LABEL_FORMATTER, AGENT_HOST_SCHEME, agentHostAuthority, fromAgentHostUri } from '../../../../platform/agentHost/common/agentHostUri.js';
import { AGENT_HOST_SCHEME, agentHostAuthority, fromAgentHostUri } from '../../../../platform/agentHost/common/agentHostUri.js';
import { type AgentProvider, type IAgentConnection } from '../../../../platform/agentHost/common/agentService.js';
import { IRemoteAgentHostConnectionInfo, IRemoteAgentHostService, RemoteAgentHostsEnabledSettingId, RemoteAgentHostsSettingId } from '../../../../platform/agentHost/common/remoteAgentHostService.js';
import { isSessionAction } from '../../../../platform/agentHost/common/state/sessionActions.js';
@@ -15,9 +14,7 @@ import { SessionClientState } from '../../../../platform/agentHost/common/state/
import { ROOT_STATE_URI, type IAgentInfo, type IRootState } from '../../../../platform/agentHost/common/state/sessionState.js';
import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from '../../../../platform/configuration/common/configurationRegistry.js';
import { IDefaultAccountService } from '../../../../platform/defaultAccount/common/defaultAccount.js';
import { IFileService } from '../../../../platform/files/common/files.js';
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
import { ILabelService } from '../../../../platform/label/common/label.js';
import { ILogService } from '../../../../platform/log/common/log.js';
import { Registry } from '../../../../platform/registry/common/platform.js';
import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../workbench/common/contributions.js';
@@ -28,6 +25,7 @@ import { LoggingAgentConnection } from '../../../../workbench/contrib/chat/brows
import { IChatSessionsService } from '../../../../workbench/contrib/chat/common/chatSessionsService.js';
import { ILanguageModelsService } from '../../../../workbench/contrib/chat/common/languageModels.js';
import { IAuthenticationService } from '../../../../workbench/services/authentication/common/authentication.js';
import { IAgentHostFileSystemService } from '../../../../workbench/services/agentHost/common/agentHostFileSystemService.js';
import { ISessionsManagementService } from '../../../contrib/sessions/browser/sessionsManagementService.js';
import { ISessionsProvidersService } from '../../sessions/browser/sessionsProvidersService.js';
import { RemoteAgentHostSessionsProvider } from './remoteAgentHostSessionsProvider.js';
@@ -68,9 +66,6 @@ export class RemoteAgentHostContribution extends Disposable implements IWorkbenc
/** Per-connection state: client state + per-agent registrations. */
private readonly _connections = this._register(new DisposableMap<string, ConnectionState>());
/** Maps sanitized authority strings back to original addresses. */
private readonly _fsProvider: AgentHostFileSystemProvider;
constructor(
@IRemoteAgentHostService private readonly _remoteAgentHostService: IRemoteAgentHostService,
@IChatSessionsService private readonly _chatSessionsService: IChatSessionsService,
@@ -80,20 +75,11 @@ export class RemoteAgentHostContribution extends Disposable implements IWorkbenc
@IAuthenticationService private readonly _authenticationService: IAuthenticationService,
@IDefaultAccountService private readonly _defaultAccountService: IDefaultAccountService,
@ISessionsManagementService private readonly _sessionsManagementService: ISessionsManagementService,
@IFileService private readonly _fileService: IFileService,
@ISessionsProvidersService private readonly _sessionsProvidersService: ISessionsProvidersService,
@ILabelService private readonly _labelService: ILabelService,
@IAgentHostFileSystemService private readonly _agentHostFileSystemService: IAgentHostFileSystemService,
) {
super();
// Register a single read-only filesystem provider for all remote agent
// hosts. Individual connections are identified by the URI authority.
this._fsProvider = this._register(new AgentHostFileSystemProvider());
this._register(this._fileService.registerProvider(AGENT_HOST_SCHEME, this._fsProvider));
// Display agent-host URIs with the original file path
this._register(this._labelService.registerFormatter(AGENT_HOST_LABEL_FORMATTER));
// Reconcile when connections change (added/removed/reconnected)
this._register(this._remoteAgentHostService.onDidChangeConnections(() => {
this._reconcileConnections();
@@ -151,7 +137,7 @@ export class RemoteAgentHostContribution extends Disposable implements IWorkbenc
// Track authority -> connection mapping for FS provider routing
const authority = agentHostAuthority(address);
store.add(this._fsProvider.registerAuthority(authority, connection));
store.add(this._agentHostFileSystemService.registerAuthority(authority, connection));
// Forward non-session actions to client state
store.add(loggedConnection.onDidAction(envelope => {

View File

@@ -6,17 +6,14 @@
import { Disposable, DisposableMap, DisposableStore, toDisposable } from '../../../../../../base/common/lifecycle.js';
import { URI } from '../../../../../../base/common/uri.js';
import { IConfigurationService } from '../../../../../../platform/configuration/common/configuration.js';
import { AgentHostFileSystemProvider } from '../../../../../../platform/agentHost/common/agentHostFileSystemProvider.js';
import { IAgentHostService, AgentHostEnabledSettingId, type AgentProvider } from '../../../../../../platform/agentHost/common/agentService.js';
import { AGENT_HOST_LABEL_FORMATTER, AGENT_HOST_SCHEME } from '../../../../../../platform/agentHost/common/agentHostUri.js';
import { isSessionAction } from '../../../../../../platform/agentHost/common/state/sessionActions.js';
import { SessionClientState } from '../../../../../../platform/agentHost/common/state/sessionClientState.js';
import { ROOT_STATE_URI, type IAgentInfo, type IRootState } from '../../../../../../platform/agentHost/common/state/sessionState.js';
import { IDefaultAccountService } from '../../../../../../platform/defaultAccount/common/defaultAccount.js';
import { IFileService } from '../../../../../../platform/files/common/files.js';
import { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';
import { ILabelService } from '../../../../../../platform/label/common/label.js';
import { ILogService } from '../../../../../../platform/log/common/log.js';
import { IAgentHostFileSystemService } from '../../../../../services/agentHost/common/agentHostFileSystemService.js';
import { IWorkbenchContribution } from '../../../../../common/contributions.js';
import { IAuthenticationService } from '../../../../../services/authentication/common/authentication.js';
import { IChatSessionsService } from '../../../common/chatSessionsService.js';
@@ -55,8 +52,7 @@ export class AgentHostContribution extends Disposable implements IWorkbenchContr
@ILogService private readonly _logService: ILogService,
@ILanguageModelsService private readonly _languageModelsService: ILanguageModelsService,
@IInstantiationService private readonly _instantiationService: IInstantiationService,
@IFileService private readonly _fileService: IFileService,
@ILabelService private readonly _labelService: ILabelService,
@IAgentHostFileSystemService private readonly _agentHostFileSystemService: IAgentHostFileSystemService,
@IConfigurationService configurationService: IConfigurationService,
) {
super();
@@ -72,14 +68,8 @@ export class AgentHostContribution extends Disposable implements IWorkbenchContr
'agentHostIpc.local',
'Agent Host (Local)'));
// Register a read-only filesystem provider for the local agent host
// so that agent-host-scheme URIs with 'local' authority can be resolved.
const fsProvider = this._register(new AgentHostFileSystemProvider());
this._register(fsProvider.registerAuthority('local', this._agentHostService));
this._register(this._fileService.registerProvider(AGENT_HOST_SCHEME, fsProvider));
// Display agent-host URIs with the original file path
this._register(this._labelService.registerFormatter(AGENT_HOST_LABEL_FORMATTER));
// Register the local agent host authority with the shared filesystem provider
this._register(this._agentHostFileSystemService.registerAuthority('local', this._agentHostService));
// Shared client state for protocol reconciliation
this._clientState = this._register(new SessionClientState(this._agentHostService.clientId, this._logService));

View File

@@ -0,0 +1,47 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Disposable, IDisposable } from '../../../../base/common/lifecycle.js';
import { AgentHostFileSystemProvider, type IRemoteFilesystemConnection } from '../../../../platform/agentHost/common/agentHostFileSystemProvider.js';
import { AGENT_HOST_LABEL_FORMATTER, AGENT_HOST_SCHEME } from '../../../../platform/agentHost/common/agentHostUri.js';
import { IFileService } from '../../../../platform/files/common/files.js';
import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';
import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';
import { ILabelService } from '../../../../platform/label/common/label.js';
export const IAgentHostFileSystemService = createDecorator<IAgentHostFileSystemService>('agentHostFileSystemService');
export interface IAgentHostFileSystemService {
readonly _serviceBrand: undefined;
/**
* Register a mapping from a URI authority to a connection so that
* `vscode-agent-host://[authority]/…` URIs resolve through this connection.
*/
registerAuthority(authority: string, connection: IRemoteFilesystemConnection): IDisposable;
}
class AgentHostFileSystemService extends Disposable implements IAgentHostFileSystemService {
declare readonly _serviceBrand: undefined;
private readonly _fsProvider: AgentHostFileSystemProvider;
constructor(
@IFileService fileService: IFileService,
@ILabelService labelService: ILabelService,
) {
super();
this._fsProvider = this._register(new AgentHostFileSystemProvider());
this._register(fileService.registerProvider(AGENT_HOST_SCHEME, this._fsProvider));
this._register(labelService.registerFormatter(AGENT_HOST_LABEL_FORMATTER));
}
registerAuthority(authority: string, connection: IRemoteFilesystemConnection): IDisposable {
return this._fsProvider.registerAuthority(authority, connection);
}
}
registerSingleton(IAgentHostFileSystemService, AgentHostFileSystemService, InstantiationType.Delayed);