[Bug] 工作区选择根目录后无法在该工作区创建对话,并跳转至其他工作区 #7702
lishang25253
started this conversation in
General
Replies: 1 comment
|
独立复现了你的结论 ✓ 本机 Windows 11 + Node v24.9.0(系统 node,不是 DSH 内置运行时): ⇒ 确认是 Node 在 Windows 对卷根的行为,与 DSH 无关。你的链路定位( 补两条可能省事的:
顺带提醒后来者:工作区决定 cwd 与沙箱/审批作用域,选 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
(别问我为什么要在根目录创建工作区,我只是想清个C盘😅)
Windows 盘根目录工作区无法创建 Session
环境
@deepseek-ai/dsh0.1.5-rc.2ELECTRON_RUN_AS_NODE→ Node v24.18.1@deepseek-ai/dsh-api-session-controller@0.1.5-rc.2摘要
在 Windows 上,如果某个 Workspace 的
path是盘根目录(C:\、D:\),就永远创建不出 Session。因为createOrAdopt无条件调用mkdir(cwd, { recursive: true }),而 Node 在 Windows 上对「卷根」调用它会抛EPERM—— 哪怕那个目录明明已经存在。Host 其实把这个失败正确包装成了一个信息完整的
gateway/internalRemoteError,但 Web 客户端「新建会话」页的工作区选择器把这个 rejection 直接丢掉了,所以用户看到的现象只是「选中后自己跳回原来的」—— 没有报错、没有提示、没有日志。复现步骤
A. 纯 Node 四行(不需要 DSH)
实测输出(Node v24.18.1 与 v20.19.0 一致):
注意盘根目录是存在的,而且
fs.realpath('C:\\') === 'C:\\'—— 所以这不是「目录不存在」的问题,而是递归mkdir在卷根上根本无法成功。B. 产品级
C:\的 Workspace(应用内目录选择器接受它,realpathNormalize也接受,Workspace 记录成功创建)。实际结果
session.create被拒绝,错误为:而客户端完全不显示任何反馈。
期望结果
要么 Session 创建成功(目标目录本来就存在),要么明确告知用户失败原因。盘根目录是合法的 Workspace 选择 —— 例如「让 agent 清理整个卷」这种用途 ——而目前它根本无法获得 Session。
根因
1. 无条件的递归
mkdir——packages/api/session-controller/src/agent.ts:481(函数createOrAdopt,起于agent.ts:444):cwd来自目标 Workspace 路径 ——packages/api/session-controller/src/commands.ts:118:2. Host 侧其实正确上报了 ——
commands.ts:119-142,以及rejectCreation(commands.ts:534-556),其结尾是:所以诊断信息是完整送达客户端的。这不是 Host 吞错误的问题。
3. Web 客户端把它丢了 ——
@deepseek-ai/dsh-client-ui-conversation,「新建会话」主视觉区的工作区选择器(0.1.5-rc.2 发布版lib/client.js:14890-14896):调用链:
selectWorkspace→@deepseek-ai/dsh-client-ui-workspace的openWorkspace(lib/client.js:65-72)→connectWorkspace→sessions.create({ workspaceId })。为什么这个 bug 特别难排查
console.warn,所以 DevTools 里什么都看不到;而 Desktop 的「导出诊断」只覆盖 Host 日志和启动事件,不含渲染层输出。影响版本
0.1.5-rc.2(DSH Desktop 2.0.10 / 2.0.11 / 2.0.12 / 2.0.13 均内置)—— 通过阅读安装产物并实测复现确认。@deepseek-ai/dsh-api-session-controller@0.1.7-rc.1tarball 里同样存在(同一个无保护的调用),所以最新发布线上也没修。0.1.5-rc.3与0.1.5-rc.2在客户端侧功能等价(只有构建路径和 CSS 哈希差异),升级无济于事。影响范围:所有规范化路径为 Windows 卷根的 Workspace,在每一台 Windows 主机上。
建议修法
Host(主要)。 让「确保目录存在」这一步容忍目录已存在:
try {
await mkdir(cwd, { recursive: true })
} catch (error) {
const usable = await stat(cwd).then((entry) => entry.isDirectory(), () => false)
if (!usable) {
throw new Error(
failed to ensure project directory "${cwd}": ${String(error)}, { cause: error })}
}
(
stat从node:fs/promises引入即可,无需新依赖。)等价做法:先用stat判断已是目录就跳过mkdir。客户端。 不要丢弃这个 rejection。保留原选择的同时把原因呈现出来(toast 或行内状态);至少
console.warn一下,让失败可诊断。产品决策(可选)。 明确卷根是否允许作为 Workspace 路径。若允许,补一个覆盖
C:\的 Windows 测试;若不允许,就在创建工作区时用清晰的提示直接拒绝,而不是先接受记录、等到建会话时才失败。附注
@deepseek-ai/dsh-workspace的attachSession校验(packages/workspace/workspace,判定realpathNormalize(header.cwd) === record.path)对盘根路径是完全接受的 —— 整条链路上只有 session-controller 里那个mkdir拒绝它。这正是这个失败从外面看显得莫名其妙的原因。All reactions