Skip to content

Agents: Add experimental tabbed workspace picker#312773

Draft
mrleemurray wants to merge 11 commits intomainfrom
mrleemurray/new-session-picker-exploration
Draft

Agents: Add experimental tabbed workspace picker#312773
mrleemurray wants to merge 11 commits intomainfrom
mrleemurray/new-session-picker-exploration

Conversation

@mrleemurray
Copy link
Copy Markdown
Contributor

@mrleemurray mrleemurray commented Apr 27, 2026

This pull request introduces a new experimental "Tabbed Workspace Picker" feature for the chat session workspace picker, along with several extensibility and usability improvements to the action widget infrastructure. The main changes include support for rendering a custom header (such as a tab bar) above the action list, new options for constraining the action widget's width, and extensibility hooks in the workspace picker to support filtering and custom layouts. There are also related styling updates and configuration wiring for the new tabbed picker.

Screen.Recording.2026-04-27.at.14.41.36.mov

Tabbed Workspace Picker and Extensibility:

  • Added a new experimental setting sessions.experimental.tabbedWorkspacePicker and implemented the TabbedWorkspacePicker class, enabling a tabbed interface for selecting workspaces in chat sessions. The picker is conditionally enabled based on the configuration setting. [1] [2] [3]
  • Refactored WorkspacePicker to support subclassing, including extensibility hooks for filtering workspaces and browse actions, customizing the header, and controlling minimum/maximum width. [1] [2] [3] [4] [5]
  • Enhanced the logic for collecting and displaying recent workspaces and browse actions to respect subclass-provided filters and layout options. [1] [2] [3] [4]

Action Widget Infrastructure Improvements:

  • Added maxWidth to IActionListOptions, and updated the action list widget to clamp its width between minWidth and maxWidth, ensuring long items are truncated rather than expanding the popup. [1] [2] [3] [4] [5]
  • Enhanced the action widget service to support rendering an optional header element above the action list, used by the tabbed picker to display its tab bar. [1] [2] [3]

Styling Updates:

  • Added CSS for the tabbed workspace picker, including styles for the tab bar and inline browse actions, improving visual clarity and reducing repetition in the UI.

These changes collectively enable a more flexible and user-friendly workspace picker experience, laying the groundwork for further UI enhancements and customization.

Copilot AI review requested due to automatic review settings April 27, 2026 14:12
@mrleemurray mrleemurray self-assigned this Apr 27, 2026
@mrleemurray mrleemurray requested a review from sandy081 April 27, 2026 14:17
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces an experimental tabbed workspace picker for the Sessions window’s “new session” flow, enabling users to choose workspaces via separate Local/GitHub/Remote tabs and related UI enhancements behind a new configuration setting.

Changes:

  • Add sessions.experimental.tabbedWorkspacePicker setting and wire it into the Sessions window new chat view.
  • Implement TabbedWorkspacePicker with tab UI, category-based filtering, and inline browse actions.
  • Extend the action widget/action list to support an optional header element and a max-width cap used by the picker.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/vs/sessions/contrib/copilotChatSessions/browser/copilotChatSessionsProvider.ts Assign browse action grouping/icon updates to support tab categorization (e.g. repositories).
src/vs/sessions/contrib/configuration/browser/configuration.contribution.ts Register the new experimental setting for enabling the tabbed picker.
src/vs/sessions/contrib/chat/browser/tabbedWorkspacePicker.ts New tabbed picker implementation (tabs + workspace/browse-action categorization).
src/vs/sessions/contrib/chat/browser/sessionWorkspacePicker.ts Add extensibility hooks (header/min/max width) and filtering logic used by the tabbed picker.
src/vs/sessions/contrib/chat/browser/newChatViewPane.ts Select the appropriate picker implementation based on platform and the new setting.
src/vs/sessions/contrib/chat/browser/media/chatWidget.css Styles for the tab bar and inline browse-action rows.
src/vs/sessions/common/configuration.ts Define the new setting ID constant.
src/vs/platform/actionWidget/browser/actionWidget.ts Allow callers to pass an optional header element rendered above the action list/filter.
src/vs/platform/actionWidget/browser/actionList.ts Add maxWidth option and clamp computed list width accordingly.
Comments suppressed due to low confidence (1)

src/vs/sessions/contrib/chat/browser/sessionWorkspacePicker.ts:564

  • Ungrouped browse actions are now rendered without description: action.description, so ISessionWorkspaceBrowseAction.description is effectively ignored in this path despite being intended for display in the workspace picker. Consider restoring the description here (or only suppressing it in the specific tabbed/inline UI variant).
			items.push({
				kind: ActionListItemKind.Action,
				label: localize('workspacePicker.browseSelectAction', "Select {0}...", action.label),
				group: { title: '', icon: action.icon },
				disabled: isUnavailable,
				item: { browseActionIndex: index },
			});

