diff --git a/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts b/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts index 21401c23c12..4121bd60393 100644 --- a/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts +++ b/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts @@ -1,10 +1,7 @@ import fs from "node:fs/promises"; import net from "node:net"; import path from "node:path"; -import { - clearConfigCache, - clearRuntimeConfigSnapshot, -} from "openclaw/plugin-sdk/runtime-config-snapshot"; +import { clearRuntimeConfigSnapshot } from "openclaw/plugin-sdk/runtime-config-snapshot"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createTempHomeEnv } from "../../test-support.js"; import { stopBrowserControlService } from "../control-service.js"; @@ -21,14 +18,12 @@ describe("browser client fetch attachOnly diagnostics", () => { beforeEach(async () => { vi.useRealTimers(); await stopBrowserControlService(); - clearConfigCache(); clearRuntimeConfigSnapshot(); }); afterEach(async () => { vi.useRealTimers(); await stopBrowserControlService(); - clearConfigCache(); clearRuntimeConfigSnapshot(); await tempHome?.restore(); tempHome = undefined; @@ -67,7 +62,6 @@ describe("browser client fetch attachOnly diagnostics", () => { ), ); process.env.OPENCLAW_CONFIG_PATH = configPath; - clearConfigCache(); clearRuntimeConfigSnapshot(); try { diff --git a/extensions/memory-core/src/memory/manager-sync-ops.ts b/extensions/memory-core/src/memory/manager-sync-ops.ts index d5d37be47f6..3e62890d186 100644 --- a/extensions/memory-core/src/memory/manager-sync-ops.ts +++ b/extensions/memory-core/src/memory/manager-sync-ops.ts @@ -85,6 +85,17 @@ const IGNORED_MEMORY_WATCH_DIR_NAMES = new Set([ ]); const log = createSubsystemLogger("memory"); +const TEST_MEMORY_WATCH_FACTORY_KEY = Symbol.for("openclaw.test.memoryWatchFactory"); + +function resolveMemoryWatchFactory(): typeof chokidar.watch { + if (process.env.VITEST === "true" || process.env.NODE_ENV === "test") { + const override = (globalThis as Record)[TEST_MEMORY_WATCH_FACTORY_KEY]; + if (typeof override === "function") { + return override as typeof chokidar.watch; + } + } + return chokidar.watch.bind(chokidar); +} function shouldIgnoreMemoryWatchPath( watchPath: string, @@ -396,7 +407,7 @@ export abstract class MemoryManagerSyncOps { // Skip missing/unreadable additional paths. } } - this.watcher = chokidar.watch(Array.from(watchPaths), { + this.watcher = resolveMemoryWatchFactory()(Array.from(watchPaths), { ignoreInitial: true, ignored: (watchPath, stats) => shouldIgnoreMemoryWatchPath(watchPath, stats, this.settings.multimodal), diff --git a/extensions/memory-core/src/memory/manager.watcher-config.test.ts b/extensions/memory-core/src/memory/manager.watcher-config.test.ts index a3964dfac35..8b9020eefdd 100644 --- a/extensions/memory-core/src/memory/manager.watcher-config.test.ts +++ b/extensions/memory-core/src/memory/manager.watcher-config.test.ts @@ -5,9 +5,7 @@ import type { MemorySearchConfig, OpenClawConfig, } from "openclaw/plugin-sdk/memory-core-host-engine-foundation"; -import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { MemoryIndexManager } from "./index.js"; -import { registerBuiltInMemoryEmbeddingProviders } from "./provider-adapters.js"; +import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from "vitest"; type WatchIgnoredFn = (watchPath: string, stats?: { isDirectory?: () => boolean }) => boolean; @@ -31,7 +29,7 @@ const { createdWatchers, watchMock } = vi.hoisted(() => { return watcher; } const watchers: Array> = []; - return { + const result = { createdWatchers: watchers, watchMock: vi.fn(() => { const watcher = createMockWatcher(); @@ -39,6 +37,9 @@ const { createdWatchers, watchMock } = vi.hoisted(() => { return watcher; }), }; + (globalThis as Record)[Symbol.for("openclaw.test.memoryWatchFactory")] = + result.watchMock; + return result; }); vi.mock("chokidar", () => ({ @@ -62,35 +63,32 @@ vi.mock("./embeddings.js", () => ({ }), })); -type MemoryIndexModule = typeof import("./index.js"); -type MemoryEmbeddingProvidersModule = - typeof import("openclaw/plugin-sdk/memory-core-host-engine-embeddings"); - -let getMemorySearchManager: MemoryIndexModule["getMemorySearchManager"]; -let closeAllMemorySearchManagers: MemoryIndexModule["closeAllMemorySearchManagers"]; -let clearRegistry: MemoryEmbeddingProvidersModule["clearMemoryEmbeddingProviders"]; -let registerAdapter: MemoryEmbeddingProvidersModule["registerMemoryEmbeddingProvider"]; +import { + clearMemoryEmbeddingProviders as clearRegistry, + registerMemoryEmbeddingProvider as registerAdapter, +} from "openclaw/plugin-sdk/memory-core-host-engine-embeddings"; +import { + closeAllMemorySearchManagers, + getMemorySearchManager, + type MemoryIndexManager, +} from "./index.js"; +import { registerBuiltInMemoryEmbeddingProviders } from "./provider-adapters.js"; describe("memory watcher config", () => { let manager: MemoryIndexManager | null = null; let workspaceDir = ""; let extraDir = ""; - beforeAll(async () => { - vi.resetModules(); - ({ getMemorySearchManager, closeAllMemorySearchManagers } = await import("./index.js")); - ({ - clearMemoryEmbeddingProviders: clearRegistry, - registerMemoryEmbeddingProvider: registerAdapter, - } = await import("openclaw/plugin-sdk/memory-core-host-engine-embeddings")); - }); - beforeEach(async () => { vi.clearAllMocks(); clearRegistry(); registerBuiltInMemoryEmbeddingProviders({ registerMemoryEmbeddingProvider: registerAdapter }); }); + afterAll(() => { + Reflect.deleteProperty(globalThis, Symbol.for("openclaw.test.memoryWatchFactory")); + }); + afterEach(async () => { vi.useRealTimers(); watchMock.mockClear(); @@ -108,10 +106,6 @@ describe("memory watcher config", () => { } }); - afterAll(() => { - vi.resetModules(); - }); - async function setupWatcherWorkspace(seedFile: { name: string; contents: string }) { workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-memory-watch-")); extraDir = path.join(workspaceDir, "extra"); @@ -134,6 +128,7 @@ describe("memory watcher config", () => { }, }; return { + memory: { backend: "builtin" }, agents: { defaults, list: [{ id: "main", default: true }], @@ -147,6 +142,8 @@ describe("memory watcher config", () => { if (!result.manager) { throw new Error("manager missing"); } + expect(result.manager.status().backend).toBe("builtin"); + expect(result.manager.status().sources).toContain("memory"); manager = result.manager as unknown as MemoryIndexManager; }