--- name: opencode-memory description: > Browse local OpenCode history: sessions, messages, plans, prompt history, and prior decisions. Use when the user says history, previous session, last time, remember, recall, plans, prior work, or when resuming/debugging repeated work where earlier OpenCode context may help. Do not use for fresh tasks or when current files/git already answer the question. license: Apache-2.0 compatibility: opencode --- # OpenCode Memory Browser Read-only lookup for local OpenCode history. Use it only when prior sessions, plans, or decisions would help. Do not inject history by default. ## Use When - User asks for history, previous sessions, last time, plans, recall, or memory. - Resuming a project where prior OpenCode context may matter. - Debugging a repeat issue that may have appeared earlier. Do not use when repo files/git already answer the question or the task is new. ## Rules - Read-only. Never modify OpenCode DB/files. - Use `sqlite3` with read-only URI. Do not read the DB with file-read tools. - Keep results small with `LIMIT` and targeted `LIKE`. - Summarize relevant findings; do not dump raw history. - Avoid auth/provider tables: `account`, `credential`, `control_account`, `account_state`. ## Setup Run this first in bash: ```bash DATA_ROOT="${XDG_DATA_HOME:-$HOME/.local/share}/opencode" STATE_ROOT="${XDG_STATE_HOME:-$HOME/.local/state}/opencode" DB="$(opencode db path 2>/dev/null || true)" [ -n "$DB" ] || DB="${OPENCODE_DB:-$DATA_ROOT/opencode.db}" case "$DB" in :memory:|/*) ;; *) DB="$DATA_ROOT/$DB" ;; esac if [ ! -f "$DB" ]; then for candidate in "$DATA_ROOT"/opencode*.db; do [ -f "$candidate" ] && DB="$candidate" && break done fi DB_URI="file:${DB}?mode=ro" ``` Useful files: - Plans: `$DATA_ROOT/plans/*.md` - Prompt history: `$STATE_ROOT/prompt-history.jsonl` - Session diffs: `$DATA_ROOT/storage/session_diff/.json` ## Queries ### Summary ```bash sqlite3 "$DB_URI" " SELECT 'projects', COUNT(*) FROM project UNION ALL SELECT 'main sessions', COUNT(*) FROM session WHERE parent_id IS NULL UNION ALL SELECT 'messages', COUNT(*) FROM message UNION ALL SELECT 'parts', COUNT(*) FROM part UNION ALL SELECT 'todos', COUNT(*) FROM todo; " ``` ### Recent sessions ```bash sqlite3 "$DB_URI" " SELECT s.id, COALESCE(s.title, 'untitled') AS title, COALESCE(p.name, p.worktree, '') AS project, datetime(s.time_updated/1000, 'unixepoch', 'localtime') AS updated, (SELECT COUNT(*) FROM message m WHERE m.session_id = s.id) AS messages FROM session s LEFT JOIN project p ON p.id = s.project_id WHERE s.parent_id IS NULL ORDER BY s.time_updated DESC LIMIT 10; " ``` ### Search text Replace `SEARCH_TERM` first. ```bash sqlite3 "$DB_URI" " SELECT s.id, COALESCE(s.title, 'untitled') AS title, json_extract(m.data, '$.role') AS role, datetime(m.time_created/1000, 'unixepoch', 'localtime') AS time, substr(json_extract(p.data, '$.text'), 1, 200) AS snippet FROM part p JOIN message m ON m.id = p.message_id JOIN session s ON s.id = m.session_id WHERE s.parent_id IS NULL AND json_extract(p.data, '$.type') = 'text' AND json_extract(p.data, '$.text') LIKE '%SEARCH_TERM%' ORDER BY m.time_created DESC LIMIT 10; " ``` ### Read session text Replace `SESSION_ID_HERE` first. Text parts only; use the reference for tool, patch, file, reasoning, or V2 internals. ```bash sqlite3 "$DB_URI" " SELECT json_extract(m.data, '$.role') AS role, datetime(m.time_created/1000, 'unixepoch', 'localtime') AS time, GROUP_CONCAT(json_extract(p.data, '$.text'), char(10)) AS text FROM message m LEFT JOIN part p ON p.message_id = m.id AND json_extract(p.data, '$.type') = 'text' WHERE m.session_id = 'SESSION_ID_HERE' GROUP BY m.id ORDER BY m.time_created ASC LIMIT 50; " ``` ## Plans And Prompt History ```bash ls -lt "$DATA_ROOT"/plans/*.md 2>/dev/null | head -20 tail -20 "$STATE_ROOT"/prompt-history.jsonl 2>/dev/null ``` Prompt history entries currently use `input`, `mode`, and `parts[]`; do not assume root `text`. ## Deep Reference Use [references/storage-format.md](references/storage-format.md) only when you need table details, part/tool shapes, legacy JSON paths, or debug queries.