Agent mode. The AI panel can now go full screen (robot icon in the
header): chat on the left, a live read-only picture of the board on the
right (new components/SpaceMiniView.tsx — cards as tinted tiles,
connections as lines, auto-fitted and refreshed as the agent works). On
narrow screens the preview stacks above the chat. Toggle back to the compact
popover any time; the compact popover also gained an expand/shrink button
for reading long threads.
Auto-layout. "Auto-arrange board" in the canvas right-click menu tidies
the whole space: cards joined by connections get a proper left→right flow
layout (dagre), everything else falls into a grid below, frames and their
members stay put, and the result is re-centered where the cards already
were. The AI can invoke the same thing via a new auto_layout action —
and is told to finish larger diagrams with it.
Durable chat history. Threads are never wiped anymore: re-briefing a
changed board appends a new briefing instead of deleting the conversation
(the server-side thread delete is gone), and local (non-cloud) spaces now
keep their thread in localStorage too — so the record of what was done, and
what fell short, survives reloads everywhere. Same-role turns are folded
before sending so providers that require alternating roles don't reject the
longer histories.
Fixed
Raw JSON leaking into the chat. Two real bugs: the action-block parser
used lazy bracket matching that broke on ] inside a label, and only
scrubbed blocks tagged ```actions — models routinely tag them
```json. The extractor now inspects every fenced block's content,
parses action arrays regardless of tag, strips action-looking blocks from
the prose even when malformed/truncated, and appends an honest "didn't come
through cleanly" note instead of showing broken JSON under confident prose.
Completely UNFENCED action arrays (models sometimes skip the code fences)
are parsed and stripped too. The chat also scrubs blocks at render time,
which cleans up previously saved messages.
Flow connections not connecting. Models often list create_connection
before the shapes it joins; validation and apply were single-pass, so those
connections were silently dropped. Both are two-pass now — refs are
collected from the whole batch before any endpoint is resolved.
Clustered/overlapping AI placement. New cards are collision-nudged apart
on arrival (existing cards included), and the placement prompt is much
stricter about reading CURRENT LAYOUT and minimum spacing.