MUL-8149: patch Node 22.23.4 in web image, Electron 39→44 (#9416)

* fix(web): pin Dockerfile.web to node:22.23.4-alpine for Oct 2026 Node security release (MUL-8149)

Co-authored-by: multica-agent <[email protected]>

* 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 <[email protected]>

* 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 <[email protected]>

* 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 <[email protected]>

---------

Co-authored-by: Multica Eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
This commit is contained in:
Multica Eve
2026-10-22 13:26:40 +08:00
committed by GitHub
co-authored by multica-agent Multica Eve
parent ce5a2ba472
commit ef2d2b3e48
11 changed files with 232 additions and 140 deletions
+8 -4
View File
@@ -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
+6
View File
@@ -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
+1 -1
View File
@@ -5,7 +5,7 @@ export default [
...reactConfig,
{ ignores: ["out/", "dist/"] },
{
files: ["scripts/**/*.{mjs,js}"],
files: ["scripts/**/*.{mjs,js,cjs}"],
languageOptions: {
globals: { ...globals.node },
},
+1 -1
View File
@@ -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",
+40
View File
@@ -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;
@@ -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);
});
});
-3
View File
@@ -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;
-1
View File
@@ -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",
]);
});
+1 -1
View File
@@ -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[] },
}));
+6 -1
View File
@@ -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);
});
},
}),
);
+53 -128
View File
@@ -172,10 +172,10 @@ importers:
version: 3.2.2([email protected])
'@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([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))
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([email protected])
@@ -284,7 +284,7 @@ importers:
version: 5.9.3
vitest:
specifier: 'catalog:'
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
apps/docs:
dependencies:
@@ -336,7 +336,7 @@ importers:
version: 5.9.3
vitest:
specifier: 'catalog:'
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
apps/mobile:
dependencies:
@@ -635,7 +635,7 @@ importers:
version: 8.0.1(@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected])
vitest:
specifier: 'catalog:'
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
apps/web:
dependencies:
@@ -705,7 +705,7 @@ importers:
version: 19.2.3(@types/[email protected])
'@vitejs/plugin-react':
specifier: 'catalog:'
version: 6.0.1([email protected])([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
version: 6.0.1([email protected])([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))
jsdom:
specifier: 'catalog:'
version: 29.0.1(@noble/[email protected])
@@ -720,7 +720,7 @@ importers:
version: 5.9.3
vitest:
specifier: 'catalog:'
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))
packages/core:
dependencies:
@@ -775,7 +775,7 @@ importers:
version: 5.9.3
vitest:
specifier: 'catalog:'
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
packages/eslint-config:
dependencies:
@@ -1202,7 +1202,7 @@ importers:
version: 5.9.3
vitest:
specifier: 'catalog:'
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))
version: 4.1.0(@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
packages:
@@ -1743,6 +1743,10 @@ packages:
resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==}
engines: {node: '>=0.8.0'}
'@electron-internal/[email protected]':
resolution: {integrity: sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==}
engines: {node: '>=22.12.0'}
'@electron-toolkit/[email protected]':
resolution: {integrity: sha512-TWWPToXd8qPRfSXwzf5KVhpXMfONaUuRAZJHsKthKgZR/+LqX1dZVSSClQ8OTAEduvLGdecljCsoT2jSshfoUg==}
peerDependencies:
@@ -1767,14 +1771,14 @@ packages:
resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==}
hasBin: true
'@electron/[email protected]':
resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==}
engines: {node: '>=12'}
'@electron/[email protected]':
resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==}
engines: {node: '>=14'}
'@electron/[email protected]':
resolution: {integrity: sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==}
engines: {node: '>=22.12.0'}
'@electron/[email protected]':
resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==}
engines: {node: '>= 10.0.0'}
@@ -4717,8 +4721,8 @@ packages:
'@types/[email protected]':
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/[email protected]':
resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==}
@@ -4770,9 +4774,6 @@ packages:
'@types/[email protected]':
resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
'@types/[email protected]':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
'@typescript-eslint/[email protected]':
resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -5323,9 +5324,6 @@ packages:
[email protected]:
resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
[email protected]:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
[email protected]:
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
[email protected]:
@@ -6200,6 +6198,10 @@ packages:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
[email protected]:
resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
[email protected]:
resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
@@ -6738,11 +6740,6 @@ packages:
[email protected]:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
[email protected]:
resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
engines: {node: '>= 10.17.0'}
hasBin: true
[email protected]:
resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==}
engines: {'0': node >=0.6.0}
@@ -6791,9 +6788,6 @@ packages:
[email protected]:
resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==}
[email protected]:
resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
[email protected]:
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'}
[email protected]:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
[email protected]:
resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==}
@@ -10511,12 +10502,12 @@ packages:
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
[email protected]:
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
[email protected]:
resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==}
[email protected]:
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'}
[email protected]:
resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
[email protected]:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
@@ -11674,17 +11662,19 @@ snapshots:
dependencies:
'@types/hammerjs': 2.0.46
'@electron-toolkit/[email protected]([email protected])':
'@electron-internal/[email protected]': {}
'@electron-toolkit/[email protected]([email protected])':
dependencies:
electron: 39.8.7
electron: 44.9.3
'@electron-toolkit/[email protected](@types/[email protected])':
dependencies:
'@types/node': 25.5.0
'@electron-toolkit/[email protected](electron@39.8.7)':
'@electron-toolkit/[email protected](electron@44.9.3)':
dependencies:
electron: 39.8.7
electron: 44.9.3
'@electron/[email protected]':
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/[email protected]': {}
'@types/node@22.19.17':
'@types/node@24.19.2':
dependencies:
undici-types: 6.21.0
undici-types: 7.24.6
'@types/[email protected]':
dependencies:
@@ -14716,11 +14705,6 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
'@types/[email protected]':
dependencies:
'@types/node': 25.5.0
optional: true
'@typescript-eslint/[email protected](@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])':
dependencies:
'@eslint-community/regexpp': 4.12.2
@@ -14987,15 +14971,6 @@ snapshots:
msw: 2.12.14(@types/[email protected])([email protected])
vite: 8.0.1(@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])
'@vitest/[email protected]([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))':
dependencies:
'@vitest/spy': 4.1.0
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
msw: 2.12.14(@types/[email protected])([email protected])
vite: 8.0.1(@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected])
'@vitest/[email protected]':
dependencies:
tinyrainbow: 3.1.0
@@ -15439,8 +15414,6 @@ snapshots:
dependencies:
node-int64: 0.4.0
[email protected]: {}
[email protected]: {}
[email protected]:
@@ -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:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]:
@@ -17274,16 +17249,6 @@ snapshots:
[email protected]: {}
[email protected]:
dependencies:
debug: 4.4.3
get-stream: 5.2.0
yauzl: 2.10.0
optionalDependencies:
'@types/yauzl': 2.10.3
transitivePeerDependencies:
- supports-color
[email protected]:
optional: true
@@ -17341,10 +17306,6 @@ snapshots:
dependencies:
walk-up-path: 4.0.0
[email protected]:
dependencies:
pend: 1.2.0
[email protected]([email protected]):
optionalDependencies:
picomatch: 4.0.3
@@ -20220,8 +20181,6 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]:
optional: true
@@ -22135,10 +22094,10 @@ snapshots:
has-symbols: 1.1.0
which-boxed-primitive: 1.1.1
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -22432,35 +22391,6 @@ snapshots:
transitivePeerDependencies:
- msw
[email protected](@opentelemetry/[email protected])(@types/[email protected])([email protected](@noble/[email protected]))([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])):
dependencies:
'@vitest/expect': 4.1.0
'@vitest/mocker': 4.1.0([email protected](@types/[email protected])([email protected]))([email protected](@emnapi/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected]))
'@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/[email protected])(@emnapi/[email protected])(@types/[email protected])([email protected])([email protected])([email protected])([email protected])
why-is-node-running: 2.3.0
optionalDependencies:
'@opentelemetry/api': 1.9.1
'@types/node': 25.5.0
jsdom: 29.0.1(@noble/[email protected])
transitivePeerDependencies:
- msw
[email protected]: {}
[email protected]: {}
@@ -22660,11 +22590,6 @@ snapshots:
y18n: 5.0.8
yargs-parser: 21.1.1
[email protected]:
dependencies:
buffer-crc32: 0.2.13
fd-slicer: 1.1.0
[email protected]: {}
[email protected]: {}