From 7997606892dec514320ed7c310d6097aed9eb208 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Thu, 12 Mar 2026 02:24:22 +0900 Subject: [PATCH] fix(call-omo-agent): preserve reused session tracking Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .../call-omo-agent/sync-executor-leak.test.ts | 24 +++++++++++++++++++ src/tools/call-omo-agent/sync-executor.ts | 4 +++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/tools/call-omo-agent/sync-executor-leak.test.ts b/src/tools/call-omo-agent/sync-executor-leak.test.ts index 2dfc1bc78..778af537e 100644 --- a/src/tools/call-omo-agent/sync-executor-leak.test.ts +++ b/src/tools/call-omo-agent/sync-executor-leak.test.ts @@ -131,4 +131,28 @@ describe("executeSync session cleanup", () => { expect(syncSubagentSessions.has(sessionID)).toBe(false) }) }) + + describe("#given executeSync reuses an existing session", () => { + test("#when execution completes successfully #then the reused session stays tracked in both Sets", async () => { + // given + const sessionID = "ses-reused" + const args = { ...createArgs(), session_id: sessionID } + const toolContext = createToolContext() + const promptAsync = mock(async () => ({ data: {} })) + const deps = createDependencies({ + createOrGetSession: mock(async () => ({ sessionID, isNew: false })), + }) + + subagentSessions.add(sessionID) + syncSubagentSessions.add(sessionID) + + // when + const result = await executeSync(args, toolContext, createContext(promptAsync) as never, deps) + + // then + expect(result).toContain(`session_id: ${sessionID}`) + expect(subagentSessions.has(sessionID)).toBe(true) + expect(syncSubagentSessions.has(sessionID)).toBe(true) + }) + }) }) diff --git a/src/tools/call-omo-agent/sync-executor.ts b/src/tools/call-omo-agent/sync-executor.ts index 2b900cd70..ce3d5089b 100644 --- a/src/tools/call-omo-agent/sync-executor.ts +++ b/src/tools/call-omo-agent/sync-executor.ts @@ -46,10 +46,12 @@ export async function executeSync( spawnReservation?: SpawnReservation, ): Promise { let sessionID: string | undefined + let createdSessionForExecution = false try { const session = await deps.createOrGetSession(args, toolContext, ctx) sessionID = session.sessionID + createdSessionForExecution = session.isNew if (session.isNew) { spawnReservation?.commit() @@ -100,7 +102,7 @@ export async function executeSync( spawnReservation?.rollback() throw error } finally { - if (sessionID) { + if (sessionID && createdSessionForExecution) { subagentSessions.delete(sessionID) syncSubagentSessions.delete(sessionID) }