Skip to content

paddleboard_ai_dock: Surface MCP catalog and add modal expand toggle - #39

Merged
jasonsmithio merged 2 commits into
mainfrom
ai-dock
May 22, 2026
Merged

paddleboard_ai_dock: Surface MCP catalog and add modal expand toggle#39
jasonsmithio merged 2 commits into
mainfrom
ai-dock

Conversation

@jasonsmithio

Copy link
Copy Markdown
Collaborator

Summary

Two AI Dock followups that were committed and verified in the same session as PR #38, but landed on the branch after PR #38 was merged. Same crate (paddleboard_ai_dock), same scope, same test surface.

  • 7b7327b664 — Surface MCP catalog in the MCP tab. Fixes the gap called out as a known follow-up in PR paddleboard_ai_dock: Introduce the AI Dock #38: the dock header counted "5 MCP servers" but the MCP tab itself only embedded McpServersView (installed-only) and never rendered the 5 catalog entries. Now an Available section sits above the absorbed view with one row per catalog entry (Filesystem, Fetch, Git, GitHub, Puppeteer). The Install button writes a ContextServerSettingsContent::Stdio entry into context_servers keyed by the catalog id; the absorbed McpServersView picks up the new server through its existing context_server_store subscription. Install state is read each render from settings, so any matching id shows as "Installed" regardless of which variant it was added through. crates/agent_ui/src/mcp_servers_ui.rs is untouched — fork-hygiene preserved.
  • 8b94177cbd — Make the AI Dock modal expandable. New expanded: bool field on AiDock plus a Maximize / Minimize icon button in the header (left of the X). Toggles between 56rem × 36rem (default, unchanged) and 80rem × 54rem (~2.1× the area). State is per-modal-instance, not persisted. Each tab's render path is size-agnostic — rows are full-width and the embedded McpServersView has its own scroll — so growing the modal just gives the content more room. Also drops the stray paddleboard-5.png sketch image that was committed at the repo root in 3d22299897 (called out as a known follow-up in PR paddleboard_ai_dock: Introduce the AI Dock #38).

Test plan

  • cargo check -p paddleboard_ai_dock clean
  • ./script/clippy -p paddleboard_ai_dock (release, all targets, deny warnings) clean
  • MCP install flow end-to-end (verified live in the running app): clicked Install on Filesystem from the catalog. Catalog row flipped to disabled "Installed", McpServersView re-rendered to "1/1 running", new filesystem card appeared with Running status, the npx -y @modelcontextprotocol/server-filesystem . process actually spawned, and ~/.config/paddleboard/settings.json gained the exact Stdio block the catalog described.
  • Modal expand toggle (verified live): clicked the Maximize button in the header. Modal grew from 56rem × 36rem to 80rem × 54rem, icon swapped to Minimize, tooltip swapped to "Collapse". Header layout stable across toggles. Click again collapses back.

Known follow-ups (carried over)

  • /verify, /review, /security-review are still in the catalog without bundled content; render as "Not installed" with no install path. Decide whether to drop from catalog (harness owns discovery) or ship our own copies.
  • McpEntry should grow an optional image field so the catalog can describe SandboxedStdio-capable servers (e.g. ghcr.io/github/github-mcp-server:latest for github). Then the install default could flip to sandboxed for entries that have an image, aligning with PB's sandboxing emphasis.
  • Persist expanded-state across modal reopens (settings or workspace-scoped global). Currently each reopen starts collapsed.
  • Tour sticky-file: workspace.rs:785 / paddleboard/src/main.rs:1494 only write PaddleBoard_Tour.md when missing. Existing users won't see updated tour content without manual delete.

Release Notes:

  • Added an "Available" catalog section to the AI Dock's MCP Servers tab (one-click install for filesystem, fetch, git, github, puppeteer), plus an Expand / Collapse toggle in the modal header that grows the dock to roughly 2× the area for browsing larger lists.

jasonsmithio and others added 2 commits May 22, 2026 10:46
Fixes the gap called out in PR #38's known follow-ups: the dock header
counted "5 MCP servers" but the MCP tab itself only embedded
McpServersView (installed-only) and never rendered the 5 catalog
entries. First-run users would click MCP, see "No MCP servers installed
yet", and have no way to discover what was available without going
elsewhere.

What lands:

- Compact "Available" section rendered at the top of the MCP tab,
  above the absorbed McpServersView. One row per catalog entry, with
  icon, name, description (truncated to the row width), and an
  Install / Installed button.
- Install button writes a ContextServerSettingsContent::Stdio entry
  into settings.project.context_servers keyed by the catalog id, using
  the catalog entry's command + args. update_settings_file does the
  write; the absorbed McpServersView picks up the new server through
  its existing context_server_store subscription. cx.notify() also
  fires after the write so the catalog row flips to "Installed"
  without waiting for the settings cascade.
- Install state is read each render from
  ProjectSettings::get_global(cx).context_servers.keys(); any matching
  catalog id shows the disabled "Installed" badge regardless of which
  variant (Stdio, SandboxedStdio, Extension, Http) the user actually
  has, so a server added via a different path doesn't get
  double-listed.

