mirror of
https://bitbucket.org/siakitem/my-pi.git
synced 2026-10-26 10:45:22 +00:00
此前截断分散在多层且互相冲突: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>
31 lines
1.3 KiB
TypeScript
31 lines
1.3 KiB
TypeScript
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
import { readOverflowSettings } from "./settings.ts";
|
|
import { getStash, stashResult } from "./src/stash.ts";
|
|
|
|
/**
|
|
* Pre-bound capture: loaded FIRST in pi.extensions, before RTK or any other
|
|
* result-rewriting extension. It only stashes the untouched original text —
|
|
* it never modifies the result. The bound stage (`index.ts`, loaded last)
|
|
* consumes the stash after all other handlers have run.
|
|
*/
|
|
export default function overflowCapture(pi: ExtensionAPI): void {
|
|
const settings = readOverflowSettings();
|
|
pi.on("tool_result", (event) => {
|
|
if (!settings.enabled) return undefined;
|
|
if (settings.exemptTools.includes(event.toolName)) return undefined;
|
|
if (event.parentToolCallId) return undefined;
|
|
const rawText = event.content
|
|
.filter((part): part is { type: "text"; text: string } => part.type === "text")
|
|
.map((part) => part.text)
|
|
.join("\n");
|
|
const fullOutputPath =
|
|
typeof event.details?.fullOutputPath === "string" ? event.details.fullOutputPath : undefined;
|
|
if (rawText.length <= settings.thresholdChars && !fullOutputPath) return undefined;
|
|
stashResult(getStash(), event.toolCallId, {
|
|
rawText,
|
|
...(fullOutputPath ? { fullOutputPath } : {}),
|
|
});
|
|
return undefined;
|
|
});
|
|
}
|