




















@@ -251,6 +251,89 @@ describe("runMemoryFlushIfNeeded", () => {
251251expect(persisted.main.memoryFlushAt).toBe(1_700_000_000_000);
252252});
253253254+it("reports memory-flush error payloads for visible delivery", async () => {
255+const sessionEntry: SessionEntry = {
256+sessionId: "session",
257+updatedAt: Date.now(),
258+totalTokens: 80_000,
259+compactionCount: 1,
260+};
261+const visibleErrorPayloads: Array<{ text?: string; isError?: boolean }> = [];
262+runEmbeddedPiAgentMock.mockResolvedValueOnce({
263+payloads: [
264+{ text: "normal silent maintenance reply" },
265+{
266+text: "⚠️ write failed: Memory flush writes are restricted to memory/2023-11-14.md; use that path only.",
267+isError: true,
268+},
269+],
270+meta: {},
271+});
272+273+await runMemoryFlushIfNeeded({
274+cfg: { agents: { defaults: { compaction: { memoryFlush: {} } } } },
275+followupRun: createTestFollowupRun(),
276+sessionCtx: { Provider: "whatsapp" } as unknown as TemplateContext,
277+defaultModel: "anthropic/claude-opus-4-6",
278+agentCfgContextTokens: 100_000,
279+resolvedVerboseLevel: "off",
280+ sessionEntry,
281+sessionStore: { main: sessionEntry },
282+sessionKey: "main",
283+isHeartbeat: false,
284+replyOperation: createReplyOperation(),
285+onVisibleErrorPayloads: (payloads) => {
286+visibleErrorPayloads.push(...payloads);
287+},
288+});
289+290+expect(visibleErrorPayloads).toEqual([
291+{
292+text: "⚠️ write failed: Memory flush writes are restricted to memory/2023-11-14.md; use that path only.",
293+isError: true,
294+},
295+]);
296+});
297+298+it("reports restricted memory-flush write failures for visible delivery", async () => {
299+const sessionEntry: SessionEntry = {
300+sessionId: "session",
301+updatedAt: Date.now(),
302+totalTokens: 80_000,
303+compactionCount: 1,
304+};
305+const visibleErrorPayloads: Array<{ text?: string; isError?: boolean }> = [];
306+runWithModelFallbackMock.mockRejectedValueOnce(
307+new Error(
308+"write failed: Memory flush writes are restricted to memory/2023-11-14.md; use that path only.",
309+),
310+);
311+312+await runMemoryFlushIfNeeded({
313+cfg: { agents: { defaults: { compaction: { memoryFlush: {} } } } },
314+followupRun: createTestFollowupRun(),
315+sessionCtx: { Provider: "whatsapp" } as unknown as TemplateContext,
316+defaultModel: "anthropic/claude-opus-4-6",
317+agentCfgContextTokens: 100_000,
318+resolvedVerboseLevel: "off",
319+ sessionEntry,
320+sessionStore: { main: sessionEntry },
321+sessionKey: "main",
322+isHeartbeat: false,
323+replyOperation: createReplyOperation(),
324+onVisibleErrorPayloads: (payloads) => {
325+visibleErrorPayloads.push(...payloads);
326+},
327+});
328+329+expect(visibleErrorPayloads).toEqual([
330+{
331+text: "⚠️ write failed: Memory flush writes are restricted to memory/2023-11-14.md; use that path only.",
332+isError: true,
333+},
334+]);
335+});
336+254337it("runs memory flush on the configured maintenance model without active fallbacks", async () => {
255338registerMemoryFlushPlanResolverForTest(() => ({
256339softThresholdTokens: 4_000,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。