Skip to content

[ENHANCEMENT] Add queue and steer delivery modes for running conversations #133

Description

@allquixotic

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

Constraints / preferences (optional)

  • Requires the concurrent-conversations routing from PR [ENHANCEMENT] Add concurrent conversation sidebar and task switching #128.
  • 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions