v2.3.1 — Browser GUI fully wired, streaming fix, brand-neutral themes
v2.3.1 — Browser GUI fully wired, streaming fix, brand-neutral themes
🐛 Fixed
- TUI streaming duplication — every streamed token chunk wrote a new log line (
RichLog._childrendoesn't exist in Textual 8.x); a stream of N chunks produced N duplicate entries and the final answer was never rendered as Markdown. Streaming now updates one live entry in place and renders the final Markdown answer. - Browser GUI dead endpoints — ~30 controls called HTTP routes that had no backend handler and silently failed with
{"error": "not found"}: the/context,/clear,/compact,/pin,/unpin,/reload-contextslash commands, the Collective Memory (memory file) editor, Apply/Copy file buttons, the file tree panel, Settings save, Stop generation, diff-review responses, snippets, pricing, and more are now implemented and reach the shared agent runtime. - Stop could kill the server — the chat stream shared the server-shutdown event; pressing Stop in the GUI previously set the shutdown flag. Chat streaming now has its own cancel event.
- Checkpoint path escape —
rewind()now validates manifest paths against the workspace before restoring/deleting files (defense-in-depth against hand-edited manifests with absolute paths or..). - Version label sync — all surfaces now report v2.3.1.
✨ Improved
- Brand-neutral themes — SpaceX/Cursor/Apple styling renamed to Noir and Flat; saved themes migrate automatically; third-party brand wording removed from the UI.
- Minimal motion — TUI modals fade in with a gentle rise, chat scrolls smoothly, the input glows while the agent works; the GUI got press feedback, step glide-in, message hover lift, and a generating glow on the status dot (all respecting
prefers-reduced-motion). - README and architecture docs updated.
🧪 Tests
246 passing (added regression suites for streaming, checkpoint path escape, and the extended API endpoints).