fix(conversations): resolve turn content OmniRoute never sends back to the client - #12447
Merged
diegosouzapw merged 2 commits intoSep 3, 2026
Conversation
…o the client resolveTurnDisplayContent only ever read a turn node's originating clientRawRequest.body -- fine for a full-history-resend conversation (every later request's body eventually contains everything), but a genuine-continuation turn's own request only ever carries the NEW delta (see responsesContinuationStore.ts). That silently rendered the model's own generated tool_use/text turns as "Tool (empty)"/"Assistant (empty)" in the /dashboard/conversations tree -- their content never appears in any request body, only in a response. Verified against a real 133-node continuation conversation: request-only resolution left 131/133 nodes unresolved. Added two more sources, read from the SAME already-loaded artifact (no extra I/O): - the call's own clientResponse.output (the model's own generated turn -- 132 -> 76 unresolved) - the call's own providerRequest.body (the server-reconstructed full history actually forwarded upstream for non-Responses-native providers, Chat Completions messages shape) -- best-effort, translated text can differ byte-for-byte from what was originally hashed, so this doesn't close 100% but does close the "Tool (empty)" case entirely (76 -> 21, all 112 tool nodes resolved; the remaining 21 are plain user/assistant text turns old enough to predate both available artifacts -- genuinely lost history, not a resolution gap).
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 2, 2026
… OmniRoute never sends back to the client) into dev/omniroute-dev-combined
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 2, 2026
… OmniRoute never sends back to the client) into dev/omniroute-dev-combined
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 2, 2026
… OmniRoute never sends back to the client) into dev/omniroute-dev-combined
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 2, 2026
… OmniRoute never sends back to the client) into dev/omniroute-dev-combined
…lexity Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
Owner
|
sweep-reds / babysit: Own FQG (complexity + open-sse typecheck TS2345) and API Route Typecheck are fixed in |
Owner
|
sweep-reds round 6 / babysit: remaining FQG after the typecheck/complexity split
STOP on inherited FQG. Own split already landed. |
diegosouzapw
merged commit Sep 3, 2026
7881e7e
into
diegosouzapw:release/v3.8.51
15 of 16 checks passed
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…o the client (diegosouzapw#12447) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
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 Problem This Solves
/dashboard/conversations's turn tree showed many turns as "Tool (empty)"/"Assistant (empty)" for genuine-continuation conversations, even though the actual content clearly existed and was served correctly.Why This Change Was Made
resolveTurnDisplayContentonly ever read a turn node's originatingclientRawRequest.body— fine for a full-history-resend conversation (every later request's body eventually contains everything), but a genuine-continuation turn's own request only ever carries the NEW delta. That silently left the model's own generated tool_use/text turns unresolved — their content never appears in any request body, only in a response.Verified against a real 133-node continuation conversation: request-only resolution left 131/133 nodes unresolved.
Added two more sources, read from the SAME already-loaded artifact (no extra I/O):
clientResponse.output(the model's own generated turn — 131 → 76 unresolved)providerRequest.body(the server-reconstructed full history actually forwarded upstream for non-Responses-native providers, Chat Completionsmessagesshape) — best-effort, translated text can differ byte-for-byte from what was originally hashed, so this doesn't close 100%, but it does close the "Tool (empty)" case entirely (76 → 21, all 112 tool nodes resolved; the remaining 21 are plain user/assistant text turns old enough to predate both available artifacts — genuinely lost history, not a resolution gap).User Impact
The conversation tree now renders real content for tool calls and assistant turns in continuation-mode conversations instead of empty placeholders.
Evidence
Verified against a real production conversation (133 turn nodes): before/after unresolved-node counts (131 → 76 → 21) computed by replaying the exact resolution logic against the real stored artifacts.
🤖 Generated with Claude Code