Skip to content

[Bug] 导入时 OpenCode v1.x 会话无法识别 - 不支持新的 SQLite 存储格式 #682

Closed

Description

@kfumi

What happened? / 问题描述

OpenCode 会话导入功能无法检测到 OpenCode v1.x 版本的会话。导入器扫描的是旧版 JSON 文件存储格式,但 OpenCode v1.x 已经迁移到 SQLite 数据库存储。

Steps to reproduce / 复现步骤

  1. 安装 OpenCode v1.x(例如 v1.18.26)
  2. 在 OpenCode 中创建一些对话
  3. 打开 PI-Desktop → 设置 → 导入 → 选择 "OpenCode"
  4. 无法检测到任何会话

Expected behavior / 预期行为

PI-Desktop 应该能够检测并导入 OpenCode v1.x SQLite 数据库中的会话。

Actual behavior / 实际行为

  • 导入器扫描路径:~/.local/share/opencode/storage/session/(JSON 文件)
  • OpenCode v1.x 存储路径:~/.local/share/opencode/opencode.db(SQLite 数据库)
  • v1.x 中 storage/session/ 目录不存在
  • 结果:检测到 0 个会话

App version / 应用版本

v0.15.1

Operating system / 操作系统

Windows

Extra environment / 其他环境信息

No response

Logs / 日志

Screenshots / 截图

No response

Activity

  1. muzimu217 commented on Sep 20, 2026

    @muzimu217
    Contributor

    在本机做了完整复现与格式测绘,结论与报告一致:OpenCode v1.x 已把会话存储从 storage/session/*.json 迁移到单文件 SQLite,导入器扫旧路径所以检测到 0 个会话。以下是复现证据与新格式测绘,供修复直接取用。

    复现(本机 OpenCode v1.2.10,macOS)

    • ~/.local/share/opencode/opencode.db 存在(本机 224 MB,WAL 模式);storage/session/ 目录为空
    • 本机真实数据规模:629 个会话 / 9,863 条消息 / 37,115 个 part

    v1.x 存储测绘(drizzle 风格三表 + JSON 负载列)

    session:id(ses_*)、title、directory(工作区路径)、time_created/time_updated(毫秒时间戳)、version、parent_id(子代理会话有父 id)、time_compacting/time_archived。

    message:id/session_id/time_* + data(JSON):

    {"role":"user","time":{"created":1771564410206},"model":{"providerID":"opencode","modelID":"..."},"agent":"build"}
    {"role":"assistant","time":{"created":...,"completed":...},"modelID":"...","providerID":"...","mode":"build",
     "tokens":{"total":11468,"input":78,"output":86,"reasoning":0,"cache":{"read":510,"write":10794}},"cost":0,"finish":"stop"}

    part:id/message_id/session_id + data(JSON),本机类型分布:tool 9673 / step-start 8133 / step-finish 8046 / reasoning 7411 / text 3813 / file 21 / compaction 17。text 部件为 {"type":"text","text":"..."};tool 部件含 callID/tool/state.status/state.input/state.output/起止时间。

    修复建议

    1. 探测顺序:存在 opencode.db 即优先走 SQLite 导入;否则回落旧 storage/session/ JSONL——旧版本用户不受影响,两条路径并存。
    2. 映射:session 行 → 会话(title/directory/created);按 message.time_created 排序,role 直接对应;正文从其 part 取 type=text,工具调用取 type=tool;step-* 可跳过,compaction 建议视为压缩边界(导入为分隔标记或截断)。
    3. 两个注意点:所有时间戳是毫秒(旧 JSONL 是秒级字符串,注意别混);assistant 的 tokens 字段比旧格式更完整(含 reasoning/cache),导入时可以带上。

    导入器是插件 io.github.muzimu217.session-import(我们维护)——我们会在插件侧按上面方案跟进修复,以插件更新形式发布;主仓不需要改动。

  2. muzimu217 commented on Sep 20, 2026

    @muzimu217
    Contributor

    跟进修复:插件侧 0.4.9 已就绪 → vastsa/pi-desktop-plugins#56。

    一个根因更正:上架的 0.4.8 其实已经支持 OpenCode v1.x 的 SQLite 格式(0.4.7 起),楼主检测不到的原因在路径——OpenCode 的 Windows 应用把数据放在 %LOCALAPPDATA%\opencode\data(OpenCode 官方 tracker 确认的位置),而插件此前只探测 ~/.local/share/opencode,所以在 Windows 上永远找不到库。0.4.9 改为按序探测三处(%LOCALAPPDATA%\opencode\data → XDG_DATA_HOME → ~/.local/share),macOS/Linux 行为不变。

    已用真实数据验证(本机 224 MB / 629 个会话的 v1.x 库):scan 全部发现,单会话还原(200 条消息含 104 条工具调用)58 ms,模型与时间戳正确。

    等这个 PR 合并、插件更新上架后,在插件页升级到 0.4.9 再扫描即可。如果你装的是 0.4.7 之前的旧版本,升级本身也会解决(SQLite 支持是 0.4.7 引入的)。

  3. muzimu217 commented on Sep 20, 2026

    @muzimu217
    Contributor

    更新:修复已发布——插件中心(应用内插件市场默认源)现已上架 session-import 0.4.9,直接在市场搜索 "session import" 安装/更新后再扫描即可;OpenCode v1.x 的 Windows 数据路径(%LOCALAPPDATA%\opencode\data)已按序探测。源码同步进官方插件仓 main(#56),后续开发迁至独立仓库 muzimu217/pi-desktop-session-import。

  4. vastsa commented on Sep 21, 2026

    @vastsa
    Owner

    复核确认问题已在上游插件修复,不需要 PI-Desktop 主仓改动。插件中心已发布 session-import 0.4.9:Windows 按 %LOCALAPPDATA%\opencode\data → XDG_DATA_HOME → ~/.local/share 探测 OpenCode v1.x 数据库。请在插件页升级到 0.4.9 后重新扫描。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions