@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,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration tests for delegate tool
|
|
3
|
+
* Tests the core functionality without mocking complex process spawning
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { jest } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
// Mock just the delegate function itself
|
|
9
|
+
const mockDelegate = jest.fn();
|
|
10
|
+
const mockIsDelegateAvailable = jest.fn(() => Promise.resolve(true));
|
|
11
|
+
jest.unstable_mockModule('../src/delegate.js', () => ({
|
|
12
|
+
delegate: mockDelegate,
|
|
13
|
+
isDelegateAvailable: mockIsDelegateAvailable
|
|
14
|
+
}));
|
|
15
|
+
|
|
16
|
+
// Import after mocking
|
|
17
|
+
const { delegateTool } = await import('../src/tools/vercel.js');
|
|
18
|
+
const { ACPToolManager } = await import('../src/agent/acp/tools.js');
|
|
19
|
+
|
|
20
|
+
describe('Delegate Tool Configuration', () => {
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
jest.clearAllMocks();
|
|
23
|
+
mockDelegate.mockResolvedValue('Mock delegate response');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('Vercel AI SDK Tool', () => {
|
|
27
|
+
it('should create delegate tool with correct configuration', () => {
|
|
28
|
+
const tool = delegateTool({ debug: true, timeout: 600 });
|
|
29
|
+
|
|
30
|
+
expect(tool.name).toBe('delegate');
|
|
31
|
+
expect(tool.description).toContain('Automatically delegate');
|
|
32
|
+
expect(tool.description).toContain('agentic loop');
|
|
33
|
+
expect(tool.description).toContain('specialized probe subagents');
|
|
34
|
+
expect(tool.execute).toBeDefined();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('should execute delegate tool with correct parameters', async () => {
|
|
38
|
+
const tool = delegateTool({ debug: true, timeout: 600 });
|
|
39
|
+
const task = 'Analyze security vulnerabilities in authentication code';
|
|
40
|
+
|
|
41
|
+
const result = await tool.execute({ task });
|
|
42
|
+
|
|
43
|
+
// Tool now passes all parameters including defaults
|
|
44
|
+
expect(mockDelegate).toHaveBeenCalledWith({
|
|
45
|
+
task,
|
|
46
|
+
timeout: 600,
|
|
47
|
+
debug: true,
|
|
48
|
+
currentIteration: 0,
|
|
49
|
+
maxIterations: 30,
|
|
50
|
+
parentSessionId: undefined,
|
|
51
|
+
path: undefined, // No cwd or allowedFolders configured
|
|
52
|
+
provider: undefined,
|
|
53
|
+
model: undefined,
|
|
54
|
+
tracer: undefined
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
expect(result).toBe('Mock delegate response');
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('should use cwd when path is not specified in call', async () => {
|
|
61
|
+
const tool = delegateTool({
|
|
62
|
+
debug: false,
|
|
63
|
+
timeout: 300,
|
|
64
|
+
cwd: '/project/workspace'
|
|
65
|
+
});
|
|
66
|
+
const task = 'Analyze code in workspace';
|
|
67
|
+
|
|
68
|
+
await tool.execute({ task });
|
|
69
|
+
|
|
70
|
+
expect(mockDelegate).toHaveBeenCalledWith(
|
|
71
|
+
expect.objectContaining({
|
|
72
|
+
task,
|
|
73
|
+
path: '/project/workspace'
|
|
74
|
+
})
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should use allowedFolders[0] when path and cwd are not specified', async () => {
|
|
79
|
+
const tool = delegateTool({
|
|
80
|
+
debug: false,
|
|
81
|
+
timeout: 300,
|
|
82
|
+
allowedFolders: ['/allowed/folder1', '/allowed/folder2']
|
|
83
|
+
});
|
|
84
|
+
const task = 'Search allowed folders';
|
|
85
|
+
|
|
86
|
+
await tool.execute({ task });
|
|
87
|
+
|
|
88
|
+
expect(mockDelegate).toHaveBeenCalledWith(
|
|
89
|
+
expect.objectContaining({
|
|
90
|
+
task,
|
|
91
|
+
path: '/allowed/folder1'
|
|
92
|
+
})
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('should prioritize explicit path over cwd', async () => {
|
|
97
|
+
const tool = delegateTool({
|
|
98
|
+
debug: false,
|
|
99
|
+
timeout: 300,
|
|
100
|
+
cwd: '/default/path',
|
|
101
|
+
allowedFolders: ['/allowed/folder']
|
|
102
|
+
});
|
|
103
|
+
const task = 'Search specific path';
|
|
104
|
+
|
|
105
|
+
await tool.execute({ task, path: '/explicit/path' });
|
|
106
|
+
|
|
107
|
+
expect(mockDelegate).toHaveBeenCalledWith(
|
|
108
|
+
expect.objectContaining({
|
|
109
|
+
task,
|
|
110
|
+
path: '/explicit/path'
|
|
111
|
+
})
|
|
112
|
+
);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should prioritize cwd over allowedFolders', async () => {
|
|
116
|
+
const tool = delegateTool({
|
|
117
|
+
debug: false,
|
|
118
|
+
timeout: 300,
|
|
119
|
+
cwd: '/default/path',
|
|
120
|
+
allowedFolders: ['/allowed/folder']
|
|
121
|
+
});
|
|
122
|
+
const task = 'Use cwd priority';
|
|
123
|
+
|
|
124
|
+
await tool.execute({ task });
|
|
125
|
+
|
|
126
|
+
expect(mockDelegate).toHaveBeenCalledWith(
|
|
127
|
+
expect.objectContaining({
|
|
128
|
+
task,
|
|
129
|
+
path: '/default/path'
|
|
130
|
+
})
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('should handle execution errors gracefully', async () => {
|
|
135
|
+
const tool = delegateTool();
|
|
136
|
+
const task = 'Task that will fail';
|
|
137
|
+
|
|
138
|
+
mockDelegate.mockRejectedValue(new Error('Delegation process failed'));
|
|
139
|
+
|
|
140
|
+
// Tool now throws errors instead of returning error strings
|
|
141
|
+
await expect(tool.execute({ task })).rejects.toThrow('Delegation process failed');
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe('ACP Tool Manager Integration', () => {
|
|
146
|
+
let toolManager;
|
|
147
|
+
let mockServer;
|
|
148
|
+
let mockProbeAgent;
|
|
149
|
+
|
|
150
|
+
beforeEach(() => {
|
|
151
|
+
mockServer = {
|
|
152
|
+
options: { debug: true },
|
|
153
|
+
sendToolCallProgress: jest.fn()
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
mockProbeAgent = {
|
|
157
|
+
wrappedTools: {
|
|
158
|
+
delegateToolInstance: {
|
|
159
|
+
execute: jest.fn().mockResolvedValue('ACP delegate response')
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
sessionId: 'test-session-123'
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
toolManager = new ACPToolManager(mockServer, mockProbeAgent);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('should classify delegate tool as execute kind', () => {
|
|
169
|
+
const toolKind = toolManager.getToolKind('delegate');
|
|
170
|
+
expect(toolKind).toBe('execute');
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('should execute delegate tool through ACP with lifecycle tracking', async () => {
|
|
174
|
+
const task = 'Review API security implementations';
|
|
175
|
+
|
|
176
|
+
const result = await toolManager.executeToolCall('test-session', 'delegate', { task });
|
|
177
|
+
|
|
178
|
+
expect(mockProbeAgent.wrappedTools.delegateToolInstance.execute).toHaveBeenCalledWith({
|
|
179
|
+
task,
|
|
180
|
+
sessionId: 'test-session-123'
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
|
|
184
|
+
'test-session',
|
|
185
|
+
expect.any(String),
|
|
186
|
+
'pending'
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
|
|
190
|
+
'test-session',
|
|
191
|
+
expect.any(String),
|
|
192
|
+
'completed',
|
|
193
|
+
'ACP delegate response'
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
expect(result).toBe('ACP delegate response');
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('should provide delegate tool in definitions', () => {
|
|
200
|
+
const definitions = ACPToolManager.getToolDefinitions();
|
|
201
|
+
|
|
202
|
+
const delegateTool = definitions.find(d => d.name === 'delegate');
|
|
203
|
+
expect(delegateTool).toBeDefined();
|
|
204
|
+
expect(delegateTool.kind).toBe('execute');
|
|
205
|
+
expect(delegateTool.description).toContain('Automatically delegate');
|
|
206
|
+
expect(delegateTool.inputSchema.properties.task).toBeDefined();
|
|
207
|
+
expect(delegateTool.inputSchema.required).toContain('task');
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
describe('XML Parsing and Agentic Usage', () => {
|
|
212
|
+
it('should support XML tool format for AI agents', () => {
|
|
213
|
+
const xmlExamples = [
|
|
214
|
+
'<delegate><task>Analyze authentication code for security vulnerabilities</task></delegate>',
|
|
215
|
+
'<delegate><task>Review database performance and optimization opportunities</task></delegate>',
|
|
216
|
+
'<delegate><task>Examine code structure and maintainability patterns</task></delegate>'
|
|
217
|
+
];
|
|
218
|
+
|
|
219
|
+
xmlExamples.forEach(xml => {
|
|
220
|
+
expect(xml).toMatch(/<delegate>/);
|
|
221
|
+
expect(xml).toMatch(/<task>.*<\/task>/);
|
|
222
|
+
expect(xml).toMatch(/<\/delegate>/);
|
|
223
|
+
|
|
224
|
+
// Extract task content
|
|
225
|
+
const taskMatch = xml.match(/<task>(.*?)<\/task>/);
|
|
226
|
+
expect(taskMatch).not.toBeNull();
|
|
227
|
+
expect(taskMatch[1].length).toBeGreaterThan(20);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('should demonstrate proper task separation patterns', () => {
|
|
232
|
+
const complexRequest = 'Analyze my application for security, performance, and maintainability';
|
|
233
|
+
|
|
234
|
+
const separatedTasks = [
|
|
235
|
+
'Analyze all authentication, authorization, and input validation code for security vulnerabilities',
|
|
236
|
+
'Review database queries, API endpoints, and resource usage for performance bottlenecks',
|
|
237
|
+
'Examine code structure, design patterns, and documentation for maintainability improvements'
|
|
238
|
+
];
|
|
239
|
+
|
|
240
|
+
separatedTasks.forEach(task => {
|
|
241
|
+
expect(task.length).toBeGreaterThan(50);
|
|
242
|
+
expect(task).toMatch(/^(Analyze|Review|Examine)/);
|
|
243
|
+
|
|
244
|
+
// Each task should focus on one domain
|
|
245
|
+
const domains = ['security', 'performance', 'maintainability'];
|
|
246
|
+
const matchedDomains = domains.filter(domain =>
|
|
247
|
+
task.toLowerCase().includes(domain) ||
|
|
248
|
+
(domain === 'security' && task.includes('vulnerabilities')) ||
|
|
249
|
+
(domain === 'performance' && task.includes('bottlenecks')) ||
|
|
250
|
+
(domain === 'maintainability' && task.includes('design patterns'))
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
expect(matchedDomains.length).toBeGreaterThanOrEqual(1);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('should validate task self-containment', () => {
|
|
258
|
+
const validTasks = [
|
|
259
|
+
'Find all SQL injection vulnerabilities in database queries and provide fix recommendations',
|
|
260
|
+
'Identify memory leaks and performance bottlenecks in async operations',
|
|
261
|
+
'Review error handling patterns and suggest improvements for better reliability'
|
|
262
|
+
];
|
|
263
|
+
|
|
264
|
+
validTasks.forEach(task => {
|
|
265
|
+
// Should be actionable
|
|
266
|
+
expect(task).toMatch(/^(Find|Identify|Review|Analyze|Examine|Search)/);
|
|
267
|
+
|
|
268
|
+
// Should be specific
|
|
269
|
+
expect(task.length).toBeGreaterThan(30);
|
|
270
|
+
expect(task.length).toBeLessThan(200);
|
|
271
|
+
|
|
272
|
+
// Should not contain coordination words
|
|
273
|
+
expect(task).not.toMatch(/\band then\b|\bafter that\b|\balso\b/i);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it('should handle multi-line tasks in XML', () => {
|
|
278
|
+
const multilineTask = `Review database performance including:
|
|
279
|
+
- Query optimization opportunities
|
|
280
|
+
- Index usage patterns
|
|
281
|
+
- Connection pooling efficiency
|
|
282
|
+
- N+1 query detection`;
|
|
283
|
+
|
|
284
|
+
const xml = `<delegate><task>${multilineTask}</task></delegate>`;
|
|
285
|
+
|
|
286
|
+
expect(xml).toContain('Review database performance');
|
|
287
|
+
expect(xml).toContain('Query optimization');
|
|
288
|
+
expect(xml).toContain('N+1 query detection');
|
|
289
|
+
expect(xml).toMatch(/<delegate><task>[\s\S]*<\/task><\/delegate>/);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
describe('Iteration Limit Logic', () => {
|
|
294
|
+
it('should test remaining iterations calculation', () => {
|
|
295
|
+
// Test the logic that would be used in the delegate function
|
|
296
|
+
const testCases = [
|
|
297
|
+
{ current: 5, max: 20, expected: 15 },
|
|
298
|
+
{ current: 25, max: 30, expected: 5 },
|
|
299
|
+
{ current: 35, max: 30, expected: 1 }, // Should always allow at least 1
|
|
300
|
+
{ current: 0, max: 10, expected: 10 }
|
|
301
|
+
];
|
|
302
|
+
|
|
303
|
+
testCases.forEach(({ current, max, expected }) => {
|
|
304
|
+
const remaining = Math.max(1, max - current);
|
|
305
|
+
expect(remaining).toBe(expected);
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
describe('Tool Parameters and Schema', () => {
|
|
311
|
+
it('should validate delegate tool parameters', () => {
|
|
312
|
+
// Test parameter validation logic
|
|
313
|
+
const validTasks = [
|
|
314
|
+
'Analyze code for security issues',
|
|
315
|
+
'Find performance bottlenecks',
|
|
316
|
+
'Review error handling'
|
|
317
|
+
];
|
|
318
|
+
|
|
319
|
+
validTasks.forEach(task => {
|
|
320
|
+
expect(typeof task).toBe('string');
|
|
321
|
+
expect(task.length).toBeGreaterThan(0);
|
|
322
|
+
expect(task.trim()).toBe(task); // No leading/trailing whitespace
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
// Test invalid parameters
|
|
326
|
+
const invalidTasks = [null, undefined, '', 123, {}, []];
|
|
327
|
+
|
|
328
|
+
invalidTasks.forEach(task => {
|
|
329
|
+
expect(typeof task === 'string' && task.length > 0).toBe(false);
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it('should have correct automatic flag configuration', () => {
|
|
334
|
+
// Test that automatic flags are properly defined
|
|
335
|
+
const expectedFlags = [
|
|
336
|
+
'--prompt-type', 'code-researcher',
|
|
337
|
+
'--no-schema-validation',
|
|
338
|
+
'--no-mermaid-validation'
|
|
339
|
+
];
|
|
340
|
+
|
|
341
|
+
expectedFlags.forEach(flag => {
|
|
342
|
+
expect(typeof flag).toBe('string');
|
|
343
|
+
expect(flag.length).toBeGreaterThan(0);
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
// Verify flag patterns
|
|
347
|
+
expect('--prompt-type').toMatch(/^--[a-z-]+$/);
|
|
348
|
+
expect('code-researcher').toMatch(/^[a-z-]+$/);
|
|
349
|
+
expect('--no-schema-validation').toMatch(/^--no-[a-z-]+$/);
|
|
350
|
+
expect('--no-mermaid-validation').toMatch(/^--no-[a-z-]+$/);
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
});
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for delegate tool with Vercel AI SDK and ACP
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { jest } from '@jest/globals';
|
|
6
|
+
|
|
7
|
+
// Mock the delegate function
|
|
8
|
+
const mockDelegate = jest.fn();
|
|
9
|
+
const mockIsDelegateAvailable = jest.fn(() => Promise.resolve(true));
|
|
10
|
+
jest.unstable_mockModule('../src/delegate.js', () => ({
|
|
11
|
+
delegate: mockDelegate,
|
|
12
|
+
isDelegateAvailable: mockIsDelegateAvailable
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
// Mock ProbeAgent to avoid API key requirements
|
|
16
|
+
const mockProbeAgent = jest.fn().mockImplementation((options) => {
|
|
17
|
+
const instance = {
|
|
18
|
+
sessionId: options.sessionId,
|
|
19
|
+
debug: options.debug,
|
|
20
|
+
maxIterations: options.maxIterations,
|
|
21
|
+
currentIteration: 0,
|
|
22
|
+
executeTool: jest.fn()
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
instance.executeTool.mockImplementation(async (toolName, params) => {
|
|
26
|
+
if (toolName === 'delegate') {
|
|
27
|
+
// Simulate ProbeAgent calling delegate with iteration context
|
|
28
|
+
const enhancedParams = {
|
|
29
|
+
...params,
|
|
30
|
+
currentIteration: instance.currentIteration,
|
|
31
|
+
maxIterations: instance.maxIterations,
|
|
32
|
+
debug: instance.debug
|
|
33
|
+
};
|
|
34
|
+
return await mockDelegate(enhancedParams);
|
|
35
|
+
}
|
|
36
|
+
return `Mock result for ${toolName}`;
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return instance;
|
|
40
|
+
});
|
|
41
|
+
jest.unstable_mockModule('../src/agent/ProbeAgent.js', () => ({
|
|
42
|
+
ProbeAgent: mockProbeAgent
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
// Import after mocking
|
|
46
|
+
const { delegateTool } = await import('../src/tools/vercel.js');
|
|
47
|
+
const { ACPToolManager } = await import('../src/agent/acp/tools.js');
|
|
48
|
+
const { ProbeAgent } = await import('../src/agent/ProbeAgent.js');
|
|
49
|
+
|
|
50
|
+
describe('Delegate Tool Integration', () => {
|
|
51
|
+
describe('Vercel AI SDK Integration', () => {
|
|
52
|
+
beforeEach(() => {
|
|
53
|
+
jest.clearAllMocks();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
afterEach(() => {
|
|
57
|
+
jest.clearAllMocks();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('should create delegate tool with proper schema', () => {
|
|
61
|
+
const tool = delegateTool({ debug: true, timeout: 600 });
|
|
62
|
+
|
|
63
|
+
expect(tool.name).toBe('delegate');
|
|
64
|
+
expect(tool.description).toContain('Automatically delegate');
|
|
65
|
+
expect(tool.description).toContain('agentic loop');
|
|
66
|
+
|
|
67
|
+
// Zod schema should be an object
|
|
68
|
+
expect(tool.inputSchema).toBeDefined();
|
|
69
|
+
expect(typeof tool.inputSchema).toBe('object');
|
|
70
|
+
|
|
71
|
+
// Check that the schema can parse valid input
|
|
72
|
+
const validInput = { task: 'Test task' };
|
|
73
|
+
expect(() => tool.inputSchema.parse(validInput)).not.toThrow();
|
|
74
|
+
|
|
75
|
+
// Check that invalid input throws
|
|
76
|
+
expect(() => tool.inputSchema.parse({})).toThrow(); // Missing required task
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('should execute delegate tool with correct parameters', async () => {
|
|
80
|
+
const tool = delegateTool({ debug: true, timeout: 600 });
|
|
81
|
+
const task = 'Analyze security vulnerabilities in authentication code';
|
|
82
|
+
|
|
83
|
+
mockDelegate.mockResolvedValue('Security analysis complete: Found 3 vulnerabilities');
|
|
84
|
+
|
|
85
|
+
const result = await tool.execute({ task });
|
|
86
|
+
|
|
87
|
+
expect(mockDelegate).toHaveBeenCalledWith({
|
|
88
|
+
task,
|
|
89
|
+
timeout: 600,
|
|
90
|
+
debug: true,
|
|
91
|
+
currentIteration: 0,
|
|
92
|
+
maxIterations: 30,
|
|
93
|
+
parentSessionId: undefined,
|
|
94
|
+
path: undefined,
|
|
95
|
+
provider: undefined,
|
|
96
|
+
model: undefined,
|
|
97
|
+
tracer: undefined
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
expect(result).toBe('Security analysis complete: Found 3 vulnerabilities');
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('should handle delegate execution errors gracefully', async () => {
|
|
104
|
+
const tool = delegateTool();
|
|
105
|
+
const task = 'Invalid task that will fail';
|
|
106
|
+
|
|
107
|
+
mockDelegate.mockRejectedValue(new Error('Delegation process failed'));
|
|
108
|
+
|
|
109
|
+
// Tool now throws errors instead of returning error strings
|
|
110
|
+
await expect(tool.execute({ task })).rejects.toThrow('Delegation process failed');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should support XML parsing format', () => {
|
|
114
|
+
// Test that the tool definition supports XML parsing by AI agents
|
|
115
|
+
const tool = delegateTool();
|
|
116
|
+
|
|
117
|
+
// Simulate AI agent parsing XML and converting to tool call
|
|
118
|
+
const xmlInput = '<delegate><task>Find all TODO comments in the codebase</task></delegate>';
|
|
119
|
+
const parsedTask = xmlInput.match(/<task>(.*?)<\/task>/s)?.[1];
|
|
120
|
+
|
|
121
|
+
expect(parsedTask).toBe('Find all TODO comments in the codebase');
|
|
122
|
+
|
|
123
|
+
// This would be how AI agent converts XML to tool call
|
|
124
|
+
const toolCall = {
|
|
125
|
+
name: tool.name,
|
|
126
|
+
arguments: { task: parsedTask }
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
expect(toolCall.name).toBe('delegate');
|
|
130
|
+
expect(toolCall.arguments.task).toBe('Find all TODO comments in the codebase');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe('ACP Tool Manager Integration', () => {
|
|
135
|
+
let toolManager;
|
|
136
|
+
let mockServer;
|
|
137
|
+
let mockProbeAgent;
|
|
138
|
+
let mockDelegate;
|
|
139
|
+
|
|
140
|
+
beforeEach(async () => {
|
|
141
|
+
// Mock server
|
|
142
|
+
mockServer = {
|
|
143
|
+
options: { debug: true },
|
|
144
|
+
sendToolCallProgress: jest.fn()
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// Mock probe agent with delegate tool
|
|
148
|
+
mockProbeAgent = {
|
|
149
|
+
wrappedTools: {
|
|
150
|
+
delegateToolInstance: {
|
|
151
|
+
execute: jest.fn()
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
sessionId: 'test-session-123'
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
toolManager = new ACPToolManager(mockServer, mockProbeAgent);
|
|
158
|
+
|
|
159
|
+
// Mock delegate function
|
|
160
|
+
const delegateModule = await import('../src/delegate.js');
|
|
161
|
+
mockDelegate = delegateModule.delegate;
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
afterEach(() => {
|
|
165
|
+
jest.clearAllMocks();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('should execute delegate tool through ACP with proper lifecycle tracking', async () => {
|
|
169
|
+
const task = 'Review API security implementations';
|
|
170
|
+
const mockResponse = 'API security review completed';
|
|
171
|
+
|
|
172
|
+
mockProbeAgent.wrappedTools.delegateToolInstance.execute.mockResolvedValue(mockResponse);
|
|
173
|
+
|
|
174
|
+
const result = await toolManager.executeToolCall('test-session', 'delegate', { task });
|
|
175
|
+
|
|
176
|
+
// Verify tool execution
|
|
177
|
+
expect(mockProbeAgent.wrappedTools.delegateToolInstance.execute).toHaveBeenCalledWith({
|
|
178
|
+
task,
|
|
179
|
+
sessionId: 'test-session-123'
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// Verify lifecycle notifications
|
|
183
|
+
expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
|
|
184
|
+
'test-session',
|
|
185
|
+
expect.any(String),
|
|
186
|
+
'pending'
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
|
|
190
|
+
'test-session',
|
|
191
|
+
expect.any(String),
|
|
192
|
+
'in_progress'
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
|
|
196
|
+
'test-session',
|
|
197
|
+
expect.any(String),
|
|
198
|
+
'completed',
|
|
199
|
+
mockResponse
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
expect(result).toBe(mockResponse);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('should classify delegate tool as execute kind', () => {
|
|
206
|
+
const toolKind = toolManager.getToolKind('delegate');
|
|
207
|
+
expect(toolKind).toBe('execute');
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('should handle delegate tool failures with proper error reporting', async () => {
|
|
211
|
+
const task = 'Task that will fail';
|
|
212
|
+
const errorMessage = 'Delegation failed: Process terminated unexpectedly';
|
|
213
|
+
|
|
214
|
+
mockProbeAgent.wrappedTools.delegateToolInstance.execute.mockRejectedValue(
|
|
215
|
+
new Error(errorMessage)
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
await expect(
|
|
219
|
+
toolManager.executeToolCall('test-session', 'delegate', { task })
|
|
220
|
+
).rejects.toThrow(errorMessage);
|
|
221
|
+
|
|
222
|
+
// Verify error was reported through ACP
|
|
223
|
+
expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
|
|
224
|
+
'test-session',
|
|
225
|
+
expect.any(String),
|
|
226
|
+
'failed',
|
|
227
|
+
null,
|
|
228
|
+
errorMessage
|
|
229
|
+
);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
describe('ProbeAgent Integration', () => {
|
|
234
|
+
let probeAgent;
|
|
235
|
+
let mockDelegate;
|
|
236
|
+
|
|
237
|
+
beforeEach(async () => {
|
|
238
|
+
// Mock delegate function
|
|
239
|
+
const delegateModule = await import('../src/delegate.js');
|
|
240
|
+
mockDelegate = delegateModule.delegate;
|
|
241
|
+
|
|
242
|
+
// Create probe agent instance
|
|
243
|
+
probeAgent = new ProbeAgent({
|
|
244
|
+
sessionId: 'integration-test-session',
|
|
245
|
+
debug: true,
|
|
246
|
+
maxIterations: 25
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
afterEach(() => {
|
|
251
|
+
jest.clearAllMocks();
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
it('should pass iteration context to delegate tool execution', async () => {
|
|
255
|
+
const task = 'Complex task requiring delegation';
|
|
256
|
+
const expectedResponse = 'Task completed by subagent';
|
|
257
|
+
|
|
258
|
+
mockDelegate.mockResolvedValue(expectedResponse);
|
|
259
|
+
|
|
260
|
+
// Simulate some iterations have already occurred
|
|
261
|
+
probeAgent.currentIteration = 8;
|
|
262
|
+
|
|
263
|
+
// Execute delegate tool through ProbeAgent
|
|
264
|
+
const result = await probeAgent.executeTool('delegate', { task });
|
|
265
|
+
|
|
266
|
+
// Verify delegate was called with iteration context
|
|
267
|
+
expect(mockDelegate).toHaveBeenCalledWith({
|
|
268
|
+
task,
|
|
269
|
+
currentIteration: 8,
|
|
270
|
+
maxIterations: 25,
|
|
271
|
+
debug: true
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
expect(result).toBe(expectedResponse);
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it('should handle delegate tool when near iteration limit', async () => {
|
|
278
|
+
const task = 'Last minute delegation';
|
|
279
|
+
|
|
280
|
+
mockDelegate.mockResolvedValue('Quick response from subagent');
|
|
281
|
+
|
|
282
|
+
// Set current iteration very close to limit
|
|
283
|
+
probeAgent.currentIteration = 24;
|
|
284
|
+
probeAgent.maxIterations = 25;
|
|
285
|
+
|
|
286
|
+
await probeAgent.executeTool('delegate', { task });
|
|
287
|
+
|
|
288
|
+
// Should still allow delegation but with very limited iterations
|
|
289
|
+
expect(mockDelegate).toHaveBeenCalledWith({
|
|
290
|
+
task,
|
|
291
|
+
currentIteration: 24,
|
|
292
|
+
maxIterations: 25,
|
|
293
|
+
debug: true
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
// Note: Automatic flag verification is covered in delegate.test.js unit tests
|
|
299
|
+
|
|
300
|
+
describe('Agentic Loop Scenarios', () => {
|
|
301
|
+
it('should demonstrate multi-task delegation scenario', async () => {
|
|
302
|
+
// Simulate AI agent receiving complex request and breaking it down
|
|
303
|
+
const complexRequest = 'Analyze my Node.js application for security issues, performance problems, and code quality concerns';
|
|
304
|
+
|
|
305
|
+
const expectedDelegations = [
|
|
306
|
+
'Analyze all input validation, authentication, authorization, and dependency vulnerabilities in the Node.js application',
|
|
307
|
+
'Review database queries, async operations, memory usage, and API response times for performance optimization opportunities',
|
|
308
|
+
'Examine code structure, documentation, test coverage, and maintainability patterns across the application'
|
|
309
|
+
];
|
|
310
|
+
|
|
311
|
+
// Each delegation should be independent and focused
|
|
312
|
+
expectedDelegations.forEach(task => {
|
|
313
|
+
expect(task.length).toBeGreaterThan(50); // Substantial task
|
|
314
|
+
expect(task).not.toContain('and also'); // Single focus
|
|
315
|
+
|
|
316
|
+
// Verify task is complete and actionable
|
|
317
|
+
if (task.includes('security') || task.includes('vulnerabilities')) {
|
|
318
|
+
expect(task).toMatch(/authentication|authorization|validation|vulnerabilities/);
|
|
319
|
+
} else if (task.includes('performance')) {
|
|
320
|
+
expect(task).toMatch(/database|async|memory|response|optimization/);
|
|
321
|
+
} else if (task.includes('quality') || task.includes('maintainability')) {
|
|
322
|
+
expect(task).toMatch(/structure|documentation|test|maintainability|patterns/);
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it('should validate task self-containment for parallel execution', () => {
|
|
328
|
+
const tasks = [
|
|
329
|
+
'Find all SQL injection vulnerabilities in the database layer',
|
|
330
|
+
'Identify performance bottlenecks in the API endpoints',
|
|
331
|
+
'Review error handling patterns across all modules'
|
|
332
|
+
];
|
|
333
|
+
|
|
334
|
+
// Each task should be executable independently
|
|
335
|
+
tasks.forEach(task => {
|
|
336
|
+
// Should have clear scope and action
|
|
337
|
+
expect(task).toMatch(/^(Find|Identify|Review|Analyze|Examine)/);
|
|
338
|
+
|
|
339
|
+
// Should specify domain clearly
|
|
340
|
+
expect(task).toMatch(/(vulnerabilities|bottlenecks|patterns|security|performance|error)/);
|
|
341
|
+
|
|
342
|
+
// Should be specific enough to execute
|
|
343
|
+
expect(task.length).toBeGreaterThan(30);
|
|
344
|
+
expect(task.length).toBeLessThan(200);
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
});
|