Developer tools
iohr panel
Type iohr and your terminal gets a small panel in its top right corner with auto mode, the asks waiting for you, your agents at work and a box to ask Io. Your command line stays as it was.
The panel is InOrbit in the corner of your shell. Type iohr in a terminal and a small box
sits in the top right corner: whether auto mode is on, how many asks wait for you, and the key
that opens the menu. From the menu you approve, deny or ask back on an ask, see which agents are
working and which need you, message one of them, and turn auto mode on or off. You never leave
the shell, and the line you were typing stays exactly as it was.
Everything on this page is in the release (0.1.0-alpha.39), except
the chat box, which is in iohr-preview today.
Start it
iohr # in a terminal: this folder's session, with the panel
iohr stop # ends the session and closes the panel; your shell staysiohr with nothing after it joins this folder's session, or starts one, and gives you your
shell with the panel over it. If the session cannot start, the panel still runs. Inside the
panel, iohr on its own prints one line saying you are already in it; after iohr stop, it
brings the panel back.
Where there is no panel to draw (NO_COLOR is set, you passed --json, or the output is not a
terminal), iohr on its own prints its usage instead and exits with status 2.
iohr panel --demo draws the panel with made-up data, each value labelled stub, so you can
see it without an account.
How it draws
- It draws over the top right corner and takes no rows from your shell. What you type, and what your commands print, goes on as before under it.
- It moves when you resize the window, and steps aside when a full-screen program (vim, less,
top) takes the screen. It is not drawn under
NO_COLOR. - It uses full colour when the terminal says it can (
COLORTERM=truecolor), and 256 colours otherwise. - The shell inside it has
IOHR_PANELset. A panel started inside another one runs your shell plainly instead of drawing a second panel.
The pill
At rest the panel is one line in a box, the pill:
- auto ● on (green) or off: whether auto mode is on.
- 3 waiting (amber): the asks waiting for you. The number is bold when there are any.
- ⌥i menu: the key that opens the menu.
The menu
Press Option+i (shown as ⌥i) to open the menu. On Terminal.app, iTerm2, VS Code, Ghostty, WezTerm and Hyper, Option types a character unless you change it, so there the pill shows ^G instead: Ctrl-G opens the menu. Both keys always work. To use Option+i on those terminals, set Option to send Esc (iTerm2: Profiles, Keys, Left Option key, "Esc+"; Terminal.app: Profiles, Keyboard, "Use Option as Meta key").
| Row | Key | What it does |
|---|---|---|
| Auto mode | a | Shows whether auto mode is on and what it allows; turns it on or off |
| Approvals | p | The asks waiting for you, with their count |
| Workloads | w | Your agents and sessions, and which of them are working or need you |
| Run | r | Opens a short note today (see Not there yet) |
| Status | s | Opens a short note today (see Not there yet) |
| Chat box | c | Folds the chat box away or brings it back (iohr-preview) |
| Help | ? | Every key, on one screen |
| Stop panel | x | Closes the panel; your shell keeps running |
The arrows move and Enter opens a row; a row's key opens it at once. Esc goes back one step, and from the menu it closes the panel to the pill. The panel takes your keys only while it is open; at rest every key goes to your shell.
The mouse works in an open view: click a row, scroll with the wheel. At rest the panel takes no mouse input, so you select and copy text in your terminal as usual.
Auto mode
Auto mode lets your agents go on with the asks your policy allows without asking you each time. The Auto mode view shows whether it is on and the policy it runs under.
- Turning it off: Enter turns it off at once.
- Turning it on: the panel sends an ask to your phone for eight hours of auto mode and shows "asked your phone". It turns on when you approve there.
Approvals
The Approvals view lists the asks waiting for you.
| Key | What it does |
|---|---|
| ↑ ↓ | Pick an ask |
o or Enter | Read it: what it asks, why, and what it links to |
a | Approve it |
d | Deny it, after y to confirm (n keeps it) |
q | Ask a question back on it |
The panel never asks for Touch ID itself. When you approve, an ask your Mac can sign goes to
iohr asks approve, which asks for Touch ID; any other ask goes to your phone to approve there.
Merges, rolls, migrations and rules that approve on their own always stay on the phone.
Workloads
The Workloads view is a tree of what works for you: the coordinator at the root, your agents and sessions under it, and a row for the coordinator service itself. The header says how many are running and how many need you.
- Green: working (seen in the last ten minutes).
- Amber: needs you (an open ask names it).
- Grey: idle.
- Red: stuck (a coordinator job).
The view reads your sessions and the coordinator every 20 seconds. When the coordinator cannot be reached, its rows say "unavailable" instead of guessing.
Enter on a row opens it: why it runs, what it did last, since when, what it uses, what it waits for, and its pull request.
| Key | What it does |
|---|---|
m | Send it a message |
t | Bring its terminal window to the front (macOS) |
l | Read its transcript |
p | Open its pull request |
a | Open the ask it waits on |
x | Stop it, after y to confirm: it is interrupted twice, never killed outright |
m and t work from the list too, without opening the row.
The chat box
The chat box is in iohr-preview today, for zsh. It is a framed box
along the bottom of the terminal where you ask Io about this shell, with the same
? prompt you have without the panel, and see the answer's progress as it
works.
- Ask: at an empty prompt,
?puts you in the box;??asks deeper. One Enter sends it, and the question is kept in your shell history. - Mode: Shift+Tab, or a click on the mode in the title, moves between manual, plan and auto.
- While you type: Up brings back your last question, and Esc clears the line.
- While Io answers: Esc, or a click on Stop, stops it. Ctrl-C still works too.
- Hide it: Option+h (⌥h) folds the box to a small "◆ iohr" chip in the corner and brings it
back, in every terminal. On Linux it is Alt+h. The menu's Chat box row (Ctrl-G then
c) and a click on "hide" do the same. If your keyboard layout types a letter with Option+h, use Ctrl-]. - Selecting text: while the box shows, hold Option or Shift to select text with the mouse.
- It needs a terminal at least 16 rows tall. While a command runs, the box says so and waits for the prompt. A full-screen program gets the whole screen; the box comes back after it.
Every key
| Key | Where | What it does |
|---|---|---|
| ⌥i or Ctrl-G | Anywhere | Open or close the panel |
| ↑ ↓, Enter | Open panel | Move and open |
| Esc | Open panel | Back one step, then close |
a p w r s c ? x | Menu | Open that row |
a d q o | Approvals | Approve, deny, ask back, read |
y / n | After d or x | Confirm or keep |
m t l p a x | Workloads | Message, window, transcript, PR, ask, stop |
?, ?? | Empty prompt | Ask Io, ask deeper (chat box, iohr-preview) |
| ⌥h (Alt+h on Linux) | Anywhere | Fold or bring back the chat box (iohr-preview) |
| Shift+Tab | Chat box | Change the mode |
Settings
In config.toml, or as environment variables:
| Setting | Values | What it sets |
|---|---|---|
[panel] mouse or IOHR_PANEL_MOUSE | "menu" (default), "always", "off" | When the panel takes the mouse |
[panel] chat or IOHR_PANEL_CHAT | "on", "hidden", "off" | How the chat box starts (iohr-preview) |
[ask] menu_key | "ctrl-g" and others | The ? card's menu key; set to Ctrl-G, the panel leaves Ctrl-G to it |
Not there yet
- The Run and Status rows open a short note; their views are not built.
- Workloads does not show a session's checks, the worker machines under a session, or whether a session is stuck or failed yet; only coordinator jobs show as stuck. Those rows say "not available".
- The panel is built and tried on zsh. Other shells may work but are not tested.
- The panel saves and restores the cursor to draw. A program that saves the cursor itself at the same moment can find it moved.