@securecode-ai/mcp 0.4.0 → 0.4.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.
- 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/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 +62 -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.js +206 -33
- 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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"}
|
package/dist/tools/agentScan.js
CHANGED
|
@@ -22,6 +22,8 @@ exports.toolAgentScan = toolAgentScan;
|
|
|
22
22
|
const client_1 = require("../api/client");
|
|
23
23
|
const files_1 = require("../utils/files");
|
|
24
24
|
const mapContext_1 = require("../project-map/mapContext");
|
|
25
|
+
const scanCache_1 = require("../project-map/scanCache");
|
|
26
|
+
const agentMemory_1 = require("../project-map/agentMemory");
|
|
25
27
|
const agentScanLoop_1 = require("../attack/agentScanLoop");
|
|
26
28
|
function mapFindingsToCandidates(findings) {
|
|
27
29
|
return findings.map(f => ({
|
|
@@ -32,9 +34,9 @@ function mapFindingsToCandidates(findings) {
|
|
|
32
34
|
definitionContext: f.why,
|
|
33
35
|
}));
|
|
34
36
|
}
|
|
35
|
-
/**
|
|
37
|
+
/** Prove high/critical/medium findings — skip only low. */
|
|
36
38
|
function shouldProve(finding) {
|
|
37
|
-
return finding.severity === 'critical' || finding.severity === 'high';
|
|
39
|
+
return finding.severity === 'critical' || finding.severity === 'high' || finding.severity === 'medium';
|
|
38
40
|
}
|
|
39
41
|
async function toolAgentScan(ctx, args) {
|
|
40
42
|
const progress = args._progress;
|
|
@@ -55,6 +57,35 @@ async function toolAgentScan(ctx, args) {
|
|
|
55
57
|
else {
|
|
56
58
|
throw new Error('Either filePath or code must be provided.');
|
|
57
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
|
+
}
|
|
58
89
|
// 2. Build endpoint context from the project map
|
|
59
90
|
let endpointContext = [];
|
|
60
91
|
if (filePath) {
|
|
@@ -65,14 +96,53 @@ async function toolAgentScan(ctx, args) {
|
|
|
65
96
|
// best-effort — proceed without endpoint context
|
|
66
97
|
}
|
|
67
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
|
+
}
|
|
68
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
|
+
}
|
|
69
137
|
const target = {
|
|
70
138
|
filePath: filePath || 'inline-code',
|
|
71
139
|
language,
|
|
72
140
|
fileContent: code,
|
|
73
141
|
endpointContext,
|
|
142
|
+
workspaceMemory,
|
|
74
143
|
};
|
|
75
144
|
const agentResult = await (0, agentScanLoop_1.runAgentScan)(ctx, target, {
|
|
145
|
+
signal: args._signal,
|
|
76
146
|
onProgress: (steps, max, msg) => {
|
|
77
147
|
if (progress)
|
|
78
148
|
progress(steps, max, msg);
|
|
@@ -91,42 +161,103 @@ async function toolAgentScan(ctx, args) {
|
|
|
91
161
|
let proveIdx = 0;
|
|
92
162
|
for (const finding of agentResult.findings) {
|
|
93
163
|
if (!shouldProve(finding)) {
|
|
94
|
-
provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low
|
|
164
|
+
provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low severity — not proven' });
|
|
95
165
|
continue;
|
|
96
166
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
+
}
|
|
101
203
|
}
|
|
102
|
-
|
|
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', {
|
|
103
219
|
code,
|
|
104
220
|
language,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
provenFindings.push({
|
|
112
|
-
...finding,
|
|
113
|
-
proven: proveResp.proven,
|
|
114
|
-
provenReason: proveResp.rationale || proveResp.skipReason || proveResp.sandbox?.reason,
|
|
221
|
+
vulnerability: {
|
|
222
|
+
type: finding.type,
|
|
223
|
+
line_start: finding.line,
|
|
224
|
+
line_end: finding.lineEnd || finding.line,
|
|
225
|
+
evidence_snippet: finding.evidence,
|
|
226
|
+
},
|
|
115
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
|
+
}
|
|
116
237
|
}
|
|
117
238
|
catch (err) {
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
...finding,
|
|
121
|
-
proven: 'INCONCLUSIVE',
|
|
122
|
-
provenReason: `Sandbox prove failed: ${err.message || err}`,
|
|
123
|
-
});
|
|
239
|
+
// Best-effort — finding stays without fix
|
|
240
|
+
console.warn(`[Agent Scan] Fix generation failed for ${finding.type} at L${finding.line}: ${err.message}`);
|
|
124
241
|
}
|
|
125
242
|
}
|
|
126
243
|
// 5. Map findings → CandidateContext[]
|
|
127
244
|
const candidateContexts = mapFindingsToCandidates(provenFindings);
|
|
128
245
|
// 6. If no findings, return early
|
|
129
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
|
+
}
|
|
130
261
|
return {
|
|
131
262
|
status: agentResult.status,
|
|
132
263
|
summary: agentResult.summary || 'Agent completed with no findings.',
|
|
@@ -140,15 +271,57 @@ async function toolAgentScan(ctx, args) {
|
|
|
140
271
|
// 7. POST /scan with scanDepth: 'agent' + candidateContexts
|
|
141
272
|
// This skips Scout and sends the agent's candidates directly to Juror
|
|
142
273
|
// + Phase 3 for verification.
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
+
}
|
|
152
325
|
return {
|
|
153
326
|
status: agentResult.status,
|
|
154
327
|
summary: agentResult.summary,
|
|
@@ -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;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* File listing utility — walks a directory and returns source files,
|
|
4
|
+
* respecting .securecodeignore and skip directories.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.listFiles = listFiles;
|
|
41
|
+
exports.formatFileList = formatFileList;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const ignore_1 = require("../utils/ignore");
|
|
45
|
+
const SUPPORTED_EXTENSIONS = new Set([
|
|
46
|
+
'.js', '.jsx', '.mjs', '.cjs', '.ts', '.tsx', '.py',
|
|
47
|
+
]);
|
|
48
|
+
const MAX_FILES = 500;
|
|
49
|
+
function matchGlob(filePath, glob) {
|
|
50
|
+
if (!glob)
|
|
51
|
+
return true;
|
|
52
|
+
// Simple glob: *.ts, *.py, etc — match the extension
|
|
53
|
+
if (glob.startsWith('*.')) {
|
|
54
|
+
const ext = glob.slice(1); // '.ts'
|
|
55
|
+
return filePath.endsWith(ext);
|
|
56
|
+
}
|
|
57
|
+
// Otherwise treat as substring match
|
|
58
|
+
return filePath.includes(glob);
|
|
59
|
+
}
|
|
60
|
+
function listFiles(workspaceRoot, options = {}) {
|
|
61
|
+
const ignorePatterns = (0, ignore_1.readSecurecodeIgnore)(workspaceRoot);
|
|
62
|
+
const searchDir = options.dir
|
|
63
|
+
? path.resolve(workspaceRoot, options.dir)
|
|
64
|
+
: workspaceRoot;
|
|
65
|
+
const results = [];
|
|
66
|
+
const stack = [searchDir];
|
|
67
|
+
let count = 0;
|
|
68
|
+
while (stack.length > 0 && count < MAX_FILES) {
|
|
69
|
+
const dir = stack.pop();
|
|
70
|
+
let entries;
|
|
71
|
+
try {
|
|
72
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
for (const entry of entries) {
|
|
78
|
+
if (count >= MAX_FILES)
|
|
79
|
+
break;
|
|
80
|
+
const fullPath = path.join(dir, entry.name);
|
|
81
|
+
if (entry.isDirectory()) {
|
|
82
|
+
if (!ignore_1.SKIP_DIRS.has(entry.name) && !entry.name.startsWith('.')) {
|
|
83
|
+
stack.push(fullPath);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (entry.isFile()) {
|
|
87
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
88
|
+
if (!SUPPORTED_EXTENSIONS.has(ext))
|
|
89
|
+
continue;
|
|
90
|
+
if ((0, ignore_1.isSecretFileName)(fullPath))
|
|
91
|
+
continue;
|
|
92
|
+
const relPath = path.relative(workspaceRoot, fullPath).replace(/\\/g, '/');
|
|
93
|
+
if ((0, ignore_1.isIgnored)(relPath, ignorePatterns))
|
|
94
|
+
continue;
|
|
95
|
+
if (!matchGlob(relPath, options.glob))
|
|
96
|
+
continue;
|
|
97
|
+
let size = 0;
|
|
98
|
+
let lines = 0;
|
|
99
|
+
try {
|
|
100
|
+
const content = fs.readFileSync(fullPath, 'utf8');
|
|
101
|
+
size = Buffer.byteLength(content);
|
|
102
|
+
lines = content.split('\n').length;
|
|
103
|
+
}
|
|
104
|
+
catch { /* best effort */ }
|
|
105
|
+
results.push({ path: relPath, size, lines });
|
|
106
|
+
count++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
results.sort((a, b) => a.path.localeCompare(b.path));
|
|
111
|
+
return results;
|
|
112
|
+
}
|
|
113
|
+
function formatFileList(files) {
|
|
114
|
+
if (files.length === 0) {
|
|
115
|
+
return 'No source files found.';
|
|
116
|
+
}
|
|
117
|
+
const lines = [`Found ${files.length} source file(s):`];
|
|
118
|
+
for (const f of files) {
|
|
119
|
+
const sizeStr = f.size < 1024
|
|
120
|
+
? `${f.size}B`
|
|
121
|
+
: `${(f.size / 1024).toFixed(1)}KB`;
|
|
122
|
+
lines.push(` ${f.path} (${f.lines}L, ${sizeStr})`);
|
|
123
|
+
}
|
|
124
|
+
return lines.join('\n');
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=listFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listFiles.js","sourceRoot":"","sources":["../../src/utils/listFiles.ts"],"names":[],"mappings":"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"}
|