@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,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for bash tool integration with ProbeAgent
|
|
3
|
+
* @module tests/unit/bash-probe-agent-integration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { jest, describe, test, expect, beforeEach } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
// Mock all the heavy dependencies that ProbeAgent uses
|
|
9
|
+
jest.mock('@ai-sdk/anthropic', () => ({}));
|
|
10
|
+
jest.mock('@ai-sdk/openai', () => ({}));
|
|
11
|
+
jest.mock('@ai-sdk/google', () => ({}));
|
|
12
|
+
jest.mock('ai', () => ({
|
|
13
|
+
generateText: jest.fn(),
|
|
14
|
+
tool: jest.fn((config) => ({
|
|
15
|
+
name: config.name,
|
|
16
|
+
description: config.description,
|
|
17
|
+
inputSchema: config.inputSchema,
|
|
18
|
+
execute: config.execute
|
|
19
|
+
}))
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
// Import ProbeAgent
|
|
23
|
+
import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
|
|
24
|
+
|
|
25
|
+
describe('Bash Tool ProbeAgent Integration', () => {
|
|
26
|
+
describe('ProbeAgent Configuration', () => {
|
|
27
|
+
test('should create ProbeAgent with bash disabled by default', () => {
|
|
28
|
+
const agent = new ProbeAgent({
|
|
29
|
+
debug: false
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
expect(agent.enableBash).toBe(false);
|
|
33
|
+
expect(agent.bashConfig).toEqual({});
|
|
34
|
+
expect(agent.toolImplementations.bash).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('should create ProbeAgent with bash enabled', () => {
|
|
38
|
+
const agent = new ProbeAgent({
|
|
39
|
+
enableBash: true,
|
|
40
|
+
debug: false
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
expect(agent.enableBash).toBe(true);
|
|
44
|
+
expect(agent.bashConfig).toEqual({});
|
|
45
|
+
|
|
46
|
+
// Should have bash tool in implementations
|
|
47
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('should create ProbeAgent with custom bash config', () => {
|
|
51
|
+
const bashConfig = {
|
|
52
|
+
allow: ['docker:ps', 'make:help'],
|
|
53
|
+
deny: ['git:push'],
|
|
54
|
+
timeout: 60000,
|
|
55
|
+
workingDirectory: '/test'
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const agent = new ProbeAgent({
|
|
59
|
+
enableBash: true,
|
|
60
|
+
bashConfig: bashConfig,
|
|
61
|
+
debug: false
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
expect(agent.enableBash).toBe(true);
|
|
65
|
+
expect(agent.bashConfig).toEqual(bashConfig);
|
|
66
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('should pass configuration to tools properly', () => {
|
|
70
|
+
const bashConfig = {
|
|
71
|
+
allow: ['custom:command'],
|
|
72
|
+
timeout: 30000
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const agent = new ProbeAgent({
|
|
76
|
+
enableBash: true,
|
|
77
|
+
bashConfig: bashConfig,
|
|
78
|
+
allowedFolders: ['/home/test'],
|
|
79
|
+
debug: false
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
expect(agent.enableBash).toBe(true);
|
|
83
|
+
expect(agent.bashConfig).toEqual(bashConfig);
|
|
84
|
+
expect(agent.allowedFolders).toEqual(['/home/test']);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe('Tool Implementation Availability', () => {
|
|
89
|
+
test('should not have bash tool when disabled', () => {
|
|
90
|
+
const agent = new ProbeAgent({
|
|
91
|
+
enableBash: false,
|
|
92
|
+
debug: false
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
expect(agent.toolImplementations.bash).toBeUndefined();
|
|
96
|
+
|
|
97
|
+
// Should have other tools
|
|
98
|
+
expect(agent.toolImplementations.search).toBeDefined();
|
|
99
|
+
expect(agent.toolImplementations.query).toBeDefined();
|
|
100
|
+
expect(agent.toolImplementations.extract).toBeDefined();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('should have bash tool when enabled', () => {
|
|
104
|
+
const agent = new ProbeAgent({
|
|
105
|
+
enableBash: true,
|
|
106
|
+
debug: false
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
110
|
+
|
|
111
|
+
// Should also have other tools
|
|
112
|
+
expect(agent.toolImplementations.search).toBeDefined();
|
|
113
|
+
expect(agent.toolImplementations.query).toBeDefined();
|
|
114
|
+
expect(agent.toolImplementations.extract).toBeDefined();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('should have executable bash tool', () => {
|
|
118
|
+
const agent = new ProbeAgent({
|
|
119
|
+
enableBash: true,
|
|
120
|
+
debug: false
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const bashTool = agent.toolImplementations.bash;
|
|
124
|
+
expect(bashTool).toBeDefined();
|
|
125
|
+
expect(typeof bashTool.execute).toBe('function');
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
describe('Configuration Edge Cases', () => {
|
|
130
|
+
test('should handle empty bash config', () => {
|
|
131
|
+
const agent = new ProbeAgent({
|
|
132
|
+
enableBash: true,
|
|
133
|
+
bashConfig: {},
|
|
134
|
+
debug: false
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
expect(agent.enableBash).toBe(true);
|
|
138
|
+
expect(agent.bashConfig).toEqual({});
|
|
139
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test('should handle null bash config', () => {
|
|
143
|
+
const agent = new ProbeAgent({
|
|
144
|
+
enableBash: true,
|
|
145
|
+
bashConfig: null,
|
|
146
|
+
debug: false
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
expect(agent.enableBash).toBe(true);
|
|
150
|
+
expect(agent.bashConfig).toEqual({});
|
|
151
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test('should handle undefined bash config', () => {
|
|
155
|
+
const agent = new ProbeAgent({
|
|
156
|
+
enableBash: true,
|
|
157
|
+
debug: false
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
expect(agent.enableBash).toBe(true);
|
|
161
|
+
expect(agent.bashConfig).toEqual({});
|
|
162
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test('should handle complex bash configuration', () => {
|
|
166
|
+
const complexConfig = {
|
|
167
|
+
allow: ['docker:*', 'npm:run:*', 'make:*'],
|
|
168
|
+
deny: ['docker:rm:*', 'npm:install:*'],
|
|
169
|
+
disableDefaultAllow: false,
|
|
170
|
+
disableDefaultDeny: false,
|
|
171
|
+
timeout: 120000,
|
|
172
|
+
workingDirectory: '/app',
|
|
173
|
+
env: {
|
|
174
|
+
NODE_ENV: 'test',
|
|
175
|
+
DEBUG: '1'
|
|
176
|
+
},
|
|
177
|
+
maxBuffer: 10 * 1024 * 1024
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const agent = new ProbeAgent({
|
|
181
|
+
enableBash: true,
|
|
182
|
+
bashConfig: complexConfig,
|
|
183
|
+
debug: false
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
expect(agent.bashConfig).toEqual(complexConfig);
|
|
187
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
describe('Working Directory Integration', () => {
|
|
192
|
+
test('should use allowedFolders as default working directory', () => {
|
|
193
|
+
const agent = new ProbeAgent({
|
|
194
|
+
enableBash: true,
|
|
195
|
+
allowedFolders: ['/project', '/tmp'],
|
|
196
|
+
debug: false
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
expect(agent.allowedFolders).toEqual(['/project', '/tmp']);
|
|
200
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test('should handle empty allowedFolders', () => {
|
|
204
|
+
const agent = new ProbeAgent({
|
|
205
|
+
enableBash: true,
|
|
206
|
+
allowedFolders: [],
|
|
207
|
+
debug: false
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
expect(agent.allowedFolders).toEqual([]);
|
|
211
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test('should use path parameter as allowedFolders', () => {
|
|
215
|
+
const agent = new ProbeAgent({
|
|
216
|
+
enableBash: true,
|
|
217
|
+
path: '/single/path',
|
|
218
|
+
debug: false
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
expect(agent.allowedFolders).toEqual(['/single/path']);
|
|
222
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
describe('Debug Mode Integration', () => {
|
|
227
|
+
test('should pass debug flag to bash configuration', () => {
|
|
228
|
+
const agent = new ProbeAgent({
|
|
229
|
+
enableBash: true,
|
|
230
|
+
debug: true
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
expect(agent.debug).toBe(true);
|
|
234
|
+
expect(agent.enableBash).toBe(true);
|
|
235
|
+
expect(agent.toolImplementations.bash).toBeDefined();
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
test('should respect process.env.DEBUG', () => {
|
|
239
|
+
const originalDebug = process.env.DEBUG;
|
|
240
|
+
process.env.DEBUG = '1';
|
|
241
|
+
|
|
242
|
+
const agent = new ProbeAgent({
|
|
243
|
+
enableBash: true
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
expect(agent.debug).toBe(true);
|
|
247
|
+
expect(agent.enableBash).toBe(true);
|
|
248
|
+
|
|
249
|
+
// Restore original value
|
|
250
|
+
if (originalDebug !== undefined) {
|
|
251
|
+
process.env.DEBUG = originalDebug;
|
|
252
|
+
} else {
|
|
253
|
+
delete process.env.DEBUG;
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
describe('Bash Tool Configuration Parsing', () => {
|
|
260
|
+
// These tests simulate what the CLI would do when parsing arguments
|
|
261
|
+
describe('CLI-style Configuration Processing', () => {
|
|
262
|
+
test('should parse comma-separated allow patterns', () => {
|
|
263
|
+
const allowPatterns = 'docker:ps,docker:images,npm:list';
|
|
264
|
+
const parsedPatterns = allowPatterns.split(',').map(p => p.trim()).filter(p => p.length > 0);
|
|
265
|
+
|
|
266
|
+
expect(parsedPatterns).toEqual(['docker:ps', 'docker:images', 'npm:list']);
|
|
267
|
+
|
|
268
|
+
const agent = new ProbeAgent({
|
|
269
|
+
enableBash: true,
|
|
270
|
+
bashConfig: {
|
|
271
|
+
allow: parsedPatterns
|
|
272
|
+
},
|
|
273
|
+
debug: false
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
expect(agent.bashConfig.allow).toEqual(parsedPatterns);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
test('should parse comma-separated deny patterns', () => {
|
|
280
|
+
const denyPatterns = 'rm:*,sudo:*,chmod:777';
|
|
281
|
+
const parsedPatterns = denyPatterns.split(',').map(p => p.trim()).filter(p => p.length > 0);
|
|
282
|
+
|
|
283
|
+
expect(parsedPatterns).toEqual(['rm:*', 'sudo:*', 'chmod:777']);
|
|
284
|
+
|
|
285
|
+
const agent = new ProbeAgent({
|
|
286
|
+
enableBash: true,
|
|
287
|
+
bashConfig: {
|
|
288
|
+
deny: parsedPatterns
|
|
289
|
+
},
|
|
290
|
+
debug: false
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
expect(agent.bashConfig.deny).toEqual(parsedPatterns);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
test('should handle empty patterns gracefully', () => {
|
|
297
|
+
const allowPatterns = '';
|
|
298
|
+
const parsedPatterns = allowPatterns.split(',').map(p => p.trim()).filter(p => p.length > 0);
|
|
299
|
+
|
|
300
|
+
expect(parsedPatterns).toEqual([]);
|
|
301
|
+
|
|
302
|
+
const agent = new ProbeAgent({
|
|
303
|
+
enableBash: true,
|
|
304
|
+
bashConfig: {
|
|
305
|
+
allow: parsedPatterns.length > 0 ? parsedPatterns : undefined
|
|
306
|
+
},
|
|
307
|
+
debug: false
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
expect(agent.bashConfig.allow).toBeUndefined();
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
test('should handle patterns with extra whitespace', () => {
|
|
314
|
+
const allowPatterns = ' docker:ps , npm:list , git:status ';
|
|
315
|
+
const parsedPatterns = allowPatterns.split(',').map(p => p.trim()).filter(p => p.length > 0);
|
|
316
|
+
|
|
317
|
+
expect(parsedPatterns).toEqual(['docker:ps', 'npm:list', 'git:status']);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
test('should parse timeout values', () => {
|
|
321
|
+
const timeoutString = '60000';
|
|
322
|
+
const timeout = parseInt(timeoutString, 10);
|
|
323
|
+
|
|
324
|
+
expect(timeout).toBe(60000);
|
|
325
|
+
expect(isNaN(timeout)).toBe(false);
|
|
326
|
+
|
|
327
|
+
const agent = new ProbeAgent({
|
|
328
|
+
enableBash: true,
|
|
329
|
+
bashConfig: {
|
|
330
|
+
timeout: timeout
|
|
331
|
+
},
|
|
332
|
+
debug: false
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
expect(agent.bashConfig.timeout).toBe(60000);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
test('should handle invalid timeout values', () => {
|
|
339
|
+
const timeoutString = 'invalid';
|
|
340
|
+
const timeout = parseInt(timeoutString, 10);
|
|
341
|
+
|
|
342
|
+
expect(isNaN(timeout)).toBe(true);
|
|
343
|
+
|
|
344
|
+
// In real CLI, this would cause an error before ProbeAgent creation
|
|
345
|
+
// Here we just test that ProbeAgent doesn't break with invalid values
|
|
346
|
+
const agent = new ProbeAgent({
|
|
347
|
+
enableBash: true,
|
|
348
|
+
bashConfig: {
|
|
349
|
+
timeout: isNaN(timeout) ? undefined : timeout
|
|
350
|
+
},
|
|
351
|
+
debug: false
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
expect(agent.bashConfig.timeout).toBeUndefined();
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
test('should handle disable flags', () => {
|
|
358
|
+
// Simulating --no-default-bash-allow and --no-default-bash-deny
|
|
359
|
+
const defaultBashAllow = false;
|
|
360
|
+
const defaultBashDeny = false;
|
|
361
|
+
|
|
362
|
+
const agent = new ProbeAgent({
|
|
363
|
+
enableBash: true,
|
|
364
|
+
bashConfig: {
|
|
365
|
+
disableDefaultAllow: defaultBashAllow === false,
|
|
366
|
+
disableDefaultDeny: defaultBashDeny === false
|
|
367
|
+
},
|
|
368
|
+
debug: false
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
expect(agent.bashConfig.disableDefaultAllow).toBe(true);
|
|
372
|
+
expect(agent.bashConfig.disableDefaultDeny).toBe(true);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
describe('Environment Variable Integration', () => {
|
|
377
|
+
test('should not interfere with existing environment handling', () => {
|
|
378
|
+
const agent = new ProbeAgent({
|
|
379
|
+
enableBash: true,
|
|
380
|
+
debug: false
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
// Should still have basic functionality
|
|
384
|
+
expect(agent.sessionId).toBeTruthy();
|
|
385
|
+
expect(typeof agent.sessionId).toBe('string');
|
|
386
|
+
expect(agent.toolImplementations).toBeDefined();
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
});
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for simplified bash tool (rejects complex commands for security)
|
|
3
|
+
* @module tests/unit/bash-simple-commands
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { jest, describe, test, expect, beforeEach } from '@jest/globals';
|
|
7
|
+
import { parseSimpleCommand, parseCommand, parseCommandForExecution, isComplexCommand } from '../../src/agent/bashCommandUtils.js';
|
|
8
|
+
import { BashPermissionChecker } from '../../src/agent/bashPermissions.js';
|
|
9
|
+
|
|
10
|
+
// Mock the 'ai' package since it may not be available in test environment
|
|
11
|
+
jest.mock('ai', () => ({
|
|
12
|
+
tool: jest.fn((config) => ({
|
|
13
|
+
name: config.name,
|
|
14
|
+
description: config.description,
|
|
15
|
+
inputSchema: config.inputSchema,
|
|
16
|
+
execute: config.execute
|
|
17
|
+
}))
|
|
18
|
+
}));
|
|
19
|
+
|
|
20
|
+
import { bashTool } from '../../src/tools/bash.js';
|
|
21
|
+
|
|
22
|
+
describe('Simple Command Parser', () => {
|
|
23
|
+
describe('parseSimpleCommand', () => {
|
|
24
|
+
test('should parse simple commands correctly', () => {
|
|
25
|
+
const result = parseSimpleCommand('ls -la');
|
|
26
|
+
expect(result.success).toBe(true);
|
|
27
|
+
expect(result.command).toBe('ls');
|
|
28
|
+
expect(result.args).toEqual(['-la']);
|
|
29
|
+
expect(result.isComplex).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('should handle quoted arguments correctly (fix quote bug)', () => {
|
|
33
|
+
const result = parseSimpleCommand('grep "test file" *.txt');
|
|
34
|
+
expect(result.success).toBe(true);
|
|
35
|
+
expect(result.command).toBe('grep');
|
|
36
|
+
expect(result.args).toEqual(['test file', '*.txt']); // Quotes stripped!
|
|
37
|
+
expect(result.fullArgs).toEqual(['grep', 'test file', '*.txt']);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('should handle single quotes correctly', () => {
|
|
41
|
+
const result = parseSimpleCommand("echo 'hello world'");
|
|
42
|
+
expect(result.success).toBe(true);
|
|
43
|
+
expect(result.command).toBe('echo');
|
|
44
|
+
expect(result.args).toEqual(['hello world']); // Single quotes stripped!
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('should handle mixed quotes', () => {
|
|
48
|
+
const result = parseSimpleCommand('git commit -m "Fixed bug" --author="John Doe"');
|
|
49
|
+
expect(result.success).toBe(true);
|
|
50
|
+
expect(result.command).toBe('git');
|
|
51
|
+
expect(result.args).toEqual(['commit', '-m', 'Fixed bug', '--author=John Doe']);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('should reject commands with unclosed quotes', () => {
|
|
55
|
+
const result = parseSimpleCommand('echo "unclosed quote');
|
|
56
|
+
expect(result.success).toBe(false);
|
|
57
|
+
expect(result.error).toContain('Unclosed quote');
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('should reject empty commands', () => {
|
|
61
|
+
const result = parseSimpleCommand('');
|
|
62
|
+
expect(result.success).toBe(false);
|
|
63
|
+
expect(result.error).toContain('empty');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('should reject null/undefined commands', () => {
|
|
67
|
+
expect(parseSimpleCommand(null).success).toBe(false);
|
|
68
|
+
expect(parseSimpleCommand(undefined).success).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('Complex Command Detection', () => {
|
|
73
|
+
test('should detect pipes as complex', () => {
|
|
74
|
+
expect(isComplexCommand('ls | grep test')).toBe(true);
|
|
75
|
+
const result = parseSimpleCommand('ls | grep test');
|
|
76
|
+
expect(result.success).toBe(false);
|
|
77
|
+
expect(result.isComplex).toBe(true);
|
|
78
|
+
expect(result.error).toContain('Complex shell commands');
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('should detect logical operators as complex', () => {
|
|
82
|
+
expect(isComplexCommand('make && make test')).toBe(true);
|
|
83
|
+
expect(isComplexCommand('make || echo failed')).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('should detect command substitution as complex', () => {
|
|
87
|
+
expect(isComplexCommand('echo $(date)')).toBe(true);
|
|
88
|
+
expect(isComplexCommand('ls `pwd`')).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('should detect redirections as complex', () => {
|
|
92
|
+
expect(isComplexCommand('ls > output.txt')).toBe(true);
|
|
93
|
+
expect(isComplexCommand('cat < input.txt')).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('should detect background execution as complex', () => {
|
|
97
|
+
expect(isComplexCommand('long-task &')).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test('should detect command separators as complex', () => {
|
|
101
|
+
expect(isComplexCommand('cd /tmp; ls')).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('should allow simple commands', () => {
|
|
105
|
+
expect(isComplexCommand('ls -la')).toBe(false);
|
|
106
|
+
expect(isComplexCommand('git status')).toBe(false);
|
|
107
|
+
expect(isComplexCommand('npm test')).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
describe('parseCommandForExecution', () => {
|
|
112
|
+
test('should return array for simple commands', () => {
|
|
113
|
+
const result = parseCommandForExecution('ls -la');
|
|
114
|
+
expect(result).toEqual(['ls', '-la']);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('should return null for complex commands', () => {
|
|
118
|
+
const result = parseCommandForExecution('ls | grep test');
|
|
119
|
+
expect(result).toBeNull();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('should handle quotes correctly for execution', () => {
|
|
123
|
+
const result = parseCommandForExecution('grep "test file" data.txt');
|
|
124
|
+
expect(result).toEqual(['grep', 'test file', 'data.txt']);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
describe('Simplified Permission Checker', () => {
|
|
130
|
+
let checker;
|
|
131
|
+
|
|
132
|
+
beforeEach(() => {
|
|
133
|
+
checker = new BashPermissionChecker({
|
|
134
|
+
allow: ['test:*', 'echo:hello'],
|
|
135
|
+
deny: ['rm:*', 'dangerous:cmd'],
|
|
136
|
+
debug: false
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe('Complex Command Rejection', () => {
|
|
141
|
+
test('should reject piped commands', () => {
|
|
142
|
+
const result = checker.check('ls | grep test');
|
|
143
|
+
expect(result.allowed).toBe(false);
|
|
144
|
+
expect(result.reason).toContain('Complex shell commands');
|
|
145
|
+
expect(result.isComplex).toBe(true);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('should reject commands with logical operators', () => {
|
|
149
|
+
const result = checker.check('make && make test');
|
|
150
|
+
expect(result.allowed).toBe(false);
|
|
151
|
+
expect(result.reason).toContain('Complex shell commands');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test('should reject command substitution', () => {
|
|
155
|
+
const result = checker.check('echo $(whoami)');
|
|
156
|
+
expect(result.allowed).toBe(false);
|
|
157
|
+
expect(result.reason).toContain('Complex shell commands');
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test('should reject redirections', () => {
|
|
161
|
+
const result = checker.check('ls > output.txt');
|
|
162
|
+
expect(result.allowed).toBe(false);
|
|
163
|
+
expect(result.reason).toContain('Complex shell commands');
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
describe('Simple Command Processing', () => {
|
|
168
|
+
test('should allow commands matching allow patterns', () => {
|
|
169
|
+
const result = checker.check('test --version');
|
|
170
|
+
expect(result.allowed).toBe(true);
|
|
171
|
+
expect(result.isComplex).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test('should reject commands matching deny patterns', () => {
|
|
175
|
+
const result = checker.check('rm -rf /');
|
|
176
|
+
expect(result.allowed).toBe(false);
|
|
177
|
+
expect(result.reason).toContain('deny pattern');
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test('should handle quoted arguments in pattern matching', () => {
|
|
181
|
+
// This tests the quote handling fix
|
|
182
|
+
const result = checker.check('echo "hello"');
|
|
183
|
+
expect(result.allowed).toBe(true); // Should match echo:hello pattern
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
test('should reject commands with no matching allow pattern', () => {
|
|
187
|
+
const result = checker.check('unknown-command');
|
|
188
|
+
expect(result.allowed).toBe(false);
|
|
189
|
+
expect(result.reason).toContain('Command not in allow list');
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
describe('Configuration', () => {
|
|
194
|
+
test('should work with empty allow list (allows everything not denied)', () => {
|
|
195
|
+
const permissiveChecker = new BashPermissionChecker({
|
|
196
|
+
allow: [], // Empty allow list
|
|
197
|
+
deny: ['rm:*'],
|
|
198
|
+
disableDefaultAllow: true,
|
|
199
|
+
disableDefaultDeny: true
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const allowed = permissiveChecker.check('any-command');
|
|
203
|
+
expect(allowed.allowed).toBe(true);
|
|
204
|
+
|
|
205
|
+
const denied = permissiveChecker.check('rm -rf');
|
|
206
|
+
expect(denied.allowed).toBe(false);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test('should provide configuration summary', () => {
|
|
210
|
+
const config = checker.getConfig();
|
|
211
|
+
expect(config).toHaveProperty('allowPatterns');
|
|
212
|
+
expect(config).toHaveProperty('denyPatterns');
|
|
213
|
+
expect(config).toHaveProperty('totalPatterns');
|
|
214
|
+
expect(typeof config.allowPatterns).toBe('number');
|
|
215
|
+
expect(typeof config.denyPatterns).toBe('number');
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
describe('Bash Tool Integration with Simplified Architecture', () => {
|
|
221
|
+
test('should create bash tool with working configuration', () => {
|
|
222
|
+
const tool = bashTool({
|
|
223
|
+
enableBash: true,
|
|
224
|
+
bashConfig: {
|
|
225
|
+
allow: ['ls:*', 'echo:*'],
|
|
226
|
+
deny: ['rm:*'],
|
|
227
|
+
timeout: 30000
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
expect(tool.name).toBe('bash');
|
|
232
|
+
expect(tool.description).toContain('Execute bash commands');
|
|
233
|
+
expect(typeof tool.execute).toBe('function');
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test('should reject complex commands in tool execution', async () => {
|
|
237
|
+
const tool = bashTool({
|
|
238
|
+
enableBash: true,
|
|
239
|
+
bashConfig: { allow: ['ls:*'], deny: [] }
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
const result = await tool.execute({ command: 'ls | grep test' });
|
|
243
|
+
expect(result).toContain('Permission denied');
|
|
244
|
+
expect(result).toContain('Complex shell commands');
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test('should handle simple commands in tool', async () => {
|
|
248
|
+
const tool = bashTool({
|
|
249
|
+
enableBash: true,
|
|
250
|
+
bashConfig: {
|
|
251
|
+
allow: ['echo:*'],
|
|
252
|
+
deny: [],
|
|
253
|
+
disableDefaultAllow: true,
|
|
254
|
+
disableDefaultDeny: true
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// This should not throw during permission check
|
|
259
|
+
// (actual execution might fail without proper environment, but permissions should pass)
|
|
260
|
+
let permissionError = null;
|
|
261
|
+
try {
|
|
262
|
+
await tool.execute({ command: 'echo hello' });
|
|
263
|
+
} catch (error) {
|
|
264
|
+
if (error.message.includes('Permission denied')) {
|
|
265
|
+
permissionError = error;
|
|
266
|
+
}
|
|
267
|
+
// Other execution errors (like missing environment) are expected in tests
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
expect(permissionError).toBeNull();
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
describe('Architecture Alignment Tests', () => {
|
|
275
|
+
test('should ensure parser and executor handle same command format', () => {
|
|
276
|
+
const testCommands = [
|
|
277
|
+
'ls -la',
|
|
278
|
+
'git status',
|
|
279
|
+
'echo "hello world"',
|
|
280
|
+
'npm test',
|
|
281
|
+
'docker ps',
|
|
282
|
+
'make clean'
|
|
283
|
+
];
|
|
284
|
+
|
|
285
|
+
for (const command of testCommands) {
|
|
286
|
+
const parserResult = parseCommandForExecution(command);
|
|
287
|
+
const permissionResult = parseCommand(command);
|
|
288
|
+
|
|
289
|
+
// Both should succeed for simple commands
|
|
290
|
+
expect(parserResult).not.toBeNull();
|
|
291
|
+
expect(permissionResult.error).toBeNull();
|
|
292
|
+
|
|
293
|
+
// Both should parse to same basic structure
|
|
294
|
+
expect(parserResult[0]).toBe(permissionResult.command);
|
|
295
|
+
expect(parserResult.slice(1)).toEqual(permissionResult.args);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
test('should ensure complex commands are consistently rejected', () => {
|
|
300
|
+
const complexCommands = [
|
|
301
|
+
'ls | grep test',
|
|
302
|
+
'make && make test',
|
|
303
|
+
'echo $(date)',
|
|
304
|
+
'ls > output.txt',
|
|
305
|
+
'cmd1 ; cmd2',
|
|
306
|
+
'background-task &'
|
|
307
|
+
];
|
|
308
|
+
|
|
309
|
+
for (const command of complexCommands) {
|
|
310
|
+
const parserResult = parseCommandForExecution(command);
|
|
311
|
+
const isComplex = isComplexCommand(command);
|
|
312
|
+
|
|
313
|
+
// Parser should reject complex commands
|
|
314
|
+
expect(parserResult).toBeNull();
|
|
315
|
+
expect(isComplex).toBe(true);
|
|
316
|
+
|
|
317
|
+
// Permission checker should also reject
|
|
318
|
+
const checker = new BashPermissionChecker({ allow: ['*'], deny: [] });
|
|
319
|
+
const permissionResult = checker.check(command);
|
|
320
|
+
expect(permissionResult.allowed).toBe(false);
|
|
321
|
+
expect(permissionResult.reason).toContain('Complex shell commands');
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
});
|