import { execFileSync } from "node:child_process"; export type GpuVendor = "nvidia" | "amd" | "intel"; // ponytail: card-generation nuance (e.g. Nouveau for pre-Turing NVIDIA cards) isn't // handled — add if an unsupported-card report comes in. const DRIVER_PACKAGES: Record = { nvidia: ["nvidia-open-dkms", "nvidia-utils", "egl-wayland"], amd: ["mesa", "vulkan-radeon", "libva-mesa-driver"], intel: ["mesa", "vulkan-intel", "intel-media-driver"], }; const VENDOR_PATTERNS: [RegExp, GpuVendor][] = [ [/nvidia/i, "nvidia"], [/\b(amd|ati)\b/i, "amd"], [/intel/i, "intel"], ]; export function detectGpuVendors(): GpuVendor[] { let output: string; try { output = execFileSync("lspci", [], { encoding: "utf8" }); } catch { return []; } const controllerLines = output .split("\n") .filter((line) => /VGA compatible controller|3D controller/i.test(line)); const found = new Set(); for (const line of controllerLines) { for (const [pattern, vendor] of VENDOR_PATTERNS) { if (pattern.test(line)) found.add(vendor); } } return [...found]; } export function driverPackagesFor(vendors: GpuVendor[]): string[] { return vendors.flatMap((vendor) => DRIVER_PACKAGES[vendor]); }