@liuhange/dsh-session-recovery:長任務中斷後的輕量檢查點與續跑摘要

前言

用 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 行跳過,不影響其餘行。

檢查點存在哪裏

優先級從高到低:

  1. $DSH_RECOVERY_DIR(測試或運維顯式覆蓋)
  2. $DSH_HOME/profiles/web/recovery
  3. ~/.dsh/profiles/web/recovery(默認佈局)

文件名 {sessionId}.jsonl。忽略某會話時寫入 {sessionId}.completed.json,後續掃描不再提示。路徑規則與 DSH 的 @deepseek-ai/dsh-home-paths 一致,代碼不寫死機器路徑。

恢復流程

經過上面的落盤規則,續跑側步驟如下。

  1. DSH 啓動時掃描 recovery 目錄,找出最近 24 小時內仍有新鮮檢查點、且未標記完成的會話,並寫入啓動日誌。
  2. 模型調用 session_recovery,{ "action": "list" } 查看候選。
  3. { "action": "resume", "sessionId": "..." }:宿主新建空會話;把最後 3 個檢查點的 argSummary 組裝爲「上次會話執行到:…。用戶選擇從此處繼續。」;摘要僅在新會話下一次 systemPrompt 組裝時注入一次,之後清除;來源會話標記完成。
  4. { "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"

任選其一啓用:

  1. 把該包加入 $DSH_HOME/profiles/web/package.json 的 dsh.profile.bundles;
  2. 或在 $DSH_HOME/profiles/web/cordis.patch.yml 追加上述 insert 條目。

重啓 DSH 生效。卸載時從 bundles 或 patch 中移除對應條目並重啓。

如何驗證生效

下面步驟可與 README 中的驗證清單對照執行。

  1. 在會話內連續兩次成功的 write/edit,或執行一次 npm test 等測試命令。
  2. 查看 $DSH_HOME/profiles/web/recovery/(默認 ~/.dsh/profiles/web/recovery/)是否出現 {sessionId}.jsonl,且不超過 50 行。
  3. 重啓 DSH,啓動日誌應出現 session-recovery: startup scan complete,candidates 包含該會話。
  4. 讓模型調用 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 倉庫。

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

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

小夜