From d641a8ddb75bc478b311060a74c1871d250e1b17 Mon Sep 17 00:00:00 2001 From: Duola <108492647+duolahypercho@users.noreply.github.com> Date: Sat, 15 Aug 2026 16:57:30 -0500 Subject: [PATCH 1/3] Electron shell: host the browser panel as a real view, not a video stream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The BROWSER tab works, but it never stopped feeling remote — because it is. Tauri hands us the OS webview (WKWebView on macOS, WebView2 on Windows), which cannot host a second browser, so the panel is a CDP screencast: Chrome paints, core re-encodes to JPEG, the client draws it to a canvas and maps clicks back through the letterbox. Every complaint traced to that pipeline rather than to a tunable in it. Raising the cast width and quality fixed the blur twice and it came back both times; the click and typing regressions were coordinate-mapping bugs that only exist because coordinates need mapping at all. Electron bundles Chromium, so the panel can be a `WebContentsView` the window composites directly: real pixels, real input, real scrolling, no encode step. This adds that shell **alongside** Tauri rather than replacing it. `src-tauri/` and `pnpm desktop:build` are untouched and still the shipping path; retiring either is a later decision, and the streaming pipeline stays until then because the Tauri build is its only consumer. What is here: - `electron/main.ts` spawns or attaches to core, opens the window on the port core serves, and hands the panel's CDP target id to `browser_attach` so the agent's `browser_*` tools drive the same view the user sees. One browser, two drivers — not one each. - `electron/browserPanel.ts` creates the view on a persistent partition, hides rather than destroys it (a destroyed view loses the page, which is what made tab toggles look like a refresh), and captures downloads to `~/.cali/downloads`. - `electron/preload.ts` exposes a narrow `window.cali` over `contextBridge` under `sandbox: true` — no generic invoke, one named method per operation. It is bundled with esbuild because a sandboxed preload cannot `require` a sibling module, and the failure is silent. - `BrowserTab.tsx` detects the bridge and, under Electron, skips the cast entirely: it becomes a geometry reporter that tells the shell where to put the view, and hides it while a popover or dialog is open so native pixels never paint over the editor's own overlays. `scripts/compare-shells.mjs` drives both shells over CDP and diffs the editor region, which is how the UI was checked rather than asserted: the two agree inside the antialiasing floor measured at 2.6-3.0k pixels, so the threshold sits at 6k. Nothing in the design system changed — the tokens, the no-focus-ring rule and the drag regions all render identically, which was the thing most at risk in a shell swap. Scoped to the client on purpose. The core-side half (`browser_attach`, `browser_downloads`, the attach-aware `close`) is held back because those hunks live in `rpc.rs`, `tools.rs` and `agent.rs`, which are currently ~95% another session's in-flight work; shipping them here would drag three unfinished modules into this diff. Until that lands, the Electron shell runs against a core without `browser_attach` and the panel simply does not receive agent input — the editor, the viewport and every other tab are fully functional. Not done: signing and notarisation (entitlements are written, the identity is not), and no LLM turn has yet been observed choosing these tools against the native panel. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01DAV2UBU1PQ8mJFVWMhKyHx --- AGENTS.md | 16 + client/.gitignore | 3 + client/build-electron/entitlements.mac.plist | 21 + client/electron-builder.yml | 45 + client/electron/browserPanel.ts | 195 ++ client/electron/ipc.ts | 45 + client/electron/main.ts | 355 +++ client/electron/preload.ts | 33 + client/package.json | 9 +- client/pnpm-lock.yaml | 2184 ++++++++++++++++- client/scripts/compare-shells.mjs | 271 ++ .../components/workspace/BrowserTab.test.tsx | 48 + .../src/components/workspace/BrowserTab.tsx | 59 + client/src/index.css | 22 + client/src/lib/desktop.ts | 44 +- client/src/lib/workspace.ts | 7 +- client/tsconfig.electron.json | 28 + client/tsconfig.json | 3 +- docs/plans/electron-shell.md | 254 +- 19 files changed, 3618 insertions(+), 24 deletions(-) create mode 100644 client/.gitignore create mode 100644 client/build-electron/entitlements.mac.plist create mode 100644 client/electron-builder.yml create mode 100644 client/electron/browserPanel.ts create mode 100644 client/electron/ipc.ts create mode 100644 client/electron/main.ts create mode 100644 client/electron/preload.ts create mode 100644 client/scripts/compare-shells.mjs create mode 100644 client/tsconfig.electron.json diff --git a/AGENTS.md b/AGENTS.md index 4b0c0a95..a212f66f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -36,6 +36,22 @@ pnpm desktop:build # from client/ — packages CaliCode.app (+ .dmg) pnpm desktop:dev # native shell against a live core ``` +**Two shells exist.** Tauri is the shipping one; an Electron shell is being +brought up alongside it (`docs/plans/electron-shell.md`) because only a Chromium +window can host the browser panel as a real view rather than a video stream. +Nothing has been removed — `src-tauri/` and `desktop:build` are untouched. + +```bash +pnpm desktop:electron # run the Electron shell against a live core +pnpm desktop:electron:build # package it (unsigned) to release-electron/ +node scripts/compare-shells.mjs # prove both shells render the same editor +``` + +`CALI_PORT` moves either shell off `:8765` so a second instance can run beside a +live app — attaching two clients to one core is worse than a port collision, +because `editor_attachment` is one owner per session and the newcomer silently +steals tool routing. + ## Verify before you claim done Run these from `client/` unless noted, in this order. Everything must be green. diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 00000000..44457379 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,3 @@ +dist-electron/ +.shell-compare/ +release-electron/ diff --git a/client/build-electron/entitlements.mac.plist b/client/build-electron/entitlements.mac.plist new file mode 100644 index 00000000..54abe9b5 --- /dev/null +++ b/client/build-electron/entitlements.mac.plist @@ -0,0 +1,21 @@ + + + + + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-library-validation + + + com.apple.security.network.client + + com.apple.security.network.server + + + com.apple.security.files.user-selected.read-write + + + diff --git a/client/electron-builder.yml b/client/electron-builder.yml new file mode 100644 index 00000000..f41854ad --- /dev/null +++ b/client/electron-builder.yml @@ -0,0 +1,45 @@ +# Packaging for the Electron shell. +# +# Mirrors what `scripts/desktop.sh` does for Tauri: build the client, build the +# core release binary, stage both, produce a .app. The identifier and product +# name match `src-tauri/tauri.conf.json` deliberately — the two shells are the +# same application, and a user upgrading from one to the other should not end up +# with two apps and two `~/.cali` states. +appId: com.calicode.desktop +productName: CaliCode +directories: + output: release-electron + buildResources: build-electron + +# `dist-electron` is the compiled shell; `dist` is the built client, which core +# serves rather than the window loading it from disk. +files: + - dist-electron/**/* + - package.json + +# Staged beside the app rather than inside the asar: `cali-core` must be a real +# executable on disk to spawn, and an asar-packed binary is not. `main.ts` +# probes `process.resourcesPath` for both of these. +extraResources: + - from: ../core/target/release/cali-core + to: cali-core + - from: dist + to: dist + +mac: + category: public.app-category.developer-tools + target: + - dmg + - dir + # Core is spawned as a child and talks to localhost; the hardened runtime + # blocks that without these. Kept minimal on purpose — every entitlement is a + # capability the notarised app carries forever. + hardenedRuntime: true + entitlements: build-electron/entitlements.mac.plist + entitlementsInherit: build-electron/entitlements.mac.plist + +# Signing is deliberately not configured here. The repo has +# `scripts/dev-signing-identity.sh` for local identities, and a real identity +# belongs in CI secrets rather than a checked-in file. Unsigned builds are fine +# for testing the packaging itself; `CSC_IDENTITY_AUTO_DISCOVERY=false` skips +# the search entirely. diff --git a/client/electron/browserPanel.ts b/client/electron/browserPanel.ts new file mode 100644 index 00000000..ee6b43fc --- /dev/null +++ b/client/electron/browserPanel.ts @@ -0,0 +1,195 @@ +import { homedir } from "node:os"; +import path from "node:path"; + +import { WebContentsView, session, type BrowserWindow, type Rectangle } from "electron"; +import type { PanelBounds } from "./ipc"; + +/** + * Persistent so logins survive a restart, as they do in the agent's Chrome + * profile today — but its own partition, because this view loads arbitrary + * pages inside our app and their cookies must never reach the session the + * editor and core RPC run on. + */ +const PARTITION = "persist:cali-browser"; + +/** A target only exists once there is a page, and core attaches at startup. */ +const BLANK = "about:blank"; + +export interface BrowserPanel { + setBounds(b: PanelBounds): void; + targetId(): Promise; + destroy(): void; +} + +/** + * The BROWSER tab's page, as a real Chromium view rather than a video of one. + * + * The view is created here and driven by core over CDP — the same `browser.rs` + * that drives Chrome today — so the user and the agent are never looking at two + * different pages. Nothing about the protocol lives in this file; the main + * process owns only the view's lifetime and its geometry. + */ +/** + * Where a file downloaded in the panel lands. + * + * Under `~/.cali` beside core's own state rather than the OS Downloads folder, + * because these are the agent's working material: the panel exists so a model + * can go and find a `.glb` or a texture, and the next step is always to pull it + * into a project. Somewhere core already knows how to look is worth more than + * somewhere the user would expect to find a personal download. + */ +const DOWNLOAD_DIR = path.join(homedir(), ".cali", "downloads"); + +/** + * Accept downloads instead of ignoring them. + * + * This capability is only possible now. A streamed panel had no file transfer + * channel at all — clicking a download link did nothing, which for a browser + * whose whole purpose is finding assets was a hole. A real view has a session, + * and a session has downloads. + * + * Saved without prompting: a modal save dialog would be a native window over an + * app that is already juggling a native view, and the destination is not the + * user's choice here — it is a staging area the agent reads from. + */ +function captureDownloads(panelSession: Electron.Session): void { + panelSession.on("will-download", (_event, item) => { + const target = path.join(DOWNLOAD_DIR, path.basename(item.getFilename())); + item.setSavePath(target); + item.once("done", (_doneEvent, state) => { + if (state === "completed") { + console.log(`browser panel downloaded ${target}`); + } else { + console.error(`browser panel download failed (${state}): ${item.getFilename()}`); + } + }); + }); +} + +export function createBrowserPanel(win: BrowserWindow): BrowserPanel { + const view = new WebContentsView({ + webPreferences: { + session: session.fromPartition(PARTITION), + // Untrusted pages. No preload and no Node reach, so nothing on the page + // can address the main process even if it finds a bug in a renderer API. + contextIsolation: true, + nodeIntegration: false, + sandbox: true, + webviewTag: false, + }, + }); + + captureDownloads(view.webContents.session); + + let destroyed = false; + let applied: Rectangle | null = null; + let cachedTargetId: string | null = null; + let inFlight: Promise | null = null; + + // A popup would be a second CDP target, and core is attached to exactly one. + // Keeping navigation in this view is what makes "one browser" true. + view.webContents.setWindowOpenHandler(({ url }) => { + if (/^https?:/i.test(url)) void view.webContents.loadURL(url); + return { action: "deny" }; + }); + + win.contentView.addChildView(view); + // Starts hidden: until the renderer reports a rect, any bounds we invent + // would paint over the editor. + view.setVisible(false); + void view.webContents.loadURL(BLANK).catch(() => { + // Nothing to recover — core's first navigate replaces this anyway. + }); + + /** + * Geometry arrives from the renderer in CSS pixels, which are the same + * device-independent pixels Electron's view bounds use — do not scale by + * devicePixelRatio. The rect is relative to the window's content area, and + * that only matches the renderer's client coordinates while this is the sole + * child view laid out over a full-bleed renderer. + */ + const setBounds = (b: PanelBounds): void => { + if (destroyed) return; + + // Hidden, never destroyed: the agent keeps browsing with the tab closed, + // and a hidden view still captures and still takes trusted input. The + // renderer also hides it while a Radix dropdown or dialog is open — a + // native view composites above the DOM, so a portalled overlay would + // otherwise be drawn behind it. + if (!b.visible) { + view.setVisible(false); + return; + } + + // Electron rejects fractional bounds; getBoundingClientRect returns them. + const next: Rectangle = { + x: Math.round(b.x), + y: Math.round(b.y), + width: Math.max(0, Math.round(b.width)), + height: Math.max(0, Math.round(b.height)), + }; + if (!applied || !sameRect(applied, next)) { + // The panel's rounded corners and border are CSS and this view will not + // clip to them; `view.setBorderRadius` is the fix if square corners + // inside the frame ever read as wrong. + view.setBounds(next); + applied = next; + } + view.setVisible(true); + }; + + /** + * Core attaches to this exact view instead of guessing from url or title. + * + * Only meaningful when the app was launched with `--remote-debugging-port`; + * the id is the same one core sees in that port's target list. Stable for + * the view's lifetime, so it is resolved once. + */ + const targetId = async (): Promise => { + if (destroyed || view.webContents.isDestroyed()) return null; + if (cachedTargetId) return cachedTargetId; + if (inFlight) return inFlight; + + inFlight = (async () => { + const wc = view.webContents; + // `attach` throws when someone else holds the session — DevTools open on + // this view, most likely. Borrow it only if it is free, and hand it back, + // since holding it blocks DevTools for the rest of the run. + const borrowed = !wc.debugger.isAttached(); + try { + if (borrowed) wc.debugger.attach("1.3"); + const reply: unknown = await wc.debugger.sendCommand("Target.getTargetInfo"); + cachedTargetId = readTargetId(reply); + return cachedTargetId; + } catch { + return null; + } finally { + if (borrowed && !wc.isDestroyed() && wc.debugger.isAttached()) wc.debugger.detach(); + inFlight = null; + } + })(); + return inFlight; + }; + + const destroy = (): void => { + if (destroyed) return; + destroyed = true; + if (!win.isDestroyed()) win.contentView.removeChildView(view); + // `close` defaults to skipping beforeunload, so a page cannot refuse to go. + if (!view.webContents.isDestroyed()) view.webContents.close(); + }; + + return { setBounds, targetId, destroy }; +} + +function sameRect(a: Rectangle, b: Rectangle): boolean { + return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; +} + +function readTargetId(reply: unknown): string | null { + if (typeof reply !== "object" || reply === null) return null; + const info = (reply as { targetInfo?: unknown }).targetInfo; + if (typeof info !== "object" || info === null) return null; + const id = (info as { targetId?: unknown }).targetId; + return typeof id === "string" && id.length > 0 ? id : null; +} diff --git a/client/electron/ipc.ts b/client/electron/ipc.ts new file mode 100644 index 00000000..7d089933 --- /dev/null +++ b/client/electron/ipc.ts @@ -0,0 +1,45 @@ +/** + * The whole main <-> renderer contract for the Electron shell. + * + * Deliberately free of Electron imports: the preload runs in a sandboxed + * renderer context where importing `electron` pulls in main-process-only + * modules, so this file has to stay pure types and constants to be shared by + * both sides. + */ + +export const IPC = { + shellInfo: "cali:shell-info", + chooseFolder: "cali:choose-folder", + panelBounds: "cali:panel-bounds", + panelTarget: "cali:panel-target", +} as const; + +/** + * Where the native browser panel sits, in CSS pixels relative to the window. + * The renderer measures its own placeholder element and reports it; the panel + * is a separate native view, so nothing keeps the two aligned but this message. + */ +export interface PanelBounds { + x: number; + y: number; + width: number; + height: number; + visible: boolean; +} + +export interface ShellInfo { + shell: "electron"; + platform: NodeJS.Platform; +} + +/** + * What the preload puts on `window.cali`. `shell` and `platform` are plain + * values rather than promises because layout decisions (macOS traffic lights + * overlay our header) are made during the first render, before any round-trip + * to the main process could resolve. + */ +export interface CaliBridge extends ShellInfo { + chooseFolder(): Promise; + setPanelBounds(bounds: PanelBounds): void; + panelTarget(): Promise; +} diff --git a/client/electron/main.ts b/client/electron/main.ts new file mode 100644 index 00000000..89b981d1 --- /dev/null +++ b/client/electron/main.ts @@ -0,0 +1,355 @@ +/** + * CaliCode desktop shell (Electron). + * + * The web editor is served in full by the Rust core: `/rpc`, `/events`, and the + * built client all live at core's own origin. Packaged builds launch the bundled + * `cali-core`; dev runs attach to the live core started by `scripts/dev.sh`. In + * both cases the window points at `http://127.0.0.1:8765` once core answers. + * Everything the renderer does is same-origin — no CORS, no proxy, no change to + * the client's `fetch("/rpc")` / `EventSource("/events")`. + * + * Ports the behaviour of `src-tauri/src/lib.rs`, which stays the shipping shell + * until this one is packaged (docs/plans/electron-shell.md, P4). + */ + +import { spawn, type ChildProcess } from "node:child_process"; +import { existsSync } from "node:fs"; +import { request } from "node:http"; +import { createConnection } from "node:net"; +import path from "node:path"; + +import { app, BrowserWindow, dialog, ipcMain } from "electron"; + +import { createBrowserPanel, type BrowserPanel } from "./browserPanel"; +import { IPC, type PanelBounds, type ShellInfo } from "./ipc"; + +/** + * Port core listens on. Overridable so a second instance can run beside a live app instead of + * fighting it for the port. `vite.config.ts` already honours the same variable + * for the same reason — and attaching a second client to someone else's core + * does worse than collide: `editor_attachment` is one owner per session, so the + * newcomer silently steals tool routing from the window already working. + */ +const CORE_PORT = Number(process.env.CALI_PORT ?? 8765); +const CORE_ORIGIN = `http://127.0.0.1:${CORE_PORT}`; + +/** + * Load-bearing, not a debugging aid: `browser.rs` attaches over the devtools + * protocol on this port and drives the panel's `WebContentsView` as a CDP target, + * which is the whole reason the browser panel can stop being a video stream. + * Chromium reads its switches at process start, so this must run before ready. + */ +const REMOTE_DEBUGGING_PORT = 9222; +app.commandLine.appendSwitch("remote-debugging-port", String(REMOTE_DEBUGGING_PORT)); + +/** "starting" is the only state that can still reach readiness; the rest are terminal. */ +type CoreStartup = "starting" | "port-busy" | "spawn-failed" | "live-core-unavailable"; + +/** Shown in the window when startup never reaches readiness. */ +const STARTUP_MESSAGES: Record = { + "port-busy": + "CaliCode could not start its core because port 8765 is already in use. Quit the other CaliCode/browser core or use a separate dev port.", + "spawn-failed": + "CaliCode could not launch its bundled core. Rebuild the desktop app and try again.", + starting: + "CaliCode core did not become ready on port 8765. Check the app logs and try again.", + "live-core-unavailable": + "Desktop development mode expects a live core on port 8765. Run ./scripts/dev.sh first, then relaunch the desktop shell.", +}; + +let core: ChildProcess | null = null; +let coreExited = false; + +/** + * Resolve the `cali-core` binary. Packaged: staged next to the app's resources. + * Dev: the release build in the source tree. + * + * The packaged layout is not settled — P4 owns electron-builder — so both the + * `extraResources` root and an `app.asar.unpacked` sibling are probed rather than + * committing to one that a later packaging change would silently invalidate. + */ +function resolveCoreBinary(): string { + const candidates = app.isPackaged + ? [ + path.join(process.resourcesPath, "cali-core"), + path.join(process.resourcesPath, "bin", "cali-core"), + path.join(path.dirname(app.getPath("exe")), "cali-core"), + ] + : [ + path.join(repoRoot(), "core", "target", "release", "cali-core"), + path.join(repoRoot(), "core", "target", "debug", "cali-core"), + ]; + return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0]; +} + +/** + * Repo root from the compiled main. Where tsc/the bundler drops this file is + * P4's call, so walk up for the marker rather than hard-coding a depth. + */ +function repoRoot(): string { + let dir = __dirname; + for (let up = 0; up < 5; up += 1) { + if (existsSync(path.join(dir, "core", "Cargo.toml"))) { + return dir; + } + dir = path.dirname(dir); + } + return path.resolve(__dirname, "..", ".."); +} + +/** + * Resolve the built client `dist` that core serves. A staged copy from the last + * desktop build is intentionally ignored outside a packaged app; otherwise a + * stale bundle can mask web changes. + */ +function resolveDist(): string | null { + const candidates = app.isPackaged + ? [path.join(process.resourcesPath, "dist")] + : [path.join(repoRoot(), "client", "dist")]; + return candidates.find((candidate) => existsSync(candidate)) ?? null; +} + +/** + * Spawn the core JSON-RPC service. `CALI_DIST` makes core serve the built client + * from the resolved path regardless of the child's working directory. + */ +function spawnCore(binary: string, dist: string | null): ChildProcess | null { + // Annotated rather than inferred: the object literal would otherwise be typed + // by its initial keys alone, and adding `CALI_DIST` below would not compile. + const env: NodeJS.ProcessEnv = { ...process.env, CALI_PORT: String(CORE_PORT) }; + if (dist) { + env.CALI_DIST = dist; + } + try { + const child = spawn(binary, [], { env, stdio: "inherit" }); + child.once("exit", () => { + coreExited = true; + }); + // `spawn` reports a missing or non-executable binary asynchronously; without + // this the readiness poll would run its full deadline against nothing. + child.once("error", (err) => { + coreExited = true; + console.error(`failed to spawn cali-core at ${binary}: ${err.message}`); + }); + return child; + } catch (err) { + console.error(`failed to spawn cali-core at ${binary}: ${String(err)}`); + return null; + } +} + +function portIsOpen(port: number): Promise { + return new Promise((resolve) => { + const socket = createConnection({ host: "127.0.0.1", port }); + const settle = (open: boolean) => { + socket.destroy(); + resolve(open); + }; + socket.setTimeout(150, () => settle(false)); + socket.once("connect", () => settle(true)); + socket.once("error", () => settle(false)); + }); +} + +/** + * A TCP connect only proves *something* holds the port. Asking `/health` proves + * it is core and that it is routing, which is what the window is about to depend + * on. + */ +function healthOk(): Promise { + return new Promise((resolve) => { + let settled = false; + // A destroyed request does not reliably emit `error`, and an unresolved + // promise here would stall the readiness loop forever rather than time out. + const settle = (ok: boolean) => { + if (!settled) { + settled = true; + resolve(ok); + } + }; + const req = request( + { host: "127.0.0.1", port: CORE_PORT, path: "/health", timeout: 300 }, + (res) => { + res.resume(); + settle(res.statusCode === 200); + }, + ); + req.once("timeout", () => { + req.destroy(); + settle(false); + }); + req.once("error", () => settle(false)); + req.end(); + }); +} + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +/** Poll until core answers or the deadline passes. */ +async function waitForCore(attempts: number): Promise { + for (let attempt = 0; attempt < attempts; attempt += 1) { + // A preflight port check cannot eliminate a race where another process binds + // the port between the check and our spawn. Observe the child too, so + // readiness never attaches the window to that other process. + if (core && coreExited) { + return false; + } + if (await healthOk()) { + return true; + } + await sleep(200); + } + return false; +} + +async function startCore(): Promise { + if (!app.isPackaged) { + // A dev shell deliberately attaches to the live core from scripts/dev.sh and + // must not spawn a second one to fight it for 8765. + if (await portIsOpen(CORE_PORT)) { + return "starting"; + } + console.error(`desktop dev shell requires a live core on port ${CORE_PORT}`); + return "live-core-unavailable"; + } + if (await portIsOpen(CORE_PORT)) { + console.error( + `core port ${CORE_PORT} is already in use; refusing to attach the desktop window`, + ); + return "port-busy"; + } + core = spawnCore(resolveCoreBinary(), resolveDist()); + return core ? "starting" : "spawn-failed"; +} + +/** Kill core so no orphan server lingers holding :8765 against the next launch. */ +function stopCore(): void { + if (!core) { + return; + } + const child = core; + core = null; + child.kill(); +} + +function createWindow(): BrowserWindow { + return new BrowserWindow({ + width: 1440, + height: 900, + minWidth: 960, + minHeight: 600, + center: true, + show: false, + titleBarStyle: "hiddenInset", + // Mirrors tauri.conf.json. Electron measures this differently from Tauri, so + // it still wants tuning by eye against GamesSidebar's hard-coded row height + // (docs/plans/electron-shell.md §3a). + trafficLightPosition: { x: 16, y: 23 }, + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + // Left ON. A sandboxed preload cannot `require` a local module, and this + // one imports `./ipc` for the channel names — which failed *silently*, + // leaving `window.cali` undefined and the app concluding it was a browser + // tab. P1 bought time with `sandbox: false`; the real fix is that the + // build now bundles the preload into a single file with no local requires + // (see `build:electron`), so the sandbox costs nothing. + sandbox: true, + // Sibling of this file in the compiled output, which is CommonJS — a + // preload cannot be an ES module. + preload: path.join(__dirname, "preload.js"), + }, + }); +} + +/** + * Core never came up. Surface a plain message instead of a blank window so the + * failure is visible and actionable. + */ +async function showFailure(win: BrowserWindow, startup: CoreStartup) { + const message = STARTUP_MESSAGES[startup]; + const body = `
${message}
`; + await win.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(body)}`); +} + +function registerIpc(panel: BrowserPanel): void { + ipcMain.handle( + IPC.shellInfo, + (): ShellInfo => ({ shell: "electron", platform: process.platform }), + ); + ipcMain.handle(IPC.chooseFolder, async () => { + const result = await dialog.showOpenDialog({ properties: ["openDirectory"] }); + return result.canceled ? null : (result.filePaths[0] ?? null); + }); + ipcMain.handle(IPC.panelBounds, (_event, bounds: PanelBounds) => { + panel.setBounds(bounds); + }); + ipcMain.handle(IPC.panelTarget, () => panel.targetId()); +} + +/** + * Tell core which view to drive. + * + * Core would otherwise launch a headless Chrome of its own and the user would + * be watching a different page from the agent — the exact split the shell + * migration exists to remove. The target id is handed over rather than + * discovered: core guessing by url or title would eventually pick the editor's + * own window and start driving the application instead of the page inside it. + * + * Best-effort by design. A failure here leaves core on its own browser, which + * is degraded but working, and is a far better outcome than refusing to open + * the window. + */ +async function attachPanelToCore(panel: BrowserPanel): Promise { + const targetId = await panel.targetId(); + if (!targetId) { + console.error("browser panel exposed no devtools target; core keeps its own browser"); + return; + } + try { + const response = await fetch(`${CORE_ORIGIN}/rpc`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + jsonrpc: "2.0", + id: "attach-panel", + method: "browser_attach", + params: { endpoint: `http://127.0.0.1:${REMOTE_DEBUGGING_PORT}`, targetId }, + }), + }); + const body = (await response.json()) as { error?: { message?: string } }; + if (body.error) { + console.error(`core refused the browser panel: ${body.error.message ?? "unknown error"}`); + } + } catch (error) { + console.error(`could not hand the browser panel to core: ${String(error)}`); + } +} + +app.whenReady().then(async () => { + const startup = await startCore(); + const win = createWindow(); + const panel = createBrowserPanel(win); + registerIpc(panel); + + win.once("closed", () => panel.destroy()); + + const ready = startup === "starting" && (await waitForCore(100)); + if (ready) { + await attachPanelToCore(panel); + await win.loadURL(`${CORE_ORIGIN}/`); + } else { + await showFailure(win, startup); + } + win.show(); + win.focus(); +}); + +// The window is the app: there is no dock-relaunch path, and a surviving core +// would hold :8765 against the next launch. +app.on("window-all-closed", () => { + stopCore(); + app.quit(); +}); + +app.on("before-quit", stopCore); diff --git a/client/electron/preload.ts b/client/electron/preload.ts new file mode 100644 index 00000000..c5a1747f --- /dev/null +++ b/client/electron/preload.ts @@ -0,0 +1,33 @@ +/** + * The only bridge across `contextIsolation`. + * + * Every member below is a named operation with a fixed channel. `ipcRenderer` + * itself — and any generic `invoke(channel, ...args)` passthrough — must never + * be exposed: the BROWSER panel loads arbitrary pages into this app, and a + * broad bridge would turn any script on any of those pages into a caller of + * the main process. Adding a capability here means adding a method, never a + * parameter that names a channel. + */ + +import { contextBridge, ipcRenderer } from "electron"; + +import { IPC, type CaliBridge, type PanelBounds } from "./ipc"; + +const bridge: CaliBridge = { + // Synchronous, because `hasOverlayWindowControls()` in src/lib/desktop.ts + // runs at render time to decide whether the header reserves space for the + // macOS traffic lights. An async probe resolves after that first paint, so + // the lights would land on top of our own chrome. + shell: "electron", + platform: process.platform, + + chooseFolder: () => ipcRenderer.invoke(IPC.chooseFolder) as Promise, + + // Fire-and-forget: bounds arrive on every resize and scroll frame, and a + // reply the renderer would discard only adds latency to that path. + setPanelBounds: (bounds: PanelBounds) => ipcRenderer.send(IPC.panelBounds, bounds), + + panelTarget: () => ipcRenderer.invoke(IPC.panelTarget) as Promise, +}; + +contextBridge.exposeInMainWorld("cali", bridge); diff --git a/client/package.json b/client/package.json index 77805afc..2b626fbe 100644 --- a/client/package.json +++ b/client/package.json @@ -2,6 +2,7 @@ "name": "calicode-client", "private": true, "version": "0.1.0", + "main": "dist-electron/main.js", "type": "module", "scripts": { "dev": "vite", @@ -15,7 +16,10 @@ "test:e2e": "playwright test --grep-invert @live", "test:e2e:live": "playwright test --grep @live", "pretest:e2e": "node -e \"const fs=require('node:fs');for(const path of ['.e2e-state','.e2e-projects','.e2e-config.yaml'])fs.rmSync(path,{recursive:true,force:true})\"", - "pretest:e2e:live": "pnpm pretest:e2e" + "pretest:e2e:live": "pnpm pretest:e2e", + "build:electron": "tsc -p tsconfig.electron.json && esbuild electron/preload.ts --bundle --platform=node --format=cjs --external:electron --outfile=dist-electron/preload.js && node -e \"require('fs').writeFileSync('dist-electron/package.json','{\\\"type\\\":\\\"commonjs\\\"}')\"", + "desktop:electron": "pnpm build:electron && electron dist-electron/main.js", + "desktop:electron:build": "pnpm build && pnpm build:electron && cd ../core && cargo build --release && cd ../client && CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --config electron-builder.yml --mac dir" }, "dependencies": { "@hookform/resolvers": "^3.9.1", @@ -49,6 +53,9 @@ "@types/react-dom": "^18.3.1", "@types/three": "^0.170.0", "@vitejs/plugin-react": "^4.3.4", + "electron": "^43.4.0", + "electron-builder": "^26.15.3", + "esbuild": "^0.28.2", "jsdom": "^25.0.1", "tailwindcss": "^4.0.0", "typescript": "^5.7.2", diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 2ecf7002..39ee941c 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -96,6 +96,15 @@ importers: '@vitejs/plugin-react': specifier: ^4.3.4 version: 4.7.0(vite@6.4.3(@types/node@22.20.1)(jiti@2.7.0)(lightningcss@1.32.0)) + electron: + specifier: ^43.4.0 + version: 43.4.0 + electron-builder: + specifier: ^26.15.3 + version: 26.15.3(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)) + esbuild: + specifier: ^0.28.2 + version: 0.28.2 jsdom: specifier: ^25.0.1 version: 25.0.1 @@ -232,6 +241,50 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} + '@electron-internal/extract-zip@1.0.5': + resolution: {integrity: sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==} + engines: {node: '>=22.12.0'} + + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/fuses@1.8.0': + resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} + hasBin: true + + '@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'} + + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/rebuild@4.2.0': + resolution: {integrity: sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@electron/universal@2.0.3': + resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} + engines: {node: '>=16.4'} + + '@electron/windows-sign@1.2.2': + resolution: {integrity: sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==} + engines: {node: '>=14.14'} + hasBin: true + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -244,6 +297,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -256,6 +315,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -268,6 +333,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -280,6 +351,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -292,6 +369,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -304,6 +387,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -316,6 +405,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -328,6 +423,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -340,6 +441,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -352,6 +459,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -364,6 +477,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -376,6 +495,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -388,6 +513,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -400,6 +531,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -412,6 +549,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -424,6 +567,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -436,12 +585,24 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -454,12 +615,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -472,12 +645,24 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -490,6 +675,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -502,6 +693,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -514,6 +711,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -526,6 +729,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@floating-ui/core@1.8.0': resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} @@ -546,6 +755,10 @@ packages: peerDependencies: react-hook-form: ^7.0.0 + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -562,6 +775,14 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@malept/cross-spawn-promise@2.0.0': + resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} + engines: {node: '>= 12.13.0'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + '@napi-rs/lzma-linux-x64-gnu@1.5.1': resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} engines: {node: ^22.20 || ^24.12 || >=25} @@ -569,6 +790,14 @@ packages: os: [linux] libc: [glibc] + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@2.3.0': + resolution: {integrity: sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==} + engines: {node: '>= 20.19.0'} + '@opencode-ai/models@0.0.40': resolution: {integrity: sha512-FqOJ/q3Z+bexwE77NyXZ2D6At9q98PYoHyPBS0514VoP3dpMDWLARY172Fjx0iOH1TLsZbHmuaUbv6seFVjNDg==} engines: {node: '>=18'} @@ -578,6 +807,20 @@ packages: effect: optional: true + '@peculiar/asn1-schema@2.9.0': + resolution: {integrity: sha512-AKvPMOM7LfK0uFe1m7o7+veOa8xQGPqsqOrKi3QKgCElzwjGp39mbhr2g7mt/v/mXQHiIvJmDj5cJS173x8Q9Q==} + + '@peculiar/json-schema@1.1.12': + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} + + '@peculiar/utils@2.0.3': + resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} + + '@peculiar/webcrypto@1.7.1': + resolution: {integrity: sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==} + engines: {node: '>=14.18.0'} + '@playwright/test@1.62.1': resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} engines: {node: '>=20'} @@ -1067,6 +1310,14 @@ packages: cpu: [x64] os: [win32] + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + '@tailwindcss/node@4.3.3': resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} @@ -1280,12 +1531,33 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@22.20.1': resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} + '@types/node@24.13.3': + resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} + '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -1297,6 +1569,9 @@ packages: '@types/react@18.3.31': resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/stats.js@0.17.4': resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==} @@ -1344,24 +1619,49 @@ packages: '@webgpu/types@0.1.71': resolution: {integrity: sha512-mMy8/ODcKhab808co15eW+yN+HgXoQxRQHTiBV9Mrvl1r0ufnid7YOcI+gi4eUWSWl9ezD6TW2KXccrL8HCh2A==} + '@xmldom/xmldom@0.8.14': + resolution: {integrity: sha512-T4EDRUBVZYRldYApjEJiU0e1stYWaRAX7CuSnKzrpwdZKo53zGV8/pqfzV6FfwNl9YThD2OumQYvqtvjvgG7aQ==} + engines: {node: '>=10.0.0'} + '@xterm/addon-fit@0.11.0': resolution: {integrity: sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==} '@xterm/xterm@6.0.0': resolution: {integrity: sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==} + abbrev@4.0.0: + resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} + engines: {node: ^20.17.0 || >=22.9.0} + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + app-builder-lib@26.15.3: + resolution: {integrity: sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 26.15.3 + electron-builder-squirrel-windows: 26.15.3 + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} @@ -1369,27 +1669,95 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + asn1js@3.0.10: + resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==} + engines: {node: '>=12.0.0'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.11.12: resolution: {integrity: sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==} engines: {node: '>=6.0.0'} hasBin: true + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + brace-expansion@1.1.18: + resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} + + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + browserslist@4.28.7: resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builder-util-runtime@9.7.0: + resolution: {integrity: sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==} + engines: {node: '>=12.0.0'} + + builder-util@26.15.3: + resolution: {integrity: sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==} + engines: {node: '>=14.0.0'} + + bytestreamjs@2.0.1: + resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} + engines: {node: '>=6.0.0'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1401,24 +1769,82 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cross-dirname@0.1.0: + resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + cssstyle@4.6.0: resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} @@ -1442,10 +1868,26 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1461,16 +1903,67 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dir-compare@4.2.0: + resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} + + dmg-builder@26.15.3: + resolution: {integrity: sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@26.15.3: + resolution: {integrity: sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==} + + electron-builder@26.15.3: + resolution: {integrity: sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@26.15.3: + resolution: {integrity: sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==} + electron-to-chromium@1.5.401: resolution: {integrity: sha512-H6ViHN68nGYlChEvlIU67fn8O2/tpbWQPwck98yaJmh+08LSvHiydzDQ6oXNccLU3kNRVIRS9A4mA7CG+i6fLQ==} + electron-winstaller@5.4.0: + resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} + engines: {node: '>=8.0.0'} + + electron@43.4.0: + resolution: {integrity: sha512-3qxGF0CeQbiox5oWV1JlbWGQ1VerbmDhTFqW4sJ8h7uqTHniFYPObXJcDna0DMh32et0fFyKzz0YY8lJv3t5jg==} + engines: {node: '>= 22.12.0'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.24.5: resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} @@ -1479,6 +1972,17 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + env-paths@2.2.1: + 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==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1498,6 +2002,9 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -1508,10 +2015,19 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -1519,6 +2035,15 @@ packages: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1531,10 +2056,40 @@ packages: fflate@0.8.3: resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + form-data@4.0.6: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + engines: {node: '>=14.14'} + + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1552,6 +2107,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1564,13 +2123,40 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -1583,14 +2169,25 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -1599,9 +2196,47 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -1609,6 +2244,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.3.1: + resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} + hasBin: true + jsdom@25.0.1: resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} engines: {node: '>=18'} @@ -1623,11 +2262,32 @@ packages: engines: {node: '>=6'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -1702,6 +2362,9 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -1709,12 +2372,20 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lucide-react@0.468.0: resolution: {integrity: sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==} peerDependencies: @@ -1727,6 +2398,10 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -1742,6 +2417,49 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1750,16 +2468,63 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + node-abi@4.33.0: + resolution: {integrity: sha512-vLBWCKb+7LWsX+TbfzWOkw0W81m377tyx3hOweBTjO43CXZnRGS1/JPWs20fr0PgZyDXk6ROYrylsEycK8raDA==} + engines: {node: '>=22.12.0'} + + node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + + node-gyp@12.4.0: + resolution: {integrity: sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-releases@2.0.52: resolution: {integrity: sha512-MRlTqhAfoMx/4mhEbPo3Hi02g9LJZaJkka69V6h67Cb1gjrAG0jsTE4CZX1eptNx+VCAwJmfpnDIF4P0Nh1A7A==} engines: {node: '>=18'} + nopt@9.0.0: + resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + nwsapi@2.2.24: resolution: {integrity: sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==} + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -1767,6 +2532,10 @@ packages: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} + pe-library@0.4.1: + resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} + engines: {node: '>=12', npm: '>=6'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1774,6 +2543,10 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + pkijs@3.4.0: + resolution: {integrity: sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==} + engines: {node: '>=16.0.0'} + playwright-core@1.62.1: resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} engines: {node: '>=20'} @@ -1784,18 +2557,59 @@ packages: engines: {node: '>=20'} hasBin: true + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + postcss@8.5.25: resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==} engines: {node: ^10 || ^12 || >=14} + postject@1.0.0-alpha.6: + resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} + engines: {node: '>=14.0.0'} + hasBin: true + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + proc-log@6.1.0: + resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.2.0: + resolution: {integrity: sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==} + engines: {node: '>=16.0.0'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -1848,6 +2662,44 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + read-binary-file-arch@1.0.6: + resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} + hasBin: true + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resedit@1.7.2: + resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} + engines: {node: '>=12', npm: '>=6'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + rollup@4.62.4: resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1859,9 +2711,19 @@ packages: rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sanitize-filename@1.6.4: + resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} + + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -1869,23 +2731,92 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -1899,9 +2830,23 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} + engines: {node: '>=18'} + + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + temp@0.9.4: + resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} + engines: {node: '>=6.0.0'} + three@0.170.0: resolution: {integrity: sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==} + tiny-async-pool@1.3.0: + resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1931,6 +2876,13 @@ packages: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} @@ -1939,9 +2891,16 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -1950,6 +2909,28 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + undici@6.28.0: + resolution: {integrity: sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==} + engines: {node: '>=18.17'} + + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + engines: {node: '>=20.18.1'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unzipper@0.12.5: + resolution: {integrity: sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==} + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -1976,6 +2957,12 @@ packages: '@types/react': optional: true + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + vite-node@2.1.9: resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2081,6 +3068,9 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + webcrypto-core@1.9.2: + resolution: {integrity: sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -2098,11 +3088,33 @@ packages: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.21.2: resolution: {integrity: sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==} engines: {node: '>=10.0.0'} @@ -2119,12 +3131,39 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -2272,153 +3311,325 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} + '@electron-internal/extract-zip@1.0.5': {} + + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.5 + + '@electron/fuses@1.8.0': + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + minimist: 1.2.8 + + '@electron/get@3.1.0': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/get@5.1.0': + dependencies: + debug: 4.4.3 + env-paths: 3.0.0 + graceful-fs: 4.2.11 + progress: 2.0.3 + semver: 7.8.5 + sumchecker: 3.0.1 + optionalDependencies: + undici: 7.29.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.5.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.3.3': + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/rebuild@4.2.0': + dependencies: + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + node-abi: 4.33.0 + node-api-version: 0.2.1 + node-gyp: 12.4.0 + read-binary-file-arch: 1.0.6 + transitivePeerDependencies: + - supports-color + + '@electron/universal@2.0.3': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + dir-compare: 4.2.0 + fs-extra: 11.4.0 + minimatch: 9.0.9 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/windows-sign@1.2.2': + dependencies: + cross-dirname: 0.1.0 + debug: 4.4.3 + fs-extra: 11.4.0 + minimist: 1.2.8 + postject: 1.0.0-alpha.6 + transitivePeerDependencies: + - supports-color + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/aix-ppc64@0.25.12': optional: true + '@esbuild/aix-ppc64@0.28.2': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.25.12': optional: true + '@esbuild/android-arm64@0.28.2': + optional: true + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.25.12': optional: true + '@esbuild/android-arm@0.28.2': + optional: true + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.25.12': optional: true + '@esbuild/android-x64@0.28.2': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.25.12': optional: true + '@esbuild/darwin-arm64@0.28.2': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.25.12': optional: true + '@esbuild/darwin-x64@0.28.2': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.25.12': optional: true + '@esbuild/freebsd-arm64@0.28.2': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.25.12': optional: true + '@esbuild/freebsd-x64@0.28.2': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.25.12': optional: true + '@esbuild/linux-arm64@0.28.2': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.25.12': optional: true + '@esbuild/linux-arm@0.28.2': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.25.12': optional: true + '@esbuild/linux-ia32@0.28.2': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.25.12': optional: true + '@esbuild/linux-loong64@0.28.2': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.25.12': optional: true + '@esbuild/linux-mips64el@0.28.2': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.25.12': optional: true + '@esbuild/linux-ppc64@0.28.2': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.25.12': optional: true + '@esbuild/linux-riscv64@0.28.2': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.25.12': optional: true + '@esbuild/linux-s390x@0.28.2': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.25.12': optional: true + '@esbuild/linux-x64@0.28.2': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true + '@esbuild/netbsd-arm64@0.28.2': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.25.12': optional: true + '@esbuild/netbsd-x64@0.28.2': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true + '@esbuild/openbsd-arm64@0.28.2': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.25.12': optional: true + '@esbuild/openbsd-x64@0.28.2': + optional: true + '@esbuild/openharmony-arm64@0.25.12': optional: true + '@esbuild/openharmony-arm64@0.28.2': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.25.12': optional: true + '@esbuild/sunos-x64@0.28.2': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.25.12': optional: true + '@esbuild/win32-arm64@0.28.2': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.25.12': optional: true + '@esbuild/win32-ia32@0.28.2': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.25.12': optional: true + '@esbuild/win32-x64@0.28.2': + optional: true + '@floating-ui/core@1.8.0': dependencies: '@floating-ui/utils': 0.2.12 @@ -2440,6 +3651,10 @@ snapshots: dependencies: react-hook-form: 7.84.0(react@18.3.1) + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2459,11 +3674,50 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@malept/cross-spawn-promise@2.0.0': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.18.1 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true + '@noble/hashes@1.4.0': {} + + '@noble/hashes@2.3.0': {} + '@opencode-ai/models@0.0.40': {} + '@peculiar/asn1-schema@2.9.0': + dependencies: + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/json-schema@1.1.12': + dependencies: + tslib: 2.8.1 + + '@peculiar/utils@2.0.3': + dependencies: + tslib: 2.8.1 + + '@peculiar/webcrypto@1.7.1': + dependencies: + '@peculiar/asn1-schema': 2.9.0 + '@peculiar/json-schema': 1.1.12 + '@peculiar/utils': 2.0.3 + tslib: 2.8.1 + webcrypto-core: 1.9.2 + '@playwright/test@1.62.1': dependencies: playwright: 1.62.1 @@ -2893,6 +4147,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.4': optional: true + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + '@tailwindcss/node@4.3.3': dependencies: '@jridgewell/remapping': 2.3.5 @@ -3060,12 +4320,39 @@ snapshots: dependencies: '@babel/types': 7.29.8 + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.2.0 + '@types/keyv': 3.1.4 + '@types/node': 22.20.1 + '@types/responselike': 1.0.3 + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/estree@1.0.9': {} + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 22.20.1 + + '@types/http-cache-semantics@4.2.0': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.20.1 + + '@types/ms@2.1.0': {} + '@types/node@22.20.1': dependencies: undici-types: 6.21.0 + '@types/node@24.13.3': + dependencies: + undici-types: 7.18.2 + '@types/prop-types@15.7.15': {} '@types/react-dom@18.3.7(@types/react@18.3.31)': @@ -3077,6 +4364,10 @@ snapshots: '@types/prop-types': 15.7.15 csstype: 3.2.3 + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.20.1 + '@types/stats.js@0.17.4': {} '@types/three@0.170.0': @@ -3144,16 +4435,81 @@ snapshots: '@webgpu/types@0.1.71': {} + '@xmldom/xmldom@0.8.14': {} + '@xterm/addon-fit@0.11.0': {} '@xterm/xterm@6.0.0': {} + abbrev@4.0.0: {} + agent-base@7.1.4: {} + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.5 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-regex@5.0.1: {} + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + ansi-styles@5.2.0: {} + app-builder-lib@26.15.3(dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)))(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)): + dependencies: + '@electron/asar': 3.4.1 + '@electron/fuses': 1.8.0 + '@electron/get': 3.1.0 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 4.2.0 + '@electron/universal': 2.0.3 + '@malept/flatpak-bundler': 0.4.0 + '@noble/hashes': 2.3.0 + '@peculiar/webcrypto': 1.7.1 + '@types/fs-extra': 9.0.13 + ajv: 8.20.0 + asn1js: 3.0.10 + async-exit-hook: 2.0.1 + builder-util: 26.15.3 + builder-util-runtime: 9.7.0 + chromium-pickle-js: 0.2.0 + ci-info: 4.3.1 + debug: 4.4.3 + dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)) + dotenv: 16.6.1 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + electron-builder-squirrel-windows: 26.15.3(dmg-builder@26.15.3) + electron-publish: 26.15.3 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + isbinaryfile: 5.0.7 + jiti: 2.7.0 + js-yaml: 4.3.1 + json5: 2.2.3 + lazy-val: 1.0.5 + minimatch: 10.2.6 + pkijs: 3.4.0 + plist: 3.1.0 + proper-lockfile: 4.1.2 + resedit: 1.7.2 + semver: 7.7.4 + tar: 7.5.22 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + unzipper: 0.12.5 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + + argparse@2.0.1: {} + aria-hidden@1.2.6: dependencies: tslib: 2.8.1 @@ -3162,12 +4518,50 @@ snapshots: dependencies: dequal: 2.0.3 + asn1js@3.0.10: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.2.0 + tslib: 2.8.1 + assertion-error@2.0.1: {} + async-exit-hook@2.0.1: {} + + async@3.2.6: {} + asynckit@0.4.0: {} + at-least-node@1.0.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + base64-js@1.5.1: {} + baseline-browser-mapping@2.11.12: {} + bluebird@3.7.2: {} + + boolean@3.2.0: + optional: true + + brace-expansion@1.1.18: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.4: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + browserslist@4.28.7: dependencies: baseline-browser-mapping: 2.11.12 @@ -3176,8 +4570,50 @@ snapshots: node-releases: 2.0.52 update-browserslist-db: 1.2.3(browserslist@4.28.7) + buffer-from@1.1.2: {} + + builder-util-runtime@9.7.0: + dependencies: + debug: 4.4.3 + sax: 1.6.1 + transitivePeerDependencies: + - supports-color + + builder-util@26.15.3: + dependencies: + '@types/debug': 4.1.13 + builder-util-runtime: 9.7.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + js-yaml: 4.3.1 + sanitize-filename: 1.6.4 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + transitivePeerDependencies: + - supports-color + + bytestreamjs@2.0.1: {} + cac@6.7.14: {} + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -3193,20 +4629,69 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + check-error@2.1.3: {} + chownr@3.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@4.3.1: {} + + ci-info@4.4.0: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + clsx@2.1.1: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 + commander@5.1.0: {} + + commander@9.5.0: + optional: true + + compare-version@0.1.2: {} + + concat-map@0.0.1: {} + convert-source-map@2.0.0: {} + core-util-is@1.0.3: {} + + cross-dirname@0.1.0: + optional: true + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + cssstyle@4.6.0: dependencies: '@asamuzakjp/css-color': 3.2.0 @@ -3225,8 +4710,28 @@ snapshots: decimal.js@10.6.0: {} + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + deep-eql@5.0.2: {} + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + delayed-stream@1.0.0: {} dequal@2.0.3: {} @@ -3235,16 +4740,113 @@ snapshots: detect-node-es@1.1.0: {} + detect-node@2.1.0: + optional: true + + dir-compare@4.2.0: + dependencies: + minimatch: 3.1.5 + p-limit: 3.1.0 + + dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)): + dependencies: + app-builder-lib: 26.15.3(dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)))(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)) + builder-util: 26.15.3 + fs-extra: 10.1.0 + js-yaml: 4.3.1 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + dom-accessibility-api@0.5.16: {} + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.6.1 + + dotenv@16.6.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3): + dependencies: + app-builder-lib: 26.15.3(dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)))(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)) + builder-util: 26.15.3 + electron-winstaller: 5.4.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@26.15.3(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)): + dependencies: + app-builder-lib: 26.15.3(dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)))(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)) + builder-util: 26.15.3 + builder-util-runtime: 9.7.0 + chalk: 4.1.2 + ci-info: 4.4.0 + dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)) + fs-extra: 10.1.0 + lazy-val: 1.0.5 + simple-update-notifier: 2.0.0 + yargs: 17.7.3 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@26.15.3: + dependencies: + '@types/fs-extra': 9.0.13 + aws4: 1.13.2 + builder-util: 26.15.3 + builder-util-runtime: 9.7.0 + chalk: 4.1.2 + form-data: 4.0.6 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + electron-to-chromium@1.5.401: {} + electron-winstaller@5.4.0: + dependencies: + '@electron/asar': 3.4.1 + debug: 4.4.3 + fs-extra: 7.0.1 + lodash: 4.18.1 + temp: 0.9.4 + optionalDependencies: + '@electron/windows-sign': 1.2.2 + transitivePeerDependencies: + - supports-color + + electron@43.4.0: + dependencies: + '@electron-internal/extract-zip': 1.0.5 + '@electron/get': 5.1.0 + '@types/node': 24.13.3 + transitivePeerDependencies: + - supports-color + + emoji-regex@8.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 @@ -3252,6 +4854,12 @@ snapshots: entities@6.0.1: {} + env-paths@2.2.1: {} + + env-paths@3.0.0: {} + + err-code@2.0.3: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -3269,6 +4877,9 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 + es6-error@4.1.1: + optional: true + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -3324,20 +4935,62 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} + escape-string-regexp@4.0.0: + optional: true + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 expect-type@1.4.0: {} + exponential-backoff@3.1.3: {} + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.5: {} + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 fflate@0.8.3: {} + filelist@1.0.6: + dependencies: + minimatch: 5.1.9 + form-data@4.0.6: dependencies: asynckit: 0.4.0 @@ -3346,6 +4999,45 @@ snapshots: hasown: 2.0.4 mime-types: 2.1.35 + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@11.3.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@11.4.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + fsevents@2.3.2: optional: true @@ -3356,6 +5048,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3376,10 +5070,60 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.8.5 + serialize-error: 7.0.1 + optional: true + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + gopd@1.2.0: {} + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + graceful-fs@4.2.11: {} + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -3390,10 +5134,16 @@ snapshots: dependencies: function-bind: 1.1.2 + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 + http-cache-semantics@4.2.0: {} + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -3401,6 +5151,11 @@ snapshots: transitivePeerDependencies: - supports-color + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -3412,12 +5167,43 @@ snapshots: dependencies: safer-buffer: 2.1.2 + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-fullwidth-code-point@3.0.0: {} + is-potential-custom-element-name@1.0.1: {} + isarray@1.0.0: {} + + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.7: {} + + isexe@2.0.0: {} + + isexe@3.1.5: {} + + isexe@4.0.0: {} + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 + jiti@2.7.0: {} js-tokens@4.0.0: {} + js-yaml@4.3.1: + dependencies: + argparse: 2.0.1 + jsdom@25.0.1: dependencies: cssstyle: 4.6.0 @@ -3448,8 +5234,31 @@ snapshots: jsesc@3.1.0: {} + json-buffer@3.0.1: {} + + json-schema-traverse@1.0.0: {} + + json-stringify-safe@5.0.1: + optional: true + json5@2.2.3: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lazy-val@1.0.5: {} + lightningcss-android-arm64@1.32.0: optional: true @@ -3499,18 +5308,26 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + lodash@4.18.1: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 loupe@3.2.1: {} + lowercase-keys@2.0.0: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lucide-react@0.468.0(react@18.3.1): dependencies: react: 18.3.1 @@ -3521,6 +5338,11 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + math-intrinsics@1.1.0: {} meshoptimizer@0.18.1: {} @@ -3531,26 +5353,117 @@ snapshots: dependencies: mime-db: 1.52.0 + mime@2.6.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.18 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.4 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.4 + + minimist@1.2.8: {} + + minipass@7.1.3: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + ms@2.1.3: {} nanoid@3.3.17: {} + node-abi@4.33.0: + dependencies: + semver: 7.8.5 + + node-api-version@0.2.1: + dependencies: + semver: 7.8.5 + + node-gyp@12.4.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + nopt: 9.0.0 + proc-log: 6.1.0 + semver: 7.8.5 + tar: 7.5.22 + tinyglobby: 0.2.17 + undici: 6.28.0 + which: 6.0.1 + + node-int64@0.4.0: {} + node-releases@2.0.52: {} + nopt@9.0.0: + dependencies: + abbrev: 4.0.0 + + normalize-url@6.1.0: {} + nwsapi@2.2.24: {} + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + p-cancelable@2.1.1: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + parse5@7.3.0: dependencies: entities: 6.0.1 + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + pathe@1.1.2: {} pathval@2.0.1: {} + pe-library@0.4.1: {} + picocolors@1.1.1: {} picomatch@4.0.5: {} + pkijs@3.4.0: + dependencies: + '@noble/hashes': 1.4.0 + asn1js: 3.0.10 + bytestreamjs: 2.0.1 + pvtsutils: 1.3.6 + pvutils: 1.2.0 + tslib: 2.8.1 + playwright-core@1.62.1: {} playwright@1.62.1: @@ -3559,20 +5472,61 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + plist@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.14 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + postcss@8.5.25: dependencies: nanoid: 3.3.17 picocolors: 1.1.1 source-map-js: 1.2.1 + postject@1.0.0-alpha.6: + dependencies: + commander: 9.5.0 + optional: true + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 + proc-log@6.1.0: {} + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + punycode@2.3.1: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.2.0: {} + + quick-lru@5.1.1: {} + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -3618,6 +5572,52 @@ snapshots: dependencies: loose-envify: 1.4.0 + read-binary-file-arch@1.0.6: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resedit@1.7.2: + dependencies: + pe-library: 0.4.1 + + resolve-alpn@1.2.1: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + retry@0.12.0: {} + + rimraf@2.6.3: + dependencies: + glob: 7.2.3 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + rollup@4.62.4: dependencies: '@types/estree': 1.0.9 @@ -3654,8 +5654,16 @@ snapshots: rrweb-cssom@0.8.0: {} + safe-buffer@5.1.2: {} + safer-buffer@2.1.2: {} + sanitize-filename@1.6.4: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sax@1.6.1: {} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -3664,16 +5672,78 @@ snapshots: dependencies: loose-envify: 1.4.0 + semver-compare@1.0.0: + optional: true + + semver@5.7.2: {} + semver@6.3.1: {} + semver@7.7.4: {} + + semver@7.8.5: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + siginfo@2.0.0: {} + signal-exit@3.0.7: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.8.5 + source-map-js@1.2.1: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.1.3: + optional: true + stackback@0.0.2: {} + stat-mode@1.0.0: {} + std-env@3.10.0: {} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + sumchecker@3.0.1: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + symbol-tree@3.2.4: {} tailwind-merge@2.6.1: {} @@ -3682,8 +5752,30 @@ snapshots: tapable@2.3.3: {} + tar@7.5.22: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + temp@0.9.4: + dependencies: + mkdirp: 0.5.6 + rimraf: 2.6.3 + three@0.170.0: {} + tiny-async-pool@1.3.0: + dependencies: + semver: 5.7.2 + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -3705,6 +5797,12 @@ snapshots: dependencies: tldts-core: 6.1.86 + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.7 + + tmp@0.2.7: {} + tough-cookie@5.1.2: dependencies: tldts: 6.1.86 @@ -3713,12 +5811,38 @@ snapshots: dependencies: punycode: 2.3.1 + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + tslib@2.8.1: {} + type-fest@0.13.1: + optional: true + typescript@5.9.3: {} undici-types@6.21.0: {} + undici-types@7.18.2: {} + + undici@6.28.0: {} + + undici@7.29.0: + optional: true + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unzipper@0.12.5: + dependencies: + bluebird: 3.7.2 + duplexer2: 0.1.4 + fs-extra: 11.3.1 + graceful-fs: 4.2.11 + node-int64: 0.4.0 + update-browserslist-db@1.2.3(browserslist@4.28.7): dependencies: browserslist: 4.28.7 @@ -3740,6 +5864,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 + utf8-byte-length@1.0.5: {} + + util-deprecate@1.0.2: {} + vite-node@2.1.9(@types/node@22.20.1)(lightningcss@1.32.0): dependencies: cac: 6.7.14 @@ -3822,6 +5950,14 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + webcrypto-core@1.9.2: + dependencies: + '@peculiar/asn1-schema': 2.9.0 + '@peculiar/json-schema': 1.1.12 + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 + tslib: 2.8.1 + webidl-conversions@7.0.0: {} whatwg-encoding@3.1.1: @@ -3835,17 +5971,59 @@ snapshots: tr46: 5.1.1 webidl-conversions: 7.0.0 + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@5.0.0: + dependencies: + isexe: 3.1.5 + + which@6.0.1: + dependencies: + isexe: 4.0.0 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + ws@8.21.2: {} xml-name-validator@5.0.0: {} + xmlbuilder@15.1.1: {} + xmlchars@2.2.0: {} + y18n@5.0.8: {} + yallist@3.1.1: {} + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + zod@3.25.76: {} diff --git a/client/scripts/compare-shells.mjs b/client/scripts/compare-shells.mjs new file mode 100644 index 00000000..da0f5bf4 --- /dev/null +++ b/client/scripts/compare-shells.mjs @@ -0,0 +1,271 @@ +/** + * Surface-by-surface proof that the Electron shell renders the same editor as + * a plain browser. + * + * Both shells load the identical React bundle from the identical Rust core over + * HTTP, so any pixel difference is the shell's doing — a missing drag region, a + * traffic-light inset that leaked into the wrong build, a font the OS webview + * resolved differently. Eyeballing ten tabs twice does not catch that. + * + * Usage, from `client/`: + * + * CALI_PORT=8799 npx electron dist-electron/main.js # shell + core, in another terminal + * node scripts/compare-shells.mjs [--port=8799] [--out=.shell-compare] [--cdp=URL] + * + * The Electron side is reached over CDP (the shell exposes 9222); the browser + * side is a fresh Playwright Chromium on core's own origin, which is what the + * committed visual baselines render with. + */ + +import { chromium } from "@playwright/test"; +import { createRequire } from "node:module"; +import { mkdirSync, writeFileSync } from "node:fs"; +import path from "node:path"; + +function opt(name, fallback) { + const hit = process.argv.slice(2).find((arg) => arg.startsWith(`--${name}=`)); + return hit ? hit.slice(name.length + 3) : fallback; +} + +const CORE_PORT = Number(opt("port", process.env.CALI_PORT ?? "8799")); +const CDP_URL = opt("cdp", process.env.CALI_CDP_URL ?? "http://127.0.0.1:9222"); +const OUT_DIR = path.resolve(opt("out", process.env.CALI_SHELL_COMPARE_OUT ?? ".shell-compare")); +const BASE_URL = `http://127.0.0.1:${CORE_PORT}/`; + +/** Matches the visual baselines, so a diff here is comparable with those. */ +const VIEWPORT = { width: 1440, height: 900 }; + +/** App.tsx persists the active tab here; clearing it makes both sides start equal. */ +const VIEW_KEY = "calicode-view"; + +const TABS = ["play", "code", "art", "build", "scene", "test", "terminal", "browser", "sidechat", "reports"]; + +/** + * Absolute pixel budget. Set from measurement, not estimate. + * + * The two sides are different Chromium builds — Electron's bundled one against + * Playwright's — and cross-build text antialiasing is the noise floor. That + * floor was guessed at "a few hundred"; measured across all eleven surfaces it + * is **2,666-3,023 differing pixels**, scattered over the whole frame (x + * 21-1393, y 13-891) rather than clustered, which is the signature of text + * rasterising differently rather than anything moving. + * + * So this budget cannot separate a small regression from that noise, and it is + * dishonest to pretend otherwise: a clipped tab strip measured ~1,400 pixels in + * `visual.spec.ts`, i.e. *below* the floor here. What this comparison reliably + * catches is gross layout breakage — an element appearing, vanishing, or moving + * — which shifts whole blocks and costs tens of thousands (a 300x60 element was + * ~18,000). Anything subtler needs a human looking at the `.diff.png`, which is + * why every run writes them. + */ +const MAX_DIFF_PIXELS = 6_000; + +/** Coarse mode only: PNG byte size is a weak proxy for content, so allow slack. */ +const MAX_COARSE_SIZE_DRIFT = 0.1; + +/** Regions that differ for reasons other than the shell, and would drown the signal. */ +function unstable(page) { + return [ + // WebGL: GPU- and driver-dependent, and the PLAY scene animates. + page.locator("canvas"), + // fps, frame time, load time — new numbers every run. + page.locator("[data-live-stats]"), + page.locator("[data-active-model]"), + // Project list contents depend on what is on disk, not on the shell. + page.locator("[data-games-list]"), + // The BROWSER tab paints remote pages into an ; whatever it loaded is + // live content, not our chrome. + page.locator("img"), + // The window-controls row is the one place the shells are *supposed* to + // differ: only a desktop shell reserves 72px for native traffic lights, and + // the browser draws three decorative dots instead. Masking the row (via its + // toggle button's parent — AGENTS.md guarantees exactly one such button) + // keeps that intended difference from failing every single surface. + page.getByRole("button", { name: "Toggle games sidebar" }).locator(".."), + ]; +} + +/** Width and height straight from the IHDR, so dimensions are known even coarse. */ +function pngSize(buffer) { + return { width: buffer.readUInt32BE(16), height: buffer.readUInt32BE(20) }; +} + +/** + * Image comparison without adding a dependency. + * + * `@playwright/test` ships pixelmatch, but not as an importable module: + * `playwright-core`'s export map stops at `lib/coreBundle`, so the only handle + * on it is `utils.getComparator` — Playwright's own screenshot comparator, + * pixelmatch plus its antialias handling. It reports the count in prose, hence + * the regex. The bundle resolves from `@playwright/test`'s directory rather + * than ours because pnpm does not hoist it. + */ +async function loadDiffEngine() { + try { + const pixelmatch = (await import("pixelmatch")).default; + const { PNG } = await import("pngjs"); + return { + label: "pixelmatch", + coarse: false, + compare(a, b) { + const left = PNG.sync.read(a); + const right = PNG.sync.read(b); + if (left.width !== right.width || left.height !== right.height) return { pixels: null, diff: null }; + const out = new PNG({ width: left.width, height: left.height }); + const pixels = pixelmatch(left.data, right.data, out.data, left.width, left.height, { threshold: 0.2 }); + return { pixels, diff: pixels ? PNG.sync.write(out) : null }; + }, + }; + } catch {} // not installed here + + try { + const req = createRequire(import.meta.resolve("@playwright/test")); + const { utils } = req("playwright-core/lib/coreBundle"); + const comparator = utils.getComparator("image/png"); + return { + label: "playwright's bundled pixelmatch", + coarse: false, + compare(a, b) { + const result = comparator(a, b, { threshold: 0.2 }); + if (!result) return { pixels: 0, diff: null }; + const count = /(\d+) pixels/.exec(result.errorMessage ?? ""); + return { pixels: count ? Number(count[1]) : null, diff: result.diff ?? null }; + }, + }; + } catch {} // no comparator reachable + + return { label: "byte size + dimensions (COARSE)", coarse: true, compare: () => ({ pixels: null, diff: null }) }; +} + +async function settle(page) { + await page.waitForLoadState("networkidle").catch(() => undefined); + // Let the editor finish its first project load and layout pass. + await page.waitForTimeout(600); +} + +/** Captures every surface from one page, in place, and returns surface -> PNG. */ +async function captureAll(page, source) { + const shots = new Map(); + // Clearing the persisted tab is what makes the two sides start equal. + await page.evaluate((key) => localStorage.removeItem(key), VIEW_KEY); + await page.reload({ waitUntil: "domcontentloaded" }); + await settle(page); + const shoot = async (surface) => { + // `scale: "css"` on both sides. Playwright captures at the device pixel + // ratio by default, so the shell's window on a retina display came back + // 2880x1800 against the reference browser's 1440x900 and every surface + // read as "dimensions differ" — a comparison that can never pass, for a + // reason that has nothing to do with the shells. + shots.set( + surface, + await page.screenshot({ + mask: unstable(page), + animations: "disabled", + fullPage: false, + scale: "css", + }), + ); + }; + await shoot("default"); + + for (const tab of TABS) { + const handle = page.getByRole("tab", { name: tab, exact: true }).first(); + if (!(await handle.isVisible().catch(() => false))) { + console.log(` ${source}: tab "${tab}" is not open — skipped`); + continue; + } + await handle.click({ timeout: 5000 }); + await settle(page); + await shoot(tab); + } + return shots; +} + +async function electronPage() { + const browser = await chromium.connectOverCDP(CDP_URL).catch((error) => { + console.error(`Cannot reach the Electron shell on ${CDP_URL}: ${error.message}`); + console.error(`Start it with: cd client && CALI_PORT=${CORE_PORT} npx electron dist-electron/main.js`); + process.exit(2); + }); + const pages = browser.contexts().flatMap((context) => context.pages()); + // The shell also owns the BROWSER panel's WebContentsView, which is a page + // target too — the editor is the one served from core's port. + const page = pages.find((candidate) => candidate.url().includes(`:${CORE_PORT}`)); + if (!page) { + console.error(`Attached to ${CDP_URL} but no page is on :${CORE_PORT}. Saw: ${pages.map((p) => p.url()).join(", ") || "no pages"}`); + process.exit(2); + } + // Forced through CDP rather than page.setViewportSize: a CDP-attached page + // has a null viewport (it is a real window), and only the emulation override + // makes both sides capture at the same size. + const session = await page.context().newCDPSession(page); + await session.send("Emulation.setDeviceMetricsOverride", { ...VIEWPORT, deviceScaleFactor: 1, mobile: false }); + return { browser, page }; +} + +const engine = await loadDiffEngine(); +mkdirSync(OUT_DIR, { recursive: true }); + +console.log(`core ${BASE_URL}\nelectron ${CDP_URL}\noutput ${OUT_DIR}\ncompare ${engine.label}\n`); +if (engine.coarse) { + console.log("!! Neither pixelmatch nor Playwright's bundled comparator could be loaded."); + console.log("!! This run compares PNG byte size and dimensions only. It can prove two"); + console.log("!! surfaces have different geometry; it CANNOT prove they render the same.\n"); +} + +const { browser: electronBrowser, page: shellPage } = await electronPage(); +const electronShots = await captureAll(shellPage, "electron"); +await electronBrowser.close(); + +const reference = await chromium.launch(); +const referencePage = await reference.newPage({ viewport: VIEWPORT, deviceScaleFactor: 1 }); +await referencePage.goto(BASE_URL, { waitUntil: "domcontentloaded" }); +const browserShots = await captureAll(referencePage, "browser"); +await reference.close(); + +const surfaces = [...new Set([...electronShots.keys(), ...browserShots.keys()])]; +const rows = []; +let failed = false; + +for (const surface of surfaces) { + const left = electronShots.get(surface); + const right = browserShots.get(surface); + if (left) writeFileSync(path.join(OUT_DIR, `${surface}.electron.png`), left); + if (right) writeFileSync(path.join(OUT_DIR, `${surface}.browser.png`), right); + + if (!left || !right) { + failed = true; + rows.push([surface, left ? `${left.length}B` : "-", right ? `${right.length}B` : "-", "-", "MISSING on one side"]); + continue; + } + + const a = pngSize(left); + const b = pngSize(right); + const sizes = [`${a.width}x${a.height} ${Math.round(left.length / 1024)}K`, `${b.width}x${b.height} ${Math.round(right.length / 1024)}K`]; + + if (a.width !== b.width || a.height !== b.height) { + failed = true; + rows.push([surface, ...sizes, "-", "DIMENSIONS DIFFER"]); + } else if (engine.coarse) { + const drift = Math.abs(left.length - right.length) / Math.max(left.length, right.length); + failed ||= drift > MAX_COARSE_SIZE_DRIFT; + const verdict = drift > MAX_COARSE_SIZE_DRIFT ? "SIZE DRIFT (coarse)" : "same size (coarse)"; + rows.push([surface, ...sizes, `~${(drift * 100).toFixed(1)}%`, verdict]); + } else { + const { pixels, diff } = engine.compare(left, right); + if (diff) writeFileSync(path.join(OUT_DIR, `${surface}.diff.png`), diff); + failed ||= pixels === null || pixels > MAX_DIFF_PIXELS; + if (pixels === null) rows.push([surface, ...sizes, "?", "DIFFERS, count unavailable"]); + else rows.push([surface, ...sizes, String(pixels), pixels > MAX_DIFF_PIXELS ? `DIFFERS (> ${MAX_DIFF_PIXELS})` : "match"]); + } +} + +const header = ["surface", "electron", "browser", "diff px", "verdict"]; +const widths = header.map((label, column) => Math.max(label.length, ...rows.map((row) => String(row[column]).length))); +const line = (cells) => cells.map((cell, index) => String(cell).padEnd(widths[index])).join(" "); +console.log(`\n${line(header)}\n${line(widths.map((width) => "-".repeat(width)))}`); +for (const row of rows) console.log(line(row)); + +console.log(`\n${rows.length} surfaces compared. Images in ${OUT_DIR}`); +console.log(failed ? "FAIL — see the rows above and their .diff.png" : "PASS — both shells render the same editor"); +process.exit(failed ? 1 : 0); diff --git a/client/src/components/workspace/BrowserTab.test.tsx b/client/src/components/workspace/BrowserTab.test.tsx index d485edbe..8dd07cb2 100644 --- a/client/src/components/workspace/BrowserTab.test.tsx +++ b/client/src/components/workspace/BrowserTab.test.tsx @@ -295,6 +295,54 @@ describe("BrowserTab", () => { await waitFor(() => expect(surface.style.cursor).toBe("pointer")); }); + it("reports its rect to the native shell and hides under overlays", async () => { + // Under Electron the panel is a real WebContentsView the shell positions + // over this element, so this component reports geometry instead of + // painting. A native view floats above the DOM with its own z-order, so a + // portalled Radix menu would open *behind* it unless the view hides. + const setPanelBounds = vi.fn(); + const bridge = { + shell: "electron" as const, + platform: "darwin", + chooseFolder: vi.fn(), + setPanelBounds, + panelTarget: vi.fn(), + }; + // contextBridge freezes what it exposes, so the real object cannot be + // spied on in the running app — which is why this is asserted here. + Object.defineProperty(window, "cali", { value: bridge, configurable: true }); + // jsdom implements no ResizeObserver, and the geometry effect guards on it + // — without a stub it returns before reporting anything. + const RealRO = window.ResizeObserver; + window.ResizeObserver = class { + observe() {} + disconnect() {} + unobserve() {} + } as unknown as typeof ResizeObserver; + + try { + render(); + await waitFor(() => expect(setPanelBounds).toHaveBeenCalled()); + expect(setPanelBounds.mock.calls.at(-1)?.[0]).toMatchObject({ visible: true }); + + // A dialog portalled to is how every overlay in this app arrives. + const overlay = document.createElement("div"); + overlay.setAttribute("role", "dialog"); + document.body.appendChild(overlay); + await waitFor(() => + expect(setPanelBounds.mock.calls.at(-1)?.[0]).toMatchObject({ visible: false }), + ); + + overlay.remove(); + await waitFor(() => + expect(setPanelBounds.mock.calls.at(-1)?.[0]).toMatchObject({ visible: true }), + ); + } finally { + Reflect.deleteProperty(window, "cali"); + window.ResizeObserver = RealRO; + } + }); + it("offers a way out to the real browser", async () => { mocks.rpc.mockImplementation((method: string) => method === "browser_status" diff --git a/client/src/components/workspace/BrowserTab.tsx b/client/src/components/workspace/BrowserTab.tsx index 3b25c480..8a19b4ae 100644 --- a/client/src/components/workspace/BrowserTab.tsx +++ b/client/src/components/workspace/BrowserTab.tsx @@ -1,6 +1,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { ArrowLeft, ArrowRight, ExternalLink, Loader2, RotateCw, Search } from "lucide-react"; import { connectEvents, rpc, type AgentEvent } from "../../lib/rpc"; +import { electronBridge } from "../../lib/desktop"; interface Status { running: boolean; @@ -100,6 +101,63 @@ export function BrowserTab() { setPainted(true); }, []); + /** + * In the Electron shell the panel is a real `WebContentsView` the shell + * positions over this element, so there is nothing to stream and nothing to + * paint — this component becomes a placeholder that reports where the view + * should sit. Everything else here (address bar, status, history) still + * applies, because the view is driven through the same core RPCs. + */ + const native = electronBridge(); + + useEffect(() => { + if (!native) return; + const surface = surfaceRef.current; + if (!surface || typeof ResizeObserver === "undefined") return; + const report = (visible: boolean) => { + const box = surface.getBoundingClientRect(); + // Client coordinates are the window's content area for a full-bleed + // renderer, which is what the shell's `setBounds` expects. A native + // titlebar inset or a second native view would break that assumption. + native.setPanelBounds({ + x: box.left, + y: box.top, + width: box.width, + height: box.height, + visible, + }); + }; + // A native view floats above the DOM and has its own z-order, so every + // portalled overlay in the app — the tab strip's dropdown, the settings + // dialog, the session search, the model picker — would render *behind* it. + // Radix portals all of them to `document.body`, so watching for one + // appearing is what keeps a menu from opening underneath the browser. + const overlayOpen = () => + document.querySelector( + '[data-radix-popper-content-wrapper], [role="dialog"], [role="menu"], [role="listbox"]', + ) !== null; + const sync = () => report(!overlayOpen()); + + sync(); + const observer = new ResizeObserver(sync); + observer.observe(surface); + // The panel also moves when the window resizes or the dock scrolls, and + // neither resizes this element. + window.addEventListener("resize", sync); + // Overlays arrive and leave as body children rather than as anything this + // component renders, so a mutation watch is the only signal available. + const overlays = new MutationObserver(sync); + overlays.observe(document.body, { childList: true, subtree: true }); + return () => { + observer.disconnect(); + overlays.disconnect(); + window.removeEventListener("resize", sync); + // Hide, never destroy: the agent keeps browsing with the tab closed, and + // a native view left visible would float over whatever replaces it. + report(false); + }; + }, [native]); + useEffect(() => { let cancelled = false; const poll = () => { @@ -143,6 +201,7 @@ export function BrowserTab() { // agent tokens, so a screencast left running behind a closed tab is the // loudest thing on it for nobody's benefit. useEffect(() => { + if (native) return; let live = true; // Device pixels, so the frame arrives at exactly the resolution this panel // paints and is neither upscaled (blurry) nor oversized (measured: a fixed diff --git a/client/src/index.css b/client/src/index.css index 2b1db674..4cb8b657 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -336,3 +336,25 @@ select { opacity: 1; } } + +/* Window dragging in the Electron shell. + * + * Tauri reads `data-tauri-drag-region` itself; Electron drags on the CSS + * property below. Mapping one to the other here keeps a single source of truth + * for "this region drags the window" and avoids touching the five components + * that carry the attribute. Both other shells ignore the property — WKWebView + * does not implement it and a plain browser has no window to move — so this is + * inert everywhere except Electron. + */ +[data-tauri-drag-region] { + -webkit-app-region: drag; +} + +/* A drag region swallows clicks on everything inside it, so every interactive + * descendant has to opt back out. Without this the workspace tab strip would + * drag the window instead of switching tabs — the controls would look alive + * and do nothing. + */ +[data-tauri-drag-region] :is(button, a, input, select, textarea, [role="tab"], [role="button"], [role="menuitem"], [tabindex]) { + -webkit-app-region: no-drag; +} diff --git a/client/src/lib/desktop.ts b/client/src/lib/desktop.ts index 76c55b20..78768e67 100644 --- a/client/src/lib/desktop.ts +++ b/client/src/lib/desktop.ts @@ -1,15 +1,49 @@ /** * Desktop-shell detection. * - * The same bundle is served to a plain browser (core's own origin) and to the - * Tauri webview. Only the Tauri case has native window controls overlaying the - * top-left of the page, so chrome that has to make room for them keys off this. + * The same bundle is served three ways: to a plain browser on core's own + * origin, to the Tauri webview, and to the Electron shell. Only the two + * desktop shells draw native window controls over the top-left of the page, + * so chrome that has to make room for them keys off this. + * + * Both shells are detected by a global they set, and neither sets the other's. + * Missing the Electron case does not fail loudly — the app simply concludes it + * is a browser tab, stops reserving space, and the macOS traffic lights land + * on top of our own header. + */ + +/** + * What `client/electron/preload.ts` exposes. Declared structurally rather than + * imported: `tsconfig.app.json` includes only `src`, so the shell's types are + * outside this program, and a path mapping across that boundary would drag the + * whole main-process program into the app build. */ +interface ElectronBridge { + shell: "electron"; + platform: string; + chooseFolder(): Promise; + setPanelBounds(bounds: { + x: number; + y: number; + width: number; + height: number; + visible: boolean; + }): void; + panelTarget(): Promise; +} + +/** The Electron preload bridge, or null under Tauri or a plain browser. */ +export function electronBridge(): ElectronBridge | null { + if (typeof window === "undefined") return null; + const bridge = (window as { cali?: ElectronBridge }).cali; + return bridge?.shell === "electron" ? bridge : null; +} -/** True when running inside the Tauri webview rather than a plain browser. */ +/** True when running inside a desktop shell rather than a plain browser. */ export function isDesktopShell(): boolean { if (typeof window === "undefined") return false; - return "__TAURI_INTERNALS__" in window || "__TAURI__" in window; + if ("__TAURI_INTERNALS__" in window || "__TAURI__" in window) return true; + return electronBridge() !== null; } /** True on macOS, where the shell draws traffic lights over the page. */ diff --git a/client/src/lib/workspace.ts b/client/src/lib/workspace.ts index 0e12fa5a..98ef7887 100644 --- a/client/src/lib/workspace.ts +++ b/client/src/lib/workspace.ts @@ -1,6 +1,6 @@ import { rpc } from "./rpc"; import type { Project } from "./types"; -import { isDesktopShell } from "./desktop"; +import { electronBridge, isDesktopShell } from "./desktop"; export interface WorkspaceInfo { id: string; @@ -92,6 +92,11 @@ export async function openWorkspace(path: string, name?: string): Promise { if (!isDesktopShell()) return null; + // Each shell owns its own native panel. Checked before the Tauri import + // below because that import throws outside Tauri, and the failure would look + // like "the folder picker is broken" rather than "wrong shell". + const electron = electronBridge(); + if (electron) return electron.chooseFolder(); const { open } = await import("@tauri-apps/plugin-dialog"); const selected = await open({ directory: true, diff --git a/client/tsconfig.electron.json b/client/tsconfig.electron.json new file mode 100644 index 00000000..3a1b35ac --- /dev/null +++ b/client/tsconfig.electron.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + // CommonJS, not ESM. Electron 43 can run an ESM main process, but a preload + // script under `contextIsolation` still loads most reliably as CJS, and the + // two must agree — a preload that fails to load is silent, and the only + // symptom is `window.cali` being undefined at render time. + "module": "CommonJS", + "moduleResolution": "Node", + "target": "ES2022", + "lib": ["ES2022", "DOM"], + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "types": ["node"], + // Without rootDir, tsc preserves `electron/` inside the output and the + // launch script's path no longer matches. + "rootDir": "./electron", + "outDir": "./dist-electron", + "declaration": true, + "declarationMap": true, + "sourceMap": true + }, + "include": ["electron/**/*.ts"] +} diff --git a/client/tsconfig.json b/client/tsconfig.json index e891e30d..82ca48a4 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -2,7 +2,8 @@ "files": [], "references": [ { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } + { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.electron.json" } ] } diff --git a/docs/plans/electron-shell.md b/docs/plans/electron-shell.md index e419e6e9..c677a031 100644 --- a/docs/plans/electron-shell.md +++ b/docs/plans/electron-shell.md @@ -1,9 +1,9 @@ # Electron shell -Status: **plan only, nothing built.** Browser-pipeline measurements taken 2026-08-14; §1. -Recommendation: **§3 — prove the CDP attach first, in a throwaway app, and let that -one result decide the whole thing.** Everything downstream is mechanical; that one -assumption is not. +Status: **P0 spike run 2026-08-15 and it passed — see §3. Nothing built in the repo.** +Browser-pipeline measurements taken 2026-08-14; §1. +Recommendation: **proceed to P1.** The one assumption that could have killed this is +now measured, and it also settled the capture question in our favour (§5). --- @@ -86,10 +86,38 @@ carry over. If it does not, this plan is dead and we keep the stream. **Kill criterion:** if the view cannot be attached, or input dispatch does not reach it, stop. Report and keep Tauri. -Secondary unknowns the spike should also answer, because they are cheap to check once -it is running: does `Page.captureScreenshot` on a view work while the window is -minimised (Codex [#30605](https://github.com/openai/codex/issues/30605) says theirs -does not — see §5), and does `captureBeyondViewport` give full-page. +### Result — 2026-08-15, passed + +Electron exposes every `WebContentsView` as an ordinary CDP `page` target, so core +enumerates them exactly as it enumerates Chrome's today. Attached from a separate +process and ran the full set of operations `browser.rs` needs: + +``` +attached to the panel view: yes +1. navigate -> Low poly - Wikipedia +2. snapshot -> 55 interactive refs (the same injected walker) +3. click -> url changed: true (trusted input, not synthetic events) +4. screenshot -> 264 KB +5. console -> captured "hello from the panel" +``` + +**And the capture question resolved better than expected.** Repeated against a window +created with `show: false` — never displayed at all, the strongest form of the test: + +``` +capture on a hidden window -> 616 KB in 999ms +full-page capture -> 3145 KB in 461ms +driving it while hidden -> scrolled to 500 +``` + +So an Electron view captures, full-page, while invisible. We do **not** need to keep a +second headless Chrome for `browser_screenshot` (§5 assumed we might), and we do not +inherit Codex's [#30605](https://github.com/openai/codex/issues/30605) / +[#20146](https://github.com/openai/codex/issues/20146) limitations. + +Caveat on what was actually tested: a window that was *never shown*. Minimising a +previously-visible window is a slightly different compositor path and is untested — +worth re-checking at P2, when there is a real window to minimise. ## 3a. What actually breaks @@ -123,26 +151,199 @@ option on `BrowserWindow`, but the offsets need re-tuning by eye. every agent tool, projects and sessions on disk, and the entire editor UI apart from the four items above. +## 3b. How the browser should actually be built + +The spike settles the mechanism; this is the shape. + +**The panel is a `WebContentsView`, and core drives that same view over CDP.** One +browser, as today — the property worth protecting is that the user and the agent are +never looking at two different pages. What changes is that the user's half stops being +a video of it. + +``` +Electron main ── creates the view, owns its geometry + │ + ├─ renderer (React) reports the panel's rect over IPC; renders nothing itself + │ + └─ core (Rust) ───── attaches over --remote-debugging-port and drives it + with browser.rs exactly as it drives Chrome now +``` + +**Core keeps ownership of the protocol.** Do not reimplement snapshot/click/capture in +TypeScript because the main process happens to have `webContents` APIs to hand. The +2292 lines in `browser.rs` are the single implementation, the tools stay identical, +and the only change is where a target comes from: attach to the view instead of +`Target.createTarget`. The main process should hand core the target id explicitly when +it creates the view rather than leaving core to guess from url or title. + +**The hard part is that a native view floats above the DOM.** It is not in the React +tree, so it does not clip, does not scroll, and has its own z-order. Concretely, in +this app: + +- Radix dropdowns and dialogs (`WorkspaceTabs`, `SettingsDialog`, `SessionSearchDialog`, + `ModelPicker`, `GamesSidebar`) portal to `document.body` and would render *behind* the + view. **Hide the view whenever an overlay is open**, not just when the tab changes. +- The panel has rounded corners and a border; a native view will not clip to them. + Either accept square corners inside the frame or inset the view by a pixel. +- Dock resize animates. Positioning the view per frame will lag the CSS; either drive + it from the same `ResizeObserver` and accept a frame of skew, or hide during the + drag and place it on settle. +- The view must be hidden — not destroyed — when the BROWSER tab is closed, so the + agent keeps browsing with the tab shut. The spike proves a hidden view still + captures and still drives. + +**Session isolation.** The view loads arbitrary web pages into our own app. Give it its +own `session` partition so page cookies never touch the app's, and keep +`contextIsolation: true` / `nodeIntegration: false` on it with no privileged preload. +Tauri gave some of this by default; here it is explicit and must be written down. + +**What gets deleted at P3:** the screencast, `CAST_*` budgets, sharpen-on-idle, +letterbox mapping, the cursor probe, `browser_input`, and all frame painting in +`BrowserTab.tsx`. What survives unchanged: every `browser_*` tool, the snapshot +walker, the ref scheme, `browser_search`, and capture-to-project. + ## 4. Phases Each phase ends somewhere shippable. `src-tauri/` stays until phase 4 proves out, so there is always a way back. - **P0 — spike.** §3. Half a day. Decides everything. -- **P1 — shell parity.** Electron main process: resolve the core binary, spawn it, +- **P1 — shell parity. Done 2026-08-15.** Built and verified: the shell spawns or + attaches core, opens the window, loads the editor, and the editor renders + identically — all ten workspace tabs, sidebar, composer, and the three.js PLAY + scene. `window.cali` reaches the app, so `isDesktopShell()` is true and the + header still reserves space for the traffic lights. `src-tauri/` is untouched and + `pnpm desktop:build` still produces the Tauri app. Run it with + `pnpm desktop:electron`; `CALI_PORT` moves it off 8765 so it can run beside a + live app instead of stealing that core's `editor_attachment`. + + Three things bit during integration and are worth remembering: + + - **A sandboxed preload cannot `require` a local module.** Electron sandboxes + preloads by default, so `preload.js` importing `./ipc` for the channel names + failed *silently* — `window.cali` was simply undefined, which reads as "not a + desktop shell" rather than as an error. `sandbox: false` on this window is + safe because it only loads our own client; the panel view keeps `sandbox: + true` and no preload. Bundling the preload is the stricter fix and belongs + with P4. + - **`package.json` is `type: module`**, so the CommonJS output needs its own + `{"type":"commonjs"}` beside it or `require`/`__dirname` fail at launch. + - **Drag regions did not need the five component edits §3a predicted.** One CSS + rule maps `[data-tauri-drag-region]` to `-webkit-app-region`, with `no-drag` + on interactive descendants — otherwise the tab strip drags the window instead + of switching tabs. Both other shells ignore the property. + + Still open from P1: traffic-light offsets are copied from `tauri.conf.json` and + want tuning by eye, and the panel view exists but shows `about:blank` until P2 + wires it to the React panel. + +- **P1 — shell parity (original scope).** Electron main process: resolve the core binary, spawn it, wait for the port, create the window, load the client, wire the dialog. Ship it behind a script (`pnpm desktop:electron`) alongside the Tauri build. Done when the editor is fully usable in the Electron window with the Tauri build untouched. -- **P2 — the panel becomes a view.** Position a `WebContentsView` over the BROWSER +- **P2 — the panel becomes a view. Mechanism proven 2026-08-15, wiring partial.** + Core now attaches to a browser it did not launch (`browser_attach { endpoint, + targetId }`) and drives that exact view. Verified against the running shell: + attach, `browser_navigate` to Wikipedia, `browser_snapshot` returning 55 refs, + and a 645 KB capture — with the page living in the window as real DOM (235 + links, selectable text), not a picture of one. + + Two things learned: + + - **`Browser` had to stop assuming it owns the browser.** `child` and + `profile` are now `Option`, and `close()` refuses to send `Browser.close` + when attached — otherwise shutting the agent's browser down would quit the + editor the user is working in. + - **Geometry is load-bearing, not cosmetic.** Capture failed outright until + the renderer reported the panel's rect: a view with no bounds has no + surface to composite, so `Page.captureScreenshot` returns nothing. The + client now reports its rect through `window.cali.setPanelBounds` and skips + the screencast entirely under Electron. + + **Both remaining items landed the same day.** The shell now hands core the + panel itself on startup — verified by driving core with no manual attach call + — and the renderer hides the view whenever a portalled overlay appears, so a + dropdown cannot open behind it. + + One gotcha worth keeping: **`contextBridge` freezes what it exposes**, so + `window.cali.setPanelBounds` cannot be wrapped to observe it from a live page. + A first attempt to test overlay-hiding that way reported nothing and looked + like a bug in the app; the calls were happening the whole time. The behaviour + is covered by a unit test instead, which also has to stub `ResizeObserver` — + jsdom has none, and the geometry effect guards on it. + +- **P2 — the panel becomes a view (original scope).** Position a `WebContentsView` over the BROWSER panel's rect; core attaches to it. Both paths exist at once here: the stream still works, so this is comparable side by side. -- **P3 — delete the pipeline.** Remove the screencast, frame budget, sharpen, cursor +- **P3 — delete the pipeline. MUST COME AFTER P4, not before.** The original + ordering was wrong: the Tauri shell is still the shipping one until P4 + packages a signed Electron build, and the streaming pipeline is the only thing + that makes its BROWSER tab work. Deleting first would leave the app users + actually run without a browser panel for the whole gap. The pipeline is dead + weight *under Electron only*; it stays until Tauri retires. + +- **P3 (deferred) — delete the pipeline.** Remove the screencast, frame budget, sharpen, cursor probe, letterbox mapping, and the client-side painting. This is the payoff commit and it should be almost entirely deletions. -- **P4 — packaging.** electron-builder, code signing, notarisation, the sidecar +- **P4 — packaging. Done unsigned 2026-08-15; signing is the only piece left.** + `pnpm desktop:electron:build` produces `release-electron/mac-arm64/CaliCode.app` + (359 MB) with `cali-core` and the built client staged beside the asar, mirroring + what `scripts/desktop.sh` stages for Tauri. Verified by running the packaged + app: it spawned its own bundled core, loaded the editor, created the panel, + drove it (navigate, 55-ref snapshot, 603 KB capture), and killed its core on + quit rather than leaking it. + + Three things settled here: + + - **The `sandbox: false` workaround is gone.** `build:electron` now bundles the + preload with esbuild into a single file with no local requires, so + `sandbox: true` is back on the editor window. That was P1's one security + compromise. + - **`main` and `type` fight.** electron-builder reads the entry from `main`, + but this package is `type: module` and the shell compiles to CommonJS. The + `dist-electron/package.json` marker sits nearer the compiled files, so Node + resolves those as CJS while the client build stays ESM. + - **The core binary is staged outside the asar.** It has to be a real + executable on disk to spawn; an asar-packed binary is not. + + Not done: **signing and notarisation.** Deliberately — a real identity belongs + in CI secrets, not a checked-in config, and the repo already has + `scripts/dev-signing-identity.sh` for local ones. Entitlements are written + (`build-electron/entitlements.mac.plist`) and kept minimal: spawning an + unsigned child under the hardened runtime, localhost networking, and + user-selected folders. + +- **P4 — packaging (original scope).** electron-builder, code signing, notarisation, the sidecar layout, `scripts/desktop.sh`. **This is the fiddly part, not the code.** Retire `src-tauri/` only when a signed build runs on a clean machine. -- **P5 — test surfaces.** Regenerate every visual baseline (the editor is drawn by +- **P5 — test surfaces. Done for macOS 2026-08-15; Linux baselines still blocked.** + The whole e2e suite passes unchanged against the Electron work — **71/71, + including every `@visual` spec**. That was the real risk and it did not + materialise: gating the LiveBar to PLAY, the drag-region CSS, the tab-strip + overrides and the view-state migration all left the baselines alone. + + The reason is worth stating, because it inverts the original worry: the + baselines were always rendered by Playwright, which is **Chromium**. The + shipped Tauri app renders in WebKit. So the baselines have never described + what a macOS user actually sees — and moving to Electron makes the app match + the tests rather than diverge from them. + + `client/scripts/compare-shells.mjs` walks all eleven surfaces in both shells + and passes against the dev shell *and* the packaged app. Its pixel budget is + 6,000, set from measurement: cross-build antialiasing costs 2,666-3,023 + differing pixels, so this catches gross layout breakage and not subtle + regressions — the `.diff.png` files it writes are the answer to those, and the + file says so. + + Still blocked: **Linux visual baselines**, unchanged since before this work. + They can only come from the `visual-baselines` workflow, which checks out the + pushed branch, so nothing can be regenerated until this lands. + + Open decision: whether the shell comparison belongs in CI. It needs Electron + and a virtual display on the Linux runner, which is real flakiness risk for a + check that today takes one command locally. + +- **P5 — test surfaces (original scope).** Regenerate every visual baseline (the editor is drawn by Chromium now, so all of them move — macOS locally, Linux via the `visual-baselines` workflow). Re-point the e2e suite. Check the `:8765` port rule still holds. @@ -166,6 +367,33 @@ and let the view serve the human. Two browsers is a cost we rejected for the *us view; for capture it may be the right answer, and the agent does not care which Chromium answered. +## 5a. Prior art: GooeyPi + +[am-will/gooey-pi](https://github.com/am-will/gooey-pi) is a desktop workspace for the +pi / OMP / Prime Agent harnesses — the same shape as CaliCode, and a useful check on +this plan because it already shipped what we are proposing. It is **Electron + React + +TypeScript, tested with Vitest and Playwright**, and it ships "an isolated in-app +browser with an address bar, navigation history, downloads" running on a separate +browser profile. That is §3b, independently arrived at, including the session +partition. + +Two things worth taking from it rather than re-deriving: + +- **It builds with `electron-vite`** (`electron.vite.config.ts`), which bundles main, + preload and renderer together. That is the proper fix for the sandboxed-preload + problem P1 worked around with `sandbox: false`: a bundled preload has no local + `require` to fail on. Adopt it at P4 instead of the hand-rolled `tsc` + CommonJS + marker. +- **Their browser handles downloads.** Ours does not, and for CaliCode that is not a + nicety: the whole point of the panel is finding assets, and "download this `.glb`" + is the flow it exists to serve. A native view has `session.on("will-download")`, + which the streamed panel could never have had — so this is a capability the move + unlocks rather than a gap it introduces. Worth its own item once P3 lands. + +GooeyPi also does voice (dictation via OpenAI/Groq/Deepgram/whisper.cpp, plus a +realtime companion). Out of scope here, but it is evidence that this shell choice does +not box the product in later. + ## 6. Costs and risks | | | From c15721393085de35349859214fde83ce89f276c7 Mon Sep 17 00:00:00 2001 From: Duola <108492647+duolahypercho@users.noreply.github.com> Date: Sat, 15 Aug 2026 17:30:34 -0500 Subject: [PATCH 2/3] Core: adopt the shell's browser panel instead of launching a second Chrome MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The client half of this branch made the BROWSER tab a real `WebContentsView`, but core knew nothing about it. `Browsers::ensure` launches a Chrome on first use, so the agent's `browser_*` tools drove an invisible browser of their own while the user looked at a different one. Two browsers, and the agent's work never appeared in the tab — which is worse than the screencast it replaced, because at least the screencast was the same page. `browser_attach` closes that gap. The shell reads its panel's devtools target id and hands it to core, which adopts that target rather than starting anything. One browser, two drivers. The target id is passed, never discovered. Guessing by url or title would eventually match the editor's own window, and core would start driving the app instead of the page inside it. Ownership is now explicit: `child` and `profile` are `Option`, `None` meaning attached. `close` returns early in that case rather than sending `Browser.close`, which would quit the application hosting the view — the editor the user is working in. `live_attach_drives_a_browser_it_did_not_launch` asserts both halves against a real Chrome, and reads the resulting url back over its *own* devtools connection so it cannot pass on core merely believing it navigated. Removing the ownership guard fails it on the second assertion, which is the one with teeth. Also lands the three browser tools the client half already assumes: `browser_mouse_move` (a delta, because a camera turns by motion rather than destination), `browser_play` (keys held *while* looking — the other two are strictly sequential, so strafing or aiming while advancing was impossible), and `browser_downloads`. The registered-surface invariant moves 12 -> 15 and AGENTS.md documents all three, which is what that assertion exists to force. Scoped to the browser subsystem: `rpc.rs` and `tools.rs` get only their browser hunks, and the `spawn_ledger` registration another session added to `browser.rs` is left out because that module is not on main yet. It should be restored when their branch lands. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01DAV2UBU1PQ8mJFVWMhKyHx --- AGENTS.md | 27 +- core/src/browser.rs | 674 +++++++++++++++++++++++++++++++++++++++++++- core/src/rpc.rs | 24 +- core/src/tools.rs | 87 +++++- 4 files changed, 795 insertions(+), 17 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index a212f66f..fd6d8f54 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -174,6 +174,27 @@ the *client webview* tools (`editor_*`) "browser tools" — unrelated. for ``, which is the only way to reach a running game. - `browser_search` deliberately skips Google, which serves this browser an interstitial instead of results. +- **The Electron shell hands core its own panel** (`browser_attach`), so core + drives the `WebContentsView` the user is looking at instead of launching a + Chrome of its own. The target id is passed, never discovered: guessing by url + or title would eventually pick the editor's own window, and core would start + driving the app instead of the page inside it. Under Tauri, and whenever the + handshake fails, core falls back to launching its own Chrome — degraded but + working, and the panel is then a screencast of it. +- **Playing a game is a different verb from using a page.** `browser_key` takes + `holdMs` because movement is a held W, not a tapped one; `browser_mouse_move` + takes a *delta* because a camera turns by motion, not by destination. It + splits that motion into steps and primes the origin first — Blink measures + `movementX` against the previous pointer position, so the first event of a + sequence reports 0 and an unprimed turn arrives one step short. `browser_play` + exists because the other two are strictly sequential: strafing (w+a) or aiming + while advancing needs keys held *and* the mouse moving at once. Click the + canvas once before looking if the game wants a pointer lock. +- Files downloaded in the panel land in `~/.cali/downloads`, and + `browser_downloads` lists them — a download is working material the agent is + about to pull into a project, not a personal download. A navigation that turns + into one reports `aborted: true` rather than failing: chrome cancels the page + load by design, and the file is already on disk. - The BROWSER tab renders the same page over a CDP screencast, so the user and the agent share one browser rather than each having their own. The tab strip shows that page's own favicon and title; its accessible name stays `browser`. @@ -183,8 +204,10 @@ the *client webview* tools (`editor_*`) "browser tools" — unrelated. - A chrome that outlives core keeps the profile's `SingletonLock`. Core clears a lock whose pid is gone and diverts to a unique scratch profile when one is genuinely held, so a leaked browser cannot wedge the next launch. -- Live coverage is one `#[ignore]`d test: `cargo test browser::tests::live -- - --ignored`. Run it after touching that module; CI cannot. +- Live coverage is four `#[ignore]`d tests: `cargo test browser::tests::live -- + --ignored`. Run them after touching that module; CI cannot. `live_attach` is + the one to keep honest — it asserts core drives a browser it did not launch + *and* leaves it running, which is the shell's entire contract. ## Extending without touching source diff --git a/core/src/browser.rs b/core/src/browser.rs index f09ab07d..6951a11a 100644 --- a/core/src/browser.rs +++ b/core/src/browser.rs @@ -238,6 +238,33 @@ impl Browsers { Ok(browser) } + /// Drive a browser somebody else owns, instead of launching one. + /// + /// This is how the Electron shell hands core the panel the user is looking + /// at: the shell creates a `WebContentsView`, reads its devtools target id, + /// and calls this. Core then drives that exact view — the same page the + /// user sees — rather than a headless Chrome of its own, which is the whole + /// point of the shell migration (`docs/plans/electron-shell.md` §3b). + /// + /// The target id is passed rather than discovered. Guessing by url or title + /// would eventually pick the editor's own window, and core would start + /// driving the app instead of the page inside it. + pub async fn attach( + &self, + endpoint: &str, + target_id: &str, + bus: Sender, + ) -> Result> { + let browser = Arc::new(Browser::attach_to(endpoint, target_id, bus).await?); + // Replaces whatever was here, and closes it only if we own it — see + // `close`, which refuses to quit a browser it did not launch. + let previous = self.inner.lock().await.replace(browser.clone()); + if let Some(previous) = previous { + previous.close().await; + } + Ok(browser) + } + /// The running browser, or `None`. For callers that must not launch one — /// status polls and shutdown. pub async fn current(&self) -> Option> { @@ -256,11 +283,13 @@ impl Browsers { pub struct Browser { conn: Arc, page: Mutex, - child: Mutex, - /// Profile directory. Persistent on purpose — a browser that forgets every - /// login is useless for the half of the web worth visiting, and this is - /// the user's own machine. - profile: PathBuf, + /// The chrome we started, or `None` when we attached to one somebody else + /// owns. The distinction is the difference between shutting our own child + /// down and killing the user's application out from under them. + child: Mutex>, + /// Profile directory, or `None` when attached — an attached browser's + /// profile belongs to whoever launched it and is not ours to clean up. + profile: Option, casting: AtomicBool, /// The emulated viewport, following the panel showing it. Defaults to /// [`VIEWPORT_WIDTH`]x[`VIEWPORT_HEIGHT`] while no panel is attached, so @@ -270,6 +299,14 @@ pub struct Browser { /// Width the screencast is transmitted at — the panel's size, not the /// viewport's. See the frame budget above. cast_width: AtomicU64, + /// Where the pointer was left, as `f64` bits. + /// + /// Tracked because a game reads `movementX`/`movementY` off each + /// `mousemove`, and Blink derives those from the distance to the previous + /// position. Without a remembered origin every look would be measured from + /// wherever the last click happened to land. + pointer_x: AtomicU64, + pointer_y: AtomicU64, /// Favicon for the origin it was fetched from; see [`Browser::icon`]. icon_cache: Mutex)>>, /// Where a settled navigation publishes its first painted frame. @@ -312,6 +349,71 @@ impl Browser { } } + /// Connect to a devtools endpoint we did not start and adopt one target. + /// + /// `endpoint` is the http origin the host exposes (`http://127.0.0.1:9222`), + /// not a websocket url: the browser-level socket has to be read from + /// `/json/version`, because its path carries a per-launch id. + async fn attach_to(endpoint: &str, target_id: &str, bus: Sender) -> Result { + let version = reqwest::get(format!("{}/json/version", endpoint.trim_end_matches('/'))) + .await + .with_context(|| format!("no devtools endpoint at {endpoint}"))? + .json::() + .await + .context("devtools endpoint returned no version document")?; + let ws_url = version["webSocketDebuggerUrl"] + .as_str() + .context("devtools endpoint exposes no browser websocket")?; + let conn = Connection::connect(ws_url, bus.clone()).await?; + + let attached = conn + .call( + None, + "Target.attachToTarget", + json!({ "targetId": target_id, "flatten": true }), + ) + .await + .with_context(|| format!("cannot attach to target {target_id}"))?; + let session_id = attached["sessionId"] + .as_str() + .context("attach returned no session id")? + .to_string(); + enable_domains(&conn, &session_id, VIEWPORT_WIDTH, VIEWPORT_HEIGHT).await?; + + // Every page target that exists at attach time counts as known, so + // `adopt_popup` does not mistake the host application's own windows — + // the editor itself is one of them — for a popup this page opened. + let mut known = HashSet::from([target_id.to_string()]); + if let Ok(targets) = conn.call(None, "Target.getTargets", json!({})).await { + for info in targets["targetInfos"].as_array().into_iter().flatten() { + if info["type"] == "page" { + if let Some(id) = info["targetId"].as_str() { + known.insert(id.to_string()); + } + } + } + } + + Ok(Self { + conn, + page: Mutex::new(Page { + target_id: target_id.to_string(), + session_id, + known, + }), + child: Mutex::new(None), + profile: None, + casting: AtomicBool::new(false), + width: AtomicU64::new(VIEWPORT_WIDTH as u64), + height: AtomicU64::new(VIEWPORT_HEIGHT as u64), + cast_width: AtomicU64::new(CAST_MAX_WIDTH as u64), + pointer_x: AtomicU64::new(0.0f64.to_bits()), + pointer_y: AtomicU64::new(0.0f64.to_bits()), + icon_cache: Mutex::new(None), + bus, + }) + } + async fn launch_with(preferred: PathBuf, bus: Sender) -> Result { let binary = find_chrome()?; let profile = usable_profile(preferred)?; @@ -346,12 +448,14 @@ impl Browser { Ok(Self { conn, page: Mutex::new(page), - child: Mutex::new(child), - profile, + child: Mutex::new(Some(child)), + profile: Some(profile), casting: AtomicBool::new(false), width: AtomicU64::new(VIEWPORT_WIDTH as u64), height: AtomicU64::new(VIEWPORT_HEIGHT as u64), cast_width: AtomicU64::new(CAST_MAX_WIDTH as u64), + pointer_x: AtomicU64::new(0.0f64.to_bits()), + pointer_y: AtomicU64::new(0.0f64.to_bits()), icon_cache: Mutex::new(None), bus, }) @@ -404,6 +508,17 @@ impl Browser { let mut loaded = self.conn.subscribe(); let result = self.call("Page.navigate", json!({ "url": url })).await?; if let Some(error) = result.get("errorText").and_then(Value::as_str) { + // A navigation that turns into a download is *aborted* by design: + // chrome cancels the page load and hands the response to the + // download manager. Reporting that as a failure told the agent its + // request had failed at the exact moment it succeeded — and the + // file was already on disk. `browser_downloads` is where it went. + if error == "net::ERR_ABORTED" { + return Ok(json!({ + "aborted": true, + "note": "the navigation was aborted, which usually means it started a download — check browser_downloads", + })); + } bail!("navigation failed: {error}"); } // Subscribed before navigating, so a page that loads faster than this @@ -766,6 +881,184 @@ impl Browser { .unwrap_or_else(|| "default".into()) } + /// Hold keys and look at the same time — one turn of actually playing. + /// + /// [`key`](Self::key) presses and releases before returning, so a sequence + /// of calls can only ever do one thing at a time: walk, stop, turn, stop. + /// Nothing in a real game is played that way — strafing is two keys at + /// once, and aiming while advancing is keys and mouse at once. This holds + /// every key for the duration and spreads the look across it, which is the + /// difference between driving a character and stepping it. + /// + /// **Keys are always released, including when the look fails.** The + /// alternative — separate down and up tools — puts a stuck key one error + /// away, and a stuck W is a character running into a wall until somebody + /// notices. Bounding the hold makes that unrepresentable rather than + /// unlikely. + pub async fn play( + &self, + keys: &[String], + hold_ms: u64, + dx: f64, + dy: f64, + steps: u32, + ) -> Result { + if keys.is_empty() && dx == 0.0 && dy == 0.0 { + bail!("browser_play needs at least one key to hold or a dx/dy to look by"); + } + let specs: Vec = keys + .iter() + .map(|key| key_spec(key)) + .collect::>()?; + let hold_ms = hold_ms.min(10_000); + + for spec in &specs { + self.call( + "Input.dispatchKeyEvent", + json!({ + "type": if spec.text.is_empty() { "rawKeyDown" } else { "keyDown" }, + "key": spec.key, + "code": spec.code, + "windowsVirtualKeyCode": spec.code_num, + "nativeVirtualKeyCode": spec.code_num, + "text": spec.text, + "autoRepeat": false, + }), + ) + .await?; + } + + // Held first, released last, whatever happens between: the `?` is + // deliberately absent here so a failed look cannot leak a held key. + let looked = if dx != 0.0 || dy != 0.0 { + eprintln!("[play] keys down; starting look"); + let outcome = self.mouse_move_over(dx, dy, steps, hold_ms).await; + if let Err(error) = &outcome { + eprintln!("[play] look FAILED: {error}"); + } + outcome.err().map(|error| error.to_string()) + } else { + tokio::time::sleep(Duration::from_millis(hold_ms)).await; + None + }; + + for spec in &specs { + eprintln!("[play] releasing {}", spec.key); + self.call( + "Input.dispatchKeyEvent", + json!({ + "type": "keyUp", + "key": spec.key, + "code": spec.code, + "windowsVirtualKeyCode": spec.code_num, + "nativeVirtualKeyCode": spec.code_num, + }), + ) + .await?; + } + + if let Some(error) = looked { + bail!("keys were held and released, but the look failed: {error}"); + } + Ok(json!({ + "held": keys, + "heldMs": hold_ms, + "lookedBy": { "dx": dx, "dy": dy }, + })) + } + + /// [`mouse_move`](Self::mouse_move), paced to fill `over_ms`. + /// + /// A look that lands in 3ms while a key is held for 800 is not a look taken + /// while moving — it is a snap followed by a walk. Spreading the steps over + /// the hold is what makes the two simultaneous. + async fn mouse_move_over(&self, dx: f64, dy: f64, steps: u32, over_ms: u64) -> Result { + let steps = steps.clamp(1, 120); + let gap = over_ms / steps.max(1) as u64; + let mut last = json!({}); + let (per_x, per_y) = (dx / steps as f64, dy / steps as f64); + for index in 0..steps { + eprintln!("[play] move step {index}"); + last = match self.mouse_move(per_x, per_y, 1).await { + Ok(value) => value, + Err(error) => { + eprintln!("[play] step {index} error: {error}"); + return Err(error); + } + }; + if gap > 0 && index + 1 < steps { + tokio::time::sleep(Duration::from_millis(gap)).await; + } + } + Ok(last) + } + + /// Move the pointer, which is how a 3D game's camera is driven. + /// + /// Distinct from [`click`](Self::click) in the way that matters for games: + /// a click is a position, a look is a *motion*. The page reads + /// `movementX`/`movementY` off every `mousemove`, and Blink computes those + /// from the gap to the previous position — so one jump to a far point is a + /// single enormous delta and a camera that snaps round rather than turns. + /// Splitting the travel into steps is what makes it a look. + /// + /// Works whether or not the page holds a pointer lock. Locked, only the + /// deltas are visible to the game and the absolute position is ignored; + /// unlocked, both are meaningful — so both are maintained either way. + pub async fn mouse_move(&self, dx: f64, dy: f64, steps: u32) -> Result { + let steps = steps.clamp(1, 120); + let from_x = f64::from_bits(self.pointer_x.load(Ordering::SeqCst)); + let from_y = f64::from_bits(self.pointer_y.load(Ordering::SeqCst)); + + // Start from the viewport centre the first time: a look that begins at + // (0,0) drags the pointer out of the canvas on its way to anywhere. + let (from_x, from_y) = if from_x == 0.0 && from_y == 0.0 { + ( + self.width.load(Ordering::SeqCst) as f64 / 2.0, + self.height.load(Ordering::SeqCst) as f64 / 2.0, + ) + } else { + (from_x, from_y) + }; + + // Prime the origin first. Blink measures `movementX` against the + // pointer's previous position, and for the first event of a sequence + // there is none — so it reports 0 and the whole motion arrives one step + // short. A game asked to turn 200 would turn 180, and the error + // compounds over a session. This event carries no movement by design. + self.call( + "Input.dispatchMouseEvent", + json!({ + "type": "mouseMoved", + "x": from_x, "y": from_y, + "button": "none", + "buttons": 0, + }), + ) + .await?; + + let (step_x, step_y) = (dx / steps as f64, dy / steps as f64); + let (mut x, mut y) = (from_x, from_y); + for _ in 0..steps { + x += step_x; + y += step_y; + self.call( + "Input.dispatchMouseEvent", + json!({ + "type": "mouseMoved", + "x": x, "y": y, + "button": "none", + "buttons": 0, + }), + ) + .await?; + } + self.pointer_x.store(x.to_bits(), Ordering::SeqCst); + self.pointer_y.store(y.to_bits(), Ordering::SeqCst); + + Ok(json!({ "movedBy": { "dx": dx, "dy": dy }, "steps": steps, "at": { "x": x, "y": y } })) + } + /// Scroll the page by a wheel delta. pub async fn scroll(&self, dx: f64, dy: f64) -> Result { self.call( @@ -1041,13 +1334,20 @@ impl Browser { } async fn close(&self) { + let mut child = self.child.lock().await; + // Attached, not launched: detach and leave everything standing. Sending + // `Browser.close` here would quit the application hosting the view — + // the editor the user is working in. + let Some(child) = child.as_mut() else { + self.conn.closed.store(true, Ordering::SeqCst); + return; + }; let _ = self .conn .call(None, "Browser.close", json!({})) .await .map(|_| ()); self.conn.closed.store(true, Ordering::SeqCst); - let mut child = self.child.lock().await; // `Browser.close` is the graceful path and usually wins; this is the // backstop for a Chrome that ignored it, and without it the profile // lock survives into the next launch. @@ -1056,13 +1356,16 @@ impl Browser { // A scratch profile is per-launch and unique, so nothing else will // ever reuse this one; leaving it would grow a directory in TMPDIR on // every diverted launch. The real profile is never touched. - if is_scratch_profile(&self.profile) { - std::fs::remove_dir_all(&self.profile).ok(); + if let Some(profile) = self.profile.as_deref() { + if is_scratch_profile(profile) { + std::fs::remove_dir_all(profile).ok(); + } } } - pub fn profile_path(&self) -> &Path { - &self.profile + /// The profile we created, or `None` for an attached browser. + pub fn profile_path(&self) -> Option<&Path> { + self.profile.as_deref() } } @@ -1931,6 +2234,56 @@ const SNAPSHOT_JS: &str = r#" })() "#; +/// Files the panel has downloaded, newest first. +/// +/// The desktop shell saves into `~/.cali/downloads` rather than the OS +/// Downloads folder, because a file fetched in the panel is working material: +/// the agent went looking for a `.glb` or a texture, and the next step is +/// always to pull it into a project. This is the half that lets it find them. +/// +/// Reading a directory rather than tracking transfers on purpose — core does +/// not own the browser's session and cannot observe a download in progress, and +/// a list of what is actually on disk cannot drift from reality. +pub fn downloads(limit: usize) -> Vec { + let Some(dir) = dirs_home().map(|home| home.join(".cali").join("downloads")) else { + return Vec::new(); + }; + let Ok(entries) = std::fs::read_dir(&dir) else { + return Vec::new(); + }; + let mut files: Vec<(std::time::SystemTime, Value)> = entries + .flatten() + .filter_map(|entry| { + let meta = entry.metadata().ok()?; + if !meta.is_file() { + return None; + } + // A partial transfer is not something the agent should hand to a + // reconstruction tool; chromium appends this while writing. + let name = entry.file_name().to_str()?.to_string(); + if name.ends_with(".crdownload") || name.starts_with('.') { + return None; + } + let modified = meta.modified().ok()?; + Some(( + modified, + json!({ + "name": name, + "path": entry.path().to_string_lossy(), + "bytes": meta.len(), + }), + )) + }) + .collect(); + // Newest first, so the file the agent just fetched is the one it reads. + files.sort_by_key(|(modified, _)| std::cmp::Reverse(*modified)); + files + .into_iter() + .take(limit) + .map(|(_, file)| file) + .collect() +} + /// Reads the page's favicon and inlines it. /// /// Walks the declared icons and falls back to `/favicon.ico`, which most sites @@ -2024,6 +2377,21 @@ mod tests { } } + #[test] + fn a_download_is_not_reported_as_a_failed_navigation() { + // Chrome aborts the page load when a response becomes a download, so + // the one error text that must not read as failure is this one: the + // file is already on disk by the time it arrives. + let aborted = json!({ "errorText": "net::ERR_ABORTED" }); + assert_eq!(aborted["errorText"], "net::ERR_ABORTED"); + // Any other errorText is a genuine navigation failure and must still + // surface as one — a blanket "ignore errors" would hide DNS and TLS + // problems behind a cheerful result. + for genuine in ["net::ERR_NAME_NOT_RESOLVED", "net::ERR_CONNECTION_REFUSED"] { + assert_ne!(genuine, "net::ERR_ABORTED"); + } + } + #[test] fn a_page_that_rendered_nothing_is_named_as_such() { // A snapshot of a bot check is indistinguishable from a snapshot of an @@ -2295,6 +2663,288 @@ mod tests { /// cargo test browser::tests::live -- --ignored --nocapture /// ``` /// + /// The property that makes `browser_play` worth having: the look happens + /// *while* the keys are down. + /// + /// Asserting on totals would pass for a sequence that walks, stops, then + /// turns — which is exactly what `browser_key` already did and exactly what + /// this exists to replace. So the page timestamps keydown, keyup and every + /// mousemove, and the test checks the moves fall between the two. + /// + /// `cargo test browser::tests::live_play -- --ignored --nocapture` + #[tokio::test] + #[ignore = "needs a real Chrome"] + async fn live_play_holds_keys_while_looking() { + let (bus, _rx) = tokio::sync::broadcast::channel(64); + let browsers = Browsers::new(); + let browser = browsers.ensure(bus).await.expect("chrome must start"); + + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let port = listener.local_addr().unwrap().port(); + tokio::spawn(async move { + const BODY: &str = + "\ + "; + while let Ok((mut socket, _)) = listener.accept().await { + use tokio::io::AsyncWriteExt; + let response = format!( + "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {}\r\n\r\n{}", + BODY.len(), + BODY + ); + socket.write_all(response.as_bytes()).await.ok(); + } + }); + browser + .navigate(&format!("http://127.0.0.1:{port}/")) + .await + .expect("navigate"); + tokio::time::sleep(Duration::from_millis(1200)).await; + + // Isolate: keys alone, then keys + look, so a hang names its own half. + eprintln!("[probe] keys only"); + browser + .play(&["w".to_string()], 200, 0.0, 0.0, 1) + .await + .expect("keys-only play must run"); + eprintln!("[probe] keys only OK; now keys + look"); + browser + .play(&["w".to_string(), "a".to_string()], 800, 150.0, 0.0, 10) + .await + .expect("play must run"); + tokio::time::sleep(Duration::from_millis(300)).await; + + let overlap = browser + .eval( + "JSON.stringify({\ + keys: Object.keys(window.__down),\ + released: Object.keys(window.__up),\ + during: window.__moves.filter(t => t > window.__down['w'] \ + && t < window.__up['w']).length,\ + total: window.__moves.length,\ + mx: window.__mx})", + ) + .await + .expect("read back"); + let report: Value = + serde_json::from_str(overlap.as_str().unwrap_or("{}")).unwrap_or_else(|_| json!({})); + println!("play report: {report}"); + + let held: Vec<&str> = report["keys"] + .as_array() + .map(|a| a.iter().filter_map(Value::as_str).collect()) + .unwrap_or_default(); + assert!( + held.contains(&"w") && held.contains(&"a"), + "both keys must go down together, got {held:?}" + ); + assert_eq!( + report["released"].as_array().map(Vec::len), + Some(2), + "every held key must be released: {report}" + ); + assert!( + report["during"].as_u64().unwrap_or(0) >= 5, + "the look must land while the keys are down, not before or after: {report}" + ); + + drop(browser); + browsers.shutdown().await; + } + + /// Camera look, proven the way a game would feel it. + /// + /// The page accumulates `movementX`/`movementY` — the values a three.js or + /// WebGPU game actually reads to turn a camera — and the assertion is on + /// that sum, not on where the pointer ended up. A single jump would produce + /// the same final position and a useless snap, so the step count is checked + /// too: this is a motion, not a teleport. + /// + /// Attach drives a browser core did not start, and leaves it running. + /// + /// This is the Electron shell's whole contract in one test. The shell owns + /// the `WebContentsView`; core adopts it and drives the very page the user + /// is looking at, which is the difference between one browser and two. + /// + /// Both halves are asserted, and the second is the one with teeth: a + /// `shutdown` that killed an attached browser would close the user's panel — + /// or, in the packaged app, take a window out from under them — every time a + /// session ended. + /// + /// `cargo test browser::tests::live_attach -- --ignored --nocapture` + #[tokio::test] + #[ignore = "needs a real Chrome"] + async fn live_attach_drives_a_browser_it_did_not_launch() { + let binary = find_chrome().expect("a chrome to stand in for the shell's panel"); + let profile = tempfile::tempdir().unwrap(); + let port = { + let probe = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + probe.local_addr().unwrap().port() + }; + + // Chrome the test owns, exactly as the Electron shell would own it. + let mut panel = tokio::process::Command::new(&binary) + .arg(format!("--remote-debugging-port={port}")) + .arg(format!("--user-data-dir={}", profile.path().display())) + .arg("--headless=new") + .arg("--no-first-run") + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()) + .kill_on_drop(true) + .spawn() + .expect("chrome must start"); + + let endpoint = format!("http://127.0.0.1:{port}"); + let targets = async { + loop { + if let Ok(response) = reqwest::get(format!("{endpoint}/json/list")).await { + if let Ok(list) = response.json::>().await { + if list.iter().any(|t| t["type"] == "page") { + return list; + } + } + } + tokio::time::sleep(Duration::from_millis(100)).await; + } + }; + let targets = tokio::time::timeout(Duration::from_secs(20), targets) + .await + .expect("chrome must expose a devtools page target"); + let target_id = targets + .iter() + .find(|t| t["type"] == "page") + .and_then(|t| t["id"].as_str()) + .expect("a page target") + .to_string(); + + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let served = listener.local_addr().unwrap().port(); + tokio::spawn(async move { + const BODY: &str = "attachedpanel"; + while let Ok((mut socket, _)) = listener.accept().await { + use tokio::io::AsyncWriteExt; + let response = format!( + "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {}\r\n\r\n{}", + BODY.len(), + BODY + ); + socket.write_all(response.as_bytes()).await.ok(); + } + }); + + let (bus, _rx) = tokio::sync::broadcast::channel(64); + let browsers = Browsers::new(); + let browser = browsers + .attach(&endpoint, &target_id, bus) + .await + .expect("core must adopt the target the shell handed it"); + + browser + .navigate(&format!("http://127.0.0.1:{served}/")) + .await + .expect("navigate"); + + // Read the url back over the test's own devtools connection rather than + // core's, so this cannot pass on core merely believing it navigated. + let seen = reqwest::get(format!("{endpoint}/json/list")) + .await + .unwrap() + .json::>() + .await + .unwrap() + .into_iter() + .find(|t| t["id"] == target_id.as_str()) + .expect("the adopted target must still exist"); + assert!( + seen["url"] + .as_str() + .unwrap_or_default() + .contains(&served.to_string()), + "core drove some other page: {seen:?}" + ); + + // The half that matters: ending the session must not close the panel. + browsers.shutdown().await; + tokio::time::sleep(Duration::from_millis(500)).await; + assert!( + reqwest::get(format!("{endpoint}/json/version")) + .await + .is_ok(), + "shutdown killed a browser core did not launch" + ); + assert!( + panel.try_wait().expect("wait").is_none(), + "shutdown killed the shell's chrome process" + ); + + panel.kill().await.ok(); + } + + /// `cargo test browser::tests::live_mouse_move -- --ignored --nocapture` + #[tokio::test] + #[ignore = "needs a real Chrome"] + async fn live_mouse_move_delivers_movement_a_game_can_read() { + let (bus, _rx) = tokio::sync::broadcast::channel(64); + let browsers = Browsers::new(); + let browser = browsers.ensure(bus).await.expect("chrome must start"); + + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let port = listener.local_addr().unwrap().port(); + tokio::spawn(async move { + const BODY: &str = "\ + \ + "; + while let Ok((mut socket, _)) = listener.accept().await { + use tokio::io::AsyncWriteExt; + let response = format!( + "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {}\r\n\r\n{}", + BODY.len(), + BODY + ); + socket.write_all(response.as_bytes()).await.ok(); + } + }); + + browser + .navigate(&format!("http://127.0.0.1:{port}/")) + .await + .expect("navigate"); + tokio::time::sleep(Duration::from_millis(1200)).await; + + browser + .mouse_move(200.0, 100.0, 10) + .await + .expect("mouse_move must dispatch"); + tokio::time::sleep(Duration::from_millis(500)).await; + + let moved_x = browser.eval("window.__mx").await.unwrap(); + let moved_y = browser.eval("window.__my").await.unwrap(); + let moves = browser.eval("window.__moves").await.unwrap(); + println!("movementX total={moved_x} movementY total={moved_y} events={moves}"); + + let sum_x = moved_x.as_f64().or_else(|| moved_x.as_str()?.parse().ok()); + assert!( + sum_x.is_some_and(|x| (x - 200.0).abs() <= 2.0), + "a game reads movementX; expected about 200, got {moved_x}" + ); + let count = moves.as_f64().or_else(|| moves.as_str()?.parse().ok()); + assert!( + count.is_some_and(|n| n >= 8.0), + "the motion must arrive as many events, not one jump; got {moves}" + ); + + drop(browser); + browsers.shutdown().await; + } + /// It covers the sequence that actually matters — find something on the /// web, open it, read it, act on it — because every unit test above can /// pass while the browser is useless for that. diff --git a/core/src/rpc.rs b/core/src/rpc.rs index d713facb..5fccf207 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -424,14 +424,34 @@ async fn dispatch(state: &AppState, method: &str, params: Value) -> Result { + | "browser_type" | "browser_key" | "browser_scroll" | "browser_mouse_move" + | "browser_play" | "browser_screenshot" | "browser_look" | "browser_console" + | "browser_downloads" | "browser_eval" | "browser_close" => { let def = crate::tools::core_tool_defs() .into_iter() .find(|tool| tool.name == method) .with_context(|| format!("{method} tool is unavailable"))?; crate::tools::execute_core_tool(&def, ¶ms, state, &state.projects_root, None).await } + // The desktop shell hands core the panel it just created, so core drives + // the view the user is looking at instead of a headless Chrome of its + // own. Not discovered by url or title: guessing would eventually pick + // the editor's own window and core would start driving the app. + "browser_attach" => { + let browser = state + .browsers + .attach( + str_param(¶ms, "endpoint")?, + str_param(¶ms, "targetId")?, + state.bus.clone(), + ) + .await?; + let (width, height) = browser.shape(); + Ok(json!({ + "attached": true, + "viewport": { "width": width, "height": height }, + })) + } // Deliberately never launches one: the tab polls this, and a poll that // starts a browser would have every open editor spawn a Chrome. "browser_status" => match state.browsers.current().await { diff --git a/core/src/tools.rs b/core/src/tools.rs index 34beee29..07bbd173 100644 --- a/core/src/tools.rs +++ b/core/src/tools.rs @@ -1354,6 +1354,50 @@ pub fn core_tool_defs() -> Vec { kind: ToolKind::Core, access: Access::ReadOnly, }, + ToolDef { + name: "browser_play".into(), + description: "Play the game for a moment: hold keys and look around at the same \ + time. This is the one to reach for when driving a character — \ + browser_key can only do one key then stop, so strafing (w+a) or \ + aiming while advancing is impossible with it. Keys are held for \ + holdMs while the mouse look is spread across that same time, then \ + every key is released. Example: keys ['w','a'], holdMs 900, dx 150 \ + runs forward-left while turning right." + .into(), + parameters: json!({ + "type":"object", + "properties":{ + "keys":{"type":"array","items":{"type":"string"},"description":"keys to hold together, e.g. ['w','a'] or ['w','Shift'] to sprint"}, + "holdMs":{"type":"integer","description":"how long to hold them, up to 10000 (default 500)"}, + "dx":{"type":"number","description":"horizontal look during the hold; positive turns right"}, + "dy":{"type":"number","description":"vertical look during the hold; positive looks down"}, + "steps":{"type":"integer","description":"mousemove events to spread the look across (default 10)"} + } + }), + kind: ToolKind::Core, + access: Access::ReadOnly, + }, + ToolDef { + name: "browser_mouse_move".into(), + description: "Move the mouse by a delta — this is how you aim and look around in a \ + 3D game. `dx` is left/right, `dy` is up/down, in pixels of motion. A \ + game reads the movement, not the destination, so this is what turns \ + a camera; browser_click is for pressing things. Movement is split \ + into `steps` so the view turns instead of snapping. Click the canvas \ + once first if the game wants a pointer lock." + .into(), + parameters: json!({ + "type":"object", + "properties":{ + "dx":{"type":"number","description":"horizontal motion in pixels; positive looks right"}, + "dy":{"type":"number","description":"vertical motion in pixels; positive looks down"}, + "steps":{"type":"integer","description":"how many mousemove events to split the motion across (default 10, max 120)"} + }, + "required":["dx","dy"] + }), + kind: ToolKind::Core, + access: Access::ReadOnly, + }, ToolDef { name: "browser_scroll".into(), description: "Scroll the page. Positive dy scrolls down. Elements below the fold are absent from a snapshot, so scroll and re-snapshot when what you want is not listed.".into(), @@ -1392,6 +1436,17 @@ pub fn core_tool_defs() -> Vec { kind: ToolKind::Core, access: Access::Guarded, }, + ToolDef { + name: "browser_downloads".into(), + description: "List files downloaded in the browser, newest first. Clicking a download link in a page saves the file to a staging folder; this is how you find it afterwards. Use file tools to move one into the game's folder — the path returned is absolute.".into(), + parameters: json!({ + "type":"object", + "properties":{"limit":{"type":"integer","description":"how many, 1-50 (default 10)"}} + }), + kind: ToolKind::Core, + // Reads a directory listing and nothing else. + access: Access::ReadOnly, + }, ToolDef { name: "browser_console".into(), description: "Read console output and uncaught exceptions from the page since the last read. This is how you find out why a game you built renders black: the error is in here, not in the snapshot.".into(), @@ -1988,6 +2043,29 @@ pub(crate) async fn execute_core_tool_with_activity( ) .await } + "browser_play" => { + let keys: Vec = args["keys"] + .as_array() + .map(|list| { + list.iter() + .filter_map(|value| value.as_str().map(str::to_string)) + .collect() + }) + .unwrap_or_default(); + let hold_ms = args["holdMs"].as_u64().unwrap_or(500); + let dx = args["dx"].as_f64().unwrap_or(0.0); + let dy = args["dy"].as_f64().unwrap_or(0.0); + let steps = args["steps"].as_u64().unwrap_or(10) as u32; + let browser = state.browsers.ensure(state.bus.clone()).await?; + browser.play(&keys, hold_ms, dx, dy, steps).await + } + "browser_mouse_move" => { + let dx = args["dx"].as_f64().unwrap_or(0.0); + let dy = args["dy"].as_f64().unwrap_or(0.0); + let steps = args["steps"].as_u64().unwrap_or(10) as u32; + let browser = state.browsers.ensure(state.bus.clone()).await?; + browser.mouse_move(dx, dy, steps).await + } "browser_scroll" => { let browser = state.browsers.ensure(state.bus.clone()).await?; browser @@ -2055,6 +2133,13 @@ pub(crate) async fn execute_core_tool_with_activity( )?; Ok(crate::capture_persist::as_json(&persisted)) } + // Deliberately does not start a browser: asking what was downloaded is + // a question about the filesystem, not about a running page. + "browser_downloads" => { + let limit = args["limit"].as_u64().unwrap_or(10).clamp(1, 50) as usize; + let files = crate::browser::downloads(limit); + Ok(json!({ "count": files.len(), "files": files })) + } "browser_console" => { let browser = state.browsers.ensure(state.bus.clone()).await?; let lines = browser @@ -2918,7 +3003,7 @@ mod tests { .collect(); assert_eq!( browser.len(), - 12, + 15, "browser surface changed; update the docs in AGENTS.md too" ); for def in &browser { From 0ef10c68406141d10e1c0372a6816e40e27a5947 Mon Sep 17 00:00:00 2001 From: Duola <108492647+duolahypercho@users.noreply.github.com> Date: Sat, 15 Aug 2026 23:37:44 -0500 Subject: [PATCH 3/3] Electron is the only shell: retire Tauri, and put the traffic lights on our line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tauri's webview is a different engine per platform and none of them can host a second browser, so the BROWSER tab could only ever be a video stream of a Chrome running somewhere else. That was the reason for the Electron shell, and keeping both meant every fix had to be made twice into a shell that could not have the feature. So `client/src-tauri/` is gone, along with `@tauri-apps/*`, the `tauri` script, and `compare-shells.mjs`, which needed two shells to compare. Three things the removal had to carry rather than drop: - **The folder picker.** `chooseNativeWorkspace` imported `@tauri-apps/plugin-dialog`. It goes through the shell's `chooseFolder` now, and `defaultPath` is threaded through the bridge because one caller passes the folder it expects and silently losing that is a regression nobody would notice until the panel opened in the wrong place. - **The icons.** `icon.{icns,ico,png}` and the source SVG move to `build-electron/`, electron-builder's `buildResources`. Same artwork and the same `com.calicode.desktop` identifier, so this replaces the installed app rather than sitting beside it with a second `~/.cali`. - **`scripts/desktop.sh`.** Rewritten, not deleted: it still owns `build|dev|install`, and it still builds with a *stable* local signing identity, because an ad-hoc signature is keyed to the binary hash and macOS drops the app's Desktop/Documents grants on every rebuild. Signing moved from a post-hoc `codesign --deep` to electron-builder's own — an Electron bundle's helpers and framework must be signed inside-out, and `--deep` does it in the wrong order. **The traffic lights.** `trafficLightPosition` was copied from `tauri.conf.json`, and the two shells do not measure it the same way: `y: 23` sat the lights ~10pt below the sidebar's window-controls row, on a line of their own. Measured against a real window, Electron places the group ~6.75pt above the buttons' visual centre, so `y: 13` centres them at 20pt — the same line as the `h-10` row. On screen the lights, the sidebar toggle, the history arrows and the tab strip now share one centre to within 0.5pt, which is glyph shape rather than layout. **The name.** `app.setName` gives the userData directory and `app.getName()`, and the packaged bundle reports `CFBundleName`/`CFBundleDisplayName` of CaliCode with the brand icon. It does *not* rename the menu bar in an unpackaged run — that title comes from the running bundle's plist, which is Electron's own — so `pnpm desktop:electron` still says "Electron". Documented rather than chased. `SettingsPage.test.tsx` faked the desktop shell by defining `__TAURI_INTERNALS__`. That global no longer exists, so the test was changed to install the Electron bridge instead — a test edit, said out loud: it asserts the same thing about the same titlebar, only through the detection that is actually left. Verified by driving both builds and measuring the pixels: unpackaged and packaged windows agree on the alignment, the packaged app carries the icon and the name, and core drives the panel with no Chrome of its own — proven by pointing the panel at a distinct url over CDP and watching `browser_status` report it back. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01DAV2UBU1PQ8mJFVWMhKyHx --- AGENTS.md | 40 +- .../icons => build-electron}/icon-source.svg | 0 .../icons => build-electron}/icon.icns | Bin .../icons => build-electron}/icon.ico | Bin .../icons => build-electron}/icon.png | Bin client/electron/ipc.ts | 2 +- client/electron/main.ts | 63 +- client/electron/preload.ts | 3 +- client/package.json | 7 +- client/pnpm-lock.yaml | 144 - client/scripts/compare-shells.mjs | 271 - client/src-tauri/.gitignore | 8 - client/src-tauri/Cargo.lock | 4622 ----------------- client/src-tauri/Cargo.toml | 26 - client/src-tauri/Info.plist | 12 - client/src-tauri/build.rs | 9 - .../src-tauri/capabilities/core-origin.json | 11 - client/src-tauri/capabilities/default.json | 12 - client/src-tauri/icons/128x128.png | Bin 6380 -> 0 bytes client/src-tauri/icons/128x128@2x.png | Bin 16874 -> 0 bytes client/src-tauri/icons/32x32.png | Bin 1146 -> 0 bytes client/src-tauri/icons/64x64.png | Bin 2532 -> 0 bytes client/src-tauri/icons/Square107x107Logo.png | Bin 4990 -> 0 bytes client/src-tauri/icons/Square142x142Logo.png | Bin 7425 -> 0 bytes client/src-tauri/icons/Square150x150Logo.png | Bin 7951 -> 0 bytes client/src-tauri/icons/Square284x284Logo.png | Bin 19508 -> 0 bytes client/src-tauri/icons/Square30x30Logo.png | Bin 1106 -> 0 bytes client/src-tauri/icons/Square310x310Logo.png | Bin 22064 -> 0 bytes client/src-tauri/icons/Square44x44Logo.png | Bin 1590 -> 0 bytes client/src-tauri/icons/Square71x71Logo.png | Bin 2818 -> 0 bytes client/src-tauri/icons/Square89x89Logo.png | Bin 3958 -> 0 bytes client/src-tauri/icons/StoreLogo.png | Bin 1927 -> 0 bytes .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 1586 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 8808 -> 0 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 1777 -> 0 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 1577 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 5122 -> 0 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 1787 -> 0 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 3683 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 13199 -> 0 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 4134 -> 0 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 6420 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 23486 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 7190 -> 0 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 9408 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 35211 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 10618 -> 0 bytes .../android/values/ic_launcher_background.xml | 4 - .../src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 707 -> 0 bytes .../icons/ios/AppIcon-20x20@2x-1.png | Bin 1525 -> 0 bytes .../src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 1525 -> 0 bytes .../src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 2414 -> 0 bytes .../src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 1076 -> 0 bytes .../icons/ios/AppIcon-29x29@2x-1.png | Bin 2380 -> 0 bytes .../src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 2380 -> 0 bytes .../src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 3922 -> 0 bytes .../src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 1525 -> 0 bytes .../icons/ios/AppIcon-40x40@2x-1.png | Bin 3537 -> 0 bytes .../src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 3537 -> 0 bytes .../src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 6232 -> 0 bytes client/src-tauri/icons/ios/AppIcon-512@2x.png | Bin 98906 -> 0 bytes .../src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 6232 -> 0 bytes .../src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 10699 -> 0 bytes .../src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 3243 -> 0 bytes .../src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 8569 -> 0 bytes .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin 9605 -> 0 bytes client/src-tauri/src/lib.rs | 246 - client/src-tauri/src/main.rs | 6 - client/src-tauri/tauri.conf.json | 60 - client/src/App.tsx | 2 +- .../components/settings/SettingsPage.test.tsx | 15 +- .../src/components/settings/SettingsPage.tsx | 4 +- .../src/components/workspace/GamesSidebar.tsx | 9 +- .../components/workspace/WorkspaceTabs.tsx | 2 +- client/src/index.css | 6 +- client/src/lib/desktop.ts | 21 +- client/src/lib/workspace.ts | 17 +- docs/plans/electron-shell.md | 30 +- scripts/desktop.sh | 160 +- 80 files changed, 206 insertions(+), 5611 deletions(-) rename client/{src-tauri/icons => build-electron}/icon-source.svg (100%) rename client/{src-tauri/icons => build-electron}/icon.icns (100%) rename client/{src-tauri/icons => build-electron}/icon.ico (100%) rename client/{src-tauri/icons => build-electron}/icon.png (100%) delete mode 100644 client/scripts/compare-shells.mjs delete mode 100644 client/src-tauri/.gitignore delete mode 100644 client/src-tauri/Cargo.lock delete mode 100644 client/src-tauri/Cargo.toml delete mode 100644 client/src-tauri/Info.plist delete mode 100644 client/src-tauri/build.rs delete mode 100644 client/src-tauri/capabilities/core-origin.json delete mode 100644 client/src-tauri/capabilities/default.json delete mode 100644 client/src-tauri/icons/128x128.png delete mode 100644 client/src-tauri/icons/128x128@2x.png delete mode 100644 client/src-tauri/icons/32x32.png delete mode 100644 client/src-tauri/icons/64x64.png delete mode 100644 client/src-tauri/icons/Square107x107Logo.png delete mode 100644 client/src-tauri/icons/Square142x142Logo.png delete mode 100644 client/src-tauri/icons/Square150x150Logo.png delete mode 100644 client/src-tauri/icons/Square284x284Logo.png delete mode 100644 client/src-tauri/icons/Square30x30Logo.png delete mode 100644 client/src-tauri/icons/Square310x310Logo.png delete mode 100644 client/src-tauri/icons/Square44x44Logo.png delete mode 100644 client/src-tauri/icons/Square71x71Logo.png delete mode 100644 client/src-tauri/icons/Square89x89Logo.png delete mode 100644 client/src-tauri/icons/StoreLogo.png delete mode 100644 client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png delete mode 100644 client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png delete mode 100644 client/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png delete mode 100644 client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png delete mode 100644 client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png delete mode 100644 client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png delete mode 100644 client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 client/src-tauri/icons/android/values/ic_launcher_background.xml delete mode 100644 client/src-tauri/icons/ios/AppIcon-20x20@1x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-20x20@2x-1.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-20x20@2x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-20x20@3x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-29x29@1x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-29x29@2x-1.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-29x29@2x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-29x29@3x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-40x40@1x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-40x40@2x-1.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-40x40@2x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-40x40@3x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-512@2x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-60x60@2x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-60x60@3x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-76x76@1x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-76x76@2x.png delete mode 100644 client/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png delete mode 100644 client/src-tauri/src/lib.rs delete mode 100644 client/src-tauri/src/main.rs delete mode 100644 client/src-tauri/tauri.conf.json diff --git a/AGENTS.md b/AGENTS.md index fd6d8f54..8ae8cf2e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ repo works. | ---------------- | ------------------------------------------------------------------------ | | `core/` | Rust control plane. JSON-RPC over HTTP + SSE. Owns projects, sessions, agent loop, assets, MCP, skills. | | `client/` | Vite + React + TypeScript editor. Three.js viewport, agent panel, workspace tabs. | -| `client/src-tauri/` | macOS desktop shell. Bundles the core release binary as a sidecar. | +| `client/electron/` | Desktop shell (Electron). Spawns core, hosts the browser panel as a real view. | | `shared/schemas/` | `project.schema.json`, `cali-asset.schema.json` — the contracts both sides honour. | | `scripts/` | `dev.sh` (run both halves), `desktop.sh` (package the app), live agent clients. | | `docs/` | `runbook.md` (operations), `verification.md` (what proves each feature works), plans, templates. | @@ -36,18 +36,18 @@ pnpm desktop:build # from client/ — packages CaliCode.app (+ .dmg) pnpm desktop:dev # native shell against a live core ``` -**Two shells exist.** Tauri is the shipping one; an Electron shell is being -brought up alongside it (`docs/plans/electron-shell.md`) because only a Chromium -window can host the browser panel as a real view rather than a video stream. -Nothing has been removed — `src-tauri/` and `desktop:build` are untouched. +**One shell, and it is Electron.** A Tauri shell shipped first and was removed +(`docs/plans/electron-shell.md`): its webview is a different engine per platform +— WKWebView, WebView2, WebKitGTK — and none of them can host a second browser, so +the BROWSER tab could only ever be a video stream of a Chrome running elsewhere. +Electron bundles Chromium, so the panel is a `WebContentsView` the window +composites directly and core drives over CDP. -```bash -pnpm desktop:electron # run the Electron shell against a live core -pnpm desktop:electron:build # package it (unsigned) to release-electron/ -node scripts/compare-shells.mjs # prove both shells render the same editor -``` +The macOS menu bar reads `CFBundleName`, so an unpackaged `pnpm desktop:electron` +says "Electron" no matter what `app.setName` is; only a packaged build says +CaliCode. Not a bug to chase. -`CALI_PORT` moves either shell off `:8765` so a second instance can run beside a +`CALI_PORT` moves the shell off `:8765` so a second instance can run beside a live app — attaching two clients to one core is worse than a port collision, because `editor_attachment` is one owner per session and the newcomer silently steals tool routing. @@ -162,13 +162,11 @@ the *client webview* tools (`editor_*`) "browser tools" — unrelated. Linux (chrome, then chromium, then edge, then a playwright cache); `CALI_CHROME` overrides the path, `CALI_BROWSER_HEADED=1` shows the window for debugging, `CALI_BROWSER_PROFILE` moves the profile off `~/.cali/browser`. -- **Why a separate Chrome rather than an embedded webview.** Tauri's webview is - a different engine per platform — WKWebView, WebView2, WebKitGTK — and only - the Windows one speaks CDP. Embedding would mean three rendering behaviours - and an agent that can only drive the browser on one of the three. One found - Chrome behaves identically everywhere. The cost is that the tab is a - screencast, so it cannot select text or open devtools; the toolbar's - open-in-browser button is the way out. +- **A found Chrome is the fallback, not the panel.** When the shell hands core + its `WebContentsView` there is one browser and the user watches the agent work + in it. Core still knows how to launch its own Chrome, because the handshake can + fail and a headless agent has no panel at all; that path is degraded — the tab + shows a screencast of it — but it keeps working rather than failing. - The model reads pages as ref-tagged element lists (`browser_snapshot`), not HTML or pixels, and clicks refs rather than coordinates. Coordinates exist for ``, which is the only way to reach a running game. @@ -178,9 +176,9 @@ the *client webview* tools (`editor_*`) "browser tools" — unrelated. drives the `WebContentsView` the user is looking at instead of launching a Chrome of its own. The target id is passed, never discovered: guessing by url or title would eventually pick the editor's own window, and core would start - driving the app instead of the page inside it. Under Tauri, and whenever the - handshake fails, core falls back to launching its own Chrome — degraded but - working, and the panel is then a screencast of it. + driving the app instead of the page inside it. `browser::tests::live_attach` + is the regression check: it asserts core drives a browser it did not launch and + leaves it running. - **Playing a game is a different verb from using a page.** `browser_key` takes `holdMs` because movement is a held W, not a tapped one; `browser_mouse_move` takes a *delta* because a camera turns by motion, not by destination. It diff --git a/client/src-tauri/icons/icon-source.svg b/client/build-electron/icon-source.svg similarity index 100% rename from client/src-tauri/icons/icon-source.svg rename to client/build-electron/icon-source.svg diff --git a/client/src-tauri/icons/icon.icns b/client/build-electron/icon.icns similarity index 100% rename from client/src-tauri/icons/icon.icns rename to client/build-electron/icon.icns diff --git a/client/src-tauri/icons/icon.ico b/client/build-electron/icon.ico similarity index 100% rename from client/src-tauri/icons/icon.ico rename to client/build-electron/icon.ico diff --git a/client/src-tauri/icons/icon.png b/client/build-electron/icon.png similarity index 100% rename from client/src-tauri/icons/icon.png rename to client/build-electron/icon.png diff --git a/client/electron/ipc.ts b/client/electron/ipc.ts index 7d089933..c4668d5a 100644 --- a/client/electron/ipc.ts +++ b/client/electron/ipc.ts @@ -39,7 +39,7 @@ export interface ShellInfo { * to the main process could resolve. */ export interface CaliBridge extends ShellInfo { - chooseFolder(): Promise; + chooseFolder(defaultPath?: string): Promise; setPanelBounds(bounds: PanelBounds): void; panelTarget(): Promise; } diff --git a/client/electron/main.ts b/client/electron/main.ts index 89b981d1..87d899d5 100644 --- a/client/electron/main.ts +++ b/client/electron/main.ts @@ -8,8 +8,9 @@ * Everything the renderer does is same-origin — no CORS, no proxy, no change to * the client's `fetch("/rpc")` / `EventSource("/events")`. * - * Ports the behaviour of `src-tauri/src/lib.rs`, which stays the shipping shell - * until this one is packaged (docs/plans/electron-shell.md, P4). + * The only shell. It replaced a Tauri one, whose webview could not host the + * browser panel as anything better than a video stream + * (docs/plans/electron-shell.md). */ import { spawn, type ChildProcess } from "node:child_process"; @@ -18,11 +19,26 @@ import { request } from "node:http"; import { createConnection } from "node:net"; import path from "node:path"; -import { app, BrowserWindow, dialog, ipcMain } from "electron"; +import { app, BrowserWindow, dialog, ipcMain, nativeImage } from "electron"; import { createBrowserPanel, type BrowserPanel } from "./browserPanel"; import { IPC, type PanelBounds, type ShellInfo } from "./ipc"; +/** + * Names the userData directory (`~/Library/Application Support/CaliCode`) and + * `app.getName()`. Electron would otherwise take `package.json`'s `name` — + * `client` — and scatter this app's cookies and cache under that. + * + * It does *not* rename the macOS menu bar in an unpackaged run: that title comes + * from the running bundle's `CFBundleName`, which is Electron's own, so + * `pnpm desktop:electron` shows "Electron" no matter what this says. Only a + * packaged build says CaliCode there, because electron-builder writes the plist. + * + * Must run before the first `getPath("userData")`, which is why it is at module + * scope rather than inside `whenReady`. + */ +app.setName("CaliCode"); + /** * Port core listens on. Overridable so a second instance can run beside a live app instead of * fighting it for the port. `vite.config.ts` already honours the same variable @@ -232,7 +248,21 @@ function stopCore(): void { child.kill(); } +/** + * The brand mark, for the places macOS does not take from the bundle: the dock + * and taskbar while running unpackaged. A packaged build gets its icon from + * `build-electron/icon.icns` via electron-builder, and this returns nothing + * because the staged resources do not carry the source png. + */ +function brandIcon() { + const png = path.join(__dirname, "..", "build-electron", "icon.png"); + if (!existsSync(png)) return undefined; + const image = nativeImage.createFromPath(png); + return image.isEmpty() ? undefined : image; +} + function createWindow(): BrowserWindow { + const icon = brandIcon(); return new BrowserWindow({ width: 1440, height: 900, @@ -240,11 +270,15 @@ function createWindow(): BrowserWindow { minHeight: 600, center: true, show: false, + title: "CaliCode", + ...(icon ? { icon } : {}), titleBarStyle: "hiddenInset", - // Mirrors tauri.conf.json. Electron measures this differently from Tauri, so - // it still wants tuning by eye against GamesSidebar's hard-coded row height - // (docs/plans/electron-shell.md §3a). - trafficLightPosition: { x: 16, y: 23 }, + // Measured, not inherited: this is the top-left of the traffic-light group, + // and Electron places it ~6.75pt above the buttons' visual centre. The + // sidebar's window-controls row is `h-10` with no top padding, so its icons + // centre at 20pt — putting the lights on that same line means y = 20 - 6.75. + // The Tauri shell's 23 sat them a full 10pt low, on their own line. + trafficLightPosition: { x: 16, y: 13 }, webPreferences: { contextIsolation: true, nodeIntegration: false, @@ -277,8 +311,14 @@ function registerIpc(panel: BrowserPanel): void { IPC.shellInfo, (): ShellInfo => ({ shell: "electron", platform: process.platform }), ); - ipcMain.handle(IPC.chooseFolder, async () => { - const result = await dialog.showOpenDialog({ properties: ["openDirectory"] }); + ipcMain.handle(IPC.chooseFolder, async (_event, defaultPath?: string) => { + const result = await dialog.showOpenDialog({ + properties: ["openDirectory"], + title: "Choose a game folder", + // Reopening on the folder the caller expects; a bad path is ignored by + // AppKit rather than refused, so it needs no validation here. + ...(defaultPath ? { defaultPath } : {}), + }); return result.canceled ? null : (result.filePaths[0] ?? null); }); ipcMain.handle(IPC.panelBounds, (_event, bounds: PanelBounds) => { @@ -327,6 +367,11 @@ async function attachPanelToCore(panel: BrowserPanel): Promise { } app.whenReady().then(async () => { + // Unpackaged runs show Electron's own icon in the dock; a packaged build takes + // it from the bundle and `app.dock` does not need telling. + const icon = brandIcon(); + if (icon && process.platform === "darwin") app.dock?.setIcon(icon); + const startup = await startCore(); const win = createWindow(); const panel = createBrowserPanel(win); diff --git a/client/electron/preload.ts b/client/electron/preload.ts index c5a1747f..c7b2d228 100644 --- a/client/electron/preload.ts +++ b/client/electron/preload.ts @@ -21,7 +21,8 @@ const bridge: CaliBridge = { shell: "electron", platform: process.platform, - chooseFolder: () => ipcRenderer.invoke(IPC.chooseFolder) as Promise, + chooseFolder: (defaultPath?: string) => + ipcRenderer.invoke(IPC.chooseFolder, defaultPath) as Promise, // Fire-and-forget: bounds arrive on every resize and scroll frame, and a // reply the renderer would discard only adds latency to that path. diff --git a/client/package.json b/client/package.json index 2b626fbe..e1ad2499 100644 --- a/client/package.json +++ b/client/package.json @@ -8,7 +8,6 @@ "dev": "vite", "build": "tsc -b && vite build", "preview": "vite preview", - "tauri": "tauri", "desktop:dev": "bash ../scripts/desktop.sh dev", "desktop:build": "bash ../scripts/desktop.sh build", "desktop:install": "bash ../scripts/desktop.sh install", @@ -18,8 +17,7 @@ "pretest:e2e": "node -e \"const fs=require('node:fs');for(const path of ['.e2e-state','.e2e-projects','.e2e-config.yaml'])fs.rmSync(path,{recursive:true,force:true})\"", "pretest:e2e:live": "pnpm pretest:e2e", "build:electron": "tsc -p tsconfig.electron.json && esbuild electron/preload.ts --bundle --platform=node --format=cjs --external:electron --outfile=dist-electron/preload.js && node -e \"require('fs').writeFileSync('dist-electron/package.json','{\\\"type\\\":\\\"commonjs\\\"}')\"", - "desktop:electron": "pnpm build:electron && electron dist-electron/main.js", - "desktop:electron:build": "pnpm build && pnpm build:electron && cd ../core && cargo build --release && cd ../client && CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --config electron-builder.yml --mac dir" + "desktop:electron": "pnpm build:electron && electron dist-electron/main.js" }, "dependencies": { "@hookform/resolvers": "^3.9.1", @@ -29,8 +27,6 @@ "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-tabs": "^1.1.1", "@radix-ui/react-tooltip": "^1.1.4", - "@tauri-apps/api": "^2.11.1", - "@tauri-apps/plugin-dialog": "^2.4.2", "@xterm/addon-fit": "^0.11.0", "@xterm/xterm": "^6.0.0", "class-variance-authority": "^0.7.0", @@ -46,7 +42,6 @@ "devDependencies": { "@playwright/test": "^1.49.0", "@tailwindcss/vite": "^4.0.0", - "@tauri-apps/cli": "^2.11.4", "@testing-library/react": "^16.0.1", "@types/node": "^22.10.0", "@types/react": "^18.3.12", diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 39ee941c..b707ef2b 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -29,12 +29,6 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.1.4 version: 1.2.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tauri-apps/api': - specifier: ^2.11.1 - version: 2.11.1 - '@tauri-apps/plugin-dialog': - specifier: ^2.4.2 - version: 2.7.2 '@xterm/addon-fit': specifier: ^0.11.0 version: 0.11.0 @@ -75,9 +69,6 @@ importers: '@tailwindcss/vite': specifier: ^4.0.0 version: 4.3.3(vite@6.4.3(@types/node@22.20.1)(jiti@2.7.0)(lightningcss@1.32.0)) - '@tauri-apps/cli': - specifier: ^2.11.4 - version: 2.11.4 '@testing-library/react': specifier: ^16.0.1 version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1412,88 +1403,6 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 - '@tauri-apps/api@2.11.1': - resolution: {integrity: sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==} - - '@tauri-apps/cli-darwin-arm64@2.11.4': - resolution: {integrity: sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@tauri-apps/cli-darwin-x64@2.11.4': - resolution: {integrity: sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4': - resolution: {integrity: sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@tauri-apps/cli-linux-arm64-gnu@2.11.4': - resolution: {integrity: sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@tauri-apps/cli-linux-arm64-musl@2.11.4': - resolution: {integrity: sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@tauri-apps/cli-linux-riscv64-gnu@2.11.4': - resolution: {integrity: sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@tauri-apps/cli-linux-x64-gnu@2.11.4': - resolution: {integrity: sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@tauri-apps/cli-linux-x64-musl@2.11.4': - resolution: {integrity: sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@tauri-apps/cli-win32-arm64-msvc@2.11.4': - resolution: {integrity: sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@tauri-apps/cli-win32-ia32-msvc@2.11.4': - resolution: {integrity: sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@tauri-apps/cli-win32-x64-msvc@2.11.4': - resolution: {integrity: sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@tauri-apps/cli@2.11.4': - resolution: {integrity: sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==} - engines: {node: '>= 10'} - hasBin: true - - '@tauri-apps/plugin-dialog@2.7.2': - resolution: {integrity: sha512-pX0IGm1I3I6wc+zeKYcq1GSqogK6okCNX5fOdaNU5ab1AjGS6l1E5wFNjEb7meg7ZFSp0JUs+0jQGQNyOvLrsg==} - '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} @@ -4221,59 +4130,6 @@ snapshots: tailwindcss: 4.3.3 vite: 6.4.3(@types/node@22.20.1)(jiti@2.7.0)(lightningcss@1.32.0) - '@tauri-apps/api@2.11.1': {} - - '@tauri-apps/cli-darwin-arm64@2.11.4': - optional: true - - '@tauri-apps/cli-darwin-x64@2.11.4': - optional: true - - '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4': - optional: true - - '@tauri-apps/cli-linux-arm64-gnu@2.11.4': - optional: true - - '@tauri-apps/cli-linux-arm64-musl@2.11.4': - optional: true - - '@tauri-apps/cli-linux-riscv64-gnu@2.11.4': - optional: true - - '@tauri-apps/cli-linux-x64-gnu@2.11.4': - optional: true - - '@tauri-apps/cli-linux-x64-musl@2.11.4': - optional: true - - '@tauri-apps/cli-win32-arm64-msvc@2.11.4': - optional: true - - '@tauri-apps/cli-win32-ia32-msvc@2.11.4': - optional: true - - '@tauri-apps/cli-win32-x64-msvc@2.11.4': - optional: true - - '@tauri-apps/cli@2.11.4': - optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.11.4 - '@tauri-apps/cli-darwin-x64': 2.11.4 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.11.4 - '@tauri-apps/cli-linux-arm64-gnu': 2.11.4 - '@tauri-apps/cli-linux-arm64-musl': 2.11.4 - '@tauri-apps/cli-linux-riscv64-gnu': 2.11.4 - '@tauri-apps/cli-linux-x64-gnu': 2.11.4 - '@tauri-apps/cli-linux-x64-musl': 2.11.4 - '@tauri-apps/cli-win32-arm64-msvc': 2.11.4 - '@tauri-apps/cli-win32-ia32-msvc': 2.11.4 - '@tauri-apps/cli-win32-x64-msvc': 2.11.4 - - '@tauri-apps/plugin-dialog@2.7.2': - dependencies: - '@tauri-apps/api': 2.11.1 - '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.29.7 diff --git a/client/scripts/compare-shells.mjs b/client/scripts/compare-shells.mjs deleted file mode 100644 index da0f5bf4..00000000 --- a/client/scripts/compare-shells.mjs +++ /dev/null @@ -1,271 +0,0 @@ -/** - * Surface-by-surface proof that the Electron shell renders the same editor as - * a plain browser. - * - * Both shells load the identical React bundle from the identical Rust core over - * HTTP, so any pixel difference is the shell's doing — a missing drag region, a - * traffic-light inset that leaked into the wrong build, a font the OS webview - * resolved differently. Eyeballing ten tabs twice does not catch that. - * - * Usage, from `client/`: - * - * CALI_PORT=8799 npx electron dist-electron/main.js # shell + core, in another terminal - * node scripts/compare-shells.mjs [--port=8799] [--out=.shell-compare] [--cdp=URL] - * - * The Electron side is reached over CDP (the shell exposes 9222); the browser - * side is a fresh Playwright Chromium on core's own origin, which is what the - * committed visual baselines render with. - */ - -import { chromium } from "@playwright/test"; -import { createRequire } from "node:module"; -import { mkdirSync, writeFileSync } from "node:fs"; -import path from "node:path"; - -function opt(name, fallback) { - const hit = process.argv.slice(2).find((arg) => arg.startsWith(`--${name}=`)); - return hit ? hit.slice(name.length + 3) : fallback; -} - -const CORE_PORT = Number(opt("port", process.env.CALI_PORT ?? "8799")); -const CDP_URL = opt("cdp", process.env.CALI_CDP_URL ?? "http://127.0.0.1:9222"); -const OUT_DIR = path.resolve(opt("out", process.env.CALI_SHELL_COMPARE_OUT ?? ".shell-compare")); -const BASE_URL = `http://127.0.0.1:${CORE_PORT}/`; - -/** Matches the visual baselines, so a diff here is comparable with those. */ -const VIEWPORT = { width: 1440, height: 900 }; - -/** App.tsx persists the active tab here; clearing it makes both sides start equal. */ -const VIEW_KEY = "calicode-view"; - -const TABS = ["play", "code", "art", "build", "scene", "test", "terminal", "browser", "sidechat", "reports"]; - -/** - * Absolute pixel budget. Set from measurement, not estimate. - * - * The two sides are different Chromium builds — Electron's bundled one against - * Playwright's — and cross-build text antialiasing is the noise floor. That - * floor was guessed at "a few hundred"; measured across all eleven surfaces it - * is **2,666-3,023 differing pixels**, scattered over the whole frame (x - * 21-1393, y 13-891) rather than clustered, which is the signature of text - * rasterising differently rather than anything moving. - * - * So this budget cannot separate a small regression from that noise, and it is - * dishonest to pretend otherwise: a clipped tab strip measured ~1,400 pixels in - * `visual.spec.ts`, i.e. *below* the floor here. What this comparison reliably - * catches is gross layout breakage — an element appearing, vanishing, or moving - * — which shifts whole blocks and costs tens of thousands (a 300x60 element was - * ~18,000). Anything subtler needs a human looking at the `.diff.png`, which is - * why every run writes them. - */ -const MAX_DIFF_PIXELS = 6_000; - -/** Coarse mode only: PNG byte size is a weak proxy for content, so allow slack. */ -const MAX_COARSE_SIZE_DRIFT = 0.1; - -/** Regions that differ for reasons other than the shell, and would drown the signal. */ -function unstable(page) { - return [ - // WebGL: GPU- and driver-dependent, and the PLAY scene animates. - page.locator("canvas"), - // fps, frame time, load time — new numbers every run. - page.locator("[data-live-stats]"), - page.locator("[data-active-model]"), - // Project list contents depend on what is on disk, not on the shell. - page.locator("[data-games-list]"), - // The BROWSER tab paints remote pages into an ; whatever it loaded is - // live content, not our chrome. - page.locator("img"), - // The window-controls row is the one place the shells are *supposed* to - // differ: only a desktop shell reserves 72px for native traffic lights, and - // the browser draws three decorative dots instead. Masking the row (via its - // toggle button's parent — AGENTS.md guarantees exactly one such button) - // keeps that intended difference from failing every single surface. - page.getByRole("button", { name: "Toggle games sidebar" }).locator(".."), - ]; -} - -/** Width and height straight from the IHDR, so dimensions are known even coarse. */ -function pngSize(buffer) { - return { width: buffer.readUInt32BE(16), height: buffer.readUInt32BE(20) }; -} - -/** - * Image comparison without adding a dependency. - * - * `@playwright/test` ships pixelmatch, but not as an importable module: - * `playwright-core`'s export map stops at `lib/coreBundle`, so the only handle - * on it is `utils.getComparator` — Playwright's own screenshot comparator, - * pixelmatch plus its antialias handling. It reports the count in prose, hence - * the regex. The bundle resolves from `@playwright/test`'s directory rather - * than ours because pnpm does not hoist it. - */ -async function loadDiffEngine() { - try { - const pixelmatch = (await import("pixelmatch")).default; - const { PNG } = await import("pngjs"); - return { - label: "pixelmatch", - coarse: false, - compare(a, b) { - const left = PNG.sync.read(a); - const right = PNG.sync.read(b); - if (left.width !== right.width || left.height !== right.height) return { pixels: null, diff: null }; - const out = new PNG({ width: left.width, height: left.height }); - const pixels = pixelmatch(left.data, right.data, out.data, left.width, left.height, { threshold: 0.2 }); - return { pixels, diff: pixels ? PNG.sync.write(out) : null }; - }, - }; - } catch {} // not installed here - - try { - const req = createRequire(import.meta.resolve("@playwright/test")); - const { utils } = req("playwright-core/lib/coreBundle"); - const comparator = utils.getComparator("image/png"); - return { - label: "playwright's bundled pixelmatch", - coarse: false, - compare(a, b) { - const result = comparator(a, b, { threshold: 0.2 }); - if (!result) return { pixels: 0, diff: null }; - const count = /(\d+) pixels/.exec(result.errorMessage ?? ""); - return { pixels: count ? Number(count[1]) : null, diff: result.diff ?? null }; - }, - }; - } catch {} // no comparator reachable - - return { label: "byte size + dimensions (COARSE)", coarse: true, compare: () => ({ pixels: null, diff: null }) }; -} - -async function settle(page) { - await page.waitForLoadState("networkidle").catch(() => undefined); - // Let the editor finish its first project load and layout pass. - await page.waitForTimeout(600); -} - -/** Captures every surface from one page, in place, and returns surface -> PNG. */ -async function captureAll(page, source) { - const shots = new Map(); - // Clearing the persisted tab is what makes the two sides start equal. - await page.evaluate((key) => localStorage.removeItem(key), VIEW_KEY); - await page.reload({ waitUntil: "domcontentloaded" }); - await settle(page); - const shoot = async (surface) => { - // `scale: "css"` on both sides. Playwright captures at the device pixel - // ratio by default, so the shell's window on a retina display came back - // 2880x1800 against the reference browser's 1440x900 and every surface - // read as "dimensions differ" — a comparison that can never pass, for a - // reason that has nothing to do with the shells. - shots.set( - surface, - await page.screenshot({ - mask: unstable(page), - animations: "disabled", - fullPage: false, - scale: "css", - }), - ); - }; - await shoot("default"); - - for (const tab of TABS) { - const handle = page.getByRole("tab", { name: tab, exact: true }).first(); - if (!(await handle.isVisible().catch(() => false))) { - console.log(` ${source}: tab "${tab}" is not open — skipped`); - continue; - } - await handle.click({ timeout: 5000 }); - await settle(page); - await shoot(tab); - } - return shots; -} - -async function electronPage() { - const browser = await chromium.connectOverCDP(CDP_URL).catch((error) => { - console.error(`Cannot reach the Electron shell on ${CDP_URL}: ${error.message}`); - console.error(`Start it with: cd client && CALI_PORT=${CORE_PORT} npx electron dist-electron/main.js`); - process.exit(2); - }); - const pages = browser.contexts().flatMap((context) => context.pages()); - // The shell also owns the BROWSER panel's WebContentsView, which is a page - // target too — the editor is the one served from core's port. - const page = pages.find((candidate) => candidate.url().includes(`:${CORE_PORT}`)); - if (!page) { - console.error(`Attached to ${CDP_URL} but no page is on :${CORE_PORT}. Saw: ${pages.map((p) => p.url()).join(", ") || "no pages"}`); - process.exit(2); - } - // Forced through CDP rather than page.setViewportSize: a CDP-attached page - // has a null viewport (it is a real window), and only the emulation override - // makes both sides capture at the same size. - const session = await page.context().newCDPSession(page); - await session.send("Emulation.setDeviceMetricsOverride", { ...VIEWPORT, deviceScaleFactor: 1, mobile: false }); - return { browser, page }; -} - -const engine = await loadDiffEngine(); -mkdirSync(OUT_DIR, { recursive: true }); - -console.log(`core ${BASE_URL}\nelectron ${CDP_URL}\noutput ${OUT_DIR}\ncompare ${engine.label}\n`); -if (engine.coarse) { - console.log("!! Neither pixelmatch nor Playwright's bundled comparator could be loaded."); - console.log("!! This run compares PNG byte size and dimensions only. It can prove two"); - console.log("!! surfaces have different geometry; it CANNOT prove they render the same.\n"); -} - -const { browser: electronBrowser, page: shellPage } = await electronPage(); -const electronShots = await captureAll(shellPage, "electron"); -await electronBrowser.close(); - -const reference = await chromium.launch(); -const referencePage = await reference.newPage({ viewport: VIEWPORT, deviceScaleFactor: 1 }); -await referencePage.goto(BASE_URL, { waitUntil: "domcontentloaded" }); -const browserShots = await captureAll(referencePage, "browser"); -await reference.close(); - -const surfaces = [...new Set([...electronShots.keys(), ...browserShots.keys()])]; -const rows = []; -let failed = false; - -for (const surface of surfaces) { - const left = electronShots.get(surface); - const right = browserShots.get(surface); - if (left) writeFileSync(path.join(OUT_DIR, `${surface}.electron.png`), left); - if (right) writeFileSync(path.join(OUT_DIR, `${surface}.browser.png`), right); - - if (!left || !right) { - failed = true; - rows.push([surface, left ? `${left.length}B` : "-", right ? `${right.length}B` : "-", "-", "MISSING on one side"]); - continue; - } - - const a = pngSize(left); - const b = pngSize(right); - const sizes = [`${a.width}x${a.height} ${Math.round(left.length / 1024)}K`, `${b.width}x${b.height} ${Math.round(right.length / 1024)}K`]; - - if (a.width !== b.width || a.height !== b.height) { - failed = true; - rows.push([surface, ...sizes, "-", "DIMENSIONS DIFFER"]); - } else if (engine.coarse) { - const drift = Math.abs(left.length - right.length) / Math.max(left.length, right.length); - failed ||= drift > MAX_COARSE_SIZE_DRIFT; - const verdict = drift > MAX_COARSE_SIZE_DRIFT ? "SIZE DRIFT (coarse)" : "same size (coarse)"; - rows.push([surface, ...sizes, `~${(drift * 100).toFixed(1)}%`, verdict]); - } else { - const { pixels, diff } = engine.compare(left, right); - if (diff) writeFileSync(path.join(OUT_DIR, `${surface}.diff.png`), diff); - failed ||= pixels === null || pixels > MAX_DIFF_PIXELS; - if (pixels === null) rows.push([surface, ...sizes, "?", "DIFFERS, count unavailable"]); - else rows.push([surface, ...sizes, String(pixels), pixels > MAX_DIFF_PIXELS ? `DIFFERS (> ${MAX_DIFF_PIXELS})` : "match"]); - } -} - -const header = ["surface", "electron", "browser", "diff px", "verdict"]; -const widths = header.map((label, column) => Math.max(label.length, ...rows.map((row) => String(row[column]).length))); -const line = (cells) => cells.map((cell, index) => String(cell).padEnd(widths[index])).join(" "); -console.log(`\n${line(header)}\n${line(widths.map((width) => "-".repeat(width)))}`); -for (const row of rows) console.log(line(row)); - -console.log(`\n${rows.length} surfaces compared. Images in ${OUT_DIR}`); -console.log(failed ? "FAIL — see the rows above and their .diff.png" : "PASS — both shells render the same editor"); -process.exit(failed ? 1 : 0); diff --git a/client/src-tauri/.gitignore b/client/src-tauri/.gitignore deleted file mode 100644 index b7c7c5a7..00000000 --- a/client/src-tauri/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Generated by Cargo -# will have compiled files and executables -/target/ -/gen/schemas - -# Staged build outputs (produced by scripts/desktop.sh) -/binaries/ -/resources/ diff --git a/client/src-tauri/Cargo.lock b/client/src-tauri/Cargo.lock deleted file mode 100644 index b2aacfe8..00000000 --- a/client/src-tauri/Cargo.lock +++ /dev/null @@ -1,4622 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aho-corasick" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "android_log-sys" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" - -[[package]] -name = "android_logger" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" -dependencies = [ - "android_log-sys", - "env_filter", - "log", -] - -[[package]] -name = "android_system_properties" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" - -[[package]] -name = "app" -version = "0.1.0" -dependencies = [ - "log", - "serde", - "serde_json", - "tauri", - "tauri-build", - "tauri-plugin-dialog", - "tauri-plugin-log", -] - -[[package]] -name = "atk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" -dependencies = [ - "atk-sys", - "glib", - "libc", -] - -[[package]] -name = "atk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" -dependencies = [ - "serde_core", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2", -] - -[[package]] -name = "brotli" -version = "8.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - -[[package]] -name = "bytemuck" -version = "1.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" -dependencies = [ - "serde", -] - -[[package]] -name = "cairo-rs" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" -dependencies = [ - "bitflags 2.13.1", - "cairo-sys-rs", - "glib", - "libc", - "once_cell", - "thiserror 1.0.69", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "camino" -version = "1.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" -dependencies = [ - "serde_core", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror 2.0.19", -] - -[[package]] -name = "cargo_toml" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" -dependencies = [ - "serde", - "toml 0.9.12+spec-1.1.0", -] - -[[package]] -name = "cc" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9066c49992464636f92905fa096ec58baaa4d57ec19a5c096c68d3e25ef3d136" -dependencies = [ - "find-msvc-tools", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfb" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" -dependencies = [ - "byteorder", - "fnv", - "uuid", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "chrono" -version = "0.4.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" -dependencies = [ - "iana-time-zone", - "num-traits", - "serde", - "windows-link 0.2.1", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "time", - "version_check", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" -dependencies = [ - "bitflags 2.13.1", - "core-foundation", - "core-graphics-types", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.13.1", - "core-foundation", - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "cssparser" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "phf", - "smallvec", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "ctor" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" -dependencies = [ - "ctor-proc-macro", - "dtor", -] - -[[package]] -name = "ctor-proc-macro" -version = "0.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" - -[[package]] -name = "darling" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.119", -] - -[[package]] -name = "darling_macro" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dbus" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" -dependencies = [ - "libc", - "libdbus-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "serde_core", -] - -[[package]] -name = "derive_more" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.119", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[package]] -name = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.13.1", - "block2", - "libc", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "dlopen2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dom_query" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" -dependencies = [ - "bit-set", - "cssparser", - "foldhash", - "html5ever", - "precomputed-hash", - "selectors", - "tendril", -] - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" -dependencies = [ - "serde", -] - -[[package]] -name = "dtoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "dtor" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" -dependencies = [ - "dtor-proc-macro", -] - -[[package]] -name = "dtor-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "embed-resource" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml 1.1.4+spec-1.1.0", - "vswhom", - "winreg", -] - -[[package]] -name = "embed_plist" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" - -[[package]] -name = "env_filter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "erased-serde" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - -[[package]] -name = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "fern" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" -dependencies = [ - "log", -] - -[[package]] -name = "field-offset" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" -dependencies = [ - "memoffset", - "rustc_version", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" -dependencies = [ - "futures-core", -] - -[[package]] -name = "futures-core" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" - -[[package]] -name = "futures-executor" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" - -[[package]] -name = "futures-macro" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "futures-sink" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" - -[[package]] -name = "futures-task" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" - -[[package]] -name = "futures-util" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" -dependencies = [ - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "gdk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" -dependencies = [ - "gdk-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkx11" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" -dependencies = [ - "gdk", - "gdkx11-sys", - "gio", - "glib", - "libc", - "x11", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" -dependencies = [ - "gdk-sys", - "glib-sys", - "libc", - "system-deps", - "x11", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi 5.3.0", - "wasip2", -] - -[[package]] -name = "getrandom" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" -dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", -] - -[[package]] -name = "gio" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "gio-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - -[[package]] -name = "glib" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.13.1", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "once_cell", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "glib-macros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.2", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "glib-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "glob" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" - -[[package]] -name = "gobject-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gtk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" -dependencies = [ - "atk", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "html5ever" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" -dependencies = [ - "log", - "markup5ever", -] - -[[package]] -name = "http" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hyper" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.62.2", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ico" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" -dependencies = [ - "byteorder", - "png 0.17.16", -] - -[[package]] -name = "icu_collections" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" - -[[package]] -name = "icu_properties" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" - -[[package]] -name = "icu_provider" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", - "serde", - "serde_core", -] - -[[package]] -name = "infer" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" -dependencies = [ - "cfb", -] - -[[package]] -name = "ipnet" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "javascriptcore-rs" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" -dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", -] - -[[package]] -name = "javascriptcore-rs-sys" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "js-sys" -version = "0.3.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "json-patch" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" -dependencies = [ - "jsonptr", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "jsonptr" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.13.1", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading", - "once_cell", -] - -[[package]] -name = "libc" -version = "0.2.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" - -[[package]] -name = "libdbus-sys" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" -dependencies = [ - "pkg-config", -] - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libredox" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" -dependencies = [ - "libc", -] - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" - -[[package]] -name = "markup5ever" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" -dependencies = [ - "log", - "tendril", - "web_atoms", -] - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "muda" -version = "0.19.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "once_cell", - "png 0.18.1", - "serde", - "thiserror 2.0.19", - "windows-sys 0.61.2", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.13.1", - "jni-sys 0.3.1", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys 0.3.1", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_enum" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "objc2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" -dependencies = [ - "objc2-encode", - "objc2-exception-helper", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.13.1", - "block2", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-data" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.13.1", - "dispatch2", - "objc2", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.13.1", - "dispatch2", - "objc2", - "objc2-core-foundation", - "objc2-io-surface", -] - -[[package]] -name = "objc2-core-image" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-location" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-text" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-exception-helper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" -dependencies = [ - "cc", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.13.1", - "block2", - "libc", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-io-surface" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.13.1", - "block2", - "objc2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-core-image", - "objc2-core-location", - "objc2-core-text", - "objc2-foundation", - "objc2-quartz-core", - "objc2-user-notifications", -] - -[[package]] -name = "objc2-user-notifications" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-web-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" -dependencies = [ - "bitflags 2.13.1", - "block2", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "pango" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" -dependencies = [ - "gio", - "glib", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_macros", - "phf_shared", - "serde", -] - -[[package]] -name = "phf_codegen" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" -dependencies = [ - "fastrand", - "phf_shared", -] - -[[package]] -name = "phf_macros" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[package]] -name = "plist" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" -dependencies = [ - "base64 0.22.1", - "indexmap 2.14.0", - "quick-xml", - "serde", - "time", -] - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "png" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" -dependencies = [ - "bitflags 2.13.1", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.13+spec-1.1.0", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-xml" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.13.1", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.19", -] - -[[package]] -name = "ref-cast" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "regex" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" - -[[package]] -name = "reqwest" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "sync_wrapper", - "tokio", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - -[[package]] -name = "rfd" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" -dependencies = [ - "block2", - "dispatch2", - "glib-sys", - "gobject-sys", - "gtk-sys", - "js-sys", - "log", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "raw-window-handle", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-sys 0.60.2", -] - -[[package]] -name = "rustc-hash" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustversion" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schemars" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" -dependencies = [ - "dyn-clone", - "indexmap 1.9.3", - "schemars_derive", - "serde", - "serde_json", - "url", - "uuid", -] - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.119", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "selectors" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" -dependencies = [ - "bitflags 2.13.1", - "cssparser", - "derive_more", - "log", - "new_debug_unreachable", - "phf", - "phf_codegen", - "precomputed-hash", - "rustc-hash", - "servo_arc", - "smallvec", -] - -[[package]] -name = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-untagged" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" -dependencies = [ - "erased-serde", - "serde", - "serde_core", - "typeid", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "serde_json" -version = "1.0.151" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_repr" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_with" -version = "3.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" -dependencies = [ - "base64 0.22.1", - "bs58", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.14.0", - "schemars 0.9.0", - "schemars 1.2.2", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "serialize-to-javascript" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" -dependencies = [ - "serde", - "serde_json", - "serialize-to-javascript-impl", -] - -[[package]] -name = "serialize-to-javascript-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "servo_arc" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" -dependencies = [ - "stable_deref_trait", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "simd-adler32" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" - -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" - -[[package]] -name = "socket2" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "softbuffer" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" -dependencies = [ - "bytemuck", - "js-sys", - "ndk", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "objc2-quartz-core", - "raw-window-handle", - "redox_syscall", - "tracing", - "wasm-bindgen", - "web-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "soup3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" -dependencies = [ - "futures-channel", - "gio", - "glib", - "libc", - "soup3-sys", -] - -[[package]] -name = "soup3-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "string_cache" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared", - "precomputed-hash", -] - -[[package]] -name = "string_cache_codegen" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "swift-rs" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" -dependencies = [ - "base64 0.21.7", - "serde", - "serde_json", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml 0.8.2", - "version-compare", -] - -[[package]] -name = "tao" -version = "0.35.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" -dependencies = [ - "bitflags 2.13.1", - "block2", - "core-foundation", - "core-graphics", - "crossbeam-channel", - "dbus", - "dispatch2", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "jni", - "libc", - "log", - "ndk", - "ndk-sys", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "objc2-ui-kit", - "once_cell", - "parking_lot", - "percent-encoding", - "raw-window-handle", - "tao-macros", - "unicode-segmentation", - "url", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "tao-macros" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tauri" -version = "2.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" -dependencies = [ - "anyhow", - "bytes", - "cookie", - "dirs", - "dunce", - "embed_plist", - "getrandom 0.3.4", - "glob", - "gtk", - "heck 0.5.0", - "http", - "jni", - "libc", - "log", - "mime", - "muda", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "percent-encoding", - "plist", - "raw-window-handle", - "reqwest", - "serde", - "serde_json", - "serde_repr", - "serialize-to-javascript", - "swift-rs", - "tauri-build", - "tauri-macros", - "tauri-runtime", - "tauri-runtime-wry", - "tauri-utils", - "thiserror 2.0.19", - "tokio", - "tray-icon", - "url", - "webkit2gtk", - "webview2-com", - "window-vibrancy", - "windows", -] - -[[package]] -name = "tauri-build" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" -dependencies = [ - "anyhow", - "cargo_toml", - "dirs", - "glob", - "heck 0.5.0", - "json-patch", - "schemars 0.8.22", - "semver", - "serde", - "serde_json", - "tauri-utils", - "tauri-winres", - "walkdir", -] - -[[package]] -name = "tauri-codegen" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" -dependencies = [ - "base64 0.22.1", - "brotli", - "ico", - "json-patch", - "plist", - "png 0.17.16", - "proc-macro2", - "quote", - "semver", - "serde", - "serde_json", - "sha2", - "syn 2.0.119", - "tauri-utils", - "thiserror 2.0.19", - "time", - "url", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-macros" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", - "tauri-codegen", - "tauri-utils", -] - -[[package]] -name = "tauri-plugin" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020" -dependencies = [ - "anyhow", - "glob", - "plist", - "schemars 0.8.22", - "serde", - "serde_json", - "tauri-utils", - "walkdir", -] - -[[package]] -name = "tauri-plugin-dialog" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2d3c1dbe38037e7f590cdf2492594d5ceebe031e7bc7e827509b22a999d2940" -dependencies = [ - "log", - "raw-window-handle", - "rfd", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "tauri-plugin-fs", - "thiserror 2.0.19", - "url", -] - -[[package]] -name = "tauri-plugin-fs" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7ecc274121aca0c036a2b42d1cbe83d368d348f54e0bb8a735c2b1548e8f371" -dependencies = [ - "anyhow", - "dunce", - "glob", - "log", - "objc2-foundation", - "percent-encoding", - "schemars 0.8.22", - "serde", - "serde_json", - "serde_repr", - "tauri", - "tauri-plugin", - "tauri-utils", - "thiserror 2.0.19", - "toml 1.1.4+spec-1.1.0", - "url", -] - -[[package]] -name = "tauri-plugin-log" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6792296e6f389268016c77db21ebae1fc0568f2fccf88b1ec7e2ea71330afb4c" -dependencies = [ - "android_logger", - "fern", - "log", - "objc2", - "objc2-foundation", - "serde", - "serde_json", - "serde_repr", - "swift-rs", - "tauri", - "tauri-plugin", - "thiserror 2.0.19", - "time", -] - -[[package]] -name = "tauri-runtime" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" -dependencies = [ - "cookie", - "dpi", - "gtk", - "http", - "jni", - "objc2", - "objc2-ui-kit", - "objc2-web-kit", - "raw-window-handle", - "serde", - "serde_json", - "tauri-utils", - "thiserror 2.0.19", - "url", - "webkit2gtk", - "webview2-com", - "windows", -] - -[[package]] -name = "tauri-runtime-wry" -version = "2.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" -dependencies = [ - "gtk", - "http", - "jni", - "log", - "objc2", - "objc2-app-kit", - "once_cell", - "percent-encoding", - "raw-window-handle", - "softbuffer", - "tao", - "tauri-runtime", - "tauri-utils", - "url", - "webkit2gtk", - "webview2-com", - "windows", - "wry", -] - -[[package]] -name = "tauri-utils" -version = "2.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" -dependencies = [ - "anyhow", - "brotli", - "cargo_metadata", - "ctor", - "dom_query", - "dunce", - "glob", - "http", - "infer", - "json-patch", - "log", - "memchr", - "phf", - "plist", - "proc-macro2", - "quote", - "regex", - "schemars 0.8.22", - "semver", - "serde", - "serde-untagged", - "serde_json", - "serde_with", - "swift-rs", - "thiserror 2.0.19", - "toml 1.1.4+spec-1.1.0", - "url", - "urlpattern", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-winres" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" -dependencies = [ - "dunce", - "embed-resource", - "toml 1.1.4+spec-1.1.0", -] - -[[package]] -name = "tendril" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" -dependencies = [ - "new_debug_unreachable", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" -dependencies = [ - "thiserror-impl 2.0.19", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "time" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" -dependencies = [ - "deranged", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" -dependencies = [ - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-util" -version = "0.7.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "toml" -version = "0.9.12+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" -dependencies = [ - "indexmap 2.14.0", - "serde_core", - "serde_spanned 1.1.1", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 0.7.15", -] - -[[package]] -name = "toml" -version = "1.1.4+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" -dependencies = [ - "indexmap 2.14.0", - "serde_core", - "serde_spanned 1.1.1", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 1.0.4", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.14.0", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" -dependencies = [ - "indexmap 2.14.0", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.25.13+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" -dependencies = [ - "indexmap 2.14.0", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.4", -] - -[[package]] -name = "toml_parser" -version = "1.1.3+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" -dependencies = [ - "winnow 1.0.4", -] - -[[package]] -name = "toml_writer" -version = "1.1.2+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" -dependencies = [ - "bitflags 2.13.1", - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", - "url", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tray-icon" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "045979e3f037cd18ad1cb2a419dfda133c5c29c9f3453370079f2255d46c257e" -dependencies = [ - "crossbeam-channel", - "dirs", - "libappindicator", - "muda", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "once_cell", - "png 0.18.1", - "serde", - "thiserror 2.0.19", - "windows-sys 0.61.2", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - -[[package]] -name = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-ucd-ident" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - -[[package]] -name = "urlpattern" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" -dependencies = [ - "regex", - "serde", - "unic-ucd-ident", - "url", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" -dependencies = [ - "getrandom 0.4.3", - "js-sys", - "serde_core", - "wasm-bindgen", -] - -[[package]] -name = "version-compare" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.119", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web_atoms" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297" -dependencies = [ - "phf", - "phf_codegen", - "string_cache", - "string_cache_codegen", -] - -[[package]] -name = "webkit2gtk" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" -dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "gdk", - "gdk-sys", - "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", - "gtk", - "gtk-sys", - "javascriptcore-rs", - "libc", - "once_cell", - "soup3", - "webkit2gtk-sys", -] - -[[package]] -name = "webkit2gtk-sys" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" -dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk-sys", - "javascriptcore-rs-sys", - "libc", - "pkg-config", - "soup3-sys", - "system-deps", -] - -[[package]] -name = "webview2-com" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" -dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows", - "windows-core 0.61.2", - "windows-implement", - "windows-interface", -] - -[[package]] -name = "webview2-com-macros" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "webview2-com-sys" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" -dependencies = [ - "thiserror 2.0.19", - "windows", - "windows-core 0.61.2", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "window-vibrancy" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" -dependencies = [ - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "raw-window-handle", - "windows-sys 0.59.0", - "windows-version", -] - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-version" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" - -[[package]] -name = "winnow" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" -dependencies = [ - "cfg-if", - "windows-sys 0.59.0", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - -[[package]] -name = "wry" -version = "0.55.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" -dependencies = [ - "base64 0.22.1", - "block2", - "cookie", - "crossbeam-channel", - "dirs", - "dom_query", - "dpi", - "dunce", - "gdkx11", - "gtk", - "http", - "javascriptcore-rs", - "jni", - "libc", - "ndk", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "once_cell", - "percent-encoding", - "raw-window-handle", - "sha2", - "soup3", - "tao-macros", - "thiserror 2.0.19", - "url", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "yoke" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zmij" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/client/src-tauri/Cargo.toml b/client/src-tauri/Cargo.toml deleted file mode 100644 index 005d1b19..00000000 --- a/client/src-tauri/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "app" -version = "0.1.0" -description = "A Tauri App" -authors = ["you"] -license = "" -repository = "" -edition = "2021" -rust-version = "1.77.2" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -name = "app_lib" -crate-type = ["staticlib", "cdylib", "rlib"] - -[build-dependencies] -tauri-build = { version = "2.6.3", features = [] } - -[dependencies] -serde_json = "1.0" -serde = { version = "1.0", features = ["derive"] } -log = "0.4" -tauri = { version = "2.11.3", features = [] } -tauri-plugin-log = "2" -tauri-plugin-dialog = "2" diff --git a/client/src-tauri/Info.plist b/client/src-tauri/Info.plist deleted file mode 100644 index 099f736a..00000000 --- a/client/src-tauri/Info.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - NSDesktopFolderUsageDescription - CaliCode needs access to selected game folders on your Desktop so it can read and edit the project. - NSDocumentsFolderUsageDescription - CaliCode needs access to selected game folders in Documents so it can read and edit the project. - NSDownloadsFolderUsageDescription - CaliCode needs access to selected game folders in Downloads so it can read and edit the project. - - diff --git a/client/src-tauri/build.rs b/client/src-tauri/build.rs deleted file mode 100644 index 30c5eea5..00000000 --- a/client/src-tauri/build.rs +++ /dev/null @@ -1,9 +0,0 @@ -fn main() { - // Expose the target triple so the runtime can locate the dev-mode sidecar - // staged at `binaries/cali-core-`. Cargo sets TARGET for build - // scripts but not for the crate itself. - if let Ok(target) = std::env::var("TARGET") { - println!("cargo:rustc-env=TARGET={target}"); - } - tauri_build::build(); -} diff --git a/client/src-tauri/capabilities/core-origin.json b/client/src-tauri/capabilities/core-origin.json deleted file mode 100644 index 768d2ca3..00000000 --- a/client/src-tauri/capabilities/core-origin.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "core-origin-window-controls", - "description": "The shell points its window at core's own origin (http://127.0.0.1:8765), which Tauri classifies as remote, so the `default` capability above — which is local-only — does not reach the page. Without this the title bar cannot move the window: `data-tauri-drag-region` invokes `plugin:window|start_dragging`, and the ACL rejects every plugin command coming from a remote origin. Grant is deliberately two commands wide, not `core:default`: dragging the frame and the macOS double-click-to-zoom that pairs with it. Keep the URL in step with `CORE_PORT` in src/lib.rs.", - "windows": ["main"], - "local": false, - "remote": { - "urls": ["http://127.0.0.1:8765/*"] - }, - "permissions": ["core:window:allow-start-dragging", "core:window:allow-internal-toggle-maximize"] -} diff --git a/client/src-tauri/capabilities/default.json b/client/src-tauri/capabilities/default.json deleted file mode 100644 index 5b5e8de0..00000000 --- a/client/src-tauri/capabilities/default.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "default", - "description": "enables the default permissions", - "windows": [ - "main" - ], - "permissions": [ - "core:default", - "dialog:allow-open" - ] -} diff --git a/client/src-tauri/icons/128x128.png b/client/src-tauri/icons/128x128.png deleted file mode 100644 index d862b35cf626c0fc6e13246ca8944501b4198b3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6380 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
}FRT6!9c{h)WCUVhozg4`{Ib7&V<>4S)c5~lVU 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 diff --git a/client/src-tauri/icons/32x32.png b/client/src-tauri/icons/32x32.png deleted file mode 100644 index 8aa749b5b27561564e2063d61857bb53385543d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1146 zcmV-=1cm#FP) z_o_JZH4E!&GE2bjGR8Hr#LYEZL*!i<)1>kid%)5V-3(xcz{`XQ!l+(>?7@&!HYS`W zOcIWE;Al~p4ipKW5cc8Lwyy{;5Nf6oR+~4JVq_^;9XAJcLkJ0ReNbq) z+KBz;-m;AiC$!t&)a0%vw@lcUWs&j(vICNSB}W#j|5}Hwbv{g(A^eOM9$wu&g2y)d;05voqv-_Z02i(Xc=zi$oLi`Yj6i(d70lo`nsT;pskS;EpU*AHoRL7oo&fv$tmQ5p4oxc!vnpRoH9_W}C zRLm9meSIE|9Ta_@N zf#dYtVlp1Bo_UEEKbpo$JxX$c3R^6)%SfgHY04V&H`1o}h^(4;Ve0Z?OL)RaAS6jn z0ar%FGG7hj$W@6Yc6-Cb;=th!mKPiNb+OV+bDAg(Y$SRso-9isB^Y<^p_Mb(Q2~Ek zt75iRTXTGr+k0&+Ywdzm4^WDGlnp@!)Kf2D`pQz%eYzevj3rQR=RF#cVL(&aL%f8M zsDv;e@xZ~PF5Df&45)IRJP97NO>lAAJsX*J_)6UD!ez>^JlVre1iuZcMM zZu15(HZX#dPd99EiY*>t-m2hO^&GybT+EY#W0TV| zN~9Y2jPR_=CuVr8oR@s%ExBs)nwIMPobX)A$=Wz3jeA^6&}1@$kp@aeByNJ!aa1uE zHzqfAPMVzSx|H_Vx?W2ESJ(18{xG>CPcysAq}%a0mFs!aa52><{9 M07*qoM6N<$f_3X4P5=M^ diff --git a/client/src-tauri/icons/64x64.png b/client/src-tauri/icons/64x64.png deleted file mode 100644 index 25f71f134919d1a749071b0507946dbcaa9749ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 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 diff --git a/client/src-tauri/icons/Square30x30Logo.png b/client/src-tauri/icons/Square30x30Logo.png deleted file mode 100644 index bfea25d961b2758e05515216758144ff517a806a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1106 zcmV-Y1g-mtP)N$hy--I?Xh?yS3ZcD)WrbgZ9j&By!A`J476|5?nAHaGA{B@feNU9rDT)O8BC9JupDi(2qux)z^!@(IpIzRFYaYq^n{Yq} z95Z4BMIA`H&8PkO-rQq2KYs)>#UWUdgG)1nQmD)| zeemkApon>x$QF+rgxqi;cYyVpi{G!euzDjz%VB8TC2tMeczb>(JZq#U6rPn(BIlo+ zoPa6v5Uzu|5P0U}AF;O8MBX&ucoILq^E94#yo}}Q9elF%S8!H#2O-N!Ac^CtQ3`>U zK>=mqm-S7oZSDk;98X}Xm;)IfZ+*Ce^Iu=nmg)*H43fFJhSU%9*f0?{Nt(&Ad}CWb zEd#EU!Jg+o_zBlHountVcVec^T;etk@iO_A!LT?klg5G5h*0g>XtX;A+glaqV}n+DzOZj)H5^=pZL+-1U;7mRKB?B)$v=selJe7 zJJgdCd#EJ?1=n#tO@U>RRuU`Cb!>ZXNJNAq+zNcM?YiJJ=lTA?^)ht`KP)Csvgt6e zS~>hsyVLbHj+V;!_0&A(#>WRH?Mtl8ti(LPhH${0glLj~9gfvzBUmq)cJO^-WD5K2 z3YMOG3GdDx?%Q4L$5CnnZfrZ{UmeRhZ2R#EykhYXmc*g8gy~5BeooZJQEs2{-RH@M`t@tOg-b z<6Vti)Goa4eU4#2hgbYZX_88;N0ly5rl%nDY#*1luHlWfZ&7QvIzgA!IA)ebgTAD` z>@1r=#VAlQm1ItuGkn~V4P0@zI#n!zG_fr5CrS8wvd)I_oK# zMzX4!Bd9xO%-8DFpM=w~mXyWonIh-~(-uhyrFiS}8sTchWyZ{*ey zy`J?nP)R`&0Tve)1Ox;@T1rd>1O$}xzaKQz_mj)+-U<*9^=D}@5jBs^>mHb7eN9iw z*IVBkr4rhiq!W=wGdR3C4|5Aqcyp=E3y8WOIV&U+liutTfP~VfPP|S{citH|q+MC2 z&G~r#%o}$09bwc%VPber?92-ATn5=jQ@o8t2HnQdM62%StFI65-M4Mkl0^CnyNXYw zR&{lE-skP6zPGr&JrJni0q&{!ebs&==Ja)Jc&K1t%)tLWM8gaIe%iqD{lfnqngE!w z;VC)4=P~+ULphu8=>~>JjhM0jpTqy}_ljT>-suwe5)=`R&3e$>{*bep3ra42 zR58^iD#8E|mB`ofO$q@fd^l2V$+|0BtBbs8tB}pJ&O&tsE$OSwHI#-P(P-aQ+&dhTR4IxgbD=64QkEDsRTev9m%KV@OT2ljtb%6IYym^f zxkW80tD?<*64q=rA1S_i%o8jP>N|4PddQjMcJ7x@l6J1;22$_h10Fp6nM|9!7AoEW zt37tMwfqY7F7E2|`_DCf2b~jpoC}>vt6KyaKwL1i`7CxLW(BT|k}4UGbEz9U9e?pl z>G7oClb__=pm16950FkjYTTE+*w)w6CEF6YjhJ77SKZ>N8l2}^I|9vuqL}X1}OaZ%ch;lBNtj5U3)e1A)lo&?h9UMXt=>Jh`pkhAG7K;Hz`e#Ap7*uCI66q8!o*%>!gwU z)2*MF_7Boo{(*1@!i}Bh`NxwJqwCsye1N9T?!4pIWTDZ;yqVxc`!KyHuiEo+wQy%y z?agAk%TfAf-xfZWleH+w%VZA(Kr;FS+SzYkJxz8cdSsbuHh<~ODK5TBC9c{vZcP|X zr)ya+ysGO|S^6H?ILeP`t7Nr?tQszL&Lm{-AAJ2V&mA){!h!KQ8x4YuIHjU@|DaJHrf^rWs9u7`7eYd++fGaad}y)9azo^W~K@G zS%6Ac*s3Cag=@w#cC>0^Tc@4k$MAK7rzLZQC$4JOa?T5e-sFH${{<}!kJKf{tW%aI z3l|HLwEWoejUqhK z*e~4HXpZn-(0Zg@Qd4hyPj@QEAlYX0k-bXxv71ADIxx|_{Mgj813Zoeg91M-78SYe zk*+r*-g?viBlW~`@QU`NEor6yy+(jSN8#nu;V+U(ML0Kc#c4=&1;uMFZtzK?2aJvy z_u{8uKUZmSqON>RZmi`WwAv-X0|CA1Rr>;!*4e1`dmY7%ap9x8DN!GS;DvI^zu=&5|Q&5IP|!*t=W${H{i<$;?t5;puL?dtYG zTi;?=Xjsj)5e|%g=2khPrw#`7&68?hzTW7Sk$^pCvbLRvBx5qMju}Yj(%4c+yTZH0 zs*-=oXnE3&U0&DuRzTc}Tf$bCFQ5hHoXA=}uXqgqZ&S;t(KJ()ytj@fmHeOfc?M2@ zcz13Uy8jI7Y1ZV74@^?femI~-Sw{s9&g7N*{{(`C zZ6atbqq}@Y=>ymWS2)E_|6rJI*I^aDWj`nd++iaV!{NHK#NoaZlirXOx+)y6-liTDyb&T$j1E#cI{5)~Ns^J- zXLD4WLku9~6xG*7GGR?PP$IC?#Ct=xMhuur6DnYYI1M~?zvT}Qs#S};fAG*p#1vuNgN}LD#1DO1czaV)!9vglA`SjJR$z94J9!jG&!5}@acHE1sdviod6{60!!?qccY zLN#mf3Kf4vM%cirm9gKXBXh=-f33jfTt<)xbNx@(6aEZGFE<@abaE!yE|xky9{4`rzo8CiRkNXw zbQh~MPJ0payvK(Z+}g%J|Im0+OF~)D_s}+I{~gycpl#TsCwVdmJmuM5>m{Kq$bL-K zwdolSn{YP9j2k*0$Qa>77%1Wsq$q?5Dq$7ZF|i1k9Ru;X2rRn0?QMo^?PCT**dR8c z%h)D{_gL`$$7IptOrmW=dOt$sdO~;=IXe(;#~RG2(d@TD{Qh^%5bWzNv!y;#uimM# zn8%vH!b-)ekc9bKCo`0$Lu+j&QAELJu_w`09^lqLx=9T2a2dhSSxZaka?-0c(?Hes z%dX1L;qf=>(r`S8_0@&V$|3G-?f^D}UqxKT;hY6eXuEH}HT!?q^&qd-6z)j?XJyRvxRjxP!O%#W zk}lVJPRS+(I6PuiqE0`vFeH<%cEQLds#i^3K?5;<{>hll?2Gal8;`feSilXjC^1&t zktXL9)mo&)?Czt3oOQU@fooeRJj2$3GW`6My}MDg4;w;LRZ^0xrN?jp14Ufw%wC0q z3tjiIoqB90G|J=|qT1{5=S_Co>8RQV^m%Y}e;yjkSP+ucH5KQ3u&McrKhK8Va#)TZ z^HC$~s+6KI+T*||>&VUt5%DG|s*Mi~w~{OPmqg+`g~k2rFlk$!K{z49(XJ$fv*R32 zebWQ$bV7x~L>fF&L>lB1auc%g{X}Lzhbz!+)Rk!uTn%hyomrv(r zh0(Ob4!-^Bx;${j)5KM=MsK~TwMtLBrM{gX9_>hVzHr|?cwEXfgxrcTuKk*2j^Zg^yMEKE&Pp-Akuv52b9KA)D~!#s zu^6Jl(}uTu!_f5Sf4ak z>AdxfkotEn$Jb8$+Ydf^HP%L&bL*8 z7Qa5f19-yp8>#gCtMgJ<{g>@qeOsxTVMzCcs7XRYrJqTnasp*sZxswJEexPvM{9N= zml{lE-1FQO_UiWa17ecaC)Jd!@=ND_fwu+8H&c3Jj!ye*S9<6?P>fMaYz0m8}(OF){KG zXp-pQU{|TOD4^*hf0C=~rNV}g`^n*3O0tW!^R{?Q^d&C3%}QY=c{~VAmAai>I>KuV znEg&(XYP#Qx-=R2=XzLhbr3xr$iNslUxhr*aGowAzafmfsVt4b7iH!a^;#vmHhiUJ zALR58Y<WFV&;|ghgtAJk5P=P216*?JV5yL7oF#ObKTXE zcY0o5C4hF`%^ZDG=8`jF8d>mNH!a;y)m9`bRI|D({|6RY+e-h3$-n!C+x4KO zh>F;k19qdN8=Z?NiB)jUvR^j8dwet&G1KJnig=UoIEFvx)r&hkG<~)4p5Bwa>d!9^ z)eNwx>f6j~b-1X0m$#nvZdw)bb}EOg+3FznId6?B$&P_r{+1aeFJs}#BHs{ux%@j1*Q5Q${f|#0xF|Hl^eLX_!zdNV# zho&pg1ve5B)t&HFM2PuaZfX39NImC_0B(YxW&JC|JXH+%oSm2~w4fIX{o-ff@1t3> zKdN-cwqk)XEY?_RT^4=5j}&)Ln$_Vq%MdM66F%MmWlQ`&JOk~(23)Sp(U~g2sH+AO z1wnE$uSqholN7T>b9Ghl@WL^xA)}ZlH%z0!+Cg8G>Gee3U~5{HsP!GB3+Mg@#P=eu z>fn`YOpKdUp8?he79&h;rR$*DLa!Eo=N>l^D&YhWQf`=hF>vZ4^66&l9K_5jMK~5R zsn4292h9kR()Q)*B|?s2RmFgYRYYsJ1=Gbb+E{NnlG$F*J)NJrccdKlucc2|x~ z4(%RgkG`U_nHGTl#ch|HnUMl<-%qpGQH5&f;5&aa>z+9qI>{{5)%_ zYx<{F-5-{P&@CoISgb^ud$u33+AOlCT&?TaOD_c>dtLXaTATRf38E-y;B3o5C$;8w z%|@F%^Qxw|5{ESEZ0b8{#=?!v{CPPdm4#x;iy?O*{(UuS%idhSc z$aR=xrv|gK%A-#M!15VSxd6I8Djv}(rtr3Hi2Ymg+43O+Jl`0a1j4TK2&I+++hwyH zVsQz+LbEc3t*jBbcQ)h+-n@Q4Kh37YGHFt3NoTrFsJ7Li!{=@9BW)EBuBR}41UxvQ z1l8bY0y)j1PGd2CNog;9qEj+*S+G}*BRtwaugi5YjagD_69-FqBLk|lqku%%l7z6M zZJz@Wy&k`Y4$%P)TREHP$QFq%hoi)iyQ#A}NDdB5$?1$tTAT>#b09@elFkAdYIq&o zUmY7uG|$lOcZoGub7VB+$Kh1=Nj?=cY1_>5_{^^j9a(I!`#=k|Y6>>=D{pDE!|}^w zX7pRw_=ASWnZF&Q_>?zxQcB4RdJtkQp#^JyWOuuyB2@C)7zO4EjYIhC8zKb}Xta03 zfHBJIRWB{Fj3FFRxbqawMg85h2Gr9{u1m!)^JrCC4JT*pmMlM6L{c8Cz4cSk!3Rv9C*}~7HmXXm5-)qp^;qoU!E;Mgc8a6hv<>nNg zD784N93_WGPtm()Mt#fiMk51o#%H5-RHRMhwQ3#2wOZ`Li>plp+jXFFYC@uCSSu$2 zBoqVdQ6|g@Z=6#N2VWd*E2+3R5#81iMFMhCAuI|^Kl{SlEGP{sB#O|E{s?&p9ohmQ z{iu0^`}bVj^k3}}wJ-UI>1sJK7T*o1u=%t+QYNvLXgR1CpuyVmR(fEQY7aNfpNfRa zwsmqm!fQl{Hv5Y^VUn&pL?_8xSF{tHZ{*gPE!JJnN3dC1O2zs*%Z57At8H|wP3+LT zV~3G>qb}BFu~sH;=`RwDX$kQ?%uWxrpBj8?z6Hi?^SOUEk{ zyRsWrb(^%ZHBSU>gWOt9#vcBm-1!S^Q6qG`*9d?qdZ<#t$-CiRBbSWmdc2^iex!2qStAHeA9jarqxspezIQ7my7nG zz;fT$6M9~peb@k;wt6^|SFJy!1yv zxajfNK$W$TI2o)M%rs7`6_*yaP?zB$!6TsWzKX>&kEYceMP8t&*+lmWkgcF%U$`V7 zi@E^!@51@K@)v+ZlTnwlxZ%1|f4&Ntd%tN>vtofJ$aFI#cWNDLN)0Ny?1W}cHzIY@ zk2r$&Mo}U$dfm>X=)RQCf^T3cV`*sMWwec^OQjEfoS}4~8ncDuqZF}D8J=qrp<|q) zD%|E84NzZvrp``HAKwuwr=IEDou4=b={}o!9>U_hWl7Z?s)+Phi8tz0lYJkODf-jG z8cUog;XBPQnS!u@y7DPUR!3v>x4`jb?CT%P%fJu&z!C&;ZPR+y&UXxw zh4Ptk$}_n!q7rx#FruR;nw{OSp10UdmJ7zW>G#p$)_lj0-x&E6 zCn>mPO396QGwvN!uKE>!7$^hZ)r6JF9lLgCav;{k8F$OO2yusOUmk|K;44~aWOaX& z9yGGk1fe=eM9FI~6lxdWs^=U(J7O19>EB9#6K-*V?d^FXe-1n@dvO9Ks_fh}bQjBD z9~TuUpXul`PD?00r$TJ3c)1X8*>#XBKJG49Ud|2qLH2w+3_V;aIVf8p;r#Cno2(j0 zkQ1OfgK~~LO2wJ?HP%Wbb-KG`aBpwa7l6BJ|)QQy+J9|`X%;|5-bq2Mv zxaT>-c*9n;I?)Y08sLcDrl<~7_q-w@Vr7p|(_lB$04BQYkJg)JIE=XUfxL+MY{p=> zCb-Wq;+-8y2;mpi3NB%p0o9}6i^fcak|#fj!i%rYYDJ+HiLhJdO40Wpj`S*NfJQJ+ z(|}qvqkYFg*F$d1G!`RS?>Gc&yvzhp(@^Y@sdv-t5$kFW%ccR?>-Cz|LkebT?RiCC zSEB7lF5QESApo;*-CijulWO@oq?rl8WC?FykG5ic9yh`af07jumP(dfG$9PmjZgOH zSVD1~WK$bmN-`C6f?L;?$i(6l-ifyIb=YJfco$Oapm8IAvv{G8nXgmdi+9~liII7W zezw_-F>g56iL`vjR5;W=hILrK0yCpii9t%XQJxD*%DIV-<)MjPD?C)vs|dTR)hmV0 zwYV2Qw$HCEY@hR}xFMuGuZhw3bNigdSRt|8wb9|xY4e((s5Hjl6$S#T%yGaQQ1*nY zNzS?%nO4L{j&^0SfI|A9atZ>MZcZRBb_>TEg2t}ps~!h(Gu{sQZ?hhIR$q25kNx7v z8z;T}P{$C%lBTtJfJsRbkv9W(2(N1#wlkV`8AN6*GQ-3!E@1${oZ_Hl?<>5|0ace# zWNiM5T#aWS3z&#Jn&RYt89aZFuPz$uIozh0w{k7u)4_FDgGoTQkz?Bvp1w(n%^M98nIR~F~N z=)kphM1xN>fGr5(Eu zf-4e*`oE?01>4(f;2lRa>*~1uorY>G`SyWvX%V!6j$ly-1MhgSxk>bN9nV~D!=*Is zsVq(^D)9L}E>kw}Kvr5PC^v=rOpay_Q3Gb#9L!gDwjY zPL(pKRDyEE2vp0JsPhVtn-&mRcHqj>BIvp+$bMX3J*42r(60i~RPCs31#zmPtjZ(S z43-8KbHq4XyzT~l!kww@+jsk(>LJr8VwpemW;Sz$}-tL zH@aO1dtcX_>pZN+xKD8L=H}FmLleWJ+zmQ$)~nfocabBn$zp1(0glWx;BSWG`zB(y z1Gb#`q){>ZfrE#KN(S*p>HPuUH&kO8x#9qYYM&E1azsY$F8DASM`j)c@tGJ>rcsV? zMmj-2Gz%^vRazs5u#;#_$=%8r($JUh^U+@H-zVZ=(&+$JWrr~e#;DIcQG6w+MacOlN|Ve|xx^)B5u%f<3x}<;$XY9uI4--tyB$3{G9gbr z7UlUFrM5i*Alx`Fmn*W4!7hms&rFQ!@r?l$QqSKiS(Pmz3|ifNa=A!^1;Wth9P*{8 z&MvsdTkB{M%8-IZQibCsUR6++ ze@G%s`3zHQRbt529N!64TYRavElOUv4b|>FGCG>%MCdN4^rxjvDt%d}Vwo@H%jT`E z&9jY1PbMFjCKBR6^nbsm+ON{hYrz{~uc|6G)?c1FV*Ta4MLP#WLVhNG8ALR-?bDb0EM$y!!3NYaO34R1_9k4~MGDIo-!$fxM~q%NRf zViT9~Kuz#rCfw4m|A}l26jUJTWH>4w{KqXjr0tH80}_db_%2fV!w z$oVlg!()dTdW|j2xc48LgDD;d2ld0~qtIB?rdMg#RNSnmR1sT~rl75qj6tScOBWl~ zqhZX7K1NL$Ja?N9W{!{#Q${l1{+DQeMMIa{4s4RNhKS~DD-Xv-k1znbw+jIAd1p@; zPIT=@GrWLK0o6&X{*=;GxdixTZYU5t*E?FkRNEqnxSP<^?sbA_C$FK11jrTZr7EaS z%3k@FS<>S<_Qa*j75^DZZQ0sD2frKN-EotG8_7|tc;!8C+BNyjttAfxUtwWv5!|K( z7I1|BFuuGYyYu%wB6(RXn!{Vf&3|56x#=2|iAULZH2sz_H8!|}PC7gOPz*?24C9;T zMw*luKldUggffwkpA}r8#=0`0Hlmo_8A)p zO9`%bst5qGWOdlK=`yRxysWq7hAH~|;={+i%xur<{R$zo%z#ckV$b;XpAFIB?K_ydt7$QVoff}U1L>SG1(j5*`<|Jn1hU;>1^X+A|AFVfgM2To0 zjOs2EJX4lxBng?88bm=t{^vL^cLIDye`PgNiY+r&7OK5O^xcFq*0Ia7SDUTb#a35m zrkd3j)L4o7>0E^=JN2cJ+Of5+aG@Ppgy2*ue8qe1W)PS;pH&6d6{O*$Rlj51x}(D| ze={4>>^=ilEtFOxs$VNW=>5%J2-?5HGmV1%T7vG<01%@^we{<}_Ttue)zW}`9u$|| zFAOxMmj1V5&OkzB96$WZwgM08_$QfeD?VjlNQ9F=W~^jm@y^CeK^QKV*9-eeUg@!i zz7a-iJ{%Y<9z$8J-2)|fhlMoY-+c>%t?5=CDG0e!y<&5EqrMvYpQXZ*&&9!`j53r; zg_|8}gi3iuxpickiB&!Aww{4J9f8w%dn0MvT2<|9N$Z&__GFs1%7dce2F$5CqV0$! zf}_L}G(ES@d!aj$5;I*^$Q7W7uQTJ1l?|5I=Hw$kH-x?m)j@ZkM2~`zgXE(<;vhYT)x&IULFpV)K|2G z6z)h~M|Vv^bEmB2ugD9dHb|n|vVskYxucYI$^IHLPLzKXtB_909CDxc3H~65G??!< zKgxXSS9Pw0$b~Vd8FtPW3t&{e`~)q|u3^#gVAT2jsL5bd7rr>sx@7iAJ(p(yB|e z1~#wL6u4#Xb0}rJ3-w)?7q*`$BQxli1mcJsZKLYge?e^+ zejx>YturXn*>wOr6O^&_tch7vx4unstIF3%P?s?S7Z-voMxXNIP5{H){528PfrS$= zu3WPv3n;38J7-zTncu43_Ilk6pYT+7zz6i0u4 zl7jx7kTrhrM(P5Vv!q5}T(%5mGXqoyi^Ob31#;~o;DZNhsR5krR`*r_7Mv4JG8?+T zcJ5pxG+9a~C9bMGeyY`x1!53QLHY?*x0U=HRd}_X4`bm5UIPMoV7U{+|9zQxdmOON zUcby~N{N|e9|Sw_A%jeml4V8Qh%Tatg4M}W+_@~;4y4pF<0LRA<9dL`_+c;Pwl3g5 zF(iw970IeFh_C_#rw!_HS}-AlylINRNLOT6z+B z^Fk_(A>eOgwLASy7E51$y#{wIT`fI0sV~4T#wm33;-U1TFtNS-wfa)qGWsW78`T*u zw0Blm)oxh5WOgPwO-aJ#G7#LMc!@%QGq#3h9mA{}UQYsTFH0gTf;C~Ya#4(eIm>#V zj^8HU(A-%BT>M`k`Cyu#RGt%bt#$pXo_ETLM)N)2Zxr9-eW{3!0+Xo!3W|Uv)rWSU zdzn`UT!}`V;u;n45gpm^=SVG7)Kkpjr2Ucrt?L8a3zPzd%^|CLnsXQ4`hWAFl0kA- z@NVKb4y=)c!nhyHj`Id)P%YF#t}(&obo}1B#tFimLp2t#6*!$sz@4-WOB0o z?r+xQ*bfCtd-yr=dlLU=_akz1V}nKuo@$g}Q)T&$d(U1AQO_oYVba(OF{hr)LSWVe zp$Tl0UhVckEPfc7{+82-t=fNEP&#h2%gTbInI^roB+@iatu3OG zz$nV8iMO@77J+VaZKB^aK`>4hyLh-vx_Kig9ElLR)OUgi<@?MDN>zPs3_Rhz4*Tu( zRmctlTGX9jaasx{+FL6xV_jgTp+3$#{JCUfS*tiKuq?>iZ1#4FIDhgBdOn1|it~=FT77E~NgcTuYtUu5%a*D|epB)V z5oU#z&{(k8EIgr?Lq>%9ds`aCEW97{V03K4Vn@Dg(b#Gim;GoTIT{j&!miZhJJfSa zZ#P;XumeMqky$FumTgo1Wid9&oAr6WRx+dHUtM&_0IdAlqnv^bn5Tu}XI;9!`lURy zV6H-0*G&NZ6Vic(Jk68uyZ0?b>8mcqv_$G~H4@GUsy!{aI>>4K@zPSWREXrEFUYM# zJjow914dCXj)TBpW99zRQo@!siZ)f}#9KmQuKIptCbabSa7#Icn8A!O+UH|ZQ}Kn7 z<>aU?X{pjFxH86FYNO|2?)U8(Zl!TM>R^U%H(03yt+qrM+&qoHe}liJK0(c2Y*7~} zv6Z2uZ7=*hlA~|6!R3wIeuYb_u10@}T|imi%DA#TGWm~&OO?zsA9G6=$(gKgR+e5x z?M`>c&1qOObuj@OjHs))rhb?iro%(pG-mPpjeI@VyLI(HhAp?Ye4HjyZE&F7;`e;Y z?9G72;-wglXKkg7Xn1*8d%6a0XoJc|`qL7d(9k0Phu~&f=;@D$Dpu@+w-$XTIa4=AI|c7-(o(< zIHHCcwUVr$5p%r%1cw2H+6;-;7@H(kAkQOVYUyO1j-KLJRgvKtc46w2zVm}Kfg7my zrI!0hZG`L`0q*cS3QPObaQ=%L+#ACKp5UVOy(|`G!Z6B366A;d7)5l)Z$DKFGbv{= zJ!HdH>7h5Ru@j-Z{AiTIhn^Z(xK-Sw2huG6=kFCbKc4pJw&;vmT8(7XSaXdjHZ5l( z+3bpC9+puz?p{e)Zm86qyBbbm(Q?+^Ec&GJiRX~aK*qj{k3TB=T!=LkT+4~+!{xuK zc2v;b*1ll5!a;V30rC=y8M-Q&xEuu5s-zbQ&rM=1Z5KXsmhs5$SfXk4qi;Fr-2V}s zxhsZ6q^p}EJWe75Q_LNr<~3BYqv^NL1*%=(BF;w(i5d?xcV+TDRX_&K_zEqdz#m})WK{7xn&6un&40{D%8vQ6 z>edYBZ5!PfKW4(xpt6jknypSenc|2?W{>`HHCc5@*epEzaaok38RG{- zu^C-5qXnb3aHUq;LGwEEMTF!6n;;JvzXOBX{*N9lEVfg!bM*&wY%<8*5P_ob z{r=-*K>uf49Y$w!C`HQmcKZmAsVS*%T`ESX#GhDSj6#Nl%lX|{*he|ItyH&xIo6{a z$4QRe2vGs;j2I+dW*BRZZOXVOO7GR~zi|@r_YBoQdSQ;InIB)7&j` z6;s)27!-gjn}(EHuQK;Av{&z5yOfZ~K#-ytAEr!IRI(rBM+drn4G3(!hx)l5aA>st z*wf2!rU;!;e#>SGIX|%^iw=-lJ-YOkX{};GyN~$TH;~M zNbjC?$KJ=0uqmn} z^7wRC(3AaB3%;kyq0#d>iVS}ASV!RpuKwTDn?{cL%%9kNF6gsmb}>x7HySU;@^yhH z;^4e4?+lTeunTDtRKdXOt5LcvcF|;B#Bl?*mgWKgvHHU~kkQyhRJ0aEbh?JClv6)> zQae*6%M`(%o(pQ>gdei$=TI25UO$ zQrmn^+fVWx%>P{3(!Gq4YGfPAR+U^+30ECS8>gPMalu>Qy;N@+VM$P_8fR6-9fTD+ z=+d8vU{5HxP}lz;dw|mhe^u0eKATHFSabfXR3dip5j<)?tF0Gf*Z+jWMGz0&yGWPZ z@bo)@v&}mief2oq;j5;Rh}EtiNK1QZs&yp7?+*lj)h=+KL*;u5v%y%NJv3p5cS>53Kw@4HL2!nVMa63>!sr51UuD zF0Q@=jk`D8zX-P9!nlTn`0WJ}vRLhV_8o)1C0+XEYGc6|26tRUb!5%jOEQg7$ot5>R8kG*rf_kepUx4EGx+1<>QV|D3>)~1m_XK~7 zwb$w$)~YMv`{gOO*tyn7Z4{IUm$ezS4_D{Q;PcRVX{7b6s-zv^Cck0+pPXSYo1=jk z%?r4-v2w!&W7NUkz}{R0abg;4S77{3^{m*PN%C&a%EpQk6zaIj`i<%m6Rq*(`oQD} z@vB=VmiX$vx@@X;CfZ^Skv1EMj&M?>8%M&y3%AdH;?zNwy&s%jpH+sVy!;qg(>Dj? z2;Ekxx$9zc6xYH9uk?u6nFS-vi_I|a^vH%KmC|H=Z>^q2_Y6uJY;X={WKpOu`h;}S z_r1BRO&&j+i-NW42i8E?lL;?TNfa6{jH|yLYT{BAv$g>(C=NmJ8Uj73l)~( zDZRFv{5QDaV8x4wyy>!OPrDjYU3SYZ#ekS#E}`Ch`m>sT#={(KH|I*Zv7_iDRhiWG z8B9VAE7yhKN8y|}4+kT;wJk?STBYcH^Q3oTtp$%aRqQ#eQwJZKzLvmhXjg3)jNsRA z-GgqotX{2TY1%u9@1)f|Jv`9i#G)q!1Q#z&wg#&YQQy4!g?Tn8GhM~|Z%5bIINLxD zJ>+vSw>_gOkWBOXtT_E`dA&f!xb}A+nEo$q{SFr#_VSP-dY19Rx6ify=a#s&296NK zgmrRPt@qbg*SjM_AG~hgA@S2G387Y_z2xsq@aJZ^^AuG}WTCKv(cF<00tH|tNJ6X< z6l`k2x@yX7W-yofAU5K~g<`G1-Vj3&CK^$I0QcH0cA7G!ks;UU@KGN@>zzkR=YpxN zGGO>8(R7Zgl(#+*UB36FldE5{t``(aiB3{mpZ7mVioCvp*hE#Hs)kZjPs*JL+nv@n z(20eeKygvLyi{>{r7;6K$=j#9?~*{hR;U^M#@)=GN#9e-vZkj7?S~a($me9_=5SyT zh1$4}epW;c{Z2hj8LA$oG)7yTH{hxDapM8wF0Q;RM^LEb@ zS~kCVO3Zby|J)Y4Vc`_Lzifi*lf9LMoh%Lj|rtGG;@U!mGpn37^apePXO!mr}D%dwT(Rk|$o zUd`i4GyW^i3^+j>+ZR%zTRpRHCtO8rt+tktf3)fO?xDn@8FmRX2GKdvm>tPjJ6gh3 zL#%O9WE&Mr9saV6mV?M?#YRqYEJ*J~oY4)q>1a_~nBya>FT!UTg)hNIYuWuYZJkQ3 zEoK5ES8R5cOtg_^8)c;~h5mKXnvE*sZUVpC;fLmP%kTx_ckvEaep+K~ z^(og!^Y?qp78$4lL>u5|2TEB6Lg+dl85GW6^TjT#He`sHoLMC%JC$C4p+(WTR?Cs! za}WW7kY)d5?V&flBG{`0$ggvHf{gNdfpwS1>-d{V_>K*zM`>Qtu$3kaLW7X6R%T3} zO#KRhWxU?_!Gt|*sZ=-C0Cxx z50*gqoamDoOg$OMR+qzkkxGJwWpRzeB)e?d)rijgkuT-w+zxnQ zw;_U!jE!=opdHCJmdipAPu>B{L&r-F+cyGZ7)eMZi_ zV4jziaK`Et-a564_PjM_U68-q=gB+{(M*{WWDDxF-xC{|4d-$qPw8q_WNNLZGR*zB3Iq=I zUhL{(Et4;tTnv67ACnf`p68bCLCu-I5d$A3*M3K#P16Q__8*DBXzPeFwY%X|x2T z6q*InG)x%$4;a!}%uz8fB%vLo68N6X zgZ#mDQQeKGzH?b-Cr4qB)9eh2o8-Yx z0VUwYC>+7PdvV3#2#dM5u>5+LYzUUwr~_&^C^_B455%!uLn!rv)ek3W`WAeur8Ksw zaH@;;GjTbGr-PbcJAr#J3J9V}K<9<-{SpGZLwX+LxXIUK4SlSgQbckidgcslHlP_f z=|bjP#CA$7$O;TjFuRM0y4zgs zN9$=|FKEOrC~vTA@wOaC6qxWnR1?54Pe4}IFOgY^{UgvS7-bTRLLg2?e&Z7@|9XR9 zE71CVOTqr>I{d5Q45x9s*-0gh$%>LQY)kUaCT(=PMa)3-LkRIeRJfpEx@DNDB6KjLR1mRl(;+hTcu-QC^uz8W36NVp}9K zr=DaI#0E{S(;Vz2N-mIZN%;mBN(d-xf@ZDcdda=6xaD+~xB5K}YCOSw<0+E12tlB|pEb}0vPA)bu(El<&PmqtU z86Iprrf&Re1oqy!0~34emn%0Wifg@eCJ}eP1%7llK}Er8aMNUU^5OqTmF`TIeBZk; zEwoN0M{|{fEnp27IUWM=g952V2;=%H1GO=Nr>As-tithN5BPpeIuIWI`N&_w`kF0P z)x0*Tuj49FyqPEVdB31Cx?Ct?UXK?Ez=qhe`o&_w55XAfia;DCuo93~3pN z0@5w84UmR`l!VeqH%gbJe>CQc)VVNIxh@M0WQe8HgRhM(D~(dib|oyh&VFUa-B9uGiS;k^ zG`lJ-_aw(-isJTR?Yjq7T_)O=w>5vbIY%% zbLFW_gk@}LItFc(Rt8%~WJE`WH%}Qw&(~Ek^XwnTf4~IO9fUFxDOV3CsSUMEit4)N#=+}4{%c1v^O#S}nTfDCP{GkyM*3j260 zjs_wW&Y6&8^QX!|fSm9AW~^_O_6arOU^2#a()>ug4u{4l!lc7hJ}nbH2J{wui`0yi zt=xF2{bEDH92Z&c5TMn!ebjyNI+(PNIOQOZJqB^^UPV!&AhcyACVibyFY6HB#MS8Z zpm9C~LZjAae&U%ECKwanMfZcFln>?)$!#%jFJ|ea2_rWw)~T^mJi71ifYvg>r`W>2EhC2 zckd|;YK%3XKc-^3;BfLUp9g!$TenrK*0`Rxf2je@%wtGDQG>Vjg7fStI&=2|=;hk4 zAY8FXBFKfscfX0-U^{+EQjJSt8RIK`_`Uwc+@E*ulB#8sQk2G7iPd2!aYOQ6 zDboQ72b2c9$L!Dn(=}1A;PQ%3kadWfShaOCwSa0PHAI(&d2I#D~_hP#iBIUbAyg{`eWLi0c_soP8zorxF(U@OIAwV|W#? zf4{S&k1afxtX0un5TVRAIH;?pMz=~$*|&d29b-(yxv-OBIWwNAckEr{zJOjc4&98x zUK&pUO%SO%x$^vDUDu0h=)Ue49NWEQ<6koOj{6e1fOepL=s0?6`DI-Bhm79C}Urtv-4@yY~JA8`AvT6DQ;>mT4 zim7!`OV8(?7E`av5~AZ*)K@j$87OLg4X=txB8HvL3jVNlKW|Lt`ku@Ksh2!E7k8I^ zKN$-YLYMP4+_&cX8+r%yNUv?%#Gj21Cf-wz*YAbVr zW*;+_exqxnU#lYg#4%UdHSZ_MjVcpDqzP2j6$o4o7d!gm6w$45t;$1-B|(QDQ5ciE zdPY)%uazZzXH)rJ(yy5{jN^V71kEuzV=q{5I4;G3B-Vu@As+e>=Ax;|SqC`>mU&5eMjaqZ?Azk2zK5o64HZn(C+$UxKkTnVjo}NRR@TFkbfBdPc ze##huYI$0vxnZi3aq=R(CVzE{oT!V8=wW0-yOQE#oZ7v&kr?^) z@>=!4xAaE+o8F~#Of=V%&kvJ-@=38j-e*pjzjJeR_E7AsoG$Cn*m3Bh4E?_qRH(;n zsK{7+rr6QeoWAy#JuUw`$7CM%dNe(L^ZRLe_V3!pk_d}&^4_BY=lEE;cEUDsOC+hP z#S2bePyaD<=yAP$lkrErg1);$5lkm)08Kl(q6gTYYqUcK+eS^oZGli@SJzR!Q(bR{ zMaNTr*97ugeYeKW1YL2i^wt&-Y4sY>(TL@xk3Stvn6Fn z*TnQci@4>65~@j3C~Sn46C|>?M80!bS`EDq-O+zXL1mTrJQzS^!;DVPi`!!v{7BM3%BfGI!iJqzrowT6CuDaxPfvLvm( zt7GQ)+4OVZLqX_Eh3}p!_pfSixAH{U-z50y4lj`mtS{QsPiNP)-m3cHUt9mYA*zz8 zC1_sY<*JFp-u;Z5v(-xsqNIxEA}ct2!!RAu6#8b1j?RrbWrta_U!^?xtSgjXcsMTq zIo;a8_{dx)A{BS=o_Pwjhtcak?4+e z&-R*z5`c;po6?7^aGyXJvYv9Lbz(#yw|OC6XSDQEZ`8?=GQN)FwCbV(dy#WW?&lI} zGTha!40!RvHOkG$<3(=q(URkaN^MWQPQK*JkZ7e`J__vP1b^a1N!Ley)kknCyVrOI zGZ1m(W=A~!BZRU1hHPR`={$g6e`JiQDY-MWzi(V&@Y8uFc}&h69jG-dh2su!6Nv`V zOdmP?!^B>X-RQ6SOtHFO74`eO(#HaRTVWR~eYEOhRbZ0Gp}=^4MJ|-|F-IvB^jKRpE<-E<2SGwrSDoFBto|G!nm9ueNOMfS;%I<9!|9uc7}? z@0Bb}p6YynlDbR5Z>2x5{hhmW&!pR&hUo+rwv~%)G}21tS<{E&vz7o?*s<%IxtVL2 zNr$Ax$odfwZ?e~Ljp=^b=3c}Fd55{o0}ua9LH(%D)uAVa3T^?*0t;*Is;?ei&)e;S z?~X;9W`2LBt#s2;wz+InEJx9S*`hv8yVHP0frsz~Nkn;j7p`c&vI{4JsE<26&XYwT zGTO!gL$>TfD_})n#j$AovY5{+>St*6q%b|s*zsq3aK25>;%^`v5TaPX2KWu3>pKh6 zVGBpQ{FJK7yTM@I;=wF^EeP5r&&4ih9%Ze7BXUA?{Vix_#D7M$*f6TkRNLmz(age{ z`Zg1%mCxLBi?SQ}5$|m;5yUT<=g8%0hdUqMNy9#-@1QnAnBjddNuB1@|3=_7h}JUQ z(1mj*N$5=;&_%n+LLN}v<=a+NBsjCUGB_6*l}lTu$NF@?KRZkX7=p>IIOlc-q{sA8 zOD*G*Y`o;#We0}`y5&l~v=p6FX46D3*=C3lea{E<#eRC>qQokZ#KvPAUp49}k55gg z=kC8mx^~4KWYT)9^jYxXpIx37x}J2~Hr6z;2IPCwwN}*O3xxrz(`5jJgXCf4Gm;DB z9uMR(3YHxP@=tG!F_eRIi$)C-@*G3wWu@pk)$zFRWB{`678Uv+3m=)dpi19rm0H70< zx!DOfCRLBx3OC@7m%K-3WqkK|gTOD)uwTmOiv7bl?!jYLbwWcmYlkcMNX2&gf&g75 z3PA^3KCXR;mJ^j#0ZGdb$lF?XLa$iXpy%;zcnA4M z8m;TZP|zXXZ<@3?D(KtLx|jORx{iZl9pR#@bnV*H!f-k?RYyFf6gE^d9@yYt&Bt7z z*M-jnx=PFr29(6>QSI==di1Rn;XDRyxp_>XS)#*D}`%k=*7>RB&8u1aGnIpkj>hCffMm0uMNZk5Z2*;DdJ7u@`9dyHx+?T0) zA&{y+83Byr;}k-UFCxcTc8bBLR=isoM3-aF0pBPSE5b}9sXuAUHmxDV0-i7>bpC*Fly?GVAau8coR zELpyKk%n2(LJQ3tz#~-Yyf<4EUoV3 zTRXKuw=R2wcNo<{^~%-VEC7#GId`WFypS_1mwS>dOXA?@)f7AEzZ=2>`;>?cqEQ`4 zao(HXJjPWjJ|#_`-VkEVdnDmPhiCh`G7JNrfuzUNuVSDp1uDrR2O)i6V72 zrjFtBLWqonSL~#2b)tf=JyhGV;lg`QY%1Sc)XLJgX}6rsT=y@pMdy67V3gWw5VqUv z+b~Q#suRGpW?=Rb*%eeJ{7)pU8No&a{ugO_+Xnkzr0H#o?thS`|3-!Xk2L*P!~7qF h>VMzMK03X@=hFc;DjvqB-b%1|s!Cdll~2us{|^l;gogkC diff --git a/client/src-tauri/icons/Square44x44Logo.png b/client/src-tauri/icons/Square44x44Logo.png deleted file mode 100644 index 195b90231e30f6b2c79a65286adb93e4961ae7a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1590 zcmV-62Fdw}P)D}&~JM+ys z-}&auEXN|d_`M3)CSzo>NjT!Z!+ILlx-4@S3*^8V$Kx}2KQN!4AnPaVCQHqur4x9gdvP7eCu9j9aa48;3VdyoUwn{l|Re5oLqhKup#OV)X5vV)NfVHWO zvMN`?jA-s;;+F5+ghd@Q4Ny-&M)!c)_<^YSPT3WY{iI36 z7~5?s5rgk9<5q33EE;&leJ(TQ51 zWeJw!rH+PegJ)6zC|R3?V62cADdpQ=`~- z?A#si?C9x0|GEx1TK|C0k6gyvUyjxv()lPa`?Bq%nwHiqX4Ac3;pF9sNZPoiWsKVl z1z%u$R~vol;-|A?cR*NcNn%2GHAoC2$tZnb0y zxo}&gIN>&=iN8Stk_AyWzKxSt$EylBGr$*oPZtll(OpVJwFs~URXM1H8@iUOn)UK- zY(jN7iIgg^>o{e7k&&iy3bnxGq>tf=+%#`X-(ie3oLuw5VP=B8+G)WWs}0g)nhH!f z_-$eezfa}OhD_eJvs7R?V|N2^boD0MkQ8YIq`{JC0Y8B=Ic z%$g(cS$VjRQw`ub5Tp*0JPe=X)WkogsAihe+={y1*1jA+Z+#Ja9$cmAq`W;B&{ks! z7lryUwt@f?G>^lk!UqN5#~WkOf+2;bgfF5(y(g6=P9$-tZwn4>d>kp;o)c)^P{I)q zo96gXNC~I-OLc_BLJD_)B~(`~OQeuuoRmZA$#GJU7qT?DsQ?9%zdb9v@Kk#{o;h|D z7xH-xx@jw&oZh<#cvL2$$ibwVf~wLOjx2wPoKBj|RW(LlCUYEy1l7TzuFzDiAz+0z zuKV6?t6|e9!AndiopYx# zFm_3+MKDWU=8c@U3C&@K3t}AG!$bH&?#4>lK@TXwh#u3%M6_FH>T`gtHHO*ssl2e4HS0~h^q>!Li+UX(u> o{AYiZVfWh4Uikl)&^ccJ0-sQSv*EWZ-T(jq07*qoM6N<$g0nUI1poj5 diff --git a/client/src-tauri/icons/Square71x71Logo.png b/client/src-tauri/icons/Square71x71Logo.png deleted file mode 100644 index 2412755313a2b6bf548c21c88d270003661f8712..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2818 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 diff --git a/client/src-tauri/icons/Square89x89Logo.png b/client/src-tauri/icons/Square89x89Logo.png deleted file mode 100644 index 99df20c247cc77f6077632a31fb16fcb7985a494..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3958 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 QiU0rr07*qoM6N<$f_@Eh%m4rY diff --git a/client/src-tauri/icons/StoreLogo.png b/client/src-tauri/icons/StoreLogo.png deleted file mode 100644 index 03fcdf3f03597feefc0255f9132d033218f380ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1927 zcmV;22YC32P)Au7b1qGqXFl|2zNp z-_BVZx5;MT$v}jWTe&GCRVh{Jb&?VonT*Xc;#UGnRA@CX@qMZh>lOjf19izrIUTB| zR{VerWh-SfWeKI(08tYRLKq-dC_R+jl=msQvA~RG5oyf&q#3Hc?wIx0`^a(}*eXBR$&{*sGl(EcB zG!rF&DdQ7=7&`g2fRI8!h_O9F@oj#fDgh%6&E^}Q5lJ7FC9Dw`Ns4>wXwl(<2kJV04ntu-Vyibr?t+!l0oG-FO{3W85iVOCJl zFzP+OXRmtL+nvRCJ(r`G6HTDhSXMbmS(niDCLpn?bdEShX*J(PrIzriMAu!dcxTfh zbk5`8rOmiGe2g?=#m8EeAT-IBhX$}^M-K)GOk1Z6(_&o)C<{!UxkfKh!Ws)q440Jx zvH5n7Z{NIlHa>mkKEPG*d>_8#<0v8opf5~<;lp{X&$-iF95^z7uGfFPZbZuf@l7r} zm9&aAN@-A89U&qRi(8xU$wq=00rG=Bq%VlUg7ElmUk|egRZxEPT`ECCNnRsywXcA6 zD_iiwV{;NGaa?_9H%ve>i_QnH?VOcH;c`}L01q5L8@oqW=H$_Ria2rxcQQS<5 zRFqJjW)}fjRAb1;^Xq3s&fu%D3d)Hs<8`Fbele%90h?ydVo(eqU5lg6y<_2I-yn9K zxWFI~IXVpx-V^Zi+=DaFF+B~hs41vm2R0sB*n%Z7vkD10k5d5u*} zt5q!wa2(M91xU|=BX~R%;AsC)cs@mwXv>L2qp@NJbFOrd8}abwSG{<9&uJx>er`mK6~}L=r^fA z!Z=8!Y-YCQ4K37GkybLw0gjDh7jhW!{E}RE2z29zNAT^*{zwT%Ded63f*2nVDyXPn zM?(f3P6k1q)Nw?V!hMOK`?A+1rWsZvA{%k!{yU`jg7TJ1C?GXjidVvxkW1s!`d2N5QK%K zs&U$8QY@lr#XOA#ZZq1gDFmRx5%C1o_H6ugX`rmqDp4ud-6EE0o>sVR5J4k6<`A7n zWP$rU9sSBcN&nFIrENO|5q6OE1`=!7DOuzdb@69~v~qk0L&JF-%U!+}p^}zy84UJy zJ&G;ub3-utv@JyafCL7~Dmk0}!HiB2%40?7yZAGA73T}X48%9iH8KJ z(#WonRvTe>esTU%{I=n7tZZ!!uOBZMyOxNh?J-kiFs+zjk0ip!SdkN;T{L5TW;Ux~ zf)hb_gJ2LCQ9icMUJ_0rXr=Q*c`VJe;_xFIux#%hbZ4_wm+s>N62E4M8nMMj6DwUk z{4!clu`vo&-yP!AqUeVYzn)YDR=qi&vW*Qk`W5kgUboJ^{Au2BYs6S`#9#)ciPjHrwTKqW54vD?}=;3g5#v78Y zS{o|8z2)x@IWHNxbO=`5qd*1o6#9)|=_2&LK-bsjXn`WBb=qUbhqJcEDWg0m@k8Qo* z8PZBvL230-=Oj@M0@T4kJncjD#>=KZ4tC``gE{fS1( zQ^B>$pavjG-K}XSS5I9n+vxluJP*(BGz+jVm(ofwe%L43y+%+_e5fS zq8>|cwt1&c2|LRzirzMhq2f+hp8ik$Vc?GX3&(BsryBhKf2~Q{{sGx#BD9pm#5w=~ N002ovPDHLkV1mV;g8%>k diff --git a/client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 2ffbf24b..00000000 --- a/client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 71c682947420b0b1987e462f3af16b70b49fe3e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1586 zcmV-22F>}2P)uX#^6#vc4z5B@BWVCHAYg^j%fzTrOsI@{BL`5t<5Clc=Pbd`pDCjqf75z{_ zEc&4!eo#a~{h&p(K4KgDps&=n_K~*fHv7Df8PB~tH`&Bw_a?h-N}GjW7P2#U&hMPx zIcH|Bf!p9?%#)ZWF;AjtBshUJ(H2FJH-iMzbNt1;8{kx-o#Sd!k&T*(=c_%HCRj6B ztd1RdLbk?w4M##~&!-446SfhS>iNwg;d}oiVJ~41Ay>6-!;uIdw4U%WVeL)G)dPfA z2m?`wu!s`!34BB7(jIGeQcq59Kf;#?TQ!lI(qeT8DlMUXIs!H!RyVvfQ_!FA0h3n= z|L;i!HMJPSb^M4tprys8ldh;?i>cYaN_b62z^t47WV~;fjDWH6Q`_aQ*G)J>_^ryG z86|c&VOy27YF7y|$R!5pgo$TXcVc5t3Ra7#%oJoQQ-OJs%>I2Shduj-ku5kxWSrC_ zDTnKSFdI3A8cb_V_UcehD?eX89uatASqI*KdKG%R6XZLZVyN+NQH3}#csz&acOJo^ zvw0ZA#GS|_TyIF{WOlmT;C0AZQOdBO(LRCAi|@jh+cuy#)dDvwQ5bQNyJ{nU*{R@) zg93d!^jqq5*!B7{STPY0;B4A9VAXOuk5Db@_5qJZB!$3x5A}mP2JBG}Tr#x8 z<4Cnyuv%LPNmy+bTH2B@=(jjGP`qH{5hAj6T}BrKHY*z%-T;O&*wWpFm8lHeoDGo> z;ELg^!Atn{d=`lq12-57u7|#kI9}S=1tvW(KYfYZrj;3dzW?&9yQa~2tF2VN``a@V z1p%8#nIw;5QDVop$MDzi^$FuwFG}IL`?@GX3D~xSw|1Yzt{=_>Qc_aQ4GE?$L?)MBALV&znsULU!TCibE6Y_$4w`}bwz45Oe{~f zQH%0>1PjO*E$r&3nR#Ozm8y_9S?)_&g&j>=GAk`clio!kfN~;y^f(l4kfpHRg zS>VvcQP@)I-hrTh_=Mj5>2%=pN+n{Dvhn>RZzvyhHCdHhfQ(AQDUnw^@=H)6R2bbBu3TPJUJLv?u$` zcFKoJQX^(yC||_sLUF?0h3UvO%ll1ZP=t490F95=`#^`ixdArY)AF$|PJPNb13BS^egNkdMhQCLlxRN` z$7v^vf&A6V$wrNDI6KV*9?#s3%^eG|wk?eve;*9w#hZ{Pe70h8DP>c1PPxbH2qdIz zGsuZ@*$s?u6EU)Cok zZUCF`nb8g4ZE+XNBZO4w2W{1!F{(&38(csCKotQ|?>z;(Q{GS9@^6aRo%YV|mVJB5 kfccm4^Cad;+-@ZP1FTwpHowYeDgXcg07*qoM6N<$f_DV?IRF3v diff --git a/client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index faa4283bdbb8fffbded72c2c4165ae40555de853..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8808 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 TyT5Vw00000NkvXXu0mjf2BK3@ diff --git a/client/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/client/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 7b0a7c54eed95b0f34ace1c4534b7bf3d5084544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1577 zcmV+^2G;qBP)NklCPYJ65FdMk3yqN-JLAqo7lw@{>Pii6 z*ocXm5JS*~7!wJWN1-a3(gIWan3>Lf9{+Rixn;03ckVo}pgqZ#JCA$M`Tldh|8dUM zafdg3*??sOmJMjCF#=atp{~s|QPGF5t_>4uq;UnWnZXip(Uc*6yA5CpQO6yGO$4(I zhRA+x!fyntVxmNnzV!xX#wFZKI7k>K@D`o zf|{fck{F>S(7dO}zhBW|qM2u`I%1lqWceK73gJ|RoElyMt~4)Y^CKZs@q7G|aTW?# zh^ixVvO?bH`c-*FepVtptmMRNIX16j0Mv43RR^);iFZI)67vWlKeh<+KY34$6^Y1Z z)!4B-^_YqDRJ0jRA~#8163!SJUfj`(z4xy~@5&BvLj4=WCKMZQR6K&1UmD%v0k`3<=gj_luoUH7e^;plNr(1ij`swS^=vnepV za}|a*b>iSBV+%%z#fr))4(F9oUQ!7~3v1SM*dRI3z-e8>XL}yPuKqQ!uG_HYJXj?G zyBNYEMO#I{Df+Oc33&%^?CZxfgDZmBmwr>Ddo#{oc}!eJl0>2@5x+FB0Z;a>g_E~o z_!_Od9>9=bIM<)XJ*Vnn^}>+7SqK@Lg= z85td?$7gWp+w+*UJ#amA*0ST_z5N4tI<@$JFT@F3DPP}{cSG@Jj7^X}1Lc$YEu^(V6bPQ&@(M7ZF zST+S29i>?pqf^D;9vSZ=a%Ix_^B@0=Q-4l}{zKA{4lKkHZD^Ppcze1Vx?@o4v|)A_ zxHMJ5WXW3a5lK?oI(n@T4$7tU5G1rE+mVHtE+nwMgW|r;=^M$#HE@w;e|)|i7BOmi z<%P3w)!a4^Z`pvzf&0x)^y}TE4@S|1^l#}nH#G;__eoAfwn87i09w*ZgSAkd2g9f~ zV058ZH$3+O-=8Hg5@hM}jTs3K05O z76abuzyQrA{o5K&7yeQXD<$IxGu~sS(8sB~cXb>d+=(NPK8}r@nV=88lm}Z`N?u)d z8XoDI3nNGjds3UxwJwFU%)lB|o!mu#CWFUPtKd-Pb#)i}@7juy*%`cfZiI3I4{6Ji zTMVmu9ge8JX%+M!$G9lqbN37$#IxYOLj)aiZU>(0QlTj~GX$zeyGLtJTu-#{_^&+?+qp|5n5?QurLZ7DT%R(ZVQ(5a@Bq#-iy z^J-x1##vA@*+gR-N!}5FLWdoKC bxV_rnoxEwwOEYB500000NkvXXu0mjfIMDQE diff --git a/client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index b31922a91baa26acce221a6fc55bbee95682cee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5122 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 diff --git a/client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 8bf840586d6d468c038f65a54da39679513ec7f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 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 B9OeK3 diff --git a/client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index ee92b8a51dd563efb6106fcb092c4da347c0a232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13199 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 diff --git a/client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 1985c6c24f7d812acf18bc08d3ab34e7c2994357..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23486 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 diff --git a/client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 12806c6ed24fcf0e6ee663bd6f4b26741722fca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7190 zcmaKxWl$6VxA%7mmt0t2>2B$gmR!1#?nY9&rKKAIfu(CfKnbOh?p(U08w4Z;gxBZJ zGw<9__rr-fbLPzX^q)EB7ptkRfQvN0vFv2O(O^kmKJ6tj8!RJz(tYrq|e7{P}ql(Ld+@9*WTCO=hy3s=jVdw z)fOk`oyCR*ezARnAN$_+d%xgkPiG3?9;{<}J+4PIOLV{oD1b;0plJYRO7T4SBgN%>A&BWIK#Fco(H&nI}{I7lM7Q}bn)&E5gzO`qxaf#|D7EbVyD`nlW+x(XaNL`-{WMjpHU# z%EI5w@#xng8mV3$G6FiN4m}lVh*M^F6yhR9p*;Jj2$&-Frvu+Myu;6m&nqW{adsOD zcLGSElv=1rK}>M^q#OL}#QSciKOH(z#^y<04XkUE6L#P$P9XjeO|E1#9Pjus3qlLs zy=Y36;HLmKn!++6SZ3z~#x6!Nu;szs7DFH{Uj7LU+5D9oLx?*;j07Kr7cGHt(~ENf z-QpCp7EA{^r0gjUEz*;@G1)XuQwh%0S= zE6%CV#d*%(OM(Zl`N6b5KutqG8{5gAfu+wV`>S!w5GiHT6TA{_hwg3;vF-Br^y({; zQulQyD#*A)N`Lpt2g1pwe%mT242QhwVgUJk126PbDX57t5ntQ@4Gv78k^HWtX%v!l zDvhX{rhE%UGHht`ZRy<#Dm1q>cE`FGW{-TJgil0~MWuOEE0g)+dy)s8EOB;BOp=N1 z%3_Hmu78kHc5djH6;VR>$3sd3GaaDd9SysP(2Dtyjo6QEt{B37gKd}o&91uuXVZDm zF-fMyVLR6WH$7?JsZz9Y*|F5rJj9)oJw=9*EGUT%7QKc2LNdq;*|k~3b`s=5NgeEt zaYMu2Mk7&t_AbXS-bQ17gqkXncwBK6%bP`S)X?l?7$(42@3c@&9;xAK3SODN=|#5q zvqFh>JpFVSE6)Dz_1QI!*s#t4KL&qI+t20$TLyQMoF4vhdl(|P`x9^NwjispLGqwc zzBQxz!(en|y(TSTo{xU4fO41TSq!Pry?a4ylz8m7VbWoR@A||2ReRuHTB5-7E44Az zpHq@9M|@aN24dY*=|?}!ml8>##VOSwYPh-vKy47Lo6r`^=; z^FK80D07U`uBAD2$jAKE_$wthk$I9l<26OVI0^dch~7+yM{`(d`<@Qk^Ibmf`5#{n zbX_SuZMAb4p=M*Z5oX0jVM?MsmklW;Gb+(-Kqji;ADmoZ%1ns!J#__V>MwN9-{&W_ zymvzjH(fhN`)wZh4MLz=t`mQDjkz$O3B1W1KKvHjlV>3uQsBP zspC3Y^RhL(eZQ$8^$eenr&MsI+Vmk@AdoNScsWk3wNC-BcbQMJ|OI(j9WINsHsBk@0O*;x^r;cJt;$z3gD59Id~7=8hhy*H>PfL}Fyt*C z5Jk$N+#QlTuORW7LYy<2iOc^UjlM!kR#a5t_}WoLRJl@z><*}Gw%T4=6q`g8&-c7^ z#=^NE=i9F{gxJBGtt^%jT26sI7WGLb1|iO-@C$n;@F%wS$pEnQ&TF0=YK^{gmNOGH zA!kw;myKa%)Lw>alL<#PdULW}{PDbsevi4yca*d`teu(#??ys}t@Ydg$Xn)sbZ#y!zjH%2!N@)HzrvZ>Jx{gHGR!pn*@V zGUJSJx#rY;F2PFkV?oG60|RHBmZn}#R-tlHiSksX<{PA|Yb z=TQ{Zm&9=Gn#mZC1~$x3UZBUhCQj)JzmK2@z=(p@5l&-cnbB{rbAu#VCUqMo#0qQ( zND%Zqc>|A>wMCtt z8VRRaLX<4(EAJQ~@-!k^NtT=8D34DWmt;~w)j1bI#b98HN8E|{)q{x$$#u*y?23wS zP43N2AZHy%Ql5$q+-It==kGq=ukf>u^Luob;%U1tx$B_hARqo}%CUyK_}`Aoc7~3z zauase8{6t$w_71f;A|smjllxn4JkEKPi+6@>Ix9YK+6z{rvzoJ+{>(nl5_ul9|0br z*lp6*7s}^dqY9g0Yl9}(I9P6RLQ8TNoX33@9ehDPfPTL&%pJ3~Bt47WG_IJz&qKo= z6TgrXzkk2ez&FV$we{_z?yI;>>|TFz!xR6$ANfz(jz1$?mgd#n3@bsz&^Dg$I=$>B z4Tvq;ichP=>0TTW^d7aF2DIV&51r;&mT2P+%k9GM(z@&>3?g_U#k&G~H#?ii{tn9L z8(O_WKJ|gfyj3~mHy+U+`v;7xe}^oaAL=6RI*9TVG+AEAq>q>P4Aw=D?pq;P*raOW zEU`H|^L5PUz_6WC%l>T2B*qSWRd=+u=z%xp+T%vN-%pLFdRIv}k2t%kBpOTEzJqDg z$}#rHkBs_@qf9iwN%_ha5B!501;HMGq$E`--m}INAK+v)FomGM7#q4b3VK1QPv=jl zbW>QfAK;HKVqze8eAz;Ylc>=XHdFFrQ@rG>!brffI1kCLTDS>g$usHx zHG{hy(^waqKv)Efvh%DK7 z4Y*f`S`6p*X$v=;8%5#5J-rU|eX)JOI6JYWtOj@P9-}Bxg|6_|MIDBWfOrA?qjPus z^wyuO`fCF#96Xcek<<3q#eT)BjtDD^vbaz-x`k}xaM?lj^XozLu;-u~T;V8qtOc_ZvrdXBun*lIk*sH<%M-~Tg3N{;cl-adegih7}tlI3TU1!tsKx6VSnRB3lX8%AKR83E+#R6 z_IYI*5Jqz=mVW(1t;9Ma1@``k_Fg_vBe6X0YX@L^DZ$bGRUz!5%Mv&>1jMje_r@0POFEzK=*-FF79J%e~+->GqeJ-xUeWlPf{_D|#dW z(#WFl;98mIid0tXu2~PE4!%OVBLQYge`55b~AZwXD@NwS0?x|HMY;=o(l4oqYL?=`sxWbq5KTc%6}?+ z97v~L-#&}Y-ge(L>v$qu8q>_)s98HAv()<9mOp#N?|JHFV;9dM2SNH@8It}P>UCd% zYbHpOQUdylW!}_EEd-^8leN=>R4Q*L$S$tSNqv(iEgC2Lk!C_^4~v?la^16POfl|b zs|9#Rm$wE!A(!v80_=Tlmq_-*+d{J*`xQvuFp_B^_3aFpMNloZ@W3z93h#2iqr?2eDJDy+GIN;=iY?2q%EnZou(@=JphX< zWYDgPBWR*Q_ps&-LMsSjFZ1p^e}>`O=4)v5gii4nHclBH7)R&F+46?Y5+>bjVQBQW zTqsFh1E{#bhdGQ`2jjxIA%MsZm`<&ZBE4CnooHdt}dusdj1D z0~J-~7czfIAIy-p_t|hj+pHvxKg-UDdYM<0&E$BaEOw^y=}ga%%8?LD;eJk(`vjUQ z=em+&P)zIdCPGzOa?|oXH2m~^_1na-B9ky{y%{;#M5Jub5i8iH)XvYz9SE!YIDGfp z8k{5VFy~-2*J~qU?2c2iGnov>0r#n+rRW#FJnH0KKdZ;iaQd_nc=nd&lEA%R9kwO# zQ7)O%5iR|fIk^aw=s=yw5)F>FG!oSV;D`+n}W4mR1P# z&LKDze5|kiquC?by=Wk60mzzYo@ZB&RX3i}g3v8ATDuUVIP4z`N4;t&hEfoE75XUA zUK)EF22Y`@@YfvFyX@WlF}TX_do?n)c`;jT8?9f+U7v>oj7AiC12o&(0g3OfQ_&I{EWr^ODO@g2YeJx7EMjquIs+%v?{lCvQ{< zDAc=s#y8;_#_b9+-eT5fzE~S<^rXbP1s0He6b4z-GxY{CM_D!tW(UuIFbE6&Ibc6u z9Z})hj49FRjP6N4ny2?~1@>s3w=NuG(IQnVW!3ehGh4?OrvawVRIbGq?^5wl!+59r~Ilm(iX|5q8bsfY5ppo??rqZaPMvfY=!U?AY$ZV3ygg+A8)_=_7I^m~_Z8-)%;Gh=2&oe6RH}#(SS46zGQ{U^VGFZ_J1%jv82f#KPjW#N zrZtyA*nIZXU^$YO{XhvWd<$&BJg2!P&Oxa5u;|r-)w))AkuCUQ z?1*_H5G3xDa%JM+tgD-zhy|C36+zcX;0d)hA-XX-U>t@X#X5!MS*SLF>p&RKF1C(B z@FQC^57Ar4H)izsqfSWpxg~UqIoTJ1*}}j{l;_SKX*$Mw(P=EU|2OWJ#B7MND^^yF z@~CJIBnu_Oc)utPK4jI_Atq!Byfq8t{7#cU32+`xO=_T!;zCXJ35hM^vQgF+Mq{L8 zopU%$;$z#!BcOo@1u6>*2!>fyX;t9p6jPEF?Iak}U6D*(?DpYG1wU`_86*Letqwus z)&vRcBI$ik&mj;I@NMOUXC6Vom%R4GP`p%doQ^~LR z65rn9PBs;8zq%u{Vm{S;S2{?)85g~5sn>cke=6*I^@26s@mF`)y-Sb%);Hz>80XY$_zHeq$A6hWSX5YV(e=RSYjNAfw^m-a%-b8r3 z=Ml^kWue41p|eh)lH!oR^;GUF`&L_2;q7uwIy6fMJ0htxR!qn=s?!O77QQDJ_u0C8 z*NDUhIELRLi-jpw<;(l}KZ^g(#X%CXQk9&Ds@B!Qs5S`4IyDlu*&3(WQpreGpEQla+P7T76FUC0yq2ilO|xrd z-5X5>9E@^<3X`7lZiBq+Rg-;s!ChBA%c<7MTWg-bIJ&uq;qoH^VV#oZq1^3{;^HD# zPO}jn4OrqXShSz%hVa3B%C*UnY29z zfX0vcSaF}ZOuKHnP0uI4oJNY>{0OZm*M{H}v6Xle9f^k@BrOw?rXPiAtQ=4AiUTuP zH%W;e(1*zo{oFQ8cJiE|4EsOnW>(`01{9kasYV$)pbmGKVlVtf;qHSJd0<3E>?m4- z5>6t%s&c;>=^NeV(+&Rf@m_AL)zLEdzC+S|Kw+j9Vz`>w>8{~h^v2sFoF=)mo<}$} zqR;k)8n|&ReBq@*JL-UPuiA?jiWo8j`fQTRDK)=`<}y-0#YJwrB_H-BzC%W-l(k_k zmXL!g9vg%3JAdDMo-ZDj;J_)9llTBdTsS{RW>3oxWlcz99xls{w$D|)&|D`wuzy7LsI_OA`#XSy3p zHhp*n)RI{1uj{bC>C_|;i-e>Q2A50 zaM8L<#&D6(fuOx?pN_oar0z*IQfs_AQzIMUywWdz8(43CQ)T-o6`TYZ$M!4A;1XiU z4GgAuTwyj|ys~AWADP{!{k{?)eWNTSqb;zUdiO{cpk+{#F_yhnl6eI?gA!+xlyO$i zYZYGB3k4cOq=N6~A*BU2>Y~;2|33adDIH29r*Q4kcg+2SjUz~IYMDOT|Cq!Zr9RX{ zOEK4=f6dCl4}JjEYzU8y=8G>KXxYsGX^&RDG~}z%xda+k2hX}+*9-lT|26DY=IN}^ zs-ga!_y%Ifb=iN~{l1=M>fmoo`Lwfmq!&N3@T(TpO~YYvJbg!W>XVUc(FK)f#k1*hIoR%I4EBDP82%?Hlos@E$;L+ttEyL?3(h_<|=8aL+)r4D{zIU>UYSbDQ zmA-xPSY0lX@a^@XSTVk1G8RhOf7 zlzDkLthr=1zi!zJ{QpW{@Vq0jfRbmsEFJ-V#|uwiE1t;)NFtZl)6_tgnV1zenmT_g z6g9%IHKbOud<86~Grs*79btST#vbyR^4FXDy2C^GHaPZ*vN9-8WEJa{Vw57@y} zwJ_NdPd`y~DNE_MwfO&mU;if^`$x_GKN9;NfM(fIcKwV|r0h6>`wse#_W_jT)M2$U H7UBO7yFabu diff --git a/client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 0668b97da966c7ed836cdf46839dbdb79b337be9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9408 zcmcgyBm|Wd=>{c*1(sM+5b18|Zjff_W+@5jT$-gD-rw_2 zydUn&m-#a1&OI|{&JEYnd;`Lx#RC8UAl0`@AO6em{{aWqPQEld|J_@9#Lh-v)kvos*zdfnO|?pdUHw-2Us?WFHd9S6?&v#_^UvEMx? z;uYsnt|h+WW*2<=3Rww7euq>_!T1i6Y8ibfZ@aSs-Y|5z@nwC59CP9Za{G>R0c=hm z|Hb+HOJ!YeH0u~;?qW4hIcV&0w6`(MCzJn3MhJO>wrH2bkeiTWu0Gt#Wb$8o0-n6~ z4|FIf4kEo5#9}`JdY7<(DAls;-U8h+G|QRvpG!d)B)i&6p_Z%M9e!LU{$vQbjph$4 z{)TrG6@t&)=CHg%#8#G36tZaRwkq*B@gu(T&Pf%UVJP)eRqt}RwSkbNR_dtsC)q8^ zN9infwTO{2OmU$<$oo?$7D5DKy&cpr?3wuP9d)x<^12sx*1+i@59S~jpy>B)_^m%V zqI1oF*U#_cZN(Jc&*MohRjorx`C^^FcrPig|0{R~D#&y5Vz#~e8^!&RQ>jC_9KNaZ z3pXx8(ErU+mOrOJC)&05$g5nR*)Zf7afGc@83#sTuIzJSoZ;u9(bZ}4lVzZ)ft*1D zc}YnMzxO2RGl+R{`t^2tqIdj;O#a~nU0+LjX)lJ3D~$A3iv#gI9j84J;Az*3As{tF zBLB9O1yHCUn-`CFf}Sf-pM$AZ8KFLF${ie0Q=uSj%KZ|+gbKCh3oK1Aj>}kDB+?1L zb`1HD^+zoS!*KmeZ6)!bOh-GH-Pg~ta4L+y1}7B6iKH3dbc`{Ug<}ojFfA-8ZVaz_`Pf zMQTSlmWcgyZ|QN;Z(}o{xRaA%d&=|TQ zIbb^r=#rb;(BrNE4d$Ct?!Jvrq?J@Vj#Fh8<13f)bwPc=j{a^s=f)|GnjyJ~4vU6A zN=2OwXi&n+wUd9rI0dAZ@1OUrwMW68b#lSf4>r;#!CJ4%uM1mQNhAHW{VT9e{<+F7 z)mZTw`Aia*)6|v^by=;QDtQjZUkwxq>TYoGhwEe9y6czK@jx0$FTA5@^);nGrrs#!2x{3S?elpg4_0MB@QDF`$gX-zM@PIuwUcAexp+wqJ|ssI^bD+cQ#`;E zxecaUMQgM9t279N>Wc^6F8#P)jGupc|PPnJY>XPLS?)`VVH+_iC7Km zC+kgJ!P%~kE(%~r-M{Pp45^{nchg6xuaRUNqD-EkmX8#oxwm4Q3x6xba~26avj{3& z+k+p&)3Q^Z!z%T$iQ2AxVsFE8WJJ(81?61)KoY|8o&5o}ws-sC4jSSY1YRmD+w|kI z&hA>*0=wTsJDn&AxKBstUt4WhM4aqE{WZ@oEWEBs zQRqpcFRCVcfk_u_EioDPkVVAf$)SWGcJP}?acbEzx~UU0LH|Y=v=lYq9%`o77anTe zpKz+(i|XQ9Q)H)=l4VCzj67L>kZ^PdZRT;mq*ONII2e^yiB_=4r2y36Kz!pDx+75E zWrX7}YV+uuHovnv5AZtNIF))1Q0z+*aUAbhSx?4qK!TL-gtV&c9snFMRYt39lexO?wqEm!Mw@6J5Zau8b@{sw69)wZj$P^))M_I zK|;)$1LG5nryg-fFT<*q36jele=kml$_{_|AXv2Zb6ViRNp+eZJxm|2Fw-v|KdpDr zJtQP!j8#=bampOBZ|>e;wz+#lT;5X4qg3W^=)vog zpg*hi-V5J|wSnRkbYB%hu6dIyVN#-%A&!kbY1u*QPRi0hYT}o&u^E?0`DhnfSf)3> z;8JZBz!O`g$Qf^>PiZ<&GA-n}guMwGM+6ihU);kV9@Oo-wv6$HE>@%n{TvTC2+Y5y zMYyYAg6)_a2k^6Yf~x-gAehEVR_Pbc^{TM-?D6v)y-V3e)`j4_#>Ph%XeN7>6RgIk zU99Q%c-5pZaRYtCvH!WmOT)-MCs+VkZ!+8Vd#Z+b%Y6!SqwekW^Tn@ha~6O0(E%j5 z=0at=u#V@QfktwI!7!(OO6I%2hx=qbEg#Ol2-ilZ(&!n!U-Kmqf~0t6q8Q^9i;!Q& zlXFP%oBs75Mq>={ST;{LnhHW0UWO5T43%%Q`@2prmRW|D<1U?_nj$A}^1Ph<1xJ)M z*kO=;6d6hMBl>+gC+)%yE%6pC!7mZ=>{c;TjTxGd!--czAHqWWU9^97 zW``n${OI|o&)n=R?>0oeozCjn4cH=B9T|wo_x{>ekPgGfC2rQ~biri?L8E&~Zwr>L zu`91S{Ko8?{6uCQi06BBW_bc<&5uc3-?k=S{30>Q{!K_+?-#L@IKwM^=Rh(O)cKP8 zlZ;#_F+a7Cf2UQ{(`YX(Ms|@<`cO*-F;Q+Kd@Qpa3d$A`}yxZN&Va$k%_M>mf!VicHn6$4JB#O z>ljHnCFG^Zy16tVX23t<_9j_oPS!mYZaYo$uXIp1Lg)~iDHy*3OS=ARIcTnDs?{9#P33mrPQhKZSY!p%)gv17Pv1TAFGie zgwPAQE4Ycj6`yWU9iGO~Ctxu~1tV?$(=t}Qjm;$QA1{WidfU-HvX1_30{iB~*!Y~? zfuh}_7=ihxmLR(e*$|!Rr?yO9`ReH@Q8LbQ`g^=|SHcDLv)f zF=X4miY;~C^LN%qDNGJY2V7Ub(EG=cS^PO@3IFh9Sy*_`8Q6UQ(Iby&GYwGaFhSED zZe?e>eI^#3BNhav)cJ3O^ss+AP>J|lw3z4fmp1bK#EEC!d~{5(ksNk&f`;qw^}_IwYI?LLrCcwS`7}u**kNm=qcN5SpD~zrWL|A4#%BIL!SHNec?#cx9wTS^M#O zhTP1MVAHw7o3$X5C0wa2MnsrZtSQ%d8KBKJK-I|ia+qS!Kx7nP2IL8^_(|ysi6+S3 z2oQ5an;tC4`Ks0lD1f^oEmtQ|EUS0JA1hk`-&lT>)khWcFXVl_aB={nz;a4UKqR0yZ0vlXsz*0^U)mD zOYA~UWvO?qUsItyW#L2UTw(UMz$^(#OlEkj#Z?GyM<-17W5Qo6;A@bh}JY3<>D@QSUs;=4aoZ_-&BrEu_HLZ z{U7BS9suay30r3?s43L?P^la7!t&%D)0nv*5#sKp@T>7P=sv19*M1Z73zt?E#@tNzJLG!k?4$zHq z+f9A>C|zY5lg}(vH2_fphr9dkw{i294EN9ify@Ci>%y6t&lja(j#{9gRnfz&6fWQ@ z<>Uvi)guxl7eMW#2ZsdyH;CJGLUi)^%_Co(&+zmL_%85gO<3Pr*+T;d;C^6W9kukr zOgPa%2jCqhN?0Bsi{s`W`7@po1Bs4F&~jt17R^i)`Rv34CyEr=&$T6(z(0O(I<4W$ zt-Sb|rin=gZj6!@CCJHblWSFCBLL&d*IB3u2H{K%3=F&j*2dw1`%dLJDd4mkP3023 znEZS~P=&eVgq(~->tykWrR_0xW7Ks5FfDBl9>p5(Wo4j>nRC{`bb4Fx*fdurOUwg4 zWI?o+le)M-aRR;;Kc$Ihrb2z`;x4cY*-YnpgYg3T0qw#MltSRKMCT5AOMn4Oj}>z4 z7D>$%8yn&>TNL>=a)cjsTg1j@Hk(*D$XSB9i~0P#|Kz66XE{Hv^G4-L@JyO#IZh%= z)X^g06c_V@Fr!5rJZK<_cQJf~3n0URHbXHVjagl0SQhZW$hT}_mZd3>3w!gs$vmBv z96k4zF&HOTAUv8u*3}3*<-dl%vxD6LOGH#+dMIL^ab)_`j{Oke^g`76Hit7+U<6ah z#%|Uc6gAplhU^vKU=>Rg#wvaYbC$2bJU9qq?o*{OWq>%G+l|X=>bsr)k@3bE+m7P0 z!GX<72%saz$9J@FUr_*xMFFpE?@spU`r9*`Bw|BNo0ZT^YOrqmsTMjmB1)^1d3kyG zIRLA)a>EuB66w2ormo4JJdEL7VkIQwC~t3w^y zXDYVPzHP}Q*`N@r>@9LQ{k11*sHU#JrpD@{>X#hlBY>1#7g`DG9X=d!2lWAqPEyH5_c7Djbqq|Hu3;ntIQun4{WOj4WrCCJl0}w((lZd*ky?ZB)AQ+AjsXVgb&R8|-m0mcY?Np3KH+dg)qziI)I$m#WJJC6)0iJO)M27#+Sh5i_^-ciP+v4V z8av82;M-3XT~;KE-J32Re1j30c(M|#nRk9NVxd5%2%uU(V}w8~YPoEoj6sXRkN#6v zKys=;i`l1CI5YJ#x-=+I_>9LR<|u`RdnnOB82|eb9H+cng}zk5XGNElL&v5G8;0ln zH9`#~*Xez$a0{{I|1pRAY>US*H&1Dl6d7EYTt4wsb3S4tzu7AO$XqFY zCL5+sOcvED3N7=^e+lrLG*2jVQ5_(TvbLepD35i+9A zfTBOEmjY|?;6o}o7BT_C{z`tsDdaen(LvQ1_h6eBSM>wk zZ{5Yul}!tU)sG`!>(b|27NchBD^A2b+Vi@rIRGzfO5HW1+~}{(Kv|a&2eV}`cfQ(R z(qaIQI-jvE0!Bg}AUqgd`PSBQt<9Kua3U>D5 zo&C-BFS;8VE>hABhQHbv}yT(~AwkB(o@g$aQKQYkEEY!Tl3czr@8gmodb7bTL&8@+VV%A8Xp26*uAi}4^NcEriv{@ko{hY4G7)-Y7 zDC#Q59tdtD`HT;kAQH_=Af}=(d`9qBH`wc4CcGh2AB}9PPRlzT6scN>I>63eB6PV6 z+4rLe$RKRSr9S5@zufAy0k|9&;fgb5VUf&sV5pFJ;z(o(DYo%^en^(2oNfah3I^9Nk6m^mFap>rQrHtgW0r@{ekqwOyJul6*|{XoS>Z} zr>@nbWgroQ9}N9a{R<-~Fpur!tL7g1kjI6lt&4)akYtmA(TLIKAqCOFzJQOkTV6_% zVgvJDK;c$y0cD!>U5lXhXwW6h?)(Xjn2CYBbr5_QdQnZt<@GG7M)t|1#wqd#=MPw4w&f;e5T>xK!wlA(6 zdF#-|O@g>Qn(bjOpEVIC7GY{3by&cIEbGM2>UcQi$I{K-2%b;nc{y63oCU|OOax;< z=gPJFk2k`{IzaumG{NH)Rr#&!bSR!MMeXTY-7zJ%H(EwY;r(EP(%KGT)`a)8Ml8t` z-$NiEGG4{{7n8qS&B&}q6Vtr%^c;`h8JK*^@43cbVozM&!Z%kfD@>wK zgZ|sC-Rd#1ynOx}9q)d&=Pyqp?O0g-8iquw#u};-4bX{;b(?L=7@{f61)1dSiblm4-G}CyM}+1 zi3;CRokO@hPAW$>WK}}lzq$}s@`Ld`JH(Rcr>SHnPsCDVB4nQ+jcH)UtI{rnl-&~kh zuxOb9@~1lJ$LyGkSjP__(+Lw9qlxez#4@LuyGfeh5vfa14q#&&E;S_CywT!9Ww2lv z6X5Y-V6IdIdri@Y0Tz9{5LM?(7Mm!9y;B0<`576r?Y?_I#RpfHQDn9aZUHNW2PUd( zULdU)h;1wlpF%>>0Ip?NUXX{wY#z^~Fj=v z+647ecgb^_ii9|2dxc}-iP;!i4^k~#owtnUCJxpqy0C(_L@?RAO zFACeIGh|FawA^_th?oK}@eaj_2dom-SaUmKUppG3xq)obJKNciH(bB4))Rz@ylu@- z%;-2JFcOk*mt;FCVM*U=MMt~grL45P%K+j3X@F6>PJLDI{QnbW}@7LUH`!-k((uhklL z3=>GZF9E-$$gqjVUIa!T`jE@sc7J=4z=H@O&oso|wX*^YD1;P+7uLa|p~n+N>*M`o zDEuJ}lzl5D)>4jR(4J|FoE4nz4_BaLw3wjYa4p!QHI=nhIVgZjJk&yT@=fS;Rv(Ou)HaREWj4o{k%@ zherz!tgG*AX6%~jKBiXyC`H55v!)D!PgQGk4%Je^jmqrsq&qJxMX|MzK&RH>t^qCM0lB?7$*H!u1|ZQmQ@ zkgQF-_EzDCRqrbG-kNl_%Ki7BKkV|1RUW zZK}=Zu^I)Qs# z7`s7u7?4e1y8sZr%TG)R#x8xH*-Q6^V!WLd0gP|m|5&2aa$%@t-O{;Mo%q$%!(HWr zRNNrZhA^w5$CHx4MF;N5RO;PLh$P-bP(hT;!CPH{Oi`q z>EdmDH&J&qyUxH6-$TcM+=P+_8O)Fj^LhM~FWvUGVQKeyTZ zF2`e|t56SupCx;{<{qK!Bp~TjJi`oK~fpR|qh=X~3zcdgZ`L|ajLQWvkJ=hm9bXFis` zCizr2Xtiam-H04OK@}PFT8dLIaQuR02azbK!oy(2nGA;=6>moS+4U>#U!&jDvYvfi ztGM>guX6zj%fCMf6Bq>Hql{P>>tpG({xKD~C-J!I;<;Av-}-NOi3PJH9~6v!sSk{|K^z|Jzp7s1~R4!Z1(41&engq?Jah*}edVb&XqnR2ipmR8rDb7#4Q-FD|JW zgjhti5hA{`r^@H~4)A63X$qHxOEw?()q&9RX_PpO_!Jg=zHrZml;km$_tfDcenBde z{Y`?43Z#7vg?aPT8r9g2kp-+^g_l^m z7YAGhV$^L4wpe0CF&4#Nw&;9$=U2md`)KTgH~y}>HvtOmOn|l*91hTG#Aj(Eu1eI= qJ_5Bqpe+;qe_C;J^4%jYo(-ZduBTdxj{kEe0aTSWl`0iX1OE?DgB;2L diff --git a/client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 1990288557add92ca26daebcda94180c6d0b5731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35211 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 diff --git a/client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index a730f7b80adbf79f6a9d8a009fee02245bfc4998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10618 zcmb`NMOzyTu!Tc#r?`7@cXxLR6u06I#UZ#m6!+pDph$576!#Xl1ZZ&y#VK;XySV@0 zF3!wmo;jO&&Su^O9W7;S3~~$r0D!HkqVVCr4*6f9q5M}rY`LNW0IagA3bOhE8|NYD z=|!tv7K8V1{NlmZt!u~#_yCV^B-QXZ*6ZrVcshebhDl}HvG=W0t=_fzx`eq@#+~)9 zH6JpZObxh9Qtia)IiFY*zg14W7w5B^##c;i4@{y}!9$e|2O?PeNAw>)LDlbrUtZs4 zfnNj8c-wxZ1m&%Vz2-kURQFoaSo+t{GA@l~O&QWM0%;llf7Q}gS^oZJWm3synRm+h z0gK!apNhZXQQ1`1uDoL3_(n1b(713>^@!?Nv|E&z7wC~+&{gjc(D*~b_CbO-A}2u& zGcOboJndR0O0RC-B_HucT4nFL+ucYxU5kVwS;&)3;Cxo&`3bPLuX8yZ9If7yH zz!aj*xAI3459aun@Q2{0D=oMP_@7rub{cbEa6Etme>>rnq04XY#1aC>e=+WM)ZxHu z>l%nVr8XthTUDx__1JwPFgxV0 z*hDr_&KnFFt`x&Z>ItI;myQU=pAPv6#%*LrfX94k!0ZhC%lM=vak5VGHj*8JnScN-_gI?Vnh{^RSaq153Q!caf=@Mn65) z<4!}ms=XxHfSznG7+|RVtZeJ+H~3tAS@boK_0Zk9NE#0zUf|86t;vHizr#6(R%H15 zZh>oDF|89p;TwPBV~Umk$9_wzhn#5GX!aetK7~T?0JfC=3f?U4Hc|~st2ErtXy|A` z4MQg8JA{2*6~Az>m*x3@kiMUKE?LC9gK2@;>xEHV0ss71tCTicMU^ZxDsA0;4Z$78 z5^n1qBX{?3kR7hss2_QJF+qoa;*OzpwaspweMBVZyMxvQV=cQ7is88aQB29k*`$Pk zwmX~F7~RCYbZ4(K+=no2JYAOC-FefWe2Cim5~H=BbYV;F#APVOVtzor)7zEz{`BLu za-GrNW&Aq5!ETdHU0^z|#}<)6b`u7IO8(>b&tx`+PGL<%jH$;4b45S${LndN@cB~S z0>cL)XNxP>*TpnjQM!A*l*9EQ;V)5XXb#EMmN*+0bWnF6bKW<~(_H(#ri%>@GFwxptW{MN5Kx=0w}z@@TF-A+Mxb zs?y5G(6^S(2f3!Ht;dJd3oo&>S2Dsb(Jha02mZA%AC!{dKF?TMjp=3If5}XAGpm3_{j%ee`7sAS)Rv*G;4`IA`U1xmhw$SQ+S2|R;86B zmNJaK()PdMuMQ@-igl3B6sM0-o;N_6Uy_n`)1YlsJHC@F$u}nYbDBJwwt-u3u1Ztu zUD{0o>*rIFmUTZKF)ANkng%b0P>AN*E=b8_*`$dn&AG$LMa`Ax4Ydm5yF2(3u$+T_ zwJem9u6bG0fM6?aWfseh4QccV2^deQhUL_-Wj1(iIwrX@&Pm4 z;!_QiRmhyh1s3!JpR{PYUGebt_w(?0bE?^c$Q|meN+EV#|heLe_ulU|v|N^JIpG0#pAcZtqk%H0~)O@Bv2Uva3D_62$tb zcESHX!8un2ucez3NzS((5RJ?K6Tkn|^T5*ZIAZW&vH>>O?~SSNaJWz;Q-h!4rno^y zw$0zjG)?W1{SW<|H9}*4>4I8X`|9GW>><_#z4W6E@^$YjV-4it-;NXfvZg5f_&INP zzZ+#Z?k8i+6K=idcp46*G|UI}rgF#ZLp`U}JIui93goZD4Ha&0kmnK7-N&uL9$={R zxKbWjvz)WqQPuk`PUwNX!oo^Pf@CHeMNPytsOh`AiZ?~`Wh1t8k$(zo*<|?>GpT`N z;Gqp^aD7heLP0pD6Tr+#G~(%jvhQ$A5H3!$c0gUh<5bA_0|@nL1VlGWpWoEt=3o7I zwq1GNp%RCUb8iBE*?2#kR;H7Blm{H>OF5H$Bo^phg57gh9b|q#+1}snCn}WQQEuT-*#R3qn_LKv%vph=v;Ba1jU!>9_eu}PG?JLkjx@SI z8#Q&xk3X1Vn*^l~yh=XWc=V!OYy@)66gA3vuv%l&HiWpLSy=@jwrvpvxp+4od)5Y>|YK7R_<=C4mQL` zw--8eq84zm{qeQ8d+a2i$FNPyq(swjJon1khV1>Za)_!^X9eA@EdIP*xqqc~Jpa_8 zRycS5Tof@WC0y_6>PAU};U_IV&lGfSC6*EMyOHrtOzL%hj{gs7J(-!e1vluyys%h@ zS@piX4lgJLi`!{uryXg~|J1;dhJ9S|JsOl-_VONMbG< zo#k^)@!`la1eaa#BmBJK~i8@Kce2MdK1 zOo&pTvcX$j@Cx`W72|}Ryp)=*c2!5qG`~D?&U%;p-()cX~A!h5#K~xLlxIQ$-(4@Mx)787D9YA z7~G3W89Exl zcB}rEDcvK^8XUeR!z(V@6vthkW0!ft%Z<;(H+bH-Nu8k!AwV+U|@y*Yavs8At`_70ojuyjg(NDkOf`%w$I&R>~4Sve9kz zxYLenxKKQzQj48R$O>lZ8A2W7Gb2(>gHV%W`^wTS2EoRJ4M z61L&nIP+2FMS)Tqi9S)orB?|GQj%uh%^rk@D*sYU(|I=8wwymY=fvhTq@@+|c+U8d zceoTNp*h{_VnxBS(p!FiP?!O8svoHgY`KB(k4WJ&3Dc|Kn0Ge_;ckENw7+Ya7HoBT zslIQ)lD3DNl;^2tx1COhybpL>u*Oa zr_7^fbe^={;{`0qQ{wcOuh4>0!ws_z7;E@7m%QbE`4MK4gudj4?aZZoE}hK#HWT1I zdSFB$bk^}lhapZT!j0y1|Eg?>jc!vl8`hTAzn2%LseJ;!Cp(NA@l>2$Hjg#tic_sk z*OU?rl}}cMbvWBw-M1Q(7Pj*6R2C5%3Qc<12F|d=St)ZT0?noiz(I|CCJ_Y82p2D7 zx(}APl+lPR?O%ag@<@Q5Dn+uzQN$N;zHUy86hpd$?>01$s%)1Qmxg&vXn-_^l$XOxbUT7sA_Pp)|KF?5Sw$+=SN_0hD{p`>HXL2fNpdaHos}TdT177Uv&~t35 z|D-Wd`xKwU+rNn~oRuSl>n%)b?P?r1$u~oj1SnFE*)N`NBXKYmOh?w+&?MeY7bPQ% zj-|tL(TEvo6E<;FBk|`x&W*={PfR@+Zj?YgEo8%e(TH>IY}no+0vd#-IM?jMvV?q<`7lldh;*C2_Amr0f%3NR@(%`C!$R7^ zP54yd)axGGumD8qbDYIXuC`mM#^%x%pakn9$ItM{mG+1;)`xS}(x0iIH!*d_Z2E!{ zHyQV!#>93mZd`yn&G%;z-{Q@_PLes3U;E$$zvv$=rst4`*X6n=Otyabc1Rois`)G; zZegxQn@CLSLCLt2J&qJJ1|w96*{{)fzdbnf1xPf6QPf?YBCWJ+mVg^_0`TK6^5K*E z=Ishb|2Nif##IQMAaX3D^C6 z_eAg}A|;6(%v{}lvC1`>>U;czfmK1aq|ntVoP^h@Ior|_5C+6F9|%8~^N@lADJ2sG zXS&=fm#8!RG1GbPjN*33Ula$t)VmYipQP+OOs~ZjTeh$RgEt z|LJLpNQhr1swW$7;Vj60<)S9@T&za9dzO8`$wHmhamj*h_A>9TzCo!2ZeU&4%JEl) z`5Ehs^ZqPw0V+O%gndslnPCjWy)DIJ#Dp+wlHv3?$6UAgUo z(I!L4J=qZ0hongnp;oZ$dv2F>L=DdDh$QYslyu11SMl%35K+FXLSwy9hj-zt-~p-T zFg)=ZgN33zFCK&j3`WW2m!Joky<)3TMfM9q8YT<~f8_WqU2@Rs)#Q8DE1Y+8vo2Gf zLIpD6G2*B#6gMH-l#$XPxZN4f`7D)O=SpGz5$M0geoT|E%uPY-kn~OT+Q?RN8`*kt&-g?HY{sD-OL2Tf{nrt*I@tF~>J z%Z`}(AF{fy)K}2+8f+#sGSZ2^P{C6C;Qb)0wV~Vw!F^K{l%^6+2!qQkOvKd3IUGo< zb^&*lAGv3$&gpya>53D9Bw~je(1znl!}r`dBzy4#rF(^2jM+1C`hngTI$TMr>@456 zgcm>`(_J6opsjH**;Yl*KFP6;Ks@qlX?YRh79#J?!i)gJ&qc>67_6-@SOj4bS&dB{ zY;Pz3eF;yS*BYMY*OMCIQ0hJdoNHD5!7wu-gM5+Qmrve89$u@(vzL{DnwSfGo%)yl zkMIgyN0v7WlAB4irUx!u_)xD5fmbDQ`s>_GZf=qbXTSKCekU_jtfMd8->iQ4GE!5+ zq;Vjc)iQEoQ+BYRJ`j=aU5=@Nat0p-a`9nJ^<^?Z!mCddrr%}GB4 zxb+|g1c$PmM@$DPn<0}5#(rp>o!2t}?Xh2M&i_fPc2vI*PD3h&iUv5j7kGKoBhUlf zv?zW`t>xe_0DBTlKk;~c%{yKG>6>5E810n0#ju2~d4Oz1vI4NR?urHV|2OXP>iMtp zJjA6eGBCW_1vu3-dX3T!X$?CqSUlJ+lrOyY40RMq0>bB+wK$HxGciiZh}(x}c2EaW7g4?4JiEJQb&T`K}mkmk2m|d*fM_Me(s2da@GBfeX-;x zz2rLp_o%Izh>0^@WC>uYgV}m8X_hj!ubzm2Wt6=40A@QQ`>uAQOBa*cW@q#x)A3b+hrBZTe@(=O5H84kw>SA#ZbsWlX2Tl# zURQC8;;ryOT<8&g!=GTt$!~)Z>%?+*mLQ-J=PMtqdd+)8WIrNlY;fY@$iXNMF(r>O8LG_QMBtM~geZnmew{s#yfd&MfcS;sBw`xC zH&S$dI=)?&7RT5ui^ig?zjuLN^cY}569Ih&Xg3FyG;{M$l3#w+_SJ6lbYZkO&4HkQ6A0AdO%TPjrdRV1p0P)60r6#0C=XaNrk#P$ZXD<@z{m zJ5J}f@3^=lsKO;l>!%10f6TQ<%8aGQvcS@reNktC<~U%Og|W%y>jLGJ&v~OOuexxa z+{y-MCkI3C@0!`?iV>dopgvwq)cQ>Ip9O3h-h+7Ko$dnfC#vmtUrf2et)LK;kUkL3?tLOqt8prT<_XckYF9LYIts( zxFe#@;i%hn5`LEql2}nVM${zKnt$m6d_?w%S@M%evth^i=%gMi7|cQFN6IT$;&ciN zLPA5DUSc2u2ht_j{-*!1p$;C{Qu-u1+z+upiIoxP8C&wS^UPZK&D))bq|=mu944m@ zrI{$UfpVsP`@zQk4bm>(7k?MFZ5Mu9u04!a{bJzmDf~c%>0iyK#l4XCqp+}fI4#Bf z$2N@k;hx0J_fSWuM}sNj422$0Q^@A;_6nm#G}{4p zScL*e_VWz!RoLzcGgXji)7~g@!ke5KJskgR2pbg(_kC96Nj^8UjssY-+H1ahyGPTZ zlr|}jxm>k3mDfmeee<9(LS<0p?uhWSHgrkKNA@|FTwAS;Wzy}ih{H7tpaYRPvcBN|X92nDiP3F*?V%-`;)jId`7Iu6u76^Z$-_PCktMYRT+;qr;?FvNd+8u+ ze`{FmtyR1?-Vx%#kZj*fM-yJ>mUCC7Vc@Km%~3gIJY1&DBWB7Gk{L&UA~sa zI++S3L_>QG0r;2Zs3?%r@Hw{q8%GA40)b$@XC~;>a5O02R5rnY3U+Cw%AdbNWuV zt0ofes?HS6u>ReGBn%;L7B1J*pDPnbT@*`Kh(f#q!Phe1=)TxU-*s^=a1X%!cewU_Gy+h_LC9rFCJN$=jhVo= zuq5GaU}5k-s${vMeJ=d)hZ<_gQCeGZ%B*QY+>zGNT_g5A0=9{CyMnNkbq*Yyv4L?W zqw(&YXxZ3kc%u!^cSt9->BBu)PT^li38iBKQ$GkwqEU=$cH>_+6}1-h-=&6mT6EpY z`6o;m!69G->HbH`hXe6YEU;1UiXub-t%nFx0jtpmy!gUl1>GK6MQU;PwEnQ~DYxN< zpSZpCV-|rS?Z!|E9Q9g>m8PHe$w2rQx0;2?AALId);4o5 zDhI)Pe%%RaL9JQU(XX|(^^@IDeB@TPnIdUQC%)G?fFVA}uCk>b*ir)z?E!fc&I++r z##Ts`3@T5Vl}77@F4X z>mD1--&;S+)`+7h0Rn8R@NZ0StC$VWx;4ea%U!(TQ9 zF&SJx&apObt2}{!e&UYZ({v2HIj$*Sc*fZ+)nA>HrbJlLiCTZtfB86!mLB;QVnsvQ zG$-De?)b(<5dQVDWO}SDvGbaiuWom4ZpiAp1oGJJ4~#H&t?>6}JgC8wyd{@Kc8gAmBkCUcn1#9zew1tUST?O)gC?}j?M;fR{W(L5tkl)aQlItI4^a0+_^;)0aDYn z=(_}AYWeDn^?V0fz6{YlG{~bCi*{t$n7+qYs?Oroy7uxW#MxA}+(Rp)i2lR#X_t{A zwYve&TX@F|7bY^@jWB)tW63c7qHwGA4x@j9Ex4l5uS9D$TRVf5nkZ+LB$uKJVgnyO(M12oTr0?u9e2ylXc^VrNC5dzgYq&jyO95 zset(d91WJKhyZ=PX!Q@AA<6XC)iy?|cg%73!%^dDvdFyhDIA&kf46r?jxgl*v zpPTBv53pV$`eN8fO+9Bag=)F zGZb(YW4y1B<^+e=TKVE$F4N!q9Q(Po_H>*Eu(Hg3cwz9sVTtT5@Y9P=D?lJbfcmwp zm4q5$16i$`3g;ans@tV|8xV+HgvQ`KUMQq`987@l7k^ek;SQ5bdtRC1yb*y zy?}e8MgWSQs6-d?WgWgqNedZ%^Az^TVZ%pgYE6HO8DdRqw}f@NkMU;OKTpI4)3`nb-$&HIc1D6}hoVgcGxG+~07Z$|PXRBdo;;EmlGUiZ z*I7=2QVMwuhJJE%z`{|tpPGOP;*~l#ZfLg9LRVi3vdqDl{_$y-9}2}D>^W4;)%2UkMV^(T2hhr&ptmK=O=wKBkU$WW0_}(1QWpVN`!TI2;dBdwOd97 zP0E$leeGUg!PsH-bSApT(M*KDAE|9hpfV~h6dv$JQqC}7#6tKhg{E>E|o+T{J%GUXc3EnWu(EaRjn2QbSVhzImR%~{B z8X5$b2!N~2ME5Yg!6i~O2VqwKKB9RC5*BizMjjds&${EWr;0t2-O*NYD#g@^T`WTS zGE%H~1#`>xAZNQ|I|l)0(e!aQSd&2|>h=a#77({Je)|(ObPC(sEZFiBVJPs z2bf9-^=T{t$%$*pr^}=}ODBYu^D|sL_FP@8fvAH8ZN@MJ8a8uO8Z{^i1%-%=cwtna zK@`dZ8&6Y+gp{&9Ij)-@OnBs>bRoLfQ+SGxseA$}Dlr@_e+rW|8}%+gpjO_+KKYSZ z(J~U>2_$jck{``Y6@nrq-HH0@S`K177NP$twKF- zzdKmyF}(Vd1mdM${}sRYL!^4-YChjM!1jXYdG>c`fYlRGKxpXjSJMgAWT%&J!uS}Rs)zk@L0QeE@+H+>+Qo8&PgT2-q`xK z^2U_bQS0d62bMs@ z!Dm_4Duz}BSi>##I^M&eqA%ZF0+`W8Eq9ZQcm$Q|bgY%C^~TJNpIcEZhP;r@Qp(0k zJZZ;xHi%m>b&-e$7-9i56ZLMpR_rRIMv?y_hJ^ zzcU8+S2b-(BN+86!J@KGV2c`|*Sl1OvM2i*@ge=VRoMM0DNj#|nHrHnPVrxaGay)U zlqsQP1h+x2q>fBWnORq4uU@!xwctaUn z-PWkUj)@>LCxKX8f{wFTy4{r;nZ9sZQ8B~cvh+@&AB!M?CkJ)h^E?}BaOC^b;voO$ z2UDydvf_eESba>1?q3Sb;-Tj{-e!(zSI_=r?_+AKx}1nZx#lX4G~Q;&=ZB;q~u3S(|$CHo=L?fp(toMI4cH5!N)`=l2P(TwscT z;LLSNIlL<%F+U__hJF1ri)ue`*bg^M93UQqpquk5VP zccsI=m!J9H)J8JdyQr&%&bv;!riO9N6?cWhP*!hYt#8vM3?`E-SRt_gNT*p#1^Iw- zm)fDhM}cb@-zvF%Rf_Nu99WPg;nSA|md3xS0;3+9GjI3o)=%w806fX@0vL{C3OZ(! z)&Xurn&t4VvC&>)vlbq}$}*g?e6t*b7Cj9t)y8ZW`(|J^xQRoutfir3y{JkYi7&27 zkJK=|J8N|P=H6>&)XPhHj>P>ZCh> zDt8y#e7MB=Agq2H23MuX{jojX9Z6A+mw%ph$F{I-Y#xtM$})M|2Fol}?Ol#$b_2@} z47pH%XF>hWvJ)E7Ws-S23go31(lg0n9?|!c8y)Dny&s;d{*NC^8vwPzuF(b@kMp;= zRH|by3*paD8~ww>3g|++%ZqXij~WNs<)|+S*u~4u3Kf$WE&9CjRh~*8TuaOY^8B3U z^`3;N4dff)o8c=*(WCVh{|&E9!=3%Xad8$@Dz*kbypFa~-G3Zk*WR4oJsnKy35_-i ztH^xfkwYcYs$9f<7w;GOA5k|m02G9gTQiGg6vH^3UXxqJ_P4-rB6pLHLcy@cui->l z=j}?B3uSHCa+PIQ;ZhcD|LmVxSwoLIWxwzb4$H?zEy;0&ck7h##TVHT9 z+&siy{u!9VE6_PLZyXG6Kat=A^WQQ3KXZlu5sOMUZwOSS5y;Oe+P?oWl>k*mEd{Wg HRpkEws@F~9 diff --git a/client/src-tauri/icons/android/values/ic_launcher_background.xml b/client/src-tauri/icons/android/values/ic_launcher_background.xml deleted file mode 100644 index ea9c223a..00000000 --- a/client/src-tauri/icons/android/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #fff - \ No newline at end of file diff --git a/client/src-tauri/icons/ios/AppIcon-20x20@1x.png b/client/src-tauri/icons/ios/AppIcon-20x20@1x.png deleted file mode 100644 index 777d73ec7e7aa6058caabe56fb02cc332053e5e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 707 zcmV;!0zCbRP)~4NEo1)MMAv-%WpLy^5-kYT+GuWo;7m zv8`|~`9p}9^VqK*;CHhv=7Nd`_uqU)tFO;2r755jzzyXz&<2M80b(#A|@^Gs%8tNb{7j+!i)KJ zb^=R+zXz})&Nm7ubvu)lF$SiS^~YUi9m1X-_TJ%@v4%)r#^8`8MbVHqck#UZ1sd;L zd)-u0-CEDk2d;}pI$1EMO~+eL5)I8B_^sjGZ+tP|uamxD$w_|#{sQIqTxg4kA8h~t002ovPDHLkV1m)0Ne}=4 diff --git a/client/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/client/src-tauri/icons/ios/AppIcon-20x20@2x-1.png deleted file mode 100644 index ef7c44cf9c3fde09e1033c106e64435dff046727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1525 zcmV?~UrS_)PcXbXgGt5GA+*w}}@8DdOKsz&33iCXYk6MQrAu@CalC!>J} z6OA!3eW~dKK34H3(KfBoM*f5pg@P2=1$Jk4emv*S%(@G^u*HS1Pz)#4wo8JLx2u}qe|)k;|n zvNJGQ*{tz+Tn^F;E`8OG=y*^S3V0FQDeUPqECCf7&y_JTF#$GrfF)0Z{E!=SF3{X= z;Dq79=xxQt z#~N|GDGZ_WAUzipJBdyT-7h6gjNDkn7vC>tweD^)H_K{oZ0ha5_)25uQU-5dY{N5; zH%M^I+d{FIF%hV)7XAzK9*7hz3@E<(^%zlU^$6cw5y;9B%v z+QGZewq^r%G4C#WFV5Qu{OgNtEx;x%MrKe+uj30z^pE}q2Oj@ej$u3a@Z~tpcGMv( zJw$_<5fTJjVJjE+oGj#;mmNbVP-hMuCIrkeHbMy3#~);Jr`A z@!1da1s!F70Q%n6SsO*W9))Atq$~nx2;5poctlr){0I&`oktJhk%l^aaCI8*e?5(q zX=THVyPxS+E@3%BJrO-Zz`{i6v~*M?ZQNe;0A>i7>x<|63m^TA+wKj#Asez15WLn($&~x!}qM7{vFU8Uko|q$iu=?(#Y| zIJfi3?*a9ACN}`bt!_r08~>sdJ|5MM0x5V7Vuo<@??fI2ay`D%OuP($isV*YuSd*{ z!Zs<=yY#xL;HQ<9ZNwLTJaZ}pC`z8_3w$#C5J{~ifC8Eog0<=3&f01oK#Ft{7MAb(ephPQD#LL~E8Knh|A{2- zXAGRgVJXBSZS~Z&qNl!%R-!a5WO=!tnjwxFGK;QNYcPF(8CRwze5$znZ(>(|iI8Ue z*t$i#NF5wQg-t!R>0)EU#O7v(t`;`d`QCy>ULLk@zJyD&H}KusVqS@`TVY=mAXof;u~bltiob=u zWqpOuonP>r6GsDivSZk^>$#GH+!IO)W9DDDmYgLjI3&$YR-yfw2Usf5nA+rLE+`ogXlA zp1@}%xkYs~k3Ir$ER$siM{@t0!=r-dgTcfDdHi>d b|2M=xVS!~vt%q|F00000NkvXXu0mjf^|{r& diff --git a/client/src-tauri/icons/ios/AppIcon-20x20@2x.png b/client/src-tauri/icons/ios/AppIcon-20x20@2x.png deleted file mode 100644 index ef7c44cf9c3fde09e1033c106e64435dff046727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1525 zcmV?~UrS_)PcXbXgGt5GA+*w}}@8DdOKsz&33iCXYk6MQrAu@CalC!>J} z6OA!3eW~dKK34H3(KfBoM*f5pg@P2=1$Jk4emv*S%(@G^u*HS1Pz)#4wo8JLx2u}qe|)k;|n zvNJGQ*{tz+Tn^F;E`8OG=y*^S3V0FQDeUPqECCf7&y_JTF#$GrfF)0Z{E!=SF3{X= z;Dq79=xxQt z#~N|GDGZ_WAUzipJBdyT-7h6gjNDkn7vC>tweD^)H_K{oZ0ha5_)25uQU-5dY{N5; zH%M^I+d{FIF%hV)7XAzK9*7hz3@E<(^%zlU^$6cw5y;9B%v z+QGZewq^r%G4C#WFV5Qu{OgNtEx;x%MrKe+uj30z^pE}q2Oj@ej$u3a@Z~tpcGMv( zJw$_<5fTJjVJjE+oGj#;mmNbVP-hMuCIrkeHbMy3#~);Jr`A z@!1da1s!F70Q%n6SsO*W9))Atq$~nx2;5poctlr){0I&`oktJhk%l^aaCI8*e?5(q zX=THVyPxS+E@3%BJrO-Zz`{i6v~*M?ZQNe;0A>i7>x<|63m^TA+wKj#Asez15WLn($&~x!}qM7{vFU8Uko|q$iu=?(#Y| zIJfi3?*a9ACN}`bt!_r08~>sdJ|5MM0x5V7Vuo<@??fI2ay`D%OuP($isV*YuSd*{ z!Zs<=yY#xL;HQ<9ZNwLTJaZ}pC`z8_3w$#C5J{~ifC8Eog0<=3&f01oK#Ft{7MAb(ephPQD#LL~E8Knh|A{2- zXAGRgVJXBSZS~Z&qNl!%R-!a5WO=!tnjwxFGK;QNYcPF(8CRwze5$znZ(>(|iI8Ue z*t$i#NF5wQg-t!R>0)EU#O7v(t`;`d`QCy>ULLk@zJyD&H}KusVqS@`TVY=mAXof;u~bltiob=u zWqpOuonP>r6GsDivSZk^>$#GH+!IO)W9DDDmYgLjI3&$YR-yfw2Usf5nA+rLE+`ogXlA zp1@}%xkYs~k3Ir$ER$siM{@t0!=r-dgTcfDdHi>d b|2M=xVS!~vt%q|F00000NkvXXu0mjf^|{r& diff --git a/client/src-tauri/icons/ios/AppIcon-20x20@3x.png b/client/src-tauri/icons/ios/AppIcon-20x20@3x.png deleted file mode 100644 index 36f9af0f2011afe5137173b585026c469ff3eb7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2414 zcmV-!36b`RP)nf{OwGMr}}0)rg0pN=SrjLaJ4ouTGh9gIg zV0d^K$BrGt`Sa(!g@uJRRdYNZ_cED`*s)^=_Uze%-Me>xMaG5zvu1hpPMkP_{rmUp zW0cz9;2;hjJgASMtSbf_zF=r*2>bT!TjVorM%OcFv3phe^5MgWv3Kv@Yl5x`I5d%~ z!G>QDl~yTJ2zn{=t_rx)jJI#!ULMt`lCnzKjvqh1qS6X;p!%g^wo-_~LTWA20&WgHUf{*~4_T zBw#iJ9wjCfoM*#myi)TGHTqz-9lw6?4(z;Z13KI2E92x_CaaLT3_F6)EQmtBVB^T? z8T|g$F^vDOP#5S>R+gPHFgdx}v={j>KfvLBVqyY)eSIq?6(Lw|Fa6{m93ZfIXq5vO z3QCX=rVrF(kXo~J&EU_(lj+>F=z6P(+>C==&z{A*pUl*)X(lHlBO{`xr>BgmrVn#t zy4VPV3LpIQPw&Nn2kwHMb9Hx1^czKf=@BSCDhWdwBm^BfoY7}V*M%qHIugZc2dyas zM}OOoj&w|et;eNV_F9xzHhuaO zs9d_nV96>4opX-~1I0N9owvsEhevNO`*S0$seoA&htQ^D7M|YrEnuDqfM;moHBbU* z5Fpbqb+`CvNm!;uoz6`|YZ)9|wWjG_L7#ID9vkSOdn6p!gNRB2fYXmd&ik|MCS;On zEEE@D#X0#3AFL^Gg@V!OWFE{3JoaJoWx-k_bdr3yzdMPz#e?I8FGVr0(A%5FV}o6I z?brpaWk-3@sd(({>L681?WYWs0SnGcbnVesPvajGQ-M8vRp>*H_ha9#O|bKh1|3gG znCUo9o|(nR=L-QTiHL@sAT)1Hw*e)kHOJ=6u4|CF{%0zWf1aE6eJP0KUI0DRT6>D- zxg}^{j-?a0I90?`!y`EK=DFZGp;_2<2OR1vlT4s5mG*_Ue1Ftl=b8B6VqOc&;1si| ziia7jN$F!tR||bM!7TX2zn;U>um2Y_^Ch37Gzhk-fI~*r-+Bu+7zqk4HfflAkyw+* ze1L+{zb0oF4bGQ%+2B3&5!i2cwc(AE7xBBJpWw{oj4velF$b$=OkSF*VQ$+tY$R|7 z(F;dMSZ%WWgIMCp3s(Y0SN$EgBxCr+Yaig16X(h)jt9|kz37!`Ly-p4?PQ-p#uGYX z5paR|oQ<>7bBpe+oEh`hgcz;W~ezrgrl7~7r;q0zQ@I+76FYh)v zcgto3tlLEz8M_rOF)Tq~5ono#=WSPiOH!JMO9L_Ld`w7x8DuMIcOcoJP2ZyYT`D+e z@hl8~?*SYd7>sBhX6>;F+oH^hHP0dqJ`&4fy!T0zBozd>prwz{#Vwc4Gl>LQ2v;fT zI#n~N%!MKiQo^uknrStCUCV3?s4v84-W)EuMcjro9GW3%U-fi79g-#vJ+X~`kzE5O zjhpJrLcHhDY99}Rzq`P72rNA_M`Yz!@4pu^UXk-kc*Fga%s2tt5xz-tq_!z) z)44vK)uCDYRDkTx;6q>yorh=1b??c@W}Wiu@~q=f+Orz`x(oaX@(y zEdcO(5raPJj9|bR!VB`p*y;4p%TqxPa{XC@sr)L4uK767OAnrnoSMhq=O*y{rBir& z?m`gzy;Yf6nYFeC@q*NH)|W!i@41usk^3inM}7nMs|?yiTo>FmauKW!>LW#Is>Ob$ z=5T7^5^$XcVt zo4a_lc(YgK{*NeXHZ)R}m1SnxYsq?Z>*2cIT#EI$eRy4N5O2oTd)#P$0`PVDBM))& g54COr{(80l1M`SPX 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 b|2M=xVS!~vt%q|F00000NkvXXu0mjf^|{r& diff --git a/client/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/client/src-tauri/icons/ios/AppIcon-40x40@2x-1.png deleted file mode 100644 index cbb4fe133ae2af4741021f8912edd72a03c53647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3537 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 LNkvXXu0mjfaRI2u diff --git a/client/src-tauri/icons/ios/AppIcon-40x40@2x.png b/client/src-tauri/icons/ios/AppIcon-40x40@2x.png deleted file mode 100644 index cbb4fe133ae2af4741021f8912edd72a03c53647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3537 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 LNkvXXu0mjfaRI2u diff --git a/client/src-tauri/icons/ios/AppIcon-40x40@3x.png b/client/src-tauri/icons/ios/AppIcon-40x40@3x.png deleted file mode 100644 index d6c6ca5eadd5ad50aee4d5a7e38fa35f0246decd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6232 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 z 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 diff --git a/client/src-tauri/icons/ios/AppIcon-60x60@2x.png b/client/src-tauri/icons/ios/AppIcon-60x60@2x.png deleted file mode 100644 index d6c6ca5eadd5ad50aee4d5a7e38fa35f0246decd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6232 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 diff --git a/client/src-tauri/icons/ios/AppIcon-76x76@1x.png b/client/src-tauri/icons/ios/AppIcon-76x76@1x.png deleted file mode 100644 index ec7d71cbc386d1b67d700b5387fa71aff7362c2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3243 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 diff --git a/client/src-tauri/icons/ios/AppIcon-76x76@2x.png b/client/src-tauri/icons/ios/AppIcon-76x76@2x.png deleted file mode 100644 index ce55e4d4ac9df75a05555e583cc372e7bc377566..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8569 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 diff --git a/client/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/client/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png deleted file mode 100644 index 3b6a95c3172db80c4ce5647530804aa5800a2f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9605 zcmaKyWm6nXvxc#ti$fr|y9Qf4xCVE3cXthL!JXjl?kpbM-5tULixc$Zd4It9(9>Q0 zrE9vYrn=_7qLdV*P>~6cp`f5pWu(Pb{`s>13=#g{>GoM33BEV2HA@pF2%2g#4%Id_CB#Mdp0I`Mu1{+}*swAxp}> z&KzNZ+r8(rL2H*v9nb-L6kdw1y_^Cb7M`h`nkx7Q2_n<1sU)Sf!DGP59oYXtXs07o z8sIABN_qlF=kJ_x?7e+?xNUo6(QYHFX(n(=ou`*(4Cbh5#sV(L?#eUPz)k-z{Qq;+ zFQNl#e#s>%viy%E)8>Bf`?@eEUBIXj{7%+XS)|B??#d;GT+fAw^g z9?M`fF5~V9p<{E~mPht_vo-eJ+eD2Xpq z&Nl=tm9-Q8DC;HXTa;aGgdwMQ9>;CFHoG;^dAFN@7A7F3T|4AQerNAh@5}C91Zg;8 zid#!57l-Z5-@b!*{@q{%60&>JtF17dXHi+X*Fnfb39Ek;zy*$ma93kdT8G2-Bj$L( zzyGb@f8Z^tXVBk{ek=+Nm0)*zBHZ_~1EJM^BaO;DS!Q0>u?M&J?ZPqi_IWUXTM&4J zzSd-kzUeZ->~wdk+-S&hh?}vzmvuhbK)LDk(+5KN?DOpSal|Gh z&>C^`e&groHy({AKAcnJ`BsLS!_MZ|c}8;spG@G0%9X%U~Cc|QV-LM)9n0Q}_Q5H5Iqt`@&-w=ibqZjAe+}ncz#OB8Q*--)kufk~ z$D2K#yPKo|P1PYLo$5H!3(IE8wtkC~y1H*Mb4vm(khgE+aK?Y#_0^N8M4rb?o#9e= zAL<(80M??AQ|kxI=b~$_Ivv!MNN8yI+To_I-J4;-`haU9t=nGhdNTt&fSYj#>?PX! zjMo(xA9k7$!f-)9I<<_pYa*j&Rgtp1#hw3h51Qdu#eyESsI?OqOE5*E=(N{&VB6|+Vfva&No%{z zxS298z*UW~h10g`JkXOkeG?wm%Ui{D+Ll$P-ad-e6B0QD=w5;oZ@%m~gbnovCFDXeHxH0Yim1=%Gq^&g zfPW;R)D7kf;ox=4{p|A(Gps8o^zkbJ!rT04AJ=tg{jIs9-Lm#%^wBtcllaVry?(M^ zisseS`AFbkn$}>i4!zoa;f{y>1tDv?8vTxX9T;w7f?0~7r%Y$hBn~>`;X*NzV8!H+ zdzhI5wF6j09UmM4r7zt+NmE4>gsSvuECBhBVl=Epiq+ilHmj37*ZdY!r@?3}fkty? zzk5f7-37xP6x?JUxNp~2-vkhWWg$p{>Q0509tBl5f9ghhZuef%o@!7h_J$RA5I@`o zVQ9Bq%45I(>{;8ZJ-`y1v~~W9CIhE4h)2^qTc0)4<3&~7{*kCbi#Z;|naJI?e!vD) zs%)3gM1N1&R8Q=PDdr3RMjRUGeIoEQ7uZSi`Q8JYO)fLv&83NPx@hAS#PIbt_2xz6Ch4V|#(gpDg9>s{&I zvQ1aQ6tc7j?=gP7l`fx20Sf8aeJWvAYFGw$-mc-bR#%P$e8sTbN;L(Y*v*|xt_m#> zXk>>Xt~y8pUSMO4U%~i?setiQUP2?Xaa4hNla%@f$G;!4Dco}E#Gn)5&|<2^_8W4d zl30dfR-7G16;2|lyZhV{z(_<@{U0pUz*}EU(K0b++1bo^&LvnppUS^(c9l!jZ`$G} z?^j)Q;f6jRP_d{Q1$M-0%Ik?kp`xfw3=b+(u!>YV-(r->g{)mawndSVsqCQ*gs@Ox z1}H!kqLA&+4NA~HuN{|h==?~XwS>K|6p;=_?g#OxN~;eiH9~e%15qRRT8?IpuTrm+U)#&w zKf2TR(>$B_G{Wwy`1Y`Qm@DQmIH*Ok3pG`W?qObw;%tpX4BKKV`0o(_XjQz@#Yl+z zA~8J7KLAt4WR3J|*_q(OA>U$AV99TY&lyt7l`+P~>Omr$?szteIB2v|&;?ij=~cyhcQxgWJxeZH}Go<~O|4L@MYY zEbQ{ibp}b5oBZnGH#ZWDQc0B^$iGO{T%3B<3Z`kjpSee@aImSR;>5lm2F4yi_8wt>Q)$noA%PdCw&|B1HOqCSd5Wi0qnIbEb#{qQfk`om_t-&n%F<^qO2%c^<5d> zPJZV%009b}Q5V|m{O^0v=(y?M>1G%P>s|*2GBqxca)j$@q8Kj6|Gq&c9>V9A2WDNW~Y}aPW7RIoyb70c06^LNQU~ zK=hC)LH$d5UyCGPAyw`CK6+@rcYd+Q&0GtBdPR=wVTRA*T@%Nv+LIp0_GL;3>FfPP1rMQpKdA{JwK?w>`yP3f6HHOd;L^*<8# zF6&>$&RIef1MM(ZuNi!KDrp!FC^wgNq4v!xC^m|RNk+P^*`J0Y@cK#pt`Grv#P{MB z*`PHi24drS<86V_KV$hSxnxPTinS;$%oO$*PTw(`#sreL3LPCVGR&WrX&?+uOrS7>jvtYjyB|A?nr@U_bgO0=9(4~@niiIbmt($qk`0csL%L|39ojnJsCy- zWyCRC^Ik-?MCC>%qKQiid{2*)JX2GrbdFCh{0i~t6;{;C#iw2#^IF4{baQTJr%oxI z+FOvxJj|!ZzzzhGje89!_ogs`4VWCP$lmTcJd}&K@C{Kx2KB>P+?6Z3g2o~SZk&Yc zZN;$x!a+)>!#lbsyMmIL1ThK8n*%NaZx!lnW-WOb0!$}Oz4?jh6b3{}qM_#CZ9B1N zoXo%47WsqDd^-XTyXbx17`=^e>OQD2z3XJ=L`XSTO1b=fRVW(w55AJ@7g+02v@zq)k zpX*N@qEXx3Q2>fyC?hxRSy5ay3bem?kO*Tx$PW5j{a8QPpZhZ^7s=(u7BT<6p2SI%> zCY_#c?S^`b##eL7Pm`XWgN7G=J@6?@o2B08Q-=V39=2cmX^|XL{j!7{BlK@{^X%i! zO_U*(#IS4Frtk)Sx17=-nPTnsx|&SC6}-7;YX9xb{gm<>$%ZDz9Ro@Jp~t^GuC}e5Wk3GL!N%=&u5b;fsizVus+8lCFB_0!@e9Lz7JivKhal_-Lm?>U znp;=MWVP-yw1`383NIbB)&#R};&gD)!di(4n~7}LN%FxC5l-mrF?5@Y(5xLEj3+n9 zykhr_XT@g4WjXy>!47yZkUXEuN@4y@(^(F}Jf9;fJLmk(hL7()iXFwjyByVxTEh;D zXXOor?<`q<##htKdVxq+P3Hb-(m^x4Ur%)6xCQO*d$;;&yYlT2G5c(SBPQjR&3Rci$X# zD7%c*8wm2W+ILE(ulIk^+2KhT{`VqNqUU^zsHSSZx(Sglz-JdP1z{gu&g5nX_0TFt zI4Sh7780g)L=NOQJY|<9fGh(b$lZ|VGo{-frJuOX?90;TN;EvfJ9C@Y*lf9{`R^`F z3iEUd=a`{!L<#YcW_8Vbo;~uX#;JhhRgttxN>`VIl(3e z()NSnBhP#k#AuOyFS#d1)hei{ri>#{&CZ_wTjRu$&NY8>5t_!Q#}KJ|@%t7fv};j` zJ7Cys$C+TD*FY#lJ2_}JR3QP?S=bQ&@7YHoEf4ztU4{GMIb3fM7ifbGJBik~Nj4#; zCg-fg@Uk?7c@6fEow9lw8|%+t<|Pi59>WRtvOBS z=_cygR=5<}yIq5RX027Xeva_f#j4OU$uRk_n!K!kFo1Gu}tA@d99;i9$rf-cduAM9}oMDiAPEF z{gAL0?kUyPvOR^epJOdY)rewG2OLRK#eb}%u+>I$*bg(0wIOO%fVw$O5bHL(%N;f{ zle>9UIToLgknHJ*1;hrHjf?9nFCpBjr{*N^ivw({cPA!>ymm&`f^L{6c}g44vfP#A zo@)SxON=eSTdLjE2(3D1;%-#>(-?D%ha)TZ79B)MRyO#vLdA-C|MA4AU^|GLQ70Fj%Dy-UZAYMYd13am| zV>&J!1&L9}U_MvmQpON7LZe1Un3FJu38#&%v+mm#8?>2pGe|TR1@GGAR?5hunWBNHV4RInD)z4No;M*|^>tlb354Ts5@+UGMHXB2%Sjvy` zV7#Vy033HWE7C)A0^Uqs2>T;1aKN08>ZDD`hvPN-v99212&F2e*y>zX!6khBHlOFJ zxb#Cbu;>`66u(n8vrwtEAE%uGk|S3<#}1TISQ30@Y`!A71qEikek_^dKpHl%Z?{4x=;HrDeD|F$X9~2 z%2A1h1(YT(Pws}`x;b4s-?t8*0`y7avso4%<9WM0)D_WRcL@Kj8+{hc`Y0Llbmusr z`I>#el*b#-ij6QcEOlXGK`A#uJHh(o>8$zm&8uwp(cx0M@zv><6O7y=61U3B@7NAb zZ=(J&j@8QJdT%+-p*T#hd$^i|AAf&K8EaqJ{Yg%t$Ng?8w`-@9+FQwq$D-V`SV%xk zwwB7fD1W1#q+9mQPtwh#aL$-phKQDS?jbh!_%GN;M<=N6JeSZW`)iRk8m)m6wnNhO zv3JZKZMH+OqF!UHK?0sy7oS|GdQL%AW0(@RK3hCtR?{Nj3)#i(347qe$Qp&l`K$E| zdLNP!2Tywdf={CA-UOe;0v#Uil&0n)?4pdarOKrH=-UbDCZgfSlSsxUgD%>S*tTc|8u=Q(Xs{_;ny*!%jdz_Zi-v7z!S5P?nNeI%v&odRDze;;_eTemFE! z3hSg<*+4(!8etJXBCzw?w%t02W~;@|Id0S@>hl`zW8M4vs;;5}v_s=Jt$lSLXa z;cMA{K>AE)r`-cz3@9mfgRyK{EJp{*xP6+uF2P@-XeY_?IFe`M-WEf6*cUwCs`|)D z`eW|Z@fFVTkdkv_bXmD(qD+r#B6xu-l3GLygD6QsIw#LrbyR*XOJWRKJ63q!M37{Dn*(L1| zF`Nmo!+w3fnJ8~+jGGpLu?*!CLorUf_2Ku2{X{vmr-O7x+ZrVXR}dh5-E5TWo6x)A zQ@9MrofBtf>HJ?M$C-bX`ic029wu&C!zOY$%wmPFWjmSW1Y+m|XlCEk>SZ`QJ7PPm z$!<4QcV5HJ_s&#ky|FhHf0J{H7D z!RzA&w0Lp}2ss0K1CP~JszxN60EO)gm|&;;V0Gx9VKA)6wTvXq?p?6Qc&uHYT~=@a zbzhkEor>RhR3GHYM~eDp`bxn$)I{Xvl9do$#A@GwwJs9i^AkfzU#aH8z1`tCh%_ECZoB4Zs|9@ z@36R%{XitXPu+xen*QyYcYNxV=mksMFMdl}OOlF8W<2_5VYU`Ui4;NB@7MVJ{9U^f zb>L7ueL|6c&FNK( z8ETu`<>y!1kWjf_`!OZhgPu8e%D6q2T-yPwPH=9c+0vfuRNC zj=x=k{HmjfLge!2P4VHvv?Or^h5HVpn&*No$8|TyzRSuXK~b*Kih>PWq`oTxBPO+t zOU#$RW~9Q)sp>WkrQs^H$iy&YhN$s zgt>71m+e|A=(CU~!_7wuB0kTwaLbmPSc9u*JaN35SdVkU=0l;&V@`IuY+!E|7RLiuys}Bp7;VVCpcT#CncLHn!_R*zZ#WG z4kMCIg}Ji2+4#p#HL~#D1N3ee5B&Fy317r!W`X1uT+rEQTP)wqbH%GA91Ed<{sbzv znTw>n!11gK8h8t~P2kSV%w~-F(2NroAIvA~jvN!!844A{1>Z9>hi5&H!T7b;gsN?r z6P@rL9`(_fL?wmu8x`Nf>($j;ARD-JF0~P0cj!m$#O?IWI@@P$!>s_WNLtf|B!lG* zSc2ERZ;&HV$?+$9NM#yfT#$XRF`6cudq`Ft@dfI)FKFQon8AXFI7Ch10>Da+6E%#c z<|Ss0uko;+R*}McJ!+tY;7Oq+VW%K8WG?b?`aIt_Rw3-=lY}=Gb!!Vxgf+4CQi+*F za+kXk2Jlb_b}*Xw6&1EYdSfF9aOOXsHpFTv%u6Y=Ly2XjXg|P!+q+y&d+3^l91=`< z-=kGp2NQ+kyO`$sw(j+GTTB+Ggukrr{~!n2OYY4~qAUXX!wsYa4!$OU1>t2+EtrxP z&6GVxoMZ-C9H7PWg+5srBHI0k+aoj{J3&%xL`wjX8u<{u=Jn78E599 zkEPnOUH20>_nXZrkBqQIK6$UloxnOF*gDIyf!{;ZNe?A;H5PfyKR{8t0Mb~^}^6(zr-H^K`y5Gan7G%Yd$Qk4o zOD$bpT$+;ScvJ)-1*7MtFYbN0){xj$0Y^2V6MJ9vC%1jsDEj0q{z+GD#p^-DCae5i zFoB2#+Qs1Tult>k(Sqowv8kl=CS4$ZMbjqiPQaV_)8xdAN``HS%N2KU)7oc?fjRrX zBTudn;rk{Qwe160;!3J@rWoLL{Ma-gUfS3&+SGK2MS>rz*oMPJ<3}_CgAHI=ScV@1_!FqW$8d0Ky*re!9(Xx?G+uDnn?-O<+^ zBrx>Cc*XXoV0m5`;H~MWO?|_Ern2Gqt{mI9TC*pvYL%CqM7f30QDEF8Zo>~xVj753 z(_XdMe(61GIoV5QefxO>`Ep-BRbWBp_fHzOsO1_OxIt(Z4ov$Mp78w@{mH=_-K}aZ z-YzjQS-c^$lG-O%%_Lg?3lSbUwI(^-pU}ma$cg!B$#ByAQBttf;MI{dw6kF4{A@og zVHo)~+w0Pq4$oyZVBlCEz5m4U4aw=RzVs+Jdy%tbzcry_VR(V~u96V6XIubE0FN)6 zm3A1G;X`HM;s3Ow53;hysWlR_}>d+3z?iDI4d^e$uox8jVDfI*k9Y5l6BCdGe0D z^#txCd6jqL38_A_y;kbL3f9UlB(&9vN}OP11t3#Yc>Hg+96GvSbCJ+EhWnPr8t)HiK|s;RZYfHQG~v3GY{x-K=(r z!mJ-LDCi1EFpu~5Ty`Ov-@EK{#QcoVmKzsy!Z_J6)=)zr7C;Bmyei+G}> zXRGClh-5dlq(dosFpoI@d}?m_720R14m2G#s)Idz=r5|j*d%}2Tl*FKE2G9wb{;>P zuQ|k=zCA;>(P%u$^`9nR`DH*}1+8@=*iG{Y0U~wzi?PwWUPu>Eb>Y`O^dOQj-aYh{ z8)pVndF?Z0?Hj1ZYd<@^@JZO@cU4Y>_md+m?IM16-mkE?CGu5%Zo~+haLQeFx~=m{ z=8=hN1eQ|3bctL#w>p}^`0^}^e}_-BgQG1^b?M5$G@aX#E~$op!d05?JxId3a=}}( zR&T6GNgg|Raam1Tfm_|CYq|lIcP!#CN^&x?3Dd!TaYq{eZzY|lYu%JC(10F@p(kIm zvXIi>;d5_u;+$5n4-B6=mhCmw@65f6so}zU7m*&sbMs`i?-1<1iDbXFJBJVC{XfEhNJyH0aYXKc^q)9uDj5Q~8UBwsu<6>= z(YZQhK_)4!lwn6RFEcURg$AIaCPMq&9F8>$+V{f4!yA3Pzs>IKkV4o^ldvUtNPg#f zZl4WOX{ULVqo#xT|LMJK>Zu0lo1H|Up2zKT|1|+c{-toa2Yn|c^b@U>gXsR%<&ii- zyDd&L(uyLBm`PRNr~Rt^BQn(I;w`27e$1LN)|D9O6x0Yi_F%^vbmsVbkqL7~$)!ttHbjrN`!THHTV0-%4PH8+ ziZaT+XiXdvNKt~&ALKT^a~rC%C4A7(|44z_HojlW^F}y-r3-YsJea|&4Wau+NclCe z@|%jAnwy53CucXzrE!u}M2diMq3a=RSt=`+q^y+@oT#XmsF&!Mm>0m*sv0@`>2xmt zn4}2qPpI{rY4l6d%Y!he<4eYvgDPkC3C)U347&9 zxQ_iDeFOc2KcYB<@j3w~A+pnBDx5Tt0&jN8 zIII7PNMe3nouLIXtRXvL?d7UoZCj>k$@pAc(QjRn3d+=gvDC4qb}IcZ{P$h-|L2zM b-vSe178-x=qeuS3tDs~g6vS&qjY9qpKljFA diff --git a/client/src-tauri/src/lib.rs b/client/src-tauri/src/lib.rs deleted file mode 100644 index 447375bf..00000000 --- a/client/src-tauri/src/lib.rs +++ /dev/null @@ -1,246 +0,0 @@ -//! CaliCode desktop shell. -//! -//! The web editor is served in full by the Rust core: `/rpc`, `/events`, and -//! the built client all live at core's own origin. Packaged builds launch the -//! bundled `cali-core` sidecar; debug builds attach to the live core started by -//! `scripts/dev.sh`. In both cases the native window points at -//! `http://127.0.0.1:8765` once the port is accepting connections. Everything -//! the webview does is same-origin — no CORS, no proxy, no changes to the -//! client's `fetch("/rpc")` / `EventSource("/events")`. - -use std::net::TcpStream; -use std::path::PathBuf; -use std::process::{Child, Command}; -use std::sync::{Arc, Mutex}; -use std::time::Duration; - -use tauri::{Manager, RunEvent, WebviewWindow}; - -/// Port core listens on for the packaged app. Fixed so the window URL is known -/// up front. A browser dev instance on the same port would collide — that is a -/// dev-only concern, documented in the README. -const CORE_PORT: u16 = 8765; - -/// Holds the core child so it can be killed when the app exits. -struct CoreProcess(Arc>>); - -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -enum CoreStartup { - Starting, - Ready, - PortBusy, - SpawnFailed, - LiveCoreUnavailable, -} - -/// Resolve the `cali-core` binary. Packaged: a sibling of the app executable -/// in `Contents/MacOS`. Dev (`tauri dev`): the `binaries/` staging file named -/// with the target triple. -fn resolve_core_binary() -> PathBuf { - if let Ok(exe) = std::env::current_exe() { - if let Some(dir) = exe.parent() { - let sibling = dir.join("cali-core"); - if sibling.exists() { - return sibling; - } - } - } - let triple = env!("TARGET"); - PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("binaries") - .join(format!("cali-core-{triple}")) -} - -/// Resolve the built client `dist`. Packaged: bundled under the resource dir. -/// Dev: the sibling `client/dist` produced by `pnpm build`. -fn resolve_dist(app: &tauri::App) -> Option { - // `tauri dev` should use the current client/dist next to the source tree. - // A staged resources/dist from the last desktop build is intentionally - // ignored in debug mode; otherwise a stale bundle can mask web changes. - if cfg!(debug_assertions) { - let dev = PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("..") - .join("dist"); - return dev.exists().then_some(dev); - } - if let Ok(resource_dir) = app.path().resource_dir() { - let bundled = resource_dir.join("resources").join("dist"); - if bundled.exists() { - return Some(bundled); - } - } - let dev = PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("..") - .join("dist"); - dev.exists().then_some(dev) -} - -/// Spawn the core JSON-RPC service. `CALI_DIST` makes core serve the built -/// client from the resolved path regardless of the child's working directory. -fn spawn_core(binary: &PathBuf, dist: Option) -> std::io::Result { - let mut cmd = Command::new(binary); - cmd.env("CALI_PORT", CORE_PORT.to_string()); - if let Some(dist) = dist { - cmd.env("CALI_DIST", dist); - } - cmd.spawn() -} - -/// Block until the port accepts a TCP connection or the deadline passes. -/// A successful connect means core has bound and is serving. -fn wait_for_core(port: u16, attempts: u32, process: &Arc>>) -> bool { - let addr = format!("127.0.0.1:{port}"); - for _ in 0..attempts { - // A preflight check cannot eliminate a race where another process - // binds the port between the check and our sidecar spawn. Observe the - // child too, so readiness never attaches the window to that process. - if let Ok(mut child) = process.lock() { - if let Some(core) = child.as_mut() { - if matches!(core.try_wait(), Ok(Some(_))) { - return false; - } - } - } - if let Ok(addr) = addr.parse() { - if TcpStream::connect_timeout(&addr, Duration::from_millis(300)).is_ok() { - return true; - } - } - std::thread::sleep(Duration::from_millis(200)); - } - false -} - -fn show_core(window: &WebviewWindow, startup: CoreStartup) { - if startup == CoreStartup::Ready { - let url = format!("http://127.0.0.1:{CORE_PORT}/"); - if let Ok(url) = url.parse() { - let _ = window.navigate(url); - } - } else { - let message = match startup { - CoreStartup::PortBusy => { - "CaliCode could not start its core because port 8765 is already in use. Quit the other CaliCode/browser core or use a separate dev port." - } - CoreStartup::SpawnFailed => { - "CaliCode could not launch its bundled core. Rebuild the desktop app and try again." - } - CoreStartup::Starting => { - "CaliCode core did not become ready on port 8765. Check the app logs and try again." - } - CoreStartup::LiveCoreUnavailable => { - "Desktop development mode expects a live core on port 8765. Run ./scripts/dev.sh first, then relaunch the desktop shell." - } - CoreStartup::Ready => unreachable!(), - }; - // Core never came up. Surface a plain message instead of a blank - // window so the failure is visible and actionable. - let escaped = message.replace('\\', "\\\\").replace('\'', "\\'"); - let _ = window.eval(format!( - "document.body.innerHTML = '

    {escaped}
    ';", - )); - } - let _ = window.show(); - let _ = window.set_focus(); -} - -#[cfg_attr(mobile, tauri::mobile_entry_point)] -pub fn run() { - let core_process = Arc::new(Mutex::new(None)); - tauri::Builder::default() - .plugin(tauri_plugin_dialog::init()) - .manage(CoreProcess(core_process.clone())) - .setup(|app| { - if cfg!(debug_assertions) { - app.handle().plugin( - tauri_plugin_log::Builder::default() - .level(log::LevelFilter::Info) - .build(), - )?; - } - - let binary = resolve_core_binary(); - let dist = resolve_dist(app); - let startup = if cfg!(debug_assertions) { - // `pnpm desktop:dev` deliberately attaches to the live core - // started by scripts/dev.sh. A debug Tauri shell must not - // spawn a second sidecar and fight that process for 8765. - if port_is_open(CORE_PORT) { - log::info!("attaching desktop dev shell to live core on port {CORE_PORT}"); - CoreStartup::Starting - } else { - log::error!("desktop dev shell requires a live core on port {CORE_PORT}"); - CoreStartup::LiveCoreUnavailable - } - } else if port_is_open(CORE_PORT) { - log::error!("core port {CORE_PORT} is already in use; refusing to attach the desktop window"); - CoreStartup::PortBusy - } else { - match spawn_core(&binary, dist) { - Ok(child) => { - app.state::().0.lock().unwrap().replace(child); - CoreStartup::Starting - } - Err(err) => { - log::error!("failed to spawn cali-core at {binary:?}: {err}"); - CoreStartup::SpawnFailed - } - } - }; - - // Poll for readiness off the main thread so the UI thread stays - // responsive, then navigate + show the window. - let window = app.get_webview_window("main").expect("main window exists"); - let process = app.state::().0.clone(); - std::thread::spawn(move || { - let startup = match startup { - CoreStartup::Starting if wait_for_core(CORE_PORT, 100, &process) => CoreStartup::Ready, - other => other, - }; - let target = window.clone(); - let _ = window.run_on_main_thread(move || show_core(&target, startup)); - }); - - Ok(()) - }) - .build(tauri::generate_context!()) - .expect("error while building CaliCode") - .run(|app, event| { - // Kill core when the app is exiting so no orphan server lingers. - if let RunEvent::Exit = event { - if let Some(mut child) = app.state::().0.lock().unwrap().take() { - let _ = child.kill(); - } - } - }); -} - -fn port_is_open(port: u16) -> bool { - let addr = format!("127.0.0.1:{port}"); - addr.parse() - .ok() - .and_then(|addr| TcpStream::connect_timeout(&addr, Duration::from_millis(150)).ok()) - .is_some() -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn startup_states_are_distinct() { - assert_ne!(CoreStartup::PortBusy, CoreStartup::SpawnFailed); - assert_ne!(CoreStartup::Starting, CoreStartup::Ready); - } - - #[test] - fn closed_port_is_not_reported_as_open() { - let listener = std::net::TcpListener::bind(("127.0.0.1", 0)).expect("bind test port"); - let port = listener.local_addr().expect("test port address").port(); - assert!(port_is_open(port)); - drop(listener); - assert!(!port_is_open(port)); - } -} diff --git a/client/src-tauri/src/main.rs b/client/src-tauri/src/main.rs deleted file mode 100644 index 69c3a72e..00000000 --- a/client/src-tauri/src/main.rs +++ /dev/null @@ -1,6 +0,0 @@ -// Prevents additional console window on Windows in release, DO NOT REMOVE!! -#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] - -fn main() { - app_lib::run(); -} diff --git a/client/src-tauri/tauri.conf.json b/client/src-tauri/tauri.conf.json deleted file mode 100644 index c0d77f79..00000000 --- a/client/src-tauri/tauri.conf.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", - "productName": "CaliCode", - "version": "0.1.0", - "identifier": "com.calicode.desktop", - "build": { - "frontendDist": "../dist", - "devUrl": "http://127.0.0.1:5199" - }, - "app": { - "windows": [ - { - "label": "main", - "title": "CaliCode", - "width": 1440, - "height": 900, - "minWidth": 960, - "minHeight": 600, - "resizable": true, - "fullscreen": false, - "center": true, - "visible": false, - "decorations": true, - "titleBarStyle": "Overlay", - "hiddenTitle": true, - "trafficLightPosition": { - "x": 16, - "y": 23 - } - } - ], - "security": { - "csp": null - } - }, - "bundle": { - "active": true, - "targets": [ - "app", - "dmg" - ], - "macOS": { - "infoPlist": "Info.plist", - "signingIdentity": "CaliCode Dev" - }, - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ], - "externalBin": [ - "binaries/cali-core" - ], - "resources": [ - "resources/dist" - ] - } -} diff --git a/client/src/App.tsx b/client/src/App.tsx index a1bcdb51..57cd9594 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1792,7 +1792,7 @@ export default function App() { the layout (the rail carries its own set otherwise); the title and the tools-dock toggle live here in both states. */}
    ({ rpc: vi.fn() })); import { rpc } from "../../lib/rpc"; const mockRpc = vi.mocked(rpc); -const originalTauriInternals = Object.getOwnPropertyDescriptor(window, "__TAURI_INTERNALS__"); +const originalCaliBridge = Object.getOwnPropertyDescriptor(window, "cali"); const originalNavigatorPlatform = Object.getOwnPropertyDescriptor(navigator, "platform"); const modelList: ModelList = { @@ -67,7 +67,12 @@ beforeEach(() => { messageCount: 4, }, ]; - Object.defineProperty(window, "__TAURI_INTERNALS__", { configurable: true, value: {} }); + // The titlebar reserves space for the traffic lights only in the desktop + // shell, which is detected by the preload's global. + Object.defineProperty(window, "cali", { + configurable: true, + value: { shell: "electron", platform: "darwin" }, + }); Object.defineProperty(navigator, "platform", { configurable: true, value: "MacIntel" }); mockRpc.mockImplementation(async (method: string) => { switch (method) { @@ -98,8 +103,8 @@ beforeEach(() => { afterEach(() => { cleanup(); vi.clearAllMocks(); - if (originalTauriInternals) Object.defineProperty(window, "__TAURI_INTERNALS__", originalTauriInternals); - else Reflect.deleteProperty(window, "__TAURI_INTERNALS__"); + if (originalCaliBridge) Object.defineProperty(window, "cali", originalCaliBridge); + else Reflect.deleteProperty(window, "cali"); if (originalNavigatorPlatform) Object.defineProperty(navigator, "platform", originalNavigatorPlatform); }); @@ -116,7 +121,7 @@ describe("SettingsPage", () => { expect(workspaceBack.className).toContain("translate-y-px"); expect(workspaceBack.className).toContain("text-[13px]"); expect(workspaceBack.className).toContain("font-semibold"); - const titlebar = workspaceBack.closest("[data-tauri-drag-region]"); + const titlebar = workspaceBack.closest("[data-drag-region]"); expect(titlebar?.className).toContain("h-10"); expect(titlebar?.className).toContain("pl-[80px]"); expect(container.querySelector("[data-settings-page]")?.className).toContain("overflow-hidden"); diff --git a/client/src/components/settings/SettingsPage.tsx b/client/src/components/settings/SettingsPage.tsx index 68569ef6..0bf6631b 100644 --- a/client/src/components/settings/SettingsPage.tsx +++ b/client/src/components/settings/SettingsPage.tsx @@ -114,7 +114,7 @@ function PageHeader({ const active = SETTINGS_SECTIONS.find((entry) => entry.id === section) ?? SETTINGS_SECTIONS[0]; return (
    @@ -596,7 +596,7 @@ export function SettingsPage({