nodebench-mcp 1.1.0 → 1.4.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/NODEBENCH_AGENTS.md +323 -18
  2. package/STYLE_GUIDE.md +477 -0
  3. package/dist/__tests__/evalDatasetBench.test.d.ts +1 -0
  4. package/dist/__tests__/evalDatasetBench.test.js +738 -0
  5. package/dist/__tests__/evalDatasetBench.test.js.map +1 -0
  6. package/dist/__tests__/evalHarness.test.d.ts +1 -0
  7. package/dist/__tests__/evalHarness.test.js +830 -0
  8. package/dist/__tests__/evalHarness.test.js.map +1 -0
  9. package/dist/__tests__/fixtures/bfcl_v3_long_context.sample.json +264 -0
  10. package/dist/__tests__/fixtures/generateBfclLongContextFixture.d.ts +10 -0
  11. package/dist/__tests__/fixtures/generateBfclLongContextFixture.js +135 -0
  12. package/dist/__tests__/fixtures/generateBfclLongContextFixture.js.map +1 -0
  13. package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.d.ts +14 -0
  14. package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js +189 -0
  15. package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js.map +1 -0
  16. package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.d.ts +16 -0
  17. package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js +154 -0
  18. package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js.map +1 -0
  19. package/dist/__tests__/fixtures/swebench_verified.sample.json +162 -0
  20. package/dist/__tests__/fixtures/toolbench_instruction.sample.json +109 -0
  21. package/dist/__tests__/openDatasetParallelEval.test.d.ts +7 -0
  22. package/dist/__tests__/openDatasetParallelEval.test.js +209 -0
  23. package/dist/__tests__/openDatasetParallelEval.test.js.map +1 -0
  24. package/dist/__tests__/openDatasetParallelEvalSwebench.test.d.ts +7 -0
  25. package/dist/__tests__/openDatasetParallelEvalSwebench.test.js +220 -0
  26. package/dist/__tests__/openDatasetParallelEvalSwebench.test.js.map +1 -0
  27. package/dist/__tests__/openDatasetParallelEvalToolbench.test.d.ts +7 -0
  28. package/dist/__tests__/openDatasetParallelEvalToolbench.test.js +218 -0
  29. package/dist/__tests__/openDatasetParallelEvalToolbench.test.js.map +1 -0
  30. package/dist/__tests__/tools.test.js +256 -4
  31. package/dist/__tests__/tools.test.js.map +1 -1
  32. package/dist/db.js +20 -0
  33. package/dist/db.js.map +1 -1
  34. package/dist/index.js +4 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/tools/agentBootstrapTools.d.ts +23 -0
  37. package/dist/tools/agentBootstrapTools.js +1541 -0
  38. package/dist/tools/agentBootstrapTools.js.map +1 -0
  39. package/dist/tools/documentationTools.js +102 -8
  40. package/dist/tools/documentationTools.js.map +1 -1
  41. package/dist/tools/learningTools.js +6 -2
  42. package/dist/tools/learningTools.js.map +1 -1
  43. package/dist/tools/metaTools.js +176 -1
  44. package/dist/tools/metaTools.js.map +1 -1
  45. package/dist/tools/selfEvalTools.d.ts +12 -0
  46. package/dist/tools/selfEvalTools.js +568 -0
  47. package/dist/tools/selfEvalTools.js.map +1 -0
  48. package/package.json +11 -3
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Refreshes a local fixture from SWE-bench Verified (open-source GitHub issue tasks).
4
+ *
5
+ * Source:
6
+ * - https://huggingface.co/datasets/princeton-nlp/SWE-bench_Verified
7
+ * - rows API: https://datasets-server.huggingface.co/rows
8
+ *
9
+ * Usage:
10
+ * npx tsx src/__tests__/fixtures/generateSwebenchVerifiedFixture.ts
11
+ * npx tsx src/__tests__/fixtures/generateSwebenchVerifiedFixture.ts --limit 12 --min-statement-length 700 --min-fail-to-pass 2
12
+ * npx tsx src/__tests__/fixtures/generateSwebenchVerifiedFixture.ts --output ./tmp/swebench.sample.json
13
+ */
14
+ import { mkdirSync, writeFileSync } from "node:fs";
15
+ import { dirname, join } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+ const DATASET = "princeton-nlp/SWE-bench_Verified";
18
+ const CONFIG = "default";
19
+ const SPLIT = "test";
20
+ const ROWS_API = "https://datasets-server.huggingface.co/rows";
21
+ const DATASET_PAGE = "https://huggingface.co/datasets/princeton-nlp/SWE-bench_Verified";
22
+ function getArg(flag) {
23
+ const index = process.argv.indexOf(flag);
24
+ if (index < 0)
25
+ return undefined;
26
+ return process.argv[index + 1];
27
+ }
28
+ function parseIntArg(flag, fallback) {
29
+ const raw = getArg(flag);
30
+ if (!raw)
31
+ return fallback;
32
+ const value = Number.parseInt(raw, 10);
33
+ if (!Number.isFinite(value))
34
+ return fallback;
35
+ return value;
36
+ }
37
+ function compactWhitespace(input) {
38
+ return input.replace(/\s+/g, " ").trim();
39
+ }
40
+ function parseStringArray(value) {
41
+ if (Array.isArray(value)) {
42
+ return value.filter((item) => typeof item === "string");
43
+ }
44
+ if (typeof value !== "string" || value.trim().length === 0)
45
+ return [];
46
+ try {
47
+ const parsed = JSON.parse(value);
48
+ if (!Array.isArray(parsed))
49
+ return [];
50
+ return parsed.filter((item) => typeof item === "string");
51
+ }
52
+ catch {
53
+ return [];
54
+ }
55
+ }
56
+ function difficultyWeight(difficulty) {
57
+ const normalized = difficulty.toLowerCase();
58
+ if (normalized.includes("1-4 hours"))
59
+ return 50;
60
+ if (normalized.includes("15 min - 1 hour"))
61
+ return 30;
62
+ if (normalized.includes("<15 min"))
63
+ return 10;
64
+ return 20;
65
+ }
66
+ function toTask(raw, index) {
67
+ const id = compactWhitespace(String(raw.instance_id ?? ""));
68
+ const repo = compactWhitespace(String(raw.repo ?? ""));
69
+ const problemStatement = compactWhitespace(String(raw.problem_statement ?? ""));
70
+ if (!id || !repo || !problemStatement)
71
+ return null;
72
+ const hints = compactWhitespace(String(raw.hints_text ?? ""));
73
+ const difficulty = compactWhitespace(String(raw.difficulty ?? "unspecified"));
74
+ const failToPassCount = parseStringArray(raw.FAIL_TO_PASS).length;
75
+ const passToPassCount = parseStringArray(raw.PASS_TO_PASS).length;
76
+ const statementLength = problemStatement.length;
77
+ const hintLength = hints.length;
78
+ const complexityScore = Math.ceil(statementLength / 25) +
79
+ Math.ceil(hintLength / 40) +
80
+ failToPassCount * 14 +
81
+ Math.ceil(passToPassCount / 8) +
82
+ difficultyWeight(difficulty);
83
+ const promptSections = [
84
+ `Repository: ${repo}`,
85
+ `Instance: ${id}`,
86
+ `Difficulty: ${difficulty}`,
87
+ `Problem: ${problemStatement}`,
88
+ ];
89
+ if (hints.length > 0) {
90
+ promptSections.push(`Hints: ${hints}`);
91
+ }
92
+ return {
93
+ id,
94
+ title: `SWE-bench ${id}`,
95
+ prompt: promptSections.join("\n"),
96
+ repo,
97
+ difficulty,
98
+ statementLength,
99
+ hintLength,
100
+ failToPassCount,
101
+ passToPassCount,
102
+ complexityScore,
103
+ };
104
+ }
105
+ async function fetchRows(offset, length) {
106
+ const url = new URL(ROWS_API);
107
+ url.searchParams.set("dataset", DATASET);
108
+ url.searchParams.set("config", CONFIG);
109
+ url.searchParams.set("split", SPLIT);
110
+ url.searchParams.set("offset", String(offset));
111
+ url.searchParams.set("length", String(length));
112
+ const response = await fetch(url.toString());
113
+ if (!response.ok) {
114
+ throw new Error(`Failed to fetch SWE-bench rows: ${response.status} ${response.statusText}`);
115
+ }
116
+ return (await response.json());
117
+ }
118
+ async function loadRows(maxRows, pageSize) {
119
+ const rows = [];
120
+ for (let offset = 0; offset < maxRows; offset += pageSize) {
121
+ const remaining = maxRows - offset;
122
+ const length = Math.max(1, Math.min(pageSize, remaining));
123
+ const page = await fetchRows(offset, length);
124
+ const pageRows = Array.isArray(page.rows) ? page.rows : [];
125
+ if (pageRows.length === 0)
126
+ break;
127
+ for (const entry of pageRows) {
128
+ if (!entry || typeof entry !== "object")
129
+ continue;
130
+ const row = entry.row;
131
+ if (row && typeof row === "object")
132
+ rows.push(row);
133
+ }
134
+ if (pageRows.length < length)
135
+ break;
136
+ }
137
+ return rows;
138
+ }
139
+ async function main() {
140
+ const limit = Math.max(1, parseIntArg("--limit", 12));
141
+ const minStatementLength = Math.max(100, parseIntArg("--min-statement-length", 700));
142
+ const minFailToPass = Math.max(1, parseIntArg("--min-fail-to-pass", 2));
143
+ const maxRowsScanned = Math.max(50, parseIntArg("--max-rows", 500));
144
+ const pageSize = Math.max(10, parseIntArg("--page-size", 100));
145
+ const here = dirname(fileURLToPath(import.meta.url));
146
+ const outputPath = getArg("--output") ?? join(here, "swebench_verified.sample.json");
147
+ const rawRows = await loadRows(maxRowsScanned, pageSize);
148
+ const tasks = rawRows
149
+ .map((row, index) => toTask(row, index))
150
+ .filter((task) => task !== null);
151
+ const candidates = tasks
152
+ .filter((task) => task.statementLength >= minStatementLength && task.failToPassCount >= minFailToPass)
153
+ .sort((a, b) => {
154
+ if (b.complexityScore !== a.complexityScore)
155
+ return b.complexityScore - a.complexityScore;
156
+ return a.id.localeCompare(b.id);
157
+ });
158
+ const selected = candidates.slice(0, limit);
159
+ if (selected.length === 0) {
160
+ throw new Error(`No SWE-bench tasks matched filters (minStatementLength=${minStatementLength}, minFailToPass=${minFailToPass}).`);
161
+ }
162
+ const fixture = {
163
+ dataset: DATASET,
164
+ split: SPLIT,
165
+ sourceUrl: DATASET_PAGE,
166
+ rowsApi: ROWS_API,
167
+ generatedAt: new Date().toISOString(),
168
+ selection: {
169
+ requestedLimit: limit,
170
+ minStatementLength,
171
+ minFailToPass,
172
+ maxRowsScanned,
173
+ pageSize,
174
+ totalRecords: tasks.length,
175
+ candidateRecords: candidates.length,
176
+ },
177
+ tasks: selected,
178
+ };
179
+ mkdirSync(dirname(outputPath), { recursive: true });
180
+ writeFileSync(outputPath, JSON.stringify(fixture, null, 2) + "\n", "utf8");
181
+ console.log(`[swebench-fixture] wrote ${selected.length} tasks to ${outputPath}`);
182
+ console.log(`[swebench-fixture] total=${tasks.length}, candidates=${candidates.length}, filters=statement>=${minStatementLength}, failToPass>=${minFailToPass}`);
183
+ }
184
+ main().catch((error) => {
185
+ const message = error instanceof Error ? error.stack ?? error.message : String(error);
186
+ process.stderr.write(`${message}\n`);
187
+ process.exit(1);
188
+ });
189
+ //# sourceMappingURL=generateSwebenchVerifiedFixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSwebenchVerifiedFixture.js","sourceRoot":"","sources":["../../../src/__tests__/fixtures/generateSwebenchVerifiedFixture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Refreshes a local fixture from the open-source ToolBench instruction dataset.
4
+ *
5
+ * Source:
6
+ * - https://github.com/OpenBMB/ToolBench
7
+ * - data_example/instruction/G1_query.json
8
+ * - data_example/instruction/G2_query.json
9
+ * - data_example/instruction/G3_query.json
10
+ *
11
+ * Usage:
12
+ * npx tsx src/__tests__/fixtures/generateToolbenchInstructionFixture.ts
13
+ * npx tsx src/__tests__/fixtures/generateToolbenchInstructionFixture.ts --limit 10 --min-api 6
14
+ * npx tsx src/__tests__/fixtures/generateToolbenchInstructionFixture.ts --output ./tmp/toolbench.sample.json
15
+ */
16
+ export {};
@@ -0,0 +1,154 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Refreshes a local fixture from the open-source ToolBench instruction dataset.
4
+ *
5
+ * Source:
6
+ * - https://github.com/OpenBMB/ToolBench
7
+ * - data_example/instruction/G1_query.json
8
+ * - data_example/instruction/G2_query.json
9
+ * - data_example/instruction/G3_query.json
10
+ *
11
+ * Usage:
12
+ * npx tsx src/__tests__/fixtures/generateToolbenchInstructionFixture.ts
13
+ * npx tsx src/__tests__/fixtures/generateToolbenchInstructionFixture.ts --limit 10 --min-api 6
14
+ * npx tsx src/__tests__/fixtures/generateToolbenchInstructionFixture.ts --output ./tmp/toolbench.sample.json
15
+ */
16
+ import { mkdirSync, writeFileSync } from "node:fs";
17
+ import { dirname, join } from "node:path";
18
+ import { fileURLToPath } from "node:url";
19
+ const SOURCES = [
20
+ {
21
+ group: "G1",
22
+ url: "https://raw.githubusercontent.com/OpenBMB/ToolBench/master/data_example/instruction/G1_query.json",
23
+ },
24
+ {
25
+ group: "G2",
26
+ url: "https://raw.githubusercontent.com/OpenBMB/ToolBench/master/data_example/instruction/G2_query.json",
27
+ },
28
+ {
29
+ group: "G3",
30
+ url: "https://raw.githubusercontent.com/OpenBMB/ToolBench/master/data_example/instruction/G3_query.json",
31
+ },
32
+ ];
33
+ function getArg(flag) {
34
+ const index = process.argv.indexOf(flag);
35
+ if (index < 0)
36
+ return undefined;
37
+ return process.argv[index + 1];
38
+ }
39
+ function parseIntArg(flag, fallback) {
40
+ const raw = getArg(flag);
41
+ if (!raw)
42
+ return fallback;
43
+ const value = Number.parseInt(raw, 10);
44
+ if (!Number.isFinite(value))
45
+ return fallback;
46
+ return value;
47
+ }
48
+ function compactWhitespace(input) {
49
+ return input.replace(/\s+/g, " ").trim();
50
+ }
51
+ function asArray(value) {
52
+ return Array.isArray(value) ? value : [];
53
+ }
54
+ function toTask(record, group, index) {
55
+ const query = compactWhitespace(String(record.query ?? ""));
56
+ if (!query)
57
+ return null;
58
+ const apiList = asArray(record.api_list).filter((entry) => typeof entry === "object" && entry !== null);
59
+ const requiredParameterCount = apiList.reduce((count, api) => {
60
+ return count + asArray(api.required_parameters).length;
61
+ }, 0);
62
+ const optionalParameterCount = apiList.reduce((count, api) => {
63
+ return count + asArray(api.optional_parameters).length;
64
+ }, 0);
65
+ const apiCategories = Array.from(new Set(apiList
66
+ .map((api) => String(api.category_name ?? "").trim())
67
+ .filter((name) => name.length > 0)));
68
+ const apiCount = apiList.length;
69
+ const relevantApiCount = asArray(record["relevant APIs"]).length;
70
+ const rawId = String(record.query_id ?? `${group}_${index + 1}`).trim();
71
+ const id = `${group}_${rawId}`;
72
+ const title = `ToolBench ${group} query ${rawId}`;
73
+ const complexityScore = apiCount * 12 +
74
+ requiredParameterCount * 2 +
75
+ optionalParameterCount +
76
+ relevantApiCount * 3 +
77
+ Math.ceil(query.length / 40);
78
+ return {
79
+ id,
80
+ title,
81
+ prompt: query,
82
+ group,
83
+ apiCount,
84
+ relevantApiCount,
85
+ requiredParameterCount,
86
+ optionalParameterCount,
87
+ apiCategories,
88
+ complexityScore,
89
+ };
90
+ }
91
+ async function fetchSource(group, url) {
92
+ const response = await fetch(url);
93
+ if (!response.ok) {
94
+ throw new Error(`Failed to fetch ${group} dataset: ${response.status} ${response.statusText}`);
95
+ }
96
+ const raw = await response.json();
97
+ if (!Array.isArray(raw)) {
98
+ throw new Error(`Unexpected payload for ${group}: expected array`);
99
+ }
100
+ return raw;
101
+ }
102
+ async function main() {
103
+ const limit = Math.max(1, parseIntArg("--limit", 10));
104
+ const minApiCount = Math.max(1, parseIntArg("--min-api", 6));
105
+ const minQueryLength = Math.max(1, parseIntArg("--min-query-length", 180));
106
+ const here = dirname(fileURLToPath(import.meta.url));
107
+ const outputPath = getArg("--output") ?? join(here, "toolbench_instruction.sample.json");
108
+ const fetched = await Promise.all(SOURCES.map(async (source) => {
109
+ const records = await fetchSource(source.group, source.url);
110
+ return { ...source, records };
111
+ }));
112
+ const tasks = fetched.flatMap((entry) => entry.records
113
+ .map((record, index) => toTask(record, entry.group, index))
114
+ .filter((task) => task !== null));
115
+ const candidates = tasks
116
+ .filter((task) => task.apiCount >= minApiCount && task.prompt.length >= minQueryLength)
117
+ .sort((a, b) => {
118
+ if (b.complexityScore !== a.complexityScore)
119
+ return b.complexityScore - a.complexityScore;
120
+ return a.id.localeCompare(b.id);
121
+ });
122
+ const selected = candidates.slice(0, limit);
123
+ if (selected.length === 0) {
124
+ throw new Error(`No ToolBench tasks matched filters (minApiCount=${minApiCount}, minQueryLength=${minQueryLength}).`);
125
+ }
126
+ const sourceUrls = SOURCES.reduce((acc, source) => {
127
+ acc[source.group] = source.url;
128
+ return acc;
129
+ }, {});
130
+ const fixture = {
131
+ dataset: "OpenBMB/ToolBench",
132
+ split: "data_example/instruction (G1,G2,G3)",
133
+ sourceUrls,
134
+ generatedAt: new Date().toISOString(),
135
+ selection: {
136
+ requestedLimit: limit,
137
+ minApiCount,
138
+ minQueryLength,
139
+ totalRecords: tasks.length,
140
+ candidateRecords: candidates.length,
141
+ },
142
+ tasks: selected,
143
+ };
144
+ mkdirSync(dirname(outputPath), { recursive: true });
145
+ writeFileSync(outputPath, JSON.stringify(fixture, null, 2) + "\n", "utf8");
146
+ console.log(`[toolbench-fixture] wrote ${selected.length} tasks to ${outputPath}`);
147
+ console.log(`[toolbench-fixture] total=${tasks.length}, candidates=${candidates.length}, filters=api>=${minApiCount}, queryLength>=${minQueryLength}`);
148
+ }
149
+ main().catch((error) => {
150
+ const message = error instanceof Error ? error.stack ?? error.message : String(error);
151
+ process.stderr.write(`${message}\n`);
152
+ process.exit(1);
153
+ });
154
+ //# sourceMappingURL=generateToolbenchInstructionFixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateToolbenchInstructionFixture.js","sourceRoot":"","sources":["../../../src/__tests__/fixtures/generateToolbenchInstructionFixture.ts"],"names":[],"mappings":"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"}