@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,456 @@
1
+ import 'dotenv/config';
2
+ import { ProbeAgent } from '@probelabs/probe/agent';
3
+ import { TokenUsageDisplay } from './tokenUsageDisplay.js';
4
+ import { writeFileSync, existsSync } from 'fs';
5
+ import { readFile, stat } from 'fs/promises';
6
+ import { join, resolve, isAbsolute } from 'path';
7
+ import { TelemetryConfig } from './telemetry.js';
8
+ import { trace } from '@opentelemetry/api';
9
+ import { appTracer } from './appTracer.js';
10
+
11
+ // Image configuration (duplicated from @probelabs/probe/agent/imageConfig for compatibility)
12
+ // TODO: Import from '@probelabs/probe/agent/imageConfig' after next package publish
13
+ const IMAGE_MIME_TYPES = {
14
+ 'png': 'image/png',
15
+ 'jpg': 'image/jpeg',
16
+ 'jpeg': 'image/jpeg',
17
+ 'webp': 'image/webp',
18
+ 'bmp': 'image/bmp',
19
+ 'svg': 'image/svg+xml'
20
+ };
21
+ const SUPPORTED_IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'webp', 'bmp', 'svg'];
22
+ const getExtensionPattern = (extensions = SUPPORTED_IMAGE_EXTENSIONS) => extensions.join('|');
23
+
24
+ // Parse and validate allowed folders from environment variable
25
+ const allowedFolders = process.env.ALLOWED_FOLDERS
26
+ ? process.env.ALLOWED_FOLDERS.split(',').map(folder => folder.trim()).filter(Boolean)
27
+ : [];
28
+
29
+ // Validate folders exist on startup - will be handled by index.js in non-interactive mode
30
+ // This is kept for backward compatibility with direct ProbeChat usage
31
+ const validateFolders = () => {
32
+ if (allowedFolders.length > 0) {
33
+ for (const folder of allowedFolders) {
34
+ const exists = existsSync(folder);
35
+ // Only log if not in non-interactive mode or if in debug mode
36
+ if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
37
+ console.log(`- ${folder} ${exists ? '✓' : '✗ (not found)'}`);
38
+ if (!exists) {
39
+ console.warn(`Warning: Folder "${folder}" does not exist or is not accessible`);
40
+ }
41
+ }
42
+ }
43
+ } else {
44
+ // Only log if not in non-interactive mode or if in debug mode
45
+ if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
46
+ console.warn('No folders configured via ALLOWED_FOLDERS. Tools might default to current directory or require explicit paths.');
47
+ }
48
+ }
49
+ };
50
+
51
+ // Only validate folders on startup if not in non-interactive mode
52
+ if (typeof process !== 'undefined' && !process.env.PROBE_CHAT_SKIP_FOLDER_VALIDATION) {
53
+ validateFolders();
54
+ }
55
+
56
+ // Maximum image file size (20MB) to prevent OOM attacks
57
+ const MAX_IMAGE_FILE_SIZE = 20 * 1024 * 1024;
58
+
59
+ /**
60
+ * Security validation for local file paths
61
+ * @param {string} filePath - The file path to validate
62
+ * @param {string} baseDir - The base directory to restrict access to
63
+ * @returns {boolean} - Whether the path is safe to access
64
+ */
65
+ function isSecureFilePath(filePath, baseDir = process.cwd()) {
66
+ try {
67
+ // Resolve the absolute path
68
+ const absolutePath = isAbsolute(filePath) ? filePath : resolve(baseDir, filePath);
69
+ const normalizedBase = resolve(baseDir);
70
+
71
+ // Ensure the resolved path is within the allowed directory
72
+ return absolutePath.startsWith(normalizedBase);
73
+ } catch (error) {
74
+ return false;
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Convert local image file to base64 data URL
80
+ * @param {string} filePath - Path to the image file
81
+ * @param {boolean} debug - Whether to log debug information
82
+ * @returns {Promise<string|null>} - Base64 data URL or null if failed
83
+ */
84
+ async function convertImageFileToBase64(filePath, debug = false) {
85
+ try {
86
+ // Security check: validate the file path against all allowed directories
87
+ const allowedDirs = allowedFolders.length > 0 ? allowedFolders : [process.cwd()];
88
+ const isPathAllowed = allowedDirs.some(dir => isSecureFilePath(filePath, dir));
89
+
90
+ if (!isPathAllowed) {
91
+ if (debug) {
92
+ console.log(`[DEBUG] Security check failed for path: ${filePath}`);
93
+ }
94
+ return null;
95
+ }
96
+
97
+ // Resolve the path - for relative paths, use the first allowed directory as base
98
+ const baseDir = allowedDirs[0];
99
+ const absolutePath = isAbsolute(filePath) ? filePath : resolve(baseDir, filePath);
100
+
101
+ // Check if file exists and get file stats
102
+ let fileStats;
103
+ try {
104
+ fileStats = await stat(absolutePath);
105
+ } catch (error) {
106
+ if (debug) {
107
+ console.log(`[DEBUG] File not found: ${absolutePath}`);
108
+ }
109
+ return null;
110
+ }
111
+
112
+ // Validate file size to prevent OOM attacks
113
+ if (fileStats.size > MAX_IMAGE_FILE_SIZE) {
114
+ if (debug) {
115
+ console.log(`[DEBUG] Image file too large: ${absolutePath} (${fileStats.size} bytes, max: ${MAX_IMAGE_FILE_SIZE})`);
116
+ }
117
+ return null;
118
+ }
119
+
120
+ // Determine MIME type based on file extension (from shared config)
121
+ const extension = absolutePath.toLowerCase().split('.').pop();
122
+ const mimeType = IMAGE_MIME_TYPES[extension];
123
+ if (!mimeType) {
124
+ if (debug) {
125
+ console.log(`[DEBUG] Unsupported image format: ${extension}`);
126
+ }
127
+ return null;
128
+ }
129
+
130
+ // Read file and convert to base64 asynchronously
131
+ const fileBuffer = await readFile(absolutePath);
132
+ const base64Data = fileBuffer.toString('base64');
133
+ const dataUrl = `data:${mimeType};base64,${base64Data}`;
134
+
135
+ if (debug) {
136
+ console.log(`[DEBUG] Successfully converted ${absolutePath} to base64 (${fileBuffer.length} bytes)`);
137
+ }
138
+
139
+ return dataUrl;
140
+ } catch (error) {
141
+ if (debug) {
142
+ console.log(`[DEBUG] Error converting file to base64: ${error.message}`);
143
+ }
144
+ return null;
145
+ }
146
+ }
147
+
148
+ // Export the extractImageUrls function for testing
149
+ export { extractImageUrls };
150
+
151
+ /**
152
+ * Extract image URLs and local file paths from message text
153
+ * @param {string} message - The message text to analyze
154
+ * @param {boolean} debug - Whether to log debug information
155
+ * @returns {Promise<Object>} Promise resolving to { urls: Array, cleanedMessage: string }
156
+ */
157
+ async function extractImageUrls(message, debug = false) {
158
+ // This function should be called within the session context, so it will inherit the trace ID
159
+ const tracer = trace.getTracer('probe-chat', '1.0.0');
160
+ return tracer.startActiveSpan('content.image.extract', async (span) => {
161
+ try {
162
+ // Pattern to match image URLs, base64 data, and local file paths:
163
+ // 1. GitHub private-user-images URLs (always images, regardless of extension)
164
+ // 2. GitHub user-attachments/assets URLs (always images, regardless of extension)
165
+ // 3. URLs with common image extensions (PNG, JPG, JPEG, WebP, BMP, SVG)
166
+ // 4. Base64 data URLs (data:image/...)
167
+ // 5. Local file paths with image extensions (relative and absolute)
168
+ // Updated to stop at quotes, spaces, or common HTML/XML delimiters
169
+ // Pattern dynamically generated from shared config
170
+ const extPattern = getExtensionPattern();
171
+ const imageUrlPattern = new RegExp(`(?:data:image/[a-zA-Z]*;base64,[A-Za-z0-9+/=]+|https?://(?:(?:private-user-images\\.githubusercontent\\.com|github\\.com/user-attachments/assets)/[^\\s"'<>]+|[^\\s"'<>]+\\.(?:${extPattern})(?:\\?[^\\s"'<>]*)?)|(?:\\.?\\.?/)?[^\\s"'<>]*\\.(?:${extPattern}))`, 'gi');
172
+
173
+ span.setAttributes({
174
+ 'message.length': message.length,
175
+ 'debug.enabled': debug
176
+ });
177
+
178
+ if (debug) {
179
+ console.log(`[DEBUG] Scanning message for image URLs. Message length: ${message.length}`);
180
+ console.log(`[DEBUG] Image URL pattern: ${imageUrlPattern.toString()}`);
181
+ }
182
+
183
+ const urls = [];
184
+ const foundPatterns = [];
185
+ let match;
186
+
187
+ while ((match = imageUrlPattern.exec(message)) !== null) {
188
+ foundPatterns.push(match[0]);
189
+ if (debug) {
190
+ console.log(`[DEBUG] Found image pattern: ${match[0]}`);
191
+ }
192
+ }
193
+
194
+ // Process each found pattern - convert local files to base64, keep URLs as-is
195
+ for (const pattern of foundPatterns) {
196
+ // Check if it's already a URL or base64 data
197
+ if (pattern.startsWith('http') || pattern.startsWith('data:image/')) {
198
+ urls.push(pattern);
199
+ if (debug) {
200
+ console.log(`[DEBUG] Using URL/base64 as-is: ${pattern.substring(0, 50)}...`);
201
+ }
202
+ } else {
203
+ // It's a local file path - convert to base64
204
+ const base64Data = await convertImageFileToBase64(pattern, debug);
205
+ if (base64Data) {
206
+ urls.push(base64Data);
207
+ if (debug) {
208
+ console.log(`[DEBUG] Converted local file ${pattern} to base64`);
209
+ }
210
+ } else {
211
+ if (debug) {
212
+ console.log(`[DEBUG] Failed to convert local file: ${pattern}`);
213
+ }
214
+ }
215
+ }
216
+ }
217
+
218
+ // Clean the message by removing found patterns
219
+ let cleanedMessage = message;
220
+ foundPatterns.forEach(pattern => {
221
+ cleanedMessage = cleanedMessage.replace(pattern, '').trim();
222
+ });
223
+
224
+ // Clean up any remaining extra whitespace
225
+ cleanedMessage = cleanedMessage.replace(/\s+/g, ' ').trim();
226
+
227
+ span.setAttributes({
228
+ 'patterns.found': foundPatterns.length,
229
+ 'images.processed': urls.length,
230
+ 'message.cleaned_length': cleanedMessage.length
231
+ });
232
+
233
+ if (debug) {
234
+ console.log(`[DEBUG] Found ${foundPatterns.length} patterns, processed ${urls.length} images`);
235
+ console.log(`[DEBUG] Cleaned message length: ${cleanedMessage.length}`);
236
+ }
237
+
238
+ return { urls, cleanedMessage };
239
+ } finally {
240
+ span.end();
241
+ }
242
+ });
243
+ }
244
+
245
+ /**
246
+ * ProbeChat class using ProbeAgent with MCP support
247
+ */
248
+ export class ProbeChat {
249
+ /**
250
+ * Create a new ProbeChat instance
251
+ * @param {Object} options - Configuration options
252
+ * @param {string} [options.sessionId] - Optional session ID
253
+ * @param {boolean} [options.isNonInteractive=false] - Suppress internal logs if true
254
+ * @param {string} [options.customPrompt] - Custom prompt to replace the default system message
255
+ * @param {string} [options.promptType] - Predefined prompt type (architect, code-review, support)
256
+ * @param {boolean} [options.allowEdit=false] - Allow the use of the 'implement' tool
257
+ * @param {string} [options.provider] - Force specific AI provider
258
+ * @param {string} [options.model] - Override model name
259
+ * @param {boolean} [options.debug] - Enable debug mode
260
+ * @param {boolean} [options.enableMcp=false] - Enable MCP tool integration
261
+ * @param {Array} [options.mcpServers] - MCP server configurations
262
+ * @param {boolean} [options.enableBash=false] - Enable bash command execution
263
+ * @param {Object} [options.bashConfig] - Bash configuration options
264
+ * @param {string} [options.completionPrompt] - Custom prompt to run after attempt_completion for validation/review (runs before mermaid/JSON validation)
265
+ */
266
+ constructor(options = {}) {
267
+ this.isNonInteractive = options.isNonInteractive || process.env.PROBE_NON_INTERACTIVE === '1';
268
+ this.debug = options.debug || process.env.DEBUG_CHAT === '1';
269
+
270
+ // Initialize ProbeAgent with MCP support
271
+ const agentOptions = {
272
+ ...options,
273
+ path: allowedFolders.length > 0 ? allowedFolders[0] : process.cwd(),
274
+ enableMcp: options.enableMcp || process.env.ENABLE_MCP === '1',
275
+ mcpServers: options.mcpServers
276
+ };
277
+
278
+ this.agent = new ProbeAgent(agentOptions);
279
+
280
+ // Initialize telemetry and token display
281
+ this.telemetryConfig = new TelemetryConfig();
282
+ this.tokenUsage = new TokenUsageDisplay();
283
+
284
+ if (this.debug) {
285
+ console.log(`[DEBUG] ProbeChat initialized with MCP ${agentOptions.enableMcp ? 'enabled' : 'disabled'}`);
286
+
287
+ // Log available tools after a short delay to allow MCP initialization
288
+ setTimeout(() => {
289
+ this.logAvailableTools();
290
+ }, 100);
291
+ }
292
+ }
293
+
294
+ /**
295
+ * Log all available tools (native + MCP) in debug mode
296
+ */
297
+ logAvailableTools() {
298
+ if (!this.debug) return;
299
+
300
+ console.log('\n[DEBUG] ========================================');
301
+ console.log('[DEBUG] All Available Tools:');
302
+ console.log('[DEBUG] ========================================');
303
+
304
+ // Get native tools from agent
305
+ if (this.agent.toolImplementations) {
306
+ console.log('[DEBUG] Native Tools:');
307
+ const nativeTools = Object.keys(this.agent.toolImplementations);
308
+ nativeTools.forEach(toolName => {
309
+ const tool = this.agent.toolImplementations[toolName];
310
+ const desc = tool.description || 'No description';
311
+ console.log(`[DEBUG] - ${toolName}: ${desc}`);
312
+ });
313
+ }
314
+
315
+ // Get MCP tools if available
316
+ if (this.agent.mcpBridge && this.agent.mcpBridge.mcpTools) {
317
+ const mcpTools = Object.keys(this.agent.mcpBridge.mcpTools);
318
+ if (mcpTools.length > 0) {
319
+ console.log('[DEBUG] MCP Tools:');
320
+ mcpTools.forEach(toolName => {
321
+ const tool = this.agent.mcpBridge.mcpTools[toolName];
322
+ const desc = tool.description || 'No description';
323
+ console.log(`[DEBUG] - ${toolName}: ${desc}`);
324
+ });
325
+ } else {
326
+ console.log('[DEBUG] MCP Tools: None loaded');
327
+ }
328
+ } else {
329
+ console.log('[DEBUG] MCP Tools: MCP not enabled or not initialized');
330
+ }
331
+
332
+ console.log('[DEBUG] ========================================\n');
333
+ }
334
+
335
+ /**
336
+ * Answer a question using the agentic flow with optional image support
337
+ * @param {string} message - The user's question
338
+ * @param {Object} [options] - Optional configuration
339
+ * @param {string} [options.schema] - JSON schema for structured output
340
+ * @param {Array} [options.images] - Array of image data (base64 strings or URLs)
341
+ * @returns {Promise<string>} - The final answer
342
+ */
343
+ async chat(message, options = {}) {
344
+ if (!message || typeof message !== 'string' || message.trim().length === 0) {
345
+ throw new Error('Message is required and must be a non-empty string');
346
+ }
347
+
348
+ // Extract images from the message text if not provided in options
349
+ let images = options.images || [];
350
+ let cleanedMessage = message;
351
+
352
+ if (!images.length) {
353
+ const extracted = await extractImageUrls(message, this.debug);
354
+ images = extracted.urls;
355
+ cleanedMessage = extracted.cleanedMessage;
356
+
357
+ if (this.debug && images.length > 0) {
358
+ console.log(`[DEBUG] Extracted ${images.length} images from message`);
359
+ }
360
+ }
361
+
362
+ // Use ProbeAgent to answer the question
363
+ const result = await this.agent.answer(cleanedMessage, images, options);
364
+
365
+ // Update token usage display
366
+ this.tokenUsage.updateFromTokenCounter(this.agent.tokenCounter);
367
+
368
+ if (!this.isNonInteractive) {
369
+ this.tokenUsage.display();
370
+ }
371
+
372
+ return result;
373
+ }
374
+
375
+ /**
376
+ * Get session ID
377
+ */
378
+ getSessionId() {
379
+ return this.agent.sessionId;
380
+ }
381
+
382
+ /**
383
+ * Get usage summary for the current session
384
+ */
385
+ getUsageSummary() {
386
+ return this.agent.tokenCounter.getUsageSummary();
387
+ }
388
+
389
+ /**
390
+ * Clear conversation history
391
+ */
392
+ clearHistory() {
393
+ this.agent.clearHistory();
394
+ this.tokenUsage.clear();
395
+ }
396
+
397
+ /**
398
+ * Export conversation history
399
+ */
400
+ exportHistory() {
401
+ return this.agent.history.map(msg => ({ ...msg }));
402
+ }
403
+
404
+ /**
405
+ * Save conversation history to file
406
+ */
407
+ saveHistory(filename) {
408
+ if (!filename) {
409
+ filename = `probe-chat-history-${this.agent.sessionId}-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.json`;
410
+ }
411
+
412
+ const historyData = {
413
+ sessionId: this.agent.sessionId,
414
+ timestamp: new Date().toISOString(),
415
+ messages: this.exportHistory(),
416
+ usage: this.getUsageSummary()
417
+ };
418
+
419
+ writeFileSync(filename, JSON.stringify(historyData, null, 2));
420
+
421
+ if (!this.isNonInteractive) {
422
+ console.log(`Conversation history saved to: ${filename}`);
423
+ }
424
+
425
+ return filename;
426
+ }
427
+
428
+ /**
429
+ * Cancel current request
430
+ */
431
+ cancel() {
432
+ this.agent.cancel();
433
+ }
434
+
435
+ /**
436
+ * Clean up resources (including MCP connections)
437
+ */
438
+ async cleanup() {
439
+ try {
440
+ await this.agent.cleanup();
441
+ } catch (error) {
442
+ // Log the error but don't throw to ensure graceful cleanup
443
+ if (!this.isNonInteractive) {
444
+ console.warn('Warning during cleanup:', error.message);
445
+ }
446
+ }
447
+ }
448
+ }
449
+
450
+ // Create the default instance using environment variables
451
+ export const chat = new ProbeChat({
452
+ enableMcp: process.env.ENABLE_MCP === '1',
453
+ debug: process.env.DEBUG_CHAT === '1'
454
+ });
455
+
456
+ export default chat;