From 46a923faade2dbe6953ec503943ac2ba42a8fea8 Mon Sep 17 00:00:00 2001 From: Yuhan Lei Date: Wed, 17 Jun 2026 22:39:40 +0800 Subject: [PATCH 1/7] fix: replace Node version guard with yauzl override for Electron compatibility The previous preinstall guard blocked all Node >= 25 because Electron 40.8.0's extract-zip dependency (yauzl@2.x) silently fails on Node >= 24.16.0 due to a broken stream lifecycle in fd-slicer@1.x. Instead of forcing developers to manage Node versions, override yauzl to ^3.3.1 which bundles its own fixed fd-slicer. This is the same workaround used by serenity-js, shipshapecode/swach, and recommended in electron/electron#51619. The Node 25+ guard in check-node.mjs and its tests are removed. The format validation check is kept as a safety net. Related: electron/electron#51619, electron/electron#51886 --- package.json | 3 ++- script/check-node.mjs | 29 +---------------------------- script/check-node.test.mjs | 18 ++++++------------ 3 files changed, 9 insertions(+), 41 deletions(-) diff --git a/package.json b/package.json index 8c80cebcd..3cb9dbd71 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,8 @@ "esbuild": "0.28.1", "lodash": "4.18.1", "ws": "8.21.0", - "tmp": "0.2.7" + "tmp": "0.2.7", + "yauzl": "^3.3.1" }, "patchedDependencies": {} } diff --git a/script/check-node.mjs b/script/check-node.mjs index 082c9519d..06b8f33d2 100644 --- a/script/check-node.mjs +++ b/script/check-node.mjs @@ -1,34 +1,7 @@ -const unsupportedMajor = 25 const version = process.version const match = /^v?(\d+)(?:\.|$)/.exec(version) -let errorMessage = "" - if (!match) { - errorMessage = `Unsupported Node version format: ${version}. Use Node 24 for PawWork dependency installs.` -} - -if (match && Number(match[1]) >= unsupportedMajor) { - errorMessage = [ - "Use Node 24 for PawWork dependency installs.", - "", - `Current node: ${version}`, - "", - "Node 25+ can make Electron 40.8.0 postinstall leave an incomplete Electron.app while reporting success.", - "Switch to Node 24 (see .node-version), delete node_modules, then reinstall dependencies.", - "", - "macOS/Linux:", - " rm -rf node_modules", - "", - "PowerShell:", - " Remove-Item -Recurse -Force node_modules", - "", - "Then reinstall:", - " bun install --frozen-lockfile", - ].join("\n") -} - -if (errorMessage) { - console.error(errorMessage) + console.error(`Unsupported Node version format: ${version}.`) process.exit(1) } diff --git a/script/check-node.test.mjs b/script/check-node.test.mjs index f184608dc..4d1cf6c4f 100644 --- a/script/check-node.test.mjs +++ b/script/check-node.test.mjs @@ -19,21 +19,15 @@ function runGuard(version) { ) } -test("rejects Node 25+ with reinstall guidance", () => { - const result = runGuard("v25.0.0") +test("allows Node 24", () => { + const result = runGuard("v24.14.0") - expect(result.status).toBe(1) - expect(result.stderr).toContain("Current node: v25.0.0") - expect(result.stderr).toContain("Node 24") - expect(result.stderr).toContain(".node-version") - expect(result.stderr).toContain("delete node_modules") - expect(result.stderr).toContain("rm -rf node_modules") - expect(result.stderr).toContain("Remove-Item -Recurse -Force node_modules") - expect(result.stderr).toContain("bun install --frozen-lockfile") + expect(result.status).toBe(0) + expect(result.stderr).toBe("") }) -test("allows Node 24", () => { - const result = runGuard("v24.14.0") +test("allows Node 26", () => { + const result = runGuard("v26.3.0") expect(result.status).toBe(0) expect(result.stderr).toBe("") From 85e59da7cadf0bba9dfdf32a76b0898c2757ad17 Mon Sep 17 00:00:00 2001 From: Yuhan Lei Date: Wed, 17 Jun 2026 22:43:12 +0800 Subject: [PATCH 2/7] fix: pin yauzl to exact version for override consistency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3cb9dbd71..e0df9e2c3 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "lodash": "4.18.1", "ws": "8.21.0", "tmp": "0.2.7", - "yauzl": "^3.3.1" + "yauzl": "3.3.1" }, "patchedDependencies": {} } From 4699a4f30df315902018f8e7fd3c8e3cdfa7bf23 Mon Sep 17 00:00:00 2001 From: Yuhan Lei Date: Wed, 17 Jun 2026 23:00:13 +0800 Subject: [PATCH 3/7] fix: remove Node version guard, update lockfile for yauzl override - Delete script/check-node.mjs and script/check-node.test.mjs (P3) - Remove preinstall hook and test:install-guard script from package.json - Remove install guard unit step from CI workflow - Update bun.lock after adding yauzl override (P1) The yauzl@3.3.1 override fixes Electron's silent installation failure on Node >= 24.16.0. The Node version guard is no longer needed. --- .github/workflows/ci.yml | 3 --- bun.lock | 5 ++--- package.json | 2 -- script/check-node.mjs | 7 ------- script/check-node.test.mjs | 41 -------------------------------------- 5 files changed, 2 insertions(+), 56 deletions(-) delete mode 100644 script/check-node.mjs delete mode 100644 script/check-node.test.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 06cb2634f..84492b8f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -120,9 +120,6 @@ jobs: - uses: ./.github/actions/setup - - name: install guard unit - run: bun run test:install-guard - - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # actions/cache@v5 with: path: .turbo/cache diff --git a/bun.lock b/bun.lock index e64f00daf..e54d6de8b 100644 --- a/bun.lock +++ b/bun.lock @@ -421,6 +421,7 @@ "lodash": "4.18.1", "tmp": "0.2.7", "ws": "8.21.0", + "yauzl": "3.3.1", }, "catalog": { "@effect/opentelemetry": "4.0.0-beta.78", @@ -1949,8 +1950,6 @@ "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], - "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], @@ -3073,7 +3072,7 @@ "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], - "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + "yauzl": ["yauzl@3.3.1", "", { "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" } }, "sha512-RNPCUkiE/ZgO4w8i9U5yDQVHaFDdnzaFANElRvpJteCspvmv2VqrRb9lvS6odVD+jqI/zDsxAHJVsafpcheVQQ=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], diff --git a/package.json b/package.json index e0df9e2c3..3ecd23db8 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,7 @@ "typecheck": "bun turbo typecheck", "lint": "eslint \"packages/{app,ui,desktop-electron}/src/**/*.{ts,tsx}\"", "lint:ci": "bun run lint", - "preinstall": "node script/check-node.mjs", "postinstall": "bun run --cwd packages/opencode fix-node-pty", - "test:install-guard": "cd script && bun test check-node.test.mjs", "test": "echo 'do not run tests from root' && exit 1" }, "workspaces": { diff --git a/script/check-node.mjs b/script/check-node.mjs deleted file mode 100644 index 06b8f33d2..000000000 --- a/script/check-node.mjs +++ /dev/null @@ -1,7 +0,0 @@ -const version = process.version -const match = /^v?(\d+)(?:\.|$)/.exec(version) - -if (!match) { - console.error(`Unsupported Node version format: ${version}.`) - process.exit(1) -} diff --git a/script/check-node.test.mjs b/script/check-node.test.mjs deleted file mode 100644 index 4d1cf6c4f..000000000 --- a/script/check-node.test.mjs +++ /dev/null @@ -1,41 +0,0 @@ -import { expect, test } from "bun:test" -import { spawnSync } from "node:child_process" - -function runGuard(version) { - return spawnSync( - "node", - [ - "--input-type=module", - "-e", - [ - `Object.defineProperty(process, "version", { value: ${JSON.stringify(version)} })`, - `await import("./check-node.mjs")`, - ].join(";"), - ], - { - cwd: import.meta.dirname, - encoding: "utf8", - }, - ) -} - -test("allows Node 24", () => { - const result = runGuard("v24.14.0") - - expect(result.status).toBe(0) - expect(result.stderr).toBe("") -}) - -test("allows Node 26", () => { - const result = runGuard("v26.3.0") - - expect(result.status).toBe(0) - expect(result.stderr).toBe("") -}) - -test("rejects unparseable Node versions with a clean message", () => { - const result = runGuard("invalid-version") - - expect(result.status).toBe(1) - expect(result.stderr).toContain("Unsupported Node version format: invalid-version") -}) From 875cb102ae35a6f33b0f0432b77d4a9facd7ca44 Mon Sep 17 00:00:00 2001 From: Yuhan Lei Date: Wed, 17 Jun 2026 23:47:18 +0800 Subject: [PATCH 4/7] ci: assert Electron install complete before repair step MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a pre-repair assertion in desktop-smoke that checks path.txt and Electron Framework.framework exist after bun install. This ensures the yauzl override is working — if it fails, CI will catch it before the repair step can mask the problem. --- .github/workflows/desktop-smoke.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/desktop-smoke.yml b/.github/workflows/desktop-smoke.yml index 8099c4133..bff03ae1f 100644 --- a/.github/workflows/desktop-smoke.yml +++ b/.github/workflows/desktop-smoke.yml @@ -147,6 +147,21 @@ jobs: - name: Install dependencies run: bun install --frozen-lockfile + - name: Assert Electron install complete (pre-repair) + run: | + set -euo pipefail + ELECTRON_DIR=$(node -e "console.log(require.resolve('electron/package.json').replace('/package.json',''))") + if [ ! -f "$ELECTRON_DIR/path.txt" ]; then + echo "::error::Electron path.txt missing after bun install — yauzl override may have failed" + exit 1 + fi + if [ ! -d "$ELECTRON_DIR/dist/Electron.app/Contents/Frameworks/Electron Framework.framework" ]; then + echo "::error::Electron Frameworks missing after bun install — yauzl override may have failed" + exit 1 + fi + echo "Electron install verified: path.txt and Frameworks present" + working-directory: packages/desktop-electron + - name: Repair Electron install run: node ./scripts/repair-electron-install.mjs working-directory: packages/desktop-electron From c35cdeacd40ec3bba8ae1220cbad1e79636d7765 Mon Sep 17 00:00:00 2001 From: Yuhan Lei Date: Thu, 18 Jun 2026 00:04:06 +0800 Subject: [PATCH 5/7] ci: tighten Electron pre-repair assertion using repair script's isElectronInstallComplete Replace the shell-based directory checks with a call to the repair script's exported isElectronInstallComplete function, which verifies: - The platform-specific Electron binary exists (dist/Electron.app/Contents/MacOS/Electron) - The Framework binary file exists (not just the directory) This prevents partially-damaged dist directories from passing the assertion and being silently masked by the repair step. --- .github/workflows/desktop-smoke.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/desktop-smoke.yml b/.github/workflows/desktop-smoke.yml index bff03ae1f..e2304645d 100644 --- a/.github/workflows/desktop-smoke.yml +++ b/.github/workflows/desktop-smoke.yml @@ -149,17 +149,17 @@ jobs: - name: Assert Electron install complete (pre-repair) run: | - set -euo pipefail - ELECTRON_DIR=$(node -e "console.log(require.resolve('electron/package.json').replace('/package.json',''))") - if [ ! -f "$ELECTRON_DIR/path.txt" ]; then - echo "::error::Electron path.txt missing after bun install — yauzl override may have failed" - exit 1 - fi - if [ ! -d "$ELECTRON_DIR/dist/Electron.app/Contents/Frameworks/Electron Framework.framework" ]; then - echo "::error::Electron Frameworks missing after bun install — yauzl override may have failed" - exit 1 - fi - echo "Electron install verified: path.txt and Frameworks present" + node --input-type=module -e " + import { createRequire } from 'node:module' + import { isElectronInstallComplete } from './scripts/repair-electron-install.mjs' + const require = createRequire(import.meta.url) + const electronDir = require.resolve('electron/package.json').replace('/package.json', '') + if (!isElectronInstallComplete(electronDir)) { + console.error('::error::Electron install incomplete after bun install — yauzl override may have failed') + process.exit(1) + } + console.log('Electron install verified: binary and Framework present') + " working-directory: packages/desktop-electron - name: Repair Electron install From 6e9b978513186f7a5812ef04154dc65ecc1621c6 Mon Sep 17 00:00:00 2001 From: Yuhan Lei Date: Thu, 18 Jun 2026 00:21:04 +0800 Subject: [PATCH 6/7] ci: also check path.txt content in Electron pre-repair assertion Add a check that path.txt exists and contains the expected macOS platform path 'Electron.app/Contents/MacOS/Electron'. This catches the #1329 failure mode where the binary and Framework were present but path.txt was missing. --- .github/workflows/desktop-smoke.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/desktop-smoke.yml b/.github/workflows/desktop-smoke.yml index e2304645d..893a64252 100644 --- a/.github/workflows/desktop-smoke.yml +++ b/.github/workflows/desktop-smoke.yml @@ -150,15 +150,22 @@ jobs: - name: Assert Electron install complete (pre-repair) run: | node --input-type=module -e " + import { readFileSync } from 'node:fs' + import { join } from 'node:path' import { createRequire } from 'node:module' import { isElectronInstallComplete } from './scripts/repair-electron-install.mjs' const require = createRequire(import.meta.url) const electronDir = require.resolve('electron/package.json').replace('/package.json', '') if (!isElectronInstallComplete(electronDir)) { - console.error('::error::Electron install incomplete after bun install — yauzl override may have failed') + console.error('::error::Electron binary or Framework missing after bun install') process.exit(1) } - console.log('Electron install verified: binary and Framework present') + const pathTxt = readFileSync(join(electronDir, 'path.txt'), 'utf8').trim() + if (pathTxt !== 'Electron.app/Contents/MacOS/Electron') { + console.error('::error::Electron path.txt missing or wrong content: ' + JSON.stringify(pathTxt)) + process.exit(1) + } + console.log('Electron install verified: binary, Framework, and path.txt present') " working-directory: packages/desktop-electron From 1409de0e9e65db1fc985fb053a940b5521da15d1 Mon Sep 17 00:00:00 2001 From: Yuhan Lei Date: Thu, 18 Jun 2026 01:05:03 +0800 Subject: [PATCH 7/7] fix: upgrade Electron to 40.10.3, add --assert-complete and CI install matrix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Upgrade electron 40.8.0 → 40.10.3 (includes upstream extract-zip fix) - Remove yauzl override (no longer needed with Electron 40.10.3) - Add --assert-complete flag to repair-electron-install.mjs that checks binary, Framework, and path.txt content - Replace inline CI assertion with single-line --assert-complete call - Add install-matrix CI job covering Node 24 and 26 - Update PR description with migration guidance Related: electron/electron#51886, #1329 --- .github/workflows/desktop-smoke.yml | 62 +++++++++++++------ bun.lock | 41 +++++------- package.json | 3 +- packages/desktop-electron/package.json | 2 +- .../scripts/repair-electron-install.mjs | 59 ++++++++++++++++-- 5 files changed, 114 insertions(+), 53 deletions(-) diff --git a/.github/workflows/desktop-smoke.yml b/.github/workflows/desktop-smoke.yml index 893a64252..be97ea218 100644 --- a/.github/workflows/desktop-smoke.yml +++ b/.github/workflows/desktop-smoke.yml @@ -148,25 +148,7 @@ jobs: run: bun install --frozen-lockfile - name: Assert Electron install complete (pre-repair) - run: | - node --input-type=module -e " - import { readFileSync } from 'node:fs' - import { join } from 'node:path' - import { createRequire } from 'node:module' - import { isElectronInstallComplete } from './scripts/repair-electron-install.mjs' - const require = createRequire(import.meta.url) - const electronDir = require.resolve('electron/package.json').replace('/package.json', '') - if (!isElectronInstallComplete(electronDir)) { - console.error('::error::Electron binary or Framework missing after bun install') - process.exit(1) - } - const pathTxt = readFileSync(join(electronDir, 'path.txt'), 'utf8').trim() - if (pathTxt !== 'Electron.app/Contents/MacOS/Electron') { - console.error('::error::Electron path.txt missing or wrong content: ' + JSON.stringify(pathTxt)) - process.exit(1) - } - console.log('Electron install verified: binary, Framework, and path.txt present') - " + run: node ./scripts/repair-electron-install.mjs --assert-complete working-directory: packages/desktop-electron - name: Repair Electron install @@ -281,6 +263,41 @@ jobs: env: PAWWORK_CI_SMOKE_CDP: "true" + install-matrix: + needs: changes + if: needs.changes.outputs.docs_only != 'true' + strategy: + matrix: + node-version: ["24", "26"] + runs-on: macos-14 + timeout-minutes: 10 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # actions/checkout@v6 + with: + persist-credentials: false + + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # actions/setup-node@v6.4.0 + with: + node-version: ${{ matrix.node-version }} + + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # oven-sh/setup-bun@v2 + with: + bun-version: "1.3.14" + + - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # actions/cache@v5 + with: + path: ~/.bun/install/cache + key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} + restore-keys: | + bun-${{ runner.os }}- + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Assert Electron install complete + run: node ./scripts/repair-electron-install.mjs --assert-complete + working-directory: packages/desktop-electron + # Compatibility aggregator for branch protection setups that require # `desktop-smoke / check`. The live dev ruleset currently requires # `smoke-macos-arm64` directly, so every blocking job added above should @@ -290,12 +307,14 @@ jobs: needs: - changes - smoke-macos-arm64 + - install-matrix runs-on: ubuntu-latest steps: - name: Validate desktop smoke result env: DOCS_ONLY: ${{ needs.changes.outputs.docs_only }} SMOKE_RESULT: ${{ needs.smoke-macos-arm64.result }} + INSTALL_MATRIX_RESULT: ${{ needs.install-matrix.result }} run: | set -euo pipefail @@ -308,3 +327,8 @@ jobs: echo "smoke-macos-arm64=$SMOKE_RESULT" exit 1 fi + + if [ "$INSTALL_MATRIX_RESULT" != "success" ]; then + echo "install-matrix=$INSTALL_MATRIX_RESULT" + exit 1 + fi diff --git a/bun.lock b/bun.lock index e54d6de8b..c6e460573 100644 --- a/bun.lock +++ b/bun.lock @@ -130,7 +130,7 @@ "@types/ws": "^8.18.1", "@typescript/native-preview": "catalog:", "@valibot/to-json-schema": "1.6.0", - "electron": "40.8.0", + "electron": "40.10.3", "electron-builder": "^26", "electron-vite": "^5", "sharp": "0.34.5", @@ -421,7 +421,6 @@ "lodash": "4.18.1", "tmp": "0.2.7", "ws": "8.21.0", - "yauzl": "3.3.1", }, "catalog": { "@effect/opentelemetry": "4.0.0-beta.78", @@ -688,11 +687,13 @@ "@effect/platform-node-shared": ["@effect/platform-node-shared@4.0.0-beta.78", "", { "dependencies": { "@types/ws": "^8.18.1", "ws": "^8.20.0" }, "peerDependencies": { "effect": "^4.0.0-beta.78" } }, "sha512-mo0ddTPATyCMyqzQasYDL7+NI29vozoMplom+qu9f/onDTd4xG5hvEEfGxfL0Ljygui6keG/YE/E9OZVf2z5WA=="], + "@electron-internal/extract-zip": ["@electron-internal/extract-zip@1.0.3", "", {}, "sha512-OjKpjB7gohtEjZiq6nDx1egqjZJhGPN1iFOIED+NFhB/MMkXw/XRcHjh1DGXKT5z2W9eW7Jy2UKU3gpjvusFTQ=="], + "@electron/asar": ["@electron/asar@3.4.1", "", { "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" }, "bin": { "asar": "bin/asar.js" } }, "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA=="], "@electron/fuses": ["@electron/fuses@1.8.0", "", { "dependencies": { "chalk": "^4.1.1", "fs-extra": "^9.0.1", "minimist": "^1.2.5" }, "bin": { "electron-fuses": "dist/bin.js" } }, "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw=="], - "@electron/get": ["@electron/get@2.0.3", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ=="], + "@electron/get": ["@electron/get@5.0.0", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^3.0.0", "graceful-fs": "^4.2.11", "progress": "^2.0.3", "semver": "^7.6.3", "sumchecker": "^3.0.1" }, "optionalDependencies": { "undici": "^7.24.4" } }, "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA=="], "@electron/notarize": ["@electron/notarize@2.5.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1", "promise-retry": "^2.0.1" } }, "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A=="], @@ -1440,8 +1441,6 @@ "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], - "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.59.3", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.3", "@typescript-eslint/type-utils": "8.59.3", "@typescript-eslint/utils": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.59.3", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw=="], "@typescript-eslint/parser": ["@typescript-eslint/parser@8.59.3", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg=="], @@ -1588,8 +1587,6 @@ "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], - "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], @@ -1802,7 +1799,7 @@ "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], - "electron": ["electron@40.8.0", "", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^24.9.0", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" } }, "sha512-WoPq0Nr9Yx3g7T6VnJXdwa/rr2+VRyH3a+K+ezfMKBlf6WjxE/LmhMQabKbb6yjm9RbZhJBRcYyoLph421O2mQ=="], + "electron": ["electron@40.10.3", "", { "dependencies": { "@electron-internal/extract-zip": "^1.0.1", "@electron/get": "^5.0.0", "@types/node": "^24.9.0" }, "bin": { "electron": "cli.js" } }, "sha512-DdWRsHm4j5wH9TMcfnB2Dqx44G/6BgLKSG/oeRe9kS60pfqCUwzUkHk0ClwvZzBVXtJ1kcdkHVRrJsl1ooKp+g=="], "electron-builder": ["electron-builder@26.8.1", "", { "dependencies": { "app-builder-lib": "26.8.1", "builder-util": "26.8.1", "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "ci-info": "^4.2.0", "dmg-builder": "26.8.1", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, "bin": { "electron-builder": "cli.js", "install-app-deps": "install-app-deps.js" } }, "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw=="], @@ -1846,7 +1843,7 @@ "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], - "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], @@ -1918,8 +1915,6 @@ "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], - "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], - "extsprintf": ["extsprintf@1.4.1", "", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="], "fast-check": ["fast-check@4.8.0", "", { "dependencies": { "pure-rand": "^8.0.0" } }, "sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg=="], @@ -2012,7 +2007,7 @@ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], @@ -2542,8 +2537,6 @@ "pe-library": ["pe-library@0.4.1", "", {}, "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw=="], - "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], - "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], @@ -3072,8 +3065,6 @@ "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], - "yauzl": ["yauzl@3.3.1", "", { "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" } }, "sha512-RNPCUkiE/ZgO4w8i9U5yDQVHaFDdnzaFANElRvpJteCspvmv2VqrRb9lvS6odVD+jqI/zDsxAHJVsafpcheVQQ=="], - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], "zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="], @@ -3178,10 +3169,6 @@ "@electron/fuses/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - "@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - - "@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@electron/notarize/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], "@electron/osx-sign/isbinaryfile": ["isbinaryfile@4.0.10", "", {}, "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw=="], @@ -3328,14 +3315,14 @@ "c12/dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], + "cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + "cli-table3/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], "conf/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], - "conf/env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], - "cross-fetch/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], @@ -3360,8 +3347,6 @@ "eslint/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], - "fast-json-stringify/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "filelist/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], @@ -3402,6 +3387,8 @@ "mysql2/iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], + "node-gyp/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], "opencode/minimatch": ["minimatch@10.2.3", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg=="], @@ -3534,10 +3521,10 @@ "@electron/fuses/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], - "@electron/get/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - "@electron/notarize/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "@electron/rebuild/node-gyp/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + "@electron/rebuild/node-gyp/make-fetch-happen": ["make-fetch-happen@14.0.3", "", { "dependencies": { "@npmcli/agent": "^3.0.0", "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "ssri": "^12.0.0" } }, "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ=="], "@electron/rebuild/node-gyp/nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], @@ -3628,6 +3615,8 @@ "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "app-builder-lib/@electron/get/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + "app-builder-lib/@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], "app-builder-lib/@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], diff --git a/package.json b/package.json index 3ecd23db8..d44b5be53 100644 --- a/package.json +++ b/package.json @@ -119,8 +119,7 @@ "esbuild": "0.28.1", "lodash": "4.18.1", "ws": "8.21.0", - "tmp": "0.2.7", - "yauzl": "3.3.1" + "tmp": "0.2.7" }, "patchedDependencies": {} } diff --git a/packages/desktop-electron/package.json b/packages/desktop-electron/package.json index d63c7a148..a166edbca 100644 --- a/packages/desktop-electron/package.json +++ b/packages/desktop-electron/package.json @@ -56,7 +56,7 @@ "@types/ws": "^8.18.1", "@typescript/native-preview": "catalog:", "@valibot/to-json-schema": "1.6.0", - "electron": "40.8.0", + "electron": "40.10.3", "electron-builder": "^26", "electron-vite": "^5", "sharp": "0.34.5", diff --git a/packages/desktop-electron/scripts/repair-electron-install.mjs b/packages/desktop-electron/scripts/repair-electron-install.mjs index 7cb52148d..5c48c8640 100644 --- a/packages/desktop-electron/scripts/repair-electron-install.mjs +++ b/packages/desktop-electron/scripts/repair-electron-install.mjs @@ -38,10 +38,9 @@ export function isElectronInstallComplete(electronDir, platform = process.platfo "Frameworks", "Electron Framework.framework", ) - return [ - join(frameworkDir, "Electron Framework"), - join(frameworkDir, "Versions", "A", "Electron Framework"), - ].some((candidate) => existsSync(candidate)) + return [join(frameworkDir, "Electron Framework"), join(frameworkDir, "Versions", "A", "Electron Framework")].some( + (candidate) => existsSync(candidate), + ) } return true @@ -216,6 +215,56 @@ export function repairElectronInstall() { repairElectronInstallAt(electronDir) } +export function assertElectronInstallComplete( + electronDir = join(require.resolve("electron/package.json"), ".."), + platform = process.platform, +) { + const platformPath = platformPathForElectron(platform) + const binaryPath = join(electronDir, "dist", platformPath) + + if (!existsSync(binaryPath)) { + throw new Error(`Electron binary missing: ${binaryPath}`) + } + + if (platform === "darwin" || platform === "mas") { + const frameworkDir = join( + electronDir, + "dist", + "Electron.app", + "Contents", + "Frameworks", + "Electron Framework.framework", + ) + const frameworkBinary = [ + join(frameworkDir, "Electron Framework"), + join(frameworkDir, "Versions", "A", "Electron Framework"), + ].find((candidate) => existsSync(candidate)) + + if (!frameworkBinary) { + throw new Error(`Electron Framework binary missing in ${frameworkDir}`) + } + } + + let pathContent + try { + pathContent = readFileSync(join(electronDir, "path.txt"), "utf8").trim() + } catch { + throw new Error(`Electron path.txt missing: ${join(electronDir, "path.txt")}`) + } + + if (pathContent !== platformPath) { + throw new Error( + `Electron path.txt content mismatch: expected ${JSON.stringify(platformPath)}, got ${JSON.stringify(pathContent)}`, + ) + } + + console.log(`Electron install complete: binary, Framework, and path.txt verified at ${electronDir}`) +} + if (import.meta.url === `file://${process.argv[1]}`) { - repairElectronInstall() + if (process.argv.includes("--assert-complete")) { + assertElectronInstallComplete() + } else { + repairElectronInstall() + } }