Path: blob/main/src/vs/sessions/contrib/remoteAgentHost/browser/remoteAgentHostTerminal.contribution.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 { Disposable, DisposableMap } from '../../../../base/common/lifecycle.js';6import { localize } from '../../../../nls.js';7import { IRemoteAgentHostService, RemoteAgentHostConnectionStatus } from '../../../../platform/agentHost/common/remoteAgentHostService.js';8import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';9import { registerWorkbenchContribution2, WorkbenchPhase } from '../../../../workbench/common/contributions.js';10import { LoggingAgentConnection } from '../../../../workbench/contrib/chat/browser/agentSessions/agentHost/loggingAgentConnection.js';11import { IAgentHostTerminalService } from '../../../../workbench/contrib/terminal/browser/agentHostTerminalService.js';1213/**14* Registers remote agent host terminal entries with15* {@link IAgentHostTerminalService}.16*/17class RemoteAgentHostTerminalContribution extends Disposable {18private readonly _remoteEntries = this._register(new DisposableMap<string>());1920constructor(21@IRemoteAgentHostService private readonly _remoteAgentHostService: IRemoteAgentHostService,22@IAgentHostTerminalService private readonly _agentHostTerminalService: IAgentHostTerminalService,23@IInstantiationService private readonly _instantiationService: IInstantiationService,24) {25super();2627this._register(this._remoteAgentHostService.onDidChangeConnections(() => this._reconcileRemote()));28this._reconcileRemote();29}3031private _reconcileRemote(): void {32const connectedAddresses = new Set<string>();3334for (const info of this._remoteAgentHostService.connections) {35if (info.status !== RemoteAgentHostConnectionStatus.Connected) {36continue;37}38const connection = this._remoteAgentHostService.getConnection(info.address);39if (!connection) {40continue;41}42connectedAddresses.add(info.address);43if (!this._remoteEntries.has(info.address)) {44this._remoteEntries.set(info.address, this._agentHostTerminalService.registerEntry({45name: info.name || info.address,46address: info.address,47getConnection: () => this._instantiationService.createInstance(48LoggingAgentConnection,49connection,50`agenthost.${connection.clientId}`,51localize('agentHostTerminal.channelRemote', "Agent Host Terminal ({0})", info.address),52),53}));54}55}5657// Remove entries for disconnected hosts58for (const address of this._remoteEntries.keys()) {59if (!connectedAddresses.has(address)) {60this._remoteEntries.deleteAndDispose(address);61}62}63}64}6566registerWorkbenchContribution2('workbench.contrib.remoteAgentHostTerminal', RemoteAgentHostTerminalContribution, WorkbenchPhase.AfterRestored);676869