跳转到主要内容
状态:引擎与切换入口已落地,撞墙卡尚未接入。 边界判定(宿主写入校验 + macOS Seatbelt 包装)、失败关闭语义、会话偏好落库、以及底栏的锁标识都已可用(附单测与真机验证); 「撞墙时弹卡让你选择放行 / 记住目录」还没做——目前撞墙表现为工具错误 (模型会看到”怎么办”的提示)。默认仍是不隔离,行为与从前一致。
权限档位回答「改之前问不问」,沙箱档回答「内核允不允许」。两者正交: 审批(或 AI 审查)放行,也越不过沙箱;沙箱拒绝,连审批卡都到不了。
默认不开是刻意的:沙箱最大的风险不是被绕过,而是让正常活儿莫名失败。 先在愿意试的人身上收集误拦清单,再谈默认。

三档的语义

「工作区隔离」的放行集 = 工作区 + 你在 .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 只做文件);域名白名单是后续版本的事。
  • 沙箱是判断不了意图的:它只看路径。想让它少拦,就把该放的根加进可写根清单 (与「工作区内自动」共用同一份清单)。

下一步

沙箱和它的三个邻居:会话模式、权限档位、自动化档。