




















@@ -22,6 +22,39 @@ import type { EmbeddedRunAttemptResult } from "./run/types.js";
22222323let runEmbeddedPiAgent: typeof import("./run.js").runEmbeddedPiAgent;
242425+function requireRecord(value: unknown, label: string): Record<string, unknown> {
26+if (!value || typeof value !== "object" || Array.isArray(value)) {
27+throw new Error(`expected ${label} to be an object`);
28+}
29+return value as Record<string, unknown>;
30+}
31+32+function requireMockCallArg(
33+mock: { mock: { calls: unknown[][] } },
34+index: number,
35+): Record<string, unknown> {
36+const call = mock.mock.calls[index];
37+if (!call) {
38+throw new Error(`expected mock call ${index}`);
39+}
40+return requireRecord(call[0], `mock call ${index} arg`);
41+}
42+43+function expectLogIncludes(mock: { mock: { calls: unknown[][] } }, fragment: string) {
44+expect(mock.mock.calls.some((call) => String(call[0]).includes(fragment))).toBe(true);
45+}
46+47+function expectLogExcludes(mock: { mock: { calls: unknown[][] } }, fragment: string) {
48+expect(mock.mock.calls.some((call) => String(call[0]).includes(fragment))).toBe(false);
49+}
50+51+function expectRetryContinuesFromTranscript() {
52+const retryParams = requireMockCallArg(mockedRunEmbeddedAttempt, 1);
53+expect(String(retryParams.prompt)).toContain("Continue from the current transcript");
54+expect(retryParams.suppressNextUserMessagePersistence).toBe(true);
55+expect(retryParams.prompt).not.toBe(baseParams.prompt);
56+}
57+2558describe("overflow compaction in run loop", () => {
2659beforeAll(async () => {
2760({ runEmbeddedPiAgent } = await loadRunOverflowCompactionHarness());
@@ -80,20 +113,16 @@ describe("overflow compaction in run loop", () => {
80113const result = await runEmbeddedPiAgent(baseParams);
8111482115expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
83-expect(mockedCompactDirect).toHaveBeenCalledWith(
84-expect.objectContaining({
85-runtimeContext: expect.objectContaining({ authProfileId: "test-profile" }),
86-}),
116+const compactArg = requireMockCallArg(mockedCompactDirect, 0);
117+expect(requireRecord(compactArg.runtimeContext, "runtime context").authProfileId).toBe(
118+"test-profile",
87119);
88120expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
89-expect(mockedLog.warn).toHaveBeenCalledWith(
90-expect.stringContaining(
91-"context overflow detected (attempt 1/3); attempting auto-compaction",
92-),
93-);
94-expect(mockedLog.info).toHaveBeenCalledWith(
95-expect.stringContaining("auto-compaction succeeded"),
121+expectLogIncludes(
122+mockedLog.warn,
123+"context overflow detected (attempt 1/3); attempting auto-compaction",
96124);
125+expectLogIncludes(mockedLog.info, "auto-compaction succeeded");
97126// Should not be an error result
98127expect(result.meta.error).toBeUndefined();
99128});
@@ -127,17 +156,7 @@ describe("overflow compaction in run loop", () => {
127156128157expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
129158expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
130-expect(mockedRunEmbeddedAttempt).toHaveBeenNthCalledWith(
131-2,
132-expect.objectContaining({
133-prompt: expect.stringContaining("Continue from the current transcript"),
134-suppressNextUserMessagePersistence: true,
135-}),
136-);
137-expect(mockedRunEmbeddedAttempt).not.toHaveBeenNthCalledWith(
138-2,
139-expect.objectContaining({ prompt: baseParams.prompt }),
140-);
159+expectRetryContinuesFromTranscript();
141160expect(result.meta.error).toBeUndefined();
142161});
143162@@ -171,13 +190,9 @@ describe("overflow compaction in run loop", () => {
171190172191expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
173192expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
174-expect(mockedRunEmbeddedAttempt).toHaveBeenNthCalledWith(
175-2,
176-expect.objectContaining({
177-prompt: baseParams.prompt,
178-suppressNextUserMessagePersistence: false,
179-}),
180-);
193+const retryParams = requireMockCallArg(mockedRunEmbeddedAttempt, 1);
194+expect(retryParams.prompt).toBe(baseParams.prompt);
195+expect(retryParams.suppressNextUserMessagePersistence).toBe(false);
181196expect(result.meta.error).toBeUndefined();
182197});
183198@@ -200,7 +215,7 @@ describe("overflow compaction in run loop", () => {
200215201216expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
202217expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
203-expect(mockedLog.warn).toHaveBeenCalledWith(expect.stringContaining("source=promptError"));
218+expectLogIncludes(mockedLog.warn, "source=promptError");
204219expect(result.meta.error).toBeUndefined();
205220});
206221@@ -221,7 +236,7 @@ describe("overflow compaction in run loop", () => {
221236expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(1);
222237expect(result.meta.error?.kind).toBe("context_overflow");
223238expect(result.payloads?.[0]?.isError).toBe(true);
224-expect(mockedLog.warn).toHaveBeenCalledWith(expect.stringContaining("auto-compaction failed"));
239+expectLogIncludes(mockedLog.warn, "auto-compaction failed");
225240});
226241227242it("falls back to tool-result truncation and retries when oversized results are detected", async () => {
@@ -242,16 +257,14 @@ describe("overflow compaction in run loop", () => {
242257const result = await runEmbeddedPiAgent(baseParams);
243258244259expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
245-expect(mockedSessionLikelyHasOversizedToolResults).toHaveBeenCalledWith(
246-expect.objectContaining({ contextWindowTokens: 200000 }),
247-);
248-expect(mockedTruncateOversizedToolResultsInSession).toHaveBeenCalledWith(
249-expect.objectContaining({ sessionFile: "/tmp/session.json" }),
260+expect(
261+requireMockCallArg(mockedSessionLikelyHasOversizedToolResults, 0).contextWindowTokens,
262+).toBe(200000);
263+expect(requireMockCallArg(mockedTruncateOversizedToolResultsInSession, 0).sessionFile).toBe(
264+"/tmp/session.json",
250265);
251266expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
252-expect(mockedLog.info).toHaveBeenCalledWith(
253-expect.stringContaining("Truncated 1 tool result(s)"),
254-);
267+expectLogIncludes(mockedLog.info, "Truncated 1 tool result(s)");
255268expect(result.meta.error).toBeUndefined();
256269});
257270@@ -292,22 +305,14 @@ describe("overflow compaction in run loop", () => {
292305const result = await runEmbeddedPiAgent(baseParams);
293306294307expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
295-expect(mockedSessionLikelyHasOversizedToolResults).toHaveBeenCalledWith(
296-expect.objectContaining({
297-messages: expect.arrayContaining([
298-expect.objectContaining({ role: "toolResult" }),
299-expect.objectContaining({ role: "toolResult" }),
300-expect.objectContaining({ role: "toolResult" }),
301-]),
302-}),
303-);
304-expect(mockedTruncateOversizedToolResultsInSession).toHaveBeenCalledWith(
305-expect.objectContaining({ sessionFile: "/tmp/session.json" }),
308+const oversizedArgs = requireMockCallArg(mockedSessionLikelyHasOversizedToolResults, 0);
309+const messages = oversizedArgs.messages as Array<{ role?: string }>;
310+expect(messages.filter((message) => message.role === "toolResult")).toHaveLength(3);
311+expect(requireMockCallArg(mockedTruncateOversizedToolResultsInSession, 0).sessionFile).toBe(
312+"/tmp/session.json",
306313);
307314expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
308-expect(mockedLog.info).toHaveBeenCalledWith(
309-expect.stringContaining("Truncated 2 tool result(s)"),
310-);
315+expectLogIncludes(mockedLog.info, "Truncated 2 tool result(s)");
311316expect(result.meta.error).toBeUndefined();
312317});
313318@@ -330,9 +335,7 @@ describe("overflow compaction in run loop", () => {
330335expect(mockedCompactDirect).not.toHaveBeenCalled();
331336expect(mockedTruncateOversizedToolResultsInSession).not.toHaveBeenCalled();
332337expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
333-expect(mockedLog.info).toHaveBeenCalledWith(
334-expect.stringContaining("early recovery route=truncate_tool_results_only"),
335-);
338+expectLogIncludes(mockedLog.info, "early recovery route=truncate_tool_results_only");
336339expect(result.meta.error).toBeUndefined();
337340});
338341@@ -355,20 +358,8 @@ describe("overflow compaction in run loop", () => {
355358356359expect(mockedCompactDirect).not.toHaveBeenCalled();
357360expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
358-expect(mockedRunEmbeddedAttempt).toHaveBeenNthCalledWith(
359-2,
360-expect.objectContaining({
361-prompt: expect.stringContaining("Continue from the current transcript"),
362-suppressNextUserMessagePersistence: true,
363-}),
364-);
365-expect(mockedRunEmbeddedAttempt).not.toHaveBeenNthCalledWith(
366-2,
367-expect.objectContaining({ prompt: baseParams.prompt }),
368-);
369-expect(mockedLog.info).toHaveBeenCalledWith(
370-expect.stringContaining("retrying from current transcript"),
371-);
361+expectRetryContinuesFromTranscript();
362+expectLogIncludes(mockedLog.info, "retrying from current transcript");
372363expect(result.meta.error).toBeUndefined();
373364});
374365@@ -397,10 +388,9 @@ describe("overflow compaction in run loop", () => {
397388expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
398389expect(mockedTruncateOversizedToolResultsInSession).not.toHaveBeenCalled();
399390expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
400-expect(mockedLog.warn).toHaveBeenCalledWith(
401-expect.stringContaining(
402-"context overflow detected (attempt 1/3); attempting auto-compaction",
403-),
391+expectLogIncludes(
392+mockedLog.warn,
393+"context overflow detected (attempt 1/3); attempting auto-compaction",
404394);
405395expect(result.meta.error).toBeUndefined();
406396});
@@ -430,17 +420,7 @@ describe("overflow compaction in run loop", () => {
430420431421expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
432422expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
433-expect(mockedRunEmbeddedAttempt).toHaveBeenNthCalledWith(
434-2,
435-expect.objectContaining({
436-prompt: expect.stringContaining("Continue from the current transcript"),
437-suppressNextUserMessagePersistence: true,
438-}),
439-);
440-expect(mockedRunEmbeddedAttempt).not.toHaveBeenNthCalledWith(
441-2,
442-expect.objectContaining({ prompt: baseParams.prompt }),
443-);
423+expectRetryContinuesFromTranscript();
444424expect(result.meta.error).toBeUndefined();
445425});
446426@@ -471,13 +451,11 @@ describe("overflow compaction in run loop", () => {
471451const result = await runEmbeddedPiAgent(baseParams);
472452473453expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
474-expect(mockedTruncateOversizedToolResultsInSession).toHaveBeenCalledWith(
475-expect.objectContaining({ sessionFile: "/tmp/session.json" }),
454+expect(requireMockCallArg(mockedTruncateOversizedToolResultsInSession, 0).sessionFile).toBe(
455+"/tmp/session.json",
476456);
477457expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
478-expect(mockedLog.info).toHaveBeenCalledWith(
479-expect.stringContaining("post-compaction tool-result truncation succeeded"),
480-);
458+expectLogIncludes(mockedLog.info, "post-compaction tool-result truncation succeeded");
481459expect(result.meta.error).toBeUndefined();
482460});
483461@@ -596,7 +574,7 @@ describe("overflow compaction in run loop", () => {
596574597575expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
598576expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
599-expect(mockedLog.warn).toHaveBeenCalledWith(expect.stringContaining("source=assistantError"));
577+expectLogIncludes(mockedLog.warn, "source=assistantError");
600578expect(result.meta.error).toBeUndefined();
601579});
602580@@ -614,9 +592,7 @@ describe("overflow compaction in run loop", () => {
614592await expect(runEmbeddedPiAgent(baseParams)).rejects.toThrow("transport disconnected");
615593616594expect(mockedCompactDirect).not.toHaveBeenCalled();
617-expect(mockedLog.warn).not.toHaveBeenCalledWith(
618-expect.stringContaining("source=assistantError"),
619-);
595+expectLogExcludes(mockedLog.warn, "source=assistantError");
620596});
621597622598it("returns an explicit timeout payload when the run times out before producing any reply", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。