Panel and keys
Opening it
Section titled “Opening it”| Key | Does |
|---|---|
| <leader>o | Toggle the panel under the conversation |
| <leader>j | Open the full console |
OpenCode’s leader is ctrl+x unless you have changed it, so these read as
ctrl+x o and ctrl+x j. Both are rebindable, in the
shell section — pick a key OpenCode does not already use:
{ "shell": { "keybinds": { "cockpit.shells.console": "<leader>z" } } }Every command below also has a slash name, so nothing here depends on a key being free.
One conversation at a time
Section titled “One conversation at a time”The panel lists the shells of the session you are in. A project’s shells all mixed together is how the panel stops making sense, so switching conversations changes what you see — without stopping anything. Press s in the console to widen it to the whole project and back.
The panel
Section titled “The panel”A dock under the chat with a tab per shell, the selected shell’s live screen, and the health of each
one at a glance. shell.dockHeight sets how tall, shell.dockOpen whether it starts open.
A shell’s state reads the same in the dock, the sidebar and the console: ⠹ RUN (the spinner turns
while it runs), ● FAIL, ● STOP, ● DONE. Running shells and recent failures stay in view; the rest
fold behind + N more.
The console
Section titled “The console”Full screen, one shell at a time.
The row along the bottom carries the keys that act on the shell in front of you — they change with its state, because a key with nothing to act on is noise:
running: [i] Type [c] ^C [r] Restart [x] Stop [?] Details [esc] Closefinished: [r] Run Again [d] Remove [?] Details [esc] CloseEverything else is behind ?, listed under the shell’s own facts. Those keys work from anywhere in the console, whether or not you can see them.
Acting on this shell
Section titled “Acting on this shell”| Key | Does |
|---|---|
| i return | Type into the shell — every key goes to the program, ctrl+c included |
| ctrl+] | Stop typing, back to these keys |
| c | Send ctrl+c without entering typing mode |
| r | Restart it, or run a finished one again |
| x | Stop it |
| d | Remove a finished shell from the list |
| shift+d | Forget every finished shell |
Looking around
Section titled “Looking around”| Key | Does |
|---|---|
| tab | Switch between the screen and the agent’s numbered log |
| / | Filter the log — matches highlighted, line numbers kept |
| backspace | Clear the filter |
| ? | Details: command, folder, timing, watcher, log file, and the keys on this page |
| j k or arrows | Scroll the log |
| g shift+g | Top, bottom |
| [ ] | Previous / next shell |
| s | This session only, or the whole project |
| n | Start a new shell yourself |
| q esc | Back to the conversation |
Searching a long log
Section titled “Searching a long log”Filtering happens in the daemon, so a 40,000-line dev server costs nothing to search.
See it without OpenCode
Section titled “See it without OpenCode”bunx @opencode-cockpit/shell previewbunx @opencode-cockpit/shell preview --part console --state failed --columns 60Draws the sidebar block, the dock and the console — empty, running, failed, details, a filtered log,
finished — from sample shells, in your terminal, with no OpenCode and no daemon running. --part
picks sidebar, dock or console; --width sets the sidebar’s width, --columns the dock’s and
the console’s; --help lists the states. Plain text under NO_COLOR or into a pipe.
Commands
Section titled “Commands”/shells-stop stops the shells you are looking at; /shells-stop-all stops every shell in the
project and asks first when that includes conversations you cannot see. /shells-dock toggles the
panel, /shell opens the console, /shells picks a shell (or “New shell”), /shell-new starts one,
/shells-clear forgets finished shells, /shells-restart-daemon replaces a daemon running older
code. Rebind them under shell.keybinds.