@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.
Files changed (58) hide show
  1. package/README.md +107 -13
  2. package/dist/api/client.d.ts +1 -1
  3. package/dist/api/client.js +2 -1
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/types.d.ts +18 -0
  6. package/dist/attack/agentScanExecutor.js +159 -5
  7. package/dist/attack/agentScanExecutor.js.map +1 -1
  8. package/dist/attack/agentScanLoop.js +157 -3
  9. package/dist/attack/agentScanLoop.js.map +1 -1
  10. package/dist/attack/agentScanProtocol.d.ts +47 -5
  11. package/dist/attack/agentScanProtocol.js +3 -3
  12. package/dist/index.js +218 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp/server.js +5 -0
  15. package/dist/mcp/server.js.map +1 -1
  16. package/dist/mcp/tools.js +80 -3
  17. package/dist/mcp/tools.js.map +1 -1
  18. package/dist/project-map/agentMemory.d.ts +75 -0
  19. package/dist/project-map/agentMemory.js +230 -0
  20. package/dist/project-map/agentMemory.js.map +1 -0
  21. package/dist/project-map/crossFileTaintTracker.d.ts +51 -0
  22. package/dist/project-map/crossFileTaintTracker.js +429 -0
  23. package/dist/project-map/crossFileTaintTracker.js.map +1 -0
  24. package/dist/project-map/endpointDiscovery.d.ts +24 -0
  25. package/dist/project-map/endpointDiscovery.js +101 -0
  26. package/dist/project-map/endpointDiscovery.js.map +1 -0
  27. package/dist/project-map/guardEvaluator.js +37 -0
  28. package/dist/project-map/guardEvaluator.js.map +1 -1
  29. package/dist/project-map/guardPatterns.js +16 -5
  30. package/dist/project-map/guardPatterns.js.map +1 -1
  31. package/dist/project-map/sanitizers.js +10 -0
  32. package/dist/project-map/sanitizers.js.map +1 -1
  33. package/dist/project-map/scanCache.d.ts +67 -0
  34. package/dist/project-map/scanCache.js +169 -0
  35. package/dist/project-map/scanCache.js.map +1 -0
  36. package/dist/project-map/sinkRegistry.js +165 -0
  37. package/dist/project-map/sinkRegistry.js.map +1 -1
  38. package/dist/project-map/taintSources.d.ts +19 -1
  39. package/dist/project-map/taintSources.js +69 -2
  40. package/dist/project-map/taintSources.js.map +1 -1
  41. package/dist/project-map/taintTracker.d.ts +4 -1
  42. package/dist/project-map/taintTracker.js +188 -5
  43. package/dist/project-map/taintTracker.js.map +1 -1
  44. package/dist/tools/agentMemoryTools.d.ts +18 -0
  45. package/dist/tools/agentMemoryTools.js +107 -0
  46. package/dist/tools/agentMemoryTools.js.map +1 -0
  47. package/dist/tools/agentScan.d.ts +8 -7
  48. package/dist/tools/agentScan.js +245 -23
  49. package/dist/tools/agentScan.js.map +1 -1
  50. package/dist/utils/files.js +19 -2
  51. package/dist/utils/files.js.map +1 -1
  52. package/dist/utils/listFiles.d.ts +17 -0
  53. package/dist/utils/listFiles.js +126 -0
  54. package/dist/utils/listFiles.js.map +1 -0
  55. package/dist/utils/listImports.d.ts +15 -0
  56. package/dist/utils/listImports.js +164 -0
  57. package/dist/utils/listImports.js.map +1 -0
  58. 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. Slower but deeper
6
- * than a deep scan. The agent replaces the Scout; its findings are verified
7
- * by the existing Juror + Phase 3 pipeline.
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. Map agent findings → CandidateContext[]
14
- * 5. POST /scan with scanDepth: 'agent' + candidateContexts (skips Scout,
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
- * 6. Return merged result (agent findings + Juror-verified findings)
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>;
@@ -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. Slower but deeper
7
- * than a deep scan. The agent replaces the Scout; its findings are verified
8
- * by the existing Juror + Phase 3 pipeline.
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. Map agent findings → CandidateContext[]
15
- * 5. POST /scan with scanDepth: 'agent' + candidateContexts (skips Scout,
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
- * 6. Return merged result (agent findings + Juror-verified findings)
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. Map agent findings → CandidateContext[]
80
- const candidateContexts = mapFindingsToCandidates(agentResult.findings);
81
- // 5. If no findings, return early
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: agentResult.findings,
265
+ agentFindings: provenFindings,
88
266
  stepsUsed: agentResult.stepsUsed,
89
267
  costSpentUsd: agentResult.costSpentUsd,
90
268
  transcript: agentResult.transcript,
91
269
  };
92
270
  }
93
- // 6. POST /scan with scanDepth: 'agent' + candidateContexts
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
- const client = new client_1.ApiClient({ baseUrl: ctx.apiUrl, token: ctx.apiToken });
97
- const scanResp = await client.postJson('/scan', {
98
- code,
99
- language,
100
- ...(filePath ? { filePath } : {}),
101
- scanDepth: 'agent',
102
- candidateContexts,
103
- ...(endpointContext.length > 0 ? { endpointContext } : {}),
104
- });
105
- // 7. Return merged result
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: agentResult.findings,
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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"}
@@ -47,11 +47,28 @@ const SUPPORTED_EXTENSIONS = {
47
47
  '.ts': 'typescript',
48
48
  '.tsx': 'typescriptreact',
49
49
  '.py': 'python',
50
- '.php': 'php',
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
- return SUPPORTED_EXTENSIONS[ext];
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;
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,sCAGC;AAED,0CAEC;AAED,oDAOC;AAED,sDAWC;AA3CD,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,MAAM,EAAE,KAAK;CAChB,CAAC;AAEF,SAAgB,aAAa,CAAC,QAAgB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;AACrC,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"}
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;