Skip to content
ivralo
Sections

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.

KeyIn the diff viewer
EnterOpen the file under the cursor
Left, RightPrevious and next file
vSwitch between side by side and unified (side by side from 120 columns)
uRestore the file as it was before the turn, after a question
q, EscBack 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
SettingDefaultEffect
IVRALO_AUTO_COMPACTtrueCompact on its own past the threshold
IVRALO_COMPACT_THRESHOLD0.85The 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.

CommandDoes
/newStart a fresh conversation
/sessionsList recent conversations
/title [text|auto]Show, set or regenerate this conversation's title
/compact <focus>Summarize older turns to free context
/contextHow full the model's context window is
/memoryWhat the model remembered about you (forget <n>, clear)
/model [ref]The models in use, or switch this session to one
/agentsWho is on the team
/skillsWhat 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)
/confirmToggle auto-approve for every call (Approvals)
/accept-editsToggle 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
/changesThe 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
/detachFold 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
/traceThe 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
/helpThe list of commands and keys
exitLeave

Keys

KeyAction nameDoes
Ctrl+CquitLeave
Esccancel_turnCancel the turn in flight; your message comes back to edit
Ctrl+Bdetach_turnFold the running turn away, and back
Ctrl+Nnew_sessionStart a fresh conversation
Ctrl+Otoggle_allOpen the last turn's steps, or close every step
Ctrl+Ptoggle_filesThe workspace file tree; a clicked file is named in the message
Ctrl+Ttoggle_teamWho is working now, and who took part this turn
Ctrl+Dtoggle_changesThe changes panel
Ctrl+GcontextHow full the context window is
Shift+Tabtoggle_plan_modePlan every message first, on or off
Ctrl+F, Ctrl+KsearchSearch sent messages, replies and workspace files
Ctrl+Vpaste_imageAttach the image on the clipboard
Ctrl+Ltoggle_plan_boardShow 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.