diff --git a/ui-tui/src/app/useMainApp.ts b/ui-tui/src/app/useMainApp.ts index e6e8cfe1f..c97fde79b 100644 --- a/ui-tui/src/app/useMainApp.ts +++ b/ui-tui/src/app/useMainApp.ts @@ -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) + 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, diff --git a/ui-tui/src/app/useSubmission.ts b/ui-tui/src/app/useSubmission.ts index 4fc699676..fee2dd727 100644 --- a/ui-tui/src/app/useSubmission.ts +++ b/ui-tui/src/app/useSubmission.ts @@ -183,12 +183,7 @@ export function useSubmission(opts: UseSubmissionOptions) { return } - const live = getUiState() - - if (!live.sid) { - return sys('session not ready yet') - } - + // Slash + shell run regardless of session state (each handles its own sid needs). if (looksLikeSlashCommand(full)) { appendMessage({ kind: 'slash', role: 'system', text: full }) composerActions.pushHistory(full) @@ -204,6 +199,17 @@ export function useSubmission(opts: UseSubmissionOptions) { return shellExec(full.slice(1).trim()) } + const live = getUiState() + + // No session yet — queue the text and let the ready-flush effect send it. + if (!live.sid) { + composerActions.pushHistory(full) + composerActions.enqueue(full) + composerActions.clearIn() + + return + } + const editIdx = composerRefs.queueEditRef.current composerActions.clearIn() @@ -269,10 +275,10 @@ export function useSubmission(opts: UseSubmissionOptions) { return turnController.interruptTurn({ appendMessage, gw, sid: live.sid, sys }) } - if (doubleTap && composerRefs.queueRef.current.length) { + if (doubleTap && live.sid && composerRefs.queueRef.current.length) { const next = composerActions.dequeue() - if (next && live.sid) { + if (next) { composerActions.setQueueEdit(null) dispatchSubmission(next) }