@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,491 @@
|
|
|
1
|
+
// Import tool generators and instances from @probelabs/probe package
|
|
2
|
+
import {
|
|
3
|
+
searchTool,
|
|
4
|
+
queryTool,
|
|
5
|
+
extractTool,
|
|
6
|
+
DEFAULT_SYSTEM_MESSAGE,
|
|
7
|
+
listFilesToolInstance as packageListFilesToolInstance,
|
|
8
|
+
searchFilesToolInstance as packageSearchFilesToolInstance
|
|
9
|
+
} from '@probelabs/probe';
|
|
10
|
+
import { spawn } from 'child_process';
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
|
|
14
|
+
// Import the new pluggable implementation tool
|
|
15
|
+
import { createImplementTool } from './implement/core/ImplementTool.js';
|
|
16
|
+
|
|
17
|
+
// Create an event emitter for tool calls
|
|
18
|
+
export const toolCallEmitter = new EventEmitter();
|
|
19
|
+
|
|
20
|
+
// Map to track active tool executions by session ID
|
|
21
|
+
const activeToolExecutions = new Map();
|
|
22
|
+
|
|
23
|
+
// Function to check if a session has been cancelled
|
|
24
|
+
export function isSessionCancelled(sessionId) {
|
|
25
|
+
return activeToolExecutions.get(sessionId)?.cancelled || false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Function to cancel all tool executions for a session
|
|
29
|
+
export function cancelToolExecutions(sessionId) {
|
|
30
|
+
// Only log if not in non-interactive mode or if in debug mode
|
|
31
|
+
if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
|
|
32
|
+
console.log(`Cancelling tool executions for session: ${sessionId}`);
|
|
33
|
+
}
|
|
34
|
+
const sessionData = activeToolExecutions.get(sessionId);
|
|
35
|
+
if (sessionData) {
|
|
36
|
+
sessionData.cancelled = true;
|
|
37
|
+
// Only log if not in non-interactive mode or if in debug mode
|
|
38
|
+
if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
|
|
39
|
+
console.log(`Session ${sessionId} marked as cancelled`);
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Function to register a new tool execution
|
|
47
|
+
function registerToolExecution(sessionId) {
|
|
48
|
+
if (!sessionId) return;
|
|
49
|
+
|
|
50
|
+
if (!activeToolExecutions.has(sessionId)) {
|
|
51
|
+
activeToolExecutions.set(sessionId, { cancelled: false });
|
|
52
|
+
} else {
|
|
53
|
+
// Reset cancelled flag if session already exists for a new execution
|
|
54
|
+
activeToolExecutions.get(sessionId).cancelled = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Function to clear tool execution data for a session
|
|
59
|
+
export function clearToolExecutionData(sessionId) {
|
|
60
|
+
if (!sessionId) return;
|
|
61
|
+
|
|
62
|
+
if (activeToolExecutions.has(sessionId)) {
|
|
63
|
+
activeToolExecutions.delete(sessionId);
|
|
64
|
+
// Only log if not in non-interactive mode or if in debug mode
|
|
65
|
+
if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
|
|
66
|
+
console.log(`Cleared tool execution data for session: ${sessionId}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Generate a default session ID (less relevant now, session is managed per-chat)
|
|
72
|
+
const defaultSessionId = randomUUID();
|
|
73
|
+
// Only log session ID in debug mode
|
|
74
|
+
if (process.env.DEBUG_CHAT === '1') {
|
|
75
|
+
console.log(`Generated default session ID (probeTool.js): ${defaultSessionId}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Create configured tools with the session ID
|
|
79
|
+
// Note: These configOptions are less critical now as sessionId is passed explicitly
|
|
80
|
+
const configOptions = {
|
|
81
|
+
sessionId: defaultSessionId,
|
|
82
|
+
debug: process.env.DEBUG_CHAT === '1'
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Helper function to truncate long argument values for logging
|
|
86
|
+
function truncateArgValue(value, maxLength = 200) {
|
|
87
|
+
if (typeof value !== 'string') {
|
|
88
|
+
value = JSON.stringify(value);
|
|
89
|
+
}
|
|
90
|
+
if (value.length <= maxLength * 2) {
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
// Show first 200 and last 200 characters
|
|
94
|
+
return `${value.substring(0, maxLength)}...${value.substring(value.length - maxLength)}`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Helper function to format tool arguments for debug logging
|
|
98
|
+
function formatToolArgs(args) {
|
|
99
|
+
const formatted = {};
|
|
100
|
+
for (const [key, value] of Object.entries(args)) {
|
|
101
|
+
formatted[key] = truncateArgValue(value);
|
|
102
|
+
}
|
|
103
|
+
return formatted;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Create the base tools using the imported generators
|
|
107
|
+
const baseSearchTool = searchTool(configOptions);
|
|
108
|
+
const baseQueryTool = queryTool(configOptions);
|
|
109
|
+
const baseExtractTool = extractTool(configOptions);
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
// Wrap the tools to emit events and handle cancellation
|
|
113
|
+
const wrapToolWithEmitter = (tool, toolName, baseExecute) => {
|
|
114
|
+
return {
|
|
115
|
+
...tool, // Spread schema, description etc.
|
|
116
|
+
execute: async (params) => { // The execute function now receives parsed params
|
|
117
|
+
const debug = process.env.DEBUG_CHAT === '1';
|
|
118
|
+
// Get the session ID from params (passed down from probeChat.js)
|
|
119
|
+
const toolSessionId = params.sessionId || defaultSessionId; // Fallback, but should always have sessionId
|
|
120
|
+
|
|
121
|
+
if (debug) {
|
|
122
|
+
console.log(`\n[DEBUG] ========================================`);
|
|
123
|
+
console.log(`[DEBUG] Tool Call: ${toolName}`);
|
|
124
|
+
console.log(`[DEBUG] Session: ${toolSessionId}`);
|
|
125
|
+
console.log(`[DEBUG] Arguments:`);
|
|
126
|
+
const formattedArgs = formatToolArgs(params);
|
|
127
|
+
for (const [key, value] of Object.entries(formattedArgs)) {
|
|
128
|
+
console.log(`[DEBUG] ${key}: ${value}`);
|
|
129
|
+
}
|
|
130
|
+
console.log(`[DEBUG] ========================================\n`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Register this tool execution (and reset cancel flag if needed)
|
|
134
|
+
registerToolExecution(toolSessionId);
|
|
135
|
+
|
|
136
|
+
// Check if this session has been cancelled *before* execution
|
|
137
|
+
if (isSessionCancelled(toolSessionId)) {
|
|
138
|
+
// Only log if not in non-interactive mode or if in debug mode
|
|
139
|
+
console.error(`Tool execution cancelled BEFORE starting for session ${toolSessionId}`);
|
|
140
|
+
throw new Error(`Tool execution cancelled for session ${toolSessionId}`);
|
|
141
|
+
}
|
|
142
|
+
// Only log if not in non-interactive mode or if in debug mode
|
|
143
|
+
console.error(`Executing ${toolName} for session ${toolSessionId}`); // Simplified log
|
|
144
|
+
|
|
145
|
+
// Remove sessionId from params before passing to base tool if it expects only schema params
|
|
146
|
+
const { sessionId, ...toolParams } = params;
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
// Emit a tool call start event
|
|
150
|
+
const toolCallStartData = {
|
|
151
|
+
timestamp: new Date().toISOString(),
|
|
152
|
+
name: toolName,
|
|
153
|
+
args: toolParams, // Log schema params
|
|
154
|
+
status: 'started'
|
|
155
|
+
};
|
|
156
|
+
if (debug) {
|
|
157
|
+
console.log(`[DEBUG] probeTool: Emitting toolCallStart:${toolSessionId}`);
|
|
158
|
+
}
|
|
159
|
+
toolCallEmitter.emit(`toolCall:${toolSessionId}`, toolCallStartData);
|
|
160
|
+
|
|
161
|
+
// Execute the original tool's execute function with schema params
|
|
162
|
+
// Use a promise-based approach with cancellation check
|
|
163
|
+
let result = null;
|
|
164
|
+
let executionError = null;
|
|
165
|
+
|
|
166
|
+
const executionPromise = baseExecute(toolParams).catch(err => {
|
|
167
|
+
executionError = err; // Capture error
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const checkInterval = 50; // Check every 50ms
|
|
171
|
+
while (result === null && executionError === null) {
|
|
172
|
+
if (isSessionCancelled(toolSessionId)) {
|
|
173
|
+
console.error(`Tool execution cancelled DURING execution for session ${toolSessionId}`);
|
|
174
|
+
// Attempt to signal cancellation if the underlying tool supports it (future enhancement)
|
|
175
|
+
// For now, just throw the cancellation error
|
|
176
|
+
throw new Error(`Tool execution cancelled for session ${toolSessionId}`);
|
|
177
|
+
}
|
|
178
|
+
// Check if promise is resolved or rejected
|
|
179
|
+
const status = await Promise.race([
|
|
180
|
+
executionPromise.then(() => 'resolved').catch(() => 'rejected'),
|
|
181
|
+
new Promise(resolve => setTimeout(() => resolve('pending'), checkInterval))
|
|
182
|
+
]);
|
|
183
|
+
|
|
184
|
+
if (status === 'resolved') {
|
|
185
|
+
result = await executionPromise; // Get the result
|
|
186
|
+
} else if (status === 'rejected') {
|
|
187
|
+
// Error already captured by the catch block on executionPromise
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
// If 'pending', continue loop
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// If loop exited due to error
|
|
194
|
+
if (executionError) {
|
|
195
|
+
throw executionError;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// If loop exited due to cancellation within the loop
|
|
199
|
+
if (isSessionCancelled(toolSessionId)) {
|
|
200
|
+
// Only log if not in non-interactive mode or if in debug mode
|
|
201
|
+
if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
|
|
202
|
+
console.log(`Tool execution finished but session was cancelled for ${toolSessionId}`);
|
|
203
|
+
}
|
|
204
|
+
throw new Error(`Tool execution cancelled for session ${toolSessionId}`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
// Emit the tool call completion event
|
|
209
|
+
const toolCallData = {
|
|
210
|
+
timestamp: new Date().toISOString(),
|
|
211
|
+
name: toolName,
|
|
212
|
+
args: toolParams,
|
|
213
|
+
// Safely preview result
|
|
214
|
+
resultPreview: typeof result === 'string'
|
|
215
|
+
? (result.length > 200 ? result.substring(0, 200) + '...' : result)
|
|
216
|
+
: (result ? JSON.stringify(result).substring(0, 200) + '...' : 'No Result'),
|
|
217
|
+
status: 'completed'
|
|
218
|
+
};
|
|
219
|
+
if (debug) {
|
|
220
|
+
console.log(`[DEBUG] probeTool: Emitting toolCall:${toolSessionId} (completed)`);
|
|
221
|
+
}
|
|
222
|
+
toolCallEmitter.emit(`toolCall:${toolSessionId}`, toolCallData);
|
|
223
|
+
|
|
224
|
+
return result;
|
|
225
|
+
} catch (error) {
|
|
226
|
+
// If it's a cancellation error, re-throw it directly
|
|
227
|
+
if (error.message.includes('cancelled for session')) {
|
|
228
|
+
// Only log if not in non-interactive mode or if in debug mode
|
|
229
|
+
if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
|
|
230
|
+
console.log(`Caught cancellation error for ${toolName} in session ${toolSessionId}`);
|
|
231
|
+
}
|
|
232
|
+
// Emit cancellation event? Or let the caller handle it? Let caller handle.
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Handle other execution errors
|
|
237
|
+
if (debug) {
|
|
238
|
+
console.error(`[DEBUG] probeTool: Error executing ${toolName}:`, error);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Emit a tool call error event
|
|
242
|
+
const toolCallErrorData = {
|
|
243
|
+
timestamp: new Date().toISOString(),
|
|
244
|
+
name: toolName,
|
|
245
|
+
args: toolParams,
|
|
246
|
+
error: error.message || 'Unknown error',
|
|
247
|
+
status: 'error'
|
|
248
|
+
};
|
|
249
|
+
if (debug) {
|
|
250
|
+
console.log(`[DEBUG] probeTool: Emitting toolCall:${toolSessionId} (error)`);
|
|
251
|
+
}
|
|
252
|
+
toolCallEmitter.emit(`toolCall:${toolSessionId}`, toolCallErrorData);
|
|
253
|
+
|
|
254
|
+
throw error; // Re-throw the error to be caught by probeChat.js loop
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
// Create the implement tool using the new pluggable system
|
|
261
|
+
const implementToolConfig = {
|
|
262
|
+
enabled: process.env.ALLOW_EDIT === '1' || process.argv.includes('--allow-edit'),
|
|
263
|
+
backendConfig: {
|
|
264
|
+
// Configuration can be extended here
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const pluggableImplementTool = createImplementTool(implementToolConfig);
|
|
269
|
+
|
|
270
|
+
// Create a compatibility wrapper for the old interface
|
|
271
|
+
const baseImplementTool = {
|
|
272
|
+
name: "implement",
|
|
273
|
+
description: pluggableImplementTool.description,
|
|
274
|
+
inputSchema: pluggableImplementTool.inputSchema,
|
|
275
|
+
execute: async ({ task, autoCommits = false, prompt, sessionId }) => {
|
|
276
|
+
const debug = process.env.DEBUG_CHAT === '1';
|
|
277
|
+
|
|
278
|
+
if (debug) {
|
|
279
|
+
console.log(`[DEBUG] Executing implementation with task: ${task}`);
|
|
280
|
+
console.log(`[DEBUG] Auto-commits: ${autoCommits}`);
|
|
281
|
+
console.log(`[DEBUG] Session ID: ${sessionId}`);
|
|
282
|
+
if (prompt) console.log(`[DEBUG] Custom prompt: ${prompt}`);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Check if the tool is enabled
|
|
286
|
+
if (!implementToolConfig.enabled) {
|
|
287
|
+
return {
|
|
288
|
+
success: false,
|
|
289
|
+
output: null,
|
|
290
|
+
error: 'Implementation tool is not enabled. Use --allow-edit flag to enable.',
|
|
291
|
+
command: null,
|
|
292
|
+
timestamp: new Date().toISOString(),
|
|
293
|
+
prompt: prompt || task
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
try {
|
|
298
|
+
// Use the new pluggable implementation tool
|
|
299
|
+
const result = await pluggableImplementTool.execute({
|
|
300
|
+
task: prompt || task, // Use prompt if provided, otherwise use task
|
|
301
|
+
autoCommit: autoCommits,
|
|
302
|
+
sessionId: sessionId,
|
|
303
|
+
// Pass through any additional options that might be useful
|
|
304
|
+
context: {
|
|
305
|
+
workingDirectory: process.cwd()
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
// The result is already in the expected format
|
|
310
|
+
return result;
|
|
311
|
+
|
|
312
|
+
} catch (error) {
|
|
313
|
+
// Handle any unexpected errors
|
|
314
|
+
console.error(`Error in implement tool:`, error);
|
|
315
|
+
return {
|
|
316
|
+
success: false,
|
|
317
|
+
output: null,
|
|
318
|
+
error: error.message || 'Unknown error in implementation tool',
|
|
319
|
+
command: null,
|
|
320
|
+
timestamp: new Date().toISOString(),
|
|
321
|
+
prompt: prompt || task
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
// Wrapper for listFiles tool with ALLOWED_FOLDERS security
|
|
328
|
+
const baseListFilesTool = {
|
|
329
|
+
...packageListFilesToolInstance,
|
|
330
|
+
execute: async (params) => {
|
|
331
|
+
const { directory = '.', sessionId } = params;
|
|
332
|
+
const debug = process.env.DEBUG_CHAT === '1';
|
|
333
|
+
const currentWorkingDir = process.cwd();
|
|
334
|
+
|
|
335
|
+
// Get allowed folders from environment variable
|
|
336
|
+
const allowedFoldersEnv = process.env.ALLOWED_FOLDERS;
|
|
337
|
+
let allowedFolders = [];
|
|
338
|
+
|
|
339
|
+
if (allowedFoldersEnv) {
|
|
340
|
+
allowedFolders = allowedFoldersEnv.split(',').map(folder => folder.trim()).filter(folder => folder.length > 0);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Handle default directory behavior when ALLOWED_FOLDERS is set
|
|
344
|
+
let targetDirectory = directory;
|
|
345
|
+
if (allowedFolders.length > 0 && (directory === '.' || directory === './')) {
|
|
346
|
+
// Use the first allowed folder if directory is current directory
|
|
347
|
+
targetDirectory = allowedFolders[0];
|
|
348
|
+
if (debug) {
|
|
349
|
+
console.log(`[DEBUG] Redirecting from '${directory}' to first allowed folder: ${targetDirectory}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
const targetDir = require('path').resolve(currentWorkingDir, targetDirectory);
|
|
354
|
+
|
|
355
|
+
// Validate that the target directory is within allowed folders
|
|
356
|
+
if (allowedFolders.length > 0) {
|
|
357
|
+
const isAllowed = allowedFolders.some(allowedFolder => {
|
|
358
|
+
const resolvedAllowedFolder = require('path').resolve(currentWorkingDir, allowedFolder);
|
|
359
|
+
return targetDir === resolvedAllowedFolder || targetDir.startsWith(resolvedAllowedFolder + require('path').sep);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
if (!isAllowed) {
|
|
363
|
+
const error = `Access denied: Directory '${targetDirectory}' is not within allowed folders: ${allowedFolders.join(', ')}`;
|
|
364
|
+
if (debug) {
|
|
365
|
+
console.log(`[DEBUG] ${error}`);
|
|
366
|
+
}
|
|
367
|
+
return `Error: ${error}`;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Call the package tool with workingDirectory parameter
|
|
372
|
+
return packageListFilesToolInstance.execute({
|
|
373
|
+
...params,
|
|
374
|
+
directory: targetDirectory,
|
|
375
|
+
workingDirectory: currentWorkingDir
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
// Wrapper for searchFiles tool with ALLOWED_FOLDERS security
|
|
381
|
+
const baseSearchFilesTool = {
|
|
382
|
+
...packageSearchFilesToolInstance,
|
|
383
|
+
execute: async (params) => {
|
|
384
|
+
const { pattern, directory = '.', recursive = true, sessionId } = params;
|
|
385
|
+
const debug = process.env.DEBUG_CHAT === '1';
|
|
386
|
+
const currentWorkingDir = process.cwd();
|
|
387
|
+
|
|
388
|
+
// Get allowed folders from environment variable
|
|
389
|
+
const allowedFoldersEnv = process.env.ALLOWED_FOLDERS;
|
|
390
|
+
let allowedFolders = [];
|
|
391
|
+
|
|
392
|
+
if (allowedFoldersEnv) {
|
|
393
|
+
allowedFolders = allowedFoldersEnv.split(',').map(folder => folder.trim()).filter(folder => folder.length > 0);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Handle default directory behavior when ALLOWED_FOLDERS is set
|
|
397
|
+
let targetDirectory = directory;
|
|
398
|
+
if (allowedFolders.length > 0 && (directory === '.' || directory === './')) {
|
|
399
|
+
// Use the first allowed folder if directory is current directory
|
|
400
|
+
targetDirectory = allowedFolders[0];
|
|
401
|
+
if (debug) {
|
|
402
|
+
console.log(`[DEBUG] Redirecting from '${directory}' to first allowed folder: ${targetDirectory}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const targetDir = require('path').resolve(currentWorkingDir, targetDirectory);
|
|
407
|
+
|
|
408
|
+
// Validate that the target directory is within allowed folders
|
|
409
|
+
if (allowedFolders.length > 0) {
|
|
410
|
+
const isAllowed = allowedFolders.some(allowedFolder => {
|
|
411
|
+
const resolvedAllowedFolder = require('path').resolve(currentWorkingDir, allowedFolder);
|
|
412
|
+
return targetDir === resolvedAllowedFolder || targetDir.startsWith(resolvedAllowedFolder + require('path').sep);
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
if (!isAllowed) {
|
|
416
|
+
const error = `Access denied: Directory '${targetDirectory}' is not within allowed folders: ${allowedFolders.join(', ')}`;
|
|
417
|
+
if (debug) {
|
|
418
|
+
console.log(`[DEBUG] ${error}`);
|
|
419
|
+
}
|
|
420
|
+
return {
|
|
421
|
+
success: false,
|
|
422
|
+
directory: targetDir,
|
|
423
|
+
pattern: pattern,
|
|
424
|
+
error: error,
|
|
425
|
+
timestamp: new Date().toISOString()
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Log execution parameters to stderr for visibility
|
|
431
|
+
console.error(`Executing searchFiles with params: pattern="${pattern}", directory="${targetDirectory}", recursive=${recursive}`);
|
|
432
|
+
|
|
433
|
+
try {
|
|
434
|
+
// Call the package tool with workingDirectory parameter
|
|
435
|
+
const files = await packageSearchFilesToolInstance.execute({
|
|
436
|
+
...params,
|
|
437
|
+
directory: targetDirectory,
|
|
438
|
+
recursive,
|
|
439
|
+
workingDirectory: currentWorkingDir
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
if (debug) {
|
|
443
|
+
console.log(`[DEBUG] Found ${files.length} files matching pattern ${pattern}`);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Return in the expected format for backward compatibility
|
|
447
|
+
return {
|
|
448
|
+
success: true,
|
|
449
|
+
directory: targetDir,
|
|
450
|
+
pattern: pattern,
|
|
451
|
+
recursive: recursive,
|
|
452
|
+
files: files.map(file => require('path').join(targetDirectory, file)),
|
|
453
|
+
count: files.length,
|
|
454
|
+
totalMatches: files.length,
|
|
455
|
+
limited: false,
|
|
456
|
+
timestamp: new Date().toISOString()
|
|
457
|
+
};
|
|
458
|
+
} catch (error) {
|
|
459
|
+
console.error(`Error searching files with pattern "${pattern}" in ${targetDir}:`, error);
|
|
460
|
+
return {
|
|
461
|
+
success: false,
|
|
462
|
+
directory: targetDir,
|
|
463
|
+
pattern: pattern,
|
|
464
|
+
error: error.message || 'Unknown error searching files',
|
|
465
|
+
timestamp: new Date().toISOString()
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
// Export the wrapped tool instances
|
|
472
|
+
export const searchToolInstance = wrapToolWithEmitter(baseSearchTool, 'search', baseSearchTool.execute);
|
|
473
|
+
export const queryToolInstance = wrapToolWithEmitter(baseQueryTool, 'query', baseQueryTool.execute);
|
|
474
|
+
export const extractToolInstance = wrapToolWithEmitter(baseExtractTool, 'extract', baseExtractTool.execute);
|
|
475
|
+
export const implementToolInstance = wrapToolWithEmitter(baseImplementTool, 'implement', baseImplementTool.execute);
|
|
476
|
+
export const listFilesToolInstance = wrapToolWithEmitter(baseListFilesTool, 'listFiles', baseListFilesTool.execute);
|
|
477
|
+
export const searchFilesToolInstance = wrapToolWithEmitter(baseSearchFilesTool, 'searchFiles', baseSearchFilesTool.execute);
|
|
478
|
+
|
|
479
|
+
// Log available tools at startup in debug mode
|
|
480
|
+
if (process.env.DEBUG_CHAT === '1') {
|
|
481
|
+
console.log('\n[DEBUG] ========================================');
|
|
482
|
+
console.log('[DEBUG] Probe Tools Loaded:');
|
|
483
|
+
console.log('[DEBUG] - search: Search for code patterns');
|
|
484
|
+
console.log('[DEBUG] - query: Semantic code search');
|
|
485
|
+
console.log('[DEBUG] - extract: Extract code snippets');
|
|
486
|
+
console.log('[DEBUG] - implement: Generate code implementations');
|
|
487
|
+
console.log('[DEBUG] - listFiles: List directory contents');
|
|
488
|
+
console.log('[DEBUG] - searchFiles: Search files by pattern');
|
|
489
|
+
console.log('[DEBUG] ========================================\n');
|
|
490
|
+
}
|
|
491
|
+
|