






















@@ -1,7 +1,8 @@
1+import fsSync from "node:fs";
12import fs from "node:fs/promises";
23import os from "node:os";
34import path from "node:path";
4-import { afterAll, beforeAll, describe, expect, it } from "vitest";
5+import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
56import { withEnv } from "../test-utils/env.js";
67import {
78buildGroupDisplayName,
@@ -798,7 +799,7 @@ describe("sessions", () => {
798799await expect(fs.stat(`${storePath}.lock`)).rejects.toThrow();
799800});
800801801-it("updateSessionStoreEntry re-reads disk inside lock instead of using stale cache", async () => {
802+it("updateSessionStoreEntry re-reads disk inside the writer slot instead of using stale cache", async () => {
802803const mainSessionKey = "agent:main:main";
803804const { storePath } = await createSessionStoreFixture({
804805prefix: "updateSessionStoreEntry-cache-bypass",
@@ -838,4 +839,91 @@ describe("sessions", () => {
838839expect(store[mainSessionKey]?.providerOverride).toBe("anthropic");
839840expect(store[mainSessionKey]?.thinkingLevel).toBe("high");
840841});
842+843+it("updateSessionStore uses the writer-owned mutable cache without disk read or parse", async () => {
844+const mainSessionKey = "agent:main:main";
845+const { storePath } = await createSessionStoreFixture({
846+prefix: "updateSessionStore-mutable-cache",
847+entries: {
848+[mainSessionKey]: {
849+sessionId: "sess-1",
850+updatedAt: 123,
851+thinkingLevel: "low",
852+},
853+},
854+});
855+856+expect(loadSessionStore(storePath)[mainSessionKey]?.thinkingLevel).toBe("low");
857+858+const readSpy = vi.spyOn(fsSync, "readFileSync");
859+const parseSpy = vi.spyOn(JSON, "parse");
860+try {
861+await updateSessionStore(
862+storePath,
863+(store) => {
864+const existing = store[mainSessionKey];
865+if (!existing) {
866+throw new Error("missing session entry");
867+}
868+store[mainSessionKey] = {
869+ ...existing,
870+thinkingLevel: "high",
871+};
872+},
873+{ skipMaintenance: true },
874+);
875+876+expect(readSpy).not.toHaveBeenCalled();
877+expect(parseSpy).not.toHaveBeenCalled();
878+} finally {
879+readSpy.mockRestore();
880+parseSpy.mockRestore();
881+}
882+883+const store = loadSessionStore(storePath, { skipCache: true });
884+expect(store[mainSessionKey]?.thinkingLevel).toBe("high");
885+});
886+887+it("updateSessionStore drops a borrowed cache entry when a mutator throws", async () => {
888+const mainSessionKey = "agent:main:main";
889+const { storePath } = await createSessionStoreFixture({
890+prefix: "updateSessionStore-mutable-cache-throw",
891+entries: {
892+[mainSessionKey]: {
893+sessionId: "sess-1",
894+updatedAt: 123,
895+thinkingLevel: "low",
896+},
897+},
898+});
899+900+expect(loadSessionStore(storePath)[mainSessionKey]?.thinkingLevel).toBe("low");
901+902+await expect(
903+updateSessionStore(
904+storePath,
905+(store) => {
906+const existing = store[mainSessionKey];
907+if (!existing) {
908+throw new Error("missing session entry");
909+}
910+store[mainSessionKey] = {
911+ ...existing,
912+thinkingLevel: "mutated-before-throw",
913+};
914+throw new Error("boom");
915+},
916+{ skipMaintenance: true },
917+),
918+).rejects.toThrow("boom");
919+920+const readSpy = vi.spyOn(fsSync, "readFileSync");
921+try {
922+const store = loadSessionStore(storePath);
923+expect(readSpy).toHaveBeenCalled();
924+expect(store[mainSessionKey]?.thinkingLevel).toBe("low");
925+} finally {
926+readSpy.mockRestore();
927+}
928+});
841929});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。