fix(session): make SQLite transcript rewrites transactional

This commit is contained in:
ThomassJonax
2026-04-28 07:02:36 +03:00
committed by Teknium
parent 22ddac4b14
commit 2f9243c333
3 changed files with 113 additions and 17 deletions

View File

@@ -1233,3 +1233,34 @@ class TestRewriteTranscriptPreservesReasoning:
assert after[0].get("reasoning_content") == "provider scratchpad"
assert after[0].get("reasoning_details") == [{"type": "summary", "text": "step by step"}]
assert after[0].get("codex_reasoning_items") == [{"id": "r1", "type": "reasoning"}]
def test_db_rewrite_is_atomic_on_insert_failure(self, tmp_path):
from hermes_state import SessionDB
db = SessionDB(db_path=tmp_path / "test.db")
session_id = "atomic-rewrite-test"
db.create_session(session_id=session_id, source="cli")
db.append_message(session_id=session_id, role="user", content="before user")
db.append_message(session_id=session_id, role="assistant", content="before assistant")
config = GatewayConfig()
with patch("gateway.session.SessionStore._ensure_loaded"):
store = SessionStore(sessions_dir=tmp_path, config=config)
store._db = db
store._loaded = True
replacement = [
{"role": "user", "content": "after user"},
{
"role": "assistant",
"content": {"not": "sqlite-bindable but JSONL-safe"},
},
]
store.rewrite_transcript(session_id, replacement)
after = db.get_messages_as_conversation(session_id)
assert [msg["content"] for msg in after] == [
"before user",
"before assistant",
]