From 7425dc354946543d31ab25b3c52e397cdac82dd1 Mon Sep 17 00:00:00 2001 From: Frank Song Date: Sun, 5 Jul 2026 06:45:50 +0800 Subject: [PATCH] fix: preserve compression recovery child markers in sidecar rebuild Co-Authored-By: Paperclip --- api/session_recovery.py | 2 ++ api/webui_session_db.py | 2 ++ tests/test_compression_recovery_action.py | 27 +++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/api/session_recovery.py b/api/session_recovery.py index 1b03bd03..029d1328 100644 --- a/api/session_recovery.py +++ b/api/session_recovery.py @@ -486,6 +486,8 @@ def _state_db_row_to_sidecar(row: dict) -> dict: 'last_prompt_tokens': None, 'compression_recovery': {}, 'recommended_recovery_action': None, + 'compression_recovery_source_session_id': row.get('compression_recovery_source_session_id') or None, + 'compression_recovery_action': row.get('compression_recovery_action') or None, 'gateway_routing': None, 'gateway_routing_history': [], 'llm_title_generated': False, diff --git a/api/webui_session_db.py b/api/webui_session_db.py index c0a257ef..fa699a06 100644 --- a/api/webui_session_db.py +++ b/api/webui_session_db.py @@ -53,6 +53,8 @@ _METADATA_FIELDS = frozenset( "last_prompt_tokens", "compression_recovery", "recommended_recovery_action", + "compression_recovery_source_session_id", + "compression_recovery_action", "truncation_watermark", "truncation_boundary", "gateway_routing", diff --git a/tests/test_compression_recovery_action.py b/tests/test_compression_recovery_action.py index 0df61a8c..9c536d93 100644 --- a/tests/test_compression_recovery_action.py +++ b/tests/test_compression_recovery_action.py @@ -9,6 +9,8 @@ from api.compression_recovery import ( stamp_compression_exhausted_recovery, ) from api.models import Session +from api.session_recovery import _state_db_row_to_sidecar +from api.webui_session_db import WebUIJsonSessionDB ROOT = Path(__file__).resolve().parents[1] @@ -285,6 +287,31 @@ def test_recovery_metadata_is_persisted_and_exposed_in_compact_session(): assert compact["compression_recovery"]["recommended_action"] == "start_focused_continuation" +def test_recovery_child_markers_round_trip_through_state_db_sidecar_rebuild(tmp_path): + db = WebUIJsonSessionDB(tmp_path) + db.write_session( + { + "session_id": "recoverychild1", + "title": "Focused continuation", + "model": "gpt-4o", + "started_at": 1700000000, + "messages": [], + "parent_session_id": "recoverysrc3", + "compression_recovery_source_session_id": "recoverysrc3", + "compression_recovery_action": "start_focused_continuation", + } + ) + row = db.list_sessions()[0] + + assert row["compression_recovery_source_session_id"] == "recoverysrc3" + assert row["compression_recovery_action"] == "start_focused_continuation" + + sidecar = _state_db_row_to_sidecar({"id": "recoverychild1", **row, "messages": []}) + + assert sidecar["compression_recovery_source_session_id"] == "recoverysrc3" + assert sidecar["compression_recovery_action"] == "start_focused_continuation" + + def test_compression_recovery_ui_wires_card_action_and_send_intercept(): ui = (ROOT / "static/ui.js").read_text(encoding="utf-8") messages = (ROOT / "static/messages.js").read_text(encoding="utf-8")