Added logic so that when we run `./scripts/stage_release.sh --native` (for the `@native` version of the Node module), we drop a `use-native` file next to `codex.js`. If present, `codex.js` will now run the Rust CLI. Ran `./scripts/stage_release.sh --native` and verified that when the running `codex.js` in the staged folder: ``` $ /var/folders/wm/f209bc1n2bd_r0jncn9s6j_00000gp/T/tmp.efvEvBlSN6/bin/codex.js --version codex-cli 0.0.2505220956 ``` it ran the expected Rust version of the CLI, as desired. While here, I also updated the Rust version to one that I cut today, which includes the new shell environment policy config option: https://github.com/openai/codex/pull/1061. Note this may "break" some users if the processes spawned by Codex need extra environment variables. (We are still working to determine what the right defaults should be for this option.)
100 lines
2.8 KiB
JavaScript
Executable File
100 lines
2.8 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
// Unified entry point for the Codex CLI.
|
|
/*
|
|
* Behavior
|
|
* =========
|
|
* 1. By default we import the JavaScript implementation located in
|
|
* dist/cli.js.
|
|
*
|
|
* 2. Developers can opt-in to a pre-compiled Rust binary by setting the
|
|
* environment variable CODEX_RUST to a truthy value (`1`, `true`, etc.).
|
|
* When that variable is present we resolve the correct binary for the
|
|
* current platform / architecture and execute it via child_process.
|
|
*
|
|
* If the CODEX_RUST=1 is specified and there is no native binary for the
|
|
* current platform / architecture, an error is thrown.
|
|
*/
|
|
|
|
import { spawnSync } from "child_process";
|
|
import fs from "fs";
|
|
import path from "path";
|
|
import { fileURLToPath, pathToFileURL } from "url";
|
|
|
|
// Determine whether the user explicitly wants the Rust CLI.
|
|
|
|
// __dirname equivalent in ESM
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
|
|
// For the @native release of the Node module, the `use-native` file is added,
|
|
// indicating we should default to the native binary. For other releases,
|
|
// setting CODEX_RUST=1 will opt-in to the native binary, if included.
|
|
const wantsNative = fs.existsSync(path.join(__dirname, "use-native")) ||
|
|
(process.env.CODEX_RUST != null
|
|
? ["1", "true", "yes"].includes(process.env.CODEX_RUST.toLowerCase())
|
|
: false);
|
|
|
|
// Try native binary if requested.
|
|
if (wantsNative) {
|
|
const { platform, arch } = process;
|
|
|
|
let targetTriple = null;
|
|
switch (platform) {
|
|
case "linux":
|
|
switch (arch) {
|
|
case "x64":
|
|
targetTriple = "x86_64-unknown-linux-musl";
|
|
break;
|
|
case "arm64":
|
|
targetTriple = "aarch64-unknown-linux-gnu";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case "darwin":
|
|
switch (arch) {
|
|
case "x64":
|
|
targetTriple = "x86_64-apple-darwin";
|
|
break;
|
|
case "arm64":
|
|
targetTriple = "aarch64-apple-darwin";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (!targetTriple) {
|
|
throw new Error(`Unsupported platform: ${platform} (${arch})`);
|
|
}
|
|
|
|
const binaryPath = path.join(__dirname, "..", "bin", `codex-${targetTriple}`);
|
|
const result = spawnSync(binaryPath, process.argv.slice(2), {
|
|
stdio: "inherit",
|
|
});
|
|
|
|
const exitCode = typeof result.status === "number" ? result.status : 1;
|
|
process.exit(exitCode);
|
|
}
|
|
|
|
// Fallback: execute the original JavaScript CLI.
|
|
|
|
// Resolve the path to the compiled CLI bundle
|
|
const cliPath = path.resolve(__dirname, "../dist/cli.js");
|
|
const cliUrl = pathToFileURL(cliPath).href;
|
|
|
|
// Load and execute the CLI
|
|
(async () => {
|
|
try {
|
|
await import(cliUrl);
|
|
} catch (err) {
|
|
// eslint-disable-next-line no-console
|
|
console.error(err);
|
|
process.exit(1);
|
|
}
|
|
})();
|