What happens
A message sent while the agent is mid-turn is queued and shown in the "queued" banner above the composer in the desktop chat pane. There is no way to take it back: the banner lists queued and unconfirmed messages but offers no remove action, and nothing in the app, the local control IPC or the server hub withdraws a dispatched input.
Where it comes from
ChatTabViewModel keeps QueuedMessages (each a QueuedChatMessage, with an unconfirmed state until the lane acknowledges it) and mirrors the server's queue through PendingInputUpdate / QueuedInputItem, which carries a dispatch_id. The banner in ChatTabView.axaml renders that list read-only.
Expected
Each queued message gets a cancel control that removes it before the agent consumes it:
- Server lane: a hub method that withdraws a queued input by
dispatch_id (server change, with PendingInputChanged pushing the shrunken queue back).
- Local lane: a new local-control frame that removes an item from the daemon's input queue, appended to
FrameType and advertised through LocalControlCapabilities so an older daemon reports no such capability and the control hides.
- Desktop: an "x" on each queued item, disabled once the item is no longer cancellable, and a clear result when the cancel lost the race with delivery.
What happens
A message sent while the agent is mid-turn is queued and shown in the "queued" banner above the composer in the desktop chat pane. There is no way to take it back: the banner lists queued and unconfirmed messages but offers no remove action, and nothing in the app, the local control IPC or the server hub withdraws a dispatched input.
Where it comes from
ChatTabViewModelkeepsQueuedMessages(each aQueuedChatMessage, with an unconfirmed state until the lane acknowledges it) and mirrors the server's queue throughPendingInputUpdate/QueuedInputItem, which carries adispatch_id. The banner inChatTabView.axamlrenders that list read-only.Expected
Each queued message gets a cancel control that removes it before the agent consumes it:
dispatch_id(server change, withPendingInputChangedpushing the shrunken queue back).FrameTypeand advertised throughLocalControlCapabilitiesso an older daemon reports no such capability and the control hides.