Add `source` column to sessions and messages ('claude' | 'codex').
Discover and parse Codex JSONL files from ~/.codex/sessions/, mapping
Codex thread/item structures to the same schema (messages, tool_calls,
tool_results, subagents). Move DB to ~/.obelisk/ with legacy migration.
Add rebuild-to-temp-then-swap for safe full rebuilds. On the app side:
source filter toggle, collapsible untitled session fold, configurable
codexDir in Settings, and a dev script. Update SKILL.md and query
helpers to expose source fields and accept source filter opt.
89 lines
4.8 KiB
SQL
89 lines
4.8 KiB
SQL
CREATE TABLE IF NOT EXISTS sessions (
|
|
id TEXT PRIMARY KEY, title TEXT, project TEXT, project_path TEXT,
|
|
started_at TEXT, ended_at TEXT, git_branch TEXT, version TEXT,
|
|
message_count INTEGER DEFAULT 0, jsonl_path TEXT, source TEXT DEFAULT 'claude');
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
uuid TEXT PRIMARY KEY, session_id TEXT, type TEXT, parent_uuid TEXT,
|
|
timestamp TEXT, role TEXT, text TEXT, content_type TEXT,
|
|
is_meta INTEGER DEFAULT 0, model TEXT,
|
|
is_sidechain INTEGER DEFAULT 0, agent_id TEXT,
|
|
input_tokens INTEGER, output_tokens INTEGER,
|
|
cwd TEXT, skill TEXT, turn_duration_ms INTEGER,
|
|
source TEXT DEFAULT 'claude');
|
|
CREATE TABLE IF NOT EXISTS tool_calls (
|
|
id TEXT PRIMARY KEY, message_uuid TEXT, session_id TEXT,
|
|
name TEXT, input_json TEXT, file_path TEXT);
|
|
CREATE TABLE IF NOT EXISTS tool_results (
|
|
tool_use_id TEXT PRIMARY KEY, message_uuid TEXT, session_id TEXT,
|
|
content TEXT, file_path TEXT, is_error INTEGER DEFAULT 0);
|
|
CREATE TABLE IF NOT EXISTS subagents (
|
|
agent_id TEXT PRIMARY KEY, session_id TEXT, parent_tool_use_id TEXT,
|
|
agent_type TEXT, description TEXT, duration_ms INTEGER, total_tokens INTEGER);
|
|
CREATE TABLE IF NOT EXISTS workflows (
|
|
run_id TEXT PRIMARY KEY, session_id TEXT, task_id TEXT,
|
|
script TEXT, result_json TEXT, timestamp TEXT, agent_count INTEGER DEFAULT 0,
|
|
duration_ms INTEGER, total_tokens INTEGER, status TEXT, workflow_name TEXT);
|
|
CREATE TABLE IF NOT EXISTS workflow_agents (
|
|
agent_id TEXT PRIMARY KEY, run_id TEXT, session_id TEXT,
|
|
agent_type TEXT, description TEXT,
|
|
phase TEXT, label TEXT, model TEXT, state TEXT,
|
|
duration_ms INTEGER, tokens INTEGER, tool_calls INTEGER);
|
|
CREATE TABLE IF NOT EXISTS index_state (
|
|
jsonl_path TEXT PRIMARY KEY, mtime REAL, lines_processed INTEGER);
|
|
CREATE TABLE IF NOT EXISTS summaries (
|
|
id TEXT PRIMARY KEY, session_id TEXT, timestamp TEXT,
|
|
source TEXT, content TEXT);
|
|
CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
|
|
uuid UNINDEXED, session_id UNINDEXED, text, content=messages, content_rowid=rowid);
|
|
CREATE TRIGGER IF NOT EXISTS messages_fts_ai AFTER INSERT ON messages BEGIN
|
|
INSERT INTO messages_fts(rowid, uuid, session_id, text)
|
|
VALUES (new.rowid, new.uuid, new.session_id, new.text);
|
|
END;
|
|
CREATE TRIGGER IF NOT EXISTS messages_fts_ad AFTER DELETE ON messages BEGIN
|
|
INSERT INTO messages_fts(messages_fts, rowid, uuid, session_id, text)
|
|
VALUES ('delete', old.rowid, old.uuid, old.session_id, old.text);
|
|
END;
|
|
CREATE TRIGGER IF NOT EXISTS messages_fts_au AFTER UPDATE ON messages BEGIN
|
|
INSERT INTO messages_fts(messages_fts, rowid, uuid, session_id, text)
|
|
VALUES ('delete', old.rowid, old.uuid, old.session_id, old.text);
|
|
INSERT INTO messages_fts(rowid, uuid, session_id, text)
|
|
VALUES (new.rowid, new.uuid, new.session_id, new.text);
|
|
END;
|
|
CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);
|
|
CREATE INDEX IF NOT EXISTS idx_messages_agent ON messages(agent_id);
|
|
CREATE INDEX IF NOT EXISTS idx_messages_ts ON messages(session_id, timestamp);
|
|
CREATE INDEX IF NOT EXISTS idx_sessions_source ON sessions(source);
|
|
CREATE INDEX IF NOT EXISTS idx_messages_source ON messages(source);
|
|
CREATE INDEX IF NOT EXISTS idx_tc_session_name ON tool_calls(session_id, name);
|
|
CREATE INDEX IF NOT EXISTS idx_tc_file ON tool_calls(file_path);
|
|
CREATE INDEX IF NOT EXISTS idx_sa_session ON subagents(session_id);
|
|
CREATE INDEX IF NOT EXISTS idx_wf_session ON workflows(session_id);
|
|
CREATE INDEX IF NOT EXISTS idx_wa_run ON workflow_agents(run_id);
|
|
CREATE INDEX IF NOT EXISTS idx_summaries_session ON summaries(session_id);
|
|
CREATE TABLE IF NOT EXISTS memories (
|
|
id TEXT PRIMARY KEY, session_id TEXT, project TEXT,
|
|
message_start TEXT, message_end TEXT,
|
|
path TEXT, anchors TEXT, summary TEXT, created_at TEXT,
|
|
deleted_at TEXT, deleted_reason TEXT);
|
|
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
id UNINDEXED, path, summary,
|
|
content=memories, content_rowid=rowid,
|
|
tokenize='unicode61 remove_diacritics 1');
|
|
CREATE TRIGGER IF NOT EXISTS memories_fts_ai AFTER INSERT ON memories BEGIN
|
|
INSERT INTO memories_fts(rowid, id, path, summary)
|
|
VALUES (new.rowid, new.id, new.path, new.summary);
|
|
END;
|
|
CREATE TRIGGER IF NOT EXISTS memories_fts_ad AFTER DELETE ON memories BEGIN
|
|
INSERT INTO memories_fts(memories_fts, rowid, id, path, summary)
|
|
VALUES ('delete', old.rowid, old.id, old.path, old.summary);
|
|
END;
|
|
CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
|
|
INSERT INTO memories_fts(memories_fts, rowid, id, path, summary)
|
|
VALUES ('delete', old.rowid, old.id, old.path, old.summary);
|
|
INSERT INTO memories_fts(rowid, id, path, summary)
|
|
VALUES (new.rowid, new.id, new.path, new.summary);
|
|
END;
|
|
CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project);
|
|
CREATE INDEX IF NOT EXISTS idx_memories_session ON memories(session_id);
|
|
CREATE INDEX IF NOT EXISTS idx_memories_created ON memories(created_at);
|