Pi :内置四工具源码拆解——文件锁、变更快照与 bash 隔离
源码目录packages/agent/src/harness/tools/。〇、先看共同底座ExecutionToolContext/env四个工具没有一个直接碰 Node 的fs或child_process。它们全部通过注入的envExecutionEnv操作文件系统、执行命令// tools 看到的操作面env.readTextFile(path,signal)env.readBinaryFile(path,signal)env.writeFile(path,content,signal)env.fileInfo(path,signal)env.absolutePath(path,signal)env.canonicalPath(path)env.runCommand(...)// bash 工具走的命令执行这个抽象有三个直接收益可测试单测注入内存版 env不碰真实文件系统可隔离Gondolin 模式专项四把read/write/edit/bash全部路由进微 VM靠的就是工具只认 env 接口不认 OS——换一个远端 env 实现工具代码一行不改可审计所有文件操作都过一个口可以在 env 层统一打点。这是工具层与操作系统解耦的标准姿势——你的 Java 工具也应该定义FilePort/CommandPort接口而不是直接在工具里new FileOutputStream()。一、readoffset/limit 分页 图片 输出有界read的 schematool-read.tsconstreadSchemaType.Object({path:Type.String({description:Path to the file to read (relative or absolute)}),offset:Type.Optional(Type.Number({description:Line number to start reading from (1-indexed)})),limit:Type.Optional(Type.Number({description:Maximum number of lines to read})),});三个细节值得抄① 输出有界且明确告诉模型怎么读完。工具描述原话For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.“输出截断 指引模型用 offset 继续读完”——Pi 把怎么处理大文件写进工具描述模型按指引自动分页。② 图片是一等输入。read支持 jpg/png/gif/webp/bmp读图走imageProcessor转成{type:image, data, mimeType}内容块直接作为附件发给模型。返回的提示里甚至带hints图片处理器的建议比如这张图可能被裁剪了。③ 路径解析做了 Unicode 容错path-utils.tsconstvariants[resolved,resolved.replace(/(AM|PM)\./gi,${NARROW_NO_BREAK_SPACE}$1.),// 全角空格resolved.normalize(NFD),// 音标字符分解resolved.replace(//g,’),// 直引号→弯引号];模型可能把文件路径里的全角空格、直引号、Unicode 组合字符搞混read会逐个变体尝试。模型输出文件路径是不可靠的工具端要做模糊匹配 容错。二、write创建父目录 字节数回执writetool-write.ts很薄但有一个行为值得注意description:Write content to a file. Creates the file if it doesnt exist, overwrites if it does. Automatically creates parent directories.自动创建父目录返回Successfully wrote ${content.length} bytes to ${path}。content.length是字符数不是字节数但这不耽误模型理解写入了多少。write 是整个工具集里最直白的它真正的复杂度在锁。三、edit精确文本替换附带变更快照edittool-edit.ts是四个工具里工程含量最高的。schemaconsteditSchemaType.Object({path:Type.String(...),edits:Type.Array(Type.Object({oldText:Type.String({description:Exact text for one targeted replacement. It must be unique in the original file...}),newText:Type.String({description:Replacement text for this targeted edit.}),}),{description:One or more targeted replacements. Each edit is matched against the original file, not incrementally...}),});执行流水线去掉样板后const{bom,text:content}stripBom(readResult.value);// ① 去 BOMconstoriginalEndingdetectLineEnding(content);// ② 检测换行符constnormalizedContentnormalizeToLF(content);// ③ 统一成 LFconst{baseContent,newContent}applyEditsToNormalizedContent(normalizedContent,edits,path);constfinalContentbomrestoreLineEndings(newContent,originalEnding);// ④ 还原换行符awaitenv.writeFile(absolutePath,finalContent,signal);constdiffResultgenerateDiffString(baseContent,newContent);// ⑤ 生成 diff 快照return{content:...,details:{diff,patch:generateUnifiedPatch(...),firstChangedLine}};五个要点先规范化再编辑编辑完还原BOM、CRLF/LF 先剥掉/统一替换完再还原。否则模型用 LF 的 oldText 匹配 CRLF 文件会失败。每个 oldText 必须唯一、且互不重叠“It must be unique in the original file and must not overlap with any other edits[].oldText”——schema 层就挡住模糊替换。edits 全部针对原文件匹配不增量匹配“Each edit is matched against the original file, not incrementally”——避免前一个编辑改变行号影响后一个。返回 diff/patch/firstChangedLine这就是文件变更快照。模型、UI、审计都能看到这次编辑到底改了什么。generateUnifiedPatch给出统一 difffirstChangedLine定位首行变化。兼容层prepareArguments老格式的{oldText, newText}被折叠成新的edits数组——工具 schema 演进不破坏历史调用。对比很多 Agent 用整文件重写改文件Pi 的 edit 是精确补丁 快照——副作用最小、可 diff、可回滚。四、文件锁按规范路径串行化变更file-mutation-queue.ts实现的是同一文件上的变更串行化——这是文件锁的 Promise 版本constkeyawaitgetMutationQueueKey(env,path);// 规范路径作为锁 keyconstcurrentQueuestate.queues.get(key)??Promise.resolve();// 排队当前队列完成后才轮到下一个constchainedQueuecurrentQueue.then(()nextQueue);state.queues.set(key,chainedQueue);awaitcurrentQueue;try{returnawaitfn();}finally{releaseNext();...}细节锁粒度 规范路径canonical path不是传进来的字符串。../a.md和a.md、符号链接和真实路径会归到同一个锁——按规范路径加锁才挡得住同文件不同路径的并发编辑。锁作用域 单个envWeakMapExecutionEnv, ...。不同 env比如 Gondolin 的远端 env各归各的。为什么需要它一个 turn 里可能有多个工具调用batch两个 edit 同时改同一个文件读-改-写会互相覆盖。文件锁把读原文件 → 应用编辑 → 写回变成同一路径上的原子操作。这是Agent 改代码场景最容易翻车的地方并发写同一文件。你在 Java 里做工具层时务必有同款按规范路径串行化文件变更的机制。五、bash隔离、捕获、会话环境注入bash 工具tools/bash.tsshell-output.ts是权限最大、最需要防护的工具。它的设计① 输出捕获 双限截断。命令输出边跑边攒超限即截断constmaxOutputBytesDEFAULT_MAX_BYTES*2;// 100KB 上限// 截断到尾部 N 行 / N KB谁先到算谁截断结果带完整元信息truncate.ts的TruncationResulttruncated / truncatedBy / totalLines / totalBytes / outputLines / lastLinePartial并且完整输出落临时文件fullOutputPath——模型需要时再读全文主上下文只留尾部。② 输出净化sanitizeBinaryOutput过滤掉二进制控制字符只保留 tab/换行/回车防止二进制输出污染上下文。③ 超时显性化timeout 可选、无默认但受MAX_TIMEOUT_SECONDS硬上限约束超时以错误返回“Command timed out after N seconds”——模型能看到并决定怎么办。④ 会话环境注入environment-variables.mdbash 工具运行的命令会拿到当前会话状态PI_SESSION_ID 当前会话 ID PI_SESSION_FILE 会话 JSONL 路径临时会话为空 PI_PROVIDER 当前 provider PI_MODEL 当前模型 PI_REASONING_LEVEL 当前推理级别命令可以据此自查“我在哪个会话、用什么模型跑的”——这是 agent 自我感知能力的底座。spawnHook可以再改 env比如注入 CI1exposeSessionEnvironment: false关闭注入。⑤ 命令执行本身走 env 抽象runCommand所以 bash 同样可以被 Gondolin 路由进 VM——这就是工具隔离的实现路径bash 不是在进程里开 shell而是向 env 端口提交一个命令。六、对照你的工程四工具的移植清单Pi 的机制你要不要做说明env 抽象FilePort/CommandPort必须可测试 可隔离 可审计的根源read 分页 输出有界必须防止大文件灌爆上下文edit 精确替换 diff 快照强烈建议副作用最小、可回滚、可审计文件锁规范路径串行化必须并发改同一文件会互相覆盖bash 输出双限截断 临时文件必须命令输出是上下文杀手会话环境注入建议命令能感知自己在哪、用什么模型路径 Unicode 容错建议模型给的文件路径不可靠知识卡片本节体系归档┌──────────────────────────────────────────────────────────┐ │ 知识节点内置四工具env 抽象 文件锁 bash 隔离 │ │ │ │ What env 抽象FilePort/CommandPortread 分页/图片 │ │ edit 精确替换/BOM/diff 快照规范路径文件锁 │ │ bash 输出双限截断 会话 env 注入 │ │ │ │ Why 一般原理工具层与 OS 解耦。不变量 │ │ ① 工具只认 env 接口可测试/可隔离/可审计 │ │ ② 同文件变更按规范路径串行化 │ │ ③ 输出必须有界完整内容落临时文件 │ │ │ │ How 校验动作 │ 画四工具结构 PaiFlow 文件操作换 FilePort 接口 │ │ │ │ Pits 坑点 │ 并发写文件 / 输出灌爆 / 模型给的路径不可靠 │ │ │ │ Transfer 到 PaiFlowFilePort 规范路径锁 输出截断 │ └──────────────────────────────────────────────────────────┘源码与文档出处packages/agent/src/harness/tools/{read,write,edit,bash,file-mutation-queue,path-utils,tool-context}.ts、packages/agent/src/harness/utils/{truncate,shell-output}.ts、packages/coding-agent/docs/environment-variables.md。

