diff --git a/src/agents/pi-embedded-runner/compact.ts b/src/agents/pi-embedded-runner/compact.ts index d5f756d6500..b0607324f55 100644 --- a/src/agents/pi-embedded-runner/compact.ts +++ b/src/agents/pi-embedded-runner/compact.ts @@ -917,6 +917,7 @@ async function compactEmbeddedPiSessionDirectOnce( try { await repairSessionFileIfNeeded({ sessionFile: params.sessionFile, + debug: (message) => log.debug(message), warn: (message) => log.warn(message), }); await prewarmSessionFile(params.sessionFile); diff --git a/src/agents/pi-embedded-runner/run/attempt.ts b/src/agents/pi-embedded-runner/run/attempt.ts index 46db6251d1c..12a9abc27d3 100644 --- a/src/agents/pi-embedded-runner/run/attempt.ts +++ b/src/agents/pi-embedded-runner/run/attempt.ts @@ -1400,6 +1400,7 @@ export async function runEmbeddedAttempt( try { await repairSessionFileIfNeeded({ sessionFile: params.sessionFile, + debug: (message) => log.debug(message), warn: (message) => log.warn(message), }); const hadSessionFile = await fs diff --git a/src/agents/session-file-repair.test.ts b/src/agents/session-file-repair.test.ts index a2f74be2932..7531d6dbe43 100644 --- a/src/agents/session-file-repair.test.ts +++ b/src/agents/session-file-repair.test.ts @@ -128,17 +128,17 @@ describe("repairSessionFileIfNeeded", () => { const original = `${JSON.stringify(header)}\n${JSON.stringify(message)}\n${JSON.stringify(poisonedAssistantEntry)}\n${JSON.stringify(followUp)}\n`; await fs.writeFile(file, original, "utf-8"); - const warn = vi.fn(); - const result = await repairSessionFileIfNeeded({ sessionFile: file, warn }); + const debug = vi.fn(); + const result = await repairSessionFileIfNeeded({ sessionFile: file, debug }); expect(result.repaired).toBe(true); expect(result.droppedLines).toBe(0); expect(result.rewrittenAssistantMessages).toBe(1); expect(result.backupPath).toBeTruthy(); - expect(warn).toHaveBeenCalledTimes(1); - const warnMessage = warn.mock.calls[0]?.[0] as string; - expect(warnMessage).toContain("rewrote 1 assistant message(s)"); - expect(warnMessage).not.toContain("dropped"); + expect(debug).toHaveBeenCalledTimes(1); + const debugMessage = debug.mock.calls[0]?.[0] as string; + expect(debugMessage).toContain("rewrote 1 assistant message(s)"); + expect(debugMessage).not.toContain("dropped"); const repaired = await fs.readFile(file, "utf-8"); const repairedLines = repaired.trim().split("\n"); @@ -167,13 +167,13 @@ describe("repairSessionFileIfNeeded", () => { const original = `${JSON.stringify(header)}\n${JSON.stringify(blankUserEntry)}\n${JSON.stringify(message)}\n`; await fs.writeFile(file, original, "utf-8"); - const warn = vi.fn(); - const result = await repairSessionFileIfNeeded({ sessionFile: file, warn }); + const debug = vi.fn(); + const result = await repairSessionFileIfNeeded({ sessionFile: file, debug }); expect(result.repaired).toBe(true); expect(result.rewrittenUserMessages).toBe(1); expect(result.droppedBlankUserMessages).toBe(0); - expect(warn.mock.calls[0]?.[0]).toContain("rewrote 1 user message(s)"); + expect(debug.mock.calls[0]?.[0]).toContain("rewrote 1 user message(s)"); const repaired = await fs.readFile(file, "utf-8"); const repairedLines = repaired.trim().split("\n"); @@ -243,7 +243,7 @@ describe("repairSessionFileIfNeeded", () => { ]); }); - it("reports both drops and rewrites in the warn message when both occur", async () => { + it("reports both drops and rewrites in the debug message when both occur", async () => { const { file } = await createTempSessionPath(); const { header } = buildSessionHeaderAndMessage(); const poisonedAssistantEntry = { @@ -264,15 +264,15 @@ describe("repairSessionFileIfNeeded", () => { const original = `${JSON.stringify(header)}\n${JSON.stringify(poisonedAssistantEntry)}\n{"type":"message"`; await fs.writeFile(file, original, "utf-8"); - const warn = vi.fn(); - const result = await repairSessionFileIfNeeded({ sessionFile: file, warn }); + const debug = vi.fn(); + const result = await repairSessionFileIfNeeded({ sessionFile: file, debug }); expect(result.repaired).toBe(true); expect(result.droppedLines).toBe(1); expect(result.rewrittenAssistantMessages).toBe(1); - const warnMessage = warn.mock.calls[0]?.[0] as string; - expect(warnMessage).toContain("dropped 1 malformed line(s)"); - expect(warnMessage).toContain("rewrote 1 assistant message(s)"); + const debugMessage = debug.mock.calls[0]?.[0] as string; + expect(debugMessage).toContain("dropped 1 malformed line(s)"); + expect(debugMessage).toContain("rewrote 1 assistant message(s)"); }); it("does not rewrite silent-reply turns (stopReason=stop, content=[]) on disk", async () => { @@ -329,12 +329,12 @@ describe("repairSessionFileIfNeeded", () => { const original = `${JSON.stringify(header)}\n${JSON.stringify(message)}\n${JSON.stringify(assistantEntry)}\n`; await fs.writeFile(file, original, "utf-8"); - const warn = vi.fn(); - const result = await repairSessionFileIfNeeded({ sessionFile: file, warn }); + const debug = vi.fn(); + const result = await repairSessionFileIfNeeded({ sessionFile: file, debug }); expect(result.repaired).toBe(true); expect(result.trimmedTrailingAssistantMessages).toBe(1); - expect(warn.mock.calls[0]?.[0]).toContain("trimmed 1 trailing assistant message(s)"); + expect(debug.mock.calls[0]?.[0]).toContain("trimmed 1 trailing assistant message(s)"); const repaired = await fs.readFile(file, "utf-8"); const repairedLines = repaired.trim().split("\n"); diff --git a/src/agents/session-file-repair.ts b/src/agents/session-file-repair.ts index 7bae100b5ad..1fff42046e5 100644 --- a/src/agents/session-file-repair.ts +++ b/src/agents/session-file-repair.ts @@ -194,6 +194,7 @@ function buildRepairSummaryParts(params: { export async function repairSessionFileIfNeeded(params: { sessionFile: string; + debug?: (message: string) => void; warn?: (message: string) => void; }): Promise { const sessionFile = params.sessionFile.trim(); @@ -321,7 +322,7 @@ export async function repairSessionFileIfNeeded(params: { }; } - params.warn?.( + params.debug?.( `session file repaired: ${buildRepairSummaryParts({ droppedLines, rewrittenAssistantMessages,