From 9af1c8a886886215cce68d53dabeaed31ceb36eb Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 18 Jan 2026 22:26:01 +0000 Subject: [PATCH] fix: patch session store updates --- src/auto-reply/reply/agent-runner.ts | 30 +++++++++++++++++++-------- src/config/sessions.test.ts | 31 ++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/auto-reply/reply/agent-runner.ts b/src/auto-reply/reply/agent-runner.ts index 80fef7f07..4e13ebdf5 100644 --- a/src/auto-reply/reply/agent-runner.ts +++ b/src/auto-reply/reply/agent-runner.ts @@ -161,11 +161,14 @@ export async function runReplyAgent(params: { const steered = queueEmbeddedPiMessage(followupRun.run.sessionId, followupRun.prompt); if (steered && !shouldFollowup) { if (activeSessionEntry && activeSessionStore && sessionKey) { - activeSessionEntry.updatedAt = Date.now(); + const updatedAt = Date.now(); + activeSessionEntry.updatedAt = updatedAt; activeSessionStore[sessionKey] = activeSessionEntry; if (storePath) { - await updateSessionStore(storePath, (store) => { - store[sessionKey] = activeSessionEntry as SessionEntry; + await updateSessionStoreEntry({ + storePath, + sessionKey, + update: async () => ({ updatedAt }), }); } } @@ -177,11 +180,14 @@ export async function runReplyAgent(params: { if (isActive && (shouldFollowup || resolvedQueue.mode === "steer")) { enqueueFollowupRun(queueKey, followupRun, resolvedQueue); if (activeSessionEntry && activeSessionStore && sessionKey) { - activeSessionEntry.updatedAt = Date.now(); + const updatedAt = Date.now(); + activeSessionEntry.updatedAt = updatedAt; activeSessionStore[sessionKey] = activeSessionEntry; if (storePath) { - await updateSessionStore(storePath, (store) => { - store[sessionKey] = activeSessionEntry as SessionEntry; + await updateSessionStoreEntry({ + storePath, + sessionKey, + update: async () => ({ updatedAt }), }); } } @@ -328,12 +334,18 @@ export async function runReplyAgent(params: { sessionKey && activeSessionEntry.groupActivationNeedsSystemIntro ) { + const updatedAt = Date.now(); activeSessionEntry.groupActivationNeedsSystemIntro = false; - activeSessionEntry.updatedAt = Date.now(); + activeSessionEntry.updatedAt = updatedAt; activeSessionStore[sessionKey] = activeSessionEntry; if (storePath) { - await updateSessionStore(storePath, (store) => { - store[sessionKey] = activeSessionEntry as SessionEntry; + await updateSessionStoreEntry({ + storePath, + sessionKey, + update: async () => ({ + groupActivationNeedsSystemIntro: false, + updatedAt, + }), }); } } diff --git a/src/config/sessions.test.ts b/src/config/sessions.test.ts index e56d16a94..6bce0ba03 100644 --- a/src/config/sessions.test.ts +++ b/src/config/sessions.test.ts @@ -206,6 +206,37 @@ describe("sessions", () => { expect(store[sessionKey]?.origin?.chatType).toBe("group"); }); + it("updateSessionStoreEntry preserves existing fields when patching", async () => { + const sessionKey = "agent:main:main"; + const dir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-sessions-")); + const storePath = path.join(dir, "sessions.json"); + await fs.writeFile( + storePath, + JSON.stringify( + { + [sessionKey]: { + sessionId: "sess-1", + updatedAt: 100, + reasoningLevel: "on", + }, + }, + null, + 2, + ), + "utf-8", + ); + + await updateSessionStoreEntry({ + storePath, + sessionKey, + update: async () => ({ updatedAt: 200 }), + }); + + const store = loadSessionStore(storePath); + expect(store[sessionKey]?.updatedAt).toBeGreaterThanOrEqual(200); + expect(store[sessionKey]?.reasoningLevel).toBe("on"); + }); + it("updateSessionStore preserves concurrent additions", async () => { const dir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-sessions-")); const storePath = path.join(dir, "sessions.json");