nodebench-mcp 2.17.0 → 2.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/NODEBENCH_AGENTS.md +2 -2
  3. package/README.md +516 -82
  4. package/dist/__tests__/analytics.test.d.ts +11 -0
  5. package/dist/__tests__/analytics.test.js +546 -0
  6. package/dist/__tests__/analytics.test.js.map +1 -0
  7. package/dist/__tests__/dynamicLoading.test.d.ts +1 -0
  8. package/dist/__tests__/dynamicLoading.test.js +278 -0
  9. package/dist/__tests__/dynamicLoading.test.js.map +1 -0
  10. package/dist/__tests__/evalHarness.test.js +1 -1
  11. package/dist/__tests__/evalHarness.test.js.map +1 -1
  12. package/dist/__tests__/helpers/answerMatch.js +22 -22
  13. package/dist/__tests__/presetRealWorldBench.test.js +9 -0
  14. package/dist/__tests__/presetRealWorldBench.test.js.map +1 -1
  15. package/dist/__tests__/tools.test.js +1 -1
  16. package/dist/__tests__/toolsetGatingEval.test.js +9 -1
  17. package/dist/__tests__/toolsetGatingEval.test.js.map +1 -1
  18. package/dist/analytics/index.d.ts +10 -0
  19. package/dist/analytics/index.js +11 -0
  20. package/dist/analytics/index.js.map +1 -0
  21. package/dist/analytics/projectDetector.d.ts +19 -0
  22. package/dist/analytics/projectDetector.js +259 -0
  23. package/dist/analytics/projectDetector.js.map +1 -0
  24. package/dist/analytics/schema.d.ts +57 -0
  25. package/dist/analytics/schema.js +157 -0
  26. package/dist/analytics/schema.js.map +1 -0
  27. package/dist/analytics/smartPreset.d.ts +63 -0
  28. package/dist/analytics/smartPreset.js +300 -0
  29. package/dist/analytics/smartPreset.js.map +1 -0
  30. package/dist/analytics/toolTracker.d.ts +59 -0
  31. package/dist/analytics/toolTracker.js +163 -0
  32. package/dist/analytics/toolTracker.js.map +1 -0
  33. package/dist/analytics/usageStats.d.ts +64 -0
  34. package/dist/analytics/usageStats.js +252 -0
  35. package/dist/analytics/usageStats.js.map +1 -0
  36. package/dist/db.js +359 -321
  37. package/dist/db.js.map +1 -1
  38. package/dist/index.d.ts +2 -1
  39. package/dist/index.js +652 -89
  40. package/dist/index.js.map +1 -1
  41. package/dist/tools/architectTools.js +13 -13
  42. package/dist/tools/critterTools.js +14 -14
  43. package/dist/tools/parallelAgentTools.js +176 -176
  44. package/dist/tools/patternTools.js +11 -11
  45. package/dist/tools/progressiveDiscoveryTools.d.ts +5 -1
  46. package/dist/tools/progressiveDiscoveryTools.js +111 -19
  47. package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
  48. package/dist/tools/researchWritingTools.js +42 -42
  49. package/dist/tools/rssTools.js +396 -396
  50. package/dist/tools/toolRegistry.d.ts +17 -0
  51. package/dist/tools/toolRegistry.js +65 -17
  52. package/dist/tools/toolRegistry.js.map +1 -1
  53. package/dist/tools/voiceBridgeTools.js +498 -498
  54. package/dist/toolsetRegistry.d.ts +10 -0
  55. package/dist/toolsetRegistry.js +84 -0
  56. package/dist/toolsetRegistry.js.map +1 -0
  57. package/package.json +4 -4
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Usage Statistics Aggregation
3
+ *
4
+ * Aggregates tool usage data to generate insights and recommendations.
5
+ */
6
+ import { getCachedStats, setCachedStats } from './schema.js';
7
+ export function getToolUsageStats(db, projectPath, days = 30) {
8
+ const cutoff = Date.now() - (days * 24 * 60 * 60 * 1000);
9
+ const stmt = db.prepare(`
10
+ SELECT
11
+ tool_name as toolName,
12
+ toolset,
13
+ COUNT(*) as callCount,
14
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) as successCount,
15
+ SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as failureCount,
16
+ AVG(duration) as avgDuration,
17
+ MAX(timestamp) as lastUsed,
18
+ MIN(timestamp) as firstUsed
19
+ FROM tool_usage
20
+ WHERE project_path = ? AND timestamp >= ?
21
+ GROUP BY tool_name, toolset
22
+ ORDER BY callCount DESC
23
+ `);
24
+ return stmt.all(projectPath, cutoff);
25
+ }
26
+ export function getToolsetUsageStats(db, projectPath, days = 30) {
27
+ const cutoff = Date.now() - (days * 24 * 60 * 60 * 1000);
28
+ const stmt = db.prepare(`
29
+ SELECT
30
+ toolset,
31
+ COUNT(DISTINCT tool_name) as toolCount,
32
+ SUM(call_count) as totalCalls,
33
+ COUNT(DISTINCT tool_name) as uniqueToolsUsed,
34
+ CAST(SUM(call_count) AS FLOAT) / COUNT(DISTINCT tool_name) as avgCallsPerTool
35
+ FROM (
36
+ SELECT tool_name, toolset, COUNT(*) as call_count
37
+ FROM tool_usage
38
+ WHERE project_path = ? AND timestamp >= ?
39
+ GROUP BY tool_name, toolset
40
+ )
41
+ GROUP BY toolset
42
+ ORDER BY totalCalls DESC
43
+ `);
44
+ return stmt.all(projectPath, cutoff);
45
+ }
46
+ export function getProjectUsageSummary(db, projectPath, days = 30) {
47
+ const cutoff = Date.now() - (days * 24 * 60 * 60 * 1000);
48
+ const stmt = db.prepare(`
49
+ SELECT
50
+ COUNT(*) as totalCalls,
51
+ COUNT(DISTINCT tool_name) as uniqueToolsUsed,
52
+ SUM(duration) as totalDuration,
53
+ AVG(duration) as avgDuration,
54
+ CAST(SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) AS FLOAT) / COUNT(*) as successRate
55
+ FROM tool_usage
56
+ WHERE project_path = ? AND timestamp >= ?
57
+ `);
58
+ const summary = stmt.get(projectPath, cutoff);
59
+ if (!summary || summary.totalCalls === 0)
60
+ return null;
61
+ // Get most used tool
62
+ const mostUsedToolStmt = db.prepare(`
63
+ SELECT tool_name, COUNT(*) as count
64
+ FROM tool_usage
65
+ WHERE project_path = ? AND timestamp >= ?
66
+ GROUP BY tool_name
67
+ ORDER BY count DESC
68
+ LIMIT 1
69
+ `);
70
+ const mostUsedTool = mostUsedToolStmt.get(projectPath, cutoff);
71
+ // Get most used toolset
72
+ const mostUsedToolsetStmt = db.prepare(`
73
+ SELECT toolset, COUNT(*) as count
74
+ FROM tool_usage
75
+ WHERE project_path = ? AND timestamp >= ?
76
+ GROUP BY toolset
77
+ ORDER BY count DESC
78
+ LIMIT 1
79
+ `);
80
+ const mostUsedToolset = mostUsedToolsetStmt.get(projectPath, cutoff);
81
+ // Get top 5 tools
82
+ const topToolsStmt = db.prepare(`
83
+ SELECT tool_name as name, COUNT(*) as count
84
+ FROM tool_usage
85
+ WHERE project_path = ? AND timestamp >= ?
86
+ GROUP BY tool_name
87
+ ORDER BY count DESC
88
+ LIMIT 5
89
+ `);
90
+ const topTools = topToolsStmt.all(projectPath, cutoff);
91
+ // Get top 5 toolsets
92
+ const topToolsetsStmt = db.prepare(`
93
+ SELECT toolset as name, COUNT(*) as count
94
+ FROM tool_usage
95
+ WHERE project_path = ? AND timestamp >= ?
96
+ GROUP BY toolset
97
+ ORDER BY count DESC
98
+ LIMIT 5
99
+ `);
100
+ const topToolsets = topToolsetsStmt.all(projectPath, cutoff);
101
+ return {
102
+ projectPath,
103
+ totalCalls: summary.totalCalls,
104
+ uniqueToolsUsed: summary.uniqueToolsUsed,
105
+ totalDuration: summary.totalDuration,
106
+ avgDuration: summary.avgDuration,
107
+ successRate: summary.successRate,
108
+ mostUsedTool: mostUsedTool?.tool_name || 'N/A',
109
+ mostUsedToolset: mostUsedToolset?.toolset || 'N/A',
110
+ topTools,
111
+ topToolsets,
112
+ };
113
+ }
114
+ export function getUsageTrend(db, projectPath, days = 30) {
115
+ const cutoff = Date.now() - (days * 24 * 60 * 60 * 1000);
116
+ const stmt = db.prepare(`
117
+ SELECT
118
+ DATE(timestamp / 1000, 'unixepoch') as date,
119
+ COUNT(*) as callCount,
120
+ COUNT(DISTINCT tool_name) as uniqueTools,
121
+ AVG(duration) as avgDuration
122
+ FROM tool_usage
123
+ WHERE project_path = ? AND timestamp >= ?
124
+ GROUP BY date
125
+ ORDER BY date ASC
126
+ `);
127
+ return stmt.all(projectPath, cutoff);
128
+ }
129
+ export function getUnusedTools(db, projectPath, availableTools, days = 30) {
130
+ const cutoff = Date.now() - (days * 24 * 60 * 60 * 1000);
131
+ const usedToolsStmt = db.prepare(`
132
+ SELECT DISTINCT tool_name
133
+ FROM tool_usage
134
+ WHERE project_path = ? AND timestamp >= ?
135
+ `);
136
+ const usedTools = usedToolsStmt.all(projectPath, cutoff);
137
+ const usedToolNames = new Set(usedTools.map(t => t.tool_name));
138
+ return availableTools.filter(tool => !usedToolNames.has(tool));
139
+ }
140
+ export function getFrequentlyFailingTools(db, projectPath, days = 30, minFailures = 3) {
141
+ const cutoff = Date.now() - (days * 24 * 60 * 60 * 1000);
142
+ const stmt = db.prepare(`
143
+ SELECT
144
+ tool_name as toolName,
145
+ SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as failureCount,
146
+ MAX(error_message) as lastError
147
+ FROM tool_usage
148
+ WHERE project_path = ? AND timestamp >= ?
149
+ GROUP BY tool_name
150
+ HAVING failureCount >= ?
151
+ ORDER BY failureCount DESC
152
+ `);
153
+ return stmt.all(projectPath, cutoff, minFailures);
154
+ }
155
+ export function getAllProjects(db) {
156
+ const stmt = db.prepare(`
157
+ SELECT DISTINCT project_path as projectPath, MAX(timestamp) as lastSeen
158
+ FROM tool_usage
159
+ GROUP BY project_path
160
+ ORDER BY lastSeen DESC
161
+ `);
162
+ return stmt.all();
163
+ }
164
+ export function exportUsageStats(db, projectPath, days = 30) {
165
+ const summary = getProjectUsageSummary(db, projectPath, days);
166
+ const toolStats = getToolUsageStats(db, projectPath, days);
167
+ const toolsetStats = getToolsetUsageStats(db, projectPath, days);
168
+ const trend = getUsageTrend(db, projectPath, days);
169
+ const failingTools = getFrequentlyFailingTools(db, projectPath, days);
170
+ return JSON.stringify({
171
+ projectPath,
172
+ period: `${days} days`,
173
+ summary,
174
+ toolStats,
175
+ toolsetStats,
176
+ trend,
177
+ failingTools,
178
+ exportedAt: new Date().toISOString(),
179
+ }, null, 2);
180
+ }
181
+ // ── Cached wrapper ──────────────────────────────────────────────────────
182
+ const SUMMARY_CACHE_TTL = 300; // 5 minutes in seconds
183
+ export function getCachedProjectSummary(db, projectPath, days = 30) {
184
+ const cacheKey = `summary_${days}d`;
185
+ const cached = getCachedStats(db, projectPath, cacheKey);
186
+ if (cached) {
187
+ try {
188
+ return JSON.parse(cached);
189
+ }
190
+ catch { /* fall through */ }
191
+ }
192
+ const summary = getProjectUsageSummary(db, projectPath, days);
193
+ if (summary) {
194
+ setCachedStats(db, {
195
+ projectPath,
196
+ cacheKey,
197
+ stats: JSON.stringify(summary),
198
+ computedAt: Date.now(),
199
+ ttl: SUMMARY_CACHE_TTL,
200
+ });
201
+ }
202
+ return summary;
203
+ }
204
+ // ── Rich formatted display ──────────────────────────────────────────────
205
+ function fmtDuration(ms) {
206
+ if (ms < 1000)
207
+ return `${Math.round(ms)}ms`;
208
+ if (ms < 60_000)
209
+ return `${(ms / 1000).toFixed(1)}s`;
210
+ return `${(ms / 60_000).toFixed(1)}m`;
211
+ }
212
+ function fmtPercent(n) {
213
+ return `${(n * 100).toFixed(1)}%`;
214
+ }
215
+ function bar(value, max, width = 20) {
216
+ const filled = max > 0 ? Math.round((value / max) * width) : 0;
217
+ return '\u2588'.repeat(filled) + '\u2591'.repeat(width - filled);
218
+ }
219
+ export function formatStatsDisplay(summary, projectPath) {
220
+ const lines = [];
221
+ const projectName = projectPath.split(/[\\/]/).pop() || projectPath;
222
+ lines.push(`\n=== Usage Analytics: ${projectName} (last 30 days) ===\n`);
223
+ // Overview
224
+ lines.push(` Total calls: ${summary.totalCalls.toLocaleString()}`);
225
+ lines.push(` Unique tools: ${summary.uniqueToolsUsed}`);
226
+ lines.push(` Success rate: ${fmtPercent(summary.successRate)}`);
227
+ lines.push(` Avg duration: ${fmtDuration(summary.avgDuration)}`);
228
+ lines.push(` Total time: ${fmtDuration(summary.totalDuration)}`);
229
+ // Top tools
230
+ if (summary.topTools.length > 0) {
231
+ lines.push(`\n--- Top Tools ---`);
232
+ const maxCount = summary.topTools[0].count;
233
+ for (const t of summary.topTools) {
234
+ const pct = summary.totalCalls > 0 ? (t.count / summary.totalCalls) : 0;
235
+ lines.push(` ${bar(t.count, maxCount, 16)} ${t.name} (${t.count} calls, ${fmtPercent(pct)})`);
236
+ }
237
+ }
238
+ // Top toolsets
239
+ if (summary.topToolsets.length > 0) {
240
+ lines.push(`\n--- Top Toolsets ---`);
241
+ const maxCount = summary.topToolsets[0].count;
242
+ for (const t of summary.topToolsets) {
243
+ const pct = summary.totalCalls > 0 ? (t.count / summary.totalCalls) : 0;
244
+ lines.push(` ${bar(t.count, maxCount, 16)} ${t.name} (${t.count} calls, ${fmtPercent(pct)})`);
245
+ }
246
+ }
247
+ lines.push(`\n Most used tool: ${summary.mostUsedTool}`);
248
+ lines.push(` Most used toolset: ${summary.mostUsedToolset}`);
249
+ lines.push('');
250
+ return lines.join('\n');
251
+ }
252
+ //# sourceMappingURL=usageStats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageStats.js","sourceRoot":"","sources":["../../src/analytics/usageStats.ts"],"names":[],"mappings":"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"}