mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-19 10:02:16 +00:00
After the June lockfile regeneration (#46652) floated electron and reshuffled npm workspace hoisting, the desktop pack fails with "The specified electronDist does not exist". apps/desktop/package.json pointed electronDist at the repo root (../../node_modules/electron/dist) while npm now installs electron nested under apps/desktop/node_modules/electron. The two contradict, so a clean install can never package the app (Windows + macOS). - electronDist -> node_modules/electron/dist (resolved relative to apps/desktop, i.e. the workspace-local install npm actually produces). - hermes_cli/main.py, scripts/install.sh, scripts/install.ps1: add a runtime electron-dir resolver that prefers apps/desktop/node_modules/electron and falls back to the root hoist, so dist checks + the mirror re-download work under either npm layout. - patch-electron-builder-mac-binary.cjs: try the workspace-local Electron.app before the root hoist in the macOS binary-restore fallback (sibling site no PR touched). - test: assert build.electronDist resolves to where the lockfile installs electron, so a future hoist change (root <-> nested) can't silently break it. Salvages the overlapping work in #48003 (sitkarev), #48012 (omegazheng), and #48033 (james47kjv). Co-authored-by: sitkarev <59806492+sitkarev@users.noreply.github.com> Co-authored-by: omegazheng <zheng@omegasys.eu> Co-authored-by: james47kjv <220877172+james47kjv@users.noreply.github.com>
64 lines
3.2 KiB
JavaScript
64 lines
3.2 KiB
JavaScript
const fs = require('node:fs')
|
|
const path = require('node:path')
|
|
|
|
if (process.platform !== 'darwin') {
|
|
process.exit(0)
|
|
}
|
|
|
|
const desktopRoot = path.resolve(__dirname, '..')
|
|
const repoRoot = path.resolve(desktopRoot, '..', '..')
|
|
const electronMacPath = path.join(repoRoot, 'node_modules', 'app-builder-lib', 'out', 'electron', 'electronMac.js')
|
|
|
|
const marker = 'hermes-macos-electron-binary-fallback'
|
|
const needle = ` await Promise.all([
|
|
doRename(path.join(contentsPath, "MacOS"), electronBranding.productName, appPlist.CFBundleExecutable),
|
|
(0, builder_util_1.unlinkIfExists)(path.join(appOutDir, "LICENSE")),
|
|
(0, builder_util_1.unlinkIfExists)(path.join(appOutDir, "LICENSES.chromium.html")),
|
|
]);`
|
|
const replacement = ` // ${marker}: electron-builder 26.8.x can sometimes copy
|
|
// Electron.app without its main MacOS/Electron binary before this rename.
|
|
// Restore it from the installed Electron runtime so local desktop installs
|
|
// do not fail with ENOENT during macOS arm64 packaging.
|
|
const macosDir = path.join(contentsPath, "MacOS");
|
|
const bundledElectronBinary = path.join(macosDir, electronBranding.productName);
|
|
if (!fs.existsSync(bundledElectronBinary)) {
|
|
const candidates = [
|
|
path.join(packager.info.framework.distMacOsAppName, "Contents", "MacOS", electronBranding.productName),
|
|
// npm may nest the workspace-only electron devDep under
|
|
// apps/desktop/node_modules (process.cwd() during pack), or hoist
|
|
// it to the repo root. Try the workspace-local install first, then
|
|
// the root hoist, so the fallback works under either layout.
|
|
path.join(process.cwd(), "node_modules", "electron", "dist", "Electron.app", "Contents", "MacOS", electronBranding.productName),
|
|
path.join(process.cwd(), "..", "..", "node_modules", "electron", "dist", "Electron.app", "Contents", "MacOS", electronBranding.productName),
|
|
];
|
|
const sourceBinary = candidates.find(candidate => fs.existsSync(candidate));
|
|
if (sourceBinary == null) {
|
|
throw new Error("Electron binary missing from packaged app and Electron runtime: " + bundledElectronBinary);
|
|
}
|
|
await (0, promises_1.copyFile)(sourceBinary, bundledElectronBinary);
|
|
await (0, promises_1.chmod)(bundledElectronBinary, 0o755);
|
|
}
|
|
await Promise.all([
|
|
doRename(macosDir, electronBranding.productName, appPlist.CFBundleExecutable),
|
|
(0, builder_util_1.unlinkIfExists)(path.join(appOutDir, "LICENSE")),
|
|
(0, builder_util_1.unlinkIfExists)(path.join(appOutDir, "LICENSES.chromium.html")),
|
|
]);`
|
|
|
|
if (!fs.existsSync(electronMacPath)) {
|
|
console.warn(`[patch-electron-builder] skipped: ${electronMacPath} not found`)
|
|
process.exit(0)
|
|
}
|
|
|
|
const source = fs.readFileSync(electronMacPath, 'utf8')
|
|
if (source.includes(marker)) {
|
|
console.log('[patch-electron-builder] macOS Electron binary fallback already applied')
|
|
process.exit(0)
|
|
}
|
|
|
|
if (!source.includes(needle)) {
|
|
console.warn('[patch-electron-builder] skipped: expected electronMac.js shape not found')
|
|
process.exit(0)
|
|
}
|
|
|
|
fs.writeFileSync(electronMacPath, source.replace(needle, replacement))
|
|
console.log('[patch-electron-builder] applied macOS Electron binary fallback')
|