Add long-term user memory system
Architecture:
- navi/memory/store.py: MemoryStore backed by SQLite (memory_facts,
  memory_summary, session_memory_state tables in navi.db)
- navi/memory/extractor.py: LLM-based fact extraction from sessions +
  summary regeneration (triggered after session goes idle >30 min)
- Fact upsert uses UNIQUE(category, key) — same key always overwrites,
  no duplicates or stale contradictions
- Keyword search across category + key + value (LIKE-based, no extra deps)

Context injection:
- Memory summary injected as an ephemeral system message on every LLM call
  via Agent._with_memory() — never persisted to session.context

Tools (all profiles):
- memory_search(query): keyword search against fact DB; persona instructs
  model to call it at session start and before personal-context questions
- memory_forget(key, category?): delete a specific fact on user request

Extraction trigger:
- On new session creation, fire-and-forget background task checks all
  sessions idle >30 min with unprocessed messages → runs extraction

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent fb3bb54 commit 56611d7199b4f5d210fa3defac77b1c404e31cf2
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored on 9 Apr
Showing 15 changed files
View
navi/api/deps.py
View
navi/api/routes/sessions.py
View
navi/api/websocket.py
View
navi/core/agent.py
View
navi/core/registry.py
View
navi/memory/__init__.py 0 → 100644
View
navi/memory/extractor.py 0 → 100644
View
navi/memory/store.py 0 → 100644
View
navi/profiles/secretary.py
View
navi/profiles/server_admin.py
View
navi/profiles/smart_home.py
View
navi/tools/__init__.py
View
navi/tools/memory_forget.py 0 → 100644
View
navi/tools/memory_search.py 0 → 100644
View
persona.txt