DSH OpenCode Session Sync:把 OpenCode 桌面会话导入 DSH 原生工作区

前言

在 DeepSeek Harness(DSH)里做智能体开发时,会话通常按工作目录归档:同一个 cwd 对应一个工作区,历史对话也在该工作区下打开和续写。若你同时在 OpenCode 桌面端用过一段时间,聊天记录会落在本机的 opencode.db 里,和 DSH 的会话存储是两套体系。手工复制粘贴既费时,也容易丢模型信息、工具调用和 token 统计。

下面介绍社区插件 dsh-opencode-session-sync(仓库 forwardzz/dsh-opencode-session-sync)。它只读 OpenCode 数据库,通过 DSH 自带的 sessionPersistence 写入,使导入结果成为 DSH 原生会话:按会话原本的工作目录归位,并支持启动后增量追加。

这是什么

dsh-opencode-session-sync 由维护者 forwardzz 发布,在 SkillHub 等社区目录中归类为「记忆」类 DSH 插件。插件描述为:把 OpenCode 桌面端(opencode.db)的历史会话按各自原本的工作目录导入为 DSH 原生会话。

需要明确两点:这是社区维护的 Harness 插件,不是 DeepSeek 官方产品;SkillHub 等目录站点与 DeepSeek / 幻方无官方从属关系,安装前请自行阅读源码与 MIT 许可证。当前 package 版本为 0.1.0,仓库星标为 0;README 记载已在 Windows + DSH 0.2.0-rc.2 上验证。

核心功能

插件行为以只读 OpenCode、只写 DSH 为边界,主要能力如下。

OpenCode 侧只读。 仅打开 opencode.db 读取,不修改该库或 OpenCode 配置。

写入走 DSH 原生路径。 通过 sessionPersistence 的 create → append → flush 落盘,格式与事件关系由 DSH 校验,插件不自行拼装日志字节。

按工作区归位。 OpenCode 会话的 session_v2.directory 映射为 DSH 的 SessionHeader.cwd;对应工作区会自动登记,目录尚无工作区时可在配置允许下自动创建。

增量与幂等。 首次导入后,OpenCode 新增回合会追加到同一 DSH 会话;DSH 会话 id 由 OpenCode 会话 id 派生,重复运行不会重复导入。源会话若被回退或改写,插件报告 diverged 而非强行追加错乱 transcript。

自动与手动并存。 DSH 启动约 4 秒后默认自动同步一次;同时注册 agent 工具 opencode_sync,支持 list、import、status。

内容保留范围。 标题、创建时间、模型与 provider、token 用量、推理块、工具调用及其输出与错误等会按 README 中的映射规则转换;部分 OpenCode 事件类型(如 system、synthetic)无等价物时会跳过并计入报告。

运行时仅依赖 Node 内置模块(含 node:sqlite),需 Node.js 22.5+。

安装与启用

插件在 DSH 启动时挂载,增删插件或改配置后需重启 DeepSeek Harness,不支持热加载。安装以 profile 内 link: 依赖 + dsh.profile.bundles 为准;若你的环境提供 dsh CLI,README 说明 dsh plugin --profile desktop add link:<绝对路径> 与手动三步等价。

macOS / Linux 示例

先把仓库克隆到本地目录(路径可自定),再建立 node_modules 软链接,并编辑 profile 的 package.json:

git clone https://github.com/forwardzz/dsh-opencode-session-sync.git ~/.dsh/plugins/dsh-opencode-session-sync
ln -s ~/.dsh/plugins/dsh-opencode-session-sync ~/.dsh/profiles/desktop/node_modules/dsh-opencode-session-sync
{
  "dependencies": {
    "dsh-opencode-session-sync": "link:/克隆目录的绝对路径"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "dsh-opencode-session-sync"
      ]
    }
  }
}

将 desktop 换成你实际使用的 profile 名;在 profile 目录执行 pnpm install 也可根据 link: 生成链接。

验证安装

在克隆目录执行只读检查(不证明插件已加载,只说明 DSH 能否找到 bundle):

node tools/verify-install.mjs

重启 DSH 后,可在输出中查找 [opencode-session-sync] 前缀的日志行。

配置要点

配置文件为 ~/.dsh/opencode-session-sync.json,首次运行会生成默认值,修改后需重启生效。

OpenCode 数据库默认路径:

  • Windows:%USERPROFILE%\.local\share\opencode\opencode.db
  • macOS / Linux:~/.local/share/opencode/opencode.db

可通过 dbPath 覆盖。常用字段包括:enabled(默认 true)、autoSyncOnStart(默认 true)、autoSyncDelayMs(默认 4000)、importLimit(默认 200)、titlePrefix(默认 "[OC] ")、includeChildren(默认 false,子会话作为独立会话导入时父子嵌套会丢失)等。完整表格见仓库 README 中文版的「配置」一节。

同步状态落在:

  • ~/.dsh/opencode-session-sync/last-run.json — 最近一次同步的逐会话报告
  • ~/.dsh/opencode-session-sync/state.json — OpenCode 会话 id 与 DSH 会话 id 的账本

典型用法

自动同步

保持默认配置即可:启动后延迟约 4 秒执行导入或追加,无需额外操作。

对话中调用 opencode_sync

action 作用
list 只读盘点 OpenCode 会话、对应工作区及待同步条数
import 执行同步;可用 dryRun 预览不写盘,或用 workspace / sessionIds 限定范围
status 查看账本与最近一次运行结果

示例说法(来自 README):「列出 OpenCode 里有、但 DSH 里还没有的会话」「先 dry-run 看一下这次会做什么」「只同步某个项目目录相关的会话」。list 的状态列与 import 行为对应:待导入、有新内容、已同步、无正文。

不启动 DSH 的自检

在克隆目录对真实 opencode.db 做盘点与结构校验(只读):

node tools/selfcheck.mjs
node tools/selfcheck.mjs --limit 5
node tools/selfcheck.mjs --db <路径>

退出码:0 通过,1 发现问题,2 环境不满足(例如本机无 OpenCode 库)。

适用场景与注意

适合谁: 同一台机器上同时使用 OpenCode 桌面与 DSH,希望把 OpenCode 历史对话迁到 DSH 工作区、并在 OpenCode 继续聊天后仍能在 DSH 里增量追平的用户。

权限与安全: 插件随当前 DSH 进程权限运行,会读取 OpenCode 数据库并在 ~/.dsh 下写入会话与同步状态。安装前应审阅 GitHub 仓库 源码,确认路径与行为符合你的安全策略。

单向与边界: 导入是单向的,不会回写 OpenCode;导入结果是文本历史回放,不会重新执行工具。默认不还原 subagent 父子嵌套;仅含旧表 message / part、无 session_message 的会话会被标记为 legacy-only 并跳过。

前置条件: DSH 需正常启动且宿主提供 tools 与 sessionPersistence;同机需存在 OpenCode 桌面及其本地库。

结尾

dsh-opencode-session-sync 解决的是「OpenCode 聊天在 SQLite,DSH 会话按工作区归档」之间的断层:只读源库、走 DSH 原生持久化,并按原工作目录归位与增量同步。目录页:SkillHub — forwardzz/dsh-opencode-session-sync;源码与完整配置、FAQ:GitHub — forwardzz/dsh-opencode-session-sync。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye