Skip to content

Customizations modal redesign - #322043

Merged
Hawk Ticehurst (hawkticehurst) merged 15 commits into
mainfrom
agents/can-you-kick-off-a-pi-coding-agent-3d251f1f
Aug 27, 2026
Merged

Customizations modal redesign#322043
Hawk Ticehurst (hawkticehurst) merged 15 commits into
mainfrom
agents/can-you-kick-off-a-pi-coding-agent-3d251f1f

Conversation

@hawkticehurst

@hawkticehurst Hawk Ticehurst (hawkticehurst) commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

This PR substantially redesigns the AI Customizations management editor so it can act as the central place to discover, create, inspect, enable, disable, install, migrate, and manage the customizations available to the active agent harness.

The update covers both the regular VS Code workbench and the Agents window. It replaces the previous mostly list-oriented experience with a harness-aware overview, richer card and inventory surfaces, embedded detail pages, responsive layouts, and consistent navigation across agents, skills, instructions, hooks, prompts, MCP servers, plugins, models, and tools.

User experience changes

New overview and navigation

  • Adds a customization overview page with:
    • a harness-specific heading and introduction;
    • cards for the sections supported by the active harness;
    • direct creation entry points for prompt-based customizations;
    • standalone Voice Mode and Dictation instruction launchers where supported;
    • migration cards when deprecated or incompatible customizations are detected.
  • Reworks the editor sidebar around:
    • a dedicated Overview entry;
    • harness-filtered sections;
    • live per-section item counts;
    • migration shortcuts and counts;
    • persisted section selection;
    • focus transfer to each section's search field when navigating.
  • Includes the active customization target in the editor title and keeps the editor synchronized with the active Agents-window session and harness.
  • Updates the Agents-window customization toolbar to use the same model-backed counts and harness visibility rules as the editor.

Agents, skills, instructions, hooks, and prompts

  • Introduces card-based inventories for agents, skills, instructions, and hooks while retaining the list presentation where appropriate for prompts.
  • Groups items by their actual source, including workspace, user, plugin, extension, built-in, and provider-backed remote sources.
  • Adds richer secondary text, source descriptions, badges, search highlighting, item counts, and empty states.
  • Adds inline item actions and overflow menus while preserving the existing prompt context-menu behavior.
  • Keeps editable source sections available for creation even when they are empty, and hides empty sections only once search filtering begins.
  • Improves keyboard behavior and accessibility through:
    • native/shared button widgets for actionable controls;
    • keyboard activation for cards;
    • focused-row action tab stops;
    • localized ARIA labels;
    • search-result count announcements;
    • explicit focus restoration and section focus behavior.
  • Adds a structured preview mode for prompt-based files, including metadata/body rendering, field help, validation issues, and a raw-source fallback.

Customization migration

  • Adds independently gated migration flows for:
    • converting deprecated workspace and user *.prompt.md files into skills;
    • moving legacy User Data customizations into locations supported by the active harness.
  • Presents candidates in source-based groups with:
    • per-item and per-group selection;
    • tri-state group checkboxes;
    • embedded file preview;
    • delete actions;
    • destination-aware explanatory copy and confirmation.
  • Preserves source formatting where possible, reports unsupported metadata for review, continues after individual file failures, and reveals successfully migrated files.
  • Protects migration integrity by:
    • binding the operation to the initiating active session;
    • avoiding target overwrite;
    • migrating duplicate source identities before source deletion;
    • rolling back a newly written target when source deletion fails;
    • allowing users to keep the original files.

MCP servers

  • Reworks MCP management into a card-based home surface with installed and marketplace sections.
  • Supports marketplace discovery, search, installation, and direct reveal of available servers.
  • Adds richer installed-server rows with:
    • connection and enablement status;
    • profile/workspace/session enablement actions;
    • start/stop/restart actions;
    • output and configuration actions;
    • plugin-owned server handling;
    • disabled-reason presentation.
  • Adds embedded MCP detail pages with source, scope, status, configuration/definition information, and back-navigation.
  • Preserves enterprise/user access gating and provides the appropriate policy or Settings explanation when MCP access is disabled.

