All releases

Mira v0.3.8

The agent-workspace release. The TUI was rebuilt from the ground up

The agent-workspace release. The TUI was rebuilt from the ground up around a three-layer architecture, and nearly every surface you touch in a session got faster, quieter, or more trustworthy.

New

  • Message queueing. Type and press Enter while the agent is working — the message parks under the composer (+ queued: …) and sends automatically when the turn finishes. ↑ pulls the newest queued message back for editing. The queue survives interrupts.
  • Live task panel. When the agent plans with task_create / task_update, a checkbox list renders under the working indicator — ○ pending, ◐ in progress, ✓ done — always mirroring the agent's own task store. Task tool calls no longer clutter the transcript; the panel is the feedback.
  • Edit-and-retry (ctrl+p). Rewind the conversation to the start of the last user turn — history and transcript — and put the prompt back in the composer for editing. Enter re-sends it.
  • One-keystroke undo (ctrl+z). Reverts the last file write, same machinery as /undo.
  • Turn receipts. The ✳ Baked for 34s marker now reports what the turn did: ✳ Engineered for 34s · 3 files +18 −4 · 7 tools · $0.02.
  • Terminal notifications. A desktop notification + bell when a turn finishes and when an approval is waiting (OSC 9 / OSC 777 / BEL, with tmux passthrough). Opt out with MIRA_NO_NOTIFY=1.
  • Live tool tail. The newest stdout line of a running command renders under its ◐ header, so a 90-second cargo test reads as working, not hung.
  • Live git chip. The header shows ⎇ main · 3± — dirty count refreshed after every turn, so it ticks up exactly when the agent starts writing files.
  • Clean startup banner. ℳ mira v0.3.8 · model · mode · cwd plus one rotating tip; the box-drawing wall of key hints is gone.

Changed

  • Unified diff preview. Edit/write approvals and completed edits render a real patch stream: single line-number gutter (old number on removed lines, new number on added/context lines), full-width red/green bands, syntax highlighting by file extension, exact whitespace, hunks grouped with context and ⋯ separators, long lines clipped instead of wrapped. Not a two-column comparison.
  • Tool groups auto-collapse. Groups from turns before the last user prompt render header-only, so a long session reads as a narrative. 1–9 toggle the nine most recent groups; ctrl+e expands full output and pins a group open.
  • Scrolling stays live during approvals. PgUp/PgDn, Alt+arrows and j/k scroll the transcript while an approval is pending — read the surrounding code before answering. y/a/n/Esc still answer.
  • Composer rebuilt. Word-wrapping at terminal width with exact caret placement, CJK-aware column math, growth up to 8 rows, bottom-anchored so the caret never leaves the screen. Long prompts are fully visible.
  • Goal panel. A standing /goal now renders as a persistent card under the header — condition, iteration progress, and the evaluator's latest reason — instead of scrolling past as info lines.

Fixed

  • Resize no longer desyncs scrolling: terminal resizes are an explicit state transition that invalidates the derived transcript layout and reconciles scroll before the next draw.
  • Notifications no longer skipped when a queued message auto-sends.
  • Diff gutter shows one number per row (a two-column variant shipped briefly and misread as duplicate line numbers).
  • Composer placeholder disappears no more; empty input shows ▸▸ message again.
  • Tool groups user-toggles no longer get swallowed by batching.

Under the hood

  • tui/ split into three layers — state/ (what is happening), render + components + layout (how it looks, where it goes), input + event_loop (what happens when the world moves) — with a TranscriptBlock presentation model. New UI states are one variant
    • one renderer.
  • Transcript layout is derived state: built per frame, cached for handlers, invalidated on width change.
  • DiffPreview gained a numbered hunk structure (hunks, truncated) additively — old persisted sessions still load.
  • Session::rewind_last_turn() for edit-and-retry.
  • 100+ new unit and rendered-frame tests (ratatui TestBackend).