状态:引擎与切换入口已落地,撞墙卡尚未接入。 边界判定(宿主写入校验 + macOS Seatbelt
包装)、失败关闭语义、会话偏好落库、以及底栏的锁标识都已可用(附单测与真机验证);
「撞墙时弹卡让你选择放行 / 记住目录」还没做——目前撞墙表现为工具错误
(模型会看到”怎么办”的提示)。默认仍是不隔离,行为与从前一致。
默认不开是刻意的:沙箱最大的风险不是被绕过,而是让正常活儿莫名失败。 先在愿意试的人身上收集误拦清单,再谈默认。
三档的语义
「工作区隔离」的放行集 = 工作区 + 你在
.kova/permissions*.json 里记过的可写根 +
平台临时目录 + 工具链缓存白名单(~/.bun/install/cache、~/.npm、~/.cache、
~/.cargo/registry、~/Library/Caches、~/Library/pnpm、~/.yarn/berry/cache、
~/go/pkg/mod、~/.gradle/caches、~/.m2/repository 等)。少一条就有工具链命令
装不上——这是沙箱最常见的”莫名失败”来源。
两条固定规则:
- 读一律放开。只读档是”不能写”,不是”不能看”——它不是机密性隔离(要防读是另 一个课题)。
.env/.env.*/*.pem/*.key永不落盘(denyWrite 硬拒绝,连审批都不给)。
边界是怎么执行的
判定顺序是 deny → allow → 拒绝;不在放行集里的写入会被拒绝,工具错误里带着
可行动的信息(“写进工作区”或”去设置里加可写根”),模型可以自己改道。
失败关闭
沙箱起不来(缺ripgrep、平台不支持、profile 生成失败)时,命令不执行,并把
原因与出路回给你——绝不当成”没沙箱就裸跑”。宁可这一步失败,也不要”以为隔离了、
实际没有”。
与其它两套机制的关系
- 审批(变更前确认 / 工作区内自动 / 自动编辑)决定”要不要问你”;
- AI 审查决定”由模型代替你判”;
- 沙箱决定”就算放行了,能写到哪”。
怎么切
底栏(输入框下方)那排控件里,权限选择器右边有一枚锁:锁上=工作区隔离,闭合的锁 (蓝)=只读,开锁=不隔离。点它即可切换——切的是会话级偏好,刷新/重启后保留; 新会话跟随你最近一次的选择。full-access 是默认态,所以要真正启用隔离,得先切一次。
已知边界
- P0 只有 macOS 做子进程隔离;其它平台选了工作区隔离会如实报错,而不是假装隔离。
- MCP 服务器进程目前不在包装范围内(P0);
write/edit与 bash 都在。 - 网络不设限(P0 只做文件);域名白名单是后续版本的事。
- 沙箱是判断不了意图的:它只看路径。想让它少拦,就把该放的根加进可写根清单 (与「工作区内自动」共用同一份清单)。
下一步
沙箱和它的三个邻居:会话模式、权限档位、自动化档。
