dsh-session-transfer:在 DSH 工作區之間保留完整歷史地轉移對話

前言

在 DeepSeek Harness(DSH)裏,對話掛在工作區上。換一個項目目錄往往意味着要在新工作區重新開線程,標題、工具調用記錄和 token 統計很難整體帶過去。手動導出再粘貼既費事,也容易丟上下文。

下面介紹的 dsh-session-transfer(維護者 xiaolin233-ctrl)是 DSH 插件包:在側欄會話菜單裏增加「轉移到其他工作區…」,把選定對話按官方持久化 API 重放到目標工作區,而不是改寫源日誌文件。

這是什麼

  • 定位:在工作區之間遷移會話,保留完整事件歷史與會話標題。
  • 包名 / 版本:dsh-session-transfer 1.1.0(MIT)。
  • 環境:DSH 須支持 Host + Web 客戶端插件包;Node.js ≥ 22.5。
  • 目錄頁:skillhub.cn 條目(社區目錄,與 DeepSeek / 幻方無官方從屬關係)。
  • 源碼:GitHub 倉庫。

倉庫即插件包:無構建步驟、無運行時依賴;改 impl.js 後刷新頁面即可驗證(Host 側每次請求熱加載)。

核心功能

側欄入口與轉移結果

在側欄某條對話的「⋯」菜單中出現 轉移到其他工作區…。選擇目標工作區並確認後,該對話在目標側完整出現:標題、工具調用、token 用量等隨事件日誌保留,可照常打開並繼續。

可選行爲(對話框內勾選):

  • 保留原工作區的對話:默認不勾;原對話會歸檔(僅從分組表面隱藏,可在「已歸檔」恢復),不刪除數據。
  • 源工作區有多條對話時,可 同時轉移該工作區全部對話:逐個複製,子代理會話自動跳過。

如何保證不損壞對話

會話在磁盤上是隻追加的事件日誌(session.v4.jsonl.zstd)。插件不改寫已有字節,經 sessionPersistence 重放:

  1. 讀源會話完整日誌(活會話先 sessions.flush();存儲落後內存時回退內存日誌)。
  2. 校驗 seq 從 0 連續;正在回答的活會話會拒絕,避免複製半截回合。
  3. 在目標工作區用新 id create:header 字段(version / createdAt / isSeeded / delegationDepth / agentPreset / parentSession 等)原樣複製,僅 cwd 指向目標工作區。
  4. 按每批 500 條 append 全部事件後 flush()。
  5. 寫後重新讀取覈對條數、seq 連續性與末條 seq;不一致則 verify-failed,不冒充成功。
  6. attachSession 掛到目標工作區;sessionProjectionCache.coldSnapshot 補投影緩存(否則側欄可能顯示「未命名對話」)。
  7. 默認歸檔源會話;勾選保留則不動源會話。

投遞標記:原樣複製 session-log-deepseek/delivery-accepted 會導致副本 id 與 header 不一致。插件只改寫本會話自身產生的事件(seq >= inheritedEventCount)中的投遞標記爲新 id;從父會話繼承的前綴保持原樣。

拒絕與批量錯誤碼

  • 子代理會話(header.origin === 'subagent')單獨轉移會被拒絕,避免孤兒會話。
  • 需格式遷移的舊會話會先拒絕(format-migration-required)。
  • 批量轉移時單條失敗放在 results[] 單項裏,不拋 HTTP 錯誤,其它會話可繼續成功。

安裝與啓用

  1. 將倉庫放到本機任意目錄(路徑可含空格)。
  2. 在 DSH 會話裏安裝本地插件包,target 指向含 package.json 的倉庫根目錄:
plugin_manager  action: install_bundle  target: <倉庫絕對路徑>

裝完後 application 應爲 applied、warnings 爲空;插件列表中出現 dsh-session-transfer(enabled / active)。

  1. 刷新瀏覽器頁面以加載 Web 客戶端半邊(Host 半邊安裝後即生效,無需重啓 DSH)。

卸載:

plugin_manager action: remove_bundle target: dsh-session-transfer

安裝前建議閱讀倉庫源碼與 MIT 許可證;插件以當前 DSH 進程權限訪問會話存儲與工作區。

典型用法

  1. 側欄將鼠標移到目標對話上,打開「⋯」→ 轉移到其他工作區…。
  2. 選擇目標工作區,按需勾選「保留原工作區的對話」或「同時轉移該工作區全部對話」。
  3. 點 轉移;完成後可點 打開新會話 進入副本。

Host 側主要路由(供集成或排查參考):

  • GET /dsh-session-transfer/state?sessionId=…:工作區列表與當前會話狀態。
  • POST /dsh-session-transfer/transfer,body 含 sessionIds、targetWorkspaceId、keepOriginal 等。

適用場景與注意

適合:多工作區切換時想把整條對話(含歷史與標題)遷到另一目錄;需要歸檔源會話、在目標工作區無縫續聊。

注意:

  • 源會話正在回答時需等本輪結束(session-running)。
  • 讀源失敗、日誌不連續(read-failed / log-corrupt)不會寫入任何副本。
  • 寫入或校驗失敗可能留下 partialSessionId,需在存儲中自行清理;原會話通常未被改動。
  • 附件在全局存儲,不隨會話目錄遷移;事件中的引用按 DSH 現有機制保留。

倉庫自檢插件曾在 Host 進程內驗證無種子會話(26 條事件)與種子會話(1250 條事件、inheritedEventCount = 1248)等用例,覈對 cwd、header 字段、事件序列與側欄標題等行爲。

結尾

dsh-session-transfer 用官方持久化重放實現工作區間對話遷移,側重完整性與寫後校驗,而不是手工複製側欄文本。需要安裝包或源碼時,可訪問 社區目錄頁 與 GitHub 倉庫。

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

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

小夜