@securecode-ai/mcp 0.3.9 → 0.4.1
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/README.md +107 -13
- package/dist/api/client.d.ts +1 -1
- package/dist/api/client.js +2 -1
- package/dist/api/client.js.map +1 -1
- package/dist/api/types.d.ts +18 -0
- package/dist/attack/agentScanExecutor.js +159 -5
- package/dist/attack/agentScanExecutor.js.map +1 -1
- package/dist/attack/agentScanLoop.js +157 -3
- package/dist/attack/agentScanLoop.js.map +1 -1
- package/dist/attack/agentScanProtocol.d.ts +47 -5
- package/dist/attack/agentScanProtocol.js +3 -3
- package/dist/index.js +218 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +5 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.js +80 -3
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-map/agentMemory.d.ts +75 -0
- package/dist/project-map/agentMemory.js +230 -0
- package/dist/project-map/agentMemory.js.map +1 -0
- package/dist/project-map/crossFileTaintTracker.d.ts +51 -0
- package/dist/project-map/crossFileTaintTracker.js +429 -0
- package/dist/project-map/crossFileTaintTracker.js.map +1 -0
- package/dist/project-map/endpointDiscovery.d.ts +24 -0
- package/dist/project-map/endpointDiscovery.js +101 -0
- package/dist/project-map/endpointDiscovery.js.map +1 -0
- package/dist/project-map/guardEvaluator.js +37 -0
- package/dist/project-map/guardEvaluator.js.map +1 -1
- package/dist/project-map/guardPatterns.js +16 -5
- package/dist/project-map/guardPatterns.js.map +1 -1
- package/dist/project-map/sanitizers.js +10 -0
- package/dist/project-map/sanitizers.js.map +1 -1
- package/dist/project-map/scanCache.d.ts +67 -0
- package/dist/project-map/scanCache.js +169 -0
- package/dist/project-map/scanCache.js.map +1 -0
- package/dist/project-map/sinkRegistry.js +165 -0
- package/dist/project-map/sinkRegistry.js.map +1 -1
- package/dist/project-map/taintSources.d.ts +19 -1
- package/dist/project-map/taintSources.js +69 -2
- package/dist/project-map/taintSources.js.map +1 -1
- package/dist/project-map/taintTracker.d.ts +4 -1
- package/dist/project-map/taintTracker.js +188 -5
- package/dist/project-map/taintTracker.js.map +1 -1
- package/dist/tools/agentMemoryTools.d.ts +18 -0
- package/dist/tools/agentMemoryTools.js +107 -0
- package/dist/tools/agentMemoryTools.js.map +1 -0
- package/dist/tools/agentScan.d.ts +8 -7
- package/dist/tools/agentScan.js +245 -23
- package/dist/tools/agentScan.js.map +1 -1
- package/dist/utils/files.js +19 -2
- package/dist/utils/files.js.map +1 -1
- package/dist/utils/listFiles.d.ts +17 -0
- package/dist/utils/listFiles.js +126 -0
- package/dist/utils/listFiles.js.map +1 -0
- package/dist/utils/listImports.d.ts +15 -0
- package/dist/utils/listImports.js +164 -0
- package/dist/utils/listImports.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP tools for agent memory management — record false positives,
|
|
4
|
+
* view memory, and clear memory.
|
|
5
|
+
*
|
|
6
|
+
* These let the user (or the VS Code extension) dismiss findings as false
|
|
7
|
+
* positives so the agent learns not to repeat them in future scans.
|
|
8
|
+
*
|
|
9
|
+
* Storage: <workspaceRoot>/.securecode/agent-memory.json (per-workspace)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.toolRecordFalsePositive = toolRecordFalsePositive;
|
|
13
|
+
exports.toolGetAgentMemory = toolGetAgentMemory;
|
|
14
|
+
exports.toolClearAgentMemory = toolClearAgentMemory;
|
|
15
|
+
exports.toolAddKnownFact = toolAddKnownFact;
|
|
16
|
+
const agentMemory_1 = require("../project-map/agentMemory");
|
|
17
|
+
/** record_false_positive — dismiss a finding so the agent won't report it again. */
|
|
18
|
+
async function toolRecordFalsePositive(ctx, args) {
|
|
19
|
+
const required = ['filePath', 'findingType', 'line', 'evidence', 'reason'];
|
|
20
|
+
for (const field of required) {
|
|
21
|
+
if (!args[field]) {
|
|
22
|
+
throw new Error(`Missing required parameter '${field}' for record_false_positive.`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const entry = (0, agentMemory_1.recordFalsePositive)(ctx.workspaceRoot, {
|
|
26
|
+
filePath: args.filePath,
|
|
27
|
+
findingType: args.findingType,
|
|
28
|
+
line: args.line,
|
|
29
|
+
evidence: args.evidence,
|
|
30
|
+
reason: args.reason,
|
|
31
|
+
pattern: args.pattern,
|
|
32
|
+
codeSnippet: args.codeSnippet,
|
|
33
|
+
});
|
|
34
|
+
if (!entry) {
|
|
35
|
+
return { success: false, error: 'Invalid input — could not record false positive.' };
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
success: true,
|
|
39
|
+
recorded: {
|
|
40
|
+
id: entry.id,
|
|
41
|
+
findingType: entry.findingType,
|
|
42
|
+
pattern: entry.pattern,
|
|
43
|
+
reason: entry.reason,
|
|
44
|
+
addedAt: entry.addedAt,
|
|
45
|
+
},
|
|
46
|
+
message: `False positive recorded. The agent will not report similar patterns in future scans of this workspace.`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** get_agent_memory — view all false positives and known facts. */
|
|
50
|
+
async function toolGetAgentMemory(ctx, _args) {
|
|
51
|
+
const memory = (0, agentMemory_1.loadAgentMemory)(ctx.workspaceRoot);
|
|
52
|
+
return {
|
|
53
|
+
falsePositives: {
|
|
54
|
+
count: memory.falsePositives.length,
|
|
55
|
+
entries: memory.falsePositives.map(fp => ({
|
|
56
|
+
id: fp.id,
|
|
57
|
+
findingType: fp.findingType,
|
|
58
|
+
file: fp.file,
|
|
59
|
+
line: fp.line,
|
|
60
|
+
pattern: fp.pattern,
|
|
61
|
+
reason: fp.reason,
|
|
62
|
+
addedAt: fp.addedAt,
|
|
63
|
+
})),
|
|
64
|
+
},
|
|
65
|
+
knownFacts: {
|
|
66
|
+
count: memory.knownFacts.length,
|
|
67
|
+
entries: memory.knownFacts.map(kf => ({
|
|
68
|
+
id: kf.id,
|
|
69
|
+
fact: kf.fact,
|
|
70
|
+
source: kf.source,
|
|
71
|
+
addedAt: kf.addedAt,
|
|
72
|
+
})),
|
|
73
|
+
},
|
|
74
|
+
formatted: (0, agentMemory_1.formatMemoryForPrompt)(memory),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** clear_agent_memory — remove all false positives and known facts. */
|
|
78
|
+
async function toolClearAgentMemory(ctx, args) {
|
|
79
|
+
// If a specific false-positive ID is given, remove just that one
|
|
80
|
+
if (args.id) {
|
|
81
|
+
const removed = (0, agentMemory_1.removeFalsePositive)(ctx.workspaceRoot, args.id);
|
|
82
|
+
return { success: removed, message: removed ? `Removed false positive ${args.id}.` : `False positive ${args.id} not found.` };
|
|
83
|
+
}
|
|
84
|
+
const cleared = (0, agentMemory_1.clearAgentMemory)(ctx.workspaceRoot);
|
|
85
|
+
return {
|
|
86
|
+
success: cleared,
|
|
87
|
+
message: cleared
|
|
88
|
+
? 'All agent memory cleared (false positives + known facts).'
|
|
89
|
+
: 'No agent memory file found — nothing to clear.',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** add_known_fact — add a fact about the project the agent should know. */
|
|
93
|
+
async function toolAddKnownFact(ctx, args) {
|
|
94
|
+
if (!args.fact || !args.source) {
|
|
95
|
+
throw new Error('Missing required parameters "fact" and "source" for add_known_fact.');
|
|
96
|
+
}
|
|
97
|
+
const entry = (0, agentMemory_1.addKnownFact)(ctx.workspaceRoot, args.fact, args.source);
|
|
98
|
+
if (!entry) {
|
|
99
|
+
return { success: false, message: 'Fact already exists (duplicate).' };
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
success: true,
|
|
103
|
+
recorded: { id: entry.id, fact: entry.fact, source: entry.source, addedAt: entry.addedAt },
|
|
104
|
+
message: 'Known fact added. The agent will use this in future scans.',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=agentMemoryTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentMemoryTools.js","sourceRoot":"","sources":["../../src/tools/agentMemoryTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* securecode.agent-scan MCP tool — agent-mode scan.
|
|
2
|
+
* securecode.agent-scan MCP tool — agent-mode scan with exploit proof.
|
|
3
3
|
*
|
|
4
4
|
* An AI investigator that reads files, traces data flows, checks guards,
|
|
5
|
-
* and compares endpoint policies to find vulnerabilities.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* and compares endpoint policies to find vulnerabilities. Each high/critical
|
|
6
|
+
* finding is then sent to the sandbox for PROVEN/UNPROVEN verification before
|
|
7
|
+
* the Juror confirms it.
|
|
8
8
|
*
|
|
9
9
|
* Flow:
|
|
10
10
|
* 1. Resolve code + language from filePath
|
|
11
11
|
* 2. Build endpoint context from the project map
|
|
12
12
|
* 3. Run the agent loop (POST /agent/scan/start + /step loop)
|
|
13
|
-
* 4.
|
|
14
|
-
* 5.
|
|
13
|
+
* 4. For each high/critical finding → POST /sandbox/prove → PROVEN/UNPROVEN
|
|
14
|
+
* 5. Map agent findings → CandidateContext[]
|
|
15
|
+
* 6. POST /scan with scanDepth: 'agent' + candidateContexts (skips Scout,
|
|
15
16
|
* Juror + Phase 3 verify the agent's candidates)
|
|
16
|
-
*
|
|
17
|
+
* 7. Return merged result (agent findings + proven stamps + Juror-verified)
|
|
17
18
|
*/
|
|
18
19
|
import type { ServerContext } from '../mcp/types';
|
|
19
20
|
export declare function toolAgentScan(ctx: ServerContext, args: any): Promise<unknown>;
|
package/dist/tools/agentScan.js
CHANGED
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* securecode.agent-scan MCP tool — agent-mode scan.
|
|
3
|
+
* securecode.agent-scan MCP tool — agent-mode scan with exploit proof.
|
|
4
4
|
*
|
|
5
5
|
* An AI investigator that reads files, traces data flows, checks guards,
|
|
6
|
-
* and compares endpoint policies to find vulnerabilities.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* and compares endpoint policies to find vulnerabilities. Each high/critical
|
|
7
|
+
* finding is then sent to the sandbox for PROVEN/UNPROVEN verification before
|
|
8
|
+
* the Juror confirms it.
|
|
9
9
|
*
|
|
10
10
|
* Flow:
|
|
11
11
|
* 1. Resolve code + language from filePath
|
|
12
12
|
* 2. Build endpoint context from the project map
|
|
13
13
|
* 3. Run the agent loop (POST /agent/scan/start + /step loop)
|
|
14
|
-
* 4.
|
|
15
|
-
* 5.
|
|
14
|
+
* 4. For each high/critical finding → POST /sandbox/prove → PROVEN/UNPROVEN
|
|
15
|
+
* 5. Map agent findings → CandidateContext[]
|
|
16
|
+
* 6. POST /scan with scanDepth: 'agent' + candidateContexts (skips Scout,
|
|
16
17
|
* Juror + Phase 3 verify the agent's candidates)
|
|
17
|
-
*
|
|
18
|
+
* 7. Return merged result (agent findings + proven stamps + Juror-verified)
|
|
18
19
|
*/
|
|
19
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
21
|
exports.toolAgentScan = toolAgentScan;
|
|
21
22
|
const client_1 = require("../api/client");
|
|
22
23
|
const files_1 = require("../utils/files");
|
|
23
24
|
const mapContext_1 = require("../project-map/mapContext");
|
|
25
|
+
const scanCache_1 = require("../project-map/scanCache");
|
|
26
|
+
const agentMemory_1 = require("../project-map/agentMemory");
|
|
24
27
|
const agentScanLoop_1 = require("../attack/agentScanLoop");
|
|
25
28
|
function mapFindingsToCandidates(findings) {
|
|
26
29
|
return findings.map(f => ({
|
|
@@ -31,6 +34,10 @@ function mapFindingsToCandidates(findings) {
|
|
|
31
34
|
definitionContext: f.why,
|
|
32
35
|
}));
|
|
33
36
|
}
|
|
37
|
+
/** Prove high/critical/medium findings — skip only low. */
|
|
38
|
+
function shouldProve(finding) {
|
|
39
|
+
return finding.severity === 'critical' || finding.severity === 'high' || finding.severity === 'medium';
|
|
40
|
+
}
|
|
34
41
|
async function toolAgentScan(ctx, args) {
|
|
35
42
|
const progress = args._progress;
|
|
36
43
|
// 1. Resolve code + language
|
|
@@ -50,6 +57,35 @@ async function toolAgentScan(ctx, args) {
|
|
|
50
57
|
else {
|
|
51
58
|
throw new Error('Either filePath or code must be provided.');
|
|
52
59
|
}
|
|
60
|
+
// 1b. Validate the code — empty, binary, or too-large files cause confusing
|
|
61
|
+
// downstream errors (HTTP 400/413) that the user can't interpret.
|
|
62
|
+
// The API server has a 2MB body limit; we cap at 1.5MB to leave room for
|
|
63
|
+
// the JSON envelope and transcript.
|
|
64
|
+
const MAX_FILE_BYTES = 1_500_000;
|
|
65
|
+
if (code.trim().length === 0) {
|
|
66
|
+
return {
|
|
67
|
+
status: 'completed',
|
|
68
|
+
summary: 'File is empty — nothing to scan.',
|
|
69
|
+
agentFindings: [],
|
|
70
|
+
findings: [],
|
|
71
|
+
stepsUsed: 0,
|
|
72
|
+
costSpentUsd: 0,
|
|
73
|
+
transcript: [],
|
|
74
|
+
cached: false,
|
|
75
|
+
provenCount: 0,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Binary file detection: if the first 1000 bytes contain a NUL byte, it's
|
|
79
|
+
// almost certainly binary (compiled, image, archive). Sending it to the LLM
|
|
80
|
+
// would produce garbage results.
|
|
81
|
+
const headBytes = Buffer.from(code.slice(0, 1000), 'utf8');
|
|
82
|
+
if (headBytes.includes(0)) {
|
|
83
|
+
throw new Error('Cannot scan binary file. SecureCode only scans text source files (.ts, .js, .py, etc.).');
|
|
84
|
+
}
|
|
85
|
+
if (Buffer.byteLength(code, 'utf8') > MAX_FILE_BYTES) {
|
|
86
|
+
const sizeMB = (Buffer.byteLength(code, 'utf8') / 1_000_000).toFixed(1);
|
|
87
|
+
throw new Error(`File too large (${sizeMB}MB). Maximum is 1.5MB. Split the file or scan a specific section using the API directly.`);
|
|
88
|
+
}
|
|
53
89
|
// 2. Build endpoint context from the project map
|
|
54
90
|
let endpointContext = [];
|
|
55
91
|
if (filePath) {
|
|
@@ -60,14 +96,53 @@ async function toolAgentScan(ctx, args) {
|
|
|
60
96
|
// best-effort — proceed without endpoint context
|
|
61
97
|
}
|
|
62
98
|
}
|
|
99
|
+
// 2b. Check scan cache — if the file hasn't changed, return cached results
|
|
100
|
+
const skipCacheRead = !!args._noCache;
|
|
101
|
+
const useCache = !!filePath;
|
|
102
|
+
if (useCache && !skipCacheRead) {
|
|
103
|
+
try {
|
|
104
|
+
const cached = (0, scanCache_1.getCachedScan)(ctx.workspaceRoot, filePath, code);
|
|
105
|
+
if (cached) {
|
|
106
|
+
if (progress)
|
|
107
|
+
progress(1, 1, 'Cached result — file unchanged since last scan.');
|
|
108
|
+
return {
|
|
109
|
+
status: cached.status,
|
|
110
|
+
summary: cached.summary || 'Agent completed (cached).',
|
|
111
|
+
agentFindings: cached.findings,
|
|
112
|
+
findings: [],
|
|
113
|
+
stepsUsed: cached.stepsUsed,
|
|
114
|
+
costSpentUsd: 0,
|
|
115
|
+
transcript: [],
|
|
116
|
+
cached: true,
|
|
117
|
+
provenCount: cached.findings.filter((f) => f.proven === 'PROVEN').length,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
// Cache read failure (corrupt file, permissions, etc) should NOT
|
|
123
|
+
// block the scan — just skip the cache and proceed.
|
|
124
|
+
console.warn(`[Agent Scan] Cache read skipped: ${err?.message || err}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
63
127
|
// 3. Run the agent loop
|
|
128
|
+
// Load workspace memory (false positives + known facts) to inject into target
|
|
129
|
+
let workspaceMemory;
|
|
130
|
+
try {
|
|
131
|
+
const memory = (0, agentMemory_1.loadAgentMemory)(ctx.workspaceRoot);
|
|
132
|
+
workspaceMemory = (0, agentMemory_1.formatMemoryForPrompt)(memory) || undefined;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// best-effort — proceed without memory
|
|
136
|
+
}
|
|
64
137
|
const target = {
|
|
65
138
|
filePath: filePath || 'inline-code',
|
|
66
139
|
language,
|
|
67
140
|
fileContent: code,
|
|
68
141
|
endpointContext,
|
|
142
|
+
workspaceMemory,
|
|
69
143
|
};
|
|
70
144
|
const agentResult = await (0, agentScanLoop_1.runAgentScan)(ctx, target, {
|
|
145
|
+
signal: args._signal,
|
|
71
146
|
onProgress: (steps, max, msg) => {
|
|
72
147
|
if (progress)
|
|
73
148
|
progress(steps, max, msg);
|
|
@@ -76,37 +151,181 @@ async function toolAgentScan(ctx, args) {
|
|
|
76
151
|
if (agentResult.status === 'spawn_failed') {
|
|
77
152
|
throw new Error(agentResult.error || 'Agent scan failed to start.');
|
|
78
153
|
}
|
|
79
|
-
// 4.
|
|
80
|
-
const
|
|
81
|
-
|
|
154
|
+
// 4. Prove each high/critical finding via the sandbox
|
|
155
|
+
const client = new client_1.ApiClient({ baseUrl: ctx.apiUrl, token: ctx.apiToken });
|
|
156
|
+
const provenFindings = [];
|
|
157
|
+
const proveable = agentResult.findings.filter(shouldProve);
|
|
158
|
+
if (proveable.length > 0 && progress) {
|
|
159
|
+
progress(0, proveable.length, `Proving ${proveable.length} finding(s) in sandbox...`);
|
|
160
|
+
}
|
|
161
|
+
let proveIdx = 0;
|
|
162
|
+
for (const finding of agentResult.findings) {
|
|
163
|
+
if (!shouldProve(finding)) {
|
|
164
|
+
provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low severity — not proven' });
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (progress) {
|
|
168
|
+
proveIdx++;
|
|
169
|
+
progress(proveIdx, proveable.length, `Proving ${finding.type} at line ${finding.line}...`);
|
|
170
|
+
}
|
|
171
|
+
let proved = false;
|
|
172
|
+
for (let attempt = 1; attempt <= 2; attempt++) {
|
|
173
|
+
try {
|
|
174
|
+
const proveResp = await client.postJson('/sandbox/prove', {
|
|
175
|
+
code,
|
|
176
|
+
language,
|
|
177
|
+
vulnerabilityType: finding.type,
|
|
178
|
+
line: finding.line,
|
|
179
|
+
lineEnd: finding.lineEnd,
|
|
180
|
+
evidence: finding.evidence,
|
|
181
|
+
why: finding.why,
|
|
182
|
+
});
|
|
183
|
+
provenFindings.push({
|
|
184
|
+
...finding,
|
|
185
|
+
proven: proveResp.proven,
|
|
186
|
+
provenReason: proveResp.rationale || proveResp.skipReason || proveResp.sandbox?.reason,
|
|
187
|
+
});
|
|
188
|
+
proved = true;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
if (attempt === 1) {
|
|
193
|
+
console.warn(`[Agent Scan] Prove attempt 1 failed: ${err.message}. Retrying...`);
|
|
194
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
provenFindings.push({
|
|
198
|
+
...finding,
|
|
199
|
+
proven: 'INCONCLUSIVE',
|
|
200
|
+
provenReason: `Sandbox prove failed after 2 attempts: ${err.message || err}`,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// 4b. Generate fixes for proven/suspected findings
|
|
207
|
+
const fixableFindings = provenFindings.filter(f => f.proven === 'PROVEN' || (f.proven !== 'UNPROVEN' && f.confidence >= 60));
|
|
208
|
+
if (fixableFindings.length > 0 && progress) {
|
|
209
|
+
progress(0, fixableFindings.length, `Generating fixes for ${fixableFindings.length} finding(s)...`);
|
|
210
|
+
}
|
|
211
|
+
let fixIdx = 0;
|
|
212
|
+
for (const finding of fixableFindings) {
|
|
213
|
+
if (progress) {
|
|
214
|
+
fixIdx++;
|
|
215
|
+
progress(fixIdx, fixableFindings.length, `Fixing ${finding.type} at line ${finding.line}...`);
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const fixResp = await client.postJson('/fix', {
|
|
219
|
+
code,
|
|
220
|
+
language,
|
|
221
|
+
vulnerability: {
|
|
222
|
+
type: finding.type,
|
|
223
|
+
line_start: finding.line,
|
|
224
|
+
line_end: finding.lineEnd || finding.line,
|
|
225
|
+
evidence_snippet: finding.evidence,
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
if (fixResp.fixed_code) {
|
|
229
|
+
finding.fix = {
|
|
230
|
+
fixedCode: fixResp.fixed_code,
|
|
231
|
+
replaceRange: { start_line: finding.line, end_line: finding.lineEnd || finding.line },
|
|
232
|
+
fixSummary: fixResp.fix_summary || '',
|
|
233
|
+
importsNeeded: fixResp.imports_needed,
|
|
234
|
+
confidence: fixResp.confidence,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
// Best-effort — finding stays without fix
|
|
240
|
+
console.warn(`[Agent Scan] Fix generation failed for ${finding.type} at L${finding.line}: ${err.message}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// 5. Map findings → CandidateContext[]
|
|
244
|
+
const candidateContexts = mapFindingsToCandidates(provenFindings);
|
|
245
|
+
// 6. If no findings, return early
|
|
82
246
|
if (candidateContexts.length === 0) {
|
|
247
|
+
if (useCache) {
|
|
248
|
+
try {
|
|
249
|
+
(0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
|
|
250
|
+
findings: provenFindings,
|
|
251
|
+
status: agentResult.status,
|
|
252
|
+
summary: agentResult.summary,
|
|
253
|
+
stepsUsed: agentResult.stepsUsed,
|
|
254
|
+
costSpentUsd: agentResult.costSpentUsd,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
83
261
|
return {
|
|
84
262
|
status: agentResult.status,
|
|
85
263
|
summary: agentResult.summary || 'Agent completed with no findings.',
|
|
86
264
|
findings: [],
|
|
87
|
-
agentFindings:
|
|
265
|
+
agentFindings: provenFindings,
|
|
88
266
|
stepsUsed: agentResult.stepsUsed,
|
|
89
267
|
costSpentUsd: agentResult.costSpentUsd,
|
|
90
268
|
transcript: agentResult.transcript,
|
|
91
269
|
};
|
|
92
270
|
}
|
|
93
|
-
//
|
|
271
|
+
// 7. POST /scan with scanDepth: 'agent' + candidateContexts
|
|
94
272
|
// This skips Scout and sends the agent's candidates directly to Juror
|
|
95
273
|
// + Phase 3 for verification.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
274
|
+
// If this call fails, return the agent findings without Juror
|
|
275
|
+
// verification (degraded mode) instead of throwing everything away.
|
|
276
|
+
let scanResp = null;
|
|
277
|
+
try {
|
|
278
|
+
scanResp = await client.postJson('/scan', {
|
|
279
|
+
code,
|
|
280
|
+
language,
|
|
281
|
+
...(filePath ? { filePath } : {}),
|
|
282
|
+
scanDepth: 'agent',
|
|
283
|
+
candidateContexts,
|
|
284
|
+
...(endpointContext.length > 0 ? { endpointContext } : {}),
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
// Juror verification failed — return agent findings as-is (degraded).
|
|
289
|
+
// This is better than throwing, which would lose all the agent's work.
|
|
290
|
+
console.warn(`[Agent Scan] Juror verification failed (${err?.message || err}). Returning agent findings without verification.`);
|
|
291
|
+
}
|
|
292
|
+
// 8. Write to cache before returning
|
|
293
|
+
if (useCache) {
|
|
294
|
+
try {
|
|
295
|
+
(0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
|
|
296
|
+
findings: provenFindings,
|
|
297
|
+
status: agentResult.status,
|
|
298
|
+
summary: agentResult.summary,
|
|
299
|
+
stepsUsed: agentResult.stepsUsed,
|
|
300
|
+
costSpentUsd: agentResult.costSpentUsd,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// 9. Return merged result with proven stamps
|
|
308
|
+
// If Juror failed, scanResp is null — return agent findings as verified=false
|
|
309
|
+
if (!scanResp) {
|
|
310
|
+
return {
|
|
311
|
+
status: agentResult.status,
|
|
312
|
+
summary: (agentResult.summary || 'Agent completed') + ' (Juror verification skipped — degraded)',
|
|
313
|
+
agentFindings: provenFindings,
|
|
314
|
+
verifiedFindings: [],
|
|
315
|
+
allFindings: [],
|
|
316
|
+
degraded: true,
|
|
317
|
+
stepsUsed: agentResult.stepsUsed,
|
|
318
|
+
costSpentUsd: agentResult.costSpentUsd,
|
|
319
|
+
transcript: agentResult.transcript,
|
|
320
|
+
provenCount: provenFindings.filter(f => f.proven === 'PROVEN').length,
|
|
321
|
+
unprovenCount: provenFindings.filter(f => f.proven === 'UNPROVEN').length,
|
|
322
|
+
inconclusiveCount: provenFindings.filter(f => f.proven === 'INCONCLUSIVE').length,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
106
325
|
return {
|
|
107
326
|
status: agentResult.status,
|
|
108
327
|
summary: agentResult.summary,
|
|
109
|
-
agentFindings:
|
|
328
|
+
agentFindings: provenFindings,
|
|
110
329
|
verifiedFindings: scanResp.finalFindings || [],
|
|
111
330
|
allFindings: scanResp.findings || [],
|
|
112
331
|
scanId: scanResp.scanId,
|
|
@@ -117,6 +336,9 @@ async function toolAgentScan(ctx, args) {
|
|
|
117
336
|
stepsUsed: agentResult.stepsUsed,
|
|
118
337
|
costSpentUsd: agentResult.costSpentUsd,
|
|
119
338
|
transcript: agentResult.transcript,
|
|
339
|
+
provenCount: provenFindings.filter(f => f.proven === 'PROVEN').length,
|
|
340
|
+
unprovenCount: provenFindings.filter(f => f.proven === 'UNPROVEN').length,
|
|
341
|
+
inconclusiveCount: provenFindings.filter(f => f.proven === 'INCONCLUSIVE').length,
|
|
120
342
|
};
|
|
121
343
|
}
|
|
122
344
|
//# sourceMappingURL=agentScan.js.map
|
|
@@ -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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"}
|
package/dist/utils/files.js
CHANGED
|
@@ -47,11 +47,28 @@ const SUPPORTED_EXTENSIONS = {
|
|
|
47
47
|
'.ts': 'typescript',
|
|
48
48
|
'.tsx': 'typescriptreact',
|
|
49
49
|
'.py': 'python',
|
|
50
|
-
|
|
50
|
+
// Note: .php is intentionally omitted — the MCP parserLoader has no
|
|
51
|
+
// tree-sitter-php.wasm. PHP files will return 'Unsupported file type'
|
|
52
|
+
// with a clear message instead of silently producing zero findings.
|
|
53
|
+
'.json': 'json',
|
|
54
|
+
'.yaml': 'yaml',
|
|
55
|
+
'.yml': 'yaml',
|
|
56
|
+
'.toml': 'toml',
|
|
57
|
+
'.ini': 'ini',
|
|
58
|
+
'.env': 'env',
|
|
59
|
+
'.cfg': 'ini',
|
|
60
|
+
'.conf': 'ini',
|
|
61
|
+
'.config': 'ini',
|
|
51
62
|
};
|
|
52
63
|
function inferLanguage(filePath) {
|
|
53
64
|
const ext = path.extname(filePath).toLowerCase();
|
|
54
|
-
|
|
65
|
+
if (SUPPORTED_EXTENSIONS[ext])
|
|
66
|
+
return SUPPORTED_EXTENSIONS[ext];
|
|
67
|
+
// Dotfiles like .env, .env.local, .env.production have no extension
|
|
68
|
+
const base = path.basename(filePath).toLowerCase();
|
|
69
|
+
if (base === '.env' || /^\.env\.[\w.-]+$/.test(base))
|
|
70
|
+
return 'env';
|
|
71
|
+
return undefined;
|
|
55
72
|
}
|
|
56
73
|
function isSupportedFile(filePath) {
|
|
57
74
|
return inferLanguage(filePath) !== undefined;
|
package/dist/utils/files.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,sCASC;AAED,0CAEC;AAED,oDAOC;AAED,sDAWC;AA5DD,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,oBAAoB,GAA2B;IACjD,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,QAAQ;IACf,oEAAoE;IACpE,sEAAsE;IACtE,oEAAoE;IACpE,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,KAAK;CACnB,CAAC;AAEF,SAAgB,aAAa,CAAC,QAAgB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,oBAAoB,CAAC,GAAG,CAAC;QAAE,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAEhE,oEAAoE;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,IAAI,KAAK,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnE,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAgB,eAAe,CAAC,QAAgB;IAC5C,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;AACjD,CAAC;AAED,SAAgB,oBAAoB,CAAC,aAAqB,EAAE,SAAiB;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS,+EAA+E,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAgB,qBAAqB,CAAC,aAAqB,EAAE,SAAiB;IAC1E,MAAM,OAAO,GAAG,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File listing utility — walks a directory and returns source files,
|
|
3
|
+
* respecting .securecodeignore and skip directories.
|
|
4
|
+
*/
|
|
5
|
+
export interface ListFilesOptions {
|
|
6
|
+
/** Directory to list (relative to workspace root). Defaults to root. */
|
|
7
|
+
dir?: string;
|
|
8
|
+
/** Optional glob filter (e.g. "*.ts"). */
|
|
9
|
+
glob?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface FileEntry {
|
|
12
|
+
path: string;
|
|
13
|
+
size: number;
|
|
14
|
+
lines: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function listFiles(workspaceRoot: string, options?: ListFilesOptions): FileEntry[];
|
|
17
|
+
export declare function formatFileList(files: FileEntry[]): string;
|