export function formatTokenCount(total: number): string {
if (total < 1000) return `${total} tokens`;
return `${(total / 1000).toFixed(1)}k tokens`;
}
function toTimestamp(value?: string | number): number | undefined {
if (value === undefined || value === null || value === '') return undefined;
if (typeof value === 'number') return value < 10_000_000_000 ? value * 1000 : value;
const numeric = Number(value);
if (Number.isFinite(numeric)) return numeric < 10_000_000_000 ? numeric * 1000 : numeric;
const parsed = new Date(value).getTime();
return Number.isFinite(parsed) ? parsed : undefined;
}
export function formatTimeAgo(dateStr?: string | number): string {
const ts = toTimestamp(dateStr);
if (!ts) return '';
const diff = Date.now() - ts;
const mins = Math.floor(diff / 60000);
if (mins < 1) return 'just now';
if (mins < 60) return `${mins}m ago`;
const hours = Math.floor(mins / 60);
if (hours < 24) return `${hours}h ago`;
const days = Math.floor(hours / 24);
if (days < 7) return `${days}d ago`;
return 'older';
}
export function escapeHtml(text: string): string {
return text
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
export function groupSessionsByDate<T extends { updated_at?: string | number; created_at?: string | number }>(
sessions: T[],
): Record<string, T[]> {
const groups: Record<string, T[]> = {};
const now = Date.now();
const oneDay = 86400000;
sessions.forEach((s) => {
const ts = toTimestamp(s.updated_at ?? s.created_at) ?? now;
const diff = now - ts;
let label: string;
if (diff < oneDay) label = 'Today';
else if (diff < 2 * oneDay) label = 'Yesterday';
else if (diff < 7 * oneDay) label = 'This Week';
else label = 'Older';
if (!groups[label]) groups[label] = [];
groups[label].push(s);
});
return groups;
}
const DISPLAY_FIELDS = ['command', 'file_path', 'pattern', 'query', 'url', 'search', 'path', 'name'];
export function formatToolArgs(_name: string, argsJson: string): string {
try {
const args = JSON.parse(argsJson) as Record<string, unknown>;
if (!args || typeof args !== 'object') return '';
for (const field of DISPLAY_FIELDS) {
const val = args[field];
if (typeof val === 'string' && val.length > 0) {
return val.length > 80 ? val.substring(0, 77) + '...' : val;
}
}
for (const [, val] of Object.entries(args)) {
if (typeof val === 'string' && val.length > 0) {
return val.length > 80 ? val.substring(0, 77) + '...' : val;
}
}
return '';
} catch {
return '';
}
}