openclaw/runtime-process-scripts.generated.mjs
Peter Steinberger 44dd89b76c
fix(standalone): worker deployments fail without the transfer bundle (#183473)
* fix(standalone): retain deployable worker bundles

Package the canonical transfer archive and use the same executable for downloaded worker scripts. Keep embedded relay dispatch separate from the target environment and preserve existing bundle compatibility checks.

* fix(standalone): refresh embedded worker launch assets
2026-10-25 02:57:37 -07:00

62 lines
16 KiB
JavaScript

// Generated by scripts/generate-runtime-script-assets.mjs; do not edit.
/* oxlint-disable no-var -- esbuild owns variable declarations in this generated bundle. */
// src/infra/runtime-process-script-file.ts
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { pathToFileURL } from "node:url";
function materializeRuntimeProcessScriptFile(entry, options = {}) {
const directory = fs.mkdtempSync(
path.join(options.parentDirectory ?? os.tmpdir(), "openclaw-script-"),
);
const filename = path.join(directory, entry.fileName);
let disposed = false;
const dispose = () => {
if (disposed) {
return;
}
try {
fs.rmSync(directory, { recursive: true, force: true });
disposed = true;
} catch (error) {
process.emitWarning(
`Runtime script cleanup failed at ${directory}: ${error instanceof Error ? error.message : String(error)}`,
);
}
};
try {
fs.writeFileSync(filename, entry.source, { mode: 384, flag: "wx" });
return { url: pathToFileURL(filename), dispose };
} catch (error) {
dispose();
throw error;
}
}
// runtime-process-scripts.ts
var scripts = {
packageCliNodeProbe: {
fileName: "package-cli-node-probe.mjs",
source:
"// scripts/lib/package-cli-node-probe.entry.mjs\nprocess.stdout.write(\n JSON.stringify({\n version: process.versions.node ?? null,\n bunVersion: process.versions.bun ?? null,\n execPath: process.execPath ?? null\n })\n);\n",
},
nodeRuntimeProbe: {
fileName: "node-runtime-probe.mjs",
source:
'// src/infra/node-runtime-probe.entry.ts\nimport process from "node:process";\nvar requiredFlag = process.argv[2];\nprocess.stdout.write(\n !process.versions.bun && (!requiredFlag || process.allowedNodeEnvironmentFlags.has(requiredFlag)) ? process.execPath : ""\n);\n',
},
daemonRuntimeProbe: {
fileName: "daemon-runtime-probe.mjs",
source:
'var __getOwnPropNames = Object.getOwnPropertyNames;\nvar __esm = (fn, res, err) => function __init() {\n if (err) throw err[0];\n try {\n return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;\n } catch (e) {\n throw err = [e], e;\n }\n};\n\n// gateway-shutdown-budget.mjs\nvar GATEWAY_SHUTDOWN_DRAIN_TIMEOUT_MS, GATEWAY_SHUTDOWN_RESERVE_MS, GATEWAY_SUPERVISOR_EXIT_MARGIN_MS, GATEWAY_SHUTDOWN_TIMEOUT_MS, GATEWAY_SERVICE_STOP_TIMEOUT_MS, LAUNCH_AGENT_EXIT_TIMEOUT_SECONDS;\nvar init_gateway_shutdown_budget = __esm({\n "gateway-shutdown-budget.mjs"() {\n "use strict";\n GATEWAY_SHUTDOWN_DRAIN_TIMEOUT_MS = 315e3;\n GATEWAY_SHUTDOWN_RESERVE_MS = 1e4;\n GATEWAY_SUPERVISOR_EXIT_MARGIN_MS = 5e3;\n GATEWAY_SHUTDOWN_TIMEOUT_MS = GATEWAY_SHUTDOWN_DRAIN_TIMEOUT_MS + GATEWAY_SHUTDOWN_RESERVE_MS;\n GATEWAY_SERVICE_STOP_TIMEOUT_MS = GATEWAY_SHUTDOWN_TIMEOUT_MS + GATEWAY_SUPERVISOR_EXIT_MARGIN_MS;\n LAUNCH_AGENT_EXIT_TIMEOUT_SECONDS = GATEWAY_SERVICE_STOP_TIMEOUT_MS / 1e3;\n }\n});\n\n// cli-parent-lifetime.mjs\nvar parentKey, CLI_RESPAWN_PARENT_ENV, inheritedParent, CLI_PARENT_BOUND_PRELOAD;\nvar init_cli_parent_lifetime = __esm({\n "cli-parent-lifetime.mjs"() {\n "use strict";\n init_gateway_shutdown_budget();\n parentKey = /* @__PURE__ */ Symbol.for("openclaw.cliRespawnParent");\n CLI_RESPAWN_PARENT_ENV = "OPENCLAW_CLI_RESPAWN_PARENT";\n inheritedParent = process.env[CLI_RESPAWN_PARENT_ENV];\n delete process.env[CLI_RESPAWN_PARENT_ENV];\n if (inheritedParent === String(process.ppid)) {\n globalThis[parentKey] = { pid: process.ppid };\n }\n CLI_PARENT_BOUND_PRELOAD = `data:text/javascript,${encodeURIComponent(`\n globalThis[Symbol.for("openclaw.cliRespawnParent")] = { pid: process.ppid };\n process.execArgv = process.execArgv.filter((arg, index, args) =>\n arg !== import.meta.url && !(arg === "--import" && args[index + 1] === import.meta.url));\n`)}`;\n }\n});\n\n// node-runtime-env.mjs\nvar init_node_runtime_env = __esm({\n "node-runtime-env.mjs"() {\n "use strict";\n }\n});\n\n// cli-invocation.mjs\nimport { fileURLToPath } from "node:url";\nfunction getEmbeddedStandaloneRuntimeRoot() {\n const rootUrl = globalThis.__openclawStandaloneRootUrl;\n return typeof rootUrl === "string" ? fileURLToPath(rootUrl) : void 0;\n}\nvar init_cli_invocation = __esm({\n "cli-invocation.mjs"() {\n "use strict";\n init_cli_parent_lifetime();\n init_node_runtime_env();\n }\n});\n\n// src/infra/daemon-runtime-probe.ts\nimport path from "node:path";\n\n// node-sqlite-capabilities.mjs\nfunction probeSqlite(DatabaseSync) {\n const result = { available: false, version: null, text: false, blob: false, json: false };\n let database;\n try {\n database = new DatabaseSync(":memory:");\n result.available = true;\n const version = database.prepare("SELECT sqlite_version() AS version").get()?.version;\n result.version = typeof version === "string" ? version : null;\n const text = "a\\0b\\0";\n const bytes = Buffer.from(text, "utf8");\n const json = JSON.stringify({ value: text });\n database.exec("CREATE TABLE probe (text_value TEXT, blob_value BLOB, json_value TEXT)");\n database.prepare("INSERT INTO probe VALUES (?, ?, ?)").run(text, bytes, json);\n const row = database.prepare("SELECT text_value, blob_value, json_value FROM probe").get();\n result.text = typeof row?.text_value === "string" && row.text_value.length === text.length && Buffer.from(row.text_value, "utf8").equals(bytes);\n result.blob = row?.blob_value instanceof Uint8Array && Buffer.from(row.blob_value).equals(bytes);\n result.json = row?.json_value === json && JSON.parse(row.json_value).value === text;\n } catch (error) {\n result.error = error instanceof Error ? error.message : String(error);\n } finally {\n database?.close();\n }\n return result;\n}\nfunction isSqliteWalResetSafeVersion(value) {\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)$/u.exec(value.trim());\n if (!match) {\n return false;\n }\n const [major, minor, patch] = match.slice(1).map(Number);\n if (![major, minor, patch].every(Number.isSafeInteger)) {\n return false;\n }\n return major > 3 || major === 3 && (minor > 51 || minor === 51 && patch >= 3 || minor === 50 && patch >= 7 || minor === 44 && patch >= 6);\n}\n\n// src/infra/bun-sqlite-library.ts\ninit_cli_invocation();\nimport { existsSync } from "node:fs";\nimport { createRequire } from "node:module";\nimport { posix } from "node:path";\nimport { getEnvironmentData, isMainThread, setEnvironmentData } from "node:worker_threads";\n\n// src/shared/global-singleton.ts\nvar GLOBAL_SINGLETON_RESETS_KEY = /* @__PURE__ */ Symbol.for("openclaw.globalSingletonLifecycleResets");\nfunction resolveGlobalSingletonResetRegistry() {\n const globalStore = globalThis;\n const existing = globalStore[GLOBAL_SINGLETON_RESETS_KEY];\n if (existing instanceof Map) {\n return existing;\n }\n const created = /* @__PURE__ */ new Map();\n globalStore[GLOBAL_SINGLETON_RESETS_KEY] = created;\n return created;\n}\nfunction resolveGlobalSingleton(key, create, reset, lifecycle = "close-and-restart") {\n const globalStore = globalThis;\n let value;\n if (Object.hasOwn(globalStore, key)) {\n value = globalStore[key];\n } else {\n value = create();\n globalStore[key] = value;\n }\n if (reset) {\n resolveGlobalSingletonResetRegistry().set(key, {\n lifecycle,\n reset: () => reset(value)\n });\n }\n return value;\n}\n\n// src/infra/bun-sqlite-library.ts\nvar WORKER_SELECTION_KEY = "openclaw.bunSqliteLibrarySelection";\nfunction probeLibrary(path2) {\n const require2 = createRequire(import.meta.url);\n const { dlopen, FFIType } = require2("bun:ffi");\n const library = dlopen(path2, {\n sqlite3_libversion: { args: [], returns: FFIType.cstring },\n sqlite3_compileoption_used: { args: [FFIType.cstring], returns: FFIType.i32 }\n });\n try {\n return {\n version: String(library.symbols.sqlite3_libversion()),\n extensionLoadingSupported: library.symbols.sqlite3_compileoption_used(Buffer.from("OMIT_LOAD_EXTENSION\\0")) === 0\n };\n } finally {\n library.close();\n }\n}\nfunction selectLibrary(path2) {\n const require2 = createRequire(import.meta.url);\n const { Database } = require2("bun:sqlite");\n Database.setCustomSQLite(path2);\n}\nfunction createSelector() {\n let selection;\n let failure;\n return (options = {}) => {\n if (failure) {\n throw failure;\n }\n if (selection) {\n return selection;\n }\n const override = options.explicitPath ?? (process.env.OPENCLAW_SQLITE_LIBRARY?.trim() || void 0);\n if (!process.versions.bun || process.platform !== "darwin") {\n selection = override ? { source: "runtime", ignoredOverride: "OPENCLAW_SQLITE_LIBRARY requires Bun on macOS" } : { source: "runtime" };\n return selection;\n }\n const standaloneRoot = options.standaloneRoot ?? getEmbeddedStandaloneRuntimeRoot();\n const bundled = override === void 0 && standaloneRoot !== void 0 ? posix.join(standaloneRoot, "lib/libsqlite3.dylib") : void 0;\n const prefix = process.env.HOMEBREW_PREFIX?.trim();\n const candidates = override !== void 0 ? [override] : [\n .../* @__PURE__ */ new Set([\n ...bundled ? [bundled] : [],\n ...prefix ? [posix.join(prefix, "opt/sqlite/lib/libsqlite3.dylib")] : [],\n "/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib",\n "/usr/local/opt/sqlite/lib/libsqlite3.dylib",\n "/opt/local/lib/libsqlite3.dylib"\n ])\n ];\n const unusable = [];\n for (const path2 of candidates) {\n const source = override !== void 0 ? "env" : path2 === bundled ? "bundled" : "discovered";\n let probe;\n let present = true;\n try {\n try {\n probe = probeLibrary(path2);\n } catch (error) {\n present = existsSync(path2);\n throw present ? error : new Error("missing file", { cause: error });\n }\n if (!isSqliteWalResetSafeVersion(probe.version)) {\n throw new Error(`SQLite version ${probe.version} below the WAL safety floor`);\n }\n if (!probe.extensionLoadingSupported) {\n throw new Error("built with SQLITE_OMIT_LOAD_EXTENSION");\n }\n } catch (error) {\n if (override === void 0) {\n if (present || path2 === bundled) {\n unusable.push(`${path2} (${error instanceof Error ? error.message : String(error)})`);\n }\n continue;\n }\n failure = selectionError(path2, error, source === "bundled");\n throw failure;\n }\n try {\n selectLibrary(path2);\n } catch (error) {\n failure = selectionError(path2, error, source === "bundled");\n throw failure;\n }\n selection = {\n source,\n path: path2,\n version: probe.version,\n extensionLoadingSupported: true\n };\n return selection;\n }\n failure = new Error(\n `No supported SQLite library for Bun on macOS (${process.arch})` + (unusable.length > 0 ? `; unusable: ${unusable.join(", ")}` : "") + ". Apple\'s system SQLite fails OpenClaw\'s read-only database connections. " + (bundled ? "Rebuild or replace the complete standalone artifact to restore its bundled SQLite library. " : "") + `Install one with brew install sqlite, or set OPENCLAW_SQLITE_LIBRARY to a libsqlite3.dylib built for ${process.arch}.`\n );\n throw failure;\n };\n}\nfunction selectionError(path2, error, bundled = false) {\n const guidance = bundled ? "Rebuild or replace the complete standalone artifact (openclaw and runtime/), or set OPENCLAW_SQLITE_LIBRARY to a supported library." : "Fix or unset OPENCLAW_SQLITE_LIBRARY; install a supported library with brew install sqlite.";\n return new Error(\n `Cannot use ${bundled ? "bundled " : ""}SQLite library ${path2}: ${error instanceof Error ? error.message : String(error)}. ${guidance}`,\n { cause: error }\n );\n}\nfunction createRuntimeSelector() {\n const isBun = Boolean(process.versions.bun);\n const sharedLibrary = isBun && process.platform === "darwin";\n let inherited;\n if (sharedLibrary && !isMainThread) {\n inherited = getEnvironmentData(WORKER_SELECTION_KEY);\n }\n const select = createSelector();\n let published = false;\n return (options) => {\n const selection = inherited ?? select(options);\n if (sharedLibrary && isMainThread && !published) {\n setEnvironmentData(WORKER_SELECTION_KEY, Object.freeze({ ...selection }));\n published = true;\n }\n return selection;\n };\n}\nfunction runtimeSelector() {\n return resolveGlobalSingleton(\n /* @__PURE__ */ Symbol.for("openclaw.bunSqliteLibrarySelection"),\n createRuntimeSelector\n );\n}\nfunction ensureSqliteLibrarySelected(options) {\n return runtimeSelector()(options);\n}\n\n// src/infra/daemon-runtime-probe.ts\nasync function readRuntimeProbeInfo(runtime, standaloneRoot) {\n let sqliteVersion = null;\n let sqliteSelectionError = null;\n let sqliteLibraryPath = null;\n let sqliteProbe = {\n available: false,\n version: null,\n text: false,\n blob: false,\n json: false\n };\n if (runtime === "bun") {\n try {\n const selection = ensureSqliteLibrarySelected({ standaloneRoot });\n if ("path" in selection) {\n sqliteLibraryPath = path.resolve(selection.path);\n }\n } catch (error) {\n sqliteSelectionError = error instanceof Error ? error.message : String(error);\n }\n }\n if (sqliteSelectionError === null) {\n try {\n const { DatabaseSync } = await import("node:sqlite");\n sqliteProbe = probeSqlite(DatabaseSync);\n sqliteVersion = sqliteProbe.version;\n } catch {\n }\n }\n const variables = process.config?.variables;\n const sharedSqlite = variables?.node_shared_sqlite;\n const nodeSharedSqlite = sharedSqlite === true || sharedSqlite === "true";\n return {\n nodeVersion: process.versions.node,\n bunVersion: process.versions.bun ?? null,\n sqliteVersion,\n sqliteProbe,\n sqliteSelectionError,\n sqliteLibraryPath,\n nodeSharedSqlite\n };\n}\n\n// src/infra/daemon-runtime-probe.entry.ts\nprocess.stdout.write(\n JSON.stringify(\n await readRuntimeProbeInfo(\n process.argv[2] === "bun" ? "bun" : "node",\n process.argv[3] || void 0\n )\n )\n);\n',
},
updateStateSizes: {
fileName: "update-state-sizes.mjs",
source:
'// src/infra/update-state-sizes.entry.ts\nimport fs from "node:fs";\n\n// node_modules/.pnpm/@openclaw+fs-safe@0.26.13/node_modules/@openclaw/fs-safe/dist/path.js\nfunction isNodeError(value) {\n return Boolean(value && typeof value === "object" && "code" in value);\n}\nfunction hasNodeErrorCode(value, code) {\n return isNodeError(value) && value.code === code;\n}\n\n// src/infra/update-state-inspection-protocol.ts\nvar UPDATE_STATE_INSPECTION_PROGRESS_PREFIX = "State schema progress: ";\n\n// src/infra/update-state-sizes.entry.ts\nvar input = "";\nprocess.stdin.setEncoding("utf8");\nprocess.stdin.on("data", (chunk) => {\n input += chunk;\n});\nprocess.stdin.on("end", () => {\n const { files } = JSON.parse(input);\n const result = [];\n const progress = (pathname) => {\n try {\n fs.writeSync(\n 2,\n UPDATE_STATE_INSPECTION_PROGRESS_PREFIX + JSON.stringify({ phase: "metadata inventory", path: pathname }) + "\\n"\n );\n } catch (error) {\n if (!hasNodeErrorCode(error, "EAGAIN") && !hasNodeErrorCode(error, "EWOULDBLOCK")) {\n throw error;\n }\n }\n };\n for (const file of files) {\n let size;\n progress(file);\n try {\n size = fs.statSync(file, { bigint: true }).size;\n } catch (error) {\n if (!hasNodeErrorCode(error, "ENOENT")) {\n result.push({ path: file });\n }\n continue;\n }\n for (const suffix of ["-wal", "-shm", "-journal"]) {\n progress(file + suffix);\n try {\n size += fs.statSync(file + suffix, { bigint: true }).size;\n } catch (error) {\n if (!hasNodeErrorCode(error, "ENOENT")) {\n size = void 0;\n break;\n }\n }\n }\n result.push({ path: file, sizeBytes: size?.toString() });\n }\n process.stdout.write(JSON.stringify(result));\n});\n',
},
};
function createRuntimeProcessScriptFile(name, options) {
return materializeRuntimeProcessScriptFile(scripts[name], options);
}
export { createRuntimeProcessScriptFile };