import type { SessionStatus } from "./status.types.js"; export const formatKTokens = (value: number) => `${(value / 1000).toFixed(value >= 10_000 ? 0 : 1)}k`; export const formatAge = (ms: number | null | undefined) => { if (!ms || ms < 0) return "unknown"; const minutes = Math.round(ms / 60_000); if (minutes < 1) return "just now"; if (minutes < 60) return `${minutes}m ago`; const hours = Math.round(minutes / 60); if (hours < 48) return `${hours}h ago`; const days = Math.round(hours / 24); return `${days}d ago`; }; export const formatDuration = (ms: number | null | undefined) => { if (ms == null || !Number.isFinite(ms)) return "unknown"; if (ms < 1000) return `${Math.round(ms)}ms`; return `${(ms / 1000).toFixed(1)}s`; }; export const shortenText = (value: string, maxLen: number) => { const chars = Array.from(value); if (chars.length <= maxLen) return value; return `${chars.slice(0, Math.max(0, maxLen - 1)).join("")}…`; }; export const formatTokensCompact = ( sess: Pick, ) => { const used = sess.totalTokens ?? 0; const ctx = sess.contextTokens; if (!ctx) return `${formatKTokens(used)} used`; const pctLabel = sess.percentUsed != null ? `${sess.percentUsed}%` : "?%"; return `${formatKTokens(used)}/${formatKTokens(ctx)} (${pctLabel})`; }; export const formatDaemonRuntimeShort = (runtime?: { status?: string; pid?: number; state?: string; detail?: string; missingUnit?: boolean; }) => { if (!runtime) return null; const status = runtime.status ?? "unknown"; const details: string[] = []; if (runtime.pid) details.push(`pid ${runtime.pid}`); if (runtime.state && runtime.state.toLowerCase() !== status) { details.push(`state ${runtime.state}`); } const detail = runtime.detail?.replace(/\s+/g, " ").trim() || ""; const noisyLaunchctlDetail = runtime.missingUnit === true && detail.toLowerCase().includes("could not find service"); if (detail && !noisyLaunchctlDetail) details.push(detail); return details.length > 0 ? `${status} (${details.join(", ")})` : status; };