fix(memory): skip non-dict history.jsonl lines when reading

This commit is contained in:
santhreal
2026-07-26 17:45:51 +08:00
committed by chengyongru
parent 259d8a018c
commit 745757cc37
2 changed files with 36 additions and 2 deletions
+5 -2
View File
@@ -433,9 +433,11 @@ class MemoryStore:
line = line.strip()
if line:
try:
entries.append(json.loads(line))
parsed = json.loads(line)
except json.JSONDecodeError:
continue
if isinstance(parsed, dict):
entries.append(parsed)
return entries
@@ -453,7 +455,8 @@ class MemoryStore:
lines = [line for line in data.split("\n") if line.strip()]
if not lines:
return None
return json.loads(lines[-1])
parsed = json.loads(lines[-1])
return parsed if isinstance(parsed, dict) else None
except (FileNotFoundError, json.JSONDecodeError, UnicodeDecodeError):
return None
+31
View File
@@ -2,6 +2,7 @@
import json
from datetime import datetime
from pathlib import Path
import pytest
@@ -538,3 +539,33 @@ class TestLegacyHistoryMigration:
assert entries[0]["timestamp"] == "2026-04-01 10:00"
assert "Broken" in entries[0]["content"]
assert "migration." in entries[0]["content"]
def test_history_skips_non_dict_jsonl_lines(tmp_path: Path) -> None:
"""Null/list/bool history lines must not crash reads or appends."""
memory = MemoryStore(tmp_path)
memory.history_file.parent.mkdir(parents=True, exist_ok=True)
memory.history_file.write_text(
"\n".join([
"null",
"[1, 2]",
"true",
json.dumps({
"cursor": 1,
"timestamp": "2026-01-01T00:00:00",
"content": "kept",
"session_key": "cli:t",
}),
"",
]),
encoding="utf-8",
)
entries = memory.read_unprocessed_history(since_cursor=0)
assert entries == [{
"cursor": 1,
"timestamp": "2026-01-01T00:00:00",
"content": "kept",
"session_key": "cli:t",
}]
next_cursor = memory.append_history("next", session_key="cli:t")
assert next_cursor == 2