Context
Parent: #135 (AgentWolf v1 Foundation Architecture — Layer 4 RunLoop)
ACP RFD #1261 proposes session/inject with mode: "queue" | "steer", agent-owned messageId, user_message echo notification, and mandatory session/revoke_inject. This is the upstream protocol standardization of the steer/queue pattern AgentPool already implements internally via CommChannel + Feedback.
Related Bug Fix (Completed)
The steer() bug (PR #144 comment) was fixed in this session: steer() now checks enqueue("asap") before the CommChannel feedback path, ensuring ProtocolChannel sessions (ACP/OpenCode/AG-UI) get mid-turn injection. TDD tests added in tests/lifecycle/test_run_loop.py.
What's Missing
AgentPool's Feedback dataclass (src/agentpool/lifecycle/types.py L61-72) currently has only:
@dataclass
class Feedback:
content: str
is_steer: bool
No messageId, no revoke, no replace, no steer_in_stream capability. The RFD requires all of these for session/inject compliance.
Tasks
P1: Extend Feedback type
P1: Define cancel() interaction with pending steer/followup
P2: Implement session/revoke_inject semantics
P2: Add steer_in_stream capability declaration
P3: Evaluate session/replace_inject (opt-in)
P3: ACP protocol mapping
RFD #1261 Key Design Points
| Aspect |
RFD Design |
AgentPool Current |
| Method |
session/inject with mode: "queue" | "steer" |
steer() + followup() (separate methods) |
| Response |
Immediate messageId (agent-owned) |
Fire-and-forget (no ID) |
| Delivery signal |
user_message notification with messageId |
CommChannel feedback queue drain |
| Revoke |
session/revoke_inject (mandatory) |
Not implemented |
| Replace |
session/replace_inject (opt-in via pending.replace) |
Not implemented |
steer_in_stream |
["interrupt"] / ["finish"] capability |
Not declared |
| cancel interaction |
Pending injects survive cancel |
Undefined (independent paths) |
| Version |
v2-only (depends on v2 prompt lifecycle) |
v1 (v2 not yet implemented) |
References
Context
Parent: #135 (AgentWolf v1 Foundation Architecture — Layer 4 RunLoop)
ACP RFD #1261 proposes
session/injectwithmode: "queue" | "steer", agent-ownedmessageId,user_messageecho notification, and mandatorysession/revoke_inject. This is the upstream protocol standardization of the steer/queue pattern AgentPool already implements internally viaCommChannel+Feedback.Related Bug Fix (Completed)
The
steer()bug (PR #144 comment) was fixed in this session:steer()now checksenqueue("asap")before the CommChannel feedback path, ensuring ProtocolChannel sessions (ACP/OpenCode/AG-UI) get mid-turn injection. TDD tests added intests/lifecycle/test_run_loop.py.What's Missing
AgentPool's
Feedbackdataclass (src/agentpool/lifecycle/types.pyL61-72) currently has only:No
messageId, no revoke, no replace, nosteer_in_streamcapability. The RFD requires all of these forsession/injectcompliance.Tasks
P1: Extend
Feedbacktypemessage_id: str | None = Nonefield toFeedbackdataclasscontent_blocks: list[ContentBlock] | None = Nonefor structured content (ACPContentBlock[]shape)message_idinProtocolChannel.deliver_feedback()when not provided (UUID-based)steer()andfollowup()to accept and propagatemessage_idP1: Define
cancel()interaction with pending steer/followupsession/cancel, deliver at next idleRunHandle.cancel()— does it clear CommChannel feedback queue?cancel()during pending steer → steer survives and delivers next turnsteer()docstringP2: Implement
session/revoke_injectsemanticsRevokedFeedbacktracking (tombstone bymessage_id)ProtocolChannel.recv()skips revoked feedbackRunHandle.revoke_steer(message_id: str) -> boolmethoduser_messageemittedalready_deliverederrorP2: Add
steer_in_streamcapability declaration["interrupt"](truncate stream) vs["finish"](let stream complete)agentCapabilitiesin ACPinitializeresponse["interrupt"](PendingMessageDrainCapabilitysupports this)["finish"](must wait for tool boundary, can't interrupt mid-stream)P3: Evaluate
session/replace_inject(opt-in)pending.replace: boolcapability flagProtocolChannel.replace_feedback(message_id, new_content) -> boolP3: ACP protocol mapping
_session/injectextension method on ACP v1 (underscore prefix, per ACP extensibility spec)RunState.RUNNING→ ACP v2state_change(state="running")RunState.IDLE→ ACP v2state_change(state="idle")session/prompt)RFD #1261 Key Design Points
session/injectwithmode: "queue" | "steer"steer()+followup()(separate methods)messageId(agent-owned)user_messagenotification withmessageIdsession/revoke_inject(mandatory)session/replace_inject(opt-in viapending.replace)steer_in_stream["interrupt"]/["finish"]capabilityReferences
yoke233/claude-agent-acpsession/steernotification