import { spawnSync } from "node:child_process";
// Duplicated from `packages/opencode/src/util/process.ts` because the SDK cannot
// import `opencode` without creating a cycle (`opencode` depends on `@opencode-ai/sdk`).
export function stop(proc) {
    if (proc.exitCode !== null || proc.signalCode !== null)
        return;
    if (process.platform === "win32" && proc.pid) {
        const out = spawnSync("taskkill", ["/pid", String(proc.pid), "/T", "/F"], { windowsHide: true });
        if (!out.error && out.status === 0)
            return;
    }
    proc.kill();
}
export function bindAbort(proc, signal, onAbort) {
    if (!signal)
        return () => { };
    const abort = () => {
        clear();
        stop(proc);
        onAbort?.();
    };
    const clear = () => {
        signal.removeEventListener("abort", abort);
        proc.off("exit", clear);
        proc.off("error", clear);
    };
    signal.addEventListener("abort", abort, { once: true });
    proc.on("exit", clear);
    proc.on("error", clear);
    if (signal.aborted)
        abort();
    return clear;
}
