From c7b2412906c4638c731179b09a0046cf6786edd1 Mon Sep 17 00:00:00 2001 From: kanywst Date: Sun, 24 May 2026 20:23:45 +0900 Subject: [PATCH 1/6] feat(parallel-agents-ui): scaffold side-bar view contribution Reserves 'src/vs/workbench/contrib/parallelAgents/' for the side-bar view that surfaces running and completed subagents, and documents the design at 'docs/zeus-parallel-agents-ui.md'. The view is deliberately **not** the editor's primary surface. This is Zeus's counter-positioning vs Cursor 3 / Antigravity 2.0 / Windsurf Cascade, all of which made agent management the home screen. Market signal (Pragmatic Engineer Feb 2026, Claude Code most-loved 46%) suggests many senior developers prefer agents as a tool rather than as their workflow's center. --- docs/zeus-parallel-agents-ui.md | 61 +++++++++++++++++++ .../contrib/parallelAgents/README.md | 7 +++ 2 files changed, 68 insertions(+) create mode 100644 docs/zeus-parallel-agents-ui.md create mode 100644 src/vs/workbench/contrib/parallelAgents/README.md diff --git a/docs/zeus-parallel-agents-ui.md b/docs/zeus-parallel-agents-ui.md new file mode 100644 index 00000000..90e874da --- /dev/null +++ b/docs/zeus-parallel-agents-ui.md @@ -0,0 +1,61 @@ +# 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 + +A **side bar view** (not the activity bar's first slot, not the editor center). Closeable. Reopen via command palette. + +```text +┌─ Editor (primary surface) ──────────────────────────────────┐ +│ │ +│ user code, just like vscode │ +│ │ +├─ Status bar (always visible) ────────────────────────────────┤ +│ ⚡ 2 agents running · $0.41 today · cache: 92% hit │ +└──────────────────────────────────────────────────────────────┘ + ↑ click status item → opens side bar view ↓ +┌─ Parallel agents view (collapsible side bar) ───────────────┐ +│ ▶ docs-writer streaming… tool: read_file │ +│ ▶ test-writer waiting on tool approval │ +│ ▼ security-reviewer done · 3 findings │ +│ findings.md modified │ +└──────────────────────────────────────────────────────────────┘ +``` + +## Behavior + +- New agent: `Ctrl+Shift+A` opens a quick-pick of skills from `.zeus/skills/`, runs the chosen one +- 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 +- [ ] Side 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+Shift+A new agent, Ctrl+Shift+L focus list + +## Status + +Slot reserved at `src/vs/workbench/contrib/parallelAgents/`. diff --git a/src/vs/workbench/contrib/parallelAgents/README.md b/src/vs/workbench/contrib/parallelAgents/README.md new file mode 100644 index 00000000..f4082109 --- /dev/null +++ b/src/vs/workbench/contrib/parallelAgents/README.md @@ -0,0 +1,7 @@ +# `parallelAgents` contribution + +Slot for the side-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. + +Depends on the `IAgentRuntime` event stream from `feat/agent-sdk`. From 289cd7cb0a3b1a3144b2b4dd3ae2feb477f303ee Mon Sep 17 00:00:00 2001 From: kanywst Date: Sun, 24 May 2026 21:25:13 +0900 Subject: [PATCH 2/6] docs(parallel-agents): swap focus shortcut to Ctrl+K Ctrl+A chord Ctrl+Shift+L collides with editor.action.selectHighlights ('Select All Occurrences'), a core multi-cursor keybinding. Use a chord instead ('Ctrl+K Ctrl+A'), which is the vscode pattern for less-frequent actions and doesn't clash with default bindings. --- docs/zeus-parallel-agents-ui.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zeus-parallel-agents-ui.md b/docs/zeus-parallel-agents-ui.md index 90e874da..226ca8db 100644 --- a/docs/zeus-parallel-agents-ui.md +++ b/docs/zeus-parallel-agents-ui.md @@ -54,7 +54,7 @@ A **side bar view** (not the activity bar's first slot, not the editor center). - [ ] 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+Shift+A new agent, Ctrl+Shift+L focus list +- [ ] Keyboard: `Ctrl+Shift+A` new agent, `Ctrl+K Ctrl+A` focus list (chord, to avoid VS Code's `Ctrl+Shift+L` = `editor.action.selectHighlights` needed for multi-cursor) ## Status From aaeb4311f2c17aa953cdedbb25e4472b99383234 Mon Sep 17 00:00:00 2001 From: kanywst Date: Sun, 24 May 2026 23:38:29 +0900 Subject: [PATCH 3/6] docs(parallel-agents): fix readme path, clarify contribution lands with runtime - README path: 5 ../ segments, not 6 (src/vs/workbench/contrib/<> is 5 deep from repo root). - Explicitly say the .contribution.ts isn't in this PR because it subscribes to IAgentRuntime, which is itself scaffolded in feat/agent-sdk. Wiring up an empty view that subscribes to an empty runtime adds noise without coverage; we wait for the runtime to land. --- src/vs/workbench/contrib/parallelAgents/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/parallelAgents/README.md b/src/vs/workbench/contrib/parallelAgents/README.md index f4082109..37c75460 100644 --- a/src/vs/workbench/contrib/parallelAgents/README.md +++ b/src/vs/workbench/contrib/parallelAgents/README.md @@ -1,7 +1,7 @@ # `parallelAgents` contribution -Slot for the side-bar view that surfaces running and completed subagents. Design: [`docs/zeus-parallel-agents-ui.md`](../../../../../../docs/zeus-parallel-agents-ui.md). +Slot for the side-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. -Depends on the `IAgentRuntime` event stream from `feat/agent-sdk`. +This README is the slot marker; the actual `*.contribution.ts` lands together with `IAgentRuntime` in `feat/agent-sdk`, because the view body is meaningless without the runtime event stream it subscribes to. From cb926a1b56fa4579f2cac69de4fb98a5fa240f12 Mon Sep 17 00:00:00 2001 From: kanywst Date: Mon, 25 May 2026 00:09:54 +0900 Subject: [PATCH 4/6] docs(parallel-agents): re-draw layout per vscode workbench, pin view container IDs --- docs/zeus-parallel-agents-ui.md | 30 ++++++++++--------- .../contrib/parallelAgents/README.md | 13 +++++++- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/docs/zeus-parallel-agents-ui.md b/docs/zeus-parallel-agents-ui.md index 226ca8db..2e73ecb2 100644 --- a/docs/zeus-parallel-agents-ui.md +++ b/docs/zeus-parallel-agents-ui.md @@ -9,20 +9,22 @@ This is the deliberate counter-positioning vs Cursor 3 / Antigravity 2.0 / Winds A **side bar view** (not the activity bar's first slot, not the editor center). Closeable. Reopen via command palette. ```text -┌─ Editor (primary surface) ──────────────────────────────────┐ -│ │ -│ user code, just like vscode │ -│ │ -├─ Status bar (always visible) ────────────────────────────────┤ -│ ⚡ 2 agents running · $0.41 today · cache: 92% hit │ -└──────────────────────────────────────────────────────────────┘ - ↑ click status item → opens side bar view ↓ -┌─ Parallel agents view (collapsible side bar) ───────────────┐ -│ ▶ docs-writer streaming… tool: read_file │ -│ ▶ test-writer waiting on tool approval │ -│ ▼ security-reviewer done · 3 findings │ -│ findings.md modified │ -└──────────────────────────────────────────────────────────────┘ +┌──┬───────────────────────────┬─ Parallel agents view ──────────┐ +│ │ │ ▶ docs-writer streaming… │ +│A │ Editor (primary) │ tool: read_file │ +│c │ user code, just like │ ▶ test-writer waiting on │ +│t │ vscode │ 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 + side-bar view (right-side panel by default, draggable to + left). The status bar sits at the bottom — below both the + editor and the side bar — per vscode's workbench layout. ``` ## Behavior diff --git a/src/vs/workbench/contrib/parallelAgents/README.md b/src/vs/workbench/contrib/parallelAgents/README.md index 37c75460..49b72931 100644 --- a/src/vs/workbench/contrib/parallelAgents/README.md +++ b/src/vs/workbench/contrib/parallelAgents/README.md @@ -4,4 +4,15 @@ Slot for the side-bar view that surfaces running and completed subagents. Design The view is deliberately **not** the editor's home surface — Zeus's counter-positioning vs Cursor 3 / Antigravity 2.0 / Windsurf Cascade. -This README is the slot marker; the actual `*.contribution.ts` lands together with `IAgentRuntime` in `feat/agent-sdk`, because the view body is meaningless without the runtime event stream it subscribes to. +## 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) so the view becomes interactive on day one. + +What this PR *does* commit to: + +- `viewContainerId`: `zeus.parallelAgents` +- `viewId`: `zeus.parallelAgents.list` +- Default location: right-side bar, `hideIfEmpty: true` +- Activity-bar slot: **not** taken; opened via command palette or by clicking the agent count in the status bar + +Other branches reference these IDs from `common/parallelAgents.contribution.ts` once `feat/agent-sdk` lands. Treat this README as the canonical pin until then. From a6bf76b6a0e60f18d43710b59a95674e8daaa8da Mon Sep 17 00:00:00 2001 From: kanywst Date: Mon, 25 May 2026 00:27:44 +0900 Subject: [PATCH 5/6] feat(parallel-agents): export TS constants, fix VS Code terminology (auxiliary bar), chord shortcut --- docs/zeus-parallel-agents-ui.md | 14 ++++++------- .../contrib/parallelAgents/README.md | 20 ++++++++++--------- .../parallelAgents/common/parallelAgents.ts | 18 +++++++++++++++++ 3 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 src/vs/workbench/contrib/parallelAgents/common/parallelAgents.ts diff --git a/docs/zeus-parallel-agents-ui.md b/docs/zeus-parallel-agents-ui.md index 2e73ecb2..6f59e226 100644 --- a/docs/zeus-parallel-agents-ui.md +++ b/docs/zeus-parallel-agents-ui.md @@ -6,14 +6,14 @@ This is the deliberate counter-positioning vs Cursor 3 / Antigravity 2.0 / Winds ## Where the UI lives -A **side bar view** (not the activity bar's first slot, not the editor center). Closeable. Reopen via command palette. +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 │ vscode │ tool approval │ +│t │ VS Code │ tool approval │ │iv│ │ ▼ security-reviewer done · │ │it│ │ 3 findings │ │y │ │ findings.md modified │ @@ -22,14 +22,14 @@ A **side bar view** (not the activity bar's first slot, not the editor center). │ Status bar ⚡ 2 agents running · $0.41 today · cache: 92% hit │ └────────────────────────────────────────────────────────────────┘ ↑ status item is always visible; clicking it focuses the - side-bar view (right-side panel by default, draggable to - left). The status bar sits at the bottom — below both the - editor and the side bar — per vscode's workbench layout. + 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+Shift+A` opens a quick-pick of skills from `.zeus/skills/`, runs the chosen one +- 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 - 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 @@ -56,7 +56,7 @@ A **side bar view** (not the activity bar's first slot, not the editor center). - [ ] 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+Shift+A` new agent, `Ctrl+K Ctrl+A` focus list (chord, to avoid VS Code's `Ctrl+Shift+L` = `editor.action.selectHighlights` needed for multi-cursor) +- [ ] 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`) ## Status diff --git a/src/vs/workbench/contrib/parallelAgents/README.md b/src/vs/workbench/contrib/parallelAgents/README.md index 49b72931..bf0d028d 100644 --- a/src/vs/workbench/contrib/parallelAgents/README.md +++ b/src/vs/workbench/contrib/parallelAgents/README.md @@ -1,18 +1,20 @@ # `parallelAgents` contribution -Slot for the side-bar view that surfaces running and completed subagents. Design: [`docs/zeus-parallel-agents-ui.md`](../../../../../docs/zeus-parallel-agents-ui.md). +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. -## Why no `*.contribution.ts` yet +## Canonical IDs + +The view container, view, and command identifiers are exported from [`common/parallelAgents.ts`](./common/parallelAgents.ts): -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) so the view becomes interactive on day one. +- `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'` -What this PR *does* commit to: +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. -- `viewContainerId`: `zeus.parallelAgents` -- `viewId`: `zeus.parallelAgents.list` -- Default location: right-side bar, `hideIfEmpty: true` -- Activity-bar slot: **not** taken; opened via command palette or by clicking the agent count in the status bar +## Why no `*.contribution.ts` yet -Other branches reference these IDs from `common/parallelAgents.contribution.ts` once `feat/agent-sdk` lands. Treat this README as the canonical pin until then. +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`. diff --git a/src/vs/workbench/contrib/parallelAgents/common/parallelAgents.ts b/src/vs/workbench/contrib/parallelAgents/common/parallelAgents.ts new file mode 100644 index 00000000..95bebe18 --- /dev/null +++ b/src/vs/workbench/contrib/parallelAgents/common/parallelAgents.ts @@ -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'; From a00a7f6d2467607a25350e52486d1fcc122cb604 Mon Sep 17 00:00:00 2001 From: kanywst Date: Mon, 25 May 2026 22:43:46 +0900 Subject: [PATCH 6/6] docs(parallel-agents): use 'Auxiliary bar' consistently in acceptance criteria Caught by reviewer: line 54 still said 'Side bar' while the rest of the doc establishes that the right-side container is formally the auxiliary bar (the side bar is the left container by VS Code's naming). --- docs/zeus-parallel-agents-ui.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zeus-parallel-agents-ui.md b/docs/zeus-parallel-agents-ui.md index 6f59e226..9914d074 100644 --- a/docs/zeus-parallel-agents-ui.md +++ b/docs/zeus-parallel-agents-ui.md @@ -51,7 +51,7 @@ An **auxiliary bar view** (the right-side container in VS Code's workbench — f ## Acceptance criteria (real impl) - [ ] Quick-pick of skills picks one and starts it -- [ ] Side bar shows live tool-call timeline per agent +- [ ] 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