@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,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for max tool iterations warning logic
|
|
3
|
+
* Tests the core warning message functionality without full ProbeAgent integration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, test, expect } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
describe('Max Tool Iterations Warning Logic', () => {
|
|
9
|
+
|
|
10
|
+
// Test the core warning message generation logic
|
|
11
|
+
describe('Warning Message Generation', () => {
|
|
12
|
+
test('should generate correct warning message format', () => {
|
|
13
|
+
const maxIterations = 30;
|
|
14
|
+
const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (${maxIterations}). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
|
|
15
|
+
|
|
16
|
+
// Verify the warning message contains all required elements
|
|
17
|
+
expect(warningMessage).toContain('⚠️ WARNING');
|
|
18
|
+
expect(warningMessage).toContain('maximum tool iterations limit');
|
|
19
|
+
expect(warningMessage).toContain(`(${maxIterations})`);
|
|
20
|
+
expect(warningMessage).toContain('This is your final message');
|
|
21
|
+
expect(warningMessage).toContain('honestly state what was not done');
|
|
22
|
+
expect(warningMessage).toContain('partial results or recommendations');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('should include different iteration limits in message', () => {
|
|
26
|
+
const testLimits = [1, 5, 10, 30, 50, 100];
|
|
27
|
+
|
|
28
|
+
testLimits.forEach(limit => {
|
|
29
|
+
const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (${limit}). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
|
|
30
|
+
|
|
31
|
+
expect(warningMessage).toContain(`limit (${limit})`);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('Iteration Counting Logic', () => {
|
|
37
|
+
test('should detect when current iteration equals max iterations', () => {
|
|
38
|
+
// Test different scenarios
|
|
39
|
+
const testCases = [
|
|
40
|
+
{ current: 1, max: 1, shouldWarn: true },
|
|
41
|
+
{ current: 5, max: 5, shouldWarn: true },
|
|
42
|
+
{ current: 30, max: 30, shouldWarn: true },
|
|
43
|
+
{ current: 1, max: 5, shouldWarn: false },
|
|
44
|
+
{ current: 4, max: 5, shouldWarn: false },
|
|
45
|
+
{ current: 29, max: 30, shouldWarn: false }
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
testCases.forEach(({ current, max, shouldWarn }) => {
|
|
49
|
+
const shouldShowWarning = (current === max);
|
|
50
|
+
expect(shouldShowWarning).toBe(shouldWarn);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('should handle schema-extended iteration limits', () => {
|
|
55
|
+
const baseLimit = 30;
|
|
56
|
+
const schemaExtension = 4;
|
|
57
|
+
const extendedLimit = baseLimit + schemaExtension;
|
|
58
|
+
|
|
59
|
+
// When schema is provided, limit should be extended
|
|
60
|
+
expect(extendedLimit).toBe(34);
|
|
61
|
+
|
|
62
|
+
// Warning should trigger at the extended limit
|
|
63
|
+
const shouldWarnAtBase = (baseLimit === baseLimit); // true
|
|
64
|
+
const shouldWarnAtExtended = (extendedLimit === extendedLimit); // true
|
|
65
|
+
|
|
66
|
+
expect(shouldWarnAtBase).toBe(true);
|
|
67
|
+
expect(shouldWarnAtExtended).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('Environment Variable Handling', () => {
|
|
72
|
+
test('should parse MAX_TOOL_ITERATIONS environment variable correctly', () => {
|
|
73
|
+
// Test parsing logic (simulating how the actual code works)
|
|
74
|
+
const testCases = [
|
|
75
|
+
{ env: '30', expected: 30 },
|
|
76
|
+
{ env: '1', expected: 1 },
|
|
77
|
+
{ env: '100', expected: 100 },
|
|
78
|
+
{ env: undefined, expected: 30 }, // default
|
|
79
|
+
{ env: '', expected: 30 }, // default
|
|
80
|
+
{ env: 'invalid', expected: NaN }
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
testCases.forEach(({ env, expected }) => {
|
|
84
|
+
const parsed = parseInt(env || '30', 10);
|
|
85
|
+
if (isNaN(expected)) {
|
|
86
|
+
expect(isNaN(parsed)).toBe(true);
|
|
87
|
+
} else {
|
|
88
|
+
expect(parsed).toBe(expected);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe('Message Structure Validation', () => {
|
|
95
|
+
test('should create proper message structure for AI model', () => {
|
|
96
|
+
const maxIterations = 25;
|
|
97
|
+
const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (${maxIterations}). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
|
|
98
|
+
|
|
99
|
+
// Simulate the message structure that would be added to the conversation
|
|
100
|
+
const messageStructure = {
|
|
101
|
+
role: 'user',
|
|
102
|
+
content: warningMessage
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
expect(messageStructure.role).toBe('user');
|
|
106
|
+
expect(messageStructure.content).toBe(warningMessage);
|
|
107
|
+
expect(typeof messageStructure.content).toBe('string');
|
|
108
|
+
expect(messageStructure.content.length).toBeGreaterThan(0);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('should ensure warning message is clear and actionable', () => {
|
|
112
|
+
const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (30). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
|
|
113
|
+
|
|
114
|
+
// Check that the message contains actionable instructions
|
|
115
|
+
const actionableKeywords = [
|
|
116
|
+
'respond with the data',
|
|
117
|
+
'honestly state',
|
|
118
|
+
'what was not done',
|
|
119
|
+
'partial results',
|
|
120
|
+
'recommendations'
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
actionableKeywords.forEach(keyword => {
|
|
124
|
+
expect(warningMessage.toLowerCase()).toContain(keyword.toLowerCase());
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('should handle different iteration limit scenarios', () => {
|
|
129
|
+
// Test edge cases
|
|
130
|
+
const edgeCases = [
|
|
131
|
+
{ limit: 1, description: 'minimum limit' },
|
|
132
|
+
{ limit: 2, description: 'very low limit' },
|
|
133
|
+
{ limit: 30, description: 'default limit' },
|
|
134
|
+
{ limit: 100, description: 'high limit' }
|
|
135
|
+
];
|
|
136
|
+
|
|
137
|
+
edgeCases.forEach(({ limit, description }) => {
|
|
138
|
+
const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (${limit}). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
|
|
139
|
+
|
|
140
|
+
expect(warningMessage).toContain(`limit (${limit})`);
|
|
141
|
+
expect(warningMessage).toContain('This is your final message');
|
|
142
|
+
|
|
143
|
+
// Message should be consistent regardless of limit value
|
|
144
|
+
expect(warningMessage.split(' ').length).toBeGreaterThan(20); // Reasonable message length
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
describe('Integration Points', () => {
|
|
150
|
+
test('should verify warning triggers at the right time in iteration flow', () => {
|
|
151
|
+
// Simulate the iteration loop logic
|
|
152
|
+
const MAX_ITERATIONS = 3;
|
|
153
|
+
let currentIteration = 0;
|
|
154
|
+
const warningTriggered = [];
|
|
155
|
+
|
|
156
|
+
// Simulate 5 iterations
|
|
157
|
+
for (let i = 0; i < 5; i++) {
|
|
158
|
+
currentIteration++;
|
|
159
|
+
|
|
160
|
+
// Check if warning should be triggered (this is the actual logic from the code)
|
|
161
|
+
if (currentIteration === MAX_ITERATIONS) {
|
|
162
|
+
warningTriggered.push(currentIteration);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Break if we would exceed max iterations (simulating the while loop condition)
|
|
166
|
+
if (currentIteration >= MAX_ITERATIONS) {
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Warning should be triggered exactly once at iteration 3
|
|
172
|
+
expect(warningTriggered).toHaveLength(1);
|
|
173
|
+
expect(warningTriggered[0]).toBe(MAX_ITERATIONS);
|
|
174
|
+
expect(currentIteration).toBe(MAX_ITERATIONS);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test('should handle schema option extension correctly', () => {
|
|
178
|
+
const BASE_LIMIT = 5;
|
|
179
|
+
const SCHEMA_EXTENSION = 4;
|
|
180
|
+
|
|
181
|
+
// Test without schema
|
|
182
|
+
const normalLimit = BASE_LIMIT;
|
|
183
|
+
expect(normalLimit).toBe(5);
|
|
184
|
+
|
|
185
|
+
// Test with schema (logic from actual code)
|
|
186
|
+
const hasSchema = true;
|
|
187
|
+
const extendedLimit = hasSchema ? BASE_LIMIT + SCHEMA_EXTENSION : BASE_LIMIT;
|
|
188
|
+
expect(extendedLimit).toBe(9);
|
|
189
|
+
|
|
190
|
+
// Warning should trigger at different points
|
|
191
|
+
expect(5 === normalLimit).toBe(true); // Would trigger at iteration 5 normally
|
|
192
|
+
expect(9 === extendedLimit).toBe(true); // Would trigger at iteration 9 with schema
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
});
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for Mermaid edge label syntax fixing
|
|
3
|
+
*
|
|
4
|
+
* Tests that MermaidFixingAgent correctly instructs AI to use pipe syntax
|
|
5
|
+
* for edge labels instead of double quotes, preventing validation loops.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, test, expect, jest } from '@jest/globals';
|
|
9
|
+
import { validateMermaidDiagram } from '../../src/agent/schemaUtils.js';
|
|
10
|
+
|
|
11
|
+
// Dynamically import MermaidFixingAgent to avoid circular dependency
|
|
12
|
+
const { MermaidFixingAgent } = await import('../../src/agent/schemaUtils.js');
|
|
13
|
+
|
|
14
|
+
describe('Mermaid Edge Label Syntax Fixing', () => {
|
|
15
|
+
test('should detect invalid edge labels with double quotes', async () => {
|
|
16
|
+
const invalidDiagrams = [
|
|
17
|
+
'graph TD\n A -- "Label Text" --> B',
|
|
18
|
+
'graph TD\n E -- "JSON-RPC Messages ONLY" --> F[stdout]',
|
|
19
|
+
'flowchart LR\n X -- "Step 1" --> Y\n Y -- "Step 2" --> Z'
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
for (const diagram of invalidDiagrams) {
|
|
23
|
+
const result = await validateMermaidDiagram(diagram);
|
|
24
|
+
expect(result.isValid).toBe(false);
|
|
25
|
+
expect(result.error).toBeDefined();
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('should validate edge labels with pipe syntax', async () => {
|
|
30
|
+
const validDiagrams = [
|
|
31
|
+
{ desc: 'dashes with pipes', diagram: 'graph TD\n A --|Label Text|--> B' },
|
|
32
|
+
{ desc: 'dashes with spaced pipes', diagram: 'graph TD\n A -- |Label Text| --> B' },
|
|
33
|
+
{ desc: 'arrow with spaced pipes', diagram: 'graph TD\n A -->|Label Text| B' },
|
|
34
|
+
{ desc: 'complex label', diagram: 'graph TD\n E --|JSON-RPC Messages ONLY|--> F[stdout]' },
|
|
35
|
+
{ desc: 'multiple edges', diagram: 'flowchart LR\n X --|Step 1|--> Y\n Y --|Step 2|--> Z' }
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
for (const { desc, diagram } of validDiagrams) {
|
|
39
|
+
const result = await validateMermaidDiagram(diagram);
|
|
40
|
+
expect(result.isValid).toBe(true);
|
|
41
|
+
expect(result.diagramType).toBe('flowchart');
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('MermaidFixingAgent prompt should include edge label syntax rules', async () => {
|
|
46
|
+
const fixer = new MermaidFixingAgent({ debug: false });
|
|
47
|
+
const prompt = fixer.getMermaidFixingPrompt();
|
|
48
|
+
|
|
49
|
+
// Verify prompt instructs to use pipe syntax
|
|
50
|
+
expect(prompt).toContain('Edge/Arrow labels');
|
|
51
|
+
expect(prompt).toContain('pipe syntax');
|
|
52
|
+
expect(prompt).toContain('--|');
|
|
53
|
+
expect(prompt).toContain('NEVER use double quotes');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('should fix invalid edge labels using mocked AI', async () => {
|
|
57
|
+
// Create mock AI that returns corrected diagram with pipe syntax
|
|
58
|
+
const invalidDiagram = `graph TD
|
|
59
|
+
A[Start]
|
|
60
|
+
A -- "Invalid Label 1" --> B[Process]
|
|
61
|
+
B -- "Invalid Label 2" --> C[End]`;
|
|
62
|
+
|
|
63
|
+
const fixedDiagram = `graph TD
|
|
64
|
+
A[Start]
|
|
65
|
+
A -->|Invalid Label 1| B[Process]
|
|
66
|
+
B -->|Invalid Label 2| C[End]`;
|
|
67
|
+
|
|
68
|
+
// Mock ProbeAgent.answer to return fixed diagram
|
|
69
|
+
const mockAgent = {
|
|
70
|
+
answer: jest.fn().mockResolvedValue(`\`\`\`mermaid\n${fixedDiagram}\n\`\`\``)
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Create MermaidFixingAgent and inject mock
|
|
74
|
+
const fixer = new MermaidFixingAgent({ debug: false });
|
|
75
|
+
await fixer.initializeAgent();
|
|
76
|
+
fixer.agent = mockAgent;
|
|
77
|
+
|
|
78
|
+
// Verify original diagram is invalid
|
|
79
|
+
const validationBefore = await validateMermaidDiagram(invalidDiagram);
|
|
80
|
+
expect(validationBefore.isValid).toBe(false);
|
|
81
|
+
|
|
82
|
+
// Trigger the fixing flow
|
|
83
|
+
const errors = ['line 4:14: Expecting token sequences, but found: "JSON-RPC Messages ONLY"'];
|
|
84
|
+
const result = await fixer.fixMermaidDiagram(invalidDiagram, errors, {});
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
// Verify the fix - result should have pipe syntax
|
|
88
|
+
expect(result).toContain('-->|Invalid Label 1|');
|
|
89
|
+
expect(result).toContain('-->|Invalid Label 2|');
|
|
90
|
+
expect(result).not.toContain('"Invalid Label 1"');
|
|
91
|
+
expect(result).not.toContain('"Invalid Label 2"');
|
|
92
|
+
|
|
93
|
+
// Verify the AI was called with correct prompt
|
|
94
|
+
expect(mockAgent.answer).toHaveBeenCalled();
|
|
95
|
+
const callArgs = mockAgent.answer.mock.calls[0];
|
|
96
|
+
expect(callArgs[0]).toContain('Analyze and fix');
|
|
97
|
+
expect(callArgs[0]).toContain('Mermaid diagram');
|
|
98
|
+
|
|
99
|
+
// Verify no schema parameter (this was causing the loop)
|
|
100
|
+
if (callArgs.length >= 3) {
|
|
101
|
+
expect(callArgs[2]).not.toHaveProperty('schema');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Verify fixed diagram is valid
|
|
105
|
+
const validationAfter = await validateMermaidDiagram(result);
|
|
106
|
+
if (!validationAfter.isValid) {
|
|
107
|
+
throw new Error(`Fixed diagram validation failed: ${validationAfter.error}\nResult: ${result}`);
|
|
108
|
+
}
|
|
109
|
+
expect(validationAfter.isValid).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('should not fix already valid edge labels', async () => {
|
|
113
|
+
const validDiagram = `graph TD
|
|
114
|
+
A --|Label Text|--> B
|
|
115
|
+
B --|Another Label|--> C`;
|
|
116
|
+
|
|
117
|
+
const validation = await validateMermaidDiagram(validDiagram);
|
|
118
|
+
expect(validation.isValid).toBe(true);
|
|
119
|
+
expect(validation.diagramType).toBe('flowchart');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('should handle mixed valid and invalid edge labels', async () => {
|
|
123
|
+
const mixedDiagram = `graph TD
|
|
124
|
+
A --|Valid Label|--> B
|
|
125
|
+
B -- "Invalid Label" --> C`;
|
|
126
|
+
|
|
127
|
+
const result = await validateMermaidDiagram(mixedDiagram);
|
|
128
|
+
expect(result.isValid).toBe(false);
|
|
129
|
+
expect(result.error).toBeDefined();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test('MermaidFixingAgent should not loop infinitely', async () => {
|
|
133
|
+
// Mock AI that returns a fixed diagram (this test ensures the flow completes)
|
|
134
|
+
const mockAgent = {
|
|
135
|
+
answer: jest.fn().mockResolvedValue('```mermaid\ngraph TD\n A -->|Fixed Label| B\n```')
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const fixer = new MermaidFixingAgent({ debug: false });
|
|
139
|
+
await fixer.initializeAgent();
|
|
140
|
+
fixer.agent = mockAgent;
|
|
141
|
+
|
|
142
|
+
const invalidDiagram = 'graph TD\n A -- "Invalid" --> B';
|
|
143
|
+
|
|
144
|
+
// This should complete without looping
|
|
145
|
+
const result = await fixer.fixMermaidDiagram(invalidDiagram, ['Invalid syntax'], {});
|
|
146
|
+
|
|
147
|
+
// Verify AI was only called once (not in infinite loop)
|
|
148
|
+
expect(mockAgent.answer).toHaveBeenCalledTimes(1);
|
|
149
|
+
expect(result).toContain('-->|Fixed Label|');
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('MermaidFixingAgent should disable mermaid validation in nested ProbeAgent', async () => {
|
|
153
|
+
// This test verifies the fix for the infinite recursion bug
|
|
154
|
+
// The inner ProbeAgent used by MermaidFixingAgent must have disableMermaidValidation=true
|
|
155
|
+
const fixer = new MermaidFixingAgent({ debug: false });
|
|
156
|
+
await fixer.initializeAgent();
|
|
157
|
+
|
|
158
|
+
// Verify the nested ProbeAgent has mermaid validation disabled
|
|
159
|
+
expect(fixer.agent.disableMermaidValidation).toBe(true);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jest, describe, it, expect } from '@jest/globals';
|
|
2
|
+
import { validateMermaidDiagram } from '../../src/agent/schemaUtils.js';
|
|
3
|
+
|
|
4
|
+
describe('Mermaid HTML Entities Support', () => {
|
|
5
|
+
it('should accept HTML entities in node labels as valid', async () => {
|
|
6
|
+
// Test case based on Mermaid documentation best practices
|
|
7
|
+
const diagramWithEntities = `graph TD
|
|
8
|
+
A["Process "data" file"]
|
|
9
|
+
B["Node with 'single quotes'"]
|
|
10
|
+
C{"Check "status" value"}
|
|
11
|
+
D["Mixed "double" and 'single' quotes"]`;
|
|
12
|
+
|
|
13
|
+
const validation = await validateMermaidDiagram(diagramWithEntities);
|
|
14
|
+
|
|
15
|
+
// HTML entities should be valid according to Mermaid specs
|
|
16
|
+
expect(validation.isValid).toBe(true);
|
|
17
|
+
if (!validation.isValid) {
|
|
18
|
+
console.log('Validation error:', validation.error);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('should accept numeric HTML entities', async () => {
|
|
23
|
+
const diagramWithNumericEntities = `graph TD
|
|
24
|
+
A["Quote: " and apostrophe: '"]
|
|
25
|
+
B["Hash: # and ampersand: &"]`;
|
|
26
|
+
|
|
27
|
+
const validation = await validateMermaidDiagram(diagramWithNumericEntities);
|
|
28
|
+
expect(validation.isValid).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('should accept mixed HTML entities and regular text', async () => {
|
|
32
|
+
const diagram = `flowchart LR
|
|
33
|
+
A["Starting point"]
|
|
34
|
+
B["Process "important" data"]
|
|
35
|
+
C["Check if value = "expected""]
|
|
36
|
+
D["Output: 'success' or 'failure'"]`;
|
|
37
|
+
|
|
38
|
+
const validation = await validateMermaidDiagram(diagram);
|
|
39
|
+
expect(validation.isValid).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should not flag HTML entities as single quotes error', async () => {
|
|
43
|
+
const diagram = `graph TD
|
|
44
|
+
A["Text with ' entity"]`;
|
|
45
|
+
|
|
46
|
+
const validation = await validateMermaidDiagram(diagram);
|
|
47
|
+
|
|
48
|
+
// Should not trigger the single quote validation error
|
|
49
|
+
if (!validation.isValid) {
|
|
50
|
+
expect(validation.error).not.toContain('Single quotes in node label');
|
|
51
|
+
expect(validation.error).not.toContain('got PS');
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe('Real-world examples from Mermaid docs', () => {
|
|
56
|
+
it('should handle example from Mermaid documentation', async () => {
|
|
57
|
+
// Example adapted from Mermaid official docs
|
|
58
|
+
const diagram = `flowchart LR
|
|
59
|
+
A["A double quote:""]
|
|
60
|
+
B["A dec char:♥"]
|
|
61
|
+
C["A hash:#"]`;
|
|
62
|
+
|
|
63
|
+
const validation = await validateMermaidDiagram(diagram);
|
|
64
|
+
expect(validation.isValid).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should handle complex escaping example', async () => {
|
|
68
|
+
// Complex example from StackOverflow Mermaid discussion
|
|
69
|
+
const diagram = `flowchart LR
|
|
70
|
+
B[""<<>>&½#189;""]`;
|
|
71
|
+
|
|
72
|
+
const validation = await validateMermaidDiagram(diagram);
|
|
73
|
+
expect(validation.isValid).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jest, beforeEach, describe, it, expect } from '@jest/globals';
|
|
2
|
+
import { validateMermaidDiagram, validateAndFixMermaidResponse, MermaidFixingAgent } from '../../src/agent/schemaUtils.js';
|
|
3
|
+
|
|
4
|
+
describe('Mermaid Infinite Loop Fix', () => {
|
|
5
|
+
describe('Node label quote handling', () => {
|
|
6
|
+
it('should validate that HTML entities work in Mermaid diagrams', async () => {
|
|
7
|
+
const diagramWithEntities = `graph TD
|
|
8
|
+
A["Process "data" file"]
|
|
9
|
+
B["Handle 'special' case"]
|
|
10
|
+
C{"Check "status""}`;
|
|
11
|
+
|
|
12
|
+
const validation = await validateMermaidDiagram(diagramWithEntities);
|
|
13
|
+
|
|
14
|
+
// HTML entities should not trigger single quote validation errors
|
|
15
|
+
if (!validation.isValid) {
|
|
16
|
+
expect(validation.error).not.toMatch(/Single quotes in node label/);
|
|
17
|
+
expect(validation.error).not.toMatch(/got PS/);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('Diamond node quote handling', () => {
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('MermaidFixingAgent should not pass schema to avoid infinite loops', () => {
|
|
26
|
+
it('should call agent.answer without schema parameter', async () => {
|
|
27
|
+
// Create a mock ProbeAgent
|
|
28
|
+
const mockAgent = {
|
|
29
|
+
answer: jest.fn().mockResolvedValue('```mermaid\ngraph TD\n A --> B\n```')
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Create MermaidFixingAgent and inject mock
|
|
33
|
+
const fixer = new MermaidFixingAgent({ debug: false });
|
|
34
|
+
await fixer.initializeAgent();
|
|
35
|
+
fixer.agent = mockAgent;
|
|
36
|
+
|
|
37
|
+
// Call fixMermaidDiagram
|
|
38
|
+
const brokenDiagram = 'graph TD\n A["broken (syntax"]';
|
|
39
|
+
await fixer.fixMermaidDiagram(brokenDiagram, ['line 1: unclosed bracket'], {});
|
|
40
|
+
|
|
41
|
+
// Verify that answer was called without schema
|
|
42
|
+
expect(mockAgent.answer).toHaveBeenCalled();
|
|
43
|
+
const callArgs = mockAgent.answer.mock.calls[0];
|
|
44
|
+
expect(callArgs[0]).toContain('Analyze and fix'); // prompt
|
|
45
|
+
expect(callArgs[1]).toEqual([]); // messages array
|
|
46
|
+
|
|
47
|
+
// Critical: verify no schema in options (either no 3rd arg or 3rd arg has no schema)
|
|
48
|
+
if (callArgs.length >= 3) {
|
|
49
|
+
expect(callArgs[2]).not.toHaveProperty('schema');
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should initialize ProbeAgent with maxIterations set to 10', async () => {
|
|
54
|
+
// Create MermaidFixingAgent
|
|
55
|
+
const fixer = new MermaidFixingAgent({ debug: false });
|
|
56
|
+
|
|
57
|
+
// Initialize the agent
|
|
58
|
+
const agent = await fixer.initializeAgent();
|
|
59
|
+
|
|
60
|
+
// Verify maxIterations is set to 10 (increased from 2 to handle complex diagrams)
|
|
61
|
+
expect(agent.maxIterations).toBe(10);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|