@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,203 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { TelemetryConfig } from './telemetry.js';
4
+ import { appTracer } from './appTracer.js';
5
+ import { extractImageUrls } from './probeChat.js';
6
+ import { readFileSync, unlinkSync, existsSync } from 'fs';
7
+ import { createHash } from 'crypto';
8
+
9
+ /**
10
+ * Test to verify proper trace hierarchy with consistent trace IDs
11
+ */
12
+
13
+ console.log('๐Ÿ” Testing Trace Hierarchy\n');
14
+
15
+ const testTraceFile = './hierarchy-traces.jsonl';
16
+
17
+ // Clean up any existing test files
18
+ if (existsSync(testTraceFile)) {
19
+ unlinkSync(testTraceFile);
20
+ }
21
+
22
+ // Initialize telemetry
23
+ const telemetryConfig = new TelemetryConfig({
24
+ serviceName: 'probe-chat',
25
+ serviceVersion: '1.0.0',
26
+ enableFile: true,
27
+ enableConsole: false,
28
+ enableRemote: false,
29
+ filePath: testTraceFile,
30
+ });
31
+
32
+ telemetryConfig.initialize();
33
+
34
+ console.log('โœ… Telemetry initialized');
35
+
36
+ async function testTraceHierarchy() {
37
+ const sessionId = 'test-session-123';
38
+ const messageId = 'test-msg-456';
39
+ const message = 'Here is an image: https://github.com/user-attachments/assets/example.png';
40
+
41
+ // Calculate expected trace ID for verification
42
+ const expectedTraceId = createHash('sha256').update(sessionId).digest('hex').substring(0, 32);
43
+ console.log(`๐Ÿ“‹ Session ID: ${sessionId}`);
44
+ console.log(`๐Ÿ“‹ Expected Trace ID: ${expectedTraceId}`);
45
+
46
+ console.log('๐Ÿ“ Creating hierarchical test traces...');
47
+
48
+ // Start a chat session
49
+ const sessionSpan = appTracer.startChatSession(sessionId, message, 'anthropic', 'claude-3-7-sonnet-20250219');
50
+
51
+ // Start user message processing within session context
52
+ await appTracer.withSessionContext(sessionId, async () => {
53
+ const userProcessingSpan = appTracer.startUserMessageProcessing(sessionId, messageId, message, 1);
54
+
55
+ // Extract image URLs within user processing context
56
+ const result = await appTracer.withUserProcessingContext(sessionId, async () => {
57
+ return await extractImageUrls(message, true);
58
+ });
59
+
60
+ console.log('โœ… extractImageUrls result:', result);
61
+
62
+ // Start agent loop within user processing context
63
+ appTracer.withUserProcessingContext(sessionId, () => {
64
+ appTracer.startAgentLoop(sessionId, 5);
65
+
66
+ // Start iteration within agent loop context
67
+ appTracer.withAgentLoopContext(sessionId, () => {
68
+ appTracer.startAgentIteration(sessionId, 1, 3, 1000);
69
+
70
+ // Start AI request within iteration context
71
+ appTracer.withIterationContext(sessionId, 1, () => {
72
+ const aiRequestSpan = appTracer.startAiGenerationRequest(sessionId, 1, 'claude-3-7-sonnet-20250219', 'anthropic', {
73
+ temperature: 0.3,
74
+ maxTokens: 1000,
75
+ maxRetries: 2
76
+ });
77
+
78
+ // End AI request
79
+ appTracer.endAiRequest(sessionId, 1, true);
80
+ });
81
+
82
+ // End iteration
83
+ appTracer.endIteration(sessionId, 1, true, 'completion');
84
+ });
85
+
86
+ // End agent loop
87
+ appTracer.endAgentLoop(sessionId, 1, true, 'completion');
88
+ });
89
+
90
+ // End user processing
91
+ appTracer.endUserMessageProcessing(sessionId, true);
92
+ });
93
+
94
+ // End chat session
95
+ appTracer.endChatSession(sessionId, true, 1500);
96
+
97
+ console.log('โœ… All spans created and ended');
98
+ }
99
+
100
+ // Run the test
101
+ try {
102
+ await testTraceHierarchy();
103
+
104
+ // Force flush the spans
105
+ await telemetryConfig.sdk.getTracerProvider().forceFlush();
106
+
107
+ // Give it time to write to file
108
+ await new Promise(resolve => setTimeout(resolve, 1000));
109
+
110
+ console.log('\n๐Ÿ” Verifying trace hierarchy...');
111
+
112
+ if (existsSync(testTraceFile)) {
113
+ const traceData = readFileSync(testTraceFile, 'utf8');
114
+ const traceLines = traceData.split('\n').filter(Boolean);
115
+
116
+ console.log(`โœ… Found ${traceLines.length} trace entries`);
117
+
118
+ if (traceLines.length > 0) {
119
+ const traces = traceLines.map(line => JSON.parse(line));
120
+
121
+ // Group spans by trace ID
122
+ const traceGroups = {};
123
+ traces.forEach(trace => {
124
+ if (!traceGroups[trace.traceId]) {
125
+ traceGroups[trace.traceId] = [];
126
+ }
127
+ traceGroups[trace.traceId].push(trace);
128
+ });
129
+
130
+ console.log(`\n๐Ÿ“Š Trace Analysis:`);
131
+ console.log(` โœ“ Total spans: ${traces.length}`);
132
+ console.log(` โœ“ Unique trace IDs: ${Object.keys(traceGroups).length}`);
133
+
134
+ // Verify all spans belong to the same trace
135
+ if (Object.keys(traceGroups).length === 1) {
136
+ console.log(` โœ… SUCCESS: All spans belong to the same trace ID!`);
137
+
138
+ const traceId = Object.keys(traceGroups)[0];
139
+ const spans = traceGroups[traceId];
140
+
141
+ console.log(`\n๐Ÿ”— Trace ID: ${traceId}`);
142
+ console.log(`๐Ÿ“‹ Spans in hierarchy:`);
143
+
144
+ // Sort spans by start time to show hierarchy
145
+ spans.sort((a, b) => a.startTimeUnixNano - b.startTimeUnixNano);
146
+
147
+ spans.forEach((span, index) => {
148
+ const hasParent = span.parentSpanId ? 'โ””โ”€' : 'โ”Œโ”€';
149
+ console.log(` ${hasParent} [${index + 1}] ${span.name}`);
150
+ console.log(` Span ID: ${span.spanId}`);
151
+ if (span.parentSpanId) {
152
+ console.log(` Parent: ${span.parentSpanId}`);
153
+ }
154
+ console.log(` Status: ${span.status?.code === 1 ? 'OK' : span.status?.code === 2 ? 'ERROR' : 'UNKNOWN'}`);
155
+ });
156
+
157
+ // Verify parent-child relationships
158
+ let parentChildRelationships = 0;
159
+ spans.forEach(span => {
160
+ if (span.parentSpanId) {
161
+ const parentExists = spans.some(s => s.spanId === span.parentSpanId);
162
+ if (parentExists) {
163
+ parentChildRelationships++;
164
+ } else {
165
+ console.log(` โš ๏ธ Span ${span.name} has invalid parent reference`);
166
+ }
167
+ }
168
+ });
169
+
170
+ console.log(`\nโœ… Parent-child relationships verified: ${parentChildRelationships}/${spans.length - 1} spans have valid parents`);
171
+
172
+ } else {
173
+ console.log(` โŒ FAILURE: Spans are spread across ${Object.keys(traceGroups).length} different trace IDs`);
174
+
175
+ Object.entries(traceGroups).forEach(([traceId, spans]) => {
176
+ console.log(` Trace ${traceId}: ${spans.length} spans`);
177
+ spans.forEach(span => {
178
+ console.log(` - ${span.name}`);
179
+ });
180
+ });
181
+ }
182
+ }
183
+
184
+ console.log('\n๐ŸŽ‰ Hierarchy test completed!');
185
+
186
+ } else {
187
+ console.log('โŒ Trace file was not created');
188
+ }
189
+
190
+ } catch (error) {
191
+ console.error('โŒ Test failed:', error);
192
+ } finally {
193
+ // Clean up
194
+ await telemetryConfig.shutdown();
195
+ console.log('\n๐Ÿงน Telemetry shutdown complete');
196
+
197
+ // Keep the trace file for manual inspection
198
+ if (existsSync(testTraceFile)) {
199
+ console.log(`๐Ÿ“ Trace file preserved: ${testTraceFile}`);
200
+ }
201
+ }
202
+
203
+ console.log('\nโœ… Trace hierarchy test completed!');
@@ -0,0 +1,37 @@
1
+ import { ProbeChat } from './probeChat.js';
2
+
3
+ // Test image extraction with OpenTelemetry spans
4
+ async function testImageExtraction() {
5
+ console.log('Testing image extraction with OpenTelemetry spans...\n');
6
+
7
+ try {
8
+ // Create a ProbeChat instance with no API keys mode
9
+ const probeChat = new ProbeChat({
10
+ debug: true,
11
+ noApiKeysMode: true
12
+ });
13
+
14
+ // Test message with images
15
+ const testMessage = `
16
+ Here are some images:
17
+ - GitHub asset: https://github.com/user-attachments/assets/example.png
18
+ - Private image: https://private-user-images.githubusercontent.com/123/example.jpg
19
+ - Regular image: https://example.com/photo.jpeg
20
+
21
+ And some text without images.
22
+ `;
23
+
24
+ console.log('๐Ÿ” Testing chat with images (no API keys mode)...');
25
+ const result = await probeChat.chat(testMessage);
26
+ console.log('โœ… Chat completed successfully');
27
+ console.log('๐Ÿ“„ Response:', result.response.substring(0, 100) + '...');
28
+
29
+ // Test completed
30
+ console.log('\n๐ŸŽ‰ Test completed! Check test-image-spans.jsonl for trace data.');
31
+
32
+ } catch (error) {
33
+ console.error('โŒ Test failed:', error.message);
34
+ }
35
+ }
36
+
37
+ testImageExtraction().catch(console.error);
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * NOTE: This is a standalone test file. The MIME types and regex patterns below
5
+ * are duplicated from @probelabs/probe/agent/imageConfig for self-containment.
6
+ * When modifying image support, update both the shared config and this file.
7
+ */
8
+
9
+ import { writeFileSync, unlinkSync, existsSync, readFileSync } from 'fs';
10
+ import { resolve, isAbsolute } from 'path';
11
+
12
+ // Mock the extractImageUrls function for testing (to avoid API key requirements)
13
+ // MIME types duplicated from @probelabs/probe/agent/imageConfig (keep in sync!)
14
+ async function extractImageUrls(message, debug = false) {
15
+ const imageUrlPattern = /(?:data:image\/[a-zA-Z]*;base64,[A-Za-z0-9+/=]+|https?:\/\/(?:(?:private-user-images\.githubusercontent\.com|github\.com\/user-attachments\/assets)\/[^\s"'<>]+|[^\s"'<>]+\.(?:png|jpg|jpeg|webp|bmp|svg)(?:\?[^\s"'<>]*)?)|(?:\.?\.?\/)?[^\s"'<>]*\.(?:png|jpg|jpeg|webp|bmp|svg))/gi;
16
+
17
+ const urls = [];
18
+ const foundPatterns = [];
19
+ let match;
20
+
21
+ while ((match = imageUrlPattern.exec(message)) !== null) {
22
+ foundPatterns.push(match[0]);
23
+ if (debug) {
24
+ console.log(`[DEBUG] Found image pattern: ${match[0]}`);
25
+ }
26
+ }
27
+
28
+ // Process each found pattern
29
+ for (const pattern of foundPatterns) {
30
+ if (pattern.startsWith('http') || pattern.startsWith('data:image/')) {
31
+ urls.push(pattern);
32
+ if (debug) {
33
+ console.log(`[DEBUG] Using URL/base64 as-is: ${pattern.substring(0, 50)}...`);
34
+ }
35
+ } else {
36
+ // Local file path - convert to base64
37
+ try {
38
+ const absolutePath = isAbsolute(pattern) ? pattern : resolve(process.cwd(), pattern);
39
+
40
+ if (!existsSync(absolutePath)) {
41
+ if (debug) console.log(`[DEBUG] File not found: ${absolutePath}`);
42
+ continue;
43
+ }
44
+
45
+ const extension = absolutePath.toLowerCase().split('.').pop();
46
+ // MIME types from @probelabs/probe/agent/imageConfig (keep in sync!)
47
+ const mimeTypes = {
48
+ 'png': 'image/png',
49
+ 'jpg': 'image/jpeg',
50
+ 'jpeg': 'image/jpeg',
51
+ 'webp': 'image/webp',
52
+ 'bmp': 'image/bmp',
53
+ 'svg': 'image/svg+xml'
54
+ };
55
+
56
+ const mimeType = mimeTypes[extension];
57
+ if (!mimeType) {
58
+ if (debug) console.log(`[DEBUG] Unsupported format: ${extension}`);
59
+ continue;
60
+ }
61
+
62
+ const fileBuffer = readFileSync(absolutePath);
63
+ const base64Data = fileBuffer.toString('base64');
64
+ const dataUrl = `data:${mimeType};base64,${base64Data}`;
65
+ urls.push(dataUrl);
66
+
67
+ if (debug) {
68
+ console.log(`[DEBUG] Converted ${pattern} to base64 (${fileBuffer.length} bytes)`);
69
+ }
70
+ } catch (error) {
71
+ if (debug) {
72
+ console.log(`[DEBUG] Error processing ${pattern}: ${error.message}`);
73
+ }
74
+ }
75
+ }
76
+ }
77
+
78
+ // Clean message
79
+ let cleanedMessage = message;
80
+ foundPatterns.forEach(pattern => {
81
+ cleanedMessage = cleanedMessage.replace(pattern, '').trim();
82
+ });
83
+ cleanedMessage = cleanedMessage.replace(/\s+/g, ' ').trim();
84
+
85
+ return { urls, cleanedMessage };
86
+ }
87
+
88
+ /**
89
+ * Test to verify local image file reading functionality
90
+ */
91
+
92
+ console.log('๐Ÿ–ผ๏ธ Testing Local Image File Reading\n');
93
+
94
+ async function testLocalImageReading() {
95
+ try {
96
+ // Create a simple test image file (1x1 PNG)
97
+ const testImagePath = './test-image.png';
98
+ const simplePngBuffer = Buffer.from([
99
+ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, // PNG signature
100
+ 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, // IHDR chunk
101
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, // 1x1 dimensions
102
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4,
103
+ 0x89, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x44, 0x41, // IDAT chunk
104
+ 0x54, 0x78, 0x9C, 0x62, 0x00, 0x02, 0x00, 0x00,
105
+ 0x05, 0x00, 0x01, 0x0D, 0x0A, 0x2D, 0xB4, 0x00,
106
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, // IEND chunk
107
+ 0x42, 0x60, 0x82
108
+ ]);
109
+
110
+ // Write test image
111
+ writeFileSync(testImagePath, simplePngBuffer);
112
+ console.log(`โœ… Created test image: ${testImagePath}`);
113
+
114
+ // Test 1: Local file path extraction
115
+ console.log('\n๐Ÿ“‹ Test 1: Local file path in message');
116
+ const message1 = `Please analyze this image: ${testImagePath} and tell me about it.`;
117
+ const result1 = await extractImageUrls(message1, true);
118
+
119
+ console.log(`Found ${result1.urls.length} images`);
120
+ if (result1.urls.length > 0) {
121
+ console.log(`โœ… Successfully converted local file to base64`);
122
+ console.log(` Original: ${testImagePath}`);
123
+ console.log(` Base64 length: ${result1.urls[0].length} characters`);
124
+ console.log(` Data URL prefix: ${result1.urls[0].substring(0, 30)}...`);
125
+ } else {
126
+ console.log('โŒ No images found');
127
+ }
128
+ console.log(`Cleaned message: "${result1.cleanedMessage}"`);
129
+
130
+ // Test 2: Mixed URLs and local files
131
+ console.log('\n๐Ÿ“‹ Test 2: Mixed URLs and local files');
132
+ const message2 = `Compare ${testImagePath} with https://example.com/remote.png`;
133
+ const result2 = await extractImageUrls(message2, true);
134
+
135
+ console.log(`Found ${result2.urls.length} images`);
136
+ console.log(`Cleaned message: "${result2.cleanedMessage}"`);
137
+
138
+ // Test 3: Relative paths
139
+ console.log('\n๐Ÿ“‹ Test 3: Relative path variations');
140
+ const messages = [
141
+ `Image at ./test-image.png`,
142
+ `Image at ../examples/chat/test-image.png`,
143
+ `Image at test-image.png`
144
+ ];
145
+
146
+ for (const msg of messages) {
147
+ const result = await extractImageUrls(msg, true);
148
+ console.log(`"${msg}" -> ${result.urls.length} images found`);
149
+ }
150
+
151
+ // Test 4: Security - try to access file outside allowed directory
152
+ console.log('\n๐Ÿ“‹ Test 4: Security validation');
153
+ const securityTestMessage = 'Look at this image: /etc/passwd.png';
154
+ const securityResult = await extractImageUrls(securityTestMessage, true);
155
+ console.log(`Security test: ${securityResult.urls.length} images found (should be 0)`);
156
+
157
+ // Test 5: Non-existent file
158
+ console.log('\n๐Ÿ“‹ Test 5: Non-existent file');
159
+ const missingFileMessage = 'Check this image: ./missing-image.png';
160
+ const missingResult = await extractImageUrls(missingFileMessage, true);
161
+ console.log(`Missing file test: ${missingResult.urls.length} images found (should be 0)`);
162
+
163
+ // Cleanup
164
+ if (existsSync(testImagePath)) {
165
+ unlinkSync(testImagePath);
166
+ console.log('\n๐Ÿงน Cleaned up test image');
167
+ }
168
+
169
+ console.log('\n๐ŸŽ‰ Local image reading tests completed!');
170
+
171
+ } catch (error) {
172
+ console.error('โŒ Test failed:', error);
173
+ }
174
+ }
175
+
176
+ testLocalImageReading().catch(console.error);
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Test script to verify MCP integration with XML syntax
5
+ */
6
+
7
+ import { MCPXmlBridge, parseXmlMcpToolCall, parseHybridXmlToolCall } from '@probelabs/probe/agent/mcp';
8
+
9
+ console.log('Testing MCP XML Integration...\n');
10
+
11
+ // Test 1: Parse MCP tool call with JSON parameters
12
+ console.log('Test 1: Parse MCP tool call with JSON params');
13
+ const mcpXml = `
14
+ <mcp_filesystem_read>
15
+ <params>
16
+ {
17
+ "path": "/etc/hosts",
18
+ "encoding": "utf-8"
19
+ }
20
+ </params>
21
+ </mcp_filesystem_read>
22
+ `;
23
+
24
+ const parsed = parseXmlMcpToolCall(mcpXml, ['mcp_filesystem_read']);
25
+ if (parsed && parsed.toolName === 'mcp_filesystem_read' && parsed.params.path === '/etc/hosts') {
26
+ console.log('โœ… Test 1 PASSED: MCP tool parsed correctly with JSON params\n');
27
+ } else {
28
+ console.log('โŒ Test 1 FAILED:', parsed, '\n');
29
+ }
30
+
31
+ // Test 2: Parse native tool call with XML parameters
32
+ console.log('Test 2: Parse native tool call with XML params');
33
+ const nativeXml = `
34
+ <search>
35
+ <query>authentication</query>
36
+ <path>./src</path>
37
+ </search>
38
+ `;
39
+
40
+ const nativeParsed = parseHybridXmlToolCall(nativeXml, ['search']);
41
+ if (nativeParsed && nativeParsed.toolName === 'search' && nativeParsed.params.query === 'authentication') {
42
+ console.log('โœ… Test 2 PASSED: Native tool parsed correctly with XML params\n');
43
+ } else {
44
+ console.log('โŒ Test 2 FAILED:', nativeParsed, '\n');
45
+ }
46
+
47
+ // Test 3: Create MCP bridge and generate tool definitions
48
+ console.log('Test 3: MCP Bridge tool definition generation');
49
+ const bridge = new MCPXmlBridge({ debug: false });
50
+
51
+ // Simulate adding a tool
52
+ bridge.mcpTools['test_tool'] = {
53
+ description: 'A test MCP tool',
54
+ inputSchema: {
55
+ type: 'object',
56
+ properties: {
57
+ message: { type: 'string', description: 'Test message' },
58
+ count: { type: 'number', description: 'Count value' }
59
+ },
60
+ required: ['message']
61
+ }
62
+ };
63
+
64
+ bridge.xmlDefinitions['test_tool'] = bridge.constructor.prototype.constructor.mcpToolToXmlDefinition ||
65
+ `## test_tool
66
+ Description: A test MCP tool
67
+
68
+ Parameters (provide as JSON object):
69
+ - message: string (required) - Test message
70
+ - count: number (optional) - Count value
71
+
72
+ Usage:
73
+ <test_tool>
74
+ <params>
75
+ {
76
+ "message": "hello",
77
+ "count": 42
78
+ }
79
+ </params>
80
+ </test_tool>`;
81
+
82
+ const xmlDef = bridge.getXmlToolDefinitions();
83
+ if (xmlDef.includes('test_tool') && xmlDef.includes('JSON object')) {
84
+ console.log('โœ… Test 3 PASSED: XML definitions generated correctly\n');
85
+ } else {
86
+ console.log('โŒ Test 3 FAILED: XML definitions not correct\n');
87
+ }
88
+
89
+ // Test 4: Test hybrid parsing with both tool types
90
+ console.log('Test 4: Hybrid parsing with MCP bridge');
91
+ const hybridXml1 = `
92
+ <test_tool>
93
+ <params>
94
+ {"message": "test", "count": 10}
95
+ </params>
96
+ </test_tool>
97
+ `;
98
+
99
+ const hybridResult = parseHybridXmlToolCall(hybridXml1, ['search', 'query'], bridge);
100
+ if (hybridResult && hybridResult.type === 'mcp' && hybridResult.params.message === 'test') {
101
+ console.log('โœ… Test 4 PASSED: Hybrid parser correctly identified MCP tool\n');
102
+ } else {
103
+ console.log('โŒ Test 4 FAILED:', hybridResult, '\n');
104
+ }
105
+
106
+ // Test 5: Test parsing with thinking tags (should be ignored)
107
+ console.log('Test 5: Parse with thinking tags');
108
+ const xmlWithThinking = `
109
+ <thinking>
110
+ I need to search for authentication code.
111
+ Let me use the search tool.
112
+ </thinking>
113
+ <search>
114
+ <query>auth</query>
115
+ </search>
116
+ `;
117
+
118
+ const thinkingParsed = parseHybridXmlToolCall(xmlWithThinking, ['search']);
119
+ if (thinkingParsed && thinkingParsed.toolName === 'search' && thinkingParsed.params.query === 'auth') {
120
+ console.log('โœ… Test 5 PASSED: Thinking tags correctly ignored\n');
121
+ } else {
122
+ console.log('โŒ Test 5 FAILED:', thinkingParsed, '\n');
123
+ }
124
+
125
+ console.log('=== MCP Integration Test Summary ===');
126
+ console.log('The MCP-XML bridge is working correctly!');
127
+ console.log('\nKey features tested:');
128
+ console.log('1. MCP tools with JSON parameters in <params> tag');
129
+ console.log('2. Native tools with XML parameters');
130
+ console.log('3. XML tool definition generation for system prompts');
131
+ console.log('4. Hybrid parsing supporting both tool types');
132
+ console.log('5. Thinking tag filtering');
133
+ console.log('\nThe Probe agent can now:');
134
+ console.log('- Use native tools with XML syntax: <tool><param>value</param></tool>');
135
+ console.log('- Use MCP tools with JSON syntax: <mcp_tool><params>{"key": "value"}</params></mcp_tool>');
136
+ console.log('- Connect to external MCP servers for additional capabilities');