前言¶
在 DeepSeek Harness(DSH)裏,插件生態強調“一切皆插件”。DSH Web GUI 的側邊欄會話按工作區組織,會話歷史又會綁定到對應工作區目錄。
dsh-session-mover 針對的是跨工作區整理會話的場景:把一個已有完整歷史的會話行拖到另一個工作區標題行上,讓目標工作區獲得同歷史的新會話,原會話歸檔。
這是什麼¶
dsh-session-mover 是一個 DSH 插件,維護者爲 baisama-cloud,許可證爲 MIT。
它把“跨工作區移動會話”做成一次拖拽操作:移動採用目標工作區克隆 + 原會話歸檔語義。
核心功能¶
- 直接在會話列表裏拖動,無需額外面板或按鈕。
- 支持工作區組內會話、跨工作區會話,以及「未分組」會話拖入工作區。
- 移動後底部彈出結果提示;如果拖的是當前打開的會話,會自動跳轉到新副本。
- 同工作區內拖動仍走官方重排邏輯,兩者互不干擾。
- 失敗時給出可見的紅色提示,不會無聲失敗。
工作原理¶
官方側邊欄的會話行本身可拖拽。會話行被拖起時,會把會話 ID 寫入 dataTransfer:
setData("text/plain", id)
插件在 document 層監聽 drop,使用語義屬性(role="treeitem" 和 aria-expanded,而非樣式類)定位光標下的工作區標題行,並按樹中順序映射到對應工作區。
命中後,客戶端調用宿主能力。資料中給出的宿主入口包括:
POST /session-mover/move-session
動態插件方式下,宿主也提供:
harness.handle('move-session')
宿主側按資料描述執行以下步驟:
1、sessionQuery.readSession 讀取源會話完整日誌。
2、sessions.create 在目標工作區創建攜帶完整歷史的新會話,保持創建時間與 agent 預設,cwd 設爲目標工作區路徑。
3、sessions.flush 持久化。
4、workspace.attachSession 將新會話歸屬到目標工作區。
5、workspaceRegistry.archiveSession 歸檔源會話。
安裝與啓用¶
資料未給出完整的 DSH 插件添加/啓用命令,下面只列已給出的分發與配置示例。
克隆到本地後,使用 npm pack 生成插件包:
# 生成 dsh-session-mover-0.1.0.tgz
npm pack
如果需要把它加入 DSH 插件列表,cordis.patch.yml 中已有如下聲明示例:
- insert:
- id: dsh-session-mover
name: 'dsh-session-mover'
package.json 中聲明的主入口爲 lib/index.js,客戶端 bundle 爲 lib/client.js,並聲明 engines.node 爲 >=20。
典型用法¶
1、在側邊欄會話列表裏按住要移動的會話行。
2、拖到另一個工作區的標題行(帶文件夾圖標的行)上鬆手。
3、原會話從舊工作區消失(歸檔),目標工作區出現同歷史的新會話,底部提示移動結果。
如果當前打開的正是被移動的會話,插件會自動跳轉到新副本。
適用場景與注意¶
適合需要把已有會話歷史整理到不同工作區的 DSH 使用者,尤其是希望保留完整上下文、避免重新粘貼或複製會話內容的場景。
使用前注意以下幾點:
- 插件會以當前 DSH 進程的權限運行;安裝前應檢查源碼、依賴和 MIT 許可證。
- 移動會產生新的會話 ID;原會話歸檔隱藏,但日誌與記錄保留,可被
workspaceRegistry查詢。 - 會話所屬工作區由會話的
cwd(工作目錄)決定。 - 由於平臺約束(會話日誌默認
zstd壓縮、會話頭不可變、存儲層無遷移 API),無法保留原會話 ID 原地搬家。 - 子代理(
subagent)會話與空白佔位會話不作爲可拖拽項。 - 在平面列表模式(”In one list”)下沒有工作區標題行,拖放無效。
結尾¶
dsh-session-mover 的價值,是把跨工作區整理會話歷史的操作收斂爲一次拖拽,同時保留完整歷史並歸檔原會話。
GitHub 倉庫:
https://github.com/baisama-cloud/dsh-session-mover
目錄頁 URL 未在已覈實資料中給出,這裏不做推斷。