@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,720 @@
|
|
|
1
|
+
import { parseXmlToolCall, parseXmlToolCallWithThinking } from '../../src/agent/tools.js';
|
|
2
|
+
|
|
3
|
+
describe('XML Tool Call Parsing', () => {
|
|
4
|
+
describe('parseXmlToolCall', () => {
|
|
5
|
+
describe('Valid tool parsing', () => {
|
|
6
|
+
test('should parse valid search tool call', () => {
|
|
7
|
+
const xmlString = '<search><query>test query</query></search>';
|
|
8
|
+
const result = parseXmlToolCall(xmlString);
|
|
9
|
+
|
|
10
|
+
expect(result).toEqual({
|
|
11
|
+
toolName: 'search',
|
|
12
|
+
params: { query: 'test query' }
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('should parse extract tool call with multiple params', () => {
|
|
17
|
+
const xmlString = '<extract><targets>src/test.js:10-20 other.js#func</targets><input_content>some diff</input_content></extract>';
|
|
18
|
+
const result = parseXmlToolCall(xmlString);
|
|
19
|
+
|
|
20
|
+
expect(result).toEqual({
|
|
21
|
+
toolName: 'extract',
|
|
22
|
+
params: {
|
|
23
|
+
targets: 'src/test.js:10-20 other.js#func',
|
|
24
|
+
input_content: 'some diff'
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('should parse attempt_completion with direct content', () => {
|
|
30
|
+
const xmlString = '<attempt_completion>Task completed successfully</attempt_completion>';
|
|
31
|
+
const result = parseXmlToolCall(xmlString);
|
|
32
|
+
|
|
33
|
+
expect(result).toEqual({
|
|
34
|
+
toolName: 'attempt_completion',
|
|
35
|
+
params: {
|
|
36
|
+
result: 'Task completed successfully'
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('should parse boolean parameters correctly', () => {
|
|
42
|
+
const xmlString = '<listFiles><recursive>true</recursive><includeHidden>false</includeHidden></listFiles>';
|
|
43
|
+
const result = parseXmlToolCall(xmlString);
|
|
44
|
+
|
|
45
|
+
expect(result).toEqual({
|
|
46
|
+
toolName: 'listFiles',
|
|
47
|
+
params: {
|
|
48
|
+
recursive: true,
|
|
49
|
+
includeHidden: false
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('should handle all valid tools with structured parameters', () => {
|
|
55
|
+
// Test tools with valid parameters from their schemas
|
|
56
|
+
const testCases = [
|
|
57
|
+
{ tool: 'search', xml: '<search><query>test</query></search>', expected: { query: 'test' } },
|
|
58
|
+
{ tool: 'query', xml: '<query><pattern>$NAME</pattern></query>', expected: { pattern: '$NAME' } },
|
|
59
|
+
{ tool: 'extract', xml: '<extract><targets>file.js</targets></extract>', expected: { targets: 'file.js' } },
|
|
60
|
+
{ tool: 'listFiles', xml: '<listFiles><directory>src</directory></listFiles>', expected: { directory: 'src' } },
|
|
61
|
+
{ tool: 'searchFiles', xml: '<searchFiles><pattern>*.js</pattern></searchFiles>', expected: { pattern: '*.js' } },
|
|
62
|
+
{ tool: 'implement', xml: '<implement><task>test</task></implement>', expected: { task: 'test' } }
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
testCases.forEach(({ tool, xml, expected }) => {
|
|
66
|
+
const result = parseXmlToolCall(xml);
|
|
67
|
+
|
|
68
|
+
expect(result).toEqual({
|
|
69
|
+
toolName: tool,
|
|
70
|
+
params: expected
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe('Non-tool XML tag filtering', () => {
|
|
77
|
+
test('should ignore HTML formatting tags', () => {
|
|
78
|
+
const xmlString = '<ins>This is inserted text</ins>';
|
|
79
|
+
const result = parseXmlToolCall(xmlString);
|
|
80
|
+
|
|
81
|
+
expect(result).toBeNull();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('should ignore HTML emphasis tags', () => {
|
|
85
|
+
const xmlString = '<em>emphasized text</em>';
|
|
86
|
+
const result = parseXmlToolCall(xmlString);
|
|
87
|
+
|
|
88
|
+
expect(result).toBeNull();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('should ignore HTML deletion tags', () => {
|
|
92
|
+
const xmlString = '<del>deleted text</del>';
|
|
93
|
+
const result = parseXmlToolCall(xmlString);
|
|
94
|
+
|
|
95
|
+
expect(result).toBeNull();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('should ignore HTML strong tags', () => {
|
|
99
|
+
const xmlString = '<strong>bold text</strong>';
|
|
100
|
+
const result = parseXmlToolCall(xmlString);
|
|
101
|
+
|
|
102
|
+
expect(result).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test('should ignore custom XML tags', () => {
|
|
106
|
+
const xmlString = '<customTag>custom content</customTag>';
|
|
107
|
+
const result = parseXmlToolCall(xmlString);
|
|
108
|
+
|
|
109
|
+
expect(result).toBeNull();
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('should ignore markdown-style tags', () => {
|
|
113
|
+
const xmlString = '<code>sample code</code>';
|
|
114
|
+
const result = parseXmlToolCall(xmlString);
|
|
115
|
+
|
|
116
|
+
expect(result).toBeNull();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('should ignore multiple non-tool tags in sequence', () => {
|
|
120
|
+
const xmlString = '<ins>inserted</ins><del>deleted</del><em>emphasized</em>';
|
|
121
|
+
const result = parseXmlToolCall(xmlString);
|
|
122
|
+
|
|
123
|
+
expect(result).toBeNull();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
describe('Custom valid tools list', () => {
|
|
128
|
+
test('should respect custom valid tools list', () => {
|
|
129
|
+
const customValidTools = ['search', 'extract'];
|
|
130
|
+
|
|
131
|
+
// Should parse tools in the custom list
|
|
132
|
+
const validXml = '<search><query>test</query></search>';
|
|
133
|
+
const validResult = parseXmlToolCall(validXml, customValidTools);
|
|
134
|
+
expect(validResult).toEqual({
|
|
135
|
+
toolName: 'search',
|
|
136
|
+
params: { query: 'test' }
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Should ignore tools not in the custom list
|
|
140
|
+
const invalidXml = '<query><pattern>test</pattern></query>';
|
|
141
|
+
const invalidResult = parseXmlToolCall(invalidXml, customValidTools);
|
|
142
|
+
expect(invalidResult).toBeNull();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('should handle empty valid tools list', () => {
|
|
146
|
+
const emptyValidTools = [];
|
|
147
|
+
const xmlString = '<search><query>test</query></search>';
|
|
148
|
+
const result = parseXmlToolCall(xmlString, emptyValidTools);
|
|
149
|
+
|
|
150
|
+
expect(result).toBeNull();
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test('should work with single tool in valid list', () => {
|
|
154
|
+
const singleTool = ['attempt_completion'];
|
|
155
|
+
const xmlString = '<attempt_completion>done</attempt_completion>';
|
|
156
|
+
const result = parseXmlToolCall(xmlString, singleTool);
|
|
157
|
+
|
|
158
|
+
expect(result).toEqual({
|
|
159
|
+
toolName: 'attempt_completion',
|
|
160
|
+
params: { result: 'done' }
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
describe('Edge cases', () => {
|
|
166
|
+
test('should handle malformed XML gracefully', () => {
|
|
167
|
+
const xmlString = '<search><query>unclosed tag</search>';
|
|
168
|
+
const result = parseXmlToolCall(xmlString);
|
|
169
|
+
|
|
170
|
+
// With improved parser, it now handles unclosed parameter tags
|
|
171
|
+
// The parser finds <search></search> and extracts the unclosed <query> param
|
|
172
|
+
expect(result).toEqual({
|
|
173
|
+
toolName: 'search',
|
|
174
|
+
params: { query: 'unclosed tag' }
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test('should handle empty XML string', () => {
|
|
179
|
+
const xmlString = '';
|
|
180
|
+
const result = parseXmlToolCall(xmlString);
|
|
181
|
+
|
|
182
|
+
expect(result).toBeNull();
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test('should handle XML with no closing tag', () => {
|
|
186
|
+
const xmlString = '<search><query>test</query>';
|
|
187
|
+
const result = parseXmlToolCall(xmlString);
|
|
188
|
+
|
|
189
|
+
// With improved parser, it handles unclosed tool tags
|
|
190
|
+
// Finds <search> (unclosed) with properly closed <query> parameter
|
|
191
|
+
expect(result).toEqual({
|
|
192
|
+
toolName: 'search',
|
|
193
|
+
params: { query: 'test' }
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test('should handle whitespace and formatting', () => {
|
|
198
|
+
const xmlString = `
|
|
199
|
+
<search>
|
|
200
|
+
<query> test query </query>
|
|
201
|
+
<path> ./src </path>
|
|
202
|
+
</search>
|
|
203
|
+
`;
|
|
204
|
+
const result = parseXmlToolCall(xmlString);
|
|
205
|
+
|
|
206
|
+
expect(result).toEqual({
|
|
207
|
+
toolName: 'search',
|
|
208
|
+
params: {
|
|
209
|
+
query: 'test query',
|
|
210
|
+
path: './src'
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
describe('parseXmlToolCallWithThinking', () => {
|
|
218
|
+
test('should parse tool call and ignore thinking tags', () => {
|
|
219
|
+
const xmlString = `
|
|
220
|
+
<thinking>
|
|
221
|
+
I need to search for the user's query about testing.
|
|
222
|
+
</thinking>
|
|
223
|
+
<search>
|
|
224
|
+
<query>testing framework</query>
|
|
225
|
+
</search>
|
|
226
|
+
`;
|
|
227
|
+
|
|
228
|
+
const result = parseXmlToolCallWithThinking(xmlString);
|
|
229
|
+
|
|
230
|
+
expect(result).toEqual({
|
|
231
|
+
toolName: 'search',
|
|
232
|
+
params: { query: 'testing framework' }
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test('should handle multiple thinking blocks', () => {
|
|
237
|
+
const xmlString = `
|
|
238
|
+
<thinking>First thought</thinking>
|
|
239
|
+
<thinking>Second thought</thinking>
|
|
240
|
+
<extract>
|
|
241
|
+
<targets>test.js</targets>
|
|
242
|
+
</extract>
|
|
243
|
+
`;
|
|
244
|
+
|
|
245
|
+
const result = parseXmlToolCallWithThinking(xmlString);
|
|
246
|
+
|
|
247
|
+
expect(result).toEqual({
|
|
248
|
+
toolName: 'extract',
|
|
249
|
+
params: { targets: 'test.js' }
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test('should ignore non-tool tags even with thinking', () => {
|
|
254
|
+
const xmlString = `
|
|
255
|
+
<thinking>I should format this text</thinking>
|
|
256
|
+
<ins>This is inserted text</ins>
|
|
257
|
+
<thinking>But I need to use a tool instead</thinking>
|
|
258
|
+
`;
|
|
259
|
+
|
|
260
|
+
const result = parseXmlToolCallWithThinking(xmlString);
|
|
261
|
+
|
|
262
|
+
expect(result).toBeNull();
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test('should pass custom valid tools to underlying parser', () => {
|
|
266
|
+
const customValidTools = ['search'];
|
|
267
|
+
const xmlString = `
|
|
268
|
+
<thinking>I'll use query tool</thinking>
|
|
269
|
+
<query>
|
|
270
|
+
<pattern>test pattern</pattern>
|
|
271
|
+
</query>
|
|
272
|
+
`;
|
|
273
|
+
|
|
274
|
+
// Should be null because query is not in custom valid tools
|
|
275
|
+
const result = parseXmlToolCallWithThinking(xmlString, customValidTools);
|
|
276
|
+
|
|
277
|
+
expect(result).toBeNull();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
test('should handle thinking without tool calls', () => {
|
|
281
|
+
const xmlString = `
|
|
282
|
+
<thinking>
|
|
283
|
+
Just thinking about the problem, no tool call needed yet.
|
|
284
|
+
</thinking>
|
|
285
|
+
`;
|
|
286
|
+
|
|
287
|
+
const result = parseXmlToolCallWithThinking(xmlString);
|
|
288
|
+
|
|
289
|
+
expect(result).toBeNull();
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
describe('Real-world scenarios', () => {
|
|
294
|
+
test('should handle AI response with formatting and tool call', () => {
|
|
295
|
+
const aiResponse = `
|
|
296
|
+
I need to search for information about this topic.
|
|
297
|
+
|
|
298
|
+
<ins>Let me search for the relevant code:</ins>
|
|
299
|
+
|
|
300
|
+
<search>
|
|
301
|
+
<query>authentication middleware</query>
|
|
302
|
+
</search>
|
|
303
|
+
|
|
304
|
+
<em>This search should help us find the authentication logic.</em>
|
|
305
|
+
`;
|
|
306
|
+
|
|
307
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
308
|
+
|
|
309
|
+
expect(result).toEqual({
|
|
310
|
+
toolName: 'search',
|
|
311
|
+
params: { query: 'authentication middleware' }
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
test('should handle response with only HTML formatting (no tools)', () => {
|
|
316
|
+
const aiResponse = `
|
|
317
|
+
Here's the analysis:
|
|
318
|
+
|
|
319
|
+
<strong>Key Points:</strong>
|
|
320
|
+
- <ins>The code needs refactoring</ins>
|
|
321
|
+
- <del>Old approach is deprecated</del>
|
|
322
|
+
- <em>New pattern is more efficient</em>
|
|
323
|
+
|
|
324
|
+
<code>function example() { return true; }</code>
|
|
325
|
+
`;
|
|
326
|
+
|
|
327
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
328
|
+
|
|
329
|
+
expect(result).toBeNull();
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
test('should handle mixed content with thinking and HTML tags', () => {
|
|
333
|
+
const aiResponse = `
|
|
334
|
+
<thinking>
|
|
335
|
+
The user wants me to extract code from a specific file.
|
|
336
|
+
I should use the extract tool for this.
|
|
337
|
+
</thinking>
|
|
338
|
+
|
|
339
|
+
I understand you need the code. <ins>Let me extract it for you:</ins>
|
|
340
|
+
|
|
341
|
+
<extract>
|
|
342
|
+
<targets>src/components/Header.js:1-50</targets>
|
|
343
|
+
</extract>
|
|
344
|
+
|
|
345
|
+
<em>This will show you the first 50 lines of the Header component.</em>
|
|
346
|
+
`;
|
|
347
|
+
|
|
348
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
349
|
+
|
|
350
|
+
expect(result).toEqual({
|
|
351
|
+
toolName: 'extract',
|
|
352
|
+
params: {
|
|
353
|
+
targets: 'src/components/Header.js:1-50'
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test('should handle implement tool when allowed', () => {
|
|
359
|
+
const aiResponse = `
|
|
360
|
+
<thinking>
|
|
361
|
+
I need to implement this feature using the implement tool.
|
|
362
|
+
</thinking>
|
|
363
|
+
|
|
364
|
+
<implement>
|
|
365
|
+
<task>Add user authentication</task>
|
|
366
|
+
</implement>
|
|
367
|
+
`;
|
|
368
|
+
|
|
369
|
+
const validToolsWithImplement = ['search', 'query', 'extract', 'implement', 'attempt_completion'];
|
|
370
|
+
const result = parseXmlToolCallWithThinking(aiResponse, validToolsWithImplement);
|
|
371
|
+
|
|
372
|
+
expect(result).toEqual({
|
|
373
|
+
toolName: 'implement',
|
|
374
|
+
params: { task: 'Add user authentication' }
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
test('should ignore implement tool when not allowed', () => {
|
|
379
|
+
const aiResponse = `
|
|
380
|
+
<implement>
|
|
381
|
+
<task>Add user authentication</task>
|
|
382
|
+
</implement>
|
|
383
|
+
`;
|
|
384
|
+
|
|
385
|
+
const validToolsWithoutImplement = ['search', 'query', 'extract', 'attempt_completion'];
|
|
386
|
+
const result = parseXmlToolCallWithThinking(aiResponse, validToolsWithoutImplement);
|
|
387
|
+
|
|
388
|
+
expect(result).toBeNull();
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
describe('Unclosed attempt_completion tag handling', () => {
|
|
393
|
+
test('should handle attempt_completion with content but no closing tag', () => {
|
|
394
|
+
const aiResponse = `<attempt_completion>
|
|
395
|
+
\`\`\`json
|
|
396
|
+
{
|
|
397
|
+
"issues": [
|
|
398
|
+
{
|
|
399
|
+
"file": "test.ts",
|
|
400
|
+
"line": 442,
|
|
401
|
+
"message": "Security issue"
|
|
402
|
+
}
|
|
403
|
+
]
|
|
404
|
+
}
|
|
405
|
+
\`\`\``;
|
|
406
|
+
|
|
407
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
408
|
+
|
|
409
|
+
expect(result).toEqual({
|
|
410
|
+
toolName: 'attempt_completion',
|
|
411
|
+
params: {
|
|
412
|
+
result: `\`\`\`json
|
|
413
|
+
{
|
|
414
|
+
"issues": [
|
|
415
|
+
{
|
|
416
|
+
"file": "test.ts",
|
|
417
|
+
"line": 442,
|
|
418
|
+
"message": "Security issue"
|
|
419
|
+
}
|
|
420
|
+
]
|
|
421
|
+
}
|
|
422
|
+
\`\`\``
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
test('should handle attempt_completion with text content and no closing tag', () => {
|
|
428
|
+
const aiResponse = `Some explanation text before the tag.
|
|
429
|
+
|
|
430
|
+
<attempt_completion>
|
|
431
|
+
The task has been completed successfully.
|
|
432
|
+
All tests are passing.`;
|
|
433
|
+
|
|
434
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
435
|
+
|
|
436
|
+
expect(result).toEqual({
|
|
437
|
+
toolName: 'attempt_completion',
|
|
438
|
+
params: {
|
|
439
|
+
result: `The task has been completed successfully.
|
|
440
|
+
All tests are passing.`
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
test('should handle attempt_completion with closing tag (normal case)', () => {
|
|
446
|
+
const aiResponse = `<attempt_completion>
|
|
447
|
+
Task completed with all requirements met.
|
|
448
|
+
</attempt_completion>`;
|
|
449
|
+
|
|
450
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
451
|
+
|
|
452
|
+
expect(result).toEqual({
|
|
453
|
+
toolName: 'attempt_completion',
|
|
454
|
+
params: {
|
|
455
|
+
result: 'Task completed with all requirements met.'
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
test('should handle empty attempt_completion tag without closing', () => {
|
|
461
|
+
const aiResponse = `<attempt_completion>`;
|
|
462
|
+
|
|
463
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
464
|
+
|
|
465
|
+
expect(result).toEqual({
|
|
466
|
+
toolName: 'attempt_completion',
|
|
467
|
+
params: {
|
|
468
|
+
result: '__PREVIOUS_RESPONSE__'
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
test('should prioritize attempt_completion over other content', () => {
|
|
474
|
+
const aiResponse = `Here's some explanation text.
|
|
475
|
+
|
|
476
|
+
<ins>Important:</ins> The analysis is complete.
|
|
477
|
+
|
|
478
|
+
<attempt_completion>
|
|
479
|
+
\`\`\`json
|
|
480
|
+
{"status": "complete"}
|
|
481
|
+
\`\`\``;
|
|
482
|
+
|
|
483
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
484
|
+
|
|
485
|
+
expect(result).toEqual({
|
|
486
|
+
toolName: 'attempt_completion',
|
|
487
|
+
params: {
|
|
488
|
+
result: `\`\`\`json
|
|
489
|
+
{"status": "complete"}
|
|
490
|
+
\`\`\``
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
describe('Unclosed thinking tag handling', () => {
|
|
497
|
+
test('should remove unclosed thinking tag and its content', () => {
|
|
498
|
+
const aiResponse = `<thinking>
|
|
499
|
+
I need to search for the authentication code.
|
|
500
|
+
This is my reasoning...
|
|
501
|
+
|
|
502
|
+
<search>
|
|
503
|
+
<query>authentication</query>
|
|
504
|
+
</search>`;
|
|
505
|
+
|
|
506
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
507
|
+
|
|
508
|
+
expect(result).toEqual({
|
|
509
|
+
toolName: 'search',
|
|
510
|
+
params: { query: 'authentication' }
|
|
511
|
+
});
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
test('should handle properly closed thinking tag', () => {
|
|
515
|
+
const aiResponse = `<thinking>
|
|
516
|
+
Let me analyze this.
|
|
517
|
+
</thinking>
|
|
518
|
+
|
|
519
|
+
<extract>
|
|
520
|
+
<targets>src/auth.js</targets>
|
|
521
|
+
</extract>`;
|
|
522
|
+
|
|
523
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
524
|
+
|
|
525
|
+
expect(result).toEqual({
|
|
526
|
+
toolName: 'extract',
|
|
527
|
+
params: { targets: 'src/auth.js' }
|
|
528
|
+
});
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
test('should handle multiple thinking tags with one unclosed', () => {
|
|
532
|
+
const aiResponse = `<thinking>First thought</thinking>
|
|
533
|
+
<thinking>Second thought that never ends...
|
|
534
|
+
|
|
535
|
+
<query>
|
|
536
|
+
<pattern>test</pattern>
|
|
537
|
+
</query>`;
|
|
538
|
+
|
|
539
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
540
|
+
|
|
541
|
+
expect(result).toEqual({
|
|
542
|
+
toolName: 'query',
|
|
543
|
+
params: { pattern: 'test' }
|
|
544
|
+
});
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
describe('Unclosed tool tag handling', () => {
|
|
549
|
+
test('should handle search tool without closing tag', () => {
|
|
550
|
+
const aiResponse = `<search>
|
|
551
|
+
<query>function definition`;
|
|
552
|
+
|
|
553
|
+
const result = parseXmlToolCall(aiResponse);
|
|
554
|
+
|
|
555
|
+
expect(result).toEqual({
|
|
556
|
+
toolName: 'search',
|
|
557
|
+
params: { query: 'function definition' }
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
test('should handle extract tool without closing tag', () => {
|
|
562
|
+
const aiResponse = `<extract>
|
|
563
|
+
<targets>src/index.js:42`;
|
|
564
|
+
|
|
565
|
+
const result = parseXmlToolCall(aiResponse);
|
|
566
|
+
|
|
567
|
+
expect(result).toEqual({
|
|
568
|
+
toolName: 'extract',
|
|
569
|
+
params: {
|
|
570
|
+
targets: 'src/index.js:42'
|
|
571
|
+
}
|
|
572
|
+
});
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
test('should handle query tool without closing tag', () => {
|
|
576
|
+
const aiResponse = `<query>
|
|
577
|
+
<pattern>class \\w+`;
|
|
578
|
+
|
|
579
|
+
const result = parseXmlToolCall(aiResponse);
|
|
580
|
+
|
|
581
|
+
expect(result).toEqual({
|
|
582
|
+
toolName: 'query',
|
|
583
|
+
params: { pattern: 'class \\w+' }
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
test('should handle listFiles tool without closing tag', () => {
|
|
588
|
+
const aiResponse = `<listFiles>
|
|
589
|
+
<path>src/</path>
|
|
590
|
+
<recursive>true`;
|
|
591
|
+
|
|
592
|
+
const result = parseXmlToolCall(aiResponse);
|
|
593
|
+
|
|
594
|
+
expect(result).toEqual({
|
|
595
|
+
toolName: 'listFiles',
|
|
596
|
+
params: {
|
|
597
|
+
path: 'src/',
|
|
598
|
+
recursive: true
|
|
599
|
+
}
|
|
600
|
+
});
|
|
601
|
+
});
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
describe('Unclosed parameter tag handling', () => {
|
|
605
|
+
test('should handle parameter without closing tag followed by another param', () => {
|
|
606
|
+
const aiResponse = `<search>
|
|
607
|
+
<query>authentication
|
|
608
|
+
<path>./src</path>
|
|
609
|
+
</search>`;
|
|
610
|
+
|
|
611
|
+
const result = parseXmlToolCall(aiResponse);
|
|
612
|
+
|
|
613
|
+
expect(result).toEqual({
|
|
614
|
+
toolName: 'search',
|
|
615
|
+
params: {
|
|
616
|
+
query: 'authentication',
|
|
617
|
+
path: './src'
|
|
618
|
+
}
|
|
619
|
+
});
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
test('should handle last parameter without closing tag', () => {
|
|
623
|
+
const aiResponse = `<extract>
|
|
624
|
+
<targets>src/test.js:10
|
|
625
|
+
</extract>`;
|
|
626
|
+
|
|
627
|
+
const result = parseXmlToolCall(aiResponse);
|
|
628
|
+
|
|
629
|
+
expect(result).toEqual({
|
|
630
|
+
toolName: 'extract',
|
|
631
|
+
params: {
|
|
632
|
+
targets: 'src/test.js:10'
|
|
633
|
+
}
|
|
634
|
+
});
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
test('should handle multiple unclosed parameter tags', () => {
|
|
638
|
+
const aiResponse = `<extract>
|
|
639
|
+
<targets>src/app.js:1-100
|
|
640
|
+
<input_content>some diff content
|
|
641
|
+
</extract>`;
|
|
642
|
+
|
|
643
|
+
const result = parseXmlToolCall(aiResponse);
|
|
644
|
+
|
|
645
|
+
expect(result).toEqual({
|
|
646
|
+
toolName: 'extract',
|
|
647
|
+
params: {
|
|
648
|
+
targets: 'src/app.js:1-100',
|
|
649
|
+
input_content: 'some diff content'
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
test('should handle unclosed param with multiline content', () => {
|
|
655
|
+
const aiResponse = `<search>
|
|
656
|
+
<query>function test() {
|
|
657
|
+
return true;
|
|
658
|
+
}
|
|
659
|
+
<path>./src</path>
|
|
660
|
+
</search>`;
|
|
661
|
+
|
|
662
|
+
const result = parseXmlToolCall(aiResponse);
|
|
663
|
+
|
|
664
|
+
expect(result).toEqual({
|
|
665
|
+
toolName: 'search',
|
|
666
|
+
params: {
|
|
667
|
+
query: `function test() {
|
|
668
|
+
return true;
|
|
669
|
+
}`,
|
|
670
|
+
path: './src'
|
|
671
|
+
}
|
|
672
|
+
});
|
|
673
|
+
});
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
describe('Complex unclosed tag scenarios', () => {
|
|
677
|
+
test('should handle tool and param both unclosed', () => {
|
|
678
|
+
const aiResponse = `<search>
|
|
679
|
+
<query>test query`;
|
|
680
|
+
|
|
681
|
+
const result = parseXmlToolCall(aiResponse);
|
|
682
|
+
|
|
683
|
+
expect(result).toEqual({
|
|
684
|
+
toolName: 'search',
|
|
685
|
+
params: { query: 'test query' }
|
|
686
|
+
});
|
|
687
|
+
});
|
|
688
|
+
|
|
689
|
+
test('should handle unclosed thinking + unclosed tool', () => {
|
|
690
|
+
const aiResponse = `<thinking>
|
|
691
|
+
I should search for this...
|
|
692
|
+
|
|
693
|
+
<search>
|
|
694
|
+
<query>authentication middleware`;
|
|
695
|
+
|
|
696
|
+
const result = parseXmlToolCallWithThinking(aiResponse);
|
|
697
|
+
|
|
698
|
+
expect(result).toEqual({
|
|
699
|
+
toolName: 'search',
|
|
700
|
+
params: { query: 'authentication middleware' }
|
|
701
|
+
});
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
test('should handle mixed properly closed and unclosed tags', () => {
|
|
705
|
+
const aiResponse = `<extract>
|
|
706
|
+
<targets>src/auth.js:10-20
|
|
707
|
+
<input_content>some content</input_content>`;
|
|
708
|
+
|
|
709
|
+
const result = parseXmlToolCall(aiResponse);
|
|
710
|
+
|
|
711
|
+
expect(result).toEqual({
|
|
712
|
+
toolName: 'extract',
|
|
713
|
+
params: {
|
|
714
|
+
targets: 'src/auth.js:10-20',
|
|
715
|
+
input_content: 'some content'
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
});
|
|
719
|
+
});
|
|
720
|
+
});
|