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
- Install Node 18+ in the WSL distro (NodeSource setup script, nvm install --lts, or apt with the nodesource repo).
- Ensure the node binary is on PATH or symlinked at ~/.local/bin/node (the probe checks both).
- Re-run `wsl.exe -d <distro> node -p process.versions.node` to confirm the major is >= 18.
- 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
- Pin a known-good Node via nvm in the distro setup script.
- Have the benchmark print the install command when this fires.
- Verify `node -p process.versions.node` from a manual wsl.exe shell before reporting bugs.
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
- Timed out waiting for ${description}
- Could not reserve a guest port: ${result.stdout}
- This benchmark requires a Windows host with WSL
- Refusing to use an unexpected guest cleanup path
- advertised-url-watcher.ts no longer contains \`${marker}\`
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/f909becaf95cc1fc.
Report an issue: GitHub.