Files
vi/services/memory/storage/sqlite_store.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

98 lines
2.8 KiB
Python

"""
SQLite storage backend for short-term memory.
Provides initialization and connection management for SQLite database.
"""
import sqlite3
from pathlib import Path
from core.config import SHORT_TERM_DB
from core.logger import setup_logger
logger = setup_logger('sqlite_store', service_name='memory_service')
class SQLiteStore:
"""SQLite storage backend for short-term memory"""
def __init__(self, db_path: str = None):
"""
Initialize SQLite store.
Args:
db_path: Path to SQLite database file (defaults to SHORT_TERM_DB config)
"""
self.db_path = db_path or str(SHORT_TERM_DB)
self.conn = None
def connect(self) -> sqlite3.Connection:
"""
Connect to SQLite database and initialize schema.
Returns:
SQLite connection object
"""
self.conn = sqlite3.connect(self.db_path)
self._init_schema()
logger.info(f"[μ] SQLite connected: {self.db_path}")
return self.conn
def _init_schema(self):
"""Initialize simplified short-term SQLite database schema"""
cursor = self.conn.cursor()
# Simplified short-term memory table (no embeddings, fast queries)
cursor.execute("""
CREATE TABLE IF NOT EXISTS short_term_memory (
id TEXT PRIMARY KEY,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
content TEXT NOT NULL,
identities TEXT,
interaction_id TEXT,
modality TEXT DEFAULT 'dialogue',
metadata TEXT
)
""")
# Index for fast chronological queries
cursor.execute("""
CREATE INDEX IF NOT EXISTS idx_timestamp
ON short_term_memory(timestamp DESC)
""")
# Identities table (still useful for all layers)
cursor.execute("""
CREATE TABLE IF NOT EXISTS identities (
id TEXT PRIMARY KEY,
display_name TEXT,
role TEXT,
intimacy REAL DEFAULT 0.0,
last_seen DATETIME,
last_spoken DATETIME,
metadata TEXT
)
""")
self.conn.commit()
logger.info("[μ] SQLite schema initialized")
def get_connection(self) -> sqlite3.Connection:
"""
Get the active database connection.
Returns:
SQLite connection object
Raises:
RuntimeError: If connection has not been established
"""
if self.conn is None:
raise RuntimeError("SQLite connection not established. Call connect() first.")
return self.conn
def close(self):
"""Close the database connection"""
if self.conn:
self.conn.close()
self.conn = None
logger.info("[μ] SQLite connection closed")