Repository navigation
OMP dialect: mid-turn "Send now" steers via OMP's ACP steer extension #82
Copy link
Copy link
Open
Labels
acp-migrationOMP Native Chat ACP migrationOMP Native Chat ACP migrationphase-BPhase B parity completionPhase B parity completion
Description
Summary
When a user sends a queued message into a running OMP turn ("Send now"), deliver it through OMP's ACP extension _omp/session/steer instead of cancelling the turn. The change is a small OMP dialect hook behind the existing composer behavior. It adds no generic inject capability.
Context
44madfire/orca#20reliability: no automatic resend of ambiguous input; generation-safe cancellation. Legacy: a chat send while OMP works reaches the TUI, which steers without aborting (packages/coding-agent/src/modes/controllers/input-controller.ts:1219-1234@53f253f).- Existing composer behavior: a send during a turn becomes a queued card (
agentSession.queuedMessageSend), and Cmd/Ctrl+Enter is "Send now" for the newest card (src/renderer/src/components/native-chat/use-structured-agent-session-queued-messages.ts:48-49,186@76d1b7b). Server-side,AcpStructuredTurns.dispatchwhile a prompt is active sendssession/canceland then the held message (src/main/acp/acp-structured-turns.ts:118-123,235-251). - The ACP runtime exposes no outbound extension call; its public methods are initialize/authenticate/start/prompt/cancel/setMode/setModel/setConfigOption (
src/main/acp/acp-session-runtime.ts). - Principle (user): standardize concepts after the second implementation unless the generic abstraction already clearly exists. Steering is OMP-only today, so it lives in the OMP dialect. Elicitation and compaction stay generic because ACP standardizes them.
Scope
- Runtime: one narrow outbound request for
_-prefixed extension methods, with a response schema, bounded timeout and abort on close. It is usable only by dialects. - Dialect boundary: an optional
steerhook onAcpDialect.AcpStructuredTurnscalls it on dispatch-while-active instead of cancel-then-prompt. If the hook declines (e.g. "no turn running"), the send goes as the next prompt exactly as today. - OMP dialect: implements the hook with
_omp/session/steer(ACP extension _omp/session/steer: inject a message into the running turn oh-my-pi#13), only when the provider confirmedorca-native-chat-v1. Otherwise today's queue behavior. - Settlement: the steered send settles as accepted into the running turn. Its row is the send's own row. The renderer sees only existing send/queued-card states, never extension payloads.
- Stop withdraws undelivered steers. Delivered steers are never resent.
Non-goals
- No generic
injectpath for ACP agents. - No change to Claude/Codex/Grok steering.
- No change to the composer UI (Enter mid-turn still queues a card).
Depends on
- Register omp acp as an opt-in structured ACP agent behind the availability gate #68
- ACP extension _omp/session/steer: inject a message into the running turn oh-my-pi#13
Parity rows owned
- P-QUEU-02.
Acceptance criteria
- With a contract-confirming OMP, "Send now" during a tool call joins the running turn and the tool finishes.
- Without the contract, or for any other ACP agent, behavior is today's cancel-then-send.
- Stop withdraws undelivered steers; delivered ones are never resent; no extension payload reaches the renderer.
Required tests
- Steer during a tool call; two rapid steers keep their order.
- Steer racing the turn end → delivered exactly once (in the turn or as the next prompt).
- Steer then Stop; steer request timing out → explicit failure, no resend.
- Extension method not found → falls back to the queue.
- Grok dispatch path unchanged.
Base branch
acp-migration (44madfire/orca).
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
acp-migrationOMP Native Chat ACP migrationOMP Native Chat ACP migrationphase-BPhase B parity completionPhase B parity completion
Activity
[-]Non-aborting mid-turn steering for ACP agents that support it[/-][+]OMP dialect: mid-turn "Send now" steers via OMP's ACP steer extension[/+]