/** * Analytics command */ import chalk from 'chalk'; import { AnalyticsService } from '../services/analytics'; export async function analyticsCommand(options: { clear?: boolean; export?: boolean; disable?: boolean; enable?: boolean; }): Promise { const analytics = new AnalyticsService(); // Handle flags if (options.clear) { analytics.clear(); console.log(chalk.green('āœ“ Analytics data cleared')); return; } if (options.disable) { analytics.setEnabled(false); console.log(chalk.yellow('⚠ Analytics disabled')); return; } if (options.enable) { analytics.setEnabled(true); console.log(chalk.green('āœ“ Analytics enabled')); return; } if (options.export) { console.log(analytics.export()); return; } // Show summary const summary = analytics.getSummary(); if (summary.totalCommands === 0) { console.log(chalk.gray('\nNo analytics data yet. Start using NeoHub to see your stats!\n')); return; } console.log(chalk.bold.cyan('\nšŸ“Š NeoHub Analytics\n')); // Overview console.log(chalk.bold('Overview')); console.log(`Total Commands: ${chalk.cyan(summary.totalCommands)}`); console.log(`Success Rate: ${chalk.cyan(summary.successRate.toFixed(1) + '%')}`); console.log( `Avg Response Time: ${chalk.cyan( summary.averageResponseTime > 0 ? (summary.averageResponseTime / 1000).toFixed(1) + 's' : 'N/A' )}` ); console.log(''); // Command frequency console.log(chalk.bold('Most Used Commands')); const topCommands = Object.entries(summary.commandFrequency) .sort(([, a], [, b]) => b - a) .slice(0, 5); topCommands.forEach(([cmd, count]) => { const percentage = ((count / summary.totalCommands) * 100).toFixed(1); const bar = 'ā–ˆ'.repeat(Math.round(parseInt(percentage) / 5)); console.log(` ${chalk.green(cmd.padEnd(12))} ${chalk.gray(bar)} ${chalk.cyan(count)} (${percentage}%)`); }); console.log(''); // Model usage if (Object.keys(summary.modelUsage).length > 0) { console.log(chalk.bold('Model Usage')); const topModels = Object.entries(summary.modelUsage) .sort(([, a], [, b]) => b - a) .slice(0, 5); topModels.forEach(([model, count]) => { const percentage = ((count / summary.totalCommands) * 100).toFixed(1); console.log(` ${chalk.cyan('ā—')} ${model}: ${chalk.green(count)} (${percentage}%)`); }); console.log(''); } // Top performing models if (summary.topPerformingModels.length > 0) { console.log(chalk.bold('Top Performing Models')); summary.topPerformingModels.forEach(model => { const successRate = ( (model.successCount / (model.successCount + model.failureCount)) * 100 ).toFixed(1); const avgTime = (model.avgDurationMs / 1000).toFixed(1); console.log( ` ${chalk.cyan(model.model.padEnd(25))} ` + chalk.gray(`[${model.taskType}]`.padEnd(20)) + ` ${chalk.green(successRate + '%')} success, ${chalk.gray(avgTime + 's')} avg` ); }); console.log(''); } // Privacy notice console.log( chalk.gray('All analytics data is stored locally and never sent to the cloud.') ); console.log( chalk.gray('Run ') + chalk.cyan('neohub analytics --disable') + chalk.gray(' to turn off analytics.') ); console.log(''); }