环境
- OS: Windows,native win32(非 WSL)
- 产品: TRAE SOLO CN(内置 DSH
@deepseek-ai/dsh0.2.0-rc.2,即 npmlatest) - 宿主: 由 TRAE 桌面应用启动的 Web GUI(无控制台宿主),地址 http://127.0.0.1:3080
- 工具:
pwsh
现象
Agent 的 pwsh 工具每次调用立即失败,命令体从未执行:
Error: subprocess-local: Windows Job runner exited with exit code 0 before proving its managed range empty
代码块
自动换行
复制
命令体确实没有运行——用「写探针文件」验证:命令首条语句写 Set-Content,前台与后台执行后探针文件均不存在。因此不是"执行了但输出丢失",而是启动阶段就失败。
同类表现:glob / grep 报 ripgrep provider failure;文件写入报 EPERM: operation not permitted, mkdir '<workspace>\.<name>.<pid>.<uuid>.tmpdir'。即所有依赖子进程的能力全部不可用,仅「读文件」与「联网」正常。
复现
对 pwsh 工具发送任意命令,包括最小命令:
Write-Output “hello”
代码块
自动换行
复制
100% 复现(本轮排查连续 8 次以上,无一例外)。
已排除的因素
| 假设 | 测试 | 结果 |
|---|---|---|
| 权限模式相关 | workspace-write 与 danger-full-access 两种模式下测试 |
错误完全相同 |
| 会话状态残留 | 彻底结束进程后重启(GUI 端口 5174 → 3080) | 完全复现 |
| 工作区 ACL 缺失 | 曾诊断出工作区根目录缺 WRITE_OWNER,用权限修复脚本修好(验证 writeDac: true, writeOwner: false → true,verdict verified) |
该 ACL 错误消失,但本错误依旧 |
| 后台执行通道 | run_in_background: true |
同样失败,status: killed, killed before exit |
技术推断
依据 dsh-subprocess-local 文档,Windows 普通子进程路径会启动一个私有 Job runner(挂起创建 target → 加入 Job Object → 恢复运行),并保留 runner 与一条 IPC 通道,直到 Job 报告活动进程数为零;waitForExit() 需独立证明该 managed range 已空。
当前错误表明:runner 以退出码 0 提前退出,早于 managed range 被证明为空,前台执行因此判定 runner 失败并抛错(符合文档中「runnerFailed:命令运行前沙箱 runner 已失败,前台执行会抛出」的约定)。
可疑点:证明范围为空依赖 src/windows-inspector.ts(经 koffi 调用 Toolhelp32 枚举进程表),以及 Windows Job/ACL runner 在 Node 初始化前通过 CRT 启动表建立 fd 3–7 的私有 IPC 通道;任一在本环境失效都会产生该症状。宿主为无控制台桌面启动路径。
影响
该包无任何配置项,用户侧没有任何可用的开关或变通;权限策略在原理上也无法解决。目前所有 shell 工具完全不可用,阻塞任何需要执行命令或写文件的任务。
参考
上游同类 Windows 问题讨论:#3428、#810