





















@@ -98,6 +98,89 @@ describe("overflow compaction in run loop", () => {
9898expect(result.meta.error).toBeUndefined();
9999});
100100101+it("continues from transcript after compaction when the current inbound message was persisted", async () => {
102+const overflowError = makeOverflowError();
103+104+mockedRunEmbeddedAttempt
105+.mockImplementationOnce(async (attemptParams) => {
106+(
107+attemptParams as {
108+onUserMessagePersisted?: (message: { role: "user"; content: string }) => void;
109+}
110+).onUserMessagePersisted?.({ role: "user", content: baseParams.prompt });
111+return makeAttemptResult({ promptError: overflowError });
112+})
113+.mockResolvedValueOnce(makeAttemptResult({ promptError: null }));
114+115+mockedCompactDirect.mockResolvedValueOnce(
116+makeCompactionSuccess({
117+summary: "Compacted session",
118+firstKeptEntryId: "entry-5",
119+tokensBefore: 150000,
120+}),
121+);
122+123+const result = await runEmbeddedPiAgent({
124+ ...baseParams,
125+currentMessageId: "telegram-msg-51024",
126+});
127+128+expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
129+expect(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+);
141+expect(result.meta.error).toBeUndefined();
142+});
143+144+it("does not suppress the next user turn when precheck overflow never persisted it", async () => {
145+const overflowError = makeOverflowError(
146+"Context overflow: prompt too large for the model (precheck).",
147+);
148+149+mockedRunEmbeddedAttempt
150+.mockResolvedValueOnce(
151+makeAttemptResult({
152+promptError: overflowError,
153+promptErrorSource: "precheck",
154+preflightRecovery: { route: "compact_only" },
155+}),
156+)
157+.mockResolvedValueOnce(makeAttemptResult({ promptError: null }));
158+159+mockedCompactDirect.mockResolvedValueOnce(
160+makeCompactionSuccess({
161+summary: "Compacted before prompt submission",
162+firstKeptEntryId: "entry-5",
163+tokensBefore: 150000,
164+}),
165+);
166+167+const result = await runEmbeddedPiAgent({
168+ ...baseParams,
169+currentMessageId: "telegram-msg-51025",
170+});
171+172+expect(mockedCompactDirect).toHaveBeenCalledTimes(1);
173+expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(2);
174+expect(mockedRunEmbeddedAttempt).toHaveBeenNthCalledWith(
175+2,
176+expect.objectContaining({
177+prompt: baseParams.prompt,
178+suppressNextUserMessagePersistence: false,
179+}),
180+);
181+expect(result.meta.error).toBeUndefined();
182+});
183+101184it("retries after successful compaction on likely-overflow promptError variants", async () => {
102185const overflowHintError = new Error("Context window exceeded: requested 12000 tokens");
103186此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。