style(design): apply Minimal Dark Mode design system\n\n- Switched to complete Dark Mode (OLED-friendly)\n- Established standard color palette matching modern technical aesthetics\n- Changed font to Plus Jakarta Sans for increased legibility\n- Enforced dark mode as default in App.tsx\n- Fixed several React cascading render (setState in useEffect) warnings

This commit is contained in:
Gemini Nexus Bot committed 2026-04-28 03:49:34 -03:00
1 parent b80531f8a8
commit bac7b5591e
24 files changed
+1259 -869

No files matched your search

Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
+245 -594
View File
File diff suppressed because it is too large. Load diff
+3
View File
@@ -12,6 +12,8 @@
"make": "electron-forge make", "make": "electron-forge make",
"make:win": "node scripts/build-windows.js", "make:win": "node scripts/build-windows.js",
"publish": "electron-forge publish", "publish": "electron-forge publish",
"setup": "node scripts/setup-dev.js",
"postinstall": "node scripts/setup-dev.js --check-only",
"lint": "eslint .", "lint": "eslint .",
"format": "prettier --check .", "format": "prettier --check .",
"format:write": "prettier --write .", "format:write": "prettier --write .",
@@ -102,6 +104,7 @@
"@nestjs/microservices": "^11.1.18", "@nestjs/microservices": "^11.1.18",
"@nestjs/platform-express": "^11.1.18", "@nestjs/platform-express": "^11.1.18",
"@nestjs/platform-fastify": "^11.0.20", "@nestjs/platform-fastify": "^11.0.20",
"@nestjs/websockets": "^11.1.19",
"@nivo/bar": "^0.99.0", "@nivo/bar": "^0.99.0",
"@nivo/core": "^0.99.0", "@nivo/core": "^0.99.0",
"@nivo/pie": "^0.99.0", "@nivo/pie": "^0.99.0",
+354 -91
View File
@@ -5,6 +5,7 @@ settings:
excludeLinksFromLockfile: false excludeLinksFromLockfile: false
overrides: overrides:
node-abi: ^4.28.0
fastify: ^5.8.5 fastify: ^5.8.5
tar: ^7.5.13 tar: ^7.5.13
'@octokit/request-error': ^5.1.1 '@octokit/request-error': ^5.1.1
@@ -18,12 +19,6 @@ importers:
.: .:
dependencies: dependencies:
'@grpc/grpc-js':
specifier: ^1.14.3
version: 1.14.3
'@grpc/proto-loader':
specifier: ^0.8.0
version: 0.8.0
'@icons-pack/react-simple-icons': '@icons-pack/react-simple-icons':
specifier: ^13.8.0 specifier: ^13.8.0
version: 13.13.0([email protected]) version: 13.13.0([email protected])
@@ -32,16 +27,19 @@ importers:
version: 11.1.19([email protected])([email protected])([email protected])([email protected]) version: 11.1.19([email protected])([email protected])([email protected])([email protected])
'@nestjs/core': '@nestjs/core':
specifier: ^11.1.18 specifier: ^11.1.18
version: 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected]) version: 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])
'@nestjs/microservices': '@nestjs/microservices':
specifier: ^11.1.18 specifier: ^11.1.18
version: 11.1.19(@grpc/[email protected])(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])([email protected])([email protected]) version: 11.1.19(@grpc/[email protected])(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])
'@nestjs/platform-express': '@nestjs/platform-express':
specifier: ^11.1.18 specifier: ^11.1.18
version: 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected]) version: 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])
'@nestjs/platform-fastify': '@nestjs/platform-fastify':
specifier: ^11.1.18 specifier: ^11.0.20
version: 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected]) version: 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])
'@nestjs/websockets':
specifier: ^11.1.19
version: 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])([email protected])([email protected])
'@nivo/bar': '@nivo/bar':
specifier: ^0.99.0 specifier: ^0.99.0
version: 0.99.0([email protected]([email protected]))([email protected]) version: 0.99.0([email protected]([email protected]))([email protected])
@@ -215,8 +213,8 @@ importers:
version: 4.3.6 version: 4.3.6
devDependencies: devDependencies:
'@electron-forge/cli': '@electron-forge/cli':
specifier: ^7.11.1 specifier: ^7.6.1
version: 7.11.1(@swc/[email protected])([email protected]) version: 7.11.1(@swc/[email protected])([email protected])([email protected])
'@electron-forge/maker-deb': '@electron-forge/maker-deb':
specifier: ^7.11.1 specifier: ^7.11.1
version: 7.11.1 version: 7.11.1
@@ -230,7 +228,7 @@ importers:
specifier: ^7.11.1 specifier: ^7.11.1
version: 7.11.1 version: 7.11.1
'@electron-forge/maker-wix': '@electron-forge/maker-wix':
specifier: ^7.11.1 specifier: ^7.9.0
version: 7.11.1 version: 7.11.1
'@electron-forge/maker-zip': '@electron-forge/maker-zip':
specifier: ^7.11.1 specifier: ^7.11.1
@@ -263,7 +261,7 @@ importers:
specifier: ^9.39.0 specifier: ^9.39.0
version: 9.39.4 version: 9.39.4
'@pengx17/electron-forge-maker-appimage': '@pengx17/electron-forge-maker-appimage':
specifier: ^1.2.1 specifier: ^1.0.2
version: 1.2.1([email protected])([email protected]) version: 1.2.1([email protected])([email protected])
'@playwright/test': '@playwright/test':
specifier: ^1.56.1 specifier: ^1.56.1
@@ -285,10 +283,10 @@ importers:
version: 1.15.30 version: 1.15.30
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: ^4.2.4 specifier: ^4.2.4
version: 4.2.4(vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected])) version: 4.2.4(vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))
'@tanstack/router-plugin': '@tanstack/router-plugin':
specifier: ^1.135.0 specifier: ^1.135.0
version: 1.167.22(@tanstack/[email protected]([email protected]([email protected]))([email protected]))(vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]))([email protected](@swc/[email protected])) version: 1.167.22(@tanstack/[email protected]([email protected]([email protected]))([email protected]))(vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))([email protected](@swc/[email protected])([email protected]))
'@testing-library/jest-dom': '@testing-library/jest-dom':
specifier: ^6.9.1 specifier: ^6.9.1
version: 6.9.1 version: 6.9.1
@@ -321,7 +319,7 @@ importers:
version: 19.2.3(@types/[email protected]) version: 19.2.3(@types/[email protected])
'@vitejs/plugin-react': '@vitejs/plugin-react':
specifier: ^4.7.0 specifier: ^4.7.0
version: 4.7.0(vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected])) version: 4.7.0(vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))
babel-plugin-react-compiler: babel-plugin-react-compiler:
specifier: 1.0.0 specifier: 1.0.0
version: 1.0.0 version: 1.0.0
@@ -335,8 +333,8 @@ importers:
specifier: ^10.1.0 specifier: ^10.1.0
version: 10.1.0 version: 10.1.0
electron: electron:
specifier: ^39.8.5 specifier: ^41.3.0
version: 39.8.9 version: 41.3.0
electron-devtools-installer: electron-devtools-installer:
specifier: ^4.0.0 specifier: ^4.0.0
version: 4.0.0 version: 4.0.0
@@ -376,6 +374,9 @@ importers:
jsdom: jsdom:
specifier: ^27.1.0 specifier: ^27.1.0
version: 27.4.0 version: 27.4.0
node-abi:
specifier: ^4.28.0
version: 4.28.0
node-addon-api: node-addon-api:
specifier: ^8.3.1 specifier: ^8.3.1
version: 8.7.0 version: 8.7.0
@@ -410,14 +411,14 @@ importers:
specifier: ^1.5.9 specifier: ^1.5.9
version: 1.5.9(@swc/[email protected])([email protected]) version: 1.5.9(@swc/[email protected])([email protected])
vite: vite:
specifier: ^6.4.2 specifier: ^8.0.10
version: 6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]) version: 8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected])
vite-tsconfig-paths: vite-tsconfig-paths:
specifier: ^6.1.1 specifier: ^6.1.1
version: 6.1.1([email protected])(vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected])) version: 6.1.1([email protected])(vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))
vitest: vitest:
specifier: ^4.0.8 specifier: ^4.0.8
version: 4.1.5(@opentelemetry/[email protected])(@types/[email protected])([email protected])([email protected])(vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected])) version: 4.1.5(@opentelemetry/[email protected])(@types/[email protected])([email protected])([email protected])(vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))
packages: packages:
@@ -798,9 +799,15 @@ packages:
engines: {node: '>=14.14'} engines: {node: '>=14.14'}
hasBin: true hasBin: true
'@emnapi/[email protected]':
resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==}
'@emnapi/[email protected]': '@emnapi/[email protected]':
resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
'@emnapi/[email protected]':
resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
'@epic-web/[email protected]': '@epic-web/[email protected]':
resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==}
@@ -1492,6 +1499,12 @@ packages:
resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==}
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
'@napi-rs/[email protected]':
resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==}
peerDependencies:
'@emnapi/core': ^1.7.1
'@emnapi/runtime': ^1.7.1
'@nestjs/[email protected]': '@nestjs/[email protected]':
resolution: {integrity: sha512-qeiTt2tv+e5QyDKqG8HlVZb2wx64FEaSGFJouqTSRs+kG44iTfl3xlz1XqVped+rihx4hmjWgL5gkhtdK3E6+Q==} resolution: {integrity: sha512-qeiTt2tv+e5QyDKqG8HlVZb2wx64FEaSGFJouqTSRs+kG44iTfl3xlz1XqVped+rihx4hmjWgL5gkhtdK3E6+Q==}
peerDependencies: peerDependencies:
@@ -1578,6 +1591,18 @@ packages:
'@fastify/view': '@fastify/view':
optional: true optional: true
'@nestjs/[email protected]':
resolution: {integrity: sha512-2qo8jtIwwwgkqAI1BtnJ02EaFLrRkKA39eYXS8IhZCHilhBHCWdjnJ5cLcFq4oF+s+KZ7LcLGD/3stxJy8ijzg==}
peerDependencies:
'@nestjs/common': ^11.0.0
'@nestjs/core': ^11.0.0
'@nestjs/platform-socket.io': ^11.0.0
reflect-metadata: ^0.1.12 || ^0.2.0
rxjs: ^7.1.0
peerDependenciesMeta:
'@nestjs/platform-socket.io':
optional: true
'@nivo/[email protected]': '@nivo/[email protected]':
resolution: {integrity: sha512-jCuuXPbvpaqaz4xF7k5dv0OT2ubn5Nt0gWryuTe/8oVsC/9bzSuK8bM9vBty60m9tfO+X8vUYliuaCDwGksC2g==} resolution: {integrity: sha512-jCuuXPbvpaqaz4xF7k5dv0OT2ubn5Nt0gWryuTe/8oVsC/9bzSuK8bM9vBty60m9tfO+X8vUYliuaCDwGksC2g==}
peerDependencies: peerDependencies:
@@ -2058,6 +2083,9 @@ packages:
'@orpc/[email protected]': '@orpc/[email protected]':
resolution: {integrity: sha512-zN3Q+ajsoLoxLYmONc1RkDyhIg1wENolrTly8HfodcR3gYrfFRcGhUzShqa/KdG47mK49Nps8rdeeMj6NT8EYw==} resolution: {integrity: sha512-zN3Q+ajsoLoxLYmONc1RkDyhIg1wENolrTly8HfodcR3gYrfFRcGhUzShqa/KdG47mK49Nps8rdeeMj6NT8EYw==}
'@oxc-project/[email protected]':
resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==}
'@pengx17/[email protected]': '@pengx17/[email protected]':
resolution: {integrity: sha512-6w1XbUUZS431UaubbBQvKYDGs2MnTFxEWeJX1RjQXrxl0LrZULOarTogpda8UR9y7nAwtuEKm84OxWBrtH87ww==} resolution: {integrity: sha512-6w1XbUUZS431UaubbBQvKYDGs2MnTFxEWeJX1RjQXrxl0LrZULOarTogpda8UR9y7nAwtuEKm84OxWBrtH87ww==}
@@ -2643,9 +2671,107 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@rolldown/[email protected]':
resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
'@rolldown/[email protected]':
resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
'@rolldown/[email protected]':
resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
'@rolldown/[email protected]':
resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
'@rolldown/[email protected]':
resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
'@rolldown/[email protected]':
resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rolldown/[email protected]':
resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rolldown/[email protected]':
resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@rolldown/[email protected]':
resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@rolldown/[email protected]':
resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rolldown/[email protected]':
resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
'@rolldown/[email protected]':
resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
'@rolldown/[email protected]':
resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [wasm32]
'@rolldown/[email protected]':
resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
'@rolldown/[email protected]':
resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
'@rolldown/[email protected]': '@rolldown/[email protected]':
resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==}
'@rolldown/[email protected]':
resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==}
'@rollup/[email protected]': '@rollup/[email protected]':
resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
@@ -3343,6 +3469,9 @@ packages:
'@tsconfig/[email protected]': '@tsconfig/[email protected]':
resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
'@tybys/[email protected]':
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
'@types/[email protected]': '@types/[email protected]':
resolution: {integrity: sha512-G+n6DgZTZFOteITE30LnWj+HRVIGr7wMlAiLWOO02uJFWVEitaPU9JVXm9wJokkgshBawb2O1OykdcsmkkZfgg==} resolution: {integrity: sha512-G+n6DgZTZFOteITE30LnWj+HRVIGr7wMlAiLWOO02uJFWVEitaPU9JVXm9wJokkgshBawb2O1OykdcsmkkZfgg==}
@@ -4814,8 +4943,8 @@ packages:
resolution: {integrity: sha512-EYj1cm1nZoVHmIIx3o0aKt784lxdEpJnXbEnyypklUCnglqSb7ni+1xi1Vp/gtrGS/mzIxnWBT+x5fIfuDjhvA==} resolution: {integrity: sha512-EYj1cm1nZoVHmIIx3o0aKt784lxdEpJnXbEnyypklUCnglqSb7ni+1xi1Vp/gtrGS/mzIxnWBT+x5fIfuDjhvA==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
electron@39.8.9: electron@41.3.0:
resolution: {integrity: sha512-0zgNu0MmWR/kzFm+B+LlvpLOX8l3wt1z+BJIYv2Uxc2bEqWBT3jNsX1IhPVP5OJijjZO5ewCOIy0n/bsfJfjdw==} resolution: {integrity: sha512-2Q5aeocmFdeheZGDUTrAvSR3t+n0c3d104AJWWEnt7syJU0tE4VdibMYaPtQ47QuXSoUf0/xSsfUUvu/uSXIfg==}
engines: {node: '>= 12.20.55'} engines: {node: '>= 12.20.55'}
hasBin: true hasBin: true
@@ -6568,9 +6697,9 @@ packages:
[email protected]: [email protected]:
resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
node-abi@3.89.0: node-abi@4.28.0:
resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} resolution: {integrity: sha512-Qfp5XZL1cJDOabOT8H5gnqMTmM4NjvYzHp4I/Kt/Sl76OVkOBBHRFlPspGV0hYvMoqQsypFjT/Yp7Km0beXW9g==}
engines: {node: '>=10'} engines: {node: '>=22.12.0'}
[email protected]: [email protected]:
resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==}
@@ -7489,6 +7618,11 @@ packages:
resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
engines: {node: '>=8.0'} engines: {node: '>=8.0'}
[email protected]:
resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
[email protected]: [email protected]:
resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'} engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -8379,31 +8513,34 @@ packages:
peerDependencies: peerDependencies:
vite: '*' vite: '*'
vite@6.4.2: vite@8.0.10:
resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==} resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 '@types/node': ^20.19.0 || >=22.12.0
'@vitejs/devtools': ^0.1.0
esbuild: ^0.25.0
jiti: '>=1.21.0' jiti: '>=1.21.0'
less: '*' less: ^4.0.0
lightningcss: ^1.21.0 sass: ^1.70.0
sass: '*' sass-embedded: ^1.70.0
sass-embedded: '*' stylus: '>=0.54.8'
stylus: '*' sugarss: ^5.0.0
sugarss: '*'
terser: ^5.16.0 terser: ^5.16.0
tsx: ^4.8.1 tsx: ^4.8.1
yaml: ^2.4.2 yaml: ^2.4.2
peerDependenciesMeta: peerDependenciesMeta:
'@types/node': '@types/node':
optional: true optional: true
'@vitejs/devtools':
optional: true
esbuild:
optional: true
jiti: jiti:
optional: true optional: true
less: less:
optional: true optional: true
lightningcss:
optional: true
sass: sass:
optional: true optional: true
sass-embedded: sass-embedded:
@@ -8992,9 +9129,9 @@ snapshots:
ajv: 6.14.0 ajv: 6.14.0
ajv-keywords: 3.5.2([email protected]) ajv-keywords: 3.5.2([email protected])
'@electron-forge/[email protected](@swc/[email protected])([email protected])': '@electron-forge/[email protected](@swc/[email protected])([email protected])([email protected])':
dependencies: dependencies:
'@electron-forge/core': 7.11.1(@swc/[email protected])([email protected]) '@electron-forge/core': 7.11.1(@swc/[email protected])([email protected])([email protected])
'@electron-forge/core-utils': 7.11.1 '@electron-forge/core-utils': 7.11.1
'@electron-forge/shared-types': 7.11.1 '@electron-forge/shared-types': 7.11.1
'@electron/get': 3.1.0 '@electron/get': 3.1.0
@@ -9032,7 +9169,7 @@ snapshots:
- bluebird - bluebird
- supports-color - supports-color
'@electron-forge/[email protected](@swc/[email protected])([email protected])': '@electron-forge/[email protected](@swc/[email protected])([email protected])([email protected])':
dependencies: dependencies:
'@electron-forge/core-utils': 7.11.1 '@electron-forge/core-utils': 7.11.1
'@electron-forge/maker-base': 7.11.1 '@electron-forge/maker-base': 7.11.1
@@ -9043,7 +9180,7 @@ snapshots:
'@electron-forge/template-vite': 7.11.1 '@electron-forge/template-vite': 7.11.1
'@electron-forge/template-vite-typescript': 7.11.1 '@electron-forge/template-vite-typescript': 7.11.1
'@electron-forge/template-webpack': 7.11.1 '@electron-forge/template-webpack': 7.11.1
'@electron-forge/template-webpack-typescript': 7.11.1(@swc/[email protected]) '@electron-forge/template-webpack-typescript': 7.11.1(@swc/[email protected])([email protected])
'@electron-forge/tracer': 7.11.1 '@electron-forge/tracer': 7.11.1
'@electron/get': 3.1.0 '@electron/get': 3.1.0
'@electron/packager': 18.4.4 '@electron/packager': 18.4.4
@@ -9255,13 +9392,13 @@ snapshots:
- bluebird - bluebird
- supports-color - supports-color
'@electron-forge/[email protected](@swc/[email protected])': '@electron-forge/[email protected](@swc/[email protected])([email protected])':
dependencies: dependencies:
'@electron-forge/shared-types': 7.11.1 '@electron-forge/shared-types': 7.11.1
'@electron-forge/template-base': 7.11.1 '@electron-forge/template-base': 7.11.1
fs-extra: 10.1.0 fs-extra: 10.1.0
typescript: 5.4.5 typescript: 5.4.5
webpack: 5.106.2(@swc/[email protected]) webpack: 5.106.2(@swc/[email protected])([email protected])
transitivePeerDependencies: transitivePeerDependencies:
- '@swc/core' - '@swc/core'
- bluebird - bluebird
@@ -9412,7 +9549,7 @@ snapshots:
detect-libc: 2.1.2 detect-libc: 2.1.2
fs-extra: 10.1.0 fs-extra: 10.1.0
got: 11.8.6 got: 11.8.6
node-abi: 3.89.0 node-abi: 4.28.0
node-api-version: 0.2.1 node-api-version: 0.2.1
ora: 5.4.1 ora: 5.4.1
read-binary-file-arch: 1.0.6 read-binary-file-arch: 1.0.6
@@ -9457,11 +9594,22 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@emnapi/[email protected]':
dependencies:
'@emnapi/wasi-threads': 1.2.1
tslib: 2.8.1
optional: true
'@emnapi/[email protected]': '@emnapi/[email protected]':
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
optional: true optional: true
'@emnapi/[email protected]':
dependencies:
tslib: 2.8.1
optional: true
'@epic-web/[email protected]': {} '@epic-web/[email protected]': {}
'@esbuild/[email protected]': '@esbuild/[email protected]':
@@ -9673,6 +9821,7 @@ snapshots:
dependencies: dependencies:
'@grpc/proto-loader': 0.8.0 '@grpc/proto-loader': 0.8.0
'@js-sdsl/ordered-map': 4.4.2 '@js-sdsl/ordered-map': 4.4.2
optional: true
'@grpc/[email protected]': '@grpc/[email protected]':
dependencies: dependencies:
@@ -9680,6 +9829,7 @@ snapshots:
long: 5.3.2 long: 5.3.2
protobufjs: 7.5.6 protobufjs: 7.5.6
yargs: 17.7.2 yargs: 17.7.2
optional: true
'@humanfs/[email protected]': '@humanfs/[email protected]':
dependencies: dependencies:
@@ -10014,7 +10164,8 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2 '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/sourcemap-codec': 1.5.5
'@js-sdsl/[email protected]': {} '@js-sdsl/[email protected]':
optional: true
'@listr2/[email protected](@inquirer/[email protected])': '@listr2/[email protected](@inquirer/[email protected])':
dependencies: dependencies:
@@ -10040,6 +10191,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@napi-rs/[email protected](@emnapi/[email protected])(@emnapi/[email protected])':
dependencies:
'@emnapi/core': 1.10.0
'@emnapi/runtime': 1.10.0
'@tybys/wasm-util': 0.10.1
optional: true
'@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected])': '@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected])':
dependencies: dependencies:
file-type: 21.3.4 file-type: 21.3.4
@@ -10055,7 +10213,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@nestjs/[email protected](@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])': '@nestjs/[email protected](@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])':
dependencies: dependencies:
'@nestjs/common': 11.1.19([email protected])([email protected])([email protected])([email protected]) '@nestjs/common': 11.1.19([email protected])([email protected])([email protected])([email protected])
'@nuxt/opencollective': 0.4.1 '@nuxt/opencollective': 0.4.1
@@ -10067,24 +10225,26 @@ snapshots:
tslib: 2.8.1 tslib: 2.8.1
uid: 2.0.2 uid: 2.0.2
optionalDependencies: optionalDependencies:
'@nestjs/microservices': 11.1.19(@grpc/[email protected])(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])([email protected])([email protected]) '@nestjs/microservices': 11.1.19(@grpc/[email protected])(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])
'@nestjs/platform-express': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected]) '@nestjs/platform-express': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])
'@nestjs/websockets': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])([email protected])([email protected])
'@nestjs/[email protected](@grpc/[email protected])(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])([email protected])([email protected])': '@nestjs/[email protected](@grpc/[email protected])(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])':
dependencies: dependencies:
'@nestjs/common': 11.1.19([email protected])([email protected])([email protected])([email protected]) '@nestjs/common': 11.1.19([email protected])([email protected])([email protected])([email protected])
'@nestjs/core': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected]) '@nestjs/core': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])
iterare: 1.2.1 iterare: 1.2.1
reflect-metadata: 0.2.2 reflect-metadata: 0.2.2
rxjs: 7.8.2 rxjs: 7.8.2
tslib: 2.8.1 tslib: 2.8.1
optionalDependencies: optionalDependencies:
'@grpc/grpc-js': 1.14.3 '@grpc/grpc-js': 1.14.3
'@nestjs/websockets': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])([email protected])([email protected])
'@nestjs/[email protected](@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])': '@nestjs/[email protected](@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])':
dependencies: dependencies:
'@nestjs/common': 11.1.19([email protected])([email protected])([email protected])([email protected]) '@nestjs/common': 11.1.19([email protected])([email protected])([email protected])([email protected])
'@nestjs/core': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected]) '@nestjs/core': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])
cors: 2.8.6 cors: 2.8.6
express: 5.2.1 express: 5.2.1
multer: 2.1.1 multer: 2.1.1
@@ -10098,7 +10258,7 @@ snapshots:
'@fastify/cors': 11.2.0 '@fastify/cors': 11.2.0
'@fastify/formbody': 8.0.2 '@fastify/formbody': 8.0.2
'@nestjs/common': 11.1.19([email protected])([email protected])([email protected])([email protected]) '@nestjs/common': 11.1.19([email protected])([email protected])([email protected])([email protected])
'@nestjs/core': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected]) '@nestjs/core': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])
fast-querystring: 1.1.2 fast-querystring: 1.1.2
fastify: 5.8.5 fastify: 5.8.5
fastify-plugin: 5.1.0 fastify-plugin: 5.1.0
@@ -10108,6 +10268,16 @@ snapshots:
reusify: 1.1.0 reusify: 1.1.0
tslib: 2.8.1 tslib: 2.8.1
'@nestjs/[email protected](@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])([email protected])([email protected])':
dependencies:
'@nestjs/common': 11.1.19([email protected])([email protected])([email protected])([email protected])
'@nestjs/core': 11.1.19(@nestjs/[email protected]([email protected])([email protected])([email protected])([email protected]))(@nestjs/[email protected])(@nestjs/[email protected])(@nestjs/[email protected])([email protected])([email protected])
iterare: 1.2.1
object-hash: 3.0.0
reflect-metadata: 0.2.2
rxjs: 7.8.2
tslib: 2.8.1
'@nivo/[email protected]([email protected]([email protected]))([email protected])': '@nivo/[email protected]([email protected]([email protected]))([email protected])':
dependencies: dependencies:
'@nivo/colors': 0.99.0([email protected]([email protected]))([email protected]) '@nivo/colors': 0.99.0([email protected]([email protected]))([email protected])
@@ -10826,6 +10996,8 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- '@opentelemetry/api' - '@opentelemetry/api'
'@oxc-project/[email protected]': {}
'@pengx17/[email protected]([email protected])([email protected])': '@pengx17/[email protected]([email protected])([email protected])':
dependencies: dependencies:
'@electron-forge/maker-base': 7.11.1 '@electron-forge/maker-base': 7.11.1
@@ -10867,28 +11039,38 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@protobufjs/[email protected]': {} '@protobufjs/[email protected]':
optional: true
'@protobufjs/[email protected]': {} '@protobufjs/[email protected]':
optional: true
'@protobufjs/[email protected]': {} '@protobufjs/[email protected]':
optional: true
'@protobufjs/[email protected]': {} '@protobufjs/[email protected]':
optional: true
'@protobufjs/[email protected]': '@protobufjs/[email protected]':
dependencies: dependencies:
'@protobufjs/aspromise': 1.1.2 '@protobufjs/aspromise': 1.1.2
'@protobufjs/inquire': 1.1.1 '@protobufjs/inquire': 1.1.1
optional: true
'@protobufjs/[email protected]': {} '@protobufjs/[email protected]':
optional: true
'@protobufjs/[email protected]': {} '@protobufjs/[email protected]':
optional: true
'@protobufjs/[email protected]': {} '@protobufjs/[email protected]':
optional: true
'@protobufjs/[email protected]': {} '@protobufjs/[email protected]':
optional: true
'@protobufjs/[email protected]': {} '@protobufjs/[email protected]':
optional: true
'@radix-ui/[email protected]': {} '@radix-ui/[email protected]': {}
@@ -11420,8 +11602,59 @@ snapshots:
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5([email protected]) react-dom: 19.2.5([email protected])
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
dependencies:
'@emnapi/core': 1.10.0
'@emnapi/runtime': 1.10.0
'@napi-rs/wasm-runtime': 1.1.4(@emnapi/[email protected])(@emnapi/[email protected])
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]':
optional: true
'@rolldown/[email protected]': {} '@rolldown/[email protected]': {}
'@rolldown/[email protected]': {}
'@rollup/[email protected]([email protected])': '@rollup/[email protected]([email protected])':
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
@@ -11926,12 +12159,12 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4
'@tailwindcss/oxide-win32-x64-msvc': 4.2.4 '@tailwindcss/oxide-win32-x64-msvc': 4.2.4
'@tailwindcss/[email protected](vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]))': '@tailwindcss/[email protected](vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))':
dependencies: dependencies:
'@tailwindcss/node': 4.2.4 '@tailwindcss/node': 4.2.4
'@tailwindcss/oxide': 4.2.4 '@tailwindcss/oxide': 4.2.4
tailwindcss: 4.2.4 tailwindcss: 4.2.4
vite: 6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]) vite: 8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected])
'@tanstack/[email protected]': {} '@tanstack/[email protected]': {}
@@ -11997,7 +12230,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@tanstack/[email protected](@tanstack/[email protected]([email protected]([email protected]))([email protected]))(vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]))([email protected](@swc/[email protected]))': '@tanstack/[email protected](@tanstack/[email protected]([email protected]([email protected]))([email protected]))(vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))([email protected](@swc/[email protected])([email protected]))':
dependencies: dependencies:
'@babel/core': 7.29.0 '@babel/core': 7.29.0
'@babel/plugin-syntax-jsx': 7.28.6(@babel/[email protected]) '@babel/plugin-syntax-jsx': 7.28.6(@babel/[email protected])
@@ -12014,8 +12247,8 @@ snapshots:
zod: 3.25.76 zod: 3.25.76
optionalDependencies: optionalDependencies:
'@tanstack/react-router': 1.168.23([email protected]([email protected]))([email protected]) '@tanstack/react-router': 1.168.23([email protected]([email protected]))([email protected])
vite: 6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]) vite: 8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected])
webpack: 5.106.2(@swc/[email protected]) webpack: 5.106.2(@swc/[email protected])([email protected])
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -12090,6 +12323,11 @@ snapshots:
'@tsconfig/[email protected]': {} '@tsconfig/[email protected]': {}
'@tybys/[email protected]':
dependencies:
tslib: 2.8.1
optional: true
'@types/[email protected]': '@types/[email protected]':
dependencies: dependencies:
'@types/node': 24.12.2 '@types/node': 24.12.2
@@ -12375,7 +12613,7 @@ snapshots:
'@typescript-eslint/types': 8.59.1 '@typescript-eslint/types': 8.59.1
eslint-visitor-keys: 5.0.1 eslint-visitor-keys: 5.0.1
'@vitejs/[email protected](vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]))': '@vitejs/[email protected](vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))':
dependencies: dependencies:
'@babel/core': 7.29.0 '@babel/core': 7.29.0
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/[email protected]) '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/[email protected])
@@ -12383,7 +12621,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.27 '@rolldown/pluginutils': 1.0.0-beta.27
'@types/babel__core': 7.20.5 '@types/babel__core': 7.20.5
react-refresh: 0.17.0 react-refresh: 0.17.0
vite: 6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]) vite: 8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected])
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -12396,13 +12634,13 @@ snapshots:
chai: 6.2.2 chai: 6.2.2
tinyrainbow: 3.1.0 tinyrainbow: 3.1.0
'@vitest/[email protected](vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]))': '@vitest/[email protected](vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))':
dependencies: dependencies:
'@vitest/spy': 4.1.5 '@vitest/spy': 4.1.5
estree-walker: 3.0.3 estree-walker: 3.0.3
magic-string: 0.30.21 magic-string: 0.30.21
optionalDependencies: optionalDependencies:
vite: 6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]) vite: 8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected])
'@vitest/[email protected]': '@vitest/[email protected]':
dependencies: dependencies:
@@ -13786,10 +14024,10 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
electron@39.8.9: electron@41.3.0:
dependencies: dependencies:
'@electron/get': 2.0.3 '@electron/get': 2.0.3
'@types/node': 22.19.17 '@types/node': 24.12.2
extract-zip: 2.0.1 extract-zip: 2.0.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -15424,7 +15662,8 @@ snapshots:
[email protected]: {} [email protected]: {}
[email protected]: {} [email protected]:
optional: true
[email protected]: {} [email protected]: {}
@@ -15474,7 +15713,8 @@ snapshots:
[email protected]: {} [email protected]: {}
[email protected]: {} [email protected]:
optional: true
[email protected]: [email protected]:
dependencies: dependencies:
@@ -15736,7 +15976,7 @@ snapshots:
[email protected]: {} [email protected]: {}
node-abi@3.89.0: node-abi@4.28.0:
dependencies: dependencies:
semver: 7.7.4 semver: 7.7.4
@@ -16158,7 +16398,7 @@ snapshots:
minimist: 1.2.8 minimist: 1.2.8
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
napi-build-utils: 2.0.0 napi-build-utils: 2.0.0
node-abi: 3.89.0 node-abi: 4.28.0
pump: 3.0.4 pump: 3.0.4
rc: 1.2.8 rc: 1.2.8
simple-get: 4.0.1 simple-get: 4.0.1
@@ -16226,6 +16466,7 @@ snapshots:
'@protobufjs/utf8': 1.1.1 '@protobufjs/utf8': 1.1.1
'@types/node': 24.12.2 '@types/node': 24.12.2
long: 5.3.2 long: 5.3.2
optional: true
[email protected]: [email protected]:
dependencies: dependencies:
@@ -16540,6 +16781,27 @@ snapshots:
sprintf-js: 1.1.3 sprintf-js: 1.1.3
optional: true optional: true
[email protected]:
dependencies:
'@oxc-project/types': 0.127.0
'@rolldown/pluginutils': 1.0.0-rc.17
optionalDependencies:
'@rolldown/binding-android-arm64': 1.0.0-rc.17
'@rolldown/binding-darwin-arm64': 1.0.0-rc.17
'@rolldown/binding-darwin-x64': 1.0.0-rc.17
'@rolldown/binding-freebsd-x64': 1.0.0-rc.17
'@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17
'@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17
'@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17
'@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17
'@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17
'@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17
'@rolldown/binding-linux-x64-musl': 1.0.0-rc.17
'@rolldown/binding-openharmony-arm64': 1.0.0-rc.17
'@rolldown/binding-wasm32-wasi': 1.0.0-rc.17
'@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17
'@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17
[email protected]: [email protected]:
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
@@ -16570,6 +16832,7 @@ snapshots:
'@rollup/rollup-win32-x64-gnu': 4.60.2 '@rollup/rollup-win32-x64-gnu': 4.60.2
'@rollup/rollup-win32-x64-msvc': 4.60.2 '@rollup/rollup-win32-x64-msvc': 4.60.2
fsevents: 2.3.3 fsevents: 2.3.3
optional: true
[email protected]: [email protected]:
dependencies: dependencies:
@@ -17182,15 +17445,16 @@ snapshots:
type-fest: 2.19.0 type-fest: 2.19.0
unique-string: 3.0.0 unique-string: 3.0.0
[email protected](@swc/[email protected])([email protected](@swc/[email protected])): [email protected](@swc/[email protected])([email protected])([email protected](@swc/[email protected])([email protected])):
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.31 '@jridgewell/trace-mapping': 0.3.31
jest-worker: 27.5.1 jest-worker: 27.5.1
schema-utils: 4.3.3 schema-utils: 4.3.3
terser: 5.46.1 terser: 5.46.1
webpack: 5.106.2(@swc/[email protected]) webpack: 5.106.2(@swc/[email protected])([email protected])
optionalDependencies: optionalDependencies:
'@swc/core': 1.15.30 '@swc/core': 1.15.30
esbuild: 0.25.12
[email protected]: [email protected]:
dependencies: dependencies:
@@ -17572,37 +17836,36 @@ snapshots:
extsprintf: 1.4.1 extsprintf: 1.4.1
optional: true optional: true
[email protected]([email protected])(vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected])): [email protected]([email protected])(vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected])):
dependencies: dependencies:
debug: 4.4.3 debug: 4.4.3
globrex: 0.1.2 globrex: 0.1.2
tsconfck: 3.1.6([email protected]) tsconfck: 3.1.6([email protected])
vite: 6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]) vite: 8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected])
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]): vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]):
dependencies: dependencies:
esbuild: 0.25.12 lightningcss: 1.32.0
fdir: 6.5.0([email protected])
picomatch: 4.0.4 picomatch: 4.0.4
postcss: 8.5.10 postcss: 8.5.10
rollup: 4.60.2 rolldown: 1.0.0-rc.17
tinyglobby: 0.2.16 tinyglobby: 0.2.16
optionalDependencies: optionalDependencies:
'@types/node': 24.12.2 '@types/node': 24.12.2
esbuild: 0.25.12
fsevents: 2.3.3 fsevents: 2.3.3
jiti: 2.6.1 jiti: 2.6.1
lightningcss: 1.32.0
terser: 5.46.1 terser: 5.46.1
tsx: 4.21.0 tsx: 4.21.0
yaml: 2.8.3 yaml: 2.8.3
[email protected](@opentelemetry/[email protected])(@types/[email protected])([email protected])([email protected])(vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected])): [email protected](@opentelemetry/[email protected])(@types/[email protected])([email protected])([email protected])(vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected])):
dependencies: dependencies:
'@vitest/expect': 4.1.5 '@vitest/expect': 4.1.5
'@vitest/mocker': 4.1.5(vite@6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected])) '@vitest/mocker': 4.1.5(vite@8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected]))
'@vitest/pretty-format': 4.1.5 '@vitest/pretty-format': 4.1.5
'@vitest/runner': 4.1.5 '@vitest/runner': 4.1.5
'@vitest/snapshot': 4.1.5 '@vitest/snapshot': 4.1.5
@@ -17619,7 +17882,7 @@ snapshots:
tinyexec: 1.1.1 tinyexec: 1.1.1
tinyglobby: 0.2.16 tinyglobby: 0.2.16
tinyrainbow: 3.1.0 tinyrainbow: 3.1.0
vite: 6.4.2(@types/[email protected])([email protected].1)([email protected])([email protected])([email protected])([email protected]) vite: 8.0.10(@types/[email protected])([email protected].12)([email protected])([email protected])([email protected])([email protected])
why-is-node-running: 2.3.0 why-is-node-running: 2.3.0
optionalDependencies: optionalDependencies:
'@opentelemetry/api': 1.9.1 '@opentelemetry/api': 1.9.1
@@ -17656,7 +17919,7 @@ snapshots:
[email protected]: {} [email protected]: {}
[email protected](@swc/[email protected]): [email protected](@swc/[email protected])([email protected]):
dependencies: dependencies:
'@types/eslint-scope': 3.7.7 '@types/eslint-scope': 3.7.7
'@types/estree': 1.0.8 '@types/estree': 1.0.8
@@ -17679,7 +17942,7 @@ snapshots:
neo-async: 2.6.2 neo-async: 2.6.2
schema-utils: 4.3.3 schema-utils: 4.3.3
tapable: 2.3.3 tapable: 2.3.3
terser-webpack-plugin: 5.4.0(@swc/[email protected])([email protected](@swc/[email protected])) terser-webpack-plugin: 5.4.0(@swc/[email protected])([email protected])([email protected](@swc/[email protected])([email protected]))
watchpack: 2.5.1 watchpack: 2.5.1
webpack-sources: 3.3.4 webpack-sources: 3.3.4
transitivePeerDependencies: transitivePeerDependencies:
+619
View File
@@ -0,0 +1,619 @@
/**
* Cross-platform development environment setup for Gemini Nexus.
*
* Detects and installs native build toolchains required by better-sqlite3,
* keytar, and other native Node.js modules used in this Electron project.
*
* Platforms:
* - Windows → Visual Studio 2022 Build Tools (C++ workload)
* - macOS → Xcode Command Line Tools
* - Ubuntu → build-essential, python3, libsecret-1-dev
* - Manjaro/Arch → base-devel, python, libsecret
*
* Usage:
* node scripts/setup-dev.js # auto-detect and install/guide
* node scripts/setup-dev.js --check-only # only verify, don't install
*/
'use strict';
const { execSync, spawnSync } = require('child_process');
const fs = require('fs');
const os = require('os');
const path = require('path');
// ─── Terminal Color Helpers ─────────────────────────────────────────────────
const RESET = '\x1b[0m';
const BOLD = '\x1b[1m';
const DIM = '\x1b[2m';
const RED = '\x1b[31m';
const GREEN = '\x1b[32m';
const YELLOW = '\x1b[33m';
const CYAN = '\x1b[36m';
const MAGENTA = '\x1b[35m';
// Disable colors if NO_COLOR is set or output is piped
const useColor = process.env.NO_COLOR === undefined && process.stdout.isTTY;
function color(code, text) {
return useColor ? `${code}${text}${RESET}` : text;
}
function header(text) {
console.log(`\n${color(BOLD + MAGENTA, '══')} ${color(BOLD, text)} ${color(BOLD + MAGENTA, '══')}`);
}
function success(text) {
console.log(` ${color(GREEN, '✓')} ${text}`);
}
function warn(text) {
console.log(` ${color(YELLOW, '⚠')} ${text}`);
}
function error(text) {
console.log(` ${color(RED, '✗')} ${text}`);
}
function info(text) {
console.log(` ${color(CYAN, '→')} ${text}`);
}
function dim(text) {
console.log(` ${color(DIM, text)}`);
}
function section(title) {
console.log(`\n ${color(BOLD, title)}:`);
}
// ─── Platform Detection ─────────────────────────────────────────────────────
const platform = os.platform(); // 'win32' | 'darwin' | 'linux'
const arch = os.arch();
/** Detect Linux distribution from os-release */
function detectLinuxDistro() {
try {
const osRelease = fs.readFileSync('/etc/os-release', 'utf8');
const idMatch = osRelease.match(/^ID="?([^"\n]+)"?/m);
const idLikeMatch = osRelease.match(/^ID_LIKE="?([^"\n]+)"?/m);
const id = idMatch ? idMatch[1].toLowerCase() : '';
const idLike = idLikeMatch ? idLikeMatch[1].toLowerCase() : '';
if (id === 'ubuntu' || id === 'debian' || idLike.includes('debian')) {
return 'debian';
}
if (id === 'arch' || id === 'manjaro' || idLike.includes('arch')) {
return 'arch';
}
if (id === 'fedora' || idLike.includes('fedora') || idLike.includes('rhel')) {
return 'fedora';
}
return id || 'unknown';
} catch {
return 'unknown';
}
}
// ─── Tool Checkers ──────────────────────────────────────────────────────────
/** Check if a command exists on PATH */
function commandExists(cmd) {
try {
const whereCmd = platform === 'win32' ? 'where' : 'which';
execSync(`${whereCmd} "${cmd}"`, { stdio: 'ignore' });
return true;
} catch {
return false;
}
}
/** Check if running with administrator/sudo privileges */
function hasAdminPrivileges() {
if (platform === 'win32') {
try {
// On Windows, check via net session (requires admin)
execSync('net session', { stdio: 'ignore' });
return true;
} catch {
return false;
}
}
// On Unix, check if UID is 0
return process.getuid ? process.getuid() === 0 : false;
}
/** Check Windows: Visual Studio Build Tools */
function checkWindows() {
const results = { ok: true, missing: [] };
// Check for cl.exe (C++ compiler from VS Build Tools)
if (commandExists('cl.exe')) {
success('MSVC Compiler (cl.exe) found');
} else {
// Try to find VS installation via vswhere or registry
let vsFound = false;
// vswhere.exe (shipped with VS 2017+)
const vswherePaths = [
'C:\\Program Files (x86)\\Microsoft Visual Studio\\Installer\\vswhere.exe',
'C:\\Program Files\\Microsoft Visual Studio\\Installer\\vswhere.exe',
];
for (const vswhere of vswherePaths) {
try {
const output = execSync(`"${vswhere}" -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`, {
stdio: ['ignore', 'pipe', 'ignore'],
encoding: 'utf8',
}).trim();
if (output) {
vsFound = true;
success(`Visual Studio found at: ${output}`);
break;
}
} catch {
// vswhere not found, continue
}
}
// Check registry fallback
if (!vsFound) {
try {
execSync(
'reg query "HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7" /v 17.0',
{ stdio: 'ignore' },
);
vsFound = true;
success('Visual Studio 2022 found (registry)');
} catch {
// Not found in registry either
}
}
if (!vsFound) {
error('MSVC Build Tools not found');
results.ok = false;
results.missing.push('msvc');
}
}
// Check Python (needed by node-gyp)
if (commandExists('python') || commandExists('python3')) {
success('Python found');
} else {
error('Python not found (required by node-gyp)');
results.ok = false;
results.missing.push('python');
}
return results;
}
/** Check macOS: Xcode Command Line Tools */
function checkMacOS() {
const results = { ok: true, missing: [] };
try {
const xcodePath = execSync('xcode-select -p', { stdio: ['ignore', 'pipe', 'ignore'], encoding: 'utf8' }).trim();
if (xcodePath) {
success(`Xcode CLT found at: ${xcodePath}`);
}
} catch {
error('Xcode Command Line Tools not found');
results.ok = false;
results.missing.push('xcode-clt');
}
if (commandExists('make') || commandExists('gmake')) {
success('make found');
} else {
error('make not found');
results.ok = false;
results.missing.push('make');
}
return results;
}
/** Check Linux: build-essential, python3, libsecret */
function checkLinux() {
const results = { ok: true, missing: [] };
const distro = detectLinuxDistro();
section(`Linux Distribution Detected: ${distro || 'unknown'}`);
// gcc / g++
if (commandExists('gcc') || commandExists('cc')) {
success('C compiler found');
} else {
error('C compiler not found');
results.ok = false;
results.missing.push('compiler');
}
if (commandExists('g++') || commandExists('c++')) {
success('C++ compiler found');
} else {
error('C++ compiler not found');
results.ok = false;
results.missing.push('compiler');
}
// make
if (commandExists('make')) {
success('make found');
} else {
error('make not found');
results.ok = false;
results.missing.push('make');
}
// Python 3
if (commandExists('python3')) {
success('Python 3 found');
} else if (commandExists('python')) {
// Check if python is python3
try {
const ver = execSync('python --version', { encoding: 'utf8' });
if (ver.includes('3.')) {
success('Python 3 found (as python)');
} else {
error('Python 3 not found (python is v2)');
results.ok = false;
results.missing.push('python3');
}
} catch {
error('Python not found');
results.ok = false;
results.missing.push('python3');
}
} else {
error('Python 3 not found');
results.ok = false;
results.missing.push('python3');
}
// libsecret (needed by keytar)
try {
if (distro === 'debian') {
execSync('dpkg -s libsecret-1-dev', { stdio: 'ignore' });
success('libsecret-1-dev found');
} else if (distro === 'arch') {
execSync('pacman -Qi libsecret', { stdio: 'ignore' });
success('libsecret found');
} else {
// Check for pkg-config
try {
execSync('pkg-config --exists libsecret-1', { stdio: 'ignore' });
success('libsecret (pkg-config) found');
} catch {
warn('libsecret not detected (may not be needed if using prebuilt keytar)');
}
}
} catch {
warn('libsecret not detected (may not be needed if using prebuilt keytar)');
}
return results;
}
// ─── Installation Helpers ───────────────────────────────────────────────────
/** Run a command and stream output, return exit code */
function runCommand(cmd, args, opts = {}) {
return new Promise((resolve) => {
console.log(`\n ${color(CYAN, 'Running:')} ${color(DIM, `${cmd} ${args.join(' ')}`)}`);
const child = spawnSync(cmd, args, {
stdio: 'inherit',
shell: platform === 'win32',
...opts,
});
resolve(child.status);
});
}
/** Install Windows: Visual Studio 2022 Build Tools via winget */
async function installWindows() {
// Check if winget is available
if (!commandExists('winget')) {
console.log('');
console.log(color(RED, ' winget not found. Please install Visual Studio Build Tools manually:'));
console.log(color(CYAN, ' https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022'));
console.log('');
console.log(' During installation, select:');
console.log(color(BOLD, ' "Desktop development with C++" workload'));
console.log('');
console.log(' Or install via PowerShell (as Administrator):');
console.log(color(DIM, ' winget install Microsoft.VisualStudio.2022.BuildTools --override "--wait --quiet --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"'));
return false;
}
console.log('');
info('Attempting automatic installation of Visual Studio 2022 Build Tools...');
dim('This may take several minutes and requires administrator privileges.');
console.log('');
if (!hasAdminPrivileges()) {
warn('Not running as Administrator. winget may prompt for elevation.');
}
const status = await runCommand('winget', [
'install',
'Microsoft.VisualStudio.2022.BuildTools',
'--override',
'"--quiet --wait --norestart --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows11SDK.22621 --includeRecommended"',
]);
if (status === 0) {
success('Visual Studio 2022 Build Tools installed successfully.');
console.log('');
warn('You may need to restart your terminal for PATH changes to take effect.');
return true;
}
error('Automatic installation failed. Please install manually.');
return false;
}
/** Install macOS: Xcode Command Line Tools */
async function installMacOS() {
console.log('');
info('Installing Xcode Command Line Tools...');
dim('A GUI dialog will appear. Click "Install" to proceed.');
const status = await runCommand('xcode-select', ['--install']);
// xcode-select --install returns 1 if already installed or cancelled
if (status === 0) {
success('Xcode Command Line Tools installation initiated.');
return true;
}
// Check if already installed (common false-negative)
try {
execSync('xcode-select -p', { stdio: 'ignore' });
success('Xcode Command Line Tools are already installed.');
return true;
} catch {
warn('Xcode CLT installation was cancelled or failed.');
warn('You can install manually via: xcode-select --install');
return false;
}
}
/** Install Linux: distribution-specific packages */
async function installLinux() {
const distro = detectLinuxDistro();
if (distro === 'debian') {
// Ubuntu / Debian
if (!hasAdminPrivileges()) {
warn('Root privileges required. You may be prompted for your password.');
}
const status = await runCommand('sudo', [
'apt-get', 'install', '-y',
'build-essential',
'python3',
'libsecret-1-dev',
'pkg-config',
]);
if (status === 0) {
success('Build dependencies installed successfully.');
return true;
}
error('Failed to install build dependencies.');
return false;
}
if (distro === 'arch') {
// Manjaro / Arch
if (!hasAdminPrivileges()) {
warn('Root privileges required. You may be prompted for your password.');
}
const status = await runCommand('sudo', [
'pacman', '-S', '--needed', '--noconfirm',
'base-devel',
'python',
'libsecret',
'pkg-config',
]);
if (status === 0) {
success('Build dependencies installed successfully.');
return true;
}
error('Failed to install build dependencies.');
return false;
}
if (distro === 'fedora') {
if (!hasAdminPrivileges()) {
warn('Root privileges required. You may be prompted for your password.');
}
const status = await runCommand('sudo', [
'dnf', 'install', '-y',
'gcc-c++',
'make',
'python3',
'libsecret-devel',
'pkg-config',
]);
if (status === 0) {
success('Build dependencies installed successfully.');
return true;
}
error('Failed to install build dependencies.');
return false;
}
// Unknown distro - provide generic instructions
console.log('');
warn(`Unknown Linux distribution: ${distro}`);
console.log('');
console.log(' You need the following packages to compile native Node.js modules:');
console.log(' - C/C++ compiler (gcc, g++)');
console.log(' - GNU Make');
console.log(' - Python 3');
console.log(' - libsecret development headers (for keytar)');
console.log(' - pkg-config');
console.log('');
console.log(' Install them using your distribution package manager, then run npm install again.');
return false;
}
// ─── Main ───────────────────────────────────────────────────────────────────
async function main() {
const args = process.argv.slice(2);
const checkOnly = args.includes('--check-only') || args.includes('--check');
console.log('');
console.log(color(BOLD + CYAN, '┌──────────────────────────────────────────┐'));
console.log(color(BOLD + CYAN, '│ Gemini Nexus - Dev Environment Setup │'));
console.log(color(BOLD + CYAN, '└──────────────────────────────────────────┘'));
console.log('');
dim(`Platform: ${platform} (${arch})`);
dim(`Node.js: ${process.version}`);
// Step 1: Check current state
header('Checking Build Toolchain');
let results;
switch (platform) {
case 'win32':
results = checkWindows();
break;
case 'darwin':
results = checkMacOS();
break;
case 'linux':
results = checkLinux();
break;
default:
console.log('');
error(`Unsupported platform: ${platform}`);
process.exit(1);
}
// Print summary
console.log('');
if (results.ok) {
success('All build tools are present and ready.');
console.log('');
dim('You can now run: npm install && npm start');
return;
}
// ── Missing tools ──
console.log('');
error('Some build tools are missing. Native modules like better-sqlite3 and keytar require compilation.');
if (checkOnly) {
console.log('');
warn('Build tools are missing. Native modules (better-sqlite3, keytar) require compilation.');
warn('Run "npm run setup" to install them automatically, or install manually:');
printManualInstructions(platform, results.missing);
console.log('');
dim('npm install succeeded, but npm start / electron-rebuild will fail until build tools are installed.');
// Don't exit with error - allow npm install to succeed (prebuilt binaries may work)
return;
}
// Step 2: Attempt installation
header('Installing Build Dependencies');
let installed = false;
switch (platform) {
case 'win32':
installed = await installWindows();
break;
case 'darwin':
installed = await installMacOS();
break;
case 'linux':
installed = await installLinux();
break;
}
// Step 3: Final status
console.log('');
if (installed) {
success('Setup complete. You can now run: npm install && npm start');
console.log('');
dim('If you encounter issues, restart your terminal and try again.');
} else {
console.log('');
warn('Automatic installation was not successful.');
warn('Please install the required tools manually, then run npm install again.');
printManualInstructions(platform, results.missing);
process.exit(1);
}
}
function printManualInstructions(platform, missing) {
console.log('');
console.log(color(BOLD, ' ── Manual Installation Instructions ──'));
console.log('');
switch (platform) {
case 'win32':
console.log(' 1. Download Visual Studio 2022 Build Tools:');
console.log(color(CYAN, ' https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022'));
console.log('');
console.log(' 2. Run the installer and select:');
console.log(color(BOLD, ' "Desktop development with C++"'));
console.log('');
console.log(' 3. Or install via PowerShell (as Administrator):');
console.log(color(DIM, ' winget install Microsoft.VisualStudio.2022.BuildTools --override "--quiet --wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"'));
console.log('');
console.log(' 4. Restart your terminal after installation.');
break;
case 'darwin':
console.log(' Run this command in your terminal:');
console.log(color(DIM, ' xcode-select --install'));
console.log('');
console.log(' Then click "Install" in the dialog that appears.');
break;
case 'linux': {
const distro = detectLinuxDistro();
if (distro === 'debian') {
console.log(' Run:');
console.log(color(DIM, ' sudo apt-get install -y build-essential python3 libsecret-1-dev pkg-config'));
} else if (distro === 'arch') {
console.log(' Run:');
console.log(color(DIM, ' sudo pacman -S --needed base-devel python libsecret pkg-config'));
} else if (distro === 'fedora') {
console.log(' Run:');
console.log(color(DIM, ' sudo dnf install -y gcc-c++ make python3 libsecret-devel pkg-config'));
} else {
console.log(' Install: C/C++ compiler, make, python3, libsecret-dev, pkg-config');
}
break;
}
}
console.log('');
}
// ─── Run ────────────────────────────────────────────────────────────────────
main().catch((err) => {
console.error(color(RED, `\nUnexpected error: ${err.message}`));
process.exit(1);
});
+1 -1
View File
@@ -30,7 +30,7 @@ const queryClient = new QueryClient();
const root = createRoot(document.getElementById('app')!); const root = createRoot(document.getElementById('app')!);
root.render( root.render(
<QueryClientProvider client={queryClient}> <QueryClientProvider client={queryClient}>
<ThemeProvider storageKey={LOCAL_STORAGE_KEYS.THEME} defaultTheme="system"> <ThemeProvider storageKey={LOCAL_STORAGE_KEYS.THEME} defaultTheme="dark">
<App /> <App />
<Toaster /> <Toaster />
</ThemeProvider> </ThemeProvider>
Binary file not shown.

After

Width:  |  Height:  |  Size: 875 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 390 KiB

After

Width:  |  Height:  |  Size: 736 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 659 B

After

Width:  |  Height:  |  Size: 44 KiB

+1 -3
View File
@@ -259,9 +259,7 @@ export function CloudAccountList() {
return; return;
} }
const activeClientKey = oauthClients.find((client) => client.is_active)?.key; const activeClientKey = oauthClients.find((client) => client.is_active)?.key;
if (activeClientKey) { if (activeClientKey && activeClientKey !== selectedOAuthClientKey) { setTimeout(() => setSelectedOAuthClientKey(activeClientKey), 0); }
setSelectedOAuthClientKey(activeClientKey);
}
}, [oauthClients, selectedOAuthClientKey]); }, [oauthClients, selectedOAuthClientKey]);
// Listen for Google Auth Code // Listen for Google Auth Code
useEffect(() => { useEffect(() => {
+1 -2
View File
@@ -134,8 +134,7 @@ export function IdentityProfileDialog({ account, open, onOpenChange }: IdentityP
if (!open) { if (!open) {
return; return;
} }
void refreshProfiles(); setTimeout(() => { void refreshProfiles(); }, 0); }, [open, refreshProfiles]);
}, [open, refreshProfiles]);
const runAction = async (key: string, action: () => Promise<void>) => { const runAction = async (key: string, action: () => Promise<void>) => {
if (actionLockRef.current) { if (actionLockRef.current) {
+2 -6
View File
@@ -48,12 +48,8 @@ export function ModelVisibilitySettings() {
// Initialize model visibility and provider groupings from config // Initialize model visibility and provider groupings from config
useEffect(() => { useEffect(() => {
if (config?.model_visibility) { if (config?.model_visibility) { setTimeout(() => setModelVisibilityMap(config.model_visibility), 0); }
setModelVisibilityMap(config.model_visibility); if (config?.provider_groupings_enabled !== undefined) { setTimeout(() => setProviderGroupingEnabled(config.provider_groupings_enabled), 0); }
}
if (config?.provider_groupings_enabled !== undefined) {
setProviderGroupingEnabled(config.provider_groupings_enabled);
}
}, [config?.model_visibility, config?.provider_groupings_enabled]); }, [config?.model_visibility, config?.provider_groupings_enabled]);
// Get all unique models from all accounts // Get all unique models from all accounts
+2 -2
View File
@@ -107,7 +107,7 @@ function ProxyPage() {
useEffect(() => { useEffect(() => {
if (localIps && localIps.length > 0 && !selectedIp) { if (localIps && localIps.length > 0 && !selectedIp) {
const recommended = localIps.find((ip) => ip.isRecommended); const recommended = localIps.find((ip) => ip.isRecommended);
setSelectedIp(recommended?.address || localIps[0].address); setTimeout(() => setSelectedIp(recommended?.address || localIps[0].address), 0);
} }
}, [localIps, selectedIp]); }, [localIps, selectedIp]);
@@ -208,7 +208,7 @@ function ProxyPage() {
useEffect(() => { useEffect(() => {
if (!availableModelIds.includes(activeModelTab) && availableModelIds.length > 0) { if (!availableModelIds.includes(activeModelTab) && availableModelIds.length > 0) {
setActiveModelTab(availableModelIds[0]); setTimeout(() => setActiveModelTab(availableModelIds[0]), 0);
} }
}, [availableModelIds, activeModelTab]); }, [availableModelIds, activeModelTab]);
+31 -170
View File
@@ -1,3 +1,5 @@
@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,400;0,500;0,700;1,400&display=swap');
@import 'tailwindcss'; @import 'tailwindcss';
@plugin 'tailwindcss-animate'; @plugin 'tailwindcss-animate';
@@ -32,7 +34,7 @@
--color-card: hsl(var(--card)); --color-card: hsl(var(--card));
--color-card-foreground: hsl(var(--card-foreground)); --color-card-foreground: hsl(var(--card-foreground));
--font-sans: Geist, 'Microsoft YaHei', 'Heiti SC', 'WenQuanYi Micro Hei', sans-serif; --font-sans: Plus Jakarta Sans, 'Microsoft YaHei', 'Heiti SC', 'WenQuanYi Micro Hei', sans-serif;
--font-mono: Geist Mono, monospace; --font-mono: Geist Mono, monospace;
--font-tomorrow: Tomorrow, sans-serif; --font-tomorrow: Tomorrow, sans-serif;
@@ -74,9 +76,7 @@
@layer base { @layer base {
@font-face { @font-face {
font-family: 'Geist';
src: url('../assets/fonts/geist/geist.ttf') format('truetype');
} }
@font-face { @font-face {
font-family: 'Geist Mono'; font-family: 'Geist Mono';
@@ -119,67 +119,9 @@
} }
@layer base { @layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--card: 0 0% 100%;
--card-foreground: 222.2 84% 4.9%;
--popover: 0 0% 100%;
--popover-foreground: 222.2 84% 4.9%;
--primary: 222.2 47.4% 11.2%;
--primary-foreground: 210 40% 98%;
--secondary: 210 40% 96.1%;
--secondary-foreground: 222.2 47.4% 11.2%;
--muted: 210 40% 96.1%;
--muted-foreground: 215.4 16.3% 46.9%;
--accent: 210 40% 96.1%;
--accent-foreground: 222.2 47.4% 11.2%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 210 40% 98%;
--border: 214.3 31.8% 91.4%;
--input: 214.3 31.8% 91.4%;
--ring: 222.2 84% 4.9%;
--radius: 0.5rem;
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;
--card: 222.2 84% 4.9%;
--card-foreground: 210 40% 98%;
--popover: 222.2 84% 4.9%;
--popover-foreground: 210 40% 98%;
--primary: 210 40% 98%;
--primary-foreground: 222.2 47.4% 11.2%;
--secondary: 217.2 32.6% 17.5%;
--secondary-foreground: 210 40% 98%;
--muted: 217.2 32.6% 17.5%;
--muted-foreground: 215 20.2% 65.1%;
--accent: 217.2 32.6% 17.5%;
--accent-foreground: 210 40% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 210 40% 98%;
--border: 217.2 32.6% 17.5%;
--input: 217.2 32.6% 17.5%;
--ring: 212.7 26.8% 83.9%;
}
} }
@layer base { @layer base {
@@ -205,7 +147,7 @@
} }
@theme inline { @theme inline {
--font-sans: Geist, sans-serif; --font-sans: Plus Jakarta Sans, sans-serif;
--font-mono: Geist Mono, monospace; --font-mono: Geist Mono, monospace;
--font-serif: Georgia, serif; --font-serif: Georgia, serif;
--radius: 0.5rem; --radius: 0.5rem;
@@ -272,113 +214,32 @@
--radius-4xl: calc(var(--radius) + 16px); --radius-4xl: calc(var(--radius) + 16px);
} }
:root {
--background: oklch(0.99 0 0);
--foreground: oklch(0 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0 0 0);
--popover: oklch(0.99 0 0);
--popover-foreground: oklch(0 0 0);
--primary: oklch(0 0 0);
--primary-foreground: oklch(1 0 0);
--secondary: oklch(0.94 0 0);
--secondary-foreground: oklch(0 0 0);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.44 0 0);
--accent: oklch(0.94 0 0);
--accent-foreground: oklch(0 0 0);
--destructive: oklch(0.63 0.19 23.03);
--destructive-foreground: oklch(1 0 0);
--border: oklch(0.92 0 0);
--input: oklch(0.94 0 0);
--ring: oklch(0 0 0);
--chart-1: oklch(0.81 0.17 75.35);
--chart-2: oklch(0.55 0.22 264.53);
--chart-3: oklch(0.72 0 0);
--chart-4: oklch(0.92 0 0);
--chart-5: oklch(0.56 0 0);
--radius: 0.5rem;
--sidebar: oklch(0.99 0 0);
--sidebar-foreground: oklch(0 0 0);
--sidebar-primary: oklch(0 0 0);
--sidebar-primary-foreground: oklch(1 0 0);
--sidebar-accent: oklch(0.94 0 0);
--sidebar-accent-foreground: oklch(0 0 0);
--sidebar-border: oklch(0.94 0 0);
--sidebar-ring: oklch(0 0 0);
--font-sans: Geist, sans-serif;
--font-serif: Georgia, serif;
--font-mono: Geist Mono, monospace;
--shadow-color: hsl(0 0% 0%);
--shadow-opacity: 0.18;
--shadow-blur: 2px;
--shadow-spread: 0px;
--shadow-offset-x: 0px;
--shadow-offset-y: 1px;
--letter-spacing: 0em;
--spacing: 0.25rem;
--shadow-2xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09);
--shadow-xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09);
--shadow-sm: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18);
--shadow: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18);
--shadow-md: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 2px 4px -1px hsl(0 0% 0% / 0.18);
--shadow-lg: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 4px 6px -1px hsl(0 0% 0% / 0.18);
--shadow-xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 8px 10px -1px hsl(0 0% 0% / 0.18);
--shadow-2xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.45);
--tracking-normal: 0em;
}
.dark {
--background: oklch(0 0 0);
--foreground: oklch(1 0 0);
--card: oklch(0.14 0 0);
--card-foreground: oklch(1 0 0); @layer base {
--popover: oklch(0.18 0 0); :root, .dark {
--popover-foreground: oklch(1 0 0); --background: #0F172A;
--primary: oklch(1 0 0); --foreground: #F8FAFC;
--primary-foreground: oklch(0 0 0); --card: #0F172A;
--secondary: oklch(0.25 0 0); --card-foreground: #F8FAFC;
--secondary-foreground: oklch(1 0 0); --popover: #0F172A;
--muted: oklch(0.23 0 0); --popover-foreground: #F8FAFC;
--muted-foreground: oklch(0.72 0 0); --primary: #1E293B;
--accent: oklch(0.32 0 0); --primary-foreground: #FFFFFF;
--accent-foreground: oklch(1 0 0); --secondary: #334155;
--destructive: oklch(0.69 0.2 23.91); --secondary-foreground: #FFFFFF;
--destructive-foreground: oklch(0 0 0); --muted: #272F42;
--border: oklch(0.26 0 0); --muted-foreground: #94A3B8;
--input: oklch(0.32 0 0); --accent: #22C55E;
--ring: oklch(0.72 0 0); --accent-foreground: #FFFFFF;
--chart-1: oklch(0.81 0.17 75.35); --destructive: #EF4444;
--chart-2: oklch(0.58 0.21 260.84); --destructive-foreground: #FFFFFF;
--chart-3: oklch(0.56 0 0); --border: #475569;
--chart-4: oklch(0.44 0 0); --input: #475569;
--chart-5: oklch(0.92 0 0); --ring: #1E293B;
--radius: 0.5rem; --radius: 0.5rem;
--sidebar: oklch(0.18 0 0); }
--sidebar-foreground: oklch(1 0 0);
--sidebar-primary: oklch(1 0 0);
--sidebar-primary-foreground: oklch(0 0 0);
--sidebar-accent: oklch(0.32 0 0);
--sidebar-accent-foreground: oklch(1 0 0);
--sidebar-border: oklch(0.32 0 0);
--sidebar-ring: oklch(0.72 0 0);
--font-sans: Geist, sans-serif;
--font-serif: Georgia, serif;
--font-mono: Geist Mono, monospace;
--shadow-color: hsl(0 0% 0%);
--shadow-opacity: 0.18;
--shadow-blur: 2px;
--shadow-spread: 0px;
--shadow-offset-x: 0px;
--shadow-offset-y: 1px;
--letter-spacing: 0em;
--spacing: 0.25rem;
--shadow-2xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09);
--shadow-xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09);
--shadow-sm: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18);
--shadow: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18);
--shadow-md: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 2px 4px -1px hsl(0 0% 0% / 0.18);
--shadow-lg: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 4px 6px -1px hsl(0 0% 0% / 0.18);
--shadow-xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 8px 10px -1px hsl(0 0% 0% / 0.18);
--shadow-2xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.45);
} }