@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,258 @@
1
+ /**
2
+ * Unit tests for GitHub-specific Mermaid diagram compatibility
3
+ * These tests ensure our validator catches the same errors that cause GitHub to fail with "got 'PS'" errors
4
+ */
5
+
6
+ import { describe, test, expect } from '@jest/globals';
7
+ import { validateMermaidDiagram } from '../../src/agent/schemaUtils.js';
8
+
9
+ describe('GitHub Mermaid Compatibility Validation', () => {
10
+ describe('GitHub-incompatible patterns that cause "got PS" errors', () => {
11
+ test('should reject single quotes in node labels', async () => {
12
+ const diagramWithSingleQuotes = `graph TD
13
+ A[Start] --> B[Process]
14
+ B --> C{spawn('npx probe-chat')}
15
+ C --> D[End]`;
16
+
17
+ const result = await validateMermaidDiagram(diagramWithSingleQuotes);
18
+ expect(result.isValid).toBe(false);
19
+ // Maid detects this as: "Unclosed '{'. Add a matching '}'."
20
+ expect(result.error).toBeTruthy();
21
+ });
22
+
23
+ test('should reject parentheses in square bracket node labels', async () => {
24
+ const diagramWithParensInBrackets = `flowchart TD
25
+ A[Start] --> B{Read Check Config}
26
+ B --> C[Load Prompt<br/>(file or content)]
27
+ C --> D[End]`;
28
+
29
+ const result = await validateMermaidDiagram(diagramWithParensInBrackets);
30
+ expect(result.isValid).toBe(false);
31
+ // Maid detects HTML tag issue: "unexpected character: -><<-"
32
+ expect(result.error).toBeTruthy();
33
+ });
34
+
35
+ // REMOVED for maid 0.0.6: This test expected {process<complex>} to be invalid,
36
+ // but maid 0.0.6 now accepts this pattern as valid Mermaid syntax.
37
+ // This is a behavior change in maid 0.0.6 - the parser is more lenient with angle brackets in diamond nodes.
38
+ // Note: This pattern still causes "got PS" errors on GitHub, but maid 0.0.6 validates it as syntactically correct.
39
+ // See: https://github.com/probelabs/maid/issues/18
40
+
41
+ test('should reject multiple problematic patterns in single diagram', async () => {
42
+ const diagramWithMultipleIssues = `graph TD
43
+ A[Start] --> B{spawn('command')}
44
+ B --> C[Process (with details)]
45
+ C --> D{check('<>')}
46
+ D --> E[End]`;
47
+
48
+ const result = await validateMermaidDiagram(diagramWithMultipleIssues);
49
+ expect(result.isValid).toBe(false);
50
+ // Maid detects multiple issues including unclosed braces
51
+ expect(result.error).toBeTruthy();
52
+ });
53
+ });
54
+
55
+ describe('GitHub-compatible patterns', () => {
56
+ test('should accept node labels with double quotes', async () => {
57
+ const compatibleDiagram = `graph TD
58
+ A[Start] --> B["Process with (details)"]
59
+ B --> C{spawn command}
60
+ C --> D[End]`;
61
+
62
+ const result = await validateMermaidDiagram(compatibleDiagram);
63
+ expect(result.isValid).toBe(true);
64
+ expect(result.diagramType).toBe('flowchart');
65
+ });
66
+
67
+ test('should accept simplified node labels', async () => {
68
+ const simplifiedDiagram = `graph TD
69
+ A[Start] --> B[Process]
70
+ B --> C{spawn npx probe-chat}
71
+ C --> D[End]`;
72
+
73
+ const result = await validateMermaidDiagram(simplifiedDiagram);
74
+ expect(result.isValid).toBe(true);
75
+ expect(result.diagramType).toBe('flowchart');
76
+ });
77
+
78
+ test('should accept alternative syntax for complex labels', async () => {
79
+ const alternativeSyntax = `flowchart TD
80
+ A["Start: .visor.yaml"] --> B{Read Check Config}
81
+ B --> C["Load Prompt<br/>from file or content"]
82
+ C --> D{Render Template}
83
+ D --> E[End]`;
84
+
85
+ const result = await validateMermaidDiagram(alternativeSyntax);
86
+ expect(result.isValid).toBe(true);
87
+ expect(result.diagramType).toBe('flowchart');
88
+ });
89
+
90
+ test('should accept HTML breaks in labels', async () => {
91
+ const diagramWithBreaks = `flowchart TD
92
+ A[Start] --> B["Load Template<br/>Process Data<br/>Generate Output"]
93
+ B --> C[End]`;
94
+
95
+ const result = await validateMermaidDiagram(diagramWithBreaks);
96
+ expect(result.isValid).toBe(true);
97
+ expect(result.diagramType).toBe('flowchart');
98
+ });
99
+
100
+ test('should accept subgraph structures', async () => {
101
+ const subgraphDiagram = `graph TD
102
+ subgraph "Before: CLI-based"
103
+ A[Provider] --> B[Service]
104
+ B --> C{spawn command}
105
+ end
106
+ subgraph "After: SDK-based"
107
+ D[Provider] --> E[Service]
108
+ E --> F[SDK]
109
+ end`;
110
+
111
+ const result = await validateMermaidDiagram(subgraphDiagram);
112
+ expect(result.isValid).toBe(true);
113
+ expect(result.diagramType).toBe('flowchart');
114
+ });
115
+ });
116
+
117
+ describe('Real-world GitHub failure cases', () => {
118
+ test('should identify Visor component interaction diagram issues', async () => {
119
+ // This is the actual diagram that fails on GitHub
120
+ const visorComponentDiagram = `graph TD
121
+ subgraph "Before: CLI-based Approach"
122
+ A[AICheckProvider] --> B[AIReviewService]
123
+ B --> C{spawn('npx probe-chat')}
124
+ C --> D[AI API]
125
+ end
126
+
127
+ subgraph "After: Integrated SDK Approach"
128
+ E[AICheckProvider] --> F[AIReviewService]
129
+ F --> G[ProbeAgent SDK]
130
+ G --> H[AI API]
131
+ end`;
132
+
133
+ const result = await validateMermaidDiagram(visorComponentDiagram);
134
+ expect(result.isValid).toBe(false);
135
+ // Maid detects single quotes issue
136
+ expect(result.error).toBeTruthy();
137
+ });
138
+
139
+ test('should identify Visor data flow chart issues', async () => {
140
+ // This is the actual diagram that fails on GitHub
141
+ const visorDataFlowDiagram = `flowchart TD
142
+ A[Start: .visor.yaml] --> B{Read Check Config};
143
+ B --> C[Load Prompt<br/>(file or content)];
144
+ C --> D{Render Prompt Template<br/>with PR & Dep Context};
145
+ D --> E[Execute AI Check via ProbeAgent];
146
+ E --> F[Receive Validated JSON Result];
147
+ F --> G[Load Output Template<br/>(from config or default)];
148
+ G --> H{Render Output Template<br/>with JSON Result};
149
+ H --> I[Post Formatted Comment to GitHub];
150
+ I --> J[End];`;
151
+
152
+ const result = await validateMermaidDiagram(visorDataFlowDiagram);
153
+ expect(result.isValid).toBe(false);
154
+ // Maid detects HTML tag and parentheses issues
155
+ expect(result.error).toBeTruthy();
156
+ });
157
+
158
+ test('should validate Visor sequence diagram as GitHub-compatible', async () => {
159
+ // This diagram works fine on GitHub
160
+ // Note: maid 0.0.6 requires trailing newline for sequence diagrams
161
+ const visorSequenceDiagram = `sequenceDiagram
162
+ participant CEE as CheckExecutionEngine
163
+ participant AICP as AICheckProvider
164
+ participant ARS as AIReviewService
165
+ participant PA as ProbeAgent
166
+ participant AI as AI API
167
+
168
+ CEE->>+AICP: execute(checkConfig, prInfo, dependencies)
169
+ AICP->>AICP: Load prompt (from file or content)
170
+ AICP->>AICP: Render Liquid template with context (pr, files, outputs)
171
+ AICP->>+ARS: executeReview(processedPrompt, schema)
172
+ ARS->>+PA: new ProbeAgent(options)
173
+ ARS->>+PA: answer(prompt, { schema })
174
+ PA->>+AI: Send API Request
175
+ AI-->>-PA: Return JSON Response
176
+ PA->>PA: Validate response against schema
177
+ PA-->>-ARS: Return validated JSON
178
+ ARS-->>-AICP: Return ReviewSummary
179
+ AICP-->>-CEE: Return ReviewSummary
180
+ `;
181
+
182
+ const result = await validateMermaidDiagram(visorSequenceDiagram);
183
+ expect(result.isValid).toBe(true);
184
+ expect(result.diagramType).toBe('sequence');
185
+ });
186
+ });
187
+
188
+ describe('Error message quality', () => {
189
+ test('should provide specific fix suggestions', async () => {
190
+ const problematicDiagram = `graph TD
191
+ A[Start] --> B{spawn('cmd')}
192
+ B --> C[Process]`;
193
+
194
+ const result = await validateMermaidDiagram(problematicDiagram);
195
+ expect(result.isValid).toBe(false);
196
+ // Maid provides detailed error messages
197
+ expect(result.error).toBeTruthy();
198
+ expect(result.detailedError).toBeTruthy();
199
+ });
200
+
201
+ test('should identify exact problematic line', async () => {
202
+ const multiLineDiagram = `flowchart TD
203
+ A[Start] --> B[Good Label]
204
+ B --> C[Bad (parens)]
205
+ C --> D[End]`;
206
+
207
+ const result = await validateMermaidDiagram(multiLineDiagram);
208
+ expect(result.isValid).toBe(false);
209
+ // Maid provides line numbers in error messages
210
+ expect(result.error).toContain('line');
211
+ });
212
+
213
+ test('should explain GitHub-specific nature of the error', async () => {
214
+ const githubIncompatibleDiagram = `graph TD
215
+ A --> B{complex('expression')}`;
216
+
217
+ const result = await validateMermaidDiagram(githubIncompatibleDiagram);
218
+ expect(result.isValid).toBe(false);
219
+ // Maid detects syntax issues
220
+ expect(result.error).toBeTruthy();
221
+ });
222
+ });
223
+
224
+ describe('Edge cases for GitHub compatibility', () => {
225
+ test('should handle escaped characters properly', async () => {
226
+ // Maid 0.0.5 requires HTML entities instead of escaped quotes
227
+ const diagramWithEscaping = `graph TD
228
+ A[Start] --> B["Process with &quot;quotes&quot;"]
229
+ B --> C[End]`;
230
+
231
+ const result = await validateMermaidDiagram(diagramWithEscaping);
232
+ expect(result.isValid).toBe(true);
233
+ });
234
+
235
+ test('should allow text in link labels', async () => {
236
+ // Link labels can contain text (maid 0.0.6 doesn't support parentheses in link labels)
237
+ const diagramWithLinkLabel = `graph TD
238
+ A[Start] --> B[Process]
239
+ B --> C[End]
240
+ A -.->|optional external| C`;
241
+
242
+ const result = await validateMermaidDiagram(diagramWithLinkLabel);
243
+ expect(result.isValid).toBe(true);
244
+ });
245
+
246
+ test('should handle complex but valid patterns', async () => {
247
+ const complexValidDiagram = `flowchart TD
248
+ A["System Start"] --> B{"Decision Point"}
249
+ B -->|Yes| C["Process A"]
250
+ B -->|No| D["Process B"]
251
+ C --> E["Output"]
252
+ D --> E`;
253
+
254
+ const result = await validateMermaidDiagram(complexValidDiagram);
255
+ expect(result.isValid).toBe(true);
256
+ });
257
+ });
258
+ });
@@ -0,0 +1,149 @@
1
+ import { describe, test, expect } from '@jest/globals';
2
+ import {
3
+ SUPPORTED_IMAGE_EXTENSIONS,
4
+ IMAGE_MIME_TYPES,
5
+ PROVIDER_UNSUPPORTED_FORMATS,
6
+ getMimeType,
7
+ isFormatSupportedByProvider,
8
+ getSupportedExtensionsForProvider,
9
+ getExtensionPattern
10
+ } from '../../src/agent/imageConfig.js';
11
+
12
+ describe('imageConfig', () => {
13
+ describe('Constants', () => {
14
+ test('SUPPORTED_IMAGE_EXTENSIONS should include standard formats', () => {
15
+ expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('png');
16
+ expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('jpg');
17
+ expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('jpeg');
18
+ expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('webp');
19
+ expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('bmp');
20
+ expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('svg');
21
+ });
22
+
23
+ test('IMAGE_MIME_TYPES should map extensions to correct MIME types', () => {
24
+ expect(IMAGE_MIME_TYPES.png).toBe('image/png');
25
+ expect(IMAGE_MIME_TYPES.jpg).toBe('image/jpeg');
26
+ expect(IMAGE_MIME_TYPES.jpeg).toBe('image/jpeg');
27
+ expect(IMAGE_MIME_TYPES.webp).toBe('image/webp');
28
+ expect(IMAGE_MIME_TYPES.bmp).toBe('image/bmp');
29
+ expect(IMAGE_MIME_TYPES.svg).toBe('image/svg+xml');
30
+ });
31
+
32
+ test('PROVIDER_UNSUPPORTED_FORMATS should have google provider restrictions', () => {
33
+ expect(PROVIDER_UNSUPPORTED_FORMATS.google).toBeDefined();
34
+ expect(PROVIDER_UNSUPPORTED_FORMATS.google).toContain('svg');
35
+ });
36
+ });
37
+
38
+ describe('getMimeType', () => {
39
+ test('should return correct MIME type for supported extensions', () => {
40
+ expect(getMimeType('png')).toBe('image/png');
41
+ expect(getMimeType('jpg')).toBe('image/jpeg');
42
+ expect(getMimeType('svg')).toBe('image/svg+xml');
43
+ });
44
+
45
+ test('should handle case-insensitive extensions', () => {
46
+ expect(getMimeType('PNG')).toBe('image/png');
47
+ expect(getMimeType('JPG')).toBe('image/jpeg');
48
+ expect(getMimeType('SVG')).toBe('image/svg+xml');
49
+ });
50
+
51
+ test('should return undefined for unsupported extensions', () => {
52
+ expect(getMimeType('gif')).toBeUndefined();
53
+ expect(getMimeType('tiff')).toBeUndefined();
54
+ expect(getMimeType('pdf')).toBeUndefined();
55
+ });
56
+ });
57
+
58
+ describe('isFormatSupportedByProvider', () => {
59
+ test('should return true for formats supported by all providers', () => {
60
+ expect(isFormatSupportedByProvider('png', 'google')).toBe(true);
61
+ expect(isFormatSupportedByProvider('jpg', 'google')).toBe(true);
62
+ expect(isFormatSupportedByProvider('jpeg', 'google')).toBe(true);
63
+ expect(isFormatSupportedByProvider('webp', 'google')).toBe(true);
64
+ });
65
+
66
+ test('should return false for SVG with Google provider (GitHub issue #305)', () => {
67
+ expect(isFormatSupportedByProvider('svg', 'google')).toBe(false);
68
+ expect(isFormatSupportedByProvider('SVG', 'google')).toBe(false);
69
+ });
70
+
71
+ test('should return true for SVG with providers that support it', () => {
72
+ expect(isFormatSupportedByProvider('svg', 'anthropic')).toBe(true);
73
+ expect(isFormatSupportedByProvider('svg', 'openai')).toBe(true);
74
+ });
75
+
76
+ test('should return true for SVG with unknown providers (permissive default)', () => {
77
+ expect(isFormatSupportedByProvider('svg', 'unknown-provider')).toBe(true);
78
+ });
79
+
80
+ test('should return false for completely unsupported formats', () => {
81
+ expect(isFormatSupportedByProvider('gif', 'google')).toBe(false);
82
+ expect(isFormatSupportedByProvider('tiff', 'anthropic')).toBe(false);
83
+ });
84
+
85
+ test('should handle case-insensitive extensions', () => {
86
+ expect(isFormatSupportedByProvider('PNG', 'google')).toBe(true);
87
+ expect(isFormatSupportedByProvider('SVG', 'google')).toBe(false);
88
+ });
89
+
90
+ test('should handle null/undefined provider gracefully', () => {
91
+ expect(isFormatSupportedByProvider('png', null)).toBe(true);
92
+ expect(isFormatSupportedByProvider('png', undefined)).toBe(true);
93
+ expect(isFormatSupportedByProvider('svg', null)).toBe(true);
94
+ });
95
+
96
+ test('should reject invalid extension parameters', () => {
97
+ expect(isFormatSupportedByProvider(null, 'google')).toBe(false);
98
+ expect(isFormatSupportedByProvider(undefined, 'google')).toBe(false);
99
+ expect(isFormatSupportedByProvider('', 'google')).toBe(false);
100
+ });
101
+
102
+ test('should reject path traversal attempts in extension', () => {
103
+ expect(isFormatSupportedByProvider('../../../etc/passwd', 'google')).toBe(false);
104
+ expect(isFormatSupportedByProvider('png/../../../etc/passwd', 'google')).toBe(false);
105
+ expect(isFormatSupportedByProvider('..\\..\\windows\\system32', 'google')).toBe(false);
106
+ });
107
+ });
108
+
109
+ describe('getSupportedExtensionsForProvider', () => {
110
+ test('should return all extensions for providers without restrictions', () => {
111
+ const anthropicExtensions = getSupportedExtensionsForProvider('anthropic');
112
+ expect(anthropicExtensions).toEqual(SUPPORTED_IMAGE_EXTENSIONS);
113
+ });
114
+
115
+ test('should exclude SVG for Google provider', () => {
116
+ const googleExtensions = getSupportedExtensionsForProvider('google');
117
+ expect(googleExtensions).not.toContain('svg');
118
+ expect(googleExtensions).toContain('png');
119
+ expect(googleExtensions).toContain('jpg');
120
+ });
121
+
122
+ test('should return all extensions for unknown providers', () => {
123
+ const unknownExtensions = getSupportedExtensionsForProvider('unknown');
124
+ expect(unknownExtensions).toEqual(SUPPORTED_IMAGE_EXTENSIONS);
125
+ });
126
+
127
+ test('should handle null/undefined provider gracefully', () => {
128
+ const nullExtensions = getSupportedExtensionsForProvider(null);
129
+ const undefinedExtensions = getSupportedExtensionsForProvider(undefined);
130
+ expect(nullExtensions).toEqual(SUPPORTED_IMAGE_EXTENSIONS);
131
+ expect(undefinedExtensions).toEqual(SUPPORTED_IMAGE_EXTENSIONS);
132
+ });
133
+ });
134
+
135
+ describe('getExtensionPattern', () => {
136
+ test('should generate regex pattern for default extensions', () => {
137
+ const pattern = getExtensionPattern();
138
+ expect(pattern).toContain('png');
139
+ expect(pattern).toContain('jpg');
140
+ expect(pattern).toContain('svg');
141
+ expect(pattern).toBe('png|jpg|jpeg|webp|bmp|svg');
142
+ });
143
+
144
+ test('should generate pattern for custom extensions', () => {
145
+ const pattern = getExtensionPattern(['png', 'jpg']);
146
+ expect(pattern).toBe('png|jpg');
147
+ });
148
+ });
149
+ });