---
title: Patch Tool 模糊补丁工具
created: 2026-04-16
updated: 2026-04-16
type: entity
tags: [tool, agent]
sources: [packages/backend/src/modules/netaclaw/tools/builtin/patch.ts, packages/backend/src/modules/netaclaw/tools/fuzzy_match.ts]
---

# Patch Tool 模糊补丁工具

## 概述

文件局部查找替换工具，支持 9 级模糊匹配。比 `write_file` 更安全（只改局部）、更省 token（不需要传完整文件内容）。注册在 [[tool-catalog]] 的 `base` 工具集。

## Schema 定义（TypeBox）

```typescript
const PatchParams = Type.Object({
  path: Type.String({ description: '文件绝对路径' }),
  old_string: Type.String({ description: '要查找的文本片段' }),
  new_string: Type.String({ description: '替换为的文本' }),
  replace_all: Type.Optional(Type.Boolean({ description: '替换所有匹配，默认 false' })),
});
```

## 执行流程

1. 读取目标文件内容
2. 调用 `fuzzyFindAll()` 进行模糊匹配
3. 验证匹配结果（0个报错 / 多个且非 replace_all 报错 / 唯一通过）
4. 从后往前替换（避免索引偏移）
5. 写回文件

## 9 级模糊匹配引擎

**文件**: `tools/fuzzy_match.ts`（~304行）

| 级别 | 策略 | 说明 |
|------|------|------|
| 1 | `exact` | 精确字符串匹配 |
| 2 | `line_trimmed` | 每行 trim 后匹配 |
| 3 | `whitespace_normalized` | 所有空白压缩为单空格 |
| 4 | `indent_flexible` | 去除行首缩进 |
| 5 | `escape_normalized` | 转义字符还原（`\n` → 换行） |
| 6 | `trimmed_boundary` | 首尾行 trim |
| 7 | `unicode_normalized` | Unicode 标点归一化（智能引号等） |
| 8 | `block_anchor` | 首尾行锚定 + 中间相似度 |
| 9 | `context_aware` | 逐行相似度滑动窗口 |

**核心算法**: Levenshtein 编辑距离 → `similarity = 1 - (distance / maxLen)`

**返回结构**:
```typescript
interface FuzzyMatchResult {
  strategy: string;     // 匹配策略名
  startIndex: number;   // 原始文本起始位置
  endIndex: number;     // 原始文本结束位置
  matchedText: string;  // 匹配的原始文本
}
```

## 关联页面

- [[tool-catalog]] — 工具目录系统（注册在 base 工具集）
- [[tool-system]] — 工具系统总览
- [[agent-runtime]] — Agent 运行时执行
