You never have to wait for an agent to finish before typing. Whatever you send while a turn is running goes one of two ways:
- A steer goes into the turn that is running now. The agent reads it at its next step and changes course without starting over.
- A queued message waits in a strip above the composer and is sent as the next turn, once the current one ends.
Until a queued message is sent you can edit it, move it, push it into the running turn as a steer, or delete it. A steer that has already gone cannot be taken back, because the agent has read it.
Which agents can steer
Only Claude takes a message in the middle of a turn. Every other agent (Codex, OpenCode, Copilot and Pi) talks to Tori over a protocol with no way to deliver one, so a message typed during their turn is always queued. Tori never pretends a queued message was a steer.
The composer tells you which you are about to do. While a turn runs its placeholder reads:
| Placeholder | What Enter does |
|---|---|
| Steer this turn, picked up in 1.5-5.4s. Option+Enter queues | Steers. The figure is how long a steer took to land when it was measured |
| Type to queue for the next turn | Queues. The agent cannot be steered |
There is also a short moment right after you send a prompt, before the agent has said its turn has started, when there is nothing to steer yet. Anything you send in that moment is queued, even on Claude.
Steer a running turn
Use a steer when the agent is heading the wrong way and you want it to change course now: “use the existing helper instead”, “skip the tests for now”, “that file is generated, edit the template”.
- While the turn runs, type in the composer as usual.
- Press
Enter. - Your message appears in the transcript with a Steer label, inside the turn it went into. The agent picks it up before its next tool call, usually within a few seconds.
Attachments and @ mentions ride along with a steer the same way they do
with any message.
A steer is refused while the agent is waiting on a permission prompt, because the agent has stopped on that question and a message written past it would be read after the answer. You see Session is waiting for permission, answer it first., and your text goes back into the composer so nothing is lost. Answer the prompt, then send again.
Queue a message for the next turn
Use the queue for follow ups that should not interrupt the step in progress: “after this, run the full suite”, “then update the changelog”. Each queued message becomes a turn of its own, sent in order, one after another.
- While the turn runs, type the message.
- Press
Option+Enter. On an agent that cannot steer, plainEnterqueues too. - The message moves into the strip above the composer, under Queued for the next turn, and the box is empty again for the next one.
When the running turn finishes, the first message in the strip is sent and leaves the strip. The second waits for that turn to finish, and so on. A queued message keeps any files, images or mentions that were attached when you queued it, and a message that is only attachments can be queued too.
When no turn is running, Enter and Option+Enter both just send.
Work with queued messages
Each row in the strip shows the message text, with a small preview for an attached image and the label of any other attachment. The buttons on a row:
| Control | What it does |
|---|---|
| Drag handle | Reorder the queue. Shown once two or more messages are queued |
| Pencil, Edit in the composer | Open the message in the composer to change it |
| Arrow, Steer this turn with it now | Send it into the running turn as a steer. Only on an agent that can steer, while a turn runs |
| Cross, Remove from the queue | Delete it |
Clicking the text of a row does nothing, so a stray click never deletes or sends anything.
Edit a queued message
- Click the pencil on the row. To edit the newest queued message without the
mouse, put the caret at the very start of the composer and press
Option+ArrowUp. - The message opens in the composer and its row is highlighted. A bar above the box reads Editing a queued message, with Save and Cancel.
- Change the text. You can remove an attachment with its cross, or add new
ones by pasting, dropping or typing
@. Attachments keep the labels they had, so[image 1]still means the same image. - Press
Enter,Cmd+Enteror Save to write the change back into the same place in the queue. PressEscapeor Cancel to leave the message as it was.
Whatever was in the composer before you started the edit, text and attachments both, is set aside and comes back when the edit ends, saved or cancelled.
While you edit, Option+Enter and Cmd+Shift+Enter do nothing, so the edit
cannot be sent by accident. Save is greyed out while the message is empty;
to get rid of a message, cancel and delete it instead.
A message cannot be edited while it is on its way in as a steer, and you cannot edit while the draft is open in an editor tab (see Open in editor).
If the message leaves the queue while you are editing it, because the turn ended and it was sent, or because you deleted it, the edit ends on its own. What you typed is not thrown away:
- If the composer was empty before the edit, your edited text stays in the box as a normal draft.
- If you had a draft set aside, that draft comes back, and your edited text
goes into the composer’s history. Press
ArrowUpat the start of the box to get it back.
Reorder the queue
Drag a row by its handle to a new place. From the keyboard, focus the handle
with Tab and press ArrowUp or ArrowDown to move the row one place at a
time; focus stays on the handle so you can keep moving it. The top row is the
next to be sent.
Turn a queued message into a steer
On Claude, while a turn is running, click the arrow on a row to send that
message into the running turn now instead of waiting. Cmd+Shift+Enter does
the same for the oldest queued message and leaves whatever you are typing
untouched. With nothing queued, Cmd+Shift+Enter just sends the composer.
The row stays in the strip, marked as in flight, until the agent has taken it. If the steer is refused, for example because a permission prompt arrived, the row simply stays queued and nothing is lost. While it is in flight its arrow is disabled and its pencil is hidden, so it cannot be sent twice or changed halfway.
Delete a queued message
Click the cross on the row. The message is gone for good; there is no undo. To clear every held message at once, use Discard (below).
When the queue is held
Some events stop the queue from sending on its own:
- You stopped the turn, with
Escapeor the stop button. - The turn failed, or the session ended or crashed.
- Tori was reloaded or relaunched with messages still queued.
Stopping a turn usually means you changed your mind, so Tori does not fire the messages you queued behind it. The strip turns into a held strip that reads N messages held: the turn was stopped, or N messages held: saved from last time after a relaunch, with two buttons:
- Send now releases the queue. The first message goes out as the next turn and the rest follow in order, as usual.
- Discard deletes every held message.
While the queue is held you can still edit, reorder and delete single rows. Deleting the last one clears the hold.
The queue survives a relaunch
Each chat’s queue is saved to disk, under ~/.config/tori/chat-queues/, as
you change it. Reload the window or quit Tori and the messages come back with
their attachments, held, so nothing is sent until you press Send now.
Closing the chat’s tab, or deleting the session, deletes its saved queue.
Spending ceilings and the queue
If a spending ceiling has stopped the chat, a message you send is not lost: it is added to the queue, and the transcript says This message is waiting, which ceiling was reached, and to raise the limit in Settings. The queue does not send while the chat is over a ceiling, and Send now does not get around it. Raise or clear the limit and the queue starts sending again, without you having to type anything a second time. A steer from a queued row under a ceiling is refused the same way, and the row stays put.
Keys at a glance
| Keys | While a turn runs | With no turn running |
|---|---|---|
Enter |
Steer, or queue if the agent cannot steer | Send |
Option+Enter |
Queue for the next turn | Send |
Cmd+Shift+Enter |
Steer with the oldest queued message, or send if the queue is empty | Send |
Option+ArrowUp |
Edit the newest queued message (caret at the start of the box) | Same |
Escape |
Cancel a queue edit, otherwise stop the turn | Cancel a queue edit |