fix(claude,web): surface assistant content lost to a mid-stream API retry#4
Open
Antisophy wants to merge 2 commits into
Open
fix(claude,web): surface assistant content lost to a mid-stream API retry#4Antisophy wants to merge 2 commits into
Antisophy wants to merge 2 commits into
Conversation
The result event always carries a copy of the final reply text, normally redundant with the streamed assistant message. When the turn's content is lost (e.g. the CLI stops emitting stream events after API retries), that copy is the only surviving record of the reply, yet it rendered collapsed as a bare checkmark divider, indistinguishable from "no response". Compare the result text against the last main-turn assistant message when the result arrives; if it isn't already on screen, flag it and start the result block expanded, like error results already do.
After an API retry, Claude CLI stops emitting stream_event partials for the rest of the process run. Live translation promoted content to visible items only from content_block_* stream events, treating complete assistant events as metadata-only turn/delta, so entire turns rendered as nothing; the final reply text survived only inside the collapsed session-complete result block. When an assistant event arrives and no stream blocks are active, promote its content blocks directly (item/started + item/completed), the same way the sub-agent path already does. Generated item ids use a session-wide counter since per-block assistant events carry no stream index. Also reset stream tracking when an api_retry system event passes through, so a mid-stream abort can't leave stale state that suppresses the fallback.
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.
Problem
When the Anthropic API retries a request mid-stream, the Claude CLI can stop emitting
stream_eventpartials for the rest of that run. cydo builds the visible message only from thosecontent_block_*stream events, so when they stop, the assistant turn can end up rendering as nothing, leaving the reply only inside the session-completeresultblock, which itself shows collapsed as a bare checkmark divider, leaving discovery of the full response very unlikely. When it happened to me, the only way I discovered that I actually was receiving responses was through a desktop notification I was lucky to catch when cydo wasn't focused, leading me to click around to try to find the response I'd seen in the notification and finally expand the checkmark divider, which I'd previously dismissed as uninteractive.Fix
Two commits, the cause and a safety net:
fix(claude): promote assistant content when stream events are missing: when a completeassistantevent arrives with no active stream blocks, promote its content blocks straight toitem/started+item/completed(the same way the sub-agent path already does) so the turn renders. Promoted item ids use a session-wide counter (these per-block events carry no stream index), and anapi_retrysystem event resets stream tracking so a half-opened block from the aborted attempt can't leave stale state that suppresses the fallback.fix(web): keep session result expanded when its text never rendered: theresultevent always carries a copy of the reply; when that copy is the only surviving record, compare it to the last main-turn assistant message and, if it isn't already on screen, start the result block expanded (like error results already do) instead of a bare checkmark.