From 2c5e24cbb5132e7848626cc9877e25431b9bd062 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 06:11:53 +0000 Subject: [PATCH] refactor(gateway): dedupe session usage file resolution --- src/gateway/server-methods/usage.ts | 78 +++++++++++++++-------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/src/gateway/server-methods/usage.ts b/src/gateway/server-methods/usage.ts index b8c55147129..65ce44070c2 100644 --- a/src/gateway/server-methods/usage.ts +++ b/src/gateway/server-methods/usage.ts @@ -10,7 +10,7 @@ import type { SessionModelUsage, SessionToolUsage, } from "../../infra/session-cost-usage.js"; -import type { GatewayRequestHandlers } from "./types.js"; +import type { GatewayRequestHandlers, RespondFn } from "./types.js"; import { loadConfig } from "../../config/config.js"; import { resolveSessionFilePath, @@ -50,6 +50,40 @@ type CostUsageCacheEntry = { const costUsageCache = new Map(); +function resolveSessionUsageFileOrRespond( + key: string, + respond: RespondFn, +): { + config: ReturnType; + entry: SessionEntry | undefined; + agentId: string | undefined; + sessionId: string; + sessionFile: string; +} | null { + const config = loadConfig(); + const { entry, storePath } = loadSessionEntry(key); + + // For discovered sessions (not in store), try using key as sessionId directly + const parsed = parseAgentSessionKey(key); + const agentId = parsed?.agentId; + const rawSessionId = parsed?.rest ?? key; + const sessionId = entry?.sessionId ?? rawSessionId; + let sessionFile: string; + try { + const pathOpts = resolveSessionFilePathOptions({ storePath, agentId }); + sessionFile = resolveSessionFilePath(sessionId, entry, pathOpts); + } catch { + respond( + false, + undefined, + errorShape(ErrorCodes.INVALID_REQUEST, `Invalid session key: ${key}`), + ); + return null; + } + + return { config, entry, agentId, sessionId, sessionFile }; +} + /** * Parse a date string (YYYY-MM-DD) to start of day timestamp in UTC. * Returns undefined if invalid. @@ -752,26 +786,11 @@ export const usageHandlers: GatewayRequestHandlers = { return; } - const config = loadConfig(); - const { entry, storePath } = loadSessionEntry(key); - - // For discovered sessions (not in store), try using key as sessionId directly - const parsed = parseAgentSessionKey(key); - const agentId = parsed?.agentId; - const rawSessionId = parsed?.rest ?? key; - const sessionId = entry?.sessionId ?? rawSessionId; - let sessionFile: string; - try { - const pathOpts = resolveSessionFilePathOptions({ storePath, agentId }); - sessionFile = resolveSessionFilePath(sessionId, entry, pathOpts); - } catch { - respond( - false, - undefined, - errorShape(ErrorCodes.INVALID_REQUEST, `Invalid session key: ${key}`), - ); + const resolved = resolveSessionUsageFileOrRespond(key, respond); + if (!resolved) { return; } + const { config, entry, agentId, sessionId, sessionFile } = resolved; const timeseries = await loadSessionUsageTimeSeries({ sessionId, @@ -805,26 +824,11 @@ export const usageHandlers: GatewayRequestHandlers = { ? Math.min(params.limit, 1000) : 200; - const config = loadConfig(); - const { entry, storePath } = loadSessionEntry(key); - - // For discovered sessions (not in store), try using key as sessionId directly - const parsed = parseAgentSessionKey(key); - const agentId = parsed?.agentId; - const rawSessionId = parsed?.rest ?? key; - const sessionId = entry?.sessionId ?? rawSessionId; - let sessionFile: string; - try { - const pathOpts = resolveSessionFilePathOptions({ storePath, agentId }); - sessionFile = resolveSessionFilePath(sessionId, entry, pathOpts); - } catch { - respond( - false, - undefined, - errorShape(ErrorCodes.INVALID_REQUEST, `Invalid session key: ${key}`), - ); + const resolved = resolveSessionUsageFileOrRespond(key, respond); + if (!resolved) { return; } + const { config, entry, agentId, sessionId, sessionFile } = resolved; const { loadSessionLogs } = await import("../../infra/session-cost-usage.js"); const logs = await loadSessionLogs({