import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { vi } from "vitest"; import type { PortUsage } from "../../infra/ports-types.js"; import type { killProcessTree as killProcessTreeImpl } from "../../process/kill-tree.js"; import type { MockFn } from "../../test-utils/vitest-mock-fn.js"; export const schtasksResponses: Array<{ code: number; stdout: string; stderr: string }> = []; export const schtasksCalls: string[][] = []; export const inspectPortUsage: MockFn<(port: number) => Promise> = vi.fn(); export const killProcessTree: MockFn = vi.fn(); export async function withWindowsEnv( prefix: string, run: (params: { tmpDir: string; env: Record }) => Promise, ) { const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), prefix)); const env = { USERPROFILE: tmpDir, APPDATA: path.join(tmpDir, "AppData", "Roaming"), OPENCLAW_PROFILE: "default", OPENCLAW_GATEWAY_PORT: "18789", }; try { await run({ tmpDir, env }); } finally { await fs.rm(tmpDir, { recursive: true, force: true }); } } export function resetSchtasksBaseMocks() { schtasksResponses.length = 0; schtasksCalls.length = 0; inspectPortUsage.mockReset(); killProcessTree.mockReset(); }