openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
60 lines (59 loc) • 2.23 kB
JavaScript
import { c as isRecord } from "./record-coerce-DItp3I4t.js";
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js";
import { i as runUtf8CommandWithTimeout } from "./exec-BIE-3oLG.js";
import { a as resolveWindowsSpawnProgram, r as materializeWindowsSpawnProgram } from "./windows-spawn-oyE-2b7Z.js";
import "./string-coerce-runtime-GQa0ehRA.js";
import "./process-runtime-pcN9RjT8.js";
import { r as CLAUDE_CLI_CLEAR_ENV } from "./cli-constants-Dsp5krT8.js";
//#region extensions/anthropic/cli-auth-seam.ts
const CLAUDE_CLI_AUTH_METHODS = [
"claude.ai",
"api_key",
"api_key_helper",
"oauth_token",
"third_party",
"none"
];
/** Ask Claude CLI whether its own login is usable without reading token material. */
async function probeClaudeCliAuthStatus(params) {
const env = { ...params?.env ?? process.env };
for (const name of CLAUDE_CLI_CLEAR_ENV) delete env[name];
try {
const program = resolveWindowsSpawnProgram({
command: params?.command ?? "claude",
env,
packageName: "@anthropic-ai/claude-code"
});
const invocation = materializeWindowsSpawnProgram(program, [
"auth",
"status",
"--json"
]);
const result = await runUtf8CommandWithTimeout([invocation.command, ...invocation.argv], {
baseEnv: env,
maxOutputBytes: 65536,
maxCombinedOutputBytes: 65536,
terminateOnOutputLimit: true,
timeoutMs: 3e3,
signal: params?.signal,
killProcessTree: true
});
params?.signal?.throwIfAborted();
if (result.termination !== "exit" || result.code === null) return { status: "unreadable" };
if (result.code !== 0) return { status: "missing" };
const parsed = JSON.parse(result.stdout);
if (!isRecord(parsed) || parsed.loggedIn !== true) return { status: "missing" };
const authMethod = CLAUDE_CLI_AUTH_METHODS.find((method) => method === parsed.authMethod);
const email = authMethod === "claude.ai" ? normalizeOptionalString(parsed.email) : void 0;
return {
status: "available",
...authMethod ? { authMethod } : {},
...email && email.length <= 320 && !/[\r\n]/u.test(email) ? { email } : {}
};
} catch {
params?.signal?.throwIfAborted();
return { status: "unreadable" };
}
}
//#endregion
export { probeClaudeCliAuthStatus as t };