Live Stream: skip stale compression recovery fallback

Treat a cleared session-level compression_recovery payload as authoritative so old message metadata cannot intercept a later generic continuation after a successful new turn.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Frank SongandPaperclip committed 2026-07-05 04:25:22 +08:00
1 parent 82a5e92524
commit a83ffae4ac
2 files changed
+17

No files matched your search

+3
View File
@@ -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];
+14
View File
@@ -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)