refactor(agents): dedupe claude oauth parsing

This commit is contained in:
Peter Steinberger
2026-02-15 01:02:59 +00:00
parent 461ead8ceb
commit f58d4cad8e

View File

@@ -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<string, unknown>).accessToken;
const refreshToken = (claudeOauth as Record<string, unknown>).refreshToken;
const expiresAt = (claudeOauth as Record<string, unknown>).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<string, unknown>;
const claudeOauth = data.claudeAiOauth as Record<string, unknown> | 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?: {