Documentation Index
Fetch the complete documentation index at: https://ccb-863780bf-feat-local-memory-vault-wiring.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
三大工具的职责分化
Claude Code 将文件操作拆分为三个独立工具——这不是功能划分,而是风险分级:| 工具 | 权限级别 | 核心方法 | 关键属性 |
|---|---|---|---|
| Read | 只读(免审批) | isReadOnly() → true | maxResultSizeChars: 100,000 |
| Edit | 写入(需确认) | checkWritePermissionForTool() | maxResultSizeChars: 100,000 |
| Write | 写入(需确认) | checkWritePermissionForTool() | maxResultSizeChars: 100,000 |
FileRead:多模态文件读取引擎
源码路径:packages/builtin-tools/src/tools/FileReadTool/FileReadTool.ts
读取去重机制
Read 工具有一个常被忽视但至关重要的去重层。当 AI 重复读取同一个文件的同一范围时,系统不会浪费 token 发送两份完整内容:- 去重仅对 Read 工具自身的读取生效(通过
offset !== undefined判定) - Edit/Write 也会写入
readFileState,但它们的offset为undefined,所以不会误命中去重 - 通过 mtime 比对确保文件未被外部修改
- 有 GrowthBook killswitch(
tengu_read_dedup_killswitch)可紧急关闭
cache_creation 的 2.64%。
多格式分发:文本、图片、PDF、Notebook 四条路径
Read 工具的callInner() 按 ext 分发到四条完全不同的处理路径:
- 先用
maybeResizeAndDownsampleImageBuffer()标准缩放 - 用
base64.length * 0.125估算 token 数 - 超出预算时调用
compressImageBufferWithTokenLimit()激进压缩 - 仍然超限时用 sharp 做最后兜底:
resize(400,400).jpeg({quality:20})
PDF_AT_MENTION_INLINE_THRESHOLD(默认值在 apiLimits.ts)时强制分页读取,每请求最多 PDF_MAX_PAGES_PER_READ 页。
安全防线
Read 工具在validateInput() 中设置了多层安全门:
- 设备文件屏蔽(
BLOCKED_DEVICE_PATHS):/dev/zero、/dev/random、/dev/tty等——防止无限输出或阻塞挂起 - 二进制文件拒绝(
hasBinaryExtension):排除 PDF 和图片扩展名后,阻止读取.exe、.so等二进制文件 - UNC 路径跳过:Windows 下
\\server\share路径跳过文件系统操作,防止 SMB NTLM 凭据泄露 - 权限拒绝规则(
matchingRuleForInput):匹配deny规则后直接拒绝
文件未找到时的智能建议
当文件不存在时,Read 不会只报一个 “file not found”:FileEdit:精确字符串替换引擎
源码路径:packages/builtin-tools/src/tools/FileEditTool/FileEditTool.ts + utils.ts
引号标准化:AI 无法输出的字符怎么办
AI 模型只能输出直引号(' "),但源码中可能使用弯引号(' ' " ")。findActualString() 函数处理了这个不对齐:
preserveQuoteStyle):如果文件用弯引号,替换后的新字符串也自动转换为弯引号,包括缩写中的撇号(如 “don’t”)。
原子性读-改-写
Edit 工具的call() 方法实现了一个无锁原子更新协议:
防覆写校验
Edit 工具在validateInput() 中检查两个条件:
- 必须先读取(
readFileState中有记录且不是局部视图) - 文件未被外部修改(
mtime未变,或全量读取时内容完全一致)
编辑大小限制
FileWrite:全量写入与创建
源码路径:packages/builtin-tools/src/tools/FileWriteTool/FileWriteTool.ts
Write 工具与 Edit 共享大部分基础设施(权限检查、mtime 校验、fileHistory 备份),但有两个关键差异:
行尾处理
LF 行尾。早期版本会保留旧文件的行尾或采样仓库行尾风格,但这导致 Linux 上 bash 脚本被注入 \r——现在 AI 发什么行尾就用什么行尾。
输出区分
Write 工具返回type: 'create' | 'update':
create:文件不存在,originalFile: nullupdate:文件存在且被覆盖,structuredPatch包含完整 diff
文件历史快照系统
源码路径:src/utils/fileHistory.ts
每次 Edit/Write 前都会调用 fileHistoryTrackEdit(),快照存储在 FileHistoryState 中:
- 最多保留
MAX_SNAPSHOTS = 100个快照 - 备份使用内容哈希去重(同一文件多次未变只存一份)
- 支持差异统计(
DiffStats:insertions/deletions/filesChanged) - 快照通过
recordFileHistorySnapshot()持久化到会话存储
LSP 通知链路
Edit 和 Write 完成写入后都会:clearDeliveredDiagnosticsForFile()— 清除旧诊断lspManager.changeFile()— 通知 LSP 文件已变更lspManager.saveFile()— 触发 LSP 保存事件(TypeScript server 会重新计算诊断)notifyVscodeFileUpdated()— 通知 VSCode 扩展更新 diff 视图
Cyber Risk 防御
Read 工具在文本内容后追加一个<system-reminder> 提示:
MITIGATION_EXEMPT_MODELS 目前包含 claude-opus-4-6)。模型级别的豁免表明:防恶意代码的判断力在不同模型间有差异,这是一个精巧的分级策略。