awslabs / awslabs/cli-agent-orchestrator
[Feat] Non-technical Runs UI: start-a-run wizard, plain-language live board, animated flow graph (implementation available)
- Dominant language
- Python
- Stars
- 1.3k
- Forks
- 267
- Avg merge
- 1d 23h
- Merged PRs (30d)
- 70
Description
## Overview
The web dashboard currently speaks tmux: sessions, terminals, windows, providers. For the people who'd benefit most from CAO — someone who wants a team of agents to build something without touching a terminal — that's a wall. I built a non-technical front door on a branch and it's been validated end-to-end with Playwright against live agents. Filing as a feature suggestion + offer to upstream.
Branch: **https://github.com/call-me-ram/cli-agent-orchestrator/tree/feat/ops-mcp-orchestration-driver** (UI work is in `web/`, server enablers included; also fixes #281 and #282 — details below)
## What it adds
**"Runs" board (new default tab)**
- A CAO session is shown as a *run*: the supervisor is "the planner", other terminals are "workers", statuses map to plain language ("The planner is working…", "Worker developer needs your answer", "Hit a problem").
- **Flow-graph view per run**: planner node on the left, workers on the right, status-colored nodes — and an **animated pulse travels the edge for every live agent-to-agent message** (amber planner→worker on handoff/assign, green worker→planner on send_message). Pure SVG/SMIL, no graph dependency. Backed by a new `flow.message` bus event published at both send sites and multiplexed into the existing `/events` SSE stream.
- Answer dialog (shows the agent's actual question, sends the reply), Instruct dialog (message the planner mid-run), one-click end-run.
**Start-a-run wizard**
- Three steps: describe the goal in plain words → pick a planner profile → launch. Launch = existing `POST /sessions` + the goal as the planner's first message; one transparent retry absorbs cold-start init flakes.
**Zero status polling**
- One `EventSource('/events')` replaces all the 3s per-terminal `setInterval` polls; a Playwright test watches the network and fails if any status GET happens during a quiet window.
**Fixes for existing issues**
- **#281**: removing a *default* agent-profile directory now persists (new `disabled_agent_dirs` setting); the UI shows removed defaults with one-click Restore and renders the effective state the server returns, so "Settings saved" can't mislead.
- **#282**: a "Browse…" button opens an in-app folder picker backed by a new `GET /fs/dirs` (server-side listing, directories only) — wired into Settings *and* the wizard's project-folder field.
**Friction killers found by real use**
- Windows paths accepted everywhere a directory is entered (`C:\Users\me\project` → `/mnt/c/...` under WSL, Explorer "Copy as path" quotes stripped, missing folder auto-created, clear 400s instead of opaque 500s).
- Claude's workspace-trust dialog pre-seeded (`~/.claude.json`) so launching in a fresh directory can't stall init.
- Mouse-wheel scrolling in the web terminal (tmux mouse mode per CAO session).
- Per-agent **LLM model visibility** ("provider · model" on the board and terminal header), resolving the provider CLI's configured default when the profile doesn't pin one.
- Relative timestamps corrected for server/browser clock skew via an `X-Server-Time` header (WSL2 clock drift made a just-spawned session show "Active 6h ago").
- Terminal output viewer strips cursor-visibility and OSC-8 hyperlink escapes that leaked as `␛[?25h` garbage.
## Verification
Playwright e2e in `web/e2e/`: dashboard front door, the no-polling proof, and a full LIVE run (wizard → real claude planner → live narration → teardown) — all green. 47 vitest unit tests; server-side suite ~2,350.
Happy to split into reviewable PRs if there's interest.
Contributor guide
Assessment
This issue has not been assessed yet.