Per mara's go-ahead on hyperhive#3902 ("getting started is good, but
terminal rendering does not go in there i think"):
Moved 21 top-level docs/*.md files into 7 new topic subdirectories
(existing web-ui/, turn-loop/, swarm/, tools/, crates/ untouched):
getting-started/ setup.md
agent-lifecycle/ agent-hierarchy.md, approvals.md, persistence.md
trust-boundary/ boundary.md, security.md
integrations/ forge.md, matrix.md, github.md, knowledge.md
networking/ gateway.md, network.md, snapshot-store.md
scheduler/ jobq.md, coordinator.md, ci.md, observability.md
process/ conventions.md, gotchas.md, pr-review-gate.md
web-ui/ terminal-rendering.md (moved into the EXISTING dir,
per mara's correction to the original getting-started
guess -- it's UI implementation detail, not onboarding)
The physical layout now matches docs/README.md's own topical headers,
which already amounted to this taxonomy -- see the scoping comment on
the issue for the two findings that motivated this (a genuine
duplication between CLAUDE.md's old "Reading paths" list and
docs/README.md's grouped one, since drifted out of sync with each
other; and the flat layout not matching the grouping we already had).
Fixed every cross-reference this moved across the whole repo (~120
files: docs/ internal links at every depth, Rust doc comments, nix
module option docs, crate READMEs) -- verified two ways: a grep sweep
confirming zero remaining references to any old path, and a script
that resolves every markdown link in docs/**/*.md + CLAUDE.md +
README.md against the filesystem and reports anything that doesn't
exist (zero broken links).
Collapsed CLAUDE.md's "Reading paths" section (the duplicate) down to
a pointer at docs/README.md, now the single index. Rewrote
docs/README.md itself to use the new subdirectory paths and added the
one doc it was missing that CLAUDE.md's old copy had (pr-review-gate.md).
Classified all 22 docs/*.md files first via a haiku subagent (mara's
suggestion) on two axes -- proposed grouping and operator-vs-
implementation focus -- before finalizing the taxonomy; spot-checked
the report and found internal inconsistencies (its classification
table disagreed with its own summary section for a few files), so this
taxonomy is my original proposal + the one correction mara gave
directly, not a blind application of the subagent's table. The
operator-focus data it gathered is still useful for a follow-up
content pass (docs skewing 'mixed' rather than pure operator-facing),
not addressed in this PR -- structure only.
nix fmt clean, both pre-push lints clean.
51 lines
2.3 KiB
Markdown
51 lines
2.3 KiB
Markdown
# 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 is served
|
|
identically by both `GET /api/events/history` and `GET /api/events/stream`
|
|
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` |
|
|
|
|
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.
|