diff --git a/src/agents/anthropic-vertex-stream.test.ts b/src/agents/anthropic-vertex-stream.test.ts index e8a09851df7..3464d7022a0 100644 --- a/src/agents/anthropic-vertex-stream.test.ts +++ b/src/agents/anthropic-vertex-stream.test.ts @@ -13,8 +13,9 @@ const hoisted = vi.hoisted(() => { }; }); -vi.mock("@mariozechner/pi-ai", async (importOriginal) => { - const original = await importOriginal(); +vi.mock("@mariozechner/pi-ai", async () => { + const original = + await vi.importActual("@mariozechner/pi-ai"); return { ...original, streamAnthropic: (model: unknown, context: unknown, options: unknown) => @@ -34,8 +35,9 @@ let createAnthropicVertexStreamFnForModel: typeof import("./anthropic-vertex-str async function loadFreshAnthropicVertexStreamModuleForTest() { vi.resetModules(); - vi.doMock("@mariozechner/pi-ai", async (importOriginal) => { - const original = await importOriginal(); + vi.doMock("@mariozechner/pi-ai", async () => { + const original = + await vi.importActual("@mariozechner/pi-ai"); return { ...original, streamAnthropic: (model: unknown, context: unknown, options: unknown) => diff --git a/src/agents/bash-tools.exec.path.test.ts b/src/agents/bash-tools.exec.path.test.ts index b0a80916e50..466eadeb218 100644 --- a/src/agents/bash-tools.exec.path.test.ts +++ b/src/agents/bash-tools.exec.path.test.ts @@ -13,8 +13,9 @@ const shellEnvMocks = vi.hoisted(() => ({ resolveShellEnvFallbackTimeoutMs: vi.fn(() => 1234), })); -vi.mock("../infra/shell-env.js", async (importOriginal) => { - const mod = await importOriginal(); +vi.mock("../infra/shell-env.js", async () => { + const mod = + await vi.importActual("../infra/shell-env.js"); return { ...mod, getShellPathFromLoginShell: shellEnvMocks.getShellPathFromLoginShell, @@ -22,8 +23,10 @@ vi.mock("../infra/shell-env.js", async (importOriginal) => { }; }); -vi.mock("../infra/exec-approvals.js", async (importOriginal) => { - const mod = await importOriginal(); +vi.mock("../infra/exec-approvals.js", async () => { + const mod = await vi.importActual( + "../infra/exec-approvals.js", + ); return { ...mod, resolveExecApprovals: () => createExecApprovals() }; }); diff --git a/src/agents/sandbox/docker.config-hash-recreate.test.ts b/src/agents/sandbox/docker.config-hash-recreate.test.ts index 6339b0039f2..c8c621a6b45 100644 --- a/src/agents/sandbox/docker.config-hash-recreate.test.ts +++ b/src/agents/sandbox/docker.config-hash-recreate.test.ts @@ -85,19 +85,15 @@ function spawnDockerProcess(command: string, args: string[]) { return child; } -async function createChildProcessMock( - importOriginal: () => Promise, -) { - const actual = await importOriginal(); +async function createChildProcessMock() { + const actual = await vi.importActual("node:child_process"); return { ...actual, spawn: spawnDockerProcess, }; } -vi.mock("node:child_process", async (importOriginal) => - createChildProcessMock(() => importOriginal()), -); +vi.mock("node:child_process", async () => createChildProcessMock()); let ensureSandboxContainer: typeof import("./docker.js").ensureSandboxContainer; @@ -107,9 +103,7 @@ async function loadFreshDockerModuleForTest() { readRegistry: registryMocks.readRegistry, updateRegistry: registryMocks.updateRegistry, })); - vi.doMock("node:child_process", async (importOriginal) => - createChildProcessMock(() => importOriginal()), - ); + vi.doMock("node:child_process", async () => createChildProcessMock()); ({ ensureSandboxContainer } = await import("./docker.js")); } diff --git a/src/auto-reply/reply/commands-subagents-focus.test.ts b/src/auto-reply/reply/commands-subagents-focus.test.ts index 51e37125f37..e6b48828fb9 100644 --- a/src/auto-reply/reply/commands-subagents-focus.test.ts +++ b/src/auto-reply/reply/commands-subagents-focus.test.ts @@ -176,17 +176,20 @@ vi.mock("../../gateway/call.js", () => ({ callGateway: hoisted.callGatewayMock, })); -vi.mock("../../acp/runtime/session-meta.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../../acp/runtime/session-meta.js", async () => { + const actual = await vi.importActual( + "../../acp/runtime/session-meta.js", + ); return { ...actual, readAcpSessionEntry: (params: unknown) => hoisted.readAcpSessionEntryMock(params), }; }); -vi.mock("../../infra/outbound/session-binding-service.js", async (importOriginal) => { - const actual = - await importOriginal(); +vi.mock("../../infra/outbound/session-binding-service.js", async () => { + const actual = await vi.importActual< + typeof import("../../infra/outbound/session-binding-service.js") + >("../../infra/outbound/session-binding-service.js"); return { ...actual, getSessionBindingService: () => buildFocusSessionBindingService(), diff --git a/src/auto-reply/reply/groups.test.ts b/src/auto-reply/reply/groups.test.ts index ff0b4fa57e7..db1ea296505 100644 --- a/src/auto-reply/reply/groups.test.ts +++ b/src/auto-reply/reply/groups.test.ts @@ -10,9 +10,9 @@ describe("group runtime loading", () => { it("keeps prompt helpers off the heavy group runtime", async () => { const groupsRuntimeLoads = vi.fn(); - vi.doMock("./groups.runtime.js", async (importOriginal) => { + vi.doMock("./groups.runtime.js", async () => { groupsRuntimeLoads(); - return await importOriginal(); + return await vi.importActual("./groups.runtime.js"); }); const groups = await import("./groups.js"); @@ -40,9 +40,9 @@ describe("group runtime loading", () => { it("loads the group runtime only when requireMention resolution needs it", async () => { const groupsRuntimeLoads = vi.fn(); - vi.doMock("./groups.runtime.js", async (importOriginal) => { + vi.doMock("./groups.runtime.js", async () => { groupsRuntimeLoads(); - return await importOriginal(); + return await vi.importActual("./groups.runtime.js"); }); const groups = await import("./groups.js"); diff --git a/src/commands/agent.test.ts b/src/commands/agent.test.ts index dd1dd5f06e0..5a7775c65ca 100644 --- a/src/commands/agent.test.ts +++ b/src/commands/agent.test.ts @@ -45,8 +45,10 @@ vi.mock("../logging/subsystem.js", () => { }; }); -vi.mock("../agents/auth-profiles.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../agents/auth-profiles.js", async () => { + const actual = await vi.importActual( + "../agents/auth-profiles.js", + ); return { ...actual, ensureAuthProfileStore: vi.fn(() => ({ version: 1, profiles: {} })), @@ -64,8 +66,10 @@ vi.mock("../agents/workspace.js", () => { }; }); -vi.mock("../agents/command/session-store.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../agents/command/session-store.js", async () => { + const actual = await vi.importActual( + "../agents/command/session-store.js", + ); return { ...actual, updateSessionStoreAfterAgentRun: vi.fn(async () => undefined), @@ -110,8 +114,10 @@ async function loadFreshAgentCommandModulesForTest() { vi.doMock("../agents/model-catalog.js", () => ({ loadModelCatalog: loadModelCatalogMock, })); - vi.doMock("../agents/model-selection.js", async (importOriginal) => { - const actual = await importOriginal(); + vi.doMock("../agents/model-selection.js", async () => { + const actual = await vi.importActual( + "../agents/model-selection.js", + ); return { ...actual, isCliProvider: isCliProviderMock, diff --git a/src/commands/channels.add.test.ts b/src/commands/channels.add.test.ts index 77af981b212..9206a419641 100644 --- a/src/commands/channels.add.test.ts +++ b/src/commands/channels.add.test.ts @@ -24,24 +24,30 @@ const manifestRegistryMocks = vi.hoisted(() => ({ loadPluginManifestRegistry: vi.fn(() => ({ plugins: [], diagnostics: [] })), })); -vi.mock("../channels/plugins/catalog.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../channels/plugins/catalog.js", async () => { + const actual = await vi.importActual( + "../channels/plugins/catalog.js", + ); return { ...actual, listChannelPluginCatalogEntries: catalogMocks.listChannelPluginCatalogEntries, }; }); -vi.mock("../plugins/manifest-registry.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../plugins/manifest-registry.js", async () => { + const actual = await vi.importActual( + "../plugins/manifest-registry.js", + ); return { ...actual, loadPluginManifestRegistry: manifestRegistryMocks.loadPluginManifestRegistry, }; }); -vi.mock("./channel-setup/plugin-install.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./channel-setup/plugin-install.js", async () => { + const actual = await vi.importActual( + "./channel-setup/plugin-install.js", + ); const { createMockChannelSetupPluginInstallModule } = await import("./channels.plugin-install.test-helpers.js"); return createMockChannelSetupPluginInstallModule(actual); diff --git a/src/daemon/launchd-restart-handoff.test.ts b/src/daemon/launchd-restart-handoff.test.ts index 1801ecabab2..dcb30f3b309 100644 --- a/src/daemon/launchd-restart-handoff.test.ts +++ b/src/daemon/launchd-restart-handoff.test.ts @@ -3,8 +3,8 @@ import { afterEach, describe, expect, it, vi } from "vitest"; const spawnMock = vi.hoisted(() => vi.fn()); const unrefMock = vi.hoisted(() => vi.fn()); -vi.mock("node:child_process", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("node:child_process", async () => { + const actual = await vi.importActual("node:child_process"); return { ...actual, spawn: (...args: unknown[]) => spawnMock(...args), diff --git a/src/daemon/launchd.test.ts b/src/daemon/launchd.test.ts index 341f071de91..c500615e612 100644 --- a/src/daemon/launchd.test.ts +++ b/src/daemon/launchd.test.ts @@ -96,8 +96,8 @@ vi.mock("../infra/restart-stale-pids.js", () => ({ cleanStaleGatewayProcessesSync: (port?: number) => cleanStaleGatewayProcessesSync(port), })); -vi.mock("node:fs/promises", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("node:fs/promises", async () => { + const actual = await vi.importActual("node:fs/promises"); const wrapped = { ...actual, access: vi.fn(async (p: string) => { diff --git a/src/daemon/runtime-paths.test.ts b/src/daemon/runtime-paths.test.ts index 57116799e85..7fc985b46ee 100644 --- a/src/daemon/runtime-paths.test.ts +++ b/src/daemon/runtime-paths.test.ts @@ -4,8 +4,8 @@ const fsMocks = vi.hoisted(() => ({ access: vi.fn(), })); -vi.mock("node:fs/promises", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("node:fs/promises", async () => { + const actual = await vi.importActual("node:fs/promises"); return { ...actual, default: { diff --git a/src/daemon/schtasks.startup-fallback.test.ts b/src/daemon/schtasks.startup-fallback.test.ts index dc7f0351def..e05ee499201 100644 --- a/src/daemon/schtasks.startup-fallback.test.ts +++ b/src/daemon/schtasks.startup-fallback.test.ts @@ -39,8 +39,8 @@ vi.mock("../utils.js", async () => { }; }); -vi.mock("node:child_process", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("node:child_process", async () => { + const actual = await vi.importActual("node:child_process"); return { ...actual, spawn, diff --git a/src/daemon/systemd.test.ts b/src/daemon/systemd.test.ts index 495f04f40a0..8d95310d470 100644 --- a/src/daemon/systemd.test.ts +++ b/src/daemon/systemd.test.ts @@ -4,11 +4,14 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; const execFileMock = vi.hoisted(() => vi.fn()); -vi.mock("node:child_process", async (importOriginal) => { +vi.mock("node:child_process", async () => { const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js"); - return mockNodeBuiltinModule(importOriginal, { - execFile: execFileMock, - }); + return mockNodeBuiltinModule( + () => vi.importActual("node:child_process"), + { + execFile: execFileMock, + }, + ); }); import { splitArgsPreservingQuotes } from "./arg-split.js"; diff --git a/src/gateway/server-http.hooks-request-timeout.test.ts b/src/gateway/server-http.hooks-request-timeout.test.ts index 4a8c1ec3490..60fa0aec4b2 100644 --- a/src/gateway/server-http.hooks-request-timeout.test.ts +++ b/src/gateway/server-http.hooks-request-timeout.test.ts @@ -9,8 +9,8 @@ const { readJsonBodyMock } = vi.hoisted(() => ({ readJsonBodyMock: vi.fn(), })); -vi.mock("./hooks.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./hooks.js", async () => { + const actual = await vi.importActual("./hooks.js"); return { ...actual, readJsonBody: readJsonBodyMock, diff --git a/src/gateway/server-methods/config.test.ts b/src/gateway/server-methods/config.test.ts index 878e8402423..925dd08e800 100644 --- a/src/gateway/server-methods/config.test.ts +++ b/src/gateway/server-methods/config.test.ts @@ -3,11 +3,14 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { configHandlers, resolveConfigOpenCommand } from "./config.js"; import { createConfigHandlerHarness } from "./config.test-helpers.js"; -vi.mock("node:child_process", async (importOriginal) => { +vi.mock("node:child_process", async () => { const { mockNodeBuiltinModule } = await import("../../../test/helpers/node-builtin-mocks.js"); - return mockNodeBuiltinModule(importOriginal, { - execFile: vi.fn(), - }); + return mockNodeBuiltinModule( + () => vi.importActual("node:child_process"), + { + execFile: vi.fn(), + }, + ); }); function invokeExecFileCallback(args: unknown[], error: Error | null) { diff --git a/src/gateway/startup-auth.test.ts b/src/gateway/startup-auth.test.ts index 19eaa0bb81d..2527f94dde0 100644 --- a/src/gateway/startup-auth.test.ts +++ b/src/gateway/startup-auth.test.ts @@ -6,8 +6,8 @@ const mocks = vi.hoisted(() => ({ replaceConfigFile: vi.fn(async (_params: { nextConfig: OpenClawConfig }) => {}), })); -vi.mock("../config/config.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../config/config.js", async () => { + const actual = await vi.importActual("../config/config.js"); return { ...actual, replaceConfigFile: mocks.replaceConfigFile, diff --git a/src/infra/exec-approval-surface.test.ts b/src/infra/exec-approval-surface.test.ts index 3a1e32a48ef..1ecc9c4c281 100644 --- a/src/infra/exec-approval-surface.test.ts +++ b/src/infra/exec-approval-surface.test.ts @@ -6,8 +6,8 @@ const listChannelPluginsMock = vi.hoisted(() => vi.fn()); const isDeliverableMessageChannelMock = vi.hoisted(() => vi.fn()); const normalizeMessageChannelMock = vi.hoisted(() => vi.fn()); -vi.mock("../config/config.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../config/config.js", async () => { + const actual = await vi.importActual("../config/config.js"); return { ...actual, loadConfig: (...args: unknown[]) => loadConfigMock(...args), diff --git a/src/infra/machine-name.test.ts b/src/infra/machine-name.test.ts index 3c2189ce112..db6ac098fa9 100644 --- a/src/infra/machine-name.test.ts +++ b/src/infra/machine-name.test.ts @@ -4,11 +4,14 @@ import { importFreshModule } from "../../test/helpers/import-fresh.js"; const execFileMock = vi.hoisted(() => vi.fn()); -vi.mock("node:child_process", async (importOriginal) => { +vi.mock("node:child_process", async () => { const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js"); - return mockNodeBuiltinModule(importOriginal, { - execFile: (...args: unknown[]) => execFileMock(...args), - }); + return mockNodeBuiltinModule( + () => vi.importActual("node:child_process"), + { + execFile: (...args: unknown[]) => execFileMock(...args), + }, + ); }); const originalVitest = process.env.VITEST; diff --git a/src/infra/os-summary.test.ts b/src/infra/os-summary.test.ts index b7d64889a6f..33db63acf98 100644 --- a/src/infra/os-summary.test.ts +++ b/src/infra/os-summary.test.ts @@ -3,11 +3,14 @@ import { afterEach, describe, expect, it, vi } from "vitest"; const spawnSyncMock = vi.hoisted(() => vi.fn()); -vi.mock("node:child_process", async (importOriginal) => { +vi.mock("node:child_process", async () => { const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js"); - return mockNodeBuiltinModule(importOriginal, { - spawnSync: (...args: unknown[]) => spawnSyncMock(...args), - }); + return mockNodeBuiltinModule( + () => vi.importActual("node:child_process"), + { + spawnSync: (...args: unknown[]) => spawnSyncMock(...args), + }, + ); }); import { resolveOsSummary } from "./os-summary.js"; diff --git a/src/infra/process-respawn.test.ts b/src/infra/process-respawn.test.ts index 204a86cfbaa..23eab825201 100644 --- a/src/infra/process-respawn.test.ts +++ b/src/infra/process-respawn.test.ts @@ -6,11 +6,14 @@ const spawnMock = vi.hoisted(() => vi.fn()); const triggerOpenClawRestartMock = vi.hoisted(() => vi.fn()); const scheduleDetachedLaunchdRestartHandoffMock = vi.hoisted(() => vi.fn()); -vi.mock("node:child_process", async (importOriginal) => { +vi.mock("node:child_process", async () => { const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js"); - return mockNodeBuiltinModule(importOriginal, { - spawn: (...args: unknown[]) => spawnMock(...args), - }); + return mockNodeBuiltinModule( + () => vi.importActual("node:child_process"), + { + spawn: (...args: unknown[]) => spawnMock(...args), + }, + ); }); vi.mock("./restart.js", () => ({ triggerOpenClawRestart: (...args: unknown[]) => triggerOpenClawRestartMock(...args), diff --git a/src/infra/provider-usage.auth.plugin.test.ts b/src/infra/provider-usage.auth.plugin.test.ts index db994be82c7..c6d4754bce9 100644 --- a/src/infra/provider-usage.auth.plugin.test.ts +++ b/src/infra/provider-usage.auth.plugin.test.ts @@ -4,8 +4,10 @@ const resolveProviderUsageAuthWithPluginMock = vi.fn( async (..._args: unknown[]): Promise => null, ); -vi.mock("../plugins/provider-runtime.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../plugins/provider-runtime.js", async () => { + const actual = await vi.importActual( + "../plugins/provider-runtime.js", + ); return { ...actual, resolveProviderUsageAuthWithPlugin: resolveProviderUsageAuthWithPluginMock, diff --git a/src/infra/restart-stale-pids.test.ts b/src/infra/restart-stale-pids.test.ts index 2c80c186bd4..22da011d1de 100644 --- a/src/infra/restart-stale-pids.test.ts +++ b/src/infra/restart-stale-pids.test.ts @@ -10,12 +10,15 @@ const mockSpawnSync = vi.hoisted(() => vi.fn()); const mockResolveGatewayPort = vi.hoisted(() => vi.fn(() => 18789)); const mockRestartWarn = vi.hoisted(() => vi.fn()); -vi.mock("node:child_process", async (importOriginal) => { +vi.mock("node:child_process", async () => { const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js"); - return mockNodeBuiltinModule(importOriginal, { - spawnSync: (...args: unknown[]) => mockSpawnSync(...args), - execFileSync: vi.fn(), - }); + return mockNodeBuiltinModule( + () => vi.importActual("node:child_process"), + { + spawnSync: (...args: unknown[]) => mockSpawnSync(...args), + execFileSync: vi.fn(), + }, + ); }); vi.mock("../config/paths.js", () => ({ diff --git a/src/infra/update-startup.test.ts b/src/infra/update-startup.test.ts index de7684a906f..6c1a1ee30b4 100644 --- a/src/infra/update-startup.test.ts +++ b/src/infra/update-startup.test.ts @@ -5,8 +5,8 @@ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } import { captureEnv } from "../test-utils/env.js"; import type { UpdateCheckResult } from "./update-check.js"; -vi.mock("./openclaw-root.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./openclaw-root.js", async () => { + const actual = await vi.importActual("./openclaw-root.js"); return { ...actual, resolveOpenClawPackageRoot: vi.fn(), diff --git a/src/infra/windows-task-restart.test.ts b/src/infra/windows-task-restart.test.ts index 1f4177350e8..54140607cf1 100644 --- a/src/infra/windows-task-restart.test.ts +++ b/src/infra/windows-task-restart.test.ts @@ -7,11 +7,14 @@ import { captureFullEnv } from "../test-utils/env.js"; const spawnMock = vi.hoisted(() => vi.fn()); const resolvePreferredOpenClawTmpDirMock = vi.hoisted(() => vi.fn(() => os.tmpdir())); -vi.mock("node:child_process", async (importOriginal) => { +vi.mock("node:child_process", async () => { const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js"); - return mockNodeBuiltinModule(importOriginal, { - spawn: (...args: unknown[]) => spawnMock(...args), - }); + return mockNodeBuiltinModule( + () => vi.importActual("node:child_process"), + { + spawn: (...args: unknown[]) => spawnMock(...args), + }, + ); }); vi.mock("./tmp-openclaw-dir.js", () => ({ resolvePreferredOpenClawTmpDir: () => resolvePreferredOpenClawTmpDirMock(), diff --git a/src/plugins/marketplace.test.ts b/src/plugins/marketplace.test.ts index c3095f4c13d..100e6abdb7f 100644 --- a/src/plugins/marketplace.test.ts +++ b/src/plugins/marketplace.test.ts @@ -28,8 +28,10 @@ vi.mock("./install.js", () => ({ installPluginFromPath: (...args: unknown[]) => installPluginFromPathMock(...args), })); -vi.mock("../infra/net/fetch-guard.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../infra/net/fetch-guard.js", async () => { + const actual = await vi.importActual( + "../infra/net/fetch-guard.js", + ); return { ...actual, fetchWithSsrFGuard: (params: { url: string; init?: RequestInit }) => diff --git a/ui/src/ui/app-gateway.node.test.ts b/ui/src/ui/app-gateway.node.test.ts index 862495a16f8..8fd32842184 100644 --- a/ui/src/ui/app-gateway.node.test.ts +++ b/ui/src/ui/app-gateway.node.test.ts @@ -23,8 +23,8 @@ type GatewayClientMock = { const gatewayClientInstances: GatewayClientMock[] = []; -vi.mock("./gateway.ts", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./gateway.ts", async () => { + const actual = await vi.importActual("./gateway.ts"); function resolveGatewayErrorDetailCode( error: { details?: unknown } | null | undefined, @@ -89,8 +89,9 @@ vi.mock("./gateway.ts", async (importOriginal) => { return { ...actual, GatewayBrowserClient, resolveGatewayErrorDetailCode }; }); -vi.mock("./controllers/chat.ts", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./controllers/chat.ts", async () => { + const actual = + await vi.importActual("./controllers/chat.ts"); return { ...actual, loadChatHistory: loadChatHistoryMock,