@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,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server implementation for Probe Agent
|
|
3
|
+
* Provides MCP tools that integrate with the Probe code search capabilities
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
+
import {
|
|
9
|
+
searchToolInstance,
|
|
10
|
+
queryToolInstance,
|
|
11
|
+
extractToolInstance,
|
|
12
|
+
listFilesToolInstance,
|
|
13
|
+
searchFilesToolInstance
|
|
14
|
+
} from './probeTool.js';
|
|
15
|
+
import { ProbeChat } from './probeChat.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Create MCP server for Probe tools
|
|
19
|
+
*/
|
|
20
|
+
export async function createMCPServer(options = {}) {
|
|
21
|
+
const server = new Server(
|
|
22
|
+
{
|
|
23
|
+
name: 'probe-mcp-server',
|
|
24
|
+
version: '1.0.0',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
capabilities: {
|
|
28
|
+
tools: {},
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
// List available tools
|
|
34
|
+
server.setRequestHandler('tools/list', async () => ({
|
|
35
|
+
tools: [
|
|
36
|
+
{
|
|
37
|
+
name: 'probe_search',
|
|
38
|
+
description: 'Search code using keywords or patterns with flexible text search',
|
|
39
|
+
inputSchema: {
|
|
40
|
+
type: 'object',
|
|
41
|
+
properties: {
|
|
42
|
+
query: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
description: 'Search query using elastic search syntax'
|
|
45
|
+
},
|
|
46
|
+
path: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
description: 'Directory to search in (defaults to current working directory)'
|
|
49
|
+
},
|
|
50
|
+
maxTokens: {
|
|
51
|
+
type: 'number',
|
|
52
|
+
description: 'Maximum tokens to return (default: 10000)'
|
|
53
|
+
},
|
|
54
|
+
allowTests: {
|
|
55
|
+
type: 'boolean',
|
|
56
|
+
description: 'Include test files in results (default: false)'
|
|
57
|
+
},
|
|
58
|
+
exact: {
|
|
59
|
+
type: 'boolean',
|
|
60
|
+
description: 'Perform exact search without tokenization'
|
|
61
|
+
},
|
|
62
|
+
language: {
|
|
63
|
+
type: 'string',
|
|
64
|
+
description: 'Limit search to specific programming language'
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
required: ['query']
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'probe_query',
|
|
72
|
+
description: 'Query code using structural AST patterns',
|
|
73
|
+
inputSchema: {
|
|
74
|
+
type: 'object',
|
|
75
|
+
properties: {
|
|
76
|
+
pattern: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
description: 'AST pattern to search for'
|
|
79
|
+
},
|
|
80
|
+
path: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
description: 'Directory to search in'
|
|
83
|
+
},
|
|
84
|
+
language: {
|
|
85
|
+
type: 'string',
|
|
86
|
+
description: 'Programming language'
|
|
87
|
+
},
|
|
88
|
+
allowTests: {
|
|
89
|
+
type: 'boolean',
|
|
90
|
+
description: 'Include test files'
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
required: ['pattern']
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'probe_extract',
|
|
98
|
+
description: 'Extract code blocks from files',
|
|
99
|
+
inputSchema: {
|
|
100
|
+
type: 'object',
|
|
101
|
+
properties: {
|
|
102
|
+
targets: {
|
|
103
|
+
type: 'array',
|
|
104
|
+
items: { type: 'string' },
|
|
105
|
+
description: 'File paths or file:line specifications to extract'
|
|
106
|
+
},
|
|
107
|
+
contextLines: {
|
|
108
|
+
type: 'number',
|
|
109
|
+
description: 'Number of context lines'
|
|
110
|
+
},
|
|
111
|
+
allowTests: {
|
|
112
|
+
type: 'boolean',
|
|
113
|
+
description: 'Allow test files'
|
|
114
|
+
},
|
|
115
|
+
format: {
|
|
116
|
+
type: 'string',
|
|
117
|
+
enum: ['plain', 'markdown', 'json'],
|
|
118
|
+
description: 'Output format'
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
required: ['targets']
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'probe_list_files',
|
|
126
|
+
description: 'List files in a directory',
|
|
127
|
+
inputSchema: {
|
|
128
|
+
type: 'object',
|
|
129
|
+
properties: {
|
|
130
|
+
directory: {
|
|
131
|
+
type: 'string',
|
|
132
|
+
description: 'Directory path to list files from'
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: 'probe_search_files',
|
|
139
|
+
description: 'Search for files using glob patterns',
|
|
140
|
+
inputSchema: {
|
|
141
|
+
type: 'object',
|
|
142
|
+
properties: {
|
|
143
|
+
pattern: {
|
|
144
|
+
type: 'string',
|
|
145
|
+
description: 'Glob pattern to match files'
|
|
146
|
+
},
|
|
147
|
+
directory: {
|
|
148
|
+
type: 'string',
|
|
149
|
+
description: 'Directory to search in'
|
|
150
|
+
},
|
|
151
|
+
recursive: {
|
|
152
|
+
type: 'boolean',
|
|
153
|
+
description: 'Search recursively'
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
required: ['pattern']
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'probe_chat',
|
|
161
|
+
description: 'Ask questions about the codebase using AI agent',
|
|
162
|
+
inputSchema: {
|
|
163
|
+
type: 'object',
|
|
164
|
+
properties: {
|
|
165
|
+
message: {
|
|
166
|
+
type: 'string',
|
|
167
|
+
description: 'Question to ask about the codebase'
|
|
168
|
+
},
|
|
169
|
+
schema: {
|
|
170
|
+
type: 'string',
|
|
171
|
+
description: 'Optional JSON schema for structured output'
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
required: ['message']
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
}));
|
|
179
|
+
|
|
180
|
+
// Handle tool calls
|
|
181
|
+
server.setRequestHandler('tools/call', async (request) => {
|
|
182
|
+
const { name, arguments: args } = request.params;
|
|
183
|
+
|
|
184
|
+
try {
|
|
185
|
+
switch (name) {
|
|
186
|
+
case 'probe_search': {
|
|
187
|
+
const result = await searchToolInstance.execute({
|
|
188
|
+
query: args.query,
|
|
189
|
+
path: args.path,
|
|
190
|
+
allow_tests: args.allowTests,
|
|
191
|
+
exact: args.exact,
|
|
192
|
+
maxTokens: args.maxTokens,
|
|
193
|
+
language: args.language,
|
|
194
|
+
sessionId: options.sessionId || 'mcp-session'
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
content: [
|
|
199
|
+
{
|
|
200
|
+
type: 'text',
|
|
201
|
+
text: typeof result === 'string' ? result : JSON.stringify(result)
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
case 'probe_query': {
|
|
208
|
+
const result = await queryToolInstance.execute({
|
|
209
|
+
pattern: args.pattern,
|
|
210
|
+
path: args.path,
|
|
211
|
+
language: args.language,
|
|
212
|
+
allow_tests: args.allowTests,
|
|
213
|
+
sessionId: options.sessionId || 'mcp-session'
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
return {
|
|
217
|
+
content: [
|
|
218
|
+
{
|
|
219
|
+
type: 'text',
|
|
220
|
+
text: typeof result === 'string' ? result : JSON.stringify(result)
|
|
221
|
+
}
|
|
222
|
+
]
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
case 'probe_extract': {
|
|
227
|
+
const result = await extractToolInstance.execute({
|
|
228
|
+
targets: args.targets,
|
|
229
|
+
context_lines: args.contextLines,
|
|
230
|
+
allow_tests: args.allowTests,
|
|
231
|
+
format: args.format,
|
|
232
|
+
sessionId: options.sessionId || 'mcp-session'
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
return {
|
|
236
|
+
content: [
|
|
237
|
+
{
|
|
238
|
+
type: 'text',
|
|
239
|
+
text: typeof result === 'string' ? result : JSON.stringify(result)
|
|
240
|
+
}
|
|
241
|
+
]
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
case 'probe_list_files': {
|
|
246
|
+
const result = await listFilesToolInstance.execute({
|
|
247
|
+
directory: args.directory,
|
|
248
|
+
sessionId: options.sessionId || 'mcp-session'
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
return {
|
|
252
|
+
content: [
|
|
253
|
+
{
|
|
254
|
+
type: 'text',
|
|
255
|
+
text: typeof result === 'string' ? result : JSON.stringify(result)
|
|
256
|
+
}
|
|
257
|
+
]
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
case 'probe_search_files': {
|
|
262
|
+
const result = await searchFilesToolInstance.execute({
|
|
263
|
+
pattern: args.pattern,
|
|
264
|
+
directory: args.directory,
|
|
265
|
+
recursive: args.recursive,
|
|
266
|
+
sessionId: options.sessionId || 'mcp-session'
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
return {
|
|
270
|
+
content: [
|
|
271
|
+
{
|
|
272
|
+
type: 'text',
|
|
273
|
+
text: typeof result === 'string' ? result : JSON.stringify(result)
|
|
274
|
+
}
|
|
275
|
+
]
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
case 'probe_chat': {
|
|
280
|
+
// Create a ProbeChat instance for AI-powered responses
|
|
281
|
+
const chat = new ProbeChat({
|
|
282
|
+
allowEdit: false,
|
|
283
|
+
debug: options.debug
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
const result = await chat.chat(args.message, {
|
|
287
|
+
schema: args.schema
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
return {
|
|
291
|
+
content: [
|
|
292
|
+
{
|
|
293
|
+
type: 'text',
|
|
294
|
+
text: result
|
|
295
|
+
}
|
|
296
|
+
]
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
default:
|
|
301
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
302
|
+
}
|
|
303
|
+
} catch (error) {
|
|
304
|
+
return {
|
|
305
|
+
content: [
|
|
306
|
+
{
|
|
307
|
+
type: 'text',
|
|
308
|
+
text: `Error executing tool ${name}: ${error.message}`
|
|
309
|
+
}
|
|
310
|
+
],
|
|
311
|
+
isError: true
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
return server;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Start MCP server with stdio transport
|
|
321
|
+
*/
|
|
322
|
+
export async function startMCPServer(options = {}) {
|
|
323
|
+
const server = await createMCPServer(options);
|
|
324
|
+
const transport = new StdioServerTransport();
|
|
325
|
+
|
|
326
|
+
await server.connect(transport);
|
|
327
|
+
|
|
328
|
+
console.error('Probe MCP Server started successfully');
|
|
329
|
+
|
|
330
|
+
return server;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// If running as standalone script
|
|
334
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
335
|
+
startMCPServer({
|
|
336
|
+
debug: process.env.DEBUG === '1'
|
|
337
|
+
}).catch(error => {
|
|
338
|
+
console.error('Failed to start MCP server:', error);
|
|
339
|
+
process.exit(1);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Leonid Bugaev
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
15
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# @probelabs/probe-chat
|
|
2
|
+
|
|
3
|
+
A CLI chat interface for the [probe](https://github.com/probelabs/probe) code search tool.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
### Global Installation (Recommended)
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g @probelabs/probe-chat
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Local Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @probelabs/probe-chat
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Features
|
|
20
|
+
|
|
21
|
+
- **Interactive Chat**: Talk to an AI assistant that can search your codebase
|
|
22
|
+
- **Code Search**: Uses the powerful Probe code search tool under the hood
|
|
23
|
+
- **Multiple LLM Support**: Works with both Anthropic Claude and OpenAI models
|
|
24
|
+
- **AI SDK Integration**: Built on the [Vercel AI SDK](https://sdk.vercel.ai/) for robust AI capabilities
|
|
25
|
+
- **CLI Interface**: Easy-to-use command-line interface
|
|
26
|
+
- **Session Management**: Maintains chat history and provides usage statistics
|
|
27
|
+
- **Customizable**: Configure search folders, models, and more
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
### Command Line Interface
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Basic usage (searches in current directory)
|
|
35
|
+
probe-chat
|
|
36
|
+
|
|
37
|
+
# Search in a specific directory
|
|
38
|
+
probe-chat /path/to/your/project
|
|
39
|
+
|
|
40
|
+
# Enable debug mode
|
|
41
|
+
probe-chat --debug /path/to/your/project
|
|
42
|
+
|
|
43
|
+
# Specify a model to use
|
|
44
|
+
probe-chat --model claude-3-7-sonnet-latest /path/to/your/project
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Environment Variables
|
|
48
|
+
|
|
49
|
+
You can configure the chat using environment variables:
|
|
50
|
+
|
|
51
|
+
- `ANTHROPIC_API_KEY`: Your Anthropic API key
|
|
52
|
+
- `OPENAI_API_KEY`: Your OpenAI API key
|
|
53
|
+
- `MODEL_NAME`: The model to use (e.g., 'claude-3-7-sonnet-latest', 'gpt-4o-2024-05-13')
|
|
54
|
+
- `ALLOWED_FOLDERS`: Comma-separated list of folders to search in
|
|
55
|
+
- `DEBUG`: Set to 'true' to enable debug mode
|
|
56
|
+
- `ANTHROPIC_API_URL`: Custom Anthropic API URL (optional)
|
|
57
|
+
- `OPENAI_API_URL`: Custom OpenAI API URL (optional)
|
|
58
|
+
|
|
59
|
+
### Chat Commands
|
|
60
|
+
|
|
61
|
+
While in the chat, you can use the following commands:
|
|
62
|
+
|
|
63
|
+
- `exit` or `quit`: End the chat session
|
|
64
|
+
- `usage`: Display token usage statistics
|
|
65
|
+
- `clear`: Clear the chat history
|
|
66
|
+
|
|
67
|
+
## Programmatic Usage
|
|
68
|
+
|
|
69
|
+
You can also use the package programmatically in your Node.js applications:
|
|
70
|
+
|
|
71
|
+
```javascript
|
|
72
|
+
import { ProbeChat, tools } from '@probelabs/probe-chat';
|
|
73
|
+
|
|
74
|
+
// Create a new chat instance
|
|
75
|
+
const chat = new ProbeChat({
|
|
76
|
+
debug: true,
|
|
77
|
+
model: 'claude-3-7-sonnet-latest',
|
|
78
|
+
anthropicApiKey: 'your-api-key',
|
|
79
|
+
allowedFolders: ['/path/to/your/project']
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Get a response from the chat
|
|
83
|
+
const response = await chat.chat('How is the authentication implemented in this codebase?');
|
|
84
|
+
console.log(response);
|
|
85
|
+
|
|
86
|
+
// Get token usage statistics
|
|
87
|
+
const usage = chat.getTokenUsage();
|
|
88
|
+
console.log(`Request tokens: ${usage.request}`);
|
|
89
|
+
console.log(`Response tokens: ${usage.response}`);
|
|
90
|
+
console.log(`Total tokens: ${usage.total}`);
|
|
91
|
+
|
|
92
|
+
// Clear the chat history
|
|
93
|
+
chat.clearHistory();
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## API Reference
|
|
97
|
+
|
|
98
|
+
### ProbeChat Class
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
import { ProbeChat } from '@probelabs/probe-chat';
|
|
102
|
+
|
|
103
|
+
// Create a new chat instance
|
|
104
|
+
const chat = new ProbeChat(options);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Constructor Options
|
|
108
|
+
|
|
109
|
+
- `debug`: Enable debug mode (boolean)
|
|
110
|
+
- `model`: Model name to use (string)
|
|
111
|
+
- `anthropicApiKey`: Anthropic API key (string)
|
|
112
|
+
- `openaiApiKey`: OpenAI API key (string)
|
|
113
|
+
- `anthropicApiUrl`: Custom Anthropic API URL (string)
|
|
114
|
+
- `openaiApiUrl`: Custom OpenAI API URL (string)
|
|
115
|
+
- `allowedFolders`: Folders to search in (array of strings)
|
|
116
|
+
|
|
117
|
+
#### Methods
|
|
118
|
+
|
|
119
|
+
- `chat(message)`: Process a user message and get a response
|
|
120
|
+
- `getSessionId()`: Get the session ID
|
|
121
|
+
- `getTokenUsage()`: Get token usage statistics
|
|
122
|
+
- `clearHistory()`: Clear the chat history
|
|
123
|
+
|
|
124
|
+
### Tools
|
|
125
|
+
|
|
126
|
+
The package also exports the tools from `@probelabs/probe` for convenience:
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
import { tools } from '@probelabs/probe-chat';
|
|
130
|
+
|
|
131
|
+
// Access the tools
|
|
132
|
+
const { searchTool, queryTool, extractTool } = tools;
|
|
133
|
+
|
|
134
|
+
// Access the default system message
|
|
135
|
+
const systemMessage = tools.DEFAULT_SYSTEM_MESSAGE;
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Supported Models
|
|
139
|
+
|
|
140
|
+
### Anthropic Models
|
|
141
|
+
- `claude-3-7-sonnet-latest` (default)
|
|
142
|
+
- `claude-3-7-opus-latest`
|
|
143
|
+
- `claude-3-5-sonnet-20241022`
|
|
144
|
+
- `claude-3-5-sonnet-20240620`
|
|
145
|
+
- `claude-3-opus-20240229`
|
|
146
|
+
- `claude-3-sonnet-20240229`
|
|
147
|
+
- `claude-3-haiku-20240307`
|
|
148
|
+
|
|
149
|
+
### OpenAI Models
|
|
150
|
+
- `gpt-4o-2024-05-13` (default)
|
|
151
|
+
- `gpt-4o`
|
|
152
|
+
- `gpt-4-turbo`
|
|
153
|
+
- `gpt-4`
|
|
154
|
+
|
|
155
|
+
## Requirements
|
|
156
|
+
|
|
157
|
+
- Node.js 18.0.0 or higher
|
|
158
|
+
- An API key from either Anthropic or OpenAI
|
|
159
|
+
|
|
160
|
+
## License
|
|
161
|
+
|
|
162
|
+
ISC
|
|
163
|
+
|
|
164
|
+
## Related Projects
|
|
165
|
+
|
|
166
|
+
- [probe](https://github.com/probelabs/probe) - The core probe code search tool
|
|
167
|
+
- [@probelabs/probe](https://www.npmjs.com/package/@probelabs/probe) - Node.js wrapper for the probe tool
|
|
168
|
+
- [Vercel AI SDK](https://sdk.vercel.ai/) - The AI SDK used for model integration
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @probelabs/probe-chat CLI
|
|
5
|
+
* Command-line interface for Probe code search chat
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import 'dotenv/config';
|
|
9
|
+
import inquirer from 'inquirer';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import ora from 'ora';
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
import { existsSync, realpathSync } from 'fs';
|
|
14
|
+
import { resolve } from 'path';
|
|
15
|
+
import { generateText } from 'ai';
|
|
16
|
+
import { ProbeChat } from '../index.js';
|
|
17
|
+
|
|
18
|
+
// Create a new instance of the program
|
|
19
|
+
const program = new Command();
|
|
20
|
+
|
|
21
|
+
// Configure the program
|
|
22
|
+
program
|
|
23
|
+
.name('probe-chat')
|
|
24
|
+
.description('CLI chat interface for Probe code search')
|
|
25
|
+
.version('1.0.0')
|
|
26
|
+
.option('-d, --debug', 'Enable debug mode')
|
|
27
|
+
.option('-m, --model <model>', 'Specify the model to use')
|
|
28
|
+
.argument('[path]', 'Path to the codebase to search (overrides ALLOWED_FOLDERS)')
|
|
29
|
+
.parse(process.argv);
|
|
30
|
+
|
|
31
|
+
// Get the options
|
|
32
|
+
const options = program.opts();
|
|
33
|
+
|
|
34
|
+
// Get the path argument
|
|
35
|
+
const pathArg = program.args[0];
|
|
36
|
+
|
|
37
|
+
// Set debug mode if specified
|
|
38
|
+
if (options.debug) {
|
|
39
|
+
process.env.DEBUG_CHAT = 'true';
|
|
40
|
+
console.log(chalk.yellow('Debug mode enabled'));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Set model if specified
|
|
44
|
+
if (options.model) {
|
|
45
|
+
process.env.MODEL_NAME = options.model;
|
|
46
|
+
console.log(chalk.blue(`Using model: ${options.model}`));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Set ALLOWED_FOLDERS if path is provided
|
|
50
|
+
if (pathArg) {
|
|
51
|
+
const resolvedPath = resolve(pathArg);
|
|
52
|
+
|
|
53
|
+
// Check if the path exists
|
|
54
|
+
if (existsSync(resolvedPath)) {
|
|
55
|
+
// Get the real path (resolves symlinks)
|
|
56
|
+
const realPath = realpathSync(resolvedPath);
|
|
57
|
+
|
|
58
|
+
// Set the ALLOWED_FOLDERS environment variable
|
|
59
|
+
process.env.ALLOWED_FOLDERS = realPath;
|
|
60
|
+
console.log(chalk.blue(`Using codebase path: ${realPath}`));
|
|
61
|
+
} else {
|
|
62
|
+
console.error(chalk.red(`Error: Path does not exist: ${resolvedPath}`));
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Initialize the chat
|
|
68
|
+
let chat;
|
|
69
|
+
try {
|
|
70
|
+
chat = new ProbeChat();
|
|
71
|
+
|
|
72
|
+
// Print the model being used
|
|
73
|
+
if (chat.apiType === 'anthropic') {
|
|
74
|
+
console.log(chalk.green(`Using Anthropic API with model: ${chat.model}`));
|
|
75
|
+
} else {
|
|
76
|
+
console.log(chalk.green(`Using OpenAI API with model: ${chat.model}`));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Print the session ID
|
|
80
|
+
console.log(chalk.blue(`Session ID: ${chat.getSessionId()}`));
|
|
81
|
+
|
|
82
|
+
console.log(chalk.cyan('Type "exit" or "quit" to end the chat'));
|
|
83
|
+
console.log(chalk.cyan('Type "usage" to see token usage statistics'));
|
|
84
|
+
console.log(chalk.cyan('Type "clear" to clear the chat history'));
|
|
85
|
+
console.log(chalk.cyan('-------------------------------------------'));
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.error(chalk.red(`Error initializing chat: ${error.message}`));
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Function to format the AI response
|
|
92
|
+
function formatResponse(response) {
|
|
93
|
+
// Replace tool calls with colored versions
|
|
94
|
+
return response.replace(
|
|
95
|
+
/<tool_call>(.*?)<\/tool_call>/gs,
|
|
96
|
+
(match, toolCall) => chalk.magenta(`[Tool Call] ${toolCall}`)
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Main chat loop
|
|
101
|
+
async function startChat() {
|
|
102
|
+
while (true) {
|
|
103
|
+
const { message } = await inquirer.prompt([
|
|
104
|
+
{
|
|
105
|
+
type: 'input',
|
|
106
|
+
name: 'message',
|
|
107
|
+
message: chalk.blue('You:'),
|
|
108
|
+
prefix: '',
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
111
|
+
|
|
112
|
+
// Handle special commands
|
|
113
|
+
if (message.toLowerCase() === 'exit' || message.toLowerCase() === 'quit') {
|
|
114
|
+
console.log(chalk.yellow('Goodbye!'));
|
|
115
|
+
break;
|
|
116
|
+
} else if (message.toLowerCase() === 'usage') {
|
|
117
|
+
const usage = chat.getTokenUsage();
|
|
118
|
+
console.log(chalk.cyan('Token Usage:'));
|
|
119
|
+
console.log(chalk.cyan(` Request tokens: ${usage.request}`));
|
|
120
|
+
console.log(chalk.cyan(` Response tokens: ${usage.response}`));
|
|
121
|
+
console.log(chalk.cyan(` Total tokens: ${usage.total}`));
|
|
122
|
+
continue;
|
|
123
|
+
} else if (message.toLowerCase() === 'clear') {
|
|
124
|
+
const newSessionId = chat.clearHistory();
|
|
125
|
+
console.log(chalk.yellow('Chat history cleared'));
|
|
126
|
+
console.log(chalk.blue(`New session ID: ${newSessionId}`));
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Show a spinner while waiting for the response
|
|
131
|
+
const spinner = ora('Thinking...').start();
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
// Get response from the chat
|
|
135
|
+
const response = await chat.chat(message);
|
|
136
|
+
|
|
137
|
+
// Stop the spinner
|
|
138
|
+
spinner.stop();
|
|
139
|
+
|
|
140
|
+
// Print the formatted response
|
|
141
|
+
console.log(chalk.green('Assistant:'));
|
|
142
|
+
console.log(formatResponse(response));
|
|
143
|
+
console.log(); // Add a blank line for readability
|
|
144
|
+
} catch (error) {
|
|
145
|
+
// Stop the spinner and show the error
|
|
146
|
+
spinner.stop();
|
|
147
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Start the chat
|
|
153
|
+
startChat().catch((error) => {
|
|
154
|
+
console.error(chalk.red(`Fatal error: ${error.message}`));
|
|
155
|
+
process.exit(1);
|
|
156
|
+
});
|