• v0.5.0 ffd22fb587

    refactor(tui): content-only main pane + Debug tab + dark chrome (v0.5.0)

    vh released this 2026-05-24 14:20:35 -07:00 | 260 commits to main since this release

    Two operator-driven changes off v0.4.1:

    1. Main pane is content-only. Pre-v0.5.0 the transcript mixed
      assistant text with telemetry (Thinking closed runs, WorkerPhase,
      TextBoundary) — only tool events were factored out per #13. The
      transcript now receives ONLY: user-prompt echo, assistant Text
      deltas, [done]/[error]/[cancelled] terminal labels, and the
      post-Done Markdown render. All telemetry routes to a new Debug
      tab in the right column.

    2. Chrome no longer blue. Textual's default Header / Footer /
      active-tab styling tints with $primary (Aurora blue under
      Australis), which read as garish on dark terminals. Header,
      Footer, and the TabbedContent tab strip get explicit
      background: $surface (Sea bright-black #373b46) so the chrome
      sits cool and unobtrusive against the Ice black background.

    Layout reshape

    LEFT COLUMN (content only):           RIGHT COLUMN (telemetry):
      transcript (RichLog, 1fr)             thinking-current (Static, dock top)
      prompt (Input, dock bottom)           TabbedContent:
                                              Tools  (tool_start, tool_result)
                                              Debug  (thinking, worker_phase,
                                                      text_boundary)
    

    The thinking-current live-preview Static moves from left → right
    column so the left column is genuinely content-only. Live thinking
    visibility now persists across tab switches (it docks above the
    TabbedContent, not inside any tab).

    Presenter routing (TuiPresenterState.render)

    Signature widens with debug_log: RichLog. Routing matrix:

    Text → log (transcript)
    Done / Error / Cancelled → log (transcript) [terminal labels]
    ToolStart / ToolResult → tools_log (Tools tab)
    Thinking (closed run) → debug_log (Debug tab)
    WorkerPhase → debug_log (Debug tab)
    TextBoundary → debug_log (Debug tab)
    Thinking (per-delta) → thinking_widget (live preview)

    INV-009 render-exception fallback preserves routing per event class
    (new INV-020) — ToolStart/Result falls back to tools_log;
    Thinking/WorkerPhase/TextBoundary to debug_log; everything else to log.

    Keybindings

    • Ctrl+1 → Tools tab (existing, unchanged)
    • Ctrl+2 → Debug tab (NEW)

    pane-name footer widget updates dynamically as the operator
    switches tabs ("Tools" ↔ "Debug"). This was previously deferred to
    "the multi-tab issue" per the Volva contract-review amendment;
    multi-tab now exists, so the dynamic update lands here.

    Contract amendments

    docs/contracts/issues/13.contract.md amended in-place:

    • INV-015 amended: transcript is content-only; telemetry routes to
      debug_log. Old routing (telemetry in transcript) retired under the
      no-backwards-compat rule.
    • INV-017 amended: thinking-current docks to right column (was left).
    • INV-019 new: two TabPanes (Tools + Debug), Ctrl+1/Ctrl+2 bindings,
      dynamic pane-name update.
    • INV-020 new: render-exception fallback preserves per-event-class
      routing.
    • Layout-spec snapshot ASCII diagram updated.

    Drift-check clean.

    Tests

    239/239 GREEN (+3 new: debug_tab_exists, ctrl_2_activates_debug_tab,
    pane_name_updates_on_tab_switch). 6 existing tests adjusted for the
    new routing (test_thinking_closes_one_debuglog_entry,
    test_multiple_thinking_runs_each_get_debuglog_entry,
    test_render_exception_fallback,
    test_cancelled_mid_thinking_closes,
    test_worker_phase_demoted_to_debug_log,
    test_left_column_content_only). ruff clean.

    Live smoke against personal Worldtree: mimir KB-search turn
    populated tools_log with 11 lines of tool events (search_library +
    read_note); debug_log with 20 lines of worker_phase + thinking
    content; transcript stayed content-only with ❯ user-prompt
    (Aurora bright-cyan) + assistant text deltas. Routing matrix
    holds end-to-end. (Diagnostic note: RichLog.lines is the rendered-
    output buffer; inactive TabPane content shows lines=0 until the
    tab activates and renders. Internal write store is correct — this
    is a Textual rendering quirk, not a routing bug.)

    Minor bump (v0.4.1 → v0.5.0) per SemVer etiquette: visible routing
    surface change for operators; transcript and Debug tab contents
    look different from yesterday's v0.4.1.

    Downloads