refactor(agents): share toolResult details stripping

This commit is contained in:
Peter Steinberger
2026-02-15 06:21:13 +00:00
parent 55b7100ab9
commit a4bf619522
3 changed files with 21 additions and 39 deletions

View File

@@ -2,7 +2,7 @@ import type { AgentMessage } from "@mariozechner/pi-agent-core";
import type { ExtensionContext } from "@mariozechner/pi-coding-agent";
import { estimateTokens, generateSummary } from "@mariozechner/pi-coding-agent";
import { DEFAULT_CONTEXT_TOKENS } from "./defaults.js";
import { repairToolUseResultPairing } from "./session-transcript-repair.js";
import { repairToolUseResultPairing, stripToolResultDetails } from "./session-transcript-repair.js";
export const BASE_CHUNK_RATIO = 0.4;
export const MIN_CHUNK_RATIO = 0.15;
@@ -13,25 +13,6 @@ const MERGE_SUMMARIES_INSTRUCTIONS =
"Merge these partial summaries into a single cohesive summary. Preserve decisions," +
" TODOs, open questions, and any constraints.";
function stripToolResultDetails(messages: AgentMessage[]): AgentMessage[] {
let touched = false;
const out: AgentMessage[] = [];
for (const msg of messages) {
if (!msg || typeof msg !== "object" || (msg as { role?: unknown }).role !== "toolResult") {
out.push(msg);
continue;
}
if (!("details" in msg)) {
out.push(msg);
continue;
}
const { details: _details, ...rest } = msg as unknown as Record<string, unknown>;
touched = true;
out.push(rest as unknown as AgentMessage);
}
return touched ? out : messages;
}
export function estimateMessagesTokens(messages: AgentMessage[]): number {
// SECURITY: toolResult.details can contain untrusted/verbose payloads; never include in LLM-facing compaction.
const safe = stripToolResultDetails(messages);

View File

@@ -18,6 +18,7 @@ import {
import { cleanToolSchemaForGemini } from "../pi-tools.schema.js";
import {
sanitizeToolCallInputs,
stripToolResultDetails,
sanitizeToolUseResultPairing,
} from "../session-transcript-repair.js";
import { resolveTranscriptPolicy } from "../transcript-policy.js";
@@ -406,25 +407,6 @@ export function applyGoogleTurnOrderingFix(params: {
return { messages: sanitized, didPrepend };
}
function stripToolResultDetails(messages: AgentMessage[]): AgentMessage[] {
let touched = false;
const out: AgentMessage[] = [];
for (const msg of messages) {
if (!msg || typeof msg !== "object" || (msg as { role?: unknown }).role !== "toolResult") {
out.push(msg);
continue;
}
if (!("details" in msg)) {
out.push(msg);
continue;
}
const { details: _details, ...rest } = msg as unknown as Record<string, unknown>;
touched = true;
out.push(rest as unknown as AgentMessage);
}
return touched ? out : messages;
}
export async function sanitizeSessionHistory(params: {
messages: AgentMessage[];
modelApi?: string | null;

View File

@@ -66,6 +66,25 @@ export type ToolCallInputRepairReport = {
droppedAssistantMessages: number;
};
export function stripToolResultDetails(messages: AgentMessage[]): AgentMessage[] {
let touched = false;
const out: AgentMessage[] = [];
for (const msg of messages) {
if (!msg || typeof msg !== "object" || (msg as { role?: unknown }).role !== "toolResult") {
out.push(msg);
continue;
}
if (!("details" in msg)) {
out.push(msg);
continue;
}
const { details: _details, ...rest } = msg as unknown as Record<string, unknown>;
touched = true;
out.push(rest as unknown as AgentMessage);
}
return touched ? out : messages;
}
export function repairToolCallInputs(messages: AgentMessage[]): ToolCallInputRepairReport {
let droppedToolCalls = 0;
let droppedAssistantMessages = 0;