# Agents Page (`/agents`) Two-column layout: agent card list (320px) + agent output viewer. ## Default State ``` +============================================================================+ | CODEWALK DISTRICT | | [ Initiatives ] [*Agents*] [ Inbox ] [ Settings ] | +============================================================================+ | | | Agents (7) [ Refresh ] | | | | [*All (7)*] [Running (2)] [Questions (1)] [Exited (3)] [Dismissed (1)] | | | | +-------------+ +------------------------------------------------------+| | | | | Output: blue-fox-7 [ Stop ] || | | * blue-fox-7| |-----------------------------------------------------||\ | | [claude] | | [System] Starting task: Implement OAuth routes || | | [execute] | | || | | 2m ago | | > I'll start by examining the current auth setup. || | | | | || | |-------------| | [Tool Call] Read || | | | | file_path: src/auth/index.ts || | | red-elk-3 | | || | | [claude] | | [Result] || | | [research]| | import { Router } from 'express'; || | | 5m ago | | export function setupAuth(app) { ... || | | Answer -> | | || | | | | > Based on the existing code, I'll create the || | |-------------| | > OAuth module with the following structure... || | | | | || | | grey-owl-1| | [Tool Call] Write || | | [openai] | | file_path: src/auth/oauth.ts || | | [plan] | | || | | 1h ago | | [Result] || | | Exited | | File written successfully || | | | | || | |-------------| | --- Session End --- || | | ... | | [Cost: $0.12] [Duration: 2m 34s] || | | | | || | +-------------+ | [Following v] [Jump to bottom] || | +------------------------------------------------------+| | 320px flex-1 | +============================================================================+ ``` ## Filter Bar ``` [*All (7)*] [Running (2)] [Questions (1)] [Exited (3)] [Dismissed (1)] ^^^^^^^^^ active pill (filled background), each shows count badge ``` Filter options: - **All**: Every agent - **Running**: Status = `running` - **Questions**: Status = `waiting_for_input` - **Exited**: Status = `exited`, `completed`, `crashed` - **Dismissed**: Status = `dismissed` ## Agent Card (in left list) ### Running Agent ``` +---------------------------+ | * blue-fox-7 [...] | <-- StatusDot (green) + name + actions menu | [claude] [execute] | <-- provider badge + mode badge | 2m ago | <-- relative timestamp +---------------------------+ ``` ### Waiting for Input ``` +---------------------------+ | ? red-elk-3 [...] | <-- StatusDot (orange) | [claude] [research] | | 5m ago | | Answer questions -> | <-- link to inbox +---------------------------+ ``` ### Exited ``` +---------------------------+ | - grey-owl-1 [...] | <-- StatusDot (grey) | [openai] [plan] | | 1h ago | +---------------------------+ ``` ## Agent Actions Menu ([...]) ``` +---------------------------+ | Go to Inbox | <-- only when waiting_for_input | Stop | <-- only when running/waiting | Dismiss | <-- only when stopped/crashed/idle | Delete | <-- destructive, when stopped/dismissed +---------------------------+ ``` ## Agent Output Viewer (right panel) ### Header ``` +------------------------------------------------------------------------+ | Output: blue-fox-7 [!] [ Stop ] | | ^ | | connection error indicator (if disconnected) | +------------------------------------------------------------------------+ ``` ### Output Content (dark zinc-900 background, monospace) ``` [System] Starting task: Implement OAuth routes <-- grey badge > I'll start by examining the current auth setup. <-- white text | [Tool Call] Read <-- blue left border | file_path: src/auth/index.ts | [Result] <-- green left border | import { Router } from 'express'; | export function setupAuth(app) { ... > Based on the existing code, I'll create the OAuth module. <-- white text | [Tool Call] Write <-- blue left border | file_path: src/auth/oauth.ts | [Result] <-- green left border | File written successfully | [Error] <-- red left border | Permission denied: /etc/hosts <-- red text ─── Session End ─── <-- divider [Cost: $0.12] [Duration: 2m 34s] <-- badges ``` ### Footer Controls ``` [Following v] [Jump to bottom] ^^^^^^^^^^^ toggles: Following / Paused ``` - **Following**: auto-scrolls to bottom as new output arrives - **Paused**: stops auto-scroll (toggled when user scrolls up) - **Jump to bottom**: scrolls to latest output ## No Agent Selected ``` +------------------------------------------------------------------------+ | | | | | - - - - - - - - - - - - - - - - | | Select an agent to view output | | - - - - - - - - - - - - - - - - | | | | | +------------------------------------------------------------------------+ ``` ## Source - `packages/web/src/routes/agents.tsx` - `packages/web/src/components/AgentOutputViewer.tsx` - `packages/web/src/components/AgentActions.tsx`