@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,120 @@
1
+ /**
2
+ * Tests to ensure all required files are listed in package.json "files" array.
3
+ * This prevents publishing broken packages where imports fail due to missing files.
4
+ */
5
+
6
+ import { describe, it } from 'node:test';
7
+ import assert from 'node:assert';
8
+ import { readFileSync, existsSync, statSync } from 'node:fs';
9
+ import { fileURLToPath } from 'node:url';
10
+ import { dirname, join, resolve } from 'node:path';
11
+
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = dirname(__filename);
14
+ const packageRoot = resolve(__dirname, '../..');
15
+
16
+ /**
17
+ * Check if a file path is covered by any directory entry in the files array.
18
+ * For example, "storage/JsonChatStorage.js" is covered by "storage/".
19
+ */
20
+ function isFileCoveredByDirectory(filePath, filesArray) {
21
+ const parts = filePath.split('/');
22
+ if (parts.length > 1) {
23
+ // Check if any parent directory is in the files array
24
+ const dir = parts[0] + '/';
25
+ return filesArray.includes(dir);
26
+ }
27
+ return false;
28
+ }
29
+
30
+ describe('Package Files Validation', () => {
31
+ it('should include all locally imported JS files in the files array', () => {
32
+ const packageJsonPath = join(packageRoot, 'package.json');
33
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
34
+ const filesArray = packageJson.files || [];
35
+
36
+ // Get all top-level JS files that are imported by files in the files array
37
+ const jsFilesInArray = filesArray.filter(f => f.endsWith('.js') && !f.includes('/'));
38
+
39
+ // Read each JS file and find local imports
40
+ const missingFiles = [];
41
+
42
+ for (const jsFile of jsFilesInArray) {
43
+ const filePath = join(packageRoot, jsFile);
44
+ if (!existsSync(filePath)) continue;
45
+
46
+ const content = readFileSync(filePath, 'utf-8');
47
+
48
+ // Match ES6 imports like: import { X } from './SomeFile.js'
49
+ const importRegex = /from\s+['"]\.\/([^'"]+\.js)['"]/g;
50
+ let match;
51
+
52
+ while ((match = importRegex.exec(content)) !== null) {
53
+ const importedFile = match[1];
54
+ // Check if this local import is in the files array (directly or via directory)
55
+ const isDirectlyIncluded = filesArray.includes(importedFile);
56
+ const isCoveredByDir = isFileCoveredByDirectory(importedFile, filesArray);
57
+
58
+ if (!isDirectlyIncluded && !isCoveredByDir) {
59
+ // Verify the file actually exists
60
+ if (existsSync(join(packageRoot, importedFile))) {
61
+ missingFiles.push({
62
+ importedBy: jsFile,
63
+ missingFile: importedFile
64
+ });
65
+ }
66
+ }
67
+ }
68
+ }
69
+
70
+ if (missingFiles.length > 0) {
71
+ const errorMsg = missingFiles
72
+ .map(m => ` - "${m.missingFile}" (imported by ${m.importedBy})`)
73
+ .join('\n');
74
+ assert.fail(
75
+ `The following files are imported but not listed in package.json "files" array:\n${errorMsg}\n` +
76
+ `Add them to the "files" array to ensure they are included in the published package.`
77
+ );
78
+ }
79
+ });
80
+
81
+ it('should have all files in the files array actually exist', () => {
82
+ const packageJsonPath = join(packageRoot, 'package.json');
83
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
84
+ const filesArray = packageJson.files || [];
85
+
86
+ const missingFiles = [];
87
+
88
+ for (const file of filesArray) {
89
+ const filePath = join(packageRoot, file);
90
+ if (!existsSync(filePath)) {
91
+ missingFiles.push(file);
92
+ }
93
+ }
94
+
95
+ if (missingFiles.length > 0) {
96
+ assert.fail(
97
+ `The following files are listed in package.json "files" but do not exist:\n` +
98
+ missingFiles.map(f => ` - ${f}`).join('\n')
99
+ );
100
+ }
101
+ });
102
+
103
+ it('should include ChatSessionManager.js which is required by webServer.js', () => {
104
+ // Explicit test for the specific bug that was found
105
+ const packageJsonPath = join(packageRoot, 'package.json');
106
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
107
+ const filesArray = packageJson.files || [];
108
+
109
+ assert.ok(
110
+ filesArray.includes('ChatSessionManager.js'),
111
+ 'ChatSessionManager.js must be in the files array - it is required by webServer.js for --web mode'
112
+ );
113
+
114
+ // Also verify webServer.js is included
115
+ assert.ok(
116
+ filesArray.includes('webServer.js'),
117
+ 'webServer.js must be in the files array - it provides the --web functionality'
118
+ );
119
+ });
120
+ });
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn } from 'child_process';
4
+ import { fileURLToPath } from 'url';
5
+ import { dirname, join } from 'path';
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+
10
+ console.log('๐Ÿ” Verifying Probe Chat Integration Tests\n');
11
+
12
+ const tests = [
13
+ {
14
+ name: 'Chat Flow Tests',
15
+ file: 'test/integration/chatFlows.test.js',
16
+ expectedTests: 12
17
+ },
18
+ {
19
+ name: 'Tool Calling Tests',
20
+ file: 'test/integration/toolCalling.test.js',
21
+ expectedTests: 13
22
+ }
23
+ ];
24
+
25
+ async function runTest(testInfo) {
26
+ return new Promise((resolve) => {
27
+ console.log(`Running ${testInfo.name}...`);
28
+
29
+ const child = spawn('node', [
30
+ '--test',
31
+ '--test-timeout=30000',
32
+ testInfo.file
33
+ ], {
34
+ cwd: join(__dirname, '..'),
35
+ stdio: 'pipe'
36
+ });
37
+
38
+ let output = '';
39
+ let errorOutput = '';
40
+
41
+ child.stdout.on('data', (data) => {
42
+ output += data.toString();
43
+ });
44
+
45
+ child.stderr.on('data', (data) => {
46
+ errorOutput += data.toString();
47
+ });
48
+
49
+ child.on('close', (code) => {
50
+ const passMatch = output.match(/# pass (\d+)/);
51
+ const failMatch = output.match(/# fail (\d+)/);
52
+ const testsMatch = output.match(/# tests (\d+)/);
53
+ const durationMatch = output.match(/# duration_ms ([\d.]+)/);
54
+
55
+ const passed = passMatch ? parseInt(passMatch[1]) : 0;
56
+ const failed = failMatch ? parseInt(failMatch[1]) : 0;
57
+ const total = testsMatch ? parseInt(testsMatch[1]) : 0;
58
+ const duration = durationMatch ? parseFloat(durationMatch[1]) : 0;
59
+
60
+ resolve({
61
+ ...testInfo,
62
+ code,
63
+ passed,
64
+ failed,
65
+ total,
66
+ duration,
67
+ errorOutput
68
+ });
69
+ });
70
+ });
71
+ }
72
+
73
+ async function main() {
74
+ const results = [];
75
+
76
+ for (const test of tests) {
77
+ const result = await runTest(test);
78
+ results.push(result);
79
+
80
+ if (result.code === 0 && result.failed === 0 && result.total === result.expectedTests) {
81
+ console.log(`โœ… ${test.name}: ${result.passed}/${result.total} tests passed (${(result.duration / 1000).toFixed(2)}s)`);
82
+ } else {
83
+ console.log(`โŒ ${test.name}: ${result.passed}/${result.total} tests passed, ${result.failed} failed`);
84
+ if (result.errorOutput) {
85
+ console.log(` Error: ${result.errorOutput.split('\n')[0]}`);
86
+ }
87
+ }
88
+ console.log('');
89
+ }
90
+
91
+ console.log('๐Ÿ“Š Summary:');
92
+ const totalPassed = results.reduce((sum, r) => sum + r.passed, 0);
93
+ const totalFailed = results.reduce((sum, r) => sum + r.failed, 0);
94
+ const totalTests = results.reduce((sum, r) => sum + r.total, 0);
95
+ const totalDuration = results.reduce((sum, r) => sum + r.duration, 0);
96
+
97
+ console.log(`Total tests: ${totalTests}`);
98
+ console.log(`Passed: ${totalPassed}`);
99
+ console.log(`Failed: ${totalFailed}`);
100
+ console.log(`Total duration: ${(totalDuration / 1000).toFixed(2)}s`);
101
+
102
+ if (totalFailed === 0 && totalTests === 25) {
103
+ console.log('\nโœ… All integration tests are working correctly!');
104
+ console.log('\nKey features verified:');
105
+ console.log('- Mock LLM provider with streaming support');
106
+ console.log('- Mock backend for implement tool');
107
+ console.log('- Multi-turn conversations');
108
+ console.log('- Tool calling and execution');
109
+ console.log('- Error handling and recovery');
110
+ console.log('- Timeout handling');
111
+ process.exit(0);
112
+ } else {
113
+ console.log('\nโŒ Some tests are failing or count mismatch');
114
+ process.exit(1);
115
+ }
116
+ }
117
+
118
+ main().catch(console.error);
@@ -0,0 +1,294 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Test script to verify agentic loop image loading functionality
5
+ *
6
+ * NOTE: This is a standalone test file. The MIME types and regex patterns below
7
+ * are duplicated from @probelabs/probe/agent/imageConfig for self-containment.
8
+ * When modifying image support, update both the shared config and this file.
9
+ */
10
+
11
+ import { writeFileSync, unlinkSync, existsSync } from 'fs';
12
+ import { resolve } from 'path';
13
+
14
+ // Mock ProbeAgent to test image processing without API calls
15
+ // MIME types duplicated from @probelabs/probe/agent/imageConfig (keep in sync!)
16
+ class MockProbeAgent {
17
+ constructor(options = {}) {
18
+ this.debug = options.debug || true;
19
+ this.allowedFolders = options.path ? [options.path] : [process.cwd()];
20
+ this.pendingImages = new Map();
21
+ this.currentImages = [];
22
+ }
23
+
24
+ // Copy the image processing methods from ProbeAgent.js
25
+ async processImageReferences(content) {
26
+ if (!content) return;
27
+
28
+ const imagePatterns = [
29
+ /(?:\.?\.?\/)?[^\s"'<>\[\]]+\.(?:png|jpg|jpeg|webp|bmp|svg)(?!\w)/gi,
30
+ /(?:image|file|screenshot|diagram|photo|picture|graphic)\s*:?\s*([^\s"'<>\[\]]+\.(?:png|jpg|jpeg|webp|bmp|svg))(?!\w)/gi,
31
+ /(?:found|saved|created|generated).*?([^\s"'<>\[\]]+\.(?:png|jpg|jpeg|webp|bmp|svg))(?!\w)/gi
32
+ ];
33
+
34
+ const foundPaths = new Set();
35
+
36
+ for (const pattern of imagePatterns) {
37
+ let match;
38
+ while ((match = pattern.exec(content)) !== null) {
39
+ const imagePath = match[1] || match[0];
40
+ if (imagePath && imagePath.length > 0) {
41
+ foundPaths.add(imagePath.trim());
42
+ }
43
+ }
44
+ }
45
+
46
+ if (foundPaths.size === 0) return;
47
+
48
+ if (this.debug) {
49
+ console.log(`[DEBUG] Found ${foundPaths.size} potential image references:`, Array.from(foundPaths));
50
+ }
51
+
52
+ for (const imagePath of foundPaths) {
53
+ await this.loadImageIfValid(imagePath);
54
+ }
55
+ }
56
+
57
+ async loadImageIfValid(imagePath) {
58
+ try {
59
+ if (this.pendingImages.has(imagePath)) {
60
+ if (this.debug) {
61
+ console.log(`[DEBUG] Image already loaded: ${imagePath}`);
62
+ }
63
+ return true;
64
+ }
65
+
66
+ const baseDir = this.allowedFolders && this.allowedFolders.length > 0 ? this.allowedFolders[0] : process.cwd();
67
+ const absolutePath = resolve(baseDir, imagePath);
68
+
69
+ if (!absolutePath.startsWith(resolve(baseDir))) {
70
+ if (this.debug) {
71
+ console.log(`[DEBUG] Image path outside allowed directory: ${imagePath}`);
72
+ }
73
+ return false;
74
+ }
75
+
76
+ if (!existsSync(absolutePath)) {
77
+ if (this.debug) {
78
+ console.log(`[DEBUG] Image file not found: ${absolutePath}`);
79
+ }
80
+ return false;
81
+ }
82
+
83
+ const extension = absolutePath.toLowerCase().split('.').pop();
84
+ // Supported extensions from @probelabs/probe/agent/imageConfig (keep in sync!)
85
+ const supportedExtensions = ['png', 'jpg', 'jpeg', 'webp', 'bmp', 'svg'];
86
+ if (!supportedExtensions.includes(extension)) {
87
+ if (this.debug) {
88
+ console.log(`[DEBUG] Unsupported image format: ${extension}`);
89
+ }
90
+ return false;
91
+ }
92
+
93
+ // MIME types from @probelabs/probe/agent/imageConfig (keep in sync!)
94
+ const mimeTypes = {
95
+ 'png': 'image/png',
96
+ 'jpg': 'image/jpeg',
97
+ 'jpeg': 'image/jpeg',
98
+ 'webp': 'image/webp',
99
+ 'bmp': 'image/bmp',
100
+ 'svg': 'image/svg+xml'
101
+ };
102
+ const mimeType = mimeTypes[extension];
103
+
104
+ // Simulate reading file (use minimal data for test)
105
+ const mockBase64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==';
106
+ const dataUrl = `data:${mimeType};base64,${mockBase64}`;
107
+
108
+ this.pendingImages.set(imagePath, dataUrl);
109
+
110
+ if (this.debug) {
111
+ console.log(`[DEBUG] Successfully loaded image: ${imagePath} (simulated)`);
112
+ }
113
+
114
+ return true;
115
+ } catch (error) {
116
+ if (this.debug) {
117
+ console.log(`[DEBUG] Failed to load image ${imagePath}: ${error.message}`);
118
+ }
119
+ return false;
120
+ }
121
+ }
122
+
123
+ getCurrentImages() {
124
+ return Array.from(this.pendingImages.values());
125
+ }
126
+
127
+ clearLoadedImages() {
128
+ this.pendingImages.clear();
129
+ this.currentImages = [];
130
+ if (this.debug) {
131
+ console.log('[DEBUG] Cleared all loaded images');
132
+ }
133
+ }
134
+
135
+ prepareMessagesWithImages(messages) {
136
+ const loadedImages = this.getCurrentImages();
137
+
138
+ if (loadedImages.length === 0) {
139
+ return messages;
140
+ }
141
+
142
+ const messagesWithImages = [...messages];
143
+ const lastUserMessageIndex = messagesWithImages.map(m => m.role).lastIndexOf('user');
144
+
145
+ if (lastUserMessageIndex === -1) {
146
+ if (this.debug) {
147
+ console.log('[DEBUG] No user messages found to attach images to');
148
+ }
149
+ return messages;
150
+ }
151
+
152
+ const lastUserMessage = messagesWithImages[lastUserMessageIndex];
153
+
154
+ if (typeof lastUserMessage.content === 'string') {
155
+ messagesWithImages[lastUserMessageIndex] = {
156
+ ...lastUserMessage,
157
+ content: [
158
+ { type: 'text', text: lastUserMessage.content },
159
+ ...loadedImages.map(imageData => ({
160
+ type: 'image',
161
+ image: imageData
162
+ }))
163
+ ]
164
+ };
165
+
166
+ if (this.debug) {
167
+ console.log(`[DEBUG] Added ${loadedImages.length} images to the latest user message`);
168
+ }
169
+ }
170
+
171
+ return messagesWithImages;
172
+ }
173
+ }
174
+
175
+ async function testAgenticImageLoading() {
176
+ console.log('๐Ÿค– Testing Agentic Loop Image Loading\n');
177
+
178
+ // Create test images
179
+ const testImages = ['./test-diagram.png', './screenshot.jpg', './chart.png'];
180
+ const simplePng = Buffer.from([
181
+ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A,
182
+ 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
183
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
184
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4,
185
+ 0x89, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x44, 0x41,
186
+ 0x54, 0x78, 0x9C, 0x62, 0x00, 0x02, 0x00, 0x00,
187
+ 0x05, 0x00, 0x01, 0x0D, 0x0A, 0x2D, 0xB4, 0x00,
188
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE,
189
+ 0x42, 0x60, 0x82
190
+ ]);
191
+
192
+ for (const imagePath of testImages) {
193
+ writeFileSync(imagePath, simplePng);
194
+ }
195
+
196
+ console.log(`โœ… Created ${testImages.length} test images`);
197
+
198
+ try {
199
+ const agent = new MockProbeAgent({ debug: true });
200
+
201
+ // Test 1: Assistant mentions an image file
202
+ console.log('\n๐Ÿ“‹ Test 1: Assistant mentions image in response');
203
+ const assistantResponse1 = `I need to analyze the diagram in ./test-diagram.png to understand the architecture.`;
204
+ await agent.processImageReferences(assistantResponse1);
205
+
206
+ let loadedImages = agent.getCurrentImages();
207
+ console.log(`โœ… Test 1 result: ${loadedImages.length} image(s) loaded`);
208
+
209
+ // Test 2: Tool result contains image paths
210
+ console.log('\n๐Ÿ“‹ Test 2: Tool result mentions multiple images');
211
+ const toolResult = `
212
+ Found 3 relevant files:
213
+ - screenshot.jpg (contains the error message)
214
+ - chart.png (shows the performance metrics)
215
+ - config.json (configuration file)
216
+ `;
217
+ await agent.processImageReferences(toolResult);
218
+
219
+ loadedImages = agent.getCurrentImages();
220
+ console.log(`โœ… Test 2 result: ${loadedImages.length} total image(s) loaded`);
221
+
222
+ // Test 3: Message preparation for AI
223
+ console.log('\n๐Ÿ“‹ Test 3: Message preparation with images');
224
+ const testMessages = [
225
+ { role: 'system', content: 'You are a helpful assistant.' },
226
+ { role: 'user', content: 'Please analyze the uploaded files.' },
227
+ { role: 'assistant', content: 'I will analyze the images you provided.' },
228
+ { role: 'user', content: 'What do you see in the images?' }
229
+ ];
230
+
231
+ const messagesWithImages = agent.prepareMessagesWithImages(testMessages);
232
+ const lastMessage = messagesWithImages[messagesWithImages.length - 1];
233
+
234
+ console.log(`โœ… Test 3 result: Last message format: ${typeof lastMessage.content}`);
235
+ if (Array.isArray(lastMessage.content)) {
236
+ console.log(` - Text parts: ${lastMessage.content.filter(p => p.type === 'text').length}`);
237
+ console.log(` - Image parts: ${lastMessage.content.filter(p => p.type === 'image').length}`);
238
+ }
239
+
240
+ // Test 4: Contextual image detection
241
+ console.log('\n๐Ÿ“‹ Test 4: Various contextual image mentions');
242
+ const contextualTexts = [
243
+ 'Look at file ./test-diagram.png',
244
+ 'The screenshot screenshot.jpg shows the issue',
245
+ 'I found chart.png in the directory',
246
+ 'Generated diagram at ./output.svg', // Non-existent file
247
+ ];
248
+
249
+ agent.clearLoadedImages();
250
+ for (const text of contextualTexts) {
251
+ console.log(` Processing: "${text}"`);
252
+ await agent.processImageReferences(text);
253
+ }
254
+
255
+ loadedImages = agent.getCurrentImages();
256
+ console.log(`โœ… Test 4 result: ${loadedImages.length} contextual image(s) loaded`);
257
+
258
+ // Test 5: Security validation
259
+ console.log('\n๐Ÿ“‹ Test 5: Security validation for path traversal');
260
+ const maliciousTexts = [
261
+ 'Check ../../../etc/passwd.png', // Path traversal attempt
262
+ 'Look at /system/secrets.jpg', // Absolute path outside
263
+ ];
264
+
265
+ const beforeCount = agent.getCurrentImages().length;
266
+ for (const text of maliciousTexts) {
267
+ console.log(` Testing: "${text}"`);
268
+ await agent.processImageReferences(text);
269
+ }
270
+
271
+ const afterCount = agent.getCurrentImages().length;
272
+ console.log(`โœ… Test 5 result: No new images loaded (${beforeCount} -> ${afterCount})`);
273
+
274
+ console.log('\n๐ŸŽ‰ All tests completed successfully!');
275
+ console.log('\n๐Ÿ“Š Summary:');
276
+ console.log(` - Total images currently loaded: ${agent.getCurrentImages().length}`);
277
+ console.log(' - Image detection patterns working correctly');
278
+ console.log(' - Security validation preventing unauthorized access');
279
+ console.log(' - Multimodal message preparation functioning');
280
+
281
+ } catch (error) {
282
+ console.error('โŒ Test failed:', error);
283
+ } finally {
284
+ // Cleanup
285
+ for (const imagePath of testImages) {
286
+ if (existsSync(imagePath)) {
287
+ unlinkSync(imagePath);
288
+ }
289
+ }
290
+ console.log('\n๐Ÿงน Test cleanup completed');
291
+ }
292
+ }
293
+
294
+ testAgenticImageLoading().catch(console.error);