• v0.6.0 cfee89ac1c

    refactor(tui): streaming + turn headers + Thinking pane + picker fix (v0.6.0)

    vh released this 2026-05-24 15:29:55 -07:00 | 258 commits to main since this release

    Operator-driven big-batch polish + restructure:

    1. Streaming text — no more per-token RichLog spam

    Pre-v0.6.0, every Text SSE delta wrote its own RichLog line, so
    "Let me read the..." became 4+ separate lines (a Worldtree-style
    sentence-by-sentence reveal that read as broken). v0.6.0 adds a
    #current-text Static docked above the prompt; TuiPresenterState
    buffers Text deltas in text_buffer and updates the Static in
    place. On terminal event the Static clears and the transcript
    gets:

    • raw=False: post-Done Markdown body + Rule separator
    • raw=True: accumulated plain text

    The Static collapses to height=0 when empty so the prompt sits at
    the column bottom unchanged.

    2. Turn-ID headers across every pane

    _stream_turn_worker writes a Rule(title="turn N") to all four
    log panes (transcript, tools, debug, thinking) on the first event
    of each new turn. Operators can now visually correlate "what
    happened in Tools during turn 42" by section markers in matching
    positions across panes.

    3. New Thinking TabPane (Ctrl+3)

    Closed thinking runs now route to #thinking-log (a dedicated
    TabPane) instead of #debug-log. Each closed run writes three
    entries:

    • Rule(title="turn N · thinking #K start")
    • Markdown(thinking_content)
    • Rule(title="turn N · thinking #K end")

    Model reasoning often has lists/code/structure — rendering as
    Markdown (instead of the previous "· thinking: ..." prefix line)
    makes it scannable. The thinking_run_index counter scopes per
    turn so multi-thinking-run turns get distinct markers.

    thinking-current Static (live per-delta preview) stays in the
    right column above TabbedContent (unchanged from v0.5.0) — live
    visibility persists across tab switches.

    4. Agent picker — multi-line items, full description visible

    Pre-v0.6.0 the picker rendered each agent as a single Label with
    "{id} · {name} — {description}", which truncated descriptions
    visually. v0.6.0 uses two Static children per ListItem:

    • bold Aurora bright-blue line: "{agent_id} · {name}"
    • wrapped Sea dark-60 line(s): full description

    ListItems are auto-height so long descriptions wrap as needed.
    Highlighted (--highlight) row uses Sea dark-30 background instead
    of Aurora blue (which the operator flagged as ugly).

    5. Kill residual blue chrome

    The user's "background is still blue" report traced to the prompt
    Input's focused border, which I'd set to $primary (Aurora blue).
    Switched to $au-bright-cyan (#42dcd1) — focus highlight is now
    cyan, consistent with the operator's-voice accent throughout the
    TUI. Also added explicit overrides for ContentTabs strip
    background + active-tab underline color → Australis cyan.

    6. Surfaced emotion-appraisal request to worldtree-dev

    User asked for emotion-appraisal telemetry, but no SSE event for
    this exists in the spec — persona/Vili affect lives in persona.log
    (file-tail, blocked on remote-Worldtree topology) and per-character
    state (poll endpoint, not per-turn). Posted an althing thread
    proposing two shapes (worker_phase payload extension OR new
    affect_update event type) and routing the decision to their team.
    A 4th Emotion TabPane plugs in trivially when a wire event lands.
    Low-priority / quality-of-life framing — not blocking ship.

    Contract amendment

    docs/contracts/issues/13.contract.md amended in-place: INV-019
    extended to 3 TabPanes; new INV-021 (Text → current_text Static),
    INV-022 (thinking closed runs → thinking_log with Markdown +
    start/end Rules), INV-023 (turn-ID headers across all panes),
    INV-024 (thinking-current Static stays in right column with
    "thinking… " prefix per v0.5.1 polish). INV-020 (render-exception
    fallback routing) updated for Thinking → thinking_log. Drift-check
    clean.

    Tests

    241 GREEN (down from 244 in test count — 5 routing tests rewritten
    for the new shape, replacing the v0.5.0 thinking-in-debug-log
    assertions with the v0.6.0 thinking-log-as-Markdown shape; net
    test coverage equivalent). ruff clean.

    Live smoke against personal Worldtree's mimir confirmed:

    • transcript: 27 lines (turn header + user echo + done +
      markdown body, NO per-token spam)
    • thinking_log: 19 lines (turn header + 2x thinking start/end
      Rule sections with Markdown bodies)
    • current_text cleared post-Done

    Minor bump (v0.5.1 → v0.6.0) per SemVer etiquette: visible routing

    • new pane = operator-observable surface change.
    Downloads