BashTool:标签最重要的那把工具

Bash 是权限检查最复杂的工具,因为一个命令可以做几乎任何事。src/tools/BashTool/BashTool.tsx 实现了它。

超时与中断策略

// src/tools/BashTool/BashTool.tsx
const PROGRESS_THRESHOLD_MS = 2000      // 2 秒后显示进度指示器
const ASSISTANT_BLOCKING_BUDGET_MS = 15_000  // 主 Agent 中最多阻塞 15 秒

两个常量控制用户体验:

  • 命令执行超过 2 秒,界面显示进度指示器,让用户知道在等什么
  • 在主 Agent 线程里,超过 15 秒的命令自动移入后台任务(见第A节:核心对话引擎 AgentTool 的后台任务路由)

命令分类(读 / 搜索 / 列目录)

// src/tools/BashTool/BashTool.tsx
const BASH_SEARCH_COMMANDS = new Set(['find', 'grep', 'rg', 'ag', ...])
const BASH_READ_COMMANDS = new Set(['cat', 'head', 'tail', 'jq', 'awk', ...])
const BASH_LIST_COMMANDS = new Set(['ls', 'tree', 'du'])
const BASH_SEMANTIC_NEUTRAL_COMMANDS = new Set(['echo', 'printf', 'true', 'false', ':'])

这个分类决定命令在 UI 上是否"折叠显示"——搜索、读取、列目录操作属于低价值信息,默认收起,用户点击才展开。这减少了界面噪音。

管道命令(cat file | grep pattern)只有当所有子命令都属于同一类型时,才整体折叠。一旦其中有写入操作,整条命令都不折叠。

权限检查

BashTool 的权限检查(src/tools/BashTool/bashPermissions.ts)不是简单的字符串匹配,而是先做语法解析:

// src/tools/BashTool/bashPermissions.ts
import { parseForSecurity } from '../../utils/bash/ast.js'
import { classifyBashCommand } from '../../utils/permissions/bashClassifier.js'

parseForSecurity 把命令字符串解析成 AST(抽象语法树),再检查每个节点是否符合规则。这防止了绕过检查的技巧,比如用变量、heredoc 或子 shell 隐藏真实命令。