How it works
Queue
User types a message while the agent is busy (loading indicator visible). Message is queued (up to 5 messages, shown in UI with “queued” label). The 6th message is rejected — the queue does not silently drop messages.
Drain
At the next
prepareStep call (between agent steps), drainSteering() drains all queued messages at once.Flush
Current assistant progress is committed as a completed message, steering messages are appended, and accumulators are reset.
Safety
| Guard | Purpose |
|---|---|
| Abort gate | steeringAbortedRef prevents drainSteering from firing after Ctrl+X |
| Ref sync | messageQueueRef.current = [] set directly in abort handler |
| Queue cap | Maximum 5 queued messages (6th rejected, not dropped) |
| Post-completion drain | After stream ends, remaining queue auto-submitted as the next message |
| Plan-aware | Queue survives across plan revision/execution continuations |