@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,577 @@
1
+ /**
2
+ * Tests for Enhanced Mermaid validation functionality with specialized fixing agent
3
+ */
4
+
5
+ import { describe, test, expect, beforeEach, afterEach, jest } from '@jest/globals';
6
+ import {
7
+ extractMermaidFromMarkdown,
8
+ replaceMermaidDiagramsInMarkdown,
9
+ MermaidFixingAgent,
10
+ validateAndFixMermaidResponse
11
+ } from '../../src/agent/schemaUtils.js';
12
+ import { SimpleAppTracer } from '../../src/agent/simpleTelemetry.js';
13
+
14
+ // Mock ProbeAgent to avoid actual API calls in tests
15
+ const mockProbeAgent = {
16
+ answer: jest.fn(),
17
+ getTokenUsage: jest.fn(() => ({ totalTokens: 100, inputTokens: 50, outputTokens: 50 })),
18
+ cancel: jest.fn()
19
+ };
20
+
21
+ // Mock the dynamic import
22
+ jest.mock('../../src/agent/ProbeAgent.js', () => ({
23
+ ProbeAgent: jest.fn(() => mockProbeAgent)
24
+ }), { virtual: true });
25
+
26
+ describe('Enhanced Mermaid Validation', () => {
27
+ beforeEach(() => {
28
+ jest.clearAllMocks();
29
+ });
30
+
31
+ afterEach(() => {
32
+ jest.clearAllMocks();
33
+ });
34
+
35
+ describe('Enhanced extractMermaidFromMarkdown', () => {
36
+ test('should extract mermaid with position tracking and attributes', () => {
37
+ const response = `Generate a mermaid diagram showing the relationships between the modified components:
38
+
39
+ \`\`\`mermaid
40
+ graph TD
41
+ A[Component A] --> B[Component B]
42
+ B --> C[Database]
43
+ C --> D[API Endpoints]
44
+ \`\`\`
45
+
46
+ Some other text here.
47
+
48
+ \`\`\`mermaid title="System Flow"
49
+ sequenceDiagram
50
+ participant U as User
51
+ participant S as System
52
+ U->>S: Request
53
+ S->>U: Response
54
+ \`\`\``;
55
+
56
+ const result = extractMermaidFromMarkdown(response);
57
+
58
+ expect(result.diagrams).toHaveLength(2);
59
+
60
+ // First diagram
61
+ expect(result.diagrams[0].content).toContain('graph TD');
62
+ expect(result.diagrams[0].content).toContain('A[Component A] --> B[Component B]');
63
+ expect(result.diagrams[0].attributes).toBe('');
64
+ expect(result.diagrams[0].startIndex).toBeGreaterThan(0);
65
+ expect(result.diagrams[0].endIndex).toBeGreaterThan(result.diagrams[0].startIndex);
66
+ expect(result.diagrams[0].fullMatch).toContain('```mermaid');
67
+
68
+ // Second diagram with attributes
69
+ expect(result.diagrams[1].content).toContain('sequenceDiagram');
70
+ expect(result.diagrams[1].content).toContain('participant U as User');
71
+ expect(result.diagrams[1].attributes).toBe('title="System Flow"');
72
+ expect(result.diagrams[1].startIndex).toBeGreaterThan(result.diagrams[0].endIndex);
73
+ });
74
+
75
+ test('should handle nested markdown structures', () => {
76
+ const response = `
77
+ > Here's a quote with a diagram:
78
+ >
79
+ > \`\`\`mermaid
80
+ > graph LR
81
+ > A --> B
82
+ > \`\`\`
83
+ >
84
+ > End of quote.
85
+
86
+ And a list:
87
+ 1. Item 1
88
+ 2. Item 2 with diagram:
89
+ \`\`\`mermaid
90
+ pie title Pie Chart
91
+ "A" : 50
92
+ "B" : 30
93
+ "C" : 20
94
+ \`\`\`
95
+ 3. Item 3`;
96
+
97
+ const result = extractMermaidFromMarkdown(response);
98
+
99
+ expect(result.diagrams).toHaveLength(2);
100
+ expect(result.diagrams[0].content).toContain('graph LR');
101
+ expect(result.diagrams[1].content).toContain('pie title Pie Chart');
102
+ });
103
+
104
+ test('should preserve whitespace and indentation context', () => {
105
+ const response = ` \`\`\`mermaid
106
+ graph TD
107
+ A[Start] --> B{Decision}
108
+ B -->|Yes| C[Action 1]
109
+ B -->|No| D[Action 2]
110
+ \`\`\``;
111
+
112
+ const result = extractMermaidFromMarkdown(response);
113
+
114
+ expect(result.diagrams).toHaveLength(1);
115
+ expect(result.diagrams[0].content).toContain('graph TD');
116
+ expect(result.diagrams[0].content).toContain('A[Start] --> B{Decision}');
117
+ });
118
+
119
+ test('should handle mixed code block types', () => {
120
+ const response = `
121
+ \`\`\`javascript
122
+ console.log("Hello");
123
+ \`\`\`
124
+
125
+ \`\`\`mermaid
126
+ graph TD
127
+ A --> B
128
+ \`\`\`
129
+
130
+ \`\`\`json
131
+ {"key": "value"}
132
+ \`\`\`
133
+
134
+ \`\`\`mermaid class="custom"
135
+ stateDiagram-v2
136
+ [*] --> State1
137
+ State1 --> [*]
138
+ \`\`\``;
139
+
140
+ const result = extractMermaidFromMarkdown(response);
141
+
142
+ expect(result.diagrams).toHaveLength(2);
143
+ expect(result.diagrams[0].content).toContain('graph TD');
144
+ expect(result.diagrams[0].attributes).toBe('');
145
+ expect(result.diagrams[1].content).toContain('stateDiagram-v2');
146
+ expect(result.diagrams[1].attributes).toBe('class="custom"');
147
+ });
148
+ });
149
+
150
+ describe('replaceMermaidDiagramsInMarkdown', () => {
151
+ test('should replace diagrams while preserving original format', () => {
152
+ const original = `Here's a diagram:
153
+
154
+ \`\`\`mermaid
155
+ graph TD
156
+ A --> B[Bad Syntax
157
+ B --> C
158
+ \`\`\`
159
+
160
+ Some text.`;
161
+
162
+ const { diagrams } = extractMermaidFromMarkdown(original);
163
+
164
+ // Simulate corrected diagram
165
+ const correctedDiagrams = [{
166
+ ...diagrams[0],
167
+ content: 'graph TD\n A --> B[Fixed Syntax]\n B --> C'
168
+ }];
169
+
170
+ const result = replaceMermaidDiagramsInMarkdown(original, correctedDiagrams);
171
+
172
+ expect(result).toContain('B[Fixed Syntax]');
173
+ expect(result).toContain('```mermaid');
174
+ expect(result).toContain('Some text.');
175
+ expect(result).not.toContain('B[Bad Syntax');
176
+ });
177
+
178
+ test('should preserve attributes when replacing', () => {
179
+ const original = `\`\`\`mermaid title="My Diagram" class="custom"
180
+ graph TD
181
+ A --> B[Broken
182
+ \`\`\``;
183
+
184
+ const { diagrams } = extractMermaidFromMarkdown(original);
185
+ const correctedDiagrams = [{
186
+ ...diagrams[0],
187
+ content: 'graph TD\n A --> B[Fixed]'
188
+ }];
189
+
190
+ const result = replaceMermaidDiagramsInMarkdown(original, correctedDiagrams);
191
+
192
+ expect(result).toContain('```mermaid title="My Diagram" class="custom"');
193
+ expect(result).toContain('A --> B[Fixed]');
194
+ });
195
+
196
+ test('should handle multiple diagram replacements', () => {
197
+ const original = `First:
198
+ \`\`\`mermaid
199
+ graph TD
200
+ A --> B[Error1
201
+ \`\`\`
202
+
203
+ Second:
204
+ \`\`\`mermaid
205
+ pie title Bad
206
+ "A" 50
207
+ \`\`\`
208
+
209
+ Third:
210
+ \`\`\`mermaid title="Test"
211
+ sequenceDiagram
212
+ A->>B: Missing colon
213
+ \`\`\``;
214
+
215
+ const { diagrams } = extractMermaidFromMarkdown(original);
216
+ const correctedDiagrams = diagrams.map((diagram, index) => ({
217
+ ...diagram,
218
+ content: `corrected_diagram_${index}`
219
+ }));
220
+
221
+ const result = replaceMermaidDiagramsInMarkdown(original, correctedDiagrams);
222
+
223
+ expect(result).toContain('corrected_diagram_0');
224
+ expect(result).toContain('corrected_diagram_1');
225
+ expect(result).toContain('corrected_diagram_2');
226
+ expect(result).toContain('```mermaid title="Test"');
227
+ expect(result).toContain('First:');
228
+ expect(result).toContain('Second:');
229
+ expect(result).toContain('Third:');
230
+ });
231
+ });
232
+
233
+ describe('MermaidFixingAgent', () => {
234
+ test('should initialize with correct options', () => {
235
+ const agent = new MermaidFixingAgent({
236
+ path: '/test/path',
237
+ provider: 'anthropic',
238
+ model: 'claude-3',
239
+ debug: true
240
+ });
241
+
242
+ expect(agent.options.path).toBe('/test/path');
243
+ expect(agent.options.provider).toBe('anthropic');
244
+ expect(agent.options.model).toBe('claude-3');
245
+ expect(agent.options.debug).toBe(true);
246
+ expect(agent.options.allowEdit).toBe(false);
247
+ });
248
+
249
+ test('should extract corrected diagram from response', () => {
250
+ const agent = new MermaidFixingAgent();
251
+
252
+ // Test mermaid code block extraction
253
+ const response1 = `Here's the corrected diagram:
254
+
255
+ \`\`\`mermaid
256
+ graph TD
257
+ A --> B[Fixed]
258
+ B --> C
259
+ \`\`\``;
260
+
261
+ expect(agent.extractCorrectedDiagram(response1)).toBe('graph TD\n A --> B[Fixed]\n B --> C');
262
+
263
+ // Test fallback to any code block
264
+ const response2 = `\`\`\`
265
+ graph TD
266
+ A --> B[Fixed]
267
+ \`\`\``;
268
+
269
+ expect(agent.extractCorrectedDiagram(response2)).toBe('graph TD\n A --> B[Fixed]');
270
+
271
+ // Test cleanup without code blocks
272
+ const response3 = '```mermaid\ngraph TD\n A --> B\n```';
273
+ expect(agent.extractCorrectedDiagram(response3)).toBe('graph TD\n A --> B');
274
+ });
275
+
276
+ test('should call ProbeAgent with correct prompt', async () => {
277
+ // Skip this test in CI/environments without API keys
278
+ if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY && !process.env.GOOGLE_API_KEY) {
279
+ console.log('Skipping ProbeAgent test - no API keys available');
280
+ return;
281
+ }
282
+
283
+ const agent = new MermaidFixingAgent({ debug: true });
284
+
285
+ try {
286
+ const result = await agent.fixMermaidDiagram(
287
+ 'graph TD\n A --> B[Broken\n B --> C',
288
+ ['Unclosed bracket'],
289
+ { diagramType: 'flowchart' }
290
+ );
291
+
292
+ // If we get here, the agent worked
293
+ expect(result).toContain('graph TD');
294
+ } catch (error) {
295
+ // Expected in test environments without API keys or provider setup
296
+ expect(error.message).toMatch(/No API key provided|this\.provider is not a function|Failed to get response from AI model/);
297
+ }
298
+ });
299
+
300
+ test('should handle fixing errors gracefully', async () => {
301
+ // Skip this test in CI/environments without API keys
302
+ if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY && !process.env.GOOGLE_API_KEY) {
303
+ console.log('Skipping ProbeAgent error test - no API keys available');
304
+ return;
305
+ }
306
+
307
+ const agent = new MermaidFixingAgent({ debug: true });
308
+
309
+ try {
310
+ await agent.fixMermaidDiagram('invalid diagram');
311
+ } catch (error) {
312
+ // This could be either API key error or actual fixing error
313
+ expect(error.message).toBeDefined();
314
+ }
315
+ });
316
+ });
317
+
318
+ describe('validateAndFixMermaidResponse', () => {
319
+ test('should return original response if all diagrams are valid', async () => {
320
+ const validResponse = `Here's a valid diagram:
321
+
322
+ \`\`\`mermaid
323
+ graph TD
324
+ A --> B[Valid]
325
+ B --> C
326
+ \`\`\``;
327
+
328
+ const result = await validateAndFixMermaidResponse(validResponse);
329
+
330
+ expect(result.isValid).toBe(true);
331
+ expect(result.wasFixed).toBe(false);
332
+ expect(result.originalResponse).toBe(validResponse);
333
+ expect(result.fixedResponse).toBe(validResponse);
334
+ });
335
+
336
+ test('should fix invalid diagrams using specialized agent', async () => {
337
+ const invalidResponse = `Generate a mermaid diagram showing the relationships between the modified components:
338
+
339
+ \`\`\`mermaid
340
+ graph TD
341
+ A[Component A] --> B[Component B
342
+ B --> C[Database]
343
+ C --> D[API Endpoints]
344
+ \`\`\`
345
+
346
+ Some other text here.`;
347
+
348
+ const result = await validateAndFixMermaidResponse(invalidResponse, {
349
+ schema: 'Create mermaid diagram',
350
+ debug: true,
351
+ path: '/test',
352
+ provider: 'anthropic'
353
+ });
354
+
355
+ // Maid 0.0.5 auto-fixes unclosed brackets, so diagram becomes valid
356
+ expect(result.originalResponse).toBe(invalidResponse);
357
+ expect(result.diagrams).toHaveLength(1);
358
+ expect(result.diagrams[0].isValid).toBe(true); // Maid auto-fixes unclosed brackets
359
+ expect(result.wasFixed).toBe(true); // Fixed by maid auto-fix
360
+ expect(result.isValid).toBe(true);
361
+ });
362
+
363
+ test('should handle multiple invalid diagrams', async () => {
364
+ const invalidResponse = `\`\`\`mermaid
365
+ graph TD
366
+ A --> B[Error1
367
+ \`\`\`
368
+
369
+ \`\`\`mermaid
370
+ pie title Bad
371
+ "A" 50
372
+ \`\`\``;
373
+
374
+ const result = await validateAndFixMermaidResponse(invalidResponse, {
375
+ debug: true
376
+ });
377
+
378
+ // Maid 0.0.5 auto-fixes unclosed brackets and validates pie charts
379
+ expect(result.diagrams).toHaveLength(2);
380
+ expect(result.diagrams[0].isValid).toBe(true); // Maid auto-fixes unclosed bracket
381
+ expect(result.diagrams[1].isValid).toBe(true); // Pie chart syntax is valid
382
+ expect(result.isValid).toBe(true);
383
+ });
384
+
385
+ test('should handle agent initialization failures gracefully', async () => {
386
+ const invalidResponse = `\`\`\`mermaid
387
+ graph TD
388
+ A --> B[Error
389
+ \`\`\``;
390
+
391
+ const result = await validateAndFixMermaidResponse(invalidResponse, {
392
+ debug: true
393
+ });
394
+
395
+ // Maid 0.0.5 auto-fixes unclosed brackets
396
+ expect(result.diagrams).toHaveLength(1);
397
+ expect(result.diagrams[0].isValid).toBe(true); // Maid auto-fixes unclosed bracket
398
+ expect(result.wasFixed).toBe(true);
399
+ expect(result.isValid).toBe(true);
400
+ });
401
+
402
+ test('should preserve markdown formatting in fixed response', async () => {
403
+ const response = `# Title
404
+
405
+ Here's the analysis with a diagram:
406
+
407
+ \`\`\`mermaid title="Architecture"
408
+ graph TD
409
+ A --> B[Broken
410
+ B --> C
411
+ \`\`\`
412
+
413
+ ## Conclusion
414
+
415
+ Some final text.`;
416
+
417
+ const result = await validateAndFixMermaidResponse(response);
418
+
419
+ // Maid 0.0.5 auto-fixes unclosed brackets and preserves structure
420
+ expect(result.diagrams).toHaveLength(1);
421
+ expect(result.diagrams[0].isValid).toBe(true); // Maid auto-fixes unclosed bracket
422
+ expect(result.diagrams[0].attributes).toBe('title="Architecture"');
423
+ expect(result.fixedResponse).toContain('# Title');
424
+ expect(result.fixedResponse).toContain('## Conclusion');
425
+ expect(result.fixedResponse).toContain('Some final text.');
426
+ expect(result.fixedResponse).toContain('```mermaid title="Architecture"');
427
+ expect(result.wasFixed).toBe(true);
428
+ expect(result.isValid).toBe(true);
429
+ });
430
+ });
431
+
432
+ describe('Edge Cases and Error Handling', () => {
433
+ test('should handle empty responses', async () => {
434
+ const result = await validateAndFixMermaidResponse('');
435
+ expect(result.isValid).toBe(false);
436
+ expect(result.wasFixed).toBe(false);
437
+ });
438
+
439
+ test('should handle responses with no mermaid diagrams', async () => {
440
+ const result = await validateAndFixMermaidResponse('Just plain text with no diagrams');
441
+ expect(result.isValid).toBe(false);
442
+ expect(result.wasFixed).toBe(false);
443
+ });
444
+
445
+ test('should handle malformed markdown', async () => {
446
+ const malformedResponse = '```mermaid\ngraph TD\n A --> B\n```incomplete';
447
+ const result = await validateAndFixMermaidResponse(malformedResponse);
448
+
449
+ // Should still extract and process what it can
450
+ expect(result.diagrams).toBeDefined();
451
+ });
452
+
453
+ test('should handle unicode and special characters', async () => {
454
+ const unicodeResponse = `\`\`\`mermaid
455
+ graph TD
456
+ A[Ñoñó] --> B[测试]
457
+ B --> C[🚀 Rocket
458
+ \`\`\``;
459
+
460
+ mockProbeAgent.answer.mockResolvedValue(`\`\`\`mermaid
461
+ graph TD
462
+ A[Ñoñó] --> B[测试]
463
+ B --> C["🚀 Rocket"]
464
+ \`\`\``);
465
+
466
+ const result = await validateAndFixMermaidResponse(unicodeResponse);
467
+
468
+ expect(result.fixedResponse).toContain('Ñoñó');
469
+ expect(result.fixedResponse).toContain('测试');
470
+ expect(result.fixedResponse).toContain('🚀 Rocket');
471
+ });
472
+ });
473
+
474
+ describe('HTML Entity Auto-Fix Integration', () => {
475
+
476
+
477
+ test('should skip AI fixing when HTML entity decoding resolves all issues', async () => {
478
+ const responseWithOnlyEntities = `Valid diagram with only escaped entities:
479
+
480
+ \`\`\`mermaid
481
+ graph TD
482
+ A[Start] --> B{"Valid<br>Decision"}
483
+ B --> C[End]
484
+ \`\`\``;
485
+
486
+ let aiWasCalled = false;
487
+ mockProbeAgent.answer = jest.fn(() => {
488
+ aiWasCalled = true;
489
+ return Promise.resolve('should not be called');
490
+ });
491
+
492
+ const result = await validateAndFixMermaidResponse(responseWithOnlyEntities, {
493
+ debug: true,
494
+ provider: 'anthropic',
495
+ model: 'claude-3'
496
+ });
497
+
498
+ // AI should NOT be called since HTML entity decoding fixed everything
499
+ expect(aiWasCalled).toBe(false);
500
+
501
+ // Result should have decoded entities
502
+ expect(result.fixedResponse).toContain('A[Start] --> B{"Valid<br>Decision"}');
503
+ expect(result.wasFixed).toBe(true);
504
+ expect(result.isValid).toBe(true);
505
+ });
506
+
507
+ test('should handle mixed scenarios with multiple diagrams', async () => {
508
+ const responseWithMixedIssues = `Multiple diagrams with different issues:
509
+
510
+ \`\`\`mermaid
511
+ graph TD
512
+ A[Start] --&gt; B{&quot;Entities only&quot;}
513
+ B --&gt; C[End]
514
+ \`\`\`
515
+
516
+ \`\`\`mermaid
517
+ graph TD
518
+ A[Start] --&gt; B{&quot;Test&quot;}
519
+ B ->-> C[End]
520
+ \`\`\`
521
+
522
+ \`\`\`mermaid
523
+ graph TD
524
+ X --&gt; Y{&quot;Another&lt;br&gt;Entity&quot;}
525
+ Y --&gt; Z[Done]
526
+ \`\`\``;
527
+
528
+ let aiCallCount = 0;
529
+ mockProbeAgent.answer = jest.fn(() => {
530
+ aiCallCount++;
531
+ return Promise.resolve(`\`\`\`mermaid
532
+ graph TD
533
+ A[Start] --> B{"Fixed"}
534
+ B --> C[End]
535
+ \`\`\``);
536
+ });
537
+
538
+ const result = await validateAndFixMermaidResponse(responseWithMixedIssues, {
539
+ debug: true,
540
+ provider: 'anthropic',
541
+ model: 'claude-3'
542
+ });
543
+
544
+ expect(result.diagrams).toHaveLength(3);
545
+
546
+ // Should have decoded entities in diagrams that were fixed with HTML entity decoding
547
+ expect(result.fixedResponse).toContain('A[Start] --> B{"Entities only"}');
548
+ expect(result.fixedResponse).toContain('X --> Y{"Another<br>Entity"}');
549
+
550
+ // Should not contain escaped entities in HTML-entity-fixed diagrams
551
+ expect(result.fixedResponse.split('```mermaid')[1]).not.toContain('&quot;'); // First diagram
552
+ expect(result.fixedResponse.split('```mermaid')[3]).not.toContain('&quot;'); // Third diagram
553
+
554
+ // AI should be called for the diagram with remaining syntax errors
555
+ // Since we don't have API keys in test environment, expect the attempt to be made
556
+ expect(result.fixingResults).toBeDefined();
557
+ expect(result.fixingResults.length).toBeGreaterThan(0);
558
+ });
559
+
560
+ test('should preserve original content when no HTML entities are present', async () => {
561
+ const normalResponse = `Normal diagram without entities:
562
+
563
+ \`\`\`mermaid
564
+ graph TD
565
+ A[Start] --> B{"Normal Decision"}
566
+ B --> C[End]
567
+ \`\`\``;
568
+
569
+ const result = await validateAndFixMermaidResponse(normalResponse);
570
+
571
+ // Should pass through unchanged since it's already valid
572
+ expect(result.fixedResponse).toBe(normalResponse);
573
+ expect(result.wasFixed).toBe(false);
574
+ expect(result.isValid).toBe(true);
575
+ });
576
+ });
577
+ });
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Test for extract() function with content parameter
3
+ * This test verifies the fix for the process.env.DEBUG bug
4
+ */
5
+
6
+ import { extract } from '../../src/index.js';
7
+ import path from 'path';
8
+
9
+ describe('extract() with content parameter', () => {
10
+ // Sample diff content for testing
11
+ const diffContent = `diff --git a/src/main.rs b/src/main.rs
12
+ index 123..456
13
+ --- a/src/main.rs
14
+ +++ b/src/main.rs
15
+ @@ -10,3 +10,4 @@
16
+ fn main() {
17
+ - println!("old");
18
+ + println!("new");
19
+ }`;
20
+
21
+ test('should process diff content without crashing', async () => {
22
+ // This test verifies that the extract function doesn't crash
23
+ // when accessing process.env.DEBUG
24
+ const result = await extract({
25
+ content: diffContent,
26
+ format: 'outline-xml',
27
+ });
28
+
29
+ // Should return a result (string for outline-xml format)
30
+ expect(result).toBeDefined();
31
+ expect(typeof result).toBe('string');
32
+ expect(result.length).toBeGreaterThan(0);
33
+ });
34
+
35
+ test('should handle DEBUG environment variable correctly', async () => {
36
+ // Test with DEBUG enabled
37
+ const originalDebug = process.env.DEBUG;
38
+ process.env.DEBUG = '1';
39
+
40
+ try {
41
+ const result = await extract({
42
+ content: diffContent,
43
+ format: 'outline-xml',
44
+ });
45
+
46
+ expect(result).toBeDefined();
47
+ } finally {
48
+ // Restore original DEBUG value
49
+ if (originalDebug === undefined) {
50
+ delete process.env.DEBUG;
51
+ } else {
52
+ process.env.DEBUG = originalDebug;
53
+ }
54
+ }
55
+ });
56
+
57
+ test('should work with outline-xml format', async () => {
58
+ const result = await extract({
59
+ content: diffContent,
60
+ format: 'outline-xml',
61
+ });
62
+
63
+ expect(result).toBeDefined();
64
+ expect(typeof result).toBe('string');
65
+ expect(result.length).toBeGreaterThan(0);
66
+ });
67
+
68
+ test('should handle errors gracefully', async () => {
69
+ // Test with invalid content
70
+ try {
71
+ await extract({
72
+ content: 'invalid diff content',
73
+ format: 'outline-xml',
74
+ });
75
+ // If it succeeds, that's also acceptable
76
+ } catch (error) {
77
+ // Should throw a proper Error object, not a TypeError about undefined
78
+ expect(error).toBeInstanceOf(Error);
79
+ expect(error.message).not.toContain('Cannot read properties of undefined');
80
+ expect(error.message).not.toContain('process2');
81
+ }
82
+ });
83
+ });