- 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 🦊💕
57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
"""
|
|
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())
|