前言¶
在 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