Skip to content

OMP dialect: mid-turn "Send now" steers via OMP's ACP steer extension #82

Open

Description

@44madfire

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#20 reliability: 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.dispatch while a prompt is active sends session/cancel and 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 steer hook on AcpDialect. AcpStructuredTurns calls 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 confirmed orca-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 inject path 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

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).

Activity

  1. changed the title [-]Non-aborting mid-turn steering for ACP agents that support it[/-] [+]OMP dialect: mid-turn "Send now" steers via OMP's ACP steer extension[/+] on Oct 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    acp-migrationOMP Native Chat ACP migrationphase-BPhase B parity completion

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions