dsh-session-recovery:從裸磁盤恢復 DSH 會話與 memory

前言

DeepSeek Harness(DSH)會保存會話日誌和 memory 數據。如果 session.jsonl.zstd 被誤刪、被覆蓋或文件本身損壞,普通的文件恢復往往只能拿到零散內容,難以直接用於恢復會話。dsh-session-recovery 的思路是從裸磁盤開始讀取,定位可識別的 zstd 幀和 SQLite 數據,再把可恢復內容整理成 DSH 可校驗、可繼續使用的會話文件。

這是什麼

dsh-session-recovery 是一個 DSH 恢復工具,倉庫地址爲 https://github.com/Coprexist/dsh-session-recovery,許可證爲 MIT。

它主要做兩件事:

  1. 從裸磁盤恢復 DSH 會話文件 session.jsonl.zstd。
  2. 從裸磁盤恢復 memory 數據庫 memory.db。

倉庫本身是一套恢復腳本和手動恢復說明,也可以作爲 dsh plugin 安裝到 web UI,提供 /session-repair 命令。

核心功能

恢復 memory.db

腳本會按 SQLite 的 SQLite format 3 頭部在裸磁盤上定位 memory.db,導出相應數據窗口,並使用 SQLite 的 .recover 機制搶救可讀行。遇到損壞頁時會跳過,儘量保留仍可讀取的數據。

恢復會話日誌

腳本會在裸磁盤上掃描 zstd frame magic 0xFD2FB528,按磁盤偏移對幀做聚類,在 turn 重置處拆分不同會話,最後重建官方格式的 session.jsonl.zstd。

修復重建後的會話

重建出來的日誌可能無法直接通過 DSH 校驗。工具會自動修復以下問題:

  • 重新整理 seq,使其連續。
  • 深度修復 sourceEventSeqs 和 messageSeqs。
  • 規範化 surfaceOp。

如果會話仍無法 resume,repair-session.js 或 web UI 的 /session-repair 命令會重放 DSH 的 inbox、surface、wire 規則,對文件做進一步修復。

只讀讀取裸磁盤

腳本只讀塊設備,並把恢復結果寫入指定目錄。原始磁盤內容不會被修改。

安裝與啓用

如果作爲 dsh plugin 安裝,可以從本地倉庫路徑添加:

dsh plugin --profile web add file:/path/to/dsh-session-recovery
systemctl restart dsh-web

其中 file:/path/to/dsh-session-recovery 是本地路徑佔位符,需要替換爲實際路徑。

安裝或恢復替換後,需要重啓 dsh-web。

典型用法

下面是按順序執行的恢復流程。

1、先停止會寫磁盤的服務

先停掉可能繼續寫入 DSH 數據的服務,避免恢復過程中數據狀態變化:

systemctl stop dsh-web

2、恢復 SQLite memory

從塊設備恢復 memory.db:

node scripts/recover-memory.js /dev/<dev> /tmp/recovered/

這一步會把可讀的 SQLite 數據恢復到 /tmp/recovered/ 目錄。

3、掃描裸磁盤中的 zstd 會話幀

掃描裸磁盤,把找到的 zstd 會話幀寫入事件流:

node scripts/scan-zstd.js /dev/<dev> > /tmp/session-events.jsonl

4、拆分到不同會話

掃描結果通常是多個會話混合在一起。腳本會按會話拆分:

node scripts/split-sessions.js /tmp/session-events.jsonl 2026-08-16T07:05:06Z

5、重建官方格式會話文件

使用 scripts/rebuild-session.js 重建官方格式的 session.jsonl.zstd。需要提供輸入、會話 ID、創建時間、工作目錄和輸出目錄等信息:

node scripts/rebuild-session.js \
  --input <input-jsonl> \
  --id <session-id> \
  --created-at <created-at> \
  --cwd <workspace-dir> \
  --out-dir <out-dir>

6、校驗或修復重建後的會話

先做一次 dry-run,檢查修復內容:

node scripts/repair-session.js <session.jsonl.zstd> --dry-run

確認沒有問題後執行修復:

node scripts/repair-session.js <session.jsonl.zstd>

修復後會產生 session.jsonl.zstd.repaired 文件和備份文件。檢查 .repaired 內容和備份後,再決定是否替換原文件:

cp <session.jsonl.zstd>.repaired <session.jsonl.zstd>

7、在 web UI 中使用 /session-repair

安裝插件後,可以在任意會話中執行:

/session-repair --dry-run

分析當前會話,不寫文件。

/session-repair <session-id-or-path>

執行修復,默認寫入 .repaired 文件和備份。

/session-repair --apply <id>

在修復後替換原始文件。注意:--apply 對正在運行該命令的 live session 會被拒絕,需要從另一個會話執行。

適用場景與注意

適合以下場景:

  1. session.jsonl.zstd 被刪除或損壞,需要儘量恢復可讀內容。
  2. memory.db 損壞,需要搶救其中的 SQLite 數據。
  3. 重建後的會話無法 resume,需要按 DSH 規則做修復。

使用前注意:

  1. 需要 Node 24+,並依賴 node:sqlite 和 node:zlib。
  2. 腳本只讀塊設備,恢復文件寫入用戶指定目錄,不修改原始磁盤。
  3. 插件以當前 dsh 進程權限運行,安裝前應檢查源碼和許可證。
  4. 使用 --apply 會覆蓋原始會話文件,執行前應先檢查 .repaired 文件和備份。
  5. 插件變更或恢復文件替換後,應重啓 dsh-web。

結尾

dsh-session-recovery 提供了一條從裸磁盤讀取、重建、修復 DSH 會話與 memory 的路徑。適合在常規文件恢復不可用、但仍能從塊設備上找到 zstd 幀或 SQLite 數據時使用。

倉庫地址:

https://github.com/Coprexist/dsh-session-recovery

羽毛球分组比赛记分
小程序二维码

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

小夜