NousResearch/hermes-agent
TUI /compress command missing before/after summary
Cluster 46686. Data as of
Nothing open on GitHub. Fix merged in #50303 on 21 Jun 2026. Check it covers your case.
The short answer
0open issues
0open PRs
3items grouped
- Known?
- Yes. 3 related items grouped here, 1 issue already closed.
- Fix event
- A fix was merged to main in PR #50303. Check it covers your case. No release data is tracked.
- Tracker
- The maintainers' tracker marks this
unresolved. That is separate from the fix event. - Still open
- Nothing open on GitHub.
These issues and fixes address the TUI not displaying a before/after compression summary after running /compress. Changes aim to bring TUI behavior to parity with CLI feedback.
Open issues0
Open PRs0
Fixes on record
-
#50303 fix(tui): /compress shows a before/after summary (#46686)
files:
tests/test_tui_gateway_server.py,tui_gateway/server.pyShow the diff
-
tests/test_tui_gateway_server.py@@ -4968,7 +4968,8 @@ def _fake_apply_model(sid, session, arg): def test_mirror_slash_compress_does_not_prelock_history(monkeypatch): """Regression guard: /compress side effect must not hold history_lock when calling _compress_session_history (the helper snapshots under - the same non-reentrant lock internally).""" + the same non-reentrant lock internally). It also returns a before/after + summary string (#46686).""" import types seen = {"compress": False, "sync": False} @@ -4977,7 +4978,9 @@ def test_mirror_slash_compress_does_not_prelock_history(monkeypatch): def _fake_compress(session, focus_topic=None, **_kw): seen["compress"] = True assert not session["history_lock"].locked() - return (0, {"total": 0}) + # Simulate a real compaction shrinking the transcript. + session["history"] = [{"role": "user", "content": "summary"}] + return (1, {"total": 0}) def _fake_sync(_sid, _session): seen["sync"] = True @@ -4988,14 +4991,20 @@ def _fake_sync(_sid, _session): monkeypatch.setattr(server, "_emit", lambda *args: emitted.append(args)) session = _session(running=False) - session["agent"] = types.SimpleNamespace(model="x") + session["history"] = [ + {"role": "user", "content": f"m{i}"} for i in range(6) + ] + session["agent"] = types.SimpleNamespace(model="x", _cached_system_prompt="", tools=None) warning = server._mirror_slash_side_effects("sid", session, "/compress") - assert warning == "" + # Now returns a before/after summary (was "" before #46686). assert seen["compress"] assert seen["sync"] assert ("session.info", "sid", {"model": "x"}) in emitted + assert "Compressed:" in warning + assert "6 → 1 messages" in warning + assert "tokens" in warning # --------------------------------------------------------------------------- -
tui_gateway/server.py@@ -9806,9 +9806,49 @@ def _mirror_slash_side_effects(sid: str, session: dict, command: str) -> str: agent.ephemeral_system_prompt = new_prompt or None agent._cached_system_prompt = None elif name == "compress" and agent: + # Mirror the session.compress RPC: build a before/after summary so + # the user gets feedback (#46686). The slash path previously just + # compressed + emitted session.info and returned "", so the TUI + # showed no "compressed N → M messages / ~X → ~Y tokens" stats + # while CLI and gateway both did. + from agent.manual_compression_feedback import summarize_manual_compression + from agent.model_metadata import estimate_request_tokens_rough + + with session["history_lock"]: + _before_messages = list(session.get("history", [])) + _before_count = len(_before_messages) + _sys_prompt = getattr(agent, "_cached_system_prompt", "") or "" + _tools = getattr(agent, "tools", None) or None + _before_tokens = ( + estimate_request_tokens_rough( + _before_messages, system_prompt=_sys_prompt, tools=_tools + ) + if _before_count + else 0 + ) + _compress_session_history(session, arg) _sync_session_key_after_compress(sid, session) + + with session["history_lock"]: + _after_messages = list(session.get("history", [])) + _sys_prompt_after = getattr(agent, "_cached_system_prompt", "") or _sys_prompt + _tools_after = getattr(agent, "tools", None) or _tools + _after_tokens = ( + estimate_request_tokens_rough( + _after_messages, system_prompt=_sys_prompt_after, tools=_tools_after + ) + if _after_messages + else 0 + ) _emit("session.info", sid, _session_info(agent, session)) + _fb = summarize_manual_compression( + _before_messages, _after_messages, _before_tokens, _after_tokens + ) + _lines = [_fb["headline"], _fb["token_line"]] + if _fb.get("note"): + _lines.append(_fb["note"]) + return "\n".join(_lines) elif name == "fast" and agent: mode = arg.lower() if mode in {"fast", "on"}:
-
1 PR closed without merging
From the close comments: merged via another change 1
-
#46702 fix(tui): show compression summary in _mirror_slash_side_effects · merged via another change →
#50303
Closed issues · 1
- Closed#46686TUI/Desktop: /compress doesn't show the before/after summary
How this cluster was grouped
-
Link evidence (
structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference. -
Pairwise link density
0.67: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36.1.00means every pair is linked.
Pick up a Lab task
Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.
Open the LabAt a glance
- Merged PRs
- #50303
- Closed issues
- 1
- Attempts
- 1 PR closed without merging
- Fix link checked
- 21 Jun 2026