From b7308211d29a217972b35abba4bf3e8f83501a22 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 30 Mar 2026 21:02:14 +0200 Subject: [PATCH] sessions: fix title bar context menu and session type icons (#306419) sessions: fix title bar context menu and session icons - Fix Unpin action missing from title bar context menu by looking up actual pinned state via SessionsView instead of hardcoding false - Remove context menu for new/unsent sessions where actions like delete, pin, and archive don't apply - Use session type icons (Codicon.copilot, Codicon.cloud) for AgentSessionAdapter instead of provider-level icons Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../browser/copilotChatSessionsProvider.ts | 13 ++++++++++++- .../sessions/browser/sessionsTitleBarWidget.ts | 12 ++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/vs/sessions/contrib/copilotChatSessions/browser/copilotChatSessionsProvider.ts b/src/vs/sessions/contrib/copilotChatSessions/browser/copilotChatSessionsProvider.ts index 06e06724d4b..8fb2e4bb304 100644 --- a/src/vs/sessions/contrib/copilotChatSessions/browser/copilotChatSessionsProvider.ts +++ b/src/vs/sessions/contrib/copilotChatSessions/browser/copilotChatSessionsProvider.ts @@ -640,7 +640,7 @@ class AgentSessionAdapter implements ISessionData { this.resource = session.resource; this.providerId = providerId; this.sessionType = session.providerType; - this.icon = session.icon; + this.icon = this._getSessionTypeIcon(session); this.createdAt = new Date(session.timing.created); this._workspace = observableValue(this, this._buildWorkspace(session)); this.workspace = this._workspace; @@ -692,6 +692,17 @@ class AgentSessionAdapter implements ISessionData { }); } + private _getSessionTypeIcon(session: IAgentSession): ThemeIcon { + switch (session.providerType) { + case AgentSessionProviders.Background: + return CopilotCLISessionType.icon; + case AgentSessionProviders.Cloud: + return CopilotCloudSessionType.icon; + default: + return session.icon; + } + } + private _extractDescription(session: IAgentSession): string | undefined { if (!session.description) { return undefined; diff --git a/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts b/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts index 5e0de629eea..a9667a2112f 100644 --- a/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts +++ b/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts @@ -21,7 +21,7 @@ import { IWorkbenchLayoutService, Parts } from '../../../../workbench/services/l import { Menus } from '../../../browser/menus.js'; import { IWorkbenchContribution } from '../../../../workbench/common/contributions.js'; import { IActionViewItemService } from '../../../../platform/actions/browser/actionViewItemService.js'; -import { ISessionsManagementService } from './sessionsManagementService.js'; +import { ISessionsManagementService, IsNewChatSessionContext } from './sessionsManagementService.js'; import { autorun, observableSignalFromEvent } from '../../../../base/common/observable.js'; import { ThemeIcon } from '../../../../base/common/themables.js'; import { IsAuxiliaryWindowContext } from '../../../../workbench/common/contextkeys.js'; @@ -30,6 +30,8 @@ import { ISessionsProvidersService } from './sessionsProvidersService.js'; import { SessionStatus } from '../common/sessionData.js'; import { SHOW_SESSIONS_PICKER_COMMAND_ID } from './sessionsActions.js'; import { IsSessionArchivedContext, IsSessionPinnedContext, IsSessionReadContext, SessionItemContextMenuId } from './views/sessionsList.js'; +import { SessionsView, SessionsViewId } from './views/sessionsView.js'; +import { IViewsService } from '../../../../workbench/services/views/common/viewsService.js'; /** * Sessions Title Bar Widget - renders the active chat session title @@ -66,6 +68,7 @@ export class SessionsTitleBarWidget extends BaseActionViewItem { @IContextKeyService private readonly contextKeyService: IContextKeyService, @ISessionsProvidersService private readonly sessionsProvidersService: ISessionsProvidersService, @ICommandService private readonly commandService: ICommandService, + @IViewsService private readonly viewsService: IViewsService, ) { super(undefined, action, options); @@ -256,8 +259,13 @@ export class SessionsTitleBarWidget extends BaseActionViewItem { return; } + if (this.contextKeyService.getContextKeyValue(IsNewChatSessionContext.key)) { + return; + } + + const isPinned = this.viewsService.getViewWithId(SessionsViewId)?.sessionsControl?.isSessionPinned(sessionData) ?? false; const contextOverlay: [string, boolean | string][] = [ - [IsSessionPinnedContext.key, false], + [IsSessionPinnedContext.key, isPinned], [IsSessionArchivedContext.key, sessionData.isArchived.get()], [IsSessionReadContext.key, sessionData.isRead.get()], ['chatSessionType', sessionData.sessionType],