Skip to content

feat(dashboard): Mission Control — unified fleet command center for builds, chats & sub-agents #425

Description

@umi-appcoder

Status (2026-07-24): Phases 1–3 and the mobile screen have shipped (#426, #432); the board is now three columns#435 folded "Needs review" into Done, since the outcome badge on each finished card already carried that signal. Phase 4 (fleet scope) is dropped by design: workspaces are per-person, so a cross-pod board would aggregate other people's agents — the per-workspace board already shows everything you own (this also sidesteps the #360 cross-agent visibility question). Remaining work is tracked in the reworked Phases section below.

Problem

Running more than one agent at a time means juggling three tabs: builds live in Build, hypervisor chats in Hypervisor, and orchestrator sub-agents are buried inside a build's Subagents sub-tab. There is no single answer to the only question that matters when you run a fleet: "what needs me right now?" A build blocked 14 minutes on a permission prompt is invisible unless you happen to open that tab. This also compounds #267 (sidebar overload) — each new work surface today becomes another tab.

Industry context: every major platform converged on exactly this surface in 2026 (Devin Desktop's Agent Command Center, GitHub Agent HQ, Claude Code's claude agents dashboard, Cursor's cloud-agent dashboard). With Ona acquired by OpenAI, there is no open-source self-hosted equivalent — Coder's closest offering is a paid add-on. kube-coder already has every data source; it's missing only the unifying view.

Proposal: Mission Control

A new top-level tab: a board that unifies builds + hypervisor chats + sub-agents (and later, other pods via the controller) into one priority queue, organized by what needs a human:

Running → Waiting on you → Needs review → Done today

Mission Control — desktop dark

Card anatomy

  • Kind (BUILD / CHAT / SUB-AGENT), assistant + model, elapsed/wait time
  • AI-written one-line headline of what the agent is doing right now ("Wiring per-trigger history into server.py — 8 files touched")
  • Repo + worktree branch, lineage (parent build ↔ spawned sub-agents, cross-linked)
  • Footer actions: Reply · Watch · Transcript · Kill (Retry on failed, Resume on parked)

The killer column: "Waiting on you"

When an agent blocks on a permission prompt or a question, the actual prompt renders on the card with quick-reply buttons — answer from the board without opening the session. Amber edge + wait-age ("⏸ 14m") makes stalls impossible to miss. Reuses the quick-reply plumbing from #276 and the waiting-state detection behind WaitingBadge.

Needs review

Finished work shows evidence chips (tsc ✓ · vitest 214 ✓ · screenshots ×4 · e2e ✕ 1 flaky) and a PR deep-link, so review starts from evidence, not from a raw diff.

Detail drawer

Selecting a card opens a drawer: activity timeline (started from issue → read files → spawned sub-agents → ran tests → currently editing), live token/tool-call rate, and a follow-up composer — steer any agent without leaving the board.

Pulse strip

One-glance fleet state: 3 running · 2 waiting on you · 1 needs review · oldest wait 14m · events 26/min.

Scope switcher

"This workspace / Fleet (N pods)" — phase 4 aggregates every workspace through the controller using the existing Bearer remote-task API.

Light mode

Mission Control — desktop light

Mobile

Columns collapse to stacked swimlanes, Running/Waiting first — the "run your fleet from your phone" surface. Pairs naturally with Walkie: "what's my fleet doing?" → spoken pulse-strip summary.

Mission Control — mobile

Why this is cheap relative to how big it feels

Almost every data source already exists:

Board element Existing source
Build cards, states, quick replies /api/claude/tasks (+ waiting detection, #276)
Chat cards /api/hypervisor/threads + activity classification (#312)
Sub-agent cards + lineage agent-orchestrator list_subagents / task-context lineage
Timeline drawer structured transcript (#294) + activity timeline (#298)
Live updates /api/events SSE
Fleet scope controller + Bearer remote-task API

Genuinely new: a unified queue endpoint normalizing the three sources into one card schema, a cheap headline generator (classifier pass over recent transcript events), and the board UI.

GET /api/missioncontrol/queue
→ [{ id, kind: build|chat|subagent, assistant, model, state: running|waiting|review|done,
     headline, title, repo, branch, started_at, waiting_since?, waiting_prompt?,
     lineage: { parent?, children[] }, evidence?, links: { transcript, pr?, app? } }]

Phases

Remaining:

  • Classifier-written headlines — replace the log-tail heuristic (server.py marks the deferral) with a cheap classifier pass over recent transcript events
  • Evidence chips on Done cards — tsc/vitest/screenshot/PR chips, re-homed onto Done after refactor(mission): fold Needs review into Done — three-column board #435 removed the "Needs review" column
  • Walkie voice summary — "what are my agents doing?" → spoken pulse-strip readout for this workspace

Mockups

Interactive HTML mock (uses the real design tokens from tokens.css): docs/mockups/mission-control/index.html — assets on branch mission-control-mockup-assets.

Related

#267 (sidebar overload — this absorbs the "too many places to look" problem structurally) · #312 (activity classification — reused for card kinds) · #276 (quick replies) · #250 (mobile parity) · #363 (product metrics could feed the pulse strip) · #360 (cross-agent output reading — fleet scope must respect whatever posture is decided there)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions