Terminal dock & beast mode
Web shells that keep streaming when you navigate away, reattach after a refresh, and tile across the whole screen when you are working several at once.
Opening a shell on an agent or a tool used to mean staying on that page. It no longer does. Terminals are mounted outside the page tree, so navigating away minimizes a session instead of killing it, and the work carries on in the background.
The dock
Leave a shell page and its session folds into a tab strip along the bottom of the screen. Each tab carries the runtime's icon and the session name, and keeps streaming while docked. Click a tab to maximize it again — you land back on its shell page, mid-session. Past six tabs, the oldest fold into a +N overflow menu rather than shrinking further.
Right-clicking a tab offers End session and Close all.
Closing vs killing
The ✕ on a tab is the only gesture that ends a shell session. Navigating away, closing the page, or minimizing does not — that is the whole point. If you want the session gone, cross it out.
Surviving a refresh
Each dock entry carries a stable session id that is also sent to the backend when attaching. Reload the page and the browser reattaches to the same pod-side session rather than starting a new one — your scrollback, your running command, your shell state are all still there. The underlying session only dies on an explicit close or the server's idle reaping.
Beast mode
With two or more shells docked, a Beast mode button appears beside the tab strip. It splits the screen into one tile per session, tmux-style: a grid sized to the session count, with draggable dividers between columns and rows so you can give one terminal more room without losing sight of the others.
A Tabs toggle switches the same set to one session at a time behind a terminal-style tab strip; every other session keeps streaming in the background. End all closes the lot; exiting beast mode returns the sessions to the dock untouched.
Run tabs
Agent runs dock too, as status tabs rather than terminals: a spinner while the run executes, a pulse when it is blocked on input, and a done or failed flag when it finishes. Dismissing a run tab never cancels the run — reopen it and the run page repaints the full history from the stream backlog.