minni 0.1.0

Local memory, task, and codebase indexing tool for AI agents
Documentation
pub const SCHEMA: &str = r#"
-- Code chunks table: stores parsed code segments
CREATE TABLE IF NOT EXISTS chunks (
    id TEXT PRIMARY KEY,
    file_path TEXT NOT NULL,
    content TEXT NOT NULL,
    start_line INTEGER NOT NULL,
    end_line INTEGER NOT NULL,
    chunk_type TEXT NOT NULL,  -- 'function', 'class', 'method', 'block', 'file'
    language TEXT NOT NULL,
    symbol_name TEXT,          -- function/class/method name if applicable
    content_hash TEXT NOT NULL,
    indexed_at TEXT NOT NULL,
    parent_symbol TEXT,        -- enclosing class/struct/impl/module name
    signature TEXT,            -- function/method signature line (no body)
    doc_comment TEXT,          -- leading doc comment / docstring
    module_path TEXT           -- derived from file path (e.g. search.bm25)
);

CREATE INDEX IF NOT EXISTS idx_chunks_file_path ON chunks(file_path);
CREATE INDEX IF NOT EXISTS idx_chunks_symbol_name ON chunks(symbol_name);
CREATE INDEX IF NOT EXISTS idx_chunks_language ON chunks(language);
CREATE INDEX IF NOT EXISTS idx_chunks_type ON chunks(chunk_type);

-- Dense embeddings for semantic retrieval
CREATE TABLE IF NOT EXISTS embeddings (
    chunk_id TEXT PRIMARY KEY,
    vector BLOB NOT NULL,
    indexed_at TEXT NOT NULL,
    FOREIGN KEY (chunk_id) REFERENCES chunks(id) ON DELETE CASCADE
);

-- File hashes for incremental indexing
CREATE TABLE IF NOT EXISTS file_hashes (
    file_path TEXT PRIMARY KEY,
    content_hash TEXT NOT NULL,
    indexed_at TEXT NOT NULL
);

-- Session contexts for resumable work
CREATE TABLE IF NOT EXISTS contexts (
    id TEXT PRIMARY KEY,
    name TEXT NOT NULL UNIQUE,
    description TEXT,
    created_at TEXT NOT NULL,
    updated_at TEXT NOT NULL,
    project_path TEXT NOT NULL
);

CREATE INDEX IF NOT EXISTS idx_contexts_name ON contexts(name);
CREATE INDEX IF NOT EXISTS idx_contexts_updated ON contexts(updated_at);

-- Context items: key-value pairs associated with a context
CREATE TABLE IF NOT EXISTS context_items (
    id TEXT PRIMARY KEY,
    context_id TEXT NOT NULL,
    key TEXT NOT NULL,
    value TEXT NOT NULL,
    item_type TEXT NOT NULL,  -- 'note', 'file_ref', 'task', 'decision', 'finding'
    created_at TEXT NOT NULL,
    FOREIGN KEY (context_id) REFERENCES contexts(id) ON DELETE CASCADE
);

CREATE INDEX IF NOT EXISTS idx_context_items_context ON context_items(context_id);
CREATE INDEX IF NOT EXISTS idx_context_items_key ON context_items(key);

-- Symbol edges: import/dependency relationships between files
CREATE TABLE IF NOT EXISTS symbol_edges (
    id TEXT PRIMARY KEY,
    source_file TEXT NOT NULL,
    target_symbol TEXT NOT NULL,
    edge_type TEXT NOT NULL DEFAULT 'imports',
    target_file TEXT,
    indexed_at TEXT NOT NULL
);

CREATE INDEX IF NOT EXISTS idx_edges_source_file ON symbol_edges(source_file);
CREATE INDEX IF NOT EXISTS idx_edges_target_symbol ON symbol_edges(target_symbol);
CREATE INDEX IF NOT EXISTS idx_edges_edge_type ON symbol_edges(edge_type);

-- Metadata table for minni configuration
CREATE TABLE IF NOT EXISTS metadata (
    key TEXT PRIMARY KEY,
    value TEXT NOT NULL
);

CREATE TABLE IF NOT EXISTS tasks (
    id          TEXT PRIMARY KEY,
    context_id  TEXT NOT NULL,
    seq         INTEGER NOT NULL,
    title       TEXT NOT NULL,
    description TEXT,
    status      TEXT NOT NULL DEFAULT 'pending',
    priority    TEXT NOT NULL DEFAULT 'medium',
    created_at  TEXT NOT NULL,
    updated_at  TEXT NOT NULL,
    FOREIGN KEY (context_id) REFERENCES contexts(id) ON DELETE CASCADE,
    UNIQUE (context_id, seq)
);

CREATE INDEX IF NOT EXISTS idx_tasks_context ON tasks(context_id);
CREATE INDEX IF NOT EXISTS idx_tasks_status  ON tasks(status);

CREATE TABLE IF NOT EXISTS task_todos (
    id          TEXT PRIMARY KEY,
    task_id     TEXT NOT NULL,
    seq         INTEGER NOT NULL,
    text        TEXT NOT NULL,
    done        INTEGER NOT NULL DEFAULT 0,
    created_at  TEXT NOT NULL,
    FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
    UNIQUE (task_id, seq)
);

CREATE INDEX IF NOT EXISTS idx_task_todos_task ON task_todos(task_id);

-- Insert schema version
INSERT OR IGNORE INTO metadata (key, value) VALUES ('schema_version', '5');
INSERT OR IGNORE INTO metadata (key, value) VALUES ('created_at', datetime('now'));
"#;