mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-21 23:11:01 +00:00
* Gateway: treat scope-limited probe RPC as degraded * Docs: clarify gateway probe degraded scope output * test: fix CI type regressions in gateway and outbound suites * Tests: fix Node24 diffs theme loading and Windows assertions * Tests: fix extension typing after main rebase * Tests: fix Windows CI regressions after rebase * Tests: normalize executable path assertions on Windows * Tests: remove duplicate gateway daemon result alias * Tests: stabilize Windows approval path assertions * Tests: fix Discord rate-limit startup fixture typing * Tests: use Windows-friendly relative exec fixtures --------- Co-authored-by: Mainframe <mainframe@MainfraacStudio.localdomain>
44 lines
1.4 KiB
TypeScript
44 lines
1.4 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import path from "node:path";
|
|
|
|
/**
|
|
* Homebrew Cellar paths (e.g. /opt/homebrew/Cellar/node/25.7.0/bin/node)
|
|
* break when Homebrew upgrades Node and removes the old version directory.
|
|
* Resolve these to a stable Homebrew-managed path that survives upgrades:
|
|
* - Default formula "node": <prefix>/opt/node/bin/node or <prefix>/bin/node
|
|
* - Versioned formula "node@22": <prefix>/opt/node@22/bin/node (keg-only)
|
|
*/
|
|
export async function resolveStableNodePath(nodePath: string): Promise<string> {
|
|
const cellarMatch = nodePath.match(
|
|
/^(.+?)[\\/]Cellar[\\/]([^\\/]+)[\\/][^\\/]+[\\/]bin[\\/]node$/,
|
|
);
|
|
if (!cellarMatch) {
|
|
return nodePath;
|
|
}
|
|
const prefix = cellarMatch[1]; // e.g. /opt/homebrew
|
|
const formula = cellarMatch[2]; // e.g. "node" or "node@22"
|
|
const pathModule = nodePath.includes("\\") ? path.win32 : path.posix;
|
|
|
|
// Try the Homebrew opt symlink first — works for both default and versioned formulas.
|
|
const optPath = pathModule.join(prefix, "opt", formula, "bin", "node");
|
|
try {
|
|
await fs.access(optPath);
|
|
return optPath;
|
|
} catch {
|
|
// fall through
|
|
}
|
|
|
|
// For the default "node" formula, also try the direct bin symlink.
|
|
if (formula === "node") {
|
|
const binPath = pathModule.join(prefix, "bin", "node");
|
|
try {
|
|
await fs.access(binPath);
|
|
return binPath;
|
|
} catch {
|
|
// fall through
|
|
}
|
|
}
|
|
|
|
return nodePath;
|
|
}
|