@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,244 @@
1
+ /**
2
+ * Integration test to verify that schema-aware reminders prevent JSON validation loops
3
+ * This test validates that our fix solves the original issue
4
+ */
5
+ import { jest, describe, test, expect, beforeEach, afterEach } from '@jest/globals';
6
+
7
+ describe('Schema Validation Loop Prevention', () => {
8
+ let mockProbeAgent;
9
+ let mockMessages;
10
+
11
+ beforeEach(() => {
12
+ // Mock the current message flow that would happen in ProbeAgent
13
+ mockMessages = [];
14
+
15
+ mockProbeAgent = {
16
+ debug: true,
17
+ currentMessages: mockMessages,
18
+
19
+ // Mock the logic that sends reminder when no tool call is detected
20
+ sendReminderMessage(options) {
21
+ let reminderContent;
22
+ if (options.schema) {
23
+ // Schema-aware reminder (our new implementation)
24
+ reminderContent = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
25
+
26
+ Remember: Use proper XML format with BOTH opening and closing tags:
27
+
28
+ <tool_name>
29
+ <parameter>value</parameter>
30
+ </tool_name>
31
+
32
+ IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.
33
+ Use attempt_completion with your response directly inside the tags:
34
+
35
+ <attempt_completion>
36
+ {"key": "value", "field": "your actual data here matching the schema"}
37
+ </attempt_completion>
38
+
39
+ Your response must conform to this schema:
40
+ ${options.schema}`;
41
+ } else {
42
+ // Standard reminder
43
+ reminderContent = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
44
+
45
+ Remember: Use proper XML format with BOTH opening and closing tags:
46
+
47
+ <tool_name>
48
+ <parameter>value</parameter>
49
+ </tool_name>
50
+
51
+ Or for quick completion if your previous response was already correct:
52
+ <attempt_complete>`;
53
+ }
54
+
55
+ this.currentMessages.push({
56
+ role: 'user',
57
+ content: reminderContent
58
+ });
59
+
60
+ return reminderContent;
61
+ },
62
+
63
+ // Mock what would happen when AI responds with JSON in attempt_completion
64
+ simulateJsonResponse(jsonContent) {
65
+ this.currentMessages.push({
66
+ role: 'assistant',
67
+ content: `<attempt_completion>${jsonContent}</attempt_completion>`
68
+ });
69
+ return jsonContent;
70
+ }
71
+ };
72
+ });
73
+
74
+ afterEach(() => {
75
+ jest.clearAllMocks();
76
+ });
77
+
78
+ describe('With Schema - Loop Prevention', () => {
79
+ test('should provide clear JSON instructions upfront to prevent validation loops', () => {
80
+ const jsonSchema = '{"analysis": "string", "confidence": "number", "recommendations": "array"}';
81
+ const options = { schema: jsonSchema };
82
+
83
+ const reminder = mockProbeAgent.sendReminderMessage(options);
84
+
85
+ // Should clearly indicate JSON is required
86
+ expect(reminder).toContain('A schema was provided');
87
+ expect(reminder).toContain('You MUST respond with data that matches this schema');
88
+
89
+ // Should show exact format expected
90
+ expect(reminder).toContain('<attempt_completion>');
91
+ expect(reminder).toContain('{"key": "value"');
92
+ expect(reminder).toContain('</attempt_completion>');
93
+
94
+ // Should include the schema for reference
95
+ expect(reminder).toContain(jsonSchema);
96
+
97
+ // Should NOT include the shorthand that doesn't work with schema
98
+ expect(reminder).not.toContain('<attempt_complete>');
99
+ });
100
+
101
+ test('should simulate successful JSON response after clear instructions', () => {
102
+ const jsonSchema = '{"status": "string", "message": "string"}';
103
+ const options = { schema: jsonSchema };
104
+
105
+ // Step 1: Send schema-aware reminder
106
+ mockProbeAgent.sendReminderMessage(options);
107
+
108
+ // Step 2: Simulate AI responding with proper JSON format
109
+ const jsonResponse = '{"status": "complete", "message": "Analysis finished successfully"}';
110
+ const response = mockProbeAgent.simulateJsonResponse(jsonResponse);
111
+
112
+ // Verify the response is valid JSON
113
+ expect(() => JSON.parse(response)).not.toThrow();
114
+
115
+ // Verify it matches the expected schema structure
116
+ const parsed = JSON.parse(response);
117
+ expect(typeof parsed.status).toBe('string');
118
+ expect(typeof parsed.message).toBe('string');
119
+
120
+ // Verify message flow shows proper instruction -> proper response
121
+ expect(mockProbeAgent.currentMessages).toHaveLength(2);
122
+ expect(mockProbeAgent.currentMessages[0].role).toBe('user');
123
+ expect(mockProbeAgent.currentMessages[0].content).toContain('A schema was provided');
124
+ expect(mockProbeAgent.currentMessages[1].role).toBe('assistant');
125
+ expect(mockProbeAgent.currentMessages[1].content).toContain('<attempt_completion>');
126
+ });
127
+
128
+ test('should handle complex JSON schemas with clear instructions', () => {
129
+ const complexSchema = `{
130
+ "analysis": "string",
131
+ "findings": {
132
+ "type": "array",
133
+ "items": {
134
+ "type": "object",
135
+ "properties": {
136
+ "category": "string",
137
+ "severity": "string",
138
+ "description": "string"
139
+ }
140
+ }
141
+ },
142
+ "metrics": {
143
+ "type": "object",
144
+ "properties": {
145
+ "score": "number",
146
+ "coverage": "number"
147
+ }
148
+ }
149
+ }`;
150
+
151
+ const options = { schema: complexSchema };
152
+
153
+ const reminder = mockProbeAgent.sendReminderMessage(options);
154
+
155
+ // Should include the full complex schema
156
+ expect(reminder).toContain('"findings"');
157
+ expect(reminder).toContain('"metrics"');
158
+ expect(reminder).toContain('"severity"');
159
+ expect(reminder).toContain('"coverage"');
160
+
161
+ // Should still provide clear instructions
162
+ expect(reminder).toContain('You MUST respond with data that matches this schema');
163
+ });
164
+ });
165
+
166
+ describe('Without Schema - Existing Behavior', () => {
167
+ test('should maintain backward compatibility for non-schema cases', () => {
168
+ const options = {}; // No schema
169
+
170
+ const reminder = mockProbeAgent.sendReminderMessage(options);
171
+
172
+ // Should use standard reminder
173
+ expect(reminder).toContain('Please use one of the available tools');
174
+ expect(reminder).toContain('<attempt_complete>');
175
+
176
+ // Should NOT contain schema-specific instructions
177
+ expect(reminder).not.toContain('A schema was provided');
178
+ expect(reminder).not.toContain('matches this schema');
179
+ });
180
+
181
+ test('should allow shorthand completion for non-schema cases', () => {
182
+ const options = {}; // No schema
183
+
184
+ const reminder = mockProbeAgent.sendReminderMessage(options);
185
+
186
+ // Should include the shorthand option
187
+ expect(reminder).toContain('for quick completion if your previous response was already correct');
188
+ expect(reminder).toContain('<attempt_complete>');
189
+ });
190
+ });
191
+
192
+ describe('Comparison - Before vs After Fix', () => {
193
+ test('should demonstrate how the fix prevents validation loops', () => {
194
+ // BEFORE: No schema-specific instructions led to validation loops
195
+ const beforeReminder = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
196
+
197
+ Remember: Use proper XML format with BOTH opening and closing tags:
198
+
199
+ <tool_name>
200
+ <parameter>value</parameter>
201
+ </tool_name>
202
+
203
+ Or for quick completion if your previous response was already correct:
204
+ <attempt_complete>`;
205
+
206
+ // AFTER: Schema-aware instructions prevent loops
207
+ const jsonSchema = '{"result": "string"}';
208
+ const options = { schema: jsonSchema };
209
+ const afterReminder = mockProbeAgent.sendReminderMessage(options);
210
+
211
+ // Before: No indication that JSON was required
212
+ expect(beforeReminder).not.toContain('schema');
213
+ expect(beforeReminder).not.toContain('JSON');
214
+
215
+ // After: Clear indication that JSON is required
216
+ expect(afterReminder).toContain('A schema was provided');
217
+ expect(afterReminder).toContain('You MUST respond with data that matches this schema');
218
+ expect(afterReminder).toContain(jsonSchema);
219
+ });
220
+
221
+ test('should show the validation loop scenario that is now prevented', () => {
222
+ // This test documents the problem that our fix solves
223
+ const jsonSchema = '{"analysis": "string", "score": "number"}';
224
+
225
+ // OLD BEHAVIOR (what would cause loops):
226
+ // 1. Agent gets no schema info in reminder
227
+ // 2. Agent responds with plain text in attempt_completion
228
+ // 3. System detects JSON schema and tries to correct
229
+ // 4. Agent still responds with plain text -> LOOP
230
+
231
+ // NEW BEHAVIOR (our fix):
232
+ // 1. Agent gets clear schema info in reminder
233
+ const options = { schema: jsonSchema };
234
+ const reminder = mockProbeAgent.sendReminderMessage(options);
235
+
236
+ // 2. Agent knows to respond with JSON from the start
237
+ expect(reminder).toContain('You MUST respond with data that matches this schema');
238
+ expect(reminder).toContain('{"key": "value", "field": "your actual data here matching the schema"}');
239
+
240
+ // 3. No validation loop needed - prevention at the source
241
+ expect(reminder).toContain(jsonSchema);
242
+ });
243
+ });
244
+ });
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Integration tests for schema validation retry logic
3
+ * Tests the new 3-attempt retry mechanism with escalating prompts
4
+ */
5
+
6
+ import { describe, test, expect, jest, beforeEach, afterEach } from '@jest/globals';
7
+ import * as schemaUtils from '../../src/agent/schemaUtils.js';
8
+
9
+ describe('Schema Validation Retry Logic Integration Tests', () => {
10
+ let mockAnswer;
11
+
12
+ beforeEach(() => {
13
+ // Create a mock answer function that simulates the ProbeAgent.answer method
14
+ mockAnswer = jest.fn();
15
+ });
16
+
17
+ afterEach(() => {
18
+ jest.clearAllMocks();
19
+ });
20
+
21
+ test('should create escalating correction prompts for retry attempts', () => {
22
+ const invalidResponse = 'Hello, this is not JSON';
23
+ const schema = '{"result": "string"}';
24
+ const error = 'Unexpected token H in JSON at position 0';
25
+
26
+ // Test the first retry (retryCount 0)
27
+ const prompt0 = schemaUtils.createJsonCorrectionPrompt(invalidResponse, schema, error, 0);
28
+ expect(prompt0).toContain('CRITICAL JSON ERROR:');
29
+ expect(prompt0).toContain('Return ONLY the corrected JSON');
30
+
31
+ // Test the second retry (retryCount 1)
32
+ const prompt1 = schemaUtils.createJsonCorrectionPrompt(invalidResponse, schema, error, 1);
33
+ expect(prompt1).toContain('URGENT - JSON PARSING FAILED:');
34
+ expect(prompt1).toContain('second chance');
35
+ expect(prompt1).toContain('ABSOLUTELY NO explanatory text');
36
+
37
+ // Test the third retry (retryCount 2)
38
+ const prompt2 = schemaUtils.createJsonCorrectionPrompt(invalidResponse, schema, error, 2);
39
+ expect(prompt2).toContain('FINAL ATTEMPT - CRITICAL JSON ERROR:');
40
+ expect(prompt2).toContain('final retry');
41
+ expect(prompt2).toContain('EXAMPLE:');
42
+ });
43
+
44
+ test('should simulate retry logic behavior with real functions', () => {
45
+ const invalidResponses = [
46
+ 'Hello, this is not JSON',
47
+ '```json\n{"incomplete":',
48
+ 'Another invalid response'
49
+ ];
50
+ const schema = '{"result": "string"}';
51
+
52
+ // Test that each retry creates the appropriate correction prompt
53
+ invalidResponses.forEach((response, index) => {
54
+ const prompt = schemaUtils.createJsonCorrectionPrompt(response, schema, 'Invalid JSON', index);
55
+
56
+ if (index === 0) {
57
+ expect(prompt).toContain('CRITICAL JSON ERROR:');
58
+ } else if (index === 1) {
59
+ expect(prompt).toContain('URGENT - JSON PARSING FAILED:');
60
+ } else if (index === 2) {
61
+ expect(prompt).toContain('FINAL ATTEMPT - CRITICAL JSON ERROR:');
62
+ }
63
+
64
+ expect(prompt).toContain(response.substring(0, 50)); // Should contain truncated response
65
+ expect(prompt).toContain(schema);
66
+ expect(prompt).toContain('Invalid JSON');
67
+ });
68
+ });
69
+
70
+ test('should test enhanced JSON extraction patterns', () => {
71
+ const testCases = [
72
+ {
73
+ input: 'AI: Here is your JSON: ```json\n{"result": "success"}\n```',
74
+ expected: '{"result": "success"}',
75
+ description: 'should extract from code blocks with text before'
76
+ },
77
+ {
78
+ input: 'Response:\n{"data": "value"}',
79
+ expected: 'Response:\n{"data": "value"}', // Returns original - text precedes JSON
80
+ description: 'should not extract when text precedes JSON'
81
+ },
82
+ {
83
+ input: '```\n[{"item": 1}, {"item": 2}]\n```',
84
+ expected: '[{"item": 1}, {"item": 2}]',
85
+ description: 'should extract array from unmarked code block'
86
+ }
87
+ ];
88
+
89
+ testCases.forEach(({ input, expected, description }) => {
90
+ const result = schemaUtils.cleanSchemaResponse(input);
91
+ expect(result).toBe(expected);
92
+ });
93
+ });
94
+ });
@@ -0,0 +1,329 @@
1
+ /**
2
+ * Integration tests for the complete validation flow
3
+ * Tests how JSON and Mermaid validation work together
4
+ */
5
+
6
+ import { describe, test, expect, jest } from '@jest/globals';
7
+ import {
8
+ isJsonSchema,
9
+ isMermaidSchema,
10
+ validateJsonResponse,
11
+ validateMermaidDiagram,
12
+ validateMermaidResponse,
13
+ cleanSchemaResponse,
14
+ processSchemaResponse,
15
+ createJsonCorrectionPrompt,
16
+ createMermaidCorrectionPrompt,
17
+ extractMermaidFromMarkdown
18
+ } from '../../src/agent/schemaUtils.js';
19
+
20
+ describe('Validation Flow Integration', () => {
21
+ describe('Schema Detection Priority', () => {
22
+ test('should detect both JSON and Mermaid schemas correctly', () => {
23
+ const jsonOnlySchema = '{"users": [{"name": "string"}]}';
24
+ const mermaidOnlySchema = 'Create a mermaid flowchart diagram';
25
+ const mixedSchema = 'Create a JSON response with a mermaid diagram showing the flow';
26
+
27
+ expect(isJsonSchema(jsonOnlySchema)).toBe(true);
28
+ expect(isMermaidSchema(jsonOnlySchema)).toBe(false);
29
+
30
+ expect(isJsonSchema(mermaidOnlySchema)).toBe(false);
31
+ expect(isMermaidSchema(mermaidOnlySchema)).toBe(true);
32
+
33
+ expect(isJsonSchema(mixedSchema)).toBe(true);
34
+ expect(isMermaidSchema(mixedSchema)).toBe(true);
35
+ });
36
+
37
+ test('should prioritize validation order (Mermaid first, then JSON)', async () => {
38
+ const response = `{
39
+ "description": "Here's the process flow",
40
+ "diagram": "\`\`\`mermaid\\ngraph TD\\n A[Start] --> B[Process]\\n B --> C[End]\\n\`\`\`"
41
+ }`;
42
+
43
+ const schema = 'Return JSON with a mermaid diagram field';
44
+
45
+ // Test that we can detect both types
46
+ expect(isMermaidSchema(schema)).toBe(true);
47
+ expect(isJsonSchema(schema)).toBe(true);
48
+
49
+ // Test Mermaid validation first - with JSON-aware extraction, diagrams in JSON strings are now found
50
+ const mermaidValidation = await validateMermaidResponse(response);
51
+ expect(mermaidValidation.isValid).toBe(true); // Mermaid diagrams in JSON strings are now detected and validated
52
+ expect(mermaidValidation.diagrams).toHaveLength(1);
53
+ expect(mermaidValidation.diagrams[0].isInJson).toBe(true);
54
+ expect(mermaidValidation.diagrams[0].diagramType).toBe('flowchart');
55
+
56
+ // Test JSON validation second
57
+ const cleanedResponse = cleanSchemaResponse(response);
58
+ const jsonValidation = validateJsonResponse(cleanedResponse);
59
+ expect(jsonValidation.isValid).toBe(true);
60
+ });
61
+ });
62
+
63
+ describe('Complex Response Validation', () => {
64
+ test('should handle response with valid JSON and valid Mermaid', async () => {
65
+ const response = `Here's your analysis:
66
+
67
+ \`\`\`json
68
+ {
69
+ "status": "completed",
70
+ "diagram_count": 1
71
+ }
72
+ \`\`\`
73
+
74
+ \`\`\`mermaid
75
+ graph TD
76
+ A[Analysis] --> B[Results]
77
+ B --> C[Report]
78
+ \`\`\``;
79
+
80
+ // Clean and validate JSON part
81
+ const cleanedJson = '{\n "status": "completed",\n "diagram_count": 1\n}';
82
+ const jsonValidation = validateJsonResponse(cleanedJson);
83
+ expect(jsonValidation.isValid).toBe(true);
84
+
85
+ // Validate Mermaid part
86
+ const mermaidValidation = await validateMermaidResponse(response);
87
+ expect(mermaidValidation.isValid).toBe(true);
88
+ });
89
+
90
+ test('should handle response with invalid JSON and valid Mermaid', async () => {
91
+ const response = `Here's your analysis:
92
+
93
+ \`\`\`json
94
+ {
95
+ "status": completed,
96
+ "diagram_count": 1
97
+ }
98
+ \`\`\`
99
+
100
+ \`\`\`mermaid
101
+ graph TD
102
+ A[Analysis] --> B[Results]
103
+ B --> C[Report]
104
+ \`\`\``;
105
+
106
+ // JSON should be invalid (missing quotes)
107
+ const cleanedJson = '{\n "status": completed,\n "diagram_count": 1\n}';
108
+ const jsonValidation = validateJsonResponse(cleanedJson);
109
+ expect(jsonValidation.isValid).toBe(false);
110
+
111
+ // Mermaid should be valid
112
+ const mermaidValidation = await validateMermaidResponse(response);
113
+ expect(mermaidValidation.isValid).toBe(true);
114
+ });
115
+
116
+ test('should handle response with valid JSON and invalid Mermaid', async () => {
117
+ const response = `Here's your analysis:
118
+
119
+ \`\`\`json
120
+ {
121
+ "status": "completed",
122
+ "diagram_count": 1
123
+ }
124
+ \`\`\`
125
+
126
+ \`\`\`mermaid
127
+ invalid diagram syntax
128
+ \`\`\``;
129
+
130
+ // JSON should be valid
131
+ const cleanedJson = '{\n "status": "completed",\n "diagram_count": 1\n}';
132
+ const jsonValidation = validateJsonResponse(cleanedJson);
133
+ expect(jsonValidation.isValid).toBe(true);
134
+
135
+ // Mermaid should be invalid
136
+ const mermaidValidation = await validateMermaidResponse(response);
137
+ expect(mermaidValidation.isValid).toBe(false);
138
+ });
139
+
140
+ test('should handle multiple Mermaid diagrams with mixed validity', async () => {
141
+ const response = `\`\`\`mermaid
142
+ graph TD
143
+ A --> B
144
+ \`\`\`
145
+
146
+ \`\`\`mermaid
147
+ invalid syntax
148
+ \`\`\`
149
+
150
+ \`\`\`mermaid
151
+ sequenceDiagram
152
+ Alice->>Bob: Hello
153
+ \`\`\``;
154
+
155
+ const validation = await validateMermaidResponse(response);
156
+ expect(validation.isValid).toBe(false);
157
+ expect(validation.diagrams).toHaveLength(3);
158
+ expect(validation.diagrams[0].isValid).toBe(true);
159
+ expect(validation.diagrams[1].isValid).toBe(false);
160
+ expect(validation.diagrams[2].isValid).toBe(true);
161
+ });
162
+ });
163
+
164
+ describe('Error Message Quality', () => {
165
+ test('should provide detailed JSON correction prompts', () => {
166
+ const invalidJson = '{"name": John, "age": 25}';
167
+ const schema = '{"name": "string", "age": "number"}';
168
+ const error = 'Unexpected token J in JSON at position 9';
169
+ const detailedError = 'Unexpected token J in JSON at position 9';
170
+
171
+ const prompt = createJsonCorrectionPrompt(invalidJson, schema, error, 0);
172
+
173
+ expect(prompt).toContain('CRITICAL JSON ERROR:');
174
+ expect(prompt).toContain('not valid JSON');
175
+ expect(prompt).toContain(invalidJson);
176
+ expect(prompt).toContain('Unexpected token J');
177
+ expect(prompt).toContain('corrected JSON');
178
+ });
179
+
180
+ test('should provide detailed Mermaid correction prompts', () => {
181
+ const invalidResponse = `\`\`\`mermaid
182
+ graph TD
183
+ A[Start --> B[Missing bracket
184
+ \`\`\``;
185
+
186
+ const schema = 'Create a mermaid flowchart';
187
+ const errors = ['Diagram 1: Unclosed bracket on line 2'];
188
+ const diagrams = [{
189
+ diagram: 'graph TD\n A[Start --> B[Missing bracket',
190
+ isValid: false,
191
+ error: 'Unclosed bracket on line 2',
192
+ detailedError: 'Line "A[Start --> B[Missing bracket" contains an unclosed bracket'
193
+ }];
194
+
195
+ const prompt = createMermaidCorrectionPrompt(invalidResponse, schema, errors, diagrams);
196
+
197
+ expect(prompt).toContain('invalid Mermaid diagrams');
198
+ expect(prompt).toContain('Unclosed bracket');
199
+ expect(prompt).toContain('mermaid code blocks');
200
+ expect(prompt).toContain('correct Mermaid syntax');
201
+ });
202
+
203
+ test('should handle complex error scenarios', async () => {
204
+ const response = `Here are the results:
205
+
206
+ \`\`\`mermaid
207
+ sequenceDiagram
208
+ Alice->>Bob Hello world
209
+ Bob-->>Alice: Response
210
+ \`\`\`
211
+
212
+ \`\`\`json
213
+ {
214
+ "results": [
215
+ {"id": 1, "status": completed}
216
+ ]
217
+ }
218
+ \`\`\``;
219
+
220
+ // Both should be invalid
221
+ const mermaidValidation = await validateMermaidResponse(response);
222
+ expect(mermaidValidation.isValid).toBe(false);
223
+ expect(mermaidValidation.errors[0]).toContain('Missing colon');
224
+
225
+ const jsonPart = '{\n "results": [\n {"id": 1, "status": completed}\n ]\n}';
226
+ const jsonValidation = validateJsonResponse(jsonPart);
227
+ expect(jsonValidation.isValid).toBe(false);
228
+ });
229
+ });
230
+
231
+ describe('Edge Cases', () => {
232
+ test('should handle empty responses', async () => {
233
+ const emptyInputs = ['', ' ', '\n\n', null, undefined];
234
+
235
+ for (const input of emptyInputs) {
236
+ const mermaidValidation = await validateMermaidResponse(input);
237
+ expect(mermaidValidation.isValid).toBe(false);
238
+
239
+ if (input) {
240
+ const jsonValidation = validateJsonResponse(input);
241
+ expect(jsonValidation.isValid).toBe(false);
242
+ }
243
+ }
244
+ });
245
+
246
+ test('should handle malformed markdown blocks', async () => {
247
+ const malformedResponse = `\`\`\`mermaid
248
+ graph TD
249
+ A --> B
250
+ \`\`\`mermaid (extra text)
251
+ sequenceDiagram
252
+ Alice->>Bob: Test
253
+ \`\`\``;
254
+
255
+ const { diagrams } = extractMermaidFromMarkdown(malformedResponse);
256
+ expect(diagrams).toHaveLength(1);
257
+ expect(diagrams[0].content).toContain('graph TD');
258
+ });
259
+
260
+ test('should handle nested code blocks', async () => {
261
+ const response = `Here's an example:
262
+
263
+ \`\`\`markdown
264
+ This is how you create a mermaid diagram:
265
+
266
+ \`\`\`mermaid
267
+ graph TD
268
+ A --> B
269
+ \`\`\`
270
+ \`\`\`
271
+
272
+ And here's a real diagram:
273
+
274
+ \`\`\`mermaid
275
+ sequenceDiagram
276
+ Alice->>Bob: Hello
277
+ \`\`\``;
278
+
279
+ const { diagrams } = extractMermaidFromMarkdown(response);
280
+ expect(diagrams).toHaveLength(2); // Both embedded and real diagrams are extracted
281
+ expect(diagrams[0].content).toContain('graph TD');
282
+ expect(diagrams[1].content).toContain('sequenceDiagram');
283
+ });
284
+
285
+ test('should handle very large diagrams', async () => {
286
+ const largeDiagram = 'graph TD\n' + Array(1000).fill(0).map((_, i) =>
287
+ ` A${i}[Node ${i}] --> A${i + 1}[Node ${i + 1}]`
288
+ ).join('\n');
289
+
290
+ const result = await validateMermaidDiagram(largeDiagram);
291
+ expect(result.isValid).toBe(true);
292
+ expect(result.diagramType).toBe('flowchart');
293
+ });
294
+
295
+ test('should handle Unicode characters in diagrams', async () => {
296
+ const unicodeDiagram = `graph TD
297
+ A[开始] --> B[处理]
298
+ B --> C[结束]
299
+ D[🎯 Goal] --> E[✅ Complete]`;
300
+
301
+ const result = await validateMermaidDiagram(unicodeDiagram);
302
+ expect(result.isValid).toBe(true);
303
+ });
304
+
305
+ test('should handle process schema response with all options', () => {
306
+ const response = `\`\`\`json
307
+ {
308
+ "test": "value"
309
+ }
310
+ \`\`\`
311
+
312
+ \`\`\`mermaid
313
+ graph TD
314
+ A --> B
315
+ \`\`\``;
316
+
317
+ const result = processSchemaResponse(response, 'mixed schema', {
318
+ validateJson: true,
319
+ validateXml: false,
320
+ debug: true
321
+ });
322
+
323
+ expect(result.cleaned).toBeDefined();
324
+ expect(result.debug).toBeDefined();
325
+ expect(result.jsonValidation).toBeDefined();
326
+ expect(result.debug.wasModified).toBe(true);
327
+ });
328
+ });
329
+ });