From 1bad85feb4caee1a350ec45a488f2b1ffe69d855 Mon Sep 17 00:00:00 2001 From: nesquena-hermes Date: Thu, 4 Jun 2026 14:28:00 -0700 Subject: [PATCH] =?UTF-8?q?Release=20v0.51.258=20=E2=80=94=20Release=20HZ?= =?UTF-8?q?=20(stage-r6)=20(#3611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Release v0.51.258 — Release HZ (stage-r6) Fresh-arrival low-risk pair (both @rodboev, landed in the last sweep window). ### Fixed | Issue | Fix | |-------|-----| | #3597 | The "update available" banner now shows from **any panel** (Settings → System "Check now", etc.), not just the Chat view — it was positioned inside the chat surface so it only rendered there. | | #3592 | Under Simplified Tool Calling, an assistant turn with **thinking but no tool calls** now renders that thinking inline on settlement instead of burying it in an empty collapsed activity group. | ### Review fix absorbed (Codex) #3592's inline-render `continue` skipped the activity-group creation that carried the turn's `data-turn-duration`, but the footer still suppressed the "Done in …" duration for any `assistantThinking` turn → thinking-only turns silently lost their duration display. Fixed: footer duration is now suppressed **only** for turns that actually build an activity group (`toolCallAssistantIdxs.has(mi)`), so thinking-only inline turns keep "Done in …". + regression test. ### Gate - Full pytest suite: **7631 passed, 0 failed** - ESLint: CLEAN · browser-smoke: CLEAN - Codex (regression): SHIP-ONLY-WITH-FIXES (duration-drop) → fixed → **SAFE TO SHIP** ### Sweep note #3603 + #3604 (sidebar CLI-session classification, same author/area) were **not** included — they assert contradictory models for a sidecar-less `source='cli'` recovery row; flagged on both PRs for the author to reconcile. Co-authored-by: rodboev --- CHANGELOG.md | 6 ++ static/index.html | 32 +++--- static/style.css | 4 +- static/ui.js | 18 +++- tests/test_issue3592_thinking_settlement.py | 100 ++++++++++++++++++ .../test_issue3597_update_banner_position.py | 29 +++++ 6 files changed, 167 insertions(+), 22 deletions(-) create mode 100644 tests/test_issue3592_thinking_settlement.py create mode 100644 tests/test_issue3597_update_banner_position.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ea324a36f..583d8de2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ ## [Unreleased] +## [v0.51.258] — 2026-06-04 — Release HZ (stage-r6 — update banner from any panel + inline thinking on settlement) + +### Fixed +- The "update available" banner now appears from **any panel** (Settings → System "Check now", etc.), not just the Chat view — the banner element was positioned so it only rendered visibly on the Chat surface. (#3597, @rodboev) +- Under Simplified Tool Calling, an assistant turn that produced **thinking but no tool calls** now renders that thinking inline on settlement instead of burying it in an empty collapsed activity group. (#3592, @rodboev) + ## [v0.51.257] — 2026-06-04 — Release HY (stage-r5 — provider refresh route + SessionDB self-heal) ### Fixed diff --git a/static/index.html b/static/index.html index 57000e624..799d0f71d 100644 --- a/static/index.html +++ b/static/index.html @@ -371,6 +371,22 @@
+
+
+ + + + +
+
+ + + +
+
@@ -407,22 +423,6 @@
-
-
- - - - -
-
- - - -
-
A response may have been in progress when you last left. Reload messages?
diff --git a/static/style.css b/static/style.css index 3e4ea8171..53012913c 100644 --- a/static/style.css +++ b/static/style.css @@ -3305,12 +3305,12 @@ main.main > #mainPlugin{display:none;} .settings-section-title{font-size:18px;font-weight:600;letter-spacing:-.01em;color:var(--text);line-height:1.3;margin-bottom:4px;} .settings-section-meta{font-size:13px;color:var(--muted);line-height:1.55;} .settings-version-badge{display:inline-flex;align-items:center;padding:3px 8px;border-radius:999px;background:var(--surface);color:var(--muted);font-size:11px;font-weight:600;font-family:'SF Mono',ui-monospace,SFMono-Regular,Menlo,monospace;flex-shrink:0;align-self:flex-start;letter-spacing:.02em;} -#checkUpdatesBlock{display:inline-flex;align-items:center;gap:6px;font-size:12px;flex-shrink:0;align-self:flex-start;} +#checkUpdatesBlock{display:inline-flex;align-items:center;gap:0.5em;font-size:12px;flex-shrink:0;align-self:flex-start;flex-wrap:wrap;} #checkUpdatesBlock .btn-tiny{padding:4px 10px;border-radius:8px;border:1px solid var(--border);background:var(--surface);color:var(--text);font-size:11px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:border-color .15s,color .15s;} #checkUpdatesBlock .btn-tiny:hover{border-color:var(--accent);color:var(--accent);} #checkUpdatesBlock .btn-tiny:disabled{opacity:.5;cursor:default;} #checkUpdatesBlock .btn-tiny .spinner-xs{width:12px;height:12px;border:2px solid var(--border);border-top-color:var(--text);border-radius:50%;animation:spin .6s linear infinite;display:none;} -#checkUpdatesStatus{font-size:11px;font-weight:500;white-space:nowrap;} +#checkUpdatesStatus{font-size:11px;font-weight:500;white-space:nowrap;flex-basis:100%;margin-top:0.25em;} /* Each logical form row is a card surface. Stack with comfortable gap. */ #mainSettings .settings-field{margin-bottom:12px;padding:16px;border:1px solid var(--border);border-radius:12px;background:var(--sidebar);} diff --git a/static/ui.js b/static/ui.js index ac64191ce..937dad7a1 100644 --- a/static/ui.js +++ b/static/ui.js @@ -7213,6 +7213,13 @@ function renderMessages(options){ const activityIdxs=[...new Set([...Object.keys(byAssistant).map(k=>parseInt(k)), ...assistantThinking.keys()])].sort((a,b)=>a-b); for(const aIdx of activityIdxs){ const cards=byAssistant[aIdx]||[]; + if(!cards.length&&assistantThinking.has(aIdx)){ + const anchorRow=assistantSegments.get(aIdx); + if(anchorRow&&window._showThinking!==false){ + anchorRow.insertAdjacentHTML('beforeend',_thinkingCardHtml(assistantThinking.get(aIdx))); + } + continue; + } let anchorRow=assistantSegments.get(aIdx)||null; if(!anchorRow&&assistantIdxs.length){ if(aIdx
') + banner_pos = src.find('id="updateBanner"') + assert main_pos != -1, "
not found" + assert main_end != -1, "
not found" + assert main_pos < banner_pos < main_end, ( + "#updateBanner must be inside
, " + "not before it or after the closing
" + )