Plugins

  • Adds a redesigned plugin home with installed, remote, recommended, and marketplace content.
  • Adds marketplace browse and search modes that combine:
    • installed plugins;
    • provider-backed remote plugins;
    • marketplace results available to install.
  • Adds plugin creation, install-from-source, update, install, uninstall, and enablement actions.
  • Adds embedded plugin detail pages with:
    • marketplace/source provenance;
    • installation path and copy action;
    • inclusion/enablement state;
    • policy-blocked state;
    • install/enable/disable/uninstall actions;
    • grouped inventories for contributed agents, skills, instructions, hooks, MCP servers, and commands;
    • navigation from a contribution to the corresponding customization section or file.
  • Extends marketplace metadata with recommended-plugin information used by the redesigned home surface.

Tools

  • Reworks the tools section into source-based inventories for:
    • built-in tools;
    • MCP/user-connected sources;
    • extension-contributed tools.
  • Adds expandable tool sets, per-set and per-tool enablement, search, keyboard navigation, and read-only handling for provider-owned sets.
  • Adds marketplace browsing for extensions that contribute language-model tools, including manifest filtering and Agents-window execution constraints.
  • Adds embedded tool-set detail navigation and extension management actions.

Responsive layout and presentation

  • Introduces shared presentation helpers so display names, source labels, inclusion state, and card/list behavior remain consistent.
  • Adds narrow and wide responsive states for the management editor, inventories, cards, and embedded details.
  • Updates visual hierarchy, spacing, focus treatment, overflow behavior, scrollable regions, badges, section headers, action placement, and high-density layouts across the editor.
  • Keeps list and card layouts synchronized with their actual rendered dimensions after section changes and responsive reflow.

Architecture and consistency

  • Keeps section counts and rendered prompt-based items on the same IAICustomizationItemsModel pipeline.
  • Applies harness visibility and provider behavior declaratively instead of branching on individual harness IDs in shared widgets.
  • Keeps Agents-window project/session context synchronized with the shared management editor.
  • Preserves AI-feature gating and harness-specific section availability.
  • Uses the owning MCP, plugin, prompts, tool, workspace, and harness services rather than duplicating customization state in the UI.

Tests and fixtures

This PR expands focused coverage for:

  • prompt-based grouping, source extraction, card behavior, search, layout fallback, and count announcements;
  • management-editor title, preview, migration gating, selection, grouping, focus, and navigation;
  • migration conversion, formatting preservation, partial failures, duplicate sources, rollback, concurrent target creation, and keeping originals;
  • MCP enablement actions, plugin-owned servers, no-op row updates, inline actions, output routing, source grouping, and session/workspace behavior;
  • plugin disabled reasons and scope-preserving enablement;
  • overview/migration card native interaction behavior.

The component fixture coverage now includes the overview and all major sections in light/dark themes, narrow layouts, browse/search states, migration flows, empty/disabled states, and embedded MCP/plugin detail pages.

Suggested manual verification

  1. Open Customizations in the regular workbench and in the Agents window.
  2. Switch between available harnesses/sessions and verify the title, visible sections, counts, overview cards, and project context update together.
  3. Exercise keyboard-only navigation through the overview, sidebar, search fields, cards, row actions, and detail-page back buttons.
  4. Verify search, creation, editing, structured preview, and source grouping for agents, skills, instructions, hooks, and prompts.
  5. Exercise both migration categories, including partial selection, preview, keeping originals, and switching the active session during confirmation.
  6. Search/browse/install/manage MCP servers and plugins, including disabled-by-setting and disabled-by-policy states.
  7. Inspect installed and marketplace plugin details and open contributed customizations from the contribution inventory.
  8. Expand, search, enable/disable, and browse extension-contributed tool sets.
  9. Resize the editor through narrow and wide layouts and verify no cards, badges, actions, or scroll regions clip.
  10. Check the main fixtures in light, dark, and high-contrast themes.

Screenshots

ui-diff-20260826-171321 ui-diff-20260826-171415 ui-diff-20260826-171136 ui-diff-20260826-171120 ui-diff-20260826-155402 ui-diff-20260826-155421 ui-diff-20260826-155455 ui-diff-20260826-155516 ui-diff-20260826-155534 ui-diff-20260826-155628 ui-diff-20260826-155643

Copilot AI review requested due to automatic review settings June 19, 2026 05:29
@hawkticehurst Hawk Ticehurst (hawkticehurst) changed the title Prototype design for plugin page in customizations modal Prototype redesign of customizations plugin page Jun 19, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR prototypes a redesigned Plugins experience in the AI Customizations management editor, shifting the default surface toward a card-based “home” while retaining WorkbenchList for search and list-based interactions.

