From 0a849b9decda08926fdd034ac2b11e76ebf4feca Mon Sep 17 00:00:00 2001 From: awschmeder Date: Sun, 7 Jun 2026 16:07:28 -0700 Subject: [PATCH 1/7] fix(terminal): kill entire process group on Stop to prevent orphaned child processes --- .changeset/kill-orphaned-child-processes.md | 5 + .../terminal/ExecaTerminalProcess.ts | 121 ++++-------------- .../__tests__/ExecaTerminalProcess.spec.ts | 57 ++++++++- 3 files changed, 82 insertions(+), 101 deletions(-) create mode 100644 .changeset/kill-orphaned-child-processes.md diff --git a/.changeset/kill-orphaned-child-processes.md b/.changeset/kill-orphaned-child-processes.md new file mode 100644 index 0000000000..225e82a621 --- /dev/null +++ b/.changeset/kill-orphaned-child-processes.md @@ -0,0 +1,5 @@ +--- +"zoo-code": patch +--- + +fix(terminal): kill entire process group on Stop so child commands (e.g. `sleep 30`) are not orphaned and allowed to continue running after user clicked 'Stop'. diff --git a/src/integrations/terminal/ExecaTerminalProcess.ts b/src/integrations/terminal/ExecaTerminalProcess.ts index cc2af93802..e25cc5fa17 100644 --- a/src/integrations/terminal/ExecaTerminalProcess.ts +++ b/src/integrations/terminal/ExecaTerminalProcess.ts @@ -1,5 +1,4 @@ import { execa, ExecaError } from "execa" -import psTree from "ps-tree" import process from "process" import type { RooTerminal } from "./types" @@ -11,7 +10,6 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { private aborted = false private pid?: number private subprocess?: ReturnType - private pidUpdatePromise?: Promise constructor(terminal: RooTerminal) { super() @@ -43,8 +41,8 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { shell: BaseTerminal.getExecaShellPath() || true, cwd: this.terminal.getCurrentWorkingDirectory(), all: true, - // Ignore stdin to ensure non-interactive mode and prevent hanging stdin: "ignore", + detached: true, env: { ...process.env, // Ensure UTF-8 encoding for Ruby, CocoaPods, etc. @@ -52,28 +50,9 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { LC_ALL: "en_US.UTF-8", }, })`${command}` - + this.pid = this.subprocess.pid - // When using shell: true, the PID is for the shell, not the actual command - // Find the actual command PID after a small delay - if (this.pid) { - this.pidUpdatePromise = new Promise((resolve) => { - setTimeout(() => { - psTree(this.pid!, (err, children) => { - if (!err && children.length > 0) { - // Update PID to the first child (the actual command) - const actualPid = parseInt(children[0].PID) - if (!isNaN(actualPid)) { - this.pid = actualPid - } - } - resolve() - }) - }, 100) - }) - } - const rawStream = this.subprocess.iterable({ from: "all", preserveNewlines: true }) // Wrap the stream to ensure all chunks are strings (execa can return Uint8Array) @@ -103,30 +82,10 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { } if (this.aborted) { - let timeoutId: NodeJS.Timeout | undefined - - const kill = new Promise((resolve) => { - console.log(`[ExecaTerminalProcess#run] SIGKILL -> ${this.pid}`) - - timeoutId = setTimeout(() => { - try { - this.subprocess?.kill("SIGKILL") - } catch (e) {} - - resolve() - }, 5_000) - }) - try { - await Promise.race([this.subprocess, kill]) + await this.subprocess } catch (error) { - console.log( - `[ExecaTerminalProcess#run] subprocess termination error: ${error instanceof Error ? error.message : String(error)}`, - ) - } - - if (timeoutId) { - clearTimeout(timeoutId) + // Expected: process was killed by abort(); swallow the error. } } @@ -162,60 +121,28 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { public override abort() { this.aborted = true - // Function to perform the kill operations - const performKill = () => { - // Try to kill using the subprocess object - if (this.subprocess) { - try { - this.subprocess.kill("SIGKILL") - } catch (e) { - console.warn( - `[ExecaTerminalProcess#abort] Failed to kill subprocess: ${e instanceof Error ? e.message : String(e)}`, - ) - } - } - - // Kill the stored PID (which should be the actual command after our update) - if (this.pid) { - try { - process.kill(this.pid, "SIGKILL") - } catch (e) { - console.warn( - `[ExecaTerminalProcess#abort] Failed to kill process ${this.pid}: ${e instanceof Error ? e.message : String(e)}`, - ) - } - } - } - - // If PID update is in progress, wait for it before killing - if (this.pidUpdatePromise) { - this.pidUpdatePromise.then(performKill).catch(() => performKill()) - } else { - performKill() + if (!this.pid) { + return } - // Continue with the rest of the abort logic - if (this.pid) { - // Also check for any child processes - psTree(this.pid, async (err, children) => { - if (!err) { - const pids = children.map((p) => parseInt(p.PID)) - - for (const pid of pids) { - try { - process.kill(pid, "SIGKILL") - } catch (e) { - console.warn( - `[ExecaTerminalProcess#abort] Failed to send SIGKILL to child PID ${pid}: ${e instanceof Error ? e.message : String(e)}`, - ) - } - } - } else { - console.error( - `[ExecaTerminalProcess#abort] Failed to get process tree for PID ${this.pid}: ${err.message}`, - ) - } - }) + // Kill the entire process group (shell + all child commands) with + // SIGKILL. Using a negative PID sends the signal to every process in + // the group, so child commands are not orphaned. Requires 'detached'. + try { + process.kill(-this.pid, "SIGKILL") + } catch (e) { + console.warn( + `[ExecaTerminalProcess#abort] Failed to kill process group -${this.pid}: ${e instanceof Error ? e.message : String(e)}`, + ) + + // Fall back to killing the subprocess directly if process group kill fails. + try { + this.subprocess?.kill("SIGKILL") + } catch (e2) { + console.warn( + `[ExecaTerminalProcess#abort] Fallback kill also failed: ${e2 instanceof Error ? e2.message : String(e2)}`, + ) + } } } diff --git a/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts b/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts index 5f0a21869e..599b8542fe 100644 --- a/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts +++ b/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts @@ -17,10 +17,6 @@ vitest.mock("execa", () => { return { execa, ExecaError: class extends Error {} } }) -vitest.mock("ps-tree", () => ({ - default: vitest.fn((_: number, cb: any) => cb(null, [])), -})) - import { execa } from "execa" import { ExecaTerminalProcess } from "../ExecaTerminalProcess" import { BaseTerminal } from "../BaseTerminal" @@ -66,6 +62,7 @@ describe("ExecaTerminalProcess", () => { shell: true, cwd: "/test/cwd", all: true, + detached: true, env: expect.objectContaining({ LANG: "en_US.UTF-8", LC_ALL: "en_US.UTF-8", @@ -144,6 +141,58 @@ describe("ExecaTerminalProcess", () => { }) }) + describe("abort", () => { + it("kills the process group using a negative PID so child processes are not orphaned", async () => { + const killSpy = vitest.spyOn(process, "kill").mockImplementation(() => true) + + // Start run() but abort before it resolves + const runPromise = terminalProcess.run("sleep 30") + // Yield so run() can set this.pid from the mock subprocess + await Promise.resolve() + terminalProcess.abort() + await runPromise + + expect(killSpy).toHaveBeenCalledWith(-mockPid, "SIGKILL") + killSpy.mockRestore() + }) + + it("falls back to subprocess.kill when process group kill throws", async () => { + const killSpy = vitest.spyOn(process, "kill").mockImplementation(() => { + throw new Error("ESRCH") + }) + const execaMock = vitest.mocked(execa) + // Grab the mock subprocess kill function after run starts + let subprocessKill: ReturnType | undefined + + const runPromise = terminalProcess.run("sleep 30") + await Promise.resolve() + + // Reach into the mock to capture the subprocess kill fn + const calls = execaMock.mock.results + if (calls.length > 0) { + const taggedFn = calls[0].value as any + subprocessKill = taggedFn?.kill + } + + terminalProcess.abort() + await runPromise + + // process group kill failed, subprocess.kill should have been called + if (subprocessKill) { + expect(subprocessKill).toHaveBeenCalledWith("SIGKILL") + } + killSpy.mockRestore() + }) + + it("does nothing when pid is not yet set", () => { + const killSpy = vitest.spyOn(process, "kill").mockImplementation(() => true) + // abort() before run() is called -- pid is undefined + terminalProcess.abort() + expect(killSpy).not.toHaveBeenCalled() + killSpy.mockRestore() + }) + }) + describe("trimRetrievedOutput", () => { it("clears buffer when all output has been retrieved", () => { // Set up a scenario where all output has been retrieved From 359ae13b5ff4e2e892436025726a7cdfca0ccd7b Mon Sep 17 00:00:00 2001 From: awschmeder Date: Sun, 7 Jun 2026 16:39:24 -0700 Subject: [PATCH 2/7] fix(terminal): emit SIGKILL exit code on abort and remove ps-tree dep --- .../terminal/ExecaTerminalProcess.ts | 19 +++++++---- .../__tests__/ExecaTerminalProcess.spec.ts | 34 ++++++++++--------- src/package.json | 2 -- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/integrations/terminal/ExecaTerminalProcess.ts b/src/integrations/terminal/ExecaTerminalProcess.ts index e25cc5fa17..82bdcf8005 100644 --- a/src/integrations/terminal/ExecaTerminalProcess.ts +++ b/src/integrations/terminal/ExecaTerminalProcess.ts @@ -82,14 +82,19 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { } if (this.aborted) { - try { - await this.subprocess - } catch (error) { - // Expected: process was killed by abort(); swallow the error. + try { + await this.subprocess + } catch (error) { + // Expected: process was killed by abort(); swallow the error. + } + + // emit signal 128 + 9 (SIGKILL) to match conventional shell exit code so + // the front-end correctly detects a non-normal exit + this.emit("shell_execution_complete", { exitCode: 137, signalName: "SIGKILL" }) + return } - } - - this.emit("shell_execution_complete", { exitCode: 0 }) + + this.emit("shell_execution_complete", { exitCode: 0 }) } catch (error) { if (error instanceof ExecaError) { console.error(`[ExecaTerminalProcess#run] shell execution error: ${error.message}`) diff --git a/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts b/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts index 599b8542fe..88ef93871a 100644 --- a/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts +++ b/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts @@ -1,9 +1,10 @@ // npx vitest run integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts const mockPid = 12345 +// Declared via vi.hoisted so it is available inside the hoisted vi.mock factory. +const { mockKill } = vitest.hoisted(() => ({ mockKill: vitest.fn() })) vitest.mock("execa", () => { - const mockKill = vitest.fn() const execa = vitest.fn((options: any) => { return (_template: TemplateStringsArray, ...args: any[]) => ({ pid: mockPid, @@ -156,31 +157,32 @@ describe("ExecaTerminalProcess", () => { killSpy.mockRestore() }) + it("emits exitCode 137 (SIGKILL) on abort", async () => { + const killSpy = vitest.spyOn(process, "kill").mockImplementation(() => true) + const completeSpy = vitest.fn() + terminalProcess.on("shell_execution_complete", completeSpy) + + const runPromise = terminalProcess.run("sleep 30") + await Promise.resolve() + terminalProcess.abort() + await runPromise + + expect(completeSpy).toHaveBeenCalledWith({ exitCode: 137, signalName: "SIGKILL" }) + killSpy.mockRestore() + }) + it("falls back to subprocess.kill when process group kill throws", async () => { const killSpy = vitest.spyOn(process, "kill").mockImplementation(() => { throw new Error("ESRCH") }) - const execaMock = vitest.mocked(execa) - // Grab the mock subprocess kill function after run starts - let subprocessKill: ReturnType | undefined const runPromise = terminalProcess.run("sleep 30") await Promise.resolve() - - // Reach into the mock to capture the subprocess kill fn - const calls = execaMock.mock.results - if (calls.length > 0) { - const taggedFn = calls[0].value as any - subprocessKill = taggedFn?.kill - } - terminalProcess.abort() await runPromise - // process group kill failed, subprocess.kill should have been called - if (subprocessKill) { - expect(subprocessKill).toHaveBeenCalledWith("SIGKILL") - } + // process.kill threw, so the fallback subprocess.kill must have been called + expect(mockKill).toHaveBeenCalledWith("SIGKILL") killSpy.mockRestore() }) diff --git a/src/package.json b/src/package.json index 9c6e3171f4..c4ae6ab4ad 100644 --- a/src/package.json +++ b/src/package.json @@ -492,7 +492,6 @@ "pdf-parse": "^1.1.1", "pretty-bytes": "^7.0.0", "proper-lockfile": "^4.1.2", - "ps-tree": "^1.2.0", "reconnecting-eventsource": "^1.6.4", "safe-stable-stringify": "^2.5.0", "sambanova-ai-provider": "^1.2.2", @@ -527,7 +526,6 @@ "@types/node": "20.19.41", "@types/node-cache": "4.2.5", "@types/proper-lockfile": "4.1.4", - "@types/ps-tree": "1.1.6", "@types/semver-compare": "1.0.3", "@types/shell-quote": "1.7.5", "@types/vscode": "1.100.0", From 8583da68d9c011e70a244b3bd50381a1b77679f3 Mon Sep 17 00:00:00 2001 From: awschmeder Date: Sun, 7 Jun 2026 16:52:27 -0700 Subject: [PATCH 3/7] chore: update lockfile after removing ps-tree --- pnpm-lock.yaml | 1661 ++++++++++++++++++++++++++++++------------------ 1 file changed, 1038 insertions(+), 623 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d44374d6a..3daec8fce2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,9 +12,9 @@ overrides: undici: '>=5.29.0' form-data: '>=4.0.4' bluebird: '>=3.7.2' - glob: 11.1.0 - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + glob: '>=11.1.0' + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 zod: 3.25.76 importers: @@ -22,16 +22,19 @@ importers: .: devDependencies: '@changesets/cli': - specifier: 2.29.7 + specifier: ^2.27.10 version: 2.29.7(@types/node@24.2.1) '@dotenvx/dotenvx': - specifier: 1.66.0 + specifier: ^1.34.0 version: 1.66.0 '@roo-code/config-typescript': specifier: workspace:^ version: link:packages/config-typescript + '@types/glob': + specifier: ^9.0.0 + version: 9.0.0 '@types/node': - specifier: 24.2.1 + specifier: ^24.1.0 version: 24.2.1 '@vscode/vsce': specifier: 3.3.2 @@ -40,37 +43,40 @@ importers: specifier: 0.28.0 version: 0.28.0 eslint: - specifier: 9.28.0 + specifier: ^9.27.0 version: 9.28.0(jiti@2.4.2) + glob: + specifier: '>=11.1.0' + version: 11.1.0 husky: - specifier: 9.1.7 + specifier: ^9.1.7 version: 9.1.7 knip: - specifier: 5.60.2 + specifier: ^5.44.4 version: 5.60.2(@types/node@24.2.1)(typescript@5.8.3) lint-staged: - specifier: 16.4.0 + specifier: ^16.0.0 version: 16.4.0 mkdirp: - specifier: 3.0.1 + specifier: ^3.0.1 version: 3.0.1 only-allow: - specifier: 1.2.1 + specifier: ^1.2.1 version: 1.2.1 ovsx: specifier: 0.10.4 version: 0.10.4 prettier: - specifier: 3.5.3 + specifier: ^3.4.2 version: 3.5.3 rimraf: - specifier: 6.0.1 + specifier: ^6.0.1 version: 6.0.1 tsx: - specifier: 4.19.4 + specifier: ^4.19.3 version: 4.19.4 turbo: - specifier: 2.9.14 + specifier: ^2.5.6 version: 2.9.14 typescript: specifier: 5.8.3 @@ -131,29 +137,26 @@ importers: specifier: workspace:^ version: link:../../packages/config-typescript '@types/node': - specifier: 24.2.1 + specifier: ^24.1.0 version: 24.2.1 '@types/react': - specifier: 18.3.23 + specifier: ^18.3.23 version: 18.3.23 '@vitest/coverage-v8': - specifier: 3.2.6 - version: 3.2.6(vitest@3.2.6) + specifier: ^3.2.3 + version: 3.2.4(vitest@3.2.4) ink-testing-library: - specifier: 4.0.0 + specifier: ^4.0.0 version: 4.0.0(@types/react@18.3.23) rimraf: - specifier: 6.0.1 + specifier: ^6.0.1 version: 6.0.1 tsup: - specifier: 8.5.0 + specifier: ^8.4.0 version: 8.5.0(jiti@2.4.2)(postcss@8.5.15)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.9.0) - tsx: - specifier: 4.19.4 - version: 4.19.4 vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) + specifier: ^3.2.3 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) apps/vscode-e2e: devDependencies: @@ -170,28 +173,28 @@ importers: specifier: workspace:^ version: link:../../packages/types '@types/mocha': - specifier: 10.0.10 + specifier: ^10.0.10 version: 10.0.10 '@types/node': - specifier: 20.19.41 + specifier: ^20.19.25 version: 20.19.41 '@types/vscode': - specifier: 1.100.0 + specifier: ^1.95.0 version: 1.100.0 '@vscode/test-cli': - specifier: 0.0.11 + specifier: ^0.0.11 version: 0.0.11 '@vscode/test-electron': - specifier: 2.5.2 + specifier: ^2.4.0 version: 2.5.2 glob: - specifier: 11.1.0 + specifier: '>=11.1.0' version: 11.1.0 mocha: - specifier: 11.2.2 + specifier: ^11.1.0 version: 11.2.2 rimraf: - specifier: 6.0.1 + specifier: ^6.0.1 version: 6.0.1 apps/vscode-nightly: @@ -213,11 +216,11 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.x + version: 20.17.57 vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) + specifier: ^3.2.3 + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.17.57)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) packages/cloud: dependencies: @@ -244,52 +247,52 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 24.2.1 + specifier: ^24.1.0 version: 24.2.1 '@types/vscode': - specifier: 1.100.0 - version: 1.100.0 + specifier: ^1.102.0 + version: 1.103.0 '@vitest/coverage-v8': - specifier: 3.2.6 - version: 3.2.6(vitest@3.2.6) + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) globals: - specifier: 16.3.0 + specifier: ^16.3.0 version: 16.3.0 vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) packages/config-eslint: devDependencies: '@eslint/js': - specifier: 9.27.0 + specifier: ^9.22.0 version: 9.27.0 '@next/eslint-plugin-next': - specifier: 15.3.2 + specifier: ^15.2.1 version: 15.3.2 eslint: - specifier: 9.27.0 + specifier: ^9.27.0 version: 9.27.0(jiti@2.4.2) eslint-config-prettier: - specifier: 10.1.8 + specifier: ^10.1.1 version: 10.1.8(eslint@9.27.0(jiti@2.4.2)) eslint-plugin-only-warn: - specifier: 1.1.0 + specifier: ^1.1.0 version: 1.1.0 eslint-plugin-react: - specifier: 7.37.5 + specifier: ^7.37.4 version: 7.37.5(eslint@9.27.0(jiti@2.4.2)) eslint-plugin-react-hooks: - specifier: 5.2.0 + specifier: ^5.2.0 version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) eslint-plugin-turbo: - specifier: 2.5.6 + specifier: ^2.4.4 version: 2.5.6(eslint@9.27.0(jiti@2.4.2))(turbo@2.9.14) globals: - specifier: 16.1.0 + specifier: ^16.0.0 version: 16.1.0 typescript-eslint: - specifier: 8.32.1 + specifier: ^8.26.0 version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) packages/config-typescript: {} @@ -322,14 +325,14 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 24.2.1 + specifier: ^24.1.0 version: 24.2.1 '@vitest/coverage-v8': - specifier: 3.2.6 - version: 3.2.6(vitest@3.2.6) + specifier: ^3.2.3 + version: 3.2.4(vitest@3.2.4) vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) + specifier: ^3.2.3 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) packages/ipc: dependencies: @@ -347,14 +350,14 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.x + version: 20.17.57 '@types/node-ipc': - specifier: 9.2.3 + specifier: ^9.2.3 version: 9.2.3 vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) + specifier: ^3.2.3 + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.17.57)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) packages/telemetry: dependencies: @@ -375,17 +378,17 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.x + version: 20.17.57 '@types/vscode': - specifier: 1.100.0 + specifier: ^1.84.0 version: 1.100.0 '@vitest/coverage-v8': - specifier: 3.2.6 - version: 3.2.6(vitest@3.2.6) + specifier: ^3.2.3 + version: 3.2.4(vitest@3.2.4) vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) + specifier: ^3.2.3 + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.17.57)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) packages/types: dependencies: @@ -403,22 +406,22 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 24.2.1 + specifier: ^24.1.0 version: 24.2.1 ajv: - specifier: 8.18.0 + specifier: ^8.18.0 version: 8.18.0 globals: - specifier: 16.3.0 + specifier: ^16.3.0 version: 16.3.0 tsup: - specifier: 8.5.0 + specifier: ^8.4.0 version: 8.5.0(jiti@2.4.2)(postcss@8.5.15)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.9.0) vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) + specifier: ^3.2.3 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) zod-to-json-schema: - specifier: 3.25.1 + specifier: ^3.25.1 version: 3.25.1(zod@3.25.76) packages/vscode-shim: @@ -430,11 +433,11 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 24.2.1 + specifier: ^24.1.0 version: 24.2.1 vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) + specifier: ^3.2.3 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) src: dependencies: @@ -476,7 +479,7 @@ importers: version: 3.922.0 '@google/genai': specifier: ^1.29.1 - version: 1.29.1(@modelcontextprotocol/sdk@1.26.0(zod@3.25.76)) + version: 1.29.1(@modelcontextprotocol/sdk@1.12.0) '@lmstudio/sdk': specifier: ^1.1.1 version: 1.2.0 @@ -484,8 +487,8 @@ importers: specifier: ^1.9.18 version: 1.9.18(zod@3.25.76) '@modelcontextprotocol/sdk': - specifier: 1.26.0 - version: 1.26.0(zod@3.25.76) + specifier: 1.12.0 + version: 1.12.0 '@qdrant/js-client-rest': specifier: ^1.14.0 version: 1.14.0(typescript@5.8.3) @@ -603,9 +606,6 @@ importers: proper-lockfile: specifier: ^4.1.2 version: 4.1.2 - ps-tree: - specifier: ^1.2.0 - version: 1.2.0 reconnecting-eventsource: specifier: ^1.6.4 version: 1.6.4 @@ -668,8 +668,11 @@ importers: version: 3.25.76 devDependencies: '@ai-sdk/openai-compatible': - specifier: 2.0.28 + specifier: ^2.0.28 version: 2.0.28(zod@3.25.76) + '@openrouter/ai-sdk-provider': + specifier: ^2.1.1 + version: 2.1.1(ai@6.0.77(zod@3.25.76))(zod@3.25.76) '@roo-code/build': specifier: workspace:^ version: link:../packages/build @@ -680,71 +683,89 @@ importers: specifier: workspace:^ version: link:../packages/config-typescript '@types/clone-deep': - specifier: 4.0.4 + specifier: ^4.0.4 version: 4.0.4 '@types/debug': - specifier: 4.1.12 + specifier: ^4.1.12 version: 4.1.12 '@types/diff': - specifier: 5.2.3 + specifier: ^5.2.1 version: 5.2.3 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 '@types/lodash.debounce': - specifier: 4.0.9 + specifier: ^4.0.9 version: 4.0.9 '@types/mocha': - specifier: 10.0.10 + specifier: ^10.0.10 version: 10.0.10 '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.x + version: 20.17.50 '@types/node-cache': - specifier: 4.2.5 + specifier: ^4.1.3 version: 4.2.5 '@types/proper-lockfile': - specifier: 4.1.4 + specifier: ^4.1.4 version: 4.1.4 - '@types/ps-tree': - specifier: 1.1.6 - version: 1.1.6 '@types/semver-compare': - specifier: 1.0.3 + specifier: ^1.0.3 version: 1.0.3 '@types/shell-quote': - specifier: 1.7.5 + specifier: ^1.7.5 version: 1.7.5 '@types/vscode': - specifier: 1.100.0 + specifier: ^1.84.0 version: 1.100.0 '@vitest/coverage-v8': - specifier: 3.2.6 - version: 3.2.6(vitest@3.2.6) + specifier: ^3.2.3 + version: 3.2.4(vitest@3.2.4) + '@vscode/test-electron': + specifier: ^2.5.2 + version: 2.5.2 '@vscode/vsce': specifier: 3.3.2 version: 3.3.2 ai: - specifier: 6.0.77 + specifier: ^6.0.75 version: 6.0.77(zod@3.25.76) esbuild-wasm: - specifier: 0.25.12 + specifier: ^0.25.0 version: 0.25.12 execa: - specifier: 9.5.3 + specifier: ^9.5.2 version: 9.5.3 + glob: + specifier: '>=11.1.0' + version: 11.1.0 mkdirp: - specifier: 3.0.1 + specifier: ^3.0.1 version: 3.0.1 nock: - specifier: 14.0.10 + specifier: ^14.0.4 version: 14.0.10 + npm-run-all2: + specifier: ^8.0.1 + version: 8.0.3 ovsx: specifier: 0.10.4 version: 0.10.4 rimraf: - specifier: 6.0.1 + specifier: ^6.0.1 version: 6.0.1 + tsup: + specifier: ^8.4.0 + version: 8.5.0(jiti@2.4.2)(postcss@8.5.15)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.8.3) + tsx: + specifier: ^4.19.3 + version: 4.19.4 vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.8.3) + specifier: ^3.2.3 + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.17.50)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.8.3) + zod-to-ts: + specifier: ^1.2.0 + version: 1.2.0(typescript@5.8.3)(zod@3.25.76) webview-ui: dependencies: @@ -847,6 +868,9 @@ importers: katex: specifier: ^0.16.11 version: 0.16.22 + knuth-shuffle-seeded: + specifier: ^1.0.6 + version: 1.0.6 lru-cache: specifier: ^11.1.0 version: 11.1.0 @@ -954,62 +978,65 @@ importers: specifier: workspace:^ version: link:../packages/config-typescript '@testing-library/jest-dom': - specifier: 6.6.3 + specifier: ^6.6.3 version: 6.6.3 '@testing-library/react': - specifier: 16.3.0 + specifier: ^16.2.0 version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': - specifier: 14.6.1 + specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.0) '@types/diff': - specifier: 5.2.3 + specifier: ^5.2.1 version: 5.2.3 '@types/jest': - specifier: 29.5.14 + specifier: ^29.0.0 version: 29.5.14 '@types/katex': - specifier: 0.16.7 + specifier: ^0.16.7 version: 0.16.7 '@types/node': - specifier: 20.19.41 + specifier: ^20.19.25 version: 20.19.41 '@types/react': - specifier: 18.3.23 + specifier: ^18.3.23 version: 18.3.23 '@types/react-dom': - specifier: 18.3.7 + specifier: ^18.3.5 version: 18.3.7(@types/react@18.3.23) '@types/shell-quote': - specifier: 1.7.5 + specifier: ^1.7.5 version: 1.7.5 '@types/stacktrace-js': - specifier: 2.0.3 + specifier: ^2.0.3 version: 2.0.3 '@types/vscode-webview': - specifier: 1.57.5 + specifier: ^1.57.5 version: 1.57.5 '@vitejs/plugin-react': - specifier: 5.2.0 + specifier: ^5.2.0 version: 5.2.0(vite@8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) '@vitest/coverage-v8': - specifier: 3.2.6 - version: 3.2.6(vitest@3.2.6) + specifier: ^3.2.3 + version: 3.2.4(vitest@3.2.4) '@vitest/ui': - specifier: 3.2.6 - version: 3.2.6(vitest@3.2.6) + specifier: ^3.2.3 + version: 3.2.4(vitest@3.2.4) babel-plugin-react-compiler: - specifier: 1.0.0 + specifier: ^1.0.0 version: 1.0.0 + identity-obj-proxy: + specifier: ^3.0.0 + version: 3.0.0 jsdom: - specifier: 26.1.0 + specifier: ^26.0.0 version: 26.1.0 vite: specifier: 8.0.14 version: 8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) vitest: - specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) + specifier: ^3.2.3 + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) packages: @@ -1367,6 +1394,14 @@ packages: resolution: {integrity: sha512-c5mifzHX5mwm5JqMIlURUyp6LEEdKF1a8lmcNRLBo0lD7zpSYPHupa4jHyhJyg9ccLwszLguZJdk2h3ngnXwNw==} engines: {node: '>=16'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -1409,6 +1444,14 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} @@ -1421,6 +1464,11 @@ packages: resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.29.3': resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} engines: {node: '>=6.0.0'} @@ -1446,6 +1494,14 @@ packages: resolution: {integrity: sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.3': + resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} @@ -1458,6 +1514,10 @@ packages: resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -1671,9 +1731,18 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -1914,12 +1983,6 @@ packages: '@modelcontextprotocol/sdk': optional: true - '@hono/node-server@1.19.14': - resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1964,6 +2027,14 @@ packages: '@ioredis/commands@1.3.0': resolution: {integrity: sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1991,6 +2062,10 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -1998,12 +2073,19 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -2051,20 +2133,17 @@ packages: peerDependencies: zod: 3.25.76 - '@modelcontextprotocol/sdk@1.26.0': - resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==} + '@modelcontextprotocol/sdk@1.12.0': + resolution: {integrity: sha512-m//7RlINx1F3sz3KqwY1WWzVgTcYX52HYk4bJ1hkBXV3zccAEth+jRvG8DBRrdaQuRsPAJOx2MH3zaHNCKL7Zg==} engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: 3.25.76 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true '@mswjs/interceptors@0.39.6': resolution: {integrity: sha512-bndDP83naYYkfayr/qhBHMhk0YGwS1iv6vaEGcr0SQbO0IZtbOPqjKjds/WcG+bJA+1T5vCx6kprKOzn5Bg+Vw==} engines: {node: '>=18'} + '@napi-rs/wasm-runtime@0.2.10': + resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} + '@napi-rs/wasm-runtime@0.2.11': resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} @@ -2197,6 +2276,13 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@openrouter/ai-sdk-provider@2.1.1': + resolution: {integrity: sha512-UypPbVnSExxmG/4Zg0usRiit3auvQVrjUXSyEhm0sZ9GQnW/d8p/bKgCk2neh1W5YyRSo7PNQvCrAEBHZnqQkQ==} + engines: {node: '>=18'} + peerDependencies: + ai: ^6.0.0 + zod: 3.25.76 + '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} @@ -2294,8 +2380,8 @@ packages: '@radix-ui/react-alert-dialog@1.1.13': resolution: {integrity: sha512-/uPs78OwxGxslYOG5TKeUsv9fZC0vo376cXSADdKirTmsLJU2au6L3n34c3p6W26rFDDDze/hwy4fYeNd0qdGA==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2307,8 +2393,8 @@ packages: '@radix-ui/react-arrow@1.1.6': resolution: {integrity: sha512-2JMfHJf/eVnwq+2dewT3C0acmCWD3XiVA1Da+jTDqo342UlU13WvXtqHhG+yJw5JeQmu4ue2eMy6gcEArLBlcw==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2320,8 +2406,8 @@ packages: '@radix-ui/react-checkbox@1.3.1': resolution: {integrity: sha512-xTaLKAO+XXMPK/BpVTSaAAhlefmvMSACjIhK9mGsImvX2ljcTDm8VGR1CuS1uYcNdR5J+oiOhoJZc5un6bh3VQ==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2333,8 +2419,8 @@ packages: '@radix-ui/react-collapsible@1.1.10': resolution: {integrity: sha512-O2mcG3gZNkJ/Ena34HurA3llPOEA/M4dJtIRMa6y/cknRDC8XY5UZBInKTsUwW5cUue9A4k0wi1XU5fKBzKe1w==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2346,8 +2432,8 @@ packages: '@radix-ui/react-collection@1.1.6': resolution: {integrity: sha512-PbhRFK4lIEw9ADonj48tiYWzkllz81TM7KVYyyMMw2cwHO7D5h4XKEblL8NlaRisTK3QTe6tBEhDccFUryxHBQ==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2359,8 +2445,8 @@ packages: '@radix-ui/react-collection@1.1.7': resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2372,7 +2458,7 @@ packages: '@radix-ui/react-compose-refs@1.1.2': resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2381,7 +2467,7 @@ packages: '@radix-ui/react-context@1.1.2': resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2390,8 +2476,8 @@ packages: '@radix-ui/react-dialog@1.1.13': resolution: {integrity: sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2403,7 +2489,7 @@ packages: '@radix-ui/react-direction@1.1.1': resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2412,8 +2498,8 @@ packages: '@radix-ui/react-dismissable-layer@1.1.9': resolution: {integrity: sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2425,8 +2511,8 @@ packages: '@radix-ui/react-dropdown-menu@2.1.14': resolution: {integrity: sha512-lzuyNjoWOoaMFE/VC5FnAAYM16JmQA8ZmucOXtlhm2kKR5TSU95YLAueQ4JYuRmUJmBvSqXaVFGIfuukybwZJQ==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2438,7 +2524,7 @@ packages: '@radix-ui/react-focus-guards@1.1.2': resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2447,8 +2533,8 @@ packages: '@radix-ui/react-focus-scope@1.1.6': resolution: {integrity: sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2465,7 +2551,7 @@ packages: '@radix-ui/react-id@1.1.1': resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2474,8 +2560,8 @@ packages: '@radix-ui/react-menu@2.1.14': resolution: {integrity: sha512-0zSiBAIFq9GSKoSH5PdEaQeRB3RnEGxC+H2P0egtnKoKKLNBH8VBHyVO6/jskhjAezhOIplyRUj7U2lds9A+Yg==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2487,8 +2573,8 @@ packages: '@radix-ui/react-popover@1.1.13': resolution: {integrity: sha512-84uqQV3omKDR076izYgcha6gdpN8m3z6w/AeJ83MSBJYVG/AbOHdLjAgsPZkeC/kt+k64moXFCnio8BbqXszlw==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2500,8 +2586,8 @@ packages: '@radix-ui/react-popper@1.2.6': resolution: {integrity: sha512-7iqXaOWIjDBfIG7aq8CUEeCSsQMLFdn7VEE8TaFz704DtEzpPHR7w/uuzRflvKgltqSAImgcmxQ7fFX3X7wasg==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2513,8 +2599,8 @@ packages: '@radix-ui/react-portal@1.1.8': resolution: {integrity: sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2526,8 +2612,8 @@ packages: '@radix-ui/react-presence@1.1.4': resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2539,8 +2625,8 @@ packages: '@radix-ui/react-presence@1.1.5': resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2552,8 +2638,8 @@ packages: '@radix-ui/react-primitive@2.1.2': resolution: {integrity: sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2565,8 +2651,8 @@ packages: '@radix-ui/react-primitive@2.1.3': resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2578,8 +2664,8 @@ packages: '@radix-ui/react-progress@1.1.6': resolution: {integrity: sha512-QzN9a36nKk2eZKMf9EBCia35x3TT+SOgZuzQBVIHyRrmYYi73VYBRK3zKwdJ6az/F5IZ6QlacGJBg7zfB85liA==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2591,8 +2677,8 @@ packages: '@radix-ui/react-radio-group@1.3.8': resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2604,8 +2690,8 @@ packages: '@radix-ui/react-roving-focus@1.1.11': resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2617,8 +2703,8 @@ packages: '@radix-ui/react-roving-focus@1.1.9': resolution: {integrity: sha512-ZzrIFnMYHHCNqSNCsuN6l7wlewBEq0O0BCSBkabJMFXVO51LRUTq71gLP1UxFvmrXElqmPjA5VX7IqC9VpazAQ==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2630,8 +2716,8 @@ packages: '@radix-ui/react-select@2.2.4': resolution: {integrity: sha512-/OOm58Gil4Ev5zT8LyVzqfBcij4dTHYdeyuF5lMHZ2bIp0Lk9oETocYiJ5QC0dHekEQnK6L/FNJCceeb4AkZ6Q==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2643,8 +2729,8 @@ packages: '@radix-ui/react-separator@1.1.6': resolution: {integrity: sha512-Izof3lPpbCfTM7WDta+LRkz31jem890VjEvpVRoWQNKpDUMMVffuyq854XPGP1KYGWWmjmYvHvPFeocWhFCy1w==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2656,8 +2742,8 @@ packages: '@radix-ui/react-slider@1.3.4': resolution: {integrity: sha512-Cp6hEmQtRJFci285vkdIJ+HCDLTRDk+25VhFwa1fcubywjMUE3PynBgtN5RLudOgSCYMlT4jizCXdmV+8J7Y2w==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2669,7 +2755,7 @@ packages: '@radix-ui/react-slot@1.2.2': resolution: {integrity: sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2678,7 +2764,7 @@ packages: '@radix-ui/react-slot@1.2.3': resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2687,8 +2773,8 @@ packages: '@radix-ui/react-tooltip@1.2.6': resolution: {integrity: sha512-zYb+9dc9tkoN2JjBDIIPLQtk3gGyz8FMKoqYTb8EMVQ5a5hBcdHPECrsZVI4NpPAUOixhkoqg7Hj5ry5USowfA==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -2700,7 +2786,7 @@ packages: '@radix-ui/react-use-callback-ref@1.1.1': resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2709,7 +2795,7 @@ packages: '@radix-ui/react-use-controllable-state@1.2.2': resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2718,7 +2804,7 @@ packages: '@radix-ui/react-use-effect-event@0.0.2': resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2727,7 +2813,7 @@ packages: '@radix-ui/react-use-escape-keydown@1.1.1': resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2736,7 +2822,7 @@ packages: '@radix-ui/react-use-layout-effect@1.1.1': resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2745,7 +2831,7 @@ packages: '@radix-ui/react-use-previous@1.1.1': resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2754,7 +2840,7 @@ packages: '@radix-ui/react-use-rect@1.1.1': resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2763,7 +2849,7 @@ packages: '@radix-ui/react-use-size@1.1.1': resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2772,8 +2858,8 @@ packages: '@radix-ui/react-visually-hidden@1.2.2': resolution: {integrity: sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew==} peerDependencies: - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -3363,8 +3449,8 @@ packages: engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 - '@types/react': 18.3.23 - '@types/react-dom': 18.3.7 + '@types/react': ^18.3.23 + '@types/react-dom': ^18.3.5 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: @@ -3441,6 +3527,9 @@ packages: '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -3552,12 +3641,22 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/glob@8.1.0': + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + + '@types/glob@9.0.0': + resolution: {integrity: sha512-00UxlRaIUvYm4R4W9WYkN8/J+kV8fmOQ7okeH6YFtGWFMt3odD45tpG5yA5wnL7HE6lLgjaTW5n14ju2hl2NNA==} + deprecated: This is a stub types definition. glob provides its own type definitions, so you do not need this installed. + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -3594,6 +3693,9 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/mocha@10.0.10': resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} @@ -3619,6 +3721,12 @@ packages: '@types/node@18.19.100': resolution: {integrity: sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA==} + '@types/node@20.17.50': + resolution: {integrity: sha512-Mxiq0ULv/zo1OzOhwPqOA13I81CV/W3nvd3ChtQZRT5Cwz3cr0FKo/wMSsbTqL3EXpaBAEQhva2B8ByRkOIh9A==} + + '@types/node@20.17.57': + resolution: {integrity: sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==} + '@types/node@20.19.41': resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} @@ -3631,13 +3739,10 @@ packages: '@types/proper-lockfile@4.1.4': resolution: {integrity: sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ==} - '@types/ps-tree@1.1.6': - resolution: {integrity: sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ==} - '@types/react-dom@18.3.7': resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 '@types/react@18.3.23': resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} @@ -3676,6 +3781,9 @@ packages: '@types/vscode@1.100.0': resolution: {integrity: sha512-4uNyvzHoraXEeCamR3+fzcBlh7Afs4Ifjs4epINyUX/jvdk0uzLnwiDY35UKDKnkCHP5Nu3dljl2H8lR6s+rQw==} + '@types/vscode@1.103.0': + resolution: {integrity: sha512-o4hanZAQdNfsKecexq9L3eHICd0AAvdbLk6hA60UzGXbGH/q8b/9xv2RgR7vV3ZcHuyKVq7b37IGd/+gM4Tu+Q==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -3750,23 +3858,23 @@ packages: peerDependencies: vite: 8.0.14 - '@vitest/coverage-v8@3.2.6': - resolution: {integrity: sha512-LsAdmUapA0qSN306d8+zOyawM0hFm2m2Hg9IwVNIKBm+qJV8cijiq2c+gxKZcB1HCfIWAy+0qEZDCUQA58A1cw==} + '@vitest/coverage-v8@3.2.4': + resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} peerDependencies: - '@vitest/browser': 3.2.6 - vitest: 3.2.6 + '@vitest/browser': 3.2.4 + vitest: 3.2.4 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.6': - resolution: {integrity: sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} '@vitest/expect@4.0.18': resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} - '@vitest/mocker@3.2.6': - resolution: {integrity: sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 vite: 8.0.14 @@ -3787,37 +3895,37 @@ packages: vite: optional: true - '@vitest/pretty-format@3.2.6': - resolution: {integrity: sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} '@vitest/pretty-format@4.0.18': resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} - '@vitest/runner@3.2.6': - resolution: {integrity: sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} '@vitest/runner@4.0.18': resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} - '@vitest/snapshot@3.2.6': - resolution: {integrity: sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} '@vitest/snapshot@4.0.18': resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} - '@vitest/spy@3.2.6': - resolution: {integrity: sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} '@vitest/spy@4.0.18': resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} - '@vitest/ui@3.2.6': - resolution: {integrity: sha512-mATfG3zVdhobE9U1rIpvtYD3DGuSSxqZ3Aj/8ityGqKXy8YDJ9BoAjZmAz6dZ1IZ1xI5V+MerkCczvVa+3QK9Q==} + '@vitest/ui@3.2.4': + resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} peerDependencies: - vitest: 3.2.6 + vitest: 3.2.4 - '@vitest/utils@3.2.6': - resolution: {integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} '@vitest/utils@4.0.18': resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} @@ -3916,6 +4024,11 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -3940,14 +4053,6 @@ packages: peerDependencies: zod: 3.25.76 - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -3986,6 +4091,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -4176,8 +4285,8 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} boolbase@1.0.0: @@ -4908,6 +5017,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + diff@5.2.2: resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} @@ -4967,9 +5080,6 @@ packages: duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -5140,6 +5250,10 @@ packages: eslint: '>6.6.0' turbo: '>2.0.0' + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5148,6 +5262,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@4.2.1: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5172,6 +5290,10 @@ packages: jiti: optional: true + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5211,9 +5333,6 @@ packages: resolution: {integrity: sha512-2QiHxshejKgJrYMzSI9MEHrvhmzxBL+eLyiM5IiyjDBySkgwS2+tdtnO3gbx8pEisu/yOFCIhfCb63gCEu0yBQ==} engines: {node: '>=13.0.0'} - event-stream@3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -5255,12 +5374,15 @@ packages: exenv-es6@1.1.1: resolution: {integrity: sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -5269,14 +5391,14 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - express-rate-limit@8.5.2: - resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} + express-rate-limit@7.5.0: + resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} engines: {node: '>= 16'} peerDependencies: - express: '>= 4.11' + express: ^4.11 || 5 || ^5.0.0-beta.1 - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} extend-shallow@2.0.1: @@ -5454,9 +5576,6 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -5644,6 +5763,9 @@ packages: hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + harmony-reflect@1.6.2: + resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -5723,10 +5845,6 @@ packages: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} - hono@4.12.23: - resolution: {integrity: sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==} - engines: {node: '>=16.9.0'} - hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} @@ -5757,10 +5875,6 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -5812,6 +5926,10 @@ packages: resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} engines: {node: '>=0.10.0'} + identity-obj-proxy@3.0.0: + resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} + engines: {node: '>=4'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5859,7 +5977,7 @@ packages: resolution: {integrity: sha512-yF92kj3pmBvk7oKbSq5vEALO//o7Z9Ck/OaLNlkzXNeYdwfpxMQkSowGTFUCS5MSu9bWfSZMewGpp7bFc66D7Q==} engines: {node: '>=18'} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 peerDependenciesMeta: '@types/react': optional: true @@ -5868,7 +5986,7 @@ packages: resolution: {integrity: sha512-QDt6FgJxgmSxAelcOvOHUvFxbIUjVpCH5bx+Slvc5m7IEcpGt3dYwbz/L+oRnqEGeRvwy1tineKK4ect3nW1vQ==} engines: {node: '>=20'} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: '>=19.0.0' react-devtools-core: ^6.1.2 peerDependenciesMeta: @@ -5901,10 +6019,6 @@ packages: resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} engines: {node: '>=12.22.0'} - ip-address@10.2.0: - resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} - engines: {node: '>= 12'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -6157,6 +6271,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + isexe@3.1.5: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} @@ -6213,9 +6331,6 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - jose@6.2.3: - resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} - joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -6268,15 +6383,16 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@4.0.0: + resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} + engines: {node: ^18.17.0 || >=20.5.0} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} @@ -6360,6 +6476,9 @@ packages: '@types/node': '>=18' typescript: '>=5.0.4' + knuth-shuffle-seeded@1.0.6: + resolution: {integrity: sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==} + layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -6647,6 +6766,9 @@ packages: lop@0.4.2: resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.1.4: resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} @@ -6684,6 +6806,9 @@ packages: resolution: {integrity: sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -6699,9 +6824,6 @@ packages: engines: {node: '>=12.0.0'} hasBin: true - map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -6795,6 +6917,10 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -6944,6 +7070,14 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -7094,6 +7228,15 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-normalize-package-bin@4.0.0: + resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} + engines: {node: ^18.17.0 || >=20.5.0} + + npm-run-all2@8.0.3: + resolution: {integrity: sha512-0mAycidMUMThrLt8AT3LGtOMgfLaMg6/4oUKHTKMU0jDSIsdKBsKp98H8zBFcJylQC4CtOB140UUFbOlFyE9gA==} + engines: {node: ^20.5.0 || >=22.0.0, npm: '>= 10'} + hasBin: true + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -7361,9 +7504,6 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - pdf-parse@1.1.1: resolution: {integrity: sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A==} engines: {node: '>=6.8.1'} @@ -7378,10 +7518,19 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -7520,11 +7669,6 @@ packages: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} - ps-tree@1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - hasBin: true - pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} @@ -7540,10 +7684,6 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - qs@6.15.2: - resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} - engines: {node: '>=0.6'} - quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -7561,10 +7701,6 @@ packages: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -7612,7 +7748,7 @@ packages: react-markdown@9.1.0: resolution: {integrity: sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: '>=18' react-reconciler@0.33.0: @@ -7635,7 +7771,7 @@ packages: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': @@ -7645,7 +7781,7 @@ packages: resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7655,7 +7791,7 @@ packages: resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -7693,6 +7829,10 @@ packages: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} + read-package-json-fast@4.0.0: + resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} + engines: {node: ^18.17.0 || >=20.5.0} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -7947,6 +8087,9 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} + seed-random@2.2.0: + resolution: {integrity: sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==} + semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -8128,9 +8271,6 @@ packages: spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -8163,20 +8303,16 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} - stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - streamx@2.22.0: resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} @@ -8417,9 +8553,6 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tiktoken@1.0.21: resolution: {integrity: sha512-/kqtlepLMptX0OgbYD9aMYbM7EFrMZCL7EoHM8Psmg2FuhXoo/bH64KqOiZGGwa6oS9TPdSEDKBnV2LuB8+5vQ==} @@ -8429,10 +8562,18 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + engines: {node: '>=18'} + tinyexec@1.2.3: resolution: {integrity: sha512-g62dB+w1/OEFnPvmX0yd/HnetYITOL+1nJW7kitOycOeAvmbWC/nu0fwmmQ/kupNojqExzyC/T++pST/jRJ2mQ==} engines: {node: '>=18'} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} @@ -8645,6 +8786,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -8747,7 +8891,7 @@ packages: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -8784,7 +8928,7 @@ packages: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -8890,16 +9034,16 @@ packages: yaml: optional: true - vitest@3.2.6: - resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.6 - '@vitest/ui': 3.2.6 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -8962,7 +9106,7 @@ packages: vscrui@0.2.2: resolution: {integrity: sha512-buw2OipqUl7GCBq1mxcAjUwoUsslGzVhdaxDPmEx27xzc3QAJJZHtT30QbakgZVJ1Jb3E6kcsguUIFEGxrgkyQ==} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 react: ^17 || ^18 || ^19 w3c-xmlserializer@5.0.0: @@ -9055,6 +9199,11 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -9241,11 +9390,22 @@ packages: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} + zod-to-json-schema@3.24.5: + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + peerDependencies: + zod: 3.25.76 + zod-to-json-schema@3.25.1: resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: zod: 3.25.76 + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: 3.25.76 + zod-validation-error@3.4.1: resolution: {integrity: sha512-1KP64yqDPQ3rupxNv7oXhf7KdhHHgaqbKuspVoiN93TT0xrBjql+Svjkdjq/Qh/7GSMmgQs3AfvBT0heE35thw==} engines: {node: '>=18.0.0'} @@ -9259,7 +9419,7 @@ packages: resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} engines: {node: '>=12.20.0'} peerDependencies: - '@types/react': 18.3.23 + '@types/react': ^18.3.23 immer: '>=9.0.6' react: '>=18.0.0' use-sync-external-store: '>=1.2.0' @@ -9393,9 +9553,9 @@ snapshots: dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.8 + eventsource-parser: 3.0.6 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.24.5(zod@3.25.76) '@ai-sdk/provider-utils@4.0.14(zod@3.25.76)': dependencies: @@ -9408,7 +9568,7 @@ snapshots: dependencies: '@ai-sdk/provider': 3.0.8 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.8 + eventsource-parser: 3.0.6 zod: 3.25.76 '@ai-sdk/provider-utils@4.0.27(zod@3.25.76)': @@ -9444,8 +9604,8 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 '@antfu/install-pkg@1.1.0': dependencies: @@ -10048,6 +10208,18 @@ snapshots: jsonwebtoken: 9.0.2 uuid: 8.3.2 + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -10058,7 +10230,7 @@ snapshots: '@babel/core@7.29.0': dependencies: - '@babel/code-frame': 7.29.7 + '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) @@ -10069,7 +10241,7 @@ snapshots: '@babel/types': 7.29.0 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10105,7 +10277,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.29.7 + '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -10114,6 +10286,10 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} '@babel/helper-validator-option@7.27.1': {} @@ -10123,6 +10299,10 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.0 + '@babel/parser@7.27.2': + dependencies: + '@babel/types': 7.27.1 + '@babel/parser@7.29.3': dependencies: '@babel/types': 7.29.0 @@ -10141,30 +10321,39 @@ snapshots: '@babel/runtime@7.27.4': {} + '@babel/runtime@7.28.3': {} + + '@babel/runtime@7.28.4': {} + '@babel/runtime@7.29.7': {} '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.29.7 + '@babel/code-frame': 7.29.0 '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': dependencies: - '@babel/code-frame': 7.29.7 + '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.29.3 '@babel/template': 7.28.6 '@babel/types': 7.29.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color + '@babel/types@7.27.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.29.7 + '@babel/helper-validator-identifier': 7.28.5 '@basetenlabs/performance-client-android-arm-eabi@0.0.10': optional: true @@ -10424,11 +10613,27 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.4.3': + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 @@ -10535,7 +10740,7 @@ snapshots: '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10549,7 +10754,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -10607,21 +10812,17 @@ snapshots: '@floating-ui/utils@0.2.9': {} - '@google/genai@1.29.1(@modelcontextprotocol/sdk@1.26.0(zod@3.25.76))': + '@google/genai@1.29.1(@modelcontextprotocol/sdk@1.12.0)': dependencies: google-auth-library: 10.5.0 ws: 8.18.3 optionalDependencies: - '@modelcontextprotocol/sdk': 1.26.0(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.12.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@hono/node-server@1.19.14(hono@4.12.23)': - dependencies: - hono: 4.12.23 - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -10660,11 +10861,17 @@ snapshots: '@ioredis/commands@1.3.0': {} + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -10688,7 +10895,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.2.1 + '@types/node': 20.19.41 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -10697,17 +10904,30 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -10715,7 +10935,7 @@ snapshots: '@kwsites/file-exists@1.1.1': dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -10734,21 +10954,21 @@ snapshots: chalk: 4.1.2 jsonschema: 1.5.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - bufferutil - utf-8-validate '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.29.7 + '@babel/runtime': 7.28.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.29.7 + '@babel/runtime': 7.28.4 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -10785,27 +11005,21 @@ snapshots: '@mistralai/mistralai@1.9.18(zod@3.25.76)': dependencies: zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.24.5(zod@3.25.76) - '@modelcontextprotocol/sdk@1.26.0(zod@3.25.76)': + '@modelcontextprotocol/sdk@1.12.0': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.23) - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) + ajv: 6.12.6 content-type: 1.0.5 cors: 2.8.5 cross-spawn: 7.0.6 eventsource: 3.0.7 - eventsource-parser: 3.0.8 - express: 5.2.1 - express-rate-limit: 8.5.2(express@5.2.1) - hono: 4.12.23 - jose: 6.2.3 - json-schema-typed: 8.0.2 + express: 5.1.0 + express-rate-limit: 7.5.0(express@5.1.0) pkce-challenge: 5.0.0 raw-body: 3.0.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -10818,10 +11032,17 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 + '@napi-rs/wasm-runtime@0.2.10': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + '@napi-rs/wasm-runtime@0.2.11': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 '@tybys/wasm-util': 0.9.0 optional: true @@ -10876,7 +11097,7 @@ snapshots: '@node-rs/crc32-wasm32-wasi@1.10.6': dependencies: - '@napi-rs/wasm-runtime': 0.2.11 + '@napi-rs/wasm-runtime': 0.2.10 optional: true '@node-rs/crc32-win32-arm64-msvc@1.10.6': @@ -10926,6 +11147,11 @@ snapshots: '@open-draft/until@2.1.0': {} + '@openrouter/ai-sdk-provider@2.1.1(ai@6.0.77(zod@3.25.76))(zod@3.25.76)': + dependencies: + ai: 6.0.77(zod@3.25.76) + zod: 3.25.76 + '@opentelemetry/api@1.9.0': {} '@oxc-project/types@0.132.0': {} @@ -11996,7 +12222,7 @@ snapshots: enhanced-resolve: 5.18.1 jiti: 2.4.2 lightningcss: 1.29.2 - magic-string: 0.30.21 + magic-string: 0.30.17 source-map-js: 1.2.1 tailwindcss: 4.1.6 @@ -12091,7 +12317,7 @@ snapshots: '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.29.7 + '@babel/runtime': 7.27.1 '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -12144,29 +12370,34 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.27.1 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.27.1 + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + optional: true '@types/clone-deep@4.0.4': {} @@ -12299,10 +12530,21 @@ snapshots: dependencies: '@types/estree': 1.0.8 + '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/geojson@7946.0.16': {} + '@types/glob@8.1.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.19.41 + + '@types/glob@9.0.0': + dependencies: + glob: 11.1.0 + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -12342,6 +12584,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/minimatch@5.1.2': {} + '@types/mocha@10.0.10': {} '@types/ms@2.1.0': {} @@ -12352,12 +12596,12 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 24.2.1 + '@types/node': 20.19.41 form-data: 4.0.5 '@types/node-ipc@9.2.3': dependencies: - '@types/node': 24.2.1 + '@types/node': 20.19.41 '@types/node@12.20.55': {} @@ -12367,6 +12611,14 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@20.17.50': + dependencies: + undici-types: 6.19.8 + + '@types/node@20.17.57': + dependencies: + undici-types: 6.19.8 + '@types/node@20.19.41': dependencies: undici-types: 6.21.0 @@ -12381,8 +12633,6 @@ snapshots: dependencies: '@types/retry': 0.12.5 - '@types/ps-tree@1.1.6': {} - '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: '@types/react': 18.3.23 @@ -12417,6 +12667,8 @@ snapshots: '@types/vscode@1.100.0': {} + '@types/vscode@1.103.0': {} + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -12446,7 +12698,7 @@ snapshots: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) eslint: 9.27.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: @@ -12461,7 +12713,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) eslint: 9.27.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -12474,7 +12726,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12529,12 +12781,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.6(vitest@3.2.6)': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 ast-v8-to-istanbul: 0.3.12 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -12544,15 +12796,15 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.6(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.8.3) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.6': + '@vitest/expect@3.2.4': dependencies: - '@types/chai': 5.2.3 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 @@ -12566,27 +12818,35 @@ snapshots: tinyrainbow: 3.1.0 optional: true - '@vitest/mocker@3.2.6(vite@8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3))': + '@vitest/mocker@3.2.4(vite@8.0.14(@types/node@20.17.50)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3))': dependencies: - '@vitest/spy': 3.2.6 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 0.30.17 optionalDependencies: - vite: 8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) + vite: 8.0.14(@types/node@20.17.50)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) - '@vitest/mocker@3.2.6(vite@8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': + '@vitest/mocker@3.2.4(vite@8.0.14(@types/node@20.17.57)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': dependencies: - '@vitest/spy': 3.2.6 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 0.30.17 + optionalDependencies: + vite: 8.0.14(@types/node@20.17.57)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) + + '@vitest/mocker@3.2.4(vite@8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 optionalDependencies: vite: 8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) - '@vitest/mocker@3.2.6(vite@8.0.14(@types/node@24.2.1)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': + '@vitest/mocker@3.2.4(vite@8.0.14(@types/node@24.2.1)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': dependencies: - '@vitest/spy': 3.2.6 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 0.30.17 optionalDependencies: vite: 8.0.14(@types/node@24.2.1)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) @@ -12599,7 +12859,7 @@ snapshots: vite: 8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) optional: true - '@vitest/pretty-format@3.2.6': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 @@ -12608,9 +12868,9 @@ snapshots: tinyrainbow: 3.1.0 optional: true - '@vitest/runner@3.2.6': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.2.6 + '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 @@ -12620,10 +12880,10 @@ snapshots: pathe: 2.0.3 optional: true - '@vitest/snapshot@3.2.6': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.2.6 - magic-string: 0.30.21 + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 pathe: 2.0.3 '@vitest/snapshot@4.0.18': @@ -12633,27 +12893,27 @@ snapshots: pathe: 2.0.3 optional: true - '@vitest/spy@3.2.6': + '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 '@vitest/spy@4.0.18': optional: true - '@vitest/ui@3.2.6(vitest@3.2.6)': + '@vitest/ui@3.2.4(vitest@3.2.4)': dependencies: - '@vitest/utils': 3.2.6 + '@vitest/utils': 3.2.4 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.1 - tinyglobby: 0.2.16 + tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.6(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.8.3) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0) - '@vitest/utils@3.2.6': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.2.6 + '@vitest/pretty-format': 3.2.4 loupe: 3.1.4 tinyrainbow: 2.0.0 @@ -12691,7 +12951,7 @@ snapshots: https-proxy-agent: 7.0.6 jszip: 3.10.1 ora: 8.2.0 - semver: 7.7.3 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -12787,10 +13047,16 @@ snapshots: mime-types: 3.0.1 negotiator: 1.0.0 + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 + acorn@8.14.1: {} + acorn@8.15.0: {} agent-base@7.1.3: {} @@ -12818,10 +13084,6 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 3.25.76 - ajv-formats@3.0.1(ajv@8.18.0): - optionalDependencies: - ajv: 8.18.0 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -12860,6 +13122,8 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} ansi-to-html@0.7.2: @@ -13026,7 +13290,7 @@ snapshots: babel-plugin-react-compiler@1.0.0: dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.27.1 bail@1.0.5: {} @@ -13086,16 +13350,16 @@ snapshots: bluebird@3.7.2: {} - body-parser@2.2.2: + body-parser@2.2.0: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) http-errors: 2.0.0 - iconv-lite: 0.7.0 + iconv-lite: 0.6.3 on-finished: 2.4.1 - qs: 6.15.2 - raw-body: 3.0.2 + qs: 6.14.0 + raw-body: 3.0.0 type-is: 2.0.1 transitivePeerDependencies: - supports-color @@ -13204,7 +13468,7 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.4 + loupe: 3.1.3 pathval: 2.0.0 chai@6.2.2: @@ -13735,15 +13999,15 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1: + debug@4.4.1(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 - debug@4.4.3(supports-color@8.1.1): + debug@4.4.3: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 decamelize@4.0.0: {} @@ -13818,6 +14082,8 @@ snapshots: diff-sequences@29.6.3: {} + diff@5.2.0: {} + diff@5.2.2: {} dingbat-to-unicode@1.0.1: {} @@ -13876,8 +14142,6 @@ snapshots: dependencies: readable-stream: 2.3.8 - duplexer@0.1.2: {} - eastasianwidth@0.2.0: {} easy-stack@1.0.1: {} @@ -13960,7 +14224,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.4 + hasown: 2.0.2 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -14024,11 +14288,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.4 + hasown: 2.0.2 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.4 + hasown: 2.0.2 es-to-primitive@1.3.0: dependencies: @@ -14105,7 +14369,7 @@ snapshots: es-iterator-helpers: 1.2.1 eslint: 9.27.0(jiti@2.4.2) estraverse: 5.3.0 - hasown: 2.0.4 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.9 @@ -14123,6 +14387,11 @@ snapshots: eslint: 9.27.0(jiti@2.4.2) turbo: 2.9.14 + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -14130,6 +14399,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} eslint@9.27.0(jiti@2.4.2): @@ -14145,16 +14416,16 @@ snapshots: '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -14192,7 +14463,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -14216,6 +14487,12 @@ snapshots: transitivePeerDependencies: - supports-color + espree@10.3.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 + espree@10.4.0: dependencies: acorn: 8.15.0 @@ -14249,16 +14526,6 @@ snapshots: copyfiles: 2.4.1 strong-type: 0.1.6 - event-stream@3.3.4: - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - event-target-shim@5.0.1: {} eventemitter3@5.0.4: {} @@ -14269,7 +14536,7 @@ snapshots: eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.8 + eventsource-parser: 3.0.6 exceljs@4.4.0: dependencies: @@ -14320,7 +14587,7 @@ snapshots: pretty-ms: 9.2.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 + yoctocolors: 2.1.1 execa@9.6.0: dependencies: @@ -14342,7 +14609,10 @@ snapshots: expand-template@2.0.3: optional: true - expect-type@1.3.0: {} + expect-type@1.2.1: {} + + expect-type@1.3.0: + optional: true expect@29.7.0: dependencies: @@ -14352,21 +14622,19 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express-rate-limit@8.5.2(express@5.2.1): + express-rate-limit@7.5.0(express@5.1.0): dependencies: - express: 5.2.1 - ip-address: 10.2.0 + express: 5.1.0 - express@5.2.1: + express@5.1.0: dependencies: accepts: 2.0.0 - body-parser: 2.2.2 + body-parser: 2.2.0 content-disposition: 1.0.0 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.3(supports-color@8.1.1) - depd: 2.0.0 + debug: 4.4.1(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -14479,7 +14747,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -14500,7 +14768,7 @@ snapshots: fix-dts-default-cjs-exports@1.0.1: dependencies: - magic-string: 0.30.21 + magic-string: 0.30.17 mlly: 1.7.4 rollup: 4.60.4 @@ -14561,8 +14829,6 @@ snapshots: fresh@2.0.0: {} - from@0.1.7: {} - fs-constants@1.0.0: {} fs-extra@7.0.1: @@ -14595,7 +14861,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.4 + hasown: 2.0.2 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -14661,7 +14927,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.4 + hasown: 2.0.2 math-intrinsics: 1.1.0 get-nonce@1.0.1: {} @@ -14705,7 +14971,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.1 - minimatch: 10.2.5 + minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -14797,6 +15063,8 @@ snapshots: hachure-fill@0.5.2: {} + harmony-reflect@1.6.2: {} + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -14933,8 +15201,6 @@ snapshots: highlight.js@11.11.1: {} - hono@4.12.23: {} - hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 @@ -14970,25 +15236,17 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -15022,6 +15280,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + identity-obj-proxy@3.0.0: + dependencies: + harmony-reflect: 1.6.2 + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -15097,7 +15359,7 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.4 + hasown: 2.0.2 side-channel: 1.1.0 internmap@1.0.1: {} @@ -15108,7 +15370,7 @@ snapshots: dependencies: '@ioredis/commands': 1.3.0 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@8.1.1) denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -15118,8 +15380,6 @@ snapshots: transitivePeerDependencies: - supports-color - ip-address@10.2.0: {} - ipaddr.js@1.9.1: {} is-alphabetical@1.0.4: {} @@ -15173,7 +15433,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.4 + hasown: 2.0.2 is-data-view@1.0.2: dependencies: @@ -15235,7 +15495,7 @@ snapshots: is-it-type@5.1.2: dependencies: - '@babel/runtime': 7.29.7 + '@babel/runtime': 7.28.3 globalthis: 1.0.4 is-map@2.0.3: {} @@ -15266,7 +15526,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.4 + hasown: 2.0.2 is-set@2.0.3: {} @@ -15334,6 +15594,8 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + isexe@3.1.5: {} isobject@3.0.1: {} @@ -15348,8 +15610,8 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3(supports-color@8.1.1) + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -15390,7 +15652,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.29.7 + '@babel/code-frame': 7.27.1 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -15403,7 +15665,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.2.1 + '@types/node': 20.19.41 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -15411,8 +15673,6 @@ snapshots: jiti@2.4.2: {} - jose@6.2.3: {} - joycon@3.1.1: {} js-cookie@2.2.1: {} @@ -15458,7 +15718,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.20.1 + ws: 8.18.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -15473,12 +15733,12 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@4.0.0: {} + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} - json-schema-typed@8.0.2: {} - json-schema@0.4.0: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -15583,13 +15843,17 @@ snapshots: minimist: 1.2.8 oxc-resolver: 11.2.0 picocolors: 1.1.1 - picomatch: 4.0.4 + picomatch: 4.0.2 smol-toml: 1.3.4 strip-json-comments: 5.0.2 typescript: 5.8.3 zod: 3.25.76 zod-validation-error: 3.4.1(zod@3.25.76) + knuth-shuffle-seeded@1.0.6: + dependencies: + seed-random: 2.2.0 + layout-base@1.0.2: {} layout-base@2.0.1: {} @@ -15717,7 +15981,7 @@ snapshots: listr2: 9.0.5 picomatch: 4.0.4 string-argv: 0.3.2 - tinyexec: 1.2.3 + tinyexec: 1.1.2 yaml: 2.9.0 listenercount@1.0.1: {} @@ -15798,7 +16062,7 @@ snapshots: log-symbols@6.0.0: dependencies: - chalk: 5.6.2 + chalk: 5.4.1 is-unicode-supported: 1.3.0 log-update@6.1.0: @@ -15821,6 +16085,8 @@ snapshots: option: 0.2.4 underscore: 1.13.8 + loupe@3.1.3: {} + loupe@3.1.4: {} lowlight@3.3.0: @@ -15851,14 +16117,18 @@ snapshots: macos-release@3.3.0: {} + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 magicast@0.3.5: dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 source-map-js: 1.2.1 make-dir@4.0.0: @@ -15878,8 +16148,6 @@ snapshots: underscore: 1.13.8 xmlbuilder: 10.1.1 - map-stream@0.1.0: {} - markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -16099,6 +16367,8 @@ snapshots: media-typer@1.1.0: {} + memorystream@0.3.1: {} + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} @@ -16310,7 +16580,7 @@ snapshots: micromark@2.11.4: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -16318,7 +16588,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -16367,6 +16637,14 @@ snapshots: min-indent@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.2 + + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@10.2.5: dependencies: brace-expansion: 5.0.5 @@ -16404,7 +16682,7 @@ snapshots: mlly@1.7.4: dependencies: - acorn: 8.15.0 + acorn: 8.14.1 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.1 @@ -16413,8 +16691,8 @@ snapshots: dependencies: browser-stdout: 1.3.1 chokidar: 4.0.3 - debug: 4.4.3(supports-color@8.1.1) - diff: 5.2.2 + debug: 4.4.1(supports-color@8.1.1) + diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 glob: 11.1.0 @@ -16524,6 +16802,19 @@ snapshots: normalize-path@3.0.0: {} + npm-normalize-package-bin@4.0.0: {} + + npm-run-all2@8.0.3: + dependencies: + ansi-styles: 6.2.1 + cross-spawn: 7.0.6 + memorystream: 0.3.1 + minimatch: 10.0.1 + pidtree: 0.6.0 + read-package-json-fast: 4.0.0 + shell-quote: 1.8.3 + which: 5.0.0 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -16647,7 +16938,7 @@ snapshots: ora@8.2.0: dependencies: - chalk: 5.6.2 + chalk: 5.4.1 cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -16655,7 +16946,7 @@ snapshots: log-symbols: 6.0.0 stdin-discarder: 0.2.2 string-width: 7.2.0 - strip-ansi: 7.2.0 + strip-ansi: 7.1.2 os-name@6.1.0: dependencies: @@ -16820,10 +17111,6 @@ snapshots: pathval@2.0.0: {} - pause-stream@0.0.11: - dependencies: - through: 2.3.8 - pdf-parse@1.1.1: dependencies: debug: 3.2.7 @@ -16837,8 +17124,12 @@ snapshots: picomatch@2.3.2: {} + picomatch@4.0.2: {} + picomatch@4.0.4: {} + pidtree@0.6.0: {} + pify@4.0.1: {} pirates@4.0.7: {} @@ -16860,6 +17151,15 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.15)(tsx@4.19.4)(yaml@2.8.3): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.4.2 + postcss: 8.5.15 + tsx: 4.19.4 + yaml: 2.8.3 + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.15)(tsx@4.19.4)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 @@ -16967,10 +17267,6 @@ snapshots: proxy-from-env@2.1.0: {} - ps-tree@1.2.0: - dependencies: - event-stream: 3.3.4 - pump@3.0.2: dependencies: end-of-stream: 1.4.4 @@ -16985,10 +17281,6 @@ snapshots: dependencies: side-channel: 1.1.0 - qs@6.15.2: - dependencies: - side-channel: 1.1.0 - quansync@0.2.11: {} queue-microtask@1.2.3: {} @@ -17006,13 +17298,6 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.0 - unpipe: 1.0.0 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -17157,6 +17442,11 @@ snapshots: react@19.2.3: {} + read-package-json-fast@4.0.0: + dependencies: + json-parse-even-better-errors: 4.0.0 + npm-normalize-package-bin: 4.0.0 + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -17441,7 +17731,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -17453,7 +17743,7 @@ snapshots: rtl-css-js@1.16.1: dependencies: - '@babel/runtime': 7.29.7 + '@babel/runtime': 7.28.4 run-applescript@7.0.0: {} @@ -17530,6 +17820,8 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 + seed-random@2.2.0: {} + semver-compare@1.0.0: {} semver@5.7.2: {} @@ -17542,7 +17834,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -17682,7 +17974,7 @@ snapshots: '@kwsites/promise-deferred': 1.1.1 '@simple-git/args-pathspec': 1.0.3 '@simple-git/argv-parser': 1.1.1 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -17734,10 +18026,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - split@0.3.3: - dependencies: - through: 2.3.8 - sprintf-js@1.0.3: {} sprintf-js@1.1.3: {} @@ -17769,15 +18057,11 @@ snapshots: statuses@2.0.1: {} - statuses@2.0.2: {} - std-env@3.10.0: {} - stdin-discarder@0.2.2: {} + std-env@3.9.0: {} - stream-combiner@0.0.4: - dependencies: - duplexer: 0.1.2 + stdin-discarder@0.2.2: {} streamx@2.22.0: dependencies: @@ -17801,13 +18085,13 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.2.0 + strip-ansi: 7.1.2 string-width@7.2.0: dependencies: emoji-regex: 10.4.0 - get-east-asian-width: 1.6.0 - strip-ansi: 7.2.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.2 string-width@8.1.0: dependencies: @@ -17951,7 +18235,7 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/gen-mapping': 0.3.8 commander: 4.1.1 glob: 11.1.0 lines-and-columns: 1.2.4 @@ -18062,16 +18346,21 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - through@2.3.8: {} - tiktoken@1.0.21: {} tinybench@2.9.0: {} tinyexec@0.3.2: {} + tinyexec@1.1.2: {} + tinyexec@1.2.3: {} + tinyglobby@0.2.14: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -18152,13 +18441,41 @@ snapshots: tslib@2.8.1: {} + tsup@8.5.0(jiti@2.4.2)(postcss@8.5.15)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.8.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.28.0) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.1(supports-color@8.1.1) + esbuild: 0.28.0 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.15)(tsx@4.19.4)(yaml@2.8.3) + resolve-from: 5.0.0 + rollup: 4.60.4 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.15 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsup@8.5.0(jiti@2.4.2)(postcss@8.5.15)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.9.0): dependencies: bundle-require: 5.1.0(esbuild@0.28.0) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) esbuild: 0.28.0 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 @@ -18169,7 +18486,7 @@ snapshots: source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.14 tree-kill: 1.2.2 optionalDependencies: postcss: 8.5.15 @@ -18285,6 +18602,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + undici-types@6.21.0: {} undici-types@7.10.0: {} @@ -18463,7 +18782,7 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -18496,13 +18815,35 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3): + vite-node@3.2.4(@types/node@20.17.50)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3): + dependencies: + cac: 6.7.14 + debug: 4.4.1(supports-color@8.1.1) + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 8.0.14(@types/node@20.17.50)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) + transitivePeerDependencies: + - '@types/node' + - '@vitejs/devtools' + - esbuild + - jiti + - less + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-node@3.2.4(@types/node@20.17.57)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0): dependencies: cac: 6.7.14 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) + vite: 8.0.14(@types/node@20.17.57)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' @@ -18521,7 +18862,7 @@ snapshots: vite-node@3.2.4(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0): dependencies: cac: 6.7.14 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) @@ -18543,7 +18884,7 @@ snapshots: vite-node@3.2.4(@types/node@24.2.1)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0): dependencies: cac: 6.7.14 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 8.0.14(@types/node@24.2.1)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) @@ -18562,7 +18903,7 @@ snapshots: - tsx - yaml - vite@8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3): + vite@8.0.14(@types/node@20.17.50)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -18570,13 +18911,28 @@ snapshots: rolldown: 1.0.2 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 20.19.41 + '@types/node': 20.17.50 esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.4.2 tsx: 4.19.4 yaml: 2.8.3 + vite@8.0.14(@types/node@20.17.57)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.2 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 20.17.57 + esbuild: 0.28.0 + fsevents: 2.3.3 + jiti: 2.4.2 + tsx: 4.19.4 + yaml: 2.9.0 + vite@8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 @@ -18607,35 +18963,35 @@ snapshots: tsx: 4.19.4 yaml: 2.9.0 - vitest@3.2.6(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.8.3): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.17.50)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.8.3): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)) - '@vitest/pretty-format': 3.2.6 - '@vitest/runner': 3.2.6 - '@vitest/snapshot': 3.2.6 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@8.0.14(@types/node@20.17.50)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)) + '@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.2.0 - debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.3.0 - magic-string: 0.30.21 + debug: 4.4.1(supports-color@8.1.1) + expect-type: 1.2.1 + magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 3.10.0 + picomatch: 4.0.2 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) - vite-node: 3.2.4(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) + vite: 8.0.14(@types/node@20.17.50)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) + vite-node: 3.2.4(@types/node@20.17.50)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 20.19.41 - '@vitest/ui': 3.2.6(vitest@3.2.6) + '@types/node': 20.17.50 + '@vitest/ui': 3.2.4(vitest@3.2.4) jsdom: 26.1.0 transitivePeerDependencies: - '@vitejs/devtools' @@ -18652,26 +19008,71 @@ snapshots: - tsx - yaml - vitest@3.2.6(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.17.57)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) - '@vitest/pretty-format': 3.2.6 - '@vitest/runner': 3.2.6 - '@vitest/snapshot': 3.2.6 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@8.0.14(@types/node@20.17.57)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(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.2.0 - debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.3.0 - magic-string: 0.30.21 + debug: 4.4.1(supports-color@8.1.1) + expect-type: 1.2.1 + magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 3.10.0 + picomatch: 4.0.2 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 8.0.14(@types/node@20.17.57)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@20.17.57)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 20.17.57 + '@vitest/ui': 3.2.4(vitest@3.2.4) + jsdom: 26.1.0 + transitivePeerDependencies: + - '@vitejs/devtools' + - esbuild + - jiti + - less + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.41)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(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.2.0 + debug: 4.4.1(supports-color@8.1.1) + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 8.0.14(@types/node@20.19.41)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) @@ -18680,7 +19081,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 20.19.41 - '@vitest/ui': 3.2.6(vitest@3.2.6) + '@vitest/ui': 3.2.4(vitest@3.2.4) jsdom: 26.1.0 transitivePeerDependencies: - '@vitejs/devtools' @@ -18697,26 +19098,26 @@ snapshots: - tsx - yaml - vitest@3.2.6(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.6)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(esbuild@0.28.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.4)(yaml@2.9.0): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@8.0.14(@types/node@24.2.1)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) - '@vitest/pretty-format': 3.2.6 - '@vitest/runner': 3.2.6 - '@vitest/snapshot': 3.2.6 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@8.0.14(@types/node@24.2.1)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(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.2.0 - debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.3.0 - magic-string: 0.30.21 + debug: 4.4.1(supports-color@8.1.1) + expect-type: 1.2.1 + magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 3.10.0 + picomatch: 4.0.2 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 8.0.14(@types/node@24.2.1)(esbuild@0.28.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) @@ -18725,7 +19126,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.2.1 - '@vitest/ui': 3.2.6(vitest@3.2.6) + '@vitest/ui': 3.2.4(vitest@3.2.4) jsdom: 26.1.0 transitivePeerDependencies: - '@vitejs/devtools' @@ -18891,6 +19292,10 @@ snapshots: dependencies: isexe: 3.1.5 + which@5.0.0: + dependencies: + isexe: 3.1.1 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -18920,7 +19325,7 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.2.0 + strip-ansi: 7.1.2 wrap-ansi@9.0.0: dependencies: @@ -18940,7 +19345,8 @@ snapshots: ws@8.18.3: {} - ws@8.20.1: {} + ws@8.20.1: + optional: true xml-name-validator@5.0.0: {} @@ -19042,10 +19448,19 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 + zod-to-json-schema@3.24.5(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 + zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.25.76): + dependencies: + typescript: 5.8.3 + zod: 3.25.76 + zod-validation-error@3.4.1(zod@3.25.76): dependencies: zod: 3.25.76 From 0cc4b5007ef59c8bc669f6d54178e3fbbf5a288f Mon Sep 17 00:00:00 2001 From: awschmeder Date: Sun, 7 Jun 2026 16:58:20 -0700 Subject: [PATCH 4/7] fix(terminal): emit exitCode 137 on abort even when stream throws first (race condition) --- .../terminal/ExecaTerminalProcess.ts | 6 ++- .../__tests__/ExecaTerminalProcess.spec.ts | 39 ++++++++++++++++--- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/integrations/terminal/ExecaTerminalProcess.ts b/src/integrations/terminal/ExecaTerminalProcess.ts index 82bdcf8005..37c6a7934d 100644 --- a/src/integrations/terminal/ExecaTerminalProcess.ts +++ b/src/integrations/terminal/ExecaTerminalProcess.ts @@ -96,7 +96,11 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { this.emit("shell_execution_complete", { exitCode: 0 }) } catch (error) { - if (error instanceof ExecaError) { + // If abort() fired and the stream threw before the loop checked this.aborted, + // treat it as a SIGKILL exit rather than a generic error. + if (this.aborted) { + this.emit("shell_execution_complete", { exitCode: 137, signalName: "SIGKILL" }) + } else if (error instanceof ExecaError) { console.error(`[ExecaTerminalProcess#run] shell execution error: ${error.message}`) this.emit("shell_execution_complete", { exitCode: error.exitCode ?? 0, signalName: error.signal }) } else { diff --git a/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts b/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts index 88ef93871a..78404aee81 100644 --- a/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts +++ b/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts @@ -1,17 +1,18 @@ // npx vitest run integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts const mockPid = 12345 -// Declared via vi.hoisted so it is available inside the hoisted vi.mock factory. -const { mockKill } = vitest.hoisted(() => ({ mockKill: vitest.fn() })) +// Declared via vi.hoisted so they are available inside the hoisted vi.mock factory. +const { mockKill, mockIterableFactory } = vitest.hoisted(() => ({ + mockKill: vitest.fn(), + // Default iterable yields one line; tests can replace this to simulate errors. + mockIterableFactory: { current: async function* () { yield "test output\n" } as () => AsyncGenerator }, +})) vitest.mock("execa", () => { const execa = vitest.fn((options: any) => { return (_template: TemplateStringsArray, ...args: any[]) => ({ pid: mockPid, - iterable: (_opts: any) => - (async function* () { - yield "test output\n" - })(), + iterable: (_opts: any) => mockIterableFactory.current(), kill: mockKill, }) }) @@ -193,6 +194,32 @@ describe("ExecaTerminalProcess", () => { expect(killSpy).not.toHaveBeenCalled() killSpy.mockRestore() }) + + it("emits exitCode 137 when the stream throws before the aborted flag is checked (race condition)", async () => { + // Simulate the race: SIGKILL arrives and the iterable throws an ExecaError + // before the for-await loop reads this.aborted and breaks cleanly. + const { ExecaError } = await import("execa") + const throwingError = Object.assign(new ExecaError(), { exitCode: null, signal: "SIGKILL", message: "killed" }) + mockIterableFactory.current = async function* () { + throw throwingError + } + + const killSpy = vitest.spyOn(process, "kill").mockImplementation(() => true) + const completeSpy = vitest.fn() + terminalProcess.on("shell_execution_complete", completeSpy) + + // abort() before run() resolves so this.aborted is true when the catch fires + const runPromise = terminalProcess.run("sleep 30") + await Promise.resolve() + terminalProcess.abort() + await runPromise + + expect(completeSpy).toHaveBeenCalledWith({ exitCode: 137, signalName: "SIGKILL" }) + + // Restore default iterable for subsequent tests + mockIterableFactory.current = async function* () { yield "test output\n" } + killSpy.mockRestore() + }) }) describe("trimRetrievedOutput", () => { From ed297734954b0b1c10d400050973b1cb303531e2 Mon Sep 17 00:00:00 2001 From: awschmeder Date: Sun, 7 Jun 2026 17:01:20 -0700 Subject: [PATCH 5/7] fix(terminal): address CodeRabbit feedback -- fix cleanup on abort path and improve changeset wording --- .changeset/kill-orphaned-child-processes.md | 2 +- src/integrations/terminal/ExecaTerminalProcess.ts | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.changeset/kill-orphaned-child-processes.md b/.changeset/kill-orphaned-child-processes.md index 225e82a621..02b050984d 100644 --- a/.changeset/kill-orphaned-child-processes.md +++ b/.changeset/kill-orphaned-child-processes.md @@ -2,4 +2,4 @@ "zoo-code": patch --- -fix(terminal): kill entire process group on Stop so child commands (e.g. `sleep 30`) are not orphaned and allowed to continue running after user clicked 'Stop'. +fix(terminal): kill entire process group on Stop so child commands (e.g. `sleep 30`) are also killed when the user clicks 'Stop', rather than the shell waiting for them to finish. diff --git a/src/integrations/terminal/ExecaTerminalProcess.ts b/src/integrations/terminal/ExecaTerminalProcess.ts index 37c6a7934d..b8460eb4b7 100644 --- a/src/integrations/terminal/ExecaTerminalProcess.ts +++ b/src/integrations/terminal/ExecaTerminalProcess.ts @@ -81,20 +81,19 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { this.startHotTimer(line) } - if (this.aborted) { + if (this.aborted) { try { await this.subprocess } catch (error) { // Expected: process was killed by abort(); swallow the error. } - // emit signal 128 + 9 (SIGKILL) to match conventional shell exit code so - // the front-end correctly detects a non-normal exit + // 128 + 9 (SIGKILL) mirrors the conventional shell exit code so the + // UI indicator correctly shows a non-zero (red) exit. this.emit("shell_execution_complete", { exitCode: 137, signalName: "SIGKILL" }) - return + } else { + this.emit("shell_execution_complete", { exitCode: 0 }) } - - this.emit("shell_execution_complete", { exitCode: 0 }) } catch (error) { // If abort() fired and the stream threw before the loop checked this.aborted, // treat it as a SIGKILL exit rather than a generic error. From cd4af7a77714ce5c41eab89eaaad1b7c8dd74e45 Mon Sep 17 00:00:00 2001 From: awschmeder Date: Sun, 7 Jun 2026 23:11:58 -0700 Subject: [PATCH 6/7] fix(terminal): add Windows process-tree kill via taskkill /F /T on abort On Windows, process.kill(-pid) is not available (POSIX-only). Add a platform guard in abort() that uses spawnSync taskkill /F /T /PID to kill the full process tree (shell + all child commands) on win32. Adds child_process mock and platform-guarded Windows unit tests (skipped on non-win32). --- .../terminal/ExecaTerminalProcess.ts | 49 ++++++++++++++----- .../__tests__/ExecaTerminalProcess.spec.ts | 34 ++++++++++++- 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/src/integrations/terminal/ExecaTerminalProcess.ts b/src/integrations/terminal/ExecaTerminalProcess.ts index b8460eb4b7..dd1c199638 100644 --- a/src/integrations/terminal/ExecaTerminalProcess.ts +++ b/src/integrations/terminal/ExecaTerminalProcess.ts @@ -1,3 +1,5 @@ +import { spawnSync } from "child_process" + import { execa, ExecaError } from "execa" import process from "process" @@ -133,23 +135,44 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { return } - // Kill the entire process group (shell + all child commands) with - // SIGKILL. Using a negative PID sends the signal to every process in - // the group, so child commands are not orphaned. Requires 'detached'. - try { - process.kill(-this.pid, "SIGKILL") - } catch (e) { - console.warn( - `[ExecaTerminalProcess#abort] Failed to kill process group -${this.pid}: ${e instanceof Error ? e.message : String(e)}`, - ) + if (process.platform === "win32") { + // On Windows, taskkill /F /T kills the entire process tree (shell + all + // child commands), since negative-PID group kill is a POSIX-only concept. + try { + spawnSync("taskkill", ["/F", "/T", "/PID", String(this.pid)]) + } catch (e) { + console.warn( + `[ExecaTerminalProcess#abort] taskkill failed for PID ${this.pid}: ${e instanceof Error ? e.message : String(e)}`, + ) - // Fall back to killing the subprocess directly if process group kill fails. + // Fall back to killing the subprocess directly. + try { + this.subprocess?.kill("SIGKILL") + } catch (e2) { + console.warn( + `[ExecaTerminalProcess#abort] Fallback kill also failed: ${e2 instanceof Error ? e2.message : String(e2)}`, + ) + } + } + } else { + // POSIX: kill the entire process group (shell + all child commands) with + // SIGKILL. Using a negative PID sends the signal to every process in + // the group, so child commands are not orphaned. Requires 'detached'. try { - this.subprocess?.kill("SIGKILL") - } catch (e2) { + process.kill(-this.pid, "SIGKILL") + } catch (e) { console.warn( - `[ExecaTerminalProcess#abort] Fallback kill also failed: ${e2 instanceof Error ? e2.message : String(e2)}`, + `[ExecaTerminalProcess#abort] Failed to kill process group -${this.pid}: ${e instanceof Error ? e.message : String(e)}`, ) + + // Fall back to killing the subprocess directly if process group kill fails. + try { + this.subprocess?.kill("SIGKILL") + } catch (e2) { + console.warn( + `[ExecaTerminalProcess#abort] Fallback kill also failed: ${e2 instanceof Error ? e2.message : String(e2)}`, + ) + } } } } diff --git a/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts b/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts index 78404aee81..e7b871cae8 100644 --- a/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts +++ b/src/integrations/terminal/__tests__/ExecaTerminalProcess.spec.ts @@ -2,12 +2,17 @@ const mockPid = 12345 // Declared via vi.hoisted so they are available inside the hoisted vi.mock factory. -const { mockKill, mockIterableFactory } = vitest.hoisted(() => ({ +const { mockKill, mockSpawnSync, mockIterableFactory } = vitest.hoisted(() => ({ mockKill: vitest.fn(), + mockSpawnSync: vitest.fn().mockReturnValue({ status: 0 }), // Default iterable yields one line; tests can replace this to simulate errors. mockIterableFactory: { current: async function* () { yield "test output\n" } as () => AsyncGenerator }, })) +vitest.mock("child_process", () => ({ + spawnSync: mockSpawnSync, +})) + vitest.mock("execa", () => { const execa = vitest.fn((options: any) => { return (_template: TemplateStringsArray, ...args: any[]) => ({ @@ -222,6 +227,33 @@ describe("ExecaTerminalProcess", () => { }) }) + describe("abort (Windows)", () => { + const isWindows = process.platform === "win32" + const describeWindows = isWindows ? describe : describe.skip + + describeWindows("on win32", () => { + it("kills the process tree via taskkill /F /T so child processes are not orphaned", async () => { + const runPromise = terminalProcess.run("sleep 30") + await Promise.resolve() + terminalProcess.abort() + await runPromise + + expect(mockSpawnSync).toHaveBeenCalledWith("taskkill", ["/F", "/T", "/PID", String(mockPid)]) + }) + + it("falls back to subprocess.kill when taskkill throws", async () => { + mockSpawnSync.mockImplementationOnce(() => { throw new Error("not found") }) + + const runPromise = terminalProcess.run("sleep 30") + await Promise.resolve() + terminalProcess.abort() + await runPromise + + expect(mockKill).toHaveBeenCalledWith("SIGKILL") + }) + }) + }) + describe("trimRetrievedOutput", () => { it("clears buffer when all output has been retrieved", () => { // Set up a scenario where all output has been retrieved From ed7c400acbdfe5077741cdc2f3a2b8f386586e4d Mon Sep 17 00:00:00 2001 From: awschmeder Date: Mon, 8 Jun 2026 07:14:03 -0700 Subject: [PATCH 7/7] fix(terminal): skip detached on Windows to prevent console-window flash --- src/integrations/terminal/ExecaTerminalProcess.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/integrations/terminal/ExecaTerminalProcess.ts b/src/integrations/terminal/ExecaTerminalProcess.ts index dd1c199638..a03c97f715 100644 --- a/src/integrations/terminal/ExecaTerminalProcess.ts +++ b/src/integrations/terminal/ExecaTerminalProcess.ts @@ -44,7 +44,15 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { cwd: this.terminal.getCurrentWorkingDirectory(), all: true, stdin: "ignore", - detached: true, + // On POSIX, detached: true puts the child in its own process group so + // abort() can send SIGKILL to the entire group via process.kill(-pid). + // On Windows, detached: true causes a console-window flash that + // windowsHide cannot reliably suppress (the OS allocates the window + // before the hide flag is fully processed). + // We omit detached on Windows; Windows abort() uses `taskkill /F /T` instead, + // which walks the PPID tree via Windows APIs and does not + // require the child to be in a detached state. + detached: process.platform !== "win32", env: { ...process.env, // Ensure UTF-8 encoding for Ruby, CocoaPods, etc.