Note
Grok responding on behalf of Julius.
Thanks for the detailed write-up. I checked it against main @ 0b6ec43, and the root cause you describe matches what I see in the source. I haven't reproduced it at runtime.
What the code shows
ClaudeAdapterV2.ts:866setsincludePartialMessages: true, and:202advertisesstreamsAssistantText: true.- The root
stream_eventbranch atClaudeAdapterV2.ts:5855-5899only handlesmessage_start,thinkingblock starts,thinking_deltaandcontent_block_stop. It then returns unconditionally. The file has notext_deltahandling (the onlytext_deltain the adapter's tests is a protocol-logger fixture). - Assistant text comes only from the SDK
assistantsnapshot:assistantTextFromSdkMessage(:1078-1088) feedsemitAssistantTextArtifacts(:5228, called at:6549), which goes throughbuildAssistantArtifacts(:2562). That setsstreaming: falseon both the message and the turn item (:2622,:2644). The comment at:5907notes the SDK sends one snapshot per completed content block, so a long text block lands all at once. makeAssistantStreamingFilter(assistantStreaming.ts:92-128) passesstreaming: falseevents straight through (:110-113). Paragraph splitting only runs forstreaming: trueevents, so Claude text never reaches it.- There is no token or "full" mode on v2 anymore.
ResponseStreamingModeis["turn", "paragraph"](packages/contracts/src/settings.ts:1156), and a persisted"token"setting is migrated to"paragraph"(apps/server/src/serverSettings.ts:359-367). So it looks like Claude reply text doesn't stream in any mode right now.
Regression
The pre-v2 adapter streamed text_delta as content.delta with streamKind: "assistant_text" (provider/Layers/ClaudeAdapter.ts:2943-2995 @ 024d495). ClaudeAdapterV2.ts as introduced in #2829 (de34391) already had no text_delta handling, and none of the ~20 later commits to the file add it. I didn't find a comment or decision suggesting the omission was intentional, so this appears to be a gap from the rewrite. Codex streams agent text through makeProviderTextDeltaCoalescer (CodexAdapterV2.ts:3339-3393, fed at :4196-4206), and ACP appends agent_message_chunk text as streaming: true items.
Possible fix (untested)
- In the
stream_eventbranch atClaudeAdapterV2.ts:5855-5899, also handlecontent_block_startwithtype: "text"andtext_delta. Use a second coalescer set up likereasoningDeltas(:4876-4916). - While streaming, emit
streaming: trueassistant_messageturn items. Following Codex (CodexAdapterV2.ts:3379-3393), the message would only be sent on completion. - The main catch is IDs. The snapshot path keys assistant text on the snapshot's
message.uuid(:1085, deduplicated at:5233), and stream events don't carry that uuid. The streamed item would probably need a stable ID like${message.id}:text:${index}, which is how thinking blocks already pair streams with snapshots (:5868,:5913), with the snapshot reusing it. Otherwise the reply may render twice. Interrupted turns and thefallbackTextpath (:5011) would also need to complete or skip the streamed item.
Related
#17171 is a separate reasoning-row display issue (reasoning does stream from this adapter). #15767 adds coalescing for Pi, OpenCode and Cursor text_delta but doesn't touch Claude. I didn't find a duplicate issue or an open or merged PR that fixes this.