Changes:

  • Introduces a card-based plugins home surface, plus a browse/search experience that mixes installed/remote/marketplace results.
  • Enhances plugin detail rendering to include provenance/facts, contribution inventory, and inline management actions.
  • Updates styling and component fixtures to support the redesigned layouts and new marketplace recommendation signal (recommendedPlugins).

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/vs/workbench/test/browser/componentFixtures/sessions/aiCustomizationManagementEditor.fixture.ts Updates fixture mocks (adds recommendedPlugins) and switches browse-mode activation to the widget API.
src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.ts Reworks plugin list UI: card home surface, search headers, recommended badges, and marketplace/installed search blending.
src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationManagement.css Adds/adjusts CSS for the new plugin list rows, card surfaces, and richer embedded detail layout.
src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedAgentPluginDetail.ts Expands embedded plugin detail with install/enable/disable/uninstall actions, facts, copy path, and grouped contributions.
src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.ts Wires new embedded-detail events to open contributed artifacts/sections and handle uninstall navigation.
src/vs/sessions/AI_CUSTOMIZATIONS.md Documents the new Plugins section UX and behaviors.

Comment thread src/vs/sessions/AI_CUSTOMIZATIONS.md Outdated
Comment thread src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.ts Outdated
@github-actions

github-actions Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Screenshot Changes

Base: 56e38668 Current: b57044c2

Changed (88)

sessions/aiCustomizationShortcutsWidget/Expanded/Dark
Before After
before after
sessions/aiCustomizationShortcutsWidget/Expanded/Light
Before After
before after
sessions/aiCustomizationShortcutsWidget/MinimumHeight/Dark
Before After
before after
sessions/aiCustomizationShortcutsWidget/MinimumHeight/Light
Before After
before after
sessions/aiCustomizationShortcutsWidget/WithMcpServers/Dark
Before After
before after
sessions/aiCustomizationShortcutsWidget/WithMcpServers/Light
Before After
before after
sessions/aiCustomizationShortcutsWidget/MinimumHeightWithMcpServers/Dark
Before After
before after
sessions/aiCustomizationShortcutsWidget/MinimumHeightWithMcpServers/Light
Before After
before after
sessions/aiCustomizationShortcutsWidget/WithCounts/Dark
Before After
before after
sessions/aiCustomizationShortcutsWidget/WithCounts/Light
Before After
before after
chat/aiCustomizations/aiCustomizationListWidget/InstructionsTabWithItems/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationListWidget/InstructionsTabWithItems/Light
Before After
before after
chat/aiCustomizations/aiCustomizationListWidget/InstructionsTabEmpty/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationListWidget/InstructionsTabEmpty/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/WelcomePage/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/WelcomePage/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/LocalHarness/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/LocalHarness/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentHostPromptMigration/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentHostPromptMigration/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/Sessions/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/Sessions/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/SessionsSkillsTab/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/SessionsSkillsTab/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServersTab/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServersTab/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServersTabActiveSession/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServersTabActiveSession/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentsTab/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentsTab/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/SkillsTab/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/SkillsTab/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/InstructionsTab/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/InstructionsTab/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/HooksTab/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/HooksTab/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PromptsTab/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PromptsTab/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PromptMigration/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PromptMigration/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/UserDataMigration/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/UserDataMigration/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginsTab/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginsTab/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpBrowseMode/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpBrowseMode/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginBrowseMode/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginBrowseMode/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PromptsTabScrolled/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PromptsTabScrolled/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServersTabScrolled/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServersTabScrolled/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginsTabScrolled/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginsTabScrolled/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServersTabNarrow/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServersTabNarrow/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentsTabNarrow/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentsTabNarrow/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentsItemPreview/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentsItemPreview/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentsItemRaw/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/AgentsItemRaw/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/BuiltinSkillItemPreview/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/BuiltinSkillItemPreview/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/BuiltinSkillItemRaw/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/BuiltinSkillItemRaw/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServerDetail/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServerDetail/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServerDetailNarrow/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpServerDetailNarrow/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginDetail/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginDetail/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginDetailNarrow/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/PluginDetailNarrow/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedMcpDetailWorkspace/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedMcpDetailWorkspace/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedMcpDetailUser/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedMcpDetailUser/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedMcpDetailEmpty/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedMcpDetailEmpty/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailInstalled/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailInstalled/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailMarketplace/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailMarketplace/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailEmpty/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailEmpty/Light
Before After
before after
chat/aiCustomizations/aiCustomizationWelcomePages/WelcomePage/Dark
Before After
before after
chat/aiCustomizations/aiCustomizationWelcomePages/WelcomePage/Light
Before After
before after

