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