← back to Jevrun Runner

bin/jevrun.mjs

35 lines

#!/usr/bin/env node
// Global `jevrun` CLI — talks to the always-alive jevrun-runner service.
//   jevrun health
//   jevrun run <url> "<natural-language task>"
//   jevrun "<task>"            (no url; task runs on about:blank)
const PORT = Number(process.env.JEVRUN_PORT || 9788);
const HOST = process.env.JEVRUN_HOST || "127.0.0.1";
const base = `http://${HOST}:${PORT}`;
const [, , cmd, ...rest] = process.argv;

async function main() {
  if (cmd === "health" || cmd === "--health") {
    const r = await fetch(`${base}/health`).catch(() => null);
    if (!r) { console.error(`jevrun-runner not reachable at ${base} — is pm2 process 'jevrun-runner' up?`); process.exit(1); }
    console.log(JSON.stringify(await r.json(), null, 2));
    return;
  }
  let url, task;
  if (cmd === "run") { url = rest[0]; task = rest.slice(1).join(" "); }
  else { task = [cmd, ...rest].filter(Boolean).join(" "); }
  if (!task) {
    console.error('usage: jevrun run <url> "<task>"   |   jevrun "<task>"   |   jevrun health');
    process.exit(2);
  }
  const r = await fetch(`${base}/run`, {
    method: "POST",
    headers: { "content-type": "application/json" },
    body: JSON.stringify({ url, task }),
  }).catch((e) => { console.error(`request failed: ${e.message}`); process.exit(1); });
  const body = await r.json();
  console.log(JSON.stringify(body, null, 2));
  process.exit(r.ok ? 0 : 1);
}
main();