Replies: 1 comment 1 reply
|
源码验证过(rc.7 1. 机制确认。 2. 补丁落点判断:provider 侧重建是对的,别改 runner 侧。 runner.ts:118-119 的注释是设计意图:"provider 传错根目录必须在 runner 边界大声失败"——这是有意为之的边界校验。若改成 runner 侧"不存在则创建",会弱化这个边界(provider 传了错路径却被静默"修复")。你的补丁(缓存命中分支加 existsSync + mkdirSync recursive 重建)正好把修复放在 provider 侧,保留 runner 的 fail-loud 语义——正确。补充一点:重建后无需重新授权(你已指出 runner 每次调用重新 grantWrite temp SID),且新目录继承原 grant 路径——安全。 3. 家族:#3190 + #3203 = "外部 OS 临时目录清理破坏运行中 dsh" 两报,两个子系统:
共同根:运行期持有的进程私有临时目录对外部清理无防护。Windows 磁盘清理/第三方清理工具是常见触发源。修复模式应该统一为"在目录被消费的边界处遇缺失即重建"——你的补丁就是沙箱侧的实例;#3190 侧 spillAll 应在 ENOENT 时重建 spill 目录(或捕获降级),而不是让未捕获异常炸掉整个进程。 4. 通用加固建议(家族级):这两个子系统之外,任何 两报都带完整复现 + 根因 + 修复草案,质量很高。#3190 值得从这边链接过去(同族),若你愿意也可以顺手在 #3190 贴你的补丁模式作为参考。 |
Uh oh!
There was an error while loading. Please reload this page.
我没有找到正式的Bug提交位置,如果写在这里不对,还请谅解,谢谢!
windows-acl 沙箱临时目录被外部清理后不会自动重建,沙箱命令持续报错,直到重启服务进程。
复现、预期与验收
pnpm install+pnpm run build+dsh web),进入任意会话%TEMP%下已生成dsh-<6 位随机字符>目录Remove-Item -Recurse -Force,或磁盘清理工具)windows-acl-run: --temp is not an existing directory: C:\Users\???\AppData\Local\Temp\dsh-qM9mIf;沙箱 fail-closed(拒绝非受限运行),服务进程存活期间所有沙箱命令不可用,只能重启恢复%TEMP%\dsh-*后,下一次沙箱调用自动恢复(目录重建且命令成功),无需重启服务根因分析
packages/sandbox/sandbox-local/src/index.ts的materializeAclGrant()为每个 (sessionId, workspaceRoot) 组合用mkdtempSync(join(tmpdir(), 'dsh-'))创建临时目录,并缓存复用(this.tempCapabilities),仅在 provider dispose 时删除;没有任何「目录缺失则重建」的逻辑。packages/sandbox/sandbox-windows-acl/src/runner.ts:109-113的requireDirectory()每次调用校验--temp必须存在,否则fail(...)(错误前缀windows-acl-run:)并以 127 退出(WINDOWS_ACL_RUNNER_FAILURE_EXIT,sandbox-local/src/index.ts:216)。%TEMP%是常规清理目标(磁盘清理、手动清理、第三方软件),固定名目录被删后即触发上述失败链。建议修复(已本地应用并通过 tsc 构建)
在缓存命中分支补一个存在性检查与重建。安全性:runner 每次调用都会重新授予 temp SID 写权限(
grantWrite),因此重建空目录是安全的、无需重新授权;路径随机且无敏感内容,无安全影响。备选方案:
影响面与次生症状
spill-local会在该目录下创建dsh-spill-*子目录(spill-local 的私有根),父目录缺失时同样失败(本次排查中曾观察到隐藏服务器崩溃);主目录修复后一并恢复tsc构建(修复进入lib/index.js);因 Node 模块缓存,需重启服务进程后做端到端验证最后说明:问题是我在使用过程碰到的,写修复建议和方案的是DeepSeek-Harness以及DeepSeek-V4-Flash(High)这两位,也算是原汤化原食了!
All reactions