dsh-session-doctor:掃描並無損修復 DSH 會話日誌損壞

前言

DeepSeek Harness(DSH)把會話歷史存成逐批追加、帶校驗和的 zstd 幀。這條日誌是人與 DSH 之間交換記憶的唯一介質:一旦某條記錄在加載階段無法通過形狀校驗,整條歷史會報 SessionPersistenceCorruptionError,界面常見「history unavailable … must contain one tool-result block」——相當於人和系統一起「失憶」。

問題往往出在寫入與加載不對稱:寫入路徑不校驗消息形狀,第三方插件在 output.render() 返回裸字符串等違規形態時,寫入不會報錯,直到下次加載才暴露。社區維護的 dsh-session-doctor(imtokenxinluo)針對這類已落庫的損壞做體檢、備份後無損修復,並在 v1.1 起提供實時 watch 告警、v1.2 起提供 blame 事故歸因。下面介紹它是什麼、能做什麼、如何安裝與使用。

這是什麼

dsh-session-doctor 是會話體檢與修復工具,面向 DeepSeek Harness:用與 DSH 加載路徑相同的規則掃描存儲的會話日誌,找出會導致歷史加載失敗的損壞記錄,對已支持的那類形狀漂移做無損修復;每次修復前自動備份。維護者爲 imtokenxinluo,在 SkillHub 社區目錄中歸類爲「記憶」,倉庫見 GitHub,許可證 MIT。當前 npm 包版本爲 0.2.3(以 package.json 爲準)。

它與內核側「寫路徑守衛」、兄弟插件 dsh-contract-check 等形成互補:contract-check 偏事前靜態檢查,本工具的 watch 偏實時告警,scan/repair 偏事後修復,裝不裝互不影響。

核心功能

scan:按 loader 同款規則體檢

遍歷 sessions 根目錄或單個 .jsonl.zstd 文件,校驗每條事件,報告損壞會話、行號、seq、事件類型、涉及的 tool 名與原因。

repair:備份後無損修復(限定形態)

對單個損壞文件:先備份爲 <file>.<ts>.bak,再修復 tool-result 塊中 content 不是數組的記錄,幀級重寫(未損壞幀字節不變);重寫產物複驗 0 失敗才落盤。未知損壞形態只報告、不自動修。

當前支持且不改字的三種形態:

形態 修法
content 爲裸字符串 包成 [{type:"text",text:…}]
content 爲 null 或缺失 置爲 []
content 爲單個對象 包成 [obj]

數字、布爾等無法安全推斷的形態一律不修。

watch(v1.1):實時哨兵

訂閱 DSH session/event,對 live 會話新寫入的消息事件即時做 loader 同款校驗,違規立刻告警。事件在 append 後才發佈,watch 不阻止寫入、不改 live 文件;修復交給冷會話的 repair。

blame(v1.2):突然關閉是不是 agent 乾的

只讀分析會話日誌:定位中斷斷點,回看斷點前工具調用鏈,匹配殺進程、關瀏覽器、自重啓 harness 等危險模式。雙重證據門檻下判定 AGENT-CAUSED、EXTERNAL 或 NO-ACCIDENT;日誌尾部 torn frame 會標註證據缺失。

safeguard(0.2.2 起)

一條命令串聯:冷備整棵 sessions 樹 → 體檢 → 修復 → 回讀校驗。冷備失敗則中止,絕不進入修復。

設置面板「會話體檢」(0.2.2 起)

GET /session-doctor/report 只讀展示結論;POST /session-doctor/repair 需顯式觸發修復。0.2.1 及更早裝進 profile 後僅有實時哨兵,無面板與上述路由;CLI 的 scan/repair/blame 仍可用。判斷是否含面板:看 node_modules/dsh-session-doctor/package.json 的 version,或該目錄下是否存在 lib/client.js。

完整損壞形態與「能修 / 只報告」說明見倉庫 docs/DEFECT-CATALOG.md。

安裝與啓用

README 寫明:獨立包,暫不註冊進 profile。CLI 不依賴 DSH 運行環境,需 Node >= 22,零運行時依賴(僅用 Node 內置模塊)。

在克隆或解壓倉庫後於項目根目錄執行:

npm link

也可直接運行:

node bin/dsh-session-doctor.js

作爲 DSH cordis 服務插件時,接縫在 src/,可通過 profile 註冊以啓用 watch;默認不裝。安裝任何 DSH 插件前,應自行查看源碼與 MIT 許可證;插件在 DSH 進程權限下運行,與宿主同權。

典型用法

掃描與修復單文件:

dsh-session-doctor scan <sessions-root>
dsh-session-doctor scan-file <file>
dsh-session-doctor repair <file> [--dry-run]
dsh-session-doctor blame <file|root>

動手前全局快照(先 dry-run,確認後再 apply):

dsh-session-doctor safeguard <sessions-root> --backup-to <backup-dir>
dsh-session-doctor safeguard <sessions-root> --backup-to <backup-dir> --apply

順序固定爲:冷備 → 體檢 → 修復(每文件仍留 .bak)→ 重掃校驗。清單寫在 <backup-dir>/doctor-backup-manifest.json。

GUI 報 history unavailable 且提示 tool-result block 時:對該會話文件 scan-file 確認,再 repair。想查哪個插件違反 render 契約,可用倉庫腳本 scripts/audit-render-contract.mjs <插件 src/lib>。

適用場景與注意

場景 建議
歷史無法加載,懷疑 tool-result 形狀錯誤 scan-file → repair
擔心插件再次寫壞記錄 profile 啓用 watch,或定期 scan
DSH 升級後懷疑舊會話 按倉庫 docs/PATCHES.md 覈對
瀏覽器或 DSH 突然關閉 blame 只讀歸因

repair 只處理上述 content 非數組一族;其它損壞請依賴報告與冷備,勿指望自動改寫。長期增量冷備可與 dsh-session-backup 等分工並用;safeguard 側重「本次修復前」的就地快照。

SkillHub(https://www.skillhub.cn/plugins/imtokenxinluo/dsh-session-doctor)是社區插件目錄,與 DeepSeek / 幻方無官方從屬關係;DSH 生態理念是「一切皆插件」,本工具是社區在記憶與會話持久化邊界上的補充,而非官方內置能力。

結尾

dsh-session-doctor 把「加載時才爆炸」的會話損壞變成可掃描、可備份、可有限無損修復、可實時告警、可 blame 歸因的問題,適合長期跑 DSH、依賴歷史連續性的開發者。詳情與更新以倉庫 README 爲準。

  • 社區目錄:https://www.skillhub.cn/plugins/imtokenxinluo/dsh-session-doctor
  • GitHub:https://github.com/imtokenxinluo/dsh-session-doctor
羽毛球分组比赛记分
小程序二维码

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

小夜