@crownpeak/dqm-react-component-dev-mcp 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/README.md +138 -0
  2. package/data/.env.example +22 -0
  3. package/data/.gitattributes +47 -0
  4. package/data/.glfrc.json +7 -0
  5. package/data/.husky/pre-commit +5 -0
  6. package/data/.nvmrc +1 -0
  7. package/data/CHANGELOG.md +75 -0
  8. package/data/CODE_OF_CONDUCT.md +129 -0
  9. package/data/CONTRIBUTING.md +203 -0
  10. package/data/DOCS-STRUCTURE.md +307 -0
  11. package/data/I18N.md +292 -0
  12. package/data/LICENSE +22 -0
  13. package/data/README.md +315 -0
  14. package/data/SECURITY.md +125 -0
  15. package/data/WIKI-DEPLOYMENT.md +348 -0
  16. package/data/docs/AI-FEATURES.md +610 -0
  17. package/data/docs/API-REFERENCE.md +1022 -0
  18. package/data/docs/AUTHENTICATION.md +301 -0
  19. package/data/docs/BACKEND-API.md +468 -0
  20. package/data/docs/DEVELOPMENT.md +375 -0
  21. package/data/docs/EXAMPLES.md +622 -0
  22. package/data/docs/MCP-SERVER.md +307 -0
  23. package/data/docs/MIGRATION-GUIDE.md +367 -0
  24. package/data/docs/NPM-PUBLISH.md +193 -0
  25. package/data/docs/QUICKSTART.md +206 -0
  26. package/data/docs/REDIS-SETUP.md +162 -0
  27. package/data/docs/SERVER.md +228 -0
  28. package/data/docs/TROUBLESHOOTING.md +657 -0
  29. package/data/docs/WIDGET-GUIDE.md +638 -0
  30. package/data/docs/WIKI-HOME.md +58 -0
  31. package/data/docs/WIKI-SIDEBAR.md +39 -0
  32. package/data/package.json +171 -0
  33. package/data/playwright.config.ts +64 -0
  34. package/data/probe/.cargo/config.toml +10 -0
  35. package/data/probe/.claude/commands/performance-review.md +15 -0
  36. package/data/probe/.clinerules +288 -0
  37. package/data/probe/.dockerignore +57 -0
  38. package/data/probe/.githooks/post-commit +11 -0
  39. package/data/probe/.githooks/pre-commit +99 -0
  40. package/data/probe/.githooks/pre-commit-vow +9 -0
  41. package/data/probe/.prompts/engineer.md +41 -0
  42. package/data/probe/.roomodes +28 -0
  43. package/data/probe/.windsurfrules +0 -0
  44. package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
  45. package/data/probe/BENCHMARKING.md +256 -0
  46. package/data/probe/CLAUDE.md +226 -0
  47. package/data/probe/CODE_OF_CONDUCT.md +128 -0
  48. package/data/probe/CONTRIBUTING.md +193 -0
  49. package/data/probe/Cargo.toml +120 -0
  50. package/data/probe/Cross.toml +10 -0
  51. package/data/probe/DOCKER-README.md +224 -0
  52. package/data/probe/Dockerfile +32 -0
  53. package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
  54. package/data/probe/LICENSE +201 -0
  55. package/data/probe/Makefile +210 -0
  56. package/data/probe/README.md +824 -0
  57. package/data/probe/SECURITY.md +67 -0
  58. package/data/probe/WINDOWS-GUIDE.md +294 -0
  59. package/data/probe/benches/parsing_benchmarks.rs +370 -0
  60. package/data/probe/benches/search_benchmarks.rs +599 -0
  61. package/data/probe/benches/simd_benchmarks.rs +372 -0
  62. package/data/probe/benches/timing_benchmarks.rs +287 -0
  63. package/data/probe/build-windows.bat +229 -0
  64. package/data/probe/codex-config/config.toml +6 -0
  65. package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
  66. package/data/probe/examples/cache_demo.rs +46 -0
  67. package/data/probe/examples/chat/.dockerignore +37 -0
  68. package/data/probe/examples/chat/ChatSessionManager.js +295 -0
  69. package/data/probe/examples/chat/Dockerfile +98 -0
  70. package/data/probe/examples/chat/LICENSE +201 -0
  71. package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
  72. package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
  73. package/data/probe/examples/chat/README.md +338 -0
  74. package/data/probe/examples/chat/TRACING.md +226 -0
  75. package/data/probe/examples/chat/appTracer.js +968 -0
  76. package/data/probe/examples/chat/auth.js +76 -0
  77. package/data/probe/examples/chat/bin/probe-chat.js +13 -0
  78. package/data/probe/examples/chat/build.js +104 -0
  79. package/data/probe/examples/chat/cancelRequest.js +84 -0
  80. package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
  81. package/data/probe/examples/chat/demo-local-images.js +128 -0
  82. package/data/probe/examples/chat/fileSpanExporter.js +181 -0
  83. package/data/probe/examples/chat/implement/README.md +228 -0
  84. package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
  85. package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
  86. package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
  87. package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
  88. package/data/probe/examples/chat/implement/backends/registry.js +85 -0
  89. package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
  90. package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
  91. package/data/probe/examples/chat/implement/core/config.js +428 -0
  92. package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
  93. package/data/probe/examples/chat/implement/core/utils.js +496 -0
  94. package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
  95. package/data/probe/examples/chat/index.js +669 -0
  96. package/data/probe/examples/chat/mcpServer.js +341 -0
  97. package/data/probe/examples/chat/npm/LICENSE +15 -0
  98. package/data/probe/examples/chat/npm/README.md +168 -0
  99. package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
  100. package/data/probe/examples/chat/npm/index.js +259 -0
  101. package/data/probe/examples/chat/npm/package.json +54 -0
  102. package/data/probe/examples/chat/package.json +102 -0
  103. package/data/probe/examples/chat/probeChat.js +456 -0
  104. package/data/probe/examples/chat/probeTool.js +491 -0
  105. package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
  106. package/data/probe/examples/chat/telemetry.js +281 -0
  107. package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
  108. package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
  109. package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
  110. package/data/probe/examples/chat/test/test-backends.js +90 -0
  111. package/data/probe/examples/chat/test/testUtils.js +530 -0
  112. package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
  113. package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
  114. package/data/probe/examples/chat/test/verify-tests.js +118 -0
  115. package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
  116. package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
  117. package/data/probe/examples/chat/test-chat-tracing.js +38 -0
  118. package/data/probe/examples/chat/test-direct-function.js +49 -0
  119. package/data/probe/examples/chat/test-file-size-validation.js +103 -0
  120. package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
  121. package/data/probe/examples/chat/test-github-context.txt +12 -0
  122. package/data/probe/examples/chat/test-hierarchy.js +203 -0
  123. package/data/probe/examples/chat/test-image-spans.js +37 -0
  124. package/data/probe/examples/chat/test-local-image-reading.js +176 -0
  125. package/data/probe/examples/chat/test-mcp-integration.js +136 -0
  126. package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
  127. package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
  128. package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
  129. package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
  130. package/data/probe/examples/chat/test-security-validation.js +145 -0
  131. package/data/probe/examples/chat/test-simple-tracing.js +32 -0
  132. package/data/probe/examples/chat/test-trace-verification.js +235 -0
  133. package/data/probe/examples/chat/test-tracing.js +114 -0
  134. package/data/probe/examples/chat/tokenCounter.js +419 -0
  135. package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
  136. package/data/probe/examples/chat/webServer.js +1103 -0
  137. package/data/probe/examples/reranker/Cargo.toml +33 -0
  138. package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
  139. package/data/probe/examples/reranker/MODELS.md +66 -0
  140. package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
  141. package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
  142. package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
  143. package/data/probe/examples/reranker/README.md +347 -0
  144. package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
  145. package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
  146. package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
  147. package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
  148. package/data/probe/examples/reranker/debug_scoring.py +189 -0
  149. package/data/probe/examples/reranker/debug_tokenization.py +154 -0
  150. package/data/probe/examples/reranker/download_models.sh +73 -0
  151. package/data/probe/examples/reranker/requirements.txt +13 -0
  152. package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
  153. package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
  154. package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
  155. package/data/probe/examples/reranker/simple_test.py +50 -0
  156. package/data/probe/examples/reranker/test_all_models.sh +63 -0
  157. package/data/probe/examples/reranker/test_bert_results.sh +44 -0
  158. package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
  159. package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
  160. package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
  161. package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
  162. package/data/probe/examples/reranker/test_scores.py +132 -0
  163. package/data/probe/install.ps1 +508 -0
  164. package/data/probe/install.sh +460 -0
  165. package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
  166. package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
  167. package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
  168. package/data/probe/npm/MAID_INTEGRATION.md +313 -0
  169. package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
  170. package/data/probe/npm/README.md +824 -0
  171. package/data/probe/npm/bin/.gitignore +7 -0
  172. package/data/probe/npm/bin/.gitkeep +0 -0
  173. package/data/probe/npm/bin/README.md +12 -0
  174. package/data/probe/npm/bin/probe +167 -0
  175. package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
  176. package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
  177. package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
  178. package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
  179. package/data/probe/npm/example-usage.js +335 -0
  180. package/data/probe/npm/examples/multi-engine-demo.js +117 -0
  181. package/data/probe/npm/examples/probe-agent-cli.js +113 -0
  182. package/data/probe/npm/examples/test-agent-edit.js +114 -0
  183. package/data/probe/npm/examples/test-edit-create.js +120 -0
  184. package/data/probe/npm/examples/test-edit-direct.js +114 -0
  185. package/data/probe/npm/index.d.ts +744 -0
  186. package/data/probe/npm/jest.config.js +52 -0
  187. package/data/probe/npm/package.json +117 -0
  188. package/data/probe/npm/scripts/build-agent.cjs +75 -0
  189. package/data/probe/npm/scripts/build-cjs.js +124 -0
  190. package/data/probe/npm/scripts/build-mcp.cjs +36 -0
  191. package/data/probe/npm/scripts/postinstall.js +216 -0
  192. package/data/probe/npm/test-codex-e2e.js +78 -0
  193. package/data/probe/npm/test-download-lock.js +109 -0
  194. package/data/probe/npm/test-grep-security.js +94 -0
  195. package/data/probe/npm/test-grep-simplified.js +63 -0
  196. package/data/probe/npm/test-grep.js +51 -0
  197. package/data/probe/npm/tests/README.md +96 -0
  198. package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
  199. package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
  200. package/data/probe/npm/tests/contextCompactor.test.js +498 -0
  201. package/data/probe/npm/tests/delegate-config.test.js +353 -0
  202. package/data/probe/npm/tests/delegate-integration.test.js +348 -0
  203. package/data/probe/npm/tests/extractor-integration.test.js +162 -0
  204. package/data/probe/npm/tests/extractor.test.js +317 -0
  205. package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
  206. package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
  207. package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
  208. package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
  209. package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
  210. package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
  211. package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
  212. package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
  213. package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
  214. package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
  215. package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
  216. package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
  217. package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
  218. package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
  219. package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
  220. package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
  221. package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
  222. package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
  223. package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
  224. package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
  225. package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
  226. package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
  227. package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
  228. package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
  229. package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
  230. package/data/probe/npm/tests/setup.js +46 -0
  231. package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
  232. package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
  233. package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
  234. package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
  235. package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
  236. package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
  237. package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
  238. package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
  239. package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
  240. package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
  241. package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
  242. package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
  243. package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
  244. package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
  245. package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
  246. package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
  247. package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
  248. package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
  249. package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
  250. package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
  251. package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
  252. package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
  253. package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
  254. package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
  255. package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
  256. package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
  257. package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
  258. package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
  259. package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
  260. package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
  261. package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
  262. package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
  263. package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
  264. package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
  265. package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
  266. package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
  267. package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
  268. package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
  269. package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
  270. package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
  271. package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
  272. package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
  273. package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
  274. package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
  275. package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
  276. package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
  277. package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
  278. package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
  279. package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
  280. package/data/probe/npm/tsconfig.json +21 -0
  281. package/data/probe/result1.txt +19 -0
  282. package/data/probe/result2.txt +26 -0
  283. package/data/probe/scripts/benchmark.sh +270 -0
  284. package/data/probe/scripts/cache_memory_analysis.rs +844 -0
  285. package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
  286. package/data/probe/site/.env.example +10 -0
  287. package/data/probe/site/DEPLOYMENT.md +86 -0
  288. package/data/probe/site/README.md +183 -0
  289. package/data/probe/site/adding-languages.md +135 -0
  290. package/data/probe/site/ai-chat.md +427 -0
  291. package/data/probe/site/ai-integration.md +1488 -0
  292. package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
  293. package/data/probe/site/blog/index.md +118 -0
  294. package/data/probe/site/blog/v0.6.0-release.md +426 -0
  295. package/data/probe/site/blog.md +8 -0
  296. package/data/probe/site/changelog.md +200 -0
  297. package/data/probe/site/cli-mode.md +437 -0
  298. package/data/probe/site/code-extraction.md +436 -0
  299. package/data/probe/site/contributing/README.md +9 -0
  300. package/data/probe/site/contributing/documentation-cross-references.md +215 -0
  301. package/data/probe/site/contributing/documentation-maintenance.md +275 -0
  302. package/data/probe/site/contributing/documentation-structure.md +75 -0
  303. package/data/probe/site/documentation-cross-references.md +215 -0
  304. package/data/probe/site/documentation-guide.md +132 -0
  305. package/data/probe/site/documentation-maintenance.md +275 -0
  306. package/data/probe/site/features.md +147 -0
  307. package/data/probe/site/how-it-works.md +118 -0
  308. package/data/probe/site/index.md +175 -0
  309. package/data/probe/site/index.md.bak +133 -0
  310. package/data/probe/site/installation.md +235 -0
  311. package/data/probe/site/integrations/docker.md +248 -0
  312. package/data/probe/site/integrations/github-actions.md +413 -0
  313. package/data/probe/site/language-support-overview.md +168 -0
  314. package/data/probe/site/mcp-integration.md +587 -0
  315. package/data/probe/site/mcp-server.md +304 -0
  316. package/data/probe/site/navigation-structure.md +76 -0
  317. package/data/probe/site/nodejs-sdk.md +798 -0
  318. package/data/probe/site/output-formats.md +625 -0
  319. package/data/probe/site/package.json +21 -0
  320. package/data/probe/site/public/_headers +28 -0
  321. package/data/probe/site/public/_redirects +11 -0
  322. package/data/probe/site/quick-start.md +289 -0
  323. package/data/probe/site/search-functionality.md +291 -0
  324. package/data/probe/site/search-reference.md +291 -0
  325. package/data/probe/site/supported-languages.md +215 -0
  326. package/data/probe/site/use-cases/README.md +8 -0
  327. package/data/probe/site/use-cases/advanced-cli.md +253 -0
  328. package/data/probe/site/use-cases/ai-code-editors.md +239 -0
  329. package/data/probe/site/use-cases/building-ai-tools.md +529 -0
  330. package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
  331. package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
  332. package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
  333. package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
  334. package/data/probe/site/use-cases/team-chat.md +350 -0
  335. package/data/probe/site/web-interface.md +434 -0
  336. package/data/probe/site/wrangler.toml +9 -0
  337. package/data/probe/test-api-key.sh +1 -0
  338. package/data/probe/test-probe-implementation/hello.js +7 -0
  339. package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
  340. package/data/probe/test_cases/early_termination_issues.rs +533 -0
  341. package/data/probe/test_data/test_nested_struct.go +26 -0
  342. package/data/probe/tests/README.md +286 -0
  343. package/data/probe/tests/README_search_determinism_tests.md +116 -0
  344. package/data/probe/tests/adjacent_comment_test.rs +152 -0
  345. package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
  346. package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
  347. package/data/probe/tests/block_merging_tests.rs +396 -0
  348. package/data/probe/tests/c_outline_format_tests.rs +2179 -0
  349. package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
  350. package/data/probe/tests/cache_order_tests.rs +147 -0
  351. package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
  352. package/data/probe/tests/cli_tests.rs +680 -0
  353. package/data/probe/tests/comment_context_integration_test.rs +240 -0
  354. package/data/probe/tests/common.rs +33 -0
  355. package/data/probe/tests/complex_block_merging_tests.rs +599 -0
  356. package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
  357. package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
  358. package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
  359. package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
  360. package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
  361. package/data/probe/tests/extract_command_tests.rs +1848 -0
  362. package/data/probe/tests/extract_deduplication_tests.rs +146 -0
  363. package/data/probe/tests/extract_input_file_tests.rs +84 -0
  364. package/data/probe/tests/extract_prompt_tests.rs +102 -0
  365. package/data/probe/tests/filename_search_tests.rs +96 -0
  366. package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
  367. package/data/probe/tests/github_extract_tests.rs +234 -0
  368. package/data/probe/tests/go_comment_test.rs +253 -0
  369. package/data/probe/tests/go_outline_format_tests.rs +2587 -0
  370. package/data/probe/tests/go_path_resolver_tests.rs +96 -0
  371. package/data/probe/tests/html_outline_format_tests.rs +637 -0
  372. package/data/probe/tests/integration_tests.rs +837 -0
  373. package/data/probe/tests/ip_whitelist_test.rs +148 -0
  374. package/data/probe/tests/java_outline_format_tests.rs +1611 -0
  375. package/data/probe/tests/javascript_extract_tests.rs +315 -0
  376. package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
  377. package/data/probe/tests/json_format_tests.rs +436 -0
  378. package/data/probe/tests/json_schema_validation_tests.rs +450 -0
  379. package/data/probe/tests/lib_usage.rs +60 -0
  380. package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
  381. package/data/probe/tests/line_map_cache_tests.rs +114 -0
  382. package/data/probe/tests/markdown_integration_tests.rs +190 -0
  383. package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
  384. package/data/probe/tests/mocks/test_object.js +27 -0
  385. package/data/probe/tests/mocks/test_struct.go +50 -0
  386. package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
  387. package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
  388. package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
  389. package/data/probe/tests/negative_compound_word_tests.rs +246 -0
  390. package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
  391. package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
  392. package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
  393. package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
  394. package/data/probe/tests/parallel_extraction_tests.rs +178 -0
  395. package/data/probe/tests/parallel_search_tests.rs +355 -0
  396. package/data/probe/tests/path_resolver_tests.rs +698 -0
  397. package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
  398. package/data/probe/tests/php_outline_format_tests.rs +768 -0
  399. package/data/probe/tests/property_tests.proptest-regressions +9 -0
  400. package/data/probe/tests/property_tests.rs +118 -0
  401. package/data/probe/tests/python_outline_format_tests.rs +1538 -0
  402. package/data/probe/tests/query_command_json_tests.rs +438 -0
  403. package/data/probe/tests/query_command_tests.rs +232 -0
  404. package/data/probe/tests/query_command_xml_tests.rs +569 -0
  405. package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
  406. package/data/probe/tests/required_terms_filename_tests.rs +116 -0
  407. package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
  408. package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
  409. package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
  410. package/data/probe/tests/rust_outline_format_tests.rs +843 -0
  411. package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
  412. package/data/probe/tests/search_determinism_tests.rs +451 -0
  413. package/data/probe/tests/search_hints_tests.rs +253 -0
  414. package/data/probe/tests/special_character_escaping_tests.rs +417 -0
  415. package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
  416. package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
  417. package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
  418. package/data/probe/tests/symbols_tests.rs +166 -0
  419. package/data/probe/tests/test_file.rs +45 -0
  420. package/data/probe/tests/test_tokenize.rs +28 -0
  421. package/data/probe/tests/timeout_tests.rs +82 -0
  422. package/data/probe/tests/tokenization_tests.rs +195 -0
  423. package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
  424. package/data/probe/tests/typescript_extract_tests.rs +214 -0
  425. package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
  426. package/data/probe/tests/xml_format_tests.rs +568 -0
  427. package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
  428. package/data/scripts/postinstall.mjs +9 -0
  429. package/data/scripts/set-version.js +0 -0
  430. package/data/scripts/wiki-build.sh +111 -0
  431. package/data/scripts/wiki-deploy.sh +73 -0
  432. package/data/serve.json +12 -0
  433. package/data/test/demo-dynamic.html +134 -0
  434. package/data/test/demo-esm.html +105 -0
  435. package/data/test/demo-iife.html +78 -0
  436. package/data/tsconfig.json +7 -0
  437. package/data/vite.server.ts +483 -0
  438. package/data/vitest.config.ts +40 -0
  439. package/data/wiki/Home.md +58 -0
  440. package/data/wiki/_Sidebar.md +39 -0
  441. package/docs-mcp.config.json +20 -0
  442. package/package.json +56 -0
  443. package/src/config.js +111 -0
  444. package/src/index.js +395 -0