Comment thread src/vs/platform/actionWidget/browser/actionList.ts Outdated
Comment thread src/vs/sessions/contrib/chat/browser/sessionWorkspacePicker.ts
Comment thread src/vs/sessions/contrib/chat/browser/tabbedWorkspacePicker.ts Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 28, 2026

blocks-ci screenshots changed

Replace the contents of test/componentFixtures/blocks-ci-screenshots.md with:

Updated blocks-ci-screenshots.md
<!-- auto-generated by CI — do not edit manually -->

#### editor/codeEditor/CodeEditor/Dark
![screenshot](https://hediet-screenshots.azurewebsites.net/images/cb32a3e854b5734fe5aaca2318f2e0a42ee821b05ea97883ea42c5ba95edb3c3)

#### editor/codeEditor/CodeEditor/Light
![screenshot](https://hediet-screenshots.azurewebsites.net/images/42624fbba5e0db7f32c224b5eb9c5dd3b08245697ae2e7d2a88be0d7c287129b)

#### editor/inlineChatZoneWidget/InlineChatZoneWidget/Dark
![screenshot](https://hediet-screenshots.azurewebsites.net/images/041fd8cf01bf03e44367c80186743d6b4eae3aa7b38a6a1551e8a0168cb8f8f7)

#### editor/inlineChatZoneWidget/InlineChatZoneWidget/Light
![screenshot](https://hediet-screenshots.azurewebsites.net/images/64135435974ab9866b41b95e4fd1a7b2fb87b5b4c551617c361ca0d36eb75569)

#### editor/inlineChatZoneWidget/InlineChatZoneWidgetTerminated/Dark
![screenshot](https://hediet-screenshots.azurewebsites.net/images/2fbc12507b59ff950d9612d2df92e6b39d8bf0bf500478e42eca2ead4d1ae206)

#### editor/inlineChatZoneWidget/InlineChatZoneWidgetTerminated/Light
![screenshot](https://hediet-screenshots.azurewebsites.net/images/4632ab04d1fdd7db9ab0e00cce10aefb7a6344eb8869dfce740309a8801cab73)

@sandy081
Copy link
Copy Markdown
Member

A few architecture concerns:

1. Avoid extending IActionWidgetService with a generic headerElement API

The tab bar UI is specific to the session workspace picker — actionWidget is a generic action-list popup and shouldn't need to know about arbitrary caller-owned DOM. Passing an HTMLElement in creates unclear lifecycle/ownership responsibilities for child widgets and event listeners. The group selection state should live in the workspace picker layer, not in the action widget service.

2. No need for a new setting

If grouped workspace picker is the right UX direction, it should just be the behavior — no need for sessions.experimental.tabbedWorkspacePicker.

3. Groups should be provider-contributable, not hardcoded

The Local / GitHub / Remote grouping is currently hardcoded in TabbedWorkspacePicker based on provider-specific details like remoteAddress, GITHUB_REMOTE_FILE_SCHEME, and group === 'repositories'. The picker shouldn't need to know about these internals.

Instead, the groups should come from the providers themselves. One approach: extend ISessionWorkspaceBrowseAction.group to carry one of the well-known group values (Local, GitHub, Remote), and let the picker render those groups and their data dynamically. Providers contribute browse actions under a group; the picker just renders whatever groups are contributed.

mrleemurray and others added 2 commits April 28, 2026 15:03
…ization

- Updated IActionWidgetService to include an onPopupRendered callback for improved rendering control.
- Modified ActionWidgetService to handle the new onPopupRendered parameter in show method.
- Added category property to IAgentHostSessionWorkspaceOptions for workspace categorization.
- Updated buildAgentHostSessionWorkspace to utilize the new category property.
- Enhanced LocalAgentHostSessionsProvider to categorize workspaces as 'local'.
- Updated CopilotChatSessionsProvider to categorize workspaces as 'local' or 'cloud' based on their source.
- Enhanced RemoteAgentHostSessionsProvider to categorize workspaces as 'remote'.
- Introduced SessionWorkspaceCategory type to standardize workspace categorization across providers.
- Removed the experimental tabbed workspace picker as it is no longer needed.
- Updated WorkspacePicker to support tabbed navigation based on workspace categories (local, cloud, remote).

Co-authored-by: Copilot <copilot@github.com>
@mrleemurray
Copy link
Copy Markdown
Contributor Author

@sandy081 I've made some updates - please review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants