@securecode-ai/mcp 0.4.10 → 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 +61 -236
- 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,89 +58,11 @@ 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';
|
|
74
65
|
}
|
|
75
|
-
/** Run a test script locally on the user's machine where the project is installed.
|
|
76
|
-
* Writes the script to a temp file, runs it with the specified runner, reads the output.
|
|
77
|
-
* Returns the verdict (pass/fail/error/timeout) and the output. */
|
|
78
|
-
async function runLocalTest(testScript, runner, workspaceRoot) {
|
|
79
|
-
const fs = require('fs');
|
|
80
|
-
const path = require('path');
|
|
81
|
-
const { execFileSync } = require('child_process');
|
|
82
|
-
const testDir = path.join(workspaceRoot, '.securecode');
|
|
83
|
-
if (!fs.existsSync(testDir))
|
|
84
|
-
fs.mkdirSync(testDir, { recursive: true });
|
|
85
|
-
const ext = runner === 'tsx' || runner === 'ts' ? '.test.ts' : '.test.js';
|
|
86
|
-
const testFile = path.join(testDir, `prove-test-${Date.now()}${ext}`);
|
|
87
|
-
const outputFile = path.join(testDir, `prove-test-${Date.now()}.out`);
|
|
88
|
-
try {
|
|
89
|
-
fs.writeFileSync(testFile, testScript, 'utf8');
|
|
90
|
-
let stdout = '';
|
|
91
|
-
let stderr = '';
|
|
92
|
-
let exitCode;
|
|
93
|
-
let timedOut = false;
|
|
94
|
-
try {
|
|
95
|
-
const runnerBin = runner === 'tsx' ? 'npx' : runner;
|
|
96
|
-
const runnerArgs = runner === 'tsx' ? ['tsx', testFile] : [testFile];
|
|
97
|
-
stdout = execFileSync(runnerBin, runnerArgs, {
|
|
98
|
-
cwd: workspaceRoot,
|
|
99
|
-
timeout: 30000,
|
|
100
|
-
encoding: 'utf8',
|
|
101
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
102
|
-
env: { ...process.env, NODE_OPTIONS: '--loader tsx' },
|
|
103
|
-
});
|
|
104
|
-
exitCode = 0;
|
|
105
|
-
}
|
|
106
|
-
catch (err) {
|
|
107
|
-
stdout = err.stdout || '';
|
|
108
|
-
stderr = err.stderr || '';
|
|
109
|
-
exitCode = err.status ?? 1;
|
|
110
|
-
if (err.signal === 'SIGTERM')
|
|
111
|
-
timedOut = true;
|
|
112
|
-
}
|
|
113
|
-
const output = stdout + stderr;
|
|
114
|
-
const hasPass = /PASS:/i.test(output);
|
|
115
|
-
const hasFail = /FAIL:/i.test(output);
|
|
116
|
-
if (timedOut) {
|
|
117
|
-
return { verdict: 'timeout', output: 'Test timed out after 30s' };
|
|
118
|
-
}
|
|
119
|
-
if (hasPass) {
|
|
120
|
-
return { verdict: 'pass', output: output.slice(0, 2000) };
|
|
121
|
-
}
|
|
122
|
-
if (hasFail) {
|
|
123
|
-
return { verdict: 'fail', output: output.slice(0, 2000) };
|
|
124
|
-
}
|
|
125
|
-
// No PASS/FAIL marker — check exit code
|
|
126
|
-
if (exitCode === 0) {
|
|
127
|
-
return { verdict: 'pass', output: output.slice(0, 2000) };
|
|
128
|
-
}
|
|
129
|
-
return { verdict: 'error', output: output.slice(0, 2000) };
|
|
130
|
-
}
|
|
131
|
-
catch (err) {
|
|
132
|
-
return { verdict: 'error', output: err.message || String(err) };
|
|
133
|
-
}
|
|
134
|
-
finally {
|
|
135
|
-
try {
|
|
136
|
-
fs.unlinkSync(testFile);
|
|
137
|
-
}
|
|
138
|
-
catch { }
|
|
139
|
-
try {
|
|
140
|
-
fs.unlinkSync(outputFile);
|
|
141
|
-
}
|
|
142
|
-
catch { }
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
66
|
async function toolAgentScan(ctx, args) {
|
|
146
67
|
const progress = args._progress;
|
|
147
68
|
// 1. Resolve code + language
|
|
@@ -264,100 +185,78 @@ async function toolAgentScan(ctx, args) {
|
|
|
264
185
|
if (agentResult.status === 'spawn_failed') {
|
|
265
186
|
throw new Error(agentResult.error || 'Agent scan failed to start.');
|
|
266
187
|
}
|
|
267
|
-
// 4.
|
|
188
|
+
// 4. Verify each finding via the verify subagent (replaces sandbox prove + juror)
|
|
268
189
|
const client = new client_1.ApiClient({ baseUrl: ctx.apiUrl, token: ctx.apiToken });
|
|
269
190
|
const provenFindings = [];
|
|
270
191
|
const proveable = agentResult.findings.filter(shouldProve);
|
|
271
192
|
if (proveable.length > 0 && progress) {
|
|
272
|
-
progress(0, proveable.length, `
|
|
193
|
+
progress(0, proveable.length, `Verifying ${proveable.length} finding(s)...`);
|
|
273
194
|
}
|
|
274
195
|
let proveIdx = 0;
|
|
275
196
|
for (const finding of agentResult.findings) {
|
|
276
197
|
if (!shouldProve(finding)) {
|
|
277
|
-
provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low severity — not
|
|
198
|
+
provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low severity — not verified' });
|
|
278
199
|
continue;
|
|
279
200
|
}
|
|
280
201
|
if (progress) {
|
|
281
202
|
proveIdx++;
|
|
282
|
-
progress(proveIdx, proveable.length, `
|
|
203
|
+
progress(proveIdx, proveable.length, `Verifying ${finding.type} at line ${finding.line}...`);
|
|
283
204
|
}
|
|
284
|
-
// Try local integration test first (100% proof — runs against real code)
|
|
285
|
-
let proved = false;
|
|
286
205
|
try {
|
|
287
|
-
const
|
|
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 || '',
|
|
288
216
|
code,
|
|
289
|
-
language,
|
|
290
|
-
vulnerabilityType: finding.type,
|
|
291
|
-
line: finding.line,
|
|
292
|
-
lineEnd: finding.lineEnd,
|
|
293
|
-
evidence: finding.evidence,
|
|
294
|
-
why: finding.why,
|
|
295
|
-
filePath,
|
|
296
217
|
relatedFiles: relatedFiles.map(rf => ({
|
|
297
218
|
filePath: rf.filePath,
|
|
298
219
|
content: rf.content,
|
|
299
220
|
relationship: rf.relationship,
|
|
300
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,
|
|
301
234
|
});
|
|
302
|
-
if (localTestResp.canTest && localTestResp.testScript) {
|
|
303
|
-
// Run the test locally
|
|
304
|
-
const testResult = await runLocalTest(localTestResp.testScript, localTestResp.runner || (language === 'typescript' ? 'tsx' : 'node'), ctx.workspaceRoot);
|
|
305
|
-
if (testResult.verdict === 'pass') {
|
|
306
|
-
provenFindings.push({
|
|
307
|
-
...finding,
|
|
308
|
-
proven: 'PROVEN',
|
|
309
|
-
provenReason: `Local integration test PASSED: ${testResult.output.slice(0, 200)}`,
|
|
310
|
-
});
|
|
311
|
-
proved = true;
|
|
312
|
-
}
|
|
313
|
-
else if (testResult.verdict === 'fail') {
|
|
314
|
-
provenFindings.push({
|
|
315
|
-
...finding,
|
|
316
|
-
proven: 'UNPROVEN',
|
|
317
|
-
provenReason: `Local integration test FAILED (exploit was blocked): ${testResult.output.slice(0, 200)}`,
|
|
318
|
-
});
|
|
319
|
-
proved = true;
|
|
320
|
-
}
|
|
321
|
-
// If error/timeout, fall through to sandbox prove
|
|
322
|
-
}
|
|
323
235
|
}
|
|
324
236
|
catch (err) {
|
|
325
|
-
console.warn(`[Agent Scan]
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
}
|
|
348
|
-
catch (err) {
|
|
349
|
-
if (attempt === 1) {
|
|
350
|
-
console.warn(`[Agent Scan] Prove attempt 1 failed: ${err.message}. Retrying...`);
|
|
351
|
-
await new Promise(r => setTimeout(r, 2000));
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
provenFindings.push({
|
|
355
|
-
...finding,
|
|
356
|
-
proven: 'INCONCLUSIVE',
|
|
357
|
-
provenReason: `Sandbox prove failed after 2 attempts: ${err.message || err}`,
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
}
|
|
237
|
+
console.warn(`[Agent Scan] Verify loop failed: ${err.message}. Falling back to sandbox prove.`);
|
|
238
|
+
try {
|
|
239
|
+
const proveResp = await client.postJson('/sandbox/prove', {
|
|
240
|
+
code,
|
|
241
|
+
language,
|
|
242
|
+
vulnerabilityType: finding.type,
|
|
243
|
+
line: finding.line,
|
|
244
|
+
lineEnd: finding.lineEnd,
|
|
245
|
+
evidence: finding.evidence,
|
|
246
|
+
why: finding.why,
|
|
247
|
+
});
|
|
248
|
+
provenFindings.push({
|
|
249
|
+
...finding,
|
|
250
|
+
proven: proveResp.proven,
|
|
251
|
+
provenReason: proveResp.rationale || proveResp.skipReason || proveResp.sandbox?.reason,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
catch (err2) {
|
|
255
|
+
provenFindings.push({
|
|
256
|
+
...finding,
|
|
257
|
+
proven: 'INCONCLUSIVE',
|
|
258
|
+
provenReason: `Verify failed: ${err.message}; Sandbox fallback also failed: ${err2.message}`,
|
|
259
|
+
});
|
|
361
260
|
}
|
|
362
261
|
}
|
|
363
262
|
}
|
|
@@ -398,57 +297,7 @@ async function toolAgentScan(ctx, args) {
|
|
|
398
297
|
console.warn(`[Agent Scan] Fix generation failed for ${finding.type} at L${finding.line}: ${err.message}`);
|
|
399
298
|
}
|
|
400
299
|
}
|
|
401
|
-
// 5.
|
|
402
|
-
const candidateContexts = mapFindingsToCandidates(provenFindings);
|
|
403
|
-
// 6. If no findings, return early
|
|
404
|
-
if (candidateContexts.length === 0) {
|
|
405
|
-
if (useCache) {
|
|
406
|
-
try {
|
|
407
|
-
(0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
|
|
408
|
-
findings: provenFindings,
|
|
409
|
-
status: agentResult.status,
|
|
410
|
-
summary: agentResult.summary,
|
|
411
|
-
stepsUsed: agentResult.stepsUsed,
|
|
412
|
-
costSpentUsd: agentResult.costSpentUsd,
|
|
413
|
-
});
|
|
414
|
-
}
|
|
415
|
-
catch (err) {
|
|
416
|
-
console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
return {
|
|
420
|
-
status: agentResult.status,
|
|
421
|
-
summary: agentResult.summary || 'Agent completed with no findings.',
|
|
422
|
-
findings: [],
|
|
423
|
-
agentFindings: provenFindings,
|
|
424
|
-
stepsUsed: agentResult.stepsUsed,
|
|
425
|
-
costSpentUsd: agentResult.costSpentUsd,
|
|
426
|
-
transcript: agentResult.transcript,
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
// 7. POST /scan with scanDepth: 'agent' + candidateContexts
|
|
430
|
-
// This skips Scout and sends the agent's candidates directly to Juror
|
|
431
|
-
// + Phase 3 for verification.
|
|
432
|
-
// If this call fails, return the agent findings without Juror
|
|
433
|
-
// verification (degraded mode) instead of throwing everything away.
|
|
434
|
-
let scanResp = null;
|
|
435
|
-
try {
|
|
436
|
-
scanResp = await client.postJson('/scan', {
|
|
437
|
-
code,
|
|
438
|
-
language,
|
|
439
|
-
...(filePath ? { filePath } : {}),
|
|
440
|
-
scanDepth: 'agent',
|
|
441
|
-
candidateContexts,
|
|
442
|
-
...(endpointContext.length > 0 ? { endpointContext } : {}),
|
|
443
|
-
...(relatedFiles.length > 0 ? { workspaceHints: { relatedFiles } } : {}),
|
|
444
|
-
});
|
|
445
|
-
}
|
|
446
|
-
catch (err) {
|
|
447
|
-
// Juror verification failed — return agent findings as-is (degraded).
|
|
448
|
-
// This is better than throwing, which would lose all the agent's work.
|
|
449
|
-
console.warn(`[Agent Scan] Juror verification failed (${err?.message || err}). Returning agent findings without verification.`);
|
|
450
|
-
}
|
|
451
|
-
// 8. Write to cache before returning
|
|
300
|
+
// 5. Write to cache before returning
|
|
452
301
|
if (useCache) {
|
|
453
302
|
try {
|
|
454
303
|
(0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
|
|
@@ -463,37 +312,13 @@ async function toolAgentScan(ctx, args) {
|
|
|
463
312
|
console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
|
|
464
313
|
}
|
|
465
314
|
}
|
|
466
|
-
//
|
|
467
|
-
// If Juror failed, scanResp is null — return agent findings as verified=false
|
|
468
|
-
if (!scanResp) {
|
|
469
|
-
return {
|
|
470
|
-
status: agentResult.status,
|
|
471
|
-
summary: (agentResult.summary || 'Agent completed') + ' (Juror verification skipped — degraded)',
|
|
472
|
-
agentFindings: provenFindings,
|
|
473
|
-
verifiedFindings: [],
|
|
474
|
-
allFindings: [],
|
|
475
|
-
degraded: true,
|
|
476
|
-
stepsUsed: agentResult.stepsUsed,
|
|
477
|
-
costSpentUsd: agentResult.costSpentUsd,
|
|
478
|
-
transcript: agentResult.transcript,
|
|
479
|
-
provenCount: provenFindings.filter(f => f.proven === 'PROVEN').length,
|
|
480
|
-
unprovenCount: provenFindings.filter(f => f.proven === 'UNPROVEN').length,
|
|
481
|
-
inconclusiveCount: provenFindings.filter(f => f.proven === 'INCONCLUSIVE').length,
|
|
482
|
-
notReproducibleCount: provenFindings.filter(f => f.proven === 'NOT_REPRODUCIBLE').length,
|
|
483
|
-
skippedCount: provenFindings.filter(f => f.proven === 'SKIPPED').length,
|
|
484
|
-
};
|
|
485
|
-
}
|
|
315
|
+
// 6. Return result — the verify subagent IS the verifier (no separate Juror call)
|
|
486
316
|
return {
|
|
487
317
|
status: agentResult.status,
|
|
488
318
|
summary: agentResult.summary,
|
|
489
319
|
agentFindings: provenFindings,
|
|
490
|
-
verifiedFindings:
|
|
491
|
-
allFindings:
|
|
492
|
-
scanId: scanResp.scanId,
|
|
493
|
-
scanType: scanResp.scanType,
|
|
494
|
-
degraded: scanResp.degraded,
|
|
495
|
-
scanCredits: scanResp.scanCredits,
|
|
496
|
-
plan: scanResp.plan,
|
|
320
|
+
verifiedFindings: provenFindings.filter(f => f.proven === 'PROVEN'),
|
|
321
|
+
allFindings: [],
|
|
497
322
|
stepsUsed: agentResult.stepsUsed,
|
|
498
323
|
costSpentUsd: agentResult.costSpentUsd,
|
|
499
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