agent.md, css-vars.md, design-guide.md, shape.md, terminal-rendering.md --
26 of 40 write-good.Passive hits rewritten to name the actor (hive-agent,
browsers, the harness, the client, lifecycle::{spawn,rebuild}, CSS, the
router, ...), reusing an actor already named nearby wherever one exists.
14 left alone: established config-state conditionals ("when X is
set/enabled/given/called"), negative-capability/state-descriptor idioms
("is gone", "is hidden", "is unchanged"), one false-positive
("typed slash commands" as a compound noun, not a passive action), a
backward-looking changelog fact with no actor worth naming, and two
deliberately-parallel rhetorical contrasts (sanitized vs XSS-safe;
cache-hit vs cache-miss) left symmetric on purpose.
dashboard.md (70 more hits) is the next docs/web-ui/ batch, not part of
this one -- big enough to deserve its own PR.
2.6 KiB
Per-agent terminal: row taxonomy (as built)
The per-agent web UI's live pane renders one row per TermMsg
(hive-agent/src/term_msg.rs): {icon?, level: debug|info|warn|error, summary, body?, body_format?: markdown|diff, coalesce_key?}. Classification
(icon, summary text, whether a tool call gets an expandable body) happens
server-side, once — term_msg.rs + stream_enrich.rs — and both
GET /api/events/history and GET /api/events/stream serve it identically
as TermEnvelope { ts, seq?, msgs: TermMsg[] } frames
(hive-agent/src/web_ui/stream.rs).
The frontend renders a TermMsg close to as-is
(frontend/packages/agent/src/components/Row.tsx): level picks the
CSS colour (terminal.css's .live .level-*), an empty summary +
markdown body renders as a flat row with just the body (assistant
text), and any other bodied row is an expandable <details>, opened by
default according to the operator's expand-tool-output preference
(getExpandDetailsPref()) — uniformly, no per-tool override. There's no
separate client-side row model or classification step.
Layout
Every row shares one prefix column via padding-left + negative
text-indent on .live .row; an icon (when set) sits in a fixed-width
.row-glyph cell so icons of different rendered widths still line up.
<details> summaries reuse the same metrics, with the disclosure caret
leading the summary text rather than the icon.
Levels
| Level | Colour | Roughly |
|---|---|---|
debug |
muted | thinking, coalesced ticks, ambient harness chatter |
info |
default fg | turn start/ok, assistant text, tool calls + results |
warn |
amber, left rule | stderr, an unrecognised event shape, API retries |
error |
red, left rule | turn failed, a tool result with is_error: true |
The settings menu's "hide debug output" toggle (getHideDebugPref(),
@hive/shared/prefs.js) skips debug-level rows entirely rather than
muting them further — client-side only, same live-read-no-reload shape
as the expand-tool-output preference above.
Per-tool icon + summary formatting (what a Read/Edit/send call's row
actually says) lives in stream_enrich.rs's fmt_tool_use() family —
read that when you need the specifics, this doc doesn't duplicate it.
Markdown
frontend/packages/agent/src/lib/markdown.ts's renderMarkdown() runs
marked.parse() through DOMPurify into a <div class="md">. Applied to
any TermMsg with body_format: "markdown".
Dashboard side (not covered here)
The main dashboard's message-flow pane is a different shape: broker
messages render as .msgrow grid lines, not agent-terminal rows.