Repository navigation
/permission 切换失败在界面上不可见,且被拒的切换会留下名不副实的 preset 记录 #8770
KhalilYamber
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Summary
在会话里点输入框左下角的权限胶囊选「仅可查看」时,如果宿主拒绝了这次切换(最常见的原因是该会话还挂着常驻终端),界面上不会有任何提示:胶囊标签纹丝不动,用户看到的就是「点了没反应」。同时,这次被拒的切换会往会话日志里留下一条与实际不符的
permission/preset记录,每次重试都会再追加一条。Reproduction
预期:应当看到宿主给出的拒绝原因。
实际:标签纹丝不动,且没有任何可见提示。
Current behavior
command/done错误记录(cannot change sandbox mode from "workspace-write" to "read-only" while persistent terminal sessions are open or being created; ...),位置不显眼,文案也没有本地化。permission/preset { preset: "read-only" },而sandbox/mode仍是workspace-write。连续点 8 次就有 8 条这样的记录。current()由 knobs 推导,界面回落到「工作区内修改」,于是用户会继续点,脏记录继续累积。Expected behavior
permission/preset记录。Environment
dsh-v0.2.0-rc.2,Windows x64,桌面版与 Web 界面均可复现。Root cause
packages/client/ui-permission-presets/src/client/PermissionSelect.tsx:122-127用void select(id).catch(() => false)吞掉异常;更深一层,ISession.command()的契约只有{ matched: boolean }(packages/api/session-controller/src/client/sessions/session.ts:387-391),host handler 返回kind: 'error'时依然是ok + matched = true,所以调用方从返回值上根本区分不出「切换成功」与「宿主业务拒绝」。packages/interaction/permission-presets/src/index.ts的apply():knobs 写被门禁拒绝时,第一步已经落盘。
补一句:
terminal-bash的拒绝本身是设计内门禁(packages/terminal/terminal-bash/src/index.ts:51-61:owner 还有活着的 PTY 时禁止任何sandbox/mode变更),这一条不是缺陷;要修的是「不可见」与「写入只做一半」。Suggested fix(已在本地验证)
apply()顺序对调,knobs 先写、身份事件后写,改动 4 行:被拒的切换从此不落任何记录,
permissionPresets.set()与/permission两条路径同时受益。ISession.command()返回命令结果({ matched, result }),胶囊在result.kind === 'error'时把result.text显示到手边;command/executed(packages/client/ui-commands/src/client/service.ts:46-59、:409-433),命中name === 'permission' && result.kind === 'error'时给出可见提示。(本机已按这条路做了一个第三方客户端插件,验证可行。)Verification
terminal-bash相同的internal/dispatch接缝模拟拒绝,断言会话日志没有被写入。All reactions