@securecode-ai/mcp 0.5.4 → 0.5.6
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 +7 -0
- package/dist/approval/auditLog.d.ts +1 -1
- package/dist/approval/auditLog.js +11 -3
- package/dist/approval/auditLog.js.map +1 -1
- package/dist/approval/broker.d.ts +7 -2
- package/dist/approval/broker.js +239 -110
- package/dist/approval/broker.js.map +1 -1
- package/dist/approval/policy.d.ts +10 -0
- package/dist/approval/policy.js +104 -0
- package/dist/approval/policy.js.map +1 -0
- package/dist/approval/types.d.ts +11 -2
- package/dist/approval/types.js +10 -1
- package/dist/approval/types.js.map +1 -1
- package/dist/attack/agentScanExecutor.d.ts +35 -1
- package/dist/attack/agentScanExecutor.js +405 -76
- package/dist/attack/agentScanExecutor.js.map +1 -1
- package/dist/attack/agentScanLoop.d.ts +20 -0
- package/dist/attack/agentScanLoop.js +1264 -60
- package/dist/attack/agentScanLoop.js.map +1 -1
- package/dist/attack/agentScanProtocol.d.ts +382 -6
- package/dist/attack/agentScanProtocol.js +110 -4
- package/dist/attack/agentScanProtocol.js.map +1 -1
- package/dist/attack/agentTrace.d.ts +73 -0
- package/dist/attack/agentTrace.js +228 -0
- package/dist/attack/agentTrace.js.map +1 -0
- package/dist/attack/architectureScoutExecutor.d.ts +18 -0
- package/dist/attack/architectureScoutExecutor.js +211 -0
- package/dist/attack/architectureScoutExecutor.js.map +1 -0
- package/dist/attack/architectureScoutLoop.d.ts +36 -0
- package/dist/attack/architectureScoutLoop.js +403 -0
- package/dist/attack/architectureScoutLoop.js.map +1 -0
- package/dist/attack/architectureScoutProtocol.d.ts +209 -0
- package/dist/attack/architectureScoutProtocol.js +47 -0
- package/dist/attack/architectureScoutProtocol.js.map +1 -0
- package/dist/attack/candidateStore.d.ts +95 -0
- package/dist/attack/candidateStore.js +231 -0
- package/dist/attack/candidateStore.js.map +1 -0
- package/dist/attack/evidenceLedger.d.ts +67 -0
- package/dist/attack/evidenceLedger.js +192 -0
- package/dist/attack/evidenceLedger.js.map +1 -0
- package/dist/attack/finishGate.d.ts +62 -0
- package/dist/attack/finishGate.js +209 -0
- package/dist/attack/finishGate.js.map +1 -0
- package/dist/attack/fixCodeMerge.d.ts +27 -0
- package/dist/attack/fixCodeMerge.js +42 -0
- package/dist/attack/fixCodeMerge.js.map +1 -0
- package/dist/attack/fixVerifyLoop.d.ts +55 -0
- package/dist/attack/fixVerifyLoop.js +187 -0
- package/dist/attack/fixVerifyLoop.js.map +1 -0
- package/dist/attack/investigationProfiles.d.ts +36 -0
- package/dist/attack/investigationProfiles.js +144 -0
- package/dist/attack/investigationProfiles.js.map +1 -0
- package/dist/attack/investigationState.d.ts +227 -0
- package/dist/attack/investigationState.js +666 -0
- package/dist/attack/investigationState.js.map +1 -0
- package/dist/attack/mutationOperators.d.ts +22 -0
- package/dist/attack/mutationOperators.js +170 -0
- package/dist/attack/mutationOperators.js.map +1 -0
- package/dist/attack/mutationTest.d.ts +33 -0
- package/dist/attack/mutationTest.js +110 -0
- package/dist/attack/mutationTest.js.map +1 -0
- package/dist/attack/proofGate.d.ts +20 -0
- package/dist/attack/proofGate.js +104 -0
- package/dist/attack/proofGate.js.map +1 -0
- package/dist/attack/proofTypes.d.ts +57 -0
- package/dist/attack/proofTypes.js +32 -0
- package/dist/attack/proofTypes.js.map +1 -0
- package/dist/attack/protocolValidator.d.ts +50 -0
- package/dist/attack/protocolValidator.js +427 -0
- package/dist/attack/protocolValidator.js.map +1 -0
- package/dist/attack/qualityMetrics.d.ts +133 -0
- package/dist/attack/qualityMetrics.js +226 -0
- package/dist/attack/qualityMetrics.js.map +1 -0
- package/dist/attack/scanScheduler.d.ts +52 -0
- package/dist/attack/scanScheduler.js +265 -0
- package/dist/attack/scanScheduler.js.map +1 -0
- package/dist/attack/scanState.d.ts +58 -0
- package/dist/attack/scanState.js +102 -0
- package/dist/attack/scanState.js.map +1 -0
- package/dist/attack/searchIntent.d.ts +16 -0
- package/dist/attack/searchIntent.js +57 -0
- package/dist/attack/searchIntent.js.map +1 -0
- package/dist/attack/verifyLoop.d.ts +43 -0
- package/dist/attack/verifyLoop.js +329 -15
- package/dist/attack/verifyLoop.js.map +1 -1
- package/dist/attack/workItem.d.ts +57 -0
- package/dist/attack/workItem.js +225 -0
- package/dist/attack/workItem.js.map +1 -0
- package/dist/audit/findingReviewQueue.d.ts +109 -0
- package/dist/audit/findingReviewQueue.js +335 -0
- package/dist/audit/findingReviewQueue.js.map +1 -0
- package/dist/audit/scanAuditLog.d.ts +160 -0
- package/dist/audit/scanAuditLog.js +404 -0
- package/dist/audit/scanAuditLog.js.map +1 -0
- package/dist/dependency/dependencyChecker.js +35 -9
- package/dist/dependency/dependencyChecker.js.map +1 -1
- package/dist/dependency/exploitPriority.d.ts +33 -0
- package/dist/dependency/exploitPriority.js +78 -0
- package/dist/dependency/exploitPriority.js.map +1 -0
- package/dist/dependency/finding.d.ts +16 -0
- package/dist/dependency/osvClient.js +2 -0
- package/dist/dependency/osvClient.js.map +1 -1
- package/dist/dependency/types.d.ts +12 -1
- package/dist/mcp/server.js +13 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -0
- package/dist/mcp/tools.js +127 -6
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-map/agentMemory.d.ts +83 -1
- package/dist/project-map/agentMemory.js +197 -7
- package/dist/project-map/agentMemory.js.map +1 -1
- package/dist/project-map/architectureContext.d.ts +202 -0
- package/dist/project-map/architectureContext.js +421 -0
- package/dist/project-map/architectureContext.js.map +1 -0
- package/dist/project-map/blastRadius.d.ts +54 -0
- package/dist/project-map/blastRadius.js +196 -0
- package/dist/project-map/blastRadius.js.map +1 -0
- package/dist/project-map/callGraphExtractor.d.ts +13 -0
- package/dist/project-map/callGraphExtractor.js +222 -0
- package/dist/project-map/callGraphExtractor.js.map +1 -0
- package/dist/project-map/capabilityRegistry.d.ts +46 -0
- package/dist/project-map/capabilityRegistry.js +91 -0
- package/dist/project-map/capabilityRegistry.js.map +1 -0
- package/dist/project-map/findTests.d.ts +29 -0
- package/dist/project-map/findTests.js +236 -0
- package/dist/project-map/findTests.js.map +1 -0
- package/dist/project-map/handlerInventory.d.ts +112 -0
- package/dist/project-map/handlerInventory.js +184 -0
- package/dist/project-map/handlerInventory.js.map +1 -0
- package/dist/project-map/implementationResolver.d.ts +43 -0
- package/dist/project-map/implementationResolver.js +217 -0
- package/dist/project-map/implementationResolver.js.map +1 -0
- package/dist/project-map/mapContext.d.ts +6 -1
- package/dist/project-map/mapContext.js +1 -0
- package/dist/project-map/mapContext.js.map +1 -1
- package/dist/project-map/scanCache.d.ts +57 -3
- package/dist/project-map/scanCache.js +61 -2
- package/dist/project-map/scanCache.js.map +1 -1
- package/dist/project-map/symbolIndex.d.ts +39 -0
- package/dist/project-map/symbolIndex.js +385 -0
- package/dist/project-map/symbolIndex.js.map +1 -0
- package/dist/tooling/agentEvalScoring.d.ts +77 -0
- package/dist/tooling/agentEvalScoring.js +140 -0
- package/dist/tooling/agentEvalScoring.js.map +1 -0
- package/dist/tooling/agentRegression.d.ts +53 -0
- package/dist/tooling/agentRegression.js +99 -0
- package/dist/tooling/agentRegression.js.map +1 -0
- package/dist/tools/agentScan.d.ts +69 -0
- package/dist/tools/agentScan.js +702 -43
- package/dist/tools/agentScan.js.map +1 -1
- package/dist/tools/findingReviewTools.d.ts +22 -0
- package/dist/tools/findingReviewTools.js +121 -0
- package/dist/tools/findingReviewTools.js.map +1 -0
- package/dist/tools/fix.js +1 -1
- package/dist/tools/fix.js.map +1 -1
- package/dist/tools/map.js +191 -1
- package/dist/tools/map.js.map +1 -1
- package/dist/tools/runTests.d.ts +2 -0
- package/dist/tools/runTests.js +29 -0
- package/dist/tools/runTests.js.map +1 -0
- package/dist/utils/effectMock.d.ts +1 -0
- package/dist/utils/effectMock.js +162 -0
- package/dist/utils/effectMock.js.map +1 -0
- package/dist/utils/gitContext.d.ts +26 -0
- package/dist/utils/gitContext.js +317 -0
- package/dist/utils/gitContext.js.map +1 -0
- package/dist/utils/localTestRunner.d.ts +57 -2
- package/dist/utils/localTestRunner.js +122 -101
- package/dist/utils/localTestRunner.js.map +1 -1
- package/dist/utils/runtimeDetect.d.ts +12 -2
- package/dist/utils/runtimeDetect.js +247 -10
- package/dist/utils/runtimeDetect.js.map +1 -1
- package/dist/utils/securityConfig.d.ts +17 -0
- package/dist/utils/securityConfig.js +192 -0
- package/dist/utils/securityConfig.js.map +1 -0
- package/dist/utils/testCommandPolicy.d.ts +36 -0
- package/dist/utils/testCommandPolicy.js +252 -0
- package/dist/utils/testCommandPolicy.js.map +1 -0
- package/dist/utils/testRunner.d.ts +56 -0
- package/dist/utils/testRunner.js +246 -0
- package/dist/utils/testRunner.js.map +1 -0
- package/dist/utils/testSafety.d.ts +40 -2
- package/dist/utils/testSafety.js +205 -26
- package/dist/utils/testSafety.js.map +1 -1
- package/dist/utils/verificationSandbox.d.ts +113 -0
- package/dist/utils/verificationSandbox.js +656 -0
- package/dist/utils/verificationSandbox.js.map +1 -0
- package/package.json +1 -1
|
@@ -51,15 +51,22 @@ exports.recordFalsePositive = recordFalsePositive;
|
|
|
51
51
|
exports.removeFalsePositive = removeFalsePositive;
|
|
52
52
|
exports.addKnownFact = addKnownFact;
|
|
53
53
|
exports.clearAgentMemory = clearAgentMemory;
|
|
54
|
+
exports.saveInvestigationNotes = saveInvestigationNotes;
|
|
55
|
+
exports.saveCoverageGaps = saveCoverageGaps;
|
|
56
|
+
exports.invalidateStaleEntries = invalidateStaleEntries;
|
|
57
|
+
exports.resolveMemoryEntry = resolveMemoryEntry;
|
|
54
58
|
exports.formatMemoryForPrompt = formatMemoryForPrompt;
|
|
55
59
|
const fs = __importStar(require("fs"));
|
|
56
60
|
const path = __importStar(require("path"));
|
|
57
61
|
const crypto = __importStar(require("crypto"));
|
|
58
62
|
const MEMORY_DIR = '.securecode';
|
|
59
63
|
const MEMORY_FILE = 'agent-memory.json';
|
|
60
|
-
const MEMORY_VERSION =
|
|
64
|
+
const MEMORY_VERSION = 2;
|
|
61
65
|
const MAX_FALSE_POSITIVES = 100; // cap to prevent unbounded growth
|
|
62
66
|
const MAX_KNOWN_FACTS = 50;
|
|
67
|
+
const MAX_INVESTIGATION_NOTES = 50;
|
|
68
|
+
const MAX_COVERAGE_GAPS = 30;
|
|
69
|
+
const MEMORY_TTL_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
63
70
|
// ── Path helpers ────────────────────────────────────────────────────────────
|
|
64
71
|
function memoryPath(workspaceRoot) {
|
|
65
72
|
return path.join(workspaceRoot, MEMORY_DIR, MEMORY_FILE);
|
|
@@ -79,22 +86,23 @@ function loadAgentMemory(workspaceRoot) {
|
|
|
79
86
|
const p = memoryPath(workspaceRoot);
|
|
80
87
|
try {
|
|
81
88
|
if (!fs.existsSync(p)) {
|
|
82
|
-
return { version: MEMORY_VERSION, falsePositives: [], knownFacts: [] };
|
|
89
|
+
return { version: MEMORY_VERSION, falsePositives: [], knownFacts: [], investigationNotes: [], coverageGaps: [] };
|
|
83
90
|
}
|
|
84
91
|
const raw = fs.readFileSync(p, 'utf8');
|
|
85
92
|
const data = JSON.parse(raw);
|
|
86
93
|
if (!data.version || data.version > MEMORY_VERSION) {
|
|
87
|
-
|
|
88
|
-
return { version: MEMORY_VERSION, falsePositives: [], knownFacts: [] };
|
|
94
|
+
return { version: MEMORY_VERSION, falsePositives: [], knownFacts: [], investigationNotes: [], coverageGaps: [] };
|
|
89
95
|
}
|
|
90
96
|
return {
|
|
91
97
|
version: MEMORY_VERSION,
|
|
92
98
|
falsePositives: data.falsePositives || [],
|
|
93
99
|
knownFacts: data.knownFacts || [],
|
|
100
|
+
investigationNotes: data.investigationNotes || [],
|
|
101
|
+
coverageGaps: data.coverageGaps || [],
|
|
94
102
|
};
|
|
95
103
|
}
|
|
96
104
|
catch {
|
|
97
|
-
return { version: MEMORY_VERSION, falsePositives: [], knownFacts: [] };
|
|
105
|
+
return { version: MEMORY_VERSION, falsePositives: [], knownFacts: [], investigationNotes: [], coverageGaps: [] };
|
|
98
106
|
}
|
|
99
107
|
}
|
|
100
108
|
/** Save agent memory (atomic write). */
|
|
@@ -182,7 +190,7 @@ function addKnownFact(workspaceRoot, fact, source) {
|
|
|
182
190
|
return entry;
|
|
183
191
|
}
|
|
184
192
|
/**
|
|
185
|
-
* Clear all agent memory (false positives + known facts) for a workspace.
|
|
193
|
+
* Clear all agent memory (false positives + known facts + notes + gaps) for a workspace.
|
|
186
194
|
*/
|
|
187
195
|
function clearAgentMemory(workspaceRoot) {
|
|
188
196
|
const p = memoryPath(workspaceRoot);
|
|
@@ -197,6 +205,158 @@ function clearAgentMemory(workspaceRoot) {
|
|
|
197
205
|
return false;
|
|
198
206
|
}
|
|
199
207
|
}
|
|
208
|
+
function saveInvestigationNotes(workspaceRoot, input) {
|
|
209
|
+
if (!input.notes || input.notes.length === 0)
|
|
210
|
+
return;
|
|
211
|
+
const memory = loadAgentMemory(workspaceRoot);
|
|
212
|
+
const now = new Date().toISOString();
|
|
213
|
+
for (const note of input.notes) {
|
|
214
|
+
const fileHash = input.fileHashes?.get(note.file);
|
|
215
|
+
const existingIdx = memory.investigationNotes.findIndex(n => n.file === note.file && n.title === note.title && n.status === 'open');
|
|
216
|
+
if (existingIdx >= 0) {
|
|
217
|
+
memory.investigationNotes[existingIdx].lastSeenAt = now;
|
|
218
|
+
memory.investigationNotes[existingIdx].detail = note.detail;
|
|
219
|
+
memory.investigationNotes[existingIdx].requiredEvidence = note.requiredEvidence;
|
|
220
|
+
memory.investigationNotes[existingIdx].fileHash = fileHash ?? memory.investigationNotes[existingIdx].fileHash;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
memory.investigationNotes.push({
|
|
224
|
+
id: 'note_' + crypto.randomBytes(4).toString('hex'),
|
|
225
|
+
kind: 'investigation-note',
|
|
226
|
+
title: note.title,
|
|
227
|
+
detail: note.detail,
|
|
228
|
+
file: note.file,
|
|
229
|
+
line: note.line,
|
|
230
|
+
lineEnd: note.lineEnd,
|
|
231
|
+
symbol: note.symbol,
|
|
232
|
+
verificationLevel: note.verificationLevel,
|
|
233
|
+
rootCauseId: note.rootCauseId,
|
|
234
|
+
requiredEvidence: note.requiredEvidence,
|
|
235
|
+
priority: note.priority,
|
|
236
|
+
sourceScanId: input.sourceScanId,
|
|
237
|
+
fileHash,
|
|
238
|
+
createdAt: now,
|
|
239
|
+
lastSeenAt: now,
|
|
240
|
+
status: 'open',
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
pruneExpired(memory);
|
|
244
|
+
if (memory.investigationNotes.length > MAX_INVESTIGATION_NOTES) {
|
|
245
|
+
memory.investigationNotes = memory.investigationNotes.slice(-MAX_INVESTIGATION_NOTES);
|
|
246
|
+
}
|
|
247
|
+
saveAgentMemory(workspaceRoot, memory);
|
|
248
|
+
}
|
|
249
|
+
function saveCoverageGaps(workspaceRoot, input) {
|
|
250
|
+
if (!input.gaps || input.gaps.length === 0)
|
|
251
|
+
return;
|
|
252
|
+
const memory = loadAgentMemory(workspaceRoot);
|
|
253
|
+
const now = new Date().toISOString();
|
|
254
|
+
for (const gap of input.gaps) {
|
|
255
|
+
const file = gap.file;
|
|
256
|
+
const fileHash = file ? input.fileHashes?.get(file) : undefined;
|
|
257
|
+
const existingIdx = file
|
|
258
|
+
? memory.coverageGaps.findIndex(g => g.file === file && g.title === gap.title && g.status === 'open')
|
|
259
|
+
: -1;
|
|
260
|
+
if (existingIdx >= 0) {
|
|
261
|
+
memory.coverageGaps[existingIdx].lastSeenAt = now;
|
|
262
|
+
memory.coverageGaps[existingIdx].detail = gap.detail;
|
|
263
|
+
memory.coverageGaps[existingIdx].requiredEvidence = gap.requiredEvidence;
|
|
264
|
+
memory.coverageGaps[existingIdx].fileHash = fileHash ?? memory.coverageGaps[existingIdx].fileHash;
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
memory.coverageGaps.push({
|
|
268
|
+
id: 'gap_' + crypto.randomBytes(4).toString('hex'),
|
|
269
|
+
kind: 'coverage-gap',
|
|
270
|
+
title: gap.title,
|
|
271
|
+
detail: gap.detail,
|
|
272
|
+
file,
|
|
273
|
+
line: gap.line,
|
|
274
|
+
lineEnd: gap.lineEnd,
|
|
275
|
+
symbol: gap.symbol,
|
|
276
|
+
requiredEvidence: gap.requiredEvidence,
|
|
277
|
+
suggestedNextAction: gap.suggestedNextAction,
|
|
278
|
+
priority: gap.priority,
|
|
279
|
+
sourceScanId: input.sourceScanId,
|
|
280
|
+
fileHash,
|
|
281
|
+
createdAt: now,
|
|
282
|
+
lastSeenAt: now,
|
|
283
|
+
status: 'open',
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
pruneExpired(memory);
|
|
287
|
+
if (memory.coverageGaps.length > MAX_COVERAGE_GAPS) {
|
|
288
|
+
memory.coverageGaps = memory.coverageGaps.slice(-MAX_COVERAGE_GAPS);
|
|
289
|
+
}
|
|
290
|
+
saveAgentMemory(workspaceRoot, memory);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Mark investigation notes and coverage gaps as stale when their referenced
|
|
294
|
+
* file has changed (hash mismatch). Called before a new scan starts so the
|
|
295
|
+
* agent sees accurate context.
|
|
296
|
+
*/
|
|
297
|
+
function invalidateStaleEntries(workspaceRoot, currentFileHashes) {
|
|
298
|
+
const memory = loadAgentMemory(workspaceRoot);
|
|
299
|
+
let changed = false;
|
|
300
|
+
for (const note of memory.investigationNotes) {
|
|
301
|
+
if (note.status !== 'open')
|
|
302
|
+
continue;
|
|
303
|
+
if (!note.fileHash)
|
|
304
|
+
continue;
|
|
305
|
+
const currentHash = currentFileHashes.get(note.file);
|
|
306
|
+
if (currentHash && currentHash !== note.fileHash) {
|
|
307
|
+
note.status = 'stale';
|
|
308
|
+
changed = true;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
for (const gap of memory.coverageGaps) {
|
|
312
|
+
if (gap.status !== 'open')
|
|
313
|
+
continue;
|
|
314
|
+
if (!gap.fileHash || !gap.file)
|
|
315
|
+
continue;
|
|
316
|
+
const currentHash = currentFileHashes.get(gap.file);
|
|
317
|
+
if (currentHash && currentHash !== gap.fileHash) {
|
|
318
|
+
gap.status = 'stale';
|
|
319
|
+
changed = true;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (changed) {
|
|
323
|
+
pruneExpired(memory);
|
|
324
|
+
saveAgentMemory(workspaceRoot, memory);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Mark a note or gap as resolved (the concern was addressed in a later scan).
|
|
329
|
+
*/
|
|
330
|
+
function resolveMemoryEntry(workspaceRoot, entryId) {
|
|
331
|
+
const memory = loadAgentMemory(workspaceRoot);
|
|
332
|
+
let found = false;
|
|
333
|
+
for (const note of memory.investigationNotes) {
|
|
334
|
+
if (note.id === entryId) {
|
|
335
|
+
note.status = 'resolved';
|
|
336
|
+
found = true;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
for (const gap of memory.coverageGaps) {
|
|
340
|
+
if (gap.id === entryId) {
|
|
341
|
+
gap.status = 'resolved';
|
|
342
|
+
found = true;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (found)
|
|
346
|
+
saveAgentMemory(workspaceRoot, memory);
|
|
347
|
+
return found;
|
|
348
|
+
}
|
|
349
|
+
function pruneExpired(memory) {
|
|
350
|
+
const now = Date.now();
|
|
351
|
+
memory.investigationNotes = memory.investigationNotes.filter(n => {
|
|
352
|
+
const age = now - new Date(n.lastSeenAt).getTime();
|
|
353
|
+
return age < MEMORY_TTL_MS;
|
|
354
|
+
});
|
|
355
|
+
memory.coverageGaps = memory.coverageGaps.filter(g => {
|
|
356
|
+
const age = now - new Date(g.lastSeenAt).getTime();
|
|
357
|
+
return age < MEMORY_TTL_MS;
|
|
358
|
+
});
|
|
359
|
+
}
|
|
200
360
|
// ── Prompt formatting ───────────────────────────────────────────────────────
|
|
201
361
|
/**
|
|
202
362
|
* Format agent memory into a string block for injection into the agent's
|
|
@@ -205,7 +365,11 @@ function clearAgentMemory(workspaceRoot) {
|
|
|
205
365
|
function formatMemoryForPrompt(memory) {
|
|
206
366
|
const hasFps = memory.falsePositives.length > 0;
|
|
207
367
|
const hasFacts = memory.knownFacts.length > 0;
|
|
208
|
-
|
|
368
|
+
const openNotes = memory.investigationNotes.filter(n => n.status === 'open');
|
|
369
|
+
const openGaps = memory.coverageGaps.filter(g => g.status === 'open');
|
|
370
|
+
const staleNotes = memory.investigationNotes.filter(n => n.status === 'stale');
|
|
371
|
+
const staleGaps = memory.coverageGaps.filter(g => g.status === 'stale');
|
|
372
|
+
if (!hasFps && !hasFacts && openNotes.length === 0 && openGaps.length === 0 && staleNotes.length === 0 && staleGaps.length === 0)
|
|
209
373
|
return '';
|
|
210
374
|
const lines = ['Workspace memory (from previous scans in this workspace):'];
|
|
211
375
|
if (hasFps) {
|
|
@@ -225,6 +389,32 @@ function formatMemoryForPrompt(memory) {
|
|
|
225
389
|
lines.push(` ${i + 1}. ${f.fact} (source: ${f.source})`);
|
|
226
390
|
});
|
|
227
391
|
}
|
|
392
|
+
if (openNotes.length > 0) {
|
|
393
|
+
lines.push('', `Prior unresolved investigation notes — re-check against current code, do NOT assume they are still valid (${openNotes.length}):`);
|
|
394
|
+
openNotes.forEach((n, i) => {
|
|
395
|
+
lines.push(` ${i + 1}. [${n.priority}] ${n.title}`);
|
|
396
|
+
lines.push(` ${n.detail}`);
|
|
397
|
+
if (n.file)
|
|
398
|
+
lines.push(` File: ${n.file}${n.line ? `:${n.line}` : ''}`);
|
|
399
|
+
if (n.requiredEvidence.length > 0)
|
|
400
|
+
lines.push(` Still needed: ${n.requiredEvidence.join('; ')}`);
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
if (openGaps.length > 0) {
|
|
404
|
+
lines.push('', `Prior coverage gaps — investigate these if the target file is related (${openGaps.length}):`);
|
|
405
|
+
openGaps.forEach((g, i) => {
|
|
406
|
+
lines.push(` ${i + 1}. [${g.priority}] ${g.title}`);
|
|
407
|
+
lines.push(` ${g.detail}`);
|
|
408
|
+
if (g.file)
|
|
409
|
+
lines.push(` File: ${g.file}${g.line ? `:${g.line}` : ''}`);
|
|
410
|
+
lines.push(` Next action: ${g.suggestedNextAction}`);
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
if (staleNotes.length > 0 || staleGaps.length > 0) {
|
|
414
|
+
lines.push('', `Stale entries (file changed since last scan — re-investigate from scratch):`);
|
|
415
|
+
staleNotes.forEach(n => lines.push(` - [note] ${n.title} (${n.file})`));
|
|
416
|
+
staleGaps.forEach(g => lines.push(` - [gap] ${g.title} (${g.file || 'unknown'})`));
|
|
417
|
+
}
|
|
228
418
|
return lines.join('\n');
|
|
229
419
|
}
|
|
230
420
|
//# sourceMappingURL=agentMemory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentMemory.js","sourceRoot":"","sources":["../../src/project-map/agentMemory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agentMemory.js","sourceRoot":"","sources":["../../src/project-map/agentMemory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architecture context — the structured output of the architecture scout
|
|
3
|
+
* subagent and the cached input to later agent-scan runs.
|
|
4
|
+
*
|
|
5
|
+
* The architecture scout is triggered by `securecode.map action:architecture`.
|
|
6
|
+
* It consumes the deterministic project map (endpoints, imports, call graph,
|
|
7
|
+
* config, deps) plus a bounded set of file reads, and produces this context:
|
|
8
|
+
* - project type / frameworks / runtimes / package manager
|
|
9
|
+
* - ranked important files (entrypoints, auth, data, config, security controls)
|
|
10
|
+
* - trust boundaries (where untrusted input enters)
|
|
11
|
+
* - data-flow summaries (source → sink across the architecture)
|
|
12
|
+
* - security controls in place (and what's missing)
|
|
13
|
+
* - architecture-level risks
|
|
14
|
+
* - recommended scan order (which files to scan first)
|
|
15
|
+
*
|
|
16
|
+
* Cache lives at `.securecode/architecture-context.json`. Invalidates when:
|
|
17
|
+
* - the project map is rebuilt (builtAt changes)
|
|
18
|
+
* - the project map schema version changes
|
|
19
|
+
* - the requested depth differs (quick/standard/deep produce different ctx)
|
|
20
|
+
* - ARCHITECTURE_CONTEXT_VERSION bumps (prompt/logic change)
|
|
21
|
+
* - 7-day TTL
|
|
22
|
+
*
|
|
23
|
+
* agent-scan auto-loads a cached architecture context (if present and valid)
|
|
24
|
+
* and passes it into the agent target so the vulnerability investigator starts
|
|
25
|
+
* with project-wide context instead of having to discover it from scratch.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Bump when the architecture scout prompt or logic changes in a way that
|
|
29
|
+
* would produce a different context for the same project. All cached
|
|
30
|
+
* entries with an older version are invalidated.
|
|
31
|
+
*/
|
|
32
|
+
export declare const ARCHITECTURE_CONTEXT_VERSION = 1;
|
|
33
|
+
export type ArchitectureDepth = 'quick' | 'standard' | 'deep';
|
|
34
|
+
export type FileRole = 'entrypoint' | 'route_handler' | 'middleware' | 'authentication' | 'authorization' | 'data_access' | 'validation' | 'security_config' | 'config' | 'service' | 'repository' | 'model' | 'migration' | 'external_integration' | 'shared_helper' | 'dynamic_loader' | 'test' | 'dependency_manifest' | 'other';
|
|
35
|
+
export interface ImportantFile {
|
|
36
|
+
/** Workspace-relative path. */
|
|
37
|
+
file: string;
|
|
38
|
+
role: FileRole;
|
|
39
|
+
/** 0-100 importance. Higher = more security-critical. */
|
|
40
|
+
importance: number;
|
|
41
|
+
/** Why this file matters (1-3 short reasons). */
|
|
42
|
+
reasons: string[];
|
|
43
|
+
/** Functions/symbols in this file that are security-relevant, if known. */
|
|
44
|
+
keySymbols?: string[];
|
|
45
|
+
}
|
|
46
|
+
export interface TrustBoundary {
|
|
47
|
+
/** Where untrusted input enters (file:line or route path). */
|
|
48
|
+
entry: string;
|
|
49
|
+
/** What kind of input (HTTP body, query, cookie, file upload, WebSocket, CLI arg, env). */
|
|
50
|
+
inputType: string;
|
|
51
|
+
/** What validates/sanitizes it, if anything. */
|
|
52
|
+
guard: string | null;
|
|
53
|
+
}
|
|
54
|
+
export interface DataFlowSummary {
|
|
55
|
+
/** Short label, e.g. "user input → SQL query" or "cookie → session lookup". */
|
|
56
|
+
label: string;
|
|
57
|
+
/** Files the flow passes through, in order. */
|
|
58
|
+
path: string[];
|
|
59
|
+
/** Whether a guard is present at the sink. */
|
|
60
|
+
guarded: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface SecurityControl {
|
|
63
|
+
/** What control this is (auth, authorization, rate_limit, cors, csp, headers, input_validation, output_encoding, secrets_management). */
|
|
64
|
+
kind: string;
|
|
65
|
+
/** Where it's implemented (file or file:line). */
|
|
66
|
+
location: string;
|
|
67
|
+
/** Whether it covers the whole app or is partial. */
|
|
68
|
+
coverage: 'full' | 'partial' | 'unknown';
|
|
69
|
+
/** Notes on gaps, if any. */
|
|
70
|
+
notes?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface ArchitectureRisk {
|
|
73
|
+
/** Short label. */
|
|
74
|
+
title: string;
|
|
75
|
+
/** Why it's a risk, in 1-2 sentences. */
|
|
76
|
+
description: string;
|
|
77
|
+
/** Files involved. */
|
|
78
|
+
files: string[];
|
|
79
|
+
/** Severity for triage purposes (not a vulnerability finding — an architecture-level concern). */
|
|
80
|
+
severity: 'high' | 'medium' | 'low';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* An investigation task derived from an architecture risk. Tasks are tracked
|
|
84
|
+
* by the InvestigationState and must be resolved (investigated, verified,
|
|
85
|
+
* unproven, or blocked) before the scan finishes. Unresolved tasks appear
|
|
86
|
+
* as coverage gaps in the final result.
|
|
87
|
+
*/
|
|
88
|
+
export interface InvestigationTask {
|
|
89
|
+
id: string;
|
|
90
|
+
targetFiles: string[];
|
|
91
|
+
claim: string;
|
|
92
|
+
requiredTools: string[];
|
|
93
|
+
requiredEvidence: string[];
|
|
94
|
+
status: 'pending' | 'investigated' | 'verified' | 'refuted' | 'unproven' | 'blocked';
|
|
95
|
+
entryFiles?: string[];
|
|
96
|
+
relatedFiles?: string[];
|
|
97
|
+
sourceSymbols?: string[];
|
|
98
|
+
sinkSymbols?: string[];
|
|
99
|
+
requiredProofDimensions?: string[];
|
|
100
|
+
}
|
|
101
|
+
export interface ArchitectureContext {
|
|
102
|
+
/** Schema version of this context (for cache invalidation). */
|
|
103
|
+
version: number;
|
|
104
|
+
/** Depth that produced this context. */
|
|
105
|
+
depth: ArchitectureDepth;
|
|
106
|
+
/** When the context was derived (ms epoch). */
|
|
107
|
+
derivedAt: number;
|
|
108
|
+
/** Project map builtAt when this was derived (invalidates on map rebuild). */
|
|
109
|
+
projectMapBuiltAt: number;
|
|
110
|
+
/** Project map schema version when this was derived. */
|
|
111
|
+
projectMapVersion: number;
|
|
112
|
+
project: {
|
|
113
|
+
type: string;
|
|
114
|
+
frameworks: string[];
|
|
115
|
+
runtimes: string[];
|
|
116
|
+
packageManager: string | null;
|
|
117
|
+
languages: string[];
|
|
118
|
+
};
|
|
119
|
+
importantFiles: ImportantFile[];
|
|
120
|
+
trustBoundaries: TrustBoundary[];
|
|
121
|
+
dataFlows: DataFlowSummary[];
|
|
122
|
+
securityControls: SecurityControl[];
|
|
123
|
+
architectureRisks: ArchitectureRisk[];
|
|
124
|
+
/** Files to scan first, in priority order (paths only). */
|
|
125
|
+
recommendedScanOrder: string[];
|
|
126
|
+
/** One-paragraph architecture summary for prompts. */
|
|
127
|
+
summary: string;
|
|
128
|
+
/** Scout's self-assessment of completeness. */
|
|
129
|
+
completeness: 'full' | 'partial' | 'failed';
|
|
130
|
+
/** What the scout couldn't cover, if partial/failed. */
|
|
131
|
+
gaps?: string[];
|
|
132
|
+
}
|
|
133
|
+
interface ArchitectureCacheEntry {
|
|
134
|
+
context: ArchitectureContext;
|
|
135
|
+
storedAt: number;
|
|
136
|
+
}
|
|
137
|
+
interface ArchitectureCacheData {
|
|
138
|
+
version: number;
|
|
139
|
+
/** Keyed by depth — quick/standard/deep produce different contexts. */
|
|
140
|
+
entries: Partial<Record<ArchitectureDepth, ArchitectureCacheEntry>>;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Read the architecture cache. Returns null if the file doesn't exist,
|
|
144
|
+
* is corrupt, or is a forward-incompatible version.
|
|
145
|
+
*/
|
|
146
|
+
export declare function readArchitectureCache(workspaceRoot: string): ArchitectureCacheData | null;
|
|
147
|
+
/**
|
|
148
|
+
* Look up a cached architecture context by depth.
|
|
149
|
+
* Returns null if not found, expired, or stale (project map changed).
|
|
150
|
+
*
|
|
151
|
+
* Stale check: the caller passes the CURRENT project map's builtAt + version.
|
|
152
|
+
* If the cached entry was derived against a different map, it's invalid —
|
|
153
|
+
* the architecture may have changed.
|
|
154
|
+
*/
|
|
155
|
+
export declare function getCachedArchitectureContext(workspaceRoot: string, depth: ArchitectureDepth, currentMapBuiltAt: number, currentMapVersion: number): ArchitectureContext | null;
|
|
156
|
+
/**
|
|
157
|
+
* Write an architecture context to the cache, keyed by depth.
|
|
158
|
+
*/
|
|
159
|
+
export declare function writeCachedArchitectureContext(workspaceRoot: string, context: ArchitectureContext): void;
|
|
160
|
+
/**
|
|
161
|
+
* Clear the architecture cache for a workspace (e.g., when the user requests
|
|
162
|
+
* a fresh derivation with --no-cache).
|
|
163
|
+
*/
|
|
164
|
+
export declare function clearArchitectureCache(workspaceRoot: string): void;
|
|
165
|
+
/**
|
|
166
|
+
* Format an architecture context into a compact string for injection into
|
|
167
|
+
* the agent-scan target prompt. Returns empty string if context is empty.
|
|
168
|
+
*
|
|
169
|
+
* This is what the vulnerability investigator sees at the start of a scan —
|
|
170
|
+
* a distilled view of the project's architecture so it doesn't have to
|
|
171
|
+
* re-discover "where is auth?", "what's the data layer?", "what are the
|
|
172
|
+
* entrypoints?" from scratch.
|
|
173
|
+
*/
|
|
174
|
+
export declare function formatArchitectureContextForPrompt(ctx: ArchitectureContext): string;
|
|
175
|
+
/**
|
|
176
|
+
* Extract architecture risks that are relevant to a specific target file and
|
|
177
|
+
* format them as explicit investigation tasks the agent must address.
|
|
178
|
+
*
|
|
179
|
+
* A risk is relevant if:
|
|
180
|
+
* - The target file is listed in the risk's files[]
|
|
181
|
+
* - The target file's path is a substring of any file in the risk's files[]
|
|
182
|
+
* - The risk has no specific files (project-wide)
|
|
183
|
+
*
|
|
184
|
+
* Each task tells the agent:
|
|
185
|
+
* - What the risk is
|
|
186
|
+
* - Which evidence is needed to resolve it
|
|
187
|
+
* - What tool to use
|
|
188
|
+
* - That unresolved risks must go in coverageGaps[]
|
|
189
|
+
*/
|
|
190
|
+
export declare function formatArchitectureRiskTasksForTarget(ctx: ArchitectureContext, targetFilePath: string): string;
|
|
191
|
+
/**
|
|
192
|
+
* Convert architecture risks relevant to a target file into structured
|
|
193
|
+
* InvestigationTask objects. Each task tracks its own status and must be
|
|
194
|
+
* resolved before the scan finishes.
|
|
195
|
+
*
|
|
196
|
+
* A risk is relevant if:
|
|
197
|
+
* - The target file is listed in the risk's files[]
|
|
198
|
+
* - The target file's path is a substring of any file in the risk's files[]
|
|
199
|
+
* - The risk has no specific files (project-wide)
|
|
200
|
+
*/
|
|
201
|
+
export declare function createInvestigationTasksFromRisks(ctx: ArchitectureContext | undefined, targetFilePath: string): InvestigationTask[];
|
|
202
|
+
export {};
|