From ef2d2b3e4827b6d40e57084bff657fa56b3546b5 Mon Sep 17 00:00:00 2001 From: Multica Eve Date: Thu, 22 Oct 2026 13:26:40 +0800 Subject: [PATCH] =?UTF-8?q?MUL-8149:=20patch=20Node=2022.23.4=20in=20web?= =?UTF-8?q?=20image,=20Electron=2039=E2=86=9244=20(#9416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(web): pin Dockerfile.web to node:22.23.4-alpine for Oct 2026 Node security release (MUL-8149) Co-authored-by: multica-agent * fix(desktop): upgrade Electron 39 (EOL) to 44.9.3 (MUL-8149) Electron 39 is end-of-life and will not receive the 2026-10-21 Node.js security fixes. 44.x is a supported line (Node 24.22.0, Chromium 152). clipboard.writeText now returns a Promise in Electron 44; handle the rejection in the context menu so it can't become an unhandled rejection. Co-authored-by: multica-agent * fix(desktop): skip auto-update on macOS 12 and older (MUL-8149) Electron 44 requires macOS 13 (Darwin 22), but electron-builder does not publish minimumSystemVersion in latest-mac.yml, so electron-updater would download and install a build that cannot launch on macOS 12, replacing a working app. Disable background checks/downloads on those hosts and make a manual check report the OS requirement instead. Co-authored-by: multica-agent * fix(desktop): publish macOS update floor in update metadata (MUL-8149) Review feedback: installed macOS 12 clients run their old updater code, so a runtime check in the new build can never stop them from downloading an Electron 44 build that cannot launch. The guard has to live in the published latest-mac.yml / latest-x64-mac.yml. - beforePack hook (scripts/mac-update-floor.cjs) adds minimumSystemVersion: 22.0.0 (Darwin kernel, = macOS 13) to the mac releaseInfo that electron-builder spreads into update info. The config schema rejects the key, so it is set on the packager after validation; the hook throws if those internals move. - mac.minimumSystemVersion: 13.0.0 for every mac bundle; drop the stale Intel-only 12.0.0 override in package.mjs. - Regression test runs electron-updater 6.8.3's real checkIfUpdateSupported against the published shape: Darwin 21 skips, 22/25 update; no floor or a 13.0.0 floor would let Darwin 21 through. - Revert the in-app updater.ts guard: it is unreachable on macOS 12. Co-authored-by: multica-agent --------- Co-authored-by: Multica Eve <273080382+multica-eve@users.noreply.github.com> Co-authored-by: multica-agent --- Dockerfile.web | 12 +- apps/desktop/electron-builder.yml | 6 + apps/desktop/eslint.config.mjs | 2 +- apps/desktop/package.json | 2 +- apps/desktop/scripts/mac-update-floor.cjs | 40 ++++ .../desktop/scripts/mac-update-floor.test.mjs | 116 +++++++++++ apps/desktop/scripts/package.mjs | 3 - apps/desktop/scripts/package.test.mjs | 1 - apps/desktop/src/main/context-menu.test.ts | 2 +- apps/desktop/src/main/context-menu.ts | 7 +- pnpm-lock.yaml | 181 +++++------------- 11 files changed, 232 insertions(+), 140 deletions(-) create mode 100644 apps/desktop/scripts/mac-update-floor.cjs create mode 100644 apps/desktop/scripts/mac-update-floor.test.mjs diff --git a/Dockerfile.web b/Dockerfile.web index f4eba1036..af67919f4 100644 --- a/Dockerfile.web +++ b/Dockerfile.web @@ -1,5 +1,9 @@ # --- Dependencies --- -FROM node:22-alpine AS deps +# Node is pinned to an exact patch so a stale cached `node:22-alpine` layer can +# never ship a runtime missing a security release. 22.23.4 fixes the +# 2026-10-21 Node.js security release (CVE-2026-111497, CVE-2026-106069, +# CVE-2026-105482, ...). Bump all three stages together. +FROM node:22.23.4-alpine AS deps WORKDIR /app @@ -22,7 +26,7 @@ RUN corepack enable && \ RUN pnpm install --frozen-lockfile # --- Build --- -FROM node:22-alpine AS builder +FROM node:22.23.4-alpine AS builder WORKDIR /app @@ -52,13 +56,13 @@ ENV STANDALONE=true RUN pnpm --filter @multica/web build # --- Runtime --- -FROM node:22-alpine AS runner +FROM node:22.23.4-alpine AS runner WORKDIR /app # Alpine openssl security fixes (CVE-2026-63073, CVE-2026-75803). # Floor pins the fix so the build fails instead of silently shipping the CVEs. -# Remove once node:22-alpine includes libssl3 >= 3.5.8-r0. +# Remove once the pinned node image includes libssl3 >= 3.5.8-r0. RUN apk add --no-cache "libcrypto3>=3.5.8-r0" "libssl3>=3.5.8-r0" ENV NODE_ENV=production diff --git a/apps/desktop/electron-builder.yml b/apps/desktop/electron-builder.yml index 11ba7596a..a5050ef3b 100644 --- a/apps/desktop/electron-builder.yml +++ b/apps/desktop/electron-builder.yml @@ -35,7 +35,13 @@ protocols: - multica asarUnpack: - resources/** +# Publishes `minimumSystemVersion` (Darwin kernel floor) into latest-mac.yml / +# latest-x64-mac.yml so installed macOS 12 clients skip updates they cannot +# launch. See scripts/mac-update-floor.cjs for why this can't be plain config. +beforePack: ./scripts/mac-update-floor.cjs mac: + # Electron 44 requires macOS 13 Ventura; declare it on every mac bundle. + minimumSystemVersion: "13.0.0" entitlementsInherit: build/entitlements.mac.plist target: - dmg diff --git a/apps/desktop/eslint.config.mjs b/apps/desktop/eslint.config.mjs index 51f4e97ce..d72268b23 100644 --- a/apps/desktop/eslint.config.mjs +++ b/apps/desktop/eslint.config.mjs @@ -5,7 +5,7 @@ export default [ ...reactConfig, { ignores: ["out/", "dist/"] }, { - files: ["scripts/**/*.{mjs,js}"], + files: ["scripts/**/*.{mjs,js,cjs}"], languageOptions: { globals: { ...globals.node }, }, diff --git a/apps/desktop/package.json b/apps/desktop/package.json index c326d9c8f..0ca5c141b 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -69,7 +69,7 @@ "@types/react": "catalog:", "@types/react-dom": "catalog:", "@vitejs/plugin-react": "^5.1.1", - "electron": "^39.2.6", + "electron": "^44.9.3", "electron-builder": "^26.0.12", "electron-vite": "^5.0.0", "globals": "^16.0.0", diff --git a/apps/desktop/scripts/mac-update-floor.cjs b/apps/desktop/scripts/mac-update-floor.cjs new file mode 100644 index 000000000..9d45a0751 --- /dev/null +++ b/apps/desktop/scripts/mac-update-floor.cjs @@ -0,0 +1,40 @@ +// electron-builder `beforePack` hook: publish a macOS floor in the update +// metadata (latest-mac.yml / latest-x64-mac.yml). +// +// Why this exists: Electron 44+ cannot launch on macOS 12. Installed clients +// decide whether to download an update with the code they ALREADY run, so a +// runtime check inside the new app can never protect a macOS 12 user — only +// the published metadata can. electron-updater skips an update when +// `os.release()` (the Darwin kernel version, not the marketing version) is +// below `minimumSystemVersion`, but electron-builder 26 never writes that field +// and its config schema rejects it under `mac.releaseInfo`. +// +// electron-builder spreads `packager.platformSpecificBuildOptions.releaseInfo` +// into every update-info file it generates for that platform, and reads it +// after config validation. Setting it here, before packing, puts the floor +// into both macOS channels before anything is uploaded. +// +// Darwin 22 = macOS 13 Ventura. Do NOT write "13.0.0": it is compared against +// the kernel version, so Darwin 21 (macOS 12) would pass a 13.0.0 floor. +const MAC_UPDATE_MIN_DARWIN_VERSION = "22.0.0"; + +function applyMacUpdateFloor(context) { + if (context.electronPlatformName !== "darwin") return; + const options = context.packager && context.packager.platformSpecificBuildOptions; + if (options == null || typeof options !== "object") { + // Fail the build rather than silently publishing metadata without the floor. + throw new Error( + "[mac-update-floor] packager.platformSpecificBuildOptions is unavailable; " + + "electron-builder internals changed — cannot publish minimumSystemVersion", + ); + } + options.releaseInfo = { + ...(options.releaseInfo || {}), + minimumSystemVersion: MAC_UPDATE_MIN_DARWIN_VERSION, + }; +} + +module.exports = applyMacUpdateFloor; +module.exports.default = applyMacUpdateFloor; +module.exports.applyMacUpdateFloor = applyMacUpdateFloor; +module.exports.MAC_UPDATE_MIN_DARWIN_VERSION = MAC_UPDATE_MIN_DARWIN_VERSION; diff --git a/apps/desktop/scripts/mac-update-floor.test.mjs b/apps/desktop/scripts/mac-update-floor.test.mjs new file mode 100644 index 000000000..671fa24af --- /dev/null +++ b/apps/desktop/scripts/mac-update-floor.test.mjs @@ -0,0 +1,116 @@ +// @vitest-environment node +import { createRequire } from "node:module"; +import { readFileSync } from "node:fs"; +import { resolve } from "node:path"; +import { afterEach, describe, expect, it, vi } from "vitest"; + +const require = createRequire(import.meta.url); +const desktopRoot = resolve(import.meta.dirname, ".."); +const { + applyMacUpdateFloor, + MAC_UPDATE_MIN_DARWIN_VERSION, +} = require("./mac-update-floor.cjs"); +// Parse with the same YAML library electron-updater uses (not a direct dep). +const yaml = createRequire(require.resolve("electron-updater"))("js-yaml"); +// The same module object electron-updater reads `release()` from. +const os = require("node:os"); +// Real decision logic shipped in installed clients (v0.6.5 bundles +// electron-updater 6.8.3). Deep import: the package has no `exports` map. +const { AppUpdater } = require("electron-updater/out/AppUpdater"); + +function macContext(releaseInfo) { + return { + electronPlatformName: "darwin", + packager: { platformSpecificBuildOptions: { releaseInfo } }, + }; +} + +// Shape electron-builder's createUpdateInfo() produces: +// { version, files, path, sha512, ...platformSpecificBuildOptions.releaseInfo } +function publishedUpdateInfo(context) { + return { + version: "0.7.0", + files: [{ url: "multica-desktop-0.7.0-mac-arm64.zip", sha512: "x" }], + path: "multica-desktop-0.7.0-mac-arm64.zip", + sha512: "x", + ...context.packager.platformSpecificBuildOptions.releaseInfo, + }; +} + +// What an installed client decides after fetching latest-mac.yml. +function installedClientAcceptsUpdate(ymlText, darwinRelease) { + vi.spyOn(os, "release").mockReturnValue(darwinRelease); + const updateInfo = yaml.load(ymlText); + const fakeUpdater = { _logger: { info() {}, warn() {} } }; + return AppUpdater.prototype.checkIfUpdateSupported.call(fakeUpdater, updateInfo); +} + +afterEach(() => { + vi.restoreAllMocks(); +}); + +describe("mac-update-floor beforePack hook", () => { + it("adds a Darwin kernel floor (not a macOS marketing version)", () => { + expect(MAC_UPDATE_MIN_DARWIN_VERSION).toBe("22.0.0"); + const ctx = macContext({ releaseNotes: "notes" }); + + applyMacUpdateFloor(ctx); + + expect(ctx.packager.platformSpecificBuildOptions.releaseInfo).toEqual({ + releaseNotes: "notes", + minimumSystemVersion: "22.0.0", + }); + }); + + it("leaves Windows and Linux metadata untouched", () => { + for (const platform of ["win32", "linux"]) { + const ctx = macContext(undefined); + ctx.electronPlatformName = platform; + + applyMacUpdateFloor(ctx); + + expect(ctx.packager.platformSpecificBuildOptions.releaseInfo).toBeUndefined(); + } + }); + + it("fails the build instead of silently publishing metadata without the floor", () => { + expect(() => + applyMacUpdateFloor({ electronPlatformName: "darwin", packager: {} }), + ).toThrow(/minimumSystemVersion/); + }); + + it("is wired into electron-builder.yml together with the macOS 13 bundle floor", () => { + const config = yaml.load( + readFileSync(resolve(desktopRoot, "electron-builder.yml"), "utf8"), + ); + expect(config.beforePack).toBe("./scripts/mac-update-floor.cjs"); + expect(config.mac.minimumSystemVersion).toBe("13.0.0"); + }); +}); + +describe("installed clients (electron-updater 6.8.3) consuming the new metadata", () => { + const ctx = macContext(undefined); + applyMacUpdateFloor(ctx); + const yml = yaml.dump(publishedUpdateInfo(ctx)); + + it("macOS 12 and older skip the update", () => { + expect(installedClientAcceptsUpdate(yml, "21.6.0")).toBe(false); // macOS 12 + expect(installedClientAcceptsUpdate(yml, "20.6.0")).toBe(false); // macOS 11 + }); + + it("macOS 13+ still update", () => { + expect(installedClientAcceptsUpdate(yml, "22.1.0")).toBe(true); // macOS 13 + expect(installedClientAcceptsUpdate(yml, "25.0.0")).toBe(true); + }); + + it("documents the traps: no floor, or a marketing-version floor, lets macOS 12 download", () => { + const base = publishedUpdateInfo(macContext(undefined)); + expect(installedClientAcceptsUpdate(yaml.dump(base), "21.6.0")).toBe(true); + expect( + installedClientAcceptsUpdate( + yaml.dump({ ...base, minimumSystemVersion: "13.0.0" }), + "21.6.0", + ), + ).toBe(true); + }); +}); diff --git a/apps/desktop/scripts/package.mjs b/apps/desktop/scripts/package.mjs index babd82380..9c57e3355 100644 --- a/apps/desktop/scripts/package.mjs +++ b/apps/desktop/scripts/package.mjs @@ -350,9 +350,6 @@ export function builderArgsForTarget( builderArgs.push("-c.publish.channel=latest-arm64"); } if (target.platform === "mac" && target.arch === "x64") { - // Scope the Electron 39 platform floor to the new Intel package so this - // change does not rewrite established Apple Silicon bundle metadata. - builderArgs.push("-c.mac.minimumSystemVersion=12.0.0"); builderArgs.push("-c.publish.channel=latest-x64"); } return builderArgs; diff --git a/apps/desktop/scripts/package.test.mjs b/apps/desktop/scripts/package.test.mjs index 50e2dee94..5abf15667 100644 --- a/apps/desktop/scripts/package.test.mjs +++ b/apps/desktop/scripts/package.test.mjs @@ -343,7 +343,6 @@ describe("builderArgsForTarget", () => { "--publish", "always", "-c.directories.output=dist/mac-x64", - "-c.mac.minimumSystemVersion=12.0.0", "-c.publish.channel=latest-x64", ]); }); diff --git a/apps/desktop/src/main/context-menu.test.ts b/apps/desktop/src/main/context-menu.test.ts index fcd5dadcd..b06b80916 100644 --- a/apps/desktop/src/main/context-menu.test.ts +++ b/apps/desktop/src/main/context-menu.test.ts @@ -16,7 +16,7 @@ const ctx = vi.hoisted(() => ({ capturedItems: [] as CapturedMenuItem[][], browserWindowFromWebContents: vi.fn(), popupSpy: vi.fn(), - clipboardWriteText: vi.fn(), + clipboardWriteText: vi.fn().mockResolvedValue(undefined), openExternalSpy: vi.fn().mockResolvedValue(undefined), preferredLanguagesRef: { current: ["en-US"] as string[] }, })); diff --git a/apps/desktop/src/main/context-menu.ts b/apps/desktop/src/main/context-menu.ts index 32a847edf..5208ae62d 100644 --- a/apps/desktop/src/main/context-menu.ts +++ b/apps/desktop/src/main/context-menu.ts @@ -84,7 +84,12 @@ export function installContextMenu(webContents: WebContents): void { new MenuItem({ label: labels.copyLinkAddress, click: () => { - clipboard.writeText(linkURL); + // Electron 44 made clipboard writes async (W3C Clipboard API + // alignment); catch so a failed write can't surface as an + // unhandled rejection in the main process. + clipboard.writeText(linkURL).catch((err: unknown) => { + console.warn("[context-menu] copy link address failed", err); + }); }, }), ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15f3ad4b2..49a13807c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -172,10 +172,10 @@ importers: version: 3.2.2(react@19.2.3) '@electron-toolkit/preload': specifier: ^3.0.2 - version: 3.0.2(electron@39.8.7) + version: 3.0.2(electron@44.9.3) '@electron-toolkit/utils': specifier: ^4.0.0 - version: 4.0.0(electron@39.8.7) + version: 4.0.0(electron@44.9.3) '@fontsource-variable/geist-mono': specifier: ^5.3.0 version: 5.3.0 @@ -262,8 +262,8 @@ importers: specifier: ^5.1.1 version: 5.2.0(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) electron: - specifier: ^39.2.6 - version: 39.8.7 + specifier: ^44.9.3 + version: 44.9.3 electron-builder: specifier: ^26.0.12 version: 26.8.1(electron-builder-squirrel-windows@26.8.1) @@ -284,7 +284,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) apps/docs: dependencies: @@ -336,7 +336,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) apps/mobile: dependencies: @@ -635,7 +635,7 @@ importers: version: 8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) apps/web: dependencies: @@ -705,7 +705,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 'catalog:' - version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) jsdom: specifier: 'catalog:' version: 29.0.1(@noble/hashes@1.8.0) @@ -720,7 +720,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@1.21.7)(terser@5.47.1)(yaml@2.9.0)) packages/core: dependencies: @@ -775,7 +775,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) packages/eslint-config: dependencies: @@ -1202,7 +1202,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) packages: @@ -1743,6 +1743,10 @@ packages: resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} engines: {node: '>=0.8.0'} + '@electron-internal/extract-zip@1.0.5': + resolution: {integrity: sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==} + engines: {node: '>=22.12.0'} + '@electron-toolkit/preload@3.0.2': resolution: {integrity: sha512-TWWPToXd8qPRfSXwzf5KVhpXMfONaUuRAZJHsKthKgZR/+LqX1dZVSSClQ8OTAEduvLGdecljCsoT2jSshfoUg==} peerDependencies: @@ -1767,14 +1771,14 @@ packages: resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} hasBin: true - '@electron/get@2.0.3': - resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} - engines: {node: '>=12'} - '@electron/get@3.1.0': resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} engines: {node: '>=14'} + '@electron/get@5.1.0': + resolution: {integrity: sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==} + engines: {node: '>=22.12.0'} + '@electron/notarize@2.5.0': resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} engines: {node: '>= 10.0.0'} @@ -4717,8 +4721,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.19.17': - resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} + '@types/node@24.19.2': + resolution: {integrity: sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==} '@types/node@25.5.0': resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} @@ -4770,9 +4774,6 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.58.1': resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5323,9 +5324,6 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -6153,9 +6151,9 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@39.8.7: - resolution: {integrity: sha512-B3TmzbUEeIvrhJ0QcoFp8/tgnVA3vsm0wkdYWzC22hsk9zTVqkzyrrz40cjd0nMTTIrGWxxfDO2tdQTCMe9Bjw==} - engines: {node: '>= 12.20.55'} + electron@44.9.3: + resolution: {integrity: sha512-Cv9/yMnZxNWsMlIe8T4v//NKHdUvbeyoTJoXE3BIcRxus2meeFaO9h/P3zB5d4cBXum51IgAYrT2QjpIDWKpJA==} + engines: {node: '>= 22.12.0'} hasBin: true emoji-mart@5.6.0: @@ -6200,6 +6198,10 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -6738,11 +6740,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - extsprintf@1.4.1: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} engines: {'0': node >=0.6.0} @@ -6791,9 +6788,6 @@ packages: fd-package-json@2.0.0: resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -8961,9 +8955,6 @@ packages: resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} engines: {node: '>=12', npm: '>=6'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - pg-cloudflare@1.3.0: resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} @@ -10511,12 +10502,12 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici@7.24.5: resolution: {integrity: sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==} engines: {node: '>=20.18.1'} @@ -10981,9 +10972,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -11674,17 +11662,19 @@ snapshots: dependencies: '@types/hammerjs': 2.0.46 - '@electron-toolkit/preload@3.0.2(electron@39.8.7)': + '@electron-internal/extract-zip@1.0.5': {} + + '@electron-toolkit/preload@3.0.2(electron@44.9.3)': dependencies: - electron: 39.8.7 + electron: 44.9.3 '@electron-toolkit/tsconfig@2.0.0(@types/node@25.5.0)': dependencies: '@types/node': 25.5.0 - '@electron-toolkit/utils@4.0.0(electron@39.8.7)': + '@electron-toolkit/utils@4.0.0(electron@44.9.3)': dependencies: - electron: 39.8.7 + electron: 44.9.3 '@electron/asar@3.4.1': dependencies: @@ -11698,7 +11688,7 @@ snapshots: fs-extra: 9.1.0 minimist: 1.2.8 - '@electron/get@2.0.3': + '@electron/get@3.1.0': dependencies: debug: 4.4.3 env-paths: 2.2.1 @@ -11712,17 +11702,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/get@3.1.0': + '@electron/get@5.1.0': dependencies: debug: 4.4.3 - env-paths: 2.2.1 - fs-extra: 8.1.0 - got: 11.8.6 + env-paths: 3.0.0 + graceful-fs: 4.2.11 progress: 2.0.3 - semver: 6.3.1 + semver: 7.8.5 sumchecker: 3.0.1 optionalDependencies: - global-agent: 3.0.0 + undici: 7.24.5 transitivePeerDependencies: - supports-color @@ -14658,9 +14647,9 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.19.17': + '@types/node@24.19.2': dependencies: - undici-types: 6.21.0 + undici-types: 7.24.6 '@types/node@25.5.0': dependencies: @@ -14716,11 +14705,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 25.5.0 - optional: true - '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -14987,15 +14971,6 @@ snapshots: msw: 2.12.14(@types/node@25.5.0)(typescript@5.9.3) vite: 8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@1.21.7)(terser@5.47.1)(yaml@2.9.0) - '@vitest/mocker@4.1.0(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 4.1.0 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - msw: 2.12.14(@types/node@25.5.0)(typescript@5.9.3) - vite: 8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0) - '@vitest/pretty-format@4.1.0': dependencies: tinyrainbow: 3.1.0 @@ -15439,8 +15414,6 @@ snapshots: dependencies: node-int64: 0.4.0 - buffer-crc32@0.2.13: {} - buffer-from@1.1.2: {} buffer@5.7.1: @@ -16351,11 +16324,11 @@ snapshots: transitivePeerDependencies: - supports-color - electron@39.8.7: + electron@44.9.3: dependencies: - '@electron/get': 2.0.3 - '@types/node': 22.19.17 - extract-zip: 2.0.1 + '@electron-internal/extract-zip': 1.0.5 + '@electron/get': 5.1.0 + '@types/node': 24.19.2 transitivePeerDependencies: - supports-color @@ -16391,6 +16364,8 @@ snapshots: env-paths@2.2.1: {} + env-paths@3.0.0: {} + err-code@2.0.3: {} error-ex@1.3.4: @@ -17274,16 +17249,6 @@ snapshots: extend@3.0.2: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.3 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - extsprintf@1.4.1: optional: true @@ -17341,10 +17306,6 @@ snapshots: dependencies: walk-up-path: 4.0.0 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -20220,8 +20181,6 @@ snapshots: pe-library@0.4.1: {} - pend@1.2.0: {} - pg-cloudflare@1.3.0: optional: true @@ -22135,10 +22094,10 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.21.0: {} - undici-types@7.18.2: {} + undici-types@7.24.6: {} + undici@7.24.5: {} unicode-animations@1.0.3: {} @@ -22432,35 +22391,6 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.0(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@1.8.0))(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)): - dependencies: - '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(msw@2.12.14(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.0 - '@vitest/runner': 4.1.0 - '@vitest/snapshot': 4.1.0 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 4.0.0 - tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 - tinyrainbow: 3.1.0 - vite: 8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@types/node@25.5.0)(esbuild@0.25.12)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@opentelemetry/api': 1.9.1 - '@types/node': 25.5.0 - jsdom: 29.0.1(@noble/hashes@1.8.0) - transitivePeerDependencies: - - msw - vlq@1.0.1: {} void-elements@3.1.0: {} @@ -22660,11 +22590,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.3: {}