

























@@ -600,6 +600,85 @@ describe("installContextEngineLoopHook", () => {
600600expect(transformed).toBe(compactedView);
601601});
602602603+it("clears an assembled view when the engine fails on a later source", async () => {
604+const agent = makeGuardableAgent();
605+const compactedView = [makeUser("compacted")];
606+const engine = makeMockEngine({
607+assemble: async () => ({ messages: compactedView, estimatedTokens: 0 }),
608+});
609+engine.assemble
610+.mockResolvedValueOnce({ messages: compactedView, estimatedTokens: 0 })
611+.mockRejectedValueOnce(new Error("assemble failed"))
612+.mockImplementation(async (params: Parameters<ContextEngine["assemble"]>[0]) => ({
613+messages: params.messages,
614+estimatedTokens: 0,
615+}));
616+installHook(agent, engine, 1);
617+618+const firstSource = [makeUser("first"), makeToolResult("call_1", "r1")];
619+expect(await callTransform(agent, firstSource)).toBe(compactedView);
620+621+const secondSource = [...firstSource, makeToolResult("call_2", "r2")];
622+expect(await callTransform(agent, secondSource)).toBe(secondSource);
623+624+const retry = await callTransform(agent, secondSource);
625+expect(retry).toBe(secondSource);
626+expect(retry).not.toBe(compactedView);
627+expect(engine.assemble).toHaveBeenCalledTimes(3);
628+});
629+630+it("clears an assembled view when source history shrinks", async () => {
631+const agent = makeGuardableAgent();
632+const compactedView = [makeUser("compacted")];
633+const engine = makeMockEngine({
634+assemble: async () => ({ messages: compactedView, estimatedTokens: 0 }),
635+});
636+engine.assemble.mockResolvedValueOnce({ messages: compactedView, estimatedTokens: 0 });
637+engine.assemble.mockImplementation(
638+async (params: Parameters<ContextEngine["assemble"]>[0]) => ({
639+messages: params.messages,
640+estimatedTokens: 0,
641+}),
642+);
643+installHook(agent, engine, 1);
644+645+const longSource = [
646+makeUser("first"),
647+makeToolResult("call_1", "r1"),
648+makeToolResult("call_2", "r2"),
649+];
650+expect(await callTransform(agent, longSource)).toBe(compactedView);
651+652+const resetSource = [makeUser("reset")];
653+expect(await callTransform(agent, resetSource)).toBe(resetSource);
654+});
655+656+it("clears an assembled view when source history resets at the same length", async () => {
657+const agent = makeGuardableAgent();
658+const compactedView = [makeUser("compacted")];
659+const engine = makeMockEngine({
660+assemble: async () => ({ messages: compactedView, estimatedTokens: 0 }),
661+});
662+engine.assemble.mockResolvedValueOnce({ messages: compactedView, estimatedTokens: 0 });
663+engine.assemble.mockImplementation(
664+async (params: Parameters<ContextEngine["assemble"]>[0]) => ({
665+messages: params.messages,
666+estimatedTokens: 0,
667+}),
668+);
669+installHook(agent, engine, 1);
670+671+const source = [
672+makeUser("first"),
673+makeToolResult("call_1", "r1"),
674+makeToolResult("call_2", "r2"),
675+];
676+expect(await callTransform(agent, source)).toBe(compactedView);
677+678+const resetSource = [makeUser("reset"), makeToolResult("call_3", "r3"), makeUser("fresh")];
679+expect(await callTransform(agent, resetSource)).toBe(resetSource);
680+});
681+603682it("returns the assembled view when the engine rewrites content without changing count", async () => {
604683const agent = makeGuardableAgent();
605684const rewrittenView = [makeUser("rewritten-1"), makeUser("rewritten-2")];
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。