feat(canvas): put files and terminals on the board
Files and terminals can now sit on the infinite canvas next to conversations and notes, carried by one new `path` column on `canvas_node` (absolute file path for `file`, working directory for `terminal`; every other kind still rejects it). A file card renders the file tab rather than reimplementing it: the read-only renderer moves out of the viewer drawer into a shared `FileDocumentView` — shiki source, images, the Office trio via the officecli watch, markdown/HTML preview toggles — so the file pane, the drawer and the board cannot disagree about one file. `openFilePreview` grows a `background` option so mounting a board full of cards no longer reshuffles the workspace underneath it. A terminal card names its PTY after the row (`canvas-term-<id>`), so the shell outlives the canvas route unmounting. `terminal_snapshot` replays a per-terminal scrollback stamped with a monotonic `seq`, and the view attaches to the running PTY instead of starting a second one; deleting a card reaps its PTY inside the delete command, the only place the deletion is authoritative.
X
xintaofei committed
c5ff90e418fc1cda0d3c9788d1bf509350600bdb
Parent: bb95280