Skip to content

GitMate 1.10.1

Choose a tag to compare

@alanhaskey alanhaskey released this 14 Oct 01:29
· 9 commits to main since this release

修一个让插件在 Windows 上一安装就无法使用的问题。

症状

打开面板就是:

无法运行 git
could not run git here: sandbox mode "workspace-write" is requested but no sandbox backend is usable on this host … Runner failure: windows-acl-run: EPERM: operation not permitted, mkdtemp 'C:\Users\…\AppData\Local\Temp\dsh-XXXXXX'

根因:面板没有跟随会话的权限

DSH 的解析顺序是:

mode = 请求里的 mode ?? 该 session 的 sandbox/mode 覆盖 ?? 部署默认值

工具调用在 1.9.0 已经跟随会话了,但面板那条路径没有 ✗ ——它的每个请求都带着 sessionId,却没有拿它去解析策略,于是永远落到部署默认值 workspace-write。

而这台机器的 workspace-write 后端起不来(mkdtemp → EPERM,%TEMP% 不可写)——于是面板一个 git 命令都跑不了,而且用户在自己的会话里把权限设成什么都不管用 ✗

修法

面板的会话不是猜的:它就是这个会话的标签页,cwdForSession(sessionId) 一直用它解析仓库目录。现在同一个会话也用来解析权限,dispatcher 在开头选一次 core,所有端点自然沿用。

于是:把会话切到 danger-full-access(或修好 %TEMP%),面板立刻能用。

(这也修正了早先一份任务文档里的建议——它说"HTTP 请求没有 session,只能用部署默认值"。但面板的请求是带 sessionId 的,而且已经用它定位仓库;用同一个会话解析权限既不是猜测,也正是"策略属于调用方"该有的样子。)

验证

node test/smoke.mjs     # 583 项断言

新增 3 项:面板请求确实带上会话的策略、确实是从那个会话解析的、没选过模式的会话按文档的优先级回落到部署默认值。

顺带修了测试替身的一处失真:假的 session 对象没有 id,而真实的 Session 有 id,策略服务正是读它。补上之后断言立刻从 { mode: 'workspace-write' } 变成会话真正的 danger-full-access —— 也就是说,这个 bug 差点因为替身失真而测不出来。