@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,400 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach, jest } from '@jest/globals';
|
|
2
|
+
import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
|
|
3
|
+
import { delegateTool } from '../../src/tools/vercel.js';
|
|
4
|
+
import { delegate } from '../../src/delegate.js';
|
|
5
|
+
|
|
6
|
+
describe('ProbeAgent enableDelegate option', () => {
|
|
7
|
+
describe('Constructor and initialization', () => {
|
|
8
|
+
test('should default enableDelegate to false', () => {
|
|
9
|
+
const agent = new ProbeAgent({});
|
|
10
|
+
expect(agent.enableDelegate).toBe(false);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('should set enableDelegate to true when explicitly enabled', () => {
|
|
14
|
+
const agent = new ProbeAgent({ enableDelegate: true });
|
|
15
|
+
expect(agent.enableDelegate).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('should set enableDelegate to false when explicitly disabled', () => {
|
|
19
|
+
const agent = new ProbeAgent({ enableDelegate: false });
|
|
20
|
+
expect(agent.enableDelegate).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('should handle truthy values correctly', () => {
|
|
24
|
+
const agent1 = new ProbeAgent({ enableDelegate: 1 });
|
|
25
|
+
expect(agent1.enableDelegate).toBe(true);
|
|
26
|
+
|
|
27
|
+
const agent2 = new ProbeAgent({ enableDelegate: 'true' });
|
|
28
|
+
expect(agent2.enableDelegate).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('should handle falsy values correctly', () => {
|
|
32
|
+
const agent1 = new ProbeAgent({ enableDelegate: 0 });
|
|
33
|
+
expect(agent1.enableDelegate).toBe(false);
|
|
34
|
+
|
|
35
|
+
const agent2 = new ProbeAgent({ enableDelegate: null });
|
|
36
|
+
expect(agent2.enableDelegate).toBe(false);
|
|
37
|
+
|
|
38
|
+
const agent3 = new ProbeAgent({ enableDelegate: undefined });
|
|
39
|
+
expect(agent3.enableDelegate).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
describe('System message integration', () => {
|
|
44
|
+
test('should include delegate tool definition when enabled', async () => {
|
|
45
|
+
const agent = new ProbeAgent({ enableDelegate: true });
|
|
46
|
+
const systemMessage = await agent.getSystemMessage();
|
|
47
|
+
|
|
48
|
+
expect(systemMessage).toContain('delegate');
|
|
49
|
+
expect(systemMessage).toContain('Delegate big distinct tasks to specialized probe subagents');
|
|
50
|
+
expect(systemMessage).toMatch(/##\s*delegate/);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('should not include delegate tool definition when disabled', async () => {
|
|
54
|
+
const agent = new ProbeAgent({ enableDelegate: false });
|
|
55
|
+
const systemMessage = await agent.getSystemMessage();
|
|
56
|
+
|
|
57
|
+
// Should not contain delegate tool definition section
|
|
58
|
+
expect(systemMessage).not.toMatch(/##\s*delegate/);
|
|
59
|
+
expect(systemMessage).not.toContain('Delegate big distinct tasks to specialized probe subagents');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('should include delegate in available tools list when enabled', async () => {
|
|
63
|
+
const agent = new ProbeAgent({ enableDelegate: true });
|
|
64
|
+
const systemMessage = await agent.getSystemMessage();
|
|
65
|
+
|
|
66
|
+
// Check for delegate in the available tools list
|
|
67
|
+
expect(systemMessage).toContain('- delegate: Delegate big distinct tasks to specialized probe subagents');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('should not include delegate in available tools list when disabled', async () => {
|
|
71
|
+
const agent = new ProbeAgent({ enableDelegate: false });
|
|
72
|
+
const systemMessage = await agent.getSystemMessage();
|
|
73
|
+
|
|
74
|
+
// Should not contain delegate in tools list
|
|
75
|
+
const toolsSection = systemMessage.match(/Available Tools:([\s\S]*?)(?=\n\n|$)/);
|
|
76
|
+
if (toolsSection) {
|
|
77
|
+
expect(toolsSection[1]).not.toContain('- delegate:');
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('should work independently from allowEdit option', async () => {
|
|
82
|
+
// Test all combinations
|
|
83
|
+
const agent1 = new ProbeAgent({ enableDelegate: true, allowEdit: false });
|
|
84
|
+
const message1 = await agent1.getSystemMessage();
|
|
85
|
+
expect(message1).toContain('delegate');
|
|
86
|
+
expect(message1).not.toContain('implement');
|
|
87
|
+
|
|
88
|
+
const agent2 = new ProbeAgent({ enableDelegate: false, allowEdit: true });
|
|
89
|
+
const message2 = await agent2.getSystemMessage();
|
|
90
|
+
expect(message2).not.toContain('## delegate');
|
|
91
|
+
expect(message2).toContain('implement');
|
|
92
|
+
|
|
93
|
+
const agent3 = new ProbeAgent({ enableDelegate: true, allowEdit: true });
|
|
94
|
+
const message3 = await agent3.getSystemMessage();
|
|
95
|
+
expect(message3).toContain('delegate');
|
|
96
|
+
expect(message3).toContain('implement');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe('Valid tools array', () => {
|
|
101
|
+
test('should include delegate in validTools when parsing tool calls', async () => {
|
|
102
|
+
const agent = new ProbeAgent({
|
|
103
|
+
enableDelegate: true,
|
|
104
|
+
provider: 'anthropic'
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// We need to check that delegate is in validTools during answer() execution
|
|
108
|
+
// This is tested indirectly by ensuring the system message is correct
|
|
109
|
+
const systemMessage = await agent.getSystemMessage();
|
|
110
|
+
|
|
111
|
+
// Verify the tool definition exists, which means it should be in validTools
|
|
112
|
+
expect(systemMessage).toContain('## delegate');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('should not include delegate in validTools when disabled', async () => {
|
|
116
|
+
const agent = new ProbeAgent({
|
|
117
|
+
enableDelegate: false,
|
|
118
|
+
provider: 'anthropic'
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const systemMessage = await agent.getSystemMessage();
|
|
122
|
+
|
|
123
|
+
// Verify the tool definition doesn't exist
|
|
124
|
+
expect(systemMessage).not.toMatch(/##\s*delegate/);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
describe('Clone functionality', () => {
|
|
129
|
+
test('should preserve enableDelegate setting when cloning', () => {
|
|
130
|
+
const baseAgent = new ProbeAgent({ enableDelegate: true });
|
|
131
|
+
const cloned = baseAgent.clone();
|
|
132
|
+
|
|
133
|
+
expect(cloned.enableDelegate).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test('should allow overriding enableDelegate when cloning', () => {
|
|
137
|
+
const baseAgent = new ProbeAgent({ enableDelegate: true });
|
|
138
|
+
const cloned = baseAgent.clone({ overrides: { enableDelegate: false } });
|
|
139
|
+
|
|
140
|
+
expect(baseAgent.enableDelegate).toBe(true);
|
|
141
|
+
expect(cloned.enableDelegate).toBe(false);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('should clone with enableDelegate false by default', () => {
|
|
145
|
+
const baseAgent = new ProbeAgent({ enableDelegate: false });
|
|
146
|
+
const cloned = baseAgent.clone();
|
|
147
|
+
|
|
148
|
+
expect(cloned.enableDelegate).toBe(false);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
describe('Combined with other options', () => {
|
|
153
|
+
test('should work with custom prompt', async () => {
|
|
154
|
+
const customPrompt = 'You are a specialized code analyzer.';
|
|
155
|
+
const agent = new ProbeAgent({
|
|
156
|
+
enableDelegate: true,
|
|
157
|
+
customPrompt
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
const systemMessage = await agent.getSystemMessage();
|
|
161
|
+
|
|
162
|
+
expect(systemMessage).toContain(customPrompt);
|
|
163
|
+
expect(systemMessage).toContain('delegate');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('should work with different prompt types', async () => {
|
|
167
|
+
const promptTypes = ['code-explorer', 'engineer', 'code-review', 'support', 'architect'];
|
|
168
|
+
|
|
169
|
+
for (const promptType of promptTypes) {
|
|
170
|
+
const agent = new ProbeAgent({
|
|
171
|
+
enableDelegate: true,
|
|
172
|
+
promptType
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
const systemMessage = await agent.getSystemMessage();
|
|
176
|
+
expect(systemMessage).toContain('delegate');
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test('should work with debug mode', () => {
|
|
181
|
+
const agent = new ProbeAgent({
|
|
182
|
+
enableDelegate: true,
|
|
183
|
+
debug: true
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
expect(agent.enableDelegate).toBe(true);
|
|
187
|
+
expect(agent.debug).toBe(true);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test('should work with path configuration', () => {
|
|
191
|
+
const agent = new ProbeAgent({
|
|
192
|
+
enableDelegate: true,
|
|
193
|
+
path: '/test/path'
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
expect(agent.enableDelegate).toBe(true);
|
|
197
|
+
expect(agent.allowedFolders).toContain('/test/path');
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
describe('Type safety', () => {
|
|
202
|
+
test('should handle various input types without errors', () => {
|
|
203
|
+
// String
|
|
204
|
+
expect(() => new ProbeAgent({ enableDelegate: 'yes' })).not.toThrow();
|
|
205
|
+
|
|
206
|
+
// Number
|
|
207
|
+
expect(() => new ProbeAgent({ enableDelegate: 42 })).not.toThrow();
|
|
208
|
+
|
|
209
|
+
// Boolean
|
|
210
|
+
expect(() => new ProbeAgent({ enableDelegate: true })).not.toThrow();
|
|
211
|
+
expect(() => new ProbeAgent({ enableDelegate: false })).not.toThrow();
|
|
212
|
+
|
|
213
|
+
// Null/undefined
|
|
214
|
+
expect(() => new ProbeAgent({ enableDelegate: null })).not.toThrow();
|
|
215
|
+
expect(() => new ProbeAgent({ enableDelegate: undefined })).not.toThrow();
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
describe('System message structure', () => {
|
|
220
|
+
test('should maintain proper tool definition format when delegate is enabled', async () => {
|
|
221
|
+
const agent = new ProbeAgent({ enableDelegate: true });
|
|
222
|
+
const systemMessage = await agent.getSystemMessage();
|
|
223
|
+
|
|
224
|
+
// Check for proper markdown structure
|
|
225
|
+
expect(systemMessage).toMatch(/##\s*delegate/);
|
|
226
|
+
expect(systemMessage).toMatch(/Description:.*delegate/i);
|
|
227
|
+
expect(systemMessage).toMatch(/Parameters:/);
|
|
228
|
+
expect(systemMessage).toContain('task:');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test('should place delegate tool in logical position', async () => {
|
|
232
|
+
const agent = new ProbeAgent({ enableDelegate: true });
|
|
233
|
+
const systemMessage = await agent.getSystemMessage();
|
|
234
|
+
|
|
235
|
+
// Delegate should appear after attempt_completion (at the end with optional tools)
|
|
236
|
+
const searchIndex = systemMessage.indexOf('## search');
|
|
237
|
+
const completionIndex = systemMessage.indexOf('## attempt_completion');
|
|
238
|
+
const delegateIndex = systemMessage.indexOf('## delegate');
|
|
239
|
+
|
|
240
|
+
expect(searchIndex).toBeGreaterThan(-1);
|
|
241
|
+
expect(completionIndex).toBeGreaterThan(searchIndex);
|
|
242
|
+
expect(delegateIndex).toBeGreaterThan(completionIndex);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe('Provider inheritance for delegation', () => {
|
|
247
|
+
test('should have apiType as string for all provider types', () => {
|
|
248
|
+
// Test that apiType is always a string identifier
|
|
249
|
+
const providerTypes = ['anthropic', 'openai', 'google', 'bedrock', 'claude-code', 'codex'];
|
|
250
|
+
|
|
251
|
+
for (const providerType of providerTypes) {
|
|
252
|
+
const agent = new ProbeAgent({ provider: providerType });
|
|
253
|
+
// apiType should be set based on provider
|
|
254
|
+
// For providers without API keys, it may fall back to different values
|
|
255
|
+
expect(typeof agent.apiType).toBe('string');
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test('should store provider as string in clientApiProvider', () => {
|
|
260
|
+
// Verify clientApiProvider stores the string identifier
|
|
261
|
+
const agent = new ProbeAgent({ provider: 'google' });
|
|
262
|
+
expect(agent.clientApiProvider).toBe('google');
|
|
263
|
+
|
|
264
|
+
const agent2 = new ProbeAgent({ provider: 'claude-code' });
|
|
265
|
+
expect(agent2.clientApiProvider).toBe('claude-code');
|
|
266
|
+
|
|
267
|
+
const agent3 = new ProbeAgent({ provider: 'codex' });
|
|
268
|
+
expect(agent3.clientApiProvider).toBe('codex');
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test('should store claude-code provider in clientApiProvider', () => {
|
|
272
|
+
const agent = new ProbeAgent({ provider: 'claude-code' });
|
|
273
|
+
// clientApiProvider should always store the input provider string
|
|
274
|
+
expect(agent.clientApiProvider).toBe('claude-code');
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
test('should store codex provider in clientApiProvider', () => {
|
|
278
|
+
const agent = new ProbeAgent({ provider: 'codex' });
|
|
279
|
+
// clientApiProvider should always store the input provider string
|
|
280
|
+
expect(agent.clientApiProvider).toBe('codex');
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
test('should have apiType as string type (not function)', () => {
|
|
284
|
+
// Test that apiType is always a string, never a function
|
|
285
|
+
// This is critical for delegation since the delegate tool validates
|
|
286
|
+
// that provider must be a string, null, or undefined
|
|
287
|
+
const agent = new ProbeAgent({});
|
|
288
|
+
|
|
289
|
+
// apiType should always be a string
|
|
290
|
+
expect(typeof agent.apiType).toBe('string');
|
|
291
|
+
|
|
292
|
+
// If provider is set (for non-mock environments), it should be different from apiType
|
|
293
|
+
// apiType = string identifier ('google', 'anthropic', etc.)
|
|
294
|
+
// provider = AI SDK factory function or null
|
|
295
|
+
if (agent.provider !== null && agent.provider !== undefined) {
|
|
296
|
+
// provider is either a function (AI SDK factory) or null
|
|
297
|
+
expect(agent.apiType).not.toBe(agent.provider);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
describe('Delegate tool validation', () => {
|
|
304
|
+
// These tests focus on the parameter validation in the delegate tool
|
|
305
|
+
// They check that invalid types are rejected immediately before delegation starts
|
|
306
|
+
|
|
307
|
+
test('should reject function as provider', async () => {
|
|
308
|
+
const delegate = delegateTool();
|
|
309
|
+
|
|
310
|
+
await expect(delegate.execute({
|
|
311
|
+
task: 'Test task',
|
|
312
|
+
provider: () => {}, // Function instead of string
|
|
313
|
+
model: 'test-model'
|
|
314
|
+
})).rejects.toThrow('provider must be a string, null, or undefined');
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
test('should reject object as provider', async () => {
|
|
318
|
+
const delegate = delegateTool();
|
|
319
|
+
|
|
320
|
+
await expect(delegate.execute({
|
|
321
|
+
task: 'Test task',
|
|
322
|
+
provider: { name: 'google' }, // Object instead of string
|
|
323
|
+
model: 'test-model'
|
|
324
|
+
})).rejects.toThrow('provider must be a string, null, or undefined');
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
test('should reject number as provider', async () => {
|
|
328
|
+
const delegate = delegateTool();
|
|
329
|
+
|
|
330
|
+
await expect(delegate.execute({
|
|
331
|
+
task: 'Test task',
|
|
332
|
+
provider: 123, // Number instead of string
|
|
333
|
+
model: 'test-model'
|
|
334
|
+
})).rejects.toThrow('provider must be a string, null, or undefined');
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
test('should reject array as provider', async () => {
|
|
338
|
+
const delegate = delegateTool();
|
|
339
|
+
|
|
340
|
+
await expect(delegate.execute({
|
|
341
|
+
task: 'Test task',
|
|
342
|
+
provider: ['google'], // Array instead of string
|
|
343
|
+
model: 'test-model'
|
|
344
|
+
})).rejects.toThrow('provider must be a string, null, or undefined');
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
test('should validate provider type at runtime', () => {
|
|
348
|
+
// The delegate tool schema only defines 'task' as a public parameter.
|
|
349
|
+
// The provider, model, etc. are internal parameters added by ProbeAgent.
|
|
350
|
+
// Runtime validation in the execute function ensures provider is a string.
|
|
351
|
+
// This test verifies the validation works by checking invalid types are rejected.
|
|
352
|
+
|
|
353
|
+
const delegateToolInstance = delegateTool();
|
|
354
|
+
|
|
355
|
+
// The tool should have a task parameter in its schema
|
|
356
|
+
expect(delegateToolInstance).toBeDefined();
|
|
357
|
+
expect(typeof delegateToolInstance.execute).toBe('function');
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
describe('Delegate tracer handling', () => {
|
|
362
|
+
test('should not throw when tracer is missing createDelegationSpan method', async () => {
|
|
363
|
+
// This test ensures that a tracer object without createDelegationSpan method
|
|
364
|
+
// doesn't cause "tracer.createDelegationSpan is not a function" error
|
|
365
|
+
const incompleteTracer = {
|
|
366
|
+
// tracer object without createDelegationSpan
|
|
367
|
+
someOtherMethod: () => {}
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
// The delegate should handle this gracefully and not throw
|
|
371
|
+
// It will fail for other reasons (no task, etc.), but NOT because of tracer
|
|
372
|
+
await expect(delegate({
|
|
373
|
+
task: 'Test task',
|
|
374
|
+
tracer: incompleteTracer
|
|
375
|
+
})).rejects.not.toThrow('createDelegationSpan is not a function');
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
test('should not throw when tracer is an empty object', async () => {
|
|
379
|
+
const emptyTracer = {};
|
|
380
|
+
|
|
381
|
+
await expect(delegate({
|
|
382
|
+
task: 'Test task',
|
|
383
|
+
tracer: emptyTracer
|
|
384
|
+
})).rejects.not.toThrow('createDelegationSpan is not a function');
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
test('should not throw when tracer is null', async () => {
|
|
388
|
+
await expect(delegate({
|
|
389
|
+
task: 'Test task',
|
|
390
|
+
tracer: null
|
|
391
|
+
})).rejects.not.toThrow('createDelegationSpan is not a function');
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
test('should not throw when tracer is undefined', async () => {
|
|
395
|
+
await expect(delegate({
|
|
396
|
+
task: 'Test task',
|
|
397
|
+
tracer: undefined
|
|
398
|
+
})).rejects.not.toThrow('createDelegationSpan is not a function');
|
|
399
|
+
});
|
|
400
|
+
});
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach, afterEach } from '@jest/globals';
|
|
2
|
+
import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
|
|
3
|
+
|
|
4
|
+
describe('ProbeAgent model option', () => {
|
|
5
|
+
let originalModelName;
|
|
6
|
+
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
// Save original MODEL_NAME environment variable
|
|
9
|
+
originalModelName = process.env.MODEL_NAME;
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
// Restore original MODEL_NAME
|
|
14
|
+
if (originalModelName === undefined) {
|
|
15
|
+
delete process.env.MODEL_NAME;
|
|
16
|
+
} else {
|
|
17
|
+
process.env.MODEL_NAME = originalModelName;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('should store model option in constructor', () => {
|
|
22
|
+
const agent = new ProbeAgent({
|
|
23
|
+
model: 'custom-model-123',
|
|
24
|
+
path: process.cwd()
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
expect(agent.clientApiModel).toBe('custom-model-123');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('should default to null when no model option provided', () => {
|
|
31
|
+
const agent = new ProbeAgent({
|
|
32
|
+
path: process.cwd()
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
expect(agent.clientApiModel).toBeNull();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('should use model option over MODEL_NAME environment variable', () => {
|
|
39
|
+
process.env.MODEL_NAME = 'env-model';
|
|
40
|
+
|
|
41
|
+
const agent = new ProbeAgent({
|
|
42
|
+
model: 'option-model',
|
|
43
|
+
path: process.cwd()
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
expect(agent.clientApiModel).toBe('option-model');
|
|
47
|
+
// The actual model name would be set during initializeModel()
|
|
48
|
+
// which uses clientApiModel || process.env.MODEL_NAME
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('should fall back to MODEL_NAME when model option not provided', () => {
|
|
52
|
+
process.env.MODEL_NAME = 'env-model';
|
|
53
|
+
|
|
54
|
+
const agent = new ProbeAgent({
|
|
55
|
+
path: process.cwd()
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
expect(agent.clientApiModel).toBeNull();
|
|
59
|
+
// initializeModel() would use process.env.MODEL_NAME as fallback
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('should preserve model option in clone', () => {
|
|
63
|
+
const baseAgent = new ProbeAgent({
|
|
64
|
+
model: 'original-model',
|
|
65
|
+
path: process.cwd()
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const cloned = baseAgent.clone();
|
|
69
|
+
|
|
70
|
+
// The clone should preserve the user's model preference (clientApiModel)
|
|
71
|
+
expect(cloned.clientApiModel).toBe(baseAgent.clientApiModel);
|
|
72
|
+
expect(cloned.clientApiModel).toBe('original-model');
|
|
73
|
+
// Both should resolve to the same actual model
|
|
74
|
+
expect(cloned.model).toBe('original-model');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test('should preserve absence of model option in clone', () => {
|
|
78
|
+
const baseAgent = new ProbeAgent({
|
|
79
|
+
path: process.cwd()
|
|
80
|
+
// No model specified
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const cloned = baseAgent.clone();
|
|
84
|
+
|
|
85
|
+
// The clone should not have a model preference either
|
|
86
|
+
expect(cloned.clientApiModel).toBeNull();
|
|
87
|
+
expect(baseAgent.clientApiModel).toBeNull();
|
|
88
|
+
// Both should use the default mock model
|
|
89
|
+
expect(cloned.model).toBe('mock-model');
|
|
90
|
+
expect(baseAgent.model).toBe('mock-model');
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test('should allow override of model option in clone', () => {
|
|
94
|
+
const baseAgent = new ProbeAgent({
|
|
95
|
+
model: 'original-model',
|
|
96
|
+
path: process.cwd()
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const cloned = baseAgent.clone({
|
|
100
|
+
overrides: {
|
|
101
|
+
model: 'cloned-model'
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// The clone should have the overridden model stored in clientApiModel
|
|
106
|
+
expect(cloned.clientApiModel).toBe('cloned-model');
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('should handle empty string model option', () => {
|
|
110
|
+
const agent = new ProbeAgent({
|
|
111
|
+
model: '',
|
|
112
|
+
path: process.cwd()
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// Empty string is falsy, so it becomes null due to || operator
|
|
116
|
+
expect(agent.clientApiModel).toBeNull();
|
|
117
|
+
});
|
|
118
|
+
});
|