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 34smarker 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-secondcargo testreads 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 · cwdplus 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–9toggle the nine most recent groups;ctrl+eexpands full output and pins a group open. - Scrolling stays live during approvals. PgUp/PgDn, Alt+arrows and
j/kscroll 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
/goalnow 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
▸▸ messageagain. - 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 aTranscriptBlockpresentation model. New UI states are one variant- one renderer.
- Transcript layout is derived state: built per frame, cached for handlers, invalidated on width change.
DiffPreviewgained 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).