// Local CLI: `executor open` must not trust a live pid in server.json until it // has proven the recorded endpoint is actually the running Executor server. import { execFile } from "node:child_process"; import { randomBytes } from "node:crypto"; import { chmodSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; import net from "node:net"; import { tmpdir } from "node:os"; import { delimiter, join } from "node:path"; import { fileURLToPath } from "node:url"; import { promisify } from "node:util"; import { expect } from "@effect/vitest"; import { Effect } from "effect"; import { normalizeExecutorServerConnection, serializeExecutorLocalServerManifest, } from "@executor-js/sdk/shared"; import { scenario } from "../src/scenario"; const execFileAsync = promisify(execFile); const repoRoot = fileURLToPath(new URL("../../", import.meta.url)); const freePort = (): Promise => new Promise((resolve, reject) => { const srv = net.createServer(); srv.on("error", reject); srv.listen(0, "127.0.0.1", () => { const port = (srv.address() as net.AddressInfo).port; srv.close(() => resolve(port)); }); }); const openerName = (): string => process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open"; scenario( "CLI open ยท a stale manifest cannot print or open the saved bearer URL", { timeout: 120_000 }, Effect.promise(async () => { const dataDir = mkdtempSync(join(tmpdir(), "executor-open-stale-")); const openerDir = mkdtempSync(join(tmpdir(), "executor-open-shim-")); try { const port = await freePort(); const token = `stale-token-${randomBytes(4).toString("hex")}`; mkdirSync(join(dataDir, "server-control"), { recursive: true }); writeFileSync( join(dataDir, "server-control", "server.json"), serializeExecutorLocalServerManifest({ version: 1, kind: "foreground", pid: process.pid, startedAt: new Date().toISOString(), dataDir, scopeDir: dataDir, connection: normalizeExecutorServerConnection({ origin: `http://127.0.0.1:${port}`, displayName: "Stale test server", auth: { kind: "bearer", token }, }), owner: { client: "cli", version: null, executablePath: null }, }), { mode: 0o600 }, ); const openerPath = join(openerDir, openerName()); writeFileSync(openerPath, "#!/bin/sh\nexit 0\n", { mode: 0o755 }); chmodSync(openerPath, 0o755); const { stdout, stderr } = await execFileAsync("bun", ["run", "dev:cli", "open"], { cwd: repoRoot, env: { ...process.env, EXECUTOR_DATA_DIR: dataDir, PATH: `${openerDir}${delimiter}${process.env.PATH ?? ""}`, }, }); const output = `${stdout}\n${stderr}`; expect(output, "stale endpoint should be rejected before printing the token URL").toContain( "Executor is not running.", ); expect(output, "the recovery path should point users at durable setup").toContain("install"); expect(output, "the old foreground behavior should remain discoverable").toContain( "web --foreground", ); expect(output, "the stale bearer must not be printed").not.toContain(token); expect(output, "the stale URL must not be opened").not.toContain(`127.0.0.1:${port}`); } finally { rmSync(openerDir, { recursive: true, force: true }); rmSync(dataDir, { recursive: true, force: true }); } }), );