stablyai/orca · error · Error

WSL distro '${distro}' needs Node.js 18 or newer to run Orca

Error message

WSL distro '${distro}' needs Node.js 18 or newer to run Orca's relay

What it means

Version gate: the benchmark shells into the WSL distro, finds a node binary (PATH node or ~/.local/bin/node), and requires Node >= 18 to run Orca's relay bundle. Thrown when the probe fails (status !== 0) or the major version is below 18. The relay ships as ESM/native-API code that needs Node 18+ runtime features.

Source

Thrown at config/scripts/wsl-hook-relay-reattach-benchmark.mjs:276

}

async function main() {
  if (process.platform !== 'win32') {
    throw new Error('This benchmark requires a Windows host with WSL')
  }
  const options = parseArgs(process.argv.slice(2))
  const distro = await resolveDistro(options.distro)
  const nodeVersion = await run(
    'wsl.exe',
    wslArgs(distro, [
      '/bin/sh',
      '-c',
      'for node_bin in "$(command -v node 2>/dev/null || true)" "$HOME/.local/bin/node"; do [ -x "$node_bin" ] || continue; "$node_bin" -p process.versions.node && exit 0; done; exit 1'
    ]),
    { allowFailure: true }
  )
  if (nodeVersion.status !== 0 || Number(nodeVersion.stdout.trim().split('.')[0]) < 18) {
    throw new Error(`WSL distro '${distro}' needs Node.js 18 or newer to run Orca's relay`)
  }

  const bundleDir = join(process.cwd(), 'out', 'relay', 'wsl')
  const bundlePath = join(bundleDir, 'wsl-agent-hook-relay.js')
  const versionPath = join(bundleDir, '.version')
  if (!existsSync(bundlePath) || !existsSync(versionPath)) {
    await run(process.execPath, [join('config', 'scripts', 'build-relay.mjs')], {
      cwd: process.cwd()
    })
  }

  // Why: main's PTY graph reads app paths at import time; keep it inside a disposable directory.
  let userDataDir
  let ptyIpc
  let cleanupPaths = []
  let manager = null
  let staller = null
  try {

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Install Node 18+ in the WSL distro (NodeSource setup script, nvm install --lts, or apt with the nodesource repo).
  2. Ensure the node binary is on PATH or symlinked at ~/.local/bin/node (the probe checks both).
  3. Re-run `wsl.exe -d <distro> node -p process.versions.node` to confirm the major is >= 18.
  4. If using nvm, make sure the default alias points at an 18+ release (`nvm alias default 20`).

Example fix

// before
if (nodeVersion.status !== 0 || Number(nodeVersion.stdout.trim().split('.')[0]) < 18) {
  throw new Error(`WSL distro '${distro}' needs Node.js 18 or newer to run Orca's relay`)
}

// after — report what was found
const major = nodeVersion.status === 0 ? Number(nodeVersion.stdout.trim().split('.')[0]) : null
if (nodeVersion.status !== 0 || major == null || major < 18) {
  throw new Error(`WSL distro '${distro}' needs Node.js 18+; found: ${nodeVersion.stdout.trim() || 'no node binary'}`)
}
Defensive patterns

Strategy: validation

Validate before calling

// Pre-flight check reusable across benchmarks
async function assertGuestNodeMin(distro: string, minMajor: number): Promise<void> {
  const r = await run('wsl.exe', wslArgs(distro, ['/bin/sh','-c','node -p process.versions.node']), { allowFailure: true })
  const major = r.status === 0 ? Number(r.stdout.trim().split('.')[0]) : NaN
  if (!Number.isInteger(major) || major < minMajor) {
    throw new Error(`Install Node ${minMajor}+ in distro ${distro}`)
  }
}

Type guard

function isSupportedNodeMajor(s: string): boolean {
  const major = Number(s.trim().split('.')[0])
  return Number.isInteger(major) && major >= 18
}

Prevention

When it happens

Trigger: The distro has no node binary on PATH or in ~/.local/bin, or it has Node 16/14/17. The probe loop runs `node -p process.versions.node` and parses the major.

Common situations: Fresh Ubuntu/Debian WSL distros that ship older Node, distros where the user installed Node via an outdated nvm default, or minimal distros with no Node at all.

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/f909becaf95cc1fc. Report an issue: GitHub.