import path from "node:path"; import type { AdapterEnvironmentCheck, AdapterEnvironmentTestResult } from "./types.js"; export function summarizeStatus(checks: AdapterEnvironmentCheck[]): AdapterEnvironmentTestResult["status"] { if (checks.some((check) => check.level === "error")) return "fail"; if (checks.some((check) => check.level === "warn")) return "warn"; return "pass"; } export function isNonEmpty(value: unknown): value is string { return typeof value === "string" && value.trim().length > 0; } export function firstNonEmptyLine(text: string): string { return ( text .split(/\r?\n/) .map((line) => line.trim()) .find(Boolean) ?? "" ); } export function commandLooksLike(command: string, expected: string): boolean { const base = path.basename(command).toLowerCase(); return base === expected || base === `${expected}.cmd` || base === `${expected}.exe`; } export function summarizeProbeDetail(stdout: string, stderr: string, parsedError?: string | null): string | null { const raw = parsedError?.trim() || firstNonEmptyLine(stderr) || firstNonEmptyLine(stdout); if (!raw) return null; const clean = raw.replace(/\s+/g, " ").trim(); const max = 240; return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean; } export function normalizeEnv(input: unknown): Record { if (typeof input !== "object" || input === null || Array.isArray(input)) return {}; const env: Record = {}; for (const [key, value] of Object.entries(input as Record)) { if (typeof value === "string") env[key] = value; } return env; }