dsh-session-migration:在 DSH 會話頭一鍵遷整段會話與工作區

前言

DeepSeek Harness(DSH)裏,一段會話並不只是聊天日誌:sessionId 落在 ~/.dsh/sessions/<projectKey(cwd)>/<sessionId>/ 下,日誌 frame 1 裏又寫了一份 cwd,~/.dsh/storages/workspace.json 裏的 workspace.sessionIds 再決定它出現在哪個工作區列表。想換目錄或合併工作區時,手改文件夾或 registry 很容易撞上三類實際問題:複製而非移動導致重複 sessionId、registry 指向已刪除數據使整個工作區打不開、或在 DSH 運行時直接改 workspace.json 被內存中的 registry 覆蓋。下面介紹社區插件 dsh-session-migration(維護者 Alvin070911),在會話頭提供一個按鈕,按 DSH 自身的存儲約定做遷移、備份與健康檢查。

這是什麼

dsh-session-migration 是 DSH 客戶端插件:在任意會話頭部的 utilities 區出現一個圖標按鈕(雙面板加箭頭),打開遷移面板。它把整段會話的 log、header.cwd、工作區歸屬 一併遷到目標工作區或自定義目錄,並附帶會話瀏覽、一鍵導出備份、工作區健康檢查。實現上只調用 DSH 自帶服務,遵循「移動而非複製」、只改 frame 1、通過 live workspaceRegistry 寫註冊表等約定。當前 GitHub 星標爲 0;package.json 版本爲 0.1.0,許可證 MIT。

生態上,DSH 以「一切皆插件」組織能力;SkillHub 目錄頁 是社區站點,與 DeepSeek / 幻方無官方從屬關係。

核心功能

資料中列出的能力如下,寫入正文前已與 README 對齊。

會話遷移

  • 遷到已有工作區,或通過「custom path」瀏覽/輸入任意目錄。
  • 先 preflight,再執行;自動備份、字節級校驗、失敗自動回滾,並輸出可複製的手動回滾命令。
  • 可選把源工作區 頂層文件/目錄 一併挪到目標;若目標存在同名項則拒絕;源目錄保留爲空目錄,以免同目錄下其他會話失效。
  • 當前正在使用的會話不能遷移自身(日誌仍被打開,插件會拒絕)。

會話列表與健康檢查

  • 列表展示:id、工作目錄、日誌大小、frame 數、最後寫入、當前歸屬、問題標記。
  • 健康檢查覆蓋:懸空引用、重複 id、header 與目錄不一致、空日誌、工作區目錄缺失、未註冊會話等;其中 dangling-reference 可通過 live registry 一鍵清理,無需關閉 DSH。

導出備份

將 session 目錄複製到你指定的目的地,並附帶 migration-export.json 清單,不修改 registry。

安裝與啓用

安裝命令以倉庫 README 爲準,不要用名稱自行拼接 dsh plugin add。

本地目錄(自託管常用):

plugin_manager install_bundle  target = C:\path\to\dsh-session-migration

從 GitHub:

plugin_manager install_bundle  target = git+https://github.com/Alvin070911/dsh-session-migration.git

也可在 profile 的 cordis.patch.yml 中自行插入:

- insert:
    - id: session-migration
      name: dsh-session-migration

瀏覽器端由 dsh.client 聲明自動加載。若按鈕未出現,刷新頁面一次——新裝的客戶端 bundle 需要頁面重新遍歷模塊圖。

插件在 cordis.patch.yml 中支持 config(默認值見下)。數據目錄位於 <dshHome>/plugin-data/dsh-session-migration/(pending.json、自動備份、手動導出等)。

- id: session-migration
  name: dsh-session-migration
  config:
    backupBeforeMove: true
    keepBackups: 10
    tryImmediateAttach: true
    pendingApplyDelayMs: 2500
    dshHome: ''
    sessionsRoot: ''

dshHome 默認爲 $DSH_HOME,否則 ~/.dsh;sessionsRoot 默認爲 <dshHome>/sessions。

安裝前建議在 GitHub 倉庫 閱讀源碼與 MIT 許可證。插件以當前 DSH 進程權限訪問會話與 registry,僅在可信環境安裝。

典型用法

按 README 的可復現流程操作:

  1. 打開任意會話,在頭部 utilities 找到遷移圖標。
  2. 在左欄選擇要遷移的會話(不能選當前正在使用的會話)。
  3. 選擇目標工作區,或切換到「custom path」輸入/瀏覽目錄。
  4. 閱讀 preflight:project-key 變化、目標 session 路徑、是否會新建工作區、可選文件遷移的數量與衝突。
  5. 點擊「Start migration」,再「Confirm migration」。
  6. 結果按步驟列出:backup → data move → header rewrite → verification → file move → workspace membership。

關於「需要重啓」

工作區歸屬寫入可能報告 pending-restart,這是設計行爲而非失敗:live workspace registry 是啓動時從 session header 建的快照,插件無法在運行時原地刷新;運行中手寫 workspace.json 屬於資料中的 crash mode C。membership 會進入隊列 ~/.dsh/plugin-data/dsh-session-migration/pending.json,在下次 DSH 啓動後應用並寫日誌。一般只需重啓一次,會話即出現在新工作區;「Pending」頁也可嘗試更早重試。

安全模型與日誌處理(簡要)

README 強調的不變量包括:只移動不復制;registry 僅通過 workspaceRegistry 且在數據就位後寫入;只改 frame 1 的 cwd;frame 1 之後內容做完整性比對;重複遷到同一目標爲 same-target 無操作;失敗會回滾數據與 .bak,並打印回滾命令。

另一點對開發者重要:不要用 zlib.zstdDecompressSync(log) 當整文件解壓——它通常只返回第一幀 header,誤判爲空會話可能刪掉真實歷史。本插件按 RFC 8878 走幀邊界(必要時 magic 掃描),分塊計幀,僅替換 frame 1。

手動回滾時,須在 DSH 完全退出 後按遷移輸出中的命令操作;目錄內 session.v4.jsonl.zstd.bak 是改寫前的日誌,DSH 不會把它當作正式代次。若要撤銷排隊中的 membership,還需從 pending.json 刪除對應項。

適用場景與注意

適合: 需要把某段會話連同 cwd 與工作區歸屬遷到新目錄;希望批量瀏覽會話、做 registry/磁盤一致性檢查;遷前自動備份或單獨導出備份。

注意:

  • duplicate-session、cwd-mismatch、id-mismatch、空/缺失日誌等需按健康檢查說明人工處理,不能一鍵修。
  • 可選「搬走源目錄頂層文件」遇重名會直接拒絕。
  • membership 變更常需一次 DSH 重啓纔在 UI 中完全體現。

結尾

dsh-session-migration 把「遷 session 目錄 + 改 header + 改工作區註冊」收成會話頭的一個面板,並圍繞 DSH 真實的三處綁定關係做了 preflight、備份與回滾。若你在多工作區、多目錄間整理會話,可先裝 bundle、刷新頁面,再用健康檢查摸清現場,再做單次遷移。

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

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

小夜