[Bug/修复建议] 会话中途切换 Full access 必定失败:持久 bash 存活时护栏无差别拦截,preset 半提交变 Custom #2226
Replies: 5 comments
|
+1 不过我叫ai写了个小插件解决这个问题 https://github.com/12362566/dsh-exit-bash |
|
+1,遇到完全相同的问题,补充我这边的复现和验证。 环境:WSL2 (Ubuntu) + 官方 web 组合,会话默认 现象:
验证过的 workaround:让 agent 在 bash 工具里执行 修复建议(优先级排序):
另外这个帖子和 #523 看起来不是同一个问题(#523 是 minimal preset 在 Windows 越权写入的安全问题),建议重新归类,避免这个 UX/状态一致性 bug 被重复标记埋掉。 |
|
补充复现:0.1.5-rc.1 上仍然存在,且失败在 Web UI 层完全静默 环境:dsh 排除前端因素,直接调 host 的 session 日志证据链与楼主一致: 两点补充:
workaround 这边也确认:让 agent 在 bash 里执行 同族:#6429( |
Uh oh!
There was an error while loading. Please reload this page.
环境
0.1.0-rc.6(涉及包:@deepseek-ai/dsh-terminal-bash、dsh-permission-presets、dsh-client-ui-permission-presets、dsh-tool-bash-persistent),macOS@deepseek-ai/dsh-tool-bash-persistent(持久bash工具);与客户端形态无关,官方 web 组合该包后同样复现复现步骤
workspace-write+askbash命令——此后该 agent 一直持有存活的持久 shell(PTY)/permission弹窗切换到 Full accessCustom错误信息:
根因(源码 + 会话日志定位)
dsh-terminal-bash的ensureSandboxModeFence():只要 owner 有存活 PTY,任何sandbox/mode变化都会在internal/dispatch中抛错——护栏不区分「放宽」与「收紧」方向。但放宽方向其实无需拦截:旧 shell 只是不能继续用,杀掉后下次调用会按新模式重建(与现有超时重置同一路径)。dsh-permission-presets的apply()先 appendpermission/preset事件、再setSandboxMode()/setApprovalPolicy()。setSandboxMode被护栏抛错后,preset 事件已写入日志、两个 knob 却没变——选择器于是推导出custom,留下一个既不是旧预设也不是新预设的悬挂状态。command/run (permission danger-full-access)→permission/preset: danger-full-access→command/done kind:"error"。用户视角的体感:会话中途想从「边确认边写」切到 Full access,怎么点都改不了。
修复建议
workspace-write→danger-full-access):重置该 owner 的持久 shell 后放行;下次bash调用按新模式的 argv 重建(可复用现有超时重置路径)sandbox/mode写入失败时回滚permission/preset,避免custom悬挂态/permission弹窗在选项阶段检测存活 PTY,直接置灰并说明原因,而不是双确认后才失败已验证的本地补丁(rc.6)
打补丁后原场景一次切换即成功,下次
bash自动以新沙箱参数重建 shell;收紧方向仍被正确拦截。如果方向上认可,我可以按这个思路提 PR(会按仓库源码结构移植,而非直接改构建产物)。
All reactions