前言¶
在 DeepSeek Harness(DSH)裏做 agent 開發,上下文往往散在多個會話裏:誤開新窗口、並行兩條對話線、fork 出去又希望並回一條時間線。想「把幾段歷史拼成一個會話」時,直接在磁盤上拼接 session.v4.jsonl.zstd 一類文件,DSH 通常打不開——壓縮節點裏的 shadowedRange / shadowedSeqs 仍指向舊 seq、seq 需從 0 密集遞增、surface 摺疊與工具調用的 callId 跨會話也對不齊。
社區插件 dsh-session-merge(維護者 HCQM,分類:記憶)走另一條路:通過 DSH 自帶的會話寫入能力做合併或追加,README 明確說明不會在磁盤上直接改會話文件;寫入前有多層校驗,目標是合併後仍能被 DSH 正常 open。
這是什麼¶
dsh-session-merge 是面向 DSH 桌面端的會話合併/救援工具,npm 包名 dsh-session-merge,當前版本 0.6.0(見倉庫 package.json),許可證 MIT。插件在 DSH 裏顯示爲「會話合併」,peer 依賴 @deepseek-ai/dsh >=0.2.1-rc.5 <0.3.0-0,README 寫明在 DSH 0.2.1-rc.5 桌面端(Electron)實測,會話格式爲 v4(session.v4.jsonl.zstd)。
定位上作者強調:來自「誤開新會話、想把兩段合回去」的真實需求,不是通用日常插件;保證事件不刪(/compact 也只是生成摘要,原文仍在會話裏),代價是會話 surface 變大。
核心功能¶
下面介紹單一工具 session_merge_build 的幾種用法(共 11 種模式,可獨立調用;細節見倉庫 FEATURES.md / API.md)。
只讀:先看清結構再動手¶
裝好後建議先跑三個只讀動作,不寫任何數據:
session_merge_build({ inspect: true, targetId: "<會話id>" }) // 事件 / turn / surface 體積 / 壓縮節點
session_merge_build({ verify: true, targetId: "<會話id>" }) // 官方 persistence.open 能否通過
session_merge_build({ planCompact: true, targetId: "<會話id>" }) // 按 turn 邊界算切點與每段體積
寫入:合併與追加¶
| 能力 | 作用(據 README) |
|---|---|
forkClone |
官方 sessions.fork 克隆,保留壓縮節點 |
fullCopy |
多源全類型複製,按 assistant 回覆去重 |
mixCopy |
按時間窗混合,byteBudget 到量停止 |
fromJsonl |
按區間寫 JSONL,自動補 turn 邊界與 seq 偏移 |
copySequential |
單源直線複製,重映射 seq 引用 |
makeRoot |
把因父會話刪除等導致的斷鏈會話改造成合法根 |
autoCompact / autoCompactAfter |
觸發壓縮(spawn 腳本走 RPC);寫入後可按閾值自動壓 |
所有寫入模式均支持 dryRun。
三層校驗¶
README 將校驗分爲三層:寫入前 validate-full.mjs 輕量預檢;寫入後或排障時用 deep-validate.mjs 六層深度校驗;需要與 DSH 完全一致結論時用 verify(調 persistence.open)。命令行可獨立跑:
node bin/validate.mjs <會話id前綴|目錄|文件> [--json] [--no-replay] [--strict-replay]
node bin/validate.mjs --all
包內還提供 bin 命令 dsh-session-validate(指向 ./bin/validate.mjs)。
硬約束與分批寫入¶
單次模型請求上限 1,048,576 tokens;README 實測反推 surface 約 3.8 字節/token,並建議可見 surface 安全線約 ≤3.4 MB(再大 /compact 可能發不出去)。歷史過大時需分批:追加一批(例如 surface ≤ 2.4 MB)→ autoCompact → 重啓 DSH(壓縮後會話被 agent 佔用寫句柄,插件無法釋放,壓縮後須重啓才能繼續追加)→ 再追加 → 最後 verify。
示例(README):
session_merge_build({ mixCopy: true, sources: ["<源>"], targetId: "<目標>", byteBudget: 2400000 })
session_merge_build({ autoCompact: true, targetId: "<目標>" })
安裝與啓用¶
安裝命令以 README 爲準:
dsh plugin --profile desktop add dsh-session-merge
重啓 DSH 後,在插件列表中應出現「會話合併」。插件聲明權限爲:讀取會話列表與事件;寫入、摺疊、克隆會話(見 package.json 的 dsh.permissions)。
DSH 生態是「一切皆插件」;社區目錄頁(如 SkillHub)與 GitHub 倉庫由維護者發佈,與 DeepSeek / 幻方無官方從屬關係。
典型用法流程¶
- 安裝並重啓,對目標會話執行
inspect/verify/planCompact。 - 按需求選擇
forkClone、fullCopy、mixCopy或fromJsonl等寫入模式,必要時先dryRun: true。 - surface 接近上限時用
planCompact算切點,或走分批追加 +autoCompact+ 重啓循環。 - 完成後再次
verify,確認 DSH 能打開。
跨會話搬運時 README 列出的已知損失包括:空回覆喚醒記錄可能被去重跳過、未閉合 turn、孤兒工具調用、部分 inbox 事件等;並行會話的時間戳會保留真實交錯,不會強行改成單線敘事。
適用場景與注意¶
適合:一次性把多段 DSH 會話合成一條可檢索時間線;修復 parentSession 錯誤導致打不開的會話(makeRoot);極端情況下按排障手冊做分段壓縮救援(非主路徑)。
不適合:當作日常記憶系統——長期應依賴記憶庫(記憶卡 / memory_recall 等);也不是爲了省 token(合併只會增大 surface)。
安全:插件以當前 DSH 進程權限讀寫會話數據。安裝前請閱讀 GitHub 倉庫 源碼與 MIT 許可證,確認符合你的環境策略。
結尾¶
dsh-session-merge 解決的是「多會話歷史如何合法併入一條 DSH 會話」——不靠手拼文件,而靠 DSH 寫入接口與校驗鏈保證可打開、可繼續 /compact。
- 目錄頁:https://www.skillhub.cn/plugins/HCQM/dsh-session-merge
- 源碼與文檔:https://github.com/HCQM/dsh-session-merge