@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,798 @@
|
|
|
1
|
+
# Node.js SDK
|
|
2
|
+
|
|
3
|
+
Probe provides a powerful Node.js SDK that allows you to integrate its code search capabilities directly into your JavaScript and TypeScript applications. This document covers the installation, usage, and advanced features of the Node.js SDK.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
### Local Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @probelabs/probe@latest
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Global Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g @probelabs/probe@latest
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
During installation, the package will automatically download the appropriate Probe binary for your platform (Windows, macOS, or Linux).
|
|
20
|
+
|
|
21
|
+
## Features
|
|
22
|
+
|
|
23
|
+
- **Search Code**: Search for patterns in your codebase using Elasticsearch-like query syntax
|
|
24
|
+
- **Query Code**: Find specific code structures using tree-sitter patterns
|
|
25
|
+
- **Extract Code**: Extract code blocks from files based on file paths and line numbers
|
|
26
|
+
- **AI Tools Integration**: Ready-to-use tools for Vercel AI SDK, LangChain, and other AI frameworks
|
|
27
|
+
- **System Message**: Default system message for AI assistants with instructions on using Probe tools
|
|
28
|
+
- **Cross-Platform**: Works on Windows, macOS, and Linux
|
|
29
|
+
- **Automatic Binary Management**: Automatically downloads and manages the Probe binary
|
|
30
|
+
- **Direct CLI Access**: Use the Probe binary directly from the command line when installed globally
|
|
31
|
+
|
|
32
|
+
## Basic Usage
|
|
33
|
+
|
|
34
|
+
### Using as a Node.js Library
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
import { search, query, extract } from '@probelabs/probe@latest';
|
|
38
|
+
|
|
39
|
+
// Search for code
|
|
40
|
+
const searchResults = await search({
|
|
41
|
+
path: '/path/to/your/project',
|
|
42
|
+
query: 'function',
|
|
43
|
+
maxResults: 10
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Query for specific code structures
|
|
47
|
+
const queryResults = await query({
|
|
48
|
+
path: '/path/to/your/project',
|
|
49
|
+
pattern: 'function $NAME($$$PARAMS) $$$BODY',
|
|
50
|
+
language: 'javascript'
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Extract code blocks
|
|
54
|
+
const extractResults = await extract({
|
|
55
|
+
files: ['/path/to/your/project/src/main.js:42']
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Using as a Command-Line Tool
|
|
60
|
+
|
|
61
|
+
When installed globally, the `probe` command will be available directly from the command line:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Search for code
|
|
65
|
+
probe search "function" /path/to/your/project
|
|
66
|
+
|
|
67
|
+
# Query for specific code structures
|
|
68
|
+
probe query "function $NAME($$$PARAMS) $$$BODY" /path/to/your/project
|
|
69
|
+
|
|
70
|
+
# Extract code blocks
|
|
71
|
+
probe extract /path/to/your/project/src/main.js:42
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The package installs the actual Probe binary, not a JavaScript wrapper, so you get the full native performance and all features of the original Probe CLI.
|
|
75
|
+
|
|
76
|
+
## Core Functions
|
|
77
|
+
|
|
78
|
+
### Search
|
|
79
|
+
|
|
80
|
+
The `search` function allows you to search for patterns in your codebase using Elasticsearch-like query syntax.
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
import { search } from '@probelabs/probe@latest';
|
|
84
|
+
|
|
85
|
+
const results = await search({
|
|
86
|
+
path: '/path/to/your/project',
|
|
87
|
+
query: 'function',
|
|
88
|
+
// Optional parameters
|
|
89
|
+
filesOnly: false,
|
|
90
|
+
ignore: ['node_modules', 'dist'],
|
|
91
|
+
excludeFilenames: false,
|
|
92
|
+
reranker: 'hybrid',
|
|
93
|
+
frequencySearch: true,
|
|
94
|
+
exact: false,
|
|
95
|
+
maxResults: 10,
|
|
96
|
+
maxBytes: 1000000,
|
|
97
|
+
maxTokens: 40000,
|
|
98
|
+
allowTests: false,
|
|
99
|
+
noMerge: false,
|
|
100
|
+
mergeThreshold: 5,
|
|
101
|
+
json: false,
|
|
102
|
+
binaryOptions: {
|
|
103
|
+
forceDownload: false,
|
|
104
|
+
version: '1.0.0'
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### Parameters
|
|
110
|
+
|
|
111
|
+
| Parameter | Type | Description | Default |
|
|
112
|
+
|-----------|------|-------------|---------|
|
|
113
|
+
| `path` | string | Path to search in | (required) |
|
|
114
|
+
| `query` | string \| string[] | Search query or queries | (required) |
|
|
115
|
+
| `filesOnly` | boolean | Only output file paths | `false` |
|
|
116
|
+
| `ignore` | string[] | Patterns to ignore | `[]` |
|
|
117
|
+
| `excludeFilenames` | boolean | Exclude filenames from search | `false` |
|
|
118
|
+
| `reranker` | string | Reranking method ('hybrid', 'hybrid2', 'bm25', 'tfidf') | `'hybrid'` |
|
|
119
|
+
| `frequencySearch` | boolean | Use frequency-based search | `true` |
|
|
120
|
+
| `exact` | boolean | Use exact matching | `false` |
|
|
121
|
+
| `maxResults` | number | Maximum number of results | `10` |
|
|
122
|
+
| `maxBytes` | number | Maximum bytes to return | `1000000` |
|
|
123
|
+
| `maxTokens` | number | Maximum tokens to return | `40000` |
|
|
124
|
+
| `allowTests` | boolean | Include test files | `false` |
|
|
125
|
+
| `noMerge` | boolean | Don't merge adjacent blocks | `false` |
|
|
126
|
+
| `mergeThreshold` | number | Merge threshold | `5` |
|
|
127
|
+
| `session` | string | Session ID for caching results | `''` |
|
|
128
|
+
| `json` | boolean | Return results as parsed JSON instead of string | `false` |
|
|
129
|
+
| `binaryOptions` | object | Options for getting the binary | `{}` |
|
|
130
|
+
|
|
131
|
+
### Query
|
|
132
|
+
|
|
133
|
+
The `query` function allows you to find specific code structures using tree-sitter patterns.
|
|
134
|
+
|
|
135
|
+
```javascript
|
|
136
|
+
import { query } from '@probelabs/probe@latest';
|
|
137
|
+
|
|
138
|
+
const results = await query({
|
|
139
|
+
path: '/path/to/your/project',
|
|
140
|
+
pattern: 'function $NAME($$$PARAMS) $$$BODY',
|
|
141
|
+
// Optional parameters
|
|
142
|
+
language: 'javascript',
|
|
143
|
+
ignore: ['node_modules', 'dist'],
|
|
144
|
+
allowTests: false,
|
|
145
|
+
maxResults: 10,
|
|
146
|
+
format: 'markdown',
|
|
147
|
+
json: false,
|
|
148
|
+
binaryOptions: {
|
|
149
|
+
forceDownload: false,
|
|
150
|
+
version: '1.0.0'
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### Parameters
|
|
156
|
+
|
|
157
|
+
| Parameter | Type | Description | Default |
|
|
158
|
+
|-----------|------|-------------|---------|
|
|
159
|
+
| `path` | string | Path to search in | (required) |
|
|
160
|
+
| `pattern` | string | The ast-grep pattern to search for | (required) |
|
|
161
|
+
| `language` | string | Programming language to search in | (inferred from files) |
|
|
162
|
+
| `ignore` | string[] | Patterns to ignore | `[]` |
|
|
163
|
+
| `allowTests` | boolean | Include test files | `false` |
|
|
164
|
+
| `maxResults` | number | Maximum number of results | `10` |
|
|
165
|
+
| `format` | string | Output format ('markdown', 'plain', 'json', 'color') | `'markdown'` |
|
|
166
|
+
| `json` | boolean | Return results as parsed JSON instead of string | `false` |
|
|
167
|
+
| `binaryOptions` | object | Options for getting the binary | `{}` |
|
|
168
|
+
|
|
169
|
+
### Extract
|
|
170
|
+
|
|
171
|
+
The `extract` function allows you to extract code blocks from files based on file paths and line numbers.
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
import { extract } from '@probelabs/probe@latest';
|
|
175
|
+
|
|
176
|
+
const results = await extract({
|
|
177
|
+
files: [
|
|
178
|
+
'/path/to/your/project/src/main.js',
|
|
179
|
+
'/path/to/your/project/src/utils.js:42' // Extract from line 42
|
|
180
|
+
],
|
|
181
|
+
// Optional parameters
|
|
182
|
+
allowTests: false,
|
|
183
|
+
contextLines: 2,
|
|
184
|
+
format: 'markdown',
|
|
185
|
+
json: false,
|
|
186
|
+
binaryOptions: {
|
|
187
|
+
forceDownload: false,
|
|
188
|
+
version: '1.0.0'
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### Parameters
|
|
194
|
+
|
|
195
|
+
| Parameter | Type | Description | Default |
|
|
196
|
+
|-----------|------|-------------|---------|
|
|
197
|
+
| `files` | string[] | Files to extract from (can include line numbers with colon) | (required) |
|
|
198
|
+
| `allowTests` | boolean | Include test files | `false` |
|
|
199
|
+
| `contextLines` | number | Number of context lines to include | `0` |
|
|
200
|
+
| `format` | string | Output format ('markdown', 'plain', 'json') | `'markdown'` |
|
|
201
|
+
| `json` | boolean | Return results as parsed JSON instead of string | `false` |
|
|
202
|
+
| `binaryOptions` | object | Options for getting the binary | `{}` |
|
|
203
|
+
|
|
204
|
+
### Binary Management
|
|
205
|
+
|
|
206
|
+
The SDK provides functions for managing the Probe binary:
|
|
207
|
+
|
|
208
|
+
```javascript
|
|
209
|
+
import { getBinaryPath, setBinaryPath } from '@probelabs/probe@latest';
|
|
210
|
+
|
|
211
|
+
// Get the path to the probe binary
|
|
212
|
+
const binaryPath = await getBinaryPath({
|
|
213
|
+
forceDownload: false,
|
|
214
|
+
version: '1.0.0'
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
// Manually set the path to the probe binary
|
|
218
|
+
setBinaryPath('/path/to/probe/binary');
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## AI Tools Integration
|
|
222
|
+
|
|
223
|
+
The SDK provides built-in tools for integrating with AI frameworks. The latest version introduces tool generators that allow for better configuration and session isolation:
|
|
224
|
+
|
|
225
|
+
### Vercel AI SDK Integration
|
|
226
|
+
|
|
227
|
+
```javascript
|
|
228
|
+
import { generateText } from 'ai';
|
|
229
|
+
import { searchTool, queryTool, extractTool } from '@probelabs/probe@latest';
|
|
230
|
+
import { randomUUID } from 'crypto';
|
|
231
|
+
|
|
232
|
+
// Generate a session ID
|
|
233
|
+
const sessionId = randomUUID();
|
|
234
|
+
|
|
235
|
+
// Create configured tools with the session ID
|
|
236
|
+
const configOptions = {
|
|
237
|
+
sessionId,
|
|
238
|
+
debug: process.env.DEBUG === 'true'
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
// Create configured tool instances
|
|
242
|
+
const configuredTools = {
|
|
243
|
+
search: searchTool(configOptions),
|
|
244
|
+
query: queryTool(configOptions),
|
|
245
|
+
extract: extractTool(configOptions)
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
// Use the configured tools with Vercel AI SDK
|
|
249
|
+
async function chatWithAI(userMessage) {
|
|
250
|
+
const result = await generateText({
|
|
251
|
+
model: provider(modelName),
|
|
252
|
+
messages: [{ role: 'user', content: userMessage }],
|
|
253
|
+
system: "You are a code intelligence assistant. Use the provided tools to search and analyze code.",
|
|
254
|
+
tools: configuredTools,
|
|
255
|
+
maxSteps: 15,
|
|
256
|
+
temperature: 0.7
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
return result.text;
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Tool Generators and Configuration
|
|
264
|
+
|
|
265
|
+
The SDK provides tool generators that allow you to create configured instances of tools with specific options:
|
|
266
|
+
|
|
267
|
+
```javascript
|
|
268
|
+
import { searchTool, queryTool, extractTool } from '@probelabs/probe@latest';
|
|
269
|
+
import { randomUUID } from 'crypto';
|
|
270
|
+
|
|
271
|
+
// Generate a session ID
|
|
272
|
+
const sessionId = randomUUID();
|
|
273
|
+
|
|
274
|
+
// Configure tools with options
|
|
275
|
+
const configOptions = {
|
|
276
|
+
sessionId, // Session ID for caching search results
|
|
277
|
+
debug: process.env.DEBUG === '1', // Enable debug logging
|
|
278
|
+
maxTokens: 30000 // Override default max tokens (search tool only)
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
// Create configured tool instances
|
|
282
|
+
const search = searchTool(configOptions);
|
|
283
|
+
const query = queryTool({ debug: true }); // Each tool can have different options
|
|
284
|
+
const extract = extractTool({ debug: true });
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
#### Configuration Options
|
|
288
|
+
|
|
289
|
+
| Option | Type | Description | Applicable Tools |
|
|
290
|
+
|--------|------|-------------|-----------------|
|
|
291
|
+
| `sessionId` | string | Session ID for caching search results | searchTool |
|
|
292
|
+
| `debug` | boolean | Enable debug logging | All tools |
|
|
293
|
+
| `maxTokens` | number | Override default max tokens | searchTool |
|
|
294
|
+
|
|
295
|
+
#### Backward Compatibility
|
|
296
|
+
|
|
297
|
+
For backward compatibility, the package still exports pre-configured tools:
|
|
298
|
+
|
|
299
|
+
```javascript
|
|
300
|
+
import { tools } from '@probelabs/probe@latest';
|
|
301
|
+
|
|
302
|
+
// Use pre-configured tools
|
|
303
|
+
const { searchTool, queryTool, extractTool } = tools;
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### LangChain Integration
|
|
307
|
+
|
|
308
|
+
```javascript
|
|
309
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
310
|
+
import { tools, createSearchTool, createQueryTool, createExtractTool } from '@probelabs/probe@latest';
|
|
311
|
+
import { randomUUID } from 'crypto';
|
|
312
|
+
|
|
313
|
+
// Generate a session ID
|
|
314
|
+
const sessionId = randomUUID();
|
|
315
|
+
|
|
316
|
+
// Create the LangChain tools with configuration
|
|
317
|
+
const searchTool = tools.createSearchTool({
|
|
318
|
+
sessionId,
|
|
319
|
+
debug: process.env.DEBUG === 'true'
|
|
320
|
+
});
|
|
321
|
+
const queryTool = tools.createQueryTool({ debug: true });
|
|
322
|
+
const extractTool = tools.createExtractTool({ debug: true });
|
|
323
|
+
|
|
324
|
+
// Create a ChatOpenAI instance with tools
|
|
325
|
+
const model = new ChatOpenAI({
|
|
326
|
+
modelName: "gpt-4o",
|
|
327
|
+
temperature: 0.7
|
|
328
|
+
}).withTools([searchTool, queryTool, extractTool]);
|
|
329
|
+
|
|
330
|
+
// Use the model with tools
|
|
331
|
+
async function chatWithAI(userMessage) {
|
|
332
|
+
const result = await model.invoke([
|
|
333
|
+
{ role: "system", content: "You are a code intelligence assistant. Use the provided tools to search and analyze code." },
|
|
334
|
+
{ role: "user", content: userMessage }
|
|
335
|
+
]);
|
|
336
|
+
|
|
337
|
+
return result.content;
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Default System Message
|
|
342
|
+
|
|
343
|
+
The package provides a default system message that you can use with your AI assistants:
|
|
344
|
+
|
|
345
|
+
```javascript
|
|
346
|
+
import { DEFAULT_SYSTEM_MESSAGE, searchTool, queryTool, extractTool } from '@probelabs/probe@latest';
|
|
347
|
+
|
|
348
|
+
// Use the default system message in your AI application
|
|
349
|
+
const systemMessage = DEFAULT_SYSTEM_MESSAGE;
|
|
350
|
+
|
|
351
|
+
// Generate a session ID
|
|
352
|
+
const sessionId = randomUUID();
|
|
353
|
+
|
|
354
|
+
// Create configured tools with the session ID
|
|
355
|
+
const configOptions = { sessionId };
|
|
356
|
+
|
|
357
|
+
// Example with Vercel AI SDK
|
|
358
|
+
const result = await generateText({
|
|
359
|
+
model: provider(modelName),
|
|
360
|
+
messages: [{ role: 'user', content: userMessage }],
|
|
361
|
+
system: DEFAULT_SYSTEM_MESSAGE,
|
|
362
|
+
tools: {
|
|
363
|
+
search: searchTool(configOptions),
|
|
364
|
+
query: queryTool(configOptions),
|
|
365
|
+
extract: extractTool(configOptions)
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
## Advanced Examples
|
|
371
|
+
|
|
372
|
+
### Building a Code Search API
|
|
373
|
+
|
|
374
|
+
```javascript
|
|
375
|
+
import express from 'express';
|
|
376
|
+
import { search, query, extract } from '@probelabs/probe@latest';
|
|
377
|
+
|
|
378
|
+
const app = express();
|
|
379
|
+
app.use(express.json());
|
|
380
|
+
|
|
381
|
+
// Search endpoint
|
|
382
|
+
app.post('/api/search', async (req, res) => {
|
|
383
|
+
try {
|
|
384
|
+
const { path, query, options } = req.body;
|
|
385
|
+
const results = await search({
|
|
386
|
+
path,
|
|
387
|
+
query,
|
|
388
|
+
...options
|
|
389
|
+
});
|
|
390
|
+
res.json({ results });
|
|
391
|
+
} catch (error) {
|
|
392
|
+
res.status(500).json({ error: error.message });
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
// Query endpoint
|
|
397
|
+
app.post('/api/query', async (req, res) => {
|
|
398
|
+
try {
|
|
399
|
+
const { path, pattern, language, options } = req.body;
|
|
400
|
+
const results = await query({
|
|
401
|
+
path,
|
|
402
|
+
pattern,
|
|
403
|
+
language,
|
|
404
|
+
...options
|
|
405
|
+
});
|
|
406
|
+
res.json({ results });
|
|
407
|
+
} catch (error) {
|
|
408
|
+
res.status(500).json({ error: error.message });
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
// Extract endpoint
|
|
413
|
+
app.post('/api/extract', async (req, res) => {
|
|
414
|
+
try {
|
|
415
|
+
const { files, options } = req.body;
|
|
416
|
+
const results = await extract({
|
|
417
|
+
files,
|
|
418
|
+
...options
|
|
419
|
+
});
|
|
420
|
+
res.json({ results });
|
|
421
|
+
} catch (error) {
|
|
422
|
+
res.status(500).json({ error: error.message });
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
app.listen(3000, () => {
|
|
427
|
+
console.log('Code search API running on port 3000');
|
|
428
|
+
});
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Creating a Custom AI Assistant
|
|
432
|
+
|
|
433
|
+
```javascript
|
|
434
|
+
import { search, query, extract } from '@probelabs/probe@latest';
|
|
435
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
436
|
+
import { PromptTemplate } from '@langchain/core/prompts';
|
|
437
|
+
import { StringOutputParser } from '@langchain/core/output_parsers';
|
|
438
|
+
|
|
439
|
+
// Create a custom AI assistant that can search code
|
|
440
|
+
async function createCodeAssistant() {
|
|
441
|
+
// Create a chat model
|
|
442
|
+
const model = new ChatOpenAI({
|
|
443
|
+
modelName: "gpt-4o",
|
|
444
|
+
temperature: 0.7
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
// Create a prompt template
|
|
448
|
+
const promptTemplate = PromptTemplate.fromTemplate(`
|
|
449
|
+
You are a code assistant. I'll provide you with a question and some code search results.
|
|
450
|
+
Please analyze the code and answer the question.
|
|
451
|
+
|
|
452
|
+
Question: {question}
|
|
453
|
+
|
|
454
|
+
Code search results:
|
|
455
|
+
{searchResults}
|
|
456
|
+
|
|
457
|
+
Your analysis:
|
|
458
|
+
`);
|
|
459
|
+
|
|
460
|
+
// Create a chain
|
|
461
|
+
const chain = promptTemplate
|
|
462
|
+
.pipe(model)
|
|
463
|
+
.pipe(new StringOutputParser());
|
|
464
|
+
|
|
465
|
+
// Function to answer questions about code
|
|
466
|
+
async function answerCodeQuestion(question, codebasePath) {
|
|
467
|
+
// Search for relevant code
|
|
468
|
+
const searchResults = await search({
|
|
469
|
+
path: codebasePath,
|
|
470
|
+
query: question,
|
|
471
|
+
maxResults: 5,
|
|
472
|
+
maxTokens: 10000
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
// Get the answer from the AI
|
|
476
|
+
const answer = await chain.invoke({
|
|
477
|
+
question,
|
|
478
|
+
searchResults
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
return answer;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
return { answerCodeQuestion };
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// Usage
|
|
488
|
+
const assistant = await createCodeAssistant();
|
|
489
|
+
const answer = await assistant.answerCodeQuestion(
|
|
490
|
+
"How is authentication implemented?",
|
|
491
|
+
"/path/to/your/project"
|
|
492
|
+
);
|
|
493
|
+
console.log(answer);
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### Batch Processing Multiple Repositories
|
|
497
|
+
|
|
498
|
+
```javascript
|
|
499
|
+
import { search } from '@probelabs/probe@latest';
|
|
500
|
+
import fs from 'fs/promises';
|
|
501
|
+
import path from 'path';
|
|
502
|
+
|
|
503
|
+
async function batchSearch(repositories, searchQuery) {
|
|
504
|
+
const results = {};
|
|
505
|
+
|
|
506
|
+
for (const repo of repositories) {
|
|
507
|
+
console.log(`Searching in ${repo}...`);
|
|
508
|
+
try {
|
|
509
|
+
const searchResults = await search({
|
|
510
|
+
path: repo,
|
|
511
|
+
query: searchQuery,
|
|
512
|
+
maxResults: 20,
|
|
513
|
+
json: true // Get structured results
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
results[repo] = searchResults;
|
|
517
|
+
} catch (error) {
|
|
518
|
+
console.error(`Error searching in ${repo}:`, error);
|
|
519
|
+
results[repo] = { error: error.message };
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
return results;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Example usage
|
|
527
|
+
const repositories = [
|
|
528
|
+
'/path/to/repo1',
|
|
529
|
+
'/path/to/repo2',
|
|
530
|
+
'/path/to/repo3'
|
|
531
|
+
];
|
|
532
|
+
|
|
533
|
+
const results = await batchSearch(repositories, 'security AND (vulnerability OR exploit)');
|
|
534
|
+
|
|
535
|
+
// Save results to a file
|
|
536
|
+
await fs.writeFile(
|
|
537
|
+
path.join(process.cwd(), 'search-results.json'),
|
|
538
|
+
JSON.stringify(results, null, 2)
|
|
539
|
+
);
|
|
540
|
+
|
|
541
|
+
console.log('Search completed and results saved to search-results.json');
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
### Code Analysis Pipeline
|
|
545
|
+
|
|
546
|
+
```javascript
|
|
547
|
+
import { search, query } from '@probelabs/probe@latest';
|
|
548
|
+
import fs from 'fs/promises';
|
|
549
|
+
|
|
550
|
+
async function analyzeCodebase(codebasePath) {
|
|
551
|
+
const analysis = {
|
|
552
|
+
timestamp: new Date().toISOString(),
|
|
553
|
+
codebasePath,
|
|
554
|
+
metrics: {},
|
|
555
|
+
patterns: {},
|
|
556
|
+
potentialIssues: []
|
|
557
|
+
};
|
|
558
|
+
|
|
559
|
+
// Count functions by language
|
|
560
|
+
const languages = ['javascript', 'typescript', 'python', 'rust', 'go'];
|
|
561
|
+
const functionCounts = {};
|
|
562
|
+
|
|
563
|
+
for (const lang of languages) {
|
|
564
|
+
try {
|
|
565
|
+
const pattern = lang === 'javascript' || lang === 'typescript'
|
|
566
|
+
? 'function $NAME($$$PARAMS) $$$BODY'
|
|
567
|
+
: lang === 'python'
|
|
568
|
+
? 'def $NAME($$$PARAMS): $$$BODY'
|
|
569
|
+
: lang === 'rust'
|
|
570
|
+
? 'fn $NAME($$$PARAMS) $$$BODY'
|
|
571
|
+
: 'func $NAME($$$PARAMS) $$$BODY';
|
|
572
|
+
|
|
573
|
+
const results = await query({
|
|
574
|
+
path: codebasePath,
|
|
575
|
+
pattern,
|
|
576
|
+
language: lang,
|
|
577
|
+
maxResults: 1000,
|
|
578
|
+
json: true
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
functionCounts[lang] = results.matches ? results.matches.length : 0;
|
|
582
|
+
} catch (error) {
|
|
583
|
+
console.error(`Error counting functions in ${lang}:`, error);
|
|
584
|
+
functionCounts[lang] = -1; // Error indicator
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
analysis.metrics.functionCounts = functionCounts;
|
|
589
|
+
|
|
590
|
+
// Find potential security issues
|
|
591
|
+
const securityPatterns = [
|
|
592
|
+
'password',
|
|
593
|
+
'token',
|
|
594
|
+
'api_key',
|
|
595
|
+
'apikey',
|
|
596
|
+
'secret',
|
|
597
|
+
'credential',
|
|
598
|
+
'eval(',
|
|
599
|
+
'exec(',
|
|
600
|
+
'shell_exec'
|
|
601
|
+
];
|
|
602
|
+
|
|
603
|
+
for (const pattern of securityPatterns) {
|
|
604
|
+
try {
|
|
605
|
+
const results = await search({
|
|
606
|
+
path: codebasePath,
|
|
607
|
+
query: pattern,
|
|
608
|
+
maxResults: 50,
|
|
609
|
+
json: true
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
if (results.matches && results.matches.length > 0) {
|
|
613
|
+
analysis.potentialIssues.push({
|
|
614
|
+
pattern,
|
|
615
|
+
matches: results.matches.map(match => ({
|
|
616
|
+
file: match.file,
|
|
617
|
+
line: match.line,
|
|
618
|
+
content: match.content.substring(0, 100) + '...' // Truncate long content
|
|
619
|
+
}))
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
} catch (error) {
|
|
623
|
+
console.error(`Error searching for pattern ${pattern}:`, error);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// Save analysis to file
|
|
628
|
+
await fs.writeFile(
|
|
629
|
+
'codebase-analysis.json',
|
|
630
|
+
JSON.stringify(analysis, null, 2)
|
|
631
|
+
);
|
|
632
|
+
|
|
633
|
+
return analysis;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// Usage
|
|
637
|
+
const analysis = await analyzeCodebase('/path/to/your/project');
|
|
638
|
+
console.log('Analysis complete. Results saved to codebase-analysis.json');
|
|
639
|
+
console.log(`Found ${Object.values(analysis.metrics.functionCounts).reduce((a, b) => a + (b > 0 ? b : 0), 0)} functions across all languages`);
|
|
640
|
+
console.log(`Found ${analysis.potentialIssues.length} potential security issues`);
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
## How It Works
|
|
644
|
+
|
|
645
|
+
When you install the `@probelabs/probe` package:
|
|
646
|
+
|
|
647
|
+
1. A placeholder binary is included in the package
|
|
648
|
+
2. During installation, the postinstall script downloads the actual Probe binary for your platform
|
|
649
|
+
3. The placeholder is replaced with the actual binary
|
|
650
|
+
4. When installed globally, npm creates a symlink to this binary in your system path
|
|
651
|
+
|
|
652
|
+
This approach ensures that you get the actual native binary, not a JavaScript wrapper, providing full performance and all features of the original Probe CLI.
|
|
653
|
+
|
|
654
|
+
## Troubleshooting
|
|
655
|
+
|
|
656
|
+
### Common Issues
|
|
657
|
+
|
|
658
|
+
#### Binary Not Found
|
|
659
|
+
|
|
660
|
+
If you encounter a "Binary not found" error:
|
|
661
|
+
|
|
662
|
+
```javascript
|
|
663
|
+
import { setBinaryPath } from '@probelabs/probe@latest';
|
|
664
|
+
|
|
665
|
+
// Manually set the path to the probe binary
|
|
666
|
+
setBinaryPath('/path/to/probe/binary');
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
#### Permission Denied
|
|
670
|
+
|
|
671
|
+
If you encounter a "Permission denied" error:
|
|
672
|
+
|
|
673
|
+
```bash
|
|
674
|
+
# Make the binary executable
|
|
675
|
+
chmod +x /path/to/probe/binary
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
#### Network Error During Binary Download
|
|
679
|
+
|
|
680
|
+
If you encounter a network error during binary download:
|
|
681
|
+
|
|
682
|
+
```javascript
|
|
683
|
+
import { getBinaryPath } from '@probelabs/probe@latest';
|
|
684
|
+
|
|
685
|
+
// Force download with a specific version
|
|
686
|
+
const binaryPath = await getBinaryPath({
|
|
687
|
+
forceDownload: true,
|
|
688
|
+
version: '1.0.0'
|
|
689
|
+
});
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
#### Timeout Error
|
|
693
|
+
|
|
694
|
+
If you encounter a timeout error:
|
|
695
|
+
|
|
696
|
+
```javascript
|
|
697
|
+
import { search } from '@probelabs/probe@latest';
|
|
698
|
+
|
|
699
|
+
// Increase the timeout by using the execAsync function directly
|
|
700
|
+
import { promisify } from 'util';
|
|
701
|
+
import { exec } from 'child_process';
|
|
702
|
+
const execAsync = promisify(exec);
|
|
703
|
+
|
|
704
|
+
// Get the binary path
|
|
705
|
+
import { getBinaryPath } from '@probelabs/probe@latest';
|
|
706
|
+
const binaryPath = await getBinaryPath();
|
|
707
|
+
|
|
708
|
+
// Execute the command with a longer timeout
|
|
709
|
+
const { stdout } = await execAsync(`${binaryPath} search "query" /path/to/project`, {
|
|
710
|
+
timeout: 60000 // 60 seconds
|
|
711
|
+
});
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
## Best Practices
|
|
715
|
+
|
|
716
|
+
1. **Use Specific Queries**: More specific queries yield better results
|
|
717
|
+
2. **Limit Result Size**: Use `maxResults` and `maxTokens` to limit the size of results
|
|
718
|
+
3. **Handle Errors**: Always wrap API calls in try/catch blocks
|
|
719
|
+
4. **Cache Results**: Consider caching results for frequently used queries
|
|
720
|
+
5. **Use JSON Format**: Use `json: true` for programmatic processing of results
|
|
721
|
+
6. **Combine with Other Tools**: Use Probe alongside other tools for a more comprehensive understanding of your codebase
|
|
722
|
+
7. **Optimize for Performance**: Use `filesOnly` for initial broad searches, then refine with more specific queries
|
|
723
|
+
8. **Use Session IDs**: For related searches, use the same session ID to avoid seeing duplicate code blocks
|
|
724
|
+
9. **Use Tool Generators**: Create configured tool instances with session IDs for better isolation in concurrent environments
|
|
725
|
+
10. **Enable Debug Logging**: Set the debug option to true when troubleshooting tool execution
|
|
726
|
+
|
|
727
|
+
### Session-Based Caching Example
|
|
728
|
+
|
|
729
|
+
There are two ways to use session-based caching:
|
|
730
|
+
|
|
731
|
+
#### 1. Using the search function directly
|
|
732
|
+
|
|
733
|
+
```javascript
|
|
734
|
+
import { search } from '@probelabs/probe@latest';
|
|
735
|
+
|
|
736
|
+
// First search with empty session string (generates a session ID)
|
|
737
|
+
const results1 = await search({
|
|
738
|
+
path: '/path/to/your/project',
|
|
739
|
+
query: 'authentication',
|
|
740
|
+
session: ''
|
|
741
|
+
});
|
|
742
|
+
|
|
743
|
+
// Get the session ID from the results
|
|
744
|
+
const sessionId = results1.session;
|
|
745
|
+
console.log(`Session ID: ${sessionId}`);
|
|
746
|
+
|
|
747
|
+
// Use the same session ID for related searches
|
|
748
|
+
const results2 = await search({
|
|
749
|
+
path: '/path/to/your/project',
|
|
750
|
+
query: 'login',
|
|
751
|
+
session: sessionId
|
|
752
|
+
});
|
|
753
|
+
|
|
754
|
+
// This will skip code blocks already shown in the previous search
|
|
755
|
+
console.log(`Found ${results2.matches.length} new matches`);
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
#### 2. Using the tool generators with Vercel AI SDK
|
|
759
|
+
|
|
760
|
+
```javascript
|
|
761
|
+
import { searchTool } from '@probelabs/probe@latest';
|
|
762
|
+
import { randomUUID } from 'crypto';
|
|
763
|
+
|
|
764
|
+
// Generate a session ID
|
|
765
|
+
const sessionId = randomUUID();
|
|
766
|
+
console.log(`Session ID: ${sessionId}`);
|
|
767
|
+
|
|
768
|
+
// Create a configured search tool with the session ID
|
|
769
|
+
const configuredSearchTool = searchTool({
|
|
770
|
+
sessionId,
|
|
771
|
+
debug: true // Enable debug logging
|
|
772
|
+
});
|
|
773
|
+
|
|
774
|
+
// Use the configured tool with Vercel AI SDK
|
|
775
|
+
// All searches performed with this tool will use the same session ID
|
|
776
|
+
const result = await generateText({
|
|
777
|
+
model: provider(modelName),
|
|
778
|
+
messages: [{ role: 'user', content: userMessage }],
|
|
779
|
+
system: "You are a code intelligence assistant. Use the provided tools to search and analyze code.",
|
|
780
|
+
tools: {
|
|
781
|
+
search: configuredSearchTool
|
|
782
|
+
},
|
|
783
|
+
maxSteps: 15
|
|
784
|
+
});
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
Session-based caching is particularly useful when:
|
|
788
|
+
- Building interactive search interfaces
|
|
789
|
+
- Conducting progressive searches that refine or expand on previous queries
|
|
790
|
+
- Creating AI assistants that need to avoid repeating the same code blocks
|
|
791
|
+
- Implementing search workflows that build on previous results
|
|
792
|
+
- Handling concurrent searches in multi-user environments
|
|
793
|
+
|
|
794
|
+
## Related Resources
|
|
795
|
+
|
|
796
|
+
- [Probe GitHub Repository](https://github.com/probelabs/probe)
|
|
797
|
+
- [Probe MCP Server](https://github.com/probelabs/probe/tree/main/mcp)
|
|
798
|
+
- [Probe AI Chat](https://github.com/probelabs/probe/tree/main/examples/chat)
|