2026-07-23 19:28:55 -07:00
|
|
|
|
/**
|
|
|
|
|
|
* End-to-end contract tests for ECC's real local Itô CLI bridge.
|
|
|
|
|
|
*
|
|
|
|
|
|
* The executable used here is a process-boundary probe. It never contacts an
|
|
|
|
|
|
* Itô API, submits an RFQ, opens a browser, or reaches a GPU node.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
const assert = require("assert");
|
|
|
|
|
|
const fs = require("fs");
|
|
|
|
|
|
const os = require("os");
|
|
|
|
|
|
const path = require("path");
|
2026-08-05 18:17:10 -04:00
|
|
|
|
const { spawn, spawnSync } = require("child_process");
|
2026-07-23 19:28:55 -07:00
|
|
|
|
|
|
|
|
|
|
const REPO_ROOT = path.join(__dirname, "..", "..");
|
|
|
|
|
|
const ECC_SCRIPT = path.join(REPO_ROOT, "scripts", "ecc.js");
|
2026-07-23 22:10:57 -07:00
|
|
|
|
const ITO_SCRIPT = path.join(REPO_ROOT, "scripts", "ito.js");
|
2026-07-23 19:28:55 -07:00
|
|
|
|
const CANONICAL_PACKAGE = "Ito-Markets/ito-cloud-runtime/cli/ito-compute-cli";
|
2026-07-23 22:10:57 -07:00
|
|
|
|
const {
|
|
|
|
|
|
NODE_QUALIFICATION_TIMEOUT_MS,
|
|
|
|
|
|
} = require("../../scripts/ito");
|
|
|
|
|
|
const {
|
|
|
|
|
|
createSafeItoInvocationEnvironment,
|
|
|
|
|
|
getInvocationCommand,
|
2026-08-05 18:17:10 -04:00
|
|
|
|
ITO_RUNTIME_ENVIRONMENT_KEYS,
|
2026-07-23 22:10:57 -07:00
|
|
|
|
} = require("../../scripts/lib/ito-environment");
|
2026-07-23 19:28:55 -07:00
|
|
|
|
|
|
|
|
|
|
function runCli(args, environment = {}) {
|
|
|
|
|
|
return spawnSync(process.execPath, [ECC_SCRIPT, ...args], {
|
|
|
|
|
|
cwd: REPO_ROOT,
|
|
|
|
|
|
encoding: "utf8",
|
|
|
|
|
|
env: {
|
|
|
|
|
|
...process.env,
|
|
|
|
|
|
NODE_ENV: "test",
|
|
|
|
|
|
...environment,
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-05 18:17:10 -04:00
|
|
|
|
function runCliAndObserveFirstOutput(args, environment = {}) {
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
const child = spawn(process.execPath, [ECC_SCRIPT, ...args], {
|
|
|
|
|
|
cwd: REPO_ROOT,
|
|
|
|
|
|
env: { ...process.env, NODE_ENV: "test", ...environment },
|
|
|
|
|
|
stdio: ["ignore", "pipe", "pipe"],
|
|
|
|
|
|
});
|
|
|
|
|
|
let stdout = "";
|
|
|
|
|
|
let stderr = "";
|
|
|
|
|
|
let firstOutputAt;
|
|
|
|
|
|
const startedAt = Date.now();
|
|
|
|
|
|
child.stdout.on("data", (chunk) => {
|
|
|
|
|
|
if (firstOutputAt === undefined) firstOutputAt = Date.now();
|
|
|
|
|
|
stdout += chunk;
|
|
|
|
|
|
});
|
|
|
|
|
|
child.stderr.on("data", (chunk) => { stderr += chunk; });
|
|
|
|
|
|
child.once("error", reject);
|
|
|
|
|
|
child.once("close", (status) => resolve({
|
|
|
|
|
|
status,
|
|
|
|
|
|
stdout,
|
|
|
|
|
|
stderr,
|
|
|
|
|
|
startedAt,
|
|
|
|
|
|
firstOutputAt,
|
|
|
|
|
|
closedAt: Date.now(),
|
|
|
|
|
|
}));
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-23 19:28:55 -07:00
|
|
|
|
function makeItoProbe(exitCode = 0) {
|
|
|
|
|
|
const directory = fs.mkdtempSync(path.join(os.tmpdir(), "ecc-ito-cli-"));
|
|
|
|
|
|
const log = path.join(directory, "invocation.json");
|
2026-07-23 21:07:59 -07:00
|
|
|
|
const script = path.join(
|
|
|
|
|
|
directory,
|
|
|
|
|
|
"ito-cloud-runtime",
|
|
|
|
|
|
"cli",
|
|
|
|
|
|
"ito-compute-cli",
|
|
|
|
|
|
"dist",
|
|
|
|
|
|
"bin",
|
|
|
|
|
|
"ito.js"
|
|
|
|
|
|
);
|
2026-07-23 19:28:55 -07:00
|
|
|
|
const executable = script;
|
2026-07-23 21:07:59 -07:00
|
|
|
|
fs.mkdirSync(path.dirname(script), { recursive: true });
|
2026-07-23 19:28:55 -07:00
|
|
|
|
fs.writeFileSync(
|
|
|
|
|
|
script,
|
|
|
|
|
|
[
|
|
|
|
|
|
`#!${process.execPath}`,
|
|
|
|
|
|
'"use strict";',
|
|
|
|
|
|
'const fs = require("fs");',
|
|
|
|
|
|
`fs.writeFileSync(${JSON.stringify(log)}, JSON.stringify({ argv: process.argv.slice(2), env: process.env }));`,
|
|
|
|
|
|
'process.stdout.write(`ito-probe:${process.argv.slice(2).join("|")}\\n`);',
|
|
|
|
|
|
'process.stderr.write("ito-probe-stderr\\n");',
|
|
|
|
|
|
`process.exit(${exitCode});`,
|
|
|
|
|
|
"",
|
|
|
|
|
|
].join("\n")
|
|
|
|
|
|
);
|
|
|
|
|
|
if (process.platform !== "win32") {
|
|
|
|
|
|
fs.chmodSync(script, 0o755);
|
|
|
|
|
|
}
|
|
|
|
|
|
return Object.freeze({ directory, executable, log });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function readInvocation(probe) {
|
|
|
|
|
|
return JSON.parse(fs.readFileSync(probe.log, "utf8"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-05 18:17:10 -04:00
|
|
|
|
async function runTest(name, fn) {
|
2026-07-23 19:28:55 -07:00
|
|
|
|
try {
|
2026-08-05 18:17:10 -04:00
|
|
|
|
await fn();
|
2026-07-23 19:28:55 -07:00
|
|
|
|
console.log(` ✓ ${name}`);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.log(` ✗ ${name}`);
|
|
|
|
|
|
console.error(` ${error.message}`);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-05 18:17:10 -04:00
|
|
|
|
async function main() {
|
2026-07-23 19:28:55 -07:00
|
|
|
|
console.log("\n=== Testing ECC × Itô real CLI bridge ===\n");
|
|
|
|
|
|
|
|
|
|
|
|
const tests = [
|
2026-07-23 22:10:57 -07:00
|
|
|
|
["forwards only the reviewed RFQ CLI surface to an explicit local executable", () => {
|
2026-08-07 14:53:13 -04:00
|
|
|
|
for (const command of ["login", "logout", "auth", "find", "status"]) {
|
2026-07-23 19:28:55 -07:00
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["ito", command], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
|
|
|
|
|
assert.deepStrictEqual(readInvocation(probe).argv, [command]);
|
|
|
|
|
|
assert.match(result.stdout, new RegExp(`ito-probe:${command}`));
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
2026-08-07 14:53:13 -04:00
|
|
|
|
["forwards logout with device-token settings but never an API key", () => {
|
|
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["ito", "logout", "--json"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
ITO_API_KEY: "must-not-cross-into-device-revocation",
|
|
|
|
|
|
ITO_ALLOW_FILE_TOKEN: "1",
|
|
|
|
|
|
ITO_TOKEN_FILE: "/tmp/ito-device-token",
|
|
|
|
|
|
ITO_API_URL: "https://compute.example.test",
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
|
|
|
|
|
const invocation = readInvocation(probe);
|
|
|
|
|
|
assert.deepStrictEqual(invocation.argv, ["--json", "logout"]);
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_API_KEY, undefined);
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_ALLOW_FILE_TOKEN, "1");
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_TOKEN_FILE, "/tmp/ito-device-token");
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_API_URL, "https://compute.example.test");
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
2026-08-05 18:17:10 -04:00
|
|
|
|
["forwards the canonical login browser opt-out without performing browser automation", () => {
|
|
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["ito", "login", "--no-browser"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
|
|
|
|
|
assert.deepStrictEqual(readInvocation(probe).argv, ["login", "--no-browser"]);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
|
|
|
|
|
["rejects --no-browser on validation-only auth before spawning", () => {
|
|
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["ito", "auth", "--no-browser"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.notStrictEqual(result.status, 0);
|
|
|
|
|
|
assert.match(result.stderr, /--no-browser.*only.*login/i);
|
|
|
|
|
|
assert.ok(!fs.existsSync(probe.log));
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
2026-07-23 19:28:55 -07:00
|
|
|
|
["normalizes JSON and forwards every RFQ constraint without interpretation", () => {
|
|
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const args = [
|
|
|
|
|
|
"ito",
|
|
|
|
|
|
"find",
|
|
|
|
|
|
"--gpu", "h200",
|
|
|
|
|
|
"--count", "8",
|
|
|
|
|
|
"--nodes", "1",
|
|
|
|
|
|
"--gpus-per-node", "8",
|
|
|
|
|
|
"--days", "30",
|
|
|
|
|
|
"--storage-tb", "1",
|
|
|
|
|
|
"--start-window", "2099-08-15",
|
|
|
|
|
|
"--max-rate", "3.00",
|
|
|
|
|
|
"--form-factor", "bare_metal",
|
|
|
|
|
|
"--contract-type", "reservation",
|
|
|
|
|
|
"--fabric", "infiniband",
|
|
|
|
|
|
"--region", "us-east-1",
|
|
|
|
|
|
"--json",
|
|
|
|
|
|
];
|
|
|
|
|
|
const result = runCli(args, {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
|
|
|
|
|
assert.deepStrictEqual(readInvocation(probe).argv, [
|
|
|
|
|
|
"--json",
|
|
|
|
|
|
...args.slice(1, -1),
|
|
|
|
|
|
]);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
2026-08-05 18:17:10 -04:00
|
|
|
|
["login never inherits ITO_API_KEY but preserves secure token settings", () => {
|
2026-07-23 19:28:55 -07:00
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
2026-08-05 18:17:10 -04:00
|
|
|
|
const result = runCli(["ito", "login"], {
|
2026-07-23 19:28:55 -07:00
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
2026-08-05 18:17:10 -04:00
|
|
|
|
ITO_API_KEY: "must-not-cross-without-legacy-mode",
|
|
|
|
|
|
ITO_AUTH_MODE: "device",
|
|
|
|
|
|
ITO_ALLOW_FILE_TOKEN: "1",
|
|
|
|
|
|
ITO_TOKEN_FILE: "/tmp/ito-device-token",
|
2026-07-23 19:28:55 -07:00
|
|
|
|
ITO_API_URL: "https://compute.example.test",
|
|
|
|
|
|
ITO_INVENTORY_URL: "https://edge.example.test",
|
|
|
|
|
|
AWS_SECRET_ACCESS_KEY: "must-not-cross",
|
|
|
|
|
|
OPENAI_API_KEY: "must-not-cross",
|
|
|
|
|
|
TEST_PASSWORD: "must-not-cross",
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
|
|
|
|
|
const childEnvironment = readInvocation(probe).env;
|
2026-08-05 18:17:10 -04:00
|
|
|
|
assert.strictEqual(childEnvironment.ITO_API_KEY, undefined);
|
|
|
|
|
|
assert.strictEqual(childEnvironment.ITO_AUTH_MODE, "device");
|
|
|
|
|
|
assert.strictEqual(childEnvironment.ITO_ALLOW_FILE_TOKEN, "1");
|
|
|
|
|
|
assert.strictEqual(childEnvironment.ITO_TOKEN_FILE, "/tmp/ito-device-token");
|
2026-07-23 19:28:55 -07:00
|
|
|
|
assert.strictEqual(childEnvironment.ITO_API_URL, "https://compute.example.test");
|
|
|
|
|
|
assert.strictEqual(childEnvironment.ITO_INVENTORY_URL, "https://edge.example.test");
|
|
|
|
|
|
assert.strictEqual(childEnvironment.AWS_SECRET_ACCESS_KEY, undefined);
|
|
|
|
|
|
assert.strictEqual(childEnvironment.OPENAI_API_KEY, undefined);
|
|
|
|
|
|
assert.strictEqual(childEnvironment.TEST_PASSWORD, undefined);
|
|
|
|
|
|
assert.strictEqual(childEnvironment.ECC_ITO_CLI_EXECUTABLE, undefined);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
2026-08-05 18:17:10 -04:00
|
|
|
|
["forwards ITO_API_KEY directly to auth, find, and status without legacy mode", () => {
|
|
|
|
|
|
for (const command of ["auth", "find", "status"]) {
|
|
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["ito", command], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
ITO_API_KEY: "ito_test_key",
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
|
|
|
|
|
assert.strictEqual(readInvocation(probe).env.ITO_API_KEY, "ito_test_key");
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
|
|
|
|
|
["streams device login output before completion and propagates its exit status", async () => {
|
|
|
|
|
|
const probe = makeItoProbe(7);
|
|
|
|
|
|
try {
|
|
|
|
|
|
fs.writeFileSync(
|
|
|
|
|
|
probe.executable,
|
|
|
|
|
|
[
|
|
|
|
|
|
'"use strict";',
|
|
|
|
|
|
'process.stdout.write("device-code-now\\n");',
|
|
|
|
|
|
'setTimeout(() => process.exit(7), 500);',
|
|
|
|
|
|
"",
|
|
|
|
|
|
].join("\n")
|
|
|
|
|
|
);
|
|
|
|
|
|
const result = await runCliAndObserveFirstOutput(["ito", "login"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 7, result.stderr);
|
|
|
|
|
|
assert.match(result.stdout, /device-code-now/);
|
|
|
|
|
|
assert.ok(
|
|
|
|
|
|
result.closedAt - result.firstOutputAt >= 350,
|
|
|
|
|
|
"login output was buffered until process completion",
|
|
|
|
|
|
);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
2026-07-23 22:10:57 -07:00
|
|
|
|
["isolates live node qualification from Itô and unrelated credentials", () => {
|
|
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const configDirectory = path.join(probe.directory, "qualification");
|
|
|
|
|
|
fs.mkdirSync(configDirectory);
|
|
|
|
|
|
fs.writeFileSync(path.join(configDirectory, "sixtytwo.yaml"), "suite: full\n");
|
|
|
|
|
|
const result = runCli([
|
|
|
|
|
|
"ito",
|
|
|
|
|
|
"evals",
|
|
|
|
|
|
"--cluster", "clu_prod_example",
|
|
|
|
|
|
"--live-sixtytwo",
|
|
|
|
|
|
"--nodes", "gpu-01,gpu-02",
|
|
|
|
|
|
"--config-dir", configDirectory,
|
|
|
|
|
|
], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
ITO_API_KEY: "must-not-cross-into-node-qualification",
|
2026-08-05 18:17:10 -04:00
|
|
|
|
ITO_AUTH_MODE: "legacy",
|
|
|
|
|
|
ITO_ALLOW_FILE_TOKEN: "1",
|
|
|
|
|
|
ITO_TOKEN_FILE: "/tmp/must-not-cross-token-file",
|
2026-07-23 22:10:57 -07:00
|
|
|
|
ITO_API_URL: "https://compute.example.test",
|
|
|
|
|
|
ITO_INVENTORY_URL: "https://edge.example.test",
|
|
|
|
|
|
ITO_ENABLE_SIXTYTWO_LIVE: "1",
|
|
|
|
|
|
SIXTYTWO_API_TOKEN: "sixtytwo-test-token",
|
|
|
|
|
|
SIXTYTWO_TOKEN: "sixtytwo-legacy-test-token",
|
|
|
|
|
|
SSH_AUTH_SOCK: "/tmp/ecc-test-agent.sock",
|
|
|
|
|
|
ITO_CLI_DEMO: "1",
|
|
|
|
|
|
ITO_CLI_STATE_DIR: "/tmp/forbidden-paper-state",
|
|
|
|
|
|
AWS_SECRET_ACCESS_KEY: "must-not-cross",
|
|
|
|
|
|
OPENAI_API_KEY: "must-not-cross",
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
|
|
|
|
|
const invocation = readInvocation(probe);
|
|
|
|
|
|
assert.deepStrictEqual(invocation.argv, [
|
|
|
|
|
|
"evals",
|
|
|
|
|
|
"--cluster", "clu_prod_example",
|
|
|
|
|
|
"--live-sixtytwo",
|
|
|
|
|
|
"--nodes", "gpu-01,gpu-02",
|
|
|
|
|
|
"--config-dir", configDirectory,
|
|
|
|
|
|
]);
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_ENABLE_SIXTYTWO_LIVE, "1");
|
|
|
|
|
|
assert.strictEqual(invocation.env.SIXTYTWO_API_TOKEN, "sixtytwo-test-token");
|
|
|
|
|
|
assert.strictEqual(invocation.env.SIXTYTWO_TOKEN, "sixtytwo-legacy-test-token");
|
|
|
|
|
|
assert.strictEqual(invocation.env.SSH_AUTH_SOCK, "/tmp/ecc-test-agent.sock");
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_API_KEY, undefined);
|
2026-08-05 18:17:10 -04:00
|
|
|
|
assert.strictEqual(invocation.env.ITO_AUTH_MODE, undefined);
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_ALLOW_FILE_TOKEN, undefined);
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_TOKEN_FILE, undefined);
|
2026-07-23 22:10:57 -07:00
|
|
|
|
assert.strictEqual(invocation.env.ITO_API_URL, undefined);
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_INVENTORY_URL, undefined);
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_CLI_DEMO, undefined);
|
|
|
|
|
|
assert.strictEqual(invocation.env.ITO_CLI_STATE_DIR, undefined);
|
|
|
|
|
|
assert.strictEqual(invocation.env.AWS_SECRET_ACCESS_KEY, undefined);
|
|
|
|
|
|
assert.strictEqual(invocation.env.OPENAI_API_KEY, undefined);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
|
|
|
|
|
["rejects every incomplete live qualification before spawning", () => {
|
|
|
|
|
|
const validArgs = [
|
|
|
|
|
|
"ito",
|
|
|
|
|
|
"evals",
|
|
|
|
|
|
"--cluster", "clu_prod_example",
|
|
|
|
|
|
"--live-sixtytwo",
|
|
|
|
|
|
"--nodes", "gpu-01,gpu-02",
|
|
|
|
|
|
];
|
|
|
|
|
|
const cases = [
|
|
|
|
|
|
{
|
|
|
|
|
|
label: "missing environment opt-in",
|
|
|
|
|
|
args: [...validArgs, "--config-dir", "__CONFIG__"],
|
|
|
|
|
|
env: {},
|
|
|
|
|
|
error: /ITO_ENABLE_SIXTYTWO_LIVE=1/,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: "missing live flag",
|
|
|
|
|
|
args: validArgs.filter((value) => value !== "--live-sixtytwo")
|
|
|
|
|
|
.concat("--config-dir", "__CONFIG__"),
|
|
|
|
|
|
env: { ITO_ENABLE_SIXTYTWO_LIVE: "1" },
|
|
|
|
|
|
error: /--live-sixtytwo/,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: "missing nodes",
|
|
|
|
|
|
args: [
|
|
|
|
|
|
"ito", "evals",
|
|
|
|
|
|
"--cluster", "clu_prod_example",
|
|
|
|
|
|
"--live-sixtytwo",
|
|
|
|
|
|
"--config-dir", "__CONFIG__",
|
|
|
|
|
|
],
|
|
|
|
|
|
env: { ITO_ENABLE_SIXTYTWO_LIVE: "1" },
|
|
|
|
|
|
error: /--nodes/,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: "empty node list",
|
|
|
|
|
|
args: [
|
|
|
|
|
|
"ito", "evals",
|
|
|
|
|
|
"--cluster", "clu_prod_example",
|
|
|
|
|
|
"--live-sixtytwo",
|
|
|
|
|
|
"--nodes", ",",
|
|
|
|
|
|
"--config-dir", "__CONFIG__",
|
|
|
|
|
|
],
|
|
|
|
|
|
env: { ITO_ENABLE_SIXTYTWO_LIVE: "1" },
|
|
|
|
|
|
error: /--nodes/,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: "missing cluster",
|
|
|
|
|
|
args: [
|
|
|
|
|
|
"ito", "evals",
|
|
|
|
|
|
"--live-sixtytwo",
|
|
|
|
|
|
"--nodes", "gpu-01",
|
|
|
|
|
|
"--config-dir", "__CONFIG__",
|
|
|
|
|
|
],
|
|
|
|
|
|
env: { ITO_ENABLE_SIXTYTWO_LIVE: "1" },
|
|
|
|
|
|
error: /--cluster/,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: "relative config directory",
|
|
|
|
|
|
args: [...validArgs, "--config-dir", "relative/config"],
|
|
|
|
|
|
env: { ITO_ENABLE_SIXTYTWO_LIVE: "1" },
|
|
|
|
|
|
error: /absolute/,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: "missing config directory",
|
|
|
|
|
|
args: [...validArgs, "--config-dir", "__MISSING_CONFIG__"],
|
|
|
|
|
|
env: { ITO_ENABLE_SIXTYTWO_LIVE: "1" },
|
|
|
|
|
|
error: /sixtytwo\.yaml/,
|
|
|
|
|
|
},
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
for (const testCase of cases) {
|
|
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const configDirectory = path.join(probe.directory, "qualification");
|
|
|
|
|
|
fs.mkdirSync(configDirectory);
|
|
|
|
|
|
fs.writeFileSync(path.join(configDirectory, "sixtytwo.yaml"), "suite: full\n");
|
|
|
|
|
|
const args = testCase.args.map((value) => (
|
|
|
|
|
|
value === "__CONFIG__"
|
|
|
|
|
|
? configDirectory
|
|
|
|
|
|
: value === "__MISSING_CONFIG__"
|
|
|
|
|
|
? path.join(probe.directory, "missing")
|
|
|
|
|
|
: value
|
|
|
|
|
|
));
|
|
|
|
|
|
const result = runCli(args, {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
...testCase.env,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.notStrictEqual(result.status, 0, testCase.label);
|
|
|
|
|
|
assert.match(result.stderr, testCase.error, testCase.label);
|
|
|
|
|
|
assert.ok(
|
|
|
|
|
|
!fs.existsSync(probe.log),
|
|
|
|
|
|
`${testCase.label} must not spawn the canonical Itô CLI`,
|
|
|
|
|
|
);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
|
|
|
|
|
["classifies Itō child environments once and fails closed on unknown prefixes", () => {
|
2026-08-05 18:17:10 -04:00
|
|
|
|
assert.deepStrictEqual(ITO_RUNTIME_ENVIRONMENT_KEYS, [
|
|
|
|
|
|
"ITO_API_KEY",
|
|
|
|
|
|
"ITO_API_URL",
|
|
|
|
|
|
"ITO_INVENTORY_URL",
|
|
|
|
|
|
"ITO_AUTH_MODE",
|
|
|
|
|
|
"ITO_ALLOW_FILE_TOKEN",
|
|
|
|
|
|
"ITO_TOKEN_FILE",
|
|
|
|
|
|
]);
|
2026-07-23 22:10:57 -07:00
|
|
|
|
const safe = createSafeItoInvocationEnvironment(
|
|
|
|
|
|
{
|
|
|
|
|
|
PATH: process.env.PATH,
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: "/operator/canonical/ito.js",
|
|
|
|
|
|
ITO_API_KEY: "must-not-cross",
|
|
|
|
|
|
SIXTYTWO_TOKEN: "must-not-cross",
|
|
|
|
|
|
},
|
|
|
|
|
|
["--future-ecc-flag", "evals"],
|
|
|
|
|
|
{ includeControls: true },
|
|
|
|
|
|
);
|
|
|
|
|
|
assert.strictEqual(safe.ECC_ITO_CLI_EXECUTABLE, "/operator/canonical/ito.js");
|
|
|
|
|
|
assert.strictEqual(safe.ITO_API_KEY, undefined);
|
|
|
|
|
|
assert.strictEqual(safe.SIXTYTWO_TOKEN, undefined);
|
|
|
|
|
|
}],
|
|
|
|
|
|
["detects the Itō command consistently with or without the global JSON flag", () => {
|
|
|
|
|
|
assert.strictEqual(getInvocationCommand(["auth"]), "auth");
|
|
|
|
|
|
assert.strictEqual(getInvocationCommand(["--json", "evals"]), "evals");
|
|
|
|
|
|
assert.strictEqual(getInvocationCommand([]), undefined);
|
|
|
|
|
|
}],
|
|
|
|
|
|
["bounds the outer node-qualification process beyond the canonical timeout", () => {
|
|
|
|
|
|
assert.strictEqual(NODE_QUALIFICATION_TIMEOUT_MS, 31 * 60 * 1000);
|
|
|
|
|
|
const source = fs.readFileSync(ITO_SCRIPT, "utf8");
|
|
|
|
|
|
assert.match(
|
|
|
|
|
|
source,
|
|
|
|
|
|
/timeout: isNodeQualification \? NODE_QUALIFICATION_TIMEOUT_MS : undefined/,
|
|
|
|
|
|
);
|
|
|
|
|
|
}],
|
|
|
|
|
|
["rejects unsupported browser, paper, and execution operations before spawning", () => {
|
2026-08-05 18:17:10 -04:00
|
|
|
|
for (const command of ["rent", "lock", "purchase", "run", "inference", "mcp"]) {
|
2026-07-23 19:28:55 -07:00
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["ito", command], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.notStrictEqual(result.status, 0, command);
|
2026-08-07 14:53:13 -04:00
|
|
|
|
assert.match(result.stderr, /only login, logout, auth, find, status, and evals/i);
|
2026-07-23 19:28:55 -07:00
|
|
|
|
assert.ok(!fs.existsSync(probe.log), `${command} must not spawn the Itô CLI`);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
|
|
|
|
|
["fails closed rather than simulating a dry-run RFQ", () => {
|
|
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["--dry-run", "ito", "find"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.notStrictEqual(result.status, 0);
|
|
|
|
|
|
assert.match(result.stderr, /no paper or dry-run success mode/i);
|
|
|
|
|
|
assert.ok(!fs.existsSync(probe.log));
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
|
|
|
|
|
["fails closed with exact local install guidance when the explicit CLI is absent", () => {
|
|
|
|
|
|
const emptyPath = fs.mkdtempSync(path.join(os.tmpdir(), "ecc-empty-path-"));
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["ito", "status"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: "",
|
|
|
|
|
|
PATH: emptyPath,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.notStrictEqual(result.status, 0);
|
|
|
|
|
|
assert.match(result.stderr, /canonical ito-compute-cli is unpublished/i);
|
|
|
|
|
|
assert.match(result.stderr, new RegExp(CANONICAL_PACKAGE.replaceAll("/", "\\/")));
|
|
|
|
|
|
assert.match(result.stderr, /npm run check/);
|
|
|
|
|
|
assert.match(result.stderr, /ECC_ITO_CLI_EXECUTABLE/);
|
|
|
|
|
|
assert.match(result.stderr, /explicit absolute/i);
|
|
|
|
|
|
assert.match(result.stderr, /unpublished/i);
|
|
|
|
|
|
assert.doesNotMatch(result.stderr, /npx|npm exec|npm link|install -g/i);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(emptyPath, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
|
|
|
|
|
["never forwards Itô credentials to an unverified PATH collision", () => {
|
|
|
|
|
|
const collisionDirectory = fs.mkdtempSync(
|
|
|
|
|
|
path.join(os.tmpdir(), "ecc-hostile-ito-path-")
|
|
|
|
|
|
);
|
|
|
|
|
|
const stolenEnvironment = path.join(collisionDirectory, "stolen.json");
|
|
|
|
|
|
const executable = path.join(
|
|
|
|
|
|
collisionDirectory,
|
|
|
|
|
|
process.platform === "win32" ? "ito.exe" : "ito"
|
|
|
|
|
|
);
|
|
|
|
|
|
try {
|
|
|
|
|
|
fs.writeFileSync(
|
|
|
|
|
|
executable,
|
|
|
|
|
|
[
|
|
|
|
|
|
`#!${process.execPath}`,
|
|
|
|
|
|
'"use strict";',
|
|
|
|
|
|
'const fs = require("fs");',
|
|
|
|
|
|
`fs.writeFileSync(${JSON.stringify(stolenEnvironment)}, JSON.stringify(process.env));`,
|
|
|
|
|
|
"",
|
|
|
|
|
|
].join("\n")
|
|
|
|
|
|
);
|
|
|
|
|
|
if (process.platform !== "win32") {
|
|
|
|
|
|
fs.chmodSync(executable, 0o755);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const result = runCli(["ito", "auth"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: "",
|
|
|
|
|
|
ITO_API_KEY: "must-never-reach-path-collision",
|
|
|
|
|
|
PATH: collisionDirectory,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
assert.notStrictEqual(result.status, 0);
|
|
|
|
|
|
assert.match(result.stderr, /explicit absolute|ECC_ITO_CLI_EXECUTABLE/i);
|
|
|
|
|
|
assert.ok(
|
|
|
|
|
|
!fs.existsSync(stolenEnvironment),
|
|
|
|
|
|
"an unverified PATH executable must never receive the Itô credential"
|
|
|
|
|
|
);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(collisionDirectory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
2026-07-23 21:07:59 -07:00
|
|
|
|
["rejects an absolute POSIX shim before it can resolve an interpreter through PATH", () => {
|
|
|
|
|
|
if (process.platform === "win32") return;
|
|
|
|
|
|
const directory = fs.mkdtempSync(path.join(os.tmpdir(), "ecc-hostile-ito-shim-"));
|
|
|
|
|
|
const shim = path.join(directory, "ito");
|
|
|
|
|
|
const hostileNode = path.join(directory, "node");
|
|
|
|
|
|
const stolenEnvironment = path.join(directory, "stolen.json");
|
|
|
|
|
|
try {
|
|
|
|
|
|
fs.writeFileSync(shim, "#!/usr/bin/env node\n");
|
|
|
|
|
|
fs.writeFileSync(
|
|
|
|
|
|
hostileNode,
|
|
|
|
|
|
[
|
|
|
|
|
|
"#!/bin/sh",
|
|
|
|
|
|
`env > ${JSON.stringify(stolenEnvironment)}`,
|
|
|
|
|
|
"",
|
|
|
|
|
|
].join("\n")
|
|
|
|
|
|
);
|
|
|
|
|
|
fs.chmodSync(shim, 0o755);
|
|
|
|
|
|
fs.chmodSync(hostileNode, 0o755);
|
|
|
|
|
|
|
|
|
|
|
|
const result = runCli(["ito", "auth"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: shim,
|
|
|
|
|
|
ITO_API_KEY: "must-never-reach-shim-interpreter",
|
|
|
|
|
|
PATH: directory,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
assert.notStrictEqual(result.status, 0);
|
|
|
|
|
|
assert.match(result.stderr, /canonical dist\/bin\/ito\.js/i);
|
|
|
|
|
|
assert.ok(
|
|
|
|
|
|
!fs.existsSync(stolenEnvironment),
|
|
|
|
|
|
"a shim-resolved interpreter must never receive the Itô credential"
|
|
|
|
|
|
);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
|
|
|
|
|
["rejects a readable JavaScript decoy outside the canonical package entry", () => {
|
|
|
|
|
|
const directory = fs.mkdtempSync(path.join(os.tmpdir(), "ecc-hostile-ito-js-"));
|
|
|
|
|
|
const decoy = path.join(directory, "ito.js");
|
|
|
|
|
|
const stolenEnvironment = path.join(directory, "stolen.json");
|
|
|
|
|
|
try {
|
|
|
|
|
|
fs.writeFileSync(
|
|
|
|
|
|
decoy,
|
|
|
|
|
|
[
|
|
|
|
|
|
'"use strict";',
|
|
|
|
|
|
'const fs = require("fs");',
|
|
|
|
|
|
`fs.writeFileSync(${JSON.stringify(stolenEnvironment)}, JSON.stringify(process.env));`,
|
|
|
|
|
|
"",
|
|
|
|
|
|
].join("\n")
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const result = runCli(["ito", "auth"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: decoy,
|
|
|
|
|
|
ITO_API_KEY: "must-never-reach-js-decoy",
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
assert.notStrictEqual(result.status, 0);
|
|
|
|
|
|
assert.match(result.stderr, /canonical dist\/bin\/ito\.js/i);
|
|
|
|
|
|
assert.ok(
|
|
|
|
|
|
!fs.existsSync(stolenEnvironment),
|
|
|
|
|
|
"an arbitrary JavaScript file must never receive the Itô credential"
|
|
|
|
|
|
);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
2026-07-23 19:28:55 -07:00
|
|
|
|
["rejects a relative executable override instead of searching or guessing", () => {
|
|
|
|
|
|
const result = runCli(["ito", "status"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: "ito",
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.notStrictEqual(result.status, 0);
|
|
|
|
|
|
assert.match(result.stderr, /must be an absolute path/i);
|
|
|
|
|
|
}],
|
|
|
|
|
|
["preserves the real CLI exit code and output without a success wrapper", () => {
|
|
|
|
|
|
const probe = makeItoProbe(7);
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["ito", "status"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 7);
|
|
|
|
|
|
assert.match(result.stdout, /ito-probe:status/);
|
|
|
|
|
|
assert.match(result.stderr, /ito-probe-stderr/);
|
|
|
|
|
|
assert.doesNotMatch(result.stdout, /manual_handoff|simulated|paper/i);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
2026-08-05 18:17:10 -04:00
|
|
|
|
["help separates device login from auth validation", () => {
|
2026-07-23 19:28:55 -07:00
|
|
|
|
const probe = makeItoProbe();
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = runCli(["ito", "--help"], {
|
|
|
|
|
|
ECC_ITO_CLI_EXECUTABLE: probe.executable,
|
|
|
|
|
|
});
|
|
|
|
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
2026-08-05 18:17:10 -04:00
|
|
|
|
assert.match(result.stdout, /ecc ito login \[--no-browser\]/);
|
2026-08-07 14:53:13 -04:00
|
|
|
|
assert.match(result.stdout, /ecc ito logout/);
|
2026-07-23 19:28:55 -07:00
|
|
|
|
assert.match(result.stdout, /ecc ito auth/);
|
|
|
|
|
|
assert.match(result.stdout, /ecc ito find/);
|
|
|
|
|
|
assert.match(result.stdout, /ecc ito status/);
|
2026-07-23 22:10:57 -07:00
|
|
|
|
assert.match(result.stdout, /ecc ito evals/);
|
|
|
|
|
|
assert.match(result.stdout, /sixtytwo/i);
|
2026-07-23 19:28:55 -07:00
|
|
|
|
assert.match(result.stdout, /ito_auth/);
|
|
|
|
|
|
assert.match(result.stdout, /ito_find/);
|
|
|
|
|
|
assert.match(result.stdout, /ito_status/);
|
|
|
|
|
|
assert.match(result.stdout, new RegExp(CANONICAL_PACKAGE.replaceAll("/", "\\/")));
|
|
|
|
|
|
assert.match(result.stdout, /unpublished/i);
|
|
|
|
|
|
assert.match(result.stdout, /never discovers[^\n]*through PATH/i);
|
2026-08-05 18:17:10 -04:00
|
|
|
|
assert.match(result.stdout, /device authorization/i);
|
|
|
|
|
|
assert.match(result.stdout, /opens the Itô verification page by default/i);
|
|
|
|
|
|
assert.match(result.stdout, /macOS Keychain/i);
|
|
|
|
|
|
assert.match(result.stdout, /ECC itself performs no browser automation/i);
|
|
|
|
|
|
assert.match(result.stdout, /auth.*validat/i);
|
|
|
|
|
|
assert.match(result.stdout, /ITO_AUTH_MODE=legacy is not\s+required/i);
|
2026-07-23 19:28:55 -07:00
|
|
|
|
assert.doesNotMatch(
|
|
|
|
|
|
result.stdout,
|
2026-08-05 18:17:10 -04:00
|
|
|
|
/manual copy|ito_lock|ito_run|npm link|paper|simulat/i
|
2026-07-23 19:28:55 -07:00
|
|
|
|
);
|
|
|
|
|
|
assert.ok(!fs.existsSync(probe.log));
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
fs.rmSync(probe.directory, { recursive: true, force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
}],
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
let passed = 0;
|
|
|
|
|
|
let failed = 0;
|
|
|
|
|
|
for (const [name, fn] of tests) {
|
2026-08-05 18:17:10 -04:00
|
|
|
|
if (await runTest(name, fn)) passed += 1;
|
2026-07-23 19:28:55 -07:00
|
|
|
|
else failed += 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
console.log(`\nPassed: ${passed}`);
|
|
|
|
|
|
console.log(`Failed: ${failed}`);
|
|
|
|
|
|
process.exit(failed > 0 ? 1 : 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
main();
|