Summary
The web app has no message queue — sending while a turn is running is blocked. Mobile already has a per-thread "thread outbox". Bring full parity to web.
Behavior (mirror mobile)
- Every send enqueues to a per-thread FIFO outbox; the head auto-delivers when the thread is idle + connected (holds while running/starting).
- Queued items are editable and removable; queue persists across reload (localStorage).
- Composer: when the chat is running, the primary button becomes Queue; Stop/interrupt moves to a secondary control.
Implementation
- Client-only: the server does not buffer mid-turn sends (confirmed) — holding is purely a client concern.
- Hook:
ChatView onSend + a drain useEffect keyed on threadSettled predicates (canSettle / effectiveSettled / hasQueuedTurnStart).
- Reuse pure helpers from
packages/shared where applicable; do not modify the mobile app.
Part of the overnight web-app notifications + queue work.
Summary
The web app has no message queue — sending while a turn is running is blocked. Mobile already has a per-thread "thread outbox". Bring full parity to web.
Behavior (mirror mobile)
Implementation
ChatViewonSend+ a drainuseEffectkeyed onthreadSettledpredicates (canSettle/effectiveSettled/hasQueuedTurnStart).packages/sharedwhere applicable; do not modify the mobile app.Part of the overnight web-app notifications + queue work.