@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
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Implementation resolver — generic interface-to-implementation redirection.
|
|
4
|
+
*
|
|
5
|
+
* When the agent scans an interface, type declaration, or service contract,
|
|
6
|
+
* the resolver finds the actual implementation files and symbols so the
|
|
7
|
+
* investigation can continue on real code, not signatures.
|
|
8
|
+
*
|
|
9
|
+
* Matching strategies (all generic, no project-specific logic):
|
|
10
|
+
* - TypeScript interface → classes that implement it
|
|
11
|
+
* - Effect service declaration → live layer implementations
|
|
12
|
+
* - Abstract classes → subclasses
|
|
13
|
+
* - Exported type → functions returning the type
|
|
14
|
+
* - Route contracts → handler registrations
|
|
15
|
+
* - Python protocols/abstract classes → implementations (when symbol data supports it)
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.resolveImplementation = resolveImplementation;
|
|
19
|
+
exports.formatImplementationResolution = formatImplementationResolution;
|
|
20
|
+
exports.looksLikeContractOnly = looksLikeContractOnly;
|
|
21
|
+
const searchCode_1 = require("../utils/searchCode");
|
|
22
|
+
const symbolIndex_1 = require("./symbolIndex");
|
|
23
|
+
/**
|
|
24
|
+
* Resolve implementations for a symbol in a contract/interface file.
|
|
25
|
+
*
|
|
26
|
+
* This is a generic search — it uses workspace-wide code search to find
|
|
27
|
+
* patterns that indicate implementation of the given symbol.
|
|
28
|
+
*/
|
|
29
|
+
async function resolveImplementation(workspaceRoot, filePath, symbol) {
|
|
30
|
+
const contractLocations = [];
|
|
31
|
+
const implementationLocations = [];
|
|
32
|
+
const callSites = [];
|
|
33
|
+
// Strategy 1: Search for the symbol as a class/interface name being
|
|
34
|
+
// implemented or extended (TypeScript: implements, extends)
|
|
35
|
+
const implPatterns = [
|
|
36
|
+
`implements\\s+${escapeRegex(symbol)}\\b`,
|
|
37
|
+
`extends\\s+${escapeRegex(symbol)}\\b`,
|
|
38
|
+
`:\\s+${escapeRegex(symbol)}\\s*\\{`,
|
|
39
|
+
`Layer\\.(effect|set)\\s*\\(\\s*["']${escapeRegex(symbol)}["']`,
|
|
40
|
+
`Context\\.(Function|Service)\\s*\\(\\s*["']${escapeRegex(symbol)}["']`,
|
|
41
|
+
];
|
|
42
|
+
for (const pattern of implPatterns) {
|
|
43
|
+
const results = await (0, searchCode_1.searchCode)(workspaceRoot, pattern, '*.ts');
|
|
44
|
+
for (const hit of results.hits) {
|
|
45
|
+
implementationLocations.push({
|
|
46
|
+
filePath: hit.path,
|
|
47
|
+
line: hit.line,
|
|
48
|
+
symbol: extractSymbolFromLine(hit.text, symbol),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Strategy 2: Search for "make" + symbol (common Effect pattern: makeServerAuth)
|
|
53
|
+
const makePattern = `make${escapeRegex(symbol)}`;
|
|
54
|
+
const makeResults = await (0, searchCode_1.searchCode)(workspaceRoot, makePattern, '*.ts');
|
|
55
|
+
for (const hit of makeResults.hits) {
|
|
56
|
+
// Avoid the contract file itself
|
|
57
|
+
if (!sameFile(hit.path, filePath)) {
|
|
58
|
+
implementationLocations.push({
|
|
59
|
+
filePath: hit.path,
|
|
60
|
+
line: hit.line,
|
|
61
|
+
symbol: `make${symbol}`,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Strategy 3: Find references (call sites) using the symbol index
|
|
66
|
+
try {
|
|
67
|
+
const refsText = await (0, symbolIndex_1.findReferences)(workspaceRoot, filePath, symbol);
|
|
68
|
+
const refLines = refsText.split('\n');
|
|
69
|
+
for (const line of refLines) {
|
|
70
|
+
const match = line.match(/^\s+(\S+):(\d+)/);
|
|
71
|
+
if (match) {
|
|
72
|
+
callSites.push({
|
|
73
|
+
filePath: match[1],
|
|
74
|
+
line: parseInt(match[2], 10),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Best effort — references are optional
|
|
81
|
+
}
|
|
82
|
+
// Strategy 4: Find the definition (contract location)
|
|
83
|
+
try {
|
|
84
|
+
const defText = await (0, symbolIndex_1.findDefinition)(workspaceRoot, filePath, symbol);
|
|
85
|
+
const defLines = defText.split('\n');
|
|
86
|
+
for (const line of defLines) {
|
|
87
|
+
const match = line.match(/^\s+(\S+):(\d+)/);
|
|
88
|
+
if (match) {
|
|
89
|
+
contractLocations.push({
|
|
90
|
+
filePath: match[1],
|
|
91
|
+
line: parseInt(match[2], 10),
|
|
92
|
+
symbol,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Best effort
|
|
99
|
+
}
|
|
100
|
+
// Deduplicate implementation locations
|
|
101
|
+
const unique = deduplicateLocations(implementationLocations);
|
|
102
|
+
return {
|
|
103
|
+
contractLocations,
|
|
104
|
+
implementationLocations: unique,
|
|
105
|
+
callSites: deduplicateLocations(callSites),
|
|
106
|
+
unresolved: unique.length === 0,
|
|
107
|
+
description: unique.length > 0
|
|
108
|
+
? `Found ${unique.length} implementation(s) for ${symbol}`
|
|
109
|
+
: `No implementations found for ${symbol}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Format an implementation resolution for the agent transcript.
|
|
114
|
+
*/
|
|
115
|
+
function formatImplementationResolution(resolution) {
|
|
116
|
+
const lines = [];
|
|
117
|
+
if (resolution.unresolved) {
|
|
118
|
+
lines.push(`No implementations found. The target may be a contract-only file.`);
|
|
119
|
+
lines.push('');
|
|
120
|
+
lines.push('Consider:');
|
|
121
|
+
lines.push(' - Searching for functions that return or produce this type');
|
|
122
|
+
lines.push(' - Checking if the file is a type-only export');
|
|
123
|
+
lines.push(' - Looking for runtime registration or dependency injection');
|
|
124
|
+
return lines.join('\n');
|
|
125
|
+
}
|
|
126
|
+
lines.push(`Implementation resolution (${resolution.implementationLocations.length} location(s)):`);
|
|
127
|
+
for (const loc of resolution.implementationLocations) {
|
|
128
|
+
lines.push(` ${loc.filePath}:${loc.line}${loc.symbol ? ` (${loc.symbol})` : ''}`);
|
|
129
|
+
}
|
|
130
|
+
if (resolution.callSites.length > 0) {
|
|
131
|
+
lines.push('');
|
|
132
|
+
lines.push(`Call sites (${resolution.callSites.length}):`);
|
|
133
|
+
for (const loc of resolution.callSites.slice(0, 10)) {
|
|
134
|
+
lines.push(` ${loc.filePath}:${loc.line}`);
|
|
135
|
+
}
|
|
136
|
+
if (resolution.callSites.length > 10) {
|
|
137
|
+
lines.push(` ... and ${resolution.callSites.length - 10} more`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return lines.join('\n');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check if a file looks like a contract/interface/type declaration only
|
|
144
|
+
* (has no runtime implementation). Generic heuristic, not project-specific.
|
|
145
|
+
*/
|
|
146
|
+
function looksLikeContractOnly(content) {
|
|
147
|
+
const lines = content.split('\n');
|
|
148
|
+
let typeDeclarations = 0;
|
|
149
|
+
let runtimeCode = 0;
|
|
150
|
+
for (const line of lines) {
|
|
151
|
+
const trimmed = line.trim();
|
|
152
|
+
if (!trimmed || trimmed.startsWith('//') || trimmed.startsWith('*'))
|
|
153
|
+
continue;
|
|
154
|
+
// Type/interface declarations
|
|
155
|
+
if (/^(export\s+)?(interface|type|abstract\s+class)\s/.test(trimmed)) {
|
|
156
|
+
typeDeclarations++;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// Effect service/context declarations (contract-like)
|
|
160
|
+
if (/^(export\s+)?(const|class)\s+\w+\s*=\s*(Context|Service)\.(Function|Service)\(/.test(trimmed)) {
|
|
161
|
+
typeDeclarations++;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// Function/class implementations (runtime code)
|
|
165
|
+
if (/^(export\s+)?(async\s+)?function\s+\w+/.test(trimmed) ||
|
|
166
|
+
/^(export\s+)?(const|let|var)\s+\w+\s*=\s*(async\s*)?\(/.test(trimmed) ||
|
|
167
|
+
/^(export\s+)?class\s+\w+\s*(implements|extends)/.test(trimmed)) {
|
|
168
|
+
// Exclude Effect service declarations (contract-like, not implementations)
|
|
169
|
+
if (/extends\s+Service\.Service/.test(trimmed)) {
|
|
170
|
+
typeDeclarations++;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
runtimeCode++;
|
|
174
|
+
}
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
// Layer implementations (runtime)
|
|
178
|
+
if (/^(export\s+)?const\s+\w+\s*=\s*Layer\.(effect|set|succeed|fail)/.test(trimmed)) {
|
|
179
|
+
runtimeCode++;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Contract-only if there are type declarations but no runtime code
|
|
184
|
+
return typeDeclarations > 0 && runtimeCode === 0;
|
|
185
|
+
}
|
|
186
|
+
function escapeRegex(s) {
|
|
187
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
188
|
+
}
|
|
189
|
+
function sameFile(a, b) {
|
|
190
|
+
return a.replace(/\\/g, '/').toLowerCase() === b.replace(/\\/g, '/').toLowerCase();
|
|
191
|
+
}
|
|
192
|
+
function extractSymbolFromLine(text, contractSymbol) {
|
|
193
|
+
// Try to extract the implementing class/function name
|
|
194
|
+
const classMatch = text.match(/class\s+(\w+)/);
|
|
195
|
+
if (classMatch)
|
|
196
|
+
return classMatch[1];
|
|
197
|
+
const funcMatch = text.match(/function\s+(\w+)/);
|
|
198
|
+
if (funcMatch)
|
|
199
|
+
return funcMatch[1];
|
|
200
|
+
const constMatch = text.match(/(?:const|let|var)\s+(\w+)/);
|
|
201
|
+
if (constMatch)
|
|
202
|
+
return constMatch[1];
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
function deduplicateLocations(locs) {
|
|
206
|
+
const seen = new Set();
|
|
207
|
+
const result = [];
|
|
208
|
+
for (const loc of locs) {
|
|
209
|
+
const key = `${loc.filePath}:${loc.line}`;
|
|
210
|
+
if (!seen.has(key)) {
|
|
211
|
+
seen.add(key);
|
|
212
|
+
result.push(loc);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=implementationResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implementationResolver.js","sourceRoot":"","sources":["../../src/project-map/implementationResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import { type EndpointContext, type RelatedFile } from './types';
|
|
1
|
+
import { type EndpointContext, type ProjectMap, type RelatedFile } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Get the project map — from cache if available, or build + cache if not.
|
|
4
|
+
* Returns null on any failure (best-effort).
|
|
5
|
+
*/
|
|
6
|
+
export declare function getMap(workspaceRoot: string): Promise<ProjectMap | null>;
|
|
2
7
|
/**
|
|
3
8
|
* Get the EndpointContext for every endpoint in the given file.
|
|
4
9
|
* Returns [] if the file isn't in the map (no endpoints or map unavailable).
|
|
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getMap = getMap;
|
|
36
37
|
exports.getEndpointContextForFile = getEndpointContextForFile;
|
|
37
38
|
exports.getRelatedFilesForFile = getRelatedFilesForFile;
|
|
38
39
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapContext.js","sourceRoot":"","sources":["../../src/project-map/mapContext.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"mapContext.js","sourceRoot":"","sources":["../../src/project-map/mapContext.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,wBAWC;AAMD,8DAYC;AAMD,wDAQC;AA/DD;;;;;;;;;GASG;AACH,2CAA6B;AAC7B,mCAAgD;AAChD,6CAA+C;AAC/C,iDAAqD;AACrD,mCAAqG;AAErG;;;GAGG;AACI,KAAK,UAAU,MAAM,CAAC,aAAqB;IAC9C,IAAI,GAAG,GAAG,IAAA,iBAAS,EAAC,aAAa,CAAC,CAAC;IACnC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAe,EAAC,EAAE,aAAa,EAAE,CAAC,CAAC;QACxD,IAAA,kBAAU,EAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,yBAAyB,CAC3C,QAAgB,EAChB,aAAqB;IAErB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,OAAO,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,yBAAiB,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,sBAAsB,CACxC,QAAgB,EAChB,aAAqB;IAErB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,OAAO,IAAA,kCAAmB,EAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -14,8 +14,16 @@
|
|
|
14
14
|
* Bump this when the agent scan prompt or logic changes in a way that
|
|
15
15
|
* would produce different findings for the same file. All cached entries
|
|
16
16
|
* with an older version are invalidated.
|
|
17
|
+
*
|
|
18
|
+
* v22 → v23: Architecture scout context integration.
|
|
19
|
+
* v23 → v24: Added fix re-verification (fixVerification field, new fixStatus
|
|
20
|
+
* values) + human review queue (reviewStatus, reviewId fields). Cached
|
|
21
|
+
* findings from v23 lack these fields and must be re-scanned.
|
|
22
|
+
* v24 → v25: Precision evidence model — investigationNotes, coverageGaps,
|
|
23
|
+
* evidenceChain, rootCause, verificationLevel on findings. Cached results
|
|
24
|
+
* from v24 lack these fields and must be re-scanned.
|
|
17
25
|
*/
|
|
18
|
-
export declare const AGENT_SCAN_CACHE_VERSION =
|
|
26
|
+
export declare const AGENT_SCAN_CACHE_VERSION = 31;
|
|
19
27
|
export interface ScanCacheEntry {
|
|
20
28
|
/** SHA-256 of the file content at scan time. */
|
|
21
29
|
fileHash: string;
|
|
@@ -25,16 +33,30 @@ export interface ScanCacheEntry {
|
|
|
25
33
|
timestamp: number;
|
|
26
34
|
/** The findings from the scan. */
|
|
27
35
|
findings: any[];
|
|
36
|
+
/** Investigated but unproven concerns. */
|
|
37
|
+
investigationNotes?: any[];
|
|
38
|
+
/** Areas that were not sufficiently investigated. */
|
|
39
|
+
coverageGaps?: any[];
|
|
28
40
|
/** Scan status (completed, capped, etc.). */
|
|
29
41
|
status: string;
|
|
30
42
|
/** Summary from the agent. */
|
|
31
43
|
summary?: string;
|
|
32
44
|
/** Steps used by the agent. */
|
|
33
45
|
stepsUsed: number;
|
|
34
|
-
|
|
46
|
+
stepsGranted?: number;
|
|
47
|
+
extensionsGranted?: number;
|
|
35
48
|
costSpentUsd: number;
|
|
36
49
|
/** File path (for debugging). */
|
|
37
50
|
filePath: string;
|
|
51
|
+
/**
|
|
52
|
+
* SHA-256 fingerprint of the agent-memory false-positive list at scan
|
|
53
|
+
* time. If the current memory fingerprint differs, the cache hit must
|
|
54
|
+
* be filtered through the current memory before returning (see
|
|
55
|
+
* filterCachedFindingsAgainstMemory). Pre-fix entries have no
|
|
56
|
+
* memoryHash and are treated as "memory state unknown" — filtered
|
|
57
|
+
* unconditionally with current memory.
|
|
58
|
+
*/
|
|
59
|
+
memoryHash?: string;
|
|
38
60
|
}
|
|
39
61
|
export interface ScanCacheData {
|
|
40
62
|
version: number;
|
|
@@ -55,11 +77,43 @@ export declare function getCachedScan(workspaceRoot: string, filePath: string, c
|
|
|
55
77
|
*/
|
|
56
78
|
export declare function writeCachedScan(workspaceRoot: string, filePath: string, content: string, result: {
|
|
57
79
|
findings: any[];
|
|
80
|
+
investigationNotes?: any[];
|
|
81
|
+
coverageGaps?: any[];
|
|
58
82
|
status: string;
|
|
59
83
|
summary?: string;
|
|
60
84
|
stepsUsed: number;
|
|
85
|
+
stepsGranted?: number;
|
|
86
|
+
extensionsGranted?: number;
|
|
61
87
|
costSpentUsd: number;
|
|
62
|
-
}): void;
|
|
88
|
+
}, memoryHash?: string): void;
|
|
89
|
+
/**
|
|
90
|
+
* Compute a deterministic fingerprint of the agent-memory false-positive
|
|
91
|
+
* list. Used as part of the cache key so changes to dismissed findings
|
|
92
|
+
* invalidate (or filter) cached scan results.
|
|
93
|
+
*
|
|
94
|
+
* Only false positives are part of the fingerprint — known facts help the
|
|
95
|
+
* agent investigate faster but don't change which findings are legitimately
|
|
96
|
+
* reportable. The fingerprint is a sha256 over `findingType|evidenceHash`
|
|
97
|
+
* pairs, sorted for stability.
|
|
98
|
+
*/
|
|
99
|
+
export declare function computeMemoryFingerprint(falsePositives: Array<{
|
|
100
|
+
findingType: string;
|
|
101
|
+
evidenceHash: string;
|
|
102
|
+
}>): string;
|
|
103
|
+
/**
|
|
104
|
+
* Filter a list of cached findings against current agent memory.
|
|
105
|
+
* Drops any finding whose (findingType, evidence-hash-prefix) matches a
|
|
106
|
+
* dismissed false positive. The evidence hash here is a prefix of the
|
|
107
|
+
* full sha256 — we don't have the original evidence string in memory after
|
|
108
|
+
* a reload, only the stored hash, so we match on the hash alone (which is
|
|
109
|
+
* already content-derived).
|
|
110
|
+
*
|
|
111
|
+
* Returns the filtered list. Does NOT mutate the input.
|
|
112
|
+
*/
|
|
113
|
+
export declare function filterCachedFindingsAgainstMemory(findings: any[], falsePositives: Array<{
|
|
114
|
+
findingType: string;
|
|
115
|
+
evidenceHash: string;
|
|
116
|
+
}>): any[];
|
|
63
117
|
/**
|
|
64
118
|
* Clear the scan cache for a workspace (e.g., when the user requests
|
|
65
119
|
* a fresh scan with --no-cache).
|
|
@@ -49,6 +49,8 @@ exports.AGENT_SCAN_CACHE_VERSION = void 0;
|
|
|
49
49
|
exports.readScanCache = readScanCache;
|
|
50
50
|
exports.getCachedScan = getCachedScan;
|
|
51
51
|
exports.writeCachedScan = writeCachedScan;
|
|
52
|
+
exports.computeMemoryFingerprint = computeMemoryFingerprint;
|
|
53
|
+
exports.filterCachedFindingsAgainstMemory = filterCachedFindingsAgainstMemory;
|
|
52
54
|
exports.clearScanCache = clearScanCache;
|
|
53
55
|
const fs = __importStar(require("fs"));
|
|
54
56
|
const path = __importStar(require("path"));
|
|
@@ -59,8 +61,16 @@ const CACHE_FILE = 'scan-cache.json';
|
|
|
59
61
|
* Bump this when the agent scan prompt or logic changes in a way that
|
|
60
62
|
* would produce different findings for the same file. All cached entries
|
|
61
63
|
* with an older version are invalidated.
|
|
64
|
+
*
|
|
65
|
+
* v22 → v23: Architecture scout context integration.
|
|
66
|
+
* v23 → v24: Added fix re-verification (fixVerification field, new fixStatus
|
|
67
|
+
* values) + human review queue (reviewStatus, reviewId fields). Cached
|
|
68
|
+
* findings from v23 lack these fields and must be re-scanned.
|
|
69
|
+
* v24 → v25: Precision evidence model — investigationNotes, coverageGaps,
|
|
70
|
+
* evidenceChain, rootCause, verificationLevel on findings. Cached results
|
|
71
|
+
* from v24 lack these fields and must be re-scanned.
|
|
62
72
|
*/
|
|
63
|
-
exports.AGENT_SCAN_CACHE_VERSION =
|
|
73
|
+
exports.AGENT_SCAN_CACHE_VERSION = 31;
|
|
64
74
|
/** Cache TTL: 7 days. Findings older than this are re-scanned. */
|
|
65
75
|
const CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
66
76
|
function cachePath(workspaceRoot) {
|
|
@@ -113,7 +123,7 @@ function getCachedScan(workspaceRoot, filePath, content) {
|
|
|
113
123
|
/**
|
|
114
124
|
* Write a scan result to the cache. Merges with existing entries.
|
|
115
125
|
*/
|
|
116
|
-
function writeCachedScan(workspaceRoot, filePath, content, result) {
|
|
126
|
+
function writeCachedScan(workspaceRoot, filePath, content, result, memoryHash) {
|
|
117
127
|
const dir = path.join(workspaceRoot, CACHE_DIR);
|
|
118
128
|
if (!fs.existsSync(dir)) {
|
|
119
129
|
fs.mkdirSync(dir, { recursive: true });
|
|
@@ -142,11 +152,16 @@ function writeCachedScan(workspaceRoot, filePath, content, result) {
|
|
|
142
152
|
version: exports.AGENT_SCAN_CACHE_VERSION,
|
|
143
153
|
timestamp: now,
|
|
144
154
|
findings: result.findings,
|
|
155
|
+
investigationNotes: result.investigationNotes,
|
|
156
|
+
coverageGaps: result.coverageGaps,
|
|
145
157
|
status: result.status,
|
|
146
158
|
summary: result.summary,
|
|
147
159
|
stepsUsed: result.stepsUsed,
|
|
160
|
+
stepsGranted: result.stepsGranted,
|
|
161
|
+
extensionsGranted: result.extensionsGranted,
|
|
148
162
|
costSpentUsd: result.costSpentUsd,
|
|
149
163
|
filePath,
|
|
164
|
+
memoryHash,
|
|
150
165
|
};
|
|
151
166
|
// Atomic write
|
|
152
167
|
const p = cachePath(workspaceRoot);
|
|
@@ -154,6 +169,50 @@ function writeCachedScan(workspaceRoot, filePath, content, result) {
|
|
|
154
169
|
fs.writeFileSync(tmp, JSON.stringify(cache, null, 2), 'utf8');
|
|
155
170
|
fs.renameSync(tmp, p);
|
|
156
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Compute a deterministic fingerprint of the agent-memory false-positive
|
|
174
|
+
* list. Used as part of the cache key so changes to dismissed findings
|
|
175
|
+
* invalidate (or filter) cached scan results.
|
|
176
|
+
*
|
|
177
|
+
* Only false positives are part of the fingerprint — known facts help the
|
|
178
|
+
* agent investigate faster but don't change which findings are legitimately
|
|
179
|
+
* reportable. The fingerprint is a sha256 over `findingType|evidenceHash`
|
|
180
|
+
* pairs, sorted for stability.
|
|
181
|
+
*/
|
|
182
|
+
function computeMemoryFingerprint(falsePositives) {
|
|
183
|
+
if (!falsePositives || falsePositives.length === 0)
|
|
184
|
+
return '';
|
|
185
|
+
const lines = falsePositives
|
|
186
|
+
.map(fp => `${fp.findingType}|${fp.evidenceHash}`)
|
|
187
|
+
.sort()
|
|
188
|
+
.join('\n');
|
|
189
|
+
return crypto.createHash('sha256').update(lines).digest('hex').slice(0, 16);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Filter a list of cached findings against current agent memory.
|
|
193
|
+
* Drops any finding whose (findingType, evidence-hash-prefix) matches a
|
|
194
|
+
* dismissed false positive. The evidence hash here is a prefix of the
|
|
195
|
+
* full sha256 — we don't have the original evidence string in memory after
|
|
196
|
+
* a reload, only the stored hash, so we match on the hash alone (which is
|
|
197
|
+
* already content-derived).
|
|
198
|
+
*
|
|
199
|
+
* Returns the filtered list. Does NOT mutate the input.
|
|
200
|
+
*/
|
|
201
|
+
function filterCachedFindingsAgainstMemory(findings, falsePositives) {
|
|
202
|
+
if (!falsePositives || falsePositives.length === 0)
|
|
203
|
+
return findings;
|
|
204
|
+
// Index by (findingType, evidenceHash) for O(1) lookup.
|
|
205
|
+
const dismissed = new Set(falsePositives.map(fp => `${fp.findingType}|${fp.evidenceHash}`));
|
|
206
|
+
return findings.filter(f => {
|
|
207
|
+
// A finding is dismissed if both findingType and an evidence-derived
|
|
208
|
+
// hash match. The cached finding carries `evidence` (string), so we
|
|
209
|
+
// hash it the same way agentMemory does (sha256, 16 hex chars).
|
|
210
|
+
if (!f || !f.type || !f.evidence)
|
|
211
|
+
return true;
|
|
212
|
+
const evHash = crypto.createHash('sha256').update(String(f.evidence)).digest('hex').slice(0, 16);
|
|
213
|
+
return !dismissed.has(`${f.type}|${evHash}`);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
157
216
|
/**
|
|
158
217
|
* Clear the scan cache for a workspace (e.g., when the user requests
|
|
159
218
|
* a fresh scan with --no-cache).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanCache.js","sourceRoot":"","sources":["../../src/project-map/scanCache.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"scanCache.js","sourceRoot":"","sources":["../../src/project-map/scanCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol index — structural find_definition and find_references across the
|
|
3
|
+
* workspace. Replaces regex-based search_code for "where is X defined?" and
|
|
4
|
+
* "who calls X?" questions.
|
|
5
|
+
*
|
|
6
|
+
* Two providers:
|
|
7
|
+
* - TypeScriptProgramProvider: uses ts.createProgram for JS/TS/TSX —
|
|
8
|
+
* accurate cross-file definition + references via the type system.
|
|
9
|
+
* - TreeSitterProvider: uses tree-sitter AST for Python — intra-file
|
|
10
|
+
* definition + workspace-wide reference search via identifier matching.
|
|
11
|
+
*
|
|
12
|
+
* Both return SymbolLocation[] with provider + confidence metadata.
|
|
13
|
+
*/
|
|
14
|
+
export interface SymbolQuery {
|
|
15
|
+
/** Workspace-relative file path where the symbol was referenced. */
|
|
16
|
+
filePath: string;
|
|
17
|
+
/** The symbol name to search for. */
|
|
18
|
+
symbol: string;
|
|
19
|
+
/** Optional 1-indexed line (for disambiguation). */
|
|
20
|
+
line?: number;
|
|
21
|
+
/** Optional 0-indexed column (for disambiguation). */
|
|
22
|
+
column?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface SymbolLocation {
|
|
25
|
+
/** Workspace-relative file path. */
|
|
26
|
+
filePath: string;
|
|
27
|
+
/** 1-indexed line. */
|
|
28
|
+
line: number;
|
|
29
|
+
/** 1-indexed column (0 if unknown). */
|
|
30
|
+
column: number;
|
|
31
|
+
/** The provider that produced this result. */
|
|
32
|
+
provider: 'typescript' | 'tree-sitter';
|
|
33
|
+
/** Confidence: 1.0 for TypeScript, 0.8 for tree-sitter. */
|
|
34
|
+
confidence: number;
|
|
35
|
+
/** What this location represents. */
|
|
36
|
+
kind: 'definition' | 'reference';
|
|
37
|
+
}
|
|
38
|
+
export declare function findDefinition(workspaceRoot: string, filePath: string, symbol: string, line?: number): Promise<string>;
|
|
39
|
+
export declare function findReferences(workspaceRoot: string, filePath: string, symbol: string, line?: number): Promise<string>;
|