dsh-session-isolation:爲 DSH 會話分配獨立工作目錄

前言

在 DSH 裏,同一會話選定的 Workspace 目錄會被多個並行會話共用。若在同一項目下同時跑多個 Agent,它們會寫入同一套文件:後一個會話可能覆蓋前一個剛改好的內容,並行開發時衝突很難避免。

下面介紹社區插件 dsh-session-isolation(維護者 sweet-boby,分類:工作流)。它在目錄級別爲每個新會話分配獨立的 session-<id> 子目錄作爲可寫沙箱,項目根目錄仍對所有會話只讀可見,從而在不大改 DSH 的前提下實現類似 Codex 的「每會話獨立工作區」行爲。

這是什麼

dsh-session-isolation 是 DeepSeek Harness(DSH)的 Cordis 插件:在開啓隔離的 Workspace 下,每個新建會話在 session-<id> 子文件夾中讀寫,互不覆蓋;項目本體文件仍可讀,便於共享代碼與配置。

插件不修改 DSH 核心,通過 Cordis 組合在加載時包裝兩處接縫,卸載時還原。

核心功能

目錄結構與開關

開啓隔離後,項目目錄大致如下(摘自 README):

project/                          ← 你選定的 Workspace(各會話可讀)
├── .dsh-isolate                  ← 開關:空文件;刪除即關閉隔離
├── src/ …                        ← 項目文件(對會話只讀)
├── session-1a2b3c4d/             ← 會話 A 的可寫沙箱根
└── session-9f8e7d6c/             ← 會話 B 的可寫沙箱根

要點:

  1. 子目錄在會話創建之前分配,名稱取 session id 前八位;若碰撞會追加 -2、-3 等。
  2. 會話仍歸屬 Workspace 側欄中的同一項目;AGENTS.md 與 project-skill 仍從會話 cwd 向上查找。
  3. 已在運行的會話不會遷移;隔離隻影響之後創建的新會話。
  4. 關閉開關後不再爲新會話建私有目錄;隔離期間已創建的會話及其目錄仍保留。

開啓與關閉隔離

隔離是目錄屬性,持久形式爲項目根下的空文件 .dsh-isolate。

  1. Web GUI:設置 → 內置插件 → 工作區隔離(Settings → Built-in plugins → Workspace isolation)。列表按 Workspace 顯示路徑、會話數與開關,約每 5 秒刷新。
  2. 對話中:讓 Agent 調用工具 session_isolation,子命令包括 status、list、enable、disable;可選絕對路徑 path,默認當前會話的 workspace。
  3. 宿主代碼:await ctx.isolatedSessions.setIsolated(workspaceId, true) 或 ctx.isolatedSessions.setIsolatedPath(path, true);list()、isIsolated(id) 查詢狀態。
  4. 手動:在項目目錄創建空文件 .dsh-isolate。

GUI 與工具

  • 瀏覽器端通過 dsh.client bundle 註冊 Settings 下的插件頁;與宿主通過 Web carrier 上的 /session-isolation/workspaces(GET)和 /session-isolation/toggle(POST)通信,狀態均來自 marker 文件。
  • 無 Web carrier(ctx.webServer)時,策略與 session_isolation 工具仍可用,只是沒有 GUI 頁。
  • 安裝後需重啓宿主一次,客戶端模塊表纔會加載新 bundle;工具、marker 與宿主服務在重啓前即可用。

實現要點(簡述)

加載時包裝 ctx.sessionController.create 與另一處接縫(README 截斷處爲 workspace 相關邏輯):在創建會話的單次調用中把 Workspace 實體臨時指向新分配的私有目錄,調用結束在 finally 中恢復;創建失敗會刪除已分配目錄。未部署所需 DSH 服務時插件保持 pending,避免半生效。

安裝與啓用

環境要求:Node.js 22+;DSH 需已組合 sessionController、workspaceRegistry、tools 服務(常規 base profile 具備)。

從 GitHub 安裝

dsh plugin --profile <profile> add \
  https://github.com/sweet-boby/dsh-session-isolation.git

安裝後重啓宿主一次。插件管理器會安裝包、選中 bundle 並應用 cordis.patch.yml。

從 Web GUI 安裝

打開 Plugins → Add plugin,粘貼:

https://github.com/sweet-boby/dsh-session-isolation

若當前 DSH 安裝器只接受本地 bundle 路徑,需先在本地取得倉庫絕對路徑再粘貼(README 說明此種構建下的變通方式)。

手動寫入 profile

在 ~/.dsh/profiles/<profile>/package.json 增加依賴並在 dsh.profile.bundles 中加入 dsh-session-isolation,例如:

{
  "dependencies": {
    "dsh-session-isolation": "github:sweet-boby/dsh-session-isolation"
  },
  "dsh": {
    "profile": {
      "bundles": ["…", "dsh-session-isolation"]
    }
  }
}

本地開發可將依賴改爲 file:/absolute/path/to/dsh-session-isolation,在 profile 目錄執行 pnpm install --ignore-scripts 後同樣重啓宿主。

典型用法

  1. 按上文任選方式安裝並重啓 DSH。
  2. 對目標項目開啓隔離(GUI 開關、對話裏 enable、或創建 .dsh-isolate)。
  3. 在該 Workspace 新建一個會話,讓 Agent 執行 pwd 或寫入測試文件:工作目錄應爲 session-<id> 子路徑,項目根在文件策略中爲只讀。
  4. 再開第二個新會話,應得到另一個 session-* 目錄,兩者文件互不影響。

關閉隔離:GUI 關斷、工具 disable、或刪除 .dsh-isolate。

適用場景與注意

適合:同一 DSH 項目下需要並行跑多個 Agent(多任務、多分支實驗、互不踩文件);希望目錄級開關、可與文件管理器或 CI 共用 .dsh-isolate 標記的場景。

注意:

  1. 隔離只保護新會話的可寫根;已存在會話路徑不變。
  2. 各會話沙箱內的改動默認不會自動寫回項目根;若需要合併結果,需自行復制或通過 Agent 在只讀項目樹上操作(按你的流程設計)。
  3. 插件以當前 DSH 宿主進程權限運行,安裝前請閱讀 倉庫源碼 與 MIT 許可證,自行評估是否納入工作流。
  4. SkillHub 等社區目錄與 DeepSeek / 幻方無官方從屬關係,插件來自社區維護者 sweet-boby,版本與兼容性以 README、package.json 爲準。

結尾

dsh-session-isolation 用目錄 marker 與 Cordis 接縫包裝,爲並行 DSH 會話提供可選的 per-session 工作目錄,減少同 Workspace 下的文件互相覆蓋。需要時可從社區目錄頁或 GitHub 獲取安裝說明與 issue 入口:

  • 目錄頁:https://www.skillhub.cn/plugins/sweet-boby/dsh-session-isolation
  • GitHub:https://github.com/sweet-boby/dsh-session-isolation
羽毛球分组比赛记分
小程序二维码

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

小夜