nodebench-mcp 2.28.0 → 2.31.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.
Files changed (48) hide show
  1. package/README.md +86 -0
  2. package/dist/db.js +69 -0
  3. package/dist/db.js.map +1 -1
  4. package/dist/engine/conformance.d.ts +31 -0
  5. package/dist/engine/conformance.js +81 -0
  6. package/dist/engine/conformance.js.map +1 -0
  7. package/dist/engine/contextBridge.d.ts +67 -0
  8. package/dist/engine/contextBridge.js +392 -0
  9. package/dist/engine/contextBridge.js.map +1 -0
  10. package/dist/engine/server.d.ts +23 -0
  11. package/dist/engine/server.js +481 -0
  12. package/dist/engine/server.js.map +1 -0
  13. package/dist/engine/session.d.ts +55 -0
  14. package/dist/engine/session.js +139 -0
  15. package/dist/engine/session.js.map +1 -0
  16. package/dist/index.js +113 -11
  17. package/dist/index.js.map +1 -1
  18. package/dist/sandboxApi.d.ts +20 -0
  19. package/dist/sandboxApi.js +99 -0
  20. package/dist/sandboxApi.js.map +1 -0
  21. package/dist/tools/contextSandboxTools.d.ts +15 -0
  22. package/dist/tools/contextSandboxTools.js +469 -0
  23. package/dist/tools/contextSandboxTools.js.map +1 -0
  24. package/dist/tools/contextTools.d.ts +11 -0
  25. package/dist/tools/contextTools.js +175 -0
  26. package/dist/tools/contextTools.js.map +1 -0
  27. package/dist/tools/designGovernanceTools.d.ts +20 -0
  28. package/dist/tools/designGovernanceTools.js +872 -0
  29. package/dist/tools/designGovernanceTools.js.map +1 -0
  30. package/dist/tools/openclawTools.d.ts +1 -0
  31. package/dist/tools/openclawTools.js +780 -0
  32. package/dist/tools/openclawTools.js.map +1 -1
  33. package/dist/tools/progressiveDiscoveryTools.js +3 -3
  34. package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
  35. package/dist/tools/researchOptimizerTools.d.ts +17 -0
  36. package/dist/tools/researchOptimizerTools.js +454 -0
  37. package/dist/tools/researchOptimizerTools.js.map +1 -0
  38. package/dist/tools/scraplingTools.d.ts +15 -0
  39. package/dist/tools/scraplingTools.js +278 -0
  40. package/dist/tools/scraplingTools.js.map +1 -0
  41. package/dist/tools/thompsonProtocolTools.d.ts +58 -0
  42. package/dist/tools/thompsonProtocolTools.js +864 -0
  43. package/dist/tools/thompsonProtocolTools.js.map +1 -0
  44. package/dist/tools/toolRegistry.js +625 -0
  45. package/dist/tools/toolRegistry.js.map +1 -1
  46. package/dist/toolsetRegistry.js +14 -0
  47. package/dist/toolsetRegistry.js.map +1 -1
  48. package/package.json +6 -2
