diff --git a/api/session_recovery.py b/api/session_recovery.py index 029d1328..78dd1042 100644 --- a/api/session_recovery.py +++ b/api/session_recovery.py @@ -453,6 +453,9 @@ def _state_db_row_to_sidecar(row: dict) -> dict: messages = row.get('messages') if isinstance(row.get('messages'), list) else [] last_ts = messages[-1].get('timestamp') if messages and isinstance(messages[-1], dict) else started_at workspace_value = row.get('workspace') or '' + compression_recovery = row.get('compression_recovery') + if not isinstance(compression_recovery, dict): + compression_recovery = {} return { 'session_id': row.get('id'), 'title': row.get('title') or 'Recovered WebUI Session', @@ -484,8 +487,8 @@ def _state_db_row_to_sidecar(row: dict) -> dict: 'context_length': None, 'threshold_tokens': None, 'last_prompt_tokens': None, - 'compression_recovery': {}, - 'recommended_recovery_action': None, + 'compression_recovery': compression_recovery, + 'recommended_recovery_action': row.get('recommended_recovery_action') or 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, diff --git a/tests/test_compression_recovery_action.py b/tests/test_compression_recovery_action.py index 502bc7d0..44dc1dde 100644 --- a/tests/test_compression_recovery_action.py +++ b/tests/test_compression_recovery_action.py @@ -390,6 +390,33 @@ def test_recovery_child_markers_round_trip_through_state_db_sidecar_rebuild(tmp_ assert sidecar["compression_recovery_action"] == "start_focused_continuation" +def test_recovery_source_metadata_round_trips_through_state_db_sidecar_rebuild(tmp_path): + recovery = { + "type": "compression_recovery_required", + "terminal_state": "compression_exhausted", + "recommended_action": "start_focused_continuation", + "source_session_id": "recoverysrc4", + } + db = WebUIJsonSessionDB(tmp_path) + db.write_session( + { + "session_id": "recoverysrc4", + "title": "Exhausted source", + "model": "gpt-4o", + "started_at": 1700000000, + "messages": [{"role": "user", "content": "long task"}], + "compression_recovery": recovery, + "recommended_recovery_action": "start_focused_continuation", + } + ) + row = db.list_sessions()[0] + + sidecar = _state_db_row_to_sidecar({"id": "recoverysrc4", **row, "messages": []}) + + assert sidecar["compression_recovery"] == recovery + assert sidecar["recommended_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")