From c85db4f3d7e8aae501d2e3f8b63523e0fb8793e8 Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Sat, 4 Jul 2026 13:37:39 -0400 Subject: [PATCH 1/4] fix(#5523): show running tools as running in Transparent Stream --- static/ui.js | 2 +- tests/test_issue3820_chat_activity_display_mode.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/static/ui.js b/static/ui.js index 170eb14e..3445b90e 100644 --- a/static/ui.js +++ b/static/ui.js @@ -10721,7 +10721,7 @@ function _anchorSceneTransparentNodeForRow(row, opts){ node=_decorateTransparentEventRow(buildToolCard(toolCall),{ type:'tool', name:toolCall&&toolCall.name, - status:_transparentToolStatus(toolCall,true), + status:_transparentToolStatus(toolCall,settled), toolCall, ...meta, }); diff --git a/tests/test_issue3820_chat_activity_display_mode.py b/tests/test_issue3820_chat_activity_display_mode.py index 825ac4be..b45bbaa8 100644 --- a/tests/test_issue3820_chat_activity_display_mode.py +++ b/tests/test_issue3820_chat_activity_display_mode.py @@ -631,6 +631,11 @@ def test_transparent_interrupted_status_on_settled_tools(): permanent Running shimmer). (Trifecta O-Edge.)""" assert "function _transparentToolStatus(tc, settled)" in UI_JS assert "settled?'Interrupted':'Running'" in UI_JS + start = UI_JS.index("function _anchorSceneTransparentNodeForRow(row, opts){") + end = UI_JS.index("\nfunction ", start + 1) + body = UI_JS[start:end] + assert "_transparentToolStatus(toolCall,settled)" in body + assert "_transparentToolStatus(toolCall,true)" not in body assert "_transparentToolStatus(event.toolCall,true)" in UI_JS From 3d483d37019bdf2c9b1cc68929877084996ec4a6 Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Sat, 4 Jul 2026 13:46:59 -0400 Subject: [PATCH 2/4] test(#5523): harden transparent status regression slice --- tests/test_issue3820_chat_activity_display_mode.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/test_issue3820_chat_activity_display_mode.py b/tests/test_issue3820_chat_activity_display_mode.py index b45bbaa8..87ee0837 100644 --- a/tests/test_issue3820_chat_activity_display_mode.py +++ b/tests/test_issue3820_chat_activity_display_mode.py @@ -632,8 +632,20 @@ def test_transparent_interrupted_status_on_settled_tools(): assert "function _transparentToolStatus(tc, settled)" in UI_JS assert "settled?'Interrupted':'Running'" in UI_JS start = UI_JS.index("function _anchorSceneTransparentNodeForRow(row, opts){") - end = UI_JS.index("\nfunction ", start + 1) + depth = 0 + end = None + for idx in range(start, len(UI_JS)): + char = UI_JS[idx] + if char == "{": + depth += 1 + elif char == "}": + depth -= 1 + if depth == 0: + end = idx + 1 + break + assert end is not None, "_anchorSceneTransparentNodeForRow body did not close" body = UI_JS[start:end] + assert "else if(row.role==='tool')" in body assert "_transparentToolStatus(toolCall,settled)" in body assert "_transparentToolStatus(toolCall,true)" not in body assert "_transparentToolStatus(event.toolCall,true)" in UI_JS From 6cf5706f78efa317ddaf8865b2225c909d9e43ed Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Sat, 4 Jul 2026 13:51:32 -0400 Subject: [PATCH 3/4] test(#5523): align persisted anchor status invariant --- tests/test_live_to_final_anchor_visible_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_live_to_final_anchor_visible_order.py b/tests/test_live_to_final_anchor_visible_order.py index 3e4bceb7..206607de 100644 --- a/tests/test_live_to_final_anchor_visible_order.py +++ b/tests/test_live_to_final_anchor_visible_order.py @@ -799,7 +799,7 @@ def test_transparent_stream_renders_persisted_anchor_scene_after_reload(): # tool + thinking rows are rendered as transparent event rows assert "_decorateTransparentEventRow(_thinkingActivityNode" in row assert "_decorateTransparentEventRow(buildToolCard(toolCall)" in row - assert "_transparentToolStatus(toolCall,true)" in row + assert "_transparentToolStatus(toolCall,settled)" in row assert 'data-anchor-settled-scene-row' in row assert "if(anchorOwnedAssistantRawIdxs.has(aIdx)) continue;" in render From 3dee3d299e6ce199341691c4303d9788aa536985 Mon Sep 17 00:00:00 2001 From: nesquena-hermes Date: Sat, 4 Jul 2026 19:03:58 +0000 Subject: [PATCH 4/4] release #5547: Transparent Stream running-tool status fix + CHANGELOG rodboev's one-arg fix (#5523): _anchorSceneTransparentNodeForRow passed a hardcoded settled=true into _transparentToolStatus even when the caller supplied settled:false, so a running tool rendered as done in Transparent Stream. Now passes the caller's actual value. +19/3f, 93 tests green. Co-authored-by: rodboev --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d550bcb5..b3a1ce5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ ### Fixed +- **Transparent Stream now shows a running tool as running, not already-done.** The live anchor-scene renderer hardcoded the tool-status as "settled" even while the tool was still executing, so a tool call flashed straight to its finished state in Transparent Stream instead of showing its in-progress status. It now uses the row's actual settled state, so a running tool reads as running until it genuinely completes. Thanks @rodboev. (#5547, #5523) - **The composer no longer repopulates the tail of a message you already sent.** On mobile/slow connections, a just-sent message could momentarily reappear in the composer because a stale server-side `composer_draft` restored before the empty-draft write caught up. A short per-session suppression window now blocks that stale restore right after send — but scoped to the specific sent payload, so a genuinely new draft you (or another tab) start for the same conversation still restores immediately instead of being swallowed for the window. Drafts are also cleared on the busy send paths (queue / interrupt / steer). Thanks @ruizanthony. (#5471) - **Windows: after an upgrade, browsers no longer keep serving stale JS/CSS when git isn't on the server's PATH.** When the WebUI server was launched on Windows from an environment without git on `PATH` (a venv, a service wrapper, a non-interactive launcher), version detection silently degraded to `unknown`, which froze the `?v=` static-asset cache key — so browsers kept serving cached `ui.js` / `messages.js` / CSS even after the server restarted with fixed code, and the only workaround was a manual hard-refresh on every device. Version detection now resolves `git.exe` from the Git-for-Windows registry key (and common install paths) when it isn't on `PATH`, so the cache stamp updates and clients pick up frontend fixes automatically. Non-Windows behavior is unchanged. Thanks @allenliang2022. (#5522) - **Transparent Stream is smoother during streaming — less row churn and no thinking-block scrollbar flicker.** Building on the identity-preserving live-row reconcile, the renderer now skips redundant work while a response streams: a preserved row's markup isn't rewritten when the incoming HTML is unchanged, a row isn't reinserted when it's already in the correct position, and long thinking blocks no longer flicker an internal scrollbar as their scroll container appears. Purely a reduction of no-op DOM work — what renders is unchanged, and matching rows still preserve their DOM node, copy button, tool-call data, and expanded/collapsed state. Thanks @Stacey2911. (#5456, #5367)