From 008d101b162d4243ec26473367d2c17d88bc7883 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Mon, 22 Jun 2026 22:39:32 +0800 Subject: [PATCH] refactor(sessions): share runtime transcript context resolution --- src/config/sessions/session-accessor.ts | 58 +++++++++++++++---------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/config/sessions/session-accessor.ts b/src/config/sessions/session-accessor.ts index 932b03da4725..a4bc916a1b8b 100644 --- a/src/config/sessions/session-accessor.ts +++ b/src/config/sessions/session-accessor.ts @@ -1482,18 +1482,8 @@ async function persistExpectedSessionTranscriptTurn( export async function resolveSessionTranscriptRuntimeTarget( scope: SessionTranscriptRuntimeScope, ): Promise { - const agentId = scope.agentId ?? resolveAgentIdFromSessionKey(scope.sessionKey); - if (!agentId) { - throw new Error(`Cannot resolve transcript scope without an agent id: ${scope.sessionKey}`); - } - const sessionStore = scope.storePath - ? loadSessionStore(scope.storePath, { skipCache: true }) - : undefined; - const resolvedStoreEntry = sessionStore - ? resolveSessionStoreEntry({ store: sessionStore, sessionKey: scope.sessionKey }) - : undefined; - const sessionEntry = resolvedStoreEntry?.existing ?? loadSessionEntry(scope); - const sessionKey = resolvedStoreEntry?.normalizedKey ?? scope.sessionKey; + const { agentId, sessionEntry, sessionKey, sessionStore } = + resolveSessionTranscriptRuntimeContext(scope); if (scope.sessionFile?.trim()) { return { agentId, @@ -1552,18 +1542,8 @@ export async function resolveSessionTranscriptRuntimeTarget( export async function resolveSessionTranscriptRuntimeReadTarget( scope: SessionTranscriptRuntimeScope, ): Promise { - const agentId = scope.agentId ?? resolveAgentIdFromSessionKey(scope.sessionKey); - if (!agentId) { - throw new Error(`Cannot resolve transcript scope without an agent id: ${scope.sessionKey}`); - } - const sessionStore = scope.storePath - ? loadSessionStore(scope.storePath, { skipCache: true }) - : undefined; - const resolvedStoreEntry = sessionStore - ? resolveSessionStoreEntry({ store: sessionStore, sessionKey: scope.sessionKey }) - : undefined; - const sessionEntry = resolvedStoreEntry?.existing ?? loadSessionEntry(scope); - const sessionKey = resolvedStoreEntry?.normalizedKey ?? scope.sessionKey; + const { agentId, sessionEntry, sessionKey, sessionStore } = + resolveSessionTranscriptRuntimeContext(scope); if (scope.sessionFile?.trim()) { return { agentId, @@ -1599,6 +1579,36 @@ export async function resolveSessionTranscriptRuntimeReadTarget( }; } +type SessionTranscriptRuntimeContext = { + agentId: string; + sessionEntry: SessionEntry | undefined; + sessionKey: string; + sessionStore: Record | undefined; +}; + +function resolveSessionTranscriptRuntimeContext( + scope: SessionTranscriptRuntimeScope, +): SessionTranscriptRuntimeContext { + const agentId = scope.agentId ?? resolveAgentIdFromSessionKey(scope.sessionKey); + if (!agentId) { + throw new Error(`Cannot resolve transcript scope without an agent id: ${scope.sessionKey}`); + } + const sessionStore = scope.storePath + ? loadSessionStore(scope.storePath, { skipCache: true }) + : undefined; + const resolvedStoreEntry = sessionStore + ? resolveSessionStoreEntry({ store: sessionStore, sessionKey: scope.sessionKey }) + : undefined; + const sessionEntry = resolvedStoreEntry?.existing ?? loadSessionEntry(scope); + const sessionKey = resolvedStoreEntry?.normalizedKey ?? scope.sessionKey; + return { + agentId, + sessionKey, + sessionStore, + sessionEntry, + }; +} + /** * Resolves the current file-backed target for read-only transcript callers. * Unlike writer/runtime resolution, this does not persist missing sessionFile