@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,195 @@
1
+ /**
2
+ * Unit tests for max tool iterations warning logic
3
+ * Tests the core warning message functionality without full ProbeAgent integration
4
+ */
5
+
6
+ import { describe, test, expect } from '@jest/globals';
7
+
8
+ describe('Max Tool Iterations Warning Logic', () => {
9
+
10
+ // Test the core warning message generation logic
11
+ describe('Warning Message Generation', () => {
12
+ test('should generate correct warning message format', () => {
13
+ const maxIterations = 30;
14
+ const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (${maxIterations}). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
15
+
16
+ // Verify the warning message contains all required elements
17
+ expect(warningMessage).toContain('⚠️ WARNING');
18
+ expect(warningMessage).toContain('maximum tool iterations limit');
19
+ expect(warningMessage).toContain(`(${maxIterations})`);
20
+ expect(warningMessage).toContain('This is your final message');
21
+ expect(warningMessage).toContain('honestly state what was not done');
22
+ expect(warningMessage).toContain('partial results or recommendations');
23
+ });
24
+
25
+ test('should include different iteration limits in message', () => {
26
+ const testLimits = [1, 5, 10, 30, 50, 100];
27
+
28
+ testLimits.forEach(limit => {
29
+ const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (${limit}). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
30
+
31
+ expect(warningMessage).toContain(`limit (${limit})`);
32
+ });
33
+ });
34
+ });
35
+
36
+ describe('Iteration Counting Logic', () => {
37
+ test('should detect when current iteration equals max iterations', () => {
38
+ // Test different scenarios
39
+ const testCases = [
40
+ { current: 1, max: 1, shouldWarn: true },
41
+ { current: 5, max: 5, shouldWarn: true },
42
+ { current: 30, max: 30, shouldWarn: true },
43
+ { current: 1, max: 5, shouldWarn: false },
44
+ { current: 4, max: 5, shouldWarn: false },
45
+ { current: 29, max: 30, shouldWarn: false }
46
+ ];
47
+
48
+ testCases.forEach(({ current, max, shouldWarn }) => {
49
+ const shouldShowWarning = (current === max);
50
+ expect(shouldShowWarning).toBe(shouldWarn);
51
+ });
52
+ });
53
+
54
+ test('should handle schema-extended iteration limits', () => {
55
+ const baseLimit = 30;
56
+ const schemaExtension = 4;
57
+ const extendedLimit = baseLimit + schemaExtension;
58
+
59
+ // When schema is provided, limit should be extended
60
+ expect(extendedLimit).toBe(34);
61
+
62
+ // Warning should trigger at the extended limit
63
+ const shouldWarnAtBase = (baseLimit === baseLimit); // true
64
+ const shouldWarnAtExtended = (extendedLimit === extendedLimit); // true
65
+
66
+ expect(shouldWarnAtBase).toBe(true);
67
+ expect(shouldWarnAtExtended).toBe(true);
68
+ });
69
+ });
70
+
71
+ describe('Environment Variable Handling', () => {
72
+ test('should parse MAX_TOOL_ITERATIONS environment variable correctly', () => {
73
+ // Test parsing logic (simulating how the actual code works)
74
+ const testCases = [
75
+ { env: '30', expected: 30 },
76
+ { env: '1', expected: 1 },
77
+ { env: '100', expected: 100 },
78
+ { env: undefined, expected: 30 }, // default
79
+ { env: '', expected: 30 }, // default
80
+ { env: 'invalid', expected: NaN }
81
+ ];
82
+
83
+ testCases.forEach(({ env, expected }) => {
84
+ const parsed = parseInt(env || '30', 10);
85
+ if (isNaN(expected)) {
86
+ expect(isNaN(parsed)).toBe(true);
87
+ } else {
88
+ expect(parsed).toBe(expected);
89
+ }
90
+ });
91
+ });
92
+ });
93
+
94
+ describe('Message Structure Validation', () => {
95
+ test('should create proper message structure for AI model', () => {
96
+ const maxIterations = 25;
97
+ const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (${maxIterations}). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
98
+
99
+ // Simulate the message structure that would be added to the conversation
100
+ const messageStructure = {
101
+ role: 'user',
102
+ content: warningMessage
103
+ };
104
+
105
+ expect(messageStructure.role).toBe('user');
106
+ expect(messageStructure.content).toBe(warningMessage);
107
+ expect(typeof messageStructure.content).toBe('string');
108
+ expect(messageStructure.content.length).toBeGreaterThan(0);
109
+ });
110
+
111
+ test('should ensure warning message is clear and actionable', () => {
112
+ const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (30). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
113
+
114
+ // Check that the message contains actionable instructions
115
+ const actionableKeywords = [
116
+ 'respond with the data',
117
+ 'honestly state',
118
+ 'what was not done',
119
+ 'partial results',
120
+ 'recommendations'
121
+ ];
122
+
123
+ actionableKeywords.forEach(keyword => {
124
+ expect(warningMessage.toLowerCase()).toContain(keyword.toLowerCase());
125
+ });
126
+ });
127
+
128
+ test('should handle different iteration limit scenarios', () => {
129
+ // Test edge cases
130
+ const edgeCases = [
131
+ { limit: 1, description: 'minimum limit' },
132
+ { limit: 2, description: 'very low limit' },
133
+ { limit: 30, description: 'default limit' },
134
+ { limit: 100, description: 'high limit' }
135
+ ];
136
+
137
+ edgeCases.forEach(({ limit, description }) => {
138
+ const warningMessage = `⚠️ WARNING: You have reached the maximum tool iterations limit (${limit}). This is your final message. Please respond with the data you have so far. If something was not completed, honestly state what was not done and provide any partial results or recommendations you can offer.`;
139
+
140
+ expect(warningMessage).toContain(`limit (${limit})`);
141
+ expect(warningMessage).toContain('This is your final message');
142
+
143
+ // Message should be consistent regardless of limit value
144
+ expect(warningMessage.split(' ').length).toBeGreaterThan(20); // Reasonable message length
145
+ });
146
+ });
147
+ });
148
+
149
+ describe('Integration Points', () => {
150
+ test('should verify warning triggers at the right time in iteration flow', () => {
151
+ // Simulate the iteration loop logic
152
+ const MAX_ITERATIONS = 3;
153
+ let currentIteration = 0;
154
+ const warningTriggered = [];
155
+
156
+ // Simulate 5 iterations
157
+ for (let i = 0; i < 5; i++) {
158
+ currentIteration++;
159
+
160
+ // Check if warning should be triggered (this is the actual logic from the code)
161
+ if (currentIteration === MAX_ITERATIONS) {
162
+ warningTriggered.push(currentIteration);
163
+ }
164
+
165
+ // Break if we would exceed max iterations (simulating the while loop condition)
166
+ if (currentIteration >= MAX_ITERATIONS) {
167
+ break;
168
+ }
169
+ }
170
+
171
+ // Warning should be triggered exactly once at iteration 3
172
+ expect(warningTriggered).toHaveLength(1);
173
+ expect(warningTriggered[0]).toBe(MAX_ITERATIONS);
174
+ expect(currentIteration).toBe(MAX_ITERATIONS);
175
+ });
176
+
177
+ test('should handle schema option extension correctly', () => {
178
+ const BASE_LIMIT = 5;
179
+ const SCHEMA_EXTENSION = 4;
180
+
181
+ // Test without schema
182
+ const normalLimit = BASE_LIMIT;
183
+ expect(normalLimit).toBe(5);
184
+
185
+ // Test with schema (logic from actual code)
186
+ const hasSchema = true;
187
+ const extendedLimit = hasSchema ? BASE_LIMIT + SCHEMA_EXTENSION : BASE_LIMIT;
188
+ expect(extendedLimit).toBe(9);
189
+
190
+ // Warning should trigger at different points
191
+ expect(5 === normalLimit).toBe(true); // Would trigger at iteration 5 normally
192
+ expect(9 === extendedLimit).toBe(true); // Would trigger at iteration 9 with schema
193
+ });
194
+ });
195
+ });
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Unit tests for Mermaid edge label syntax fixing
3
+ *
4
+ * Tests that MermaidFixingAgent correctly instructs AI to use pipe syntax
5
+ * for edge labels instead of double quotes, preventing validation loops.
6
+ */
7
+
8
+ import { describe, test, expect, jest } from '@jest/globals';
9
+ import { validateMermaidDiagram } from '../../src/agent/schemaUtils.js';
10
+
11
+ // Dynamically import MermaidFixingAgent to avoid circular dependency
12
+ const { MermaidFixingAgent } = await import('../../src/agent/schemaUtils.js');
13
+
14
+ describe('Mermaid Edge Label Syntax Fixing', () => {
15
+ test('should detect invalid edge labels with double quotes', async () => {
16
+ const invalidDiagrams = [
17
+ 'graph TD\n A -- "Label Text" --> B',
18
+ 'graph TD\n E -- "JSON-RPC Messages ONLY" --> F[stdout]',
19
+ 'flowchart LR\n X -- "Step 1" --> Y\n Y -- "Step 2" --> Z'
20
+ ];
21
+
22
+ for (const diagram of invalidDiagrams) {
23
+ const result = await validateMermaidDiagram(diagram);
24
+ expect(result.isValid).toBe(false);
25
+ expect(result.error).toBeDefined();
26
+ }
27
+ });
28
+
29
+ test('should validate edge labels with pipe syntax', async () => {
30
+ const validDiagrams = [
31
+ { desc: 'dashes with pipes', diagram: 'graph TD\n A --|Label Text|--> B' },
32
+ { desc: 'dashes with spaced pipes', diagram: 'graph TD\n A -- |Label Text| --> B' },
33
+ { desc: 'arrow with spaced pipes', diagram: 'graph TD\n A -->|Label Text| B' },
34
+ { desc: 'complex label', diagram: 'graph TD\n E --|JSON-RPC Messages ONLY|--> F[stdout]' },
35
+ { desc: 'multiple edges', diagram: 'flowchart LR\n X --|Step 1|--> Y\n Y --|Step 2|--> Z' }
36
+ ];
37
+
38
+ for (const { desc, diagram } of validDiagrams) {
39
+ const result = await validateMermaidDiagram(diagram);
40
+ expect(result.isValid).toBe(true);
41
+ expect(result.diagramType).toBe('flowchart');
42
+ }
43
+ });
44
+
45
+ test('MermaidFixingAgent prompt should include edge label syntax rules', async () => {
46
+ const fixer = new MermaidFixingAgent({ debug: false });
47
+ const prompt = fixer.getMermaidFixingPrompt();
48
+
49
+ // Verify prompt instructs to use pipe syntax
50
+ expect(prompt).toContain('Edge/Arrow labels');
51
+ expect(prompt).toContain('pipe syntax');
52
+ expect(prompt).toContain('--|');
53
+ expect(prompt).toContain('NEVER use double quotes');
54
+ });
55
+
56
+ test('should fix invalid edge labels using mocked AI', async () => {
57
+ // Create mock AI that returns corrected diagram with pipe syntax
58
+ const invalidDiagram = `graph TD
59
+ A[Start]
60
+ A -- "Invalid Label 1" --> B[Process]
61
+ B -- "Invalid Label 2" --> C[End]`;
62
+
63
+ const fixedDiagram = `graph TD
64
+ A[Start]
65
+ A -->|Invalid Label 1| B[Process]
66
+ B -->|Invalid Label 2| C[End]`;
67
+
68
+ // Mock ProbeAgent.answer to return fixed diagram
69
+ const mockAgent = {
70
+ answer: jest.fn().mockResolvedValue(`\`\`\`mermaid\n${fixedDiagram}\n\`\`\``)
71
+ };
72
+
73
+ // Create MermaidFixingAgent and inject mock
74
+ const fixer = new MermaidFixingAgent({ debug: false });
75
+ await fixer.initializeAgent();
76
+ fixer.agent = mockAgent;
77
+
78
+ // Verify original diagram is invalid
79
+ const validationBefore = await validateMermaidDiagram(invalidDiagram);
80
+ expect(validationBefore.isValid).toBe(false);
81
+
82
+ // Trigger the fixing flow
83
+ const errors = ['line 4:14: Expecting token sequences, but found: "JSON-RPC Messages ONLY"'];
84
+ const result = await fixer.fixMermaidDiagram(invalidDiagram, errors, {});
85
+
86
+
87
+ // Verify the fix - result should have pipe syntax
88
+ expect(result).toContain('-->|Invalid Label 1|');
89
+ expect(result).toContain('-->|Invalid Label 2|');
90
+ expect(result).not.toContain('"Invalid Label 1"');
91
+ expect(result).not.toContain('"Invalid Label 2"');
92
+
93
+ // Verify the AI was called with correct prompt
94
+ expect(mockAgent.answer).toHaveBeenCalled();
95
+ const callArgs = mockAgent.answer.mock.calls[0];
96
+ expect(callArgs[0]).toContain('Analyze and fix');
97
+ expect(callArgs[0]).toContain('Mermaid diagram');
98
+
99
+ // Verify no schema parameter (this was causing the loop)
100
+ if (callArgs.length >= 3) {
101
+ expect(callArgs[2]).not.toHaveProperty('schema');
102
+ }
103
+
104
+ // Verify fixed diagram is valid
105
+ const validationAfter = await validateMermaidDiagram(result);
106
+ if (!validationAfter.isValid) {
107
+ throw new Error(`Fixed diagram validation failed: ${validationAfter.error}\nResult: ${result}`);
108
+ }
109
+ expect(validationAfter.isValid).toBe(true);
110
+ });
111
+
112
+ test('should not fix already valid edge labels', async () => {
113
+ const validDiagram = `graph TD
114
+ A --|Label Text|--> B
115
+ B --|Another Label|--> C`;
116
+
117
+ const validation = await validateMermaidDiagram(validDiagram);
118
+ expect(validation.isValid).toBe(true);
119
+ expect(validation.diagramType).toBe('flowchart');
120
+ });
121
+
122
+ test('should handle mixed valid and invalid edge labels', async () => {
123
+ const mixedDiagram = `graph TD
124
+ A --|Valid Label|--> B
125
+ B -- "Invalid Label" --> C`;
126
+
127
+ const result = await validateMermaidDiagram(mixedDiagram);
128
+ expect(result.isValid).toBe(false);
129
+ expect(result.error).toBeDefined();
130
+ });
131
+
132
+ test('MermaidFixingAgent should not loop infinitely', async () => {
133
+ // Mock AI that returns a fixed diagram (this test ensures the flow completes)
134
+ const mockAgent = {
135
+ answer: jest.fn().mockResolvedValue('```mermaid\ngraph TD\n A -->|Fixed Label| B\n```')
136
+ };
137
+
138
+ const fixer = new MermaidFixingAgent({ debug: false });
139
+ await fixer.initializeAgent();
140
+ fixer.agent = mockAgent;
141
+
142
+ const invalidDiagram = 'graph TD\n A -- "Invalid" --> B';
143
+
144
+ // This should complete without looping
145
+ const result = await fixer.fixMermaidDiagram(invalidDiagram, ['Invalid syntax'], {});
146
+
147
+ // Verify AI was only called once (not in infinite loop)
148
+ expect(mockAgent.answer).toHaveBeenCalledTimes(1);
149
+ expect(result).toContain('-->|Fixed Label|');
150
+ });
151
+
152
+ test('MermaidFixingAgent should disable mermaid validation in nested ProbeAgent', async () => {
153
+ // This test verifies the fix for the infinite recursion bug
154
+ // The inner ProbeAgent used by MermaidFixingAgent must have disableMermaidValidation=true
155
+ const fixer = new MermaidFixingAgent({ debug: false });
156
+ await fixer.initializeAgent();
157
+
158
+ // Verify the nested ProbeAgent has mermaid validation disabled
159
+ expect(fixer.agent.disableMermaidValidation).toBe(true);
160
+ });
161
+ });
@@ -0,0 +1,76 @@
1
+ import { jest, describe, it, expect } from '@jest/globals';
2
+ import { validateMermaidDiagram } from '../../src/agent/schemaUtils.js';
3
+
4
+ describe('Mermaid HTML Entities Support', () => {
5
+ it('should accept HTML entities in node labels as valid', async () => {
6
+ // Test case based on Mermaid documentation best practices
7
+ const diagramWithEntities = `graph TD
8
+ A["Process &quot;data&quot; file"]
9
+ B["Node with &#39;single quotes&#39;"]
10
+ C{"Check &quot;status&quot; value"}
11
+ D["Mixed &quot;double&quot; and &#39;single&#39; quotes"]`;
12
+
13
+ const validation = await validateMermaidDiagram(diagramWithEntities);
14
+
15
+ // HTML entities should be valid according to Mermaid specs
16
+ expect(validation.isValid).toBe(true);
17
+ if (!validation.isValid) {
18
+ console.log('Validation error:', validation.error);
19
+ }
20
+ });
21
+
22
+ it('should accept numeric HTML entities', async () => {
23
+ const diagramWithNumericEntities = `graph TD
24
+ A["Quote: &#34; and apostrophe: &#39;"]
25
+ B["Hash: &#35; and ampersand: &#38;"]`;
26
+
27
+ const validation = await validateMermaidDiagram(diagramWithNumericEntities);
28
+ expect(validation.isValid).toBe(true);
29
+ });
30
+
31
+ it('should accept mixed HTML entities and regular text', async () => {
32
+ const diagram = `flowchart LR
33
+ A["Starting point"]
34
+ B["Process &quot;important&quot; data"]
35
+ C["Check if value &#61; &quot;expected&quot;"]
36
+ D["Output: &#39;success&#39; or &#39;failure&#39;"]`;
37
+
38
+ const validation = await validateMermaidDiagram(diagram);
39
+ expect(validation.isValid).toBe(true);
40
+ });
41
+
42
+ it('should not flag HTML entities as single quotes error', async () => {
43
+ const diagram = `graph TD
44
+ A["Text with &#39; entity"]`;
45
+
46
+ const validation = await validateMermaidDiagram(diagram);
47
+
48
+ // Should not trigger the single quote validation error
49
+ if (!validation.isValid) {
50
+ expect(validation.error).not.toContain('Single quotes in node label');
51
+ expect(validation.error).not.toContain('got PS');
52
+ }
53
+ });
54
+
55
+ describe('Real-world examples from Mermaid docs', () => {
56
+ it('should handle example from Mermaid documentation', async () => {
57
+ // Example adapted from Mermaid official docs
58
+ const diagram = `flowchart LR
59
+ A["A double quote:&quot;"]
60
+ B["A dec char:&#9829;"]
61
+ C["A hash:&#35;"]`;
62
+
63
+ const validation = await validateMermaidDiagram(diagram);
64
+ expect(validation.isValid).toBe(true);
65
+ });
66
+
67
+ it('should handle complex escaping example', async () => {
68
+ // Complex example from StackOverflow Mermaid discussion
69
+ const diagram = `flowchart LR
70
+ B["&quot;&lt;&lt;&gt;&gt;&amp;&#189;&#35;189;&quot;"]`;
71
+
72
+ const validation = await validateMermaidDiagram(diagram);
73
+ expect(validation.isValid).toBe(true);
74
+ });
75
+ });
76
+ });
@@ -0,0 +1,64 @@
1
+ import { jest, beforeEach, describe, it, expect } from '@jest/globals';
2
+ import { validateMermaidDiagram, validateAndFixMermaidResponse, MermaidFixingAgent } from '../../src/agent/schemaUtils.js';
3
+
4
+ describe('Mermaid Infinite Loop Fix', () => {
5
+ describe('Node label quote handling', () => {
6
+ it('should validate that HTML entities work in Mermaid diagrams', async () => {
7
+ const diagramWithEntities = `graph TD
8
+ A["Process &quot;data&quot; file"]
9
+ B["Handle &#39;special&#39; case"]
10
+ C{"Check &quot;status&quot;"}`;
11
+
12
+ const validation = await validateMermaidDiagram(diagramWithEntities);
13
+
14
+ // HTML entities should not trigger single quote validation errors
15
+ if (!validation.isValid) {
16
+ expect(validation.error).not.toMatch(/Single quotes in node label/);
17
+ expect(validation.error).not.toMatch(/got PS/);
18
+ }
19
+ });
20
+ });
21
+
22
+ describe('Diamond node quote handling', () => {
23
+ });
24
+
25
+ describe('MermaidFixingAgent should not pass schema to avoid infinite loops', () => {
26
+ it('should call agent.answer without schema parameter', async () => {
27
+ // Create a mock ProbeAgent
28
+ const mockAgent = {
29
+ answer: jest.fn().mockResolvedValue('```mermaid\ngraph TD\n A --> B\n```')
30
+ };
31
+
32
+ // Create MermaidFixingAgent and inject mock
33
+ const fixer = new MermaidFixingAgent({ debug: false });
34
+ await fixer.initializeAgent();
35
+ fixer.agent = mockAgent;
36
+
37
+ // Call fixMermaidDiagram
38
+ const brokenDiagram = 'graph TD\n A["broken (syntax"]';
39
+ await fixer.fixMermaidDiagram(brokenDiagram, ['line 1: unclosed bracket'], {});
40
+
41
+ // Verify that answer was called without schema
42
+ expect(mockAgent.answer).toHaveBeenCalled();
43
+ const callArgs = mockAgent.answer.mock.calls[0];
44
+ expect(callArgs[0]).toContain('Analyze and fix'); // prompt
45
+ expect(callArgs[1]).toEqual([]); // messages array
46
+
47
+ // Critical: verify no schema in options (either no 3rd arg or 3rd arg has no schema)
48
+ if (callArgs.length >= 3) {
49
+ expect(callArgs[2]).not.toHaveProperty('schema');
50
+ }
51
+ });
52
+
53
+ it('should initialize ProbeAgent with maxIterations set to 10', async () => {
54
+ // Create MermaidFixingAgent
55
+ const fixer = new MermaidFixingAgent({ debug: false });
56
+
57
+ // Initialize the agent
58
+ const agent = await fixer.initializeAgent();
59
+
60
+ // Verify maxIterations is set to 10 (increased from 2 to handle complex diagrams)
61
+ expect(agent.maxIterations).toBe(10);
62
+ });
63
+ });
64
+ });