1 insignificant change(s) omitted (≤20 px, Δ≤2). See CI logs for details.

Added (48)

chat/aiCustomizations/aiCustomizationManagementEditor/WelcomePageNarrow/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/WelcomePageNarrow/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/McpServersSearch/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/McpServersSearch/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/McpServersAuthRequired/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/McpServersAuthRequired/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/McpServerActiveSessionDetail/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/McpServerActiveSessionDetail/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/AgentsSearch/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/AgentsSearch/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/AgentsEmptyUser/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/AgentsEmptyUser/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/RemoteSkillsTab/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/RemoteSkillsTab/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/HooksEmptyWorkspace/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/HooksEmptyWorkspace/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/PromptsTabNarrow/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/PromptsTabNarrow/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/PromptMigrationNarrow/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/PromptMigrationNarrow/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/PromptMigrationPartialSelection/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/PromptMigrationPartialSelection/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/PromptMigrationEmptyUser/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/PromptMigrationEmptyUser/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/ToolsTab/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/ToolsTab/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/ToolsTabNarrow/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/ToolsTabNarrow/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/ToolsSearchEmpty/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/ToolsSearchEmpty/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/ToolsEmptyExtensions/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/ToolsEmptyExtensions/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/SessionsPluginsTab/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/SessionsPluginsTab/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginCatalogHome/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginCatalogHome/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginCatalogSearch/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginCatalogSearch/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginCatalogHomeNarrow/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginCatalogHomeNarrow/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginCatalogHomeEmptyInstalled/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginCatalogHomeEmptyInstalled/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginsTabNarrow/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/PluginsTabNarrow/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailExcludedWorkspace/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailExcludedWorkspace/Light

current

chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailPolicyBlocked/Dark

current

chat/aiCustomizations/aiCustomizationManagementEditor/EmbeddedPluginDetailPolicyBlocked/Light

current

@hawkticehurst Hawk Ticehurst (hawkticehurst) changed the title Prototype redesign of customizations plugin page Customization modal redesign Aug 24, 2026
@hawkticehurst Hawk Ticehurst (hawkticehurst) changed the title Customization modal redesign Customizations modal redesign Aug 24, 2026
@hawkticehurst
Hawk Ticehurst (hawkticehurst) force-pushed the agents/can-you-kick-off-a-pi-coding-agent-3d251f1f branch from 67e3b40 to 975841b Compare August 25, 2026 18:09

@sbatten SteVen Batten (sbatten) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🤖 AI review verdict: request changes.

I found several functional and accessibility regressions in the redesigned card surfaces, including a recurrence of the MCP node-replacement bug fixed in #330890 and removal of the Settings Sync warning added in #331529. In addition to the inline findings, two required checks are red:

  • Compile & Hygiene fails because the new editor title contains an unsupported U+2013 character (inline comment below).
  • Screenshots & Tests passes Playwright, capture, and fixture-error checks, but fails because the newly gated blocks-CI hashes were not committed. Please review the visual diffs and update test/componentFixtures/blocks-ci-screenshots.md using the CI-generated hashes.

No high-confidence exploitable security issue was found, but the known MCP regression, keyboard/accessibility failures, migration data-availability regression, and required-check failures make this not ready to merge.

Comment thread src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.ts Outdated
Comment thread src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.ts Outdated
Comment thread src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.ts Outdated
Comment thread src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.ts Outdated
Comment thread src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedMcpServerDetail.ts Outdated
@hawkticehurst

Copy link
Copy Markdown
Member Author

Follow-up on the overall AI review verdict: the review was high-signal and the inline findings were substantively valid (with the :has() portion already outdated on the latest head). The deterministic Compile & Hygiene finding is fixed and the full hygiene task passes locally.

