Keybindings

Arbiter ships its own line editor. Bindings below are the complete set the editor responds to. Keys not listed are inserted literally.

Mouse (when layout.mouse is true)

ActionEffect
Left-click paneFocus that pane
Left-click inputFocus pane + move caret
Left-click expandable blockExpand or collapse thinking / tool / truncated code
WheelScroll pane / history list under the pointer
Drag split gutterResize adjacent panes
Left-click history rowSwitch to that conversation
Right sidebarIgnored (display-only)

Disable with "mouse": false under layout in ~/.arbiter/tui.json.

Editing

KeyAction
Backspace / ^HDelete the character left of the cursor.
DeleteDelete the character under the cursor.
^AMove cursor to the start of the line.
^EMove cursor to the end of the line.
^B / Move cursor one byte left.
^F / Move cursor one byte right.
^KKill from cursor to end of line.
^UKill the entire line.
^WKill the previous word — but only if no chord handler is bound. The default REPL binds ^W as a pane chord (see below); in that mode the previous-word kill is unavailable.
TabTab-completion on the leading word (slash commands). Inserts a literal space if no completer is registered.
EnterSubmit the line.
^DEOF if the buffer is empty (exits the REPL), else delete-forward.
^CAbort the current line. Does not exit the process; just discards the buffer and redraws the prompt.
/ History navigation. Per-pane history persisted across sessions (see Sessions).

Scrollback

KeyAction
PgUpScroll the focused pane's scroll region up by ~half a screen.
PgDnScroll back down. At the live tail, PgDn is a no-op.
^OExpand or collapse the truncated code / tool / thinking block in view (or click it).

Scrollback is visual-row aware: a wrapped paragraph counts as multiple rows for navigation, matching what the terminal actually drew. The scrollback ring is bounded (default 20k logical lines) — older content is evicted when the buffer fills.

Cancellation

KeyAction
EscCancel any in-flight agent turn. The pane's input clears, the cancel handler pushes [interrupted] into scrollback, and the agent's pending HTTP request is aborted. A lone Esc with no follow-on within 50 ms triggers cancel; longer sequences (CSI escape codes from arrows / PgUp / etc.) are routed to the editor instead.

Pane chords (Ctrl-w prefix)

^W opens a 2-second window for a single follow-up byte. Inside that window:

ChordAction
^W vVertical split — the focused pane is split into left/right children.
^W hHorizontal split — focused pane split into top/bottom.
^W sToggle the session sidebar (wide terminals only).
^W w / ^W ^WCycle focus to the next pane (pre-order traversal of the layout tree).
^W zZoom / unzoom the focused pane (temporary maximize; siblings stay open).
^W cClose the focused pane. Its exec thread is joined; in-flight turn is cancelled. Last remaining pane cannot be closed.
^W tToggle the conversation-history sidebar (left rail). Preference is saved to ~/.arbiter/tui.json.
^W bEnter the conversation sidebar for selection. Auto-shows the sidebar if hidden. Use / and Enter; Esc cancels.

If the chord byte doesn't match any of the above, it's silently dropped — the editor returns to the normal input state. ^W followed by a regular character does not fall through to insertion; the chord window always consumes its byte.

Conversation sidebar (when focused via ^W b)

KeyAction
/ Move selection (+ New conversation at top, then prior threads newest-first).
j / kVim-style aliases for down / up.
EnterAttach the selected conversation (or start a new one) to the focused pane. Sibling panes and the split layout are left alone.
mOpen an action menu on the selected row. Chat: Open · Rename · Move to… · Delete. Folder: Rename · New chat here · Delete folder. + New: New folder. Shortcuts (o/r/v/d, r/n/d, or f) jump to an action. Footer shows context hints while open.
rRename the selected chat or folder. Type on the title line (caption on the line below). Enter saves (rejects empty); Esc cancels rename (Esc again leaves the sidebar).
dSoft-delete the selected chat, or delete the selected folder (chats are unfiled, not removed), after a Delete chat? y/n / Delete folder? y/n confirm.
nStart a new conversation on the focused pane.
fCreate a new folder: type a name (caption New folder), Enter saves, Esc cancels. Also available from the + New row menu (m → New folder).
EscCancel an in-progress rename / menu / move; otherwise return focus to the pane input.

Choosing Delete from the menu (or pressing d) enters the same confirm step: type y to soft-delete, any other key cancels.

The sidebar requires at least 72 terminal columns when enabled. Below that width it auto-hides even if toggled on.