





















@@ -201,6 +201,32 @@ function expectCompactionResult(result: {
201201return result.compaction;
202202}
203203204+function mockCallArg(
205+mock: { mock: { calls: ReadonlyArray<ReadonlyArray<unknown>> } },
206+callIndex = 0,
207+argIndex = 0,
208+): unknown {
209+const call = mock.mock.calls[callIndex];
210+if (!call) {
211+throw new Error(`expected mock call ${callIndex + 1}`);
212+}
213+return call[argIndex];
214+}
215+216+function requireRecord(value: unknown): Record<string, unknown> {
217+if (!value || typeof value !== "object") {
218+throw new Error("expected record");
219+}
220+return value as Record<string, unknown>;
221+}
222+223+function requireArray(value: unknown): unknown[] {
224+if (!Array.isArray(value)) {
225+throw new Error("expected array");
226+}
227+return value;
228+}
229+204230describe("compaction-safeguard tool failures", () => {
205231it("formats tool failures with meta and summary", () => {
206232const messages: AgentMessage[] = [
@@ -1308,7 +1334,7 @@ describe("compaction-safeguard recent-turn preservation", () => {
1308133413091335expect(result.cancel).not.toBe(true);
13101336expect(mockSummarizeInStages).toHaveBeenCalledTimes(1);
1311-const droppedCall = mockSummarizeInStages.mock.calls.at(0)?.[0];
1337+const droppedCall = requireRecord(mockCallArg(mockSummarizeInStages));
13121338expect(droppedCall?.customInstructions).toContain(
13131339"Produce a compact, factual summary with these exact section headings:",
13141340);
@@ -1351,7 +1377,7 @@ describe("compaction-safeguard recent-turn preservation", () => {
1351137713521378await compactionHandler(event, mockContext);
135313791354-const call = mockSummarizeInStages.mock.calls.at(0)?.[0];
1380+const call = requireRecord(mockCallArg(mockSummarizeInStages));
13551381expect(call?.reserveTokens).toBe(128_000);
13561382});
13571383@@ -1817,10 +1843,11 @@ describe("compaction-safeguard recent-turn preservation", () => {
1817184318181844expect(result.cancel).not.toBe(true);
18191845expect(mockSummarizeInStages).toHaveBeenCalledTimes(1);
1820-const call = mockSummarizeInStages.mock.calls.at(0)?.[0];
1846+const call = requireRecord(mockCallArg(mockSummarizeInStages));
18211847expect(call?.previousSummary).toBeUndefined();
1822-expect(JSON.stringify(call?.messages[0])).toContain("<previous-compaction-summary>");
1823-expect(JSON.stringify(call?.messages[0])).toContain("Old duplicated section");
1848+const messages = requireArray(call.messages);
1849+expect(JSON.stringify(messages[0])).toContain("<previous-compaction-summary>");
1850+expect(JSON.stringify(messages[0])).toContain("Old duplicated section");
18241851});
1825185218261853it("passes compaction instructions to providers and preserves suffix context", async () => {
@@ -1880,14 +1907,14 @@ describe("compaction-safeguard recent-turn preservation", () => {
18801907const compaction = expectCompactionResult(result);
18811908expect(getApiKeyAndHeadersMock).not.toHaveBeenCalled();
18821909expect(mockSummarizeInStages).not.toHaveBeenCalled();
1883-const providerInput = providerSummarize.mock.calls.at(0)?.[0];
1910+const providerInput = requireRecord(mockCallArg(providerSummarize));
18841911expect(providerInput?.previousSummary).toBe("previous provider summary");
18851912expect(providerInput?.customInstructions).toContain("Keep milestone names.");
18861913expect(providerInput?.summarizationInstructions).toEqual({
18871914identifierPolicy: "custom",
18881915identifierInstructions: "Preserve ticket IDs exactly.",
18891916});
1890-const providerMessages = providerSummarize.mock.calls.at(0)?.[0]?.messages ?? [];
1917+const providerMessages = providerInput.messages ?? [];
18911918expect(JSON.stringify(providerMessages)).not.toContain("openclaw.runtime-context");
18921919expect(JSON.stringify(providerMessages)).not.toContain("secret runtime context");
18931920expect(compaction.summary).toContain("provider summary body");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。