Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions docs/zeus-parallel-agents-ui.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Parallel agents UI

Multiple Zeus subagents run concurrently. Each one needs a visible, cancellable, observable surface — but **never as the editor's primary view**.

This is the deliberate counter-positioning vs Cursor 3 / Antigravity 2.0 / Windsurf Cascade, all of which made the agent manager the home screen. The market signal (Pragmatic Engineer Feb 2026: Claude Code "most loved" 46%, more than 2× Cursor) says many senior developers prefer agents as a tool, not as their workflow's center.

## Where the UI lives

An **auxiliary bar view** (the right-side container in VS Code's workbench — formally "auxiliary bar"; the "side bar" is the left-side container by VS Code's own naming). Not the activity bar's first slot, not the editor center. Closeable. Reopen via command palette.

```text
┌──┬───────────────────────────┬─ Parallel agents view ──────────┐
│ │ │ ▶ docs-writer streaming… │
│A │ Editor (primary) │ tool: read_file │
│c │ user code, just like │ ▶ test-writer waiting on │
│t │ VS Code │ tool approval │
│iv│ │ ▼ security-reviewer done · │
│it│ │ 3 findings │
│y │ │ findings.md modified │
│ │ │ │
├──┴───────────────────────────┴─────────────────────────────────┤
│ Status bar ⚡ 2 agents running · $0.41 today · cache: 92% hit │
└────────────────────────────────────────────────────────────────┘
↑ status item is always visible; clicking it focuses the
auxiliary-bar view (right by default, draggable to left).
The status bar sits at the bottom — below both the editor
and the auxiliary bar — per VS Code's workbench layout.
```

## Behavior

- New agent: `Ctrl+K Ctrl+N` (chord) opens a quick-pick of skills from `.zeus/skills/`, runs the chosen one. The earlier draft used `Ctrl+Shift+A`, but that clashes with VS Code's `toggleSearchEditorContextLines` in the Search Editor; using a chord keeps the new shortcut out of every default scope
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The shortcut Ctrl+K Ctrl+N (and Ctrl+K Ctrl+A mentioned later) uses a chord where the second key also requires the Ctrl modifier. In VS Code, chords are more commonly implemented as Ctrl+K <key> (e.g., Ctrl+K N). Requiring the modifier for the second key is less common and can be slightly more cumbersome for users. Consider if Ctrl+K N and Ctrl+K A would be more idiomatic.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Both styles are established VS Code conventions — see core defaults Ctrl+K Ctrl+S (Open Keyboard Shortcuts), Ctrl+K Ctrl+B (Toggle Side Bar), Ctrl+K Ctrl+I (Show Hover), Ctrl+K Ctrl+W (Close All Editors). Keeping Ctrl+ on the second key matches that family and keeps the cognitive model uniform with the surrounding workbench shortcuts. We'd be the odd one out using Ctrl+K N here.

- Each agent: own subtree in the view with timeline (tool calls, text deltas), final summary, cancel button, "open in chat" button
- Done agents move to "Recent" collapsed group; never auto-dismissed
- A finished agent's file edits are surfaced as a diff PR-style review, not auto-applied
- Notifications: agent completion → optional status bar pulse, no modal

## What this UI does **not** do

- It is **not** the editor home page
- It does not auto-open on startup unless the user pinned it
- It does not show a "create a project plan" or "decompose this PRD" prompt
- It does not encourage running 10 agents at once just because you can

## File contracts

- Source of truth for runnable skills: `.zeus/skills/*.md` (loaded by `feat/agent-sdk`)
- Source of truth for running agents: `IAgentRuntime` events (from `feat/agent-sdk`)
- Cost / cache state: subscribed to from `feat/prompt-cache-hud` shared store

## Acceptance criteria (real impl)

- [ ] Quick-pick of skills picks one and starts it
- [ ] Auxiliary bar shows live tool-call timeline per agent
- [ ] Cancel works mid-stream
- [ ] Done agents persist in the view for the session
- [ ] No auto-open behavior on startup
- [ ] File edits are shown as diff, never applied without user "Apply"
- [ ] Keyboard: `Ctrl+K Ctrl+N` new agent, `Ctrl+K Ctrl+A` focus list — both chords, to avoid VS Code defaults (`Ctrl+Shift+A` is `toggleSearchEditorContextLines`; `Ctrl+Shift+L` is `editor.action.selectHighlights`)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The shortcut Ctrl+K Ctrl+A for focusing the list might lead to accidental triggers. Ctrl+A is the universal 'Select All' command. If a user accidentally initiates the Ctrl+K chord prefix, their next attempt to select text will unexpectedly shift focus to the Parallel Agents view. Consider using a less common key combination for this chord, such as Ctrl+K L or Ctrl+K P.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

