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.
Files changed (371) hide show
  1. package/.claude/agents/qe-code-intelligence.md +359 -0
  2. package/CHANGELOG.md +146 -0
  3. package/README.md +3 -2
  4. package/dist/agents/BaseAgent.d.ts +48 -0
  5. package/dist/agents/BaseAgent.d.ts.map +1 -1
  6. package/dist/agents/BaseAgent.js +126 -0
  7. package/dist/agents/BaseAgent.js.map +1 -1
  8. package/dist/agents/CodeIntelligenceAgent.d.ts +133 -0
  9. package/dist/agents/CodeIntelligenceAgent.d.ts.map +1 -0
  10. package/dist/agents/CodeIntelligenceAgent.js +473 -0
  11. package/dist/agents/CodeIntelligenceAgent.js.map +1 -0
  12. package/dist/agents/context/ContextCache.d.ts +105 -0
  13. package/dist/agents/context/ContextCache.d.ts.map +1 -0
  14. package/dist/agents/context/ContextCache.js +235 -0
  15. package/dist/agents/context/ContextCache.js.map +1 -0
  16. package/dist/agents/context/ContextFormatter.d.ts +92 -0
  17. package/dist/agents/context/ContextFormatter.d.ts.map +1 -0
  18. package/dist/agents/context/ContextFormatter.js +338 -0
  19. package/dist/agents/context/ContextFormatter.js.map +1 -0
  20. package/dist/agents/context/GraphExpander.d.ts +87 -0
  21. package/dist/agents/context/GraphExpander.d.ts.map +1 -0
  22. package/dist/agents/context/GraphExpander.js +215 -0
  23. package/dist/agents/context/GraphExpander.js.map +1 -0
  24. package/dist/agents/context/KnowledgeGraphContextBuilder.d.ts +160 -0
  25. package/dist/agents/context/KnowledgeGraphContextBuilder.d.ts.map +1 -0
  26. package/dist/agents/context/KnowledgeGraphContextBuilder.js +300 -0
  27. package/dist/agents/context/KnowledgeGraphContextBuilder.js.map +1 -0
  28. package/dist/agents/context/index.d.ts +15 -0
  29. package/dist/agents/context/index.d.ts.map +1 -0
  30. package/dist/agents/context/index.js +18 -0
  31. package/dist/agents/context/index.js.map +1 -0
  32. package/dist/agents/index.d.ts +1 -0
  33. package/dist/agents/index.d.ts.map +1 -1
  34. package/dist/agents/index.js +67 -3
  35. package/dist/agents/index.js.map +1 -1
  36. package/dist/agents/pool/AgentPool.d.ts +112 -0
  37. package/dist/agents/pool/AgentPool.d.ts.map +1 -0
  38. package/dist/agents/pool/AgentPool.js +573 -0
  39. package/dist/agents/pool/AgentPool.js.map +1 -0
  40. package/dist/agents/pool/QEAgentPoolFactory.d.ts +118 -0
  41. package/dist/agents/pool/QEAgentPoolFactory.d.ts.map +1 -0
  42. package/dist/agents/pool/QEAgentPoolFactory.js +251 -0
  43. package/dist/agents/pool/QEAgentPoolFactory.js.map +1 -0
  44. package/dist/agents/pool/index.d.ts +34 -0
  45. package/dist/agents/pool/index.d.ts.map +1 -0
  46. package/dist/agents/pool/index.js +44 -0
  47. package/dist/agents/pool/index.js.map +1 -0
  48. package/dist/agents/pool/types.d.ts +227 -0
  49. package/dist/agents/pool/types.d.ts.map +1 -0
  50. package/dist/agents/pool/types.js +28 -0
  51. package/dist/agents/pool/types.js.map +1 -0
  52. package/dist/cli/commands/knowledge-graph.d.ts +112 -0
  53. package/dist/cli/commands/knowledge-graph.d.ts.map +1 -0
  54. package/dist/cli/commands/knowledge-graph.js +466 -0
  55. package/dist/cli/commands/knowledge-graph.js.map +1 -0
  56. package/dist/cli/formatters/KGOutputFormatter.d.ts +50 -0
  57. package/dist/cli/formatters/KGOutputFormatter.d.ts.map +1 -0
  58. package/dist/cli/formatters/KGOutputFormatter.js +237 -0
  59. package/dist/cli/formatters/KGOutputFormatter.js.map +1 -0
  60. package/dist/cli/index-working.js +138 -0
  61. package/dist/cli/index-working.js.map +1 -1
  62. package/dist/cli/init/claude-config.d.ts +13 -1
  63. package/dist/cli/init/claude-config.d.ts.map +1 -1
  64. package/dist/cli/init/claude-config.js +70 -8
  65. package/dist/cli/init/claude-config.js.map +1 -1
  66. package/dist/cli/init/code-intelligence-init.d.ts +52 -0
  67. package/dist/cli/init/code-intelligence-init.d.ts.map +1 -0
  68. package/dist/cli/init/code-intelligence-init.js +250 -0
  69. package/dist/cli/init/code-intelligence-init.js.map +1 -0
  70. package/dist/cli/init/index.d.ts +2 -2
  71. package/dist/cli/init/index.d.ts.map +1 -1
  72. package/dist/cli/init/index.js +10 -1
  73. package/dist/cli/init/index.js.map +1 -1
  74. package/dist/code-intelligence/chunking/ASTChunker.d.ts +64 -0
  75. package/dist/code-intelligence/chunking/ASTChunker.d.ts.map +1 -0
  76. package/dist/code-intelligence/chunking/ASTChunker.js +344 -0
  77. package/dist/code-intelligence/chunking/ASTChunker.js.map +1 -0
  78. package/dist/code-intelligence/chunking/ChunkSplitter.d.ts +48 -0
  79. package/dist/code-intelligence/chunking/ChunkSplitter.d.ts.map +1 -0
  80. package/dist/code-intelligence/chunking/ChunkSplitter.js +278 -0
  81. package/dist/code-intelligence/chunking/ChunkSplitter.js.map +1 -0
  82. package/dist/code-intelligence/chunking/index.d.ts +8 -0
  83. package/dist/code-intelligence/chunking/index.d.ts.map +1 -0
  84. package/dist/code-intelligence/chunking/index.js +13 -0
  85. package/dist/code-intelligence/chunking/index.js.map +1 -0
  86. package/dist/code-intelligence/chunking/types.d.ts +52 -0
  87. package/dist/code-intelligence/chunking/types.d.ts.map +1 -0
  88. package/dist/code-intelligence/chunking/types.js +6 -0
  89. package/dist/code-intelligence/chunking/types.js.map +1 -0
  90. package/dist/code-intelligence/config/database-schema.d.ts +245 -0
  91. package/dist/code-intelligence/config/database-schema.d.ts.map +1 -0
  92. package/dist/code-intelligence/config/database-schema.js +110 -0
  93. package/dist/code-intelligence/config/database-schema.js.map +1 -0
  94. package/dist/code-intelligence/config/environment.d.ts +53 -0
  95. package/dist/code-intelligence/config/environment.d.ts.map +1 -0
  96. package/dist/code-intelligence/config/environment.js +86 -0
  97. package/dist/code-intelligence/config/environment.js.map +1 -0
  98. package/dist/code-intelligence/config/index.d.ts +10 -0
  99. package/dist/code-intelligence/config/index.d.ts.map +1 -0
  100. package/dist/code-intelligence/config/index.js +36 -0
  101. package/dist/code-intelligence/config/index.js.map +1 -0
  102. package/dist/code-intelligence/embeddings/EmbeddingCache.d.ts +81 -0
  103. package/dist/code-intelligence/embeddings/EmbeddingCache.d.ts.map +1 -0
  104. package/dist/code-intelligence/embeddings/EmbeddingCache.js +168 -0
  105. package/dist/code-intelligence/embeddings/EmbeddingCache.js.map +1 -0
  106. package/dist/code-intelligence/embeddings/NomicEmbedder.d.ts +82 -0
  107. package/dist/code-intelligence/embeddings/NomicEmbedder.d.ts.map +1 -0
  108. package/dist/code-intelligence/embeddings/NomicEmbedder.js +233 -0
  109. package/dist/code-intelligence/embeddings/NomicEmbedder.js.map +1 -0
  110. package/dist/code-intelligence/embeddings/OllamaClient.d.ts +42 -0
  111. package/dist/code-intelligence/embeddings/OllamaClient.d.ts.map +1 -0
  112. package/dist/code-intelligence/embeddings/OllamaClient.js +142 -0
  113. package/dist/code-intelligence/embeddings/OllamaClient.js.map +1 -0
  114. package/dist/code-intelligence/embeddings/index.d.ts +33 -0
  115. package/dist/code-intelligence/embeddings/index.d.ts.map +1 -0
  116. package/dist/code-intelligence/embeddings/index.js +39 -0
  117. package/dist/code-intelligence/embeddings/index.js.map +1 -0
  118. package/dist/code-intelligence/embeddings/types.d.ts +84 -0
  119. package/dist/code-intelligence/embeddings/types.d.ts.map +1 -0
  120. package/dist/code-intelligence/embeddings/types.js +19 -0
  121. package/dist/code-intelligence/embeddings/types.js.map +1 -0
  122. package/dist/code-intelligence/graph/GraphBuilder.d.ts +126 -0
  123. package/dist/code-intelligence/graph/GraphBuilder.d.ts.map +1 -0
  124. package/dist/code-intelligence/graph/GraphBuilder.js +416 -0
  125. package/dist/code-intelligence/graph/GraphBuilder.js.map +1 -0
  126. package/dist/code-intelligence/graph/ImportParser.d.ts +72 -0
  127. package/dist/code-intelligence/graph/ImportParser.d.ts.map +1 -0
  128. package/dist/code-intelligence/graph/ImportParser.js +422 -0
  129. package/dist/code-intelligence/graph/ImportParser.js.map +1 -0
  130. package/dist/code-intelligence/graph/RelationshipExtractor.d.ts +74 -0
  131. package/dist/code-intelligence/graph/RelationshipExtractor.d.ts.map +1 -0
  132. package/dist/code-intelligence/graph/RelationshipExtractor.js +310 -0
  133. package/dist/code-intelligence/graph/RelationshipExtractor.js.map +1 -0
  134. package/dist/code-intelligence/graph/TestMapper.d.ts +99 -0
  135. package/dist/code-intelligence/graph/TestMapper.d.ts.map +1 -0
  136. package/dist/code-intelligence/graph/TestMapper.js +335 -0
  137. package/dist/code-intelligence/graph/TestMapper.js.map +1 -0
  138. package/dist/code-intelligence/graph/index.d.ts +14 -0
  139. package/dist/code-intelligence/graph/index.d.ts.map +1 -0
  140. package/dist/code-intelligence/graph/index.js +19 -0
  141. package/dist/code-intelligence/graph/index.js.map +1 -0
  142. package/dist/code-intelligence/graph/types.d.ts +141 -0
  143. package/dist/code-intelligence/graph/types.d.ts.map +1 -0
  144. package/dist/code-intelligence/graph/types.js +18 -0
  145. package/dist/code-intelligence/graph/types.js.map +1 -0
  146. package/dist/code-intelligence/indexing/FileWatcher.d.ts +90 -0
  147. package/dist/code-intelligence/indexing/FileWatcher.d.ts.map +1 -0
  148. package/dist/code-intelligence/indexing/FileWatcher.js +304 -0
  149. package/dist/code-intelligence/indexing/FileWatcher.js.map +1 -0
  150. package/dist/code-intelligence/indexing/GitChangeDetector.d.ts +76 -0
  151. package/dist/code-intelligence/indexing/GitChangeDetector.d.ts.map +1 -0
  152. package/dist/code-intelligence/indexing/GitChangeDetector.js +347 -0
  153. package/dist/code-intelligence/indexing/GitChangeDetector.js.map +1 -0
  154. package/dist/code-intelligence/indexing/IncrementalIndexer.d.ts +108 -0
  155. package/dist/code-intelligence/indexing/IncrementalIndexer.d.ts.map +1 -0
  156. package/dist/code-intelligence/indexing/IncrementalIndexer.js +269 -0
  157. package/dist/code-intelligence/indexing/IncrementalIndexer.js.map +1 -0
  158. package/dist/code-intelligence/indexing/index.d.ts +11 -0
  159. package/dist/code-intelligence/indexing/index.d.ts.map +1 -0
  160. package/dist/code-intelligence/indexing/index.js +18 -0
  161. package/dist/code-intelligence/indexing/index.js.map +1 -0
  162. package/dist/code-intelligence/indexing/types.d.ts +133 -0
  163. package/dist/code-intelligence/indexing/types.d.ts.map +1 -0
  164. package/dist/code-intelligence/indexing/types.js +27 -0
  165. package/dist/code-intelligence/indexing/types.js.map +1 -0
  166. package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.d.ts +150 -0
  167. package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.d.ts.map +1 -0
  168. package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.js +806 -0
  169. package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.js.map +1 -0
  170. package/dist/code-intelligence/orchestrator/index.d.ts +8 -0
  171. package/dist/code-intelligence/orchestrator/index.d.ts.map +1 -0
  172. package/dist/code-intelligence/orchestrator/index.js +24 -0
  173. package/dist/code-intelligence/orchestrator/index.js.map +1 -0
  174. package/dist/code-intelligence/orchestrator/types.d.ts +164 -0
  175. package/dist/code-intelligence/orchestrator/types.d.ts.map +1 -0
  176. package/dist/code-intelligence/orchestrator/types.js +18 -0
  177. package/dist/code-intelligence/orchestrator/types.js.map +1 -0
  178. package/dist/code-intelligence/parser/LanguageRegistry.d.ts +13 -0
  179. package/dist/code-intelligence/parser/LanguageRegistry.d.ts.map +1 -0
  180. package/dist/code-intelligence/parser/LanguageRegistry.js +150 -0
  181. package/dist/code-intelligence/parser/LanguageRegistry.js.map +1 -0
  182. package/dist/code-intelligence/parser/TreeSitterParser.d.ts +98 -0
  183. package/dist/code-intelligence/parser/TreeSitterParser.d.ts.map +1 -0
  184. package/dist/code-intelligence/parser/TreeSitterParser.js +530 -0
  185. package/dist/code-intelligence/parser/TreeSitterParser.js.map +1 -0
  186. package/dist/code-intelligence/parser/extractors/BaseExtractor.d.ts +36 -0
  187. package/dist/code-intelligence/parser/extractors/BaseExtractor.d.ts.map +1 -0
  188. package/dist/code-intelligence/parser/extractors/BaseExtractor.js +31 -0
  189. package/dist/code-intelligence/parser/extractors/BaseExtractor.js.map +1 -0
  190. package/dist/code-intelligence/parser/extractors/GoExtractor.d.ts +21 -0
  191. package/dist/code-intelligence/parser/extractors/GoExtractor.d.ts.map +1 -0
  192. package/dist/code-intelligence/parser/extractors/GoExtractor.js +249 -0
  193. package/dist/code-intelligence/parser/extractors/GoExtractor.js.map +1 -0
  194. package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.d.ts +21 -0
  195. package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.d.ts.map +1 -0
  196. package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.js +217 -0
  197. package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.js.map +1 -0
  198. package/dist/code-intelligence/parser/extractors/PythonExtractor.d.ts +20 -0
  199. package/dist/code-intelligence/parser/extractors/PythonExtractor.d.ts.map +1 -0
  200. package/dist/code-intelligence/parser/extractors/PythonExtractor.js +237 -0
  201. package/dist/code-intelligence/parser/extractors/PythonExtractor.js.map +1 -0
  202. package/dist/code-intelligence/parser/extractors/RustExtractor.d.ts +21 -0
  203. package/dist/code-intelligence/parser/extractors/RustExtractor.d.ts.map +1 -0
  204. package/dist/code-intelligence/parser/extractors/RustExtractor.js +234 -0
  205. package/dist/code-intelligence/parser/extractors/RustExtractor.js.map +1 -0
  206. package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.d.ts +23 -0
  207. package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.d.ts.map +1 -0
  208. package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.js +247 -0
  209. package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.js.map +1 -0
  210. package/dist/code-intelligence/parser/extractors/index.d.ts +7 -0
  211. package/dist/code-intelligence/parser/extractors/index.d.ts.map +1 -0
  212. package/dist/code-intelligence/parser/extractors/index.js +16 -0
  213. package/dist/code-intelligence/parser/extractors/index.js.map +1 -0
  214. package/dist/code-intelligence/parser/index.d.ts +8 -0
  215. package/dist/code-intelligence/parser/index.d.ts.map +1 -0
  216. package/dist/code-intelligence/parser/index.js +12 -0
  217. package/dist/code-intelligence/parser/index.js.map +1 -0
  218. package/dist/code-intelligence/parser/types.d.ts +60 -0
  219. package/dist/code-intelligence/parser/types.d.ts.map +1 -0
  220. package/dist/code-intelligence/parser/types.js +6 -0
  221. package/dist/code-intelligence/parser/types.js.map +1 -0
  222. package/dist/code-intelligence/rag/ContextBuilder.d.ts +82 -0
  223. package/dist/code-intelligence/rag/ContextBuilder.d.ts.map +1 -0
  224. package/dist/code-intelligence/rag/ContextBuilder.js +242 -0
  225. package/dist/code-intelligence/rag/ContextBuilder.js.map +1 -0
  226. package/dist/code-intelligence/rag/GraphExpander.d.ts +95 -0
  227. package/dist/code-intelligence/rag/GraphExpander.d.ts.map +1 -0
  228. package/dist/code-intelligence/rag/GraphExpander.js +250 -0
  229. package/dist/code-intelligence/rag/GraphExpander.js.map +1 -0
  230. package/dist/code-intelligence/rag/index.d.ts +9 -0
  231. package/dist/code-intelligence/rag/index.d.ts.map +1 -0
  232. package/dist/code-intelligence/rag/index.js +25 -0
  233. package/dist/code-intelligence/rag/index.js.map +1 -0
  234. package/dist/code-intelligence/rag/types.d.ts +121 -0
  235. package/dist/code-intelligence/rag/types.d.ts.map +1 -0
  236. package/dist/code-intelligence/rag/types.js +50 -0
  237. package/dist/code-intelligence/rag/types.js.map +1 -0
  238. package/dist/code-intelligence/retrieval/SemanticRetriever.d.ts +62 -0
  239. package/dist/code-intelligence/retrieval/SemanticRetriever.d.ts.map +1 -0
  240. package/dist/code-intelligence/retrieval/SemanticRetriever.js +174 -0
  241. package/dist/code-intelligence/retrieval/SemanticRetriever.js.map +1 -0
  242. package/dist/code-intelligence/retrieval/index.d.ts +9 -0
  243. package/dist/code-intelligence/retrieval/index.d.ts.map +1 -0
  244. package/dist/code-intelligence/retrieval/index.js +16 -0
  245. package/dist/code-intelligence/retrieval/index.js.map +1 -0
  246. package/dist/code-intelligence/retrieval/types.d.ts +118 -0
  247. package/dist/code-intelligence/retrieval/types.d.ts.map +1 -0
  248. package/dist/code-intelligence/retrieval/types.js +46 -0
  249. package/dist/code-intelligence/retrieval/types.js.map +1 -0
  250. package/dist/code-intelligence/router/CodeIntelligenceHybridRouter.d.ts +167 -0
  251. package/dist/code-intelligence/router/CodeIntelligenceHybridRouter.d.ts.map +1 -0
  252. package/dist/code-intelligence/router/CodeIntelligenceHybridRouter.js +365 -0
  253. package/dist/code-intelligence/router/CodeIntelligenceHybridRouter.js.map +1 -0
  254. package/dist/code-intelligence/router/index.d.ts +7 -0
  255. package/dist/code-intelligence/router/index.d.ts.map +1 -0
  256. package/dist/code-intelligence/router/index.js +14 -0
  257. package/dist/code-intelligence/router/index.js.map +1 -0
  258. package/dist/code-intelligence/search/BM25Search.d.ts +74 -0
  259. package/dist/code-intelligence/search/BM25Search.d.ts.map +1 -0
  260. package/dist/code-intelligence/search/BM25Search.js +233 -0
  261. package/dist/code-intelligence/search/BM25Search.js.map +1 -0
  262. package/dist/code-intelligence/search/HybridSearchEngine.d.ts +94 -0
  263. package/dist/code-intelligence/search/HybridSearchEngine.d.ts.map +1 -0
  264. package/dist/code-intelligence/search/HybridSearchEngine.js +168 -0
  265. package/dist/code-intelligence/search/HybridSearchEngine.js.map +1 -0
  266. package/dist/code-intelligence/search/RRFFusion.d.ts +46 -0
  267. package/dist/code-intelligence/search/RRFFusion.d.ts.map +1 -0
  268. package/dist/code-intelligence/search/RRFFusion.js +223 -0
  269. package/dist/code-intelligence/search/RRFFusion.js.map +1 -0
  270. package/dist/code-intelligence/search/VectorSearch.d.ts +157 -0
  271. package/dist/code-intelligence/search/VectorSearch.d.ts.map +1 -0
  272. package/dist/code-intelligence/search/VectorSearch.js +301 -0
  273. package/dist/code-intelligence/search/VectorSearch.js.map +1 -0
  274. package/dist/code-intelligence/search/index.d.ts +14 -0
  275. package/dist/code-intelligence/search/index.d.ts.map +1 -0
  276. package/dist/code-intelligence/search/index.js +23 -0
  277. package/dist/code-intelligence/search/index.js.map +1 -0
  278. package/dist/code-intelligence/search/types.d.ts +201 -0
  279. package/dist/code-intelligence/search/types.d.ts.map +1 -0
  280. package/dist/code-intelligence/search/types.js +35 -0
  281. package/dist/code-intelligence/search/types.js.map +1 -0
  282. package/dist/code-intelligence/service/CodeIntelligenceService.d.ts +171 -0
  283. package/dist/code-intelligence/service/CodeIntelligenceService.d.ts.map +1 -0
  284. package/dist/code-intelligence/service/CodeIntelligenceService.js +325 -0
  285. package/dist/code-intelligence/service/CodeIntelligenceService.js.map +1 -0
  286. package/dist/code-intelligence/service/index.d.ts +7 -0
  287. package/dist/code-intelligence/service/index.d.ts.map +1 -0
  288. package/dist/code-intelligence/service/index.js +14 -0
  289. package/dist/code-intelligence/service/index.js.map +1 -0
  290. package/dist/code-intelligence/storage/CodeChunkStore.d.ts +213 -0
  291. package/dist/code-intelligence/storage/CodeChunkStore.d.ts.map +1 -0
  292. package/dist/code-intelligence/storage/CodeChunkStore.js +542 -0
  293. package/dist/code-intelligence/storage/CodeChunkStore.js.map +1 -0
  294. package/dist/code-intelligence/storage/index.d.ts +7 -0
  295. package/dist/code-intelligence/storage/index.d.ts.map +1 -0
  296. package/dist/code-intelligence/storage/index.js +13 -0
  297. package/dist/code-intelligence/storage/index.js.map +1 -0
  298. package/dist/code-intelligence/visualization/ClassDiagramBuilder.d.ts +51 -0
  299. package/dist/code-intelligence/visualization/ClassDiagramBuilder.d.ts.map +1 -0
  300. package/dist/code-intelligence/visualization/ClassDiagramBuilder.js +180 -0
  301. package/dist/code-intelligence/visualization/ClassDiagramBuilder.js.map +1 -0
  302. package/dist/code-intelligence/visualization/DependencyGraphBuilder.d.ts +66 -0
  303. package/dist/code-intelligence/visualization/DependencyGraphBuilder.d.ts.map +1 -0
  304. package/dist/code-intelligence/visualization/DependencyGraphBuilder.js +203 -0
  305. package/dist/code-intelligence/visualization/DependencyGraphBuilder.js.map +1 -0
  306. package/dist/code-intelligence/visualization/MermaidGenerator.d.ts +76 -0
  307. package/dist/code-intelligence/visualization/MermaidGenerator.d.ts.map +1 -0
  308. package/dist/code-intelligence/visualization/MermaidGenerator.js +368 -0
  309. package/dist/code-intelligence/visualization/MermaidGenerator.js.map +1 -0
  310. package/dist/code-intelligence/visualization/index.d.ts +9 -0
  311. package/dist/code-intelligence/visualization/index.d.ts.map +1 -0
  312. package/dist/code-intelligence/visualization/index.js +15 -0
  313. package/dist/code-intelligence/visualization/index.js.map +1 -0
  314. package/dist/core/FleetManager.d.ts +27 -0
  315. package/dist/core/FleetManager.d.ts.map +1 -1
  316. package/dist/core/FleetManager.js +84 -0
  317. package/dist/core/FleetManager.js.map +1 -1
  318. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  319. package/dist/core/memory/HNSWVectorMemory.js.map +1 -1
  320. package/dist/mcp/handlers/agent-spawn.d.ts +71 -5
  321. package/dist/mcp/handlers/agent-spawn.d.ts.map +1 -1
  322. package/dist/mcp/handlers/agent-spawn.js +336 -110
  323. package/dist/mcp/handlers/agent-spawn.js.map +1 -1
  324. package/dist/mcp/handlers/fleet-init.d.ts +24 -0
  325. package/dist/mcp/handlers/fleet-init.d.ts.map +1 -1
  326. package/dist/mcp/handlers/fleet-init.js +56 -4
  327. package/dist/mcp/handlers/fleet-init.js.map +1 -1
  328. package/dist/mcp/server-instructions.d.ts +1 -1
  329. package/dist/mcp/server-instructions.d.ts.map +1 -1
  330. package/dist/mcp/server-instructions.js +1 -1
  331. package/dist/mcp/server-instructions.js.map +1 -1
  332. package/dist/memory/HNSWPatternStore.d.ts.map +1 -1
  333. package/dist/memory/HNSWPatternStore.js.map +1 -1
  334. package/dist/plugins/BasePlugin.d.ts +111 -0
  335. package/dist/plugins/BasePlugin.d.ts.map +1 -0
  336. package/dist/plugins/BasePlugin.js +154 -0
  337. package/dist/plugins/BasePlugin.js.map +1 -0
  338. package/dist/plugins/PluginManager.d.ts +145 -0
  339. package/dist/plugins/PluginManager.d.ts.map +1 -0
  340. package/dist/plugins/PluginManager.js +862 -0
  341. package/dist/plugins/PluginManager.js.map +1 -0
  342. package/dist/plugins/adapters/McpToolsPlugin.d.ts +98 -0
  343. package/dist/plugins/adapters/McpToolsPlugin.d.ts.map +1 -0
  344. package/dist/plugins/adapters/McpToolsPlugin.js +518 -0
  345. package/dist/plugins/adapters/McpToolsPlugin.js.map +1 -0
  346. package/dist/plugins/adapters/PlaywrightPlugin.d.ts +63 -0
  347. package/dist/plugins/adapters/PlaywrightPlugin.d.ts.map +1 -0
  348. package/dist/plugins/adapters/PlaywrightPlugin.js +451 -0
  349. package/dist/plugins/adapters/PlaywrightPlugin.js.map +1 -0
  350. package/dist/plugins/adapters/VitestPlugin.d.ts +74 -0
  351. package/dist/plugins/adapters/VitestPlugin.d.ts.map +1 -0
  352. package/dist/plugins/adapters/VitestPlugin.js +589 -0
  353. package/dist/plugins/adapters/VitestPlugin.js.map +1 -0
  354. package/dist/plugins/adapters/index.d.ts +8 -0
  355. package/dist/plugins/adapters/index.d.ts.map +1 -0
  356. package/dist/plugins/adapters/index.js +17 -0
  357. package/dist/plugins/adapters/index.js.map +1 -0
  358. package/dist/plugins/index.d.ts +32 -0
  359. package/dist/plugins/index.d.ts.map +1 -0
  360. package/dist/plugins/index.js +48 -0
  361. package/dist/plugins/index.js.map +1 -0
  362. package/dist/plugins/types.d.ts +528 -0
  363. package/dist/plugins/types.d.ts.map +1 -0
  364. package/dist/plugins/types.js +61 -0
  365. package/dist/plugins/types.js.map +1 -0
  366. package/dist/types/index.d.ts +2 -1
  367. package/dist/types/index.d.ts.map +1 -1
  368. package/dist/types/index.js +2 -0
  369. package/dist/types/index.js.map +1 -1
  370. package/docs/reference/agents.md +44 -1
  371. 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