@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,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test to verify that schema-aware reminders prevent JSON validation loops
|
|
3
|
+
* This test validates that our fix solves the original issue
|
|
4
|
+
*/
|
|
5
|
+
import { jest, describe, test, expect, beforeEach, afterEach } from '@jest/globals';
|
|
6
|
+
|
|
7
|
+
describe('Schema Validation Loop Prevention', () => {
|
|
8
|
+
let mockProbeAgent;
|
|
9
|
+
let mockMessages;
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
// Mock the current message flow that would happen in ProbeAgent
|
|
13
|
+
mockMessages = [];
|
|
14
|
+
|
|
15
|
+
mockProbeAgent = {
|
|
16
|
+
debug: true,
|
|
17
|
+
currentMessages: mockMessages,
|
|
18
|
+
|
|
19
|
+
// Mock the logic that sends reminder when no tool call is detected
|
|
20
|
+
sendReminderMessage(options) {
|
|
21
|
+
let reminderContent;
|
|
22
|
+
if (options.schema) {
|
|
23
|
+
// Schema-aware reminder (our new implementation)
|
|
24
|
+
reminderContent = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
|
|
25
|
+
|
|
26
|
+
Remember: Use proper XML format with BOTH opening and closing tags:
|
|
27
|
+
|
|
28
|
+
<tool_name>
|
|
29
|
+
<parameter>value</parameter>
|
|
30
|
+
</tool_name>
|
|
31
|
+
|
|
32
|
+
IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.
|
|
33
|
+
Use attempt_completion with your response directly inside the tags:
|
|
34
|
+
|
|
35
|
+
<attempt_completion>
|
|
36
|
+
{"key": "value", "field": "your actual data here matching the schema"}
|
|
37
|
+
</attempt_completion>
|
|
38
|
+
|
|
39
|
+
Your response must conform to this schema:
|
|
40
|
+
${options.schema}`;
|
|
41
|
+
} else {
|
|
42
|
+
// Standard reminder
|
|
43
|
+
reminderContent = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
|
|
44
|
+
|
|
45
|
+
Remember: Use proper XML format with BOTH opening and closing tags:
|
|
46
|
+
|
|
47
|
+
<tool_name>
|
|
48
|
+
<parameter>value</parameter>
|
|
49
|
+
</tool_name>
|
|
50
|
+
|
|
51
|
+
Or for quick completion if your previous response was already correct:
|
|
52
|
+
<attempt_complete>`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
this.currentMessages.push({
|
|
56
|
+
role: 'user',
|
|
57
|
+
content: reminderContent
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return reminderContent;
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
// Mock what would happen when AI responds with JSON in attempt_completion
|
|
64
|
+
simulateJsonResponse(jsonContent) {
|
|
65
|
+
this.currentMessages.push({
|
|
66
|
+
role: 'assistant',
|
|
67
|
+
content: `<attempt_completion>${jsonContent}</attempt_completion>`
|
|
68
|
+
});
|
|
69
|
+
return jsonContent;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
afterEach(() => {
|
|
75
|
+
jest.clearAllMocks();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe('With Schema - Loop Prevention', () => {
|
|
79
|
+
test('should provide clear JSON instructions upfront to prevent validation loops', () => {
|
|
80
|
+
const jsonSchema = '{"analysis": "string", "confidence": "number", "recommendations": "array"}';
|
|
81
|
+
const options = { schema: jsonSchema };
|
|
82
|
+
|
|
83
|
+
const reminder = mockProbeAgent.sendReminderMessage(options);
|
|
84
|
+
|
|
85
|
+
// Should clearly indicate JSON is required
|
|
86
|
+
expect(reminder).toContain('A schema was provided');
|
|
87
|
+
expect(reminder).toContain('You MUST respond with data that matches this schema');
|
|
88
|
+
|
|
89
|
+
// Should show exact format expected
|
|
90
|
+
expect(reminder).toContain('<attempt_completion>');
|
|
91
|
+
expect(reminder).toContain('{"key": "value"');
|
|
92
|
+
expect(reminder).toContain('</attempt_completion>');
|
|
93
|
+
|
|
94
|
+
// Should include the schema for reference
|
|
95
|
+
expect(reminder).toContain(jsonSchema);
|
|
96
|
+
|
|
97
|
+
// Should NOT include the shorthand that doesn't work with schema
|
|
98
|
+
expect(reminder).not.toContain('<attempt_complete>');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test('should simulate successful JSON response after clear instructions', () => {
|
|
102
|
+
const jsonSchema = '{"status": "string", "message": "string"}';
|
|
103
|
+
const options = { schema: jsonSchema };
|
|
104
|
+
|
|
105
|
+
// Step 1: Send schema-aware reminder
|
|
106
|
+
mockProbeAgent.sendReminderMessage(options);
|
|
107
|
+
|
|
108
|
+
// Step 2: Simulate AI responding with proper JSON format
|
|
109
|
+
const jsonResponse = '{"status": "complete", "message": "Analysis finished successfully"}';
|
|
110
|
+
const response = mockProbeAgent.simulateJsonResponse(jsonResponse);
|
|
111
|
+
|
|
112
|
+
// Verify the response is valid JSON
|
|
113
|
+
expect(() => JSON.parse(response)).not.toThrow();
|
|
114
|
+
|
|
115
|
+
// Verify it matches the expected schema structure
|
|
116
|
+
const parsed = JSON.parse(response);
|
|
117
|
+
expect(typeof parsed.status).toBe('string');
|
|
118
|
+
expect(typeof parsed.message).toBe('string');
|
|
119
|
+
|
|
120
|
+
// Verify message flow shows proper instruction -> proper response
|
|
121
|
+
expect(mockProbeAgent.currentMessages).toHaveLength(2);
|
|
122
|
+
expect(mockProbeAgent.currentMessages[0].role).toBe('user');
|
|
123
|
+
expect(mockProbeAgent.currentMessages[0].content).toContain('A schema was provided');
|
|
124
|
+
expect(mockProbeAgent.currentMessages[1].role).toBe('assistant');
|
|
125
|
+
expect(mockProbeAgent.currentMessages[1].content).toContain('<attempt_completion>');
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('should handle complex JSON schemas with clear instructions', () => {
|
|
129
|
+
const complexSchema = `{
|
|
130
|
+
"analysis": "string",
|
|
131
|
+
"findings": {
|
|
132
|
+
"type": "array",
|
|
133
|
+
"items": {
|
|
134
|
+
"type": "object",
|
|
135
|
+
"properties": {
|
|
136
|
+
"category": "string",
|
|
137
|
+
"severity": "string",
|
|
138
|
+
"description": "string"
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"metrics": {
|
|
143
|
+
"type": "object",
|
|
144
|
+
"properties": {
|
|
145
|
+
"score": "number",
|
|
146
|
+
"coverage": "number"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}`;
|
|
150
|
+
|
|
151
|
+
const options = { schema: complexSchema };
|
|
152
|
+
|
|
153
|
+
const reminder = mockProbeAgent.sendReminderMessage(options);
|
|
154
|
+
|
|
155
|
+
// Should include the full complex schema
|
|
156
|
+
expect(reminder).toContain('"findings"');
|
|
157
|
+
expect(reminder).toContain('"metrics"');
|
|
158
|
+
expect(reminder).toContain('"severity"');
|
|
159
|
+
expect(reminder).toContain('"coverage"');
|
|
160
|
+
|
|
161
|
+
// Should still provide clear instructions
|
|
162
|
+
expect(reminder).toContain('You MUST respond with data that matches this schema');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('Without Schema - Existing Behavior', () => {
|
|
167
|
+
test('should maintain backward compatibility for non-schema cases', () => {
|
|
168
|
+
const options = {}; // No schema
|
|
169
|
+
|
|
170
|
+
const reminder = mockProbeAgent.sendReminderMessage(options);
|
|
171
|
+
|
|
172
|
+
// Should use standard reminder
|
|
173
|
+
expect(reminder).toContain('Please use one of the available tools');
|
|
174
|
+
expect(reminder).toContain('<attempt_complete>');
|
|
175
|
+
|
|
176
|
+
// Should NOT contain schema-specific instructions
|
|
177
|
+
expect(reminder).not.toContain('A schema was provided');
|
|
178
|
+
expect(reminder).not.toContain('matches this schema');
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test('should allow shorthand completion for non-schema cases', () => {
|
|
182
|
+
const options = {}; // No schema
|
|
183
|
+
|
|
184
|
+
const reminder = mockProbeAgent.sendReminderMessage(options);
|
|
185
|
+
|
|
186
|
+
// Should include the shorthand option
|
|
187
|
+
expect(reminder).toContain('for quick completion if your previous response was already correct');
|
|
188
|
+
expect(reminder).toContain('<attempt_complete>');
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
describe('Comparison - Before vs After Fix', () => {
|
|
193
|
+
test('should demonstrate how the fix prevents validation loops', () => {
|
|
194
|
+
// BEFORE: No schema-specific instructions led to validation loops
|
|
195
|
+
const beforeReminder = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
|
|
196
|
+
|
|
197
|
+
Remember: Use proper XML format with BOTH opening and closing tags:
|
|
198
|
+
|
|
199
|
+
<tool_name>
|
|
200
|
+
<parameter>value</parameter>
|
|
201
|
+
</tool_name>
|
|
202
|
+
|
|
203
|
+
Or for quick completion if your previous response was already correct:
|
|
204
|
+
<attempt_complete>`;
|
|
205
|
+
|
|
206
|
+
// AFTER: Schema-aware instructions prevent loops
|
|
207
|
+
const jsonSchema = '{"result": "string"}';
|
|
208
|
+
const options = { schema: jsonSchema };
|
|
209
|
+
const afterReminder = mockProbeAgent.sendReminderMessage(options);
|
|
210
|
+
|
|
211
|
+
// Before: No indication that JSON was required
|
|
212
|
+
expect(beforeReminder).not.toContain('schema');
|
|
213
|
+
expect(beforeReminder).not.toContain('JSON');
|
|
214
|
+
|
|
215
|
+
// After: Clear indication that JSON is required
|
|
216
|
+
expect(afterReminder).toContain('A schema was provided');
|
|
217
|
+
expect(afterReminder).toContain('You MUST respond with data that matches this schema');
|
|
218
|
+
expect(afterReminder).toContain(jsonSchema);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test('should show the validation loop scenario that is now prevented', () => {
|
|
222
|
+
// This test documents the problem that our fix solves
|
|
223
|
+
const jsonSchema = '{"analysis": "string", "score": "number"}';
|
|
224
|
+
|
|
225
|
+
// OLD BEHAVIOR (what would cause loops):
|
|
226
|
+
// 1. Agent gets no schema info in reminder
|
|
227
|
+
// 2. Agent responds with plain text in attempt_completion
|
|
228
|
+
// 3. System detects JSON schema and tries to correct
|
|
229
|
+
// 4. Agent still responds with plain text -> LOOP
|
|
230
|
+
|
|
231
|
+
// NEW BEHAVIOR (our fix):
|
|
232
|
+
// 1. Agent gets clear schema info in reminder
|
|
233
|
+
const options = { schema: jsonSchema };
|
|
234
|
+
const reminder = mockProbeAgent.sendReminderMessage(options);
|
|
235
|
+
|
|
236
|
+
// 2. Agent knows to respond with JSON from the start
|
|
237
|
+
expect(reminder).toContain('You MUST respond with data that matches this schema');
|
|
238
|
+
expect(reminder).toContain('{"key": "value", "field": "your actual data here matching the schema"}');
|
|
239
|
+
|
|
240
|
+
// 3. No validation loop needed - prevention at the source
|
|
241
|
+
expect(reminder).toContain(jsonSchema);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for schema validation retry logic
|
|
3
|
+
* Tests the new 3-attempt retry mechanism with escalating prompts
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, test, expect, jest, beforeEach, afterEach } from '@jest/globals';
|
|
7
|
+
import * as schemaUtils from '../../src/agent/schemaUtils.js';
|
|
8
|
+
|
|
9
|
+
describe('Schema Validation Retry Logic Integration Tests', () => {
|
|
10
|
+
let mockAnswer;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
// Create a mock answer function that simulates the ProbeAgent.answer method
|
|
14
|
+
mockAnswer = jest.fn();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
jest.clearAllMocks();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('should create escalating correction prompts for retry attempts', () => {
|
|
22
|
+
const invalidResponse = 'Hello, this is not JSON';
|
|
23
|
+
const schema = '{"result": "string"}';
|
|
24
|
+
const error = 'Unexpected token H in JSON at position 0';
|
|
25
|
+
|
|
26
|
+
// Test the first retry (retryCount 0)
|
|
27
|
+
const prompt0 = schemaUtils.createJsonCorrectionPrompt(invalidResponse, schema, error, 0);
|
|
28
|
+
expect(prompt0).toContain('CRITICAL JSON ERROR:');
|
|
29
|
+
expect(prompt0).toContain('Return ONLY the corrected JSON');
|
|
30
|
+
|
|
31
|
+
// Test the second retry (retryCount 1)
|
|
32
|
+
const prompt1 = schemaUtils.createJsonCorrectionPrompt(invalidResponse, schema, error, 1);
|
|
33
|
+
expect(prompt1).toContain('URGENT - JSON PARSING FAILED:');
|
|
34
|
+
expect(prompt1).toContain('second chance');
|
|
35
|
+
expect(prompt1).toContain('ABSOLUTELY NO explanatory text');
|
|
36
|
+
|
|
37
|
+
// Test the third retry (retryCount 2)
|
|
38
|
+
const prompt2 = schemaUtils.createJsonCorrectionPrompt(invalidResponse, schema, error, 2);
|
|
39
|
+
expect(prompt2).toContain('FINAL ATTEMPT - CRITICAL JSON ERROR:');
|
|
40
|
+
expect(prompt2).toContain('final retry');
|
|
41
|
+
expect(prompt2).toContain('EXAMPLE:');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('should simulate retry logic behavior with real functions', () => {
|
|
45
|
+
const invalidResponses = [
|
|
46
|
+
'Hello, this is not JSON',
|
|
47
|
+
'```json\n{"incomplete":',
|
|
48
|
+
'Another invalid response'
|
|
49
|
+
];
|
|
50
|
+
const schema = '{"result": "string"}';
|
|
51
|
+
|
|
52
|
+
// Test that each retry creates the appropriate correction prompt
|
|
53
|
+
invalidResponses.forEach((response, index) => {
|
|
54
|
+
const prompt = schemaUtils.createJsonCorrectionPrompt(response, schema, 'Invalid JSON', index);
|
|
55
|
+
|
|
56
|
+
if (index === 0) {
|
|
57
|
+
expect(prompt).toContain('CRITICAL JSON ERROR:');
|
|
58
|
+
} else if (index === 1) {
|
|
59
|
+
expect(prompt).toContain('URGENT - JSON PARSING FAILED:');
|
|
60
|
+
} else if (index === 2) {
|
|
61
|
+
expect(prompt).toContain('FINAL ATTEMPT - CRITICAL JSON ERROR:');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
expect(prompt).toContain(response.substring(0, 50)); // Should contain truncated response
|
|
65
|
+
expect(prompt).toContain(schema);
|
|
66
|
+
expect(prompt).toContain('Invalid JSON');
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('should test enhanced JSON extraction patterns', () => {
|
|
71
|
+
const testCases = [
|
|
72
|
+
{
|
|
73
|
+
input: 'AI: Here is your JSON: ```json\n{"result": "success"}\n```',
|
|
74
|
+
expected: '{"result": "success"}',
|
|
75
|
+
description: 'should extract from code blocks with text before'
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
input: 'Response:\n{"data": "value"}',
|
|
79
|
+
expected: 'Response:\n{"data": "value"}', // Returns original - text precedes JSON
|
|
80
|
+
description: 'should not extract when text precedes JSON'
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
input: '```\n[{"item": 1}, {"item": 2}]\n```',
|
|
84
|
+
expected: '[{"item": 1}, {"item": 2}]',
|
|
85
|
+
description: 'should extract array from unmarked code block'
|
|
86
|
+
}
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
testCases.forEach(({ input, expected, description }) => {
|
|
90
|
+
const result = schemaUtils.cleanSchemaResponse(input);
|
|
91
|
+
expect(result).toBe(expected);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for the complete validation flow
|
|
3
|
+
* Tests how JSON and Mermaid validation work together
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, test, expect, jest } from '@jest/globals';
|
|
7
|
+
import {
|
|
8
|
+
isJsonSchema,
|
|
9
|
+
isMermaidSchema,
|
|
10
|
+
validateJsonResponse,
|
|
11
|
+
validateMermaidDiagram,
|
|
12
|
+
validateMermaidResponse,
|
|
13
|
+
cleanSchemaResponse,
|
|
14
|
+
processSchemaResponse,
|
|
15
|
+
createJsonCorrectionPrompt,
|
|
16
|
+
createMermaidCorrectionPrompt,
|
|
17
|
+
extractMermaidFromMarkdown
|
|
18
|
+
} from '../../src/agent/schemaUtils.js';
|
|
19
|
+
|
|
20
|
+
describe('Validation Flow Integration', () => {
|
|
21
|
+
describe('Schema Detection Priority', () => {
|
|
22
|
+
test('should detect both JSON and Mermaid schemas correctly', () => {
|
|
23
|
+
const jsonOnlySchema = '{"users": [{"name": "string"}]}';
|
|
24
|
+
const mermaidOnlySchema = 'Create a mermaid flowchart diagram';
|
|
25
|
+
const mixedSchema = 'Create a JSON response with a mermaid diagram showing the flow';
|
|
26
|
+
|
|
27
|
+
expect(isJsonSchema(jsonOnlySchema)).toBe(true);
|
|
28
|
+
expect(isMermaidSchema(jsonOnlySchema)).toBe(false);
|
|
29
|
+
|
|
30
|
+
expect(isJsonSchema(mermaidOnlySchema)).toBe(false);
|
|
31
|
+
expect(isMermaidSchema(mermaidOnlySchema)).toBe(true);
|
|
32
|
+
|
|
33
|
+
expect(isJsonSchema(mixedSchema)).toBe(true);
|
|
34
|
+
expect(isMermaidSchema(mixedSchema)).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('should prioritize validation order (Mermaid first, then JSON)', async () => {
|
|
38
|
+
const response = `{
|
|
39
|
+
"description": "Here's the process flow",
|
|
40
|
+
"diagram": "\`\`\`mermaid\\ngraph TD\\n A[Start] --> B[Process]\\n B --> C[End]\\n\`\`\`"
|
|
41
|
+
}`;
|
|
42
|
+
|
|
43
|
+
const schema = 'Return JSON with a mermaid diagram field';
|
|
44
|
+
|
|
45
|
+
// Test that we can detect both types
|
|
46
|
+
expect(isMermaidSchema(schema)).toBe(true);
|
|
47
|
+
expect(isJsonSchema(schema)).toBe(true);
|
|
48
|
+
|
|
49
|
+
// Test Mermaid validation first - with JSON-aware extraction, diagrams in JSON strings are now found
|
|
50
|
+
const mermaidValidation = await validateMermaidResponse(response);
|
|
51
|
+
expect(mermaidValidation.isValid).toBe(true); // Mermaid diagrams in JSON strings are now detected and validated
|
|
52
|
+
expect(mermaidValidation.diagrams).toHaveLength(1);
|
|
53
|
+
expect(mermaidValidation.diagrams[0].isInJson).toBe(true);
|
|
54
|
+
expect(mermaidValidation.diagrams[0].diagramType).toBe('flowchart');
|
|
55
|
+
|
|
56
|
+
// Test JSON validation second
|
|
57
|
+
const cleanedResponse = cleanSchemaResponse(response);
|
|
58
|
+
const jsonValidation = validateJsonResponse(cleanedResponse);
|
|
59
|
+
expect(jsonValidation.isValid).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('Complex Response Validation', () => {
|
|
64
|
+
test('should handle response with valid JSON and valid Mermaid', async () => {
|
|
65
|
+
const response = `Here's your analysis:
|
|
66
|
+
|
|
67
|
+
\`\`\`json
|
|
68
|
+
{
|
|
69
|
+
"status": "completed",
|
|
70
|
+
"diagram_count": 1
|
|
71
|
+
}
|
|
72
|
+
\`\`\`
|
|
73
|
+
|
|
74
|
+
\`\`\`mermaid
|
|
75
|
+
graph TD
|
|
76
|
+
A[Analysis] --> B[Results]
|
|
77
|
+
B --> C[Report]
|
|
78
|
+
\`\`\``;
|
|
79
|
+
|
|
80
|
+
// Clean and validate JSON part
|
|
81
|
+
const cleanedJson = '{\n "status": "completed",\n "diagram_count": 1\n}';
|
|
82
|
+
const jsonValidation = validateJsonResponse(cleanedJson);
|
|
83
|
+
expect(jsonValidation.isValid).toBe(true);
|
|
84
|
+
|
|
85
|
+
// Validate Mermaid part
|
|
86
|
+
const mermaidValidation = await validateMermaidResponse(response);
|
|
87
|
+
expect(mermaidValidation.isValid).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('should handle response with invalid JSON and valid Mermaid', async () => {
|
|
91
|
+
const response = `Here's your analysis:
|
|
92
|
+
|
|
93
|
+
\`\`\`json
|
|
94
|
+
{
|
|
95
|
+
"status": completed,
|
|
96
|
+
"diagram_count": 1
|
|
97
|
+
}
|
|
98
|
+
\`\`\`
|
|
99
|
+
|
|
100
|
+
\`\`\`mermaid
|
|
101
|
+
graph TD
|
|
102
|
+
A[Analysis] --> B[Results]
|
|
103
|
+
B --> C[Report]
|
|
104
|
+
\`\`\``;
|
|
105
|
+
|
|
106
|
+
// JSON should be invalid (missing quotes)
|
|
107
|
+
const cleanedJson = '{\n "status": completed,\n "diagram_count": 1\n}';
|
|
108
|
+
const jsonValidation = validateJsonResponse(cleanedJson);
|
|
109
|
+
expect(jsonValidation.isValid).toBe(false);
|
|
110
|
+
|
|
111
|
+
// Mermaid should be valid
|
|
112
|
+
const mermaidValidation = await validateMermaidResponse(response);
|
|
113
|
+
expect(mermaidValidation.isValid).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('should handle response with valid JSON and invalid Mermaid', async () => {
|
|
117
|
+
const response = `Here's your analysis:
|
|
118
|
+
|
|
119
|
+
\`\`\`json
|
|
120
|
+
{
|
|
121
|
+
"status": "completed",
|
|
122
|
+
"diagram_count": 1
|
|
123
|
+
}
|
|
124
|
+
\`\`\`
|
|
125
|
+
|
|
126
|
+
\`\`\`mermaid
|
|
127
|
+
invalid diagram syntax
|
|
128
|
+
\`\`\``;
|
|
129
|
+
|
|
130
|
+
// JSON should be valid
|
|
131
|
+
const cleanedJson = '{\n "status": "completed",\n "diagram_count": 1\n}';
|
|
132
|
+
const jsonValidation = validateJsonResponse(cleanedJson);
|
|
133
|
+
expect(jsonValidation.isValid).toBe(true);
|
|
134
|
+
|
|
135
|
+
// Mermaid should be invalid
|
|
136
|
+
const mermaidValidation = await validateMermaidResponse(response);
|
|
137
|
+
expect(mermaidValidation.isValid).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test('should handle multiple Mermaid diagrams with mixed validity', async () => {
|
|
141
|
+
const response = `\`\`\`mermaid
|
|
142
|
+
graph TD
|
|
143
|
+
A --> B
|
|
144
|
+
\`\`\`
|
|
145
|
+
|
|
146
|
+
\`\`\`mermaid
|
|
147
|
+
invalid syntax
|
|
148
|
+
\`\`\`
|
|
149
|
+
|
|
150
|
+
\`\`\`mermaid
|
|
151
|
+
sequenceDiagram
|
|
152
|
+
Alice->>Bob: Hello
|
|
153
|
+
\`\`\``;
|
|
154
|
+
|
|
155
|
+
const validation = await validateMermaidResponse(response);
|
|
156
|
+
expect(validation.isValid).toBe(false);
|
|
157
|
+
expect(validation.diagrams).toHaveLength(3);
|
|
158
|
+
expect(validation.diagrams[0].isValid).toBe(true);
|
|
159
|
+
expect(validation.diagrams[1].isValid).toBe(false);
|
|
160
|
+
expect(validation.diagrams[2].isValid).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('Error Message Quality', () => {
|
|
165
|
+
test('should provide detailed JSON correction prompts', () => {
|
|
166
|
+
const invalidJson = '{"name": John, "age": 25}';
|
|
167
|
+
const schema = '{"name": "string", "age": "number"}';
|
|
168
|
+
const error = 'Unexpected token J in JSON at position 9';
|
|
169
|
+
const detailedError = 'Unexpected token J in JSON at position 9';
|
|
170
|
+
|
|
171
|
+
const prompt = createJsonCorrectionPrompt(invalidJson, schema, error, 0);
|
|
172
|
+
|
|
173
|
+
expect(prompt).toContain('CRITICAL JSON ERROR:');
|
|
174
|
+
expect(prompt).toContain('not valid JSON');
|
|
175
|
+
expect(prompt).toContain(invalidJson);
|
|
176
|
+
expect(prompt).toContain('Unexpected token J');
|
|
177
|
+
expect(prompt).toContain('corrected JSON');
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test('should provide detailed Mermaid correction prompts', () => {
|
|
181
|
+
const invalidResponse = `\`\`\`mermaid
|
|
182
|
+
graph TD
|
|
183
|
+
A[Start --> B[Missing bracket
|
|
184
|
+
\`\`\``;
|
|
185
|
+
|
|
186
|
+
const schema = 'Create a mermaid flowchart';
|
|
187
|
+
const errors = ['Diagram 1: Unclosed bracket on line 2'];
|
|
188
|
+
const diagrams = [{
|
|
189
|
+
diagram: 'graph TD\n A[Start --> B[Missing bracket',
|
|
190
|
+
isValid: false,
|
|
191
|
+
error: 'Unclosed bracket on line 2',
|
|
192
|
+
detailedError: 'Line "A[Start --> B[Missing bracket" contains an unclosed bracket'
|
|
193
|
+
}];
|
|
194
|
+
|
|
195
|
+
const prompt = createMermaidCorrectionPrompt(invalidResponse, schema, errors, diagrams);
|
|
196
|
+
|
|
197
|
+
expect(prompt).toContain('invalid Mermaid diagrams');
|
|
198
|
+
expect(prompt).toContain('Unclosed bracket');
|
|
199
|
+
expect(prompt).toContain('mermaid code blocks');
|
|
200
|
+
expect(prompt).toContain('correct Mermaid syntax');
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test('should handle complex error scenarios', async () => {
|
|
204
|
+
const response = `Here are the results:
|
|
205
|
+
|
|
206
|
+
\`\`\`mermaid
|
|
207
|
+
sequenceDiagram
|
|
208
|
+
Alice->>Bob Hello world
|
|
209
|
+
Bob-->>Alice: Response
|
|
210
|
+
\`\`\`
|
|
211
|
+
|
|
212
|
+
\`\`\`json
|
|
213
|
+
{
|
|
214
|
+
"results": [
|
|
215
|
+
{"id": 1, "status": completed}
|
|
216
|
+
]
|
|
217
|
+
}
|
|
218
|
+
\`\`\``;
|
|
219
|
+
|
|
220
|
+
// Both should be invalid
|
|
221
|
+
const mermaidValidation = await validateMermaidResponse(response);
|
|
222
|
+
expect(mermaidValidation.isValid).toBe(false);
|
|
223
|
+
expect(mermaidValidation.errors[0]).toContain('Missing colon');
|
|
224
|
+
|
|
225
|
+
const jsonPart = '{\n "results": [\n {"id": 1, "status": completed}\n ]\n}';
|
|
226
|
+
const jsonValidation = validateJsonResponse(jsonPart);
|
|
227
|
+
expect(jsonValidation.isValid).toBe(false);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
describe('Edge Cases', () => {
|
|
232
|
+
test('should handle empty responses', async () => {
|
|
233
|
+
const emptyInputs = ['', ' ', '\n\n', null, undefined];
|
|
234
|
+
|
|
235
|
+
for (const input of emptyInputs) {
|
|
236
|
+
const mermaidValidation = await validateMermaidResponse(input);
|
|
237
|
+
expect(mermaidValidation.isValid).toBe(false);
|
|
238
|
+
|
|
239
|
+
if (input) {
|
|
240
|
+
const jsonValidation = validateJsonResponse(input);
|
|
241
|
+
expect(jsonValidation.isValid).toBe(false);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test('should handle malformed markdown blocks', async () => {
|
|
247
|
+
const malformedResponse = `\`\`\`mermaid
|
|
248
|
+
graph TD
|
|
249
|
+
A --> B
|
|
250
|
+
\`\`\`mermaid (extra text)
|
|
251
|
+
sequenceDiagram
|
|
252
|
+
Alice->>Bob: Test
|
|
253
|
+
\`\`\``;
|
|
254
|
+
|
|
255
|
+
const { diagrams } = extractMermaidFromMarkdown(malformedResponse);
|
|
256
|
+
expect(diagrams).toHaveLength(1);
|
|
257
|
+
expect(diagrams[0].content).toContain('graph TD');
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
test('should handle nested code blocks', async () => {
|
|
261
|
+
const response = `Here's an example:
|
|
262
|
+
|
|
263
|
+
\`\`\`markdown
|
|
264
|
+
This is how you create a mermaid diagram:
|
|
265
|
+
|
|
266
|
+
\`\`\`mermaid
|
|
267
|
+
graph TD
|
|
268
|
+
A --> B
|
|
269
|
+
\`\`\`
|
|
270
|
+
\`\`\`
|
|
271
|
+
|
|
272
|
+
And here's a real diagram:
|
|
273
|
+
|
|
274
|
+
\`\`\`mermaid
|
|
275
|
+
sequenceDiagram
|
|
276
|
+
Alice->>Bob: Hello
|
|
277
|
+
\`\`\``;
|
|
278
|
+
|
|
279
|
+
const { diagrams } = extractMermaidFromMarkdown(response);
|
|
280
|
+
expect(diagrams).toHaveLength(2); // Both embedded and real diagrams are extracted
|
|
281
|
+
expect(diagrams[0].content).toContain('graph TD');
|
|
282
|
+
expect(diagrams[1].content).toContain('sequenceDiagram');
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test('should handle very large diagrams', async () => {
|
|
286
|
+
const largeDiagram = 'graph TD\n' + Array(1000).fill(0).map((_, i) =>
|
|
287
|
+
` A${i}[Node ${i}] --> A${i + 1}[Node ${i + 1}]`
|
|
288
|
+
).join('\n');
|
|
289
|
+
|
|
290
|
+
const result = await validateMermaidDiagram(largeDiagram);
|
|
291
|
+
expect(result.isValid).toBe(true);
|
|
292
|
+
expect(result.diagramType).toBe('flowchart');
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
test('should handle Unicode characters in diagrams', async () => {
|
|
296
|
+
const unicodeDiagram = `graph TD
|
|
297
|
+
A[开始] --> B[处理]
|
|
298
|
+
B --> C[结束]
|
|
299
|
+
D[🎯 Goal] --> E[✅ Complete]`;
|
|
300
|
+
|
|
301
|
+
const result = await validateMermaidDiagram(unicodeDiagram);
|
|
302
|
+
expect(result.isValid).toBe(true);
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
test('should handle process schema response with all options', () => {
|
|
306
|
+
const response = `\`\`\`json
|
|
307
|
+
{
|
|
308
|
+
"test": "value"
|
|
309
|
+
}
|
|
310
|
+
\`\`\`
|
|
311
|
+
|
|
312
|
+
\`\`\`mermaid
|
|
313
|
+
graph TD
|
|
314
|
+
A --> B
|
|
315
|
+
\`\`\``;
|
|
316
|
+
|
|
317
|
+
const result = processSchemaResponse(response, 'mixed schema', {
|
|
318
|
+
validateJson: true,
|
|
319
|
+
validateXml: false,
|
|
320
|
+
debug: true
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
expect(result.cleaned).toBeDefined();
|
|
324
|
+
expect(result.debug).toBeDefined();
|
|
325
|
+
expect(result.jsonValidation).toBeDefined();
|
|
326
|
+
expect(result.debug.wasModified).toBe(true);
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
});
|