From f58d4cad8ee7df19fdf1f0486ba3f8b0023e88e7 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 01:02:59 +0000 Subject: [PATCH] refactor(agents): dedupe claude oauth parsing --- src/agents/cli-credentials.ts | 97 ++++++++++++----------------------- 1 file changed, 33 insertions(+), 64 deletions(-) diff --git a/src/agents/cli-credentials.ts b/src/agents/cli-credentials.ts index 5d450feb5..819ad630f 100644 --- a/src/agents/cli-credentials.ts +++ b/src/agents/cli-credentials.ts @@ -93,6 +93,37 @@ function resolveClaudeCliCredentialsPath(homeDir?: string) { return path.join(baseDir, CLAUDE_CLI_CREDENTIALS_RELATIVE_PATH); } +function parseClaudeCliOauthCredential(claudeOauth: unknown): ClaudeCliCredential | null { + if (!claudeOauth || typeof claudeOauth !== "object") { + return null; + } + const accessToken = (claudeOauth as Record).accessToken; + const refreshToken = (claudeOauth as Record).refreshToken; + const expiresAt = (claudeOauth as Record).expiresAt; + + if (typeof accessToken !== "string" || !accessToken) { + return null; + } + if (typeof expiresAt !== "number" || !Number.isFinite(expiresAt) || expiresAt <= 0) { + return null; + } + if (typeof refreshToken === "string" && refreshToken) { + return { + type: "oauth", + provider: "anthropic", + access: accessToken, + refresh: refreshToken, + expires: expiresAt, + }; + } + return { + type: "token", + provider: "anthropic", + token: accessToken, + expires: expiresAt, + }; +} + function resolveCodexCliAuthPath() { return path.join(resolveCodexHomePath(), CODEX_CLI_AUTH_FILENAME); } @@ -255,38 +286,7 @@ function readClaudeCliKeychainCredentials( ); const data = JSON.parse(result.trim()); - const claudeOauth = data?.claudeAiOauth; - if (!claudeOauth || typeof claudeOauth !== "object") { - return null; - } - - const accessToken = claudeOauth.accessToken; - const refreshToken = claudeOauth.refreshToken; - const expiresAt = claudeOauth.expiresAt; - - if (typeof accessToken !== "string" || !accessToken) { - return null; - } - if (typeof expiresAt !== "number" || expiresAt <= 0) { - return null; - } - - if (typeof refreshToken === "string" && refreshToken) { - return { - type: "oauth", - provider: "anthropic", - access: accessToken, - refresh: refreshToken, - expires: expiresAt, - }; - } - - return { - type: "token", - provider: "anthropic", - token: accessToken, - expires: expiresAt, - }; + return parseClaudeCliOauthCredential(data?.claudeAiOauth); } catch { return null; } @@ -316,38 +316,7 @@ export function readClaudeCliCredentials(options?: { } const data = raw as Record; - const claudeOauth = data.claudeAiOauth as Record | undefined; - if (!claudeOauth || typeof claudeOauth !== "object") { - return null; - } - - const accessToken = claudeOauth.accessToken; - const refreshToken = claudeOauth.refreshToken; - const expiresAt = claudeOauth.expiresAt; - - if (typeof accessToken !== "string" || !accessToken) { - return null; - } - if (typeof expiresAt !== "number" || expiresAt <= 0) { - return null; - } - - if (typeof refreshToken === "string" && refreshToken) { - return { - type: "oauth", - provider: "anthropic", - access: accessToken, - refresh: refreshToken, - expires: expiresAt, - }; - } - - return { - type: "token", - provider: "anthropic", - token: accessToken, - expires: expiresAt, - }; + return parseClaudeCliOauthCredential(data.claudeAiOauth); } export function readClaudeCliCredentialsCached(options?: {