The agent pane
⌘⇧T opens a pane that runs Chidori, Raven’s in-process coding agent. It is a terminal pane — it splits, moves, zooms and closes like any other — but the window knows an agent lives in it, so the things you do all day have somewhere to live: answering an approval, running a shell command mid-conversation, taking the keyboard back.
Open one
⌘⇧T opens an agent pane in the focused space. It is⌘T’s verb one rung wider — the other kind of pane. Type into the composer at the bottom and press ⏎ to start a turn.
The pane is one surface. It has a shell of its own, a real interactive session that your ! commands share, but that shell is never shown on its own and nothing flips the pane to it. Changing directory there changes the directory the agent’s next turn and its file operations use.
- ⌘⇧TNew agent pane
- EscStop the running turn or
!command — never leaves the pane - ⌥↑Walk the prompt marks down the pane’s left edge — a turn at a time
- ⏎Jump to the selected turn
Approvals replace the composer
When the agent needs your decision, the request is the next input — so it takes the composer’s place and the pane’s keyboard the moment it arrives. There is never a second input underneath a transcript card competing for your typing.
The composer has the keyboard. You are mid-sentence.
- The request leads with its action, command and risk. Details stay behind a disclosure so the choices are always reachable.
- Choices carry visible shortcuts and wrap with the pane. The body scrolls in its own bounded viewport rather than pushing the buttons off screen.
- Chat about this — or Esc — restores your untouched draft and keeps the request paused. Tab and the return link reopen it.
- Sending that draft cancels the pending action first, then submits your message, so a discussion never queues behind the decision it was meant to discuss.
- A refresh of the same request keeps you in chat mode. A different request takes focus again. Pasted content never decides anything.
Answered decisions stay in the transcript, so the pane is also the record of what you allowed.
Command mode
Prefix a draft with ! and the input turns green and reads Command mode · Shell. ⏎ submits it to the pane’s own shell, using your system login shell, its startup configuration and its native syntax, Nushell included. Variables, exports, functions and history carry from one command to the next. A bare ! stays in the composer.
!git status --short
!cargo test --locked -p raven-mux control
!cd crates/parserCommand activity streams native rows from that terminal and then keeps the completed slice and its exit status, expandable in the thread. Output is bounded and truncation is reported. While a command runs, the composer reads Command mode · Input and a ! line is typed into that command — how a program waiting on a prompt gets its answer. Esc, Ctrl+C or the Stop control interrupts it. Output colors follow your terminal theme.
Model and effort
A new agent pane opens on the first model that can actually serve you: your configured ranking first, then the subscriptions signed in on this machine (Claude CLI, then Codex), then API keys, then OpenRouter. Nothing to set up if you already have one of those.
/modelswitches the pane’s model, and moves the effort to that model’s configured rung./effortpins reasoning effort —low | medium | high | xhigh | max— and outranks every configured default for the rest of the session./model Adaptiveroutes each request instead of fixing one model; the status strip names whichever model is handling the request while it runs.
Which model a pane opens on, and the effort each one starts at, are Settings → Agents — the ranking and the per-model efforts are one line each, the default effort is a menu, and a change reaches every window at once. A project can override them for itself without your having to restate the rest.
What the pane says it is doing
An agent pane has no foreground process to read — the agent runs inside the daemon — so it reports its own session state into the same three words every other pane uses. list-panes, the agents query, the sidebar and the pane’s own status strip all say one thing about one pane.
- working — a turn is running.
- blocked — the turn is waiting on an approval or a question. A turn that failed is blocked too: it is finished and it needs a person, which is what blocked means.
- idle — nothing is pending.
The pane’s age counts from when it entered that state, so “blocked for 22m” means what it says. The status mark carries the state in its shape, legible at 8 pixels, and a running turn ignites arcs on a still ring rather than spinning.
Taking the keyboard back
A pane can be driven by something other than you — the Fleet, a script, another agent. When it is, the pane says so, and the claim is enforced rather than advisory: writes from anywhere else are refused.
Typing into the pane is itself the takeover. You never reach for a control first. The next managed write is refused with human_control_active, and a submission caught between its two phases is reported as partial rather than half-delivered.
Nothing is retyped afterwards. A submission that was cut off may still have its text sitting in the harness’s editor; Raven leaves the screen exactly as you left it rather than typing it again behind you. Handing control back is its own act, so whatever was driving the pane has to look at it before it writes there again.
Suspend and resume
⌘⇧S suspends the focused pane’s agent, or resumes a parked one. A suspended pane keeps its final screen and grows a Resume control along its bottom edge naming what the suspend reclaimed.
Any keystroke resumes it — desktop, phone, or send-keys. That first key is the button press and is not delivered; everything typed after it is held by the daemon and written to the agent once the agent is actually back, not into the shell that comes up seconds ahead of it.
Raven suspends on its own only when four things agree: the agent is idle past the threshold, nothing on screen says otherwise, the pane has painted nothing at all for the whole threshold, and its process tree holds nothing but the shell and the agent’s own helpers — so a backgrounded build always blocks it. Off-screen panes park after 30 seconds by default; opening the space brings every agent in it back. Suspending a pane you are looking at is off by default.
Management lives in Raven
An agent pane is a worker: it does the task you opened it for and reports back. It does not coordinate other panes. When the fleet is on, its asks reach you in Raven instead — the Fleet region between that conversation’s thread and its composer, holding a Now index of up to three packets and the one you expand, with ⌘⌥C for the next one.
feat / onboarding claims it is finished. Checks: 3 ran, 3 passed. The bytes it is claiming are frozen, so what you judge cannot move underneath you.
Agents in ordinary panes
You do not have to use Chidori. Run claude, codex, gemini or a dozen other CLIs in a plain terminal pane and Raven reads the pane’s foreground process tree and screen to classify it into the same three words — including an agent inside tmux, over ssh, in a container, or behind mosh, where there is no local process to find. No per-agent configuration.
An agent can also tell Raven about itself. A CLI with hooks can publish its own status line, pane title or display name — so the pane reads “waiting on user” because the agent said so, not because something guessed. The control CLI page has the verb.
And these panes come back. Reopen the app and a pane that was running Claude Code or Codex returns as that agent, on the same conversation, in the directory it was in — not as an empty shell.