问题背景
使用 opencode 时,退出后会提示一句:
1 2 3 4 5 6 7
| █▀▀█ █▀▀█ █▀▀█ █▀▀▄ █▀▀▀ █▀▀█ █▀▀█ █▀▀█ █ █ █ █ █▀▀▀ █ █ █ █ █ █ █ █▀▀▀ ▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀
Session New session - 2026-05-08T09:32:17.883Z Continue opencode -s ses_xxxxxxxxxxxxxxxxxxxx
|
但如果终端窗口关得太快,或忘记复制,这个会话 ID 就丢了,导致无法恢复之前的会话。
opencode 会话机制
| 命令 |
作用 |
opencode -s <sessionID> |
恢复指定会话 |
opencode --continue |
恢复最近一次会话 |
opencode session list |
列出所有历史会话 |
opencode session delete <sessionID> |
删除会话 |
会话数据存储在 SQLite 数据库中:
1
| ~/.local/share/opencode/opencode.db
|
核心表结构(session 表):
| 字段 |
说明 |
id |
会话 ID,格式 ses_xxx |
title |
会话标题 |
directory |
项目目录 |
project_id |
关联的项目 ID |
time_created |
创建时间戳(毫秒) |
time_updated |
最后更新时间戳(毫秒) |
解决方案:opencode_list 会话选择器
核心思路:提供一个独立的 opencode_list 命令,不覆盖原生命令,opencode 行为完全不受影响。
交互设计
opencode_list → 弹出会话列表,分页浏览(每页 10 条)
- 每条记录显示:项目名、会话标题、首条用户输入、倒二条用户输入、末条用户输入
- 最新会话显示在最底部,1 号位离输入框最近
- 输入序号 → 恢复该会话
- 直接回车 → 开新会话
n → 下一页,p → 上一页
q → 退出
分页取数说明
分页取数:每次只查一页(默认10条),避免一次查太多。每条记录含3个关联子查询(首条/倒二/末条用户消息),查10条 = 30次子查询,查30条 = 90次子查询。
技术要点
SQLite 查询
查询关联 session、project、message、part 四张表,取每条会话的摘要预览:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| SELECT s.id, COALESCE(p.name, s.directory, '?'), COALESCE(s.title, ''), (SELECT json_extract(pt.data, '$.text') FROM message m2 JOIN part pt ON pt.message_id = m2.id WHERE m2.session_id = s.id AND json_extract(m2.data, '$.role') = 'user' AND json_extract(pt.data, '$.type') = 'text' ORDER BY m2.time_created ASC LIMIT 1), (SELECT json_extract(pt.data, '$.text') FROM message m2 JOIN part pt ON pt.message_id = m2.id WHERE m2.session_id = s.id AND json_extract(m2.data, '$.role') = 'user' AND json_extract(pt.data, '$.type') = 'text' ORDER BY m2.time_created DESC LIMIT 1 OFFSET 1), (SELECT json_extract(pt.data, '$.text') FROM message m2 JOIN part pt ON pt.message_id = m2.id WHERE m2.session_id = s.id AND json_extract(m2.data, '$.role') = 'user' AND json_extract(pt.data, '$.type') = 'text' ORDER BY m2.time_created DESC LIMIT 1) FROM session s LEFT JOIN project p ON s.project_id = p.id ORDER BY s.time_updated DESC LIMIT 10 OFFSET 0;
|
对应的 Skill
完整的安装脚本和配置步骤已封装为可复用的 Skill:
AI-qskills 中的 opencode-sessions-manager
在新机器上只需加载该 Skill,AI 会自动完成脚本创建、.zshrc 配置等步骤,无需手动操作。
End