@@ -0,0 +1,566 @@
1
+ /**
2
+ * Comprehensive error handling and edge case tests for MCP integration
3
+ */
4
+
5
+ import { jest } from '@jest/globals';
6
+ import { MCPClientManager, createTransport } from '../../src/agent/mcp/client.js';
7
+ import { MCPXmlBridge } from '../../src/agent/mcp/xmlBridge.js';
8
+ import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
9
+ import { join, dirname } from 'path';
10
+ import { fileURLToPath } from 'url';
11
+ import { mkdtemp, writeFile, rm } from 'fs/promises';
12
+ import { tmpdir } from 'os';
13
+
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+
17
+ describe('MCP Error Handling and Edge Cases', () => {
18
+ let tempDir;
19
+
20
+ beforeEach(async () => {
21
+ tempDir = await mkdtemp(join(tmpdir(), 'mcp-error-test-'));
22
+ });
23
+
24
+ afterEach(async () => {
25
+ if (tempDir) {
26
+ await rm(tempDir, { recursive: true, force: true });
27
+ }
28
+ // Clean up environment variables
29
+ delete process.env.MCP_CONFIG_PATH;
30
+ delete process.env.ANTHROPIC_API_KEY;
31
+ delete process.env.DEBUG_MCP;
32
+ });
33
+
34
+ describe('Connection Failures', () => {
35
+ test('should handle non-existent command gracefully', async () => {
36
+ const manager = new MCPClientManager({ debug: false });
37
+
38
+ const config = {
39
+ mcpServers: {
40
+ 'nonexistent': {
41
+ command: 'nonexistent-command-that-does-not-exist',
42
+ args: ['--test'],
43
+ transport: 'stdio',
44
+ enabled: true
45
+ }
46
+ }
47
+ };
48
+
49
+ const result = await manager.initialize(config);
50
+
51
+ expect(result.connected).toBe(0);
52
+ expect(result.total).toBe(1);
53
+ expect(result.tools).toEqual([]);
54
+
55
+ await manager.disconnect();
56
+ });
57
+
58
+ test('should handle server that exits immediately', async () => {
59
+ const manager = new MCPClientManager({ debug: false });
60
+
61
+ const config = {
62
+ mcpServers: {
63
+ 'exits-immediately': {
64
+ command: 'node',
65
+ args: ['-e', 'process.exit(1)'], // Exits immediately with error
66
+ transport: 'stdio',
67
+ enabled: true
68
+ }
69
+ }
70
+ };
71
+
72
+ const result = await manager.initialize(config);
73
+
74
+ expect(result.connected).toBe(0);
75
+ expect(result.total).toBe(1);
76
+
77
+ await manager.disconnect();
78
+ });
79
+
80
+ test('should handle malformed server responses', async () => {
81
+ const manager = new MCPClientManager({ debug: false });
82
+
83
+ const config = {
84
+ mcpServers: {
85
+ 'malformed': {
86
+ command: 'node',
87
+ args: ['-e', 'console.log("not json"); process.exit(0);'], // Outputs invalid JSON then exits
88
+ transport: 'stdio',
89
+ enabled: true
90
+ }
91
+ }
92
+ };
93
+
94
+ const result = await manager.initialize(config);
95
+
96
+ expect(result.connected).toBe(0);
97
+ expect(result.total).toBe(1);
98
+
99
+ await manager.disconnect();
100
+ }, 15000); // Increase timeout
101
+
102
+ test('should handle unreachable HTTP endpoints', async () => {
103
+ const config = {
104
+ transport: 'http',
105
+ url: 'http://localhost:99999/mcp' // Unreachable port
106
+ };
107
+
108
+ const transport = createTransport(config);
109
+
110
+ // Mock fetch to simulate connection failure
111
+ global.fetch = jest.fn().mockRejectedValue(new Error('Connection refused'));
112
+
113
+ await expect(transport.start()).rejects.toThrow();
114
+ });
115
+
116
+ test('should handle invalid WebSocket URLs', async () => {
117
+ const config = {
118
+ transport: 'websocket',
119
+ url: 'not-a-valid-url' // Invalid URL
120
+ };
121
+
122
+ // This should throw an error for invalid URL
123
+ expect(() => createTransport(config)).toThrow('Invalid WebSocket URL');
124
+ });
125
+ });
126
+
127
+ describe('Invalid Configurations', () => {
128
+ test('should handle missing required transport fields', () => {
129
+ // Missing URL for HTTP transport
130
+ expect(() => createTransport({
131
+ transport: 'http'
132
+ })).toThrow('HTTP transport requires a URL');
133
+
134
+ // Missing URL for WebSocket transport
135
+ expect(() => createTransport({
136
+ transport: 'websocket'
137
+ })).toThrow('WebSocket transport requires a URL');
138
+
139
+ // Missing URL for SSE transport
140
+ expect(() => createTransport({
141
+ transport: 'sse'
142
+ })).toThrow('SSE transport requires a URL');
143
+ });
144
+
145
+ test('should handle invalid transport types', () => {
146
+ expect(() => createTransport({
147
+ transport: 'invalid-transport'
148
+ })).toThrow('Unknown transport type: invalid-transport');
149
+ });
150
+
151
+ test('should handle malformed configuration files', async () => {
152
+ const invalidConfigPath = join(tempDir, 'invalid.json');
153
+ await writeFile(invalidConfigPath, '{ this is not valid json }');
154
+
155
+ process.env.MCP_CONFIG_PATH = invalidConfigPath;
156
+
157
+ const manager = new MCPClientManager({ debug: false });
158
+
159
+ // Should not throw, should fall back to defaults
160
+ const result = await manager.initialize();
161
+ expect(result).toBeDefined();
162
+
163
+ await manager.disconnect();
164
+ });
165
+
166
+ test('should handle empty and null configurations', async () => {
167
+ const manager = new MCPClientManager({ debug: false });
168
+
169
+ // Null configuration
170
+ const result1 = await manager.initialize(null);
171
+ expect(result1.connected).toBe(0);
172
+ expect(result1.total).toBe(0);
173
+
174
+ // Empty configuration
175
+ const result2 = await manager.initialize({});
176
+ expect(result2.connected).toBe(0);
177
+ expect(result2.total).toBe(0);
178
+
179
+ // Configuration with empty mcpServers
180
+ const result3 = await manager.initialize({ mcpServers: {} });
181
+ expect(result3.connected).toBe(0);
182
+ expect(result3.total).toBe(0);
183
+
184
+ await manager.disconnect();
185
+ });
186
+ });
187
+
188
+ describe('Tool Execution Errors', () => {
189
+ test('should handle tool execution failures with mock server', async () => {
190
+ // Create configuration for mock server that has error-generating tools
191
+ const mcpConfig = {
192
+ mcpServers: {
193
+ 'error-test-server': {
194
+ command: 'node',
195
+ args: [join(__dirname, '../mcp/mockMcpServer.js')],
196
+ transport: 'stdio',
197
+ enabled: true
198
+ }
199
+ }
200
+ };
201
+
202
+ const configPath = join(tempDir, 'error-test-config.json');
203
+ await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
204
+
205
+ process.env.MCP_CONFIG_PATH = configPath;
206
+
207
+ const bridge = new MCPXmlBridge({ debug: false });
208
+ await bridge.initialize();
209
+
210
+ // Wait for initialization
211
+ await new Promise(resolve => setTimeout(resolve, 2000));
212
+
213
+ if (bridge.getToolNames().length > 0) {
214
+ // Test error tool that generates validation errors
215
+ const errorXml = `
216
+ <error-test-server_error_test>
217
+ <params>{"error_type": "validation", "message": "Test validation error"}</params>
218
+ </error-test-server_error_test>
219
+ `;
220
+
221
+ const result = await bridge.executeFromXml(errorXml);
222
+ expect(result.success).toBe(false);
223
+ expect(result.error).toContain('Test validation error');
224
+
225
+ // Test error tool that generates runtime errors
226
+ const runtimeErrorXml = `
227
+ <error-test-server_error_test>
228
+ <params>{"error_type": "runtime", "message": "Test runtime error"}</params>
229
+ </error-test-server_error_test>
230
+ `;
231
+
232
+ const runtimeResult = await bridge.executeFromXml(runtimeErrorXml);
233
+ expect(runtimeResult.success).toBe(false);
234
+ expect(runtimeResult.error).toContain('Test runtime error');
235
+ } else {
236
+ console.warn('Mock server not available for error testing');
237
+ }
238
+
239
+ await bridge.cleanup();
240
+ }, 15000);
241
+
242
+ test('should handle invalid tool parameters', async () => {
243
+ const bridge = new MCPXmlBridge({ debug: false });
244
+
245
+ // Mock a tool with specific parameter requirements
246
+ bridge.mcpTools = {
247
+ 'strict_tool': {
248
+ execute: async (params) => {
249
+ if (!params.required_param) {
250
+ throw new Error('Missing required parameter: required_param');
251
+ }
252
+ return 'Success';
253
+ }
254
+ }
255
+ };
256
+
257
+ // Test with missing required parameter
258
+ const invalidXml = `
259
+ <strict_tool>
260
+ <params>{"optional_param": "value"}</params>
261
+ </strict_tool>
262
+ `;
263
+
264
+ const result = await bridge.executeFromXml(invalidXml);
265
+ expect(result.success).toBe(false);
266
+ expect(result.error).toContain('Missing required parameter');
267
+
268
+ await bridge.cleanup();
269
+ });
270
+
271
+ test('should handle tool timeouts', async () => {
272
+ // Create configuration for mock server with slow operations
273
+ const mcpConfig = {
274
+ mcpServers: {
275
+ 'timeout-test-server': {
276
+ command: 'node',
277
+ args: [join(__dirname, '../mcp/mockMcpServer.js')],
278
+ transport: 'stdio',
279
+ enabled: true
280
+ }
281
+ }
282
+ };
283
+
284
+ const configPath = join(tempDir, 'timeout-test-config.json');
285
+ await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
286
+
287
+ process.env.MCP_CONFIG_PATH = configPath;
288
+
289
+ const bridge = new MCPXmlBridge({ debug: false });
290
+ await bridge.initialize();
291
+
292
+ // Wait for initialization
293
+ await new Promise(resolve => setTimeout(resolve, 2000));
294
+
295
+ if (bridge.getToolNames().length > 0) {
296
+ // Test slow operation (should complete within reasonable time)
297
+ const slowXml = `
298
+ <timeout-test-server_slow_operation>
299
+ <params>{"delay_ms": 500, "result": "completed successfully"}</params>
300
+ </timeout-test-server_slow_operation>
301
+ `;
302
+
303
+ const start = Date.now();
304
+ const result = await bridge.executeFromXml(slowXml);
305
+ const elapsed = Date.now() - start;
306
+
307
+ if (result.success) {
308
+ expect(elapsed).toBeGreaterThanOrEqual(500);
309
+ expect(result.result).toContain('completed successfully');
310
+ }
311
+ } else {
312
+ console.warn('Mock server not available for timeout testing');
313
+ }
314
+
315
+ await bridge.cleanup();
316
+ }, 20000);
317
+ });
318
+
319
+ describe('XML Parsing Edge Cases', () => {
320
+ test('should handle malformed XML', async () => {
321
+ const { parseXmlMcpToolCall } = await import('../../src/agent/mcp/xmlBridge.js');
322
+
323
+ // Unclosed tags
324
+ const malformedXml1 = '<test_tool><params>{"test": "value"}</params>';
325
+ const result1 = parseXmlMcpToolCall(malformedXml1, ['test_tool']);
326
+ expect(result1).toBeNull();
327
+
328
+ // Mismatched tags
329
+ const malformedXml2 = '<test_tool><params>{"test": "value"}</wrong_tag></test_tool>';
330
+ const result2 = parseXmlMcpToolCall(malformedXml2, ['test_tool']);
331
+ expect(result2).toBeDefined(); // Should still parse the tool name
332
+
333
+ // No content
334
+ const emptyXml = '<test_tool></test_tool>';
335
+ const result3 = parseXmlMcpToolCall(emptyXml, ['test_tool']);
336
+ expect(result3).toBeDefined();
337
+ expect(result3.params).toEqual({});
338
+ });
339
+
340
+ test('should handle nested XML and complex content', async () => {
341
+ const { parseXmlMcpToolCall } = await import('../../src/agent/mcp/xmlBridge.js');
342
+
343
+ // XML with nested elements in JSON
344
+ const complexXml = `
345
+ <complex_tool>
346
+ <params>
347
+ {
348
+ "nested": {
349
+ "data": "<xml>content</xml>",
350
+ "array": [1, 2, 3]
351
+ },
352
+ "special_chars": "quotes \\" and <tags> & ampersands"
353
+ }
354
+ </params>
355
+ </complex_tool>
356
+ `;
357
+
358
+ const result = parseXmlMcpToolCall(complexXml, ['complex_tool']);
359
+ expect(result).toBeDefined();
360
+ expect(result.toolName).toBe('complex_tool');
361
+ // The params should be the parsed JSON object
362
+ expect(result.params).toBeDefined();
363
+ expect(result.params.nested).toBeDefined();
364
+ expect(result.params.nested.data).toBe('<xml>content</xml>');
365
+ expect(result.params.nested.array).toEqual([1, 2, 3]);
366
+ expect(result.params.special_chars).toBe('quotes " and <tags> & ampersands');
367
+ });
368
+
369
+ test('should handle CDATA sections', async () => {
370
+ const { parseXmlMcpToolCall } = await import('../../src/agent/mcp/xmlBridge.js');
371
+
372
+ const cdataXml = `
373
+ <cdata_tool>
374
+ <params><![CDATA[{"message": "This contains <special> characters & symbols"}]]></params>
375
+ </cdata_tool>
376
+ `;
377
+
378
+ const result = parseXmlMcpToolCall(cdataXml, ['cdata_tool']);
379
+ expect(result).toBeDefined();
380
+ expect(result.params.message).toBe('This contains <special> characters & symbols');
381
+ });
382
+ });
383
+
384
+ describe('ProbeAgent Integration Error Handling', () => {
385
+ test('should handle MCP initialization failure in ProbeAgent', async () => {
386
+ process.env.ANTHROPIC_API_KEY = 'test-key';
387
+
388
+ // Create invalid MCP configuration
389
+ const mcpConfig = {
390
+ mcpServers: {
391
+ 'failing-server': {
392
+ command: 'nonexistent-command',
393
+ transport: 'stdio',
394
+ enabled: true
395
+ }
396
+ }
397
+ };
398
+
399
+ const configPath = join(tempDir, 'failing-config.json');
400
+ await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
401
+
402
+ process.env.MCP_CONFIG_PATH = configPath;
403
+
404
+ // Should not throw during initialization
405
+ const agent = new ProbeAgent({
406
+ enableMcp: true,
407
+ debug: false,
408
+ path: tempDir
409
+ });
410
+
411
+ // Wait for MCP initialization attempt
412
+ await new Promise(resolve => setTimeout(resolve, 2000));
413
+
414
+ // Agent should still be functional, just without MCP tools
415
+ expect(agent.enableMcp).toBe(true);
416
+ // The bridge exists but has no connected servers/tools
417
+ if (agent.mcpBridge) {
418
+ expect(agent.mcpBridge.getToolNames().length).toBe(0);
419
+ }
420
+
421
+ const systemMessage = await agent.getSystemMessage();
422
+ expect(systemMessage).toBeDefined();
423
+ expect(systemMessage).not.toContain('MCP Tools'); // No MCP tools section
424
+
425
+ await agent.cleanup();
426
+ });
427
+
428
+ test('should handle concurrent MCP operations', async () => {
429
+ const bridge = new MCPXmlBridge({ debug: false });
430
+
431
+ // Mock multiple tools
432
+ bridge.mcpTools = {
433
+ 'tool1': {
434
+ execute: async (params) => {
435
+ await new Promise(resolve => setTimeout(resolve, 100));
436
+ return `Tool1 result: ${params.input}`;
437
+ }
438
+ },
439
+ 'tool2': {
440
+ execute: async (params) => {
441
+ await new Promise(resolve => setTimeout(resolve, 150));
442
+ return `Tool2 result: ${params.input}`;
443
+ }
444
+ },
445
+ 'tool3': {
446
+ execute: async (params) => {
447
+ await new Promise(resolve => setTimeout(resolve, 50));
448
+ return `Tool3 result: ${params.input}`;
449
+ }
450
+ }
451
+ };
452
+
453
+ // Execute multiple tools concurrently
454
+ const promises = [
455
+ bridge.executeFromXml('<tool1><params>{"input": "test1"}</params></tool1>'),
456
+ bridge.executeFromXml('<tool2><params>{"input": "test2"}</params></tool2>'),
457
+ bridge.executeFromXml('<tool3><params>{"input": "test3"}</params></tool3>')
458
+ ];
459
+
460
+ const results = await Promise.all(promises);
461
+
462
+ expect(results).toHaveLength(3);
463
+ results.forEach((result, index) => {
464
+ expect(result.success).toBe(true);
465
+ expect(result.result).toContain(`Tool${index + 1} result`);
466
+ });
467
+
468
+ await bridge.cleanup();
469
+ });
470
+
471
+ test('should handle partial MCP failures', async () => {
472
+ // Test scenario where some servers connect and others fail
473
+ const mcpConfig = {
474
+ mcpServers: {
475
+ 'working-server': {
476
+ command: 'node',
477
+ args: [join(__dirname, '../mcp/mockMcpServer.js')],
478
+ transport: 'stdio',
479
+ enabled: true
480
+ },
481
+ 'failing-server': {
482
+ command: 'nonexistent-command',
483
+ transport: 'stdio',
484
+ enabled: true
485
+ }
486
+ }
487
+ };
488
+
489
+ const configPath = join(tempDir, 'partial-config.json');
490
+ await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
491
+
492
+ process.env.MCP_CONFIG_PATH = configPath;
493
+
494
+ const manager = new MCPClientManager({ debug: false });
495
+ const result = await manager.initialize();
496
+
497
+ // Should have attempted 2 connections, with possibly 1 success
498
+ expect(result.total).toBe(2);
499
+ // Connected count depends on whether mock server actually starts
500
+ expect(result.connected).toBeLessThanOrEqual(1);
501
+
502
+ await manager.disconnect();
503
+ }, 15000);
504
+ });
505
+
506
+ describe('Memory and Resource Management', () => {
507
+ test('should clean up resources properly on multiple disconnect calls', async () => {
508
+ const manager = new MCPClientManager({ debug: false });
509
+
510
+ // Initialize with empty config
511
+ await manager.initialize({ mcpServers: {} });
512
+
513
+ // Multiple cleanup calls should not throw
514
+ await manager.disconnect();
515
+ await manager.disconnect();
516
+ await manager.disconnect();
517
+
518
+ expect(manager.clients.size).toBe(0);
519
+ expect(manager.tools.size).toBe(0);
520
+ });
521
+
522
+ test('should handle cleanup when connections are already closed', async () => {
523
+ const bridge = new MCPXmlBridge({ debug: false });
524
+
525
+ // Initialize without any actual connections
526
+ await bridge.initialize({ mcpServers: {} });
527
+
528
+ // Cleanup should not throw even if nothing to clean up
529
+ await expect(bridge.cleanup()).resolves.not.toThrow();
530
+ await expect(bridge.cleanup()).resolves.not.toThrow(); // Second cleanup
531
+ });
532
+
533
+ test('should handle memory pressure with many tool calls', async () => {
534
+ const bridge = new MCPXmlBridge({ debug: false });
535
+
536
+ // Mock a simple tool
537
+ bridge.mcpTools = {
538
+ 'memory_test': {
539
+ execute: async (params) => {
540
+ // Create some data
541
+ const data = new Array(1000).fill(params.index || 0);
542
+ return `Processed ${data.length} items`;
543
+ }
544
+ }
545
+ };
546
+
547
+ // Execute many tool calls
548
+ const promises = [];
549
+ for (let i = 0; i < 100; i++) {
550
+ promises.push(
551
+ bridge.executeFromXml(`<memory_test><params>{"index": ${i}}</params></memory_test>`)
552
+ );
553
+ }
554
+
555
+ const results = await Promise.all(promises);
556
+
557
+ expect(results).toHaveLength(100);
558
+ results.forEach((result, index) => {
559
+ expect(result.success).toBe(true);
560
+ expect(result.result).toContain('Processed 1000 items');
561
+ });
562
+
563
+ await bridge.cleanup();
564
+ });
565
+ });
566
+ });