agentic-qe 2.5.10 → 2.6.1
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 +146 -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/agents/pool/AgentPool.d.ts +112 -0
- package/dist/agents/pool/AgentPool.d.ts.map +1 -0
- package/dist/agents/pool/AgentPool.js +573 -0
- package/dist/agents/pool/AgentPool.js.map +1 -0
- package/dist/agents/pool/QEAgentPoolFactory.d.ts +118 -0
- package/dist/agents/pool/QEAgentPoolFactory.d.ts.map +1 -0
- package/dist/agents/pool/QEAgentPoolFactory.js +251 -0
- package/dist/agents/pool/QEAgentPoolFactory.js.map +1 -0
- package/dist/agents/pool/index.d.ts +34 -0
- package/dist/agents/pool/index.d.ts.map +1 -0
- package/dist/agents/pool/index.js +44 -0
- package/dist/agents/pool/index.js.map +1 -0
- package/dist/agents/pool/types.d.ts +227 -0
- package/dist/agents/pool/types.d.ts.map +1 -0
- package/dist/agents/pool/types.js +28 -0
- package/dist/agents/pool/types.js.map +1 -0
- 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/handlers/agent-spawn.d.ts +71 -5
- package/dist/mcp/handlers/agent-spawn.d.ts.map +1 -1
- package/dist/mcp/handlers/agent-spawn.js +336 -110
- package/dist/mcp/handlers/agent-spawn.js.map +1 -1
- package/dist/mcp/handlers/fleet-init.d.ts +24 -0
- package/dist/mcp/handlers/fleet-init.d.ts.map +1 -1
- package/dist/mcp/handlers/fleet-init.js +56 -4
- package/dist/mcp/handlers/fleet-init.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/memory/HNSWPatternStore.d.ts.map +1 -1
- package/dist/memory/HNSWPatternStore.js.map +1 -1
- package/dist/plugins/BasePlugin.d.ts +111 -0
- package/dist/plugins/BasePlugin.d.ts.map +1 -0
- package/dist/plugins/BasePlugin.js +154 -0
- package/dist/plugins/BasePlugin.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +145 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +862 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/adapters/McpToolsPlugin.d.ts +98 -0
- package/dist/plugins/adapters/McpToolsPlugin.d.ts.map +1 -0
- package/dist/plugins/adapters/McpToolsPlugin.js +518 -0
- package/dist/plugins/adapters/McpToolsPlugin.js.map +1 -0
- package/dist/plugins/adapters/PlaywrightPlugin.d.ts +63 -0
- package/dist/plugins/adapters/PlaywrightPlugin.d.ts.map +1 -0
- package/dist/plugins/adapters/PlaywrightPlugin.js +451 -0
- package/dist/plugins/adapters/PlaywrightPlugin.js.map +1 -0
- package/dist/plugins/adapters/VitestPlugin.d.ts +74 -0
- package/dist/plugins/adapters/VitestPlugin.d.ts.map +1 -0
- package/dist/plugins/adapters/VitestPlugin.js +589 -0
- package/dist/plugins/adapters/VitestPlugin.js.map +1 -0
- package/dist/plugins/adapters/index.d.ts +8 -0
- package/dist/plugins/adapters/index.d.ts.map +1 -0
- package/dist/plugins/adapters/index.js +17 -0
- package/dist/plugins/adapters/index.js.map +1 -0
- package/dist/plugins/index.d.ts +32 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +48 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/types.d.ts +528 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +61 -0
- package/dist/plugins/types.js.map +1 -0
- 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 +15 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Pool Implementation
|
|
3
|
+
* Phase 3 D1: Memory Pooling for 16x Agent Spawn Speedup
|
|
4
|
+
*
|
|
5
|
+
* Target Performance:
|
|
6
|
+
* - Spawn time: <6ms (down from ~50-100ms)
|
|
7
|
+
* - Memory stable under load
|
|
8
|
+
* - Graceful degradation when exhausted
|
|
9
|
+
*
|
|
10
|
+
* Architecture:
|
|
11
|
+
* - Pre-allocated agent instances per type
|
|
12
|
+
* - Thread-safe acquire/release with mutex
|
|
13
|
+
* - Automatic pool expansion on demand
|
|
14
|
+
* - Health monitoring and recovery
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'events';
|
|
17
|
+
import { QEAgentType } from '../../types';
|
|
18
|
+
import { AgentPoolConfig, PoolStats, AcquireOptions, ReleaseOptions, AcquireResult, IResettableAgent } from './types';
|
|
19
|
+
/**
|
|
20
|
+
* Agent Pool - Pre-allocated agent instance management
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const pool = new AgentPool(factory, config);
|
|
25
|
+
* await pool.warmup();
|
|
26
|
+
*
|
|
27
|
+
* // Fast acquisition (<6ms)
|
|
28
|
+
* const { agent, meta } = await pool.acquire('test-generator');
|
|
29
|
+
*
|
|
30
|
+
* // Use agent...
|
|
31
|
+
* await agent.executeTask(task);
|
|
32
|
+
*
|
|
33
|
+
* // Return to pool
|
|
34
|
+
* await pool.release(meta.poolId);
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class AgentPool<T extends IResettableAgent> extends EventEmitter {
|
|
38
|
+
private readonly config;
|
|
39
|
+
private readonly factory;
|
|
40
|
+
private readonly pools;
|
|
41
|
+
private readonly agentsByPoolId;
|
|
42
|
+
private readonly waitingQueues;
|
|
43
|
+
private readonly mutexes;
|
|
44
|
+
private stats;
|
|
45
|
+
private healthCheckTimer;
|
|
46
|
+
private isShuttingDown;
|
|
47
|
+
constructor(factory: AgentFactory<T>, config?: Partial<AgentPoolConfig>);
|
|
48
|
+
/**
|
|
49
|
+
* Warm up the pool by pre-creating agents
|
|
50
|
+
* Should be called during application startup
|
|
51
|
+
*/
|
|
52
|
+
warmup(types?: QEAgentType[]): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Acquire an agent from the pool
|
|
55
|
+
* Returns immediately if available, otherwise waits or creates new
|
|
56
|
+
*
|
|
57
|
+
* @param type - Agent type to acquire
|
|
58
|
+
* @param options - Acquisition options
|
|
59
|
+
* @returns Acquired agent with metadata
|
|
60
|
+
*/
|
|
61
|
+
acquire(type: QEAgentType, options?: AcquireOptions): Promise<AcquireResult<T>>;
|
|
62
|
+
/**
|
|
63
|
+
* Release an agent back to the pool
|
|
64
|
+
*
|
|
65
|
+
* @param poolId - Pool ID of the agent to release
|
|
66
|
+
* @param options - Release options
|
|
67
|
+
*/
|
|
68
|
+
release(poolId: string, options?: ReleaseOptions): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Get current pool statistics
|
|
71
|
+
*/
|
|
72
|
+
getStats(): PoolStats;
|
|
73
|
+
/**
|
|
74
|
+
* Shutdown the pool and dispose all agents
|
|
75
|
+
*/
|
|
76
|
+
shutdown(): Promise<void>;
|
|
77
|
+
private getPool;
|
|
78
|
+
private getTypeConfig;
|
|
79
|
+
private getConfiguredTypes;
|
|
80
|
+
private createPooledAgent;
|
|
81
|
+
private addToPool;
|
|
82
|
+
private tryAcquireFromPool;
|
|
83
|
+
private canCreateMore;
|
|
84
|
+
private getWaitingCount;
|
|
85
|
+
private waitForAgent;
|
|
86
|
+
private removeWaitingRequest;
|
|
87
|
+
private fulfillWaitingRequest;
|
|
88
|
+
private disposeAgent;
|
|
89
|
+
private replenishPool;
|
|
90
|
+
private recordAcquisition;
|
|
91
|
+
private startHealthCheck;
|
|
92
|
+
private performHealthCheck;
|
|
93
|
+
private log;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Factory interface for creating agents
|
|
97
|
+
*/
|
|
98
|
+
export interface AgentFactory<T extends IResettableAgent> {
|
|
99
|
+
/**
|
|
100
|
+
* Create a new agent instance
|
|
101
|
+
*/
|
|
102
|
+
create(type: QEAgentType): Promise<T>;
|
|
103
|
+
/**
|
|
104
|
+
* Initialize an agent (heavy async operations)
|
|
105
|
+
*/
|
|
106
|
+
initialize(agent: T): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Dispose an agent (cleanup resources)
|
|
109
|
+
*/
|
|
110
|
+
dispose(agent: T): Promise<void>;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=AgentPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentPool.d.ts","sourceRoot":"","sources":["../../../src/agents/pool/AgentPool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,eAAe,EAIf,SAAS,EAET,cAAc,EACd,cAAc,EACd,aAAa,EAEb,gBAAgB,EACjB,MAAM,SAAS,CAAC;AA2CjB;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,gBAAgB,CAAE,SAAQ,YAAY;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAG1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsD;IAG5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+C;IAG9E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoD;IAGlF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8C;IAGtE,OAAO,CAAC,KAAK,CAIX;IAGF,OAAO,CAAC,gBAAgB,CAA+B;IAGvD,OAAO,CAAC,cAAc,CAAS;gBAG7B,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAavC;;;OAGG;IACG,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoClD;;;;;;;OAOG;IACG,OAAO,CACX,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAgF5B;;;;;OAKG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmD1E;;OAEG;IACH,QAAQ,IAAI,SAAS;IA8DrB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC/B,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,kBAAkB;YAeZ,iBAAiB;IAqC/B,OAAO,CAAC,SAAS;YAMH,kBAAkB;IA0ChC,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,eAAe;YAKT,YAAY;IA6C1B,OAAO,CAAC,oBAAoB;YAUd,qBAAqB;YAkBrB,YAAY;YAkCZ,aAAa;IAmB3B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,gBAAgB;YAMV,kBAAkB;IAsBhC,OAAO,CAAC,GAAG;CAKZ;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,gBAAgB;IACtD;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEtC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC"}
|
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent Pool Implementation
|
|
4
|
+
* Phase 3 D1: Memory Pooling for 16x Agent Spawn Speedup
|
|
5
|
+
*
|
|
6
|
+
* Target Performance:
|
|
7
|
+
* - Spawn time: <6ms (down from ~50-100ms)
|
|
8
|
+
* - Memory stable under load
|
|
9
|
+
* - Graceful degradation when exhausted
|
|
10
|
+
*
|
|
11
|
+
* Architecture:
|
|
12
|
+
* - Pre-allocated agent instances per type
|
|
13
|
+
* - Thread-safe acquire/release with mutex
|
|
14
|
+
* - Automatic pool expansion on demand
|
|
15
|
+
* - Health monitoring and recovery
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.AgentPool = void 0;
|
|
19
|
+
const events_1 = require("events");
|
|
20
|
+
const crypto_1 = require("crypto");
|
|
21
|
+
const types_1 = require("./types");
|
|
22
|
+
/**
|
|
23
|
+
* Default pool configuration
|
|
24
|
+
*/
|
|
25
|
+
const DEFAULT_TYPE_CONFIG = {
|
|
26
|
+
minSize: 2,
|
|
27
|
+
maxSize: 10,
|
|
28
|
+
warmupCount: 2,
|
|
29
|
+
preInitialize: false, // Lazy init by default for faster startup
|
|
30
|
+
idleTtlMs: 300000, // 5 minutes
|
|
31
|
+
growthIncrement: 2,
|
|
32
|
+
};
|
|
33
|
+
const DEFAULT_POOL_CONFIG = {
|
|
34
|
+
typeConfigs: new Map(),
|
|
35
|
+
defaultConfig: DEFAULT_TYPE_CONFIG,
|
|
36
|
+
debug: false,
|
|
37
|
+
globalMaxAgents: 100,
|
|
38
|
+
warmupStrategy: 'lazy',
|
|
39
|
+
healthCheckIntervalMs: 60000, // 1 minute
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Agent Pool - Pre-allocated agent instance management
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const pool = new AgentPool(factory, config);
|
|
47
|
+
* await pool.warmup();
|
|
48
|
+
*
|
|
49
|
+
* // Fast acquisition (<6ms)
|
|
50
|
+
* const { agent, meta } = await pool.acquire('test-generator');
|
|
51
|
+
*
|
|
52
|
+
* // Use agent...
|
|
53
|
+
* await agent.executeTask(task);
|
|
54
|
+
*
|
|
55
|
+
* // Return to pool
|
|
56
|
+
* await pool.release(meta.poolId);
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
class AgentPool extends events_1.EventEmitter {
|
|
60
|
+
constructor(factory, config = {}) {
|
|
61
|
+
super();
|
|
62
|
+
// Pool storage: type -> array of pooled agents
|
|
63
|
+
this.pools = new Map();
|
|
64
|
+
// Quick lookup by poolId
|
|
65
|
+
this.agentsByPoolId = new Map();
|
|
66
|
+
// Waiting queue for each type
|
|
67
|
+
this.waitingQueues = new Map();
|
|
68
|
+
// Mutex for thread-safe operations
|
|
69
|
+
this.mutexes = new Map();
|
|
70
|
+
// Statistics
|
|
71
|
+
this.stats = {
|
|
72
|
+
totalAcquisitions: 0,
|
|
73
|
+
totalMisses: 0,
|
|
74
|
+
totalAcquisitionTimeMs: 0,
|
|
75
|
+
};
|
|
76
|
+
// Health check timer
|
|
77
|
+
this.healthCheckTimer = null;
|
|
78
|
+
// Shutdown flag
|
|
79
|
+
this.isShuttingDown = false;
|
|
80
|
+
this.factory = factory;
|
|
81
|
+
this.config = { ...DEFAULT_POOL_CONFIG, ...config };
|
|
82
|
+
if (config.typeConfigs) {
|
|
83
|
+
this.config.typeConfigs = new Map(config.typeConfigs);
|
|
84
|
+
}
|
|
85
|
+
this.log('AgentPool initialized', { globalMax: this.config.globalMaxAgents });
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Warm up the pool by pre-creating agents
|
|
89
|
+
* Should be called during application startup
|
|
90
|
+
*/
|
|
91
|
+
async warmup(types) {
|
|
92
|
+
const typesToWarm = types || this.getConfiguredTypes();
|
|
93
|
+
this.log('Starting pool warmup', { types: typesToWarm });
|
|
94
|
+
const warmupPromises = typesToWarm.map(async (type) => {
|
|
95
|
+
const typeConfig = this.getTypeConfig(type);
|
|
96
|
+
const count = typeConfig.warmupCount;
|
|
97
|
+
if (count <= 0)
|
|
98
|
+
return;
|
|
99
|
+
this.log(`Warming ${count} agents of type ${type}`);
|
|
100
|
+
const startTime = Date.now();
|
|
101
|
+
// Create agents in parallel for faster warmup
|
|
102
|
+
const createPromises = Array(count)
|
|
103
|
+
.fill(null)
|
|
104
|
+
.map(() => this.createPooledAgent(type, typeConfig.preInitialize));
|
|
105
|
+
const agents = await Promise.all(createPromises);
|
|
106
|
+
agents.forEach((entry) => this.addToPool(type, entry));
|
|
107
|
+
const elapsed = Date.now() - startTime;
|
|
108
|
+
this.log(`Warmed ${count} ${type} agents in ${elapsed}ms`);
|
|
109
|
+
this.emit('pool:warmed', { type, count });
|
|
110
|
+
});
|
|
111
|
+
await Promise.all(warmupPromises);
|
|
112
|
+
// Start health check if configured
|
|
113
|
+
if (this.config.healthCheckIntervalMs > 0) {
|
|
114
|
+
this.startHealthCheck();
|
|
115
|
+
}
|
|
116
|
+
this.log('Pool warmup complete', this.getStats());
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Acquire an agent from the pool
|
|
120
|
+
* Returns immediately if available, otherwise waits or creates new
|
|
121
|
+
*
|
|
122
|
+
* @param type - Agent type to acquire
|
|
123
|
+
* @param options - Acquisition options
|
|
124
|
+
* @returns Acquired agent with metadata
|
|
125
|
+
*/
|
|
126
|
+
async acquire(type, options = {}) {
|
|
127
|
+
const startTime = Date.now();
|
|
128
|
+
const { timeoutMs = 5000, waitIfUnavailable = true, priority = 0, requiredCapabilities = [], } = options;
|
|
129
|
+
if (this.isShuttingDown) {
|
|
130
|
+
throw new Error('Pool is shutting down');
|
|
131
|
+
}
|
|
132
|
+
// Try to get from pool first (fast path)
|
|
133
|
+
const fromPool = await this.tryAcquireFromPool(type, requiredCapabilities);
|
|
134
|
+
if (fromPool) {
|
|
135
|
+
const acquisitionTimeMs = Date.now() - startTime;
|
|
136
|
+
this.recordAcquisition(acquisitionTimeMs, true);
|
|
137
|
+
this.emit('agent:acquired', {
|
|
138
|
+
poolId: fromPool.meta.poolId,
|
|
139
|
+
type,
|
|
140
|
+
fromPool: true,
|
|
141
|
+
});
|
|
142
|
+
return {
|
|
143
|
+
agent: fromPool.agent,
|
|
144
|
+
meta: fromPool.meta,
|
|
145
|
+
fromPool: true,
|
|
146
|
+
acquisitionTimeMs,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Pool miss - try to create new agent
|
|
150
|
+
const typeConfig = this.getTypeConfig(type);
|
|
151
|
+
const pool = this.getPool(type);
|
|
152
|
+
const currentSize = pool.length;
|
|
153
|
+
if (currentSize < typeConfig.maxSize && this.canCreateMore()) {
|
|
154
|
+
// Create new agent
|
|
155
|
+
const entry = await this.createPooledAgent(type, true);
|
|
156
|
+
entry.meta.state = types_1.PooledAgentState.IN_USE;
|
|
157
|
+
entry.meta.lastAcquiredAt = Date.now();
|
|
158
|
+
this.agentsByPoolId.set(entry.meta.poolId, entry);
|
|
159
|
+
const acquisitionTimeMs = Date.now() - startTime;
|
|
160
|
+
this.recordAcquisition(acquisitionTimeMs, false);
|
|
161
|
+
this.emit('agent:created', { poolId: entry.meta.poolId, type });
|
|
162
|
+
this.emit('agent:acquired', {
|
|
163
|
+
poolId: entry.meta.poolId,
|
|
164
|
+
type,
|
|
165
|
+
fromPool: false,
|
|
166
|
+
});
|
|
167
|
+
// Add to pool for tracking
|
|
168
|
+
pool.push(entry);
|
|
169
|
+
return {
|
|
170
|
+
agent: entry.agent,
|
|
171
|
+
meta: entry.meta,
|
|
172
|
+
fromPool: false,
|
|
173
|
+
acquisitionTimeMs,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// Pool exhausted
|
|
177
|
+
if (!waitIfUnavailable) {
|
|
178
|
+
throw new Error(`No agents available for type ${type} and waitIfUnavailable=false`);
|
|
179
|
+
}
|
|
180
|
+
// Queue the request
|
|
181
|
+
this.emit('pool:exhausted', {
|
|
182
|
+
type,
|
|
183
|
+
waitingCount: this.getWaitingCount(type) + 1,
|
|
184
|
+
});
|
|
185
|
+
return this.waitForAgent(type, priority, timeoutMs, startTime);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Release an agent back to the pool
|
|
189
|
+
*
|
|
190
|
+
* @param poolId - Pool ID of the agent to release
|
|
191
|
+
* @param options - Release options
|
|
192
|
+
*/
|
|
193
|
+
async release(poolId, options = {}) {
|
|
194
|
+
const { reset = true, hasError = false, dispose = false } = options;
|
|
195
|
+
const entry = this.agentsByPoolId.get(poolId);
|
|
196
|
+
if (!entry) {
|
|
197
|
+
this.log(`Warning: Attempted to release unknown agent ${poolId}`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (entry.meta.state !== types_1.PooledAgentState.IN_USE) {
|
|
201
|
+
this.log(`Warning: Attempted to release agent not in use ${poolId}`);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const useTime = Date.now() - (entry.meta.lastAcquiredAt || Date.now());
|
|
205
|
+
entry.meta.totalUseTimeMs += useTime;
|
|
206
|
+
entry.meta.lastReleasedAt = Date.now();
|
|
207
|
+
if (dispose || hasError) {
|
|
208
|
+
await this.disposeAgent(entry, hasError ? 'error' : 'explicit');
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
// Reset agent for reuse
|
|
212
|
+
if (reset) {
|
|
213
|
+
entry.meta.state = types_1.PooledAgentState.RESETTING;
|
|
214
|
+
try {
|
|
215
|
+
await entry.agent.reset();
|
|
216
|
+
entry.meta.reuseCount++;
|
|
217
|
+
entry.meta.state = types_1.PooledAgentState.AVAILABLE;
|
|
218
|
+
entry.meta.lastError = null;
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
entry.meta.lastError = error;
|
|
222
|
+
this.emit('agent:error', {
|
|
223
|
+
poolId,
|
|
224
|
+
type: entry.meta.type,
|
|
225
|
+
error: error,
|
|
226
|
+
});
|
|
227
|
+
await this.disposeAgent(entry, 'reset-failed');
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
entry.meta.state = types_1.PooledAgentState.AVAILABLE;
|
|
233
|
+
}
|
|
234
|
+
this.emit('agent:released', { poolId, type: entry.meta.type });
|
|
235
|
+
// Check if anyone is waiting
|
|
236
|
+
await this.fulfillWaitingRequest(entry.meta.type);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get current pool statistics
|
|
240
|
+
*/
|
|
241
|
+
getStats() {
|
|
242
|
+
const byType = new Map();
|
|
243
|
+
let totalAgents = 0;
|
|
244
|
+
let availableAgents = 0;
|
|
245
|
+
let inUseAgents = 0;
|
|
246
|
+
let initializingAgents = 0;
|
|
247
|
+
for (const [type, pool] of this.pools) {
|
|
248
|
+
const typeConfig = this.getTypeConfig(type);
|
|
249
|
+
let available = 0;
|
|
250
|
+
let inUse = 0;
|
|
251
|
+
let totalReuse = 0;
|
|
252
|
+
for (const entry of pool) {
|
|
253
|
+
switch (entry.meta.state) {
|
|
254
|
+
case types_1.PooledAgentState.AVAILABLE:
|
|
255
|
+
available++;
|
|
256
|
+
availableAgents++;
|
|
257
|
+
break;
|
|
258
|
+
case types_1.PooledAgentState.IN_USE:
|
|
259
|
+
inUse++;
|
|
260
|
+
inUseAgents++;
|
|
261
|
+
break;
|
|
262
|
+
case types_1.PooledAgentState.INITIALIZING:
|
|
263
|
+
initializingAgents++;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
totalReuse += entry.meta.reuseCount;
|
|
267
|
+
}
|
|
268
|
+
byType.set(type, {
|
|
269
|
+
type,
|
|
270
|
+
total: pool.length,
|
|
271
|
+
available,
|
|
272
|
+
inUse,
|
|
273
|
+
minSize: typeConfig.minSize,
|
|
274
|
+
maxSize: typeConfig.maxSize,
|
|
275
|
+
avgReuseCount: pool.length > 0 ? totalReuse / pool.length : 0,
|
|
276
|
+
});
|
|
277
|
+
totalAgents += pool.length;
|
|
278
|
+
}
|
|
279
|
+
const totalAcq = this.stats.totalAcquisitions;
|
|
280
|
+
const avgAcquisitionTimeMs = totalAcq > 0 ? this.stats.totalAcquisitionTimeMs / totalAcq : 0;
|
|
281
|
+
const hitRate = totalAcq > 0 ? (totalAcq - this.stats.totalMisses) / totalAcq : 0;
|
|
282
|
+
return {
|
|
283
|
+
totalAgents,
|
|
284
|
+
availableAgents,
|
|
285
|
+
inUseAgents,
|
|
286
|
+
initializingAgents,
|
|
287
|
+
byType,
|
|
288
|
+
avgAcquisitionTimeMs,
|
|
289
|
+
hitRate,
|
|
290
|
+
totalAcquisitions: totalAcq,
|
|
291
|
+
totalMisses: this.stats.totalMisses,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Shutdown the pool and dispose all agents
|
|
296
|
+
*/
|
|
297
|
+
async shutdown() {
|
|
298
|
+
this.isShuttingDown = true;
|
|
299
|
+
this.log('Shutting down pool');
|
|
300
|
+
// Stop health check
|
|
301
|
+
if (this.healthCheckTimer) {
|
|
302
|
+
clearInterval(this.healthCheckTimer);
|
|
303
|
+
this.healthCheckTimer = null;
|
|
304
|
+
}
|
|
305
|
+
// Reject all waiting requests
|
|
306
|
+
for (const [type, queue] of this.waitingQueues) {
|
|
307
|
+
for (const request of queue) {
|
|
308
|
+
clearTimeout(request.timeoutId);
|
|
309
|
+
request.reject(new Error('Pool is shutting down'));
|
|
310
|
+
}
|
|
311
|
+
queue.length = 0;
|
|
312
|
+
}
|
|
313
|
+
// Dispose all agents
|
|
314
|
+
const disposePromises = [];
|
|
315
|
+
for (const [, pool] of this.pools) {
|
|
316
|
+
for (const entry of pool) {
|
|
317
|
+
disposePromises.push(this.disposeAgent(entry, 'shutdown'));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
await Promise.all(disposePromises);
|
|
321
|
+
this.pools.clear();
|
|
322
|
+
this.agentsByPoolId.clear();
|
|
323
|
+
this.log('Pool shutdown complete');
|
|
324
|
+
}
|
|
325
|
+
// === Private Methods ===
|
|
326
|
+
getPool(type) {
|
|
327
|
+
let pool = this.pools.get(type);
|
|
328
|
+
if (!pool) {
|
|
329
|
+
pool = [];
|
|
330
|
+
this.pools.set(type, pool);
|
|
331
|
+
}
|
|
332
|
+
return pool;
|
|
333
|
+
}
|
|
334
|
+
getTypeConfig(type) {
|
|
335
|
+
const specific = this.config.typeConfigs.get(type);
|
|
336
|
+
if (specific)
|
|
337
|
+
return specific;
|
|
338
|
+
return { ...this.config.defaultConfig, type };
|
|
339
|
+
}
|
|
340
|
+
getConfiguredTypes() {
|
|
341
|
+
// Return all configured types plus common defaults
|
|
342
|
+
const types = new Set(this.config.typeConfigs.keys());
|
|
343
|
+
// Add default agent types that should always be warmed
|
|
344
|
+
const defaultTypes = [
|
|
345
|
+
'test-generator',
|
|
346
|
+
'coverage-analyzer',
|
|
347
|
+
'quality-gate',
|
|
348
|
+
];
|
|
349
|
+
defaultTypes.forEach((t) => types.add(t));
|
|
350
|
+
return Array.from(types);
|
|
351
|
+
}
|
|
352
|
+
async createPooledAgent(type, initialize) {
|
|
353
|
+
const poolId = `pool-${type}-${(0, crypto_1.randomUUID)().slice(0, 8)}`;
|
|
354
|
+
const now = Date.now();
|
|
355
|
+
const meta = {
|
|
356
|
+
poolId,
|
|
357
|
+
type,
|
|
358
|
+
state: types_1.PooledAgentState.INITIALIZING,
|
|
359
|
+
createdAt: now,
|
|
360
|
+
lastAcquiredAt: null,
|
|
361
|
+
lastReleasedAt: null,
|
|
362
|
+
reuseCount: 0,
|
|
363
|
+
totalUseTimeMs: 0,
|
|
364
|
+
isInitialized: false,
|
|
365
|
+
lastError: null,
|
|
366
|
+
};
|
|
367
|
+
const agent = await this.factory.create(type);
|
|
368
|
+
meta.state = types_1.PooledAgentState.AVAILABLE;
|
|
369
|
+
if (initialize) {
|
|
370
|
+
try {
|
|
371
|
+
await this.factory.initialize(agent);
|
|
372
|
+
meta.isInitialized = true;
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
meta.lastError = error;
|
|
376
|
+
meta.state = types_1.PooledAgentState.ERROR;
|
|
377
|
+
this.log(`Failed to initialize agent ${poolId}`, error);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return { agent, meta };
|
|
381
|
+
}
|
|
382
|
+
addToPool(type, entry) {
|
|
383
|
+
const pool = this.getPool(type);
|
|
384
|
+
pool.push(entry);
|
|
385
|
+
this.agentsByPoolId.set(entry.meta.poolId, entry);
|
|
386
|
+
}
|
|
387
|
+
async tryAcquireFromPool(type, requiredCapabilities) {
|
|
388
|
+
const pool = this.getPool(type);
|
|
389
|
+
// Find first available agent
|
|
390
|
+
for (const entry of pool) {
|
|
391
|
+
if (entry.meta.state === types_1.PooledAgentState.AVAILABLE) {
|
|
392
|
+
// Check health
|
|
393
|
+
if (!entry.agent.isHealthy()) {
|
|
394
|
+
this.log(`Agent ${entry.meta.poolId} unhealthy, disposing`);
|
|
395
|
+
await this.disposeAgent(entry, 'unhealthy');
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
// Check capabilities if required
|
|
399
|
+
// Note: Capability filtering available when agents expose capabilities
|
|
400
|
+
// Acquire
|
|
401
|
+
entry.meta.state = types_1.PooledAgentState.IN_USE;
|
|
402
|
+
entry.meta.lastAcquiredAt = Date.now();
|
|
403
|
+
// Ensure initialized
|
|
404
|
+
if (!entry.meta.isInitialized) {
|
|
405
|
+
try {
|
|
406
|
+
await this.factory.initialize(entry.agent);
|
|
407
|
+
entry.meta.isInitialized = true;
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
entry.meta.lastError = error;
|
|
411
|
+
await this.disposeAgent(entry, 'init-failed');
|
|
412
|
+
continue;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return entry;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
canCreateMore() {
|
|
421
|
+
let total = 0;
|
|
422
|
+
for (const pool of this.pools.values()) {
|
|
423
|
+
total += pool.length;
|
|
424
|
+
}
|
|
425
|
+
return total < this.config.globalMaxAgents;
|
|
426
|
+
}
|
|
427
|
+
getWaitingCount(type) {
|
|
428
|
+
const queue = this.waitingQueues.get(type);
|
|
429
|
+
return queue?.length || 0;
|
|
430
|
+
}
|
|
431
|
+
async waitForAgent(type, priority, timeoutMs, startTime) {
|
|
432
|
+
return new Promise((resolve, reject) => {
|
|
433
|
+
const timeoutId = setTimeout(() => {
|
|
434
|
+
this.removeWaitingRequest(type, request);
|
|
435
|
+
reject(new Error(`Timeout waiting for agent of type ${type}`));
|
|
436
|
+
}, timeoutMs);
|
|
437
|
+
const request = {
|
|
438
|
+
type,
|
|
439
|
+
priority,
|
|
440
|
+
resolve: (result) => {
|
|
441
|
+
clearTimeout(timeoutId);
|
|
442
|
+
result.acquisitionTimeMs = Date.now() - startTime;
|
|
443
|
+
this.recordAcquisition(result.acquisitionTimeMs, result.fromPool);
|
|
444
|
+
resolve(result);
|
|
445
|
+
},
|
|
446
|
+
reject: (error) => {
|
|
447
|
+
clearTimeout(timeoutId);
|
|
448
|
+
reject(error);
|
|
449
|
+
},
|
|
450
|
+
timeoutId,
|
|
451
|
+
requestedAt: startTime,
|
|
452
|
+
};
|
|
453
|
+
let queue = this.waitingQueues.get(type);
|
|
454
|
+
if (!queue) {
|
|
455
|
+
queue = [];
|
|
456
|
+
this.waitingQueues.set(type, queue);
|
|
457
|
+
}
|
|
458
|
+
// Insert by priority (higher first)
|
|
459
|
+
const insertIdx = queue.findIndex((r) => r.priority < priority);
|
|
460
|
+
if (insertIdx === -1) {
|
|
461
|
+
queue.push(request);
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
queue.splice(insertIdx, 0, request);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
removeWaitingRequest(type, request) {
|
|
469
|
+
const queue = this.waitingQueues.get(type);
|
|
470
|
+
if (queue) {
|
|
471
|
+
const idx = queue.indexOf(request);
|
|
472
|
+
if (idx !== -1) {
|
|
473
|
+
queue.splice(idx, 1);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
async fulfillWaitingRequest(type) {
|
|
478
|
+
const queue = this.waitingQueues.get(type);
|
|
479
|
+
if (!queue || queue.length === 0)
|
|
480
|
+
return;
|
|
481
|
+
const request = queue.shift();
|
|
482
|
+
try {
|
|
483
|
+
const result = await this.acquire(type, {
|
|
484
|
+
waitIfUnavailable: false,
|
|
485
|
+
priority: request.priority,
|
|
486
|
+
});
|
|
487
|
+
request.resolve(result);
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
// Put back in queue for retry
|
|
491
|
+
queue.unshift(request);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
async disposeAgent(entry, reason) {
|
|
495
|
+
entry.meta.state = types_1.PooledAgentState.DISPOSING;
|
|
496
|
+
// Remove from pool
|
|
497
|
+
const pool = this.getPool(entry.meta.type);
|
|
498
|
+
const idx = pool.indexOf(entry);
|
|
499
|
+
if (idx !== -1) {
|
|
500
|
+
pool.splice(idx, 1);
|
|
501
|
+
}
|
|
502
|
+
this.agentsByPoolId.delete(entry.meta.poolId);
|
|
503
|
+
// Dispose via factory
|
|
504
|
+
try {
|
|
505
|
+
await this.factory.dispose(entry.agent);
|
|
506
|
+
}
|
|
507
|
+
catch (error) {
|
|
508
|
+
this.log(`Error disposing agent ${entry.meta.poolId}`, error);
|
|
509
|
+
}
|
|
510
|
+
this.emit('agent:disposed', {
|
|
511
|
+
poolId: entry.meta.poolId,
|
|
512
|
+
type: entry.meta.type,
|
|
513
|
+
reason,
|
|
514
|
+
});
|
|
515
|
+
// Ensure minimum pool size
|
|
516
|
+
const typeConfig = this.getTypeConfig(entry.meta.type);
|
|
517
|
+
if (pool.length < typeConfig.minSize && !this.isShuttingDown) {
|
|
518
|
+
this.replenishPool(entry.meta.type, 1);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
async replenishPool(type, count) {
|
|
522
|
+
const typeConfig = this.getTypeConfig(type);
|
|
523
|
+
const pool = this.getPool(type);
|
|
524
|
+
const toCreate = Math.min(count, typeConfig.maxSize - pool.length);
|
|
525
|
+
if (toCreate <= 0)
|
|
526
|
+
return;
|
|
527
|
+
this.log(`Replenishing ${toCreate} agents for type ${type}`);
|
|
528
|
+
const createPromises = Array(toCreate)
|
|
529
|
+
.fill(null)
|
|
530
|
+
.map(() => this.createPooledAgent(type, typeConfig.preInitialize));
|
|
531
|
+
const entries = await Promise.all(createPromises);
|
|
532
|
+
entries.forEach((entry) => this.addToPool(type, entry));
|
|
533
|
+
this.emit('pool:expanded', { type, newSize: pool.length });
|
|
534
|
+
}
|
|
535
|
+
recordAcquisition(timeMs, fromPool) {
|
|
536
|
+
this.stats.totalAcquisitions++;
|
|
537
|
+
this.stats.totalAcquisitionTimeMs += timeMs;
|
|
538
|
+
if (!fromPool) {
|
|
539
|
+
this.stats.totalMisses++;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
startHealthCheck() {
|
|
543
|
+
this.healthCheckTimer = setInterval(() => {
|
|
544
|
+
this.performHealthCheck();
|
|
545
|
+
}, this.config.healthCheckIntervalMs);
|
|
546
|
+
}
|
|
547
|
+
async performHealthCheck() {
|
|
548
|
+
const stats = this.getStats();
|
|
549
|
+
this.emit('pool:healthCheck', { stats });
|
|
550
|
+
// Check for expired idle agents
|
|
551
|
+
const now = Date.now();
|
|
552
|
+
for (const [type, pool] of this.pools) {
|
|
553
|
+
const typeConfig = this.getTypeConfig(type);
|
|
554
|
+
if (typeConfig.idleTtlMs <= 0)
|
|
555
|
+
continue;
|
|
556
|
+
for (const entry of [...pool]) {
|
|
557
|
+
if (entry.meta.state !== types_1.PooledAgentState.AVAILABLE)
|
|
558
|
+
continue;
|
|
559
|
+
const idleTime = now - (entry.meta.lastReleasedAt || entry.meta.createdAt);
|
|
560
|
+
if (idleTime > typeConfig.idleTtlMs && pool.length > typeConfig.minSize) {
|
|
561
|
+
await this.disposeAgent(entry, 'idle-timeout');
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
log(message, data) {
|
|
567
|
+
if (this.config.debug) {
|
|
568
|
+
console.log(`[AgentPool] ${message}`, data ?? '');
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
exports.AgentPool = AgentPool;
|
|
573
|
+
//# sourceMappingURL=AgentPool.js.map
|