fix(desktop): clear orphaned pause-gate modals on $turn_complete#1484
Merged
Conversation
Reported in #1456. Repro: 1. /plan → agent generates plan → plan approval card renders below the assistant message 2. User types follow-up guidance and presses Enter → queued (busy=true) 3. User clicks what looks like the send button — but with busy=true the composer swaps it for the stop/abort button. The turn aborts. 4. \`$turn_complete\` fires (busy=false), the queue drains, send_user appends the user's text to state.messages. But pendingPlans was never cleared, so the orphaned plan card is still rendered AFTER all messages. Result: the new user message visibly lands ABOVE the plan card, exactly the layout the issue screenshots show. By the time the loop emits \`$turn_complete\` any modal still in a pending* array is orphaned — the tool call that opened it has either resolved already (so the array entry is gone) or the turn aborted (so the model isn't coming back for it). Clear all six pending arrays at that point. The error toast the user also saw is from the aborted submit_plan call unwinding through pauseGate; that path is unchanged. Closes #1456
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.
Bug
Reported in #1456. After issuing `/plan`, the user typed follow-up guidance during the approval modal; the composer queued it (busy=true). They then clicked what looked like the send button — but the composer swaps that button for stop/abort while busy. The turn aborted, the queue drained, and the new user message visibly appeared above the still-rendered plan card.
Root cause
The desktop render order is `state.messages → state.pendingPlans` (lines ~1800/1863 in `App.tsx`). Any user message that lands in `messages` while `pendingPlans` still has entries renders above the plan card.
`$turn_complete` only cleared `busy` and `activeSkill`. So on abort:
The error toast the user also saw is the aborted `submit_plan` call unwinding — separate path, unchanged.
Fix
`$turn_complete` now also clears `pendingConfirms`, `pendingPathAccess`, `pendingChoices`, `pendingPlans`, `pendingCheckpoints`, `pendingRevisions`. By the time the loop emits this event, any entry still in those arrays is orphaned anyway:
Test plan
Closes #1456