From 8bc3d7b0a5895f4d4005ace3d590e7ffbc3c83ea Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Mon, 8 Jun 2026 15:19:27 -0700 Subject: [PATCH] FN-6042: raise dependency security floors Harden dependency floors and update the Vitest toolchain to patched releases. - upgrade workspace vitest and @vitest/coverage-v8 dependencies to the 4.1 line across packages and plugins - pin transitive protobufjs via pnpm overrides and lockfile updates to patched versions - adapt Vitest configs, engine test helpers, and security-floor coverage for the new dependency baselines - add the published CLI changeset and related workspace/package metadata updates included in the task branch Files changed: .changeset/fn-6042-security-dependencies.md | 5 + AGENTS.md | 4 + Dockerfile | 3 + docs/PLUGIN_AUTHORING.md | 2 - package.json | 3 +- packages/cli/package.json | 4 +- packages/cli/vitest.config.ts | 2 +- packages/core/package.json | 4 +- packages/core/vitest.config.ts | 2 +- packages/dashboard/app/test/mockApi.ts | 4 +- packages/dashboard/package.json | 4 +- packages/dashboard/vitest.config.ts | 2 +- packages/desktop/package.json | 4 +- packages/desktop/vitest.config.ts | 2 +- packages/droid-cli/package.json | 2 +- packages/droid-cli/vitest.config.ts | 2 +- packages/engine/package.json | 4 +- .../engine/src/__tests__/executor-test-helpers.ts | 29 +- .../engine/src/__tests__/gridlock-detector.test.ts | 5 +- .../src/__tests__/heartbeat-scheduler.test.ts | 3 +- packages/engine/src/__tests__/scheduler.test.ts | 24 +- packages/engine/src/__tests__/self-healing.test.ts | 5 + packages/engine/tsconfig.json | 3 +- packages/engine/vitest.config.ts | 10 +- packages/i18n/package.json | 2 +- packages/i18n/vitest.config.ts | 7 + packages/mobile/package.json | 2 +- packages/mobile/vitest.config.ts | 2 +- packages/pi-claude-cli/package.json | 2 +- packages/pi-claude-cli/vitest.config.ts | 2 +- packages/pi-llama-cpp/package.json | 2 +- packages/pi-llama-cpp/vitest.config.ts | 2 +- packages/plugin-sdk/package.json | 2 +- packages/plugin-sdk/vitest.config.ts | 2 +- .../examples/fusion-plugin-auto-label/package.json | 2 +- .../fusion-plugin-auto-label/vitest.config.ts | 2 +- .../examples/fusion-plugin-ci-status/package.json | 2 +- .../fusion-plugin-ci-status/vitest.config.ts | 2 +- .../fusion-plugin-notification/package.json | 2 +- .../fusion-plugin-notification/vitest.config.ts | 2 +- .../fusion-plugin-settings-demo/package.json | 2 +- .../fusion-plugin-settings-demo/vitest.config.ts | 2 +- plugins/fusion-plugin-acp-runtime/package.json | 2 +- plugins/fusion-plugin-acp-runtime/vitest.config.ts | 2 +- plugins/fusion-plugin-agent-browser/package.json | 2 +- .../fusion-plugin-agent-browser/vitest.config.ts | 2 +- .../fusion-plugin-cli-printing-press/package.json | 2 +- .../vitest.config.ts | 2 +- .../package.json | 2 +- .../src/__tests__/orchestrator-live-output.test.ts | 4 +- .../vitest.config.ts | 2 +- plugins/fusion-plugin-cursor-runtime/package.json | 4 +- .../fusion-plugin-dependency-graph/package.json | 4 +- .../vitest.config.ts | 2 +- plugins/fusion-plugin-droid-runtime/package.json | 2 +- .../fusion-plugin-droid-runtime/vitest.config.ts | 2 +- plugins/fusion-plugin-even-cards/package.json | 2 +- plugins/fusion-plugin-even-cards/vitest.config.ts | 2 +- .../package.json | 2 +- .../vitest.config.ts | 2 +- plugins/fusion-plugin-hermes-runtime/package.json | 2 +- .../fusion-plugin-hermes-runtime/vitest.config.ts | 2 +- .../fusion-plugin-openclaw-runtime/package.json | 2 +- .../vitest.config.ts | 2 +- .../fusion-plugin-paperclip-runtime/package.json | 2 +- .../vitest.config.ts | 2 +- plugins/fusion-plugin-reports/package.json | 2 +- .../src/__tests__/review-panel.test.ts | 6 +- plugins/fusion-plugin-reports/vitest.config.ts | 2 +- plugins/fusion-plugin-roadmap/package.json | 2 +- plugins/fusion-plugin-roadmap/vitest.config.ts | 2 +- plugins/fusion-plugin-whatsapp-chat/package.json | 2 +- .../fusion-plugin-whatsapp-chat/vitest.config.ts | 2 +- pnpm-lock.yaml | 626 ++++++++------------- .../__tests__/dependency-security-floor.test.mjs | 95 ++++ 75 files changed, 475 insertions(+), 491 deletions(-) Fusion-Task-Id: FN-6042 Fusion-Task-Lineage: fff6a1cb-8937-435c-9a91-b7c7a59cc80e --- .changeset/fn-6042-security-dependencies.md | 5 + AGENTS.md | 4 + Dockerfile | 3 + docs/PLUGIN_AUTHORING.md | 2 - package.json | 3 +- packages/cli/package.json | 4 +- packages/cli/vitest.config.ts | 2 +- packages/core/package.json | 4 +- packages/core/vitest.config.ts | 2 +- packages/dashboard/app/test/mockApi.ts | 4 +- packages/dashboard/package.json | 4 +- packages/dashboard/vitest.config.ts | 2 +- packages/desktop/package.json | 4 +- packages/desktop/vitest.config.ts | 2 +- packages/droid-cli/package.json | 2 +- packages/droid-cli/vitest.config.ts | 2 +- packages/engine/package.json | 4 +- .../src/__tests__/executor-test-helpers.ts | 29 +- .../src/__tests__/gridlock-detector.test.ts | 5 +- .../src/__tests__/heartbeat-scheduler.test.ts | 3 +- .../engine/src/__tests__/scheduler.test.ts | 24 +- .../engine/src/__tests__/self-healing.test.ts | 5 + packages/engine/tsconfig.json | 3 +- packages/engine/vitest.config.ts | 10 +- packages/i18n/package.json | 2 +- packages/i18n/vitest.config.ts | 7 + packages/mobile/package.json | 2 +- packages/mobile/vitest.config.ts | 2 +- packages/pi-claude-cli/package.json | 2 +- packages/pi-claude-cli/vitest.config.ts | 2 +- packages/pi-llama-cpp/package.json | 2 +- packages/pi-llama-cpp/vitest.config.ts | 2 +- packages/plugin-sdk/package.json | 2 +- packages/plugin-sdk/vitest.config.ts | 2 +- .../fusion-plugin-auto-label/package.json | 2 +- .../fusion-plugin-auto-label/vitest.config.ts | 2 +- .../fusion-plugin-ci-status/package.json | 2 +- .../fusion-plugin-ci-status/vitest.config.ts | 2 +- .../fusion-plugin-notification/package.json | 2 +- .../vitest.config.ts | 2 +- .../fusion-plugin-settings-demo/package.json | 2 +- .../vitest.config.ts | 2 +- .../fusion-plugin-acp-runtime/package.json | 2 +- .../vitest.config.ts | 2 +- .../fusion-plugin-agent-browser/package.json | 2 +- .../vitest.config.ts | 2 +- .../package.json | 2 +- .../vitest.config.ts | 2 +- .../package.json | 2 +- .../orchestrator-live-output.test.ts | 4 +- .../vitest.config.ts | 2 +- .../fusion-plugin-cursor-runtime/package.json | 4 +- .../package.json | 4 +- .../vitest.config.ts | 2 +- .../fusion-plugin-droid-runtime/package.json | 2 +- .../vitest.config.ts | 2 +- plugins/fusion-plugin-even-cards/package.json | 2 +- .../fusion-plugin-even-cards/vitest.config.ts | 2 +- .../package.json | 2 +- .../vitest.config.ts | 2 +- .../fusion-plugin-hermes-runtime/package.json | 2 +- .../vitest.config.ts | 2 +- .../package.json | 2 +- .../vitest.config.ts | 2 +- .../package.json | 2 +- .../vitest.config.ts | 2 +- plugins/fusion-plugin-reports/package.json | 2 +- .../src/__tests__/review-panel.test.ts | 6 +- .../fusion-plugin-reports/vitest.config.ts | 2 +- plugins/fusion-plugin-roadmap/package.json | 2 +- .../fusion-plugin-roadmap/vitest.config.ts | 2 +- .../fusion-plugin-whatsapp-chat/package.json | 2 +- .../vitest.config.ts | 2 +- pnpm-lock.yaml | 626 +++++++----------- .../dependency-security-floor.test.mjs | 95 +++ 75 files changed, 475 insertions(+), 491 deletions(-) create mode 100644 .changeset/fn-6042-security-dependencies.md create mode 100644 scripts/__tests__/dependency-security-floor.test.mjs diff --git a/.changeset/fn-6042-security-dependencies.md b/.changeset/fn-6042-security-dependencies.md new file mode 100644 index 0000000000..977e0d9b9f --- /dev/null +++ b/.changeset/fn-6042-security-dependencies.md @@ -0,0 +1,5 @@ +--- +"@runfusion/fusion": patch +--- + +Harden dependency security floors by forcing protobufjs resolutions to patched versions and upgrading Vitest tooling to the patched 4.1 line. diff --git a/AGENTS.md b/AGENTS.md index b5a7843366..9ccf624a0b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,6 +2,10 @@ ## Essential rules +### STANDING DIRECTIVE: Buttons Are Frozen + +Buttons Are Frozen (2026-05-13): do not rename, remove, reorder, or restyle established dashboard action buttons unless the task explicitly targets that button contract. Preserve icon affordances and width-aware labels when making adjacent UI changes. + ### Spec Generation Hygiene - Do not cite `.fusion/tasks//` paths in Context/Steps/File Scope unless the file already exists, is explicitly created as a `(new)` Artifact, or is sibling `PROMPT.md`/`task.json`/`attachments/*`. diff --git a/Dockerfile b/Dockerfile index ee05b32717..a2bdb7fefc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,7 @@ COPY packages/dashboard/package.json ./packages/dashboard/package.json COPY packages/desktop/package.json ./packages/desktop/package.json COPY packages/droid-cli/package.json ./packages/droid-cli/package.json COPY packages/engine/package.json ./packages/engine/package.json +COPY packages/i18n/package.json ./packages/i18n/package.json COPY packages/mobile/package.json ./packages/mobile/package.json COPY packages/pi-claude-cli/package.json ./packages/pi-claude-cli/package.json COPY packages/pi-llama-cpp/package.json ./packages/pi-llama-cpp/package.json @@ -25,6 +26,8 @@ COPY plugins/examples/fusion-plugin-auto-label/package.json ./plugins/examples/f COPY plugins/examples/fusion-plugin-ci-status/package.json ./plugins/examples/fusion-plugin-ci-status/package.json COPY plugins/examples/fusion-plugin-notification/package.json ./plugins/examples/fusion-plugin-notification/package.json COPY plugins/examples/fusion-plugin-settings-demo/package.json ./plugins/examples/fusion-plugin-settings-demo/package.json +COPY plugins/fusion-plugin-acp-runtime/package.json ./plugins/fusion-plugin-acp-runtime/package.json +COPY plugins/fusion-plugin-compound-engineering/package.json ./plugins/fusion-plugin-compound-engineering/package.json COPY plugins/fusion-plugin-paperclip-runtime/package.json ./plugins/fusion-plugin-paperclip-runtime/package.json COPY plugins/fusion-plugin-dependency-graph/package.json ./plugins/fusion-plugin-dependency-graph/package.json COPY plugins/fusion-plugin-cli-printing-press/package.json ./plugins/fusion-plugin-cli-printing-press/package.json diff --git a/docs/PLUGIN_AUTHORING.md b/docs/PLUGIN_AUTHORING.md index 24b2f8e315..edef869f43 100644 --- a/docs/PLUGIN_AUTHORING.md +++ b/docs/PLUGIN_AUTHORING.md @@ -20,8 +20,6 @@ A comprehensive guide to creating Fusion plugins that extend the task board with 14. [Example Plugins](#14-example-plugins) 15. [Registering Skills](#15-registering-skills) 16. [Registering Workflow Steps](#16-registering-workflow-steps) -16.5. [Contributing Column Traits](#165-contributing-column-traits) -16.6. [Contributing Workflow Extensions](#166-contributing-workflow-extensions) 17. [Contributing Prompt Modifications](#17-contributing-prompt-modifications) 18. [Plugin Binary Setup Hooks](#18-plugin-binary-setup-hooks) diff --git a/package.json b/package.json index 24269b677d..a73f361462 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,8 @@ "protobufjs" ], "overrides": { - "@types/node": "^25.5.2" + "@types/node": "^25.5.2", + "protobufjs": "^7.5.8" } }, "devDependencies": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 3a3c9d188d..e67eb5a24a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -98,7 +98,7 @@ "@types/node": "^22.0.0", "@types/react": "^19.2.0", "@types/ws": "^8.5.0", - "@vitest/coverage-v8": "^3.1.0", + "@vitest/coverage-v8": "^4.1.0", "cross-env": "^7.0.0", "esbuild": "^0.25.12", "ink-testing-library": "^4.0.0", @@ -106,7 +106,7 @@ "tsx": "^4.19.0", "typebox": "^1.0.0", "typescript": "^5.7.0", - "vitest": "^3.1.0", + "vitest": "^4.1.0", "yaml": "^2.8.3" }, "repository": { diff --git a/packages/cli/vitest.config.ts b/packages/cli/vitest.config.ts index 299fc8f6d9..eb1c0cebc6 100644 --- a/packages/cli/vitest.config.ts +++ b/packages/cli/vitest.config.ts @@ -52,7 +52,7 @@ export default defineConfig({ globalSetup: [resolve(__dirname, "../core/src/__test-utils__/vitest-teardown.ts")], pool: "forks", maxWorkers, - poolOptions: { forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, fileParallelism: true, coverage: { enabled: false, diff --git a/packages/core/package.json b/packages/core/package.json index c15c8fef71..38f59ae42c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -40,9 +40,9 @@ "devDependencies": { "@types/dockerode": "^3.3.41", "@types/node": "^25.5.0", - "@vitest/coverage-v8": "^3.1.0", + "@vitest/coverage-v8": "^4.1.0", "typescript": "^5.7.0", - "vitest": "^3.1.0" + "vitest": "^4.1.0" }, "engines": { "node": ">=22.5.0" diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts index a67dbb548f..468dba67ac 100644 --- a/packages/core/vitest.config.ts +++ b/packages/core/vitest.config.ts @@ -28,7 +28,7 @@ export default defineConfig({ // and cannot safely share mutable process state under worker_threads. pool: "forks", maxWorkers, - poolOptions: { forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, fileParallelism: true, // Core runs a large SQLite-heavy suite while other workspace packages test concurrently. // Use a slightly higher timeout to reduce nondeterministic slow-machine flakes. diff --git a/packages/dashboard/app/test/mockApi.ts b/packages/dashboard/app/test/mockApi.ts index bfdcaac321..86db226fc4 100644 --- a/packages/dashboard/app/test/mockApi.ts +++ b/packages/dashboard/app/test/mockApi.ts @@ -24,7 +24,7 @@ function getFallback(name: string): AnyFn { return fallbackFns.get(name)!; } -export const dashboardApiMocks = { +export const dashboardApiMocks: Record = { fetchTasks: vi.fn(async () => []), fetchSettings: vi.fn(async () => ({})), updateSettings: vi.fn(async () => ({})), @@ -34,7 +34,7 @@ export const dashboardApiMocks = { fetchTaskDetail: vi.fn(), fetchTaskReview: vi.fn(), fetchUnreadCount: vi.fn(async () => ({ unreadCount: 0 })), -} satisfies Record; +}; export async function createDashboardApiMock( importActual: () => Promise, diff --git a/packages/dashboard/package.json b/packages/dashboard/package.json index 6b0d70f4df..c3be9b89a0 100644 --- a/packages/dashboard/package.json +++ b/packages/dashboard/package.json @@ -147,12 +147,12 @@ "@types/react-dom": "^19.0.0", "@types/ws": "^8.5.0", "@vitejs/plugin-react": "^4.3.0", - "@vitest/coverage-v8": "^3.1.0", + "@vitest/coverage-v8": "^4.1.0", "jsdom": "^29.0.1", "tinyrainbow": "^2.0.0", "typescript": "^5.7.0", "vite": "^6.0.0", - "vitest": "^3.1.0" + "vitest": "^4.1.0" }, "private": true } diff --git a/packages/dashboard/vitest.config.ts b/packages/dashboard/vitest.config.ts index 2f4612b990..f7ac1f7df2 100644 --- a/packages/dashboard/vitest.config.ts +++ b/packages/dashboard/vitest.config.ts @@ -316,7 +316,7 @@ export default defineConfig({ // React suites; forks duplicated the entire renderer per worker (~500MB). pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers } }, + minWorkers: 1, fileParallelism: true, isolate: true, // Dashboard route and integration-heavy suites can exceed the Vitest diff --git a/packages/desktop/package.json b/packages/desktop/package.json index f52eef8575..b08889b772 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -46,7 +46,7 @@ "@types/node": "^22.0.0", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", - "@vitest/coverage-v8": "^3.1.0", + "@vitest/coverage-v8": "^4.1.0", "electron": "^35.0.0", "electron-builder": "^26.0.0", "esbuild": "^0.25.12", @@ -57,6 +57,6 @@ "tsx": "^4.19.0", "typescript": "^5.7.0", "vite": "^6.0.0", - "vitest": "^3.1.0" + "vitest": "^4.1.0" } } diff --git a/packages/desktop/vitest.config.ts b/packages/desktop/vitest.config.ts index 94506be04c..3f4a7c2f79 100644 --- a/packages/desktop/vitest.config.ts +++ b/packages/desktop/vitest.config.ts @@ -20,7 +20,7 @@ export default defineConfig({ hookTimeout: 30_000, pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers } }, + minWorkers: 1, fileParallelism: true, passWithNoTests: true, projects: [ diff --git a/packages/droid-cli/package.json b/packages/droid-cli/package.json index 62e17f737b..48e08f13b7 100644 --- a/packages/droid-cli/package.json +++ b/packages/droid-cli/package.json @@ -31,7 +31,7 @@ "devDependencies": { "@types/node": "^22.0.0", "typescript": "^5.7.0", - "vitest": "^3.0.0" + "vitest": "^4.1.0" }, "scripts": { "test": "vitest run --reporter=dot", diff --git a/packages/droid-cli/vitest.config.ts b/packages/droid-cli/vitest.config.ts index 3b79f6ad20..741b01e3bc 100644 --- a/packages/droid-cli/vitest.config.ts +++ b/packages/droid-cli/vitest.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ globalSetup: [resolve(__dirname, "../core/src/__test-utils__/vitest-teardown.ts")], pool: "forks", maxWorkers, - poolOptions: { forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, fileParallelism: true, coverage: { provider: "v8", diff --git a/packages/engine/package.json b/packages/engine/package.json index e2d1c51697..46e289d640 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -52,9 +52,9 @@ "@modelcontextprotocol/sdk": "^1.0.0", "@types/node": "^25.5.0", "@types/proper-lockfile": "^4.1.4", - "@vitest/coverage-v8": "^3.1.0", + "@vitest/coverage-v8": "^4.1.0", "typescript": "^5.7.0", - "vitest": "^3.1.0" + "vitest": "^4.1.0" }, "private": true } diff --git a/packages/engine/src/__tests__/executor-test-helpers.ts b/packages/engine/src/__tests__/executor-test-helpers.ts index a6fd6d1431..74a6d33642 100644 --- a/packages/engine/src/__tests__/executor-test-helpers.ts +++ b/packages/engine/src/__tests__/executor-test-helpers.ts @@ -1,4 +1,5 @@ import { vi } from "vitest"; +import type { Mock } from "vitest"; import { installTaskWorktreeIdentityGuard } from "../worktree-hooks.js"; // Mock external dependencies @@ -220,16 +221,18 @@ vi.mock("node:fs", () => ({ realpathSync: vi.fn((path: string) => path), })); -export const mockExecuteAll = vi.fn().mockResolvedValue([]); -export const mockTerminateAllSessions = vi.fn().mockResolvedValue(undefined); -export const mockCleanup = vi.fn().mockResolvedValue(undefined); +export const mockExecuteAll: Mock<() => Promise> = vi.fn().mockResolvedValue([]); +export const mockTerminateAllSessions: Mock<() => Promise> = vi.fn().mockResolvedValue(undefined); +export const mockCleanup: Mock<() => Promise> = vi.fn().mockResolvedValue(undefined); vi.mock("../step-session-executor.js", () => ({ - StepSessionExecutor: vi.fn().mockImplementation(() => ({ - executeAll: mockExecuteAll, - terminateAllSessions: mockTerminateAllSessions, - cleanup: mockCleanup, - })), + StepSessionExecutor: vi.fn().mockImplementation(function () { + return { + executeAll: mockExecuteAll, + terminateAllSessions: mockTerminateAllSessions, + cleanup: mockCleanup, + }; + }), })); vi.mock("../rate-limit-retry.js", () => ({ @@ -257,10 +260,12 @@ vi.mock("@earendil-works/pi-coding-agent", () => { open: vi.fn().mockReturnValue(mockSessionManager), inMemory: vi.fn().mockReturnValue(mockSessionManager), }, - ModelRegistry: vi.fn().mockImplementation(() => ({ - find: vi.fn(), - refresh: vi.fn(), - })), + ModelRegistry: vi.fn().mockImplementation(function () { + return { + find: vi.fn(), + refresh: vi.fn(), + }; + }), AuthStorage: { create: vi.fn().mockReturnValue({}), }, diff --git a/packages/engine/src/__tests__/gridlock-detector.test.ts b/packages/engine/src/__tests__/gridlock-detector.test.ts index c201e52f85..aabcf24ef0 100644 --- a/packages/engine/src/__tests__/gridlock-detector.test.ts +++ b/packages/engine/src/__tests__/gridlock-detector.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import type { Settings, Task, TaskStore } from "@fusion/core"; import { GridlockDetector } from "../gridlock-detector.js"; +import type { GridlockEvent } from "../gridlock-detector.js"; function createTask(id: string, overrides: Partial = {}): Task { return { @@ -34,8 +35,8 @@ describe("GridlockDetector", () => { let tasks: Task[]; let settings: Settings; let scopes: Record; - let onGridlock: ReturnType; - let onGridlockCleared: ReturnType; + let onGridlock: ReturnType void>>; + let onGridlockCleared: ReturnType void>>; let store: TaskStore; let detector: GridlockDetector; diff --git a/packages/engine/src/__tests__/heartbeat-scheduler.test.ts b/packages/engine/src/__tests__/heartbeat-scheduler.test.ts index 16264853d3..f9857710c8 100644 --- a/packages/engine/src/__tests__/heartbeat-scheduler.test.ts +++ b/packages/engine/src/__tests__/heartbeat-scheduler.test.ts @@ -4,6 +4,7 @@ import { HeartbeatMonitor, HeartbeatTriggerScheduler, } from "../agent-heartbeat.js"; +import type { TriggerCallback } from "../agent-heartbeat.js"; import type { AgentStore, TaskStore, Agent } from "@fusion/core"; import { createBudgetStatus } from "./heartbeat-test-helpers.js"; vi.mock("../logger.js", async () => { @@ -18,7 +19,7 @@ import { heartbeatLog } from "../logger.js"; describe("HeartbeatTriggerScheduler", () => { let store: AgentStore; - let callback: ReturnType; + let callback: ReturnType>; let scheduler: import("../agent-heartbeat.js").HeartbeatTriggerScheduler; beforeEach(() => { diff --git a/packages/engine/src/__tests__/scheduler.test.ts b/packages/engine/src/__tests__/scheduler.test.ts index b07223c40b..0f89d9f09d 100644 --- a/packages/engine/src/__tests__/scheduler.test.ts +++ b/packages/engine/src/__tests__/scheduler.test.ts @@ -52,21 +52,27 @@ vi.mock("../logger.js", () => ({ })); vi.mock("../stale-task-reporter.js", () => ({ - StaleTaskReporter: vi.fn().mockImplementation(() => ({ - report: staleReporterReportMock, - })), + StaleTaskReporter: vi.fn().mockImplementation(function () { + return { + report: staleReporterReportMock, + }; + }), })); vi.mock("../backlog-pressure-reporter.js", () => ({ - BacklogPressureReporter: vi.fn().mockImplementation(() => ({ - report: backlogPressureReporterReportMock, - })), + BacklogPressureReporter: vi.fn().mockImplementation(function () { + return { + report: backlogPressureReporterReportMock, + }; + }), })); vi.mock("../unlinked-missions-advisory-reporter.js", () => ({ - UnlinkedMissionsAdvisoryReporter: vi.fn().mockImplementation(() => ({ - report: unlinkedMissionsAdvisoryReporterReportMock, - })), + UnlinkedMissionsAdvisoryReporter: vi.fn().mockImplementation(function () { + return { + report: unlinkedMissionsAdvisoryReporterReportMock, + }; + }), })); // Helper to create mock tasks diff --git a/packages/engine/src/__tests__/self-healing.test.ts b/packages/engine/src/__tests__/self-healing.test.ts index f6f18f0e63..7761a2b276 100644 --- a/packages/engine/src/__tests__/self-healing.test.ts +++ b/packages/engine/src/__tests__/self-healing.test.ts @@ -7891,6 +7891,11 @@ describe("SelfHealingManager reclaimSelfOwnedBranchConflicts", () => { mockedIsUsableTaskWorktree.mockResolvedValue(true); }); + afterEach(() => { + manager.stop(); + vi.restoreAllMocks(); + }); + it("reclaims fully-subsumed branch conflicts and emits subsumed audit metadata", async () => { store = createMockStore({ getSettings: vi.fn().mockResolvedValue({ globalPause: false, enginePaused: false } as any), diff --git a/packages/engine/tsconfig.json b/packages/engine/tsconfig.json index 6a3abdd9a5..6742c7694e 100644 --- a/packages/engine/tsconfig.json +++ b/packages/engine/tsconfig.json @@ -9,5 +9,6 @@ "node-pty": ["./src/types/node-pty/index.d.ts"] } }, - "include": ["src/**/*"] + "include": ["src/**/*"], + "exclude": ["src/__tests__/**/*"] } diff --git a/packages/engine/vitest.config.ts b/packages/engine/vitest.config.ts index 2c3511a630..3478d16eda 100644 --- a/packages/engine/vitest.config.ts +++ b/packages/engine/vitest.config.ts @@ -21,7 +21,7 @@ export default defineConfig({ globalSetup: [resolve(__dirname, "../core/src/__test-utils__/vitest-teardown.ts")], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers } }, + minWorkers: 1, fileParallelism: true, // Enable isolate to allow parallel execution of tests with conflicting mocks isolate: true, @@ -117,7 +117,9 @@ export default defineConfig({ // SQLite rowid interleaving (e.g. FN-5521 hit // `expected 24 to be less than 19` in merge-reuse-task-worktree). // Serialize at the file level; within-file order is already linear. - poolOptions: { threads: { singleThread: true } }, + minWorkers: 1, + maxWorkers: 1, + fileParallelism: false, }, }, { @@ -130,7 +132,9 @@ export default defineConfig({ // and inflating wall time further. Excluded from the default // `pnpm test` lane; run via `pnpm test:slow` / `pnpm test:all`. include: ["src/**/*.slow.test.ts"], - poolOptions: { threads: { singleThread: true } }, + minWorkers: 1, + maxWorkers: 1, + fileParallelism: false, }, }, ], diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 5f05137e5a..9e528b97ce 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -28,7 +28,7 @@ "devDependencies": { "@types/node": "^25.5.0", "typescript": "^5.7.0", - "vitest": "^3.1.0" + "vitest": "^4.1.0" }, "engines": { "node": ">=22.5.0" diff --git a/packages/i18n/vitest.config.ts b/packages/i18n/vitest.config.ts index 3d2ce17782..6f543838a1 100644 --- a/packages/i18n/vitest.config.ts +++ b/packages/i18n/vitest.config.ts @@ -1,5 +1,8 @@ import { resolve } from "node:path"; import { defineConfig } from "vitest/config"; +import { computeMaxWorkers } from "../core/src/__test-utils__/vitest-workers"; + +const maxWorkers = computeMaxWorkers(); export default defineConfig({ resolve: { @@ -10,5 +13,9 @@ export default defineConfig({ }, test: { include: ["src/**/*.test.ts"], + setupFiles: ["../core/src/__test-utils__/vitest-setup.ts"], + globalSetup: ["../core/src/__test-utils__/vitest-teardown.ts"], + maxWorkers, + minWorkers: 1, }, }); diff --git a/packages/mobile/package.json b/packages/mobile/package.json index 509ee6d2fe..c00f307f56 100644 --- a/packages/mobile/package.json +++ b/packages/mobile/package.json @@ -36,6 +36,6 @@ "@types/node": "^22.0.0", "tsx": "^4.19.0", "typescript": "^5.7.0", - "vitest": "^3.1.0" + "vitest": "^4.1.0" } } diff --git a/packages/mobile/vitest.config.ts b/packages/mobile/vitest.config.ts index 11545f7659..d2029a7fa0 100644 --- a/packages/mobile/vitest.config.ts +++ b/packages/mobile/vitest.config.ts @@ -11,7 +11,7 @@ export default defineConfig({ globalSetup: [resolve(__dirname, "../core/src/__test-utils__/vitest-teardown.ts")], pool: "forks", maxWorkers, - poolOptions: { forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, fileParallelism: true, }, }); diff --git a/packages/pi-claude-cli/package.json b/packages/pi-claude-cli/package.json index 4e6638c310..4591bc6793 100644 --- a/packages/pi-claude-cli/package.json +++ b/packages/pi-claude-cli/package.json @@ -26,7 +26,7 @@ "devDependencies": { "@types/node": "^22.0.0", "typescript": "^5.7.0", - "vitest": "^3.0.0" + "vitest": "^4.1.0" }, "scripts": { "test": "vitest run --reporter=dot", diff --git a/packages/pi-claude-cli/vitest.config.ts b/packages/pi-claude-cli/vitest.config.ts index 3b79f6ad20..741b01e3bc 100644 --- a/packages/pi-claude-cli/vitest.config.ts +++ b/packages/pi-claude-cli/vitest.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ globalSetup: [resolve(__dirname, "../core/src/__test-utils__/vitest-teardown.ts")], pool: "forks", maxWorkers, - poolOptions: { forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, fileParallelism: true, coverage: { provider: "v8", diff --git a/packages/pi-llama-cpp/package.json b/packages/pi-llama-cpp/package.json index 59297dbae4..62d4c2f630 100644 --- a/packages/pi-llama-cpp/package.json +++ b/packages/pi-llama-cpp/package.json @@ -27,7 +27,7 @@ "devDependencies": { "@types/node": "^22.0.0", "typescript": "^5.7.0", - "vitest": "^3.0.0" + "vitest": "^4.1.0" }, "scripts": { "test": "vitest run --reporter=dot", diff --git a/packages/pi-llama-cpp/vitest.config.ts b/packages/pi-llama-cpp/vitest.config.ts index 533bc863c5..295d8ba629 100644 --- a/packages/pi-llama-cpp/vitest.config.ts +++ b/packages/pi-llama-cpp/vitest.config.ts @@ -11,7 +11,7 @@ export default defineConfig({ globalSetup: [resolve(__dirname, "../core/src/__test-utils__/vitest-teardown.ts")], pool: "forks", maxWorkers, - poolOptions: { forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, fileParallelism: true, }, }); diff --git a/packages/plugin-sdk/package.json b/packages/plugin-sdk/package.json index c3b0a3d3f4..c6935c032f 100644 --- a/packages/plugin-sdk/package.json +++ b/packages/plugin-sdk/package.json @@ -32,7 +32,7 @@ "devDependencies": { "@types/node": "^25.5.0", "typescript": "^5.7.0", - "vitest": "^3.1.0" + "vitest": "^4.1.0" }, "dependencies": { "@fusion/core": "workspace:*" diff --git a/packages/plugin-sdk/vitest.config.ts b/packages/plugin-sdk/vitest.config.ts index 8f69a56df6..58b24deb79 100644 --- a/packages/plugin-sdk/vitest.config.ts +++ b/packages/plugin-sdk/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [resolve(__dirname, "../core/src/__test-utils__/vitest-teardown.ts")], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/examples/fusion-plugin-auto-label/package.json b/plugins/examples/fusion-plugin-auto-label/package.json index 7c93fd121f..0c02eebb3a 100644 --- a/plugins/examples/fusion-plugin-auto-label/package.json +++ b/plugins/examples/fusion-plugin-auto-label/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/examples/fusion-plugin-auto-label/vitest.config.ts b/plugins/examples/fusion-plugin-auto-label/vitest.config.ts index 081804efcb..7b7824ea30 100644 --- a/plugins/examples/fusion-plugin-auto-label/vitest.config.ts +++ b/plugins/examples/fusion-plugin-auto-label/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/examples/fusion-plugin-ci-status/package.json b/plugins/examples/fusion-plugin-ci-status/package.json index d50dfab996..43795588c1 100644 --- a/plugins/examples/fusion-plugin-ci-status/package.json +++ b/plugins/examples/fusion-plugin-ci-status/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/examples/fusion-plugin-ci-status/vitest.config.ts b/plugins/examples/fusion-plugin-ci-status/vitest.config.ts index 081804efcb..7b7824ea30 100644 --- a/plugins/examples/fusion-plugin-ci-status/vitest.config.ts +++ b/plugins/examples/fusion-plugin-ci-status/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/examples/fusion-plugin-notification/package.json b/plugins/examples/fusion-plugin-notification/package.json index 6356e9ee4c..c11d296516 100644 --- a/plugins/examples/fusion-plugin-notification/package.json +++ b/plugins/examples/fusion-plugin-notification/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/examples/fusion-plugin-notification/vitest.config.ts b/plugins/examples/fusion-plugin-notification/vitest.config.ts index 081804efcb..7b7824ea30 100644 --- a/plugins/examples/fusion-plugin-notification/vitest.config.ts +++ b/plugins/examples/fusion-plugin-notification/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/examples/fusion-plugin-settings-demo/package.json b/plugins/examples/fusion-plugin-settings-demo/package.json index de28529efc..11497f8623 100644 --- a/plugins/examples/fusion-plugin-settings-demo/package.json +++ b/plugins/examples/fusion-plugin-settings-demo/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/examples/fusion-plugin-settings-demo/vitest.config.ts b/plugins/examples/fusion-plugin-settings-demo/vitest.config.ts index 081804efcb..7b7824ea30 100644 --- a/plugins/examples/fusion-plugin-settings-demo/vitest.config.ts +++ b/plugins/examples/fusion-plugin-settings-demo/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-acp-runtime/package.json b/plugins/fusion-plugin-acp-runtime/package.json index 86e32bc70d..eef4635b29 100644 --- a/plugins/fusion-plugin-acp-runtime/package.json +++ b/plugins/fusion-plugin-acp-runtime/package.json @@ -37,6 +37,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-acp-runtime/vitest.config.ts b/plugins/fusion-plugin-acp-runtime/vitest.config.ts index 7f8fb8a972..caf5c70616 100644 --- a/plugins/fusion-plugin-acp-runtime/vitest.config.ts +++ b/plugins/fusion-plugin-acp-runtime/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-agent-browser/package.json b/plugins/fusion-plugin-agent-browser/package.json index 3fe5ba2dea..58076d52e9 100644 --- a/plugins/fusion-plugin-agent-browser/package.json +++ b/plugins/fusion-plugin-agent-browser/package.json @@ -20,6 +20,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-agent-browser/vitest.config.ts b/plugins/fusion-plugin-agent-browser/vitest.config.ts index 7f8fb8a972..caf5c70616 100644 --- a/plugins/fusion-plugin-agent-browser/vitest.config.ts +++ b/plugins/fusion-plugin-agent-browser/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-cli-printing-press/package.json b/plugins/fusion-plugin-cli-printing-press/package.json index bdcb163171..7e59ff881b 100644 --- a/plugins/fusion-plugin-cli-printing-press/package.json +++ b/plugins/fusion-plugin-cli-printing-press/package.json @@ -38,6 +38,6 @@ "@types/node": "^25.5.2", "@types/react": "^19.0.0", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-cli-printing-press/vitest.config.ts b/plugins/fusion-plugin-cli-printing-press/vitest.config.ts index 6ef22dc2d8..245fa45a84 100644 --- a/plugins/fusion-plugin-cli-printing-press/vitest.config.ts +++ b/plugins/fusion-plugin-cli-printing-press/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-compound-engineering/package.json b/plugins/fusion-plugin-compound-engineering/package.json index a80457741e..920092f414 100644 --- a/plugins/fusion-plugin-compound-engineering/package.json +++ b/plugins/fusion-plugin-compound-engineering/package.json @@ -32,6 +32,6 @@ "@types/react": "^19.0.0", "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-compound-engineering/src/__tests__/orchestrator-live-output.test.ts b/plugins/fusion-plugin-compound-engineering/src/__tests__/orchestrator-live-output.test.ts index 4bfbac7b83..58b1625396 100644 --- a/plugins/fusion-plugin-compound-engineering/src/__tests__/orchestrator-live-output.test.ts +++ b/plugins/fusion-plugin-compound-engineering/src/__tests__/orchestrator-live-output.test.ts @@ -43,8 +43,8 @@ const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); /** A factory exposing the onProgress hook and a controllable nextEvent. */ function progressFactory(nextEvent: () => Promise) { - const captured: { progress?: (e: InteractiveAiSessionProgressEvent) => void; dispose: ReturnType } = { - dispose: vi.fn(), + const captured: { progress?: (e: InteractiveAiSessionProgressEvent) => void; dispose: ReturnType void>> } = { + dispose: vi.fn<() => void>(), }; const factory: CreateInteractiveAiSessionFactory = vi.fn(async (opts) => { captured.progress = opts.onProgress; diff --git a/plugins/fusion-plugin-compound-engineering/vitest.config.ts b/plugins/fusion-plugin-compound-engineering/vitest.config.ts index c9594b1487..7e7866d0d0 100644 --- a/plugins/fusion-plugin-compound-engineering/vitest.config.ts +++ b/plugins/fusion-plugin-compound-engineering/vitest.config.ts @@ -38,7 +38,7 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, projects: [ { extends: true, diff --git a/plugins/fusion-plugin-cursor-runtime/package.json b/plugins/fusion-plugin-cursor-runtime/package.json index 78afb2f5a5..f7675f84ad 100644 --- a/plugins/fusion-plugin-cursor-runtime/package.json +++ b/plugins/fusion-plugin-cursor-runtime/package.json @@ -33,6 +33,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } -} \ No newline at end of file +} diff --git a/plugins/fusion-plugin-dependency-graph/package.json b/plugins/fusion-plugin-dependency-graph/package.json index 1734f259b4..217f7b7b16 100644 --- a/plugins/fusion-plugin-dependency-graph/package.json +++ b/plugins/fusion-plugin-dependency-graph/package.json @@ -31,6 +31,6 @@ "react": "^19.0.0", "react-dom": "^19.2.4", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } -} \ No newline at end of file +} diff --git a/plugins/fusion-plugin-dependency-graph/vitest.config.ts b/plugins/fusion-plugin-dependency-graph/vitest.config.ts index 17e21d27ff..5bc6a297e9 100644 --- a/plugins/fusion-plugin-dependency-graph/vitest.config.ts +++ b/plugins/fusion-plugin-dependency-graph/vitest.config.ts @@ -34,6 +34,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-droid-runtime/package.json b/plugins/fusion-plugin-droid-runtime/package.json index b30117db09..3057074b17 100644 --- a/plugins/fusion-plugin-droid-runtime/package.json +++ b/plugins/fusion-plugin-droid-runtime/package.json @@ -33,6 +33,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-droid-runtime/vitest.config.ts b/plugins/fusion-plugin-droid-runtime/vitest.config.ts index 7f8fb8a972..caf5c70616 100644 --- a/plugins/fusion-plugin-droid-runtime/vitest.config.ts +++ b/plugins/fusion-plugin-droid-runtime/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-even-cards/package.json b/plugins/fusion-plugin-even-cards/package.json index d87978a7c2..615bdbc5ef 100644 --- a/plugins/fusion-plugin-even-cards/package.json +++ b/plugins/fusion-plugin-even-cards/package.json @@ -20,6 +20,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-even-cards/vitest.config.ts b/plugins/fusion-plugin-even-cards/vitest.config.ts index a6f2df7e1b..0ce6bd3a96 100644 --- a/plugins/fusion-plugin-even-cards/vitest.config.ts +++ b/plugins/fusion-plugin-even-cards/vitest.config.ts @@ -18,6 +18,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-even-realities-glasses/package.json b/plugins/fusion-plugin-even-realities-glasses/package.json index 4466cb1b52..890cb9e414 100644 --- a/plugins/fusion-plugin-even-realities-glasses/package.json +++ b/plugins/fusion-plugin-even-realities-glasses/package.json @@ -28,6 +28,6 @@ "@types/node": "^25.5.2", "better-sqlite3": "^12.4.1", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-even-realities-glasses/vitest.config.ts b/plugins/fusion-plugin-even-realities-glasses/vitest.config.ts index a6f2df7e1b..0ce6bd3a96 100644 --- a/plugins/fusion-plugin-even-realities-glasses/vitest.config.ts +++ b/plugins/fusion-plugin-even-realities-glasses/vitest.config.ts @@ -18,6 +18,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-hermes-runtime/package.json b/plugins/fusion-plugin-hermes-runtime/package.json index 799c58dc0e..e2782e2e16 100644 --- a/plugins/fusion-plugin-hermes-runtime/package.json +++ b/plugins/fusion-plugin-hermes-runtime/package.json @@ -27,6 +27,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-hermes-runtime/vitest.config.ts b/plugins/fusion-plugin-hermes-runtime/vitest.config.ts index 7f8fb8a972..caf5c70616 100644 --- a/plugins/fusion-plugin-hermes-runtime/vitest.config.ts +++ b/plugins/fusion-plugin-hermes-runtime/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-openclaw-runtime/package.json b/plugins/fusion-plugin-openclaw-runtime/package.json index 3e3a4ae01e..49d743fb51 100644 --- a/plugins/fusion-plugin-openclaw-runtime/package.json +++ b/plugins/fusion-plugin-openclaw-runtime/package.json @@ -27,6 +27,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-openclaw-runtime/vitest.config.ts b/plugins/fusion-plugin-openclaw-runtime/vitest.config.ts index 7f8fb8a972..caf5c70616 100644 --- a/plugins/fusion-plugin-openclaw-runtime/vitest.config.ts +++ b/plugins/fusion-plugin-openclaw-runtime/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-paperclip-runtime/package.json b/plugins/fusion-plugin-paperclip-runtime/package.json index 42c52bf8fb..e9269e295f 100644 --- a/plugins/fusion-plugin-paperclip-runtime/package.json +++ b/plugins/fusion-plugin-paperclip-runtime/package.json @@ -24,6 +24,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-paperclip-runtime/vitest.config.ts b/plugins/fusion-plugin-paperclip-runtime/vitest.config.ts index 7f8fb8a972..caf5c70616 100644 --- a/plugins/fusion-plugin-paperclip-runtime/vitest.config.ts +++ b/plugins/fusion-plugin-paperclip-runtime/vitest.config.ts @@ -17,6 +17,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/plugins/fusion-plugin-reports/package.json b/plugins/fusion-plugin-reports/package.json index ed5b55aae0..cf066f0596 100644 --- a/plugins/fusion-plugin-reports/package.json +++ b/plugins/fusion-plugin-reports/package.json @@ -37,6 +37,6 @@ "@types/react": "^19.0.0", "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-reports/src/__tests__/review-panel.test.ts b/plugins/fusion-plugin-reports/src/__tests__/review-panel.test.ts index 79e19a1a49..6c60c040fa 100644 --- a/plugins/fusion-plugin-reports/src/__tests__/review-panel.test.ts +++ b/plugins/fusion-plugin-reports/src/__tests__/review-panel.test.ts @@ -83,9 +83,9 @@ describe("runReviewPanel", () => { if (systemPrompt.includes("Operations")) { return { session: { - prompt: vi.fn(async () => new Promise(() => {})), + prompt: vi.fn(async () => new Promise(() => {})), state: { messages: [] }, - dispose: vi.fn(), + dispose: vi.fn<() => void>(), }, }; } @@ -93,7 +93,7 @@ describe("runReviewPanel", () => { session: { prompt: vi.fn(async () => {}), state: { messages: [{ role: "assistant", content: JSON.stringify({ verdict: "approve", summary: "ok", highlights: [], lowlights: [], suggestions: [] }) }] }, - dispose: vi.fn(), + dispose: vi.fn<() => void>(), }, }; }); diff --git a/plugins/fusion-plugin-reports/vitest.config.ts b/plugins/fusion-plugin-reports/vitest.config.ts index 7a7c1761c4..c767f42288 100644 --- a/plugins/fusion-plugin-reports/vitest.config.ts +++ b/plugins/fusion-plugin-reports/vitest.config.ts @@ -25,7 +25,7 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, projects: [ { extends: true, diff --git a/plugins/fusion-plugin-roadmap/package.json b/plugins/fusion-plugin-roadmap/package.json index 774d7dfb69..785ab383b4 100644 --- a/plugins/fusion-plugin-roadmap/package.json +++ b/plugins/fusion-plugin-roadmap/package.json @@ -43,6 +43,6 @@ "@types/node": "^25.5.2", "@types/react": "^19.0.0", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-roadmap/vitest.config.ts b/plugins/fusion-plugin-roadmap/vitest.config.ts index d27cfd67c3..dd2ca79f0f 100644 --- a/plugins/fusion-plugin-roadmap/vitest.config.ts +++ b/plugins/fusion-plugin-roadmap/vitest.config.ts @@ -16,7 +16,7 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, projects: [ { extends: true, diff --git a/plugins/fusion-plugin-whatsapp-chat/package.json b/plugins/fusion-plugin-whatsapp-chat/package.json index 931fd05f41..331363d66c 100644 --- a/plugins/fusion-plugin-whatsapp-chat/package.json +++ b/plugins/fusion-plugin-whatsapp-chat/package.json @@ -29,6 +29,6 @@ "devDependencies": { "@types/node": "^25.5.2", "typescript": "^5.7.0", - "vitest": "^3.2.4" + "vitest": "^4.1.0" } } diff --git a/plugins/fusion-plugin-whatsapp-chat/vitest.config.ts b/plugins/fusion-plugin-whatsapp-chat/vitest.config.ts index a6f2df7e1b..0ce6bd3a96 100644 --- a/plugins/fusion-plugin-whatsapp-chat/vitest.config.ts +++ b/plugins/fusion-plugin-whatsapp-chat/vitest.config.ts @@ -18,6 +18,6 @@ export default defineConfig({ globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], pool: "threads", maxWorkers, - poolOptions: { threads: { minThreads: 1, maxThreads: maxWorkers }, forks: { minForks: 1, maxForks: maxWorkers } }, + minWorkers: 1, }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8410a46acb..cdb7e14674 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,7 @@ settings: overrides: '@types/node': ^25.5.2 + protobufjs: ^7.5.8 importers: @@ -115,8 +116,8 @@ importers: specifier: ^8.5.0 version: 8.18.1 '@vitest/coverage-v8': - specifier: ^3.1.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.8.3)) + specifier: ^4.1.0 + version: 4.1.8(vitest@4.1.8) cross-env: specifier: ^7.0.0 version: 7.0.3 @@ -139,8 +140,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.1.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.8.3) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3)) yaml: specifier: ^2.8.3 version: 2.8.3 @@ -182,14 +183,14 @@ importers: specifier: ^25.5.2 version: 25.5.2 '@vitest/coverage-v8': - specifier: ^3.1.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.8.3)) + specifier: ^4.1.0 + version: 4.1.8(vitest@4.1.8) typescript: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.1.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.8.3) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: keytar: specifier: ^7.9.0 @@ -370,8 +371,8 @@ importers: specifier: ^4.3.0 version: 4.7.0(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': - specifier: ^3.1.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0)) + specifier: ^4.1.0 + version: 4.1.8(vitest@4.1.8) jsdom: specifier: ^29.0.1 version: 29.0.1 @@ -385,8 +386,8 @@ importers: specifier: ^6.0.0 version: 6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) vitest: - specifier: ^3.1.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages/desktop: dependencies: @@ -416,8 +417,8 @@ importers: specifier: ^19.0.0 version: 19.2.3(@types/react@19.2.14) '@vitest/coverage-v8': - specifier: ^3.1.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0)) + specifier: ^4.1.0 + version: 4.1.8(vitest@4.1.8) electron: specifier: ^35.0.0 version: 35.7.5 @@ -449,8 +450,8 @@ importers: specifier: ^6.0.0 version: 6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) vitest: - specifier: ^3.1.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages/droid-cli: dependencies: @@ -471,8 +472,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages/engine: dependencies: @@ -514,14 +515,14 @@ importers: specifier: ^4.1.4 version: 4.1.4 '@vitest/coverage-v8': - specifier: ^3.1.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0)) + specifier: ^4.1.0 + version: 4.1.8(vitest@4.1.8) typescript: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.1.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages/i18n: dependencies: @@ -539,8 +540,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.1.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages/mobile: dependencies: @@ -579,8 +580,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.1.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages/pi-claude-cli: dependencies: @@ -598,8 +599,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages/pi-llama-cpp: dependencies: @@ -614,8 +615,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages/plugin-sdk: dependencies: @@ -630,8 +631,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.1.0 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/examples/fusion-plugin-auto-label: dependencies: @@ -646,8 +647,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/examples/fusion-plugin-ci-status: dependencies: @@ -662,8 +663,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/examples/fusion-plugin-notification: dependencies: @@ -678,8 +679,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/examples/fusion-plugin-settings-demo: dependencies: @@ -694,8 +695,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-acp-runtime: dependencies: @@ -722,8 +723,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-agent-browser: dependencies: @@ -738,8 +739,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-cli-printing-press: dependencies: @@ -784,8 +785,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-compound-engineering: dependencies: @@ -824,8 +825,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-cursor-runtime: dependencies: @@ -846,8 +847,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-dependency-graph: dependencies: @@ -880,8 +881,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-droid-runtime: dependencies: @@ -902,8 +903,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-even-realities-glasses: dependencies: @@ -924,8 +925,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-hermes-runtime: dependencies: @@ -940,8 +941,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-openclaw-runtime: dependencies: @@ -956,8 +957,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-paperclip-runtime: dependencies: @@ -972,8 +973,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-reports: dependencies: @@ -1015,8 +1016,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-roadmap: dependencies: @@ -1061,8 +1062,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) plugins/fusion-plugin-whatsapp-chat: dependencies: @@ -1086,8 +1087,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) + specifier: ^4.1.0 + version: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages: @@ -1109,10 +1110,6 @@ packages: resolution: {integrity: sha512-p+CMKJ93HFmLkjXKlXiVGlMQEuRb6H0MokBSwUsX+S6BRX8eV5naFZpQJFfJHjRZY0Hmnqy1/r6UWl3x+19zYA==} engines: {node: '>=18'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@anthropic-ai/sdk@0.91.1': resolution: {integrity: sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==} hasBin: true @@ -1276,10 +1273,18 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + 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'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} @@ -1293,6 +1298,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} @@ -1321,6 +1331,10 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} @@ -2313,10 +2327,6 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -2506,9 +2516,6 @@ packages: '@protobufjs/base64@1.1.2': resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - '@protobufjs/codegen@2.0.5': resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} @@ -2533,9 +2540,6 @@ packages: '@protobufjs/pool@1.1.0': resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@protobufjs/utf8@1.1.1': resolution: {integrity: sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==} @@ -2734,6 +2738,9 @@ packages: resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@swc/core-darwin-arm64@1.15.40': resolution: {integrity: sha512-PaYyclfmQ++77D8ityYvmmVzHv9aG8ROwt2GfG6/ccloy4Hgf80qtOnzb9VYvPsUT7Ty1uhuDRhv3XYpf62qhQ==} engines: {node: '>=10'} @@ -3106,43 +3113,43 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + '@vitest/coverage-v8@4.1.8': + resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + '@vitest/browser': 4.1.8 + vitest: 4.1.8 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} '@wasm-audio-decoders/common@9.0.7': resolution: {integrity: sha512-WRaUuWSKV7pkttBygml/a6dIEpatq2nnZGFIoPTc5yPLkxL6Wk4YaslPM98OPQvWacvNZ+Py9xROGDtrFBDzag==} @@ -3354,8 +3361,8 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-v8-to-istanbul@0.3.12: - resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} + ast-v8-to-istanbul@1.0.3: + resolution: {integrity: sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg==} astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} @@ -3623,8 +3630,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk@4.1.2: @@ -3654,10 +3661,6 @@ packages: resolution: {integrity: sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==} engines: {node: '>=16'} - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -3961,10 +3964,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -4165,8 +4164,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -4950,10 +4949,6 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} @@ -4987,9 +4982,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -5153,9 +5145,6 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} @@ -5195,8 +5184,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -5601,6 +5590,10 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + obug@2.1.2: + resolution: {integrity: sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==} + engines: {node: '>=12.20.0'} + ogg-opus-decoder@1.7.3: resolution: {integrity: sha512-w47tiZpkLgdkpa+34VzYD8mHUj8I9kfWVZa82mBbNwDvB1byfLXSSzW/HxA4fI3e9kVlICSpXGFwMLV1LPdjwg==} @@ -5766,10 +5759,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - pe-library@0.4.1: resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} engines: {node: '>=12', npm: '>=6'} @@ -5911,10 +5900,6 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - protobufjs@7.5.8: resolution: {integrity: sha512-dvpCIeLPbXZS/Ete7yLaO7RenOdken2NHKykBXbsaGxZT0UTltcarBciw+A78SRQs9iMAAVpsYA+l8b1hTePIA==} engines: {node: '>=12.0.0'} @@ -6393,8 +6378,8 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} stdin-discarder@0.3.2: resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} @@ -6456,9 +6441,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - strnum@2.2.3: resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} @@ -6527,10 +6509,6 @@ packages: resolution: {integrity: sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==} engines: {node: '>=18'} - test-exclude@7.0.2: - resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} - engines: {node: '>=18'} - text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} @@ -6562,20 +6540,20 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} tldts-core@7.0.27: @@ -6814,11 +6792,6 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite@6.4.1: resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -6859,26 +6832,39 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 + '@opentelemetry/api': ^1.9.0 '@types/node': ^25.5.2 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -7120,11 +7106,6 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@anthropic-ai/sdk@0.91.1': dependencies: json-schema-to-ts: 3.1.1 @@ -7448,8 +7429,12 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.27.1': {} '@babel/helpers@7.29.2': @@ -7461,6 +7446,10 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -7496,6 +7485,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@balena/dockerignore@1.0.2': {} '@bcoe/v8-coverage@1.0.2': {} @@ -8517,14 +8511,14 @@ snapshots: dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.4 + protobufjs: 7.5.8 yargs: 17.7.2 '@grpc/proto-loader@0.8.0': dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.4 + protobufjs: 7.5.8 yargs: 17.7.2 '@hapi/boom@9.1.4': @@ -8845,8 +8839,6 @@ snapshots: dependencies: minipass: 7.1.3 - '@istanbuljs/schema@0.1.3': {} - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -9083,8 +9075,6 @@ snapshots: '@protobufjs/base64@1.1.2': {} - '@protobufjs/codegen@2.0.4': {} - '@protobufjs/codegen@2.0.5': {} '@protobufjs/eventemitter@1.1.0': {} @@ -9104,8 +9094,6 @@ snapshots: '@protobufjs/pool@1.1.0': {} - '@protobufjs/utf8@1.1.0': {} - '@protobufjs/utf8@1.1.1': {} '@rolldown/pluginutils@1.0.0-beta.27': {} @@ -9247,6 +9235,8 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 + '@standard-schema/spec@1.1.0': {} + '@swc/core-darwin-arm64@1.15.40': optional: true @@ -9669,93 +9659,68 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.12 - debug: 4.4.3 + '@vitest/utils': 4.1.8 + ast-v8-to-istanbul: 1.0.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 - magic-string: 0.30.21 - magicast: 0.3.5 - std-env: 3.10.0 - test-exclude: 7.0.2 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.8.3) - transitivePeerDependencies: - - supports-color + magicast: 0.5.3 + obug: 2.1.2 + std-env: 4.1.0 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0))': - dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.12 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.2.0 - magic-string: 0.30.21 - magicast: 0.3.5 - std-env: 3.10.0 - test-exclude: 7.0.2 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0) - transitivePeerDependencies: - - supports-color - - '@vitest/expect@3.2.4': + '@vitest/expect@4.1.8': dependencies: + '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - tinyrainbow: 2.0.0 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.8(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.8(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.1.8': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.0 - '@vitest/runner@3.2.4': + '@vitest/runner@4.1.8': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.1.8 pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.1.8': dependencies: - '@vitest/pretty-format': 3.2.4 + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.4 + '@vitest/spy@4.1.8': {} - '@vitest/utils@3.2.4': + '@vitest/utils@4.1.8': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.1.8 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 '@wasm-audio-decoders/common@9.0.7': dependencies: @@ -9791,7 +9756,7 @@ snapshots: lodash: 4.18.1 music-metadata: 7.14.0 pino: 9.14.0 - protobufjs: 7.5.4 + protobufjs: 7.5.8 uuid: 10.0.0 ws: 8.20.0 transitivePeerDependencies: @@ -10016,7 +9981,7 @@ snapshots: assertion-error@2.0.1: {} - ast-v8-to-istanbul@0.3.12: + ast-v8-to-istanbul@1.0.3: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -10316,13 +10281,7 @@ snapshots: ccount@2.0.1: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + chai@6.2.2: {} chalk@4.1.2: dependencies: @@ -10343,8 +10302,6 @@ snapshots: check-disk-space@3.4.0: {} - check-error@2.1.3: {} - chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -10609,8 +10566,6 @@ snapshots: dependencies: mimic-response: 3.1.0 - deep-eql@5.0.2: {} - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -10713,7 +10668,7 @@ snapshots: '@grpc/grpc-js': 1.14.3 '@grpc/proto-loader': 0.7.15 docker-modem: 5.0.7 - protobufjs: 7.5.4 + protobufjs: 7.5.8 tar-fs: 2.1.4 uuid: 10.0.0 transitivePeerDependencies: @@ -10859,7 +10814,7 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} + es-module-lexer@2.1.0: {} es-object-atoms@1.1.1: dependencies: @@ -11822,14 +11777,6 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 @@ -11859,8 +11806,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.1: {} - js-yaml@3.14.2: dependencies: argparse: 1.0.10 @@ -12027,8 +11972,6 @@ snapshots: longest-streak@3.1.0: {} - loupe@3.2.1: {} - lowercase-keys@2.0.0: {} lru-cache@10.4.3: {} @@ -12059,9 +12002,9 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.5: + magicast@0.5.3: dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@babel/types': 7.29.0 source-map-js: 1.2.1 @@ -12682,6 +12625,8 @@ snapshots: object-keys@1.1.1: optional: true + obug@2.1.2: {} + ogg-opus-decoder@1.7.3: dependencies: '@wasm-audio-decoders/common': 9.0.7 @@ -12854,8 +12799,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - pe-library@0.4.1: {} peek-readable@4.1.0: {} @@ -12987,21 +12930,6 @@ snapshots: property-information@7.1.0: {} - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 25.5.2 - long: 5.3.2 - protobufjs@7.5.8: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -13590,7 +13518,7 @@ snapshots: statuses@2.0.2: {} - std-env@3.10.0: {} + std-env@4.1.0: {} stdin-discarder@0.3.2: {} @@ -13655,10 +13583,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - strnum@2.2.3: {} strtok3@6.3.0: @@ -13755,12 +13679,6 @@ snapshots: terminal-size@4.0.1: {} - test-exclude@7.0.2: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.5.0 - minimatch: 10.2.4 - text-decoder@1.2.7: dependencies: b4a: 1.8.0 @@ -13795,16 +13713,16 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.2.4: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinypool@1.1.1: {} - tinyrainbow@2.0.0: {} - tinyspy@4.0.4: {} + tinyrainbow@3.1.0: {} tldts-core@7.0.27: {} @@ -14044,48 +13962,6 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite-node@3.2.4(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: esbuild: 0.25.12 @@ -14116,93 +13992,65 @@ snapshots: tsx: 4.21.0 yaml: 2.9.0 - vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.8.3): + vitest@4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(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.3.3 - debug: 4.4.3 + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 + obug: 2.1.2 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 3.10.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.2.4 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.0 vite: 6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3) - vite-node: 3.2.4(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.13 '@types/node': 25.5.2 + '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) happy-dom: 20.10.1 jsdom: 29.0.1 transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.10.1)(jiti@2.7.0)(jsdom@29.0.1)(tsx@4.21.0)(yaml@2.9.0): + vitest@4.1.8(@types/node@25.5.2)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.1)(jsdom@29.0.1)(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3 + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 + obug: 2.1.2 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 3.10.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.2.4 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.0 vite: 6.4.1(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) - vite-node: 3.2.4(@types/node@25.5.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.13 '@types/node': 25.5.2 + '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) happy-dom: 20.10.1 jsdom: 29.0.1 transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml void-elements@3.1.0: {} diff --git a/scripts/__tests__/dependency-security-floor.test.mjs b/scripts/__tests__/dependency-security-floor.test.mjs new file mode 100644 index 0000000000..61270ed82f --- /dev/null +++ b/scripts/__tests__/dependency-security-floor.test.mjs @@ -0,0 +1,95 @@ +import assert from "node:assert/strict"; +import { readdir, readFile } from "node:fs/promises"; +import path from "node:path"; +import test from "node:test"; +import YAML from "yaml"; + +const root = process.cwd(); + +const dependencyFloors = [ + { name: "protobufjs", minimum: "7.5.5", manifestSections: ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"], lockfileMatcher: /^protobufjs@(.*)$/ }, + { name: "vitest", minimum: "4.1.0", manifestSections: ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"], lockfileMatcher: /^vitest@(.*)$/ }, + { name: "@vitest/coverage-v8", minimum: "4.1.0", manifestSections: ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"], lockfileMatcher: /^@vitest\/coverage-v8@(.*)$/ }, +]; + +const manifestRoots = ["packages", "plugins"]; +const ignoredPathParts = new Set(["node_modules", "dist", "build", "coverage", ".turbo"]); + +function compareVersions(a, b) { + const pa = a.split(".").map((part) => Number.parseInt(part, 10)); + const pb = b.split(".").map((part) => Number.parseInt(part, 10)); + for (let i = 0; i < Math.max(pa.length, pb.length); i += 1) { + const ai = Number.isFinite(pa[i]) ? pa[i] : 0; + const bi = Number.isFinite(pb[i]) ? pb[i] : 0; + if (ai !== bi) return ai - bi; + } + return 0; +} + +function minVersionFromRange(range) { + const version = String(range).match(/\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?/u)?.[0]; + return version?.split(/[+-]/u)[0] ?? null; +} + +function assertRangeMeetsFloor({ location, name, range, minimum }) { + const minVersion = minVersionFromRange(range); + assert.ok(minVersion, `${location}: ${name} range ${range} must include an explicit semver version`); + assert.ok(compareVersions(minVersion, minimum) >= 0, `${location}: ${name} range ${range} is below required floor ${minimum}`); +} + +async function collectPackageManifests(dir) { + const entries = await readdir(dir, { withFileTypes: true }); + const manifests = []; + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (ignoredPathParts.has(entry.name)) continue; + if (entry.isDirectory()) { + manifests.push(...(await collectPackageManifests(fullPath))); + } else if (entry.name === "package.json") { + manifests.push(fullPath); + } + } + return manifests; +} + +async function sourceManifestPaths() { + const manifests = [path.join(root, "package.json")]; + for (const manifestRoot of manifestRoots) { + manifests.push(...(await collectPackageManifests(path.join(root, manifestRoot)))); + } + return manifests.sort(); +} + +test("source manifests keep vulnerable dependency floors out", async () => { + for (const manifestPath of await sourceManifestPaths()) { + const manifest = JSON.parse(await readFile(manifestPath, "utf8")); + const relativePath = path.relative(root, manifestPath); + for (const floor of dependencyFloors) { + for (const section of floor.manifestSections) { + const range = manifest[section]?.[floor.name]; + if (range) assertRangeMeetsFloor({ location: `${relativePath} ${section}`, name: floor.name, range, minimum: floor.minimum }); + } + } + } +}); + +test("pnpm overrides pin transitive protobufjs to a safe floor", async () => { + const manifest = JSON.parse(await readFile(path.join(root, "package.json"), "utf8")); + assertRangeMeetsFloor({ location: "package.json pnpm.overrides", name: "protobufjs", range: manifest.pnpm?.overrides?.protobufjs, minimum: "7.5.5" }); +}); + +test("lockfile resolutions satisfy dependency security floors", async () => { + const lockfile = YAML.parse(await readFile(path.join(root, "pnpm-lock.yaml"), "utf8")); + const packageKeys = Object.keys(lockfile.packages ?? {}); + for (const floor of dependencyFloors) { + const matches = packageKeys + .map((key) => key.replace(/^\//u, "")) + .map((key) => key.match(floor.lockfileMatcher)?.[1]) + .filter(Boolean) + .map((suffix) => suffix.split("(")[0]); + assert.ok(matches.length > 0, `pnpm-lock.yaml must include at least one ${floor.name} resolution`); + for (const version of matches) { + assert.ok(compareVersions(version, floor.minimum) >= 0, `pnpm-lock.yaml resolves ${floor.name}@${version}, below required floor ${floor.minimum}`); + } + } +});