@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.
- package/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- 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
|
+
});
|