import os from "node:os"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { defineConfig } from "vitest/config"; const repoRoot = path.dirname(fileURLToPath(import.meta.url)); const isCI = process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true"; const isWindows = process.platform === "win32"; const localWorkers = Math.max(4, Math.min(16, os.cpus().length)); const ciWorkers = isWindows ? 2 : 3; export default defineConfig({ resolve: { // Keep this ordered: the base `openclaw/plugin-sdk` alias is a prefix match. alias: [ { find: "openclaw/plugin-sdk/account-id", replacement: path.join(repoRoot, "src", "plugin-sdk", "account-id.ts"), }, { find: "openclaw/plugin-sdk", replacement: path.join(repoRoot, "src", "plugin-sdk", "index.ts"), }, ], }, test: { testTimeout: 120_000, hookTimeout: isWindows ? 180_000 : 120_000, // Many suites rely on `vi.stubEnv(...)` and expect it to be scoped to the test. // This is especially important under `pool=vmForks` where env leaks cross-file. unstubEnvs: true, // Same rationale as unstubEnvs: avoid cross-test pollution under vmForks. unstubGlobals: true, pool: "forks", maxWorkers: isCI ? ciWorkers : localWorkers, include: [ "src/**/*.test.ts", "extensions/**/*.test.ts", "test/**/*.test.ts", "ui/src/ui/views/usage-render-details.test.ts", ], setupFiles: ["test/setup.ts"], exclude: [ "dist/**", "apps/macos/**", "apps/macos/.build/**", "**/node_modules/**", "**/vendor/**", "dist/OpenClaw.app/**", "**/*.live.test.ts", "**/*.e2e.test.ts", ], coverage: { provider: "v8", reporter: ["text", "lcov"], // Keep coverage stable without an ever-growing exclude list: // only count files actually exercised by the test suite. all: false, thresholds: { lines: 70, functions: 70, branches: 55, statements: 70, }, // Anchor to repo-root `src/` only. Without this, coverage globs can // unintentionally match nested `*/src/**` folders (extensions, apps, etc). include: ["./src/**/*.ts"], exclude: [ // Never count workspace packages/apps toward core coverage thresholds. "extensions/**", "apps/**", "ui/**", "test/**", "src/**/*.test.ts", // Entrypoints and wiring (covered by CI smoke + manual/e2e flows). "src/entry.ts", "src/index.ts", "src/runtime.ts", "src/channel-web.ts", "src/extensionAPI.ts", "src/logging.ts", "src/cli/**", "src/commands/**", "src/daemon/**", "src/hooks/**", "src/macos/**", // Large integration surfaces; validated via e2e/manual/contract tests. "src/acp/**", "src/agents/**", "src/channels/**", "src/gateway/**", "src/line/**", "src/media-understanding/**", "src/node-host/**", "src/plugins/**", "src/providers/**", // Some agent integrations are intentionally validated via manual/e2e runs. "src/agents/model-scan.ts", "src/agents/pi-embedded-runner.ts", "src/agents/sandbox-paths.ts", "src/agents/sandbox.ts", "src/agents/skills-install.ts", "src/agents/pi-tool-definition-adapter.ts", "src/agents/tools/discord-actions*.ts", "src/agents/tools/slack-actions.ts", // Hard-to-unit-test modules; exercised indirectly by integration tests. "src/infra/state-migrations.ts", "src/infra/skills-remote.ts", "src/infra/update-check.ts", "src/infra/ports-inspect.ts", "src/infra/outbound/outbound-session.ts", "src/memory/batch-gemini.ts", // Gateway server integration surfaces are intentionally validated via manual/e2e runs. "src/gateway/control-ui.ts", "src/gateway/server-bridge.ts", "src/gateway/server-channels.ts", "src/gateway/server-methods/config.ts", "src/gateway/server-methods/send.ts", "src/gateway/server-methods/skills.ts", "src/gateway/server-methods/talk.ts", "src/gateway/server-methods/web.ts", "src/gateway/server-methods/wizard.ts", // Process bridges are hard to unit-test in isolation. "src/gateway/call.ts", "src/process/tau-rpc.ts", "src/process/exec.ts", // Interactive UIs/flows are intentionally validated via manual/e2e runs. "src/tui/**", "src/wizard/**", // Channel surfaces are largely integration-tested (or manually validated). "src/discord/**", "src/imessage/**", "src/signal/**", "src/slack/**", "src/browser/**", "src/channels/web/**", "src/telegram/index.ts", "src/telegram/proxy.ts", "src/telegram/webhook-set.ts", "src/telegram/**", "src/webchat/**", "src/gateway/server.ts", "src/gateway/client.ts", "src/gateway/protocol/**", "src/infra/tailscale.ts", ], }, }, });