// Row model for the live event stream. One `StreamRow` = one rendered // line/panel in the terminal pane; `classifyEvent` (classifyEvent.ts) // turns a raw harness/stream-json event into zero or more of these, and // `` (components/Row.tsx) renders one. Kept as plain data (not JSX) // so the append/coalesce bookkeeping in useLiveStream.ts stays pure — // see docs/terminal-rendering.md for the exact taxonomy this mirrors. export interface StreamRowMeta { cls: string; text: string; } export interface StreamRow { /** Stable across re-renders; reused in place when a row is coalesced * (e.g. the thinking-token counter) so Preact updates rather than * remounts it. */ key: string; /** Space-joined class names appended after "row" / "row details", e.g. * "turn-start", "tool-result error" — taken verbatim from * @hive/shared/terminal.css's row-kind taxonomy. */ cssClass: string; icon?: string; fromHistory: boolean; /** When set, an event that maps to the same coalesceKey and lands * while this row is still the last one in the list replaces it in * place instead of appending a new row (thinking-token ticks, status * ticks, plugin_install started→completed). */ coalesceKey?: string; /** `false`/absent → flat `
`; `true` → `
` with `.summary-text` + optional body. */ details?: boolean; defaultOpen?: boolean; /** Flat-row prefix text, or the details `` text. Linkified, * never markdown. */ text?: string; /** Small trailing spans after the prefix text (turn-time, unread * count) — flat rows only. */ meta?: StreamRowMeta[]; /** Plain-text child block under a flat row (just the turn-start wake * body today) — its own class, no markdown parsing. */ childText?: StreamRowMeta; /** Sanitized-markdown body: appended under a flat row (assistant * text) or inside an open details row (send/recv bodies). */ markdownBody?: string; /** Plain `
` body inside a details row (generic long tool output). */
  plainBody?: string;
  /** `+`/`-`/context diff body inside a details row (Edit tool). */
  diffBody?: string;
}