






























@@ -182,6 +182,50 @@ describe("buildContextEngineMaintenanceRuntimeContext", () => {
182182expect(rewriteTranscriptEntriesInSessionFileMock).not.toHaveBeenCalled();
183183});
184184185+it("wraps active session manager rewrites in the supplied lock", async () => {
186+const events: string[] = [];
187+const sessionManager = { appendMessage: vi.fn() } as unknown as Parameters<
188+typeof buildContextEngineMaintenanceRuntimeContext
189+>[0]["sessionManager"];
190+rewriteTranscriptEntriesInSessionManagerMock.mockImplementationOnce((_params?: unknown) => {
191+events.push("rewrite");
192+return {
193+changed: true,
194+bytesFreed: 77,
195+rewrittenEntries: 1,
196+};
197+});
198+const runtimeContext = buildContextEngineMaintenanceRuntimeContext({
199+sessionId: "session-1",
200+sessionKey: "agent:main:session-1",
201+sessionFile: "/tmp/session.jsonl",
202+ sessionManager,
203+withSessionManagerRewriteLock: async (operation) => {
204+events.push("lock-start");
205+try {
206+return await operation();
207+} finally {
208+events.push("lock-end");
209+}
210+},
211+});
212+213+await runtimeContext.rewriteTranscriptEntries?.({
214+replacements: [
215+{ entryId: "entry-1", message: { role: "user", content: "hi", timestamp: 1 } },
216+],
217+});
218+219+expect(events).toEqual(["lock-start", "rewrite", "lock-end"]);
220+expect(rewriteTranscriptEntriesInSessionManagerMock).toHaveBeenCalledWith({
221+ sessionManager,
222+replacements: [
223+{ entryId: "entry-1", message: { role: "user", content: "hi", timestamp: 1 } },
224+],
225+});
226+expect(rewriteTranscriptEntriesInSessionFileMock).not.toHaveBeenCalled();
227+});
228+185229it("defers file rewrites onto the session lane when requested", async () => {
186230vi.useFakeTimers();
187231try {
@@ -419,6 +463,69 @@ describe("runContextEngineMaintenance", () => {
419463});
420464});
421465466+it("locks foreground maintenance rewrites that use the active session manager", async () => {
467+const events: string[] = [];
468+const maintain = vi.fn(async (params?: unknown) => {
469+events.push("maintain-start");
470+await (
471+params as { runtimeContext?: ContextEngineRuntimeContext } | undefined
472+)?.runtimeContext?.rewriteTranscriptEntries?.({
473+replacements: [
474+{ entryId: "entry-1", message: { role: "user", content: "hi", timestamp: 1 } },
475+],
476+});
477+events.push("maintain-end");
478+return {
479+changed: false,
480+bytesFreed: 0,
481+rewrittenEntries: 0,
482+};
483+});
484+const sessionManager = { appendMessage: vi.fn() } as unknown as Parameters<
485+typeof buildContextEngineMaintenanceRuntimeContext
486+>[0]["sessionManager"];
487+rewriteTranscriptEntriesInSessionManagerMock.mockImplementationOnce((_params?: unknown) => {
488+events.push("rewrite");
489+return {
490+changed: true,
491+bytesFreed: 77,
492+rewrittenEntries: 1,
493+};
494+});
495+496+await runContextEngineMaintenance({
497+contextEngine: {
498+info: { id: "test", name: "Test Engine" },
499+ingest: async () => ({ ingested: true }),
500+assemble: async ({ messages }) => ({ messages, estimatedTokens: 0 }),
501+compact: async () => ({ ok: true, compacted: false }),
502+ maintain,
503+},
504+sessionId: "session-foreground-manager-rewrite",
505+sessionKey: "agent:main:session-foreground-manager-rewrite",
506+sessionFile: "/tmp/session-foreground-manager-rewrite.jsonl",
507+reason: "turn",
508+ sessionManager,
509+withSessionManagerRewriteLock: async (operation) => {
510+events.push("lock-start");
511+try {
512+return await operation();
513+} finally {
514+events.push("lock-end");
515+}
516+},
517+});
518+519+expect(events).toEqual(["maintain-start", "lock-start", "rewrite", "lock-end", "maintain-end"]);
520+expect(rewriteTranscriptEntriesInSessionManagerMock).toHaveBeenCalledWith({
521+ sessionManager,
522+replacements: [
523+{ entryId: "entry-1", message: { role: "user", content: "hi", timestamp: 1 } },
524+],
525+});
526+expect(rewriteTranscriptEntriesInSessionFileMock).not.toHaveBeenCalled();
527+});
528+422529it("defers turn maintenance to a hidden background task when enabled", async () => {
423530await withStateDirEnv("openclaw-turn-maintenance-", async () => {
424531vi.useFakeTimers();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。