























@@ -123,6 +123,7 @@ function spawnInvocation(command, commandArgs, env, platform) {
123123124124const cmdMetaCharactersRe = /([()\][%!^"`<>&|;, *?])/g;
125125const jsRuntimeEntrypoints = new Set(["pnpm", "npm", "npx", "corepack", "node", "yarn", "bun"]);
126+const awsMacosCorepackEntrypoints = new Set(["pnpm", "yarn", "corepack"]);
126127const shellControlCommandPrefixes = new Set([
127128"if",
128129"while",
@@ -579,6 +580,29 @@ function commandWordsRuntimeEntrypoint(words) {
579580return "";
580581}
581582583+function commandNeedsAwsMacosPackageManager(commandArgs) {
584+if (isChangedGateCommand(commandArgs)) {
585+return true;
586+}
587+if (commandArgs.length === 1) {
588+return shellCommandWordCandidates(commandArgs[0]).some(commandWordsNeedAwsMacosPackageManager);
589+}
590+return commandWordsNeedAwsMacosPackageManager(normalizedCommandWords(commandArgs));
591+}
592+593+function commandWordsNeedAwsMacosPackageManager(words) {
594+const first = (words[0] ?? "").split("/").pop();
595+if (awsMacosCorepackEntrypoints.has(first)) {
596+return true;
597+}
598+599+const inlineCommand = shellInlineCommand(words);
600+if (!inlineCommand) {
601+return false;
602+}
603+return shellCommandWordCandidates(inlineCommand).some(commandWordsNeedAwsMacosPackageManager);
604+}
605+582606function isChangedGateCommand(commandArgs) {
583607if (commandArgs.length === 1) {
584608return shellCommandWordCandidates(commandArgs[0]).some(isChangedGateCommandWords);
@@ -593,7 +617,9 @@ function isChangedGateCommandWords(words) {
593617}
594618595619const inlineCommand = shellInlineCommand(words);
596-return inlineCommand ? shellCommandWordCandidates(inlineCommand).some(isChangedGateCommandWords) : false;
620+return inlineCommand
621+ ? shellCommandWordCandidates(inlineCommand).some(isChangedGateCommandWords)
622+ : false;
597623}
598624599625function isChangedGateWords(words) {
@@ -1154,20 +1180,19 @@ function injectRemoteChangedGateGitBootstrap(commandArgs, changedGateBase) {
11541180return normalizedArgs;
11551181}
115611821157-function remoteAwsMacosJsBootstrap() {
1183+function remoteAwsMacosJsBootstrap({ packageManager = false } = {}) {
11581184const nodeVersion = process.env.OPENCLAW_CRABBOX_MACOS_NODE_VERSION?.trim() || "24.15.0";
1159-return [
1185+const bootstrap = [
11601186"openclaw_crabbox_bootstrap_macos_js() {",
11611187'tool_root="${OPENCLAW_CRABBOX_MACOS_TOOLCHAIN_DIR:-$HOME/.openclaw-crabbox-toolchain}";',
1162-'pnpm_home="${PNPM_HOME:-$tool_root/pnpm-home}";',
11631188`node_version=${shellQuote(nodeVersion)};`,
11641189'arch="$(uname -m)";',
11651190'case "$arch" in arm64) node_arch=arm64 ;; x86_64) node_arch=x64 ;; *) echo "unsupported macOS arch: $arch" >&2; return 2 ;; esac;',
11661191'if [ -z "${TMPDIR:-}" ]; then export TMPDIR="/tmp"; fi;',
11671192'if [ ! -d "$TMPDIR" ]; then mkdir -p "$TMPDIR" 2>/dev/null || export TMPDIR="/tmp"; fi;',
11681193'if [ ! -d "$TMPDIR" ]; then echo "usable TMPDIR not found: $TMPDIR" >&2; return 1; fi;',
11691194'node_dir="$tool_root/node-v${node_version}-darwin-${node_arch}";',
1170-'export PATH="$node_dir/bin:$pnpm_home:$PATH";',
1195+'export PATH="$node_dir/bin:$PATH";',
11711196'if [ ! -x "$node_dir/bin/node" ]; then',
11721197'tmp_dir="$(mktemp -d)" || return 1;',
11731198'pkg="node-v${node_version}-darwin-${node_arch}.tar.gz";',
@@ -1180,23 +1205,26 @@ function remoteAwsMacosJsBootstrap() {
11801205'tar -xzf "$tmp_dir/$pkg" -C "$tool_root" || { status=$?; rm -rf "$tmp_dir"; return "$status"; };',
11811206'rm -rf "$tmp_dir";',
11821207"fi;",
1183-'export COREPACK_HOME="${COREPACK_HOME:-$tool_root/corepack}";',
1184-'export PNPM_HOME="$pnpm_home";',
1185-'mkdir -p "$COREPACK_HOME" "$PNPM_HOME" || return 1;',
1186-'export PATH="$PNPM_HOME:$PATH";',
1187-'corepack enable --install-directory "$PNPM_HOME" || return 1;',
11881208"node --version >&2;",
1189-"pnpm --version >&2;",
1190-"};",
1191-"openclaw_crabbox_bootstrap_macos_js",
1192-].join(" ");
1209+];
1210+if (packageManager) {
1211+bootstrap.push(
1212+'export COREPACK_HOME="${COREPACK_HOME:-$tool_root/corepack}";',
1213+'export PNPM_HOME="${PNPM_HOME:-$tool_root/pnpm-home}";',
1214+'mkdir -p "$COREPACK_HOME" "$PNPM_HOME" || return 1;',
1215+'export PATH="$PNPM_HOME:$PATH";',
1216+'corepack enable --install-directory "$PNPM_HOME" || return 1;',
1217+"pnpm --version >&2;",
1218+);
1219+}
1220+bootstrap.push("};", "openclaw_crabbox_bootstrap_macos_js");
1221+return bootstrap.join(" ");
11931222}
1194122311951224function injectRemoteAwsMacosJsBootstrap(commandArgs, providerName) {
1196-if (
1197-!isAwsMacosRemoteTarget(commandArgs, providerName) ||
1198-!commandRuntimeEntrypoint(runCommandArgs(commandArgs))
1199-) {
1225+const runArgs = runCommandArgs(commandArgs);
1226+const runtimeEntrypoint = commandRuntimeEntrypoint(runArgs);
1227+if (!isAwsMacosRemoteTarget(commandArgs, providerName) || !runtimeEntrypoint) {
12001228return commandArgs;
12011229}
12021230@@ -1211,7 +1239,9 @@ function injectRemoteAwsMacosJsBootstrap(commandArgs, providerName) {
12111239hasOption(normalizedArgs, "--shell") && remoteCommand.length === 1
12121240 ? remoteCommand[0]
12131241 : shellJoin(remoteCommand);
1214-const shellCommand = `${remoteAwsMacosJsBootstrap()} && { ${originalShellCommand}\n}`;
1242+const shellCommand = `${remoteAwsMacosJsBootstrap({
1243+ packageManager: commandNeedsAwsMacosPackageManager(runArgs),
1244+ })} && { ${originalShellCommand}\n}`;
1215124512161246if (!hasOption(normalizedArgs, "--shell")) {
12171247normalizedArgs.splice(optionEnd, 0, "--shell");
@@ -1282,12 +1312,13 @@ function prepareAwsMacosScriptStdinBootstrap(commandArgs, providerName) {
12821312}
1283131312841314function createAwsMacosScriptStdinWrapper(script) {
1315+const packageManager = scriptNeedsAwsMacosPackageManager(script);
12851316if (!script.startsWith("#!")) {
1286-return `${remoteAwsMacosJsBootstrap()} || exit $?\n${script}`;
1317+return `${remoteAwsMacosJsBootstrap({ packageManager })} || exit $?\n${script}`;
12871318}
12881319const delimiter = uniqueHereDocDelimiter(script);
12891320return [
1290-`${remoteAwsMacosJsBootstrap()} || exit $?`,
1321+`${remoteAwsMacosJsBootstrap({ packageManager })} || exit $?`,
12911322'tmp_script="$(mktemp "${TMPDIR:-/tmp}/openclaw-crabbox-script.XXXXXX")" || exit $?',
12921323'cleanup_openclaw_crabbox_script() { rm -f "$tmp_script"; }',
12931324"trap cleanup_openclaw_crabbox_script EXIT",
@@ -1300,6 +1331,23 @@ function createAwsMacosScriptStdinWrapper(script) {
13001331].join("\n");
13011332}
130213331334+function scriptNeedsAwsMacosPackageManager(script) {
1335+const firstLine = script.match(/^[^\r\n]*/u)?.[0] ?? "";
1336+if (firstLine.startsWith("#!")) {
1337+let words = firstLine.slice(2).trim().split(/\s+/u).filter(Boolean);
1338+if ((words[0] ?? "").split("/").pop() === "env") {
1339+words = words.slice(1);
1340+while ((words[0] ?? "").startsWith("-")) {
1341+words = words.slice(1);
1342+}
1343+}
1344+if (commandWordsNeedAwsMacosPackageManager(words)) {
1345+return true;
1346+}
1347+}
1348+return commandNeedsAwsMacosPackageManager([script]);
1349+}
1350+13031351function uniqueHereDocDelimiter(script) {
13041352let index = 0;
13051353for (;;) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。