前言¶
在 DeepSeek Harness(DSH)里,一个 workspace 往往对应一整块项目树,多个会话共用同一工作区根目录。智能体在新会话里写文件时,默认会落在 workspace 根下,容易和已有文件混在一起,也不便于按会话归档产出。常见做法是再拆 workspace,但会改侧边栏分组、配置和注册表,成本偏高。
下面介绍社区维护的本地 bundle dsh-session-isolation(GitHub:wangwuli-AAA/dsh-session-isolation):在不把每个会话变成独立 workspace 的前提下,为选定 workspace 里新建的会话自动创建 <workspace>\<baseDir>\<session-id>,并把该会话的 working-directory 投影切到该目录;同时在对话标题栏提供「打开会话文件夹」按钮,并在 v1.2.0 起修复客户端里基于旧 workspace 根拼出来的文件地址。
这是什么¶
- 定位:DSH 本地 bundle(包名
@local/dsh-session-isolation,当前版本 1.2.0,MIT),由 wangwuli-AAA 维护,SkillHub 分类为客户端。 - 组成:Host 监听
agent/created,在startup/clear时为匹配的工作区创建会话目录并切换工作目录投影;Browser 在会话标题栏(DSH 内置「Open in…」分按钮右侧)增加文件夹按钮,并通过只读 Host 路由查询路径,避免猜测;v1.2.0 起包装sidebarRight.openResource,修正缺失分隔符或相对路径导致的预览错误。 - 不变之处:会话归属不变,
SessionHeader.cwd仍为 workspace 根,侧边栏仍按原 workspace 分组。
目录结构示意(默认 baseDir 为 _sessions):
default-workspace\
├─ _sessions\ ← 每个新会话一个文件夹
│ ├─ session-8c0bdfb7-…\
│ │ └─ poem.md
│ └─ session-f7f8c56c-…\
└─ … ← 原有 workspace 文件不受影响
核心功能¶
按会话隔离工作目录¶
- 智能体在
_sessions\<session-id>下启动,除非显式切到别处,否则写入集中在此目录。 - 仅新会话:
startup与clear会隔离;resume、compact沿用已有投影,不强行改目录。 - 子 agent:默认每个 subagent 会话也有独立目录,可通过配置关闭。
- 失败不阻塞:隔离逻辑包在
try/catch中,失败只打warn,会话仍使用 workspace 根(agent/created为串行事件,抛错会中止创建,故采用尽力而为策略)。
不改动 workspace 注册¶
不新增 workspace 条目、不改写 SessionHeader、不动 DSH profile 或 workspace 注册表。
标题栏打开会话目录¶
按钮仅对已被 Host 确认隔离的会话显示;通过 Host 查询后再走 DSH 自带的 open-in-app 路由(Windows 上为文件资源管理器)。
GET /session-isolation/session-directory?sessionId=<id>
-> 200 {"sessionId": "...", "directory": "<workspace>\\_sessions\\<id>"} isolated
-> 404 not isolated / deleted
客户端文件地址修复(v1.2.0)¶
DSH 浏览器侧曾假设「会话工作目录 == workspace 根」。隔离后可能出现 workspace 根与 baseDir 粘连、或相对路径被 Host 按 workspace 根解析失败等问题。Browser 在打开资源前做 idempotent 修复;仅对配置内 workspace 且已隔离的会话生效。升级后需重新点击文件链接一次(旧标签里持久化的地址不会回溯改写)。
环境与依赖¶
- DSH Desktop 0.2.1-rc.2 及以上(README 在 0.2.1-rc.2、0.2.1-rc.3 上验证;主要目标平台为 Windows 11,Host 仅用
node:内置模块与path语义,其他平台在 workspace 路径为绝对路径时也可用)。 - Profile 需启用
@deepseek-ai/dsh-working-directory与浏览器模块系统(Desktop 构建默认开启)。 - 未发布到 npm,需以本地 bundle 链接安装。
安装与配置¶
先做三件事:把仓库放到固定目录、改 patch 里的 workspace 列表、再从 DSH 安装该目录并重启 Desktop。
- 将本仓库放到稳定路径,例如
D:\dsh-session-isolation(README 以 clone 为例;也可自行下载源码到该目录)。 - 编辑仓库内的
cordis.patch.yml:把示例workspaces换成你的 workspace 绝对路径(Windows 的 YAML 中反斜杠需写成 doubled backslashes)。 - 安装并重启 DSH Desktop:
- DSH Desktop → Plugins → 从文件夹安装 bundle,选中上述目录;或
- 在暴露插件管理器的 DSH 会话中执行:
plugin_manager install_bundle target=<repo path>
本地安装是链接:DSH 直接使用该文件夹,移动或删除目录会导致插件失效。
cordis.patch.yml 中插入的 session-isolation 行字段如下(配置非法会在激活时失败,行显示为 failed,而不是静默无效):
| 字段 | 类型 | 默认 | 含义 |
|---|---|---|---|
workspaces |
string[] |
必填 | 绝对 workspace 根;仅当 header.cwd 等于其中一项时会隔离 |
baseDir |
string |
_sessions |
各 workspace 下的目录名;相对路径按 workspace 解析,绝对路径原样使用 |
isolateSubagents |
boolean |
true |
是否为 subagent 会话也创建独立目录 |
修改 index.js 或 client.js 后需重启 DSH Desktop(Browser 半部由 client 模块系统在启动时组合加载)。
典型用法与验证¶
在已配置的 workspace 中新建会话或清空对话(clear)后,智能体应在独立目录下工作;恢复旧会话不应再写入新的 working-directory/change。
README 建议的核对步骤:
- 新会话日志(
session.v4.jsonl.zstd)中出现指向_sessions\<session-id>的working-directory/change事件。 - 系统提示里出现
Current working directory: <workspace>\_sessions\<id>。 - 未列入
workspaces的 workspace 不会出现_sessions目录。 - Resume 旧会话时不新增
working-directory/change。 - 标题栏文件夹按钮出现,并在系统文件管理器中打开对应目录。
- 在隔离会话内点击文件链接/卡片,文档预览正常(v1.2.0 修复项)。
Host 仅在 source 为 startup / clear 且 header.cwd 匹配配置时动作;若 startup 时当前目录既不是 workspace 根也不是服务默认值,则跳过(不覆盖其他机制已设置的工作目录)。
适用场景与注意¶
适合:在同一 DSH workspace 里频繁开新会话做实验、生成物希望按 session-id 分文件夹存放,又希望侧边栏仍按原 workspace 分组的情况。
注意:
- 插件以当前 DSH 进程的权限读写文件系统;安装前应自行阅读源码与 MIT 许可证,确认路径与行为符合预期。
- 社区目录 SkillHub 插件页 与 GitHub 仓库由社区维护,与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,安装方式以 README 为准,勿臆测 npm 或
dsh plugin add github:…一类未在文档出现的命令。
结尾¶
dsh-session-isolation 用 Host + Browser 两半,在不动 workspace 注册的前提下为新会话提供独立工作目录、标题栏一键打开目录,并修复隔离后会话内的文件预览地址。需要细节、截图与变更记录时,可查阅 GitHub 仓库(含 中文 README)与 SkillHub 目录页。