openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
146 lines (145 loc) • 6.26 kB
JavaScript
import "./src-vebZIeLe.js";
import { t as expectDefined } from "./expect-CyE8FADM.js";
import { t as formatConsoleDiagnosticBlock } from "./json-console-line-C0Xvs26k.js";
import { n as isSqliteWalResetSafeVersion, t as detectCurrentRuntimeSqliteVersion } from "./sqlite-runtime-version-2bxyFHKW.js";
import { a as parseNodeReleaseVersion, i as isSupportedOpenClawNodeVersion, r as isNodeVersionAtLeast } from "./node-version-WVgs0-1c.js";
import process from "node:process";
import { format } from "node:util";
//#region src/infra/runtime-guard.ts
const defaultRuntime = {
log: (...args) => console.log(...args),
error: (...args) => {
const message = format(...args);
process.stderr.write(formatConsoleDiagnosticBlock({
level: "error",
message: `${message}\n`
}));
},
exit: (code) => {
process.exit(code);
}
};
const MINIMUM_BUN_VERSION = {
major: 1,
minor: 4,
patch: 0
};
const MINIMUM_ENGINE_RE = /^\s*>=\s*v?(\d+\.\d+\.\d+)\s*$/i;
const ENGINE_CLAUSE_RE = /^\s*>=\s*v?(\d+\.\d+\.\d+)(?:\s+<\s*v?(\d+(?:\.\d+\.\d+)?))?\s*$/i;
const SEMVER_RE = /(\d+)\.(\d+)\.(\d+)/;
/** Parses the first major/minor/patch triple from a runtime or package version label. */
function parseSemver(version) {
if (!version) return null;
const match = version.match(SEMVER_RE);
if (!match) return null;
const [, major, minor, patch] = match;
return {
major: Number.parseInt(expectDefined(major, "runtime guard major"), 10),
minor: Number.parseInt(expectDefined(minor, "runtime guard minor"), 10),
patch: Number.parseInt(expectDefined(patch, "runtime guard patch"), 10)
};
}
/** Compares parsed semver triples against an inclusive minimum version. */
function isAtLeast(version, minimum) {
if (!version) return false;
if (version.major !== minimum.major) return version.major > minimum.major;
if (version.minor !== minimum.minor) return version.minor > minimum.minor;
return version.patch >= minimum.patch;
}
/** Reads current process runtime metadata for startup support checks. */
function detectRuntime() {
const bunVersion = process.versions?.bun;
const kind = bunVersion ? "bun" : process.versions?.node ? "node" : "unknown";
const version = bunVersion ?? process.versions?.node ?? null;
const sqlite = kind === "bun" ? detectCurrentRuntimeSqlite() : {
available: false,
version: null
};
return {
kind,
version,
execPath: process.execPath ?? null,
pathEnv: process.env.PATH ?? "(not set)",
hasNodeSqlite: sqlite.available,
sqliteVersion: sqlite.version
};
}
function detectCurrentRuntimeSqlite() {
try {
const version = detectCurrentRuntimeSqliteVersion();
return {
available: version !== null,
version
};
} catch {
return {
available: false,
version: null
};
}
}
/** Returns whether a detected runtime meets OpenClaw's minimum runtime contract. */
function runtimeSatisfies(details) {
if (details.kind === "node") return isSupportedNodeVersion(details.version);
if (details.kind === "bun") return isSupportedBunVersion(details.version) && details.hasNodeSqlite && details.sqliteVersion !== null && isSqliteWalResetSafeVersion(details.sqliteVersion);
return false;
}
/** Returns whether the current process runtime satisfies OpenClaw's engine contract. */
function isCurrentRuntimeSupported() {
return runtimeSatisfies(detectRuntime());
}
/** Checks a Node version label against OpenClaw's supported Node version range. */
function isSupportedNodeVersion(version) {
return isSupportedOpenClawNodeVersion(version);
}
/** Checks a Bun version label against OpenClaw's minimum supported release. */
function isSupportedBunVersion(version) {
return isAtLeast(parseSemver(version), MINIMUM_BUN_VERSION);
}
/** Parses simple package `engines.node` ranges of the form `>=x.y.z`. */
function parseMinimumNodeEngine(engine) {
if (!engine) return null;
const match = engine.match(MINIMUM_ENGINE_RE);
if (!match) return null;
return parseSemver(match[1] ?? null);
}
/** Returns whether a Node version satisfies a supported engine range, or null if unsupported. */
function nodeVersionSatisfiesEngine(version, engine) {
const minimum = parseMinimumNodeEngine(engine);
if (minimum) return isNodeVersionAtLeast(parseNodeReleaseVersion(version), minimum);
if (!engine) return null;
const parsed = parseNodeReleaseVersion(version);
if (!parsed) return false;
const clauses = engine.split("||");
let satisfied = false;
for (const clause of clauses) {
const match = clause.match(ENGINE_CLAUSE_RE);
if (!match) return null;
const clauseMinimum = parseSemver(match[1] ?? null);
const upperRaw = match[2];
const upper = upperRaw ? parseSemver(upperRaw.includes(".") ? upperRaw : `${upperRaw}.0.0`) : null;
if (!clauseMinimum || upperRaw && !upper) return null;
if (isAtLeast(parsed, clauseMinimum) && (!upper || !isAtLeast(parsed, upper))) satisfied = true;
}
return satisfied;
}
/** Exits through the provided runtime when the current Node runtime is unsupported. */
function assertSupportedRuntime(runtime = defaultRuntime, details = detectRuntime()) {
if (runtimeSatisfies(details)) return;
const versionLabel = details.version ?? "unknown";
const runtimeLabel = details.kind === "unknown" ? "unknown runtime" : `${details.kind} ${versionLabel}`;
const execLabel = details.execPath ?? "unknown";
const requirement = details.kind === "bun" ? "openclaw requires Bun 1.4 or newer with WAL-reset-safe node:sqlite (SQLite 3.51.3+ or a patched 3.50.x/3.44.x release)." : "openclaw requires Node >=22.22.3 <23, >=24.15.0 <25, or >=25.9.0.";
const retryHint = details.kind === "bun" ? "Upgrade Bun or run OpenClaw with a supported Node release." : "Upgrade Node and re-run openclaw.";
runtime.error([
requirement,
`Detected: ${runtimeLabel} (exec: ${execLabel}).`,
...details.kind === "bun" ? [`Detected SQLite: ${details.sqliteVersion ?? "unavailable"}.`] : [],
`PATH searched: ${details.pathEnv}`,
details.kind === "bun" ? "Install Bun: https://bun.com/docs/installation" : "Install Node: https://nodejs.org/en/download",
retryHint
].join("\n"));
runtime.exit(1);
}
//#endregion
export { nodeVersionSatisfiesEngine as a, isSupportedNodeVersion as i, isCurrentRuntimeSupported as n, parseSemver as o, isSupportedBunVersion as r, assertSupportedRuntime as t };