fix(session): reset out-of-range last_consolidated to recover hidden history (#4066)

This commit is contained in:
04cb 2026-06-03 07:33:42 +08:00 committed by Xubin Ren
parent d1a94dae8a
commit 0307ee6b73
3 changed files with 26 additions and 1 deletions

View File

@ -99,6 +99,11 @@ class Session:
metadata: dict[str, Any] = field(default_factory=dict) metadata: dict[str, Any] = field(default_factory=dict)
last_consolidated: int = 0 # Number of messages already consolidated to files last_consolidated: int = 0 # Number of messages already consolidated to files
def __post_init__(self) -> None:
# An out-of-range offset (corrupt metadata) would hide all history; reset it.
if not 0 <= self.last_consolidated <= len(self.messages):
self.last_consolidated = 0
@staticmethod @staticmethod
def _annotate_message_time(message: dict[str, Any], content: Any) -> Any: def _annotate_message_time(message: dict[str, Any], content: Any) -> Any:
"""Expose persisted turn timestamps to the model for relative-date reasoning. """Expose persisted turn timestamps to the model for relative-date reasoning.

View File

@ -205,7 +205,8 @@ class TestRepairCorruptFile:
session = mgr._load("test:badts") session = mgr._load("test:badts")
assert session is not None assert session is not None
assert session.last_consolidated == 5 # offset 5 exceeds the single loaded message; reset to avoid hiding history (#4066)
assert session.last_consolidated == 0
assert isinstance(session.created_at, datetime) assert isinstance(session.created_at, datetime)
def test_read_session_file_repairs_corrupt_jsonl(self, tmp_path: Path): def test_read_session_file_repairs_corrupt_jsonl(self, tmp_path: Path):

View File

@ -0,0 +1,19 @@
"""Reset a corrupt last_consolidated offset instead of hiding history (#4066)."""
from nanobot.session.manager import Session
def _session(count: int, last_consolidated: int) -> Session:
msgs = [{"role": "user", "content": f"msg{i}"} for i in range(count)]
return Session(key="chan:chat", messages=msgs, last_consolidated=last_consolidated)
def test_out_of_range_offset_is_reset():
assert _session(10, 999).last_consolidated == 0
assert _session(3, -5).last_consolidated == 0
def test_valid_offset_is_preserved():
session = _session(10, 4)
assert session.last_consolidated == 4
assert len(session.get_history()) == 6