dsh-session-drag-move:DSH 左側欄會話跨工作區拖拽遷移

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 緩存來實現遷移。

核心功能

  1. 跨工作區拖拽邏輯

    • 拖到目標工作區頭行:會話歸入該工作區,並追加到列表末尾。
    • 拖到目標工作區會話行上半部分:插到該會話前面。
    • 拖到目標工作區會話行下半部分:插到該會話後面。
    • 同工作區內拖拽:不攔截,仍由官方處理排序。
  2. 遷移與安全

    • 後臺作業執行:長遷移在後臺作業中執行,避免界面無響應。
    • 幀操作:只重寫第一幀(header),尾部原樣複製,寫完自檢。
    • 舊目錄處理:舊目錄移出 sessions 根,停在備份區(<root>/../session-drag-move-backup)。
    • 運行檢查:遷移前檢查會話是否在運行,運行中或當前會話會被拒絕。
    • 目標衝突:目標文件已存在則整體拒絕,不做半截寫入。
  3. 側欄適配
    插件按運行時 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。

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

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

小夜