Skip to content

搜索工具

搜索工具家族包含 GlobTool(路径搜索)、GrepTool(内容搜索)和 ToolSearchTool(工具搜索),全部为只读操作。

注意: 以下所有工具的 call() 方法均为普通 async 函数,返回 Promise<ToolResult>,不是 AsyncGenerator。代码示例中的 yield toolResult(...) 为伪代码表示返回结果。

GlobTool — 文件路径搜索

输入 Schema

typescript
const inputSchema = z.strictObject({
  pattern: z.string().describe('Glob 模式(如 "**/*.ts")'),
  path: z.string().optional().describe('搜索起始目录,默认为工作目录'),
})

执行逻辑

  1. 解析输入的 patternpath,默认以工作目录为起点
  2. 通过 getFileReadIgnorePatterns(toolPermissionContext) 获取忽略模式(基于 deny read 规则动态生成)
  3. 调用 glob() 函数,内部使用 ripgrep --files --glob 模式列举文件
  4. 结果限制为 100 个文件,超出时标记 truncated

忽略模式

typescript
// 不是硬编码常量,而是由权限系统动态生成
const ignorePatterns = getFileReadIgnorePatterns(toolPermissionContext)
// 返回 Map<string | null, string[]>  — 基于 deny read 规则
const normalized = normalizePatternsToPath(ignorePatterns, searchPath)

GrepTool — 文件内容搜索

输入 Schema

typescript
const inputSchema = z.strictObject({
  pattern: z.string().describe('搜索的正则表达式模式'),
  path: z.string().optional().describe('搜索起始目录'),
  glob: z.string().optional().describe('文件过滤模式 (rg --glob),如 "*.ts"'),
  output_mode: z.enum(['content', 'files_with_matches', 'count']).optional(),
  '-B': z.number().optional(),   // 匹配前的上下文行数
  '-A': z.number().optional(),   // 匹配后的上下文行数
  '-C': z.number().optional(),   // context 别名
  context: z.number().optional(), // 匹配前后的上下文行数
  '-n': z.boolean().optional(),  // 显示行号,默认 true
  '-i': z.boolean().optional(),  // 忽略大小写
  type: z.string().optional(),   // 文件类型 (rg --type),如 js, py
  head_limit: z.number().optional(), // 限制输出行数,默认 250
  offset: z.number().optional(),     // 跳过前 N 行/条目
  multiline: z.boolean().optional(), // 多行模式 (rg -U)
})

执行逻辑

  1. 解析输入的 patternpathglob 等参数
  2. 根据输入参数构建 ripgrep (rg) 命令参数
  3. 调用 ripGrep()(来自 utils/ripgrep.ts)执行搜索
  4. 返回格式化结果

输出格式

src/tools/BashTool/index.ts
  42: const DANGEROUS_PATTERNS = [
  43:   { pattern: /rm\s+(-rf?|--recursive)/, reason: '递归删除' },
  44:   { pattern: /sudo\s/, reason: '提权操作' },

src/tools/BashTool/helpers.ts
  15: function checkDangerousPatterns(command: string) {
  16:   for (const { pattern, reason } of DANGEROUS_PATTERNS) {

ToolSearchTool — 工具搜索

输入 Schema

typescript
const inputSchema = z.object({
  query: z.string().describe('搜索查询词。使用 "select:<tool_name>" 直接选择,或关键词搜索'),
  max_results: z.number().optional().default(5)
    .describe('返回结果数量,默认 5'),
})

执行逻辑

使用关键词评分和正则匹配搜索可用工具。支持 select:<name> 直接选择模式。无独立的 fuzzyMatch 函数。

搜索性能优化

优化工具效果
ripgrep (rg)GrepTool比 grep 快 10-100x,支持 PCRE2
结果上限全部防止超长输出
忽略列表GlobTool跳过 node_modules 等大目录
文件大小限制GrepTool跳过大于 1MB 的文件
并发安全全部isConcurrencySafe()=true,可并行搜索