dsh-session-merge:用 DSH 寫入接口合併與會話追加

前言

在 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 / 幻方無官方從屬關係。

典型用法流程

  1. 安裝並重啓,對目標會話執行 inspect / verify / planCompact。
  2. 按需求選擇 forkClone、fullCopy、mixCopy 或 fromJsonl 等寫入模式,必要時先 dryRun: true。
  3. surface 接近上限時用 planCompact 算切點,或走分批追加 + autoCompact + 重啓循環。
  4. 完成後再次 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
羽毛球分组比赛记分
小程序二维码

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

小夜