前言¶
用 DeepSeek Harness(DSH)跑重構、補測試、多文件改動時,進程一關或會話一斷,模型往往不知道「剛纔改到哪、測過沒有」。把整段聊天曆史再灌回去成本高,也未必能準確還原執行態。@liuhange/dsh-session-recovery 走另一條路:在關鍵節點把少量事實寫成本地 JSONL 檢查點,下次啓動只掃描未完成會話,續跑時新建會話並注入最後幾條進度的精簡摘要,而不是做全量會話恢復。
這是什麼¶
插件由 liuhange789 維護,npm 包名 @liuhange/dsh-session-recovery(當前資料版本 1.0.0,MIT)。社區目錄歸類爲「記憶」,倉庫:GitHub,介紹頁:SkillHub 目錄。
一句話定位:在工具調用成功的穩定信號處落盤輕量檢查點;DSH 重啓後列出可恢復候選,由模型通過宿主側 session_recovery 工具選擇續跑或忽略。
檢查點如何產生¶
插件不按每次工具調用都記,而是用兩類 stepType 作爲「可以從此處繼續」的信號。
| 觸發條件 | stepType |
|---|---|
連續 2 次成功的 write / edit 類工具調用 |
edit-burst |
| 1 次成功的 bash 測試命令(如 npm/pnpm/yarn/bun test、vitest、jest、pytest、go test、cargo test、mvn test、dotnet test 等) | test-pass |
失敗調用或其它成功調用會打斷 write/edit 的連續計數。設計意圖是:單次孤立編輯不足以說明進度,連續落盤或測試通過才更穩定。
每條檢查點示例(單行 JSON):
{
"timestamp": 1762668000000,
"stepType": "edit-burst",
"toolName": "edit_file",
"argSummary": "file_path=src/a.ts | content=...",
"resultStatus": "success"
}
argSummary 最多 200 字,超出截斷並加 …;每個會話最多保留 50 條,寫入時滑動淘汰最舊記錄。寫入按會話串行化,臨時文件加 rename,避免中斷留下半行;損壞的 JSONL 行跳過,不影響其餘行。
檢查點存在哪裏¶
優先級從高到低:
$DSH_RECOVERY_DIR(測試或運維顯式覆蓋)$DSH_HOME/profiles/web/recovery~/.dsh/profiles/web/recovery(默認佈局)
文件名 {sessionId}.jsonl。忽略某會話時寫入 {sessionId}.completed.json,後續掃描不再提示。路徑規則與 DSH 的 @deepseek-ai/dsh-home-paths 一致,代碼不寫死機器路徑。
恢復流程¶
經過上面的落盤規則,續跑側步驟如下。
- DSH 啓動時掃描 recovery 目錄,找出最近 24 小時內仍有新鮮檢查點、且未標記完成的會話,並寫入啓動日誌。
- 模型調用
session_recovery,{ "action": "list" }查看候選。 { "action": "resume", "sessionId": "..." }:宿主新建空會話;把最後 3 個檢查點的argSummary組裝爲「上次會話執行到:…。用戶選擇從此處繼續。」;摘要僅在新會話下一次 systemPrompt 組裝時注入一次,之後清除;來源會話標記完成。{ "action": "dismiss", "sessionId": "..." }:不恢復,直接標記完成。
摘要總長度不超過 500 字;超長時截斷正文但保留固定結尾。
安裝與啓用¶
先做依賴安裝:
npm install @liuhange/dsh-session-recovery
包內通過 cordis.patch.yml 聲明 bundle 插入:
- insert:
- id: "@liuhange/dsh-session-recovery"
name: "@liuhange/dsh-session-recovery"
任選其一啓用:
- 把該包加入
$DSH_HOME/profiles/web/package.json的dsh.profile.bundles; - 或在
$DSH_HOME/profiles/web/cordis.patch.yml追加上述insert條目。
重啓 DSH 生效。卸載時從 bundles 或 patch 中移除對應條目並重啓。
如何驗證生效¶
下面步驟可與 README 中的驗證清單對照執行。
- 在會話內連續兩次成功的
write/edit,或執行一次npm test等測試命令。 - 查看
$DSH_HOME/profiles/web/recovery/(默認~/.dsh/profiles/web/recovery/)是否出現{sessionId}.jsonl,且不超過 50 行。 - 重啓 DSH,啓動日誌應出現
session-recovery: startup scan complete,candidates包含該會話。 - 讓模型調用
session_recovery的list/resume,確認摘要只含最後 3 條進度且長度 ≤500。
適用場景與注意¶
適合誰: 經常做跨文件編輯、跑測試的長任務;可以接受「新開會話 + 三句進度」而非完整歷史回放的用戶。
權限與安全: 插件以當前 DSH 進程權限讀寫本機 recovery 目錄。安裝前建議閱讀 倉庫源碼 與 MIT 許可證,確認符合你的環境策略。社區目錄 SkillHub 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
已知限制: 當前版本沒有會話列表頂部恢復卡片。Cordis 客戶端插件拿到的 ctx 無法讀取宿主插件本地文件或調用宿主方法;檢查點在宿主文件系統上,因此恢復入口只能是宿主側 session_recovery 工具。若後續 DSH 提供宿主到客戶端的數據通道,可在不改動檢查點與摘要邏輯的前提下補展示層。
結尾¶
@liuhange/dsh-session-recovery 用本地 JSONL 檢查點和 24 小時內的啓動掃描,把「斷在哪」收成最多三句、500 字以內的續跑提示,適合 DSH 上需要斷點續跑、又不願全量恢復會話的場景。更多信息見 目錄頁 與 GitHub 倉庫。