@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,566 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive error handling and edge case tests for MCP integration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { jest } from '@jest/globals';
|
|
6
|
+
import { MCPClientManager, createTransport } from '../../src/agent/mcp/client.js';
|
|
7
|
+
import { MCPXmlBridge } from '../../src/agent/mcp/xmlBridge.js';
|
|
8
|
+
import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
|
|
9
|
+
import { join, dirname } from 'path';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import { mkdtemp, writeFile, rm } from 'fs/promises';
|
|
12
|
+
import { tmpdir } from 'os';
|
|
13
|
+
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
|
|
17
|
+
describe('MCP Error Handling and Edge Cases', () => {
|
|
18
|
+
let tempDir;
|
|
19
|
+
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
tempDir = await mkdtemp(join(tmpdir(), 'mcp-error-test-'));
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
afterEach(async () => {
|
|
25
|
+
if (tempDir) {
|
|
26
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
27
|
+
}
|
|
28
|
+
// Clean up environment variables
|
|
29
|
+
delete process.env.MCP_CONFIG_PATH;
|
|
30
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
31
|
+
delete process.env.DEBUG_MCP;
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe('Connection Failures', () => {
|
|
35
|
+
test('should handle non-existent command gracefully', async () => {
|
|
36
|
+
const manager = new MCPClientManager({ debug: false });
|
|
37
|
+
|
|
38
|
+
const config = {
|
|
39
|
+
mcpServers: {
|
|
40
|
+
'nonexistent': {
|
|
41
|
+
command: 'nonexistent-command-that-does-not-exist',
|
|
42
|
+
args: ['--test'],
|
|
43
|
+
transport: 'stdio',
|
|
44
|
+
enabled: true
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const result = await manager.initialize(config);
|
|
50
|
+
|
|
51
|
+
expect(result.connected).toBe(0);
|
|
52
|
+
expect(result.total).toBe(1);
|
|
53
|
+
expect(result.tools).toEqual([]);
|
|
54
|
+
|
|
55
|
+
await manager.disconnect();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('should handle server that exits immediately', async () => {
|
|
59
|
+
const manager = new MCPClientManager({ debug: false });
|
|
60
|
+
|
|
61
|
+
const config = {
|
|
62
|
+
mcpServers: {
|
|
63
|
+
'exits-immediately': {
|
|
64
|
+
command: 'node',
|
|
65
|
+
args: ['-e', 'process.exit(1)'], // Exits immediately with error
|
|
66
|
+
transport: 'stdio',
|
|
67
|
+
enabled: true
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const result = await manager.initialize(config);
|
|
73
|
+
|
|
74
|
+
expect(result.connected).toBe(0);
|
|
75
|
+
expect(result.total).toBe(1);
|
|
76
|
+
|
|
77
|
+
await manager.disconnect();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('should handle malformed server responses', async () => {
|
|
81
|
+
const manager = new MCPClientManager({ debug: false });
|
|
82
|
+
|
|
83
|
+
const config = {
|
|
84
|
+
mcpServers: {
|
|
85
|
+
'malformed': {
|
|
86
|
+
command: 'node',
|
|
87
|
+
args: ['-e', 'console.log("not json"); process.exit(0);'], // Outputs invalid JSON then exits
|
|
88
|
+
transport: 'stdio',
|
|
89
|
+
enabled: true
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const result = await manager.initialize(config);
|
|
95
|
+
|
|
96
|
+
expect(result.connected).toBe(0);
|
|
97
|
+
expect(result.total).toBe(1);
|
|
98
|
+
|
|
99
|
+
await manager.disconnect();
|
|
100
|
+
}, 15000); // Increase timeout
|
|
101
|
+
|
|
102
|
+
test('should handle unreachable HTTP endpoints', async () => {
|
|
103
|
+
const config = {
|
|
104
|
+
transport: 'http',
|
|
105
|
+
url: 'http://localhost:99999/mcp' // Unreachable port
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const transport = createTransport(config);
|
|
109
|
+
|
|
110
|
+
// Mock fetch to simulate connection failure
|
|
111
|
+
global.fetch = jest.fn().mockRejectedValue(new Error('Connection refused'));
|
|
112
|
+
|
|
113
|
+
await expect(transport.start()).rejects.toThrow();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('should handle invalid WebSocket URLs', async () => {
|
|
117
|
+
const config = {
|
|
118
|
+
transport: 'websocket',
|
|
119
|
+
url: 'not-a-valid-url' // Invalid URL
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// This should throw an error for invalid URL
|
|
123
|
+
expect(() => createTransport(config)).toThrow('Invalid WebSocket URL');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
describe('Invalid Configurations', () => {
|
|
128
|
+
test('should handle missing required transport fields', () => {
|
|
129
|
+
// Missing URL for HTTP transport
|
|
130
|
+
expect(() => createTransport({
|
|
131
|
+
transport: 'http'
|
|
132
|
+
})).toThrow('HTTP transport requires a URL');
|
|
133
|
+
|
|
134
|
+
// Missing URL for WebSocket transport
|
|
135
|
+
expect(() => createTransport({
|
|
136
|
+
transport: 'websocket'
|
|
137
|
+
})).toThrow('WebSocket transport requires a URL');
|
|
138
|
+
|
|
139
|
+
// Missing URL for SSE transport
|
|
140
|
+
expect(() => createTransport({
|
|
141
|
+
transport: 'sse'
|
|
142
|
+
})).toThrow('SSE transport requires a URL');
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('should handle invalid transport types', () => {
|
|
146
|
+
expect(() => createTransport({
|
|
147
|
+
transport: 'invalid-transport'
|
|
148
|
+
})).toThrow('Unknown transport type: invalid-transport');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('should handle malformed configuration files', async () => {
|
|
152
|
+
const invalidConfigPath = join(tempDir, 'invalid.json');
|
|
153
|
+
await writeFile(invalidConfigPath, '{ this is not valid json }');
|
|
154
|
+
|
|
155
|
+
process.env.MCP_CONFIG_PATH = invalidConfigPath;
|
|
156
|
+
|
|
157
|
+
const manager = new MCPClientManager({ debug: false });
|
|
158
|
+
|
|
159
|
+
// Should not throw, should fall back to defaults
|
|
160
|
+
const result = await manager.initialize();
|
|
161
|
+
expect(result).toBeDefined();
|
|
162
|
+
|
|
163
|
+
await manager.disconnect();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('should handle empty and null configurations', async () => {
|
|
167
|
+
const manager = new MCPClientManager({ debug: false });
|
|
168
|
+
|
|
169
|
+
// Null configuration
|
|
170
|
+
const result1 = await manager.initialize(null);
|
|
171
|
+
expect(result1.connected).toBe(0);
|
|
172
|
+
expect(result1.total).toBe(0);
|
|
173
|
+
|
|
174
|
+
// Empty configuration
|
|
175
|
+
const result2 = await manager.initialize({});
|
|
176
|
+
expect(result2.connected).toBe(0);
|
|
177
|
+
expect(result2.total).toBe(0);
|
|
178
|
+
|
|
179
|
+
// Configuration with empty mcpServers
|
|
180
|
+
const result3 = await manager.initialize({ mcpServers: {} });
|
|
181
|
+
expect(result3.connected).toBe(0);
|
|
182
|
+
expect(result3.total).toBe(0);
|
|
183
|
+
|
|
184
|
+
await manager.disconnect();
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe('Tool Execution Errors', () => {
|
|
189
|
+
test('should handle tool execution failures with mock server', async () => {
|
|
190
|
+
// Create configuration for mock server that has error-generating tools
|
|
191
|
+
const mcpConfig = {
|
|
192
|
+
mcpServers: {
|
|
193
|
+
'error-test-server': {
|
|
194
|
+
command: 'node',
|
|
195
|
+
args: [join(__dirname, '../mcp/mockMcpServer.js')],
|
|
196
|
+
transport: 'stdio',
|
|
197
|
+
enabled: true
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
const configPath = join(tempDir, 'error-test-config.json');
|
|
203
|
+
await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
|
|
204
|
+
|
|
205
|
+
process.env.MCP_CONFIG_PATH = configPath;
|
|
206
|
+
|
|
207
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
208
|
+
await bridge.initialize();
|
|
209
|
+
|
|
210
|
+
// Wait for initialization
|
|
211
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
212
|
+
|
|
213
|
+
if (bridge.getToolNames().length > 0) {
|
|
214
|
+
// Test error tool that generates validation errors
|
|
215
|
+
const errorXml = `
|
|
216
|
+
<error-test-server_error_test>
|
|
217
|
+
<params>{"error_type": "validation", "message": "Test validation error"}</params>
|
|
218
|
+
</error-test-server_error_test>
|
|
219
|
+
`;
|
|
220
|
+
|
|
221
|
+
const result = await bridge.executeFromXml(errorXml);
|
|
222
|
+
expect(result.success).toBe(false);
|
|
223
|
+
expect(result.error).toContain('Test validation error');
|
|
224
|
+
|
|
225
|
+
// Test error tool that generates runtime errors
|
|
226
|
+
const runtimeErrorXml = `
|
|
227
|
+
<error-test-server_error_test>
|
|
228
|
+
<params>{"error_type": "runtime", "message": "Test runtime error"}</params>
|
|
229
|
+
</error-test-server_error_test>
|
|
230
|
+
`;
|
|
231
|
+
|
|
232
|
+
const runtimeResult = await bridge.executeFromXml(runtimeErrorXml);
|
|
233
|
+
expect(runtimeResult.success).toBe(false);
|
|
234
|
+
expect(runtimeResult.error).toContain('Test runtime error');
|
|
235
|
+
} else {
|
|
236
|
+
console.warn('Mock server not available for error testing');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
await bridge.cleanup();
|
|
240
|
+
}, 15000);
|
|
241
|
+
|
|
242
|
+
test('should handle invalid tool parameters', async () => {
|
|
243
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
244
|
+
|
|
245
|
+
// Mock a tool with specific parameter requirements
|
|
246
|
+
bridge.mcpTools = {
|
|
247
|
+
'strict_tool': {
|
|
248
|
+
execute: async (params) => {
|
|
249
|
+
if (!params.required_param) {
|
|
250
|
+
throw new Error('Missing required parameter: required_param');
|
|
251
|
+
}
|
|
252
|
+
return 'Success';
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// Test with missing required parameter
|
|
258
|
+
const invalidXml = `
|
|
259
|
+
<strict_tool>
|
|
260
|
+
<params>{"optional_param": "value"}</params>
|
|
261
|
+
</strict_tool>
|
|
262
|
+
`;
|
|
263
|
+
|
|
264
|
+
const result = await bridge.executeFromXml(invalidXml);
|
|
265
|
+
expect(result.success).toBe(false);
|
|
266
|
+
expect(result.error).toContain('Missing required parameter');
|
|
267
|
+
|
|
268
|
+
await bridge.cleanup();
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test('should handle tool timeouts', async () => {
|
|
272
|
+
// Create configuration for mock server with slow operations
|
|
273
|
+
const mcpConfig = {
|
|
274
|
+
mcpServers: {
|
|
275
|
+
'timeout-test-server': {
|
|
276
|
+
command: 'node',
|
|
277
|
+
args: [join(__dirname, '../mcp/mockMcpServer.js')],
|
|
278
|
+
transport: 'stdio',
|
|
279
|
+
enabled: true
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
const configPath = join(tempDir, 'timeout-test-config.json');
|
|
285
|
+
await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
|
|
286
|
+
|
|
287
|
+
process.env.MCP_CONFIG_PATH = configPath;
|
|
288
|
+
|
|
289
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
290
|
+
await bridge.initialize();
|
|
291
|
+
|
|
292
|
+
// Wait for initialization
|
|
293
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
294
|
+
|
|
295
|
+
if (bridge.getToolNames().length > 0) {
|
|
296
|
+
// Test slow operation (should complete within reasonable time)
|
|
297
|
+
const slowXml = `
|
|
298
|
+
<timeout-test-server_slow_operation>
|
|
299
|
+
<params>{"delay_ms": 500, "result": "completed successfully"}</params>
|
|
300
|
+
</timeout-test-server_slow_operation>
|
|
301
|
+
`;
|
|
302
|
+
|
|
303
|
+
const start = Date.now();
|
|
304
|
+
const result = await bridge.executeFromXml(slowXml);
|
|
305
|
+
const elapsed = Date.now() - start;
|
|
306
|
+
|
|
307
|
+
if (result.success) {
|
|
308
|
+
expect(elapsed).toBeGreaterThanOrEqual(500);
|
|
309
|
+
expect(result.result).toContain('completed successfully');
|
|
310
|
+
}
|
|
311
|
+
} else {
|
|
312
|
+
console.warn('Mock server not available for timeout testing');
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
await bridge.cleanup();
|
|
316
|
+
}, 20000);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
describe('XML Parsing Edge Cases', () => {
|
|
320
|
+
test('should handle malformed XML', async () => {
|
|
321
|
+
const { parseXmlMcpToolCall } = await import('../../src/agent/mcp/xmlBridge.js');
|
|
322
|
+
|
|
323
|
+
// Unclosed tags
|
|
324
|
+
const malformedXml1 = '<test_tool><params>{"test": "value"}</params>';
|
|
325
|
+
const result1 = parseXmlMcpToolCall(malformedXml1, ['test_tool']);
|
|
326
|
+
expect(result1).toBeNull();
|
|
327
|
+
|
|
328
|
+
// Mismatched tags
|
|
329
|
+
const malformedXml2 = '<test_tool><params>{"test": "value"}</wrong_tag></test_tool>';
|
|
330
|
+
const result2 = parseXmlMcpToolCall(malformedXml2, ['test_tool']);
|
|
331
|
+
expect(result2).toBeDefined(); // Should still parse the tool name
|
|
332
|
+
|
|
333
|
+
// No content
|
|
334
|
+
const emptyXml = '<test_tool></test_tool>';
|
|
335
|
+
const result3 = parseXmlMcpToolCall(emptyXml, ['test_tool']);
|
|
336
|
+
expect(result3).toBeDefined();
|
|
337
|
+
expect(result3.params).toEqual({});
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
test('should handle nested XML and complex content', async () => {
|
|
341
|
+
const { parseXmlMcpToolCall } = await import('../../src/agent/mcp/xmlBridge.js');
|
|
342
|
+
|
|
343
|
+
// XML with nested elements in JSON
|
|
344
|
+
const complexXml = `
|
|
345
|
+
<complex_tool>
|
|
346
|
+
<params>
|
|
347
|
+
{
|
|
348
|
+
"nested": {
|
|
349
|
+
"data": "<xml>content</xml>",
|
|
350
|
+
"array": [1, 2, 3]
|
|
351
|
+
},
|
|
352
|
+
"special_chars": "quotes \\" and <tags> & ampersands"
|
|
353
|
+
}
|
|
354
|
+
</params>
|
|
355
|
+
</complex_tool>
|
|
356
|
+
`;
|
|
357
|
+
|
|
358
|
+
const result = parseXmlMcpToolCall(complexXml, ['complex_tool']);
|
|
359
|
+
expect(result).toBeDefined();
|
|
360
|
+
expect(result.toolName).toBe('complex_tool');
|
|
361
|
+
// The params should be the parsed JSON object
|
|
362
|
+
expect(result.params).toBeDefined();
|
|
363
|
+
expect(result.params.nested).toBeDefined();
|
|
364
|
+
expect(result.params.nested.data).toBe('<xml>content</xml>');
|
|
365
|
+
expect(result.params.nested.array).toEqual([1, 2, 3]);
|
|
366
|
+
expect(result.params.special_chars).toBe('quotes " and <tags> & ampersands');
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
test('should handle CDATA sections', async () => {
|
|
370
|
+
const { parseXmlMcpToolCall } = await import('../../src/agent/mcp/xmlBridge.js');
|
|
371
|
+
|
|
372
|
+
const cdataXml = `
|
|
373
|
+
<cdata_tool>
|
|
374
|
+
<params><![CDATA[{"message": "This contains <special> characters & symbols"}]]></params>
|
|
375
|
+
</cdata_tool>
|
|
376
|
+
`;
|
|
377
|
+
|
|
378
|
+
const result = parseXmlMcpToolCall(cdataXml, ['cdata_tool']);
|
|
379
|
+
expect(result).toBeDefined();
|
|
380
|
+
expect(result.params.message).toBe('This contains <special> characters & symbols');
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
describe('ProbeAgent Integration Error Handling', () => {
|
|
385
|
+
test('should handle MCP initialization failure in ProbeAgent', async () => {
|
|
386
|
+
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
387
|
+
|
|
388
|
+
// Create invalid MCP configuration
|
|
389
|
+
const mcpConfig = {
|
|
390
|
+
mcpServers: {
|
|
391
|
+
'failing-server': {
|
|
392
|
+
command: 'nonexistent-command',
|
|
393
|
+
transport: 'stdio',
|
|
394
|
+
enabled: true
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
const configPath = join(tempDir, 'failing-config.json');
|
|
400
|
+
await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
|
|
401
|
+
|
|
402
|
+
process.env.MCP_CONFIG_PATH = configPath;
|
|
403
|
+
|
|
404
|
+
// Should not throw during initialization
|
|
405
|
+
const agent = new ProbeAgent({
|
|
406
|
+
enableMcp: true,
|
|
407
|
+
debug: false,
|
|
408
|
+
path: tempDir
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
// Wait for MCP initialization attempt
|
|
412
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
413
|
+
|
|
414
|
+
// Agent should still be functional, just without MCP tools
|
|
415
|
+
expect(agent.enableMcp).toBe(true);
|
|
416
|
+
// The bridge exists but has no connected servers/tools
|
|
417
|
+
if (agent.mcpBridge) {
|
|
418
|
+
expect(agent.mcpBridge.getToolNames().length).toBe(0);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
const systemMessage = await agent.getSystemMessage();
|
|
422
|
+
expect(systemMessage).toBeDefined();
|
|
423
|
+
expect(systemMessage).not.toContain('MCP Tools'); // No MCP tools section
|
|
424
|
+
|
|
425
|
+
await agent.cleanup();
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
test('should handle concurrent MCP operations', async () => {
|
|
429
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
430
|
+
|
|
431
|
+
// Mock multiple tools
|
|
432
|
+
bridge.mcpTools = {
|
|
433
|
+
'tool1': {
|
|
434
|
+
execute: async (params) => {
|
|
435
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
436
|
+
return `Tool1 result: ${params.input}`;
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
'tool2': {
|
|
440
|
+
execute: async (params) => {
|
|
441
|
+
await new Promise(resolve => setTimeout(resolve, 150));
|
|
442
|
+
return `Tool2 result: ${params.input}`;
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
'tool3': {
|
|
446
|
+
execute: async (params) => {
|
|
447
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
448
|
+
return `Tool3 result: ${params.input}`;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
// Execute multiple tools concurrently
|
|
454
|
+
const promises = [
|
|
455
|
+
bridge.executeFromXml('<tool1><params>{"input": "test1"}</params></tool1>'),
|
|
456
|
+
bridge.executeFromXml('<tool2><params>{"input": "test2"}</params></tool2>'),
|
|
457
|
+
bridge.executeFromXml('<tool3><params>{"input": "test3"}</params></tool3>')
|
|
458
|
+
];
|
|
459
|
+
|
|
460
|
+
const results = await Promise.all(promises);
|
|
461
|
+
|
|
462
|
+
expect(results).toHaveLength(3);
|
|
463
|
+
results.forEach((result, index) => {
|
|
464
|
+
expect(result.success).toBe(true);
|
|
465
|
+
expect(result.result).toContain(`Tool${index + 1} result`);
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
await bridge.cleanup();
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
test('should handle partial MCP failures', async () => {
|
|
472
|
+
// Test scenario where some servers connect and others fail
|
|
473
|
+
const mcpConfig = {
|
|
474
|
+
mcpServers: {
|
|
475
|
+
'working-server': {
|
|
476
|
+
command: 'node',
|
|
477
|
+
args: [join(__dirname, '../mcp/mockMcpServer.js')],
|
|
478
|
+
transport: 'stdio',
|
|
479
|
+
enabled: true
|
|
480
|
+
},
|
|
481
|
+
'failing-server': {
|
|
482
|
+
command: 'nonexistent-command',
|
|
483
|
+
transport: 'stdio',
|
|
484
|
+
enabled: true
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
const configPath = join(tempDir, 'partial-config.json');
|
|
490
|
+
await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
|
|
491
|
+
|
|
492
|
+
process.env.MCP_CONFIG_PATH = configPath;
|
|
493
|
+
|
|
494
|
+
const manager = new MCPClientManager({ debug: false });
|
|
495
|
+
const result = await manager.initialize();
|
|
496
|
+
|
|
497
|
+
// Should have attempted 2 connections, with possibly 1 success
|
|
498
|
+
expect(result.total).toBe(2);
|
|
499
|
+
// Connected count depends on whether mock server actually starts
|
|
500
|
+
expect(result.connected).toBeLessThanOrEqual(1);
|
|
501
|
+
|
|
502
|
+
await manager.disconnect();
|
|
503
|
+
}, 15000);
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
describe('Memory and Resource Management', () => {
|
|
507
|
+
test('should clean up resources properly on multiple disconnect calls', async () => {
|
|
508
|
+
const manager = new MCPClientManager({ debug: false });
|
|
509
|
+
|
|
510
|
+
// Initialize with empty config
|
|
511
|
+
await manager.initialize({ mcpServers: {} });
|
|
512
|
+
|
|
513
|
+
// Multiple cleanup calls should not throw
|
|
514
|
+
await manager.disconnect();
|
|
515
|
+
await manager.disconnect();
|
|
516
|
+
await manager.disconnect();
|
|
517
|
+
|
|
518
|
+
expect(manager.clients.size).toBe(0);
|
|
519
|
+
expect(manager.tools.size).toBe(0);
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
test('should handle cleanup when connections are already closed', async () => {
|
|
523
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
524
|
+
|
|
525
|
+
// Initialize without any actual connections
|
|
526
|
+
await bridge.initialize({ mcpServers: {} });
|
|
527
|
+
|
|
528
|
+
// Cleanup should not throw even if nothing to clean up
|
|
529
|
+
await expect(bridge.cleanup()).resolves.not.toThrow();
|
|
530
|
+
await expect(bridge.cleanup()).resolves.not.toThrow(); // Second cleanup
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
test('should handle memory pressure with many tool calls', async () => {
|
|
534
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
535
|
+
|
|
536
|
+
// Mock a simple tool
|
|
537
|
+
bridge.mcpTools = {
|
|
538
|
+
'memory_test': {
|
|
539
|
+
execute: async (params) => {
|
|
540
|
+
// Create some data
|
|
541
|
+
const data = new Array(1000).fill(params.index || 0);
|
|
542
|
+
return `Processed ${data.length} items`;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
};
|
|
546
|
+
|
|
547
|
+
// Execute many tool calls
|
|
548
|
+
const promises = [];
|
|
549
|
+
for (let i = 0; i < 100; i++) {
|
|
550
|
+
promises.push(
|
|
551
|
+
bridge.executeFromXml(`<memory_test><params>{"index": ${i}}</params></memory_test>`)
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
const results = await Promise.all(promises);
|
|
556
|
+
|
|
557
|
+
expect(results).toHaveLength(100);
|
|
558
|
+
results.forEach((result, index) => {
|
|
559
|
+
expect(result.success).toBe(true);
|
|
560
|
+
expect(result.result).toContain('Processed 1000 items');
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
await bridge.cleanup();
|
|
564
|
+
});
|
|
565
|
+
});
|
|
566
|
+
});
|