Files
orca/mobile/src
Brennan Benson e076a683a3 fix(acp): permission prompts from an agent's own work wait for you (#38488)
* fix(acp): permission prompts from an agent's own work wait for you

A permission or question that an ACP agent (OMP, Grok, OpenCode, others)
asks during work it started itself, such as picking up a finished
background job, was answered "cancelled" at once and never shown. It now
shows as a card, raises the needs-input alert, and waits for the answer,
unless Stop, a steer or teardown cuts it short.

While OMP refuses a sent message as busy, a request from its own turn now
appears at thread level instead of being cancelled, so it never lands in
the held message's turn.

Tracked in STA-13625.

* fix(acp): keep later requests askable after a Stop, and honor the agent's withdrawal

A Stop or a card's Cancel left the chat refusing every later permission
request until the session ended; the stop now covers only the work it
interrupted. A request the agent withdraws with $/cancel_request now
withdraws its card. Cancel on a card from the agent's own work reaches the
agent even when no message is running.

* test(acp): narrow approval rows before reading their resolution

* fix(acp): a live request's card outlives its turn instead of being cancelled with it

Requests group with the active turn again, as before. A permission or question
the agent is still waiting on now stays pending and answerable when its turn
ends, is replaced, or is settled by the host; only the person's answer, the
agent's withdrawal, Stop, a steer or the session ending settles it. Settled
requests are pruned at turn end.

Stop covers only Orca's running message, so later requests from the agent's
own work can still ask. Cancel on a card with no running turn now reaches the
host from desktop and phone for every agent, and a question the agent
withdraws before its card opens no longer leaves a stuck card.

* fix(acp): never strand a live request without a card, and scope Cancel to it

A request the agent still waits on now always gets an answerable card, even
when its turn settled before the card was written, and answering it releases
the timeline's hold. Cancel on a card from an agent's own turn refuses further
requests from that turn until it ends. Desktop never turns Cancel on a card
into a whole-chat Stop on hosts that can't take a card cancel.

* fix(acp): a new message is never covered by a Stop of the agent's earlier turn

* fix(native-chat): a card's Cancel with no running turn passes the RPC schema

The cancel params required a turn whenever a card was named, so Cancel on a
card from an agent's own work (and Pi's turnless card Cancel) was rejected
before it reached the host. A background-task cancel still names its turn.

* test(rpc): a card with no running turn cancels by itself
2026-11-05 10:25:23 -08:00
..