agentic-qe 2.5.10 → 2.6.0
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/.claude/agents/qe-code-intelligence.md +359 -0
- package/CHANGELOG.md +61 -0
- package/README.md +3 -2
- package/dist/agents/BaseAgent.d.ts +48 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +126 -0
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CodeIntelligenceAgent.d.ts +133 -0
- package/dist/agents/CodeIntelligenceAgent.d.ts.map +1 -0
- package/dist/agents/CodeIntelligenceAgent.js +473 -0
- package/dist/agents/CodeIntelligenceAgent.js.map +1 -0
- package/dist/agents/context/ContextCache.d.ts +105 -0
- package/dist/agents/context/ContextCache.d.ts.map +1 -0
- package/dist/agents/context/ContextCache.js +235 -0
- package/dist/agents/context/ContextCache.js.map +1 -0
- package/dist/agents/context/ContextFormatter.d.ts +92 -0
- package/dist/agents/context/ContextFormatter.d.ts.map +1 -0
- package/dist/agents/context/ContextFormatter.js +338 -0
- package/dist/agents/context/ContextFormatter.js.map +1 -0
- package/dist/agents/context/GraphExpander.d.ts +87 -0
- package/dist/agents/context/GraphExpander.d.ts.map +1 -0
- package/dist/agents/context/GraphExpander.js +215 -0
- package/dist/agents/context/GraphExpander.js.map +1 -0
- package/dist/agents/context/KnowledgeGraphContextBuilder.d.ts +160 -0
- package/dist/agents/context/KnowledgeGraphContextBuilder.d.ts.map +1 -0
- package/dist/agents/context/KnowledgeGraphContextBuilder.js +300 -0
- package/dist/agents/context/KnowledgeGraphContextBuilder.js.map +1 -0
- package/dist/agents/context/index.d.ts +15 -0
- package/dist/agents/context/index.d.ts.map +1 -0
- package/dist/agents/context/index.js +18 -0
- package/dist/agents/context/index.js.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +67 -3
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/commands/knowledge-graph.d.ts +112 -0
- package/dist/cli/commands/knowledge-graph.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-graph.js +466 -0
- package/dist/cli/commands/knowledge-graph.js.map +1 -0
- package/dist/cli/formatters/KGOutputFormatter.d.ts +50 -0
- package/dist/cli/formatters/KGOutputFormatter.d.ts.map +1 -0
- package/dist/cli/formatters/KGOutputFormatter.js +237 -0
- package/dist/cli/formatters/KGOutputFormatter.js.map +1 -0
- package/dist/cli/index-working.js +138 -0
- package/dist/cli/index-working.js.map +1 -1
- package/dist/cli/init/claude-config.d.ts +13 -1
- package/dist/cli/init/claude-config.d.ts.map +1 -1
- package/dist/cli/init/claude-config.js +70 -8
- package/dist/cli/init/claude-config.js.map +1 -1
- package/dist/cli/init/code-intelligence-init.d.ts +52 -0
- package/dist/cli/init/code-intelligence-init.d.ts.map +1 -0
- package/dist/cli/init/code-intelligence-init.js +250 -0
- package/dist/cli/init/code-intelligence-init.js.map +1 -0
- package/dist/cli/init/index.d.ts +2 -2
- package/dist/cli/init/index.d.ts.map +1 -1
- package/dist/cli/init/index.js +10 -1
- package/dist/cli/init/index.js.map +1 -1
- package/dist/code-intelligence/chunking/ASTChunker.d.ts +64 -0
- package/dist/code-intelligence/chunking/ASTChunker.d.ts.map +1 -0
- package/dist/code-intelligence/chunking/ASTChunker.js +344 -0
- package/dist/code-intelligence/chunking/ASTChunker.js.map +1 -0
- package/dist/code-intelligence/chunking/ChunkSplitter.d.ts +48 -0
- package/dist/code-intelligence/chunking/ChunkSplitter.d.ts.map +1 -0
- package/dist/code-intelligence/chunking/ChunkSplitter.js +278 -0
- package/dist/code-intelligence/chunking/ChunkSplitter.js.map +1 -0
- package/dist/code-intelligence/chunking/index.d.ts +8 -0
- package/dist/code-intelligence/chunking/index.d.ts.map +1 -0
- package/dist/code-intelligence/chunking/index.js +13 -0
- package/dist/code-intelligence/chunking/index.js.map +1 -0
- package/dist/code-intelligence/chunking/types.d.ts +52 -0
- package/dist/code-intelligence/chunking/types.d.ts.map +1 -0
- package/dist/code-intelligence/chunking/types.js +6 -0
- package/dist/code-intelligence/chunking/types.js.map +1 -0
- package/dist/code-intelligence/config/database-schema.d.ts +245 -0
- package/dist/code-intelligence/config/database-schema.d.ts.map +1 -0
- package/dist/code-intelligence/config/database-schema.js +110 -0
- package/dist/code-intelligence/config/database-schema.js.map +1 -0
- package/dist/code-intelligence/config/environment.d.ts +53 -0
- package/dist/code-intelligence/config/environment.d.ts.map +1 -0
- package/dist/code-intelligence/config/environment.js +86 -0
- package/dist/code-intelligence/config/environment.js.map +1 -0
- package/dist/code-intelligence/config/index.d.ts +10 -0
- package/dist/code-intelligence/config/index.d.ts.map +1 -0
- package/dist/code-intelligence/config/index.js +36 -0
- package/dist/code-intelligence/config/index.js.map +1 -0
- package/dist/code-intelligence/embeddings/EmbeddingCache.d.ts +81 -0
- package/dist/code-intelligence/embeddings/EmbeddingCache.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/EmbeddingCache.js +168 -0
- package/dist/code-intelligence/embeddings/EmbeddingCache.js.map +1 -0
- package/dist/code-intelligence/embeddings/NomicEmbedder.d.ts +82 -0
- package/dist/code-intelligence/embeddings/NomicEmbedder.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/NomicEmbedder.js +233 -0
- package/dist/code-intelligence/embeddings/NomicEmbedder.js.map +1 -0
- package/dist/code-intelligence/embeddings/OllamaClient.d.ts +42 -0
- package/dist/code-intelligence/embeddings/OllamaClient.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/OllamaClient.js +142 -0
- package/dist/code-intelligence/embeddings/OllamaClient.js.map +1 -0
- package/dist/code-intelligence/embeddings/index.d.ts +33 -0
- package/dist/code-intelligence/embeddings/index.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/index.js +39 -0
- package/dist/code-intelligence/embeddings/index.js.map +1 -0
- package/dist/code-intelligence/embeddings/types.d.ts +84 -0
- package/dist/code-intelligence/embeddings/types.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/types.js +19 -0
- package/dist/code-intelligence/embeddings/types.js.map +1 -0
- package/dist/code-intelligence/graph/GraphBuilder.d.ts +126 -0
- package/dist/code-intelligence/graph/GraphBuilder.d.ts.map +1 -0
- package/dist/code-intelligence/graph/GraphBuilder.js +416 -0
- package/dist/code-intelligence/graph/GraphBuilder.js.map +1 -0
- package/dist/code-intelligence/graph/ImportParser.d.ts +72 -0
- package/dist/code-intelligence/graph/ImportParser.d.ts.map +1 -0
- package/dist/code-intelligence/graph/ImportParser.js +422 -0
- package/dist/code-intelligence/graph/ImportParser.js.map +1 -0
- package/dist/code-intelligence/graph/RelationshipExtractor.d.ts +74 -0
- package/dist/code-intelligence/graph/RelationshipExtractor.d.ts.map +1 -0
- package/dist/code-intelligence/graph/RelationshipExtractor.js +310 -0
- package/dist/code-intelligence/graph/RelationshipExtractor.js.map +1 -0
- package/dist/code-intelligence/graph/TestMapper.d.ts +99 -0
- package/dist/code-intelligence/graph/TestMapper.d.ts.map +1 -0
- package/dist/code-intelligence/graph/TestMapper.js +335 -0
- package/dist/code-intelligence/graph/TestMapper.js.map +1 -0
- package/dist/code-intelligence/graph/index.d.ts +14 -0
- package/dist/code-intelligence/graph/index.d.ts.map +1 -0
- package/dist/code-intelligence/graph/index.js +19 -0
- package/dist/code-intelligence/graph/index.js.map +1 -0
- package/dist/code-intelligence/graph/types.d.ts +141 -0
- package/dist/code-intelligence/graph/types.d.ts.map +1 -0
- package/dist/code-intelligence/graph/types.js +18 -0
- package/dist/code-intelligence/graph/types.js.map +1 -0
- package/dist/code-intelligence/indexing/FileWatcher.d.ts +90 -0
- package/dist/code-intelligence/indexing/FileWatcher.d.ts.map +1 -0
- package/dist/code-intelligence/indexing/FileWatcher.js +304 -0
- package/dist/code-intelligence/indexing/FileWatcher.js.map +1 -0
- package/dist/code-intelligence/indexing/GitChangeDetector.d.ts +76 -0
- package/dist/code-intelligence/indexing/GitChangeDetector.d.ts.map +1 -0
- package/dist/code-intelligence/indexing/GitChangeDetector.js +347 -0
- package/dist/code-intelligence/indexing/GitChangeDetector.js.map +1 -0
- package/dist/code-intelligence/indexing/IncrementalIndexer.d.ts +108 -0
- package/dist/code-intelligence/indexing/IncrementalIndexer.d.ts.map +1 -0
- package/dist/code-intelligence/indexing/IncrementalIndexer.js +269 -0
- package/dist/code-intelligence/indexing/IncrementalIndexer.js.map +1 -0
- package/dist/code-intelligence/indexing/index.d.ts +11 -0
- package/dist/code-intelligence/indexing/index.d.ts.map +1 -0
- package/dist/code-intelligence/indexing/index.js +18 -0
- package/dist/code-intelligence/indexing/index.js.map +1 -0
- package/dist/code-intelligence/indexing/types.d.ts +133 -0
- package/dist/code-intelligence/indexing/types.d.ts.map +1 -0
- package/dist/code-intelligence/indexing/types.js +27 -0
- package/dist/code-intelligence/indexing/types.js.map +1 -0
- package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.d.ts +150 -0
- package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.d.ts.map +1 -0
- package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.js +806 -0
- package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.js.map +1 -0
- package/dist/code-intelligence/orchestrator/index.d.ts +8 -0
- package/dist/code-intelligence/orchestrator/index.d.ts.map +1 -0
- package/dist/code-intelligence/orchestrator/index.js +24 -0
- package/dist/code-intelligence/orchestrator/index.js.map +1 -0
- package/dist/code-intelligence/orchestrator/types.d.ts +164 -0
- package/dist/code-intelligence/orchestrator/types.d.ts.map +1 -0
- package/dist/code-intelligence/orchestrator/types.js +18 -0
- package/dist/code-intelligence/orchestrator/types.js.map +1 -0
- package/dist/code-intelligence/parser/LanguageRegistry.d.ts +13 -0
- package/dist/code-intelligence/parser/LanguageRegistry.d.ts.map +1 -0
- package/dist/code-intelligence/parser/LanguageRegistry.js +150 -0
- package/dist/code-intelligence/parser/LanguageRegistry.js.map +1 -0
- package/dist/code-intelligence/parser/TreeSitterParser.d.ts +98 -0
- package/dist/code-intelligence/parser/TreeSitterParser.d.ts.map +1 -0
- package/dist/code-intelligence/parser/TreeSitterParser.js +530 -0
- package/dist/code-intelligence/parser/TreeSitterParser.js.map +1 -0
- package/dist/code-intelligence/parser/extractors/BaseExtractor.d.ts +36 -0
- package/dist/code-intelligence/parser/extractors/BaseExtractor.d.ts.map +1 -0
- package/dist/code-intelligence/parser/extractors/BaseExtractor.js +31 -0
- package/dist/code-intelligence/parser/extractors/BaseExtractor.js.map +1 -0
- package/dist/code-intelligence/parser/extractors/GoExtractor.d.ts +21 -0
- package/dist/code-intelligence/parser/extractors/GoExtractor.d.ts.map +1 -0
- package/dist/code-intelligence/parser/extractors/GoExtractor.js +249 -0
- package/dist/code-intelligence/parser/extractors/GoExtractor.js.map +1 -0
- package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.d.ts +21 -0
- package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.d.ts.map +1 -0
- package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.js +217 -0
- package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.js.map +1 -0
- package/dist/code-intelligence/parser/extractors/PythonExtractor.d.ts +20 -0
- package/dist/code-intelligence/parser/extractors/PythonExtractor.d.ts.map +1 -0
- package/dist/code-intelligence/parser/extractors/PythonExtractor.js +237 -0
- package/dist/code-intelligence/parser/extractors/PythonExtractor.js.map +1 -0
- package/dist/code-intelligence/parser/extractors/RustExtractor.d.ts +21 -0
- package/dist/code-intelligence/parser/extractors/RustExtractor.d.ts.map +1 -0
- package/dist/code-intelligence/parser/extractors/RustExtractor.js +234 -0
- package/dist/code-intelligence/parser/extractors/RustExtractor.js.map +1 -0
- package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.d.ts +23 -0
- package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.d.ts.map +1 -0
- package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.js +247 -0
- package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.js.map +1 -0
- package/dist/code-intelligence/parser/extractors/index.d.ts +7 -0
- package/dist/code-intelligence/parser/extractors/index.d.ts.map +1 -0
- package/dist/code-intelligence/parser/extractors/index.js +16 -0
- package/dist/code-intelligence/parser/extractors/index.js.map +1 -0
- package/dist/code-intelligence/parser/index.d.ts +8 -0
- package/dist/code-intelligence/parser/index.d.ts.map +1 -0
- package/dist/code-intelligence/parser/index.js +12 -0
- package/dist/code-intelligence/parser/index.js.map +1 -0
- package/dist/code-intelligence/parser/types.d.ts +60 -0
- package/dist/code-intelligence/parser/types.d.ts.map +1 -0
- package/dist/code-intelligence/parser/types.js +6 -0
- package/dist/code-intelligence/parser/types.js.map +1 -0
- package/dist/code-intelligence/rag/ContextBuilder.d.ts +82 -0
- package/dist/code-intelligence/rag/ContextBuilder.d.ts.map +1 -0
- package/dist/code-intelligence/rag/ContextBuilder.js +242 -0
- package/dist/code-intelligence/rag/ContextBuilder.js.map +1 -0
- package/dist/code-intelligence/rag/GraphExpander.d.ts +95 -0
- package/dist/code-intelligence/rag/GraphExpander.d.ts.map +1 -0
- package/dist/code-intelligence/rag/GraphExpander.js +250 -0
- package/dist/code-intelligence/rag/GraphExpander.js.map +1 -0
- package/dist/code-intelligence/rag/index.d.ts +9 -0
- package/dist/code-intelligence/rag/index.d.ts.map +1 -0
- package/dist/code-intelligence/rag/index.js +25 -0
- package/dist/code-intelligence/rag/index.js.map +1 -0
- package/dist/code-intelligence/rag/types.d.ts +121 -0
- package/dist/code-intelligence/rag/types.d.ts.map +1 -0
- package/dist/code-intelligence/rag/types.js +50 -0
- package/dist/code-intelligence/rag/types.js.map +1 -0
- package/dist/code-intelligence/retrieval/SemanticRetriever.d.ts +62 -0
- package/dist/code-intelligence/retrieval/SemanticRetriever.d.ts.map +1 -0
- package/dist/code-intelligence/retrieval/SemanticRetriever.js +174 -0
- package/dist/code-intelligence/retrieval/SemanticRetriever.js.map +1 -0
- package/dist/code-intelligence/retrieval/index.d.ts +9 -0
- package/dist/code-intelligence/retrieval/index.d.ts.map +1 -0
- package/dist/code-intelligence/retrieval/index.js +16 -0
- package/dist/code-intelligence/retrieval/index.js.map +1 -0
- package/dist/code-intelligence/retrieval/types.d.ts +118 -0
- package/dist/code-intelligence/retrieval/types.d.ts.map +1 -0
- package/dist/code-intelligence/retrieval/types.js +46 -0
- package/dist/code-intelligence/retrieval/types.js.map +1 -0
- package/dist/code-intelligence/router/CodeIntelligenceHybridRouter.d.ts +167 -0
- package/dist/code-intelligence/router/CodeIntelligenceHybridRouter.d.ts.map +1 -0
- package/dist/code-intelligence/router/CodeIntelligenceHybridRouter.js +365 -0
- package/dist/code-intelligence/router/CodeIntelligenceHybridRouter.js.map +1 -0
- package/dist/code-intelligence/router/index.d.ts +7 -0
- package/dist/code-intelligence/router/index.d.ts.map +1 -0
- package/dist/code-intelligence/router/index.js +14 -0
- package/dist/code-intelligence/router/index.js.map +1 -0
- package/dist/code-intelligence/search/BM25Search.d.ts +74 -0
- package/dist/code-intelligence/search/BM25Search.d.ts.map +1 -0
- package/dist/code-intelligence/search/BM25Search.js +233 -0
- package/dist/code-intelligence/search/BM25Search.js.map +1 -0
- package/dist/code-intelligence/search/HybridSearchEngine.d.ts +94 -0
- package/dist/code-intelligence/search/HybridSearchEngine.d.ts.map +1 -0
- package/dist/code-intelligence/search/HybridSearchEngine.js +168 -0
- package/dist/code-intelligence/search/HybridSearchEngine.js.map +1 -0
- package/dist/code-intelligence/search/RRFFusion.d.ts +46 -0
- package/dist/code-intelligence/search/RRFFusion.d.ts.map +1 -0
- package/dist/code-intelligence/search/RRFFusion.js +223 -0
- package/dist/code-intelligence/search/RRFFusion.js.map +1 -0
- package/dist/code-intelligence/search/VectorSearch.d.ts +157 -0
- package/dist/code-intelligence/search/VectorSearch.d.ts.map +1 -0
- package/dist/code-intelligence/search/VectorSearch.js +301 -0
- package/dist/code-intelligence/search/VectorSearch.js.map +1 -0
- package/dist/code-intelligence/search/index.d.ts +14 -0
- package/dist/code-intelligence/search/index.d.ts.map +1 -0
- package/dist/code-intelligence/search/index.js +23 -0
- package/dist/code-intelligence/search/index.js.map +1 -0
- package/dist/code-intelligence/search/types.d.ts +201 -0
- package/dist/code-intelligence/search/types.d.ts.map +1 -0
- package/dist/code-intelligence/search/types.js +35 -0
- package/dist/code-intelligence/search/types.js.map +1 -0
- package/dist/code-intelligence/service/CodeIntelligenceService.d.ts +171 -0
- package/dist/code-intelligence/service/CodeIntelligenceService.d.ts.map +1 -0
- package/dist/code-intelligence/service/CodeIntelligenceService.js +325 -0
- package/dist/code-intelligence/service/CodeIntelligenceService.js.map +1 -0
- package/dist/code-intelligence/service/index.d.ts +7 -0
- package/dist/code-intelligence/service/index.d.ts.map +1 -0
- package/dist/code-intelligence/service/index.js +14 -0
- package/dist/code-intelligence/service/index.js.map +1 -0
- package/dist/code-intelligence/storage/CodeChunkStore.d.ts +213 -0
- package/dist/code-intelligence/storage/CodeChunkStore.d.ts.map +1 -0
- package/dist/code-intelligence/storage/CodeChunkStore.js +542 -0
- package/dist/code-intelligence/storage/CodeChunkStore.js.map +1 -0
- package/dist/code-intelligence/storage/index.d.ts +7 -0
- package/dist/code-intelligence/storage/index.d.ts.map +1 -0
- package/dist/code-intelligence/storage/index.js +13 -0
- package/dist/code-intelligence/storage/index.js.map +1 -0
- package/dist/code-intelligence/visualization/ClassDiagramBuilder.d.ts +51 -0
- package/dist/code-intelligence/visualization/ClassDiagramBuilder.d.ts.map +1 -0
- package/dist/code-intelligence/visualization/ClassDiagramBuilder.js +180 -0
- package/dist/code-intelligence/visualization/ClassDiagramBuilder.js.map +1 -0
- package/dist/code-intelligence/visualization/DependencyGraphBuilder.d.ts +66 -0
- package/dist/code-intelligence/visualization/DependencyGraphBuilder.d.ts.map +1 -0
- package/dist/code-intelligence/visualization/DependencyGraphBuilder.js +203 -0
- package/dist/code-intelligence/visualization/DependencyGraphBuilder.js.map +1 -0
- package/dist/code-intelligence/visualization/MermaidGenerator.d.ts +76 -0
- package/dist/code-intelligence/visualization/MermaidGenerator.d.ts.map +1 -0
- package/dist/code-intelligence/visualization/MermaidGenerator.js +368 -0
- package/dist/code-intelligence/visualization/MermaidGenerator.js.map +1 -0
- package/dist/code-intelligence/visualization/index.d.ts +9 -0
- package/dist/code-intelligence/visualization/index.d.ts.map +1 -0
- package/dist/code-intelligence/visualization/index.js +15 -0
- package/dist/code-intelligence/visualization/index.js.map +1 -0
- package/dist/core/FleetManager.d.ts +27 -0
- package/dist/core/FleetManager.d.ts.map +1 -1
- package/dist/core/FleetManager.js +84 -0
- package/dist/core/FleetManager.js.map +1 -1
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/core/memory/HNSWVectorMemory.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/docs/reference/agents.md +44 -1
- package/package.json +12 -1
|
@@ -0,0 +1,806 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Code Intelligence Orchestrator
|
|
4
|
+
*
|
|
5
|
+
* The main integration layer that connects all components:
|
|
6
|
+
* - FileWatcher → IncrementalIndexer → ASTChunker → NomicEmbedder → Database
|
|
7
|
+
* - TreeSitterParser → GraphBuilder → RelationshipExtractor
|
|
8
|
+
* - HybridSearchEngine with BM25 + Vector search
|
|
9
|
+
*
|
|
10
|
+
* INTEGRATED WITH EXISTING INFRASTRUCTURE:
|
|
11
|
+
* - CodeChunkStore (RuVector PostgreSQL) for persistent storage
|
|
12
|
+
* - HybridRouter for embeddings and LLM queries
|
|
13
|
+
* - VectorSearch delegates to CodeChunkStore
|
|
14
|
+
*
|
|
15
|
+
* This is the "hallway" that connects all the "rooms".
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.CodeIntelligenceOrchestrator = void 0;
|
|
52
|
+
const events_1 = require("events");
|
|
53
|
+
const fs = __importStar(require("fs/promises"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
// Import all modules
|
|
56
|
+
const IncrementalIndexer_js_1 = require("../indexing/IncrementalIndexer.js");
|
|
57
|
+
const FileWatcher_js_1 = require("../indexing/FileWatcher.js");
|
|
58
|
+
const TreeSitterParser_js_1 = require("../parser/TreeSitterParser.js");
|
|
59
|
+
const ASTChunker_js_1 = require("../chunking/ASTChunker.js");
|
|
60
|
+
const NomicEmbedder_js_1 = require("../embeddings/NomicEmbedder.js");
|
|
61
|
+
const GraphBuilder_js_1 = require("../graph/GraphBuilder.js");
|
|
62
|
+
const RelationshipExtractor_js_1 = require("../graph/RelationshipExtractor.js");
|
|
63
|
+
const HybridSearchEngine_js_1 = require("../search/HybridSearchEngine.js");
|
|
64
|
+
const ImportParser_js_1 = require("../graph/ImportParser.js");
|
|
65
|
+
const TestMapper_js_1 = require("../graph/TestMapper.js");
|
|
66
|
+
const GitChangeDetector_js_1 = require("../indexing/GitChangeDetector.js");
|
|
67
|
+
const CodeIntelligenceHybridRouter_js_1 = require("../router/CodeIntelligenceHybridRouter.js");
|
|
68
|
+
const types_js_1 = require("./types.js");
|
|
69
|
+
class CodeIntelligenceOrchestrator extends events_1.EventEmitter {
|
|
70
|
+
constructor(config = {}) {
|
|
71
|
+
super();
|
|
72
|
+
// RuVector-integrated router for embeddings and storage
|
|
73
|
+
this.codeRouter = null;
|
|
74
|
+
// State
|
|
75
|
+
this.isInitialized = false;
|
|
76
|
+
this.isIndexing = false;
|
|
77
|
+
this.embeddingCache = new Map(); // Fallback for in-memory mode
|
|
78
|
+
this.config = { ...types_js_1.DEFAULT_ORCHESTRATOR_CONFIG, ...config };
|
|
79
|
+
// Initialize components
|
|
80
|
+
this.indexer = new IncrementalIndexer_js_1.IncrementalIndexer(this.config.indexer);
|
|
81
|
+
this.fileWatcher = new FileWatcher_js_1.FileWatcher({
|
|
82
|
+
rootDir: this.config.rootDir,
|
|
83
|
+
...this.config.watcher,
|
|
84
|
+
});
|
|
85
|
+
this.parser = new TreeSitterParser_js_1.TreeSitterParser();
|
|
86
|
+
this.chunker = new ASTChunker_js_1.ASTChunker(this.config.chunker);
|
|
87
|
+
this.embedder = new NomicEmbedder_js_1.NomicEmbedder(this.config.ollamaUrl);
|
|
88
|
+
this.graphBuilder = new GraphBuilder_js_1.GraphBuilder(this.config.graph);
|
|
89
|
+
this.relationshipExtractor = new RelationshipExtractor_js_1.RelationshipExtractor(this.graphBuilder);
|
|
90
|
+
this.searchEngine = new HybridSearchEngine_js_1.HybridSearchEngine(this.config.search);
|
|
91
|
+
this.importParser = new ImportParser_js_1.ImportParser();
|
|
92
|
+
this.testMapper = new TestMapper_js_1.TestMapper(this.config.rootDir);
|
|
93
|
+
this.gitDetector = new GitChangeDetector_js_1.GitChangeDetector(this.config.rootDir);
|
|
94
|
+
// Initialize CodeIntelligenceHybridRouter if database configured
|
|
95
|
+
if (this.config.database?.enabled) {
|
|
96
|
+
// Parse Ollama URL to extract port
|
|
97
|
+
let ollamaPort = 11434;
|
|
98
|
+
try {
|
|
99
|
+
const ollamaUrl = new URL(this.config.ollamaUrl);
|
|
100
|
+
ollamaPort = parseInt(ollamaUrl.port) || 11434;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Use default port
|
|
104
|
+
}
|
|
105
|
+
this.codeRouter = new CodeIntelligenceHybridRouter_js_1.CodeIntelligenceHybridRouter({
|
|
106
|
+
database: this.config.database,
|
|
107
|
+
ruvllm: {
|
|
108
|
+
port: ollamaPort,
|
|
109
|
+
},
|
|
110
|
+
embeddingDimension: 768,
|
|
111
|
+
autoStoreChunks: true,
|
|
112
|
+
storeRelationships: true,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// Wire up file watcher to indexer
|
|
116
|
+
this.setupFileWatcherIntegration();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Initialize the orchestrator.
|
|
120
|
+
*/
|
|
121
|
+
async initialize() {
|
|
122
|
+
if (this.isInitialized)
|
|
123
|
+
return;
|
|
124
|
+
// Parser initializes in constructor, no additional setup needed
|
|
125
|
+
// Initialize CodeIntelligenceHybridRouter (RuVector-backed)
|
|
126
|
+
if (this.codeRouter) {
|
|
127
|
+
try {
|
|
128
|
+
await this.codeRouter.initialize();
|
|
129
|
+
console.log('CodeIntelligenceHybridRouter initialized with RuVector database');
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.warn('Failed to initialize CodeIntelligenceHybridRouter:', error);
|
|
133
|
+
console.warn('Falling back to in-memory mode');
|
|
134
|
+
this.codeRouter = null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Initialize embedder (check Ollama health) - used for in-memory fallback
|
|
138
|
+
if (!this.codeRouter) {
|
|
139
|
+
const embedderReady = await this.embedder.healthCheck();
|
|
140
|
+
if (!embedderReady) {
|
|
141
|
+
console.warn('Ollama not available - embeddings will be skipped');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Set up vector search provider
|
|
145
|
+
this.setupVectorSearchProvider();
|
|
146
|
+
this.isInitialized = true;
|
|
147
|
+
this.emit('initialized');
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Index a project directory.
|
|
151
|
+
*/
|
|
152
|
+
async indexProject(rootDir, progressCallback) {
|
|
153
|
+
if (!this.isInitialized) {
|
|
154
|
+
await this.initialize();
|
|
155
|
+
}
|
|
156
|
+
if (this.isIndexing) {
|
|
157
|
+
throw new Error('Indexing already in progress');
|
|
158
|
+
}
|
|
159
|
+
this.isIndexing = true;
|
|
160
|
+
const projectRoot = rootDir || this.config.rootDir;
|
|
161
|
+
const startTime = Date.now();
|
|
162
|
+
const progress = {
|
|
163
|
+
phase: 'scanning',
|
|
164
|
+
totalFiles: 0,
|
|
165
|
+
processedFiles: 0,
|
|
166
|
+
chunksCreated: 0,
|
|
167
|
+
embeddingsGenerated: 0,
|
|
168
|
+
relationshipsExtracted: 0,
|
|
169
|
+
errors: [],
|
|
170
|
+
startTime,
|
|
171
|
+
elapsedMs: 0,
|
|
172
|
+
};
|
|
173
|
+
const result = {
|
|
174
|
+
success: true,
|
|
175
|
+
stats: {
|
|
176
|
+
filesIndexed: 0,
|
|
177
|
+
chunksCreated: 0,
|
|
178
|
+
embeddingsGenerated: 0,
|
|
179
|
+
nodesCreated: 0,
|
|
180
|
+
edgesCreated: 0,
|
|
181
|
+
totalTimeMs: 0,
|
|
182
|
+
averageTimePerFileMs: 0,
|
|
183
|
+
},
|
|
184
|
+
failures: [],
|
|
185
|
+
};
|
|
186
|
+
try {
|
|
187
|
+
// Phase 1: Scan files
|
|
188
|
+
progress.phase = 'scanning';
|
|
189
|
+
this.emitProgress(progress, progressCallback);
|
|
190
|
+
const files = await this.scanDirectory(projectRoot);
|
|
191
|
+
progress.totalFiles = files.length;
|
|
192
|
+
this.emitProgress(progress, progressCallback);
|
|
193
|
+
// Phase 2-5: Process files in batches
|
|
194
|
+
for (let i = 0; i < files.length; i += this.config.batchSize) {
|
|
195
|
+
const batch = files.slice(i, i + this.config.batchSize);
|
|
196
|
+
await Promise.all(batch.map(async (filePath) => {
|
|
197
|
+
try {
|
|
198
|
+
await this.processFile(filePath, progress);
|
|
199
|
+
progress.processedFiles++;
|
|
200
|
+
result.stats.filesIndexed++;
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
204
|
+
progress.errors.push({ file: filePath, error: errorMsg });
|
|
205
|
+
result.failures.push({ file: filePath, error: errorMsg });
|
|
206
|
+
}
|
|
207
|
+
progress.elapsedMs = Date.now() - startTime;
|
|
208
|
+
if (progress.processedFiles > 0) {
|
|
209
|
+
const avgTime = progress.elapsedMs / progress.processedFiles;
|
|
210
|
+
progress.estimatedRemainingMs =
|
|
211
|
+
avgTime * (progress.totalFiles - progress.processedFiles);
|
|
212
|
+
}
|
|
213
|
+
this.emitProgress(progress, progressCallback);
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
// Phase 6: Extract cross-file relationships
|
|
217
|
+
progress.phase = 'indexing';
|
|
218
|
+
this.emitProgress(progress, progressCallback);
|
|
219
|
+
await this.extractCrossFileRelationships(projectRoot);
|
|
220
|
+
// Complete
|
|
221
|
+
progress.phase = 'complete';
|
|
222
|
+
progress.elapsedMs = Date.now() - startTime;
|
|
223
|
+
this.emitProgress(progress, progressCallback);
|
|
224
|
+
// Update result stats
|
|
225
|
+
const graphStats = this.graphBuilder.getStats();
|
|
226
|
+
result.stats.chunksCreated = progress.chunksCreated;
|
|
227
|
+
result.stats.embeddingsGenerated = progress.embeddingsGenerated;
|
|
228
|
+
result.stats.nodesCreated = graphStats.nodeCount;
|
|
229
|
+
result.stats.edgesCreated = graphStats.edgeCount;
|
|
230
|
+
result.stats.totalTimeMs = progress.elapsedMs;
|
|
231
|
+
result.stats.averageTimePerFileMs =
|
|
232
|
+
result.stats.filesIndexed > 0
|
|
233
|
+
? result.stats.totalTimeMs / result.stats.filesIndexed
|
|
234
|
+
: 0;
|
|
235
|
+
result.success = result.failures.length === 0;
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
this.isIndexing = false;
|
|
239
|
+
}
|
|
240
|
+
this.emit('indexingComplete', result);
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Process incremental changes.
|
|
245
|
+
*/
|
|
246
|
+
async processChanges(changes) {
|
|
247
|
+
const startTime = Date.now();
|
|
248
|
+
const result = {
|
|
249
|
+
success: true,
|
|
250
|
+
stats: {
|
|
251
|
+
filesIndexed: 0,
|
|
252
|
+
chunksCreated: 0,
|
|
253
|
+
embeddingsGenerated: 0,
|
|
254
|
+
nodesCreated: 0,
|
|
255
|
+
edgesCreated: 0,
|
|
256
|
+
totalTimeMs: 0,
|
|
257
|
+
averageTimePerFileMs: 0,
|
|
258
|
+
},
|
|
259
|
+
failures: [],
|
|
260
|
+
};
|
|
261
|
+
// Process each change
|
|
262
|
+
const processed = await this.indexer.processChanges(changes);
|
|
263
|
+
// Handle deletions
|
|
264
|
+
for (const filePath of processed.deleted) {
|
|
265
|
+
this.graphBuilder.removeFile(filePath);
|
|
266
|
+
// Note: Would also remove from search index and database
|
|
267
|
+
}
|
|
268
|
+
// Handle additions and modifications
|
|
269
|
+
const toProcess = [...processed.added, ...processed.modified];
|
|
270
|
+
for (const filePath of toProcess) {
|
|
271
|
+
try {
|
|
272
|
+
const progress = {
|
|
273
|
+
phase: 'parsing',
|
|
274
|
+
totalFiles: 1,
|
|
275
|
+
processedFiles: 0,
|
|
276
|
+
chunksCreated: 0,
|
|
277
|
+
embeddingsGenerated: 0,
|
|
278
|
+
relationshipsExtracted: 0,
|
|
279
|
+
errors: [],
|
|
280
|
+
startTime,
|
|
281
|
+
elapsedMs: 0,
|
|
282
|
+
};
|
|
283
|
+
await this.processFile(filePath, progress);
|
|
284
|
+
result.stats.filesIndexed++;
|
|
285
|
+
result.stats.chunksCreated += progress.chunksCreated;
|
|
286
|
+
result.stats.embeddingsGenerated += progress.embeddingsGenerated;
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
290
|
+
result.failures.push({ file: filePath, error: errorMsg });
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
result.stats.totalTimeMs = Date.now() - startTime;
|
|
294
|
+
result.success = result.failures.length === 0;
|
|
295
|
+
return result;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Query the code intelligence system.
|
|
299
|
+
*/
|
|
300
|
+
async query(context) {
|
|
301
|
+
if (!this.isInitialized) {
|
|
302
|
+
await this.initialize();
|
|
303
|
+
}
|
|
304
|
+
const startTime = Date.now();
|
|
305
|
+
// Perform hybrid search
|
|
306
|
+
const searchResponse = await this.searchEngine.search(context.query, {
|
|
307
|
+
topK: context.topK,
|
|
308
|
+
});
|
|
309
|
+
const results = [];
|
|
310
|
+
for (const searchResult of searchResponse.results) {
|
|
311
|
+
const result = {
|
|
312
|
+
id: searchResult.id,
|
|
313
|
+
filePath: searchResult.filePath,
|
|
314
|
+
content: searchResult.content,
|
|
315
|
+
startLine: searchResult.startLine,
|
|
316
|
+
endLine: searchResult.endLine,
|
|
317
|
+
score: searchResult.score,
|
|
318
|
+
entityType: searchResult.entityType,
|
|
319
|
+
entityName: searchResult.entityName,
|
|
320
|
+
};
|
|
321
|
+
// Add graph context if requested
|
|
322
|
+
if (context.includeGraphContext) {
|
|
323
|
+
result.relatedCode = await this.expandGraphContext(searchResult.filePath, searchResult.entityName, context.graphDepth);
|
|
324
|
+
}
|
|
325
|
+
results.push(result);
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
results,
|
|
329
|
+
metadata: {
|
|
330
|
+
query: context.query,
|
|
331
|
+
totalMatches: searchResponse.totalMatches,
|
|
332
|
+
searchTimeMs: Date.now() - startTime,
|
|
333
|
+
graphExpansionTimeMs: context.includeGraphContext
|
|
334
|
+
? Date.now() - startTime - searchResponse.searchTimeMs
|
|
335
|
+
: undefined,
|
|
336
|
+
},
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Start file watching.
|
|
341
|
+
*/
|
|
342
|
+
async startWatching() {
|
|
343
|
+
if (this.config.watchEnabled) {
|
|
344
|
+
await this.fileWatcher.start();
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Stop file watching.
|
|
349
|
+
*/
|
|
350
|
+
async stopWatching() {
|
|
351
|
+
await this.fileWatcher.stop();
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Get changed files since last index using git.
|
|
355
|
+
*/
|
|
356
|
+
async getGitChanges(sinceCommit) {
|
|
357
|
+
if (!this.config.gitEnabled) {
|
|
358
|
+
return [];
|
|
359
|
+
}
|
|
360
|
+
return this.gitDetector.getChangedFiles(sinceCommit);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Get current statistics.
|
|
364
|
+
*/
|
|
365
|
+
getStats() {
|
|
366
|
+
return {
|
|
367
|
+
indexer: this.indexer.getStats(),
|
|
368
|
+
graph: this.graphBuilder.getStats(),
|
|
369
|
+
search: this.searchEngine.getStats(),
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Get configuration.
|
|
374
|
+
*/
|
|
375
|
+
getConfig() {
|
|
376
|
+
return { ...this.config };
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Clear all indexes.
|
|
380
|
+
*/
|
|
381
|
+
async clear() {
|
|
382
|
+
this.indexer.clearIndex();
|
|
383
|
+
this.graphBuilder.clear();
|
|
384
|
+
this.searchEngine.clear();
|
|
385
|
+
this.embeddingCache.clear();
|
|
386
|
+
// Clear database storage if using codeRouter
|
|
387
|
+
if (this.codeRouter) {
|
|
388
|
+
await this.codeRouter.clearStorage();
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Check if using database-backed storage.
|
|
393
|
+
*/
|
|
394
|
+
isUsingDatabase() {
|
|
395
|
+
return this.codeRouter !== null && this.codeRouter.isUsingDatabase();
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Get the code router (for advanced operations).
|
|
399
|
+
*/
|
|
400
|
+
getCodeRouter() {
|
|
401
|
+
return this.codeRouter;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Get the graph builder (for visualization and context building).
|
|
405
|
+
*/
|
|
406
|
+
getGraphBuilder() {
|
|
407
|
+
return this.graphBuilder;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Get the search engine (for context building).
|
|
411
|
+
*/
|
|
412
|
+
getSearchEngine() {
|
|
413
|
+
return this.searchEngine;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Shutdown the orchestrator.
|
|
417
|
+
*/
|
|
418
|
+
async shutdown() {
|
|
419
|
+
await this.stopWatching();
|
|
420
|
+
if (this.codeRouter) {
|
|
421
|
+
await this.codeRouter.shutdown();
|
|
422
|
+
this.codeRouter = null;
|
|
423
|
+
}
|
|
424
|
+
this.isInitialized = false;
|
|
425
|
+
this.emit('shutdown');
|
|
426
|
+
}
|
|
427
|
+
// === Private Methods ===
|
|
428
|
+
/**
|
|
429
|
+
* Process a single file through the entire pipeline.
|
|
430
|
+
*/
|
|
431
|
+
async processFile(filePath, progress) {
|
|
432
|
+
progress.currentFile = filePath;
|
|
433
|
+
// Read file content
|
|
434
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
435
|
+
const language = this.detectLanguage(filePath);
|
|
436
|
+
// Check if file needs re-indexing
|
|
437
|
+
if (!this.indexer.needsReindex(filePath, content)) {
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
// Phase 1: Parse file
|
|
441
|
+
progress.phase = 'parsing';
|
|
442
|
+
const indexedFile = await this.indexer.indexFile(filePath, content, language);
|
|
443
|
+
let entities = [];
|
|
444
|
+
try {
|
|
445
|
+
const parseResult = await this.parser.parseFile(filePath, content);
|
|
446
|
+
entities = parseResult.entities;
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
// Log but continue - file can still be chunked line-based
|
|
450
|
+
console.warn(`Failed to parse ${filePath}:`, error);
|
|
451
|
+
}
|
|
452
|
+
// Phase 2: Chunk file (ASTChunker parses internally, entities used for graph)
|
|
453
|
+
progress.phase = 'chunking';
|
|
454
|
+
const chunkingResult = this.chunker.chunkFile(filePath, content, language);
|
|
455
|
+
const chunks = chunkingResult.chunks;
|
|
456
|
+
progress.chunksCreated += chunks.length;
|
|
457
|
+
// Phase 3: Generate embeddings and store in database
|
|
458
|
+
progress.phase = 'embedding';
|
|
459
|
+
const chunkIds = [];
|
|
460
|
+
if (this.codeRouter) {
|
|
461
|
+
// Use CodeIntelligenceHybridRouter for database-backed storage
|
|
462
|
+
try {
|
|
463
|
+
const embeddedChunks = await this.codeRouter.embedAndStoreChunks(chunks);
|
|
464
|
+
for (const embeddedChunk of embeddedChunks) {
|
|
465
|
+
// Add to search engine (for BM25 keyword search)
|
|
466
|
+
this.searchEngine.addDocument({
|
|
467
|
+
id: embeddedChunk.chunk.id,
|
|
468
|
+
filePath: embeddedChunk.chunk.filePath,
|
|
469
|
+
content: embeddedChunk.chunk.content,
|
|
470
|
+
startLine: embeddedChunk.chunk.lineStart,
|
|
471
|
+
endLine: embeddedChunk.chunk.lineEnd,
|
|
472
|
+
entityType: embeddedChunk.chunk.entityType,
|
|
473
|
+
entityName: embeddedChunk.chunk.parentEntity,
|
|
474
|
+
});
|
|
475
|
+
chunkIds.push(embeddedChunk.chunk.id);
|
|
476
|
+
progress.embeddingsGenerated++;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
console.warn(`Failed to embed chunks for ${filePath}:`, error);
|
|
481
|
+
// Fall back to adding documents without embeddings
|
|
482
|
+
for (const chunk of chunks) {
|
|
483
|
+
this.searchEngine.addDocument({
|
|
484
|
+
id: chunk.id,
|
|
485
|
+
filePath: chunk.filePath,
|
|
486
|
+
content: chunk.content,
|
|
487
|
+
startLine: chunk.lineStart,
|
|
488
|
+
endLine: chunk.lineEnd,
|
|
489
|
+
entityType: chunk.entityType,
|
|
490
|
+
entityName: chunk.parentEntity,
|
|
491
|
+
});
|
|
492
|
+
chunkIds.push(chunk.id);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
// Fallback: In-memory mode
|
|
498
|
+
for (const chunk of chunks) {
|
|
499
|
+
const embedding = await this.generateEmbedding(chunk);
|
|
500
|
+
// Add to search engine
|
|
501
|
+
this.searchEngine.addDocument({
|
|
502
|
+
id: chunk.id,
|
|
503
|
+
filePath: chunk.filePath,
|
|
504
|
+
content: chunk.content,
|
|
505
|
+
startLine: chunk.lineStart,
|
|
506
|
+
endLine: chunk.lineEnd,
|
|
507
|
+
entityType: chunk.entityType,
|
|
508
|
+
entityName: chunk.parentEntity,
|
|
509
|
+
});
|
|
510
|
+
chunkIds.push(chunk.id);
|
|
511
|
+
if (embedding) {
|
|
512
|
+
progress.embeddingsGenerated++;
|
|
513
|
+
// Store embedding in memory for vector search
|
|
514
|
+
this.embeddingCache.set(chunk.id, embedding);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
// Phase 4: Build graph
|
|
519
|
+
progress.phase = 'indexing';
|
|
520
|
+
// Add file node
|
|
521
|
+
const fileNode = this.graphBuilder.addNode('file', path.basename(filePath), filePath, 1, content.split('\n').length, language);
|
|
522
|
+
// Add entity nodes and extract relationships
|
|
523
|
+
for (const entity of entities) {
|
|
524
|
+
const entityNode = this.graphBuilder.addNode(entity.type, entity.name, filePath, entity.lineStart, entity.lineEnd, language, {
|
|
525
|
+
parameters: entity.metadata.parameters,
|
|
526
|
+
returnType: entity.metadata.returnType,
|
|
527
|
+
visibility: entity.metadata.visibility,
|
|
528
|
+
isAsync: entity.metadata.isAsync,
|
|
529
|
+
isExported: entity.metadata.isExported,
|
|
530
|
+
});
|
|
531
|
+
// DEFINES relationship (file defines entity)
|
|
532
|
+
this.graphBuilder.addEdge(fileNode.id, entityNode.id, 'defines');
|
|
533
|
+
}
|
|
534
|
+
// Extract inheritance relationships from parsed entities
|
|
535
|
+
// Convert CodeEntity[] to ParsedEntity[] format for RelationshipExtractor
|
|
536
|
+
const parsedEntities = entities.map((entity) => ({
|
|
537
|
+
type: entity.type,
|
|
538
|
+
name: entity.name,
|
|
539
|
+
filePath: entity.filePath,
|
|
540
|
+
startLine: entity.lineStart,
|
|
541
|
+
endLine: entity.lineEnd,
|
|
542
|
+
language: entity.language,
|
|
543
|
+
parent: entity.metadata.parentClass,
|
|
544
|
+
returnType: entity.metadata.returnType,
|
|
545
|
+
parameters: entity.metadata.parameters?.map((p) => ({ name: p, type: 'unknown' })),
|
|
546
|
+
}));
|
|
547
|
+
const extractionResult = this.relationshipExtractor.extractFromEntities(parsedEntities);
|
|
548
|
+
progress.relationshipsExtracted += extractionResult.edgesCreated;
|
|
549
|
+
// Extract import relationships
|
|
550
|
+
const imports = this.importParser.parseImports(content, language);
|
|
551
|
+
for (const imp of imports) {
|
|
552
|
+
const targetPath = this.importParser.resolveImportPath(imp, filePath);
|
|
553
|
+
if (targetPath) {
|
|
554
|
+
const targetFileNode = this.graphBuilder.findOrCreateNode('file', path.basename(targetPath), targetPath);
|
|
555
|
+
this.graphBuilder.addEdge(fileNode.id, targetFileNode.id, 'imports');
|
|
556
|
+
progress.relationshipsExtracted++;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
// Mark file as indexed
|
|
560
|
+
this.indexer.markIndexed(filePath, chunkIds);
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Extract cross-file relationships (tests, calls).
|
|
564
|
+
*/
|
|
565
|
+
async extractCrossFileRelationships(rootDir) {
|
|
566
|
+
// Map test files to source files
|
|
567
|
+
const testMappings = await this.testMapper.mapTestFiles();
|
|
568
|
+
for (const mapping of testMappings) {
|
|
569
|
+
const testFileNode = this.graphBuilder.findNode(path.basename(mapping.testFile), mapping.testFile, 'file');
|
|
570
|
+
const sourceFileNode = this.graphBuilder.findNode(path.basename(mapping.sourceFile), mapping.sourceFile, 'file');
|
|
571
|
+
if (testFileNode && sourceFileNode) {
|
|
572
|
+
this.graphBuilder.addEdge(testFileNode.id, sourceFileNode.id, 'tests');
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Generate embedding for a chunk.
|
|
578
|
+
*/
|
|
579
|
+
async generateEmbedding(chunk) {
|
|
580
|
+
try {
|
|
581
|
+
const text = this.formatChunkForEmbedding(chunk);
|
|
582
|
+
// embed() takes a single string and returns number[] directly
|
|
583
|
+
const embedding = await this.embedder.embed(text);
|
|
584
|
+
return embedding;
|
|
585
|
+
}
|
|
586
|
+
catch (error) {
|
|
587
|
+
// Embedding failures are not fatal
|
|
588
|
+
return null;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Format chunk content for embedding.
|
|
593
|
+
*/
|
|
594
|
+
formatChunkForEmbedding(chunk) {
|
|
595
|
+
const parts = [];
|
|
596
|
+
if (chunk.language) {
|
|
597
|
+
parts.push(`Language: ${chunk.language}`);
|
|
598
|
+
}
|
|
599
|
+
if (chunk.entityType) {
|
|
600
|
+
parts.push(`Type: ${chunk.entityType}`);
|
|
601
|
+
}
|
|
602
|
+
if (chunk.parentEntity) {
|
|
603
|
+
parts.push(`Name: ${chunk.parentEntity}`);
|
|
604
|
+
}
|
|
605
|
+
parts.push('');
|
|
606
|
+
parts.push(chunk.content);
|
|
607
|
+
return parts.join('\n');
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Expand graph context for a result.
|
|
611
|
+
*/
|
|
612
|
+
async expandGraphContext(filePath, entityName, depth = 2) {
|
|
613
|
+
const related = [];
|
|
614
|
+
// Find starting node
|
|
615
|
+
const startNode = entityName
|
|
616
|
+
? this.graphBuilder.findNode(entityName, filePath)
|
|
617
|
+
: this.graphBuilder.findNode(path.basename(filePath), filePath, 'file');
|
|
618
|
+
if (!startNode)
|
|
619
|
+
return related;
|
|
620
|
+
// Get neighbors up to specified depth
|
|
621
|
+
const queryResult = this.graphBuilder.query({
|
|
622
|
+
startNode: startNode.id,
|
|
623
|
+
maxDepth: depth,
|
|
624
|
+
limit: 10,
|
|
625
|
+
direction: 'both',
|
|
626
|
+
});
|
|
627
|
+
for (const node of queryResult.nodes) {
|
|
628
|
+
if (node.id === startNode.id)
|
|
629
|
+
continue;
|
|
630
|
+
// Find relationship type
|
|
631
|
+
const edge = queryResult.edges.find((e) => e.source === startNode.id && e.target === node.id) || queryResult.edges.find((e) => e.target === startNode.id && e.source === node.id);
|
|
632
|
+
if (edge) {
|
|
633
|
+
try {
|
|
634
|
+
const content = await fs.readFile(node.filePath, 'utf-8');
|
|
635
|
+
const lines = content.split('\n');
|
|
636
|
+
const snippet = lines
|
|
637
|
+
.slice(node.startLine - 1, node.endLine)
|
|
638
|
+
.join('\n');
|
|
639
|
+
related.push({
|
|
640
|
+
filePath: node.filePath,
|
|
641
|
+
content: snippet,
|
|
642
|
+
relationship: edge.type,
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
catch {
|
|
646
|
+
// File not accessible - skip
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
return related;
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Set up vector search provider using RuVector database or in-memory cache.
|
|
654
|
+
*/
|
|
655
|
+
setupVectorSearchProvider() {
|
|
656
|
+
const self = this;
|
|
657
|
+
const vectorProvider = {
|
|
658
|
+
async search(query, topK) {
|
|
659
|
+
// Use CodeIntelligenceHybridRouter if available (RuVector-backed)
|
|
660
|
+
if (self.codeRouter) {
|
|
661
|
+
try {
|
|
662
|
+
const results = await self.codeRouter.searchCode(query, { topK });
|
|
663
|
+
return results.map((r) => ({
|
|
664
|
+
id: r.id,
|
|
665
|
+
filePath: r.filePath,
|
|
666
|
+
content: r.content,
|
|
667
|
+
startLine: r.startLine,
|
|
668
|
+
endLine: r.endLine,
|
|
669
|
+
score: r.score,
|
|
670
|
+
vectorScore: r.score,
|
|
671
|
+
entityType: r.entityType,
|
|
672
|
+
entityName: r.entityName,
|
|
673
|
+
}));
|
|
674
|
+
}
|
|
675
|
+
catch (error) {
|
|
676
|
+
console.warn('RuVector search failed, falling back to in-memory:', error);
|
|
677
|
+
// Fall through to in-memory search
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
// Fallback: In-memory search using embedding cache
|
|
681
|
+
let queryEmbedding;
|
|
682
|
+
try {
|
|
683
|
+
// embed() takes a single string and returns number[] directly
|
|
684
|
+
queryEmbedding = await self.embedder.embed(query);
|
|
685
|
+
}
|
|
686
|
+
catch {
|
|
687
|
+
return [];
|
|
688
|
+
}
|
|
689
|
+
if (!queryEmbedding)
|
|
690
|
+
return [];
|
|
691
|
+
// Calculate similarity scores against in-memory cache
|
|
692
|
+
const scores = [];
|
|
693
|
+
for (const [id, embedding] of self.embeddingCache.entries()) {
|
|
694
|
+
const score = self.cosineSimilarity(queryEmbedding, embedding);
|
|
695
|
+
scores.push({ id, score });
|
|
696
|
+
}
|
|
697
|
+
// Sort by score and take topK
|
|
698
|
+
scores.sort((a, b) => b.score - a.score);
|
|
699
|
+
const topResults = scores.slice(0, topK);
|
|
700
|
+
// Convert to SearchResult format
|
|
701
|
+
return topResults.map((s) => ({
|
|
702
|
+
id: s.id,
|
|
703
|
+
filePath: '',
|
|
704
|
+
content: '',
|
|
705
|
+
startLine: 0,
|
|
706
|
+
endLine: 0,
|
|
707
|
+
score: s.score,
|
|
708
|
+
vectorScore: s.score,
|
|
709
|
+
}));
|
|
710
|
+
},
|
|
711
|
+
};
|
|
712
|
+
this.searchEngine.setVectorProvider(vectorProvider);
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* Calculate cosine similarity between two vectors.
|
|
716
|
+
*/
|
|
717
|
+
cosineSimilarity(a, b) {
|
|
718
|
+
if (a.length !== b.length)
|
|
719
|
+
return 0;
|
|
720
|
+
let dotProduct = 0;
|
|
721
|
+
let normA = 0;
|
|
722
|
+
let normB = 0;
|
|
723
|
+
for (let i = 0; i < a.length; i++) {
|
|
724
|
+
dotProduct += a[i] * b[i];
|
|
725
|
+
normA += a[i] * a[i];
|
|
726
|
+
normB += b[i] * b[i];
|
|
727
|
+
}
|
|
728
|
+
const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
|
|
729
|
+
return magnitude === 0 ? 0 : dotProduct / magnitude;
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* Set up file watcher integration.
|
|
733
|
+
*/
|
|
734
|
+
setupFileWatcherIntegration() {
|
|
735
|
+
this.fileWatcher.onChanges(async (changes) => {
|
|
736
|
+
if (!this.isIndexing) {
|
|
737
|
+
const result = await this.processChanges(changes);
|
|
738
|
+
this.emit('incrementalUpdate', result);
|
|
739
|
+
}
|
|
740
|
+
});
|
|
741
|
+
this.fileWatcher.on('error', (error) => {
|
|
742
|
+
this.emit('error', error);
|
|
743
|
+
});
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Scan directory for indexable files.
|
|
747
|
+
*/
|
|
748
|
+
async scanDirectory(dir) {
|
|
749
|
+
const files = [];
|
|
750
|
+
const config = this.indexer.getConfig();
|
|
751
|
+
const scan = async (currentDir) => {
|
|
752
|
+
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
753
|
+
for (const entry of entries) {
|
|
754
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
755
|
+
if (entry.isDirectory()) {
|
|
756
|
+
// Skip excluded directories
|
|
757
|
+
if (!config.excludeDirs.includes(entry.name)) {
|
|
758
|
+
await scan(fullPath);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
else if (entry.isFile()) {
|
|
762
|
+
const ext = path.extname(entry.name);
|
|
763
|
+
if (config.extensions.includes(ext)) {
|
|
764
|
+
const stat = await fs.stat(fullPath);
|
|
765
|
+
if (stat.size <= config.maxFileSize) {
|
|
766
|
+
files.push(fullPath);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
};
|
|
772
|
+
await scan(dir);
|
|
773
|
+
return files;
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Detect language from file extension.
|
|
777
|
+
*/
|
|
778
|
+
detectLanguage(filePath) {
|
|
779
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
780
|
+
const langMap = {
|
|
781
|
+
'.ts': 'typescript',
|
|
782
|
+
'.tsx': 'typescript',
|
|
783
|
+
'.js': 'javascript',
|
|
784
|
+
'.jsx': 'javascript',
|
|
785
|
+
'.py': 'python',
|
|
786
|
+
'.go': 'go',
|
|
787
|
+
'.rs': 'rust',
|
|
788
|
+
'.java': 'java',
|
|
789
|
+
'.c': 'c',
|
|
790
|
+
'.cpp': 'cpp',
|
|
791
|
+
'.h': 'c',
|
|
792
|
+
};
|
|
793
|
+
return langMap[ext] || 'unknown';
|
|
794
|
+
}
|
|
795
|
+
/**
|
|
796
|
+
* Emit progress event.
|
|
797
|
+
*/
|
|
798
|
+
emitProgress(progress, callback) {
|
|
799
|
+
this.emit('progress', progress);
|
|
800
|
+
if (callback) {
|
|
801
|
+
callback(progress);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
exports.CodeIntelligenceOrchestrator = CodeIntelligenceOrchestrator;
|
|
806
|
+
//# sourceMappingURL=CodeIntelligenceOrchestrator.js.map
|