fix(tui): stop one bad event from dropping the rest of a flush batch - #13125
Draft
johnnyeric wants to merge 1 commit into
Draft
fix(tui): stop one bad event from dropping the rest of a flush batch#13125johnnyeric wants to merge 1 commit into
johnnyeric wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Fixes the TUI stall where a turn visibly finishes (footer shows the completed duration) but the prompt keeps spinning and the transcript stops updating.
Why
The SSE client batches events and
flush()clears the queue before iterating, emitting each event unguarded inside a single Solidbatch(). The legacymessage.removed/message.part.removedhandlers insync.tsxcalledsearch(...)onstore.message[...]/store.part[...]without checking they exist — for a session this TUI never hydrated (background-session cleanup, revert, another window), that isundefinedandsearchthrows readingitems.length. One such event mid-batch permanently dropped every later event in that flush, including the idle status the spinner depends on.Changes:
sync.tsx: guard the legacymessage.removed/message.part.removedhandlers with the same missing-collection checks the.1handlers already have, and handlesession.idleby resettingsession_statusto idle.sdk.tsx: isolate event dispatch per handler and per event so one throwing handler logs (tui event handler failed) instead of dropping the rest of the batch or killing the SSE loop.