@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.
Files changed (444) hide show
  1. package/README.md +138 -0
  2. package/data/.env.example +22 -0
  3. package/data/.gitattributes +47 -0
  4. package/data/.glfrc.json +7 -0
  5. package/data/.husky/pre-commit +5 -0
  6. package/data/.nvmrc +1 -0
  7. package/data/CHANGELOG.md +75 -0
  8. package/data/CODE_OF_CONDUCT.md +129 -0
  9. package/data/CONTRIBUTING.md +203 -0
  10. package/data/DOCS-STRUCTURE.md +307 -0
  11. package/data/I18N.md +292 -0
  12. package/data/LICENSE +22 -0
  13. package/data/README.md +315 -0
  14. package/data/SECURITY.md +125 -0
  15. package/data/WIKI-DEPLOYMENT.md +348 -0
  16. package/data/docs/AI-FEATURES.md +610 -0
  17. package/data/docs/API-REFERENCE.md +1022 -0
  18. package/data/docs/AUTHENTICATION.md +301 -0
  19. package/data/docs/BACKEND-API.md +468 -0
  20. package/data/docs/DEVELOPMENT.md +375 -0
  21. package/data/docs/EXAMPLES.md +622 -0
  22. package/data/docs/MCP-SERVER.md +307 -0
  23. package/data/docs/MIGRATION-GUIDE.md +367 -0
  24. package/data/docs/NPM-PUBLISH.md +193 -0
  25. package/data/docs/QUICKSTART.md +206 -0
  26. package/data/docs/REDIS-SETUP.md +162 -0
  27. package/data/docs/SERVER.md +228 -0
  28. package/data/docs/TROUBLESHOOTING.md +657 -0
  29. package/data/docs/WIDGET-GUIDE.md +638 -0
  30. package/data/docs/WIKI-HOME.md +58 -0
  31. package/data/docs/WIKI-SIDEBAR.md +39 -0
  32. package/data/package.json +171 -0
  33. package/data/playwright.config.ts +64 -0
  34. package/data/probe/.cargo/config.toml +10 -0
  35. package/data/probe/.claude/commands/performance-review.md +15 -0
  36. package/data/probe/.clinerules +288 -0
  37. package/data/probe/.dockerignore +57 -0
  38. package/data/probe/.githooks/post-commit +11 -0
  39. package/data/probe/.githooks/pre-commit +99 -0
  40. package/data/probe/.githooks/pre-commit-vow +9 -0
  41. package/data/probe/.prompts/engineer.md +41 -0
  42. package/data/probe/.roomodes +28 -0
  43. package/data/probe/.windsurfrules +0 -0
  44. package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
  45. package/data/probe/BENCHMARKING.md +256 -0
  46. package/data/probe/CLAUDE.md +226 -0
  47. package/data/probe/CODE_OF_CONDUCT.md +128 -0
  48. package/data/probe/CONTRIBUTING.md +193 -0
  49. package/data/probe/Cargo.toml +120 -0
  50. package/data/probe/Cross.toml +10 -0
  51. package/data/probe/DOCKER-README.md +224 -0
  52. package/data/probe/Dockerfile +32 -0
  53. package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
  54. package/data/probe/LICENSE +201 -0
  55. package/data/probe/Makefile +210 -0
  56. package/data/probe/README.md +824 -0
  57. package/data/probe/SECURITY.md +67 -0
  58. package/data/probe/WINDOWS-GUIDE.md +294 -0
  59. package/data/probe/benches/parsing_benchmarks.rs +370 -0
  60. package/data/probe/benches/search_benchmarks.rs +599 -0
  61. package/data/probe/benches/simd_benchmarks.rs +372 -0
  62. package/data/probe/benches/timing_benchmarks.rs +287 -0
  63. package/data/probe/build-windows.bat +229 -0
  64. package/data/probe/codex-config/config.toml +6 -0
  65. package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
  66. package/data/probe/examples/cache_demo.rs +46 -0
  67. package/data/probe/examples/chat/.dockerignore +37 -0
  68. package/data/probe/examples/chat/ChatSessionManager.js +295 -0
  69. package/data/probe/examples/chat/Dockerfile +98 -0
  70. package/data/probe/examples/chat/LICENSE +201 -0
  71. package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
  72. package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
  73. package/data/probe/examples/chat/README.md +338 -0
  74. package/data/probe/examples/chat/TRACING.md +226 -0
  75. package/data/probe/examples/chat/appTracer.js +968 -0
  76. package/data/probe/examples/chat/auth.js +76 -0
  77. package/data/probe/examples/chat/bin/probe-chat.js +13 -0
  78. package/data/probe/examples/chat/build.js +104 -0
  79. package/data/probe/examples/chat/cancelRequest.js +84 -0
  80. package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
  81. package/data/probe/examples/chat/demo-local-images.js +128 -0
  82. package/data/probe/examples/chat/fileSpanExporter.js +181 -0
  83. package/data/probe/examples/chat/implement/README.md +228 -0
  84. package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
  85. package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
  86. package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
  87. package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
  88. package/data/probe/examples/chat/implement/backends/registry.js +85 -0
  89. package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
  90. package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
  91. package/data/probe/examples/chat/implement/core/config.js +428 -0
  92. package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
  93. package/data/probe/examples/chat/implement/core/utils.js +496 -0
  94. package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
  95. package/data/probe/examples/chat/index.js +669 -0
  96. package/data/probe/examples/chat/mcpServer.js +341 -0
  97. package/data/probe/examples/chat/npm/LICENSE +15 -0
  98. package/data/probe/examples/chat/npm/README.md +168 -0
  99. package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
  100. package/data/probe/examples/chat/npm/index.js +259 -0
  101. package/data/probe/examples/chat/npm/package.json +54 -0
  102. package/data/probe/examples/chat/package.json +102 -0
  103. package/data/probe/examples/chat/probeChat.js +456 -0
  104. package/data/probe/examples/chat/probeTool.js +491 -0
  105. package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
  106. package/data/probe/examples/chat/telemetry.js +281 -0
  107. package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
  108. package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
  109. package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
  110. package/data/probe/examples/chat/test/test-backends.js +90 -0
  111. package/data/probe/examples/chat/test/testUtils.js +530 -0
  112. package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
  113. package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
  114. package/data/probe/examples/chat/test/verify-tests.js +118 -0
  115. package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
  116. package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
  117. package/data/probe/examples/chat/test-chat-tracing.js +38 -0
  118. package/data/probe/examples/chat/test-direct-function.js +49 -0
  119. package/data/probe/examples/chat/test-file-size-validation.js +103 -0
  120. package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
  121. package/data/probe/examples/chat/test-github-context.txt +12 -0
  122. package/data/probe/examples/chat/test-hierarchy.js +203 -0
  123. package/data/probe/examples/chat/test-image-spans.js +37 -0
  124. package/data/probe/examples/chat/test-local-image-reading.js +176 -0
  125. package/data/probe/examples/chat/test-mcp-integration.js +136 -0
  126. package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
  127. package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
  128. package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
  129. package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
  130. package/data/probe/examples/chat/test-security-validation.js +145 -0
  131. package/data/probe/examples/chat/test-simple-tracing.js +32 -0
  132. package/data/probe/examples/chat/test-trace-verification.js +235 -0
  133. package/data/probe/examples/chat/test-tracing.js +114 -0
  134. package/data/probe/examples/chat/tokenCounter.js +419 -0
  135. package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
  136. package/data/probe/examples/chat/webServer.js +1103 -0
  137. package/data/probe/examples/reranker/Cargo.toml +33 -0
  138. package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
  139. package/data/probe/examples/reranker/MODELS.md +66 -0
  140. package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
  141. package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
  142. package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
  143. package/data/probe/examples/reranker/README.md +347 -0
  144. package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
  145. package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
  146. package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
  147. package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
  148. package/data/probe/examples/reranker/debug_scoring.py +189 -0
  149. package/data/probe/examples/reranker/debug_tokenization.py +154 -0
  150. package/data/probe/examples/reranker/download_models.sh +73 -0
  151. package/data/probe/examples/reranker/requirements.txt +13 -0
  152. package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
  153. package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
  154. package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
  155. package/data/probe/examples/reranker/simple_test.py +50 -0
  156. package/data/probe/examples/reranker/test_all_models.sh +63 -0
  157. package/data/probe/examples/reranker/test_bert_results.sh +44 -0
  158. package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
  159. package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
  160. package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
  161. package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
  162. package/data/probe/examples/reranker/test_scores.py +132 -0
  163. package/data/probe/install.ps1 +508 -0
  164. package/data/probe/install.sh +460 -0
  165. package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
  166. package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
  167. package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
  168. package/data/probe/npm/MAID_INTEGRATION.md +313 -0
  169. package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
  170. package/data/probe/npm/README.md +824 -0
  171. package/data/probe/npm/bin/.gitignore +7 -0
  172. package/data/probe/npm/bin/.gitkeep +0 -0
  173. package/data/probe/npm/bin/README.md +12 -0
  174. package/data/probe/npm/bin/probe +167 -0
  175. package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
  176. package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
  177. package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
  178. package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
  179. package/data/probe/npm/example-usage.js +335 -0
  180. package/data/probe/npm/examples/multi-engine-demo.js +117 -0
  181. package/data/probe/npm/examples/probe-agent-cli.js +113 -0
  182. package/data/probe/npm/examples/test-agent-edit.js +114 -0
  183. package/data/probe/npm/examples/test-edit-create.js +120 -0
  184. package/data/probe/npm/examples/test-edit-direct.js +114 -0
  185. package/data/probe/npm/index.d.ts +744 -0
  186. package/data/probe/npm/jest.config.js +52 -0
  187. package/data/probe/npm/package.json +117 -0
  188. package/data/probe/npm/scripts/build-agent.cjs +75 -0
  189. package/data/probe/npm/scripts/build-cjs.js +124 -0
  190. package/data/probe/npm/scripts/build-mcp.cjs +36 -0
  191. package/data/probe/npm/scripts/postinstall.js +216 -0
  192. package/data/probe/npm/test-codex-e2e.js +78 -0
  193. package/data/probe/npm/test-download-lock.js +109 -0
  194. package/data/probe/npm/test-grep-security.js +94 -0
  195. package/data/probe/npm/test-grep-simplified.js +63 -0
  196. package/data/probe/npm/test-grep.js +51 -0
  197. package/data/probe/npm/tests/README.md +96 -0
  198. package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
  199. package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
  200. package/data/probe/npm/tests/contextCompactor.test.js +498 -0
  201. package/data/probe/npm/tests/delegate-config.test.js +353 -0
  202. package/data/probe/npm/tests/delegate-integration.test.js +348 -0
  203. package/data/probe/npm/tests/extractor-integration.test.js +162 -0
  204. package/data/probe/npm/tests/extractor.test.js +317 -0
  205. package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
  206. package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
  207. package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
  208. package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
  209. package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
  210. package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
  211. package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
  212. package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
  213. package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
  214. package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
  215. package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
  216. package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
  217. package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
  218. package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
  219. package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
  220. package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
  221. package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
  222. package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
  223. package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
  224. package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
  225. package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
  226. package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
  227. package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
  228. package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
  229. package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
  230. package/data/probe/npm/tests/setup.js +46 -0
  231. package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
  232. package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
  233. package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
  234. package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
  235. package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
  236. package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
  237. package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
  238. package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
  239. package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
  240. package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
  241. package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
  242. package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
  243. package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
  244. package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
  245. package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
  246. package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
  247. package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
  248. package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
  249. package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
  250. package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
  251. package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
  252. package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
  253. package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
  254. package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
  255. package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
  256. package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
  257. package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
  258. package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
  259. package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
  260. package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
  261. package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
  262. package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
  263. package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
  264. package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
  265. package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
  266. package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
  267. package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
  268. package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
  269. package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
  270. package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
  271. package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
  272. package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
  273. package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
  274. package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
  275. package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
  276. package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
  277. package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
  278. package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
  279. package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
  280. package/data/probe/npm/tsconfig.json +21 -0
  281. package/data/probe/result1.txt +19 -0
  282. package/data/probe/result2.txt +26 -0
  283. package/data/probe/scripts/benchmark.sh +270 -0
  284. package/data/probe/scripts/cache_memory_analysis.rs +844 -0
  285. package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
  286. package/data/probe/site/.env.example +10 -0
  287. package/data/probe/site/DEPLOYMENT.md +86 -0
  288. package/data/probe/site/README.md +183 -0
  289. package/data/probe/site/adding-languages.md +135 -0
  290. package/data/probe/site/ai-chat.md +427 -0
  291. package/data/probe/site/ai-integration.md +1488 -0
  292. package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
  293. package/data/probe/site/blog/index.md +118 -0
  294. package/data/probe/site/blog/v0.6.0-release.md +426 -0
  295. package/data/probe/site/blog.md +8 -0
  296. package/data/probe/site/changelog.md +200 -0
  297. package/data/probe/site/cli-mode.md +437 -0
  298. package/data/probe/site/code-extraction.md +436 -0
  299. package/data/probe/site/contributing/README.md +9 -0
  300. package/data/probe/site/contributing/documentation-cross-references.md +215 -0
  301. package/data/probe/site/contributing/documentation-maintenance.md +275 -0
  302. package/data/probe/site/contributing/documentation-structure.md +75 -0
  303. package/data/probe/site/documentation-cross-references.md +215 -0
  304. package/data/probe/site/documentation-guide.md +132 -0
  305. package/data/probe/site/documentation-maintenance.md +275 -0
  306. package/data/probe/site/features.md +147 -0
  307. package/data/probe/site/how-it-works.md +118 -0
  308. package/data/probe/site/index.md +175 -0
  309. package/data/probe/site/index.md.bak +133 -0
  310. package/data/probe/site/installation.md +235 -0
  311. package/data/probe/site/integrations/docker.md +248 -0
  312. package/data/probe/site/integrations/github-actions.md +413 -0
  313. package/data/probe/site/language-support-overview.md +168 -0
  314. package/data/probe/site/mcp-integration.md +587 -0
  315. package/data/probe/site/mcp-server.md +304 -0
  316. package/data/probe/site/navigation-structure.md +76 -0
  317. package/data/probe/site/nodejs-sdk.md +798 -0
  318. package/data/probe/site/output-formats.md +625 -0
  319. package/data/probe/site/package.json +21 -0
  320. package/data/probe/site/public/_headers +28 -0
  321. package/data/probe/site/public/_redirects +11 -0
  322. package/data/probe/site/quick-start.md +289 -0
  323. package/data/probe/site/search-functionality.md +291 -0
  324. package/data/probe/site/search-reference.md +291 -0
  325. package/data/probe/site/supported-languages.md +215 -0
  326. package/data/probe/site/use-cases/README.md +8 -0
  327. package/data/probe/site/use-cases/advanced-cli.md +253 -0
  328. package/data/probe/site/use-cases/ai-code-editors.md +239 -0
  329. package/data/probe/site/use-cases/building-ai-tools.md +529 -0
  330. package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
  331. package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
  332. package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
  333. package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
  334. package/data/probe/site/use-cases/team-chat.md +350 -0
  335. package/data/probe/site/web-interface.md +434 -0
  336. package/data/probe/site/wrangler.toml +9 -0
  337. package/data/probe/test-api-key.sh +1 -0
  338. package/data/probe/test-probe-implementation/hello.js +7 -0
  339. package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
  340. package/data/probe/test_cases/early_termination_issues.rs +533 -0
  341. package/data/probe/test_data/test_nested_struct.go +26 -0
  342. package/data/probe/tests/README.md +286 -0
  343. package/data/probe/tests/README_search_determinism_tests.md +116 -0
  344. package/data/probe/tests/adjacent_comment_test.rs +152 -0
  345. package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
  346. package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
  347. package/data/probe/tests/block_merging_tests.rs +396 -0
  348. package/data/probe/tests/c_outline_format_tests.rs +2179 -0
  349. package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
  350. package/data/probe/tests/cache_order_tests.rs +147 -0
  351. package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
  352. package/data/probe/tests/cli_tests.rs +680 -0
  353. package/data/probe/tests/comment_context_integration_test.rs +240 -0
  354. package/data/probe/tests/common.rs +33 -0
  355. package/data/probe/tests/complex_block_merging_tests.rs +599 -0
  356. package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
  357. package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
  358. package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
  359. package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
  360. package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
  361. package/data/probe/tests/extract_command_tests.rs +1848 -0
  362. package/data/probe/tests/extract_deduplication_tests.rs +146 -0
  363. package/data/probe/tests/extract_input_file_tests.rs +84 -0
  364. package/data/probe/tests/extract_prompt_tests.rs +102 -0
  365. package/data/probe/tests/filename_search_tests.rs +96 -0
  366. package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
  367. package/data/probe/tests/github_extract_tests.rs +234 -0
  368. package/data/probe/tests/go_comment_test.rs +253 -0
  369. package/data/probe/tests/go_outline_format_tests.rs +2587 -0
  370. package/data/probe/tests/go_path_resolver_tests.rs +96 -0
  371. package/data/probe/tests/html_outline_format_tests.rs +637 -0
  372. package/data/probe/tests/integration_tests.rs +837 -0
  373. package/data/probe/tests/ip_whitelist_test.rs +148 -0
  374. package/data/probe/tests/java_outline_format_tests.rs +1611 -0
  375. package/data/probe/tests/javascript_extract_tests.rs +315 -0
  376. package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
  377. package/data/probe/tests/json_format_tests.rs +436 -0
  378. package/data/probe/tests/json_schema_validation_tests.rs +450 -0
  379. package/data/probe/tests/lib_usage.rs +60 -0
  380. package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
  381. package/data/probe/tests/line_map_cache_tests.rs +114 -0
  382. package/data/probe/tests/markdown_integration_tests.rs +190 -0
  383. package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
  384. package/data/probe/tests/mocks/test_object.js +27 -0
  385. package/data/probe/tests/mocks/test_struct.go +50 -0
  386. package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
  387. package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
  388. package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
  389. package/data/probe/tests/negative_compound_word_tests.rs +246 -0
  390. package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
  391. package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
  392. package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
  393. package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
  394. package/data/probe/tests/parallel_extraction_tests.rs +178 -0
  395. package/data/probe/tests/parallel_search_tests.rs +355 -0
  396. package/data/probe/tests/path_resolver_tests.rs +698 -0
  397. package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
  398. package/data/probe/tests/php_outline_format_tests.rs +768 -0
  399. package/data/probe/tests/property_tests.proptest-regressions +9 -0
  400. package/data/probe/tests/property_tests.rs +118 -0
  401. package/data/probe/tests/python_outline_format_tests.rs +1538 -0
  402. package/data/probe/tests/query_command_json_tests.rs +438 -0
  403. package/data/probe/tests/query_command_tests.rs +232 -0
  404. package/data/probe/tests/query_command_xml_tests.rs +569 -0
  405. package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
  406. package/data/probe/tests/required_terms_filename_tests.rs +116 -0
  407. package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
  408. package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
  409. package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
  410. package/data/probe/tests/rust_outline_format_tests.rs +843 -0
  411. package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
  412. package/data/probe/tests/search_determinism_tests.rs +451 -0
  413. package/data/probe/tests/search_hints_tests.rs +253 -0
  414. package/data/probe/tests/special_character_escaping_tests.rs +417 -0
  415. package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
  416. package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
  417. package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
  418. package/data/probe/tests/symbols_tests.rs +166 -0
  419. package/data/probe/tests/test_file.rs +45 -0
  420. package/data/probe/tests/test_tokenize.rs +28 -0
  421. package/data/probe/tests/timeout_tests.rs +82 -0
  422. package/data/probe/tests/tokenization_tests.rs +195 -0
  423. package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
  424. package/data/probe/tests/typescript_extract_tests.rs +214 -0
  425. package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
  426. package/data/probe/tests/xml_format_tests.rs +568 -0
  427. package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
  428. package/data/scripts/postinstall.mjs +9 -0
  429. package/data/scripts/set-version.js +0 -0
  430. package/data/scripts/wiki-build.sh +111 -0
  431. package/data/scripts/wiki-deploy.sh +73 -0
  432. package/data/serve.json +12 -0
  433. package/data/test/demo-dynamic.html +134 -0
  434. package/data/test/demo-esm.html +105 -0
  435. package/data/test/demo-iife.html +78 -0
  436. package/data/tsconfig.json +7 -0
  437. package/data/vite.server.ts +483 -0
  438. package/data/vitest.config.ts +40 -0
  439. package/data/wiki/Home.md +58 -0
  440. package/data/wiki/_Sidebar.md +39 -0
  441. package/docs-mcp.config.json +20 -0
  442. package/package.json +56 -0
  443. package/src/config.js +111 -0
  444. 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)