diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..c2d844c2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,52 @@ +# Dependencies installed inside the image +node_modules/ +landing/node_modules/ + +# Local build output +dist/ +dist-electron/ +dist-standalone/ +out/ +release/ +coverage/ +landing/.nuxt/ +landing/.output/ +electron.vite.config.*.mjs + +# Runtime and local caches +.git/ +.pnpm-store/ +.runtime-download/ +resources/runtime/* +!resources/runtime/.gitkeep +.eslintcache +.eslintcache-fast +*.tsbuildinfo + +# Local-only data +.claude/ +.home/ +.serena/ +.playwright-mcp/ +logs/ +*.log +.env +.env.* + +# OS and editor noise +.DS_Store +Thumbs.db +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Local scratch artifacts +notification_example/ +temp/ +eslint-fix/ +remotion/* +.tmp-* +agent-teams-reference-fix-*.png +ORCHESTRATOR_RELEASE_RUNBOOK.local.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b6856f31..c53b510c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,7 +64,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: 22 + node-version-file: .node-version cache: pnpm - name: Restore pnpm node-gyp executable bit @@ -102,7 +102,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: 22 + node-version-file: .node-version cache: pnpm - name: Restore pnpm node-gyp executable bit @@ -136,7 +136,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: 22 + node-version-file: .node-version cache: pnpm - name: Install dependencies diff --git a/.github/workflows/codex-runtime-smoke.yml b/.github/workflows/codex-runtime-smoke.yml index c162a884..cb902999 100644 --- a/.github/workflows/codex-runtime-smoke.yml +++ b/.github/workflows/codex-runtime-smoke.yml @@ -58,7 +58,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: 22 + node-version-file: .node-version cache: pnpm - name: Install dependencies diff --git a/.github/workflows/landing.yml b/.github/workflows/landing.yml index 62325b21..f61bf286 100644 --- a/.github/workflows/landing.yml +++ b/.github/workflows/landing.yml @@ -23,7 +23,7 @@ jobs: - uses: actions/setup-node@v6 with: - node-version: 22 + node-version-file: .node-version cache: npm cache-dependency-path: landing/package-lock.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d173a17d..cefefe63 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,7 +42,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: 22 + node-version-file: .node-version cache: pnpm - name: Restore pnpm node-gyp executable bit @@ -334,7 +334,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: 22 + node-version-file: .node-version cache: pnpm - name: Setup Python for node-gyp @@ -455,7 +455,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: 22 + node-version-file: .node-version cache: pnpm - name: Setup Python for node-gyp @@ -577,7 +577,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: 22 + node-version-file: .node-version cache: pnpm - name: Setup Python for node-gyp diff --git a/.node-version b/.node-version new file mode 100644 index 00000000..b832e400 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +24.16.0 diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..b832e400 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24.16.0 diff --git a/agent-teams-controller/package.json b/agent-teams-controller/package.json index ce27fce1..902e6d05 100644 --- a/agent-teams-controller/package.json +++ b/agent-teams-controller/package.json @@ -14,6 +14,6 @@ "test:watch": "vitest --config vitest.config.js" }, "engines": { - "node": ">=20" + "node": ">=24.16.0 <25" } } diff --git a/docker/Dockerfile b/docker/Dockerfile index 51fe7153..2959e570 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -8,35 +8,55 @@ # Run: docker run -p 3456:3456 -v ~/.claude:/data/.claude:ro agent-teams-ai # ============================================================================= -FROM node:20-slim AS builder +ARG NODE_VERSION=24.16.0 + +FROM node:${NODE_VERSION}-slim AS base WORKDIR /app # Enable corepack for pnpm RUN corepack enable +FROM base AS builder + +# Native dependencies such as node-pty may need source builds on slim images. +RUN apt-get update \ + && apt-get install -y --no-install-recommends python3 make g++ \ + && rm -rf /var/lib/apt/lists/* + # Install dependencies first (better layer caching) COPY package.json pnpm-lock.yaml ./ +COPY patches ./patches RUN pnpm install --frozen-lockfile # Copy source and build COPY . . -RUN pnpm standalone:build +RUN AGENT_TEAMS_DISABLE_SOURCEMAPS=1 pnpm standalone:build # ============================================================================= -# Production stage — minimal image with only the built output +# Production dependencies stage # ============================================================================= -FROM node:20-slim +FROM base AS prod-deps -WORKDIR /app +RUN apt-get update \ + && apt-get install -y --no-install-recommends python3 make g++ \ + && rm -rf /var/lib/apt/lists/* -# Enable corepack for pnpm -RUN corepack enable - -# Copy package files and install production-only dependencies +# Install production-only dependencies # (fastify, @fastify/cors, @fastify/static are externalized from the bundle) -COPY --from=builder /app/package.json /app/pnpm-lock.yaml ./ -RUN pnpm install --frozen-lockfile --prod +COPY package.json pnpm-lock.yaml ./ +COPY patches ./patches +RUN pnpm install --frozen-lockfile --prod --ignore-scripts \ + && pnpm rebuild node-pty cpu-features ssh2 + +# ============================================================================= +# Production stage - minimal image with only runtime dependencies and built output +# ============================================================================= +FROM base + +COPY --from=prod-deps /app/package.json /app/pnpm-lock.yaml ./ +COPY --from=prod-deps /app/node_modules ./node_modules +COPY --from=builder /app/agent-teams-controller ./agent-teams-controller # Copy built standalone server and renderer output COPY --from=builder /app/dist-standalone ./dist-standalone diff --git a/docker/vite.standalone.config.ts b/docker/vite.standalone.config.ts index 8179e125..703cd07f 100644 --- a/docker/vite.standalone.config.ts +++ b/docker/vite.standalone.config.ts @@ -14,6 +14,7 @@ import type { Plugin } from 'vite' // `vite build --config docker/vite.standalone.config.ts`, so __dirname // is docker/. All paths must resolve relative to the repo root. const ROOT = resolve(__dirname, '..') +const sourceMapsEnabled = process.env.AGENT_TEAMS_DISABLE_SOURCEMAPS !== '1' // Node.js built-in modules that should be externalized const nodeBuiltins = new Set([ @@ -35,11 +36,13 @@ function nativeModuleStub(): Plugin { const STUB_ID = '\0native-stub' return { name: 'native-module-stub', + enforce: 'pre', resolveId(source) { if (source.endsWith('.node')) return STUB_ID return null }, load(id) { + if (id.endsWith('.node')) return 'export default {}' if (id === STUB_ID) return 'export default {}' return null } @@ -63,6 +66,8 @@ export const ipcMain = { handle: noop, on: noop, removeHandler: noop }; export const shell = { openPath: noop, openExternal: noop }; export const dialog = { showOpenDialog: async () => ({ canceled: true, filePaths: [] }) }; export const Notification = class { show() {} }; +export const nativeImage = { createFromPath: () => proxyObj, createEmpty: () => proxyObj }; +export const net = { fetch: globalThis.fetch }; export const safeStorage = { isEncryptionAvailable: () => false, encryptString: noop, decryptString: () => '' }; export const screen = proxyObj; export default proxyObj; @@ -87,6 +92,7 @@ export default defineConfig({ plugins: [nativeModuleStub(), electronStub()], resolve: { alias: { + '@features': resolve(ROOT, 'src/features'), '@main': resolve(ROOT, 'src/main'), '@shared': resolve(ROOT, 'src/shared'), '@preload': resolve(ROOT, 'src/preload') @@ -99,7 +105,7 @@ export default defineConfig({ }, build: { outDir: 'dist-standalone', - target: 'node20', + target: 'node24', ssr: true, rollupOptions: { input: { @@ -119,6 +125,6 @@ export default defineConfig({ } }, minify: false, - sourcemap: true + sourcemap: sourceMapsEnabled } }) diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 1c6486c5..e157ceea 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -55,6 +55,8 @@ const sentrySourceMapTargets = { }, } as const +const sourceMapSetting = process.env.AGENT_TEAMS_DISABLE_SOURCEMAPS === '1' ? false : 'hidden' + // Sentry source map upload - only active in CI when SENTRY_AUTH_TOKEN is set. function createSentryPlugins(target: keyof typeof sentrySourceMapTargets): Plugin[] { if (!process.env.SENTRY_AUTH_TOKEN) return [] @@ -98,7 +100,7 @@ export default defineConfig({ commonjsOptions: { strictRequires: [/node_modules\/.*ssh2\//], }, - sourcemap: 'hidden', + sourcemap: sourceMapSetting, outDir: 'dist-electron/main', rollupOptions: { input: { @@ -169,7 +171,7 @@ export default defineConfig({ }, plugins: [react(), ...createSentryPlugins('renderer')], build: { - sourcemap: 'hidden', + sourcemap: sourceMapSetting, rollupOptions: { input: { index: resolve(__dirname, 'src/renderer/index.html') diff --git a/landing/.npmrc b/landing/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/landing/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/landing/package-lock.json b/landing/package-lock.json index 8a4d6beb..5841cc0b 100644 --- a/landing/package-lock.json +++ b/landing/package-lock.json @@ -35,6 +35,9 @@ "vitepress": "2.0.0-alpha.17", "vitepress-codeblock-collapse": "^1.0.0", "vitepress-plugin-llms": "^1.12.2" + }, + "engines": { + "node": ">=24.16.0 <25" } }, "node_modules/@alloc/quick-lru": { diff --git a/landing/package.json b/landing/package.json index 9d0ec642..fda278ca 100644 --- a/landing/package.json +++ b/landing/package.json @@ -2,6 +2,9 @@ "name": "agent-teams-landing", "private": true, "type": "module", + "engines": { + "node": ">=24.16.0 <25" + }, "scripts": { "dev": "nuxt dev", "build": "nuxt build", diff --git a/mcp-server/package.json b/mcp-server/package.json index 35ccc15e..71e2a285 100644 --- a/mcp-server/package.json +++ b/mcp-server/package.json @@ -41,13 +41,13 @@ "zod": "^4.3.6" }, "devDependencies": { + "@types/node": "^24.12.4", "tsup": "^8.5.1", "tsx": "^4.21.0", "typescript": "^5.8.2", - "vitest": "^3.1.4", - "@types/node": "^22.15.18" + "vitest": "^3.1.4" }, "engines": { - "node": ">=20" + "node": ">=24.16.0 <25" } } diff --git a/mcp-server/tsup.config.ts b/mcp-server/tsup.config.ts index 86520de5..01d2b622 100644 --- a/mcp-server/tsup.config.ts +++ b/mcp-server/tsup.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from 'tsup'; export default defineConfig({ entry: ['src/index.ts'], format: ['esm'], - target: 'node20', + target: 'node24', platform: 'node', outDir: 'dist', clean: true, diff --git a/package.json b/package.json index 48c25107..9b23c28f 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,9 @@ "bugs": { "url": "https://github.com/777genius/agent-teams-ai/issues" }, + "engines": { + "node": ">=24.16.0 <25" + }, "main": "dist-electron/main/index.cjs", "scripts": { "dev": "node ./scripts/dev-with-runtime.mjs", @@ -83,7 +86,7 @@ "test:coverage": "vitest run --coverage", "test:coverage:critical": "vitest run --coverage --config vitest.critical.config.ts", "standalone": "tsx src/main/standalone.ts", - "standalone:build": "electron-vite build && vite build --config docker/vite.standalone.config.ts", + "standalone:build": "node --max-old-space-size=8192 ./node_modules/electron-vite/bin/electron-vite.js build && node --max-old-space-size=8192 ./node_modules/vite/bin/vite.js build --config docker/vite.standalone.config.ts", "standalone:start": "node dist-standalone/index.cjs", "prepare": "husky", "postinstall": "electron-rebuild -f -o node-pty,ssh2,cpu-features || echo 'native Electron rebuild failed (terminal/ssh features may be degraded)'" @@ -212,7 +215,7 @@ "@tailwindcss/typography": "^0.5.19", "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", - "@types/node": "^25.0.7", + "@types/node": "^24.12.4", "@types/pidusage": "2.0.5", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", @@ -388,7 +391,7 @@ } ] }, - "packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319", + "packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800", "pnpm": { "overrides": { "@hono/node-server@1": "1.19.13", diff --git a/packages/agent-graph/package.json b/packages/agent-graph/package.json index fef2c312..8eca5d33 100644 --- a/packages/agent-graph/package.json +++ b/packages/agent-graph/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "private": true, "type": "module", + "engines": { + "node": ">=24.16.0 <25" + }, "main": "src/index.ts", "types": "src/index.ts", "exports": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f5afc456..403e7eda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -401,7 +401,7 @@ importers: version: 4.0.4 '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.6.0 - version: 4.6.0(eslint@9.39.4(jiti@1.21.7)) + version: 4.6.0(eslint@9.39.4(jiti@2.7.0)) '@eslint/js': specifier: ^9.39.2 version: 9.39.2 @@ -418,8 +418,8 @@ importers: specifier: ^4.0.4 version: 4.0.4 '@types/node': - specifier: ^25.0.7 - version: 25.0.7 + specifier: ^24.12.4 + version: 24.12.4 '@types/pidusage': specifier: 2.0.5 version: 2.0.5 @@ -434,10 +434,10 @@ importers: version: 1.15.5 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.7.0(vite@6.4.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.7.0(vite@6.4.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: ^3.1.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.0.7)(happy-dom@20.9.0)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.4)(happy-dom@20.9.0)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)) autoprefixer: specifier: ^10.4.17 version: 10.4.23(postcss@8.5.10) @@ -449,43 +449,43 @@ importers: version: 26.8.1(electron-builder-squirrel-windows@26.8.1) electron-vite: specifier: ^5.0.0 - version: 5.0.0(@swc/core@1.15.33)(vite@6.4.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 5.0.0(@swc/core@1.15.33)(vite@6.4.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)) eslint: specifier: ^9.39.4 - version: 9.39.4(jiti@1.21.7) + version: 9.39.4(jiti@2.7.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.39.4(jiti@1.21.7)) + version: 10.1.8(eslint@9.39.4(jiti@2.7.0)) eslint-import-resolver-typescript: specifier: ^4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@1.21.7)))(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)) + version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@2.7.0)))(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-boundaries: specifier: ^5.3.1 - version: 5.3.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)) + version: 5.3.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)) + version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-jsx-a11y: specifier: ^6.10.2 - version: 6.10.2(eslint@9.39.4(jiti@1.21.7)) + version: 6.10.2(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.4(jiti@1.21.7)) + version: 7.37.5(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react-hooks: specifier: ^7.0.1 - version: 7.0.1(eslint@9.39.4(jiti@1.21.7)) + version: 7.0.1(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react-refresh: specifier: ^0.4.26 - version: 0.4.26(eslint@9.39.4(jiti@1.21.7)) + version: 0.4.26(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-security: specifier: ^3.0.1 version: 3.0.1 eslint-plugin-simple-import-sort: specifier: ^12.1.1 - version: 12.1.1(eslint@9.39.4(jiti@1.21.7)) + version: 12.1.1(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-sonarjs: specifier: ^3.0.6 - version: 3.0.6(eslint@9.39.4(jiti@1.21.7)) + version: 3.0.6(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-tailwindcss: specifier: ^3.18.2 version: 3.18.2(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0)) @@ -500,10 +500,10 @@ importers: version: 9.1.7 i18next-cli: specifier: 1.58.0 - version: 1.58.0(@types/node@25.0.7)(i18next@26.2.0(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(typescript@5.9.3) + version: 1.58.0(@types/node@24.12.4)(i18next@26.2.0(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(typescript@5.9.3) knip: specifier: ^5.82.1 - version: 5.82.1(@types/node@25.0.7)(typescript@5.9.3) + version: 5.82.1(@types/node@24.12.4)(typescript@5.9.3) lint-staged: specifier: ^16.2.7 version: 16.2.7 @@ -527,13 +527,13 @@ importers: version: 5.9.3 typescript-eslint: specifier: ^8.54.0 - version: 8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + version: 8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) vite: specifier: ^6.4.2 - version: 6.4.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + version: 6.4.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) vitest: specifier: ^3.1.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.0.7)(happy-dom@20.9.0)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.4)(happy-dom@20.9.0)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) agent-teams-controller: {} @@ -635,8 +635,8 @@ importers: version: 4.3.6 devDependencies: '@types/node': - specifier: ^22.15.18 - version: 22.19.15 + specifier: ^24.12.4 + version: 24.12.4 tsup: specifier: ^8.5.1 version: 8.5.1(@swc/core@1.15.33)(jiti@2.7.0)(postcss@8.5.10)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.9.0) @@ -648,7 +648,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.1.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(happy-dom@20.9.0)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.4)(happy-dom@20.9.0)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) packages/agent-graph: dependencies: @@ -4722,11 +4722,8 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@22.19.15': - resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} - - '@types/node@24.10.12': - resolution: {integrity: sha512-68e+T28EbdmLSTkPgs3+UacC6rzmqrcWFPQs1C8mwJhI/r5Uxr0yEuQotczNRROd1gq30NGxee+fo0rSIxpyAw==} + '@types/node@24.12.4': + resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==} '@types/node@25.0.7': resolution: {integrity: sha512-C/er7DlIZgRJO7WtTdYovjIFzGsz0I95UlMyR9anTb4aCpBSRWe5Jc1/RvLKUfzmOxHPGjSE5+63HgLtndxU4w==} @@ -10726,9 +10723,6 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -11858,10 +11852,10 @@ snapshots: '@borewit/text-codec@0.2.1': {} - '@boundaries/elements@1.1.2(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7))': + '@boundaries/elements@1.1.2(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0))': dependencies: eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)) handlebars: 4.7.9 is-core-module: 2.16.1 micromatch: 4.0.8 @@ -12667,17 +12661,12 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.6.0(eslint@9.39.4(jiti@1.21.7))': + '@eslint-community/eslint-plugin-eslint-comments@4.6.0(eslint@9.39.4(jiti@2.7.0))': dependencies: escape-string-regexp: 4.0.0 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) ignore: 7.0.5 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@1.21.7))': - dependencies: - eslint: 9.39.4(jiti@1.21.7) - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': dependencies: eslint: 9.39.4(jiti@2.7.0) @@ -12869,122 +12858,122 @@ snapshots: '@inquirer/ansi@2.0.5': {} - '@inquirer/checkbox@5.1.5(@types/node@25.0.7)': + '@inquirer/checkbox@5.1.5(@types/node@24.12.4)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.10(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) '@inquirer/figures': 2.0.5 - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/confirm@6.0.13(@types/node@25.0.7)': + '@inquirer/confirm@6.0.13(@types/node@24.12.4)': dependencies: - '@inquirer/core': 11.1.10(@types/node@25.0.7) - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/core@11.1.10(@types/node@25.0.7)': + '@inquirer/core@11.1.10(@types/node@24.12.4)': dependencies: '@inquirer/ansi': 2.0.5 '@inquirer/figures': 2.0.5 - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/type': 4.0.5(@types/node@24.12.4) cli-width: 4.1.0 fast-wrap-ansi: 0.2.2 mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/editor@5.1.2(@types/node@25.0.7)': + '@inquirer/editor@5.1.2(@types/node@24.12.4)': dependencies: - '@inquirer/core': 11.1.10(@types/node@25.0.7) - '@inquirer/external-editor': 3.0.0(@types/node@25.0.7) - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) + '@inquirer/external-editor': 3.0.0(@types/node@24.12.4) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/expand@5.0.14(@types/node@25.0.7)': + '@inquirer/expand@5.0.14(@types/node@24.12.4)': dependencies: - '@inquirer/core': 11.1.10(@types/node@25.0.7) - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/external-editor@3.0.0(@types/node@25.0.7)': + '@inquirer/external-editor@3.0.0(@types/node@24.12.4)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@inquirer/figures@2.0.5': {} - '@inquirer/input@5.0.13(@types/node@25.0.7)': + '@inquirer/input@5.0.13(@types/node@24.12.4)': dependencies: - '@inquirer/core': 11.1.10(@types/node@25.0.7) - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/number@4.0.13(@types/node@25.0.7)': + '@inquirer/number@4.0.13(@types/node@24.12.4)': dependencies: - '@inquirer/core': 11.1.10(@types/node@25.0.7) - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/password@5.0.13(@types/node@25.0.7)': + '@inquirer/password@5.0.13(@types/node@24.12.4)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.10(@types/node@25.0.7) - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/prompts@8.4.3(@types/node@25.0.7)': + '@inquirer/prompts@8.4.3(@types/node@24.12.4)': dependencies: - '@inquirer/checkbox': 5.1.5(@types/node@25.0.7) - '@inquirer/confirm': 6.0.13(@types/node@25.0.7) - '@inquirer/editor': 5.1.2(@types/node@25.0.7) - '@inquirer/expand': 5.0.14(@types/node@25.0.7) - '@inquirer/input': 5.0.13(@types/node@25.0.7) - '@inquirer/number': 4.0.13(@types/node@25.0.7) - '@inquirer/password': 5.0.13(@types/node@25.0.7) - '@inquirer/rawlist': 5.2.9(@types/node@25.0.7) - '@inquirer/search': 4.1.9(@types/node@25.0.7) - '@inquirer/select': 5.1.5(@types/node@25.0.7) + '@inquirer/checkbox': 5.1.5(@types/node@24.12.4) + '@inquirer/confirm': 6.0.13(@types/node@24.12.4) + '@inquirer/editor': 5.1.2(@types/node@24.12.4) + '@inquirer/expand': 5.0.14(@types/node@24.12.4) + '@inquirer/input': 5.0.13(@types/node@24.12.4) + '@inquirer/number': 4.0.13(@types/node@24.12.4) + '@inquirer/password': 5.0.13(@types/node@24.12.4) + '@inquirer/rawlist': 5.2.9(@types/node@24.12.4) + '@inquirer/search': 4.1.9(@types/node@24.12.4) + '@inquirer/select': 5.1.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/rawlist@5.2.9(@types/node@25.0.7)': + '@inquirer/rawlist@5.2.9(@types/node@24.12.4)': dependencies: - '@inquirer/core': 11.1.10(@types/node@25.0.7) - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/search@4.1.9(@types/node@25.0.7)': + '@inquirer/search@4.1.9(@types/node@24.12.4)': dependencies: - '@inquirer/core': 11.1.10(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) '@inquirer/figures': 2.0.5 - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/select@5.1.5(@types/node@25.0.7)': + '@inquirer/select@5.1.5(@types/node@24.12.4)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.10(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) '@inquirer/figures': 2.0.5 - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/type': 4.0.5(@types/node@24.12.4) optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 - '@inquirer/type@4.0.5(@types/node@25.0.7)': + '@inquirer/type@4.0.5(@types/node@24.12.4)': optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@intlify/bundle-utils@10.0.1(vue-i18n@10.0.8(vue@3.5.30(typescript@5.9.3)))': dependencies: @@ -15676,7 +15665,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@types/responselike': 1.0.3 '@types/chai@5.2.3': @@ -15686,7 +15675,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@types/d3-array@3.2.2': {} @@ -15819,7 +15808,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@types/geojson@7946.0.16': {} @@ -15835,7 +15824,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@types/linkify-it@5.0.0': {} @@ -15854,23 +15843,20 @@ snapshots: '@types/mysql@2.15.27': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@types/node@18.19.130': dependencies: undici-types: 5.26.5 - '@types/node@22.19.15': - dependencies: - undici-types: 6.21.0 - - '@types/node@24.10.12': + '@types/node@24.12.4': dependencies: undici-types: 7.16.0 '@types/node@25.0.7': dependencies: undici-types: 7.16.0 + optional: true '@types/pg-pool@2.0.7': dependencies: @@ -15878,7 +15864,7 @@ snapshots: '@types/pg@8.15.6': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 pg-protocol: 1.13.0 pg-types: 2.2.0 @@ -15886,7 +15872,7 @@ snapshots: '@types/plist@3.0.5': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 xmlbuilder: 15.1.1 optional: true @@ -15902,7 +15888,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@types/ssh2@1.15.5': dependencies: @@ -15910,7 +15896,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@types/trusted-types@2.0.7': optional: true @@ -15932,22 +15918,22 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 optional: true - '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.54.0 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -15971,14 +15957,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -16031,13 +16017,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.54.0 '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -16089,29 +16075,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/utils@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - eslint: 9.39.4(jiti@1.21.7) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - optional: true - '@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) @@ -16224,7 +16198,7 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-react@4.7.0(vite@6.4.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0))': + '@vitejs/plugin-react@4.7.0(vite@6.4.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.28.6 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) @@ -16232,7 +16206,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + vite: 6.4.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -16260,7 +16234,7 @@ snapshots: vite: 7.3.3(@types/node@25.0.7)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) vue: 3.5.34(typescript@5.9.3) - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.0.7)(happy-dom@20.9.0)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.4)(happy-dom@20.9.0)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -16275,7 +16249,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.0.7)(happy-dom@20.9.0)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.4)(happy-dom@20.9.0)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -16287,21 +16261,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@22.19.15)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@22.19.15)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) - - '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.3.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -17996,7 +17962,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron-vite@5.0.0(@swc/core@1.15.33)(vite@6.4.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)): + electron-vite@5.0.0(@swc/core@1.15.33)(vite@6.4.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) @@ -18004,7 +17970,7 @@ snapshots: esbuild: 0.25.12 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 6.4.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + vite: 6.4.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) optionalDependencies: '@swc/core': 1.15.33 transitivePeerDependencies: @@ -18025,7 +17991,7 @@ snapshots: electron@40.10.0: dependencies: '@electron/get': 2.0.3 - '@types/node': 24.10.12 + '@types/node': 24.12.4 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -18317,9 +18283,9 @@ snapshots: '@eslint/compat': 2.0.3(eslint@9.39.4(jiti@2.7.0)) eslint: 9.39.4(jiti@2.7.0) - eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@1.21.7)): + eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) eslint-flat-config-utils@3.0.2: dependencies: @@ -18341,10 +18307,10 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@1.21.7)))(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@2.7.0)))(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)): dependencies: debug: 4.4.3 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.13.0 is-bun-module: 2.0.0 @@ -18352,8 +18318,8 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)) - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - supports-color @@ -18361,24 +18327,24 @@ snapshots: dependencies: eslint: 9.39.4(jiti@2.7.0) - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - eslint: 9.39.4(jiti@1.21.7) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@1.21.7)))(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)) + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@2.7.0)))(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-plugin-boundaries@5.3.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-boundaries@5.3.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)): dependencies: - '@boundaries/elements': 1.1.2(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)) + '@boundaries/elements': 1.1.2(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)) chalk: 4.1.2 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)) micromatch: 4.0.8 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -18390,26 +18356,6 @@ snapshots: dependencies: eslint: 9.39.4(jiti@2.7.0) - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@1.21.7)): - dependencies: - '@package-json/types': 0.0.12 - '@typescript-eslint/types': 8.57.1 - comment-parser: 1.4.5 - debug: 4.4.3 - eslint: 9.39.4(jiti@1.21.7) - eslint-import-context: 0.1.9(unrs-resolver@1.11.1) - is-glob: 4.0.3 - minimatch: 9.0.7 - semver: 7.7.4 - stable-hash-x: 0.2.0 - unrs-resolver: 1.11.1 - optionalDependencies: - '@typescript-eslint/utils': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - optional: true - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@2.7.0)): dependencies: '@package-json/types': 0.0.12 @@ -18429,7 +18375,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -18438,9 +18384,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@1.21.7)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4(jiti@2.7.0)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -18452,7 +18398,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -18478,7 +18424,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@2.7.0)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -18488,7 +18434,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -18497,22 +18443,22 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@7.0.1(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.4(jiti@2.7.0)): dependencies: '@babel/core': 7.28.6 '@babel/parser': 7.28.6 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.4.26(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-react-refresh@0.4.26(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) - eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.7.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -18520,7 +18466,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.2 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -18549,16 +18495,16 @@ snapshots: dependencies: safe-regex: 2.1.1 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) - eslint-plugin-sonarjs@3.0.6(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-sonarjs@3.0.6(eslint@9.39.4(jiti@2.7.0)): dependencies: '@eslint-community/regexpp': 4.12.2 builtin-modules: 3.3.0 bytes: 3.1.2 - eslint: 9.39.4(jiti@1.21.7) + eslint: 9.39.4(jiti@2.7.0) functional-red-black-tree: 1.0.1 jsx-ast-utils-x: 0.1.0 lodash.merge: 4.6.2 @@ -18629,47 +18575,6 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(jiti@1.21.7): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.4 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 1.21.7 - transitivePeerDependencies: - - supports-color - eslint@9.39.4(jiti@2.7.0): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) @@ -19367,7 +19272,7 @@ snapshots: happy-dom@20.9.0: dependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 7.0.1 @@ -19600,7 +19505,7 @@ snapshots: husky@9.1.7: {} - i18next-cli@1.58.0(@types/node@25.0.7)(i18next@26.2.0(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(typescript@5.9.3): + i18next-cli@1.58.0(@types/node@24.12.4)(i18next@26.2.0(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(typescript@5.9.3): dependencies: '@croct/json5-parser': 0.2.2 '@swc/core': 1.15.33 @@ -19609,7 +19514,7 @@ snapshots: execa: 9.6.1 glob: 13.0.6 i18next-resources-for-ts: 2.1.0 - inquirer: 13.4.3(@types/node@25.0.7) + inquirer: 13.4.3(@types/node@24.12.4) jiti: 2.7.0 jsonc-parser: 3.3.1 magic-string: 0.30.21 @@ -19700,17 +19605,17 @@ snapshots: inline-style-parser@0.2.7: {} - inquirer@13.4.3(@types/node@25.0.7): + inquirer@13.4.3(@types/node@24.12.4): dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.10(@types/node@25.0.7) - '@inquirer/prompts': 8.4.3(@types/node@25.0.7) - '@inquirer/type': 4.0.5(@types/node@25.0.7) + '@inquirer/core': 11.1.10(@types/node@24.12.4) + '@inquirer/prompts': 8.4.3(@types/node@24.12.4) + '@inquirer/type': 4.0.5(@types/node@24.12.4) mute-stream: 3.0.0 run-async: 4.0.6 rxjs: 7.8.2 optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 internal-slot@1.1.0: dependencies: @@ -20085,10 +19990,10 @@ snapshots: klona@2.0.6: {} - knip@5.82.1(@types/node@25.0.7)(typescript@5.9.3): + knip@5.82.1(@types/node@24.12.4)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 25.0.7 + '@types/node': 24.12.4 fast-glob: 3.3.3 formatly: 0.3.0 jiti: 2.6.1 @@ -23361,13 +23266,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3): + typescript-eslint@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/parser': 8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - eslint: 9.39.4(jiti@1.21.7) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -23405,8 +23310,6 @@ snapshots: undici-types@5.26.5: {} - undici-types@6.21.0: {} - undici-types@7.16.0: {} undici@6.25.0: {} @@ -23739,34 +23642,13 @@ snapshots: dependencies: vite: 7.3.2(@types/node@25.0.7)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) - vite-node@3.2.4(@types/node@22.19.15)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): + vite-node@3.2.4(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.2(@types/node@22.19.15)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite-node@3.2.4(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.3.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -23856,7 +23738,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite@6.4.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): + vite@6.4.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -23865,24 +23747,7 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.0.7 - fsevents: 2.3.3 - jiti: 1.21.7 - sass: 1.98.0 - terser: 5.46.0 - tsx: 4.21.0 - yaml: 2.9.0 - - vite@7.3.2(@types/node@22.19.15)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): - dependencies: - esbuild: 0.27.4 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.10 - rollup: 4.59.0 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 22.19.15 + '@types/node': 24.12.4 fsevents: 2.3.3 jiti: 2.7.0 sass: 1.98.0 @@ -23890,7 +23755,7 @@ snapshots: tsx: 4.21.0 yaml: 2.9.0 - vite@7.3.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): + vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.27.4 fdir: 6.5.0(picomatch@4.0.4) @@ -23899,9 +23764,9 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.0.7 + '@types/node': 24.12.4 fsevents: 2.3.3 - jiti: 1.21.7 + jiti: 2.7.0 sass: 1.98.0 terser: 5.46.0 tsx: 4.21.0 @@ -24013,11 +23878,11 @@ snapshots: - universal-cookie - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(happy-dom@20.9.0)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.4)(happy-dom@20.9.0)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@22.19.15)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -24035,55 +23900,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.2(@types/node@22.19.15)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) - vite-node: 3.2.4(@types/node@22.19.15)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.3.2(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@24.12.4)(jiti@2.7.0)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.19.15 - happy-dom: 20.9.0 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.0.7)(happy-dom@20.9.0)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3 - expect-type: 1.3.0 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.3.2(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) - vite-node: 3.2.4(@types/node@25.0.7)(jiti@1.21.7)(sass@1.98.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 25.0.7 + '@types/node': 24.12.4 happy-dom: 20.9.0 transitivePeerDependencies: - jiti diff --git a/src/main/services/team/TeamMcpConfigBuilder.ts b/src/main/services/team/TeamMcpConfigBuilder.ts index bb134149..2f18d73c 100644 --- a/src/main/services/team/TeamMcpConfigBuilder.ts +++ b/src/main/services/team/TeamMcpConfigBuilder.ts @@ -47,7 +47,10 @@ const MCP_CONFIG_PREFIX = 'agent-teams-mcp-'; const MCP_CONFIG_REMOVE_RETRY_DELAYS_MS = [25, 75, 150] as const; const NODE_RUNTIME_PROBE_TIMEOUT_MS = 5_000; const ELECTRON_NODE_RUNTIME_PROBE_TIMEOUT_MS = 5_000; -const MIN_MCP_NODE_MAJOR_VERSION = 20; +// The packaged Electron runtime can lag the source toolchain patch version, +// so MCP launch validation pins the Node 24 runtime line, not .node-version. +const MIN_MCP_NODE_MAJOR_VERSION = 24; +const MAX_MCP_NODE_MAJOR_VERSION = 25; const NODE_RUNTIME_PROBE_SCRIPT = 'process.stdout.write(JSON.stringify({execPath:process.execPath,version:process.versions.node}))'; /** @@ -335,9 +338,9 @@ function parseNodeRuntimeProbeMetadata(stdout: string, command: string): NodeRun function assertSupportedMcpNodeRuntime(command: string, metadata: NodeRuntimeProbeMetadata): void { const major = parseNodeMajorVersion(metadata.version); - if (major === null || major < MIN_MCP_NODE_MAJOR_VERSION) { + if (major === null || major < MIN_MCP_NODE_MAJOR_VERSION || major >= MAX_MCP_NODE_MAJOR_VERSION) { throw new Error( - `${command} resolved ${metadata.path} with Node.js ${metadata.version}; Agent Teams MCP requires Node.js ${MIN_MCP_NODE_MAJOR_VERSION}+` + `${command} resolved ${metadata.path} with Node.js ${metadata.version}; Agent Teams MCP requires Node.js 24.x` ); } } @@ -392,21 +395,16 @@ async function probePackagedElectronNodeRuntime( emitProgress(options, 'electron-node-runtime', 'Checking bundled Electron Node runtime...'); try { - const { stdout } = await execCli( - process.execPath.trim(), - ['-e', 'process.stdout.write("agent-teams-electron-node-ok")'], - { - encoding: 'utf-8', - timeout: ELECTRON_NODE_RUNTIME_PROBE_TIMEOUT_MS, - env: { - ...process.env, - ...getPackagedElectronNodeEnv(), - }, - } - ); - if (stdout.trim() !== 'agent-teams-electron-node-ok') { - throw new Error('Electron Node runtime probe did not return the expected marker'); - } + const { stdout } = await execCli(process.execPath.trim(), ['-e', NODE_RUNTIME_PROBE_SCRIPT], { + encoding: 'utf-8', + timeout: ELECTRON_NODE_RUNTIME_PROBE_TIMEOUT_MS, + env: { + ...process.env, + ...getPackagedElectronNodeEnv(), + }, + }); + const metadata = parseNodeRuntimeProbeMetadata(stdout, process.execPath.trim()); + assertSupportedMcpNodeRuntime(process.execPath.trim(), metadata); _packagedElectronNodeRuntimeProbe = { ok: true }; } catch (error) { _packagedElectronNodeRuntimeProbe = { ok: false, error }; diff --git a/test/main/services/runtime/OpenCodeRuntimePreflight.integration.test.ts b/test/main/services/runtime/OpenCodeRuntimePreflight.integration.test.ts index 6de2e5e7..3228d3e7 100644 --- a/test/main/services/runtime/OpenCodeRuntimePreflight.integration.test.ts +++ b/test/main/services/runtime/OpenCodeRuntimePreflight.integration.test.ts @@ -55,6 +55,7 @@ vi.mock('@features/codex-runtime-installer/main', () => ({ import { resolveVerifiedOpenCodeRuntimeBinaryPath } from '../../../../src/main/services/infrastructure/OpenCodeRuntimeInstallerService'; import { ensureOpenCodeBridgeRuntimeBinaryEnv } from '../../../../src/main/services/runtime/openCodeBridgeRuntimeEnv'; import { buildProviderAwareCliEnv } from '../../../../src/main/services/runtime/providerAwareCliEnv'; +import { clearResolvedNodePathForTests } from '../../../../src/main/services/team/TeamMcpConfigBuilder'; import { execCli } from '../../../../src/main/utils/childProcess'; import { setAppDataBasePath } from '../../../../src/main/utils/pathDecoder'; import { clearShellEnvCache } from '../../../../src/main/utils/shellEnv'; @@ -72,6 +73,7 @@ describePosix('OpenCode packaged-runtime preflight integration', () => { tempDir = await mkdtemp(path.join(os.tmpdir(), 'opencode-prod-preflight-')); setAppDataBasePath(path.join(tempDir, 'app-data')); clearShellEnvCache(); + clearResolvedNodePathForTests(); originalPath = process.env.PATH; originalShell = process.env.SHELL; @@ -142,7 +144,7 @@ describePosix('OpenCode packaged-runtime preflight integration', () => { [ '#!/bin/sh', 'if [ "$1" = "-e" ]; then', - ' printf "{\\"execPath\\":\\"%s\\",\\"version\\":\\"%s\\"}" "$FAKE_NODE_PATH" "22.0.0"', + ' printf "{\\"execPath\\":\\"%s\\",\\"version\\":\\"%s\\"}" "$FAKE_NODE_PATH" "24.16.0"', ' exit 0', 'fi', 'echo "unexpected node args: $*" >&2', diff --git a/test/main/services/team/TeamMcpConfigBuilder.test.ts b/test/main/services/team/TeamMcpConfigBuilder.test.ts index 95825470..de3dcbd8 100644 --- a/test/main/services/team/TeamMcpConfigBuilder.test.ts +++ b/test/main/services/team/TeamMcpConfigBuilder.test.ts @@ -22,7 +22,7 @@ const hoisted = vi.hoisted(() => ({ version: '9.9.9-test', }, execCliMock: vi.fn(async () => ({ - stdout: JSON.stringify({ execPath: '/mock/node', version: '20.11.0' }), + stdout: JSON.stringify({ execPath: '/mock/node', version: '24.16.0' }), stderr: '', })), cachedShellEnv: null as NodeJS.ProcessEnv | null, @@ -68,7 +68,7 @@ import { } from '@main/services/team/TeamMcpConfigBuilder'; import { setAppDataBasePath, setClaudeBasePathOverride } from '@main/utils/pathDecoder'; -function nodeRuntimeProbeStdout(execPath: string, version = '20.11.0'): string { +function nodeRuntimeProbeStdout(execPath: string, version = '24.16.0'): string { return JSON.stringify({ execPath, version }); } @@ -385,7 +385,7 @@ describe('TeamMcpConfigBuilder', () => { createPackagedServerBundle(resourcesDir, '// packaged server'); setResourcesPath(resourcesDir); hoisted.execCliMock.mockResolvedValue({ - stdout: 'agent-teams-electron-node-ok', + stdout: nodeRuntimeProbeStdout(electronBinary, '24.15.0'), stderr: '', }); @@ -418,7 +418,7 @@ describe('TeamMcpConfigBuilder', () => { expect(hoisted.execCliMock).toHaveBeenCalledTimes(1); expect(hoisted.execCliMock).toHaveBeenCalledWith( electronBinary, - ['-e', 'process.stdout.write("agent-teams-electron-node-ok")'], + ['-e', expect.stringContaining('process.versions.node')], expect.objectContaining({ env: expect.objectContaining({ ELECTRON_RUN_AS_NODE: '1' }), }) @@ -528,11 +528,11 @@ describe('TeamMcpConfigBuilder', () => { if (env?.PATH?.split(path.delimiter)[0] === '/strict-shell-node-bin') { expect(command).toBe('node'); return { - stdout: nodeRuntimeProbeStdout('/strict-shell-node-bin/node', '20.11.0'), + stdout: nodeRuntimeProbeStdout('/strict-shell-node-bin/node', '24.16.0'), stderr: '', }; } - return { stdout: nodeRuntimeProbeStdout('/usr/bin/node', '18.19.0'), stderr: '' }; + return { stdout: nodeRuntimeProbeStdout('/usr/bin/node', '22.21.1'), stderr: '' }; }); try {