From eac1bb5872fbbd5f9f5937aa4fdd2e50c43cabcd Mon Sep 17 00:00:00 2001 From: kyssta-exe <218078013+kyssta-exe@users.noreply.github.com> Date: Wed, 8 Jul 2026 02:44:23 +0000 Subject: [PATCH 1/2] fix(desktop): register /compress command in TUI gateway dispatch so Desktop can invoke it --- tui_gateway/server.py | 66 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/tui_gateway/server.py b/tui_gateway/server.py index 8092147bc79c5..d83064a8b913c 100644 --- a/tui_gateway/server.py +++ b/tui_gateway/server.py @@ -12013,6 +12013,72 @@ def _(rid, params: dict) -> dict: }, ) + if name in {"compress", "compact"}: + if not session: + return _err(rid, 4001, "no active session to compress") + if session.get("running"): + return _err( + rid, 4009, "session busy — /interrupt the current turn before /compress" + ) + sid = params.get("session_id", "") + try: + 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", [])) + history_version = int(session.get("history_version", 0)) + before_count = len(before_messages) + _agent = session["agent"] + _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 + ) + removed, usage = _compress_session_history( + session, + arg.strip() or None, + approx_tokens=before_tokens, + before_messages=before_messages, + history_version=history_version, + ) + with session["history_lock"]: + after_messages = list(session.get("history", [])) + after_count = len(after_messages) + _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_count + else 0 + ) + _sync_session_key_after_compress(sid, session) + summary = summarize_manual_compression( + before_messages, after_messages, before_tokens, after_tokens + ) + _emit("session.info", sid, _session_info(session.get("agent"), session)) + return _ok( + rid, + { + "type": "exec", + "output": "\n".join( + filter(None, [summary["headline"], summary["token_line"], summary.get("note")]) + ), + }, + ) + except Exception as exc: + return _err(rid, 5009, f"compress failed: {exc}") + return _err(rid, 4018, f"not a quick/plugin/skill command: {name}") From 20ac9ddf1faac15c51057d7cef7dd76da1f9e6b8 Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Wed, 8 Jul 2026 06:33:19 -0700 Subject: [PATCH 2/2] fix(tui): route /compress and /compact past the slash worker to command.dispatch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ported from #60834 (same author) — pending-input routing so clients that fail the slash.exec->dispatch fallback still reach the new compress handler. --- tui_gateway/server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tui_gateway/server.py b/tui_gateway/server.py index d83064a8b913c..7e7404d840a77 100644 --- a/tui_gateway/server.py +++ b/tui_gateway/server.py @@ -11428,6 +11428,8 @@ def _(rid, params: dict) -> dict: "moa", "undo", "learn", + "compress", + "compact", } )