fix(package): force taskkill candidate runner trees on windows

This commit is contained in:
Vincent Koc
2026-06-21 07:33:04 +02:00
parent f640ca11f9
commit 4b2298e8cb
2 changed files with 30 additions and 0 deletions

View File

@@ -328,6 +328,12 @@ export function signalChildProcessTree(
if (!result?.error && result?.status === 0) {
return;
}
if (signal !== "SIGKILL") {
const forceResult = runTaskkill("taskkill", [...args, "/F"], { stdio: "ignore" });
if (!forceResult?.error && forceResult?.status === 0) {
return;
}
}
}
child.kill(signal);
}

View File

@@ -240,6 +240,30 @@ describe("resolve-openclaw-package-candidate", () => {
expect(child.kill).not.toHaveBeenCalled();
});
it("force-kills Windows package runner process trees when graceful taskkill fails", () => {
const child = {
kill: vi.fn(),
pid: 12345,
};
const runTaskkill = vi
.fn()
.mockReturnValueOnce({ error: undefined, status: 1 })
.mockReturnValueOnce({ error: undefined, status: 0 });
signalChildProcessTree(child, "SIGTERM", {
platform: "win32",
runTaskkill,
});
expect(runTaskkill).toHaveBeenNthCalledWith(1, "taskkill", ["/PID", "12345", "/T"], {
stdio: "ignore",
});
expect(runTaskkill).toHaveBeenNthCalledWith(2, "taskkill", ["/PID", "12345", "/T", "/F"], {
stdio: "ignore",
});
expect(child.kill).not.toHaveBeenCalled();
});
it("keeps npm pack filenames inside the package candidate output directory", async () => {
const dir = await mkdtemp(path.join(tmpdir(), "openclaw-package-npm-pack-"));
tempDirs.push(dir);