You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When a conversation is already running, users need a clear way to send more input without guessing whether it will wait for the next handoff, steer the active task, or be dropped. A single implicit queue is not expressive enough for long-running concurrent conversations. Competing tools like Codex and Claude Code allow the user to either queue or steer the conversation. Queue means the user's input will be provided to the LLM after it is fully finished the conversation and returns control back to the user. Steer means that on the next opportunity after a tool call sequence is complete, the harness (Zoo) will insert the change into the conversation stream before the model can continue.
Context (who is affected and when)
This affects users who send additional instructions while Zoo is streaming, running tools, waiting at an API boundary, waiting on a follow-up handoff, or recovering after cancellation/resume. It is especially useful once concurrent conversations are available because users can keep working while a task is active.
Desired behavior (conceptual, not technical)
Zoo Code should distinguish ordinary queued follow-up messages from steer messages. Queued messages should wait for the next safe handoff. Steer messages should be delivered sooner at safe task/API/tool boundaries, without corrupting model-visible tool history or losing queued input.
Route queued/steer operations to the selected conversation/task.
Preserve images, timestamps, and message IDs when editing or switching delivery mode.
Preserve queued messages when a running task is cancelled and replaced with a resumable task.
Do not drain ordinary queued messages during unsafe/resumable states just because a compatibility method is called.
Keep model-visible API history valid when steering interrupts pending tool blocks.
Request checklist
I've searched existing Issues and Discussions for duplicates
This describes a specific problem with clear context and impact
Zoo Code Task Links (optional)
N/A
Acceptance criteria (optional)
Given a running conversation, when the user sends an ordinary follow-up, then it is queued with delivery mode queue.
Given a queued message, when the user switches it to steer, then it moves to the steer lane without losing text/images/timestamps.
Given a steer message is pending at an API boundary or after a completed tool boundary, then Zoo delivers it as user feedback and continues from a safe point.
Given a steer message interrupts before later tool blocks run, then skipped tool-use blocks receive synthetic tool results so provider history remains valid.
Given a task is cancelled and replaced with a resumable task, then queued/steer messages are restored on the replacement task and are not prematurely drained.
The queued-message UI lets users view lanes, edit messages, switch delivery mode, and remove messages.
Proposed approach (optional)
Add a QueuedMessageDeliveryMode type with queue and steer lanes, update MessageQueueService to manage separate lanes with steer-first combined ordering, extend webview messages with delivery mode metadata, update the queued-message UI, and add Task handoff helpers for queued drain and steer delivery at API/tool boundaries.
This issue and the associated PR were prepared with agentic AI assistance, then reviewed by a human. The underlying feature has been tested in production business use for several weeks in the contributor's fork.
Trade-offs / risks (optional)
The main risk is boundary safety. Steering must not interrupt in the middle of a provider/tool protocol in a way that creates invalid tool history. This branch handles that by appending synthetic tool results for skipped tool blocks and by consuming steer input only at explicit API/tool boundaries.
Problem (one or two sentences)
When a conversation is already running, users need a clear way to send more input without guessing whether it will wait for the next handoff, steer the active task, or be dropped. A single implicit queue is not expressive enough for long-running concurrent conversations. Competing tools like Codex and Claude Code allow the user to either
queueorsteerthe conversation. Queue means the user's input will be provided to the LLM after it is fully finished the conversation and returns control back to the user. Steer means that on the next opportunity after a tool call sequence is complete, the harness (Zoo) will insert the change into the conversation stream before the model can continue.Context (who is affected and when)
This affects users who send additional instructions while Zoo is streaming, running tools, waiting at an API boundary, waiting on a follow-up handoff, or recovering after cancellation/resume. It is especially useful once concurrent conversations are available because users can keep working while a task is active.
Desired behavior (conceptual, not technical)
Zoo Code should distinguish ordinary queued follow-up messages from steer messages. Queued messages should wait for the next safe handoff. Steer messages should be delivered sooner at safe task/API/tool boundaries, without corrupting model-visible tool history or losing queued input.
Constraints / preferences (optional)
Request checklist
Zoo Code Task Links (optional)
N/A
Acceptance criteria (optional)
queue.steer, then it moves to the steer lane without losing text/images/timestamps.Proposed approach (optional)
Add a
QueuedMessageDeliveryModetype withqueueandsteerlanes, updateMessageQueueServiceto manage separate lanes with steer-first combined ordering, extend webview messages with delivery mode metadata, update the queued-message UI, and add Task handoff helpers for queued drain and steer delivery at API/tool boundaries.This issue and the associated PR were prepared with agentic AI assistance, then reviewed by a human. The underlying feature has been tested in production business use for several weeks in the contributor's fork.
Trade-offs / risks (optional)
The main risk is boundary safety. Steering must not interrupt in the middle of a provider/tool protocol in a way that creates invalid tool history. This branch handles that by appending synthetic tool results for skipped tool blocks and by consuming steer input only at explicit API/tool boundaries.