diff --git a/src/canvas-host/server.test.ts b/src/canvas-host/server.test.ts index 600e6df74..06132469b 100644 --- a/src/canvas-host/server.test.ts +++ b/src/canvas-host/server.test.ts @@ -231,7 +231,7 @@ describe("canvas host", () => { await server.close(); await fs.rm(dir, { recursive: true, force: true }); } - }); + }, 10_000); it("serves the gateway-hosted A2UI scaffold", async () => { const dir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-canvas-")); diff --git a/src/canvas-host/server.ts b/src/canvas-host/server.ts index 871c70e9f..85eb3bc33 100644 --- a/src/canvas-host/server.ts +++ b/src/canvas-host/server.ts @@ -271,6 +271,7 @@ export async function createCanvasHostHandler( ? chokidar.watch(rootReal, { ignoreInitial: true, awaitWriteFinish: { stabilityThreshold: 75, pollInterval: 10 }, + usePolling: opts.allowInTests === true, ignored: [ /(^|[\\/])\../, // dotfiles /(^|[\\/])node_modules([\\/]|$)/, diff --git a/src/gateway/config-reload.ts b/src/gateway/config-reload.ts index 65303873a..f053dcd2e 100644 --- a/src/gateway/config-reload.ts +++ b/src/gateway/config-reload.ts @@ -360,13 +360,18 @@ export function startGatewayConfigReloader(opts: { const watcher = chokidar.watch(opts.watchPath, { ignoreInitial: true, awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 }, + usePolling: Boolean(process.env.VITEST), }); watcher.on("add", schedule); watcher.on("change", schedule); watcher.on("unlink", schedule); + let watcherClosed = false; watcher.on("error", (err) => { + if (watcherClosed) return; + watcherClosed = true; opts.log.warn(`config watcher error: ${String(err)}`); + void watcher.close().catch(() => {}); }); return { @@ -374,6 +379,7 @@ export function startGatewayConfigReloader(opts: { stopped = true; if (debounceTimer) clearTimeout(debounceTimer); debounceTimer = null; + watcherClosed = true; await watcher.close().catch(() => {}); }, };