From 466b5782ad94723c07ce38ef62f24ef6fae5119c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 3 Mar 2026 15:10:37 +0100 Subject: [PATCH 1/4] sessions - context menu on title for session actions --- .../browser/sessionsTitleBarWidget.ts | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts b/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts index 6ff448786dde7..1a715f452e225 100644 --- a/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts +++ b/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts @@ -4,16 +4,23 @@ *--------------------------------------------------------------------------------------------*/ import './media/sessionsTitleBarWidget.css'; -import { $, addDisposableListener, EventType, reset } from '../../../../base/browser/dom.js'; +import { $, addDisposableListener, EventType, getActiveWindow, reset } from '../../../../base/browser/dom.js'; +import { Separator } from '../../../../base/common/actions.js'; import { Disposable, DisposableStore, MutableDisposable } from '../../../../base/common/lifecycle.js'; +import { MarshalledId } from '../../../../base/common/marshallingIds.js'; +import { StandardMouseEvent } from '../../../../base/browser/mouseEvent.js'; import { localize } from '../../../../nls.js'; import { IHoverService } from '../../../../platform/hover/browser/hover.js'; import { getDefaultHoverDelegate } from '../../../../base/browser/ui/hover/hoverDelegateFactory.js'; import { BaseActionViewItem, IBaseActionViewItemOptions } from '../../../../base/browser/ui/actionbar/actionViewItems.js'; import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; -import { MenuRegistry, SubmenuItemAction } from '../../../../platform/actions/common/actions.js'; -import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js'; +import { IMenuService, MenuId, MenuRegistry, SubmenuItemAction } from '../../../../platform/actions/common/actions.js'; +import { IContextKeyService, ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js'; +import { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js'; +import { ChatContextKeys } from '../../../../workbench/contrib/chat/common/actions/chatContextKeys.js'; +import { IMarshalledAgentSessionContext } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessionsModel.js'; +import { IChatSessionsService } from '../../../../workbench/contrib/chat/common/chatSessionsService.js'; import { Menus } from '../../../browser/menus.js'; import { IWorkbenchContribution } from '../../../../workbench/common/contributions.js'; @@ -65,6 +72,10 @@ export class SessionsTitleBarWidget extends BaseActionViewItem { @ISessionsManagementService private readonly activeSessionService: ISessionsManagementService, @IChatService private readonly chatService: IChatService, @IAgentSessionsService private readonly agentSessionsService: IAgentSessionsService, + @IContextMenuService private readonly contextMenuService: IContextMenuService, + @IMenuService private readonly menuService: IMenuService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IChatSessionsService private readonly chatSessionsService: IChatSessionsService, ) { super(undefined, action, options); @@ -176,6 +187,11 @@ export class SessionsTitleBarWidget extends BaseActionViewItem { e.stopPropagation(); this._showSessionsPicker(); })); + this._dynamicDisposables.add(addDisposableListener(sessionPill, EventType.CONTEXT_MENU, (e) => { + e.preventDefault(); + e.stopPropagation(); + this._showContextMenu(e); + })); this._container.appendChild(sessionPill); @@ -284,6 +300,42 @@ export class SessionsTitleBarWidget extends BaseActionViewItem { return basename(uri); } + private _showContextMenu(e: MouseEvent): void { + const activeSession = this.activeSessionService.getActiveSession(); + if (!activeSession) { + return; + } + + const agentSession = this.agentSessionsService.getSession(activeSession.resource); + if (!agentSession) { + return; + } + + this.chatSessionsService.activateChatSessionItemProvider(agentSession.providerType); + + const contextOverlay: Array<[string, boolean | string]> = [ + [ChatContextKeys.isArchivedAgentSession.key, agentSession.isArchived()], + [ChatContextKeys.isReadAgentSession.key, agentSession.isRead()], + [ChatContextKeys.agentSessionType.key, agentSession.providerType], + ]; + + const menu = this.menuService.createMenu(MenuId.AgentSessionsContext, this.contextKeyService.createOverlay(contextOverlay)); + + const marshalledContext: IMarshalledAgentSessionContext = { + session: agentSession, + sessions: [agentSession], + $mid: MarshalledId.AgentSessionContext, + }; + + this.contextMenuService.showContextMenu({ + getActions: () => Separator.join(...menu.getActions({ arg: marshalledContext, shouldForwardArgs: true }).map(([, actions]) => actions)), + getAnchor: () => new StandardMouseEvent(getActiveWindow(), e), + getActionsContext: () => marshalledContext, + }); + + menu.dispose(); + } + private _showSessionsPicker(): void { const picker = this.instantiationService.createInstance(AgentSessionsPicker, undefined, { overrideSessionOpen: (session, openOptions) => this.activeSessionService.openSession(session.resource, openOptions) From d2802096a7767c0060f53e9d075a4e11975c530c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 3 Mar 2026 15:18:08 +0100 Subject: [PATCH 2/4] Update src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../contrib/sessions/browser/sessionsTitleBarWidget.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts b/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts index 1a715f452e225..efb0b0d837699 100644 --- a/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts +++ b/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts @@ -331,9 +331,10 @@ export class SessionsTitleBarWidget extends BaseActionViewItem { getActions: () => Separator.join(...menu.getActions({ arg: marshalledContext, shouldForwardArgs: true }).map(([, actions]) => actions)), getAnchor: () => new StandardMouseEvent(getActiveWindow(), e), getActionsContext: () => marshalledContext, + onHide: () => { + menu.dispose(); + } }); - - menu.dispose(); } private _showSessionsPicker(): void { From 577afb1ed556d71e1877844c02b362a9bf844de1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 3 Mar 2026 15:26:15 +0100 Subject: [PATCH 3/4] ccr --- .../chat/browser/agentSessions/agentSessionsControl.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.ts b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.ts index 66977278aeb11..579aea408ff17 100644 --- a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.ts +++ b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.ts @@ -306,9 +306,8 @@ export class AgentSessionsControl extends Disposable implements IAgentSessionsCo getActions: () => Separator.join(...menu.getActions({ arg: section, shouldForwardArgs: true }).map(([, actions]) => actions)), getAnchor: () => anchor, getActionsContext: () => section, + onHide: () => menu.dispose() }); - - menu.dispose(); } private async showAgentSessionContextMenu(session: IAgentSession, anchor: HTMLElement | IMouseEvent): Promise { @@ -332,9 +331,8 @@ export class AgentSessionsControl extends Disposable implements IAgentSessionsCo getActions: () => Separator.join(...menu.getActions({ arg: marshalledContext, shouldForwardArgs: true }).map(([, actions]) => actions)), getAnchor: () => anchor, getActionsContext: () => marshalledContext, + onHide: () => menu.dispose() }); - - menu.dispose(); } openFind(): void { From 84149adf03383fa353eddae22489650c61578dd9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 3 Mar 2026 15:38:24 +0100 Subject: [PATCH 4/4] ccr --- .../contrib/sessions/browser/sessionsTitleBarWidget.ts | 7 +++---- .../chat/browser/agentSessions/agentSessionsControl.ts | 6 ++++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts b/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts index efb0b0d837699..f2a3198b33bea 100644 --- a/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts +++ b/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts @@ -330,11 +330,10 @@ export class SessionsTitleBarWidget extends BaseActionViewItem { this.contextMenuService.showContextMenu({ getActions: () => Separator.join(...menu.getActions({ arg: marshalledContext, shouldForwardArgs: true }).map(([, actions]) => actions)), getAnchor: () => new StandardMouseEvent(getActiveWindow(), e), - getActionsContext: () => marshalledContext, - onHide: () => { - menu.dispose(); - } + getActionsContext: () => marshalledContext }); + + menu.dispose(); } private _showSessionsPicker(): void { diff --git a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.ts b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.ts index 579aea408ff17..66977278aeb11 100644 --- a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.ts +++ b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.ts @@ -306,8 +306,9 @@ export class AgentSessionsControl extends Disposable implements IAgentSessionsCo getActions: () => Separator.join(...menu.getActions({ arg: section, shouldForwardArgs: true }).map(([, actions]) => actions)), getAnchor: () => anchor, getActionsContext: () => section, - onHide: () => menu.dispose() }); + + menu.dispose(); } private async showAgentSessionContextMenu(session: IAgentSession, anchor: HTMLElement | IMouseEvent): Promise { @@ -331,8 +332,9 @@ export class AgentSessionsControl extends Disposable implements IAgentSessionsCo getActions: () => Separator.join(...menu.getActions({ arg: marshalledContext, shouldForwardArgs: true }).map(([, actions]) => actions)), getAnchor: () => anchor, getActionsContext: () => marshalledContext, - onHide: () => menu.dispose() }); + + menu.dispose(); } openFind(): void {