AI-③opencode会话管理

问题背景

使用 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