@securecode-ai/mcp 0.4.9 → 0.5.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/api/types.d.ts +14 -0
- package/dist/attack/verifyLoop.d.ts +31 -0
- package/dist/attack/verifyLoop.js +65 -0
- package/dist/attack/verifyLoop.js.map +1 -0
- package/dist/tools/agentScan.d.ts +7 -8
- package/dist/tools/agentScan.js +55 -115
- package/dist/tools/agentScan.js.map +1 -1
- package/dist/utils/localTestRunner.d.ts +6 -0
- package/dist/utils/localTestRunner.js +103 -0
- package/dist/utils/localTestRunner.js.map +1 -0
- package/dist/utils/testSafety.d.ts +4 -0
- package/dist/utils/testSafety.js +39 -0
- package/dist/utils/testSafety.js.map +1 -0
- package/package.json +1 -1
package/dist/api/types.d.ts
CHANGED
|
@@ -185,3 +185,17 @@ export interface SandboxProveResponse {
|
|
|
185
185
|
};
|
|
186
186
|
scanCredits?: number;
|
|
187
187
|
}
|
|
188
|
+
export interface VerifyGenerateResponse {
|
|
189
|
+
canTest: boolean;
|
|
190
|
+
testScript?: string;
|
|
191
|
+
runner?: string;
|
|
192
|
+
description?: string;
|
|
193
|
+
skipReason?: string;
|
|
194
|
+
scanCredits?: number;
|
|
195
|
+
}
|
|
196
|
+
export interface VerifyAnalyzeResponse {
|
|
197
|
+
verdict: 'PROVEN' | 'UNPROVEN' | 'INCONCLUSIVE';
|
|
198
|
+
reason: string;
|
|
199
|
+
shouldRetry: boolean;
|
|
200
|
+
scanCredits?: number;
|
|
201
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ApiClient } from '../api/client';
|
|
2
|
+
export interface VerifyFinding {
|
|
3
|
+
type: string;
|
|
4
|
+
line: number;
|
|
5
|
+
lineEnd?: number;
|
|
6
|
+
evidence: string;
|
|
7
|
+
why: string;
|
|
8
|
+
severity: string;
|
|
9
|
+
}
|
|
10
|
+
export interface VerifyLoopOptions {
|
|
11
|
+
finding: VerifyFinding;
|
|
12
|
+
filePath: string;
|
|
13
|
+
code: string;
|
|
14
|
+
relatedFiles: Array<{
|
|
15
|
+
filePath: string;
|
|
16
|
+
content: string;
|
|
17
|
+
relationship: string;
|
|
18
|
+
}>;
|
|
19
|
+
workspaceRoot: string;
|
|
20
|
+
language: string;
|
|
21
|
+
client: ApiClient;
|
|
22
|
+
onProgress?: (round: number, maxRounds: number, message: string) => void;
|
|
23
|
+
}
|
|
24
|
+
export interface VerifyLoopResult {
|
|
25
|
+
verdict: 'PROVEN' | 'UNPROVEN' | 'INCONCLUSIVE';
|
|
26
|
+
reason: string;
|
|
27
|
+
roundsUsed: number;
|
|
28
|
+
testScript: string;
|
|
29
|
+
testOutput: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function runVerifyLoop(opts: VerifyLoopOptions): Promise<VerifyLoopResult>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runVerifyLoop = runVerifyLoop;
|
|
4
|
+
const localTestRunner_1 = require("../utils/localTestRunner");
|
|
5
|
+
const MAX_ROUNDS = 8;
|
|
6
|
+
async function runVerifyLoop(opts) {
|
|
7
|
+
const { finding, filePath, code, relatedFiles, workspaceRoot, language, client, onProgress } = opts;
|
|
8
|
+
const previousErrors = [];
|
|
9
|
+
let lastTestScript = '';
|
|
10
|
+
let lastTestOutput = '';
|
|
11
|
+
for (let round = 1; round <= MAX_ROUNDS; round++) {
|
|
12
|
+
onProgress?.(round, MAX_ROUNDS, `Round ${round}: generating test...`);
|
|
13
|
+
const genResp = await client.postJson('/verify/generate', {
|
|
14
|
+
code,
|
|
15
|
+
language,
|
|
16
|
+
vulnerabilityType: finding.type,
|
|
17
|
+
line: finding.line,
|
|
18
|
+
lineEnd: finding.lineEnd,
|
|
19
|
+
evidence: finding.evidence,
|
|
20
|
+
why: finding.why,
|
|
21
|
+
filePath,
|
|
22
|
+
relatedFiles,
|
|
23
|
+
previousErrors: previousErrors.length > 0 ? previousErrors : undefined,
|
|
24
|
+
});
|
|
25
|
+
if (!genResp.canTest || !genResp.testScript) {
|
|
26
|
+
return {
|
|
27
|
+
verdict: 'INCONCLUSIVE',
|
|
28
|
+
reason: genResp.skipReason || 'Could not generate a test for this vulnerability type.',
|
|
29
|
+
roundsUsed: round,
|
|
30
|
+
testScript: '',
|
|
31
|
+
testOutput: '',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
lastTestScript = genResp.testScript;
|
|
35
|
+
const runner = genResp.runner || (language === 'typescript' ? 'tsx' : 'node');
|
|
36
|
+
onProgress?.(round, MAX_ROUNDS, `Round ${round}: running test...`);
|
|
37
|
+
const testResult = await (0, localTestRunner_1.runLocalTest)(genResp.testScript, runner, workspaceRoot);
|
|
38
|
+
lastTestOutput = testResult.output;
|
|
39
|
+
onProgress?.(round, MAX_ROUNDS, `Round ${round}: analyzing result...`);
|
|
40
|
+
const analyzeResp = await client.postJson('/verify/analyze', {
|
|
41
|
+
vulnerabilityType: finding.type,
|
|
42
|
+
line: finding.line,
|
|
43
|
+
evidence: finding.evidence,
|
|
44
|
+
why: finding.why,
|
|
45
|
+
testScript: genResp.testScript,
|
|
46
|
+
stdout: testResult.output,
|
|
47
|
+
stderr: '',
|
|
48
|
+
exitCode: testResult.exitCode,
|
|
49
|
+
round,
|
|
50
|
+
maxRounds: MAX_ROUNDS,
|
|
51
|
+
});
|
|
52
|
+
if (analyzeResp.verdict === 'PROVEN') {
|
|
53
|
+
return { verdict: 'PROVEN', reason: analyzeResp.reason, roundsUsed: round, testScript: lastTestScript, testOutput: lastTestOutput };
|
|
54
|
+
}
|
|
55
|
+
if (analyzeResp.verdict === 'UNPROVEN') {
|
|
56
|
+
return { verdict: 'UNPROVEN', reason: analyzeResp.reason, roundsUsed: round, testScript: lastTestScript, testOutput: lastTestOutput };
|
|
57
|
+
}
|
|
58
|
+
if (!analyzeResp.shouldRetry || round >= MAX_ROUNDS) {
|
|
59
|
+
return { verdict: 'INCONCLUSIVE', reason: analyzeResp.reason || `Could not verify after ${round} round(s).`, roundsUsed: round, testScript: lastTestScript, testOutput: lastTestOutput };
|
|
60
|
+
}
|
|
61
|
+
previousErrors.push(`Round ${round}: ${testResult.verdict} — ${testResult.output.slice(0, 500)}`);
|
|
62
|
+
}
|
|
63
|
+
return { verdict: 'INCONCLUSIVE', reason: `Exhausted all ${MAX_ROUNDS} rounds.`, roundsUsed: MAX_ROUNDS, testScript: lastTestScript, testOutput: lastTestOutput };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=verifyLoop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyLoop.js","sourceRoot":"","sources":["../../src/attack/verifyLoop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* securecode.agent-scan MCP tool — agent-mode scan with exploit
|
|
2
|
+
* securecode.agent-scan MCP tool — agent-mode scan with exploit verification.
|
|
3
3
|
*
|
|
4
4
|
* An AI investigator that reads files, traces data flows, checks guards,
|
|
5
5
|
* and compares endpoint policies to find vulnerabilities. Each high/critical
|
|
6
|
-
* finding is then
|
|
7
|
-
* the
|
|
6
|
+
* finding is then verified by the verify subagent — a round-based loop that
|
|
7
|
+
* generates a local integration test, runs it on the user's machine, and
|
|
8
|
+
* analyzes the output for a PROVEN/UNPROVEN/INCONCLUSIVE verdict.
|
|
8
9
|
*
|
|
9
10
|
* Flow:
|
|
10
11
|
* 1. Resolve code + language from filePath
|
|
11
12
|
* 2. Build endpoint context from the project map
|
|
12
13
|
* 3. Run the agent loop (POST /agent/scan/start + /step loop)
|
|
13
|
-
* 4. For each
|
|
14
|
-
* 5.
|
|
15
|
-
* 6.
|
|
16
|
-
* Juror + Phase 3 verify the agent's candidates)
|
|
17
|
-
* 7. Return merged result (agent findings + proven stamps + Juror-verified)
|
|
14
|
+
* 4. For each finding → runVerifyLoop (generate test → run locally → analyze)
|
|
15
|
+
* 5. Generate fixes for proven/suspected findings
|
|
16
|
+
* 6. Return result with proven stamps
|
|
18
17
|
*/
|
|
19
18
|
import type { ServerContext } from '../mcp/types';
|
|
20
19
|
export declare function toolAgentScan(ctx: ServerContext, args: any): Promise<unknown>;
|
package/dist/tools/agentScan.js
CHANGED
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* securecode.agent-scan MCP tool — agent-mode scan with exploit
|
|
3
|
+
* securecode.agent-scan MCP tool — agent-mode scan with exploit verification.
|
|
4
4
|
*
|
|
5
5
|
* An AI investigator that reads files, traces data flows, checks guards,
|
|
6
6
|
* and compares endpoint policies to find vulnerabilities. Each high/critical
|
|
7
|
-
* finding is then
|
|
8
|
-
* the
|
|
7
|
+
* finding is then verified by the verify subagent — a round-based loop that
|
|
8
|
+
* generates a local integration test, runs it on the user's machine, and
|
|
9
|
+
* analyzes the output for a PROVEN/UNPROVEN/INCONCLUSIVE verdict.
|
|
9
10
|
*
|
|
10
11
|
* Flow:
|
|
11
12
|
* 1. Resolve code + language from filePath
|
|
12
13
|
* 2. Build endpoint context from the project map
|
|
13
14
|
* 3. Run the agent loop (POST /agent/scan/start + /step loop)
|
|
14
|
-
* 4. For each
|
|
15
|
-
* 5.
|
|
16
|
-
* 6.
|
|
17
|
-
* Juror + Phase 3 verify the agent's candidates)
|
|
18
|
-
* 7. Return merged result (agent findings + proven stamps + Juror-verified)
|
|
15
|
+
* 4. For each finding → runVerifyLoop (generate test → run locally → analyze)
|
|
16
|
+
* 5. Generate fixes for proven/suspected findings
|
|
17
|
+
* 6. Return result with proven stamps
|
|
19
18
|
*/
|
|
20
19
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
20
|
if (k2 === undefined) k2 = k;
|
|
@@ -59,15 +58,7 @@ const mapContext_1 = require("../project-map/mapContext");
|
|
|
59
58
|
const scanCache_1 = require("../project-map/scanCache");
|
|
60
59
|
const agentMemory_1 = require("../project-map/agentMemory");
|
|
61
60
|
const agentScanLoop_1 = require("../attack/agentScanLoop");
|
|
62
|
-
|
|
63
|
-
return findings.map(f => ({
|
|
64
|
-
line: f.line,
|
|
65
|
-
lineEnd: f.lineEnd,
|
|
66
|
-
type: f.type,
|
|
67
|
-
snippet: f.evidence,
|
|
68
|
-
definitionContext: f.why,
|
|
69
|
-
}));
|
|
70
|
-
}
|
|
61
|
+
const verifyLoop_1 = require("../attack/verifyLoop");
|
|
71
62
|
/** Prove high/critical/medium findings — skip only low. */
|
|
72
63
|
function shouldProve(finding) {
|
|
73
64
|
return finding.severity === 'critical' || finding.severity === 'high' || finding.severity === 'medium';
|
|
@@ -194,25 +185,56 @@ async function toolAgentScan(ctx, args) {
|
|
|
194
185
|
if (agentResult.status === 'spawn_failed') {
|
|
195
186
|
throw new Error(agentResult.error || 'Agent scan failed to start.');
|
|
196
187
|
}
|
|
197
|
-
// 4.
|
|
188
|
+
// 4. Verify each finding via the verify subagent (replaces sandbox prove + juror)
|
|
198
189
|
const client = new client_1.ApiClient({ baseUrl: ctx.apiUrl, token: ctx.apiToken });
|
|
199
190
|
const provenFindings = [];
|
|
200
191
|
const proveable = agentResult.findings.filter(shouldProve);
|
|
201
192
|
if (proveable.length > 0 && progress) {
|
|
202
|
-
progress(0, proveable.length, `
|
|
193
|
+
progress(0, proveable.length, `Verifying ${proveable.length} finding(s)...`);
|
|
203
194
|
}
|
|
204
195
|
let proveIdx = 0;
|
|
205
196
|
for (const finding of agentResult.findings) {
|
|
206
197
|
if (!shouldProve(finding)) {
|
|
207
|
-
provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low severity — not
|
|
198
|
+
provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low severity — not verified' });
|
|
208
199
|
continue;
|
|
209
200
|
}
|
|
210
201
|
if (progress) {
|
|
211
202
|
proveIdx++;
|
|
212
|
-
progress(proveIdx, proveable.length, `
|
|
203
|
+
progress(proveIdx, proveable.length, `Verifying ${finding.type} at line ${finding.line}...`);
|
|
213
204
|
}
|
|
214
|
-
|
|
215
|
-
|
|
205
|
+
try {
|
|
206
|
+
const result = await (0, verifyLoop_1.runVerifyLoop)({
|
|
207
|
+
finding: {
|
|
208
|
+
type: finding.type,
|
|
209
|
+
line: finding.line,
|
|
210
|
+
lineEnd: finding.lineEnd,
|
|
211
|
+
evidence: finding.evidence,
|
|
212
|
+
why: finding.why,
|
|
213
|
+
severity: finding.severity,
|
|
214
|
+
},
|
|
215
|
+
filePath: filePath || '',
|
|
216
|
+
code,
|
|
217
|
+
relatedFiles: relatedFiles.map(rf => ({
|
|
218
|
+
filePath: rf.filePath,
|
|
219
|
+
content: rf.content,
|
|
220
|
+
relationship: rf.relationship,
|
|
221
|
+
})),
|
|
222
|
+
workspaceRoot: ctx.workspaceRoot,
|
|
223
|
+
language,
|
|
224
|
+
client,
|
|
225
|
+
onProgress: (round, maxR, msg) => {
|
|
226
|
+
if (progress)
|
|
227
|
+
progress(proveIdx, proveable.length, `Verify round ${round}/${maxR}: ${msg}`);
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
provenFindings.push({
|
|
231
|
+
...finding,
|
|
232
|
+
proven: result.verdict,
|
|
233
|
+
provenReason: result.reason,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
console.warn(`[Agent Scan] Verify loop failed: ${err.message}. Falling back to sandbox prove.`);
|
|
216
238
|
try {
|
|
217
239
|
const proveResp = await client.postJson('/sandbox/prove', {
|
|
218
240
|
code,
|
|
@@ -228,21 +250,13 @@ async function toolAgentScan(ctx, args) {
|
|
|
228
250
|
proven: proveResp.proven,
|
|
229
251
|
provenReason: proveResp.rationale || proveResp.skipReason || proveResp.sandbox?.reason,
|
|
230
252
|
});
|
|
231
|
-
proved = true;
|
|
232
|
-
break;
|
|
233
253
|
}
|
|
234
|
-
catch (
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
provenFindings.push({
|
|
241
|
-
...finding,
|
|
242
|
-
proven: 'INCONCLUSIVE',
|
|
243
|
-
provenReason: `Sandbox prove failed after 2 attempts: ${err.message || err}`,
|
|
244
|
-
});
|
|
245
|
-
}
|
|
254
|
+
catch (err2) {
|
|
255
|
+
provenFindings.push({
|
|
256
|
+
...finding,
|
|
257
|
+
proven: 'INCONCLUSIVE',
|
|
258
|
+
provenReason: `Verify failed: ${err.message}; Sandbox fallback also failed: ${err2.message}`,
|
|
259
|
+
});
|
|
246
260
|
}
|
|
247
261
|
}
|
|
248
262
|
}
|
|
@@ -283,57 +297,7 @@ async function toolAgentScan(ctx, args) {
|
|
|
283
297
|
console.warn(`[Agent Scan] Fix generation failed for ${finding.type} at L${finding.line}: ${err.message}`);
|
|
284
298
|
}
|
|
285
299
|
}
|
|
286
|
-
// 5.
|
|
287
|
-
const candidateContexts = mapFindingsToCandidates(provenFindings);
|
|
288
|
-
// 6. If no findings, return early
|
|
289
|
-
if (candidateContexts.length === 0) {
|
|
290
|
-
if (useCache) {
|
|
291
|
-
try {
|
|
292
|
-
(0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
|
|
293
|
-
findings: provenFindings,
|
|
294
|
-
status: agentResult.status,
|
|
295
|
-
summary: agentResult.summary,
|
|
296
|
-
stepsUsed: agentResult.stepsUsed,
|
|
297
|
-
costSpentUsd: agentResult.costSpentUsd,
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
catch (err) {
|
|
301
|
-
console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
return {
|
|
305
|
-
status: agentResult.status,
|
|
306
|
-
summary: agentResult.summary || 'Agent completed with no findings.',
|
|
307
|
-
findings: [],
|
|
308
|
-
agentFindings: provenFindings,
|
|
309
|
-
stepsUsed: agentResult.stepsUsed,
|
|
310
|
-
costSpentUsd: agentResult.costSpentUsd,
|
|
311
|
-
transcript: agentResult.transcript,
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
// 7. POST /scan with scanDepth: 'agent' + candidateContexts
|
|
315
|
-
// This skips Scout and sends the agent's candidates directly to Juror
|
|
316
|
-
// + Phase 3 for verification.
|
|
317
|
-
// If this call fails, return the agent findings without Juror
|
|
318
|
-
// verification (degraded mode) instead of throwing everything away.
|
|
319
|
-
let scanResp = null;
|
|
320
|
-
try {
|
|
321
|
-
scanResp = await client.postJson('/scan', {
|
|
322
|
-
code,
|
|
323
|
-
language,
|
|
324
|
-
...(filePath ? { filePath } : {}),
|
|
325
|
-
scanDepth: 'agent',
|
|
326
|
-
candidateContexts,
|
|
327
|
-
...(endpointContext.length > 0 ? { endpointContext } : {}),
|
|
328
|
-
...(relatedFiles.length > 0 ? { workspaceHints: { relatedFiles } } : {}),
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
catch (err) {
|
|
332
|
-
// Juror verification failed — return agent findings as-is (degraded).
|
|
333
|
-
// This is better than throwing, which would lose all the agent's work.
|
|
334
|
-
console.warn(`[Agent Scan] Juror verification failed (${err?.message || err}). Returning agent findings without verification.`);
|
|
335
|
-
}
|
|
336
|
-
// 8. Write to cache before returning
|
|
300
|
+
// 5. Write to cache before returning
|
|
337
301
|
if (useCache) {
|
|
338
302
|
try {
|
|
339
303
|
(0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
|
|
@@ -348,37 +312,13 @@ async function toolAgentScan(ctx, args) {
|
|
|
348
312
|
console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
|
|
349
313
|
}
|
|
350
314
|
}
|
|
351
|
-
//
|
|
352
|
-
// If Juror failed, scanResp is null — return agent findings as verified=false
|
|
353
|
-
if (!scanResp) {
|
|
354
|
-
return {
|
|
355
|
-
status: agentResult.status,
|
|
356
|
-
summary: (agentResult.summary || 'Agent completed') + ' (Juror verification skipped — degraded)',
|
|
357
|
-
agentFindings: provenFindings,
|
|
358
|
-
verifiedFindings: [],
|
|
359
|
-
allFindings: [],
|
|
360
|
-
degraded: true,
|
|
361
|
-
stepsUsed: agentResult.stepsUsed,
|
|
362
|
-
costSpentUsd: agentResult.costSpentUsd,
|
|
363
|
-
transcript: agentResult.transcript,
|
|
364
|
-
provenCount: provenFindings.filter(f => f.proven === 'PROVEN').length,
|
|
365
|
-
unprovenCount: provenFindings.filter(f => f.proven === 'UNPROVEN').length,
|
|
366
|
-
inconclusiveCount: provenFindings.filter(f => f.proven === 'INCONCLUSIVE').length,
|
|
367
|
-
notReproducibleCount: provenFindings.filter(f => f.proven === 'NOT_REPRODUCIBLE').length,
|
|
368
|
-
skippedCount: provenFindings.filter(f => f.proven === 'SKIPPED').length,
|
|
369
|
-
};
|
|
370
|
-
}
|
|
315
|
+
// 6. Return result — the verify subagent IS the verifier (no separate Juror call)
|
|
371
316
|
return {
|
|
372
317
|
status: agentResult.status,
|
|
373
318
|
summary: agentResult.summary,
|
|
374
319
|
agentFindings: provenFindings,
|
|
375
|
-
verifiedFindings:
|
|
376
|
-
allFindings:
|
|
377
|
-
scanId: scanResp.scanId,
|
|
378
|
-
scanType: scanResp.scanType,
|
|
379
|
-
degraded: scanResp.degraded,
|
|
380
|
-
scanCredits: scanResp.scanCredits,
|
|
381
|
-
plan: scanResp.plan,
|
|
320
|
+
verifiedFindings: provenFindings.filter(f => f.proven === 'PROVEN'),
|
|
321
|
+
allFindings: [],
|
|
382
322
|
stepsUsed: agentResult.stepsUsed,
|
|
383
323
|
costSpentUsd: agentResult.costSpentUsd,
|
|
384
324
|
transcript: agentResult.transcript,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentScan.js","sourceRoot":"","sources":["../../src/tools/agentScan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agentScan.js","sourceRoot":"","sources":["../../src/tools/agentScan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runLocalTest = runLocalTest;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
40
|
+
const testSafety_1 = require("./testSafety");
|
|
41
|
+
const PASS_PATTERN = /^PASS:\s*(.+)$/m;
|
|
42
|
+
const FAIL_PATTERN = /^FAIL:\s*(.+)$/m;
|
|
43
|
+
const TIMEOUT_MS = 30_000;
|
|
44
|
+
async function runLocalTest(script, runner, workspaceRoot) {
|
|
45
|
+
const safety = (0, testSafety_1.checkTestSafety)(script, workspaceRoot);
|
|
46
|
+
if (!safety.allowed) {
|
|
47
|
+
return { verdict: 'error', output: `Test script blocked: ${safety.reason}`, exitCode: -1 };
|
|
48
|
+
}
|
|
49
|
+
const testDir = path.join(workspaceRoot, '.securecode');
|
|
50
|
+
if (!fs.existsSync(testDir))
|
|
51
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
52
|
+
const ext = runner === 'tsx' || runner === 'ts' ? '.test.ts' : '.test.js';
|
|
53
|
+
const testFile = path.join(testDir, `verify-test-${Date.now()}-${Math.random().toString(36).slice(2, 8)}${ext}`);
|
|
54
|
+
try {
|
|
55
|
+
fs.writeFileSync(testFile, script, 'utf8');
|
|
56
|
+
let stdout = '';
|
|
57
|
+
let stderr = '';
|
|
58
|
+
let exitCode = 0;
|
|
59
|
+
let timedOut = false;
|
|
60
|
+
try {
|
|
61
|
+
const runnerBin = runner === 'tsx' ? 'npx' : runner;
|
|
62
|
+
const runnerArgs = runner === 'tsx' ? ['tsx', testFile] : [testFile];
|
|
63
|
+
stdout = (0, child_process_1.execFileSync)(runnerBin, runnerArgs, {
|
|
64
|
+
cwd: workspaceRoot,
|
|
65
|
+
timeout: TIMEOUT_MS,
|
|
66
|
+
encoding: 'utf8',
|
|
67
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
68
|
+
env: { ...process.env, NODE_ENV: 'test' },
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
stdout = err.stdout || '';
|
|
73
|
+
stderr = err.stderr || '';
|
|
74
|
+
exitCode = err.status ?? 1;
|
|
75
|
+
if (err.signal === 'SIGTERM')
|
|
76
|
+
timedOut = true;
|
|
77
|
+
}
|
|
78
|
+
const output = (stdout + '\n' + stderr).trim();
|
|
79
|
+
if (timedOut) {
|
|
80
|
+
return { verdict: 'timeout', output: 'Test timed out after 30s', exitCode: -1 };
|
|
81
|
+
}
|
|
82
|
+
if (PASS_PATTERN.test(output)) {
|
|
83
|
+
return { verdict: 'pass', output, exitCode };
|
|
84
|
+
}
|
|
85
|
+
if (FAIL_PATTERN.test(output)) {
|
|
86
|
+
return { verdict: 'fail', output, exitCode };
|
|
87
|
+
}
|
|
88
|
+
if (exitCode === 0) {
|
|
89
|
+
return { verdict: 'error', output: output + '\nTest exited 0 but did not print PASS: or FAIL:', exitCode };
|
|
90
|
+
}
|
|
91
|
+
return { verdict: 'error', output, exitCode };
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
return { verdict: 'error', output: err.message || String(err), exitCode: -1 };
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
try {
|
|
98
|
+
fs.unlinkSync(testFile);
|
|
99
|
+
}
|
|
100
|
+
catch { }
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=localTestRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localTestRunner.js","sourceRoot":"","sources":["../../src/utils/localTestRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkTestSafety = checkTestSafety;
|
|
4
|
+
const BLOCKED_MODULES = new Set(['child_process', 'net', 'cluster', 'worker_threads']);
|
|
5
|
+
const BLOCKED_PATTERNS = [
|
|
6
|
+
{ pattern: /process\.exit\s*\(/g, reason: () => 'process.exit() masks test results — use console.error + throw instead' },
|
|
7
|
+
{ pattern: /require\s*\(\s*[a-zA-Z_$][a-zA-Z0-9_$]*\s*\)/g, reason: () => 'dynamic require with variable is not statically checkable' },
|
|
8
|
+
];
|
|
9
|
+
const ALLOWED_IMPORT_PREFIXES = ['node:', 'effect', 'bun', 'bun:', '@synara/', './', '../'];
|
|
10
|
+
const BLOCKED_MODULE_REASONS = {
|
|
11
|
+
child_process: 'child_process is blocked — use only for testing command injection with mock spawns',
|
|
12
|
+
net: 'net is blocked — use HTTP libraries instead',
|
|
13
|
+
cluster: 'cluster is blocked',
|
|
14
|
+
worker_threads: 'worker_threads is blocked',
|
|
15
|
+
};
|
|
16
|
+
function checkTestSafety(script, _workspaceRoot) {
|
|
17
|
+
for (const { pattern, reason } of BLOCKED_PATTERNS) {
|
|
18
|
+
pattern.lastIndex = 0;
|
|
19
|
+
if (pattern.test(script)) {
|
|
20
|
+
return { allowed: false, reason: reason('') };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const importRegex = /(?:import\s+[^;]+?from\s*|require\s*\(\s*)["']([^"']+)["']/g;
|
|
24
|
+
let match;
|
|
25
|
+
while ((match = importRegex.exec(script)) !== null) {
|
|
26
|
+
const mod = match[1];
|
|
27
|
+
if (BLOCKED_MODULES.has(mod)) {
|
|
28
|
+
return { allowed: false, reason: BLOCKED_MODULE_REASONS[mod] || mod };
|
|
29
|
+
}
|
|
30
|
+
if (mod.startsWith('node:') || mod.startsWith('./') || mod.startsWith('../'))
|
|
31
|
+
continue;
|
|
32
|
+
if (mod.startsWith('effect') || mod.startsWith('bun') || mod.startsWith('@synara/'))
|
|
33
|
+
continue;
|
|
34
|
+
if (ALLOWED_IMPORT_PREFIXES.some(p => mod.startsWith(p)))
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
return { allowed: true, reason: '' };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=testSafety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testSafety.js","sourceRoot":"","sources":["../../src/utils/testSafety.ts"],"names":[],"mappings":";;AAgBA,0CAqBC;AArCD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEvF,MAAM,gBAAgB,GAAgE;IAClF,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,uEAAuE,EAAE;IACzH,EAAE,OAAO,EAAE,+CAA+C,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,2DAA2D,EAAE;CAC1I,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAE5F,MAAM,sBAAsB,GAA2B;IACnD,aAAa,EAAE,oFAAoF;IACnG,GAAG,EAAE,6CAA6C;IAClD,OAAO,EAAE,oBAAoB;IAC7B,cAAc,EAAE,2BAA2B;CAC9C,CAAC;AAEF,SAAgB,eAAe,CAAC,MAAc,EAAE,cAAsB;IAClE,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QACjD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAClD,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,6DAA6D,CAAC;IAClF,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC1E,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS;QACvF,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAC9F,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;IACvE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACzC,CAAC"}
|
package/package.json
CHANGED