diff --git a/src/auto-reply/reply.triggers.trigger-handling.test-harness.ts b/src/auto-reply/reply.triggers.trigger-handling.test-harness.ts index 944caa7b25..4f9457679d 100644 --- a/src/auto-reply/reply.triggers.trigger-handling.test-harness.ts +++ b/src/auto-reply/reply.triggers.trigger-handling.test-harness.ts @@ -1,5 +1,5 @@ import { join } from "node:path"; -import { afterEach, vi } from "vitest"; +import { afterEach, type MockInstance, vi } from "vitest"; import { withTempHome as withTempHomeBase } from "../../test/helpers/temp-home.js"; const piEmbeddedMocks = vi.hoisted(() => ({ @@ -11,19 +11,19 @@ const piEmbeddedMocks = vi.hoisted(() => ({ isEmbeddedPiRunStreaming: vi.fn().mockReturnValue(false), })); -export function getAbortEmbeddedPiRunMock() { +export function getAbortEmbeddedPiRunMock(): MockInstance { return piEmbeddedMocks.abortEmbeddedPiRun; } -export function getCompactEmbeddedPiSessionMock() { +export function getCompactEmbeddedPiSessionMock(): MockInstance { return piEmbeddedMocks.compactEmbeddedPiSession; } -export function getRunEmbeddedPiAgentMock() { +export function getRunEmbeddedPiAgentMock(): MockInstance { return piEmbeddedMocks.runEmbeddedPiAgent; } -export function getQueueEmbeddedPiMessageMock() { +export function getQueueEmbeddedPiMessageMock(): MockInstance { return piEmbeddedMocks.queueEmbeddedPiMessage; } @@ -49,7 +49,7 @@ const providerUsageMocks = vi.hoisted(() => ({ resolveUsageProviderId: vi.fn((provider: string) => provider.split("/")[0]), })); -export function getProviderUsageMocks() { +export function getProviderUsageMocks(): Record { return providerUsageMocks; } @@ -77,7 +77,7 @@ const modelCatalogMocks = vi.hoisted(() => ({ resetModelCatalogCacheForTest: vi.fn(), })); -export function getModelCatalogMocks() { +export function getModelCatalogMocks(): Record { return modelCatalogMocks; } @@ -89,7 +89,7 @@ const webSessionMocks = vi.hoisted(() => ({ readWebSelfId: vi.fn().mockReturnValue({ e164: "+1999" }), })); -export function getWebSessionMocks() { +export function getWebSessionMocks(): Record { return webSessionMocks; } diff --git a/src/auto-reply/reply/agent-runner.heartbeat-typing.test-harness.ts b/src/auto-reply/reply/agent-runner.heartbeat-typing.test-harness.ts index 64dacf3a7b..01db5693c1 100644 --- a/src/auto-reply/reply/agent-runner.heartbeat-typing.test-harness.ts +++ b/src/auto-reply/reply/agent-runner.heartbeat-typing.test-harness.ts @@ -1,4 +1,4 @@ -import { beforeEach, vi } from "vitest"; +import { beforeEach, type MockInstance, vi } from "vitest"; import type { SessionEntry } from "../../config/sessions.js"; import type { TypingMode } from "../../config/types.js"; import type { TemplateContext } from "../templating.js"; @@ -10,7 +10,7 @@ const state = vi.hoisted(() => ({ runEmbeddedPiAgentMock: vi.fn(), })); -export function getRunEmbeddedPiAgentMock() { +export function getRunEmbeddedPiAgentMock(): MockInstance { return state.runEmbeddedPiAgentMock; } diff --git a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.increments-compaction-count-flush-compaction-completes.test.ts b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.increments-compaction-count-flush-compaction-completes.test.ts index 6238322328..604938da97 100644 --- a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.increments-compaction-count-flush-compaction-completes.test.ts +++ b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.increments-compaction-count-flush-compaction-completes.test.ts @@ -2,7 +2,6 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import { runReplyAgent } from "./agent-runner.js"; import { createBaseRun, getRunEmbeddedPiAgentMock, @@ -13,6 +12,7 @@ import { DEFAULT_MEMORY_FLUSH_PROMPT } from "./memory-flush.js"; describe("runReplyAgent memory flush", () => { it("increments compaction count when flush compaction completes", async () => { + const { runReplyAgent } = await import("./agent-runner.js"); const runEmbeddedPiAgentMock = getRunEmbeddedPiAgentMock(); runEmbeddedPiAgentMock.mockReset(); const tmp = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-flush-")); diff --git a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.runs-memory-flush-turn-updates-session-metadata.test.ts b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.runs-memory-flush-turn-updates-session-metadata.test.ts index b513d7168d..2b69cf5f25 100644 --- a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.runs-memory-flush-turn-updates-session-metadata.test.ts +++ b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.runs-memory-flush-turn-updates-session-metadata.test.ts @@ -1,8 +1,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { describe, expect, it } from "vitest"; -import { runReplyAgent } from "./agent-runner.js"; +import { beforeAll, describe, expect, it } from "vitest"; import { createBaseRun, getRunEmbeddedPiAgentMock, @@ -11,6 +10,12 @@ import { } from "./agent-runner.memory-flush.test-harness.js"; import { DEFAULT_MEMORY_FLUSH_PROMPT } from "./memory-flush.js"; +let runReplyAgent: typeof import("./agent-runner.js").runReplyAgent; + +beforeAll(async () => { + ({ runReplyAgent } = await import("./agent-runner.js")); +}); + describe("runReplyAgent memory flush", () => { it("runs a memory flush turn and updates session metadata", async () => { const runEmbeddedPiAgentMock = getRunEmbeddedPiAgentMock(); diff --git a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.skips-memory-flush-cli-providers.test.ts b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.skips-memory-flush-cli-providers.test.ts index 0cdd6d207c..39cfcacf4f 100644 --- a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.skips-memory-flush-cli-providers.test.ts +++ b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.skips-memory-flush-cli-providers.test.ts @@ -2,7 +2,6 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import { runReplyAgent } from "./agent-runner.js"; import { createBaseRun, getRunCliAgentMock, @@ -13,6 +12,7 @@ import { describe("runReplyAgent memory flush", () => { it("skips memory flush for CLI providers", async () => { + const { runReplyAgent } = await import("./agent-runner.js"); const runEmbeddedPiAgentMock = getRunEmbeddedPiAgentMock(); const runCliAgentMock = getRunCliAgentMock(); runEmbeddedPiAgentMock.mockReset(); diff --git a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.skips-memory-flush-sandbox-workspace-is-read.test.ts b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.skips-memory-flush-sandbox-workspace-is-read.test.ts index f20e5bbd0f..642e3615a7 100644 --- a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.skips-memory-flush-sandbox-workspace-is-read.test.ts +++ b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.skips-memory-flush-sandbox-workspace-is-read.test.ts @@ -1,8 +1,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { describe, expect, it } from "vitest"; -import { runReplyAgent } from "./agent-runner.js"; +import { beforeAll, describe, expect, it } from "vitest"; import { createBaseRun, getRunEmbeddedPiAgentMock, @@ -10,6 +9,12 @@ import { type EmbeddedRunParams, } from "./agent-runner.memory-flush.test-harness.js"; +let runReplyAgent: typeof import("./agent-runner.js").runReplyAgent; + +beforeAll(async () => { + ({ runReplyAgent } = await import("./agent-runner.js")); +}); + describe("runReplyAgent memory flush", () => { it("skips memory flush when the sandbox workspace is read-only", async () => { const runEmbeddedPiAgentMock = getRunEmbeddedPiAgentMock(); diff --git a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.uses-configured-prompts-memory-flush-runs.test.ts b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.uses-configured-prompts-memory-flush-runs.test.ts index 404e25f884..73e1e55d21 100644 --- a/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.uses-configured-prompts-memory-flush-runs.test.ts +++ b/src/auto-reply/reply/agent-runner.memory-flush.runreplyagent-memory-flush.uses-configured-prompts-memory-flush-runs.test.ts @@ -1,8 +1,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { describe, expect, it } from "vitest"; -import { runReplyAgent } from "./agent-runner.js"; +import { beforeAll, describe, expect, it } from "vitest"; import { createBaseRun, getRunEmbeddedPiAgentMock, @@ -11,6 +10,12 @@ import { } from "./agent-runner.memory-flush.test-harness.js"; import { DEFAULT_MEMORY_FLUSH_PROMPT } from "./memory-flush.js"; +let runReplyAgent: typeof import("./agent-runner.js").runReplyAgent; + +beforeAll(async () => { + ({ runReplyAgent } = await import("./agent-runner.js")); +}); + describe("runReplyAgent memory flush", () => { it("uses configured prompts for memory flush runs", async () => { const runEmbeddedPiAgentMock = getRunEmbeddedPiAgentMock(); diff --git a/src/auto-reply/reply/agent-runner.memory-flush.test-harness.ts b/src/auto-reply/reply/agent-runner.memory-flush.test-harness.ts index 35491c8c54..af5ecd487f 100644 --- a/src/auto-reply/reply/agent-runner.memory-flush.test-harness.ts +++ b/src/auto-reply/reply/agent-runner.memory-flush.test-harness.ts @@ -1,6 +1,6 @@ import fs from "node:fs/promises"; import path from "node:path"; -import { vi } from "vitest"; +import { type MockInstance, vi } from "vitest"; import type { TemplateContext } from "../templating.js"; import type { FollowupRun, QueueSettings } from "./queue.js"; import { createMockTypingController } from "./test-helpers.js"; @@ -16,11 +16,11 @@ const state = vi.hoisted(() => ({ runCliAgentMock: vi.fn(), })); -export function getRunEmbeddedPiAgentMock() { +export function getRunEmbeddedPiAgentMock(): MockInstance { return state.runEmbeddedPiAgentMock; } -export function getRunCliAgentMock() { +export function getRunCliAgentMock(): MockInstance { return state.runCliAgentMock; } diff --git a/src/imessage/monitor.skips-group-messages-without-mention-by-default.test.ts b/src/imessage/monitor.skips-group-messages-without-mention-by-default.test.ts index c5d94d6009..7e40bc855a 100644 --- a/src/imessage/monitor.skips-group-messages-without-mention-by-default.test.ts +++ b/src/imessage/monitor.skips-group-messages-without-mention-by-default.test.ts @@ -1,5 +1,4 @@ -import { describe, expect, it } from "vitest"; -import { monitorIMessageProvider } from "./monitor.js"; +import { beforeAll, describe, expect, it } from "vitest"; import { flush, getCloseResolve, @@ -15,6 +14,12 @@ import { installMonitorIMessageProviderTestHooks(); +let monitorIMessageProvider: typeof import("./monitor.js").monitorIMessageProvider; + +beforeAll(async () => { + ({ monitorIMessageProvider } = await import("./monitor.js")); +}); + const replyMock = getReplyMock(); const sendMock = getSendMock(); const upsertPairingRequestMock = getUpsertPairingRequestMock(); diff --git a/src/imessage/monitor.test-harness.ts b/src/imessage/monitor.test-harness.ts index f2f9d9d5ee..ba5e07ca41 100644 --- a/src/imessage/monitor.test-harness.ts +++ b/src/imessage/monitor.test-harness.ts @@ -1,4 +1,4 @@ -import { beforeEach, vi } from "vitest"; +import { beforeEach, type MockInstance, vi } from "vitest"; type NotificationHandler = (msg: { method: string; params?: unknown }) => void; @@ -15,31 +15,31 @@ const state = vi.hoisted(() => ({ closeResolve: undefined as (() => void) | undefined, })); -export function getRequestMock() { +export function getRequestMock(): MockInstance { return state.requestMock; } -export function getStopMock() { +export function getStopMock(): MockInstance { return state.stopMock; } -export function getSendMock() { +export function getSendMock(): MockInstance { return state.sendMock; } -export function getReplyMock() { +export function getReplyMock(): MockInstance { return state.replyMock; } -export function getUpdateLastRouteMock() { +export function getUpdateLastRouteMock(): MockInstance { return state.updateLastRouteMock; } -export function getReadAllowFromStoreMock() { +export function getReadAllowFromStoreMock(): MockInstance { return state.readAllowFromStoreMock; } -export function getUpsertPairingRequestMock() { +export function getUpsertPairingRequestMock(): MockInstance { return state.upsertPairingRequestMock; } diff --git a/src/imessage/monitor.updates-last-route-chat-id-direct-messages.test.ts b/src/imessage/monitor.updates-last-route-chat-id-direct-messages.test.ts index 77ea5da3f6..acd27af8ca 100644 --- a/src/imessage/monitor.updates-last-route-chat-id-direct-messages.test.ts +++ b/src/imessage/monitor.updates-last-route-chat-id-direct-messages.test.ts @@ -1,5 +1,4 @@ -import { describe, expect, it } from "vitest"; -import { monitorIMessageProvider } from "./monitor.js"; +import { beforeAll, describe, expect, it } from "vitest"; import { flush, getCloseResolve, @@ -14,6 +13,12 @@ import { installMonitorIMessageProviderTestHooks(); +let monitorIMessageProvider: typeof import("./monitor.js").monitorIMessageProvider; + +beforeAll(async () => { + ({ monitorIMessageProvider } = await import("./monitor.js")); +}); + const replyMock = getReplyMock(); const requestMock = getRequestMock(); const stopMock = getStopMock(); diff --git a/src/web/auto-reply.web-auto-reply.requires-mention-group-chats-injects-history-replying.test.ts b/src/web/auto-reply.web-auto-reply.requires-mention-group-chats-injects-history-replying.test.ts index 8e2eb04cf4..e4a072fba6 100644 --- a/src/web/auto-reply.web-auto-reply.requires-mention-group-chats-injects-history-replying.test.ts +++ b/src/web/auto-reply.web-auto-reply.requires-mention-group-chats-injects-history-replying.test.ts @@ -1,8 +1,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { describe, expect, it, vi } from "vitest"; -import { monitorWebChannel } from "./auto-reply.js"; +import { beforeAll, describe, expect, it, vi } from "vitest"; import { installWebAutoReplyTestHomeHooks, installWebAutoReplyUnitTestHooks, @@ -13,6 +12,12 @@ import { installWebAutoReplyTestHomeHooks(); +let monitorWebChannel: typeof import("./auto-reply.js").monitorWebChannel; + +beforeAll(async () => { + ({ monitorWebChannel } = await import("./auto-reply.js")); +}); + describe("web auto-reply", () => { installWebAutoReplyUnitTestHooks(); diff --git a/src/web/auto-reply.web-auto-reply.supports-always-group-activation-silent-token-preserves.test.ts b/src/web/auto-reply.web-auto-reply.supports-always-group-activation-silent-token-preserves.test.ts index 2e82d400f4..91dfa5326f 100644 --- a/src/web/auto-reply.web-auto-reply.supports-always-group-activation-silent-token-preserves.test.ts +++ b/src/web/auto-reply.web-auto-reply.supports-always-group-activation-silent-token-preserves.test.ts @@ -1,9 +1,8 @@ import crypto from "node:crypto"; import fs from "node:fs/promises"; -import { describe, expect, it, vi } from "vitest"; +import { beforeAll, describe, expect, it, vi } from "vitest"; import { expectInboundContextContract } from "../../test/helpers/inbound-contract.js"; import { setLoggerOverride } from "../logging.js"; -import { monitorWebChannel, SILENT_REPLY_TOKEN } from "./auto-reply.js"; import { installWebAutoReplyTestHomeHooks, installWebAutoReplyUnitTestHooks, @@ -14,6 +13,13 @@ import { installWebAutoReplyTestHomeHooks(); +let monitorWebChannel: typeof import("./auto-reply.js").monitorWebChannel; +let SILENT_REPLY_TOKEN: typeof import("./auto-reply.js").SILENT_REPLY_TOKEN; + +beforeAll(async () => { + ({ monitorWebChannel, SILENT_REPLY_TOKEN } = await import("./auto-reply.js")); +}); + describe("web auto-reply", () => { installWebAutoReplyUnitTestHooks(); diff --git a/src/web/auto-reply.web-auto-reply.uses-per-agent-mention-patterns-group-gating.test.ts b/src/web/auto-reply.web-auto-reply.uses-per-agent-mention-patterns-group-gating.test.ts index 16ceb6051c..c1ba2ade6a 100644 --- a/src/web/auto-reply.web-auto-reply.uses-per-agent-mention-patterns-group-gating.test.ts +++ b/src/web/auto-reply.web-auto-reply.uses-per-agent-mention-patterns-group-gating.test.ts @@ -1,5 +1,4 @@ -import { describe, expect, it, vi } from "vitest"; -import { monitorWebChannel } from "./auto-reply.js"; +import { beforeAll, describe, expect, it, vi } from "vitest"; import { installWebAutoReplyTestHomeHooks, installWebAutoReplyUnitTestHooks, @@ -9,6 +8,12 @@ import { installWebAutoReplyTestHomeHooks(); +let monitorWebChannel: typeof import("./auto-reply.js").monitorWebChannel; + +beforeAll(async () => { + ({ monitorWebChannel } = await import("./auto-reply.js")); +}); + describe("web auto-reply", () => { installWebAutoReplyUnitTestHooks();