SIGN IN SIGN UP

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