Replies: 2 comments
|
我在同步到 0.1.5 线的 master( 一、比报告更严重:不是"偶发",是"结构性不可能"
export const WIDER_MODES: Record<string, readonly SandboxMode[]> = {
'read-only': ['workspace-write', 'danger-full-access'],
'workspace-write': ['danger-full-access'],
}
关键在于:工具在 更彻底的是: 顺带一个会放大死锁的细节: 二、报告的补丁会踩两个坑坑 1:置顶早返回会把"降级"也放行。 你的写法在 await expect(approveEscalation(req({ requestedMode: 'workspace-write', effectiveMode: 'danger-full-access' as never }), spy))
.rejects.toThrow(/not strictly wider/)同一个测试用例在 坑 2:光这一行还不够,还有两个前置闸门。
三、一个可能更好的落点:schema 投影,而不是放宽校验
代价是 schema 里那个 四、插件面:能做一半,但不建议做因为我要给"这缺口该不该走插件"一个明确答复: 唯一可及的窄用法是 五、一句话你的判断对,且比报告更硬:当前 full access 下任何 |
|
非常感谢 @argszero 如此详尽且一针见血的源码级梳理与边界分析! 完全赞同你的结论与重构方向:
期待 upstream-fix 的推进与合入! |
Uh oh!
There was an error while loading. Please reload this page.
问题背景
在基于
@deepseek-ai/dsh-sandbox与各执行工具(@deepseek-ai/dsh-tool-pwsh、@deepseek-ai/dsh-tool-bash、@deepseek-ai/dsh-tool-fs)的编排场景中,当运行环境、会话或 Standing Policy 已处于最高权限danger-full-access时,模型调用工具(如pwsh或edit)偶发会附带冗余权限升级参数(例如再次申请danger-full-access,或在上下文飘移时传了较低的workspace-write)。异常表现
当前
packages/sandbox/sandbox/src/escalation.ts中的校验逻辑如下:由于
WIDER_MODES['danger-full-access']定义为空数组[],任何升级请求进入approveEscalation时:danger-full-access:判定为非 strictly wider,直接抛出sandbox escalation to "danger-full-access" is not strictly wider than this call's current "danger-full-access" mode;workspace-write:判定为降级,同样抛错拒绝。在实际执行中,该错误抛出后被模型捕获并触发
repeat-tool-reminder。由于模型已经处于 full access,它再次调用工具时依然容易携带默认的写权限参数,导致连续十几轮not strictly wider报错死锁,无法继续执行正常任务。预期行为
当
effectiveMode已经是系统预设的最高权限danger-full-access时,进一步的 escalation 请求属于已被完全覆盖的冗余操作(NOOP / Idempotent),不应 fail-closed 阻断调用,而应直接放行并保持danger-full-access模式执行,避免阻断合法工作流。建议修复方案
在
approveEscalation()检查入口增加早返回(并建议对未知的effectiveMode保持 fail-closed):同时,工具端参数解析(如
tool-pwsh/tool-bash的validateEscalationArgs)在 Standing Policy 为danger-full-access时,也可相应放宽对冗余参数成对性(如空白 justification)的硬性阻断,避免模型因模板参数残留而报错。All reactions