MCPcopy Create free account
hub / github.com/OpenRaiser/NanoResearch / MemoryStore

Class MemoryStore

nanoresearch/evolution/memory.py:255–839  ·  view source on GitHub ↗

Persistent long-term memory store under ``~/.nanoresearch/memory``.

Source from the content-addressed store, hash-verified

253
254
255class MemoryStore:
256 """Persistent long-term memory store under ``~/.nanoresearch/memory``."""
257
258 def __init__(
259 self,
260 root: Path | None = None,
261 *,
262 enabled: bool = True,
263 top_k: int = 5,
264 decay_factor: float = 0.08,
265 ) -> None:
266 self.enabled = enabled
267 self.top_k = max(1, top_k)
268 self.decay_factor = max(0.0, decay_factor)
269 self.root = root or (Path.home() / ".nanoresearch" / "memory")
270 self.file = self.root / "records.json"
271 self.research_file = self.root / "research_records.json"
272 if self.enabled:
273 self.root.mkdir(parents=True, exist_ok=True)
274
275 @staticmethod
276 def _clamp(value: float, lower: float, upper: float) -> float:
277 return min(max(value, lower), upper)
278
279 def _load_records(self) -> list[MemoryRecord]:
280 if not self.enabled or not self.file.is_file():
281 return []
282 try:
283 raw = json.loads(self.file.read_text(encoding="utf-8"))
284 except (OSError, json.JSONDecodeError) as exc:
285 logger.warning("Failed to load memory store %s: %s", self.file, exc)
286 return []
287 records: list[MemoryRecord] = []
288 for item in raw if isinstance(raw, list) else []:
289 try:
290 records.append(MemoryRecord.model_validate(item))
291 except Exception as exc:
292 logger.debug("Skipping malformed memory record: %s", exc)
293 return records
294
295 def _save_records(self, records: list[MemoryRecord]) -> None:
296 if not self.enabled:
297 return
298 self.root.mkdir(parents=True, exist_ok=True)
299 payload = [record.model_dump(mode="json") for record in records]
300 self.file.write_text(json.dumps(payload, indent=2, ensure_ascii=False), encoding="utf-8")
301
302 def _load_research_records(self) -> list[ResearchMemoryRecord]:
303 if not self.enabled or not self.research_file.is_file():
304 return []
305 try:
306 raw = json.loads(self.research_file.read_text(encoding="utf-8"))
307 except (OSError, json.JSONDecodeError) as exc:
308 logger.warning("Failed to load research memory store %s: %s", self.research_file, exc)
309 return []
310 records: list[ResearchMemoryRecord] = []
311 for item in raw if isinstance(raw, list) else []:
312 try:

Calls

no outgoing calls