Skip to content
For teams: coding agents on the self-hosted models you're allowed to run - see early access →

Commands & shortcuts

The terminal frontend is a full TUI (built with Ink): assistant text streams live, tool calls render as cards (⏺ tool_name(args) → ⎿ tool_name result, or ✗ tool_name error on failure), and approval prompts appear inline. When one model turn fires several tool calls at once, each result renders under its own call even if the results arrive interleaved.

  • Type a message and press Enter to send.
  • Type / for a live-filtering command popup. ↑↓ to move, Tab fills in the highlighted command without running it, Enter runs it immediately - except a command that needs an argument (like /rename <name>), where Enter fills the input instead so you can type the argument. The popup disappears as soon as you type a space or newline.
  • Type @ for a fuzzy-search popup of project files, agent definitions, and skills. Same ↑↓ / Tab / Enter keys. On send, @<path> inlines the file’s contents (file mentions), @<agent> <task> runs that agent, @<skill> activates that skill.
  • You can keep typing and sending while a turn is running. Each message queues (shown dimmed above the input, with a count next to “working…”) and runs automatically, in order, once the current one finishes. Nothing is ever dropped.
Key Action
Enter Send the message.
Shift+Tab Cycle permission mode manual → auto → plan → …. The status bar shows the current mode. (Not Ctrl+Tab - terminals intercept it.)
Ctrl+R Toggle the verbatim raw block under every repaired tool call in the transcript.
Esc Stop the turn in progress without exiting. Anything queued during it is kept and runs next; press Esc again while those queued messages run to cancel them. (A rejected plan or an approval-prompt “Comment” discards the queue instead.)
Ctrl+C Exit immediately.
Command Action
/status Print the current posture: model and endpoint (and whether it’s local), permission mode, web-search backend, transcript persistence, retention, MCP servers and their transports, loaded project instructions, agent definitions, the active skill, tool-output scanning mode, configured hook counts, context usage, session cost, and tool-call reliability so far. Read-only.
/cost Show this session’s token totals and estimated cost, with a per-model breakdown when the session has switched models. Anthropic models are priced from a built-in list-price table; other models are free unless given a rate via the pricing setting. Prompt-cache reads (Anthropic) are billed at the discounted rate automatically. The figure is an estimate, not a bill.
/reliability Per-model breakdown of this session’s tool-call reliability: how many calls the model made, how many needed repair, how many failed to parse, and how many times it gave up. Session-scoped, not persisted. See The tool-call protocol.
/raw Print the verbatim model output for every repaired tool call so far this session - the malformed block as it arrived, before repair. Ctrl+R toggles the same raw blocks inline under each transcript card.
/agents List the loaded agent definitions with their descriptions and sources. Invoke one with @<name> <task>.
/skills · /skill off /skills lists loaded skills and marks the active one; /skill off clears the active skill (next turn). Activate a skill by typing @<name> in a message.
/model · /model <name> Open a picker to switch models, or switch directly by name. The picker annotates each model with its reliability this session when there’s data. See Multiple models.
/share · /share <path> Export this session to a Markdown file (or HTML with /share --html). Secret-looking values are scrubbed; /share --full includes complete tool IO. See Sharing sessions.
/rename <name> Name the current session (shown in the status bar and /resume’s picker).
/resume Pick a previous session from an ↑↓ list (most recent first, current excluded, capped at 15) and switch to it in place - its transcript is re-rendered, tool calls and results included. If it was on a model no longer configured, it stays on the active model and says so.
/compact Summarize older history to free up context. Runs on routing.summaryModel when one is set, and says which model it used.
/reset · /newsession Start a fresh session in the same terminal. The prior transcript stays on disk, resumable via /resume or --resume.
/exit · /quit Exit cleanly.

Open-weight models routinely get tool-call syntax slightly wrong - a trailing comma, a fenced code block around the arguments, a near-miss tool name. Polyglot repairs these and runs the call anyway, but it never hides that it happened:

  • The tool-call card in the transcript gets a dim ↺ repaired marker (and (corrected from "…") when the tool name was the thing fixed).
  • Ctrl+R expands the verbatim raw model output under every repaired card, so you can see exactly what the model emitted.
  • /raw prints the same raw blocks as a one-off report.
  • /reliability aggregates the counts per model for the session.

When audit.enabled is set, the verbatim raw call is also written to the audit log on every repair, regardless of hashArgs - a parser fix can’t silently mask a model getting worse.

The status bar shows context: NN% - how much of the model’s context window the conversation is using (yellow past 75%, red past 90%). After the first turn it’s the provider’s own input-token count from the last response (which includes the system prompt and tool definitions); before any turn, and right after /compact, it falls back to a ~4 chars/token estimate. Servers that don’t report usage on streamed responses stay on the estimate.

Once a session has run up a priced cost, the status bar also shows a running total (e.g. · $0.0342). /cost breaks it down.

When the active model has had any tool-call trouble this session, a reliability segment appears too: ⚠2 (parse errors), ⚠ gave up, or a dim 92% ok (clean rate once repairs have happened). Nothing shows while the model is holding the format perfectly. /reliability breaks it down.

If routing.failover is configured and the active model errors out or stops producing valid tool calls mid-turn, the turn continues on the next model in the list. You get a one-line notice in the transcript (<from> failed (<reason>) - continuing on <to>. Run /model to switch back.) and the status bar flips to the new model. The switch is sticky for the rest of the session; /model puts you back.