前言¶
在 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。