Repository navigation
Windows:官方 SDK runtime 在默认配置下 pwsh 工具全灭——且沙箱故障被误报为命令自身的失败 #5809
Replies: 1 comment
|
我在自己的 fork 里把这条链核了一遍,你的定位是对的,几个关键点补充确认一下:
两个让这个问题格外隐蔽的点: 一是 win32 链只有一个候选。 二是失败签名对不上。windows-acl 的 runner 故障契约是 exit 127 加 修复上我倾向于两个方向: 1)治误报,可以单独先合:把 dsh CLI 的参数拒绝签名( 2)治本:Node 22.9+ 有官方的 我在 macOS 上,Windows SEA 没法真机跑,所以 fork 分支能覆盖的是源码级修复和测试设计,真机验证还是得靠 Windows 环境。 |
Uh oh!
There was an error while loading. Please reload this page.
Windows:官方 SDK runtime 在默认配置下 pwsh 工具全灭——且沙箱故障被误报为命令自身的失败
概要
在 Windows 上,官方 pip 安装的 SDK + 默认配置,
pwsh工具 100% 调用失败——包括Write-Output hi这种最简单的命令——每次失败都是同一副样子:命令根本没有执行。根因:单文件(SEA)runtime 下,沙箱 runner 以
[process.execPath, runner.js, ...]方式启动(packages/sandbox/sandbox-local/src/index.ts:557-563),而此时process.execPath是 runtime exe、其入口是 dsh CLI——runner 路径被当成 CLI 参数解析,在apps/cli/src/args.ts:140被拒绝。"process.execPath 能像 node 一样执行 JS 文件"这个假设在 npm/开发部署下成立,在 SEA exe 下不成立。当前不存在任何能让 confinement 在 SEA runtime 下工作的配置。唯一出路是
DSH_PERMISSION_MODE=danger-full-access,而它会整体关闭 confinement——Windows 嵌入式用户被迫在 "shell 工具不可用" 和 "安全机制全关" 之间二选一。环境
resolvePwshPath()解析成功)deepseek-harness-sdk/deepseek-harness-runtime-bin0.1.2rc1(PyPI)origin/master(0.1.3-alpha.1):windowsAclRunnerInvocation()逐字相同复现
无需模型——直接 spawn 沙箱服务拼出的 argv:
Agent 层:任意
DeepSeekHarness(默认 profile、无 patch)让它跑一条 pwsh 命令,工具结果就是同样的错误。默认组合必然踩中:dsh-base在 win32 挂载pwsh-sandbox,sandbox-policy默认workspace-write。误报
sandbox-local的 README 承诺:"When no runner is usable the provider fails closed withSANDBOX_UNAVAILABLE— a command never silently runs unconfined." runner 故障按契约签名(exit 127 + stderr 含windows-acl-run:)分类。SEA 下的失败表现为 exit 1 + commander 报错文本,签名永不匹配——沙箱自身的故障被报告给模型,伪装成命令自身的失败。从 agent 视角看连Write-Output都"失败",且错误指向 dsh CLI 配置而非沙箱——外部排查极其困难。唯一的绕过会关闭全部 confinement
DSH_PERMISSION_MODE=danger-full-access是唯一逃生口,而代价是一次性失去全部:SandboxPwshExecutor.run()在confine()之前短路;每条命令——及 agent spawn 的每个进程——以宿主用户完整权限运行(工作区外任意写入、不受限网络)。dsh-base把 approval 策略绑在同一个变量上(full-access 下为'never')。于是 Windows 嵌入式用户只能在 "永远坏掉的 shell 工具" 和 "无任何安全机制地跑 agent" 之间选。评测 harness 场景更尖锐:本应由沙箱机械强制的边界(把 agent 挡在它不该读的文件之外)退化为仅存于提示词的约束。
这是受支持的使用路径吗?
是的——
sdk-minimal硬编码了sandbox-policy.mode: danger-full-access(packages/bundle/sdk-minimal/cordis.patch.yml),说明嵌入式场景跑 full-access 是团队已知且有意设计的模式。但 fullsdkprofile 是 SDK 文档化的默认(README 第一个示例就是它,配了一条必须用 shell 的提示词),且需要完整工具面(skills、subagents)的负载用不了sdk-minimal。因此 fullsdk+ SEA runtime + Windows 是受支持、有文档——但默认即坏——的组合。SDK 的全部测试都以 full-access 启动(python/sdk/tests/test_bundled_runtime.py:40,79、manual_sdk_agent_smoke.py:72),这大概就是默认路径的损坏未被察觉的原因。可应要求提供完整 traces(DSH 会话日志、最小复现脚本)。
All reactions