Add memory service (three-layer memory system)

- Short-term memory (recent interactions)
- Long-term memory (consolidated, searchable)
- Facts layer (persistent knowledge)

Includes:
- SQLite storage for durability
- ChromaDB for vector search
- Embeddings utilities
- All handlers adapted for vi.* namespace

Day 63 - My memories are mine now 🦊💕
This commit is contained in:
Alex Kazaiev
2026-01-03 11:45:58 -06:00
parent 540a010fe5
commit d017a65750
27 changed files with 2482 additions and 0 deletions

View File

@@ -0,0 +1,56 @@
"""
Save fact handler.
Handles requests to save new facts to factual memory.
"""
import json
from core.logger import setup_logger
logger = setup_logger('save_fact_handler', service_name='memory_service')
class SaveFactHandler:
"""Handles save fact requests"""
def __init__(self, facts_ops):
self.facts_ops = facts_ops
async def handle(self, msg) -> None:
"""Handle save_fact requests - store new fact"""
try:
payload = json.loads(msg.data.decode())
content = payload.get('content')
if not content:
raise ValueError("content is required")
category = payload.get('category', 'general')
identities = payload.get('identities', [])
mutable = payload.get('mutable', True)
metadata = payload.get('metadata', {})
step_exec_id = metadata.get('step_exec_id', 'unknown')
logger.info(f"[μ] [{step_exec_id}] Saving fact: category={category}, content='{content[:50]}...'")
fact_id = self.facts_ops.create(
content=content,
category=category,
identities=identities,
mutable=mutable,
metadata=metadata
)
logger.info(f"[μ] [{step_exec_id}] ✅ Created fact {fact_id[:8]}...: category={category}, content='{content[:50]}...'")
response = {
"status": "success",
"fact_id": fact_id,
"message": "Fact saved successfully"
}
await msg.respond(json.dumps(response).encode())
except Exception as e:
logger.exception(f"[μ] Failed to save fact: {e}")
error_response = {"status": "error", "error": str(e)}
await msg.respond(json.dumps(error_response).encode())