Stage 376: PR #2441

# Conflicts:
#	CHANGELOG.md
This commit is contained in:
nesquena-hermes
2026-05-17 16:42:09 +00:00
3 changed files with 14 additions and 1 deletions
+1
View File
@@ -6,6 +6,7 @@
- Keep the default-off `HERMES_WEBUI_RUNTIME_ADAPTER=legacy-journal` chat-start path response-compatible with the legacy-direct path by not adding adapter-internal `run_id`, `status`, or `active_controls` fields to `/api/chat/start` responses. Fixes #2435.
- Recover already-journaled visible assistant text and tool cards even when restart repair first syncs a populated Hermes core transcript into an otherwise empty WebUI sidecar. The core-sync branch now merges non-duplicate run-journal output before clearing stale stream state, closing the rare #2427 carve-out where recoverable partial output could be silently skipped. Fixes #2434.
- Compact live Thinking cards now reuse the same timeline card across sequential tool calls, preventing repeated Thinking cards from stacking during one multi-tool turn.
## [v0.51.82] — 2026-05-17 — Release BF (stage-375 — 2-PR batch — table renderer pipe protection + Catppuccin appearance skin)
+6 -1
View File
@@ -7040,7 +7040,7 @@ function finalizeThinkingCard(){
const summary=group.querySelector('.tool-call-group-summary');
if(summary) summary.setAttribute('aria-expanded','false');
}
const active=group.querySelector('.agent-activity-thinking[data-thinking-active="1"]');
const active=turn.querySelector('.agent-activity-thinking[data-thinking-active="1"]');
if(active) active.removeAttribute('data-thinking-active');
_syncToolCallGroupSummary(group);
}
@@ -7095,6 +7095,11 @@ function appendThinking(text='', options){
}
const thinkingText=String(text||'').trim()||'Thinking…';
let row=blocks.querySelector('.agent-activity-thinking[data-thinking-active="1"]');
if(!row){
const thinkingCards=Array.from(blocks.querySelectorAll('.agent-activity-thinking'));
row=thinkingCards.filter(el=>el.closest('.assistant-turn-blocks')===blocks).pop()||null;
if(row) row.setAttribute('data-thinking-active','1');
}
if(!row){
row=_thinkingActivityNode(thinkingText, false);
row.setAttribute('data-thinking-active','1');
+7
View File
@@ -307,6 +307,13 @@ class TestToolCallGroupingStatic:
assert "body.querySelector" in live_tool_fn and "data-live-tid" in live_tool_fn, (
"tool_complete must still update its current live Activity burst by tool id."
)
finalize_fn = _function_body(UI_JS, "finalizeThinkingCard")
assert "turn.querySelector('.agent-activity-thinking[data-thinking-active=\"1\"]')" in finalize_fn, (
"Compact Thinking cards live directly in assistant-turn blocks, so finalization must clear the active marker from the whole turn, not only the tool group."
)
assert "thinkingCards.filter" in live_thinking_fn and "setAttribute('data-thinking-active','1')" in live_thinking_fn, (
"Compact live thinking should reactivate the latest existing Thinking card instead of stacking a new card after every tool boundary."
)
close_activity_fn = _function_body(MESSAGES_JS, "_closeCurrentLiveActivityGroup")
assert "data-live-activity-current" in close_activity_fn, (
"Visible interim assistant boundaries should close the previous live Activity burst."