nodebench-mcp 2.17.0 → 2.18.0
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.
- package/LICENSE +21 -0
- package/NODEBENCH_AGENTS.md +2 -2
- package/README.md +514 -82
- package/dist/__tests__/analytics.test.d.ts +11 -0
- package/dist/__tests__/analytics.test.js +546 -0
- package/dist/__tests__/analytics.test.js.map +1 -0
- package/dist/__tests__/dynamicLoading.test.d.ts +1 -0
- package/dist/__tests__/dynamicLoading.test.js +278 -0
- package/dist/__tests__/dynamicLoading.test.js.map +1 -0
- package/dist/__tests__/evalHarness.test.js +1 -1
- package/dist/__tests__/evalHarness.test.js.map +1 -1
- package/dist/__tests__/helpers/answerMatch.js +22 -22
- package/dist/__tests__/presetRealWorldBench.test.js +9 -0
- package/dist/__tests__/presetRealWorldBench.test.js.map +1 -1
- package/dist/__tests__/tools.test.js +1 -1
- package/dist/__tests__/toolsetGatingEval.test.js +9 -1
- package/dist/__tests__/toolsetGatingEval.test.js.map +1 -1
- package/dist/analytics/index.d.ts +10 -0
- package/dist/analytics/index.js +11 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/projectDetector.d.ts +19 -0
- package/dist/analytics/projectDetector.js +259 -0
- package/dist/analytics/projectDetector.js.map +1 -0
- package/dist/analytics/schema.d.ts +57 -0
- package/dist/analytics/schema.js +157 -0
- package/dist/analytics/schema.js.map +1 -0
- package/dist/analytics/smartPreset.d.ts +63 -0
- package/dist/analytics/smartPreset.js +300 -0
- package/dist/analytics/smartPreset.js.map +1 -0
- package/dist/analytics/toolTracker.d.ts +59 -0
- package/dist/analytics/toolTracker.js +163 -0
- package/dist/analytics/toolTracker.js.map +1 -0
- package/dist/analytics/usageStats.d.ts +64 -0
- package/dist/analytics/usageStats.js +252 -0
- package/dist/analytics/usageStats.js.map +1 -0
- package/dist/db.js +359 -321
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +652 -89
- package/dist/index.js.map +1 -1
- package/dist/tools/architectTools.js +13 -13
- package/dist/tools/critterTools.js +14 -14
- package/dist/tools/parallelAgentTools.js +176 -176
- package/dist/tools/patternTools.js +11 -11
- package/dist/tools/progressiveDiscoveryTools.d.ts +5 -1
- package/dist/tools/progressiveDiscoveryTools.js +111 -19
- package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
- package/dist/tools/researchWritingTools.js +42 -42
- package/dist/tools/rssTools.js +396 -396
- package/dist/tools/toolRegistry.d.ts +17 -0
- package/dist/tools/toolRegistry.js +65 -17
- package/dist/tools/toolRegistry.js.map +1 -1
- package/dist/tools/voiceBridgeTools.js +498 -498
- package/dist/toolsetRegistry.d.ts +10 -0
- package/dist/toolsetRegistry.js +84 -0
- package/dist/toolsetRegistry.js.map +1 -0
- 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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"}
|