Panes & Tabs
An IDE-like layout system: split the screen into nested panes, each holding multiple tabs across 9 kinds.
The pane tree
Panes form a recursive tree: axis nodes are horizontal/vertical splits, leaf nodes are real panes with their own tab bar. Split freely, drag to resize, and a pane auto-unsplits when its last tab closes.
Horizontal & vertical splits
Shortcuts: ⌘\ splits right, ⌘⇧\ splits down. Drag handles adjust the ratio.
Persisted layout
Layout persists per project in settings.json, plus a global lastLayout and named presets.
The 9 tab kinds
| Kind | Content |
|---|---|
| session | A chat/terminal session with an agent |
| file | File editor (CodeMirror 6) |
| spec | Project OpenSpec documents |
| merge · diff · compare | Source-difference views |
| gitlog | Git commit history |
| terminal | Standalone terminal |
| monitor | Process & system-resource monitor |
File tabs show a “dirty” dot for unsaved changes and auto-save when you switch away. View/edit: ⌘K. Save: ⌘S.
Why state survives tab switches
Stateful containers like the terminal (xterm) and editor are kept alive with a hidden-pool technique and v-show instead of being destroyed and recreated. As a result, terminal history, scroll position, and in-progress input stay intact when you switch projects or tab kinds.