Docs / Developer mode
The session
The session is the full-screen app that ivralo opens in your terminal. This page covers what it shows while a turn runs, how to reach a turn in flight, where to see what changed, and every slash command and key.
One turn at a time
Each message you send starts a turn: one run of the main agent, with every tool call it makes and every specialist it hands work to. The session runs one turn at a time. Every tool call is one line in the transcript, and once the call is back the line ends with its outcome, read off the call's own result:
▶ shell uv run pytest 1.4s · 8 passed in 1.42s
▶ read src/auth/service.py 0.0s · 142 lines
▶ edit src/auth/token.py 0.0s · +18 −7
▶ shell uv run ruff check . 0.6s · exit 1 · Found 3 errors.
A call that failed or was refused opens itself; every other step stays one line until you click it, or focus it and press Enter or o. Ctrl+O opens the last turn's steps, and pressed again closes every step in the session.
A turn that did something ends with a summary block. Every line in it is a fact ivralo recorded, never something the model said:
✓ done · 42.1s · 23 calls · 2 approvals · 18.4k tokens
changes M src/auth/token.py +21 −8 · A tests/test_token_race.py +48
ran uv run pytest (exit 0) · uv run ruff check . (exit 0)
warnings edited a test file without being asked: tests/test_token_race.py
ran is the only place where "the tests pass" can come from, and it names the exact command. A targeted test run reads as that command, never as "the suite passed". warnings flags a test file edited without being asked, a root configuration file changed, and a file edited three or more times that returned to an earlier version. They warn and never refuse.
The Working line
While a turn runs, one line under it moves: the Working line. It is the only thing on screen that animates. It says what the turn is waiting on (thinking, a call such as python 12 lines, waiting for approval) and that Esc stops it. After three seconds it shows a clock; after twenty it adds one sentence on what is slow, such as waiting for the first token from gemma4:26b - a local model can take minutes. That sentence comes from what ivralo recorded, not from what a model wrote.
IVRALO_REDUCED_MOTION=true turns every spinner into a still dot and stops the session's fades and slides. The clock keeps counting.
Typing during a turn
The prompt stays open while a turn runs. Pressing Enter does not start a second turn: your message is queued and rides the result of the next tool call any agent makes, so the agent at work reads it at once. The transcript marks it queued, then delivered. It cannot interrupt a call that is already running, so a three-minute test run finishes first and your message arrives with its output.
A message the turn never heard, because it arrived after the last tool call, is sent as the next message when the turn ends.
Esc cancels the turn in flight and hands back what you typed for it, with anything still queued, so you can edit it.
Detaching a turn
/detach or Ctrl+B folds the running turn away. The transcript keeps one line for it, the top bar shows what it is doing and for how long, and the prompt, the panels and every slash command that does not start a run are yours again. The turn keeps running in the session; what you type still reaches it at its next tool call. Approval dialogs still open, and Esc still cancels it.
Press Ctrl+B again to bring it back with its steps in order. When a detached turn ends, one line says how it ended and the terminal bell rings.
Inside tmux, Ctrl+B is tmux's prefix and never reaches ivralo. Use /detach, or move detach_turn to another key (see below).
What changed: the changes panel and the diff viewer
Ctrl+D (or /changes) opens the changes panel: every turn in this repository that changed a file or opened a pull request, newest first, including turns from ivralo ask and earlier sessions. Space opens a turn and counts its files; Enter or d opens it in the diff viewer. /diff opens the newest turn directly and /diff 2 the one before.
The diff viewer is the one window for every diff: a turn's change, an edit waiting for approval, and a coder's patch before it is integrated. It opens on a summary with one row per file.
| Key | In the diff viewer |
|---|---|
| Enter | Open the file under the cursor |
| Left, Right | Previous and next file |
v | Switch between side by side and unified (side by side from 120 columns) |
u | Restore the file as it was before the turn, after a question |
q, Esc | Back to the summary, then close |
The diff is read from ivralo's file history when you look. A file history did not keep (a binary file, one over 1 MB, one a shell command rewrote without naming it, or all files when IVRALO_HISTORY is off) says so in its row instead.
Compaction
A local model has a small context window. The context pill in the corner of the input bar shows how full it is; Ctrl+G or /context pins the breakdown.
/compact asks the model for a handover summary of the conversation, stores it on the session, and hides the summarized turns from future context. Nothing is deleted: the turns stay in PostgreSQL. By default this happens on its own when a turn ends past 85% of the window.
ivralo compact --focus "the billing refactor" --keep 2
| Setting | Default | Effect |
|---|---|---|
IVRALO_AUTO_COMPACT | true | Compact on its own past the threshold |
IVRALO_COMPACT_THRESHOLD | 0.85 | The share of the window that triggers it |
Memory
After a turn, ivralo can store long-term memories about you (preferences, facts you stated) in PostgreSQL and hand them to later sessions. A run nobody watches, such as ivralo ask in a pipe or a schedule, reads memories but does not write new ones unless IVRALO_MEMORY_UNATTENDED is on. IVRALO_MEMORY=false turns memory off.
ivralo memory list
ivralo memory forget 3f9c
ivralo memory clear
Inside the session, /memory shows the same list.
Slash commands
Type / and the prompt completes the command inline. /help prints this list with the keys under it.
| Command | Does |
|---|---|
/new | Start a fresh conversation |
/sessions | List recent conversations |
/title [text|auto] | Show, set or regenerate this conversation's title |
/compact <focus> | Summarize older turns to free context |
/context | How full the model's context window is |
/memory | What the model remembered about you (forget <n>, clear) |
/model [ref] | The models in use, or switch this session to one |
/agents | Who is on the team |
/skills | What the team knows |
/skill <name> <request> | Send the request straight to the skill's owner |
/skill show <name>, /skill install <source> | Preview a skill, or install one from GitHub |
/plan, /plan <request>, /plan --job <request> | Plan mode, a one-off plan, or a plan run as a job (Plan mode) |
/confirm | Toggle auto-approve for every call (Approvals) |
/accept-edits | Toggle accepting edits for the session; shell commands still ask |
/permissions [remove <n>] | What the permissions files allow and deny (Shell commands) |
/trust [yes|revoke] | Whether this folder is trusted |
/changes | The changes panel |
/diff [n] | The newest turn's change, or an older one, in the diff viewer |
/changeset [on|off] | Stage each turn's edits as one changeset (Changesets) |
/history [file] | The versions kept before a file was overwritten |
/restore <file> [stamp] | Bring a kept version back, after a question |
/detach | Fold the running turn away, or bring it back |
/instances [stop <n|all>] | The session's open instances (Instances) |
/jobs [id] | This workspace's jobs; answer a parked one |
/trace | The last run's tool calls with what each returned |
/why <claim> | Where a number or phrase in the last answer came from |
/export [html|md] | This conversation as one file |
/incident [bundle] | Investigate an evidence bundle as a turn |
/index, /find <query> | Build the knowledge index; search it by hand |
/show <file> | A workspace image, large |
/paste, /img <path> | Attach the clipboard image, or an image file |
/help | The list of commands and keys |
exit | Leave |
Keys
| Key | Action name | Does |
|---|---|---|
| Ctrl+C | quit | Leave |
| Esc | cancel_turn | Cancel the turn in flight; your message comes back to edit |
| Ctrl+B | detach_turn | Fold the running turn away, and back |
| Ctrl+N | new_session | Start a fresh conversation |
| Ctrl+O | toggle_all | Open the last turn's steps, or close every step |
| Ctrl+P | toggle_files | The workspace file tree; a clicked file is named in the message |
| Ctrl+T | toggle_team | Who is working now, and who took part this turn |
| Ctrl+D | toggle_changes | The changes panel |
| Ctrl+G | context | How full the context window is |
| Shift+Tab | toggle_plan_mode | Plan every message first, on or off |
| Ctrl+F, Ctrl+K | search | Search sent messages, replies and workspace files |
| Ctrl+V | paste_image | Attach the image on the clipboard |
| Ctrl+L | toggle_plan_board | Show every step of a long plan, or only what moves |
In the prompt, Enter sends, and Shift+Enter, Ctrl+J or a \ before Enter starts a new line. Up and Down walk your message history. While a dialog is open, every session key except quit waits until you answer it.
Moving the keys
keybindings.json in the ivralo home moves any action to another key, or to a list of keys:
{ "search": "ctrl+s", "toggle_files": ["ctrl+r", "f2"], "detach_turn": "f8" }
The file is read when the session starts. A key the prompt or the terminal already uses (Enter, Tab, Esc, Ctrl+C, Ctrl+Q, the prompt's editing keys, and Ctrl+H, Ctrl+I and Ctrl+M, which terminals send as Backspace, Tab and Enter) is refused. A mistake never stops the session: the bad entry is named under the welcome line and in ivralo doctor, and that action keeps its default.