From cbe36c0ada2aeeed2189a882fa46d72967966e17 Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Tue, 30 Jun 2026 08:18:43 -0400 Subject: [PATCH] fix(#5270): confine continuity repair to the chat path --- api/models.py | 35 ++++++++++---------- api/routes.py | 6 ++-- tests/test_issue5270_cli_webui_continuity.py | 2 +- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/api/models.py b/api/models.py index f93fdfd8..3668b5d2 100644 --- a/api/models.py +++ b/api/models.py @@ -6483,23 +6483,24 @@ def reconciled_state_db_messages_for_session( # another non-prefix transform. local_messages = sidecar_messages using_context_messages = False - compressed_context = _context_messages_include_compression_marker(local_messages) - anchor_key = getattr(session, "compression_anchor_message_key", None) - if compressed_context: - if not anchor_key: - logger.debug( - "Compressed context for session %s has no compression anchor; using context_messages only", - getattr(session, "session_id", None), - ) - return list(local_messages) - anchor_index = _state_db_anchor_index(state_messages, anchor_key) - if anchor_index is None: - logger.debug( - "Compressed context for session %s has an unverifiable compression anchor; using context_messages only", - getattr(session, "session_id", None), - ) - return list(local_messages) - state_messages = list(state_messages or [])[anchor_index + 1 :] + if using_context_messages: + compressed_context = _context_messages_include_compression_marker(local_messages) + anchor_key = getattr(session, "compression_anchor_message_key", None) + if compressed_context: + if not anchor_key: + logger.debug( + "Compressed context for session %s has no compression anchor; using context_messages only", + getattr(session, "session_id", None), + ) + return list(local_messages) + anchor_index = _state_db_anchor_index(state_messages, anchor_key) + if anchor_index is None: + logger.debug( + "Compressed context for session %s has an unverifiable compression anchor; using context_messages only", + getattr(session, "session_id", None), + ) + return list(local_messages) + state_messages = list(state_messages or [])[anchor_index + 1 :] state_messages = state_db_delta_after_context(local_messages, state_messages) return merge_session_messages_append_only( local_messages, diff --git a/api/routes.py b/api/routes.py index a88bb601..9c0aa9cd 100644 --- a/api/routes.py +++ b/api/routes.py @@ -4418,7 +4418,7 @@ def _handle_session_anchor_scene(handler, body): return j(handler, {"ok": True, "message_index": idx, "message_ref": ref}) -def _get_or_materialize_session(sid: str): +def _get_or_materialize_session(sid: str, *, refresh_cli_messages: bool = False): """Get a session, materializing from CLI/agent metadata if not in WebUI store. Mirrors the fallback logic in /api/session/archive (routes.py:~8530). @@ -4437,7 +4437,7 @@ def _get_or_materialize_session(sid: str): # below (and the heuristic record-check would mis-trip on mock sessions). if getattr(s, "read_only", False): raise PermissionError("read-only imported session") - if getattr(s, "is_cli_session", False): + if refresh_cli_messages and getattr(s, "is_cli_session", False): latest_messages = get_cli_session_messages( sid, profile=getattr(s, "profile", None), @@ -12118,7 +12118,7 @@ def handle_post(handler, parsed) -> bool: except ValueError as e: return bad(handler, str(e)) try: - s = _get_or_materialize_session(body["session_id"]) + s = _get_or_materialize_session(body["session_id"], refresh_cli_messages=True) except KeyError: return bad(handler, "Session not found", 404) except PermissionError: diff --git a/tests/test_issue5270_cli_webui_continuity.py b/tests/test_issue5270_cli_webui_continuity.py index a7387c1f..2eea9108 100644 --- a/tests/test_issue5270_cli_webui_continuity.py +++ b/tests/test_issue5270_cli_webui_continuity.py @@ -229,7 +229,7 @@ def test_already_claimed_cli_sidecar_still_sees_cli_prior_assistant_on_first_web stale_sidecar.save(touch_updated_at=False) models.SESSIONS[sid] = stale_sidecar - session = routes._get_or_materialize_session(sid) + session = routes._get_or_materialize_session(sid, refresh_cli_messages=True) history = _capture_streaming_history( monkeypatch, config,