Files
openclaw/scripts/print-cli-backend-live-metadata.ts
Iftekhar Uddin 5e8a9a905d fix(scripts): drain codex-cli metadata stdout (#84239) (thanks @IftekharUddin)
Behavior addressed: The codex-cli metadata branch no longer calls process.exit(0) immediately after writing stdout, and it still emits exactly one unsupported-backend JSON object.

Real environment tested: Local OpenClaw source checkout on macOS with Node/tsx.

Exact steps or command run after this patch: pnpm test test/scripts/print-cli-backend-live-metadata.test.ts test/scripts/docker-build-helper.test.ts; node --import tsx scripts/print-cli-backend-live-metadata.ts codex-cli | python3 -c 'import sys,json; print(json.load(sys.stdin)["provider"])'; autoreview --mode branch --base origin/main --no-web-search.

Evidence after fix: Focused tooling test shard passed 2 files / 23 tests; direct pipe parse printed codex-cli; autoreview reported no accepted/actionable findings; PR status rollup was clean.

Observed result after fix: stdout is parseable as a single JSON payload and the normal metadata path is skipped for codex-cli.

What was not tested: Live provider metadata paths beyond the focused existing test coverage.

Co-authored-by: Iftekhar Uddin <ifuddin3@gmail.com>
2026-05-25 23:27:13 +01:00

84 lines
2.7 KiB
TypeScript

import { resolveCliBackendConfig, resolveCliBackendLiveTest } from "../src/agents/cli-backends.js";
const provider = process.argv[2]?.trim().toLowerCase();
if (!provider) {
console.error("usage: node scripts/print-cli-backend-live-metadata.ts <provider>");
process.exit(1);
}
if (provider === "codex-cli") {
process.stdout.write(
JSON.stringify(
{
provider,
unsupported: true,
reason:
"codex-cli is no longer a bundled CLI backend. Use openai/* with the Codex app-server runtime instead.",
},
null,
2,
),
);
process.exitCode = 0;
} else {
await printBackendMetadata(provider);
}
async function printBackendMetadata(provider: string) {
const resolved = resolveCliBackendConfig(provider);
const liveTest = resolveCliBackendLiveTest(provider);
const fallbackBackend =
!resolved || !liveTest?.defaultModelRef ? await loadFallbackBackend(provider) : null;
const backendConfig = resolved?.config ?? fallbackBackend?.config;
const backendLiveTest =
liveTest ??
(fallbackBackend
? {
defaultModelRef: fallbackBackend.liveTest?.defaultModelRef,
defaultImageProbe: fallbackBackend.liveTest?.defaultImageProbe === true,
defaultMcpProbe: fallbackBackend.liveTest?.defaultMcpProbe === true,
dockerNpmPackage: fallbackBackend.liveTest?.docker?.npmPackage,
dockerBinaryName: fallbackBackend.liveTest?.docker?.binaryName,
}
: null);
process.stdout.write(
JSON.stringify(
{
provider,
command: backendConfig?.command,
args: backendConfig?.args,
clearEnv: backendConfig?.clearEnv ?? [],
imageArg: backendConfig?.imageArg,
imageMode: backendConfig?.imageMode,
systemPromptWhen: backendConfig?.systemPromptWhen ?? "never",
bundleMcp: resolved?.bundleMcp === true || fallbackBackend?.bundleMcp === true,
bundleMcpMode: resolved?.bundleMcpMode ?? fallbackBackend?.bundleMcpMode,
defaultModelRef: backendLiveTest?.defaultModelRef,
defaultImageProbe: backendLiveTest?.defaultImageProbe === true,
defaultMcpProbe: backendLiveTest?.defaultMcpProbe === true,
dockerNpmPackage: backendLiveTest?.dockerNpmPackage,
dockerBinaryName: backendLiveTest?.dockerBinaryName,
},
null,
2,
),
);
}
async function loadFallbackBackend(id: string) {
switch (id) {
case "claude-cli": {
const mod = await import("../extensions/anthropic/cli-backend.ts");
return mod.buildAnthropicCliBackend();
}
case "google-gemini-cli": {
const mod = await import("../extensions/google/cli-backend.ts");
return mod.buildGoogleGeminiCliBackend();
}
default:
return null;
}
}