前言¶
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。
它主要做兩件事:
- 從裸磁盤恢復 DSH 會話文件
session.jsonl.zstd。 - 從裸磁盤恢復 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 會被拒絕,需要從另一個會話執行。
適用場景與注意¶
適合以下場景:
session.jsonl.zstd被刪除或損壞,需要儘量恢復可讀內容。memory.db損壞,需要搶救其中的 SQLite 數據。- 重建後的會話無法 resume,需要按 DSH 規則做修復。
使用前注意:
- 需要 Node 24+,並依賴
node:sqlite和node:zlib。 - 腳本只讀塊設備,恢復文件寫入用戶指定目錄,不修改原始磁盤。
- 插件以當前 dsh 進程權限運行,安裝前應檢查源碼和許可證。
- 使用
--apply會覆蓋原始會話文件,執行前應先檢查.repaired文件和備份。 - 插件變更或恢復文件替換後,應重啓
dsh-web。
結尾¶
dsh-session-recovery 提供了一條從裸磁盤讀取、重建、修復 DSH 會話與 memory 的路徑。適合在常規文件恢復不可用、但仍能從塊設備上找到 zstd 幀或 SQLite 數據時使用。
倉庫地址:
https://github.com/Coprexist/dsh-session-recovery