The blocks-CI screenshot warning was also valid for the reviewed commit. I reviewed the affected customization fixtures locally: 16 selected fixtures render without errors, and 10 dark/light/default/narrow fixtures are stable across three captures. I have not written screenshot hashes from macOS because blocks-ci-screenshots.md must use the PNG hashes produced by the Ubuntu CI job, and the follow-up changes alter gated fixtures again. The next pushed commit should use the CI-generated hash patch after the visual diff is reviewed.

For bot refinement, it would help to separate durable code findings from transient check-state findings and re-check the latter against the latest PR head before posting. That keeps an otherwise excellent review actionable across a fast-moving branch.

…lity

- Enhance aiCustomizationListWidget and related management editors.
- Introduce aiCustomizationPresentation for better UI handling.
- Update styles in aiCustomizationManagement.css for consistency.
- Improve tests for aiCustomization components to ensure reliability.
- Improve aiCustomizationManagementEditor and associated components
- Enhance styling in aiCustomizationManagement and welcome prompt
- Update tests for aiCustomizationManagementEditor and welcome page
- Update agent host sessions provider for better integration.
- Enhance AI customization management editor and presentation.
- Optimize embedded agent plugin and MCP server details.
- Clean up CSS for AI customization management.
- Adjust tests to reflect changes in AI customization components.
@hawkticehurst
Hawk Ticehurst (hawkticehurst) force-pushed the agents/can-you-kick-off-a-pi-coding-agent-3d251f1f branch from 0713a7a to e1d29dd Compare August 26, 2026 21:29
@hawkticehurst
Hawk Ticehurst (hawkticehurst) marked this pull request as ready for review August 26, 2026 21:30
Route failed-turn resume through the provider service and use the existing provider registration helper in its tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@sbatten SteVen Batten (sbatten) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🤖 AI second-pass review: request changes.

The findings from the first review were addressed, including the shared composite-list accessibility work, migration disclosure, README render guard/status handling, hygiene, and CSS cleanup. This pass found eight additional issues in the revised paths; the highest priority is a remaining session-backed variant of the MCP node-replacement bug fixed by #330890.

Current CI has 35 passing checks and one pending. The only failure is Screenshots & Tests: fixture tests, screenshot capture, and fixture error checks pass, but the updated blocks-CI screenshot hashes have not been committed.

Comment thread src/vs/workbench/contrib/chat/browser/promptSyntax/hookActions.ts
roblourens
roblourens previously approved these changes Aug 27, 2026

@roblourens roblourens left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

[Experimental performance review bot]

Human-approved experimental performance review.

(Written by Copilot)

Comment thread src/vs/workbench/contrib/chat/browser/aiCustomization/customizationCardList.ts Outdated
Comment thread src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedMcpServerDetail.ts Outdated
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Preserve live MCP and plugin detail controls, map remote MCP resources correctly, defer marketplace and editor work until visible, scope hook discovery by storage, and make card-list metadata linear.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep Agent Host provider mapping compatible with lightweight providers and accept the reviewed component screenshot baselines generated by CI.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@sbatten SteVen Batten (sbatten) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🤖 Third-pass review complete at current PR head 58b049a911f827443e0eaa195980f123e2f5b71a.

No new findings.

This pass was deliberately limited to changes after the second reviewed head:

  • 4c2a49ed: fixes for the eight second-pass comments;
  • c4a03bb1: CI/screenshot baseline fixes;
  • 58b049a9: subsequent merge from main, reviewing only its three combined conflict resolutions.

All eight second-pass fixes were verified, and no regressions introduced by those fixes were found. Compile/hygiene and the relevant platform/unit checks pass. The refreshed component-fixture run has no Playwright, render, or fixture errors; its current failure is only another blocks-CI screenshot hash mismatch after the latest merge.

