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'));
"#;