DeepSeek Harness (DSH) 的左側欄工作區面板中,官方只支持同工作區內的會話拖拽排序。跨工作區拖拽時,onDrop 不會觸發,insertSessionBefore 也會拒絕不屬於本工作區的會話。dsh-session-drag-move 插件接管了這段原本空白的交互,實現了真正的會話遷移。
安裝與啓用¶
插件通過 CLI 安裝:
dsh plugin --profile desktop add dsh-session-drag-move
若需手動安裝,需將插件目錄放入 profile 的 node_modules 中,並在 cordis.patch.yml 中註冊。
工作原理¶
DSH 中會話的歸屬是派生的:工作區包含所有 header 的 cwd 等於本工作區路徑的會話。workspace.json 裏的 sessionIds 只是順序賬本。要換工作區,必須改 header。
會話日誌是 Zstandard 幀的拼接,第一幀即爲 header。插件通過重寫第一幀的 cwd,原樣複製尾部幀,再同步 registry 緩存來實現遷移。
核心功能¶
-
跨工作區拖拽邏輯
- 拖到目標工作區頭行:會話歸入該工作區,並追加到列表末尾。
- 拖到目標工作區會話行上半部分:插到該會話前面。
- 拖到目標工作區會話行下半部分:插到該會話後面。
- 同工作區內拖拽:不攔截,仍由官方處理排序。
-
遷移與安全
- 後臺作業執行:長遷移在後臺作業中執行,避免界面無響應。
- 幀操作:只重寫第一幀(header),尾部原樣複製,寫完自檢。
- 舊目錄處理:舊目錄移出 sessions 根,停在備份區(
<root>/../session-drag-move-backup)。 - 運行檢查:遷移前檢查會話是否在運行,運行中或當前會話會被拒絕。
- 目標衝突:目標文件已存在則整體拒絕,不做半截寫入。
-
側欄適配
插件按運行時 DOM 契約識別行,而非源碼類名:- 主契約:
[data-row-key="session:<id>"]和[data-row-key="workspace:<id>"] - 兜底:
*_sessionRow類名後綴,[draggable="true"]和[role="treeitem"]屬性 - 適配第三方側欄(如
dsh-better-workspace)時,按源碼類名匹配一定失敗,插件通過匹配後綴與屬性保持兼容。
- 主契約:
已知限制與依賴¶
- 版本敏感:插件依賴
workspaceRegistry的內部字段(headers/sessionPaths/host.rememberSessionPath)。這些字段版本敏感,插件會進行 feature-probe,探測不到會返回結構化錯誤。 - 緩存同步:投影緩存
~/.dsh/stores/session_projcache/sessions/<id>.json裏的record.identity.cwd目前未改寫(不影響歸屬)。 - 靜默失敗:若某個側欄把
data-row-key等信號全部換掉,插件會靜默不接管(不影響原生拖拽),可通過控制台日誌[sm]定位。
API 接口¶
長遷移在後臺執行,可通過以下接口查詢進度:
POST /session-drag-move/api/move # 開始遷移,傳 wait: true 可同步等待結果
POST /session-drag-move/api/progress # 查詢進度,返回 state, phase, detail, result, error
phase 取值包括 resolve, scan, index, read, rewrite, write-main, move-extras, backup, ledger, branches, done。