// Short "Xs/m/h/d/mo/y" relative time without "ago" suffix (ProjectSidebar). export function relTime(iso: string): string { const now = Date.now(); const t = Date.parse(iso); if (Number.isNaN(t)) return ''; const sec = Math.max(0, Math.floor((now - t) / 1000)); if (sec < 60) return `${sec}s`; const min = Math.floor(sec / 60); if (min < 60) return `${min}m`; const hr = Math.floor(min / 60); if (hr < 24) return `${hr}h`; const day = Math.floor(hr / 24); if (day < 30) return `${day}d`; const mo = Math.floor(day / 30); if (mo < 12) return `${mo}mo`; return `${Math.floor(mo / 12)}y`; } // "just now / Xm ago / Xh ago / Xd ago" with locale-date fallback for >7d // (SessionLandingPage). export function formatRelative(iso: string): string { const then = new Date(iso).getTime(); if (Number.isNaN(then)) return ''; const s = Math.max(0, Math.round((Date.now() - then) / 1000)); if (s < 60) return 'just now'; const m = Math.round(s / 60); if (m < 60) return `${m}m ago`; const h = Math.round(m / 60); if (h < 24) return `${h}h ago`; const d = Math.round(h / 24); if (d < 7) return `${d}d ago`; return new Date(iso).toLocaleDateString(); } // "just now / Xm ago / Xh ago / Xd ago" with no full-date fallback (AgentPicker). export function formatAgo(iso: string): string { const then = new Date(iso).getTime(); if (Number.isNaN(then)) return '—'; const diff = Date.now() - then; if (diff < 60_000) return 'just now'; if (diff < 3_600_000) return `${Math.round(diff / 60_000)}m ago`; if (diff < 86_400_000) return `${Math.round(diff / 3_600_000)}h ago`; return `${Math.round(diff / 86_400_000)}d ago`; }