nodebench-mcp 2.31.2 → 2.32.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 (94) hide show
  1. package/README.md +14 -6
  2. package/dist/engine/server.js +14 -4
  3. package/dist/engine/server.js.map +1 -1
  4. package/dist/index.js +1581 -670
  5. package/dist/index.js.map +1 -1
  6. package/dist/security/SecurityError.d.ts +18 -0
  7. package/dist/security/SecurityError.js +22 -0
  8. package/dist/security/SecurityError.js.map +1 -0
  9. package/dist/security/__tests__/security.test.d.ts +8 -0
  10. package/dist/security/__tests__/security.test.js +295 -0
  11. package/dist/security/__tests__/security.test.js.map +1 -0
  12. package/dist/security/auditLog.d.ts +36 -0
  13. package/dist/security/auditLog.js +178 -0
  14. package/dist/security/auditLog.js.map +1 -0
  15. package/dist/security/commandSandbox.d.ts +33 -0
  16. package/dist/security/commandSandbox.js +159 -0
  17. package/dist/security/commandSandbox.js.map +1 -0
  18. package/dist/security/config.d.ts +23 -0
  19. package/dist/security/config.js +43 -0
  20. package/dist/security/config.js.map +1 -0
  21. package/dist/security/credentialRedactor.d.ts +22 -0
  22. package/dist/security/credentialRedactor.js +118 -0
  23. package/dist/security/credentialRedactor.js.map +1 -0
  24. package/dist/security/index.d.ts +20 -0
  25. package/dist/security/index.js +21 -0
  26. package/dist/security/index.js.map +1 -0
  27. package/dist/security/pathSandbox.d.ts +23 -0
  28. package/dist/security/pathSandbox.js +160 -0
  29. package/dist/security/pathSandbox.js.map +1 -0
  30. package/dist/security/urlValidator.d.ts +23 -0
  31. package/dist/security/urlValidator.js +125 -0
  32. package/dist/security/urlValidator.js.map +1 -0
  33. package/dist/tools/agentBootstrapTools.js +22 -29
  34. package/dist/tools/agentBootstrapTools.js.map +1 -1
  35. package/dist/tools/contextSandboxTools.js +7 -9
  36. package/dist/tools/contextSandboxTools.js.map +1 -1
  37. package/dist/tools/deepSimTools.d.ts +2 -0
  38. package/dist/tools/deepSimTools.js +404 -0
  39. package/dist/tools/deepSimTools.js.map +1 -0
  40. package/dist/tools/dimensionTools.d.ts +2 -0
  41. package/dist/tools/dimensionTools.js +246 -0
  42. package/dist/tools/dimensionTools.js.map +1 -0
  43. package/dist/tools/executionTraceTools.d.ts +2 -0
  44. package/dist/tools/executionTraceTools.js +446 -0
  45. package/dist/tools/executionTraceTools.js.map +1 -0
  46. package/dist/tools/founderTools.d.ts +13 -0
  47. package/dist/tools/founderTools.js +595 -0
  48. package/dist/tools/founderTools.js.map +1 -0
  49. package/dist/tools/gitWorkflowTools.js +14 -10
  50. package/dist/tools/gitWorkflowTools.js.map +1 -1
  51. package/dist/tools/githubTools.js +19 -2
  52. package/dist/tools/githubTools.js.map +1 -1
  53. package/dist/tools/index.d.ts +87 -0
  54. package/dist/tools/index.js +102 -0
  55. package/dist/tools/index.js.map +1 -0
  56. package/dist/tools/localFileTools.js +24 -12
  57. package/dist/tools/localFileTools.js.map +1 -1
  58. package/dist/tools/memoryDecay.d.ts +70 -0
  59. package/dist/tools/memoryDecay.js +247 -0
  60. package/dist/tools/memoryDecay.js.map +1 -0
  61. package/dist/tools/missionHarnessTools.d.ts +32 -0
  62. package/dist/tools/missionHarnessTools.js +972 -0
  63. package/dist/tools/missionHarnessTools.js.map +1 -0
  64. package/dist/tools/observabilityTools.d.ts +15 -0
  65. package/dist/tools/observabilityTools.js +787 -0
  66. package/dist/tools/observabilityTools.js.map +1 -0
  67. package/dist/tools/openclawTools.js +151 -36
  68. package/dist/tools/openclawTools.js.map +1 -1
  69. package/dist/tools/progressiveDiscoveryTools.js +5 -4
  70. package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
  71. package/dist/tools/qualityGateTools.js +118 -2
  72. package/dist/tools/qualityGateTools.js.map +1 -1
  73. package/dist/tools/rssTools.js +3 -0
  74. package/dist/tools/rssTools.js.map +1 -1
  75. package/dist/tools/scraplingTools.js +15 -0
  76. package/dist/tools/scraplingTools.js.map +1 -1
  77. package/dist/tools/seoTools.js +66 -1
  78. package/dist/tools/seoTools.js.map +1 -1
  79. package/dist/tools/sessionMemoryTools.js +50 -11
  80. package/dist/tools/sessionMemoryTools.js.map +1 -1
  81. package/dist/tools/temporalIntelligenceTools.d.ts +12 -0
  82. package/dist/tools/temporalIntelligenceTools.js +1068 -0
  83. package/dist/tools/temporalIntelligenceTools.js.map +1 -0
  84. package/dist/tools/toolRegistry.d.ts +19 -0
  85. package/dist/tools/toolRegistry.js +857 -31
  86. package/dist/tools/toolRegistry.js.map +1 -1
  87. package/dist/tools/webTools.js +14 -1
  88. package/dist/tools/webTools.js.map +1 -1
  89. package/dist/tools/webmcpTools.js +13 -2
  90. package/dist/tools/webmcpTools.js.map +1 -1
  91. package/dist/toolsetRegistry.js +13 -0
  92. package/dist/toolsetRegistry.js.map +1 -1
  93. package/dist/types.d.ts +10 -0
  94. package/package.json +124 -124
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Memory Decay — L2 archival policy for session notes
3
+ *
4
+ * Notes older than MEMORY_DECAY_DAYS are moved to an archive directory.
5
+ * Archived notes can still be loaded on demand but are deprioritized
6
+ * in refresh_task_context (weight 0.3 vs 1.0 for recent).
7
+ *
8
+ * Policy: archive, never delete. Configurable via NODEBENCH_MEMORY_DECAY_DAYS env var.
9
+ */
10
+ export declare const DEFAULT_DECAY_DAYS = 30;
11
+ export declare const DECAY_WEIGHT_RECENT = 1;
12
+ export declare const DECAY_WEIGHT_ARCHIVED = 0.3;
13
+ export declare const MAX_ARCHIVE_SCAN = 1000;
14
+ export declare const MAX_ARCHIVED_RESULTS = 50;
15
+ export declare const NOTES_DIR: string;
16
+ export declare const ARCHIVE_DIR: string;
17
+ /**
18
+ * Returns the configured decay threshold in days.
19
+ * Reads NODEBENCH_MEMORY_DECAY_DAYS env var, falls back to DEFAULT_DECAY_DAYS.
20
+ */
21
+ export declare function getDecayDays(): number;
22
+ /**
23
+ * Creates the archive directory if it doesn't exist.
24
+ */
25
+ export declare function ensureArchiveDir(): void;
26
+ /**
27
+ * Extracts a Date from a note filename.
28
+ * Accepts patterns like `2026-03-18.md` or `2026-03-18-143012-some-title.md`.
29
+ * Returns null if the filename doesn't start with a valid YYYY-MM-DD prefix.
30
+ */
31
+ export declare function getNoteDateFromFilename(filename: string): Date | null;
32
+ /**
33
+ * Archives notes older than the decay threshold.
34
+ * Moves files from NOTES_DIR to ARCHIVE_DIR — never deletes.
35
+ *
36
+ * @returns count of archived files and errors encountered
37
+ */
38
+ export declare function archiveOldNotes(): {
39
+ archived: number;
40
+ errors: number;
41
+ };
42
+ /**
43
+ * Loads archived notes with optional keyword filtering.
44
+ * All archived notes carry DECAY_WEIGHT_ARCHIVED (0.3).
45
+ *
46
+ * @returns array of archived notes sorted by date descending, capped at MAX_ARCHIVED_RESULTS
47
+ */
48
+ export declare function loadArchivedNotes(options?: {
49
+ keyword?: string;
50
+ }): Array<{
51
+ date: string;
52
+ content: string;
53
+ weight: number;
54
+ }>;
55
+ /**
56
+ * Returns the decay weight for a given date string.
57
+ * Recent notes (within decay window) get 1.0, archived get 0.3.
58
+ * On parse error, returns DECAY_WEIGHT_RECENT as a fail-safe.
59
+ */
60
+ export declare function getDecayWeight(dateStr: string): number;
61
+ /**
62
+ * Returns summary statistics about notes and archive state.
63
+ */
64
+ export declare function getDecayStats(): {
65
+ totalNotes: number;
66
+ archivedNotes: number;
67
+ recentNotes: number;
68
+ oldestNote: string | null;
69
+ newestNote: string | null;
70
+ };
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Memory Decay — L2 archival policy for session notes
3
+ *
4
+ * Notes older than MEMORY_DECAY_DAYS are moved to an archive directory.
5
+ * Archived notes can still be loaded on demand but are deprioritized
6
+ * in refresh_task_context (weight 0.3 vs 1.0 for recent).
7
+ *
8
+ * Policy: archive, never delete. Configurable via NODEBENCH_MEMORY_DECAY_DAYS env var.
9
+ */
10
+ import * as fs from "fs";
11
+ import * as path from "path";
12
+ import * as os from "os";
13
+ // ─── Constants ───────────────────────────────────────────────────────────────
14
+ export const DEFAULT_DECAY_DAYS = 30;
15
+ export const DECAY_WEIGHT_RECENT = 1.0;
16
+ export const DECAY_WEIGHT_ARCHIVED = 0.3;
17
+ export const MAX_ARCHIVE_SCAN = 1000; // BOUND: max files to scan per directory
18
+ export const MAX_ARCHIVED_RESULTS = 50; // BOUND: max archived notes returned
19
+ export const NOTES_DIR = path.join(os.homedir(), ".nodebench", "notes");
20
+ export const ARCHIVE_DIR = path.join(NOTES_DIR, "archive");
21
+ const DATE_FILENAME_RE = /^(\d{4}-\d{2}-\d{2})(?:[-T].*)?\.md$/;
22
+ // ─── Configuration ───────────────────────────────────────────────────────────
23
+ /**
24
+ * Returns the configured decay threshold in days.
25
+ * Reads NODEBENCH_MEMORY_DECAY_DAYS env var, falls back to DEFAULT_DECAY_DAYS.
26
+ */
27
+ export function getDecayDays() {
28
+ const env = process.env.NODEBENCH_MEMORY_DECAY_DAYS;
29
+ if (env) {
30
+ const parsed = parseInt(env, 10);
31
+ if (!isNaN(parsed) && parsed > 0)
32
+ return parsed;
33
+ }
34
+ return DEFAULT_DECAY_DAYS;
35
+ }
36
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
37
+ /**
38
+ * Creates the archive directory if it doesn't exist.
39
+ */
40
+ export function ensureArchiveDir() {
41
+ try {
42
+ if (!fs.existsSync(ARCHIVE_DIR)) {
43
+ fs.mkdirSync(ARCHIVE_DIR, { recursive: true });
44
+ }
45
+ }
46
+ catch {
47
+ // Best-effort — caller handles missing dir gracefully
48
+ }
49
+ }
50
+ /**
51
+ * Extracts a Date from a note filename.
52
+ * Accepts patterns like `2026-03-18.md` or `2026-03-18-143012-some-title.md`.
53
+ * Returns null if the filename doesn't start with a valid YYYY-MM-DD prefix.
54
+ */
55
+ export function getNoteDateFromFilename(filename) {
56
+ const match = filename.match(DATE_FILENAME_RE);
57
+ if (!match)
58
+ return null;
59
+ const date = new Date(match[1] + "T00:00:00");
60
+ // Guard against invalid dates (e.g., 2026-02-30)
61
+ if (isNaN(date.getTime()))
62
+ return null;
63
+ return date;
64
+ }
65
+ /**
66
+ * Returns the age in days between a given date and now.
67
+ */
68
+ function ageDays(date) {
69
+ const now = Date.now();
70
+ return (now - date.getTime()) / (1000 * 60 * 60 * 24);
71
+ }
72
+ // ─── Core Functions ──────────────────────────────────────────────────────────
73
+ /**
74
+ * Archives notes older than the decay threshold.
75
+ * Moves files from NOTES_DIR to ARCHIVE_DIR — never deletes.
76
+ *
77
+ * @returns count of archived files and errors encountered
78
+ */
79
+ export function archiveOldNotes() {
80
+ // If notes dir doesn't exist, nothing to archive
81
+ if (!fs.existsSync(NOTES_DIR)) {
82
+ return { archived: 0, errors: 0 };
83
+ }
84
+ ensureArchiveDir();
85
+ const decayDays = getDecayDays();
86
+ let archived = 0;
87
+ let errors = 0;
88
+ try {
89
+ const entries = fs.readdirSync(NOTES_DIR);
90
+ // BOUND: limit scan size
91
+ const mdFiles = entries.filter((f) => f.endsWith(".md")).slice(0, MAX_ARCHIVE_SCAN);
92
+ for (const file of mdFiles) {
93
+ try {
94
+ const noteDate = getNoteDateFromFilename(file);
95
+ if (!noteDate)
96
+ continue; // Non-standard filename, skip
97
+ if (ageDays(noteDate) > decayDays) {
98
+ const src = path.join(NOTES_DIR, file);
99
+ const dest = path.join(ARCHIVE_DIR, file);
100
+ fs.renameSync(src, dest);
101
+ archived++;
102
+ }
103
+ }
104
+ catch {
105
+ // ERROR_BOUNDARY: individual file failure doesn't stop the sweep
106
+ errors++;
107
+ }
108
+ }
109
+ }
110
+ catch {
111
+ // ERROR_BOUNDARY: directory read failure
112
+ errors++;
113
+ }
114
+ return { archived, errors };
115
+ }
116
+ /**
117
+ * Loads archived notes with optional keyword filtering.
118
+ * All archived notes carry DECAY_WEIGHT_ARCHIVED (0.3).
119
+ *
120
+ * @returns array of archived notes sorted by date descending, capped at MAX_ARCHIVED_RESULTS
121
+ */
122
+ export function loadArchivedNotes(options) {
123
+ if (!fs.existsSync(ARCHIVE_DIR))
124
+ return [];
125
+ const keyword = options?.keyword?.toLowerCase();
126
+ const results = [];
127
+ try {
128
+ const entries = fs.readdirSync(ARCHIVE_DIR);
129
+ const mdFiles = entries
130
+ .filter((f) => f.endsWith(".md"))
131
+ .sort((a, b) => b.localeCompare(a)); // newest first
132
+ for (const file of mdFiles) {
133
+ if (results.length >= MAX_ARCHIVED_RESULTS)
134
+ break; // BOUND
135
+ try {
136
+ const noteDate = getNoteDateFromFilename(file);
137
+ const dateStr = noteDate
138
+ ? noteDate.toISOString().slice(0, 10)
139
+ : file.slice(0, 10); // best-effort fallback
140
+ const content = fs.readFileSync(path.join(ARCHIVE_DIR, file), "utf-8");
141
+ // Keyword filter
142
+ if (keyword && !content.toLowerCase().includes(keyword))
143
+ continue;
144
+ results.push({
145
+ date: dateStr,
146
+ content,
147
+ weight: DECAY_WEIGHT_ARCHIVED,
148
+ });
149
+ }
150
+ catch {
151
+ // ERROR_BOUNDARY: skip unreadable files
152
+ continue;
153
+ }
154
+ }
155
+ }
156
+ catch {
157
+ // ERROR_BOUNDARY: archive dir read failure
158
+ return [];
159
+ }
160
+ return results;
161
+ }
162
+ /**
163
+ * Returns the decay weight for a given date string.
164
+ * Recent notes (within decay window) get 1.0, archived get 0.3.
165
+ * On parse error, returns DECAY_WEIGHT_RECENT as a fail-safe.
166
+ */
167
+ export function getDecayWeight(dateStr) {
168
+ try {
169
+ const date = new Date(dateStr);
170
+ if (isNaN(date.getTime()))
171
+ return DECAY_WEIGHT_RECENT;
172
+ return ageDays(date) > getDecayDays()
173
+ ? DECAY_WEIGHT_ARCHIVED
174
+ : DECAY_WEIGHT_RECENT;
175
+ }
176
+ catch {
177
+ return DECAY_WEIGHT_RECENT; // fail-safe: treat as recent
178
+ }
179
+ }
180
+ /**
181
+ * Returns summary statistics about notes and archive state.
182
+ */
183
+ export function getDecayStats() {
184
+ let recentNotes = 0;
185
+ let archivedNotes = 0;
186
+ let oldestNote = null;
187
+ let newestNote = null;
188
+ // Count recent notes
189
+ try {
190
+ if (fs.existsSync(NOTES_DIR)) {
191
+ const files = fs
192
+ .readdirSync(NOTES_DIR)
193
+ .filter((f) => f.endsWith(".md"))
194
+ .sort();
195
+ recentNotes = files.length;
196
+ if (files.length > 0) {
197
+ const oldestDate = getNoteDateFromFilename(files[0]);
198
+ const newestDate = getNoteDateFromFilename(files[files.length - 1]);
199
+ if (oldestDate)
200
+ oldestNote = oldestDate.toISOString().slice(0, 10);
201
+ if (newestDate)
202
+ newestNote = newestDate.toISOString().slice(0, 10);
203
+ }
204
+ }
205
+ }
206
+ catch {
207
+ // ERROR_BOUNDARY
208
+ }
209
+ // Count archived notes
210
+ try {
211
+ if (fs.existsSync(ARCHIVE_DIR)) {
212
+ const archiveFiles = fs
213
+ .readdirSync(ARCHIVE_DIR)
214
+ .filter((f) => f.endsWith(".md"))
215
+ .sort();
216
+ archivedNotes = archiveFiles.length;
217
+ // Extend oldest/newest to include archive
218
+ if (archiveFiles.length > 0) {
219
+ const archiveOldest = getNoteDateFromFilename(archiveFiles[0]);
220
+ const archiveNewest = getNoteDateFromFilename(archiveFiles[archiveFiles.length - 1]);
221
+ if (archiveOldest) {
222
+ const archiveOldestStr = archiveOldest.toISOString().slice(0, 10);
223
+ if (!oldestNote || archiveOldestStr < oldestNote) {
224
+ oldestNote = archiveOldestStr;
225
+ }
226
+ }
227
+ if (archiveNewest) {
228
+ const archiveNewestStr = archiveNewest.toISOString().slice(0, 10);
229
+ if (!newestNote || archiveNewestStr > newestNote) {
230
+ newestNote = archiveNewestStr;
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ catch {
237
+ // ERROR_BOUNDARY
238
+ }
239
+ return {
240
+ totalNotes: recentNotes + archivedNotes,
241
+ archivedNotes,
242
+ recentNotes,
243
+ oldestNote,
244
+ newestNote,
245
+ };
246
+ }
247
+ //# sourceMappingURL=memoryDecay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryDecay.js","sourceRoot":"","sources":["../../src/tools/memoryDecay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Mission Harness Tools — Hierarchical mission execution for verifiable work
3
+ *
4
+ * NodeBench is not a single-agent assistant. It is a hierarchical mission
5
+ * execution harness for verifiable work.
6
+ *
7
+ * Architecture: Planner → Worker → Judge → Human Sniff-Check → Merge
8
+ *
9
+ * 5 first-class tools:
10
+ * plan.decompose_mission — Break mission into subtasks with verifiability routing
11
+ * judge.verify_subtask — Machine/expert verification with retry budget
12
+ * judge.request_retry — Retry, re-plan, escalate, or stop
13
+ * merge.compose_output — Judge-gated merge of subtask artifacts
14
+ * sniff.record_human_review — Human pass/concern/block with issue tags
15
+ *
16
+ * Persistence: SQLite-backed runs, taskPlans, subtaskAssignments, runSteps,
17
+ * artifacts, evidence, judgeReviews, retryAttempts, mergeBoundaries,
18
+ * sniffChecks, approvals.
19
+ *
20
+ * Verifiability tiers:
21
+ * Tier 1 — Machine-checkable (deterministic, automated judge)
22
+ * Tier 2 — Expert-checkable (requires human sniff-check)
23
+ *
24
+ * Anti-flat-coordination rules enforced:
25
+ * - One owner per subtask
26
+ * - Bounded input package
27
+ * - Explicit output contract
28
+ * - Judge-gated merge only
29
+ * - No shared free-for-all editing
30
+ */
31
+ import type { McpTool } from "../types.js";
32
+ export declare const missionHarnessTools: McpTool[];