openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
73 lines (72 loc) • 2.79 kB
JavaScript
import { l as normalizeOptionalString } from "./string-coerce-1VuiLaaR.mjs";
import { c as isRecord } from "./record-coerce-TIsquoVR.mjs";
import { n as filterStringEntries } from "./string-normalization-D6DKCpwE.mjs";
import { a as runUtf8CommandWithTimeout } from "./exec-DdJWnONN.mjs";
import { a as resolveWindowsSpawnProgram, r as materializeWindowsSpawnProgram } from "./windows-spawn-Eu3IPAL5.mjs";
import "./string-coerce-runtime-BbIJhy7G.mjs";
import "./process-runtime-JJRvKfGm.mjs";
import { i as CLAUDE_CLI_CLEAR_ENV } from "./cli-constants-C8VZ3T9b.mjs";
//#region extensions/anthropic/cli-auth-seam.ts
const CLAUDE_CLI_AUTH_METHODS = [
"claude.ai",
"api_key",
"api_key_helper",
"oauth_token",
"third_party",
"none"
];
const CLI_BACKEND_PRESERVE_ENV = "OPENCLAW_LIVE_CLI_BACKEND_PRESERVE_ENV";
function readPreservedCliEnv(env) {
const raw = env[CLI_BACKEND_PRESERVE_ENV]?.trim();
if (!raw) return /* @__PURE__ */ new Set();
if (raw.startsWith("[")) try {
return new Set(filterStringEntries(JSON.parse(raw)));
} catch {
return /* @__PURE__ */ new Set();
}
return new Set(raw.split(/[,\s]+/).filter(Boolean));
}
/** Ask Claude CLI whether its own login is usable without reading token material. */
async function probeClaudeCliAuthStatus(params) {
const env = { ...params?.env ?? process.env };
const preserved = readPreservedCliEnv(env);
for (const name of CLAUDE_CLI_CLEAR_ENV) if (!preserved.has(name)) 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 };