The risk of an accidental Ctrl+K chord-prefix is real but bounded — the chord times out in ~1s, so a stray Ctrl+A after Ctrl+K will trigger select-all as usual. Aligning with the surrounding Ctrl+K Ctrl+<X> family in VS Code's defaults (Ctrl+K Ctrl+S, Ctrl+K Ctrl+B, etc.) outweighs the small risk; switching to a non-chord modifier combo would re-introduce the conflicts with core shortcuts that we just dodged.


## Status

Slot reserved at `src/vs/workbench/contrib/parallelAgents/`.
Comment thread
kanywst marked this conversation as resolved.
20 changes: 20 additions & 0 deletions src/vs/workbench/contrib/parallelAgents/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# `parallelAgents` contribution

Slot for the auxiliary-bar view that surfaces running and completed subagents. Design: [`docs/zeus-parallel-agents-ui.md`](../../../../../docs/zeus-parallel-agents-ui.md).

The view is deliberately **not** the editor's home surface — Zeus's counter-positioning vs Cursor 3 / Antigravity 2.0 / Windsurf Cascade.

## Canonical IDs

The view container, view, and command identifiers are exported from [`common/parallelAgents.ts`](./common/parallelAgents.ts):

- `PARALLEL_AGENTS_VIEW_CONTAINER_ID = 'zeus.parallelAgents'`
- `PARALLEL_AGENTS_VIEW_ID = 'zeus.parallelAgents.list'`
- `PARALLEL_AGENTS_COMMAND_NEW = 'zeus.parallelAgents.new'`
- `PARALLEL_AGENTS_COMMAND_FOCUS = 'zeus.parallelAgents.focus'`
Comment on lines +13 to +14
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Update the command IDs in the documentation to match the suggested naming convention in the code.

Suggested change
- `PARALLEL_AGENTS_COMMAND_NEW = 'zeus.parallelAgents.new'`
- `PARALLEL_AGENTS_COMMAND_FOCUS = 'zeus.parallelAgents.focus'`
- `PARALLEL_AGENTS_COMMAND_NEW = 'zeus.parallelAgents.command.new'`
- `PARALLEL_AGENTS_COMMAND_FOCUS = 'zeus.parallelAgents.command.focus'`

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Skipping for the same reason as the sibling thread on parallelAgents.ts.command segments aren't a VS Code convention, so leaving the IDs as zeus.parallelAgents.new / zeus.parallelAgents.focus keeps us aligned with how core registers commands.


Other branches (status-bar HUD, command palette, tests) should import these constants rather than retype the string IDs. Default location: right-hand **auxiliary bar**, `hideIfEmpty: true`. The activity bar's first slot is intentionally not taken; the view is opened via command palette or by clicking the agent count in the status bar.

## Why no `*.contribution.ts` yet

Registering a view container with no view body, or with a view that only renders "loading…", ships a broken UI as soon as this PR lands. The real registration is paired with the runtime stream in `feat/agent-sdk` (#26), where the view becomes interactive on day one and consumes the constants in `common/parallelAgents.ts`.
18 changes: 18 additions & 0 deletions src/vs/workbench/contrib/parallelAgents/common/parallelAgents.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

// Stable identifiers for the parallel-agents auxiliary-bar view. Exported
// here (rather than left as strings in the README) so the status-bar item
// in feat/prompt-cache-hud, command-palette entries, and tests can all
// import a single source of truth without duplicating literals.
//
// The real view registration lives in feat/agent-sdk; it consumes these
// constants when wiring up ViewContainerRegistry / ViewsRegistry.

export const PARALLEL_AGENTS_VIEW_CONTAINER_ID = 'zeus.parallelAgents';
export const PARALLEL_AGENTS_VIEW_ID = 'zeus.parallelAgents.list';

export const PARALLEL_AGENTS_COMMAND_NEW = 'zeus.parallelAgents.new';
export const PARALLEL_AGENTS_COMMAND_FOCUS = 'zeus.parallelAgents.focus';
Comment on lines +17 to +18
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

To align with VS Code's internal naming conventions and reduce the risk of ID collisions, consider adding a .command segment to the command identifiers. This helps distinguish them from view or container IDs at a glance.

Suggested change
export const PARALLEL_AGENTS_COMMAND_NEW = 'zeus.parallelAgents.new';
export const PARALLEL_AGENTS_COMMAND_FOCUS = 'zeus.parallelAgents.focus';
export const PARALLEL_AGENTS_COMMAND_NEW = 'zeus.parallelAgents.command.new';
export const PARALLEL_AGENTS_COMMAND_FOCUS = 'zeus.parallelAgents.command.focus';

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

VS Code's own conventions don't include a .command segment — core commands are editor.action.formatDocument, workbench.action.openSettings, workbench.view.explorer, etc. The view/container/command split is conveyed by the constant name (PARALLEL_AGENTS_VIEW_ID vs PARALLEL_AGENTS_COMMAND_NEW), not by the string ID. Following VS Code's prevailing pattern here to keep collision risk against built-in commands (which all flatly use <namespace>.<verb>) low.