@@ -0,0 +1,392 @@
1
+ /**
2
+ * Engine Context Bridge
3
+ *
4
+ * Connects the engine's ephemeral sessions to SQLite persistent storage.
5
+ * Loads accumulated context before workflow execution and persists outcomes after.
6
+ */
7
+ import { getDb, genId } from "../db.js";
8
+ // ── Load Context ──────────────────────────────────────────────────────
9
+ export function loadSessionContext(workflow, _preset) {
10
+ const db = getDb();
11
+ // Recent runs of the same workflow
12
+ let recentRuns = [];
13
+ try {
14
+ const rows = db.prepare(`
15
+ SELECT workflow, score, grade, duration_ms, created_at
16
+ FROM engine_workflow_runs
17
+ WHERE workflow = ?
18
+ ORDER BY created_at DESC
19
+ LIMIT 5
20
+ `).all(workflow);
21
+ recentRuns = rows.map((r) => ({
22
+ workflow: r.workflow,
23
+ score: r.score ?? 0,
24
+ grade: r.grade ?? "F",
25
+ durationMs: r.duration_ms,
26
+ createdAt: r.created_at,
27
+ }));
28
+ }
29
+ catch { /* table may not exist yet */ }
30
+ // Enrich with scores from engine_reports if workflow_runs doesn't have them
31
+ if (recentRuns.length > 0 && recentRuns[0].score === 0) {
32
+ try {
33
+ for (const run of recentRuns) {
34
+ const report = db.prepare(`
35
+ SELECT score, grade FROM engine_reports
36
+ WHERE session_id = (
37
+ SELECT session_id FROM engine_workflow_runs
38
+ WHERE workflow = ? AND created_at = ?
39
+ LIMIT 1
40
+ )
41
+ ORDER BY generated_at DESC LIMIT 1
42
+ `).get(run.workflow, run.createdAt);
43
+ if (report) {
44
+ run.score = report.score;
45
+ run.grade = report.grade;
46
+ }
47
+ }
48
+ }
49
+ catch { /* best effort */ }
50
+ }
51
+ // Relevant learnings via FTS5
52
+ let relevantLearnings = [];
53
+ try {
54
+ const searchTerms = workflow.replace(/_/g, " ");
55
+ const rows = db.prepare(`
56
+ SELECT l.key, l.content, l.category
57
+ FROM learnings_fts fts
58
+ JOIN learnings l ON l.id = fts.rowid
59
+ WHERE learnings_fts MATCH ?
60
+ ORDER BY rank
61
+ LIMIT 10
62
+ `).all(searchTerms);
63
+ relevantLearnings = rows.map((r) => ({
64
+ key: r.key,
65
+ content: r.content,
66
+ category: r.category,
67
+ }));
68
+ }
69
+ catch {
70
+ // FTS5 syntax error or table missing — try LIKE fallback
71
+ try {
72
+ const pattern = `%${workflow.replace(/_/g, "%")}%`;
73
+ const rows = db.prepare(`
74
+ SELECT key, content, category FROM learnings
75
+ WHERE content LIKE ? OR key LIKE ? OR category LIKE ?
76
+ ORDER BY created_at DESC LIMIT 10
77
+ `).all(pattern, pattern, pattern);
78
+ relevantLearnings = rows.map((r) => ({
79
+ key: r.key,
80
+ content: r.content,
81
+ category: r.category,
82
+ }));
83
+ }
84
+ catch { /* no learnings available */ }
85
+ }
86
+ // Conformance trend from engine_reports
87
+ let conformanceTrend = {
88
+ direction: "insufficient_data",
89
+ avgScore: 0,
90
+ runCount: 0,
91
+ };
92
+ try {
93
+ const rows = db.prepare(`
94
+ SELECT score FROM engine_reports
95
+ WHERE workflow = ?
96
+ ORDER BY generated_at DESC
97
+ LIMIT 10
98
+ `).all(workflow);
99
+ if (rows.length >= 3) {
100
+ const scores = rows.map((r) => r.score);
101
+ const avgScore = scores.reduce((a, b) => a + b, 0) / scores.length;
102
+ const recentHalf = scores.slice(0, Math.ceil(scores.length / 2));
103
+ const olderHalf = scores.slice(Math.ceil(scores.length / 2));
104
+ const recentAvg = recentHalf.reduce((a, b) => a + b, 0) / recentHalf.length;
105
+ const olderAvg = olderHalf.reduce((a, b) => a + b, 0) / olderHalf.length;
106
+ const delta = recentAvg - olderAvg;
107
+ conformanceTrend = {
108
+ direction: delta > 5 ? "improving" : delta < -5 ? "regressing" : "stable",
109
+ avgScore: Math.round(avgScore * 10) / 10,
110
+ runCount: rows.length,
111
+ };
112
+ }
113
+ else if (rows.length > 0) {
114
+ const avgScore = rows.reduce((a, r) => a + r.score, 0) / rows.length;
115
+ conformanceTrend = {
116
+ direction: "insufficient_data",
117
+ avgScore: Math.round(avgScore * 10) / 10,
118
+ runCount: rows.length,
119
+ };
120
+ }
121
+ }
122
+ catch { /* no reports yet */ }
123
+ // Recent content themes
124
+ let recentContentThemes = [];
125
+ try {
126
+ const rows = db.prepare(`
127
+ SELECT themes FROM content_archive
128
+ ORDER BY published_at DESC
129
+ LIMIT 20
130
+ `).all();
131
+ const themeSet = new Set();
132
+ for (const row of rows) {
133
+ if (row.themes) {
134
+ try {
135
+ const parsed = JSON.parse(row.themes);
136
+ if (Array.isArray(parsed))
137
+ parsed.forEach((t) => themeSet.add(t));
138
+ }
139
+ catch { /* skip malformed */ }
140
+ }
141
+ }
142
+ recentContentThemes = Array.from(themeSet).slice(0, 30);
143
+ }
144
+ catch { /* no content archive */ }
145
+ // Open gap count
146
+ let openGapCount = 0;
147
+ try {
148
+ const row = db.prepare(`SELECT COUNT(*) as c FROM gaps WHERE status = 'open'`).get();
149
+ openGapCount = row.c;
150
+ }
151
+ catch { /* no gaps table */ }
152
+ return { recentRuns, relevantLearnings, conformanceTrend, recentContentThemes, openGapCount };
153
+ }
154
+ // ── Persist Outcome ───────────────────────────────────────────────────
155
+ export function persistSessionOutcome(sessionId, report, workflow, preset, callHistory) {
156
+ const db = getDb();
157
+ // Persist conformance report
158
+ try {
159
+ db.prepare(`
160
+ INSERT INTO engine_reports (id, session_id, workflow, preset, score, grade, breakdown, summary, total_steps, successful_steps, failed_steps, total_duration_ms, generated_at)
161
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))
162
+ `).run(genId("rpt"), sessionId, workflow, preset, report.score, report.grade, JSON.stringify(report.breakdown), report.summary, report.totalSteps, report.successfulSteps, report.failedSteps, report.totalDurationMs);
163
+ }
164
+ catch { /* best effort */ }
165
+ // Persist workflow run
166
+ try {
167
+ db.prepare(`
168
+ INSERT INTO engine_workflow_runs (id, session_id, workflow, preset, step_count, success_count, failed_count, duration_ms, created_at)
169
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))
170
+ `).run(genId("run"), sessionId, workflow, preset, report.totalSteps, report.successfulSteps, report.failedSteps, report.totalDurationMs);
171
+ }
172
+ catch { /* best effort */ }
173
+ // Auto-extract learnings from error→success recovery patterns
174
+ if (callHistory) {
175
+ autoExtractLearnings(db, sessionId, callHistory);
176
+ }
177
+ }
178
+ function autoExtractLearnings(db, sessionId, callHistory) {
179
+ const errors = callHistory.filter((r) => r.status === "error");
180
+ for (const err of errors) {
181
+ const laterSuccess = callHistory.find((r) => r.toolName === err.toolName && r.status === "success" && r.timestamp > err.timestamp);
182
+ if (laterSuccess) {
183
+ try {
184
+ const key = `auto:${err.toolName}:${sessionId.slice(-8)}`;
185
+ const errMsg = typeof err.result === "object" && err.result !== null
186
+ ? err.result.error ?? JSON.stringify(err.result)
187
+ : String(err.result);
188
+ db.prepare(`
189
+ INSERT OR IGNORE INTO learnings (id, key, content, category, tags, created_at, updated_at)
190
+ VALUES (?, ?, ?, 'gotcha', ?, datetime('now'), datetime('now'))
191
+ `).run(genId("lrn"), key, `Tool "${err.toolName}" failed then succeeded. Error: ${String(errMsg).slice(0, 200)}`, JSON.stringify([err.toolName, "auto-extracted"]));
192
+ }
193
+ catch { /* best-effort, duplicate keys silently ignored */ }
194
+ }
195
+ }
196
+ }
197
+ // ── Context Health ────────────────────────────────────────────────────
198
+ export function getContextHealth() {
199
+ const db = getDb();
200
+ let learningsCount = 0;
201
+ try {
202
+ const row = db.prepare("SELECT COUNT(*) as c FROM learnings").get();
203
+ learningsCount = row.c;
204
+ }
205
+ catch { /* table missing */ }
206
+ let recentRunScores = [];
207
+ try {
208
+ const rows = db.prepare(`
209
+ SELECT score FROM engine_reports
210
+ ORDER BY generated_at DESC LIMIT 20
211
+ `).all();
212
+ recentRunScores = rows.map((r) => r.score);
213
+ }
214
+ catch { /* no reports */ }
215
+ // Trend direction
216
+ let trendDirection = "insufficient_data";
217
+ if (recentRunScores.length >= 3) {
218
+ const half = Math.ceil(recentRunScores.length / 2);
219
+ const recentAvg = recentRunScores.slice(0, half).reduce((a, b) => a + b, 0) / half;
220
+ const olderAvg = recentRunScores.slice(half).reduce((a, b) => a + b, 0) / (recentRunScores.length - half);
221
+ const delta = recentAvg - olderAvg;
222
+ trendDirection = delta > 5 ? "improving" : delta < -5 ? "regressing" : "stable";
223
+ }
224
+ let contentArchiveSize = 0;
225
+ try {
226
+ const row = db.prepare("SELECT COUNT(*) as c FROM content_archive").get();
227
+ contentArchiveSize = row.c;
228
+ }
229
+ catch { /* table missing */ }
230
+ let daysSinceLastLearning = null;
231
+ try {
232
+ const row = db.prepare("SELECT created_at FROM learnings ORDER BY created_at DESC LIMIT 1").get();
233
+ if (row) {
234
+ const lastDate = new Date(row.created_at);
235
+ daysSinceLastLearning = Math.floor((Date.now() - lastDate.getTime()) / (1000 * 60 * 60 * 24));
236
+ }
237
+ }
238
+ catch { /* table missing */ }
239
+ let workflowCoverage = {};
240
+ try {
241
+ const rows = db.prepare(`
242
+ SELECT workflow, COUNT(*) as c FROM engine_workflow_runs
243
+ GROUP BY workflow ORDER BY c DESC LIMIT 15
244
+ `).all();
245
+ for (const r of rows) {
246
+ workflowCoverage[r.workflow] = r.c;
247
+ }
248
+ }
249
+ catch { /* table missing */ }
250
+ return { learningsCount, recentRunScores, trendDirection, contentArchiveSize, daysSinceLastLearning, workflowCoverage };
251
+ }
252
+ // ── Content Archive ───────────────────────────────────────────────────
253
+ export function archiveContent(title, contentType, digest, themes, workflow, fullContent) {
254
+ const db = getDb();
255
+ try {
256
+ db.prepare(`
257
+ INSERT INTO content_archive (id, title, content_type, digest, full_content, themes, workflow, published_at)
258
+ VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'))
259
+ `).run(genId("cnt"), title, contentType, digest, fullContent ?? null, JSON.stringify(themes), workflow ?? null);
260
+ }
261
+ catch { /* best effort */ }
262
+ }
263
+ export function searchContentArchive(query, contentType, limit = 10) {
264
+ const db = getDb();
265
+ try {
266
+ let rows;
267
+ if (query) {
268
+ rows = db.prepare(`
269
+ SELECT c.id, c.title, c.content_type, c.digest, c.themes, c.published_at
270
+ FROM content_archive_fts fts
271
+ JOIN content_archive c ON c.rowid = fts.rowid
272
+ WHERE content_archive_fts MATCH ?
273
+ ${contentType ? "AND c.content_type = ?" : ""}
274
+ ORDER BY rank
275
+ LIMIT ?
276
+ `).all(...(contentType ? [query, contentType, limit] : [query, limit]));
277
+ }
278
+ else {
279
+ rows = db.prepare(`
280
+ SELECT id, title, content_type, digest, themes, published_at
281
+ FROM content_archive
282
+ ${contentType ? "WHERE content_type = ?" : ""}
283
+ ORDER BY published_at DESC
284
+ LIMIT ?
285
+ `).all(...(contentType ? [contentType, limit] : [limit]));
286
+ }
287
+ return rows.map((r) => ({
288
+ id: r.id,
289
+ title: r.title,
290
+ contentType: r.content_type,
291
+ digest: r.digest ?? "",
292
+ themes: r.themes ? (() => { try {
293
+ return JSON.parse(r.themes);
294
+ }
295
+ catch {
296
+ return [];
297
+ } })() : [],
298
+ publishedAt: r.published_at,
299
+ }));
300
+ }
301
+ catch {
302
+ // FTS5 syntax error — LIKE fallback
303
+ try {
304
+ const pattern = `%${query}%`;
305
+ const rows = db.prepare(`
306
+ SELECT id, title, content_type, digest, themes, published_at
307
+ FROM content_archive
308
+ WHERE title LIKE ? OR digest LIKE ? OR themes LIKE ?
309
+ ${contentType ? "AND content_type = ?" : ""}
310
+ ORDER BY published_at DESC LIMIT ?
311
+ `).all(...(contentType ? [pattern, pattern, pattern, contentType, limit] : [pattern, pattern, pattern, limit]));
312
+ return rows.map((r) => ({
313
+ id: r.id,
314
+ title: r.title,
315
+ contentType: r.content_type,
316
+ digest: r.digest ?? "",
317
+ themes: r.themes ? (() => { try {
318
+ return JSON.parse(r.themes);
319
+ }
320
+ catch {
321
+ return [];
322
+ } })() : [],
323
+ publishedAt: r.published_at,
324
+ }));
325
+ }
326
+ catch {
327
+ return [];
328
+ }
329
+ }
330
+ }
331
+ // ── Workflow History ──────────────────────────────────────────────────
332
+ export function getWorkflowHistory(workflow, limit = 10) {
333
+ const db = getDb();
334
+ try {
335
+ const rows = db.prepare(`
336
+ SELECT r.session_id, r.workflow, r.preset,
337
+ COALESCE(rp.score, 0) as score,
338
+ COALESCE(rp.grade, '-') as grade,
339
+ r.duration_ms, r.step_count, r.success_count, r.failed_count, r.created_at
340
+ FROM engine_workflow_runs r
341
+ LEFT JOIN engine_reports rp ON rp.session_id = r.session_id AND rp.workflow = r.workflow
342
+ WHERE r.workflow = ?
343
+ ORDER BY r.created_at DESC
344
+ LIMIT ?
345
+ `).all(workflow, limit);
346
+ return rows.map((r) => ({
347
+ sessionId: r.session_id,
348
+ workflow: r.workflow,
349
+ preset: r.preset,
350
+ score: r.score,
351
+ grade: r.grade,
352
+ durationMs: r.duration_ms,
353
+ stepCount: r.step_count,
354
+ successCount: r.success_count,
355
+ failedCount: r.failed_count,
356
+ createdAt: r.created_at,
357
+ }));
358
+ }
359
+ catch {
360
+ return [];
361
+ }
362
+ }
363
+ // ── Search Learnings (for API) ────────────────────────────────────────
364
+ export function searchLearnings(query, limit = 10) {
365
+ const db = getDb();
366
+ try {
367
+ const rows = db.prepare(`
368
+ SELECT l.key, l.content, l.category, l.created_at
369
+ FROM learnings_fts fts
370
+ JOIN learnings l ON l.id = fts.rowid
371
+ WHERE learnings_fts MATCH ?
372
+ ORDER BY rank
373
+ LIMIT ?
374
+ `).all(query, limit);
375
+ return rows.map((r) => ({ key: r.key, content: r.content, category: r.category, createdAt: r.created_at }));
376
+ }
377
+ catch {
378
+ try {
379
+ const pattern = `%${query}%`;
380
+ const rows = db.prepare(`
381
+ SELECT key, content, category, created_at
382
+ FROM learnings WHERE content LIKE ? OR key LIKE ?
383
+ ORDER BY created_at DESC LIMIT ?
384
+ `).all(pattern, pattern, limit);
385
+ return rows.map((r) => ({ key: r.key, content: r.content, category: r.category, createdAt: r.created_at }));
386
+ }
387
+ catch {
388
+ return [];
389
+ }
390
+ }
391
+ }
392
+ //# sourceMappingURL=contextBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextBridge.js","sourceRoot":"","sources":["../../src/engine/contextBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * NodeBench Engine — Headless API-First Agentic Engine
3
+ *
4
+ * HTTP server exposing MCP tool handlers as a REST API.
5
+ * Supports: tool execution, workflow chains (with SSE streaming),
6
+ * session management, preset gating, and conformance reports.
7
+ *
8
+ * Port: 6276 (follows 6274 dashboard, 6275 brief convention)
9
+ */
10
+ import type { McpTool } from "../types.js";
11
+ import type { WorkflowChain } from "../tools/toolRegistry.js";
12
+ export interface EngineServerConfig {
13
+ toolMap: Map<string, McpTool>;
14
+ allTools: McpTool[];
15
+ workflowChains: Record<string, WorkflowChain>;
16
+ presets: Record<string, string[]>;
17
+ toolsetMap: Record<string, McpTool[]>;
18
+ toolToToolset: Map<string, string>;
19
+ secret?: string;
20
+ }
21
+ export declare function startEngineServer(config: EngineServerConfig, preferredPort?: number): Promise<number>;
22
+ export declare function stopEngineServer(): void;
23
+ export declare function getEngineUrl(): string | null;