相关新闻

5分钟免费激活Adobe全家桶:GenP 3.0完整破解指南

5分钟免费激活Adobe全家桶:GenP 3.0完整破解指南

5分钟免费激活Adobe全家桶:GenP 3.0完整破解指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud的高额订阅费而烦恼吗&…

2026/8/14 2:56:32 阅读更多 →
构建个人知识工作流:从信息收集到任务管理的自动化实践

构建个人知识工作流:从信息收集到任务管理的自动化实践

1. 项目概述:从“Claude Code 源码”到个人效率工具箱的蜕变最近在开发者社区和效率工具圈里,“Claude Code”这个词的热度居高不下。很多人都在搜索它的安装教程、使用技巧,甚至探讨它与Codex等工具的区别。但当我深入研究这些讨论和网络上的…

2026/8/14 2:56:32 阅读更多 →
MAIGateway,魔芋企业级AI网关的安全基建化设计

MAIGateway,魔芋企业级AI网关的安全基建化设计

8月12日,界面新闻发了一条消息:字节跳动成立"AI数据与安全"一级部门,与Seed、Flow、抖音平行。 在互联网大厂的组织架构里,"一级部门"意味着集团级预算、编制和决策权。字节把数据治理和AI安全从分散在各业务…

2026/8/14 2:56:32 阅读更多 →

