07.1 权限与 Sandbox 基座

关注源码

  • src/utils/permissions/permissionSetup.ts
  • src/utils/permissions/permissions.ts
  • src/utils/sandbox/*
  • src/tools/BashTool/*
  • src/tools/PowerShellTool/*

权限系统的输入来源

权限上下文会综合多种来源:

  • 本地 settings
  • 用户 settings
  • policy settings
  • CLI 参数
  • session 临时更新
  • mode 约束

permissionSetup.ts 负责把这些来源折叠成 ToolPermissionContext

运行时判定不是简单 allow/deny

permissions.ts 会综合:

  • rule 命中
  • hook 结果
  • permission mode
  • classifier 决策
  • working directory 限制
  • sandbox override
  • async agent 限制

最终得到:

  • allow
  • ask
  • deny

以及精确的 decisionReason

auto mode 的安全约束

permissionSetup.ts 明确识别危险规则,例如:

  • 对 Bash/PowerShell 的过宽 allow
  • 允许任意脚本解释器前缀
  • AgentTool 的自动放行

这说明 auto mode 不是在普通权限上简单开“自动同意”,而是专门收窄了规则空间。

sandbox 的位置

sandbox 不是工具之外的外部容器,而是被接入 permission/runtime 体系:

  • SandboxManager
  • BashTool / PowerShellTool 的 shouldUseSandbox
  • sandbox permission request UI

因此“是否出沙箱”本身是一次被建模的权限决策。

设计上的关键点

1. fail-closed

当规则匹配、shell 解析或安全检查不可靠时,系统倾向于 ask/deny,而不是静默放行。

2. permission reason 是结构化对象

这让 UI、telemetry、bridge/SDK 都能解释“为什么被拦”。

3. sandbox 与权限不是两套系统

sandbox 只是权限判定链上的一个重要分支。