@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,614 @@
1
+ /**
2
+ * Unit tests for MCPClientManager
3
+ */
4
+
5
+ import { jest } from '@jest/globals';
6
+ import { MCPClientManager, createTransport } from '../../src/agent/mcp/client.js';
7
+ import { validateTimeout, parseEnabledServers, DEFAULT_TIMEOUT, MAX_TIMEOUT } from '../../src/agent/mcp/config.js';
8
+ import { join, dirname } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = dirname(__filename);
13
+
14
+ describe('MCPClientManager', () => {
15
+ let manager;
16
+
17
+ beforeEach(() => {
18
+ manager = new MCPClientManager({ debug: false });
19
+ });
20
+
21
+ afterEach(async () => {
22
+ if (manager) {
23
+ await manager.disconnect();
24
+ }
25
+ });
26
+
27
+ describe('Transport Creation', () => {
28
+ test('should create stdio transport', () => {
29
+ const config = {
30
+ transport: 'stdio',
31
+ command: 'node',
32
+ args: ['-e', 'console.log("test")']
33
+ };
34
+
35
+ const transport = createTransport(config);
36
+ expect(transport).toBeDefined();
37
+ expect(transport.constructor.name).toBe('StdioClientTransport');
38
+ });
39
+
40
+ test('should create SSE transport', () => {
41
+ const config = {
42
+ transport: 'sse',
43
+ url: 'http://localhost:3000/sse'
44
+ };
45
+
46
+ const transport = createTransport(config);
47
+ expect(transport).toBeDefined();
48
+ expect(transport.constructor.name).toBe('SSEClientTransport');
49
+ });
50
+
51
+ test('should create WebSocket transport', () => {
52
+ const config = {
53
+ transport: 'websocket',
54
+ url: 'ws://localhost:8080'
55
+ };
56
+
57
+ const transport = createTransport(config);
58
+ expect(transport).toBeDefined();
59
+ expect(transport.constructor.name).toBe('WebSocketClientTransport');
60
+ });
61
+
62
+ test('should create WebSocket transport with ws alias', () => {
63
+ const config = {
64
+ transport: 'ws',
65
+ url: 'ws://localhost:8080'
66
+ };
67
+
68
+ const transport = createTransport(config);
69
+ expect(transport).toBeDefined();
70
+ expect(transport.constructor.name).toBe('WebSocketClientTransport');
71
+ });
72
+
73
+ test('should create HTTP transport', () => {
74
+ const config = {
75
+ transport: 'http',
76
+ url: 'http://localhost:3000/mcp'
77
+ };
78
+
79
+ const transport = createTransport(config);
80
+ expect(transport).toBeDefined();
81
+ expect(typeof transport.start).toBe('function');
82
+ expect(typeof transport.send).toBe('function');
83
+ expect(typeof transport.close).toBe('function');
84
+ });
85
+
86
+ test('should throw error for unknown transport', () => {
87
+ const config = {
88
+ transport: 'unknown'
89
+ };
90
+
91
+ expect(() => createTransport(config)).toThrow('Unknown transport type: unknown');
92
+ });
93
+
94
+ test('should throw error for SSE transport without URL', () => {
95
+ const config = {
96
+ transport: 'sse'
97
+ };
98
+
99
+ expect(() => createTransport(config)).toThrow('SSE transport requires a URL');
100
+ });
101
+
102
+ test('should throw error for WebSocket transport without URL', () => {
103
+ const config = {
104
+ transport: 'websocket'
105
+ };
106
+
107
+ expect(() => createTransport(config)).toThrow('WebSocket transport requires a URL');
108
+ });
109
+
110
+ test('should throw error for HTTP transport without URL', () => {
111
+ const config = {
112
+ transport: 'http'
113
+ };
114
+
115
+ expect(() => createTransport(config)).toThrow('HTTP transport requires a URL');
116
+ });
117
+ });
118
+
119
+ describe('Manager Initialization', () => {
120
+ test('should initialize with empty configuration', async () => {
121
+ const result = await manager.initialize({
122
+ mcpServers: {}
123
+ });
124
+
125
+ expect(result.connected).toBe(0);
126
+ expect(result.total).toBe(0);
127
+ expect(result.tools).toEqual([]);
128
+ expect(manager.clients.size).toBe(0);
129
+ expect(manager.tools.size).toBe(0);
130
+ });
131
+
132
+ test('should handle invalid server configurations', async () => {
133
+ const config = {
134
+ mcpServers: {
135
+ 'invalid-server': {
136
+ transport: 'stdio',
137
+ // Missing command
138
+ enabled: true
139
+ }
140
+ }
141
+ };
142
+
143
+ const result = await manager.initialize(config);
144
+ expect(result.connected).toBe(0);
145
+ expect(result.total).toBe(0);
146
+ });
147
+
148
+ test('should initialize with mock server configuration', async () => {
149
+ const config = {
150
+ mcpServers: {
151
+ 'mock-server': {
152
+ command: 'node',
153
+ args: [join(__dirname, 'mockMcpServer.js')],
154
+ transport: 'stdio',
155
+ enabled: true
156
+ }
157
+ }
158
+ };
159
+
160
+ // This will attempt to connect but likely fail without actual server
161
+ // We're testing the configuration parsing and setup
162
+ const result = await manager.initialize(config);
163
+ expect(result.total).toBe(1);
164
+ // Connected might be 0 if server isn't actually running, which is expected in unit tests
165
+ });
166
+ });
167
+
168
+ describe('Tool Management', () => {
169
+ test('should return empty tools when no servers connected', () => {
170
+ const tools = manager.getTools();
171
+ expect(tools).toEqual({});
172
+ });
173
+
174
+ test('should return empty Vercel tools when no servers connected', () => {
175
+ const vercelTools = manager.getVercelTools();
176
+ expect(vercelTools).toEqual({});
177
+ });
178
+
179
+ test('should handle tool calls when no tools available', async () => {
180
+ await expect(manager.callTool('nonexistent', {}))
181
+ .rejects.toThrow('Unknown tool: nonexistent');
182
+ });
183
+ });
184
+
185
+ describe('Mock Server Integration', () => {
186
+ test('should connect to mock server and load tools', async () => {
187
+ const config = {
188
+ mcpServers: {
189
+ 'mock-test': {
190
+ command: 'node',
191
+ args: [join(__dirname, 'mockMcpServer.js')],
192
+ transport: 'stdio',
193
+ enabled: true
194
+ }
195
+ }
196
+ };
197
+
198
+ // Start the manager
199
+ const result = await manager.initialize(config);
200
+
201
+ if (result.connected > 0) {
202
+ // If connection succeeded, verify tools
203
+ const tools = manager.getTools();
204
+ expect(Object.keys(tools).length).toBeGreaterThan(0);
205
+
206
+ // Check for expected mock tools
207
+ const toolNames = Object.keys(tools);
208
+ expect(toolNames.some(name => name.includes('foobar'))).toBe(true);
209
+ expect(toolNames.some(name => name.includes('calculator'))).toBe(true);
210
+ expect(toolNames.some(name => name.includes('echo'))).toBe(true);
211
+
212
+ // Test Vercel tools format
213
+ const vercelTools = manager.getVercelTools();
214
+ expect(Object.keys(vercelTools).length).toBeGreaterThan(0);
215
+
216
+ for (const [name, tool] of Object.entries(vercelTools)) {
217
+ expect(tool).toHaveProperty('description');
218
+ expect(tool).toHaveProperty('inputSchema');
219
+ expect(typeof tool.execute).toBe('function');
220
+ }
221
+ } else {
222
+ // If connection failed (e.g., no actual server running), that's also acceptable for unit tests
223
+ console.warn('Mock server connection failed - this is expected in unit test environment');
224
+ }
225
+ }, 10000); // Longer timeout for connection attempts
226
+ });
227
+
228
+ describe('Cleanup', () => {
229
+ test('should disconnect cleanly', async () => {
230
+ await expect(manager.disconnect()).resolves.not.toThrow();
231
+ });
232
+
233
+ test('should handle multiple disconnect calls', async () => {
234
+ await manager.disconnect();
235
+ await expect(manager.disconnect()).resolves.not.toThrow();
236
+ });
237
+ });
238
+ });
239
+
240
+ describe('Per-Server Timeout Configuration', () => {
241
+ let manager;
242
+
243
+ beforeEach(() => {
244
+ manager = new MCPClientManager({ debug: false });
245
+ });
246
+
247
+ afterEach(async () => {
248
+ if (manager) {
249
+ await manager.disconnect();
250
+ }
251
+ });
252
+
253
+ test('should use global timeout when no per-server timeout configured', async () => {
254
+ const CUSTOM_GLOBAL_TIMEOUT = 45000; // 45 seconds
255
+ const config = {
256
+ mcpServers: {
257
+ 'test-server': {
258
+ command: 'node',
259
+ args: ['-e', 'console.log("test")'],
260
+ transport: 'stdio',
261
+ enabled: true
262
+ // No timeout specified
263
+ }
264
+ },
265
+ settings: {
266
+ timeout: CUSTOM_GLOBAL_TIMEOUT
267
+ }
268
+ };
269
+
270
+ await manager.initialize(config);
271
+
272
+ // Verify the config is stored correctly
273
+ expect(manager.config.settings.timeout).toBe(CUSTOM_GLOBAL_TIMEOUT);
274
+ });
275
+
276
+ test('should prefer per-server timeout over global timeout', async () => {
277
+ const FAST_TIMEOUT = 5000; // 5 seconds
278
+ const SLOW_TIMEOUT = 120000; // 2 minutes
279
+ const config = {
280
+ mcpServers: {
281
+ 'fast-server': {
282
+ command: 'node',
283
+ args: ['-e', 'console.log("fast")'],
284
+ transport: 'stdio',
285
+ enabled: true,
286
+ timeout: FAST_TIMEOUT
287
+ },
288
+ 'slow-server': {
289
+ command: 'node',
290
+ args: ['-e', 'console.log("slow")'],
291
+ transport: 'stdio',
292
+ enabled: true,
293
+ timeout: SLOW_TIMEOUT
294
+ },
295
+ 'default-server': {
296
+ command: 'node',
297
+ args: ['-e', 'console.log("default")'],
298
+ transport: 'stdio',
299
+ enabled: true
300
+ // No per-server timeout, should use global
301
+ }
302
+ },
303
+ settings: {
304
+ timeout: DEFAULT_TIMEOUT
305
+ }
306
+ };
307
+
308
+ await manager.initialize(config);
309
+
310
+ // Verify per-server timeouts are stored in config
311
+ expect(config.mcpServers['fast-server'].timeout).toBe(FAST_TIMEOUT);
312
+ expect(config.mcpServers['slow-server'].timeout).toBe(SLOW_TIMEOUT);
313
+ expect(config.mcpServers['default-server'].timeout).toBeUndefined();
314
+ });
315
+
316
+ test('should use default 30s timeout when neither per-server nor global timeout set', async () => {
317
+ const config = {
318
+ mcpServers: {
319
+ 'test-server': {
320
+ command: 'node',
321
+ args: ['-e', 'console.log("test")'],
322
+ transport: 'stdio',
323
+ enabled: true
324
+ }
325
+ }
326
+ // No settings.timeout
327
+ };
328
+
329
+ await manager.initialize(config);
330
+
331
+ // Global timeout should fall back to default 30000ms
332
+ expect(manager.config?.settings?.timeout).toBeUndefined();
333
+ // The actual default is applied in callTool, which uses || 30000
334
+ });
335
+
336
+ test('should handle zero timeout as valid per-server value', async () => {
337
+ // Zero timeout means immediate timeout (edge case but valid)
338
+ const config = {
339
+ mcpServers: {
340
+ 'no-timeout-server': {
341
+ command: 'node',
342
+ args: ['-e', 'console.log("test")'],
343
+ transport: 'stdio',
344
+ enabled: true,
345
+ timeout: 0 // Explicitly set to 0
346
+ }
347
+ },
348
+ settings: {
349
+ timeout: DEFAULT_TIMEOUT
350
+ }
351
+ };
352
+
353
+ await manager.initialize(config);
354
+
355
+ // Zero should be stored (validation allows 0 as valid)
356
+ expect(config.mcpServers['no-timeout-server'].timeout).toBe(0);
357
+ });
358
+
359
+ test('should cap timeout at maximum value (10 minutes) at config load time', async () => {
360
+ const config = {
361
+ mcpServers: {
362
+ 'test-server': {
363
+ command: 'node',
364
+ args: ['-e', 'console.log("test")'],
365
+ transport: 'stdio',
366
+ enabled: true,
367
+ timeout: 999999999 // Very large value
368
+ }
369
+ }
370
+ };
371
+
372
+ const result = await manager.initialize(config);
373
+
374
+ // Timeout should be capped to MAX_TIMEOUT (600000) at load time
375
+ // The server config is normalized by parseEnabledServers
376
+ expect(result.total).toBe(1);
377
+ // Verify the client's stored config has the capped value
378
+ const clientInfo = manager.clients.get('test-server');
379
+ if (clientInfo) {
380
+ expect(clientInfo.config.timeout).toBe(MAX_TIMEOUT);
381
+ }
382
+ });
383
+
384
+ test('should skip server with negative timeout at config load time', async () => {
385
+ const config = {
386
+ mcpServers: {
387
+ 'invalid-server': {
388
+ command: 'node',
389
+ args: ['-e', 'console.log("test")'],
390
+ transport: 'stdio',
391
+ enabled: true,
392
+ timeout: -5000 // Invalid negative value
393
+ },
394
+ 'valid-server': {
395
+ command: 'node',
396
+ args: ['-e', 'console.log("test")'],
397
+ transport: 'stdio',
398
+ enabled: true,
399
+ timeout: 5000 // Valid value
400
+ }
401
+ }
402
+ };
403
+
404
+ const result = await manager.initialize(config);
405
+
406
+ // Invalid server should be skipped, only valid server should be processed
407
+ expect(result.total).toBe(1);
408
+ });
409
+ });
410
+
411
+ describe('parseEnabledServers Timeout Validation', () => {
412
+ test('should validate and normalize timeout at config load time', () => {
413
+ const config = {
414
+ mcpServers: {
415
+ 'server-with-valid-timeout': {
416
+ command: 'node',
417
+ args: ['server.js'],
418
+ transport: 'stdio',
419
+ enabled: true,
420
+ timeout: 60000
421
+ }
422
+ }
423
+ };
424
+
425
+ const servers = parseEnabledServers(config);
426
+
427
+ expect(servers).toHaveLength(1);
428
+ expect(servers[0].timeout).toBe(60000);
429
+ });
430
+
431
+ test('should cap excessive timeout to MAX_TIMEOUT at load time', () => {
432
+ const config = {
433
+ mcpServers: {
434
+ 'server-with-large-timeout': {
435
+ command: 'node',
436
+ args: ['server.js'],
437
+ transport: 'stdio',
438
+ enabled: true,
439
+ timeout: 999999999
440
+ }
441
+ }
442
+ };
443
+
444
+ const servers = parseEnabledServers(config);
445
+
446
+ expect(servers).toHaveLength(1);
447
+ expect(servers[0].timeout).toBe(MAX_TIMEOUT);
448
+ });
449
+
450
+ test('should skip server with invalid negative timeout at load time', () => {
451
+ const config = {
452
+ mcpServers: {
453
+ 'invalid-server': {
454
+ command: 'node',
455
+ args: ['server.js'],
456
+ transport: 'stdio',
457
+ enabled: true,
458
+ timeout: -1000
459
+ },
460
+ 'valid-server': {
461
+ command: 'node',
462
+ args: ['server.js'],
463
+ transport: 'stdio',
464
+ enabled: true,
465
+ timeout: 5000
466
+ }
467
+ }
468
+ };
469
+
470
+ const servers = parseEnabledServers(config);
471
+
472
+ // Invalid server should be skipped
473
+ expect(servers).toHaveLength(1);
474
+ expect(servers[0].name).toBe('valid-server');
475
+ expect(servers[0].timeout).toBe(5000);
476
+ });
477
+
478
+ test('should allow server without timeout (uses default at runtime)', () => {
479
+ const config = {
480
+ mcpServers: {
481
+ 'server-no-timeout': {
482
+ command: 'node',
483
+ args: ['server.js'],
484
+ transport: 'stdio',
485
+ enabled: true
486
+ // No timeout - will use DEFAULT_TIMEOUT at runtime
487
+ }
488
+ }
489
+ };
490
+
491
+ const servers = parseEnabledServers(config);
492
+
493
+ expect(servers).toHaveLength(1);
494
+ expect(servers[0].timeout).toBeUndefined();
495
+ });
496
+
497
+ test('should preserve zero timeout as valid value', () => {
498
+ const config = {
499
+ mcpServers: {
500
+ 'zero-timeout-server': {
501
+ command: 'node',
502
+ args: ['server.js'],
503
+ transport: 'stdio',
504
+ enabled: true,
505
+ timeout: 0
506
+ }
507
+ }
508
+ };
509
+
510
+ const servers = parseEnabledServers(config);
511
+
512
+ expect(servers).toHaveLength(1);
513
+ expect(servers[0].timeout).toBe(0);
514
+ });
515
+ });
516
+
517
+ describe('validateTimeout Function', () => {
518
+ test('should return undefined for undefined input', () => {
519
+ expect(validateTimeout(undefined)).toBeUndefined();
520
+ });
521
+
522
+ test('should return undefined for null input', () => {
523
+ expect(validateTimeout(null)).toBeUndefined();
524
+ });
525
+
526
+ test('should return undefined for negative numbers', () => {
527
+ expect(validateTimeout(-1000)).toBeUndefined();
528
+ expect(validateTimeout(-1)).toBeUndefined();
529
+ });
530
+
531
+ test('should return undefined for non-numeric strings', () => {
532
+ expect(validateTimeout('invalid')).toBeUndefined();
533
+ expect(validateTimeout('abc')).toBeUndefined();
534
+ });
535
+
536
+ test('should return undefined for NaN', () => {
537
+ expect(validateTimeout(NaN)).toBeUndefined();
538
+ });
539
+
540
+ test('should return undefined for Infinity', () => {
541
+ expect(validateTimeout(Infinity)).toBeUndefined();
542
+ expect(validateTimeout(-Infinity)).toBeUndefined();
543
+ });
544
+
545
+ test('should return 0 for zero input', () => {
546
+ expect(validateTimeout(0)).toBe(0);
547
+ });
548
+
549
+ test('should return valid positive numbers unchanged up to MAX_TIMEOUT', () => {
550
+ expect(validateTimeout(1000)).toBe(1000);
551
+ expect(validateTimeout(30000)).toBe(30000);
552
+ expect(validateTimeout(DEFAULT_TIMEOUT)).toBe(DEFAULT_TIMEOUT);
553
+ });
554
+
555
+ test('should cap values at MAX_TIMEOUT', () => {
556
+ expect(validateTimeout(MAX_TIMEOUT)).toBe(MAX_TIMEOUT);
557
+ expect(validateTimeout(MAX_TIMEOUT + 1)).toBe(MAX_TIMEOUT);
558
+ expect(validateTimeout(999999999)).toBe(MAX_TIMEOUT);
559
+ });
560
+
561
+ test('should convert numeric strings to numbers', () => {
562
+ expect(validateTimeout('5000')).toBe(5000);
563
+ expect(validateTimeout('30000')).toBe(30000);
564
+ });
565
+ });
566
+
567
+ describe('HTTP Transport', () => {
568
+ test('should handle HTTP transport methods', async () => {
569
+ const config = {
570
+ transport: 'http',
571
+ url: 'http://localhost:3000/mcp'
572
+ };
573
+
574
+ const transport = createTransport(config);
575
+
576
+ // Mock fetch for testing
577
+ global.fetch = jest.fn()
578
+ .mockResolvedValueOnce({
579
+ ok: true,
580
+ json: () => Promise.resolve({ protocolVersion: '2024-11-05' })
581
+ })
582
+ .mockResolvedValueOnce({
583
+ ok: true,
584
+ json: () => Promise.resolve({ result: 'success' })
585
+ })
586
+ .mockResolvedValueOnce({
587
+ ok: true
588
+ });
589
+
590
+ await expect(transport.start()).resolves.toBeDefined();
591
+ await expect(transport.send({ method: 'test' })).resolves.toBeDefined();
592
+ await expect(transport.close()).resolves.toBeUndefined();
593
+
594
+ expect(global.fetch).toHaveBeenCalledTimes(3);
595
+ });
596
+
597
+ test('should handle HTTP transport errors', async () => {
598
+ const config = {
599
+ transport: 'http',
600
+ url: 'http://localhost:3000/mcp'
601
+ };
602
+
603
+ const transport = createTransport(config);
604
+
605
+ // Mock fetch to return error
606
+ global.fetch = jest.fn()
607
+ .mockResolvedValueOnce({
608
+ ok: false,
609
+ statusText: 'Internal Server Error'
610
+ });
611
+
612
+ await expect(transport.start()).rejects.toThrow('HTTP initialization failed: Internal Server Error');
613
+ });
614
+ });