blob: f9d3f7293e49f7a0df1fdb30fbdd2179128bdfcf [file]
#!/usr/bin/env node
import { spawn } from 'node:child_process';
import { fileURLToPath, pathToFileURL } from 'node:url';
const commands = Object.freeze({
real: command('cu-real-ax-model-e2e-launcher.mjs'),
'process-restart': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_AX_MODEL_SCENARIO: 'restart-recovery',
}),
'process-restart-soak': command('cu-process-restart-e2e-launcher.mjs'),
'real-model': command('cu-real-model-launcher.mjs'),
'real-ax-model': command('cu-real-ax-model-e2e-launcher.mjs'),
'real-ax-observe': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_AX_MODEL_SCENARIO: 'observe-only',
}),
'real-ax-recovery': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_AX_MODEL_SCENARIO: 'intervention-recovery',
}),
'real-ax-restart': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_AX_MODEL_SCENARIO: 'restart-recovery',
}),
'real-ax-anthropic': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_MODEL_PROVIDER: 'anthropic',
}),
'real-ax-anthropic-recovery': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_MODEL_PROVIDER: 'anthropic',
MAKA_CU_AX_MODEL_SCENARIO: 'intervention-recovery',
}),
'real-ax-click': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_AX_MODEL_SCENARIO: 'ax-click',
}),
'real-ax-ambiguity': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_AX_MODEL_SCENARIO: 'ambiguity',
}),
'real-ax-multi-step': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_AX_MODEL_SCENARIO: 'ax-multi-step',
}),
'real-ax-anthropic-multi-step': command('cu-real-ax-model-e2e-launcher.mjs', {
MAKA_CU_MODEL_PROVIDER: 'anthropic',
MAKA_CU_AX_MODEL_SCENARIO: 'ax-multi-step',
}),
'function-model': command('cu-real-function-model-e2e.mjs'),
'real-anthropic': command('cu-real-anthropic-model-e2e.mjs'),
'real-runtime': command('cu-real-runtime-model-e2e.mjs'),
});
export function resolveComputerUseCommand(name) {
const resolved = commands[name];
if (!resolved) {
throw new Error(
`Unknown computer-use command '${name ?? ''}'. Available commands: ${Object.keys(commands).join(', ')}`,
);
}
return resolved;
}
export async function runComputerUseCli(argv = process.argv.slice(2)) {
const [name, ...args] = argv;
if (!name || name === '--help' || name === '-h') {
process.stdout.write(
`Usage: node scripts/computer-use.mjs <command> [args...]\n\nCommands:\n${Object.keys(
commands,
)
.map((value) => ` ${value}`)
.join('\n')}\n`,
);
return 0;
}
const selected = resolveComputerUseCommand(name);
const child = spawn(process.execPath, [fileURLToPath(selected.script), ...args], {
env: { ...process.env, ...selected.env },
stdio: 'inherit',
});
return await new Promise((resolve, reject) => {
child.once('error', reject);
child.once('exit', (code, signal) => {
if (signal) {
process.kill(process.pid, signal);
return;
}
resolve(code ?? 1);
});
});
}
function command(file, env = {}) {
return Object.freeze({ script: new URL(file, import.meta.url), env: Object.freeze(env) });
}
const isMain =
process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href;
if (isMain) {
try {
process.exitCode = await runComputerUseCli();
} catch (error) {
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
process.exitCode = 1;
}
}