RimZ
ReferenceCLIAsks and answers

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 JSON

rimz asks and rimz asks list are the same command and take the same flags.

FlagEffect
--allInclude asks from every channel. Outside a channel the list already covers every channel.
--jsonPrint 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 --json

The 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
    }
  ]
}
FieldMeaning
ask_idThe ask's id. Pass it to answer to answer this prompt and no later one.
agent.handleThe agent's address; for a provider subagent, the root agent's address.
agent.nameThe subagent's name. Present only on a provider subagent's ask.
agent.kindThe agent kind, such as claude.
agent.channelThe agent's channel. Absent when it has none.
kindpermission, plan_approval, or question.
deliveryblocking owns the agent's input; async is a question the agent asks while continuing its turn.
sinceWhen the prompt opened.
detailA one-line summary of the prompt, such as a permission ask's tool call. null when the agent recorded none.
contextThe message the agent wrote just before raising the prompt. Absent when it wrote none, and always absent on permission asks.
questions[].questionThe question text.
questions[].options[].labelThe option label, which answer accepts as a selector.
questions[].options[].descriptionThe option's description, or null.
questions[].options[].mutates_trusttrue exactly when caution is set.
questions[].options[].cautionWhat choosing the option changes beyond this prompt, such as Claude's approve turning on auto-accept edits. null otherwise.
questions[].multi_selectWhether 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.json

The target is an agent address or an ask id, resolved as for show. One command answers the whole ask, every question at once.

FlagEffect
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-waitReturn 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:

  1. Validate every answer against the ask's questions and the agent's supported actions. A failure exits 3 and sends nothing.
  2. 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-wait does not skip this wait.
  3. 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.
  4. Send the keys. A provider subagent's answer goes to its root agent's pane.
  5. Wait for confirmation: the blocking ask closes or the agent records an answer for it. --no-wait stops 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:

CodeMeaning
0The agent confirmed the answer, or --no-wait sent it.
1No room, or the store could not be read or written.
2The 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.
3The 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).
4A 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.

AgentQuestionPermissionPlan approval
ClaudeSingle 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.
CodexBlocking 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.
PiSingle 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.

On this page