feat(tui): queue pre-session input, auto-flush when session lands

The TUI is fully interactive from the first frame but `session.create`
(agent + tools + MCP) takes ~2s. Plain-text messages typed before the
session is live used to fail with "session not ready yet"; slash and
shell commands worked but agent prompts were dropped.

Now:
- `dispatchSubmission` enqueues plain text when `sid` is null (slash/shell
  still short-circuit first)
- `useMainApp` tracks sid transitions and kicks off one `sendQueued()`
  when the session first becomes ready; subsequent queued messages drain
  on `message.complete` as before
- Fixed pre-existing double-Enter bug that dequeued without sid check

User flow: type `hello` → shows in `queuedDisplay` preview → 2s later
agent wakes → message auto-sends → reply streams. Zero wasted input.
This commit is contained in:
Brooklyn Nicholson 2026-04-16 15:04:18 -05:00
parent c6ed61430a
commit f3920fec0b
2 changed files with 36 additions and 8 deletions

View file

@ -372,6 +372,28 @@ export function useMainApp(gw: GatewayClient) {
sys
})
// Flush any pre-session queued input once the session lands.
// Message.complete already drains subsequent items; this only kicks off the first.
const prevSidRef = useRef<null | string>(null)
useEffect(() => {
const prev = prevSidRef.current
prevSidRef.current = ui.sid
if (prev !== null || !ui.sid || ui.busy) {
return
}
if (composerRefs.queueEditRef.current !== null) {
return
}
const next = composerActions.dequeue()
if (next) {
sendQueued(next)
}
}, [ui.sid, ui.busy, composerActions, composerRefs, sendQueued])
const { pagerPageSize } = useInputHandlers({
actions: {
answerClarify,