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
羽毛球分组比赛记分
小程序二维码

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

小夜