@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,188 @@
1
+ import { parseXmlToolCallWithThinking } from '../../src/agent/tools.js';
2
+
3
+ /**
4
+ * Test for fixing issue where JSON content containing "</attempt_completion>" string
5
+ * causes the XML parser to truncate the content prematurely.
6
+ *
7
+ * GitHub Issue: Content with closing tag string gets truncated
8
+ *
9
+ * Problem: When attempt_completion contains JSON with a suggestion like:
10
+ * "suggestion": "Use regex: /<attempt_completion>/"
11
+ * The parser finds this "</attempt_completion>" and treats it as the closing tag,
12
+ * truncating the JSON and causing validation errors.
13
+ */
14
+ describe('attempt_completion with closing tag in content', () => {
15
+ test('should handle JSON content with escaped closing tag in string', () => {
16
+ const xmlString = `<attempt_completion>
17
+ {
18
+ "issues": [
19
+ {
20
+ "file": "npm/src/agent/contextCompactor.js",
21
+ "line": 115,
22
+ "ruleId": "logic/weak-pattern-matching",
23
+ "message": "The attempt_completion detection uses simple string matching",
24
+ "severity": "warning",
25
+ "category": "logic",
26
+ "suggestion": "Use more precise regex pattern to match actual XML tags: /<attempt_completion(?:[^>]*)>/ or /<\\/attempt_completion>/",
27
+ "replacement": "if (/<attempt_completion(?:[^>]*)>|<\\/attempt_completion>/.test(content)) {"
28
+ }
29
+ ]
30
+ }
31
+ </attempt_completion>`;
32
+
33
+ const result = parseXmlToolCallWithThinking(xmlString);
34
+
35
+ expect(result).toBeDefined();
36
+ expect(result.toolName).toBe('attempt_completion');
37
+ expect(result.params.result).toBeDefined();
38
+
39
+ // Verify the JSON is complete and parseable
40
+ const jsonResult = JSON.parse(result.params.result);
41
+ expect(jsonResult.issues).toHaveLength(1);
42
+ expect(jsonResult.issues[0].suggestion).toContain('</attempt_completion>');
43
+ expect(jsonResult.issues[0].replacement).toContain('</attempt_completion>');
44
+ });
45
+
46
+ test('should handle content with closing tag string in plain text', () => {
47
+ const xmlString = `<attempt_completion>
48
+ The issue is in the XML parser. It searches for </attempt_completion> using indexOf(),
49
+ which finds the first occurrence rather than the actual closing tag. This causes truncation
50
+ when the content contains strings like </attempt_completion> in regex patterns or code examples.
51
+ </attempt_completion>`;
52
+
53
+ const result = parseXmlToolCallWithThinking(xmlString);
54
+
55
+ expect(result).toBeDefined();
56
+ expect(result.toolName).toBe('attempt_completion');
57
+ expect(result.params.result).toContain('</attempt_completion>');
58
+ expect(result.params.result).toContain('This causes truncation');
59
+ });
60
+
61
+ test('should handle multiple occurrences of closing tag string in content', () => {
62
+ const xmlString = `<attempt_completion>
63
+ {
64
+ "patterns": [
65
+ "Pattern 1: </attempt_completion>",
66
+ "Pattern 2: <\\/attempt_completion>",
67
+ "Pattern 3: </attempt_completion>"
68
+ ],
69
+ "note": "All patterns above should be preserved"
70
+ }
71
+ </attempt_completion>`;
72
+
73
+ const result = parseXmlToolCallWithThinking(xmlString);
74
+
75
+ expect(result).toBeDefined();
76
+ expect(result.toolName).toBe('attempt_completion');
77
+
78
+ const jsonResult = JSON.parse(result.params.result);
79
+ expect(jsonResult.patterns).toHaveLength(3);
80
+ expect(jsonResult.patterns[0]).toContain('</attempt_completion>');
81
+ expect(jsonResult.patterns[1]).toContain('</attempt_completion>');
82
+ expect(jsonResult.patterns[2]).toContain('</attempt_completion>');
83
+ expect(jsonResult.note).toBe('All patterns above should be preserved');
84
+ });
85
+
86
+ test('should handle closing tag in markdown code block', () => {
87
+ const xmlString = `<attempt_completion>
88
+ ## Fix Instructions
89
+
90
+ The XML parser needs to be updated:
91
+
92
+ \`\`\`javascript
93
+ // Before (buggy):
94
+ const closeIndex = xmlString.indexOf('</attempt_completion>');
95
+
96
+ // After (fixed):
97
+ const closeIndex = xmlString.lastIndexOf('</attempt_completion>');
98
+ \`\`\`
99
+
100
+ This ensures we find the actual closing tag, not one in the content.
101
+ </attempt_completion>`;
102
+
103
+ const result = parseXmlToolCallWithThinking(xmlString);
104
+
105
+ expect(result).toBeDefined();
106
+ expect(result.toolName).toBe('attempt_completion');
107
+ expect(result.params.result).toContain('## Fix Instructions');
108
+ expect(result.params.result).toContain('indexOf');
109
+ expect(result.params.result).toContain('lastIndexOf');
110
+ expect(result.params.result).toContain('This ensures we find the actual closing tag');
111
+ });
112
+
113
+ test('should handle nested XML-like content', () => {
114
+ const xmlString = `<attempt_completion>
115
+ <analysis>
116
+ <finding>The code uses indexOf to find </attempt_completion></finding>
117
+ <recommendation>Use lastIndexOf or proper XML parsing</recommendation>
118
+ </analysis>
119
+ </attempt_completion>`;
120
+
121
+ const result = parseXmlToolCallWithThinking(xmlString);
122
+
123
+ expect(result).toBeDefined();
124
+ expect(result.toolName).toBe('attempt_completion');
125
+ expect(result.params.result).toContain('<analysis>');
126
+ expect(result.params.result).toContain('<finding>');
127
+ expect(result.params.result).toContain('</attempt_completion></finding>');
128
+ expect(result.params.result).toContain('</recommendation>');
129
+ expect(result.params.result).toContain('</analysis>');
130
+ });
131
+
132
+ test('should reproduce the exact issue from the log', () => {
133
+ // This is the exact content from the bug report log
134
+ const xmlString = `<attempt_completion>
135
+ {
136
+ "issues": [
137
+ {
138
+ "file": "npm/src/agent/contextCompactor.js",
139
+ "line": 115,
140
+ "ruleId": "logic/weak-pattern-matching",
141
+ "message": "The attempt_completion detection uses simple string matching which could match content that mentions attempt_completion but isn't actually a completion tag",
142
+ "severity": "warning",
143
+ "category": "logic",
144
+ "suggestion": "Use more precise regex pattern to match actual XML tags: /<attempt_completion(?:[^>]*)>/ or /<\\/attempt_completion>/",
145
+ "replacement": "if (/<attempt_completion(?:[^>]*)>|<\\/attempt_completion>/.test(content)) {"
146
+ },
147
+ {
148
+ "file": "npm/src/agent/contextCompactor.js",
149
+ "line": 88,
150
+ "ruleId": "logic/weak-pattern-matching",
151
+ "message": "Tool result detection uses simple string matching which could have false positives",
152
+ "severity": "warning",
153
+ "category": "logic",
154
+ "suggestion": "Use more precise regex pattern to match actual tool_result tags: /<tool_result>/",
155
+ "replacement": "const isToolResult = /<tool_result>/.test(content);"
156
+ },
157
+ {
158
+ "file": "npm/src/agent/ProbeAgent.js",
159
+ "line": 2480,
160
+ "ruleId": "logic/incomplete-error-handling",
161
+ "message": "Storage error handling only logs but doesn't propagate the error, potentially leaving the system in an inconsistent state",
162
+ "severity": "warning",
163
+ "category": "logic",
164
+ "suggestion": "Either propagate the error or implement a retry mechanism to ensure data consistency",
165
+ "replacement": " } catch (error) {\\n console.error(\`[ERROR] Failed to save compacted messages to storage:\`, error);\\n throw new Error(\`Failed to save compacted history: \${error.message}\`);\\n }"
166
+ }
167
+ ]
168
+ }
169
+ </attempt_completion>`;
170
+
171
+ const result = parseXmlToolCallWithThinking(xmlString);
172
+
173
+ expect(result).toBeDefined();
174
+ expect(result.toolName).toBe('attempt_completion');
175
+ expect(result.params.result).toBeDefined();
176
+
177
+ // The result should be valid JSON
178
+ let jsonResult;
179
+ expect(() => {
180
+ jsonResult = JSON.parse(result.params.result);
181
+ }).not.toThrow();
182
+
183
+ // Verify the complete structure
184
+ expect(jsonResult.issues).toHaveLength(3);
185
+ expect(jsonResult.issues[0].replacement).toContain('</attempt_completion>');
186
+ expect(jsonResult.issues[2].replacement).toContain('Failed to save compacted history');
187
+ });
188
+ });
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Unit tests for attempt_completion JSON schema fix
3
+ * Tests the core functionality without requiring full ProbeAgent integration
4
+ */
5
+
6
+ import { describe, test, expect } from '@jest/globals';
7
+ import {
8
+ cleanSchemaResponse,
9
+ validateJsonResponse,
10
+ isJsonSchemaDefinition,
11
+ createJsonCorrectionPrompt,
12
+ createSchemaDefinitionCorrectionPrompt
13
+ } from '../../src/agent/schemaUtils.js';
14
+
15
+ describe('attempt_completion JSON schema fix', () => {
16
+
17
+ describe('Core Schema Processing Logic', () => {
18
+ test('should detect when AI returns schema definition instead of data', () => {
19
+ // Simulate attempt_completion result that contains schema definition
20
+ const schemaDefinitionResponse = `\`\`\`json
21
+ {
22
+ "$schema": "http://json-schema.org/draft-07/schema#",
23
+ "$id": "word-count",
24
+ "title": "Word Count Result",
25
+ "description": "Result of word counting operation",
26
+ "type": "object",
27
+ "required": ["message", "count"],
28
+ "properties": {
29
+ "message": {
30
+ "type": "string",
31
+ "description": "A descriptive message about the word count"
32
+ },
33
+ "count": {
34
+ "type": "number",
35
+ "description": "The actual number of words counted"
36
+ }
37
+ }
38
+ }
39
+ \`\`\``;
40
+
41
+ // Clean the response (remove markdown)
42
+ const cleaned = cleanSchemaResponse(schemaDefinitionResponse);
43
+
44
+ // Should be valid JSON
45
+ const validation = validateJsonResponse(cleaned);
46
+ expect(validation.isValid).toBe(true);
47
+
48
+ // But should be detected as schema definition, not data
49
+ const isSchemaDefinition = isJsonSchemaDefinition(cleaned);
50
+ expect(isSchemaDefinition).toBe(true);
51
+ });
52
+
53
+ test('should not detect actual data as schema definition', () => {
54
+ // Simulate correct attempt_completion result with actual data
55
+ const dataResponse = `\`\`\`json
56
+ {
57
+ "message": "There are 3 words in the text Hello world test",
58
+ "count": 3
59
+ }
60
+ \`\`\``;
61
+
62
+ // Clean the response
63
+ const cleaned = cleanSchemaResponse(dataResponse);
64
+
65
+ // Should be valid JSON
66
+ const validation = validateJsonResponse(cleaned);
67
+ expect(validation.isValid).toBe(true);
68
+
69
+ // Should NOT be detected as schema definition
70
+ const isSchemaDefinition = isJsonSchemaDefinition(cleaned);
71
+ expect(isSchemaDefinition).toBe(false);
72
+
73
+ // Parse and verify it's actual data
74
+ const parsed = JSON.parse(cleaned);
75
+ expect(parsed).toHaveProperty('message');
76
+ expect(parsed).toHaveProperty('count');
77
+ expect(typeof parsed.message).toBe('string');
78
+ expect(typeof parsed.count).toBe('number');
79
+ });
80
+
81
+ test('should create appropriate correction prompt for schema definition confusion', () => {
82
+ const schemaDefinition = JSON.stringify({
83
+ "$schema": "http://json-schema.org/draft-07/schema#",
84
+ "type": "object",
85
+ "properties": {
86
+ "message": {"type": "string"},
87
+ "count": {"type": "number"}
88
+ },
89
+ "required": ["message", "count"]
90
+ });
91
+
92
+ const originalSchema = `{
93
+ "type": "object",
94
+ "properties": {
95
+ "message": {"type": "string"},
96
+ "count": {"type": "number"}
97
+ },
98
+ "required": ["message", "count"]
99
+ }`;
100
+
101
+ // Test first correction attempt
102
+ const correctionPrompt = createSchemaDefinitionCorrectionPrompt(
103
+ schemaDefinition,
104
+ originalSchema,
105
+ 0
106
+ );
107
+
108
+ expect(correctionPrompt).toContain('CRITICAL MISUNDERSTANDING:');
109
+ expect(correctionPrompt).toContain('You returned a JSON schema definition instead of data');
110
+ expect(correctionPrompt).toContain('You must return ACTUAL DATA');
111
+ expect(correctionPrompt).toContain('Instead of: {"type": "object"');
112
+ expect(correctionPrompt).toContain('Return: {"actualData": "value"');
113
+ expect(correctionPrompt).toContain(originalSchema);
114
+ });
115
+
116
+ test('should create escalating correction prompts for invalid JSON', () => {
117
+ const invalidResponse = 'Based on the text "Hello world test", I can count that there are 3 words.';
118
+ const schema = `{"type": "object", "properties": {"message": {"type": "string"}, "count": {"type": "number"}}}`;
119
+ const error = 'Unexpected token B in JSON at position 0';
120
+
121
+ // Test escalating prompts
122
+ const prompts = [
123
+ createJsonCorrectionPrompt(invalidResponse, schema, error, 0),
124
+ createJsonCorrectionPrompt(invalidResponse, schema, error, 1),
125
+ createJsonCorrectionPrompt(invalidResponse, schema, error, 2)
126
+ ];
127
+
128
+ expect(prompts[0]).toContain('CRITICAL JSON ERROR:');
129
+ expect(prompts[1]).toContain('URGENT - JSON PARSING FAILED:');
130
+ expect(prompts[2]).toContain('FINAL ATTEMPT - CRITICAL JSON ERROR:');
131
+
132
+ // All should contain the error and schema
133
+ prompts.forEach(prompt => {
134
+ expect(prompt).toContain(error);
135
+ expect(prompt).toContain(schema);
136
+ expect(prompt).toContain(invalidResponse.substring(0, 100));
137
+ });
138
+ });
139
+
140
+ test('should properly clean markdown from attempt_completion responses', () => {
141
+ const testCases = [
142
+ {
143
+ input: 'Based on analysis:\n\n```json\n{"result": "success"}\n```\n\nThis completes the task.',
144
+ expected: '{"result": "success"}',
145
+ description: 'should extract JSON from markdown with surrounding text'
146
+ },
147
+ {
148
+ input: '```json\n{"message": "Word count is 3", "count": 3}\n```',
149
+ expected: '{"message": "Word count is 3", "count": 3}',
150
+ description: 'should extract clean JSON from simple markdown block'
151
+ },
152
+ {
153
+ input: 'Plain text response without JSON',
154
+ expected: 'Plain text response without JSON',
155
+ description: 'should return plain text unchanged when no JSON found'
156
+ },
157
+ {
158
+ input: '{"direct": "json", "without": "markdown"}',
159
+ expected: '{"direct": "json", "without": "markdown"}',
160
+ description: 'should handle direct JSON without markdown'
161
+ }
162
+ ];
163
+
164
+ testCases.forEach(({ input, expected, description }) => {
165
+ const result = cleanSchemaResponse(input);
166
+ expect(result).toBe(expected);
167
+ });
168
+ });
169
+ });
170
+
171
+ describe('JSON Validation Edge Cases', () => {
172
+ test('should handle malformed JSON responses', () => {
173
+ const malformedResponses = [
174
+ '{"incomplete": ',
175
+ '{"missing": "quote}',
176
+ '{"trailing": "comma",}',
177
+ '{invalid: "property"}'
178
+ ];
179
+
180
+ malformedResponses.forEach(response => {
181
+ const validation = validateJsonResponse(response);
182
+ expect(validation.isValid).toBe(false);
183
+ expect(validation.error).toBeDefined();
184
+ });
185
+ });
186
+
187
+ test('should validate correct JSON responses', () => {
188
+ const validResponses = [
189
+ '{"simple": "object"}',
190
+ '["array", "of", "strings"]',
191
+ '{"nested": {"object": {"with": "values"}}}',
192
+ '{"mixed": ["array", 123, {"nested": true}]}'
193
+ ];
194
+
195
+ validResponses.forEach(response => {
196
+ const validation = validateJsonResponse(response);
197
+ expect(validation.isValid).toBe(true);
198
+ expect(validation.parsed).toBeDefined();
199
+ });
200
+ });
201
+ });
202
+
203
+ describe('Integration Simulation', () => {
204
+ test('should simulate the complete attempt_completion JSON correction flow', () => {
205
+ // Step 1: Simulate attempt_completion returning markdown
206
+ const attemptCompletionResult = 'Based on my analysis of the text "Hello world test", I can confirm there are 3 words total.';
207
+
208
+ // Step 2: Clean any potential markdown
209
+ const cleaned = cleanSchemaResponse(attemptCompletionResult);
210
+ expect(cleaned).toBe(attemptCompletionResult); // No markdown to clean
211
+
212
+ // Step 3: Validate as JSON
213
+ const validation = validateJsonResponse(cleaned);
214
+ expect(validation.isValid).toBe(false); // Plain text is not JSON
215
+
216
+ // Step 4: Create correction prompt
217
+ const schema = '{"type": "object", "properties": {"message": {"type": "string"}, "count": {"type": "number"}}}';
218
+ const correctionPrompt = createJsonCorrectionPrompt(
219
+ cleaned,
220
+ schema,
221
+ validation.error,
222
+ 0
223
+ );
224
+
225
+ expect(correctionPrompt).toContain('CRITICAL JSON ERROR:');
226
+ expect(correctionPrompt).toContain('You MUST fix this and return ONLY valid JSON');
227
+ expect(correctionPrompt).toContain(schema);
228
+ expect(correctionPrompt).toContain(attemptCompletionResult.substring(0, 100));
229
+
230
+ // Step 5: Simulate corrected response
231
+ const correctedResponse = '{"message": "There are 3 words in the text Hello world test", "count": 3}';
232
+ const finalValidation = validateJsonResponse(correctedResponse);
233
+ expect(finalValidation.isValid).toBe(true);
234
+ expect(finalValidation.parsed.message).toContain('3 words');
235
+ expect(finalValidation.parsed.count).toBe(3);
236
+ });
237
+ });
238
+ });
@@ -0,0 +1,128 @@
1
+ import { describe, test, expect } from '@jest/globals';
2
+ import { cleanSchemaResponse, isJsonSchemaDefinition } from '../../src/agent/schemaUtils.js';
3
+
4
+ describe('attempt_completion JSON parsing issue', () => {
5
+ test('should reproduce the issue where attempt_completion result with markdown causes JSON parsing errors', () => {
6
+ // This is the actual result format from the failure log
7
+ const attemptCompletionResult = `\`\`\`json
8
+ {
9
+ "$schema": "http://json-schema.org/draft-07/schema#",
10
+ "$id": "code-review",
11
+ "title": "Code Review",
12
+ "description": "Structured format for code review issues",
13
+ "type": "object",
14
+ "required": [
15
+ "issues"
16
+ ],
17
+ "properties": {
18
+ "issues": {
19
+ "type": "array",
20
+ "description": "List of issues found during code review",
21
+ "items": [
22
+ {
23
+ "file": "docs/failure-conditions-implementation.md",
24
+ "line": 1,
25
+ "ruleId": "documentation/inconsistency",
26
+ "message": "The documentation and examples consistently refer to JEXL as the expression language, but the implementation uses sandboxed JavaScript. This is highly misleading for users trying to write conditions.",
27
+ "severity": "error",
28
+ "category": "documentation",
29
+ "suggestion": "Update all documentation, including markdown files and YAML examples, to correctly refer to JavaScript expressions. Remove all mentions of JEXL to avoid confusion and ensure users are writing valid conditions based on the actual implementation."
30
+ }
31
+ ]
32
+ }
33
+ }
34
+ }
35
+ \`\`\``;
36
+
37
+ // Test that this fails when parsed directly as JSON
38
+ expect(() => JSON.parse(attemptCompletionResult)).toThrow();
39
+
40
+ // Test that cleanSchemaResponse would handle this correctly
41
+ const cleaned = cleanSchemaResponse(attemptCompletionResult);
42
+
43
+ // After cleaning, it should be valid JSON
44
+ expect(() => JSON.parse(cleaned)).not.toThrow();
45
+
46
+ const parsed = JSON.parse(cleaned);
47
+ expect(parsed).toHaveProperty('$schema');
48
+ expect(parsed).toHaveProperty('properties');
49
+ expect(parsed.properties).toHaveProperty('issues');
50
+
51
+ // NEW: Verify this is detected as a schema definition (the bug!)
52
+ expect(isJsonSchemaDefinition(cleaned)).toBe(true);
53
+ });
54
+
55
+ test('should detect when AI returns schema definition instead of data', () => {
56
+ // This is the problematic response - AI returned schema definition instead of data
57
+ const problemResponse = `\`\`\`json
58
+ {
59
+ "$schema": "http://json-schema.org/draft-07/schema#",
60
+ "$id": "code-review",
61
+ "title": "Code Review",
62
+ "description": "Structured format for code review issues",
63
+ "type": "object",
64
+ "required": ["issues"],
65
+ "properties": {
66
+ "issues": {
67
+ "type": "array",
68
+ "description": "List of issues found during code review",
69
+ "items": {
70
+ "type": "object",
71
+ "properties": {
72
+ "file": { "type": "string" },
73
+ "line": { "type": "number" },
74
+ "message": { "type": "string" },
75
+ "severity": { "type": "string" }
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ \`\`\``;
82
+
83
+ const cleaned = cleanSchemaResponse(problemResponse);
84
+ expect(isJsonSchemaDefinition(cleaned)).toBe(true);
85
+
86
+ // This is what should have been returned instead (actual data)
87
+ const correctResponse = JSON.stringify({
88
+ "issues": [
89
+ {
90
+ "file": "docs/failure-conditions-implementation.md",
91
+ "line": 1,
92
+ "message": "Documentation inconsistency found",
93
+ "severity": "error"
94
+ }
95
+ ]
96
+ });
97
+
98
+ expect(isJsonSchemaDefinition(correctResponse)).toBe(false);
99
+ });
100
+
101
+ test('should handle attempt_completion result that is plain text', () => {
102
+ const plainTextResult = "Hello! I've reviewed the pull request and focused on performance aspects as requested. The introduction of conditional execution is a powerful feature.";
103
+
104
+ const cleaned = cleanSchemaResponse(plainTextResult);
105
+
106
+ // Plain text should remain unchanged
107
+ expect(cleaned).toBe(plainTextResult);
108
+ });
109
+
110
+ test('should handle attempt_completion result with mixed content', () => {
111
+ const mixedResult = `Here is my analysis:
112
+
113
+ \`\`\`json
114
+ {
115
+ "summary": "The code looks good",
116
+ "issues": []
117
+ }
118
+ \`\`\`
119
+
120
+ Additional notes: The implementation is solid.`;
121
+
122
+ const cleaned = cleanSchemaResponse(mixedResult);
123
+
124
+ // Should extract just the JSON part
125
+ expect(cleaned.trim()).toBe('{\n "summary": "The code looks good",\n "issues": []\n}');
126
+ expect(() => JSON.parse(cleaned)).not.toThrow();
127
+ });
128
+ });
@@ -0,0 +1,35 @@
1
+ import { validateAndFixMermaidResponse } from '../../src/agent/schemaUtils.js';
2
+
3
+ describe('Mermaid Auto-Fix - Backticks', () => {
4
+ const mockOptions = {
5
+ debug: false,
6
+ path: '/test/path',
7
+ provider: 'anthropic',
8
+ model: 'claude-3-sonnet-20240229'
9
+ };
10
+
11
+ describe('Auto-fix backticks in node labels', () => {
12
+
13
+
14
+
15
+
16
+
17
+ test('should remove backticks from quoted labels', async () => {
18
+ const response = `\`\`\`mermaid
19
+ flowchart TD
20
+ A["Already quoted \`backticks\`"] --> B{"Also quoted \`here\`"}
21
+ \`\`\``;
22
+
23
+ const result = await validateAndFixMermaidResponse(response, mockOptions);
24
+
25
+ // @probelabs/maid v0.0.15+ treats backticks inside quoted labels as errors (FL-LABEL-BACKTICK)
26
+ // and removes them during auto-fix. This is the expected behavior.
27
+ expect(result.fixedResponse).toContain('A["Already quoted backticks"]');
28
+ expect(result.fixedResponse).toContain('B{"Also quoted here"}');
29
+ });
30
+
31
+ });
32
+
33
+ describe('Validation detects backticks correctly', () => {
34
+ });
35
+ });