@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,345 @@
|
|
|
1
|
+
import { jest, describe, test, expect, beforeEach, afterEach } from '@jest/globals';
|
|
2
|
+
|
|
3
|
+
// Mock all the heavy dependencies that ProbeAgent uses
|
|
4
|
+
jest.mock('@ai-sdk/anthropic', () => ({}));
|
|
5
|
+
jest.mock('@ai-sdk/openai', () => ({}));
|
|
6
|
+
jest.mock('@ai-sdk/google', () => ({}));
|
|
7
|
+
jest.mock('@ai-sdk/amazon-bedrock', () => ({}));
|
|
8
|
+
jest.mock('ai', () => ({
|
|
9
|
+
generateText: jest.fn(),
|
|
10
|
+
streamText: jest.fn(),
|
|
11
|
+
tool: jest.fn((config) => ({
|
|
12
|
+
name: config.name,
|
|
13
|
+
description: config.description,
|
|
14
|
+
inputSchema: config.inputSchema,
|
|
15
|
+
execute: config.execute
|
|
16
|
+
}))
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
|
|
20
|
+
import { writeFileSync, unlinkSync, existsSync, mkdirSync, rmSync } from 'fs';
|
|
21
|
+
import { join } from 'path';
|
|
22
|
+
|
|
23
|
+
describe('Image Path Resolution', () => {
|
|
24
|
+
let testDir;
|
|
25
|
+
let agent;
|
|
26
|
+
let testImages;
|
|
27
|
+
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
// Create a test directory structure
|
|
30
|
+
testDir = join(process.cwd(), 'test-images-temp');
|
|
31
|
+
if (!existsSync(testDir)) {
|
|
32
|
+
mkdirSync(testDir, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Create test image files
|
|
36
|
+
const simplePng = Buffer.from([
|
|
37
|
+
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A,
|
|
38
|
+
0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
|
|
39
|
+
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
|
|
40
|
+
0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4,
|
|
41
|
+
0x89, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x44, 0x41,
|
|
42
|
+
0x54, 0x78, 0x9C, 0x62, 0x00, 0x02, 0x00, 0x00,
|
|
43
|
+
0x05, 0x00, 0x01, 0x0D, 0x0A, 0x2D, 0xB4, 0x00,
|
|
44
|
+
0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE,
|
|
45
|
+
0x42, 0x60, 0x82
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
testImages = [
|
|
49
|
+
'policy-1.png',
|
|
50
|
+
'policy-2.png',
|
|
51
|
+
'client.png'
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
testImages.forEach(filename => {
|
|
55
|
+
writeFileSync(join(testDir, filename), simplePng);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Initialize agent with the test directory
|
|
59
|
+
agent = new ProbeAgent({
|
|
60
|
+
debug: false,
|
|
61
|
+
path: testDir
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
afterEach(() => {
|
|
66
|
+
// Cleanup
|
|
67
|
+
if (existsSync(testDir)) {
|
|
68
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('extractListFilesDirectories', () => {
|
|
73
|
+
test('should extract directory from extract tool File: header', () => {
|
|
74
|
+
const content = `File: ${testDir}/ticket.md
|
|
75
|
+
Lines: 41-48
|
|
76
|
+
\`\`\`markdown
|
|
77
|
+
<attachments>
|
|
78
|
+
<attachment filename="policy-1.png" />
|
|
79
|
+
</attachments>
|
|
80
|
+
\`\`\``;
|
|
81
|
+
|
|
82
|
+
const directories = agent.extractListFilesDirectories(content);
|
|
83
|
+
expect(directories).toEqual([testDir]);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('should extract directory paths from listFiles output', () => {
|
|
87
|
+
const content = `${testDir}:
|
|
88
|
+
file 1.2K policy-1.png
|
|
89
|
+
file 1.1K policy-2.png
|
|
90
|
+
file 1.3K client.png`;
|
|
91
|
+
|
|
92
|
+
const directories = agent.extractListFilesDirectories(content);
|
|
93
|
+
expect(directories).toEqual([testDir]);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('should not extract non-directory lines ending with colon', () => {
|
|
97
|
+
const content = `Token Usage:
|
|
98
|
+
Some random text
|
|
99
|
+
|
|
100
|
+
${testDir}:
|
|
101
|
+
file 1.2K policy-1.png`;
|
|
102
|
+
|
|
103
|
+
const directories = agent.extractListFilesDirectories(content);
|
|
104
|
+
expect(directories).toEqual([testDir]);
|
|
105
|
+
expect(directories).not.toContain('Token Usage');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test('should handle relative paths', () => {
|
|
109
|
+
const content = `./attachments:
|
|
110
|
+
file 1.2K policy-1.png`;
|
|
111
|
+
|
|
112
|
+
const directories = agent.extractListFilesDirectories(content);
|
|
113
|
+
expect(directories).toEqual(['./attachments']);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('should handle multiple directory sections', () => {
|
|
117
|
+
const content = `${testDir}:
|
|
118
|
+
file 1.2K policy-1.png
|
|
119
|
+
|
|
120
|
+
${testDir}/subdirectory:
|
|
121
|
+
file 1.1K policy-2.png`;
|
|
122
|
+
|
|
123
|
+
const directories = agent.extractListFilesDirectories(content);
|
|
124
|
+
expect(directories).toHaveLength(2);
|
|
125
|
+
expect(directories).toContain(testDir);
|
|
126
|
+
expect(directories).toContain(`${testDir}/subdirectory`);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('should not match headings or other text with colons', () => {
|
|
130
|
+
const content = `My Dashboard has this log:
|
|
131
|
+
My Gateway has this log:
|
|
132
|
+
Files to extract:
|
|
133
|
+
|
|
134
|
+
${testDir}:
|
|
135
|
+
file 1.2K policy-1.png`;
|
|
136
|
+
|
|
137
|
+
const directories = agent.extractListFilesDirectories(content);
|
|
138
|
+
expect(directories).toEqual([testDir]);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test('should reject paths with spaces (like "./Token Usage:")', () => {
|
|
142
|
+
const content = `./Token Usage:
|
|
143
|
+
./Some Text Here:
|
|
144
|
+
This behavior is due to a known bug (TT-8839):
|
|
145
|
+
|
|
146
|
+
${testDir}:
|
|
147
|
+
file 1.2K policy-1.png`;
|
|
148
|
+
|
|
149
|
+
const directories = agent.extractListFilesDirectories(content);
|
|
150
|
+
expect(directories).toEqual([testDir]);
|
|
151
|
+
expect(directories).not.toContain('./Token Usage');
|
|
152
|
+
expect(directories).not.toContain('./Some Text Here');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('should extract from both File: header and listFiles output without duplicates', () => {
|
|
156
|
+
const content = `File: ${testDir}/ticket.md
|
|
157
|
+
Lines: 1-10
|
|
158
|
+
Some content
|
|
159
|
+
|
|
160
|
+
${testDir}:
|
|
161
|
+
file 1.2K policy-1.png`;
|
|
162
|
+
|
|
163
|
+
const directories = agent.extractListFilesDirectories(content);
|
|
164
|
+
expect(directories).toEqual([testDir]); // Should only have one entry, no duplicates
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test('should handle extract tool output with relative paths', () => {
|
|
168
|
+
const content = `File: ./docs/ticket.md
|
|
169
|
+
Lines: 1-10
|
|
170
|
+
Some content`;
|
|
171
|
+
|
|
172
|
+
const directories = agent.extractListFilesDirectories(content);
|
|
173
|
+
expect(directories).toEqual(['./docs']);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe('processImageReferences with XML attachments', () => {
|
|
178
|
+
test('should resolve relative image paths from XML attachments using directory context', async () => {
|
|
179
|
+
// Simulate content with XML attachments and listFiles output
|
|
180
|
+
const content = `${testDir}:
|
|
181
|
+
file 458K attachment_2_policy-1.png
|
|
182
|
+
file 436K attachment_3_policy-2.png
|
|
183
|
+
file 447K attachment_4_client.png
|
|
184
|
+
|
|
185
|
+
<attachments>
|
|
186
|
+
<attachment filename="policy-1.png" size="458477" content_type="image/png" />
|
|
187
|
+
<attachment filename="policy-2.png" size="436301" content_type="image/png" />
|
|
188
|
+
<attachment filename="client.png" size="447699" content_type="image/png" />
|
|
189
|
+
</attachments>`;
|
|
190
|
+
|
|
191
|
+
await agent.processImageReferences(content);
|
|
192
|
+
|
|
193
|
+
// Check that images were loaded
|
|
194
|
+
const loadedImages = agent.getCurrentImages();
|
|
195
|
+
expect(loadedImages.length).toBeGreaterThan(0);
|
|
196
|
+
|
|
197
|
+
// Verify at least one image was successfully resolved
|
|
198
|
+
expect(loadedImages.some(img => img.startsWith('data:image/png;base64,'))).toBe(true);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test('should handle images when directory context is available from listFiles', async () => {
|
|
202
|
+
// First, process content with directory context
|
|
203
|
+
const contentWithDirectory = `${testDir}:
|
|
204
|
+
file 1.2K policy-1.png
|
|
205
|
+
file 1.1K policy-2.png`;
|
|
206
|
+
|
|
207
|
+
// Then process content with just filename mentions
|
|
208
|
+
await agent.processImageReferences(contentWithDirectory);
|
|
209
|
+
|
|
210
|
+
const contentWithFilenames = 'Look at policy-1.png and policy-2.png for details.';
|
|
211
|
+
await agent.processImageReferences(contentWithFilenames);
|
|
212
|
+
|
|
213
|
+
const loadedImages = agent.getCurrentImages();
|
|
214
|
+
expect(loadedImages.length).toBeGreaterThan(0);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test('should not load images when only non-directory headings are present', async () => {
|
|
218
|
+
agent.clearLoadedImages();
|
|
219
|
+
|
|
220
|
+
const content = `Token Usage:
|
|
221
|
+
Some metrics here
|
|
222
|
+
|
|
223
|
+
Files to extract:
|
|
224
|
+
- policy-1.png
|
|
225
|
+
- policy-2.png`;
|
|
226
|
+
|
|
227
|
+
await agent.processImageReferences(content);
|
|
228
|
+
|
|
229
|
+
// Images should not be loaded because no actual directory path was extracted
|
|
230
|
+
const loadedImages = agent.getCurrentImages();
|
|
231
|
+
// Images may or may not be loaded depending on if they exist in allowed folders
|
|
232
|
+
// The key is that "Token Usage" should not be used as a directory
|
|
233
|
+
expect(agent.extractListFilesDirectories(content)).not.toContain('Token Usage');
|
|
234
|
+
expect(agent.extractListFilesDirectories(content)).not.toContain('Files to extract');
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
describe('loadImageIfValid', () => {
|
|
239
|
+
test('should load image from full path', async () => {
|
|
240
|
+
const imagePath = join(testDir, 'policy-1.png');
|
|
241
|
+
const result = await agent.loadImageIfValid(imagePath);
|
|
242
|
+
|
|
243
|
+
expect(result).toBe(true);
|
|
244
|
+
expect(agent.pendingImages.has(imagePath)).toBe(true);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test('should load image from relative path when context is available', async () => {
|
|
248
|
+
// First extract directory context
|
|
249
|
+
const listFilesOutput = `${testDir}:
|
|
250
|
+
file 1.2K policy-1.png`;
|
|
251
|
+
|
|
252
|
+
await agent.processImageReferences(listFilesOutput);
|
|
253
|
+
|
|
254
|
+
// Now try to load with just filename
|
|
255
|
+
const result = await agent.loadImageIfValid(join(testDir, 'policy-1.png'));
|
|
256
|
+
|
|
257
|
+
expect(result).toBe(true);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
test('should not load non-existent images', async () => {
|
|
261
|
+
const imagePath = join(testDir, 'nonexistent.png');
|
|
262
|
+
const result = await agent.loadImageIfValid(imagePath);
|
|
263
|
+
|
|
264
|
+
expect(result).toBe(false);
|
|
265
|
+
expect(agent.pendingImages.has(imagePath)).toBe(false);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
test('should prevent loading images outside allowed directories', async () => {
|
|
269
|
+
const outsidePath = '/tmp/outside.png';
|
|
270
|
+
const result = await agent.loadImageIfValid(outsidePath);
|
|
271
|
+
|
|
272
|
+
expect(result).toBe(false);
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
describe('Real-world XML attachment scenario', () => {
|
|
277
|
+
test('should load images from extract tool File: header without needing listFiles', async () => {
|
|
278
|
+
// This is the CORRECT way - extract tool provides the file path directly
|
|
279
|
+
const extractToolOutput = `File: ${testDir}/ticket.md
|
|
280
|
+
Lines: 41-48
|
|
281
|
+
\`\`\`markdown
|
|
282
|
+
<attachments>
|
|
283
|
+
<attachment filename="policy-1.png" size="458477" content_type="image/png" />
|
|
284
|
+
<attachment filename="policy-2.png" size="436301" content_type="image/png" />
|
|
285
|
+
<attachment filename="client.png" size="447699" content_type="image/png" />
|
|
286
|
+
</attachments>
|
|
287
|
+
\`\`\``;
|
|
288
|
+
|
|
289
|
+
// Process the extract tool output
|
|
290
|
+
await agent.processImageReferences(extractToolOutput);
|
|
291
|
+
|
|
292
|
+
// Verify images were loaded
|
|
293
|
+
const loadedImages = agent.getCurrentImages();
|
|
294
|
+
expect(loadedImages.length).toBeGreaterThan(0);
|
|
295
|
+
|
|
296
|
+
// Verify the images are valid base64 data URLs
|
|
297
|
+
loadedImages.forEach(img => {
|
|
298
|
+
expect(img).toMatch(/^data:image\/(png|jpeg|jpg);base64,/);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
test('should handle the Zendesk ticket attachment format', async () => {
|
|
303
|
+
// Simulate the actual scenario from the bug report
|
|
304
|
+
const ticketContent = `<message id="11842728115356" author="User 8718562264860" created="2023-12-20T03:24:29Z" public="true">
|
|
305
|
+
Hi team,
|
|
306
|
+
|
|
307
|
+
When we perform the step 'Request an authorization code' of 'Authorization Code Grant Type', if our listen path is /oauth2_code_test, there is no problem, but if the listen path is /oauth2_code_test/a, it will return a 404 error.
|
|
308
|
+
|
|
309
|
+
Attached is our api json, client and policy configurations and dashboard logs.
|
|
310
|
+
|
|
311
|
+
Regards,
|
|
312
|
+
|
|
313
|
+
Salman
|
|
314
|
+
|
|
315
|
+
<attachments>
|
|
316
|
+
<attachment filename="oauth2_code_test.json" size="13243" content_type="application/json" />
|
|
317
|
+
<attachment filename="policy-1.png" size="458477" content_type="image/png" />
|
|
318
|
+
<attachment filename="policy-2.png" size="436301" content_type="image/png" />
|
|
319
|
+
<attachment filename="client.png" size="447699" content_type="image/png" />
|
|
320
|
+
<attachment filename="dashboard-log.csv.gz" size="6796" content_type="application/x-gzip" />
|
|
321
|
+
</attachments>
|
|
322
|
+
</message>`;
|
|
323
|
+
|
|
324
|
+
// Simulate listFiles being called on the directory
|
|
325
|
+
// In this test, files are named exactly as in the XML (no prefix)
|
|
326
|
+
const listFilesOutput = `${testDir}:
|
|
327
|
+
file 1.2K policy-1.png
|
|
328
|
+
file 1.1K policy-2.png
|
|
329
|
+
file 1.3K client.png`;
|
|
330
|
+
|
|
331
|
+
// Process both outputs
|
|
332
|
+
await agent.processImageReferences(listFilesOutput);
|
|
333
|
+
await agent.processImageReferences(ticketContent);
|
|
334
|
+
|
|
335
|
+
// Verify images were loaded
|
|
336
|
+
const loadedImages = agent.getCurrentImages();
|
|
337
|
+
expect(loadedImages.length).toBeGreaterThan(0);
|
|
338
|
+
|
|
339
|
+
// Verify the images are valid base64 data URLs
|
|
340
|
+
loadedImages.forEach(img => {
|
|
341
|
+
expect(img).toMatch(/^data:image\/(png|jpeg|jpg);base64,/);
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
});
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test JsonFixingAgent with separate session isolation
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, test, expect } from '@jest/globals';
|
|
6
|
+
import { JsonFixingAgent, validateJsonResponse, cleanSchemaResponse } from '../../src/agent/schemaUtils.js';
|
|
7
|
+
|
|
8
|
+
describe('JsonFixingAgent', () => {
|
|
9
|
+
describe('constructor', () => {
|
|
10
|
+
test('should create JsonFixingAgent with default options', () => {
|
|
11
|
+
const agent = new JsonFixingAgent();
|
|
12
|
+
|
|
13
|
+
expect(agent.options.sessionId).toMatch(/^json-fixer-\d+-\d+$/);
|
|
14
|
+
expect(agent.options.allowEdit).toBe(false);
|
|
15
|
+
expect(agent.ProbeAgent).toBeNull();
|
|
16
|
+
expect(agent.agent).toBeUndefined();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('should create JsonFixingAgent with custom options', () => {
|
|
20
|
+
const options = {
|
|
21
|
+
sessionId: 'custom-session-123',
|
|
22
|
+
path: '/custom/path',
|
|
23
|
+
provider: 'anthropic',
|
|
24
|
+
model: 'claude-3-5-sonnet-20241022',
|
|
25
|
+
debug: true
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const agent = new JsonFixingAgent(options);
|
|
29
|
+
|
|
30
|
+
expect(agent.options.sessionId).toBe('custom-session-123');
|
|
31
|
+
expect(agent.options.path).toBe('/custom/path');
|
|
32
|
+
expect(agent.options.provider).toBe('anthropic');
|
|
33
|
+
expect(agent.options.model).toBe('claude-3-5-sonnet-20241022');
|
|
34
|
+
expect(agent.options.debug).toBe(true);
|
|
35
|
+
expect(agent.options.allowEdit).toBe(false); // Always false for safety
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('getJsonFixingPrompt', () => {
|
|
40
|
+
test('should return specialized JSON fixing prompt', () => {
|
|
41
|
+
const agent = new JsonFixingAgent();
|
|
42
|
+
const prompt = agent.getJsonFixingPrompt();
|
|
43
|
+
|
|
44
|
+
// Check for key elements of the prompt
|
|
45
|
+
expect(prompt).toContain('JSON syntax correction specialist');
|
|
46
|
+
expect(prompt).toContain('CORE RESPONSIBILITIES');
|
|
47
|
+
expect(prompt).toContain('JSON SYNTAX RULES');
|
|
48
|
+
expect(prompt).toContain('COMMON ERRORS TO FIX');
|
|
49
|
+
expect(prompt).toContain('FIXING METHODOLOGY');
|
|
50
|
+
expect(prompt).toContain('CRITICAL RULES');
|
|
51
|
+
|
|
52
|
+
// Check for specific syntax rules
|
|
53
|
+
expect(prompt).toContain('Property names');
|
|
54
|
+
expect(prompt).toContain('double quotes');
|
|
55
|
+
expect(prompt).toContain('No trailing commas');
|
|
56
|
+
|
|
57
|
+
// Check for common errors
|
|
58
|
+
expect(prompt).toContain('Unquoted property names');
|
|
59
|
+
expect(prompt).toContain('Single quotes');
|
|
60
|
+
expect(prompt).toContain('Trailing commas');
|
|
61
|
+
|
|
62
|
+
// Check for critical rules
|
|
63
|
+
expect(prompt).toContain('NEVER add explanations');
|
|
64
|
+
expect(prompt).toContain('NEVER wrap in markdown');
|
|
65
|
+
expect(prompt).toContain('PRESERVE the original data structure');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe('initializeAgent', () => {
|
|
70
|
+
test('should initialize ProbeAgent lazily', async () => {
|
|
71
|
+
const agent = new JsonFixingAgent({
|
|
72
|
+
sessionId: 'test-session',
|
|
73
|
+
debug: false
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
expect(agent.ProbeAgent).toBeNull();
|
|
77
|
+
expect(agent.agent).toBeUndefined();
|
|
78
|
+
|
|
79
|
+
// Initialize the agent
|
|
80
|
+
await agent.initializeAgent();
|
|
81
|
+
|
|
82
|
+
// Check that ProbeAgent was imported and agent was created
|
|
83
|
+
expect(agent.ProbeAgent).not.toBeNull();
|
|
84
|
+
expect(agent.agent).toBeDefined();
|
|
85
|
+
expect(agent.agent.sessionId).toBe('test-session');
|
|
86
|
+
expect(agent.agent.disableJsonValidation).toBe(true); // CRITICAL for preventing recursion
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('should not reinitialize agent if already initialized', async () => {
|
|
90
|
+
const agent = new JsonFixingAgent();
|
|
91
|
+
|
|
92
|
+
await agent.initializeAgent();
|
|
93
|
+
const firstAgent = agent.agent;
|
|
94
|
+
|
|
95
|
+
await agent.initializeAgent();
|
|
96
|
+
const secondAgent = agent.agent;
|
|
97
|
+
|
|
98
|
+
// Should be the same instance
|
|
99
|
+
expect(secondAgent).toBe(firstAgent);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('should create agent with disableJsonValidation=true', async () => {
|
|
103
|
+
const agent = new JsonFixingAgent({
|
|
104
|
+
debug: false
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
await agent.initializeAgent();
|
|
108
|
+
|
|
109
|
+
// This is CRITICAL to prevent infinite recursion
|
|
110
|
+
expect(agent.agent.disableJsonValidation).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('should create agent with allowEdit=false', async () => {
|
|
114
|
+
const agent = new JsonFixingAgent();
|
|
115
|
+
|
|
116
|
+
await agent.initializeAgent();
|
|
117
|
+
|
|
118
|
+
// Agent should not be able to edit files (only fix JSON syntax)
|
|
119
|
+
expect(agent.agent.allowEdit).toBe(false);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('should create agent with maxIterations=5', async () => {
|
|
123
|
+
const agent = new JsonFixingAgent();
|
|
124
|
+
|
|
125
|
+
await agent.initializeAgent();
|
|
126
|
+
|
|
127
|
+
expect(agent.agent.maxIterations).toBe(5);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('session isolation', () => {
|
|
132
|
+
test('should use unique session ID per instance', async () => {
|
|
133
|
+
const agent1 = new JsonFixingAgent();
|
|
134
|
+
// Small delay to ensure different timestamp
|
|
135
|
+
await new Promise(resolve => setTimeout(resolve, 1));
|
|
136
|
+
const agent2 = new JsonFixingAgent();
|
|
137
|
+
|
|
138
|
+
expect(agent1.options.sessionId).not.toBe(agent2.options.sessionId);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test('should create separate session from parent agent', async () => {
|
|
142
|
+
const agent = new JsonFixingAgent({
|
|
143
|
+
sessionId: 'json-fixer-test-123'
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
await agent.initializeAgent();
|
|
147
|
+
|
|
148
|
+
// Session ID should be the custom one
|
|
149
|
+
expect(agent.agent.sessionId).toBe('json-fixer-test-123');
|
|
150
|
+
|
|
151
|
+
// Agent should be completely isolated (no shared history with parent)
|
|
152
|
+
expect(agent.agent.history).toEqual([]);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
describe('cancel and cleanup', () => {
|
|
157
|
+
test('should have cancel method', () => {
|
|
158
|
+
const agent = new JsonFixingAgent();
|
|
159
|
+
|
|
160
|
+
expect(typeof agent.cancel).toBe('function');
|
|
161
|
+
|
|
162
|
+
// Should not throw when agent not initialized
|
|
163
|
+
expect(() => agent.cancel()).not.toThrow();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('should cancel initialized agent', async () => {
|
|
167
|
+
const agent = new JsonFixingAgent();
|
|
168
|
+
await agent.initializeAgent();
|
|
169
|
+
|
|
170
|
+
expect(() => agent.cancel()).not.toThrow();
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('should have getTokenUsage method', () => {
|
|
174
|
+
const agent = new JsonFixingAgent();
|
|
175
|
+
|
|
176
|
+
expect(typeof agent.getTokenUsage).toBe('function');
|
|
177
|
+
expect(agent.getTokenUsage()).toBeNull(); // No agent initialized
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
describe('integration with validation flow', () => {
|
|
182
|
+
test('should follow clean-then-validate workflow', () => {
|
|
183
|
+
// Step 1: AI returns JSON with markdown
|
|
184
|
+
const aiResponse = '```json\n{"name": "test", "id": 42}\n```';
|
|
185
|
+
|
|
186
|
+
// Step 2: Clean the response
|
|
187
|
+
const cleaned = cleanSchemaResponse(aiResponse);
|
|
188
|
+
expect(cleaned).toBe('{"name": "test", "id": 42}');
|
|
189
|
+
|
|
190
|
+
// Step 3: Validate
|
|
191
|
+
const validation = validateJsonResponse(cleaned);
|
|
192
|
+
expect(validation.isValid).toBe(true);
|
|
193
|
+
|
|
194
|
+
// If invalid, JsonFixingAgent would be used (tested separately with mocks)
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test('should provide enhanced error for fixing', () => {
|
|
198
|
+
const invalidJson = '{"name": "test", "value": invalid}';
|
|
199
|
+
|
|
200
|
+
const validation = validateJsonResponse(invalidJson);
|
|
201
|
+
|
|
202
|
+
expect(validation.isValid).toBe(false);
|
|
203
|
+
expect(validation.enhancedError).toBeDefined();
|
|
204
|
+
expect(validation.errorContext).toBeDefined();
|
|
205
|
+
|
|
206
|
+
// JsonFixingAgent.fixJson() would receive this enhanced error
|
|
207
|
+
expect(validation.enhancedError).toContain('Error location');
|
|
208
|
+
expect(validation.enhancedError).toContain('^ here');
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
describe('architectural consistency with MermaidFixingAgent', () => {
|
|
213
|
+
test('should follow same pattern as MermaidFixingAgent', async () => {
|
|
214
|
+
const jsonAgent = new JsonFixingAgent({ sessionId: 'json-test' });
|
|
215
|
+
await jsonAgent.initializeAgent();
|
|
216
|
+
|
|
217
|
+
// Both should have:
|
|
218
|
+
// 1. Separate session
|
|
219
|
+
expect(jsonAgent.agent.sessionId).toBe('json-test');
|
|
220
|
+
|
|
221
|
+
// 2. allowEdit=false
|
|
222
|
+
expect(jsonAgent.agent.allowEdit).toBe(false);
|
|
223
|
+
|
|
224
|
+
// 3. Specialized prompt
|
|
225
|
+
expect(jsonAgent.agent.customPrompt).toBeDefined();
|
|
226
|
+
expect(jsonAgent.agent.customPrompt).toContain('specialist');
|
|
227
|
+
|
|
228
|
+
// 4. Recursion prevention flag
|
|
229
|
+
expect(jsonAgent.agent.disableJsonValidation).toBe(true); // JSON equivalent of disableMermaidValidation
|
|
230
|
+
|
|
231
|
+
// 5. Cancel method
|
|
232
|
+
expect(typeof jsonAgent.cancel).toBe('function');
|
|
233
|
+
|
|
234
|
+
// 6. Token usage method
|
|
235
|
+
expect(typeof jsonAgent.getTokenUsage).toBe('function');
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
});
|