前言¶
在 DSH 裏,同一會話選定的 Workspace 目錄會被多個並行會話共用。若在同一項目下同時跑多個 Agent,它們會寫入同一套文件:後一個會話可能覆蓋前一個剛改好的內容,並行開發時衝突很難避免。
下面介紹社區插件 dsh-session-isolation(維護者 sweet-boby,分類:工作流)。它在目錄級別爲每個新會話分配獨立的 session-<id> 子目錄作爲可寫沙箱,項目根目錄仍對所有會話只讀可見,從而在不大改 DSH 的前提下實現類似 Codex 的「每會話獨立工作區」行爲。
這是什麼¶
dsh-session-isolation 是 DeepSeek Harness(DSH)的 Cordis 插件:在開啓隔離的 Workspace 下,每個新建會話在 session-<id> 子文件夾中讀寫,互不覆蓋;項目本體文件仍可讀,便於共享代碼與配置。
- 倉庫:github.com/sweet-boby/dsh-session-isolation
- 社區目錄頁:skillhub.cn/plugins/sweet-boby/dsh-session-isolation
- 許可證:MIT(package.json / README)
- 當前 package 版本:0.1.0;README 註明已在 DSH
0.1.6-alpha.2上驗證
插件不修改 DSH 核心,通過 Cordis 組合在加載時包裝兩處接縫,卸載時還原。
核心功能¶
目錄結構與開關¶
開啓隔離後,項目目錄大致如下(摘自 README):
project/ ← 你選定的 Workspace(各會話可讀)
├── .dsh-isolate ← 開關:空文件;刪除即關閉隔離
├── src/ … ← 項目文件(對會話只讀)
├── session-1a2b3c4d/ ← 會話 A 的可寫沙箱根
└── session-9f8e7d6c/ ← 會話 B 的可寫沙箱根
要點:
- 子目錄在會話創建之前分配,名稱取 session id 前八位;若碰撞會追加
-2、-3等。 - 會話仍歸屬 Workspace 側欄中的同一項目;
AGENTS.md與 project-skill 仍從會話 cwd 向上查找。 - 已在運行的會話不會遷移;隔離隻影響之後創建的新會話。
- 關閉開關後不再爲新會話建私有目錄;隔離期間已創建的會話及其目錄仍保留。
開啓與關閉隔離¶
隔離是目錄屬性,持久形式爲項目根下的空文件 .dsh-isolate。
- Web GUI:設置 → 內置插件 → 工作區隔離(Settings → Built-in plugins → Workspace isolation)。列表按 Workspace 顯示路徑、會話數與開關,約每 5 秒刷新。
- 對話中:讓 Agent 調用工具
session_isolation,子命令包括status、list、enable、disable;可選絕對路徑path,默認當前會話的 workspace。 - 宿主代碼:
await ctx.isolatedSessions.setIsolated(workspaceId, true)或ctx.isolatedSessions.setIsolatedPath(path, true);list()、isIsolated(id)查詢狀態。 - 手動:在項目目錄創建空文件
.dsh-isolate。
GUI 與工具¶
- 瀏覽器端通過
dsh.clientbundle 註冊 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 後同樣重啓宿主。
典型用法¶
- 按上文任選方式安裝並重啓 DSH。
- 對目標項目開啓隔離(GUI 開關、對話裏
enable、或創建.dsh-isolate)。 - 在該 Workspace 新建一個會話,讓 Agent 執行
pwd或寫入測試文件:工作目錄應爲session-<id>子路徑,項目根在文件策略中爲只讀。 - 再開第二個新會話,應得到另一個
session-*目錄,兩者文件互不影響。
關閉隔離:GUI 關斷、工具 disable、或刪除 .dsh-isolate。
適用場景與注意¶
適合:同一 DSH 項目下需要並行跑多個 Agent(多任務、多分支實驗、互不踩文件);希望目錄級開關、可與文件管理器或 CI 共用 .dsh-isolate 標記的場景。
注意:
- 隔離只保護新會話的可寫根;已存在會話路徑不變。
- 各會話沙箱內的改動默認不會自動寫回項目根;若需要合併結果,需自行復制或通過 Agent 在只讀項目樹上操作(按你的流程設計)。
- 插件以當前 DSH 宿主進程權限運行,安裝前請閱讀 倉庫源碼 與 MIT 許可證,自行評估是否納入工作流。
- 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