#!/usr/bin/env node import module from "node:module"; import { fileURLToPath } from "node:url"; const MIN_NODE_MAJOR = 22; const MIN_NODE_MINOR = 12; const MIN_NODE_VERSION = `${MIN_NODE_MAJOR}.${MIN_NODE_MINOR}`; const parseNodeVersion = (rawVersion) => { const [majorRaw = "0", minorRaw = "0"] = rawVersion.split("."); return { major: Number(majorRaw), minor: Number(minorRaw), }; }; const isSupportedNodeVersion = (version) => version.major > MIN_NODE_MAJOR || (version.major === MIN_NODE_MAJOR && version.minor >= MIN_NODE_MINOR); const ensureSupportedNodeVersion = () => { if (isSupportedNodeVersion(parseNodeVersion(process.versions.node))) { return; } process.stderr.write( `openclaw: Node.js v${MIN_NODE_VERSION}+ is required (current: v${process.versions.node}).\n` + "If you use nvm, run:\n" + ` nvm install ${MIN_NODE_MAJOR}\n` + ` nvm use ${MIN_NODE_MAJOR}\n` + ` nvm alias default ${MIN_NODE_MAJOR}\n`, ); process.exit(1); }; ensureSupportedNodeVersion(); // https://nodejs.org/api/module.html#module-compile-cache if (module.enableCompileCache && !process.env.NODE_DISABLE_COMPILE_CACHE) { try { module.enableCompileCache(); } catch { // Ignore errors } } const isModuleNotFoundError = (err) => err && typeof err === "object" && "code" in err && err.code === "ERR_MODULE_NOT_FOUND"; const isDirectModuleNotFoundError = (err, specifier) => { if (!isModuleNotFoundError(err)) { return false; } const expectedUrl = new URL(specifier, import.meta.url); if ("url" in err && err.url === expectedUrl.href) { return true; } const message = "message" in err && typeof err.message === "string" ? err.message : ""; return message.includes(fileURLToPath(expectedUrl)); }; const installProcessWarningFilter = async () => { // Keep bootstrap warnings consistent with the TypeScript runtime. for (const specifier of ["./dist/warning-filter.js", "./dist/warning-filter.mjs"]) { try { const mod = await import(specifier); if (typeof mod.installProcessWarningFilter === "function") { mod.installProcessWarningFilter(); return; } } catch (err) { if (isDirectModuleNotFoundError(err, specifier)) { continue; } throw err; } } }; await installProcessWarningFilter(); const tryImport = async (specifier) => { try { await import(specifier); return true; } catch (err) { // Only swallow direct entry misses; rethrow transitive resolution failures. if (isDirectModuleNotFoundError(err, specifier)) { return false; } throw err; } }; if (await tryImport("./dist/entry.js")) { // OK } else if (await tryImport("./dist/entry.mjs")) { // OK } else { throw new Error("openclaw: missing dist/entry.(m)js (build output)."); }