Accept the reviewed Agent Host migration and welcome-page hashes generated by the blocks-CI Ubuntu run.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@hawkticehurst
Hawk Ticehurst (hawkticehurst) merged commit 2adee83 into main Aug 27, 2026
37 checks passed
@hawkticehurst
Hawk Ticehurst (hawkticehurst) deleted the agents/can-you-kick-off-a-pi-coding-agent-3d251f1f branch August 27, 2026 18:21
@vs-code-engineering vs-code-engineering Bot added this to the 1.136.0 milestone Aug 27, 2026
.map(marketplacePluginToItem);
this.searchInput.hideMessage();
} catch {
this.marketplaceItems = [];

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review: Each non-browse search cancels the previous token, but this catch ignores cancellation and request identity. If an older fetch rejects after a newer request succeeds, it clears the newer marketplace results, shows a stale warning, and refilters; clearing the query also leaves pending work active. Cancel delayed and in-flight work when the query clears, and only mutate results or messages when the CTS, query, and browse mode still match the initiating request.

getActions: () => {
const state = getPluginEnablementActionState(item.plugin.enablement.get());
return [
this.renderDisposables.add(new Action(`plugin.${state.isEnabled ? 'exclude' : 'include'}AlternateScope`, state.alternateLabel, undefined, true, async () => setEnablement(state.alternateState)))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review: Every dropdown click creates a new caller-owned Action and retains it in the detail-wide renderDisposables until the detail rerenders or closes. ButtonWithDropdown disposes its menu view items, not these actions, so repeatedly opening the menu accumulates emitters and callbacks. Reuse one action per rendered button, return an unregistered lightweight action, or dispose actions when each menu closes.

: localize('searchMcpPlaceholder', "Type to search...")
);
try {
const pager = await this.mcpWorkbenchService.queryGallery(undefined, cts.token);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review: This gallery request is still reachable when the effective chat.mcp.access value is none, including when policy-enforced. Selecting the MCP section can therefore issue a marketplace GET even though access-disabled UI is shown, and revocation leaves delayed or in-flight searches alive. Include effective access in snapshot/search eligibility and cancel delayedGallerySearch plus galleryCts when access becomes none; cover initial disabled visibility and revocation in tests.

if (this._store.isDisposed || this.current !== item) {
return;
}
const installed = this.getInstalledPluginForMarketplaceItem(item);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review: A successful install updates installed descriptors before MarketplaceAgentPluginDiscovery asynchronously publishes the plugin through IAgentPluginService.plugins, so this immediate lookup can miss. The detail does not observe the later publication and has no missing-result recovery, leaving the action disabled as Installing... until the view is recreated. Await or observe discovery of the expected URI, or return the installed plugin explicitly, and restore Install if registration never appears.

switchElement.title = blocked ? localize('pluginPolicyBlockedSwitch', "This plugin is managed by your organization.") : toggleLabel;
DOM.append(switchElement, $('.plugin-enable-switch-thumb'));
this.cardDisposables.add(DOM.addDisposableListener(switchElement, 'click', () => {
const nextState = getToggledPluginEnablementState(current);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review: This derives the transition from enablement captured when the row rendered, then the model update triggers an asynchronous full-card refresh. Before that refresh finishes, repeated activation writes the same transition while the live class and ARIA state remain stale; once it finishes, rebuilding cardContainer detaches the focused switch without restoring focus. Read current enablement per activation and update the row in place, or synchronously bind its state and restore the same row/action after rendering.

uninstallButton.label = uninstallAction.label;
uninstallButton.enabled = uninstallAction.enabled;
this.renderDisposables.add(uninstallButton.onDidClick(async () => {
await uninstallAction.run();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review: The active remove contract is void, but CLI and extension implementations are async and await confirmation. UninstallPluginAction discards that runtime promise and resolves immediately, so this await navigates back while confirmation is pending, including when the user later cancels or removal fails. Return an awaited success result from removal, propagate it through the action, and navigate only after confirmed success.

private setInstalledEntryEnabled(entry: IMcpInstalledEntry, enabled: boolean): void {
const activeSessionServer = getActiveSessionServer(entry);
if (activeSessionServer) {
activeSessionServer.setEnabled(enabled);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review: For an installed row with an active-session counterpart, this unqualified Enable/Disable switch writes only a Session decision and leaves profile/workspace enablement unchanged. A new session can therefore show the server enabled again even though the switch appeared to disable it generally. Label this control as session-scoped or have the primary switch update the durable/default scope.

const source = item.source;
const isWorkspaceFile = source === AICustomizationSources.local;
const isReadOnly = !source || source === AICustomizationSources.extension || source === AICustomizationSources.plugin || source === AICustomizationSources.builtin;
this.showEmbeddedEditor(item.uri, item.name, item.promptType, source ?? AICustomizationSources.builtin, isWorkspaceFile, isReadOnly);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review: The two preceding section-load awaits are not tied to the initiating navigation. If the user selects another section or view while either is pending, this stale continuation can still open the old plugin contribution and replace the newer destination. Track a navigation generation or cancellation token and recheck the requested section/view before calling showEmbeddedEditor.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants