diff --git a/static/ui.js b/static/ui.js index 727f50bf..fe178a91 100644 --- a/static/ui.js +++ b/static/ui.js @@ -440,6 +440,9 @@ function _activeCompressionRecoveryPayload(){ if(!S||!S.session) return null; const recovery=S.session.compression_recovery; if(recovery&&typeof recovery==='object'&&String(recovery.terminal_state||'')==='compression_exhausted') return recovery; + // A cleared session-level recovery payload is authoritative. Only scan + // message metadata for older sessions that never exposed this field. + if(Object.prototype.hasOwnProperty.call(S.session,'compression_recovery')) return null; const messages=Array.isArray(S.messages)?S.messages:[]; for(let i=messages.length-1;i>=0;i--){ const msg=messages[i]; diff --git a/tests/test_compression_recovery_action.py b/tests/test_compression_recovery_action.py index 0a3a7c5b..0df61a8c 100644 --- a/tests/test_compression_recovery_action.py +++ b/tests/test_compression_recovery_action.py @@ -296,3 +296,17 @@ def test_compression_recovery_ui_wires_card_action_and_send_intercept(): assert "function shouldInterceptCompressionRecoveryContinuation" in ui assert "shouldInterceptCompressionRecoveryContinuation(text,S.pendingFiles)" in messages assert "_compressionRecovery:recovery||undefined" in messages + + +def test_compression_recovery_ui_skips_message_fallback_after_session_clear(): + ui = (ROOT / "static/ui.js").read_text(encoding="utf-8") + start = ui.index("function _activeCompressionRecoveryPayload(){") + end = ui.index("function isGenericCompressionContinuationIntent", start) + body = ui[start:end] + + session_guard = "Object.prototype.hasOwnProperty.call(S.session,'compression_recovery')" + message_scan = "const messages=Array.isArray(S.messages)?S.messages:[]" + + assert session_guard in body + assert message_scan in body + assert body.index(session_guard) < body.index(message_scan)