nodebench-mcp 2.48.0 → 2.50.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/dist/benchmarks/agentValidation.d.ts +47 -0
- package/dist/benchmarks/agentValidation.js +417 -0
- package/dist/benchmarks/agentValidation.js.map +1 -0
- package/dist/benchmarks/testProviderBus.d.ts +7 -0
- package/dist/benchmarks/testProviderBus.js +272 -0
- package/dist/benchmarks/testProviderBus.js.map +1 -0
- package/dist/benchmarks/testSupermemory.d.ts +8 -0
- package/dist/benchmarks/testSupermemory.js +187 -0
- package/dist/benchmarks/testSupermemory.js.map +1 -0
- package/dist/tools/founderTrackingTools.d.ts +1 -1
- package/dist/tools/founderTrackingTools.js +3 -1
- package/dist/tools/founderTrackingTools.js.map +1 -1
- package/dist/tools/toolRegistry.js +13 -0
- package/dist/tools/toolRegistry.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Validation Harness — Simulates how real AI agents (Claude Code,
|
|
3
|
+
* OpenClaw, Cursor, Windsurf, generic MCP clients) interact with the
|
|
4
|
+
* NodeBench MCP server and scores the experience.
|
|
5
|
+
*
|
|
6
|
+
* Validates: preset loading, tool count limits, progressive discovery,
|
|
7
|
+
* toolset expansion, and workflow completion for each persona.
|
|
8
|
+
*
|
|
9
|
+
* All scoring is deterministic and heuristic-based (no LLM calls).
|
|
10
|
+
*/
|
|
11
|
+
import type { McpTool } from "../types.js";
|
|
12
|
+
export interface AgentPersona {
|
|
13
|
+
name: string;
|
|
14
|
+
maxTools: number;
|
|
15
|
+
supportsWebSocket: boolean;
|
|
16
|
+
supportsOAuth: boolean;
|
|
17
|
+
preferredPreset: string;
|
|
18
|
+
typicalWorkflow: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PersonaScores {
|
|
21
|
+
toolDiscovery: number;
|
|
22
|
+
workflowCompletion: number;
|
|
23
|
+
presetFit: number;
|
|
24
|
+
errorRate: number;
|
|
25
|
+
}
|
|
26
|
+
export interface PersonaResult {
|
|
27
|
+
name: string;
|
|
28
|
+
scores: PersonaScores;
|
|
29
|
+
passed: boolean;
|
|
30
|
+
errors: string[];
|
|
31
|
+
toolCount: number;
|
|
32
|
+
presetUsed: string;
|
|
33
|
+
durationMs: number;
|
|
34
|
+
}
|
|
35
|
+
export interface AgentValidationResult {
|
|
36
|
+
personas: PersonaResult[];
|
|
37
|
+
overallPassRate: number;
|
|
38
|
+
recommendations: string[];
|
|
39
|
+
totalDurationMs: number;
|
|
40
|
+
}
|
|
41
|
+
export interface WebMcpReadiness {
|
|
42
|
+
ready: boolean;
|
|
43
|
+
missingItems: string[];
|
|
44
|
+
}
|
|
45
|
+
export declare function runAgentValidation(personaFilter?: string): Promise<AgentValidationResult>;
|
|
46
|
+
export declare function checkWebMcpReadiness(): WebMcpReadiness;
|
|
47
|
+
export declare const validateAgentCompatibilityTool: McpTool;
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Validation Harness — Simulates how real AI agents (Claude Code,
|
|
3
|
+
* OpenClaw, Cursor, Windsurf, generic MCP clients) interact with the
|
|
4
|
+
* NodeBench MCP server and scores the experience.
|
|
5
|
+
*
|
|
6
|
+
* Validates: preset loading, tool count limits, progressive discovery,
|
|
7
|
+
* toolset expansion, and workflow completion for each persona.
|
|
8
|
+
*
|
|
9
|
+
* All scoring is deterministic and heuristic-based (no LLM calls).
|
|
10
|
+
*/
|
|
11
|
+
import { getDb, genId } from "../db.js";
|
|
12
|
+
import { loadToolsets, ALL_DOMAIN_KEYS } from "../toolsetRegistry.js";
|
|
13
|
+
import { hybridSearch, ALL_REGISTRY_ENTRIES, WORKFLOW_CHAINS, } from "../tools/toolRegistry.js";
|
|
14
|
+
/* ================================================================== */
|
|
15
|
+
/* Persona Definitions */
|
|
16
|
+
/* ================================================================== */
|
|
17
|
+
const AGENT_PERSONAS = [
|
|
18
|
+
{
|
|
19
|
+
name: "claude_code",
|
|
20
|
+
maxTools: Infinity,
|
|
21
|
+
supportsWebSocket: true,
|
|
22
|
+
supportsOAuth: false,
|
|
23
|
+
preferredPreset: "founder",
|
|
24
|
+
typicalWorkflow: "weekly_reset",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: "openclaw",
|
|
28
|
+
maxTools: Infinity,
|
|
29
|
+
supportsWebSocket: true,
|
|
30
|
+
supportsOAuth: false,
|
|
31
|
+
preferredPreset: "core",
|
|
32
|
+
typicalWorkflow: "research",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "cursor",
|
|
36
|
+
maxTools: 40,
|
|
37
|
+
supportsWebSocket: false,
|
|
38
|
+
supportsOAuth: false,
|
|
39
|
+
preferredPreset: "cursor",
|
|
40
|
+
typicalWorkflow: "code_review",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "windsurf",
|
|
44
|
+
maxTools: Infinity,
|
|
45
|
+
supportsWebSocket: false,
|
|
46
|
+
supportsOAuth: false,
|
|
47
|
+
preferredPreset: "core",
|
|
48
|
+
typicalWorkflow: "code_review",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "generic_mcp",
|
|
52
|
+
maxTools: Infinity,
|
|
53
|
+
supportsWebSocket: true,
|
|
54
|
+
supportsOAuth: false,
|
|
55
|
+
preferredPreset: "starter",
|
|
56
|
+
typicalWorkflow: "company_search",
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
/* ================================================================== */
|
|
60
|
+
/* Workflow → search queries mapping */
|
|
61
|
+
/* ================================================================== */
|
|
62
|
+
const WORKFLOW_QUERIES = {
|
|
63
|
+
weekly_reset: [
|
|
64
|
+
"weekly review",
|
|
65
|
+
"action tracking",
|
|
66
|
+
"milestone",
|
|
67
|
+
"session history",
|
|
68
|
+
],
|
|
69
|
+
research: [
|
|
70
|
+
"research",
|
|
71
|
+
"web search",
|
|
72
|
+
"knowledge",
|
|
73
|
+
"analysis",
|
|
74
|
+
],
|
|
75
|
+
code_review: [
|
|
76
|
+
"verification",
|
|
77
|
+
"quality gate",
|
|
78
|
+
"gap",
|
|
79
|
+
"test",
|
|
80
|
+
],
|
|
81
|
+
company_search: [
|
|
82
|
+
"company",
|
|
83
|
+
"search",
|
|
84
|
+
"deep sim",
|
|
85
|
+
"decision",
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
/* ================================================================== */
|
|
89
|
+
/* Preset → domain mapping (mirrors index.ts PRESETS) */
|
|
90
|
+
/* ================================================================== */
|
|
91
|
+
const PRESET_DOMAINS = {
|
|
92
|
+
starter: ["deep_sim"],
|
|
93
|
+
default: ["deep_sim"],
|
|
94
|
+
core: [
|
|
95
|
+
"verification", "eval", "quality_gate", "learning", "flywheel",
|
|
96
|
+
"recon", "security", "boilerplate", "skill_update", "context_sandbox",
|
|
97
|
+
"observability", "execution_trace", "mission_harness", "deep_sim", "founder",
|
|
98
|
+
],
|
|
99
|
+
founder: ["deep_sim", "founder", "learning", "local_dashboard"],
|
|
100
|
+
cursor: ["deep_sim", "quality_gate", "learning", "session_memory", "web", "toon"],
|
|
101
|
+
full: ALL_DOMAIN_KEYS,
|
|
102
|
+
};
|
|
103
|
+
/* ================================================================== */
|
|
104
|
+
/* Schema bootstrap (idempotent) */
|
|
105
|
+
/* ================================================================== */
|
|
106
|
+
let _schemaReady = false;
|
|
107
|
+
function ensureSchema() {
|
|
108
|
+
if (_schemaReady)
|
|
109
|
+
return;
|
|
110
|
+
const db = getDb();
|
|
111
|
+
db.exec(`
|
|
112
|
+
CREATE TABLE IF NOT EXISTS agent_validation_runs (
|
|
113
|
+
id TEXT PRIMARY KEY,
|
|
114
|
+
timestamp TEXT NOT NULL,
|
|
115
|
+
personaName TEXT NOT NULL,
|
|
116
|
+
presetUsed TEXT NOT NULL,
|
|
117
|
+
toolCount INTEGER NOT NULL,
|
|
118
|
+
toolDiscovery REAL NOT NULL,
|
|
119
|
+
workflowCompletion REAL NOT NULL,
|
|
120
|
+
presetFit REAL NOT NULL,
|
|
121
|
+
errorRate REAL NOT NULL,
|
|
122
|
+
passed INTEGER NOT NULL,
|
|
123
|
+
errors TEXT,
|
|
124
|
+
durationMs INTEGER NOT NULL
|
|
125
|
+
);
|
|
126
|
+
CREATE INDEX IF NOT EXISTS idx_agent_validation_persona
|
|
127
|
+
ON agent_validation_runs(personaName);
|
|
128
|
+
CREATE INDEX IF NOT EXISTS idx_agent_validation_timestamp
|
|
129
|
+
ON agent_validation_runs(timestamp);
|
|
130
|
+
`);
|
|
131
|
+
_schemaReady = true;
|
|
132
|
+
}
|
|
133
|
+
/* ================================================================== */
|
|
134
|
+
/* Per-persona validation */
|
|
135
|
+
/* ================================================================== */
|
|
136
|
+
async function validatePersona(persona) {
|
|
137
|
+
const startMs = Date.now();
|
|
138
|
+
const errors = [];
|
|
139
|
+
const scores = {
|
|
140
|
+
toolDiscovery: 0,
|
|
141
|
+
workflowCompletion: 0,
|
|
142
|
+
presetFit: 0,
|
|
143
|
+
errorRate: 1, // start optimistic
|
|
144
|
+
};
|
|
145
|
+
/* ── Step 1: Load the persona's preferred preset ──────────────── */
|
|
146
|
+
const domains = PRESET_DOMAINS[persona.preferredPreset];
|
|
147
|
+
if (!domains) {
|
|
148
|
+
errors.push(`Unknown preset: ${persona.preferredPreset}`);
|
|
149
|
+
scores.errorRate = 0;
|
|
150
|
+
return {
|
|
151
|
+
name: persona.name,
|
|
152
|
+
scores,
|
|
153
|
+
passed: false,
|
|
154
|
+
errors,
|
|
155
|
+
toolCount: 0,
|
|
156
|
+
presetUsed: persona.preferredPreset,
|
|
157
|
+
durationMs: Date.now() - startMs,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
let tools;
|
|
161
|
+
try {
|
|
162
|
+
tools = await loadToolsets(domains);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
errors.push(`loadToolsets failed: ${String(err)}`);
|
|
166
|
+
scores.errorRate = 0;
|
|
167
|
+
return {
|
|
168
|
+
name: persona.name,
|
|
169
|
+
scores,
|
|
170
|
+
passed: false,
|
|
171
|
+
errors,
|
|
172
|
+
toolCount: 0,
|
|
173
|
+
presetUsed: persona.preferredPreset,
|
|
174
|
+
durationMs: Date.now() - startMs,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
const toolCount = tools.length;
|
|
178
|
+
/* ── Step 2: Check tool count fits within maxTools ─────────────── */
|
|
179
|
+
if (toolCount <= persona.maxTools) {
|
|
180
|
+
scores.presetFit = 1;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
// Partial credit: how close is the fit?
|
|
184
|
+
scores.presetFit = Math.max(0, persona.maxTools / toolCount);
|
|
185
|
+
errors.push(`Preset '${persona.preferredPreset}' loads ${toolCount} tools but ${persona.name} supports max ${persona.maxTools}`);
|
|
186
|
+
}
|
|
187
|
+
/* ── Step 3: Simulate tool discovery via hybridSearch ──────────── */
|
|
188
|
+
const queries = WORKFLOW_QUERIES[persona.typicalWorkflow] ?? ["tools"];
|
|
189
|
+
let discoveredCount = 0;
|
|
190
|
+
let totalExpected = 0;
|
|
191
|
+
for (const query of queries) {
|
|
192
|
+
totalExpected++;
|
|
193
|
+
try {
|
|
194
|
+
const allToolDescs = ALL_REGISTRY_ENTRIES.map((e) => ({
|
|
195
|
+
name: e.name,
|
|
196
|
+
description: `${e.category} ${e.tags.join(" ")}`,
|
|
197
|
+
}));
|
|
198
|
+
const results = hybridSearch(query, allToolDescs, {
|
|
199
|
+
limit: 5,
|
|
200
|
+
mode: "hybrid",
|
|
201
|
+
});
|
|
202
|
+
if (results.length > 0) {
|
|
203
|
+
discoveredCount++;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
errors.push(`discover_tools('${query}') failed: ${String(err)}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
scores.toolDiscovery = totalExpected > 0 ? discoveredCount / totalExpected : 0;
|
|
211
|
+
/* ── Step 4: Check workflow chain availability ─────────────────── */
|
|
212
|
+
const chainKeys = Object.keys(WORKFLOW_CHAINS);
|
|
213
|
+
// Search for a chain matching the persona's typical workflow
|
|
214
|
+
const workflowKeywords = persona.typicalWorkflow.split("_");
|
|
215
|
+
const matchingChain = chainKeys.find((key) => workflowKeywords.some((kw) => key.toLowerCase().includes(kw)));
|
|
216
|
+
if (matchingChain) {
|
|
217
|
+
scores.workflowCompletion = 1;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
// Partial credit: can we at least find tools relevant to the workflow?
|
|
221
|
+
const relevantTools = ALL_REGISTRY_ENTRIES.filter((e) => workflowKeywords.some((kw) => e.name.includes(kw) ||
|
|
222
|
+
e.tags.some((t) => t.includes(kw)) ||
|
|
223
|
+
e.category.includes(kw)));
|
|
224
|
+
scores.workflowCompletion = relevantTools.length > 0
|
|
225
|
+
? Math.min(1, relevantTools.length / 3)
|
|
226
|
+
: 0;
|
|
227
|
+
}
|
|
228
|
+
/* ── Step 5: Simulate load_toolset expansion ──────────────────── */
|
|
229
|
+
// Verify that loading an additional domain works without error
|
|
230
|
+
const expansionDomain = domains.includes("learning") ? "web" : "learning";
|
|
231
|
+
try {
|
|
232
|
+
await loadToolsets([expansionDomain]);
|
|
233
|
+
// Expansion succeeded — no error
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
errors.push(`Toolset expansion to '${expansionDomain}' failed: ${String(err)}`);
|
|
237
|
+
}
|
|
238
|
+
/* ── Compute error rate ───────────────────────────────────────── */
|
|
239
|
+
const totalChecks = 4; // preset load, discovery, workflow, expansion
|
|
240
|
+
scores.errorRate = Math.max(0, 1 - errors.length / totalChecks);
|
|
241
|
+
/* ── Pass/fail threshold ──────────────────────────────────────── */
|
|
242
|
+
const avgScore = (scores.toolDiscovery +
|
|
243
|
+
scores.workflowCompletion +
|
|
244
|
+
scores.presetFit +
|
|
245
|
+
scores.errorRate) /
|
|
246
|
+
4;
|
|
247
|
+
const passed = avgScore >= 0.6;
|
|
248
|
+
return {
|
|
249
|
+
name: persona.name,
|
|
250
|
+
scores,
|
|
251
|
+
passed,
|
|
252
|
+
errors,
|
|
253
|
+
toolCount,
|
|
254
|
+
presetUsed: persona.preferredPreset,
|
|
255
|
+
durationMs: Date.now() - startMs,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/* ================================================================== */
|
|
259
|
+
/* Run all personas */
|
|
260
|
+
/* ================================================================== */
|
|
261
|
+
export async function runAgentValidation(personaFilter) {
|
|
262
|
+
ensureSchema();
|
|
263
|
+
const overallStart = Date.now();
|
|
264
|
+
const personas = personaFilter
|
|
265
|
+
? AGENT_PERSONAS.filter((p) => p.name === personaFilter)
|
|
266
|
+
: AGENT_PERSONAS;
|
|
267
|
+
if (personas.length === 0 && personaFilter) {
|
|
268
|
+
return {
|
|
269
|
+
personas: [],
|
|
270
|
+
overallPassRate: 0,
|
|
271
|
+
recommendations: [`Unknown agent persona: '${personaFilter}'. Available: ${AGENT_PERSONAS.map((p) => p.name).join(", ")}`],
|
|
272
|
+
totalDurationMs: Date.now() - overallStart,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
const results = [];
|
|
276
|
+
for (const persona of personas) {
|
|
277
|
+
const result = await validatePersona(persona);
|
|
278
|
+
results.push(result);
|
|
279
|
+
// Persist to SQLite
|
|
280
|
+
const db = getDb();
|
|
281
|
+
db.prepare(`
|
|
282
|
+
INSERT INTO agent_validation_runs
|
|
283
|
+
(id, timestamp, personaName, presetUsed, toolCount,
|
|
284
|
+
toolDiscovery, workflowCompletion, presetFit, errorRate,
|
|
285
|
+
passed, errors, durationMs)
|
|
286
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
287
|
+
`).run(genId("av"), new Date().toISOString(), result.name, result.presetUsed, result.toolCount, result.scores.toolDiscovery, result.scores.workflowCompletion, result.scores.presetFit, result.scores.errorRate, result.passed ? 1 : 0, JSON.stringify(result.errors), result.durationMs);
|
|
288
|
+
}
|
|
289
|
+
/* ── Generate recommendations ─────────────────────────────────── */
|
|
290
|
+
const recommendations = [];
|
|
291
|
+
const passedCount = results.filter((r) => r.passed).length;
|
|
292
|
+
const overallPassRate = results.length > 0 ? passedCount / results.length : 0;
|
|
293
|
+
// Analyze failure patterns
|
|
294
|
+
const lowDiscovery = results.filter((r) => r.scores.toolDiscovery < 0.5);
|
|
295
|
+
if (lowDiscovery.length > 0) {
|
|
296
|
+
recommendations.push(`Tool discovery scored low for: ${lowDiscovery.map((r) => r.name).join(", ")}. ` +
|
|
297
|
+
`Consider adding more tags/aliases to tool registry entries for their workflow queries.`);
|
|
298
|
+
}
|
|
299
|
+
const lowPresetFit = results.filter((r) => r.scores.presetFit < 1);
|
|
300
|
+
if (lowPresetFit.length > 0) {
|
|
301
|
+
recommendations.push(`Preset overflow for: ${lowPresetFit.map((r) => `${r.name} (${r.toolCount}/${AGENT_PERSONAS.find((p) => p.name === r.name)?.maxTools ?? "?"})`).join(", ")}. ` +
|
|
302
|
+
`Create a slimmer preset or enable progressive discovery for these agents.`);
|
|
303
|
+
}
|
|
304
|
+
const lowWorkflow = results.filter((r) => r.scores.workflowCompletion < 0.5);
|
|
305
|
+
if (lowWorkflow.length > 0) {
|
|
306
|
+
recommendations.push(`Missing workflow chains for: ${lowWorkflow.map((r) => `${r.name} (${AGENT_PERSONAS.find((p) => p.name === r.name)?.typicalWorkflow})`).join(", ")}. ` +
|
|
307
|
+
`Add WORKFLOW_CHAINS entries in toolRegistry.ts for these workflows.`);
|
|
308
|
+
}
|
|
309
|
+
const highErrorRate = results.filter((r) => r.scores.errorRate < 0.75);
|
|
310
|
+
if (highErrorRate.length > 0) {
|
|
311
|
+
recommendations.push(`High error rate for: ${highErrorRate.map((r) => `${r.name} (${r.errors.length} errors)`).join(", ")}. ` +
|
|
312
|
+
`Review error details for root cause.`);
|
|
313
|
+
}
|
|
314
|
+
if (overallPassRate === 1) {
|
|
315
|
+
recommendations.push("All personas passed. Consider adding edge-case personas or stricter thresholds.");
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
personas: results,
|
|
319
|
+
overallPassRate,
|
|
320
|
+
recommendations,
|
|
321
|
+
totalDurationMs: Date.now() - overallStart,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/* ================================================================== */
|
|
325
|
+
/* WebMCP Readiness Check */
|
|
326
|
+
/* ================================================================== */
|
|
327
|
+
export function checkWebMcpReadiness() {
|
|
328
|
+
const missingItems = [];
|
|
329
|
+
// Check for WebMCP meta tags in index.html
|
|
330
|
+
// These are not yet present — this is a placeholder for future integration
|
|
331
|
+
missingItems.push("navigator.modelContext meta tag in index.html");
|
|
332
|
+
missingItems.push("WebMCP tool declarations (<tool> elements)");
|
|
333
|
+
missingItems.push("WebMCP manifest (/.well-known/mcp.json)");
|
|
334
|
+
missingItems.push("Content-Security-Policy header for WebMCP origins");
|
|
335
|
+
return {
|
|
336
|
+
ready: missingItems.length === 0,
|
|
337
|
+
missingItems,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/* ================================================================== */
|
|
341
|
+
/* MCP Tool: validate_agent_compatibility */
|
|
342
|
+
/* ================================================================== */
|
|
343
|
+
export const validateAgentCompatibilityTool = {
|
|
344
|
+
name: "validate_agent_compatibility",
|
|
345
|
+
description: "Run the agent validation harness — simulates how AI agents (Claude Code, " +
|
|
346
|
+
"OpenClaw, Cursor, Windsurf, generic MCP) interact with NodeBench tools. " +
|
|
347
|
+
"Scores tool discovery, workflow completion, preset fit, and error rate " +
|
|
348
|
+
"per persona. Pass agentName to run a single persona or omit for all 5.",
|
|
349
|
+
inputSchema: {
|
|
350
|
+
type: "object",
|
|
351
|
+
properties: {
|
|
352
|
+
agentName: {
|
|
353
|
+
type: "string",
|
|
354
|
+
description: "Run a single persona: claude_code, openclaw, cursor, windsurf, or generic_mcp. Omit to run all.",
|
|
355
|
+
enum: ["claude_code", "openclaw", "cursor", "windsurf", "generic_mcp"],
|
|
356
|
+
},
|
|
357
|
+
},
|
|
358
|
+
},
|
|
359
|
+
annotations: {
|
|
360
|
+
readOnlyHint: true,
|
|
361
|
+
},
|
|
362
|
+
handler: async (args) => {
|
|
363
|
+
const result = await runAgentValidation(args.agentName);
|
|
364
|
+
const webMcp = checkWebMcpReadiness();
|
|
365
|
+
return {
|
|
366
|
+
...result,
|
|
367
|
+
webMcpReadiness: webMcp,
|
|
368
|
+
summary: `${result.personas.length} persona(s) tested. ` +
|
|
369
|
+
`Pass rate: ${(result.overallPassRate * 100).toFixed(0)}%. ` +
|
|
370
|
+
`WebMCP: ${webMcp.ready ? "ready" : `not ready (${webMcp.missingItems.length} items missing)`}. ` +
|
|
371
|
+
`Duration: ${result.totalDurationMs}ms.`,
|
|
372
|
+
};
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
/* ================================================================== */
|
|
376
|
+
/* CLI entry point */
|
|
377
|
+
/* ================================================================== */
|
|
378
|
+
if (process.argv[1]?.endsWith("agentValidation.ts") || process.argv[1]?.endsWith("agentValidation.js")) {
|
|
379
|
+
const personaArg = process.argv[2];
|
|
380
|
+
console.log("=== NodeBench Agent Validation Harness ===\n");
|
|
381
|
+
runAgentValidation(personaArg)
|
|
382
|
+
.then((result) => {
|
|
383
|
+
for (const p of result.personas) {
|
|
384
|
+
const status = p.passed ? "PASS" : "FAIL";
|
|
385
|
+
console.log(`[${status}] ${p.name} (preset: ${p.presetUsed}, tools: ${p.toolCount})`);
|
|
386
|
+
console.log(` toolDiscovery: ${p.scores.toolDiscovery.toFixed(2)}`);
|
|
387
|
+
console.log(` workflowCompletion: ${p.scores.workflowCompletion.toFixed(2)}`);
|
|
388
|
+
console.log(` presetFit: ${p.scores.presetFit.toFixed(2)}`);
|
|
389
|
+
console.log(` errorRate: ${p.scores.errorRate.toFixed(2)}`);
|
|
390
|
+
if (p.errors.length > 0) {
|
|
391
|
+
console.log(` errors: ${p.errors.join("; ")}`);
|
|
392
|
+
}
|
|
393
|
+
console.log();
|
|
394
|
+
}
|
|
395
|
+
console.log(`Overall pass rate: ${(result.overallPassRate * 100).toFixed(0)}%`);
|
|
396
|
+
console.log(`Duration: ${result.totalDurationMs}ms\n`);
|
|
397
|
+
if (result.recommendations.length > 0) {
|
|
398
|
+
console.log("Recommendations:");
|
|
399
|
+
for (const rec of result.recommendations) {
|
|
400
|
+
console.log(` - ${rec}`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
const webMcp = checkWebMcpReadiness();
|
|
404
|
+
console.log(`\nWebMCP readiness: ${webMcp.ready ? "READY" : "NOT READY"}`);
|
|
405
|
+
if (webMcp.missingItems.length > 0) {
|
|
406
|
+
console.log(" Missing:");
|
|
407
|
+
for (const item of webMcp.missingItems) {
|
|
408
|
+
console.log(` - ${item}`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
})
|
|
412
|
+
.catch((err) => {
|
|
413
|
+
console.error("Validation failed:", err);
|
|
414
|
+
process.exit(1);
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=agentValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentValidation.js","sourceRoot":"","sources":["../../src/benchmarks/agentValidation.ts"],"names":[],"mappings":"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"}
|