@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,345 @@
1
+ import { jest, describe, test, expect, beforeEach, afterEach } from '@jest/globals';
2
+
3
+ // Mock all the heavy dependencies that ProbeAgent uses
4
+ jest.mock('@ai-sdk/anthropic', () => ({}));
5
+ jest.mock('@ai-sdk/openai', () => ({}));
6
+ jest.mock('@ai-sdk/google', () => ({}));
7
+ jest.mock('@ai-sdk/amazon-bedrock', () => ({}));
8
+ jest.mock('ai', () => ({
9
+ generateText: jest.fn(),
10
+ streamText: jest.fn(),
11
+ tool: jest.fn((config) => ({
12
+ name: config.name,
13
+ description: config.description,
14
+ inputSchema: config.inputSchema,
15
+ execute: config.execute
16
+ }))
17
+ }));
18
+
19
+ import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
20
+ import { writeFileSync, unlinkSync, existsSync, mkdirSync, rmSync } from 'fs';
21
+ import { join } from 'path';
22
+
23
+ describe('Image Path Resolution', () => {
24
+ let testDir;
25
+ let agent;
26
+ let testImages;
27
+
28
+ beforeEach(() => {
29
+ // Create a test directory structure
30
+ testDir = join(process.cwd(), 'test-images-temp');
31
+ if (!existsSync(testDir)) {
32
+ mkdirSync(testDir, { recursive: true });
33
+ }
34
+
35
+ // Create test image files
36
+ const simplePng = Buffer.from([
37
+ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A,
38
+ 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
39
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
40
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4,
41
+ 0x89, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x44, 0x41,
42
+ 0x54, 0x78, 0x9C, 0x62, 0x00, 0x02, 0x00, 0x00,
43
+ 0x05, 0x00, 0x01, 0x0D, 0x0A, 0x2D, 0xB4, 0x00,
44
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE,
45
+ 0x42, 0x60, 0x82
46
+ ]);
47
+
48
+ testImages = [
49
+ 'policy-1.png',
50
+ 'policy-2.png',
51
+ 'client.png'
52
+ ];
53
+
54
+ testImages.forEach(filename => {
55
+ writeFileSync(join(testDir, filename), simplePng);
56
+ });
57
+
58
+ // Initialize agent with the test directory
59
+ agent = new ProbeAgent({
60
+ debug: false,
61
+ path: testDir
62
+ });
63
+ });
64
+
65
+ afterEach(() => {
66
+ // Cleanup
67
+ if (existsSync(testDir)) {
68
+ rmSync(testDir, { recursive: true, force: true });
69
+ }
70
+ });
71
+
72
+ describe('extractListFilesDirectories', () => {
73
+ test('should extract directory from extract tool File: header', () => {
74
+ const content = `File: ${testDir}/ticket.md
75
+ Lines: 41-48
76
+ \`\`\`markdown
77
+ <attachments>
78
+ <attachment filename="policy-1.png" />
79
+ </attachments>
80
+ \`\`\``;
81
+
82
+ const directories = agent.extractListFilesDirectories(content);
83
+ expect(directories).toEqual([testDir]);
84
+ });
85
+
86
+ test('should extract directory paths from listFiles output', () => {
87
+ const content = `${testDir}:
88
+ file 1.2K policy-1.png
89
+ file 1.1K policy-2.png
90
+ file 1.3K client.png`;
91
+
92
+ const directories = agent.extractListFilesDirectories(content);
93
+ expect(directories).toEqual([testDir]);
94
+ });
95
+
96
+ test('should not extract non-directory lines ending with colon', () => {
97
+ const content = `Token Usage:
98
+ Some random text
99
+
100
+ ${testDir}:
101
+ file 1.2K policy-1.png`;
102
+
103
+ const directories = agent.extractListFilesDirectories(content);
104
+ expect(directories).toEqual([testDir]);
105
+ expect(directories).not.toContain('Token Usage');
106
+ });
107
+
108
+ test('should handle relative paths', () => {
109
+ const content = `./attachments:
110
+ file 1.2K policy-1.png`;
111
+
112
+ const directories = agent.extractListFilesDirectories(content);
113
+ expect(directories).toEqual(['./attachments']);
114
+ });
115
+
116
+ test('should handle multiple directory sections', () => {
117
+ const content = `${testDir}:
118
+ file 1.2K policy-1.png
119
+
120
+ ${testDir}/subdirectory:
121
+ file 1.1K policy-2.png`;
122
+
123
+ const directories = agent.extractListFilesDirectories(content);
124
+ expect(directories).toHaveLength(2);
125
+ expect(directories).toContain(testDir);
126
+ expect(directories).toContain(`${testDir}/subdirectory`);
127
+ });
128
+
129
+ test('should not match headings or other text with colons', () => {
130
+ const content = `My Dashboard has this log:
131
+ My Gateway has this log:
132
+ Files to extract:
133
+
134
+ ${testDir}:
135
+ file 1.2K policy-1.png`;
136
+
137
+ const directories = agent.extractListFilesDirectories(content);
138
+ expect(directories).toEqual([testDir]);
139
+ });
140
+
141
+ test('should reject paths with spaces (like "./Token Usage:")', () => {
142
+ const content = `./Token Usage:
143
+ ./Some Text Here:
144
+ This behavior is due to a known bug (TT-8839):
145
+
146
+ ${testDir}:
147
+ file 1.2K policy-1.png`;
148
+
149
+ const directories = agent.extractListFilesDirectories(content);
150
+ expect(directories).toEqual([testDir]);
151
+ expect(directories).not.toContain('./Token Usage');
152
+ expect(directories).not.toContain('./Some Text Here');
153
+ });
154
+
155
+ test('should extract from both File: header and listFiles output without duplicates', () => {
156
+ const content = `File: ${testDir}/ticket.md
157
+ Lines: 1-10
158
+ Some content
159
+
160
+ ${testDir}:
161
+ file 1.2K policy-1.png`;
162
+
163
+ const directories = agent.extractListFilesDirectories(content);
164
+ expect(directories).toEqual([testDir]); // Should only have one entry, no duplicates
165
+ });
166
+
167
+ test('should handle extract tool output with relative paths', () => {
168
+ const content = `File: ./docs/ticket.md
169
+ Lines: 1-10
170
+ Some content`;
171
+
172
+ const directories = agent.extractListFilesDirectories(content);
173
+ expect(directories).toEqual(['./docs']);
174
+ });
175
+ });
176
+
177
+ describe('processImageReferences with XML attachments', () => {
178
+ test('should resolve relative image paths from XML attachments using directory context', async () => {
179
+ // Simulate content with XML attachments and listFiles output
180
+ const content = `${testDir}:
181
+ file 458K attachment_2_policy-1.png
182
+ file 436K attachment_3_policy-2.png
183
+ file 447K attachment_4_client.png
184
+
185
+ <attachments>
186
+ <attachment filename="policy-1.png" size="458477" content_type="image/png" />
187
+ <attachment filename="policy-2.png" size="436301" content_type="image/png" />
188
+ <attachment filename="client.png" size="447699" content_type="image/png" />
189
+ </attachments>`;
190
+
191
+ await agent.processImageReferences(content);
192
+
193
+ // Check that images were loaded
194
+ const loadedImages = agent.getCurrentImages();
195
+ expect(loadedImages.length).toBeGreaterThan(0);
196
+
197
+ // Verify at least one image was successfully resolved
198
+ expect(loadedImages.some(img => img.startsWith('data:image/png;base64,'))).toBe(true);
199
+ });
200
+
201
+ test('should handle images when directory context is available from listFiles', async () => {
202
+ // First, process content with directory context
203
+ const contentWithDirectory = `${testDir}:
204
+ file 1.2K policy-1.png
205
+ file 1.1K policy-2.png`;
206
+
207
+ // Then process content with just filename mentions
208
+ await agent.processImageReferences(contentWithDirectory);
209
+
210
+ const contentWithFilenames = 'Look at policy-1.png and policy-2.png for details.';
211
+ await agent.processImageReferences(contentWithFilenames);
212
+
213
+ const loadedImages = agent.getCurrentImages();
214
+ expect(loadedImages.length).toBeGreaterThan(0);
215
+ });
216
+
217
+ test('should not load images when only non-directory headings are present', async () => {
218
+ agent.clearLoadedImages();
219
+
220
+ const content = `Token Usage:
221
+ Some metrics here
222
+
223
+ Files to extract:
224
+ - policy-1.png
225
+ - policy-2.png`;
226
+
227
+ await agent.processImageReferences(content);
228
+
229
+ // Images should not be loaded because no actual directory path was extracted
230
+ const loadedImages = agent.getCurrentImages();
231
+ // Images may or may not be loaded depending on if they exist in allowed folders
232
+ // The key is that "Token Usage" should not be used as a directory
233
+ expect(agent.extractListFilesDirectories(content)).not.toContain('Token Usage');
234
+ expect(agent.extractListFilesDirectories(content)).not.toContain('Files to extract');
235
+ });
236
+ });
237
+
238
+ describe('loadImageIfValid', () => {
239
+ test('should load image from full path', async () => {
240
+ const imagePath = join(testDir, 'policy-1.png');
241
+ const result = await agent.loadImageIfValid(imagePath);
242
+
243
+ expect(result).toBe(true);
244
+ expect(agent.pendingImages.has(imagePath)).toBe(true);
245
+ });
246
+
247
+ test('should load image from relative path when context is available', async () => {
248
+ // First extract directory context
249
+ const listFilesOutput = `${testDir}:
250
+ file 1.2K policy-1.png`;
251
+
252
+ await agent.processImageReferences(listFilesOutput);
253
+
254
+ // Now try to load with just filename
255
+ const result = await agent.loadImageIfValid(join(testDir, 'policy-1.png'));
256
+
257
+ expect(result).toBe(true);
258
+ });
259
+
260
+ test('should not load non-existent images', async () => {
261
+ const imagePath = join(testDir, 'nonexistent.png');
262
+ const result = await agent.loadImageIfValid(imagePath);
263
+
264
+ expect(result).toBe(false);
265
+ expect(agent.pendingImages.has(imagePath)).toBe(false);
266
+ });
267
+
268
+ test('should prevent loading images outside allowed directories', async () => {
269
+ const outsidePath = '/tmp/outside.png';
270
+ const result = await agent.loadImageIfValid(outsidePath);
271
+
272
+ expect(result).toBe(false);
273
+ });
274
+ });
275
+
276
+ describe('Real-world XML attachment scenario', () => {
277
+ test('should load images from extract tool File: header without needing listFiles', async () => {
278
+ // This is the CORRECT way - extract tool provides the file path directly
279
+ const extractToolOutput = `File: ${testDir}/ticket.md
280
+ Lines: 41-48
281
+ \`\`\`markdown
282
+ <attachments>
283
+ <attachment filename="policy-1.png" size="458477" content_type="image/png" />
284
+ <attachment filename="policy-2.png" size="436301" content_type="image/png" />
285
+ <attachment filename="client.png" size="447699" content_type="image/png" />
286
+ </attachments>
287
+ \`\`\``;
288
+
289
+ // Process the extract tool output
290
+ await agent.processImageReferences(extractToolOutput);
291
+
292
+ // Verify images were loaded
293
+ const loadedImages = agent.getCurrentImages();
294
+ expect(loadedImages.length).toBeGreaterThan(0);
295
+
296
+ // Verify the images are valid base64 data URLs
297
+ loadedImages.forEach(img => {
298
+ expect(img).toMatch(/^data:image\/(png|jpeg|jpg);base64,/);
299
+ });
300
+ });
301
+
302
+ test('should handle the Zendesk ticket attachment format', async () => {
303
+ // Simulate the actual scenario from the bug report
304
+ const ticketContent = `<message id="11842728115356" author="User 8718562264860" created="2023-12-20T03:24:29Z" public="true">
305
+ Hi team,
306
+
307
+ When we perform the step 'Request an authorization code' of 'Authorization Code Grant Type', if our listen path is /oauth2_code_test, there is no problem, but if the listen path is /oauth2_code_test/a, it will return a 404 error.
308
+
309
+ Attached is our api json, client and policy configurations and dashboard logs.
310
+
311
+ Regards,
312
+
313
+ Salman
314
+
315
+ <attachments>
316
+ <attachment filename="oauth2_code_test.json" size="13243" content_type="application/json" />
317
+ <attachment filename="policy-1.png" size="458477" content_type="image/png" />
318
+ <attachment filename="policy-2.png" size="436301" content_type="image/png" />
319
+ <attachment filename="client.png" size="447699" content_type="image/png" />
320
+ <attachment filename="dashboard-log.csv.gz" size="6796" content_type="application/x-gzip" />
321
+ </attachments>
322
+ </message>`;
323
+
324
+ // Simulate listFiles being called on the directory
325
+ // In this test, files are named exactly as in the XML (no prefix)
326
+ const listFilesOutput = `${testDir}:
327
+ file 1.2K policy-1.png
328
+ file 1.1K policy-2.png
329
+ file 1.3K client.png`;
330
+
331
+ // Process both outputs
332
+ await agent.processImageReferences(listFilesOutput);
333
+ await agent.processImageReferences(ticketContent);
334
+
335
+ // Verify images were loaded
336
+ const loadedImages = agent.getCurrentImages();
337
+ expect(loadedImages.length).toBeGreaterThan(0);
338
+
339
+ // Verify the images are valid base64 data URLs
340
+ loadedImages.forEach(img => {
341
+ expect(img).toMatch(/^data:image\/(png|jpeg|jpg);base64,/);
342
+ });
343
+ });
344
+ });
345
+ });
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Test JsonFixingAgent with separate session isolation
3
+ */
4
+
5
+ import { describe, test, expect } from '@jest/globals';
6
+ import { JsonFixingAgent, validateJsonResponse, cleanSchemaResponse } from '../../src/agent/schemaUtils.js';
7
+
8
+ describe('JsonFixingAgent', () => {
9
+ describe('constructor', () => {
10
+ test('should create JsonFixingAgent with default options', () => {
11
+ const agent = new JsonFixingAgent();
12
+
13
+ expect(agent.options.sessionId).toMatch(/^json-fixer-\d+-\d+$/);
14
+ expect(agent.options.allowEdit).toBe(false);
15
+ expect(agent.ProbeAgent).toBeNull();
16
+ expect(agent.agent).toBeUndefined();
17
+ });
18
+
19
+ test('should create JsonFixingAgent with custom options', () => {
20
+ const options = {
21
+ sessionId: 'custom-session-123',
22
+ path: '/custom/path',
23
+ provider: 'anthropic',
24
+ model: 'claude-3-5-sonnet-20241022',
25
+ debug: true
26
+ };
27
+
28
+ const agent = new JsonFixingAgent(options);
29
+
30
+ expect(agent.options.sessionId).toBe('custom-session-123');
31
+ expect(agent.options.path).toBe('/custom/path');
32
+ expect(agent.options.provider).toBe('anthropic');
33
+ expect(agent.options.model).toBe('claude-3-5-sonnet-20241022');
34
+ expect(agent.options.debug).toBe(true);
35
+ expect(agent.options.allowEdit).toBe(false); // Always false for safety
36
+ });
37
+ });
38
+
39
+ describe('getJsonFixingPrompt', () => {
40
+ test('should return specialized JSON fixing prompt', () => {
41
+ const agent = new JsonFixingAgent();
42
+ const prompt = agent.getJsonFixingPrompt();
43
+
44
+ // Check for key elements of the prompt
45
+ expect(prompt).toContain('JSON syntax correction specialist');
46
+ expect(prompt).toContain('CORE RESPONSIBILITIES');
47
+ expect(prompt).toContain('JSON SYNTAX RULES');
48
+ expect(prompt).toContain('COMMON ERRORS TO FIX');
49
+ expect(prompt).toContain('FIXING METHODOLOGY');
50
+ expect(prompt).toContain('CRITICAL RULES');
51
+
52
+ // Check for specific syntax rules
53
+ expect(prompt).toContain('Property names');
54
+ expect(prompt).toContain('double quotes');
55
+ expect(prompt).toContain('No trailing commas');
56
+
57
+ // Check for common errors
58
+ expect(prompt).toContain('Unquoted property names');
59
+ expect(prompt).toContain('Single quotes');
60
+ expect(prompt).toContain('Trailing commas');
61
+
62
+ // Check for critical rules
63
+ expect(prompt).toContain('NEVER add explanations');
64
+ expect(prompt).toContain('NEVER wrap in markdown');
65
+ expect(prompt).toContain('PRESERVE the original data structure');
66
+ });
67
+ });
68
+
69
+ describe('initializeAgent', () => {
70
+ test('should initialize ProbeAgent lazily', async () => {
71
+ const agent = new JsonFixingAgent({
72
+ sessionId: 'test-session',
73
+ debug: false
74
+ });
75
+
76
+ expect(agent.ProbeAgent).toBeNull();
77
+ expect(agent.agent).toBeUndefined();
78
+
79
+ // Initialize the agent
80
+ await agent.initializeAgent();
81
+
82
+ // Check that ProbeAgent was imported and agent was created
83
+ expect(agent.ProbeAgent).not.toBeNull();
84
+ expect(agent.agent).toBeDefined();
85
+ expect(agent.agent.sessionId).toBe('test-session');
86
+ expect(agent.agent.disableJsonValidation).toBe(true); // CRITICAL for preventing recursion
87
+ });
88
+
89
+ test('should not reinitialize agent if already initialized', async () => {
90
+ const agent = new JsonFixingAgent();
91
+
92
+ await agent.initializeAgent();
93
+ const firstAgent = agent.agent;
94
+
95
+ await agent.initializeAgent();
96
+ const secondAgent = agent.agent;
97
+
98
+ // Should be the same instance
99
+ expect(secondAgent).toBe(firstAgent);
100
+ });
101
+
102
+ test('should create agent with disableJsonValidation=true', async () => {
103
+ const agent = new JsonFixingAgent({
104
+ debug: false
105
+ });
106
+
107
+ await agent.initializeAgent();
108
+
109
+ // This is CRITICAL to prevent infinite recursion
110
+ expect(agent.agent.disableJsonValidation).toBe(true);
111
+ });
112
+
113
+ test('should create agent with allowEdit=false', async () => {
114
+ const agent = new JsonFixingAgent();
115
+
116
+ await agent.initializeAgent();
117
+
118
+ // Agent should not be able to edit files (only fix JSON syntax)
119
+ expect(agent.agent.allowEdit).toBe(false);
120
+ });
121
+
122
+ test('should create agent with maxIterations=5', async () => {
123
+ const agent = new JsonFixingAgent();
124
+
125
+ await agent.initializeAgent();
126
+
127
+ expect(agent.agent.maxIterations).toBe(5);
128
+ });
129
+ });
130
+
131
+ describe('session isolation', () => {
132
+ test('should use unique session ID per instance', async () => {
133
+ const agent1 = new JsonFixingAgent();
134
+ // Small delay to ensure different timestamp
135
+ await new Promise(resolve => setTimeout(resolve, 1));
136
+ const agent2 = new JsonFixingAgent();
137
+
138
+ expect(agent1.options.sessionId).not.toBe(agent2.options.sessionId);
139
+ });
140
+
141
+ test('should create separate session from parent agent', async () => {
142
+ const agent = new JsonFixingAgent({
143
+ sessionId: 'json-fixer-test-123'
144
+ });
145
+
146
+ await agent.initializeAgent();
147
+
148
+ // Session ID should be the custom one
149
+ expect(agent.agent.sessionId).toBe('json-fixer-test-123');
150
+
151
+ // Agent should be completely isolated (no shared history with parent)
152
+ expect(agent.agent.history).toEqual([]);
153
+ });
154
+ });
155
+
156
+ describe('cancel and cleanup', () => {
157
+ test('should have cancel method', () => {
158
+ const agent = new JsonFixingAgent();
159
+
160
+ expect(typeof agent.cancel).toBe('function');
161
+
162
+ // Should not throw when agent not initialized
163
+ expect(() => agent.cancel()).not.toThrow();
164
+ });
165
+
166
+ test('should cancel initialized agent', async () => {
167
+ const agent = new JsonFixingAgent();
168
+ await agent.initializeAgent();
169
+
170
+ expect(() => agent.cancel()).not.toThrow();
171
+ });
172
+
173
+ test('should have getTokenUsage method', () => {
174
+ const agent = new JsonFixingAgent();
175
+
176
+ expect(typeof agent.getTokenUsage).toBe('function');
177
+ expect(agent.getTokenUsage()).toBeNull(); // No agent initialized
178
+ });
179
+ });
180
+
181
+ describe('integration with validation flow', () => {
182
+ test('should follow clean-then-validate workflow', () => {
183
+ // Step 1: AI returns JSON with markdown
184
+ const aiResponse = '```json\n{"name": "test", "id": 42}\n```';
185
+
186
+ // Step 2: Clean the response
187
+ const cleaned = cleanSchemaResponse(aiResponse);
188
+ expect(cleaned).toBe('{"name": "test", "id": 42}');
189
+
190
+ // Step 3: Validate
191
+ const validation = validateJsonResponse(cleaned);
192
+ expect(validation.isValid).toBe(true);
193
+
194
+ // If invalid, JsonFixingAgent would be used (tested separately with mocks)
195
+ });
196
+
197
+ test('should provide enhanced error for fixing', () => {
198
+ const invalidJson = '{"name": "test", "value": invalid}';
199
+
200
+ const validation = validateJsonResponse(invalidJson);
201
+
202
+ expect(validation.isValid).toBe(false);
203
+ expect(validation.enhancedError).toBeDefined();
204
+ expect(validation.errorContext).toBeDefined();
205
+
206
+ // JsonFixingAgent.fixJson() would receive this enhanced error
207
+ expect(validation.enhancedError).toContain('Error location');
208
+ expect(validation.enhancedError).toContain('^ here');
209
+ });
210
+ });
211
+
212
+ describe('architectural consistency with MermaidFixingAgent', () => {
213
+ test('should follow same pattern as MermaidFixingAgent', async () => {
214
+ const jsonAgent = new JsonFixingAgent({ sessionId: 'json-test' });
215
+ await jsonAgent.initializeAgent();
216
+
217
+ // Both should have:
218
+ // 1. Separate session
219
+ expect(jsonAgent.agent.sessionId).toBe('json-test');
220
+
221
+ // 2. allowEdit=false
222
+ expect(jsonAgent.agent.allowEdit).toBe(false);
223
+
224
+ // 3. Specialized prompt
225
+ expect(jsonAgent.agent.customPrompt).toBeDefined();
226
+ expect(jsonAgent.agent.customPrompt).toContain('specialist');
227
+
228
+ // 4. Recursion prevention flag
229
+ expect(jsonAgent.agent.disableJsonValidation).toBe(true); // JSON equivalent of disableMermaidValidation
230
+
231
+ // 5. Cancel method
232
+ expect(typeof jsonAgent.cancel).toBe('function');
233
+
234
+ // 6. Token usage method
235
+ expect(typeof jsonAgent.getTokenUsage).toBe('function');
236
+ });
237
+ });
238
+ });