Files
vi/services/memory/handlers/store_handler.py
Alex Kazaiev d017a65750 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 🦊💕
2026-01-03 11:45:58 -06:00

91 lines
2.8 KiB
Python

"""
Memory store handler.
Handles requests to store new memories in short-term memory.
"""
import json
from uuid import uuid4
from datetime import datetime
from typing import Dict, Any
from core.logger import setup_logger
logger = setup_logger('store_handler', service_name='memory_service')
class StoreHandler:
"""Handles memory store requests"""
def __init__(self, sqlite_store):
"""
Initialize store handler.
Args:
sqlite_store: SQLiteStore instance
"""
self.sqlite_store = sqlite_store
async def handle(self, msg) -> None:
"""
Handle vi.memory.store requests - routes to short-term memory.
Args:
msg: NATS message with request payload
"""
try:
# Parse request payload
payload = json.loads(msg.data.decode())
# Extract required fields
content = payload.get('content')
if not content:
logger.warning("[μ] Memory store request missing content")
error_response = {
"status": "error",
"error": "Missing required field: content"
}
await msg.respond(json.dumps(error_response).encode())
return
# Extract optional fields
identities = payload.get('identities', [])
interaction_id = payload.get('interaction_id')
modality = payload.get('modality', 'dialogue')
metadata = payload.get('metadata', {})
# Store in simplified short-term memory table
memory_id = str(uuid4())
timestamp = datetime.utcnow().isoformat()
conn = self.sqlite_store.get_connection()
cursor = conn.cursor()
cursor.execute("""
INSERT INTO short_term_memory (id, timestamp, content, identities, interaction_id, modality, metadata)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (
memory_id,
timestamp,
content,
json.dumps(identities) if identities else None,
interaction_id,
modality,
json.dumps(metadata) if metadata else None
))
conn.commit()
logger.info(f"[μ] Stored short-term memory: '{content[:60]}...' identities={identities}")
# Send response using NATS request-reply
response = {
"memory_id": memory_id,
"status": "stored"
}
await msg.respond(json.dumps(response).encode())
except Exception as e:
logger.exception(f"[μ] Failed to store memory: {e}")
error_response = {
"status": "error",
"error": str(e)
}
await msg.respond(json.dumps(error_response).encode())