Asks and answers
An ask is a permission prompt, a plan approval, or a question. Blocking asks own an agent's input; async questions leave the agent working.
An ask is a permission prompt, a plan approval, or a question. Blocking asks own an agent's input; async questions leave the agent working. rimz asks reads the open asks as structured data, and rimz answer answers a supported blocking ask by typing into the agent's own prompt UI, the same keys you would press in the pane. Every agent whose questions reach RimZ shows up in rimz asks; rimz answer works for Claude, Codex, and Pi, within the limits in What each agent accepts. The workflow is taught in the messaging guide, and which agents surface their asks at all is in agent support.
List open asks
rimz asks # open asks in the current channel
rimz asks --all # every channel
rimz asks --json # the same rows as JSONrimz asks and rimz asks list are the same command and take the same flags.
| Flag | Effect |
|---|---|
--all | Include asks from every channel. Outside a channel the list already covers every channel. |
--json | Print a JSON array of ask rows, [] when nothing is open. |
The table has the columns AGENT, KIND, AGE, and ASK, oldest ask first. Each row has a second line with the next command to run. Permissions point to rimz agents focus first, so you can inspect the full tool call before deciding. Supported questions offer an answer command; unsupported prompts point to the pane. ASK previews the first question, with its numbered options for a question, or names how many additional questions follow. A plan previews the plan's first line rather than its approval header. With no open asks the command prints no agent in #<channel> is asking anything — rimz asks --all shows every channel and exits 0; where the list already covers every channel (with --all, or outside a channel) the line is no agent is asking anything.
A provider subagent (a child the agent spawned inside its own session) that raises a prompt appears as child-name (via @root), because the prompt is drawn in the root agent's pane. In JSON, agent.handle is the root's address and agent.name is the child. A child whose root agent is no longer live is left out of the list. Target a child's ask by its ask_id.
Show one ask
rimz asks show @planner
rimz asks show ask_0123456789abcdef --jsonThe target is an agent address or an ask id. An address resolves in the current channel, as everywhere else (addressing agents); an ask id matches in any channel.
Omitting show, as in rimz asks @planner, exits 2 and suggests rimz asks show @planner. The same redirect applies to a bare handle or ask id.
The human form prints a header line, the agent's context message when present, and each question with its numbered options:
$ rimz --tmux asks show ask_06gh3qs0ee47p7o0
ask_06gh3qs0ee47p7o0 @coder#probe question · 0s
Choose a rollout
1. safe
Stage the rollout
2. fast
answer here: rimz answer @coder#probe <1|2>The context lines render as Markdown under the agent prose rule. Questions are numbered only when an ask has more than one, and an option with a caution prints it after the label, as in 1. approve [caution: enables auto-accept for subsequent edits]. A permission's detail is labelled a summary: the pane shows the full tool call. The closing block gives the answer command, any actions reserved for the pane, and its focus command.
show exits 1 when the address resolves to an agent that is not asking, when the ask id matches no open ask or is malformed, or when a subagent's root agent is gone. answer exits 2 for these cases. An unmatched id may have been answered, replaced, or never existed; rimz asks lists the open ones.
Ask JSON
rimz asks --json prints an array of rows and rimz asks show --json prints one:
{
"ask_id": "ask_0123456789abcdef",
"agent": { "handle": "@planner#auth", "kind": "claude", "channel": "auth" },
"kind": "question",
"delivery": "blocking",
"since": "2026-07-09T12:00:00Z",
"detail": "Choose a rollout",
"context": "A staged rollout limits the blast radius.",
"questions": [
{
"question": "Choose a rollout",
"options": [
{ "label": "safe", "description": "Stage the rollout", "mutates_trust": false, "caution": null },
{ "label": "fast", "description": null, "mutates_trust": false, "caution": null }
],
"multi_select": false
}
]
}| Field | Meaning |
|---|---|
ask_id | The ask's id. Pass it to answer to answer this prompt and no later one. |
agent.handle | The agent's address; for a provider subagent, the root agent's address. |
agent.name | The subagent's name. Present only on a provider subagent's ask. |
agent.kind | The agent kind, such as claude. |
agent.channel | The agent's channel. Absent when it has none. |
kind | permission, plan_approval, or question. |
delivery | blocking owns the agent's input; async is a question the agent asks while continuing its turn. |
since | When the prompt opened. |
detail | A one-line summary of the prompt, such as a permission ask's tool call. null when the agent recorded none. |
context | The message the agent wrote just before raising the prompt. Absent when it wrote none, and always absent on permission asks. |
questions[].question | The question text. |
questions[].options[].label | The option label, which answer accepts as a selector. |
questions[].options[].description | The option's description, or null. |
questions[].options[].mutates_trust | true exactly when caution is set. |
questions[].options[].caution | What choosing the option changes beyond this prompt, such as Claude's approve turning on auto-accept edits. null otherwise. |
questions[].multi_select | Whether the question takes several options. |
Permission and plan asks carry one question whose options are only the actions answer can deliver for that agent. A Codex permission ask carries no options, because none can be answered from outside the pane.
Questions while Codex works
Codex async questions appear individually, with delivery: "async" and kind: "question". The human list marks them question (async). An agent address selects its blocking ask first, otherwise its oldest async question; an ask id selects that exact question. Async questions do not pause work or park messages. An answer removes only its question; an ordinary or steered prompt clears every listed question, as does closing the turn. A question skipped locally with Ctrl+] may remain listed until then.
rimz answer refuses async questions with exit 3, sends no keys, and records no answer. Focus the Codex pane and press Shift+Left to answer in its question editor.
Codex may hold an answer given in the pane until a later tool boundary. The question stays listed until RimZ observes that answer, an ordinary prompt, or the turn closes. On Codex 0.156 through 0.158, an ordinary prompt clears RimZ's list even though Codex may still show the questions. A question queued between Codex accepting a prompt and reporting it to RimZ can also disappear from the list while remaining in the pane. In both cases, answer in the pane.
Answer an ask
rimz answer @planner 2
rimz answer @planner safe
rimz answer @planner 1,3
rimz answer @planner --text "Use the staged route"
rimz answer ask_0123456789abcdef --json answers.json
rimz answer ask_0123456789abcdef --json < answers.jsonThe target is an agent address or an ask id, resolved as for show. One command answers the whole ask, every question at once.
| Flag | Effect |
|---|---|
SELECTORS... | One selector per question, in order. |
--text <TEXT> | A free-text answer. Only for an ask with exactly one question, and not together with selectors. |
--json [FILE] | Read structured answers from FILE, or from stdin when FILE is omitted. Not together with selectors or --text. |
--wait <DURATION> | How long to wait for the agent to confirm. Default 30s; takes s, m, or h. |
--no-wait | Return once the keys are sent, without waiting for confirmation. |
A selector is a one-based option number or an option label. Labels match case-insensitively (ASCII only), and a selector made only of digits is always read as a number. Separate several options with commas (1,3) on a multi-select question. The number of selectors must equal the number of questions, and an option may be chosen only once.
Structured answers
Structured input is a JSON array with one object per question, in order. Use it for an ask with several questions that needs free text, or to combine picks and text on one question:
[
{ "pick": ["safe"] },
{ "pick": [1, 3] },
{ "text": "Notify the release channel" }
]pick takes option numbers or labels, and text takes free text. An object needs at least one of them, and unknown keys are ignored. Whether an agent accepts text, or pick and text together, is in What each agent accepts.
How an answer is delivered
answer checks everything it can before it touches the pane, then sends the whole answer as one uninterrupted write:
- Validate every answer against the ask's questions and the agent's supported actions. A failure exits
3and sends nothing. - Wait up to 30 seconds for any other RimZ write to the same pane (a message, another answer) to finish, then hold the pane until the answer is sent.
--no-waitdoes not skip this wait. - Check that the ask read in step 1 is still the agent's open ask. A prompt answered or replaced in the meantime gets no keys, and the command exits
2. This check runs for an address target too. - Send the keys. A provider subagent's answer goes to its root agent's pane.
- Wait for confirmation: the blocking ask closes or the agent records an answer for it.
--no-waitstops before this step.
On success answer prints answered <handle>: <choice> <ask_id>, or sent answer to <handle>: <choice> <ask_id> with --no-wait. The choice includes selected labels, quoted free text, and any selected option's caution. A child appears as child (via <root handle>). Errors print error: <message> on stderr. With no answer supplied, a supported ask lists its choices and the answer command. A blocking ask that closes during step 5 for any reason, including being dismissed in the pane, counts as confirmed.
Exit codes
answer exits with its own codes, so a script can tell a stale ask from a rejected answer:
| Code | Meaning |
|---|---|
0 | The agent confirmed the answer, or --no-wait sent it. |
1 | No room, or the store could not be read or written. |
2 | The target is not an agent or not asking, the ask id is malformed or matches no open ask, the ask was answered or replaced before sending, the agent has no live pane, the pane stayed busy for 30 seconds, or sending failed. A send that fails partway may leave some keys in the pane. An invalid command line (such as --wait 5d) also exits 2. |
3 | The answer is invalid for the ask, the --json input cannot be read or parsed, or the agent does not support the answer (including Codex async questions). |
4 | A blocking ask's keys were sent, but the agent did not confirm before the --wait deadline. Do not resend. The error gives rimz asks show and rimz pane capture commands to check. |
rimz asks follows the CLI-wide exit codes.
What each agent accepts
rimz answer answers only what an agent's prompt UI lets it drive and confirm. Other supported agent kinds route you to their pane with rimz agents focus and exit 3. Codex permissions do the same, with or without a selector. Unknown agent kinds retain their adapter lookup error.
| Agent | Question | Permission | Plan approval |
|---|---|---|---|
| Claude | Single picks, multi-select picks, and free text. Picks and text together only on a multi-select question, through --json. | allow, which approves the current tool call once. | approve, which approves the plan and turns on auto-accept edits. |
| Codex | Blocking questions: one pick per question; free text and custom options are refused. Async questions: refused; focus the pane and press Shift+Left. No multi-select. | Refused. | implement, which picks "Yes, implement this plan" and switches Codex from Plan mode to Default mode. |
| Pi | Single picks, multi-select picks, and free text, on every question shape. Picks and text together are refused. | Not raised. | Not raised. |
Pi asks come from the @juicesharp/rpiv-ask-user-question extension's questionnaire; Pi raises no permission or plan prompts of its own. Cancel and "Chat about this" stay in the Pi pane.
Every other action stays in the agent's pane: denying a permission, a persistent grant, keep-planning, refinement text, and Claude's manual-review approval. Dismissing a Claude prompt with Escape emits no lifecycle event, so RimZ could not confirm a deny or keep-planning it sent. A refused action exits 3 and names the pane as the place to take it.
You can always answer in the pane instead. When you dismiss a question or plan approval there and type a new prompt, RimZ records that prompt as the ask's answer.
Teams CLI
rimz teams lists, inspects, launches, resumes, and drives named teams, hands a team's board from stage to stage, and installs team bundles.
Message CLI
rimz message types text into a running agent's pane and keeps a durable record of every send, so you can inspect, edit, force, or cancel it until it lands.