Intentionally preserved:

- crates/agent_ui/src/mcp_servers_ui.rs is untouched. The catalog
  section sits above the absorbed view in a v_flex().size_full() with
  the view as flex_1().min_h_0() below — every keymap binding, search
  filter, "+ Add Server" popover, status indicator, etc. that ships
  with the absorbed view continues to work without divergence.
- Default install variant is Stdio (unsandboxed) rather than
  SandboxedStdio, because SandboxedStdio requires a container image
  field and the catalog doesn't currently specify one. Users can flip
  to sandboxed after install. Extending McpEntry with an optional
  image field to enable SandboxedStdio-by-default is a worthwhile
  followup (aligns with PB's sandboxing emphasis) but out of scope.

Verified:

- cargo check -p paddleboard_ai_dock clean
- ./script/clippy -p paddleboard_ai_dock (release, all targets, deny
  warnings) clean
- UI smoke test: clicked Install on the Filesystem catalog entry from
  the running app. The catalog row flipped to "Installed", the MCP
  Servers header re-rendered to "1/1 running", a new filesystem card
  appeared in the absorbed view with Running status, the server
  process actually spawned (npx -y
  @modelcontextprotocol/server-filesystem .), and
  ~/.config/paddleboard/settings.json gained the exact Stdio block
  the catalog described.

Release Notes:

- Added an "Available" catalog section to the AI Dock's MCP Servers tab. The 5 bundled MCP server entries (filesystem, fetch, git, github, puppeteer) are now visible above the installed-servers manager, each with a one-click Install button that writes the right settings entry and spawns the server.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds a maximize/minimize toggle in the modal header so users can grow
the dock when there's more catalog or install content to scan than the
default size comfortably fits.

What lands:

- New `expanded: bool` field on `AiDock`, default `false`, plus a
  `toggle_expanded` method that flips it and calls `cx.notify()`.
- New `IconButton` in `render_header` placed left of the close button.
  Icon swaps between `IconName::Maximize` (when collapsed) and
  `IconName::Minimize` (when expanded); tooltip swaps between "Expand"
  and "Collapse". Both buttons live in the same `h_flex().gap_1()`
  cluster so the header layout doesn't shift across toggles.
- `render()` picks size based on `self.expanded` — normal is
  `56rem x 36rem` (unchanged), expanded is `80rem x 54rem`
  (~2.1x the area). Each tab's render path is size-agnostic — rows are
  full-width and the embedded `McpServersView` has its own internal
  scroll — so growing the modal just gives the content more room.

Intentionally preserved:

- State is per-modal-instance, not persisted. Closing and reopening the
  dock starts collapsed. Persisting modal layout across reopens is the
  kind of small-but-controversial UX call worth deferring until someone
  explicitly wants it.
- Two-state preset rather than free drag-to-resize. GPUI doesn't have a
  built-in resizable-modal primitive and rolling one would be a much
  bigger lift than the "minor change" framing implied.

Also: removes the stray `paddleboard-5.png` sketch image that got
committed at the repo root in the initial AI Dock commit (3d22299).
Was already called out as a known follow-up in PR #38; closing it here.

Verified:

- cargo check -p paddleboard_ai_dock clean
- ./script/clippy -p paddleboard_ai_dock (release, all targets, deny
  warnings) clean
- UI verification: clicked the new Maximize button in the modal header,
  the modal grew to the expanded size, the icon swapped to Minimize and
  tooltip flipped to "Collapse". Close button stayed in place.

Release Notes:

- Added an Expand / Collapse toggle to the AI Dock modal header so users can grow the dock to roughly 2x the area when browsing longer catalog or install lists.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Upstream drift report

Comparing PaddleBoard HEAD (8b94177cbd) against zed-industries/zed:main (2c26e5e544).
Last common ancestor: 8ca194d833.

Crate Files Insertions Deletions // PaddleBoard: tags
crates/agent 26 +25357 -1407 0
crates/agent_ui 33 +4477 -3836 6
crates/buffer_diff 1 +0 -4 0
crates/client 5 +116 -316 2
crates/collab 6 +20 -60 0
crates/collab_ui 2 +2 -2 0
crates/editor 14 +340 -393 0
crates/gpui 6 +60 -447 0
crates/language 2 +4 -2 0
crates/language_core 0 +0 -0 0
crates/lsp 0 +0 -0 0
crates/multi_buffer 0 +0 -0 0
crates/project 20 +1309 -689 1
crates/rope 0 +0 -0 0
crates/settings_content 6 +197 -31 6
crates/text 0 +0 -0 0
crates/workspace 12 +174 -498 1
Total 133 +32056 -7685 16

Generated by script/check-upstream-drift. See FORK_HYGIENE.md for context.

@jasonsmithio
jasonsmithio merged commit eb6bb6b into main May 22, 2026
1 check passed
@jasonsmithio
jasonsmithio deleted the ai-dock branch May 22, 2026 18:14
jasonsmithio added a commit that referenced this pull request May 31, 2026
paddleboard_ai_dock: Surface MCP catalog and add modal expand toggle
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.

1 participant