前言¶
在 DeepSeek Harness(DSH)裏,對話掛在工作區上。換一個項目目錄往往意味着要在新工作區重新開線程,標題、工具調用記錄和 token 統計很難整體帶過去。手動導出再粘貼既費事,也容易丟上下文。
下面介紹的 dsh-session-transfer(維護者 xiaolin233-ctrl)是 DSH 插件包:在側欄會話菜單裏增加「轉移到其他工作區…」,把選定對話按官方持久化 API 重放到目標工作區,而不是改寫源日誌文件。
這是什麼¶
- 定位:在工作區之間遷移會話,保留完整事件歷史與會話標題。
- 包名 / 版本:
dsh-session-transfer1.1.0(MIT)。 - 環境:DSH 須支持 Host + Web 客戶端插件包;Node.js ≥ 22.5。
- 目錄頁:skillhub.cn 條目(社區目錄,與 DeepSeek / 幻方無官方從屬關係)。
- 源碼:GitHub 倉庫。
倉庫即插件包:無構建步驟、無運行時依賴;改 impl.js 後刷新頁面即可驗證(Host 側每次請求熱加載)。
核心功能¶
側欄入口與轉移結果¶
在側欄某條對話的「⋯」菜單中出現 轉移到其他工作區…。選擇目標工作區並確認後,該對話在目標側完整出現:標題、工具調用、token 用量等隨事件日誌保留,可照常打開並繼續。
可選行爲(對話框內勾選):
- 保留原工作區的對話:默認不勾;原對話會歸檔(僅從分組表面隱藏,可在「已歸檔」恢復),不刪除數據。
- 源工作區有多條對話時,可 同時轉移該工作區全部對話:逐個複製,子代理會話自動跳過。
如何保證不損壞對話¶
會話在磁盤上是隻追加的事件日誌(session.v4.jsonl.zstd)。插件不改寫已有字節,經 sessionPersistence 重放:
- 讀源會話完整日誌(活會話先
sessions.flush();存儲落後內存時回退內存日誌)。 - 校驗
seq從 0 連續;正在回答的活會話會拒絕,避免複製半截回合。 - 在目標工作區用新 id
create:header 字段(version/createdAt/isSeeded/delegationDepth/agentPreset/parentSession等)原樣複製,僅cwd指向目標工作區。 - 按每批 500 條
append全部事件後flush()。 - 寫後重新讀取覈對條數、
seq連續性與末條seq;不一致則verify-failed,不冒充成功。 attachSession掛到目標工作區;sessionProjectionCache.coldSnapshot補投影緩存(否則側欄可能顯示「未命名對話」)。- 默認歸檔源會話;勾選保留則不動源會話。
投遞標記:原樣複製 session-log-deepseek/delivery-accepted 會導致副本 id 與 header 不一致。插件只改寫本會話自身產生的事件(seq >= inheritedEventCount)中的投遞標記爲新 id;從父會話繼承的前綴保持原樣。
拒絕與批量錯誤碼¶
- 子代理會話(
header.origin === 'subagent')單獨轉移會被拒絕,避免孤兒會話。 - 需格式遷移的舊會話會先拒絕(
format-migration-required)。 - 批量轉移時單條失敗放在
results[]單項裏,不拋 HTTP 錯誤,其它會話可繼續成功。
安裝與啓用¶
- 將倉庫放到本機任意目錄(路徑可含空格)。
- 在 DSH 會話裏安裝本地插件包,target 指向含
package.json的倉庫根目錄:
plugin_manager action: install_bundle target: <倉庫絕對路徑>
裝完後 application 應爲 applied、warnings 爲空;插件列表中出現 dsh-session-transfer(enabled / active)。
- 刷新瀏覽器頁面以加載 Web 客戶端半邊(Host 半邊安裝後即生效,無需重啓 DSH)。
卸載:
plugin_manager action: remove_bundle target: dsh-session-transfer
安裝前建議閱讀倉庫源碼與 MIT 許可證;插件以當前 DSH 進程權限訪問會話存儲與工作區。
典型用法¶
- 側欄將鼠標移到目標對話上,打開「⋯」→ 轉移到其他工作區…。
- 選擇目標工作區,按需勾選「保留原工作區的對話」或「同時轉移該工作區全部對話」。
- 點 轉移;完成後可點 打開新會話 進入副本。
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 倉庫。