diff --git a/src/agents/compaction.ts b/src/agents/compaction.ts index ec8b1edd5..7c9798dd2 100644 --- a/src/agents/compaction.ts +++ b/src/agents/compaction.ts @@ -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; - 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); diff --git a/src/agents/pi-embedded-runner/google.ts b/src/agents/pi-embedded-runner/google.ts index 91f40e121..868db5983 100644 --- a/src/agents/pi-embedded-runner/google.ts +++ b/src/agents/pi-embedded-runner/google.ts @@ -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; - touched = true; - out.push(rest as unknown as AgentMessage); - } - return touched ? out : messages; -} - export async function sanitizeSessionHistory(params: { messages: AgentMessage[]; modelApi?: string | null; diff --git a/src/agents/session-transcript-repair.ts b/src/agents/session-transcript-repair.ts index 9eb2fe358..5dad80241 100644 --- a/src/agents/session-transcript-repair.ts +++ b/src/agents/session-transcript-repair.ts @@ -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; + 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;