import { colorize, isRich as isRichTerminal, theme } from "../../terminal/theme.js"; export const isRich = (opts?: { json?: boolean; plain?: boolean }) => Boolean(isRichTerminal() && !opts?.json && !opts?.plain); export const pad = (value: string, size: number) => value.padEnd(size); export const formatKey = (key: string, rich: boolean) => colorize(rich, theme.warn, key); export const formatValue = (value: string, rich: boolean) => colorize(rich, theme.info, value); export const formatKeyValue = ( key: string, value: string, rich: boolean, valueColor: (value: string) => string = theme.info, ) => `${formatKey(key, rich)}=${colorize(rich, valueColor, value)}`; export const formatSeparator = (rich: boolean) => colorize(rich, theme.muted, " | "); export const formatTag = (tag: string, rich: boolean) => { if (!rich) return tag; if (tag === "default") return theme.success(tag); if (tag === "image") return theme.accentBright(tag); if (tag === "configured") return theme.accent(tag); if (tag === "missing") return theme.error(tag); if (tag.startsWith("fallback#")) return theme.warn(tag); if (tag.startsWith("img-fallback#")) return theme.warn(tag); if (tag.startsWith("alias:")) return theme.accentDim(tag); return theme.muted(tag); }; export const truncate = (value: string, max: number) => { if (value.length <= max) return value; if (max <= 3) return value.slice(0, max); return `${value.slice(0, max - 3)}...`; }; export const maskApiKey = (value: string): string => { const trimmed = value.trim(); if (!trimmed) return "missing"; if (trimmed.length <= 16) return trimmed; return `${trimmed.slice(0, 8)}...${trimmed.slice(-8)}`; };