最新新闻

技术团队中三类让管理者心累的员工类型及改进指南

技术团队中三类让管理者心累的员工类型及改进指南

最近和几位技术团队的管理朋友聊天,发现一个挺有意思的现象:大家吐槽的“问题员工”类型,高度趋同。这些员工往往技术能力不差,甚至在某些方面很突出,但就是让管理者感到“心累”,甚至成为团队协作的“隐形…

2026/8/14 3:58:59 阅读更多 →
Android微信机器人ClawBot语音与音乐播放功能配置实战

Android微信机器人ClawBot语音与音乐播放功能配置实战

1. 项目概述与核心价值最近在折腾一个挺有意思的东西:让Android上的微信机器人ClawBot能开口说话,甚至播放音乐。听起来像是给冷冰冰的机器人注入了一点“灵魂”,对吧?这不仅仅是让机器人回复文字消息,而是让它能通过语…

2026/8/14 3:58:59 阅读更多 →
基于FFmpeg与Python的广播电视视频片段自动化提取与结构化处理实践

基于FFmpeg与Python的广播电视视频片段自动化提取与结构化处理实践

在实际媒体资产管理、历史资料归档或内容分析项目中,我们经常需要处理来自传统广播电视媒体的非结构化视频资料。这些资料可能以零散的片段、不完整的元数据形式存在,其核心价值在于内容本身,但如何将其有效地数字化、结构化并纳入现代内容管…

2026/8/14 3:58:59 阅读更多 →
XXL-JOB分布式任务调度平台:配置调用中心实战指南

XXL-JOB分布式任务调度平台:配置调用中心实战指南

这次我们来看一个在企业级任务调度中非常实用的开源项目——XXL-JOB。如果你正在寻找一个轻量级、易扩展、支持分布式调度的任务调度平台,并且关心它的配置流程、调用中心如何搭建,那么这篇文章可以直接收藏。XXL-JOB 的核心价值在于将复杂的定时任务管理…

2026/8/14 3:58:59 阅读更多 →
小熊猫Dev-C++:5分钟搭建C++开发环境的完整指南

小熊猫Dev-C++:5分钟搭建C++开发环境的完整指南

小熊猫Dev-C:5分钟搭建C开发环境的完整指南 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 你是否曾为C开发环境的复杂配置而头疼?是否厌倦了笨重的IDE占用大量系统资源&#xff1f…

2026/8/14 3:58:59 阅读更多 →
搭建产业对话窗口,2027中国郑州国际健身器材展览会4月举办

搭建产业对话窗口,2027中国郑州国际健身器材展览会4月举办

国民健康意识不断提升,带动健身产业市场活力持续提升,市场对于多元化、适配不同场景的健身装备供给提出更多诉求。在此产业背景之下,2027中国(郑州)国际健身器材展览会落地郑州航空港,展览活动定于2027年4月…

2026/8/14 3:57:59 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →