remem-ai 0.4.4

Persistent memory for Claude Code — single binary, zero subprocesses
Documentation
use anyhow::Result;
use rusqlite::Connection;

use super::build_existing_context;

fn setup_existing_context_schema(conn: &Connection) -> Result<()> {
    conn.execute_batch(
        "CREATE TABLE sdk_sessions (
            id INTEGER PRIMARY KEY,
            content_session_id TEXT UNIQUE NOT NULL,
            memory_session_id TEXT NOT NULL,
            project TEXT,
            user_prompt TEXT,
            started_at TEXT,
            started_at_epoch INTEGER,
            status TEXT DEFAULT 'active',
            prompt_counter INTEGER DEFAULT 1
        );
        CREATE TABLE observations (
            id INTEGER PRIMARY KEY,
            memory_session_id TEXT NOT NULL,
            project TEXT,
            type TEXT NOT NULL,
            title TEXT,
            subtitle TEXT,
            narrative TEXT,
            facts TEXT,
            concepts TEXT,
            files_read TEXT,
            files_modified TEXT,
            discovery_tokens INTEGER DEFAULT 0,
            created_at TEXT,
            created_at_epoch INTEGER,
            status TEXT DEFAULT 'active',
            last_accessed_epoch INTEGER,
            branch TEXT,
            commit_sha TEXT
        );
        CREATE TABLE memories (
            id INTEGER PRIMARY KEY,
            session_id TEXT,
            project TEXT NOT NULL,
            topic_key TEXT,
            title TEXT NOT NULL,
            content TEXT NOT NULL,
            memory_type TEXT NOT NULL,
            files TEXT,
            created_at_epoch INTEGER NOT NULL,
            updated_at_epoch INTEGER NOT NULL,
            status TEXT NOT NULL DEFAULT 'active',
            branch TEXT,
            scope TEXT DEFAULT 'project'
        );",
    )?;
    Ok(())
}

#[test]
fn build_existing_context_includes_observations_and_memories() -> Result<()> {
    let conn = Connection::open_in_memory()?;
    setup_existing_context_schema(&conn)?;
    conn.execute(
        "INSERT INTO observations
         (memory_session_id, project, type, title, subtitle, created_at, created_at_epoch, status)
         VALUES ('mem-1', 'proj', 'feature', 'Observation title', 'Observation subtitle', '2026-01-01T00:00:00Z', 10, 'active')",
        [],
    )?;
    conn.execute(
        "INSERT INTO memories
         (session_id, project, title, content, memory_type, created_at_epoch, updated_at_epoch, status, scope)
         VALUES ('mem-2', 'proj', 'Memory title', 'Memory body first line
second line', 'decision', 20, 20, 'active', 'project')",
        [],
    )?;

    let xml = build_existing_context(&conn, "proj")?;
    assert!(xml.contains("source=\"observation\""));
    assert!(xml.contains("title=\"Observation title\""));
    assert!(xml.contains("Observation subtitle"));
    assert!(xml.contains("source=\"memory\""));
    assert!(xml.contains("title=\"Memory title\""));
    assert!(xml.contains("Memory body first line"));
    Ok(())
}