mcp-adr-analysis-server 2.1.9 → 2.1.11
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/.tsbuildinfo +1 -1
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +129 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/templates/domain-knowledge-templates.d.ts.map +1 -1
- package/dist/src/templates/domain-knowledge-templates.js +49 -49
- package/dist/src/templates/domain-knowledge-templates.js.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.d.ts +2 -2
- package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.js +125 -11
- package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
- package/dist/src/tools/adr-validation-tool.d.ts +46 -0
- package/dist/src/tools/adr-validation-tool.d.ts.map +1 -0
- package/dist/src/tools/adr-validation-tool.js +320 -0
- package/dist/src/tools/adr-validation-tool.js.map +1 -0
- package/dist/src/tools/deployment-analysis-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-analysis-tool.js +35 -1
- package/dist/src/tools/deployment-analysis-tool.js.map +1 -1
- package/dist/src/tools/deployment-guidance-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-guidance-tool.js +78 -24
- package/dist/src/tools/deployment-guidance-tool.js.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.js +151 -4
- package/dist/src/tools/deployment-readiness-tool.js.map +1 -1
- package/dist/src/tools/environment-analysis-tool.d.ts.map +1 -1
- package/dist/src/tools/environment-analysis-tool.js +36 -1
- package/dist/src/tools/environment-analysis-tool.js.map +1 -1
- package/dist/src/tools/interactive-adr-planning-tool.d.ts.map +1 -1
- package/dist/src/tools/interactive-adr-planning-tool.js +82 -9
- package/dist/src/tools/interactive-adr-planning-tool.js.map +1 -1
- package/dist/src/tools/perform-research-tool.d.ts +17 -0
- package/dist/src/tools/perform-research-tool.d.ts.map +1 -0
- package/dist/src/tools/perform-research-tool.js +180 -0
- package/dist/src/tools/perform-research-tool.js.map +1 -0
- package/dist/src/tools/research-question-tool.d.ts.map +1 -1
- package/dist/src/tools/research-question-tool.js +11 -9
- package/dist/src/tools/research-question-tool.js.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.d.ts.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.js +38 -2
- package/dist/src/tools/review-existing-adrs-tool.js.map +1 -1
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -1
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js +89 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -1
- package/dist/src/types/conversation-context.d.ts.map +1 -1
- package/dist/src/types/conversation-context.js +12 -12
- package/dist/src/types/conversation-context.js.map +1 -1
- package/dist/src/utils/ai-executor.d.ts.map +1 -1
- package/dist/src/utils/ai-executor.js +3 -3
- package/dist/src/utils/ai-executor.js.map +1 -1
- package/dist/src/utils/apply-cot-enhancement.d.ts.map +1 -1
- package/dist/src/utils/apply-cot-enhancement.js +15 -15
- package/dist/src/utils/apply-cot-enhancement.js.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.d.ts.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.js +68 -58
- package/dist/src/utils/automatic-prompt-engineering.js.map +1 -1
- package/dist/src/utils/deployment-analysis.d.ts.map +1 -1
- package/dist/src/utils/deployment-analysis.js +13 -8
- package/dist/src/utils/deployment-analysis.js.map +1 -1
- package/dist/src/utils/environment-analysis.d.ts.map +1 -1
- package/dist/src/utils/environment-analysis.js +59 -43
- package/dist/src/utils/environment-analysis.js.map +1 -1
- package/dist/src/utils/environment-capability-registry.d.ts +101 -0
- package/dist/src/utils/environment-capability-registry.d.ts.map +1 -0
- package/dist/src/utils/environment-capability-registry.js +489 -0
- package/dist/src/utils/environment-capability-registry.js.map +1 -0
- package/dist/src/utils/index.d.ts +3 -3
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +3 -3
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/knowledge-generation.d.ts.map +1 -1
- package/dist/src/utils/knowledge-generation.js +61 -35
- package/dist/src/utils/knowledge-generation.js.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.d.ts +4 -0
- package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.js +8 -0
- package/dist/src/utils/knowledge-graph-manager.js.map +1 -1
- package/dist/src/utils/llm-artifact-detector.d.ts.map +1 -1
- package/dist/src/utils/llm-artifact-detector.js +28 -24
- package/dist/src/utils/llm-artifact-detector.js.map +1 -1
- package/dist/src/utils/prompt-composition.d.ts.map +1 -1
- package/dist/src/utils/prompt-composition.js +1 -4
- package/dist/src/utils/prompt-composition.js.map +1 -1
- package/dist/src/utils/reflexion.d.ts.map +1 -1
- package/dist/src/utils/reflexion.js +51 -42
- package/dist/src/utils/reflexion.js.map +1 -1
- package/dist/src/utils/research-orchestrator.d.ts +77 -0
- package/dist/src/utils/research-orchestrator.d.ts.map +1 -0
- package/dist/src/utils/research-orchestrator.js +450 -0
- package/dist/src/utils/research-orchestrator.js.map +1 -0
- package/dist/src/utils/tree-sitter-analyzer.d.ts.map +1 -1
- package/dist/src/utils/tree-sitter-analyzer.js +83 -11
- package/dist/src/utils/tree-sitter-analyzer.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates multi-source research with cascading fallback:
|
|
5
|
+
* 1. Project Files (local, fast, free)
|
|
6
|
+
* 2. Knowledge Graph (in-memory, instant)
|
|
7
|
+
* 3. Environment Resources (live runtime data)
|
|
8
|
+
* 4. Web Search (external, last resort)
|
|
9
|
+
*/
|
|
10
|
+
import { promises as fs } from 'fs';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import { EnhancedLogger } from './enhanced-logging.js';
|
|
13
|
+
// import { KnowledgeGraphManager } from './knowledge-graph-manager.js'; // TODO: Implement KG query
|
|
14
|
+
import { findFiles } from './file-system.js';
|
|
15
|
+
import { scanProjectStructure } from './actual-file-operations.js';
|
|
16
|
+
import { searchWithRipgrep, isRipgrepAvailable } from './ripgrep-wrapper.js';
|
|
17
|
+
import { TreeSitterAnalyzer } from './tree-sitter-analyzer.js';
|
|
18
|
+
export class ResearchOrchestrator {
|
|
19
|
+
logger;
|
|
20
|
+
projectPath;
|
|
21
|
+
adrDirectory;
|
|
22
|
+
confidenceThreshold = 0.6;
|
|
23
|
+
constructor(projectPath, adrDirectory) {
|
|
24
|
+
this.logger = new EnhancedLogger();
|
|
25
|
+
this.projectPath = projectPath || process.cwd();
|
|
26
|
+
this.adrDirectory = adrDirectory || 'docs/adrs';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Answer a research question using cascading source hierarchy
|
|
30
|
+
*/
|
|
31
|
+
async answerResearchQuestion(question) {
|
|
32
|
+
const startTime = Date.now();
|
|
33
|
+
this.logger.info(`Starting research for question: "${question}"`, 'ResearchOrchestrator');
|
|
34
|
+
const answer = {
|
|
35
|
+
question,
|
|
36
|
+
sources: [],
|
|
37
|
+
confidence: 0,
|
|
38
|
+
needsWebSearch: false,
|
|
39
|
+
metadata: {
|
|
40
|
+
duration: 0,
|
|
41
|
+
sourcesQueried: [],
|
|
42
|
+
filesAnalyzed: 0,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
try {
|
|
46
|
+
// SOURCE 1: PROJECT FILES
|
|
47
|
+
this.logger.info('📁 Searching project files...', 'ResearchOrchestrator');
|
|
48
|
+
const projectData = await this.searchProjectFiles(question);
|
|
49
|
+
if (projectData.found) {
|
|
50
|
+
answer.sources.push({
|
|
51
|
+
type: 'project_files',
|
|
52
|
+
data: projectData,
|
|
53
|
+
confidence: 0.9,
|
|
54
|
+
timestamp: new Date().toISOString(),
|
|
55
|
+
});
|
|
56
|
+
answer.metadata.sourcesQueried.push('project_files');
|
|
57
|
+
answer.metadata.filesAnalyzed = projectData.files?.length || 0;
|
|
58
|
+
this.logger.info(`Found ${projectData.files?.length || 0} relevant project files`, 'ResearchOrchestrator');
|
|
59
|
+
}
|
|
60
|
+
// SOURCE 2: KNOWLEDGE GRAPH
|
|
61
|
+
this.logger.info('🧠 Querying knowledge graph...', 'ResearchOrchestrator');
|
|
62
|
+
const knowledgeData = await this.queryKnowledgeGraph(question);
|
|
63
|
+
if (knowledgeData.found) {
|
|
64
|
+
answer.sources.push({
|
|
65
|
+
type: 'knowledge_graph',
|
|
66
|
+
data: knowledgeData,
|
|
67
|
+
confidence: 0.85,
|
|
68
|
+
timestamp: new Date().toISOString(),
|
|
69
|
+
});
|
|
70
|
+
answer.metadata.sourcesQueried.push('knowledge_graph');
|
|
71
|
+
this.logger.info(`Found ${knowledgeData.nodes?.length || 0} relevant knowledge graph nodes`, 'ResearchOrchestrator');
|
|
72
|
+
}
|
|
73
|
+
// SOURCE 3: ENVIRONMENT RESOURCES
|
|
74
|
+
this.logger.info('🔧 Checking environment resources...', 'ResearchOrchestrator');
|
|
75
|
+
const envData = await this.queryEnvironment(question);
|
|
76
|
+
if (envData.found) {
|
|
77
|
+
answer.sources.push({
|
|
78
|
+
type: 'environment',
|
|
79
|
+
data: envData,
|
|
80
|
+
confidence: 0.95,
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
});
|
|
83
|
+
answer.metadata.sourcesQueried.push('environment');
|
|
84
|
+
this.logger.info(`Found environment data from ${envData.capabilities?.length || 0} capabilities`, 'ResearchOrchestrator');
|
|
85
|
+
}
|
|
86
|
+
// Calculate overall confidence
|
|
87
|
+
answer.confidence = this.calculateConfidence(answer.sources);
|
|
88
|
+
this.logger.info(`Research confidence: ${(answer.confidence * 100).toFixed(1)}%`, 'ResearchOrchestrator');
|
|
89
|
+
// SOURCE 4: WEB SEARCH (fallback)
|
|
90
|
+
if (answer.confidence < this.confidenceThreshold) {
|
|
91
|
+
this.logger.warn(`Confidence below threshold (${this.confidenceThreshold}), web search recommended`, 'ResearchOrchestrator');
|
|
92
|
+
answer.needsWebSearch = true;
|
|
93
|
+
}
|
|
94
|
+
// Generate synthesized answer
|
|
95
|
+
answer.answer = this.synthesizeAnswer(answer);
|
|
96
|
+
answer.metadata.duration = Date.now() - startTime;
|
|
97
|
+
this.logger.info(`Research completed in ${answer.metadata.duration}ms`, 'ResearchOrchestrator', { confidence: answer.confidence, sources: answer.metadata.sourcesQueried });
|
|
98
|
+
return answer;
|
|
99
|
+
}
|
|
100
|
+
catch (_error) {
|
|
101
|
+
this.logger.error('Research orchestration failed', 'ResearchOrchestrator', _error);
|
|
102
|
+
throw _error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* SOURCE 1: Search project files (Enhanced with tree-sitter, ripgrep, and actual file ops)
|
|
107
|
+
*/
|
|
108
|
+
async searchProjectFiles(question) {
|
|
109
|
+
const results = {
|
|
110
|
+
found: false,
|
|
111
|
+
files: [],
|
|
112
|
+
content: {},
|
|
113
|
+
relevance: {},
|
|
114
|
+
parseAnalysis: {},
|
|
115
|
+
};
|
|
116
|
+
try {
|
|
117
|
+
const questionLower = question.toLowerCase();
|
|
118
|
+
const keywords = this.extractKeywords(question);
|
|
119
|
+
this.logger.info(`Searching project files with keywords: ${keywords.join(', ')}`, 'ResearchOrchestrator');
|
|
120
|
+
// PHASE 1: Use actual-file-operations for structured project scan
|
|
121
|
+
const projectStructure = await scanProjectStructure(this.projectPath, {
|
|
122
|
+
readContent: false,
|
|
123
|
+
maxFileSize: 100000,
|
|
124
|
+
includeHidden: false,
|
|
125
|
+
});
|
|
126
|
+
// PHASE 2: Match relevant file categories based on question intent
|
|
127
|
+
const relevantFiles = [];
|
|
128
|
+
if (questionLower.match(/docker|container/i)) {
|
|
129
|
+
relevantFiles.push(...projectStructure.dockerFiles.map(f => f.path));
|
|
130
|
+
}
|
|
131
|
+
if (questionLower.match(/kubernetes|k8s|pod|deployment/i)) {
|
|
132
|
+
relevantFiles.push(...projectStructure.kubernetesFiles.map(f => f.path));
|
|
133
|
+
}
|
|
134
|
+
if (questionLower.match(/dependency|package|library/i)) {
|
|
135
|
+
relevantFiles.push(...projectStructure.packageFiles.map(f => f.path));
|
|
136
|
+
}
|
|
137
|
+
if (questionLower.match(/config|configuration|environment|env/i)) {
|
|
138
|
+
relevantFiles.push(...projectStructure.configFiles.map(f => f.path));
|
|
139
|
+
relevantFiles.push(...projectStructure.environmentFiles.map(f => f.path));
|
|
140
|
+
}
|
|
141
|
+
if (questionLower.match(/build|ci|cd|pipeline/i)) {
|
|
142
|
+
relevantFiles.push(...projectStructure.buildFiles.map(f => f.path));
|
|
143
|
+
relevantFiles.push(...projectStructure.ciFiles.map(f => f.path));
|
|
144
|
+
}
|
|
145
|
+
if (questionLower.match(/test|testing|spec/i)) {
|
|
146
|
+
// Use fast-glob to find test files
|
|
147
|
+
const testResults = await findFiles(this.projectPath, [
|
|
148
|
+
'**/*.test.ts',
|
|
149
|
+
'**/*.spec.ts',
|
|
150
|
+
'**/*.test.js',
|
|
151
|
+
'**/*.spec.js',
|
|
152
|
+
'**/tests/**',
|
|
153
|
+
'**/test/**',
|
|
154
|
+
]);
|
|
155
|
+
relevantFiles.push(...testResults.files.map(f => f.path));
|
|
156
|
+
}
|
|
157
|
+
// PHASE 3: Always include ADRs
|
|
158
|
+
const adrPath = path.join(this.projectPath, this.adrDirectory);
|
|
159
|
+
try {
|
|
160
|
+
const adrResults = await findFiles(adrPath, ['**/*.md']);
|
|
161
|
+
relevantFiles.push(...adrResults.files.map(f => f.path));
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
this.logger.warn(`ADR directory not found: ${adrPath}`, 'ResearchOrchestrator');
|
|
165
|
+
}
|
|
166
|
+
// PHASE 4: Use ripgrep for keyword search (if available)
|
|
167
|
+
const hasRipgrep = await isRipgrepAvailable();
|
|
168
|
+
if (hasRipgrep && keywords.length > 0) {
|
|
169
|
+
this.logger.info('Using ripgrep for fast keyword search', 'ResearchOrchestrator');
|
|
170
|
+
try {
|
|
171
|
+
const ripgrepFiles = await searchWithRipgrep({
|
|
172
|
+
pattern: keywords.join('|'),
|
|
173
|
+
path: this.projectPath,
|
|
174
|
+
caseInsensitive: true,
|
|
175
|
+
});
|
|
176
|
+
relevantFiles.push(...ripgrepFiles);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
this.logger.warn('Ripgrep search failed, continuing with other methods', 'ResearchOrchestrator');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Remove duplicates
|
|
183
|
+
results.files = [...new Set(relevantFiles)];
|
|
184
|
+
if (results.files.length === 0) {
|
|
185
|
+
this.logger.info('No relevant files found', 'ResearchOrchestrator');
|
|
186
|
+
return results;
|
|
187
|
+
}
|
|
188
|
+
results.found = true;
|
|
189
|
+
// PHASE 5: Read and analyze files with tree-sitter
|
|
190
|
+
const analyzer = new TreeSitterAnalyzer();
|
|
191
|
+
for (const file of results.files.slice(0, 50)) {
|
|
192
|
+
// Limit to 50 files for performance
|
|
193
|
+
try {
|
|
194
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
195
|
+
// Calculate text-based relevance
|
|
196
|
+
const relevance = this.calculateRelevance(content, question);
|
|
197
|
+
if (relevance > 0.2) {
|
|
198
|
+
// Lower threshold for tree-sitter analysis
|
|
199
|
+
results.content[file] = content;
|
|
200
|
+
results.relevance[file] = relevance;
|
|
201
|
+
// PHASE 6: Use tree-sitter for AST-based analysis
|
|
202
|
+
if (this.shouldParse(file)) {
|
|
203
|
+
try {
|
|
204
|
+
const analysis = await analyzer.analyzeFile(file, content);
|
|
205
|
+
// Enhance relevance based on AST analysis
|
|
206
|
+
let astRelevance = relevance;
|
|
207
|
+
// Check for infrastructure references
|
|
208
|
+
if (analysis.infraStructure && analysis.infraStructure.length > 0) {
|
|
209
|
+
// Extract provider types and resource names from infrastructure analysis
|
|
210
|
+
const infraProviders = analysis.infraStructure.map(i => i.provider);
|
|
211
|
+
const infraResources = analysis.infraStructure.map(i => i.name);
|
|
212
|
+
// Check if question keywords match infrastructure providers or resources
|
|
213
|
+
const matchingProviders = keywords.filter(k => infraProviders.some(p => p.toLowerCase().includes(k.toLowerCase())));
|
|
214
|
+
const matchingResources = keywords.filter(k => infraResources.some(r => r.toLowerCase().includes(k.toLowerCase())));
|
|
215
|
+
const totalMatches = matchingProviders.length + matchingResources.length;
|
|
216
|
+
if (totalMatches > 0) {
|
|
217
|
+
astRelevance += 0.2 * Math.min(totalMatches, 3); // Cap bonus at 0.6
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Check for imports/dependencies
|
|
221
|
+
if (analysis.imports && keywords.some(k => k.match(/import|require|dependency/i))) {
|
|
222
|
+
astRelevance += 0.1;
|
|
223
|
+
}
|
|
224
|
+
// Update relevance
|
|
225
|
+
results.relevance[file] = Math.min(astRelevance, 1.0);
|
|
226
|
+
results.parseAnalysis[file] = {
|
|
227
|
+
language: analysis.language,
|
|
228
|
+
hasInfrastructure: !!analysis.infraStructure,
|
|
229
|
+
functionCount: analysis.functions?.length || 0,
|
|
230
|
+
importCount: analysis.imports?.length || 0,
|
|
231
|
+
};
|
|
232
|
+
this.logger.debug(`Tree-sitter analysis for ${file}: ${analysis.language}, relevance: ${results.relevance[file]}`, 'ResearchOrchestrator');
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
this.logger.debug(`Tree-sitter parsing failed for ${file}, using text-based analysis`, 'ResearchOrchestrator');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
this.logger.warn(`Failed to read file: ${file}`, 'ResearchOrchestrator');
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Sort files by relevance
|
|
245
|
+
results.files = results.files
|
|
246
|
+
.filter(f => (results.relevance[f] ?? 0) > 0.2)
|
|
247
|
+
.sort((a, b) => (results.relevance[b] || 0) - (results.relevance[a] || 0))
|
|
248
|
+
.slice(0, 20); // Top 20 most relevant files
|
|
249
|
+
this.logger.info(`Found ${results.files.length} relevant files (analyzed with tree-sitter)`, 'ResearchOrchestrator');
|
|
250
|
+
return results;
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
this.logger.error('Project file search failed', 'ResearchOrchestrator', error);
|
|
254
|
+
return results;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Check if file should be parsed with tree-sitter
|
|
259
|
+
*/
|
|
260
|
+
shouldParse(filePath) {
|
|
261
|
+
const parsableExtensions = [
|
|
262
|
+
'.ts',
|
|
263
|
+
'.tsx',
|
|
264
|
+
'.js',
|
|
265
|
+
'.jsx',
|
|
266
|
+
'.py',
|
|
267
|
+
'.yaml',
|
|
268
|
+
'.yml',
|
|
269
|
+
'.json',
|
|
270
|
+
'.sh',
|
|
271
|
+
'.bash',
|
|
272
|
+
'.tf',
|
|
273
|
+
'.hcl',
|
|
274
|
+
];
|
|
275
|
+
return parsableExtensions.some(ext => filePath.endsWith(ext));
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* SOURCE 2: Query knowledge graph
|
|
279
|
+
*/
|
|
280
|
+
async queryKnowledgeGraph(_question) {
|
|
281
|
+
try {
|
|
282
|
+
// TODO: Implement actual knowledge graph query using KnowledgeGraphManager
|
|
283
|
+
// const kgManager = new KnowledgeGraphManager();
|
|
284
|
+
// const keywords = this.extractKeywords(question);
|
|
285
|
+
// Query knowledge graph (placeholder - implement based on your KG structure)
|
|
286
|
+
const results = {
|
|
287
|
+
found: false,
|
|
288
|
+
nodes: [],
|
|
289
|
+
relationships: [],
|
|
290
|
+
};
|
|
291
|
+
// TODO: Implement actual knowledge graph query
|
|
292
|
+
// For now, return empty results
|
|
293
|
+
return results;
|
|
294
|
+
}
|
|
295
|
+
catch (_error) {
|
|
296
|
+
this.logger.error('Knowledge graph query failed', 'ResearchOrchestrator', _error);
|
|
297
|
+
return { found: false, nodes: [], relationships: [] };
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* SOURCE 3: Query environment resources
|
|
302
|
+
*/
|
|
303
|
+
async queryEnvironment(question) {
|
|
304
|
+
try {
|
|
305
|
+
// Import dynamically to avoid circular dependencies
|
|
306
|
+
const { EnvironmentCapabilityRegistry } = await import('./environment-capability-registry.js');
|
|
307
|
+
const envRegistry = new EnvironmentCapabilityRegistry(this.projectPath);
|
|
308
|
+
// Discover available capabilities
|
|
309
|
+
await envRegistry.discoverCapabilities();
|
|
310
|
+
// Query relevant capabilities
|
|
311
|
+
const results = await envRegistry.query(question);
|
|
312
|
+
return {
|
|
313
|
+
found: results.length > 0,
|
|
314
|
+
capabilities: envRegistry.listCapabilities(),
|
|
315
|
+
data: results,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
this.logger.warn('Environment query failed (capability registry not available)', 'ResearchOrchestrator');
|
|
320
|
+
return { found: false, capabilities: [], data: [] };
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Calculate confidence score from multiple sources
|
|
325
|
+
*/
|
|
326
|
+
calculateConfidence(sources) {
|
|
327
|
+
if (sources.length === 0)
|
|
328
|
+
return 0;
|
|
329
|
+
// Weighted confidence calculation
|
|
330
|
+
const totalConfidence = sources.reduce((sum, s) => sum + s.confidence, 0);
|
|
331
|
+
const avgConfidence = totalConfidence / sources.length;
|
|
332
|
+
// Bonus for multiple sources
|
|
333
|
+
const sourceBonus = Math.min(sources.length * 0.05, 0.15);
|
|
334
|
+
return Math.min(avgConfidence + sourceBonus, 1.0);
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Synthesize answer from multiple sources
|
|
338
|
+
*/
|
|
339
|
+
synthesizeAnswer(research) {
|
|
340
|
+
if (research.sources.length === 0) {
|
|
341
|
+
return 'No relevant information found in project files, knowledge graph, or environment.';
|
|
342
|
+
}
|
|
343
|
+
const parts = [];
|
|
344
|
+
// Add project file findings
|
|
345
|
+
const projectFiles = research.sources.find(s => s.type === 'project_files');
|
|
346
|
+
if (projectFiles && projectFiles.data.files?.length > 0) {
|
|
347
|
+
parts.push(`Found ${projectFiles.data.files.length} relevant project file(s).`);
|
|
348
|
+
}
|
|
349
|
+
// Add knowledge graph findings
|
|
350
|
+
const knowledgeGraph = research.sources.find(s => s.type === 'knowledge_graph');
|
|
351
|
+
if (knowledgeGraph && knowledgeGraph.data.nodes?.length > 0) {
|
|
352
|
+
parts.push(`Identified ${knowledgeGraph.data.nodes.length} related architectural decision(s).`);
|
|
353
|
+
}
|
|
354
|
+
// Add environment findings
|
|
355
|
+
const environment = research.sources.find(s => s.type === 'environment');
|
|
356
|
+
if (environment && environment.data.capabilities?.length > 0) {
|
|
357
|
+
parts.push(`Detected ${environment.data.capabilities.length} environment capability(ies): ${environment.data.capabilities.join(', ')}.`);
|
|
358
|
+
}
|
|
359
|
+
if (research.needsWebSearch) {
|
|
360
|
+
parts.push('Additional web research recommended for comprehensive answer.');
|
|
361
|
+
}
|
|
362
|
+
return parts.join(' ');
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
/**
|
|
366
|
+
* Calculate relevance score for content
|
|
367
|
+
*/
|
|
368
|
+
calculateRelevance(content, question) {
|
|
369
|
+
const contentLower = content.toLowerCase();
|
|
370
|
+
const questionLower = question.toLowerCase();
|
|
371
|
+
// Extract keywords from question
|
|
372
|
+
const keywords = this.extractKeywords(question);
|
|
373
|
+
let score = 0;
|
|
374
|
+
for (const keyword of keywords) {
|
|
375
|
+
if (contentLower.includes(keyword.toLowerCase())) {
|
|
376
|
+
score += 0.2;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// Bonus for exact question phrases
|
|
380
|
+
const questionWords = questionLower.split(/\s+/).filter(w => w.length > 3);
|
|
381
|
+
for (const word of questionWords) {
|
|
382
|
+
if (contentLower.includes(word)) {
|
|
383
|
+
score += 0.1;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return Math.min(score, 1.0);
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Extract keywords from question
|
|
390
|
+
*/
|
|
391
|
+
extractKeywords(question) {
|
|
392
|
+
// Remove common words
|
|
393
|
+
const stopWords = new Set([
|
|
394
|
+
'the',
|
|
395
|
+
'is',
|
|
396
|
+
'are',
|
|
397
|
+
'was',
|
|
398
|
+
'were',
|
|
399
|
+
'what',
|
|
400
|
+
'when',
|
|
401
|
+
'where',
|
|
402
|
+
'why',
|
|
403
|
+
'how',
|
|
404
|
+
'which',
|
|
405
|
+
'who',
|
|
406
|
+
'a',
|
|
407
|
+
'an',
|
|
408
|
+
'and',
|
|
409
|
+
'or',
|
|
410
|
+
'but',
|
|
411
|
+
'in',
|
|
412
|
+
'on',
|
|
413
|
+
'at',
|
|
414
|
+
'to',
|
|
415
|
+
'for',
|
|
416
|
+
'with',
|
|
417
|
+
'about',
|
|
418
|
+
'as',
|
|
419
|
+
'by',
|
|
420
|
+
'from',
|
|
421
|
+
'of',
|
|
422
|
+
'can',
|
|
423
|
+
'could',
|
|
424
|
+
'should',
|
|
425
|
+
'would',
|
|
426
|
+
'do',
|
|
427
|
+
'does',
|
|
428
|
+
'did',
|
|
429
|
+
'have',
|
|
430
|
+
'has',
|
|
431
|
+
'had',
|
|
432
|
+
'we',
|
|
433
|
+
'our',
|
|
434
|
+
'us',
|
|
435
|
+
]);
|
|
436
|
+
const words = question
|
|
437
|
+
.toLowerCase()
|
|
438
|
+
.replace(/[^\w\s-]/g, ' ')
|
|
439
|
+
.split(/\s+/)
|
|
440
|
+
.filter(w => w.length > 2 && !stopWords.has(w));
|
|
441
|
+
return [...new Set(words)];
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Set confidence threshold for web search fallback
|
|
445
|
+
*/
|
|
446
|
+
setConfidenceThreshold(threshold) {
|
|
447
|
+
this.confidenceThreshold = Math.max(0, Math.min(1, threshold));
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=research-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-orchestrator.js","sourceRoot":"","sources":["../../../src/utils/research-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-sitter-analyzer.d.ts","sourceRoot":"","sources":["../../../src/utils/tree-sitter-analyzer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tree-sitter-analyzer.d.ts","sourceRoot":"","sources":["../../../src/utils/tree-sitter-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,11 @@ export class TreeSitterAnalyzer {
|
|
|
30
30
|
* Initialize tree-sitter parsers with graceful fallback
|
|
31
31
|
*/
|
|
32
32
|
async initializeParsers() {
|
|
33
|
+
// Skip tree-sitter initialization in test environment
|
|
34
|
+
if (process.env['NODE_ENV'] === 'test' || process.env['JEST_WORKER_ID'] !== undefined) {
|
|
35
|
+
this.initialized = false;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
33
38
|
try {
|
|
34
39
|
// Initialize core parsers for enterprise stack
|
|
35
40
|
await this.loadParser('typescript', 'tree-sitter-typescript');
|
|
@@ -48,6 +53,10 @@ export class TreeSitterAnalyzer {
|
|
|
48
53
|
}
|
|
49
54
|
}
|
|
50
55
|
async loadParser(language, packageName) {
|
|
56
|
+
// Skip loading parsers in test environment
|
|
57
|
+
if (process.env['NODE_ENV'] === 'test' || process.env['JEST_WORKER_ID'] !== undefined) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
51
60
|
try {
|
|
52
61
|
const TreeSitterModule = await import('tree-sitter');
|
|
53
62
|
const TreeSitter = TreeSitterModule.default || TreeSitterModule;
|
|
@@ -69,7 +78,10 @@ export class TreeSitterAnalyzer {
|
|
|
69
78
|
this.parsers.set(language, parser);
|
|
70
79
|
}
|
|
71
80
|
catch (error) {
|
|
72
|
-
|
|
81
|
+
// Silently skip parser loading errors in test environment
|
|
82
|
+
if (process.env['NODE_ENV'] !== 'test' && process.env['JEST_WORKER_ID'] === undefined) {
|
|
83
|
+
console.warn(`Failed to load ${language} parser:`, error);
|
|
84
|
+
}
|
|
73
85
|
}
|
|
74
86
|
}
|
|
75
87
|
/**
|
|
@@ -464,13 +476,44 @@ export class TreeSitterAnalyzer {
|
|
|
464
476
|
};
|
|
465
477
|
// Basic regex-based secret detection
|
|
466
478
|
const secretPatterns = [
|
|
467
|
-
{ pattern: /(?:api[_-]?key|apikey)[:=]\s*['""]([^'""]+)['""]?/i, type: 'api_key' },
|
|
468
|
-
{ pattern: /(?:password|pwd|pass)[:=]\s*['""]([^'""]+)['""]?/i, type: 'password' },
|
|
469
|
-
{ pattern: /(?:token|auth)[:=]\s*['""]([^'""]+)['""]?/i, type: 'token' },
|
|
470
479
|
{
|
|
471
|
-
pattern: /(?:
|
|
480
|
+
pattern: /["']?(?:api[_-]?key|apikey)["']?\s*[:=\s]\s*["']([^"']+)["']/i,
|
|
481
|
+
type: 'api_key',
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
pattern: /["']?(?:password|pwd|pass)["']?\s*[:=\s]\s*["']([^"']+)["']/i,
|
|
485
|
+
type: 'password',
|
|
486
|
+
},
|
|
487
|
+
{ pattern: /["']?(?:token|auth)["']?\s*[:=\s]\s*["']([^"']+)["']/i, type: 'token' },
|
|
488
|
+
{
|
|
489
|
+
pattern: /["']?(?:secret|private[_-]?key)["']?\s*[:=\s]\s*["']([^"']+)["']/i,
|
|
490
|
+
type: 'private_key',
|
|
491
|
+
},
|
|
492
|
+
// AWS Access Key - specific pattern (environment variable style)
|
|
493
|
+
{
|
|
494
|
+
pattern: /AWS_ACCESS_KEY_ID\s*[:=]\s*["']?((?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA)[A-Z0-9]{16})["']?/i,
|
|
495
|
+
type: 'api_key',
|
|
496
|
+
},
|
|
497
|
+
// AWS Access Key - generic pattern (any variable name with AWS key format)
|
|
498
|
+
{
|
|
499
|
+
pattern: /["']?((?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA)[A-Z0-9]{16})["']?/,
|
|
500
|
+
type: 'api_key',
|
|
501
|
+
},
|
|
502
|
+
// AWS Secret Key - specific pattern (40 chars)
|
|
503
|
+
{
|
|
504
|
+
pattern: /AWS_SECRET_ACCESS_KEY\s*[:=]\s*["']?([A-Za-z0-9+/]{40})["']?/i,
|
|
505
|
+
type: 'private_key',
|
|
506
|
+
},
|
|
507
|
+
// Generic AWS secret assignment
|
|
508
|
+
{
|
|
509
|
+
pattern: /(?:aws_secret|secret_key)\s*[:=]\s*["']([A-Za-z0-9+/]{40})["']/i,
|
|
472
510
|
type: 'private_key',
|
|
473
511
|
},
|
|
512
|
+
// YAML/Dockerfile environment variables with hardcoded values
|
|
513
|
+
{
|
|
514
|
+
pattern: /(?:value|ENV\s+\w+)\s*[:=]?\s*["']([a-zA-Z0-9_-]{10,})["']/i,
|
|
515
|
+
type: 'credential',
|
|
516
|
+
},
|
|
474
517
|
];
|
|
475
518
|
lines.forEach((line, index) => {
|
|
476
519
|
secretPatterns.forEach(({ pattern, type }) => {
|
|
@@ -485,6 +528,16 @@ export class TreeSitterAnalyzer {
|
|
|
485
528
|
});
|
|
486
529
|
}
|
|
487
530
|
});
|
|
531
|
+
// Detect privilege escalation in Dockerfile
|
|
532
|
+
if (language === 'dockerfile' && /USER\s+root/i.test(line)) {
|
|
533
|
+
result.securityIssues.push({
|
|
534
|
+
type: 'privilege_escalation',
|
|
535
|
+
severity: 'high',
|
|
536
|
+
location: { line: index + 1, column: 0 },
|
|
537
|
+
message: 'Running as root user',
|
|
538
|
+
suggestion: 'Use a non-root user',
|
|
539
|
+
});
|
|
540
|
+
}
|
|
488
541
|
});
|
|
489
542
|
result.hasSecrets = result.secrets.length > 0;
|
|
490
543
|
return result;
|
|
@@ -558,15 +611,34 @@ export class TreeSitterAnalyzer {
|
|
|
558
611
|
return 'credential';
|
|
559
612
|
}
|
|
560
613
|
detectSecretPattern(text) {
|
|
561
|
-
// AWS Access Key
|
|
562
|
-
if (/^AKIA[
|
|
563
|
-
return 'api_key';
|
|
564
|
-
// Generic API key patterns
|
|
565
|
-
if (/^[A-Za-z0-9]{32,}$/.test(text) && text.length >= 32)
|
|
614
|
+
// AWS Access Key (various types)
|
|
615
|
+
if (/^(A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}$/.test(text)) {
|
|
566
616
|
return 'api_key';
|
|
617
|
+
}
|
|
618
|
+
// AWS Secret Key (40 characters, base64-like) - using boundary detection
|
|
619
|
+
if (/^[A-Za-z0-9+/]{40}$/.test(text)) {
|
|
620
|
+
return 'private_key';
|
|
621
|
+
}
|
|
622
|
+
// AWS Session Token (longer, base64-like)
|
|
623
|
+
if (/^[A-Za-z0-9+/=]{100,}$/.test(text)) {
|
|
624
|
+
return 'token';
|
|
625
|
+
}
|
|
567
626
|
// JWT Token
|
|
568
|
-
if (/^eyJ[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_.+/]*$/.test(text))
|
|
627
|
+
if (/^eyJ[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_.+/]*$/.test(text)) {
|
|
628
|
+
return 'token';
|
|
629
|
+
}
|
|
630
|
+
// GitHub Personal Access Token
|
|
631
|
+
if (/^ghp_[A-Za-z0-9]{36}$/.test(text)) {
|
|
632
|
+
return 'token';
|
|
633
|
+
}
|
|
634
|
+
// Slack tokens
|
|
635
|
+
if (/^xox[baprs]-[0-9]{12}-[0-9]{12}-[a-zA-Z0-9]{24}$/.test(text)) {
|
|
569
636
|
return 'token';
|
|
637
|
+
}
|
|
638
|
+
// Generic API key patterns (32+ alphanumeric)
|
|
639
|
+
if (/^[A-Za-z0-9]{32,64}$/.test(text) && text.length >= 32) {
|
|
640
|
+
return 'api_key';
|
|
641
|
+
}
|
|
570
642
|
return null;
|
|
571
643
|
}
|
|
572
644
|
isAnsibleFile(filename, content) {
|