import { styleText } from "node:util"; import * as p from "@clack/prompts"; import { loadNetwork, type Network } from "../core/network.js"; const dim = (s: string) => styleText("dim", s); export async function run(flags: { json?: boolean; all?: boolean; fresh?: boolean; }) { if (!flags.json) p.intro(styleText("green", "fiddling with knots")); const spin = flags.json ? null : p.spinner(); spin?.start("assembling the network"); let network: Network; try { network = await loadNetwork(!!flags.fresh, (msg) => spin?.message(msg)); } catch (err) { spin?.stop("upstream failure", 1); console.error(err instanceof Error ? err.message : err); process.exit(2); } spin?.stop(`network assembled ${dim(`(${network.generatedAt})`)}`); if (flags.json) { console.log(JSON.stringify(network.spindles, null, 2)); return; } const shown = flags.all ? network.spindles : network.spindles.filter((s) => !s.local); const hidden = network.spindles.length - shown.length; const status = (s: (typeof shown)[number]) => { if (s.local) return dim("local"); if (s.probe?.reachable) return styleText("green", `up ${s.probe.latencyMs ?? "?"}ms`); return styleText("red", "down"); }; const rows = shown.map((s) => [ s.host, String(s.repoCount), status(s), s.owners[0] ? `@${s.owners[0].handle}${s.owners.length > 1 ? dim(` +${s.owners.length - 1}`) : ""}` : dim("—"), ]); const header = ["HOST", "REPOS", "STATUS", "OWNER"]; // biome-ignore lint/suspicious/noControlCharactersInRegex: stripping our own ansi colors for width math const visible = (s: string) => s.replace(/\x1b\[\d+m/g, "").length; const widths = header.map((h, i) => Math.max(h.length, ...rows.map((r) => visible(r[i]))), ); const line = (cells: string[]) => cells.map((c, i) => c + " ".repeat(widths[i] - visible(c))).join(" "); p.log.message([dim(line(header)), ...rows.map((r) => line(r))].join("\n")); const reachable = shown.filter((s) => s.probe?.reachable).length; p.outro( dim( `${shown.length} spindles · ${reachable} reachable` + (hidden ? ` · ${hidden} local/dev hidden (--all)` : ""), ), ); }