Files
云服务部-叶林立andDevin <158243242+devin-ai-integration[bot]@users.noreply.github.com> 2a6bf8c929 feat(pi-overflow): 新增统一的新工具结果展示截断扩展
此前截断分散在多层且互相冲突:Pi bash 保留尾部 50KB,RTK 兜底截断又只留
开头 12000 字符(砍掉报错与完整输出路径),pi-chrome 截开头 30K,web_fetch
各 provider 不一致。新扩展统一负责"新结果给模型看多少":
- capture.ts 最先加载暂存原文,index.ts 最后加载(system-prompt 之前)
- 超过 24K 字符时原文落盘 <agentDir>/my-pi/pi-overflow/(700/600、原子写),
  优先取 bash fullOutputPath 完整文件;模型看到 头 + 中段信号行 + 尾 的有界
  视图,行号基于落盘原文、结尾永远可见
- overflow_query:按 id 正则搜索、行区间、jsonPath 只读查询,id 校验防穿越
- 收编:RTK truncate 默认关闭、删除 pi-chrome truncateText、web_fetch 默认
  每页 20000(上限 100000)、web_search max_results 限定 1–20
- pi-compaction 遮蔽带 details.overflow.id 的结果时在占位符提示 overflow_query
- 登记 tools.jsonc / routing / 权限 allow / tool-search 常驻与分组

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-21 20:25:44 -07:00

2.9 KiB
Raw Permalink Blame History

my-pi 维护约定(pi-overflow)

  • 完全自维护(无上游)的新结果展示截断扩展,负责"每个新 tool_result 给模型看多少":capture.ts 最先加载只暂存原文,index.ts 最后加载(在 system-prompt.ts 之前)生成有界视图并注册 overflow_query。
  • 根 pi.extensions 顺序是硬约束:./pi-overflow/capture.ts 必须第一,./pi-overflow/index.ts 必须在所有其他扩展之后、./extensions/system-prompt.ts 之前;跨扩展暂存走 globalThis[Symbol.for("my-pi.pi-overflow.stash.v1")],容量 64 条、淘汰最旧。
  • tool_result handler 链中 capture 不得修改结果;index 改写 content 时必须原样回传 structuredContent、保留 image 部分、合并而非丢弃已有 details(如 RTK 压缩元数据、bash fullOutputPath)。
  • read/edit/write/overflow_query/ask_user_question 与嵌套调用(parentToolCallId)永远豁免;read 靠自身 offset/limit 分页,不得破坏 hashline 锚点。
  • 视图与行号一律基于刚落盘的存储原文(不是 current 文本):文件来源用流式逐行扫描收集 head/环形 tail/signals,文本来源切同构片段;视图必须确定性、不超 thresholdChars、结尾永远可见;落盘原文优先取 details.fullOutputPath 文件(超 maxEntryBytes 只留头尾各半),其次暂存原文,再次当前文本。
  • 超预算收缩优先级为 tail > signals > head:head 先缩到 min(10, headLines),signals 逐步减半至 10 再到 0,再按约 35/65 缩 head/tail,按字符截断兜底。
  • signal 扫描与 overflow_query 的 search 正则只匹配每行前 10,000 字符;query 输出每行按 maxLineChars 截断。
  • 存储位于 <agentDir>/my-pi/pi-overflow/(目录 700、文件 600、原子写入),id 为 sha1(sessionId + "\0" + toolCallId) 前 12 位 hex;overflow_query 的 id 必须匹配 ^[0-9a-f]{12}$ 防路径穿越;session_start 按 retentionDays/maxStoreBytes 清理并删除超过 1 小时的 *.tmp-* 残留,失败不得抛出。
  • 持久配置只读组合包 config/pi-overflow.json(settings.ts 逐字段校验、非法回退默认、signalPattern 编译失败回退默认且不敏感大小写);不得读写 settings.json 或以环境变量作持久默认。
  • overflow_query 只读本扩展自己的存储目录;非法 id/正则/JSON/路径一律返回清楚错误文本,不得抛出。
  • 与 pi-compaction 的唯一联动是被遮蔽 toolResult 的 details.overflow.id 公开字段——pi-compaction 只读它、不得 import 本包任何实现。
  • 测试必须注入临时存储目录,不得写真实 agent 目录。

验证

  • 在本目录内至少运行 npm test 与 npm run check;涉及加载入口、pi.extensions 顺序或 files 白名单时还要运行根 node --test tests/extension-load.test.ts 与 tests/package-files.test.ts。