前言¶
DeepSeek Harness (DSH) 的會話數據通常以 JSONL 格式存儲在本地文件系統中。在現有的 DSH 環境中,將一個已存在的“冷”會話從當前工作區移動到另一個工作區,同時保留其 SessionId 和完整的事件歷史記錄,是一個難以直接通過標準接口完成的操作。官方安裝的 DSH rc.6 版本尚未內置會話遷移能力。dsh-session-move 插件旨在填補這一空白,提供會話遷移的底層實現。
插件定位¶
這是一個由 kirkchinese 維護的 DeepSeek Harness 功能插件包。它的核心作用是在兩個 DSH 工作區之間移動現有的冷會話,並在遷移過程中保證會話 ID 和歷史記錄的完整性。該插件的交互目標直接指向 DSH Web 側邊欄中的現有會話標題行。
核心功能¶
插件通過以下能力實現會話遷移:
- 只讀檢查:提供
ctx.sessionMove.inspect({ sessionId, targetWorkspaceId })接口,用於執行 dry-run(試運行)檢查。 - 側邊欄拖拽:在 DSH Web UI 中,用戶可以直接通過拖拽會話標題行來執行移動操作。
- RPC 調用:底層通過
workspace.moveSessionRPC 完成實際的會話變更提交。
檢查能力¶
inspect 接口不會修改數據,僅返回以下檢查信息:
* 源和目標工作區的身份標識。
* 源和目標 JSONL 文件的存儲路徑。
* 源和目標文件的不可變頭部信息。
* 持久化修訂版本號。
* 物理行數和邏輯事件計數。
* 連續序列邊界。
* 事件的 SHA-256 哈希值。
* 阻塞條件(如會話處於活躍狀態、已歸檔、目標位置衝突、後端/核心能力不支持等)。
遷移語義¶
一次成功的遷移只會改變會話頭部的 cwd(當前工作目錄)及其所屬的工作區賬戶。它不會修改 SessionId、創建時間、血緣關係、預設配置、所有邏輯事件以及外部的 dsh-session: 引用。遷移後的會話將在未來工具調用和沙盒策略中歸屬於目標工作區。
安裝與啓用¶
安裝該插件需要使用已應用特定補丁的 DSH 構建。安裝命令如下:
dsh plugin --profile <profile> add dsh-session-move
如果使用打包好的 tarball,可以使用以下命令:
DSH_HOME=<dsh-home> pnpm dsh plugin --profile <profile> add ./dsh-session-move-0.1.0.tgz
安裝後建議執行 dsh --profile <profile> --dump-config 確認配置加載正常。
運行環境要求¶
- 依賴包:插件依賴
@deepseek-ai/dsh-base以及dsh-headless或dsh-web-app等主機包。如果配置文件中僅包含@deepseek-ai/dsh-base,插件將因缺少必要的主機層而無法激活。 - 版本要求:需要與 DSH 的核心版本兼容(如
>=0.1.0-rc.5 <0.1.0-rc.7)。
典型用法¶
插件提供了兩種主要的操作方式:
1. 代碼調用¶
通過編程接口調用只讀檢查,或通過 RPC 調用執行移動:
// 檢查遷移可行性
ctx.sessionMove.inspect({ sessionId, targetWorkspaceId })
// 執行移動(通常由 UI 側邊欄拖拽觸發)
workspace.moveSession({ targetWorkspaceId, sessionId, beforeSessionId? })
2. 側邊欄操作¶
在 DSH Web 界面的側邊欄中,選中一個冷會話標題,將其拖拽至目標工作區,系統將自動調用上述 RPC 完成遷移。
適用場景與注意¶
- 適用範圍:當前版本僅支持 JSONL 格式的會話和 冷會話(非活躍會話)。SQLite 和 Windows 系統的遷移功能已列入計劃但尚未實現。
- 官方版本限制:官方安裝的 DSH rc.6 版本未包含遷移或移動能力,僅支持上述
inspect接口的只讀功能。要使用拖拽移動功能,必須使用帶有補丁的特定構建版本。 - 併發與鎖:插件依賴 DSH 的“每個會話/進程一個實時寫入者”模型。文件系統鎖僅作爲縱深防禦手段,不用於跨進程的併發事務性寫入控制。
- 數據安全:在遷移完成後,插件會驗證最終頭部、唯一的有效工作區所有者、事件計數和邏輯事件 SHA-256,確認無誤後纔會刪除恢復日誌。
總結¶
dsh-session-move 爲 DSH 用戶提供了在跨工作區管理會話歷史時的必要手段。通過保留 SessionId 和事件流,它允許開發者在不丟失上下文的情況下重新組織會話結構。更多詳細文檔、分發指南和回滾步驟可查閱項目倉庫。