scripts/verify-codex-token-refresh.mjs
Rama main · réplica de lectura del repositorio original.
// Real Codex, synthetic credentials and a loopback Responses service; never touches a user's Codex home.
import assert from "node:assert/strict";
import { spawn } from "node:child_process";
import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
import { createServer } from "node:http";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { fileURLToPath } from "node:url";
import { startChatGptTokenBridge } from "../server/drivers/chatgpt-plan-token-bridge.ts";
const cli = process.env.PROBE_CODEX || "codex";
const helper = process.env.PROBE_HELPER || fileURLToPath(new URL("../server/drivers/chatgpt-plan-token-command.ts", import.meta.url));
const runtime = process.env.PROBE_RUNTIME || process.execPath;
const event = (type, data) => `event: ${type}\ndata: ${JSON.stringify(data)}\n\n`;
async function scenario(dynamic) {
const dir = mkdtempSync(join(tmpdir(), "omb-codex-refresh-"));
const marker = join(dir, "tool-count");
let expired = false, requests = [];
const bridge = dynamic ? await startChatGptTokenBridge(async () => expired ? "fake-B" : "fake-A") : null;
const server = createServer((req, res) => {
req.resume();
req.on("end", () => {
if (!req.url?.includes("/responses")) { res.writeHead(404); res.end(); return; }
const token = (req.headers.authorization || "").replace("Bearer ", "");
requests.push(token);
if (requests.length > 1 && token === "fake-A") {
expired = true;
res.writeHead(401, { "content-type": "application/json" });
res.end(JSON.stringify({ error: { code: "token_expired", message: "synthetic token expired" } }));
return;
}
const item = requests.length === 1 ? {
id: "fc_fixture", type: "function_call", status: "completed", name: "exec_command", call_id: "call_fixture",
arguments: JSON.stringify({ cmd: `if [ -n "$OMB_CODEX_AUTH_SECRET" ]; then printf leak >> '${marker}'; else printf x >> '${marker}'; fi` }),
} : { id: "msg_fixture", type: "message", status: "completed", role: "assistant", content: [{ type: "output_text", text: "fixture ok", annotations: [] }] };
const id = `resp_fixture${requests.length}`;
res.writeHead(200, { "content-type": "text/event-stream" });
res.end(event("response.created", { type: "response.created", response: { id, status: "in_progress", output: [] } }) +
event("response.output_item.added", { type: "response.output_item.added", output_index: 0, item }) +
event("response.output_item.done", { type: "response.output_item.done", output_index: 0, item }) +
event("response.completed", { type: "response.completed", response: { id, status: "completed", output: [item], usage: { input_tokens: 1, output_tokens: 1, total_tokens: 2 } } }));
});
});
try {
await new Promise((resolve, reject) => { server.once("error", reject); server.listen(0, "127.0.0.1", resolve); });
const args = ["exec", "--skip-git-repo-check", "--ephemeral", "--sandbox", "workspace-write", "-m", "gpt-5",
"-c", 'model_provider="fixture"', "-c", 'model_providers.fixture.name="Fixture"',
"-c", `model_providers.fixture.base_url="http://127.0.0.1:${server.address().port}/v1"`,
"-c", 'model_providers.fixture.wire_api="responses"', "-c", "model_providers.fixture.requires_openai_auth=false",
"-c", "model_providers.fixture.supports_websockets=false", "-c", "model_providers.fixture.stream_max_retries=0",
"-c", "model_providers.fixture.request_max_retries=0", "-c", "features.shell_snapshot=false",
"-c", 'shell_environment_policy.exclude=["OMB_CODEX_AUTH_SECRET","OMB_CODEX_AUTH_SOCKET","ELECTRON_RUN_AS_NODE"]',
...(dynamic ? ["-c", `model_providers.fixture.auth.command=${JSON.stringify(runtime)}`,
"-c", `model_providers.fixture.auth.args=[${JSON.stringify(helper)}]`, "-c", "model_providers.fixture.auth.refresh_interval_ms=30000",
"-c", "model_providers.fixture.auth.timeout_ms=60000"] : ["-c", 'model_providers.fixture.env_key="FIXTURE_TOKEN"']), "Run fixture tool"];
const env = { PATH: process.env.PATH, HOME: dir, CODEX_HOME: dir, NO_PROXY: "127.0.0.1,localhost", FIXTURE_TOKEN: "fake-A", ELECTRON_RUN_AS_NODE: "1", ...bridge?.env };
const child = spawn(cli, args, { cwd: dir, env, stdio: ["ignore", "pipe", "pipe"] });
let output = ""; child.stdout.on("data", x => { output += x; }); child.stderr.on("data", x => { output += x; });
const timer = setTimeout(() => child.kill("SIGTERM"), 45000);
const code = await new Promise((resolve, reject) => { child.on("error", reject); child.on("close", resolve); });
clearTimeout(timer);
assert.equal(existsSync(marker) ? readFileSync(marker, "utf8") : "", "x", `tool must run once without the bridge secret: ${output.slice(-1200)}`);
assert.deepEqual(requests, dynamic ? ["fake-A", "fake-A", "fake-B"] : ["fake-A", "fake-A"]);
assert.equal(code, dynamic ? 0 : 1, output.slice(-1200));
console.log(`${dynamic ? "dynamic" : "static"}: ${dynamic ? "recovered" : "failed as expected"}; tool ran once`);
} finally { bridge?.close(); server.close(); rmSync(dir, { recursive: true, force: true }); }
}
await scenario(false);
await scenario(true);