From b6e9f6e830ec9fec8453020aa5192f6d47555a2d Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Thu, 23 Apr 2026 09:47:17 -0700 Subject: [PATCH] agentHost: don't use a AH terminal by default for local connections Downside is that it's not shared with clients by default. But in exchange it uses the richer shell features we have through VS Code. Probably worth it? --- src/vs/sessions/common/agentHostSessionsProvider.ts | 6 ++++-- .../browser/agentSessionSettings.contribution.ts | 3 ++- .../agentHost/browser/localAgentHostSessionsProvider.ts | 4 ++-- .../chat/browser/agentHost/agentHostModelPicker.ts | 5 +++-- .../browser/agentHost/agentHostSessionConfigPicker.ts | 6 +++--- .../terminal/browser/sessionsTerminalContribution.ts | 8 ++++++-- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/vs/sessions/common/agentHostSessionsProvider.ts b/src/vs/sessions/common/agentHostSessionsProvider.ts index 58862cd264b..b1bdfe7fef4 100644 --- a/src/vs/sessions/common/agentHostSessionsProvider.ts +++ b/src/vs/sessions/common/agentHostSessionsProvider.ts @@ -68,8 +68,10 @@ export interface IAgentHostSessionsProvider extends ISessionsProvider { clearSessionConfig(sessionId: string): void; } -const LOCAL_AGENT_HOST_PROVIDER_ID = 'local-agent-host'; -const REMOTE_AGENT_HOST_PROVIDER_PREFIX = 'agenthost-'; +export const LOCAL_AGENT_HOST_PROVIDER_ID = 'local-agent-host'; +export const REMOTE_AGENT_HOST_PROVIDER_PREFIX = 'agenthost-'; +export const REMOTE_AGENT_HOST_PROVIDER_RE = /^agenthost-/; +export const ANY_AGENT_HOST_PROVIDER_RE = /^(local-agent-host|agenthost-)/; /** * Checks whether a provider is an agent host provider based on its diff --git a/src/vs/sessions/contrib/agentHost/browser/agentSessionSettings.contribution.ts b/src/vs/sessions/contrib/agentHost/browser/agentSessionSettings.contribution.ts index 657595bed09..dc712d1b4ff 100644 --- a/src/vs/sessions/contrib/agentHost/browser/agentSessionSettings.contribution.ts +++ b/src/vs/sessions/contrib/agentHost/browser/agentSessionSettings.contribution.ts @@ -16,6 +16,7 @@ import { ChatSessionProviderIdContext } from '../../../common/contextkeys.js'; import { ISession } from '../../../services/sessions/common/session.js'; import { SessionItemContextMenuId } from '../../sessions/browser/views/sessionsList.js'; import { agentSessionSettingsUri, AGENT_SESSION_SETTINGS_SCHEME, AgentSessionSettingsFileSystemProvider, AgentSessionSettingsSchemaRegistrar } from './agentSessionSettingsFileSystemProvider.js'; +import { ANY_AGENT_HOST_PROVIDER_RE } from '../../../common/agentHostSessionsProvider.js'; /** * Registers the {@link AgentSessionSettingsFileSystemProvider} with the @@ -57,7 +58,7 @@ registerAction2(class OpenSessionSettingsAction extends Action2 { id: SessionItemContextMenuId, group: '2_settings', order: 1, - when: ContextKeyExpr.regex(ChatSessionProviderIdContext.key, /^(local-agent-host|agenthost-)/), + when: ContextKeyExpr.regex(ChatSessionProviderIdContext.key, ANY_AGENT_HOST_PROVIDER_RE), }] }); } diff --git a/src/vs/sessions/contrib/agentHost/browser/localAgentHostSessionsProvider.ts b/src/vs/sessions/contrib/agentHost/browser/localAgentHostSessionsProvider.ts index 587aa5c248f..f492f082af1 100644 --- a/src/vs/sessions/contrib/agentHost/browser/localAgentHostSessionsProvider.ts +++ b/src/vs/sessions/contrib/agentHost/browser/localAgentHostSessionsProvider.ts @@ -22,8 +22,8 @@ import { BaseAgentHostSessionsProvider } from './baseAgentHostSessionsProvider.j import { buildAgentHostSessionWorkspace } from '../../../common/agentHostSessionWorkspace.js'; import { ISessionWorkspace, ISessionWorkspaceBrowseAction } from '../../../services/sessions/common/session.js'; import { toAgentHostUri } from '../../../../platform/agentHost/common/agentHostUri.js'; +import { LOCAL_AGENT_HOST_PROVIDER_ID } from '../../../common/agentHostSessionsProvider.js'; -const LOCAL_PROVIDER_ID = 'local-agent-host'; const LOCAL_RESOURCE_SCHEME_PREFIX = 'agent-host-'; /** @@ -36,7 +36,7 @@ const LOCAL_RESOURCE_SCHEME_PREFIX = 'agent-host-'; */ export class LocalAgentHostSessionsProvider extends BaseAgentHostSessionsProvider { - readonly id = LOCAL_PROVIDER_ID; + readonly id = LOCAL_AGENT_HOST_PROVIDER_ID; readonly label: string; readonly icon: ThemeIcon = Codicon.vm; readonly browseActions: readonly ISessionWorkspaceBrowseAction[]; diff --git a/src/vs/sessions/contrib/chat/browser/agentHost/agentHostModelPicker.ts b/src/vs/sessions/contrib/chat/browser/agentHost/agentHostModelPicker.ts index 38c6a51d478..76b080d849f 100644 --- a/src/vs/sessions/contrib/chat/browser/agentHost/agentHostModelPicker.ts +++ b/src/vs/sessions/contrib/chat/browser/agentHost/agentHostModelPicker.ts @@ -21,10 +21,11 @@ import { type ISession } from '../../../../services/sessions/common/session.js'; import { ISessionsManagementService } from '../../../../services/sessions/common/sessionsManagement.js'; import { ISessionsProvidersService } from '../../../../services/sessions/browser/sessionsProvidersService.js'; import { Menus } from '../../../../browser/menus.js'; +import { LOCAL_AGENT_HOST_PROVIDER_ID, REMOTE_AGENT_HOST_PROVIDER_RE } from '../../../../common/agentHostSessionsProvider.js'; const IsActiveSessionAgentHost = ContextKeyExpr.or( - ContextKeyExpr.equals(ActiveSessionProviderIdContext.key, 'local-agent-host'), - ContextKeyExpr.regex(ActiveSessionProviderIdContext.key, /^agenthost-/), + ContextKeyExpr.equals(ActiveSessionProviderIdContext.key, LOCAL_AGENT_HOST_PROVIDER_ID), + ContextKeyExpr.regex(ActiveSessionProviderIdContext.key, REMOTE_AGENT_HOST_PROVIDER_RE), ); // -- Agent Host Model Picker Action -- diff --git a/src/vs/sessions/contrib/chat/browser/agentHost/agentHostSessionConfigPicker.ts b/src/vs/sessions/contrib/chat/browser/agentHost/agentHostSessionConfigPicker.ts index 0d5ef522787..0d1e14b769c 100644 --- a/src/vs/sessions/contrib/chat/browser/agentHost/agentHostSessionConfigPicker.ts +++ b/src/vs/sessions/contrib/chat/browser/agentHost/agentHostSessionConfigPicker.ts @@ -34,13 +34,13 @@ import { ActiveSessionProviderIdContext } from '../../../../common/contextkeys.j import { ISessionsProvidersService } from '../../../../services/sessions/browser/sessionsProvidersService.js'; import { ISessionsManagementService } from '../../../../services/sessions/common/sessionsManagement.js'; import type { ISessionsProvider } from '../../../../services/sessions/common/sessionsProvider.js'; -import { type IAgentHostSessionsProvider, isAgentHostProvider } from '../../../../common/agentHostSessionsProvider.js'; +import { type IAgentHostSessionsProvider, isAgentHostProvider, LOCAL_AGENT_HOST_PROVIDER_ID, REMOTE_AGENT_HOST_PROVIDER_RE } from '../../../../common/agentHostSessionsProvider.js'; import { PermissionPicker } from '../../../copilotChatSessions/browser/permissionPicker.js'; import { AgentHostPermissionPickerActionItem } from './agentHostPermissionPickerActionItem.js'; import { AgentHostPermissionPickerDelegate, AUTO_APPROVE_PROPERTY, isWellKnownAutoApproveSchema } from './agentHostPermissionPickerDelegate.js'; -const IsActiveSessionRemoteAgentHost = ContextKeyExpr.regex(ActiveSessionProviderIdContext.key, /^agenthost-/); -const IsActiveSessionLocalAgentHost = ContextKeyExpr.equals(ActiveSessionProviderIdContext.key, 'local-agent-host'); +const IsActiveSessionRemoteAgentHost = ContextKeyExpr.regex(ActiveSessionProviderIdContext.key, REMOTE_AGENT_HOST_PROVIDER_RE); +const IsActiveSessionLocalAgentHost = ContextKeyExpr.equals(ActiveSessionProviderIdContext.key, LOCAL_AGENT_HOST_PROVIDER_ID); registerAction2(class extends Action2 { constructor() { diff --git a/src/vs/sessions/contrib/terminal/browser/sessionsTerminalContribution.ts b/src/vs/sessions/contrib/terminal/browser/sessionsTerminalContribution.ts index 640613a6630..b25fa07f82d 100644 --- a/src/vs/sessions/contrib/terminal/browser/sessionsTerminalContribution.ts +++ b/src/vs/sessions/contrib/terminal/browser/sessionsTerminalContribution.ts @@ -18,7 +18,7 @@ import { ITerminalInstance, ITerminalService } from '../../../../workbench/contr import { TerminalCapability } from '../../../../platform/terminal/common/capabilities/capabilities.js'; import { IPathService } from '../../../../workbench/services/path/common/pathService.js'; import { Menus } from '../../../browser/menus.js'; -import { isAgentHostProvider } from '../../../common/agentHostSessionsProvider.js'; +import { isAgentHostProvider, LOCAL_AGENT_HOST_PROVIDER_ID } from '../../../common/agentHostSessionsProvider.js'; import { SessionsWelcomeVisibleContext, IsPhoneLayoutContext } from '../../../common/contextkeys.js'; import { ISessionsManagementService } from '../../../services/sessions/common/sessionsManagement.js'; import { CopilotCLISessionType, ISession } from '../../../services/sessions/common/session.js'; @@ -86,13 +86,17 @@ export class SessionsTerminalContribution extends Disposable implements IWorkben super(); const profileOverride = derived(reader => { - const profiles = this._agentHostTerminalService.profiles.read(reader); const session = this._sessionsManagementService.activeSession.read(reader); + if (!session || session.providerId === LOCAL_AGENT_HOST_PROVIDER_ID) { + return; // no need to override local default profiles with the local AH + } + const address = this._getSessionAgentHostAddress(session); if (!address) { return; } + const profiles = this._agentHostTerminalService.profiles.read(reader); return profiles.find(p => p.address === address) ?? this._agentHostTerminalService.getProfileForConnection(address); });