@securecode-ai/mcp 0.5.5 → 0.5.7

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 (186) hide show
  1. package/README.md +52 -12
  2. package/dist/api/types.d.ts +7 -0
  3. package/dist/approval/auditLog.d.ts +1 -1
  4. package/dist/approval/auditLog.js +11 -3
  5. package/dist/approval/auditLog.js.map +1 -1
  6. package/dist/approval/broker.d.ts +7 -2
  7. package/dist/approval/broker.js +239 -110
  8. package/dist/approval/broker.js.map +1 -1
  9. package/dist/approval/policy.d.ts +10 -0
  10. package/dist/approval/policy.js +104 -0
  11. package/dist/approval/policy.js.map +1 -0
  12. package/dist/approval/types.d.ts +11 -2
  13. package/dist/approval/types.js +10 -1
  14. package/dist/approval/types.js.map +1 -1
  15. package/dist/attack/agentScanExecutor.d.ts +35 -1
  16. package/dist/attack/agentScanExecutor.js +405 -76
  17. package/dist/attack/agentScanExecutor.js.map +1 -1
  18. package/dist/attack/agentScanLoop.d.ts +20 -0
  19. package/dist/attack/agentScanLoop.js +1264 -60
  20. package/dist/attack/agentScanLoop.js.map +1 -1
  21. package/dist/attack/agentScanProtocol.d.ts +382 -6
  22. package/dist/attack/agentScanProtocol.js +110 -4
  23. package/dist/attack/agentScanProtocol.js.map +1 -1
  24. package/dist/attack/agentTrace.d.ts +73 -0
  25. package/dist/attack/agentTrace.js +228 -0
  26. package/dist/attack/agentTrace.js.map +1 -0
  27. package/dist/attack/architectureScoutExecutor.d.ts +18 -0
  28. package/dist/attack/architectureScoutExecutor.js +211 -0
  29. package/dist/attack/architectureScoutExecutor.js.map +1 -0
  30. package/dist/attack/architectureScoutLoop.d.ts +36 -0
  31. package/dist/attack/architectureScoutLoop.js +403 -0
  32. package/dist/attack/architectureScoutLoop.js.map +1 -0
  33. package/dist/attack/architectureScoutProtocol.d.ts +209 -0
  34. package/dist/attack/architectureScoutProtocol.js +47 -0
  35. package/dist/attack/architectureScoutProtocol.js.map +1 -0
  36. package/dist/attack/candidateStore.d.ts +95 -0
  37. package/dist/attack/candidateStore.js +231 -0
  38. package/dist/attack/candidateStore.js.map +1 -0
  39. package/dist/attack/evidenceLedger.d.ts +67 -0
  40. package/dist/attack/evidenceLedger.js +192 -0
  41. package/dist/attack/evidenceLedger.js.map +1 -0
  42. package/dist/attack/finishGate.d.ts +62 -0
  43. package/dist/attack/finishGate.js +209 -0
  44. package/dist/attack/finishGate.js.map +1 -0
  45. package/dist/attack/fixCodeMerge.d.ts +27 -0
  46. package/dist/attack/fixCodeMerge.js +42 -0
  47. package/dist/attack/fixCodeMerge.js.map +1 -0
  48. package/dist/attack/fixVerifyLoop.d.ts +55 -0
  49. package/dist/attack/fixVerifyLoop.js +187 -0
  50. package/dist/attack/fixVerifyLoop.js.map +1 -0
  51. package/dist/attack/investigationProfiles.d.ts +36 -0
  52. package/dist/attack/investigationProfiles.js +144 -0
  53. package/dist/attack/investigationProfiles.js.map +1 -0
  54. package/dist/attack/investigationState.d.ts +227 -0
  55. package/dist/attack/investigationState.js +666 -0
  56. package/dist/attack/investigationState.js.map +1 -0
  57. package/dist/attack/mutationOperators.d.ts +22 -0
  58. package/dist/attack/mutationOperators.js +170 -0
  59. package/dist/attack/mutationOperators.js.map +1 -0
  60. package/dist/attack/mutationTest.d.ts +33 -0
  61. package/dist/attack/mutationTest.js +110 -0
  62. package/dist/attack/mutationTest.js.map +1 -0
  63. package/dist/attack/proofGate.d.ts +20 -0
  64. package/dist/attack/proofGate.js +104 -0
  65. package/dist/attack/proofGate.js.map +1 -0
  66. package/dist/attack/proofTypes.d.ts +57 -0
  67. package/dist/attack/proofTypes.js +32 -0
  68. package/dist/attack/proofTypes.js.map +1 -0
  69. package/dist/attack/protocolValidator.d.ts +50 -0
  70. package/dist/attack/protocolValidator.js +427 -0
  71. package/dist/attack/protocolValidator.js.map +1 -0
  72. package/dist/attack/qualityMetrics.d.ts +133 -0
  73. package/dist/attack/qualityMetrics.js +226 -0
  74. package/dist/attack/qualityMetrics.js.map +1 -0
  75. package/dist/attack/scanScheduler.d.ts +52 -0
  76. package/dist/attack/scanScheduler.js +265 -0
  77. package/dist/attack/scanScheduler.js.map +1 -0
  78. package/dist/attack/scanState.d.ts +58 -0
  79. package/dist/attack/scanState.js +102 -0
  80. package/dist/attack/scanState.js.map +1 -0
  81. package/dist/attack/searchIntent.d.ts +16 -0
  82. package/dist/attack/searchIntent.js +57 -0
  83. package/dist/attack/searchIntent.js.map +1 -0
  84. package/dist/attack/verifyLoop.d.ts +43 -0
  85. package/dist/attack/verifyLoop.js +314 -14
  86. package/dist/attack/verifyLoop.js.map +1 -1
  87. package/dist/attack/workItem.d.ts +57 -0
  88. package/dist/attack/workItem.js +225 -0
  89. package/dist/attack/workItem.js.map +1 -0
  90. package/dist/audit/findingReviewQueue.d.ts +109 -0
  91. package/dist/audit/findingReviewQueue.js +335 -0
  92. package/dist/audit/findingReviewQueue.js.map +1 -0
  93. package/dist/audit/scanAuditLog.d.ts +160 -0
  94. package/dist/audit/scanAuditLog.js +404 -0
  95. package/dist/audit/scanAuditLog.js.map +1 -0
  96. package/dist/dependency/dependencyChecker.js +35 -9
  97. package/dist/dependency/dependencyChecker.js.map +1 -1
  98. package/dist/dependency/exploitPriority.d.ts +33 -0
  99. package/dist/dependency/exploitPriority.js +78 -0
  100. package/dist/dependency/exploitPriority.js.map +1 -0
  101. package/dist/dependency/finding.d.ts +16 -0
  102. package/dist/dependency/osvClient.js +2 -0
  103. package/dist/dependency/osvClient.js.map +1 -1
  104. package/dist/dependency/types.d.ts +12 -1
  105. package/dist/mcp/server.js +13 -2
  106. package/dist/mcp/server.js.map +1 -1
  107. package/dist/mcp/tools.d.ts +1 -0
  108. package/dist/mcp/tools.js +127 -6
  109. package/dist/mcp/tools.js.map +1 -1
  110. package/dist/project-map/agentMemory.d.ts +83 -1
  111. package/dist/project-map/agentMemory.js +197 -7
  112. package/dist/project-map/agentMemory.js.map +1 -1
  113. package/dist/project-map/architectureContext.d.ts +202 -0
  114. package/dist/project-map/architectureContext.js +421 -0
  115. package/dist/project-map/architectureContext.js.map +1 -0
  116. package/dist/project-map/blastRadius.d.ts +54 -0
  117. package/dist/project-map/blastRadius.js +196 -0
  118. package/dist/project-map/blastRadius.js.map +1 -0
  119. package/dist/project-map/callGraphExtractor.d.ts +13 -0
  120. package/dist/project-map/callGraphExtractor.js +222 -0
  121. package/dist/project-map/callGraphExtractor.js.map +1 -0
  122. package/dist/project-map/capabilityRegistry.d.ts +46 -0
  123. package/dist/project-map/capabilityRegistry.js +91 -0
  124. package/dist/project-map/capabilityRegistry.js.map +1 -0
  125. package/dist/project-map/findTests.d.ts +29 -0
  126. package/dist/project-map/findTests.js +236 -0
  127. package/dist/project-map/findTests.js.map +1 -0
  128. package/dist/project-map/handlerInventory.d.ts +112 -0
  129. package/dist/project-map/handlerInventory.js +184 -0
  130. package/dist/project-map/handlerInventory.js.map +1 -0
  131. package/dist/project-map/implementationResolver.d.ts +43 -0
  132. package/dist/project-map/implementationResolver.js +217 -0
  133. package/dist/project-map/implementationResolver.js.map +1 -0
  134. package/dist/project-map/mapContext.d.ts +6 -1
  135. package/dist/project-map/mapContext.js +1 -0
  136. package/dist/project-map/mapContext.js.map +1 -1
  137. package/dist/project-map/scanCache.d.ts +57 -3
  138. package/dist/project-map/scanCache.js +61 -2
  139. package/dist/project-map/scanCache.js.map +1 -1
  140. package/dist/project-map/symbolIndex.d.ts +39 -0
  141. package/dist/project-map/symbolIndex.js +385 -0
  142. package/dist/project-map/symbolIndex.js.map +1 -0
  143. package/dist/tooling/agentEvalScoring.d.ts +77 -0
  144. package/dist/tooling/agentEvalScoring.js +140 -0
  145. package/dist/tooling/agentEvalScoring.js.map +1 -0
  146. package/dist/tooling/agentRegression.d.ts +53 -0
  147. package/dist/tooling/agentRegression.js +99 -0
  148. package/dist/tooling/agentRegression.js.map +1 -0
  149. package/dist/tools/agentScan.d.ts +69 -0
  150. package/dist/tools/agentScan.js +702 -43
  151. package/dist/tools/agentScan.js.map +1 -1
  152. package/dist/tools/findingReviewTools.d.ts +22 -0
  153. package/dist/tools/findingReviewTools.js +121 -0
  154. package/dist/tools/findingReviewTools.js.map +1 -0
  155. package/dist/tools/fix.js +1 -1
  156. package/dist/tools/fix.js.map +1 -1
  157. package/dist/tools/map.js +191 -1
  158. package/dist/tools/map.js.map +1 -1
  159. package/dist/tools/runTests.d.ts +2 -0
  160. package/dist/tools/runTests.js +29 -0
  161. package/dist/tools/runTests.js.map +1 -0
  162. package/dist/utils/effectMock.d.ts +1 -0
  163. package/dist/utils/effectMock.js +162 -0
  164. package/dist/utils/effectMock.js.map +1 -0
  165. package/dist/utils/gitContext.d.ts +26 -0
  166. package/dist/utils/gitContext.js +317 -0
  167. package/dist/utils/gitContext.js.map +1 -0
  168. package/dist/utils/localTestRunner.d.ts +57 -2
  169. package/dist/utils/localTestRunner.js +122 -115
  170. package/dist/utils/localTestRunner.js.map +1 -1
  171. package/dist/utils/securityConfig.d.ts +17 -0
  172. package/dist/utils/securityConfig.js +192 -0
  173. package/dist/utils/securityConfig.js.map +1 -0
  174. package/dist/utils/testCommandPolicy.d.ts +36 -0
  175. package/dist/utils/testCommandPolicy.js +252 -0
  176. package/dist/utils/testCommandPolicy.js.map +1 -0
  177. package/dist/utils/testRunner.d.ts +56 -0
  178. package/dist/utils/testRunner.js +246 -0
  179. package/dist/utils/testRunner.js.map +1 -0
  180. package/dist/utils/testSafety.d.ts +40 -2
  181. package/dist/utils/testSafety.js +205 -26
  182. package/dist/utils/testSafety.js.map +1 -1
  183. package/dist/utils/verificationSandbox.d.ts +113 -0
  184. package/dist/utils/verificationSandbox.js +656 -0
  185. package/dist/utils/verificationSandbox.js.map +1 -0
  186. 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,8DAYC;AAMD,wDAQC;AA/DD;;;;;;;;;GASG;AACH,2CAA6B;AAC7B,mCAAgD;AAChD,6CAA+C;AAC/C,iDAAqD;AACrD,mCAAqG;AAErG;;;GAGG;AACH,KAAK,UAAU,MAAM,CAAC,aAAqB;IACvC,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"}
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 = 20;
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
- /** Cost in USD. */
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 = 20;
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":"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"}
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>;