Skip to content

Feature request: mid-turn steering over ACP #1565

Closed

Description

@gandazgul

Description

I use OpenAB with Discord and RunWield. When an Agent is working, OpenAB continues editing its existing Discord reply. If I send a correction, it sits below that reply without a clear indication of whether it was queued or delivered.

I want to correct an Agent’s direction during the current turn, not wait until it finishes.

Protocol status

Standard ACP v1 does not require steering.

However, there is an existing _session/steering extension implemented by other ACP agents and supported by another client.

Evidence beyond RunWield

1. Claude’s ACP adapter implements and advertises it.

The implementation documents:

  • Method: _session/steering
  • Capability: InitializeResponse._meta.steering.supported
  • Parameters: { sessionId, prompt }
  • Successful active-turn result: { outcome: "injected" }
  • Output continues through session/update.

Pinned source:
Extension definition · Capability advertisement · Implementation

2. Agent Shell has shipped client support.

Agent Shell issue #773 reports testing the extension against:

  • @agentclientprotocol/claude-agent-acp 0.66.0
  • @agentclientprotocol/codex-acp 1.2.0

The maintainer confirms that support was merged in PR #777, exposed as an explicit steering command separate from queueing.

These are upstream implementation references and reported interoperability results, I didnt test agent-shell. I could.

RunWield’s responsibility

RunWield does not currently implement this extension. We would add matching support on our side. The OpenAB request is for generic capability-based support that also works with established ACP adapters, not a RunWield-specific integration.

Use Case

To be able to steer agents from chat surfaces over ACP

Proposed Solution

Proposed OpenAB behavior

  1. Read the agent’s top-level _meta.steering.supported during initialization.
  2. Offer an explicit Steer now action while a turn is active. Keep Queue for next turn as a separate option.
  3. Send _session/steering immediately, without waiting behind the active prompt’s completion or connection lock:
{
  "jsonrpc": "2.0",
  "id": "steer-2",
  "method": "_session/steering",
  "params": {
    "sessionId": "SESSION_ID",
    "prompt": [
      {
        "type": "text",
        "text": "Please stop changing the API and fix only the failing test."
      }
    ]
  }
}
  1. Handle results without duplicating messages:
    • injected: mark delivered; do not also queue it.
    • startedNewTurn: the agent has started work; do not resubmit.
    • promptRequired: submit through normal session/prompt.
    • Unsupported agent: retain normal queueing and show Queued.
    • Timeout/disconnect: show Delivery unconfirmed; do not blindly retry because the agent may already have accepted it.

Do not automatically cancel the current turn as a substitute for steering.

Discord presentation

After successful steering, subsequent output should start in a fresh bot message below the correction, rather than continue editing the older reply above it.

Show separate states for queued, delivered, and delivery unconfirmed. An injected response confirms admission, not that the model has already read the correction.

Maintainer acceptance criteria: Discord validation before opening a PR

Before opening a PR, test extensively on Discord in the contributor's fork and include evidence in the PR description. Keep Steer now separate from Queue for next turn and cover the shared streaming edit path.

  • A steer during an active turn on a supporting agent (for example claude-agent-acp or codex-acp) shows Delivered, and the agent picks up the correction.
  • An agent without top-level _meta.steering.supported falls back to normal queueing with a clear Queued state.
  • After successful steering, subsequent output starts in a fresh bot message below the correction.
  • Normal streaming replies continue to work.
  • Message queueing and batching during a turn continue to work.
  • /cancel, /cancel-all, and /reset continue to work.
  • Long replies continue to overflow into multiple messages.
  • A steer sent just as a turn finishes is handled without losing or duplicating the correction.
  • Timeout/disconnect shows Delivery unconfirmed, without an automatic retry or duplicate message.

Record the tested agent/version, fork revision, Discord scenario, observed result, and supporting logs or message evidence. Automated coverage complements the requested live Discord evidence; it does not replace it.

Activity

  1. chaodu-agent commented on Oct 28, 2026

    @chaodu-agent
    Collaborator

    Thanks for the proposal. Mid-turn steering via the non-standard _session/steering extension is accepted for discussion, with these constraints:

    • It is gated on the agent advertising _meta.steering.supported.
    • Agents that do not advertise it fall back to today's behavior (queue the message until the current turn ends).
    • It needs a Discord UX design that makes clear to users whether a message was injected into the running turn or queued.

    Removing needs-triage.

  2. thepagent commented on Oct 30, 2026

    @thepagent
    Collaborator

    close for staleness. Let's discuss on Discord if still relevant.

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions