from __future__ import annotations import json import threading from pathlib import Path from typing import Any class SessionStore: def __init__(self, base_dir: Path) -> None: self.base_dir = base_dir self.base_dir.mkdir(parents=True, exist_ok=True) self._lock = threading.Lock() def _path(self, session_id: str) -> Path: return self.base_dir / f"{session_id}.json" def load(self, session_id: str) -> dict[str, Any]: path = self._path(session_id) if not path.exists(): return {"session_id": session_id, "messages": []} return json.loads(path.read_text(encoding="utf-8")) def save(self, session_id: str, payload: dict[str, Any]) -> None: with self._lock: self._path(session_id).write_text( json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8", ) def append_message(self, session_id: str, message: dict[str, Any]) -> dict[str, Any]: with self._lock: payload = self.load(session_id) payload.setdefault("messages", []).append(message) self.save(session_id, payload) return payload def clear(self, session_id: str) -> None: with self._lock: path = self._path(session_id) if path.exists(): path.unlink()