@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,564 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Robustness tests for MCP integration under stress and edge conditions
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { jest } from '@jest/globals';
|
|
6
|
+
import { MCPClientManager } 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 Robustness Tests', () => {
|
|
18
|
+
let tempDir;
|
|
19
|
+
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
tempDir = await mkdtemp(join(tmpdir(), 'mcp-robustness-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('High Load Testing', () => {
|
|
35
|
+
test('should handle rapid tool execution requests', async () => {
|
|
36
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
37
|
+
|
|
38
|
+
// Mock a fast-responding tool
|
|
39
|
+
bridge.mcpTools = {
|
|
40
|
+
'fast_tool': {
|
|
41
|
+
execute: async (params) => {
|
|
42
|
+
return `Fast response for: ${params.input}`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Execute 50 tool calls rapidly
|
|
48
|
+
const startTime = Date.now();
|
|
49
|
+
const promises = [];
|
|
50
|
+
|
|
51
|
+
for (let i = 0; i < 50; i++) {
|
|
52
|
+
promises.push(
|
|
53
|
+
bridge.executeFromXml(`<fast_tool><params>{"input": "request_${i}"}</params></fast_tool>`)
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const results = await Promise.all(promises);
|
|
58
|
+
const endTime = Date.now();
|
|
59
|
+
|
|
60
|
+
expect(results).toHaveLength(50);
|
|
61
|
+
results.forEach((result, index) => {
|
|
62
|
+
expect(result.success).toBe(true);
|
|
63
|
+
expect(result.result).toContain(`request_${index}`);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
console.log(`Executed 50 tool calls in ${endTime - startTime}ms`);
|
|
67
|
+
expect(endTime - startTime).toBeLessThan(5000); // Should complete within 5 seconds
|
|
68
|
+
|
|
69
|
+
await bridge.cleanup();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('should handle mixed tool execution patterns', async () => {
|
|
73
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
74
|
+
|
|
75
|
+
// Mock tools with different response times
|
|
76
|
+
bridge.mcpTools = {
|
|
77
|
+
'instant_tool': {
|
|
78
|
+
execute: async (params) => `Instant: ${params.id}`
|
|
79
|
+
},
|
|
80
|
+
'slow_tool': {
|
|
81
|
+
execute: async (params) => {
|
|
82
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
83
|
+
return `Slow: ${params.id}`;
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
'variable_tool': {
|
|
87
|
+
execute: async (params) => {
|
|
88
|
+
const delay = Math.random() * 50;
|
|
89
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
90
|
+
return `Variable: ${params.id}`;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Execute mixed pattern of tools
|
|
96
|
+
const promises = [];
|
|
97
|
+
const tools = ['instant_tool', 'slow_tool', 'variable_tool'];
|
|
98
|
+
|
|
99
|
+
for (let i = 0; i < 30; i++) {
|
|
100
|
+
const tool = tools[i % tools.length];
|
|
101
|
+
promises.push(
|
|
102
|
+
bridge.executeFromXml(`<${tool}><params>{"id": ${i}}</params></${tool}>`)
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const results = await Promise.all(promises);
|
|
107
|
+
|
|
108
|
+
expect(results).toHaveLength(30);
|
|
109
|
+
results.forEach((result, index) => {
|
|
110
|
+
expect(result.success).toBe(true);
|
|
111
|
+
expect(result.result).toContain(`${index}`);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
await bridge.cleanup();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
describe('Network Resilience', () => {
|
|
119
|
+
test('should handle HTTP transport with network simulation', async () => {
|
|
120
|
+
let fetchCallCount = 0;
|
|
121
|
+
let shouldFail = false;
|
|
122
|
+
|
|
123
|
+
// Mock fetch with network simulation
|
|
124
|
+
global.fetch = jest.fn().mockImplementation(async (url, options) => {
|
|
125
|
+
fetchCallCount++;
|
|
126
|
+
|
|
127
|
+
if (shouldFail && fetchCallCount % 3 === 0) {
|
|
128
|
+
throw new Error('Network timeout');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (url.includes('/initialize')) {
|
|
132
|
+
return {
|
|
133
|
+
ok: true,
|
|
134
|
+
json: () => Promise.resolve({ protocolVersion: '2024-11-05' })
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (url.includes('/message')) {
|
|
139
|
+
return {
|
|
140
|
+
ok: true,
|
|
141
|
+
json: () => Promise.resolve({ result: `Response ${fetchCallCount}` })
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return { ok: true };
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const { createTransport } = await import('../../src/agent/mcp/client.js');
|
|
149
|
+
|
|
150
|
+
const transport = createTransport({
|
|
151
|
+
transport: 'http',
|
|
152
|
+
url: 'http://localhost:3000/mcp'
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// Test successful initialization
|
|
156
|
+
await expect(transport.start()).resolves.toBeDefined();
|
|
157
|
+
|
|
158
|
+
// Test successful messages
|
|
159
|
+
await expect(transport.send({ method: 'test1' })).resolves.toBeDefined();
|
|
160
|
+
await expect(transport.send({ method: 'test2' })).resolves.toBeDefined();
|
|
161
|
+
|
|
162
|
+
// Enable failures
|
|
163
|
+
shouldFail = true;
|
|
164
|
+
|
|
165
|
+
// Test that the transport still works (some may fail due to network simulation)
|
|
166
|
+
try {
|
|
167
|
+
await transport.send({ method: 'test3' });
|
|
168
|
+
} catch (error) {
|
|
169
|
+
expect(error.message).toContain('Network timeout');
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// But others should succeed
|
|
173
|
+
await expect(transport.send({ method: 'test4' })).resolves.toBeDefined();
|
|
174
|
+
|
|
175
|
+
await transport.close();
|
|
176
|
+
|
|
177
|
+
expect(fetchCallCount).toBeGreaterThan(3);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test('should handle gradual server degradation', async () => {
|
|
181
|
+
let responseDelay = 0;
|
|
182
|
+
|
|
183
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
184
|
+
|
|
185
|
+
// Mock tool with increasing delay
|
|
186
|
+
bridge.mcpTools = {
|
|
187
|
+
'degrading_tool': {
|
|
188
|
+
execute: async (params) => {
|
|
189
|
+
await new Promise(resolve => setTimeout(resolve, responseDelay));
|
|
190
|
+
responseDelay += 10; // Increase delay each time
|
|
191
|
+
return `Response after ${responseDelay - 10}ms delay`;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const results = [];
|
|
197
|
+
const promises = [];
|
|
198
|
+
|
|
199
|
+
// Execute 10 tool calls with increasing delays
|
|
200
|
+
for (let i = 0; i < 10; i++) {
|
|
201
|
+
promises.push(
|
|
202
|
+
bridge.executeFromXml(`<degrading_tool><params>{"call": ${i}}</params></degrading_tool>`)
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const allResults = await Promise.all(promises);
|
|
207
|
+
|
|
208
|
+
expect(allResults).toHaveLength(10);
|
|
209
|
+
allResults.forEach((result) => {
|
|
210
|
+
expect(result.success).toBe(true);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
await bridge.cleanup();
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
describe('Memory Management Under Stress', () => {
|
|
218
|
+
test('should handle large payloads', async () => {
|
|
219
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
220
|
+
|
|
221
|
+
// Mock tool that handles large data
|
|
222
|
+
bridge.mcpTools = {
|
|
223
|
+
'large_data_tool': {
|
|
224
|
+
execute: async (params) => {
|
|
225
|
+
const size = params.size || 1000;
|
|
226
|
+
const data = new Array(size).fill(0).map((_, i) => `item_${i}`);
|
|
227
|
+
return {
|
|
228
|
+
processed_items: data.length,
|
|
229
|
+
sample: data.slice(0, 5),
|
|
230
|
+
total_size: JSON.stringify(data).length
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
// Test with increasing payload sizes
|
|
237
|
+
const sizes = [100, 1000, 5000, 10000];
|
|
238
|
+
const results = [];
|
|
239
|
+
|
|
240
|
+
for (const size of sizes) {
|
|
241
|
+
const result = await bridge.executeFromXml(
|
|
242
|
+
`<large_data_tool><params>{"size": ${size}}</params></large_data_tool>`
|
|
243
|
+
);
|
|
244
|
+
results.push(result);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
expect(results).toHaveLength(4);
|
|
248
|
+
results.forEach((result, index) => {
|
|
249
|
+
expect(result.success).toBe(true);
|
|
250
|
+
const parsed = typeof result.result === 'string'
|
|
251
|
+
? JSON.parse(result.result)
|
|
252
|
+
: result.result;
|
|
253
|
+
expect(parsed.processed_items).toBe(sizes[index]);
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
await bridge.cleanup();
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test('should handle memory pressure scenarios', async () => {
|
|
260
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
261
|
+
|
|
262
|
+
// Mock tool that creates temporary large objects
|
|
263
|
+
bridge.mcpTools = {
|
|
264
|
+
'memory_pressure_tool': {
|
|
265
|
+
execute: async (params) => {
|
|
266
|
+
// Create and immediately discard large objects
|
|
267
|
+
for (let i = 0; i < 100; i++) {
|
|
268
|
+
const largeArray = new Array(10000).fill(`data_${i}`);
|
|
269
|
+
// Process the array briefly
|
|
270
|
+
const sum = largeArray.length;
|
|
271
|
+
}
|
|
272
|
+
return `Processed memory pressure test: ${params.iteration}`;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
// Execute multiple memory-intensive operations
|
|
278
|
+
const promises = [];
|
|
279
|
+
for (let i = 0; i < 20; i++) {
|
|
280
|
+
promises.push(
|
|
281
|
+
bridge.executeFromXml(`<memory_pressure_tool><params>{"iteration": ${i}}</params></memory_pressure_tool>`)
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const results = await Promise.all(promises);
|
|
286
|
+
|
|
287
|
+
expect(results).toHaveLength(20);
|
|
288
|
+
results.forEach((result) => {
|
|
289
|
+
expect(result.success).toBe(true);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
await bridge.cleanup();
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
describe('Configuration Edge Cases', () => {
|
|
297
|
+
test('should handle extremely large configuration files', async () => {
|
|
298
|
+
// Create a configuration with many servers
|
|
299
|
+
const mcpConfig = {
|
|
300
|
+
mcpServers: {}
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
// Add 100 mock servers (most disabled)
|
|
304
|
+
for (let i = 0; i < 100; i++) {
|
|
305
|
+
mcpConfig.mcpServers[`server_${i}`] = {
|
|
306
|
+
command: 'echo',
|
|
307
|
+
args: [`server_${i}`],
|
|
308
|
+
transport: 'stdio',
|
|
309
|
+
enabled: i < 5 // Only enable first 5
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const configPath = join(tempDir, 'large-config.json');
|
|
314
|
+
await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
|
|
315
|
+
|
|
316
|
+
process.env.MCP_CONFIG_PATH = configPath;
|
|
317
|
+
|
|
318
|
+
const manager = new MCPClientManager({ debug: false });
|
|
319
|
+
const result = await manager.initialize();
|
|
320
|
+
|
|
321
|
+
// Should only attempt to connect to enabled servers
|
|
322
|
+
expect(result.total).toBe(5);
|
|
323
|
+
|
|
324
|
+
await manager.disconnect();
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
test('should handle configuration with invalid JSON structures', async () => {
|
|
328
|
+
// Create configuration with edge case JSON
|
|
329
|
+
const edgeCaseConfig = {
|
|
330
|
+
mcpServers: {
|
|
331
|
+
'unicode_server': {
|
|
332
|
+
command: 'echo',
|
|
333
|
+
args: ['🚀', '测试', '🌟'],
|
|
334
|
+
transport: 'stdio',
|
|
335
|
+
enabled: false,
|
|
336
|
+
description: 'Server with unicode characters: émojis 🎉'
|
|
337
|
+
},
|
|
338
|
+
'special_chars': {
|
|
339
|
+
command: 'echo',
|
|
340
|
+
args: ['arg with spaces', 'arg"with"quotes', 'arg\\with\\backslashes'],
|
|
341
|
+
transport: 'stdio',
|
|
342
|
+
enabled: false,
|
|
343
|
+
env: {
|
|
344
|
+
'VAR_WITH_SPACES': 'value with spaces',
|
|
345
|
+
'VAR_WITH_QUOTES': 'value "with" quotes',
|
|
346
|
+
'VAR_WITH_UNICODE': '🌍 global variable'
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
const configPath = join(tempDir, 'edge-case-config.json');
|
|
353
|
+
await writeFile(configPath, JSON.stringify(edgeCaseConfig, null, 2));
|
|
354
|
+
|
|
355
|
+
process.env.MCP_CONFIG_PATH = configPath;
|
|
356
|
+
|
|
357
|
+
const { loadMCPConfiguration, parseEnabledServers } = await import('../../src/agent/mcp/config.js');
|
|
358
|
+
|
|
359
|
+
// Should load without throwing
|
|
360
|
+
const config = loadMCPConfiguration();
|
|
361
|
+
expect(config).toBeDefined();
|
|
362
|
+
expect(config.mcpServers.unicode_server).toBeDefined();
|
|
363
|
+
expect(config.mcpServers.special_chars).toBeDefined();
|
|
364
|
+
|
|
365
|
+
// Should parse without throwing
|
|
366
|
+
const servers = parseEnabledServers(config);
|
|
367
|
+
expect(servers).toEqual([]); // All servers are disabled
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
describe('Long-Running Stability', () => {
|
|
372
|
+
test('should maintain stability over many operations', async () => {
|
|
373
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
374
|
+
|
|
375
|
+
// Mock a stateful tool
|
|
376
|
+
let callCount = 0;
|
|
377
|
+
bridge.mcpTools = {
|
|
378
|
+
'stateful_tool': {
|
|
379
|
+
execute: async (params) => {
|
|
380
|
+
callCount++;
|
|
381
|
+
return {
|
|
382
|
+
call_number: callCount,
|
|
383
|
+
input: params.input,
|
|
384
|
+
timestamp: Date.now()
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
// Execute many operations over time
|
|
391
|
+
const totalOperations = 200;
|
|
392
|
+
const batchSize = 20;
|
|
393
|
+
const results = [];
|
|
394
|
+
|
|
395
|
+
for (let batch = 0; batch < totalOperations / batchSize; batch++) {
|
|
396
|
+
const batchPromises = [];
|
|
397
|
+
|
|
398
|
+
for (let i = 0; i < batchSize; i++) {
|
|
399
|
+
const opNumber = batch * batchSize + i;
|
|
400
|
+
batchPromises.push(
|
|
401
|
+
bridge.executeFromXml(`<stateful_tool><params>{"input": "op_${opNumber}"}</params></stateful_tool>`)
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const batchResults = await Promise.all(batchPromises);
|
|
406
|
+
results.push(...batchResults);
|
|
407
|
+
|
|
408
|
+
// Small delay between batches
|
|
409
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
expect(results).toHaveLength(totalOperations);
|
|
413
|
+
results.forEach((result, index) => {
|
|
414
|
+
expect(result.success).toBe(true);
|
|
415
|
+
const parsed = typeof result.result === 'string'
|
|
416
|
+
? JSON.parse(result.result)
|
|
417
|
+
: result.result;
|
|
418
|
+
expect(parsed.call_number).toBe(index + 1);
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
await bridge.cleanup();
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
test('should handle intermittent failures gracefully', async () => {
|
|
425
|
+
const bridge = new MCPXmlBridge({ debug: false });
|
|
426
|
+
|
|
427
|
+
// Mock tool that fails intermittently
|
|
428
|
+
let callCount = 0;
|
|
429
|
+
bridge.mcpTools = {
|
|
430
|
+
'flaky_tool': {
|
|
431
|
+
execute: async (params) => {
|
|
432
|
+
callCount++;
|
|
433
|
+
|
|
434
|
+
// Fail every 7th call
|
|
435
|
+
if (callCount % 7 === 0) {
|
|
436
|
+
throw new Error(`Intermittent failure on call ${callCount}`);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
return `Success on call ${callCount}`;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
const promises = [];
|
|
445
|
+
for (let i = 0; i < 50; i++) {
|
|
446
|
+
promises.push(
|
|
447
|
+
bridge.executeFromXml(`<flaky_tool><params>{"call": ${i}}</params></flaky_tool>`)
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
const results = await Promise.all(promises);
|
|
452
|
+
|
|
453
|
+
expect(results).toHaveLength(50);
|
|
454
|
+
|
|
455
|
+
let successCount = 0;
|
|
456
|
+
let failureCount = 0;
|
|
457
|
+
|
|
458
|
+
results.forEach((result) => {
|
|
459
|
+
if (result.success) {
|
|
460
|
+
successCount++;
|
|
461
|
+
} else {
|
|
462
|
+
failureCount++;
|
|
463
|
+
expect(result.error).toContain('Intermittent failure');
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
// Should have approximately 7 failures (every 7th call)
|
|
468
|
+
expect(failureCount).toBeGreaterThan(5);
|
|
469
|
+
expect(failureCount).toBeLessThan(10);
|
|
470
|
+
expect(successCount).toBe(50 - failureCount);
|
|
471
|
+
|
|
472
|
+
await bridge.cleanup();
|
|
473
|
+
});
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
describe('Integration Stress Tests', () => {
|
|
477
|
+
test('should handle ProbeAgent with mock server under load', async () => {
|
|
478
|
+
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
479
|
+
|
|
480
|
+
// Create configuration for mock server
|
|
481
|
+
const mcpConfig = {
|
|
482
|
+
mcpServers: {
|
|
483
|
+
'stress-test-server': {
|
|
484
|
+
command: 'node',
|
|
485
|
+
args: [join(__dirname, '../mcp/mockMcpServer.js')],
|
|
486
|
+
transport: 'stdio',
|
|
487
|
+
enabled: true
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
const configPath = join(tempDir, 'stress-test-config.json');
|
|
493
|
+
await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
|
|
494
|
+
|
|
495
|
+
process.env.MCP_CONFIG_PATH = configPath;
|
|
496
|
+
|
|
497
|
+
const agent = new ProbeAgent({
|
|
498
|
+
enableMcp: true,
|
|
499
|
+
debug: false,
|
|
500
|
+
path: tempDir
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
// Wait for initialization
|
|
504
|
+
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
505
|
+
|
|
506
|
+
if (agent.mcpBridge && agent.mcpBridge.getToolNames().length > 0) {
|
|
507
|
+
// Test system message generation under rapid calls
|
|
508
|
+
const systemMessagePromises = [];
|
|
509
|
+
for (let i = 0; i < 10; i++) {
|
|
510
|
+
systemMessagePromises.push(agent.getSystemMessage());
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
const systemMessages = await Promise.all(systemMessagePromises);
|
|
514
|
+
expect(systemMessages).toHaveLength(10);
|
|
515
|
+
|
|
516
|
+
// All messages should be identical and contain MCP tools
|
|
517
|
+
systemMessages.forEach(message => {
|
|
518
|
+
expect(message).toContain('foobar');
|
|
519
|
+
expect(message).toBe(systemMessages[0]);
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
console.log('Stress test completed successfully');
|
|
523
|
+
} else {
|
|
524
|
+
console.warn('Mock server not available for stress testing');
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
await agent.cleanup();
|
|
528
|
+
}, 20000);
|
|
529
|
+
|
|
530
|
+
test('should handle multiple ProbeAgent instances with MCP', async () => {
|
|
531
|
+
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
532
|
+
|
|
533
|
+
const agents = [];
|
|
534
|
+
|
|
535
|
+
try {
|
|
536
|
+
// Create multiple agents with MCP enabled
|
|
537
|
+
for (let i = 0; i < 5; i++) {
|
|
538
|
+
const agent = new ProbeAgent({
|
|
539
|
+
enableMcp: true,
|
|
540
|
+
debug: false,
|
|
541
|
+
path: tempDir,
|
|
542
|
+
sessionId: `stress-test-${i}`
|
|
543
|
+
});
|
|
544
|
+
agents.push(agent);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// Wait for all initializations
|
|
548
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
549
|
+
|
|
550
|
+
// Verify all agents are independent
|
|
551
|
+
for (let i = 0; i < agents.length; i++) {
|
|
552
|
+
const agent = agents[i];
|
|
553
|
+
expect(agent.sessionId).toContain(`stress-test-${i}`);
|
|
554
|
+
expect(agent.enableMcp).toBe(true);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
console.log('Multiple agent test completed successfully');
|
|
558
|
+
} finally {
|
|
559
|
+
// Cleanup all agents
|
|
560
|
+
await Promise.all(agents.map(agent => agent.cleanup()));
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
});
|