@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,317 @@
1
+ /**
2
+ * Tests for RetryManager
3
+ */
4
+
5
+ import { describe, test, expect, jest, beforeEach } from '@jest/globals';
6
+ import { RetryManager, isRetryableError, DEFAULT_RETRYABLE_ERRORS } from '../../src/agent/RetryManager.js';
7
+
8
+ describe('RetryManager', () => {
9
+ beforeEach(() => {
10
+ jest.clearAllMocks();
11
+ });
12
+
13
+ describe('constructor', () => {
14
+ test('should initialize with default values', () => {
15
+ const retry = new RetryManager();
16
+ expect(retry.maxRetries).toBe(3);
17
+ expect(retry.initialDelay).toBe(1000);
18
+ expect(retry.maxDelay).toBe(30000);
19
+ expect(retry.backoffFactor).toBe(2);
20
+ expect(retry.debug).toBe(false);
21
+ });
22
+
23
+ test('should accept custom configuration', () => {
24
+ const retry = new RetryManager({
25
+ maxRetries: 5,
26
+ initialDelay: 500,
27
+ maxDelay: 10000,
28
+ backoffFactor: 3,
29
+ debug: true
30
+ });
31
+
32
+ expect(retry.maxRetries).toBe(5);
33
+ expect(retry.initialDelay).toBe(500);
34
+ expect(retry.maxDelay).toBe(10000);
35
+ expect(retry.backoffFactor).toBe(3);
36
+ expect(retry.debug).toBe(true);
37
+ });
38
+ });
39
+
40
+ describe('isRetryableError', () => {
41
+ test('should identify overloaded errors', () => {
42
+ const error = new Error('Overloaded');
43
+ expect(isRetryableError(error)).toBe(true);
44
+ });
45
+
46
+ test('should identify rate limit errors', () => {
47
+ const error = new Error('rate_limit exceeded');
48
+ expect(isRetryableError(error)).toBe(true);
49
+ });
50
+
51
+ test('should identify 429 status code', () => {
52
+ const error = new Error('Request failed');
53
+ error.statusCode = 429;
54
+ expect(isRetryableError(error)).toBe(true);
55
+ });
56
+
57
+ test('should identify 503 status code', () => {
58
+ const error = new Error('Service unavailable');
59
+ error.status = 503;
60
+ expect(isRetryableError(error)).toBe(true);
61
+ });
62
+
63
+ test('should identify timeout errors', () => {
64
+ const error = new Error('Request timeout');
65
+ expect(isRetryableError(error)).toBe(true);
66
+ });
67
+
68
+ test('should identify network errors', () => {
69
+ const error = new Error('Network failure');
70
+ error.code = 'ECONNRESET';
71
+ expect(isRetryableError(error)).toBe(true);
72
+ });
73
+
74
+ test('should not identify non-retryable errors', () => {
75
+ const error = new Error('Invalid API key');
76
+ expect(isRetryableError(error)).toBe(false);
77
+ });
78
+
79
+ test('should handle api_error type', () => {
80
+ const error = new Error('API Error');
81
+ error.type = 'api_error';
82
+ expect(isRetryableError(error)).toBe(true);
83
+ });
84
+ });
85
+
86
+ describe('executeWithRetry', () => {
87
+ test('should succeed on first attempt', async () => {
88
+ const retry = new RetryManager({ debug: false });
89
+ const mockFn = jest.fn().mockResolvedValue('success');
90
+
91
+ const result = await retry.executeWithRetry(mockFn);
92
+
93
+ expect(result).toBe('success');
94
+ expect(mockFn).toHaveBeenCalledTimes(1);
95
+ expect(retry.stats.totalAttempts).toBe(1);
96
+ expect(retry.stats.totalRetries).toBe(0);
97
+ });
98
+
99
+ test('should retry on retryable error and succeed', async () => {
100
+ const retry = new RetryManager({
101
+ maxRetries: 3,
102
+ initialDelay: 10,
103
+ debug: false
104
+ });
105
+
106
+ let attemptCount = 0;
107
+ const mockFn = jest.fn().mockImplementation(() => {
108
+ attemptCount++;
109
+ if (attemptCount < 3) {
110
+ const error = new Error('Overloaded');
111
+ throw error;
112
+ }
113
+ return Promise.resolve('success');
114
+ });
115
+
116
+ const result = await retry.executeWithRetry(mockFn, { provider: 'test' });
117
+
118
+ expect(result).toBe('success');
119
+ expect(mockFn).toHaveBeenCalledTimes(3);
120
+ expect(retry.stats.totalAttempts).toBe(3);
121
+ expect(retry.stats.totalRetries).toBe(2);
122
+ expect(retry.stats.successfulRetries).toBe(1);
123
+ });
124
+
125
+ test('should fail immediately on non-retryable error', async () => {
126
+ const retry = new RetryManager({ debug: false });
127
+ const mockFn = jest.fn().mockRejectedValue(new Error('Invalid API key'));
128
+
129
+ await expect(retry.executeWithRetry(mockFn)).rejects.toThrow('Invalid API key');
130
+ expect(mockFn).toHaveBeenCalledTimes(1);
131
+ expect(retry.stats.totalAttempts).toBe(1);
132
+ expect(retry.stats.totalRetries).toBe(0);
133
+ });
134
+
135
+ test('should exhaust retries and fail', async () => {
136
+ const retry = new RetryManager({
137
+ maxRetries: 2,
138
+ initialDelay: 10,
139
+ debug: false
140
+ });
141
+ const mockFn = jest.fn().mockRejectedValue(new Error('Overloaded'));
142
+
143
+ await expect(retry.executeWithRetry(mockFn)).rejects.toThrow('Overloaded');
144
+ expect(mockFn).toHaveBeenCalledTimes(3); // 1 initial + 2 retries
145
+ expect(retry.stats.totalAttempts).toBe(3);
146
+ expect(retry.stats.failedRetries).toBe(1);
147
+ });
148
+
149
+ test('should apply exponential backoff', async () => {
150
+ const retry = new RetryManager({
151
+ maxRetries: 3,
152
+ initialDelay: 100,
153
+ backoffFactor: 2,
154
+ jitter: false, // Disable jitter for predictable timing
155
+ debug: false
156
+ });
157
+
158
+ const timestamps = [];
159
+ const mockFn = jest.fn().mockImplementation(() => {
160
+ timestamps.push(Date.now());
161
+ if (timestamps.length < 3) {
162
+ throw new Error('Overloaded');
163
+ }
164
+ return Promise.resolve('success');
165
+ });
166
+
167
+ await retry.executeWithRetry(mockFn);
168
+
169
+ // Verify delays are increasing (with some tolerance for timing and test execution)
170
+ const delay1 = timestamps[1] - timestamps[0];
171
+ const delay2 = timestamps[2] - timestamps[1];
172
+
173
+ // With jitter disabled: delay1 should be ~100ms, delay2 should be ~200ms
174
+ // Allow more tolerance for CI/test timing variance
175
+ expect(delay1).toBeGreaterThanOrEqual(75); // Allow more tolerance
176
+ expect(delay2).toBeGreaterThanOrEqual(150); // Allow more tolerance
177
+ expect(delay2).toBeGreaterThan(delay1); // Exponential increase
178
+ });
179
+
180
+ test('should respect maxDelay cap', async () => {
181
+ const retry = new RetryManager({
182
+ maxRetries: 5,
183
+ initialDelay: 1000,
184
+ maxDelay: 2000,
185
+ backoffFactor: 10,
186
+ jitter: false, // Disable jitter for predictable timing
187
+ debug: false
188
+ });
189
+
190
+ let attemptCount = 0;
191
+ const timestamps = [];
192
+ const mockFn = jest.fn().mockImplementation(() => {
193
+ timestamps.push(Date.now());
194
+ attemptCount++;
195
+ if (attemptCount < 3) {
196
+ throw new Error('Overloaded');
197
+ }
198
+ return Promise.resolve('success');
199
+ });
200
+
201
+ await retry.executeWithRetry(mockFn);
202
+
203
+ // With backoffFactor of 10, delay should be capped at maxDelay (2000ms)
204
+ const delay2 = timestamps[2] - timestamps[1];
205
+ expect(delay2).toBeGreaterThanOrEqual(2000); // Should be at least maxDelay
206
+ expect(delay2).toBeLessThan(2100); // Should not exceed maxDelay significantly
207
+ });
208
+
209
+ test('should track statistics correctly', async () => {
210
+ const retry = new RetryManager({ maxRetries: 3, initialDelay: 10, debug: false });
211
+
212
+ // Successful on first attempt
213
+ await retry.executeWithRetry(jest.fn().mockResolvedValue('ok'));
214
+
215
+ // Successful after 2 retries
216
+ let count1 = 0;
217
+ await retry.executeWithRetry(jest.fn().mockImplementation(() => {
218
+ count1++;
219
+ if (count1 < 3) throw new Error('Overloaded');
220
+ return 'ok';
221
+ }));
222
+
223
+ // Failed after exhausting retries
224
+ try {
225
+ await retry.executeWithRetry(jest.fn().mockRejectedValue(new Error('Overloaded')));
226
+ } catch (e) {
227
+ // Expected to fail
228
+ }
229
+
230
+ const stats = retry.getStats();
231
+ expect(stats.totalAttempts).toBe(8); // 1 + 3 + 4 (last one tries 1+maxRetries=4)
232
+ expect(stats.totalRetries).toBe(5); // 0 + 2 + 3
233
+ expect(stats.successfulRetries).toBe(1);
234
+ expect(stats.failedRetries).toBe(1);
235
+ });
236
+
237
+ test('should reset statistics', () => {
238
+ const retry = new RetryManager();
239
+ retry.stats.totalAttempts = 10;
240
+ retry.stats.totalRetries = 5;
241
+
242
+ retry.resetStats();
243
+
244
+ expect(retry.stats.totalAttempts).toBe(0);
245
+ expect(retry.stats.totalRetries).toBe(0);
246
+ });
247
+ });
248
+
249
+ describe('custom retryable errors', () => {
250
+ test('should use custom retryable error patterns', async () => {
251
+ const retry = new RetryManager({
252
+ maxRetries: 2,
253
+ initialDelay: 10,
254
+ retryableErrors: ['CustomError', 'SpecialFailure'],
255
+ debug: false
256
+ });
257
+
258
+ let attemptCount = 0;
259
+ const mockFn = jest.fn().mockImplementation(() => {
260
+ attemptCount++;
261
+ if (attemptCount < 2) {
262
+ throw new Error('CustomError occurred');
263
+ }
264
+ return Promise.resolve('success');
265
+ });
266
+
267
+ const result = await retry.executeWithRetry(mockFn);
268
+ expect(result).toBe('success');
269
+ expect(mockFn).toHaveBeenCalledTimes(2);
270
+ });
271
+
272
+ test('should not retry on default errors with custom list', async () => {
273
+ const retry = new RetryManager({
274
+ maxRetries: 2,
275
+ initialDelay: 10,
276
+ retryableErrors: ['CustomError'],
277
+ debug: false
278
+ });
279
+
280
+ const mockFn = jest.fn().mockRejectedValue(new Error('Overloaded'));
281
+
282
+ await expect(retry.executeWithRetry(mockFn)).rejects.toThrow('Overloaded');
283
+ expect(mockFn).toHaveBeenCalledTimes(1); // Should fail immediately
284
+ });
285
+ });
286
+
287
+ describe('edge cases', () => {
288
+ test('should handle maxRetries = 0', async () => {
289
+ const retry = new RetryManager({ maxRetries: 0, debug: false });
290
+ const mockFn = jest.fn().mockRejectedValue(new Error('Overloaded'));
291
+
292
+ await expect(retry.executeWithRetry(mockFn)).rejects.toThrow('Overloaded');
293
+ expect(mockFn).toHaveBeenCalledTimes(1);
294
+ });
295
+
296
+ test('should handle errors without message', async () => {
297
+ const retry = new RetryManager({
298
+ maxRetries: 3,
299
+ initialDelay: 5,
300
+ debug: false
301
+ });
302
+ const error = new Error();
303
+ error.type = 'api_error'; // This is retryable
304
+
305
+ const mockFn = jest.fn().mockRejectedValue(error);
306
+
307
+ await expect(retry.executeWithRetry(mockFn)).rejects.toThrow();
308
+ // Error is retryable (api_error), so should retry maxRetries times: 1 initial + 3 retries = 4
309
+ expect(mockFn).toHaveBeenCalledTimes(4);
310
+ });
311
+
312
+ test('should handle null/undefined errors', () => {
313
+ expect(isRetryableError(null)).toBe(false);
314
+ expect(isRetryableError(undefined)).toBe(false);
315
+ });
316
+ });
317
+ });
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Tests for schema-aware reminder messages in ProbeAgent
3
+ * Tests the new functionality that provides different reminder messages based on schema presence
4
+ */
5
+ import { jest, describe, test, expect, beforeEach, afterEach } from '@jest/globals';
6
+
7
+ describe('Schema-Aware Reminder Messages', () => {
8
+ let mockAgent;
9
+
10
+ beforeEach(() => {
11
+ // Mock a minimal ProbeAgent-like object to test reminder logic
12
+ mockAgent = {
13
+ debug: false,
14
+ options: {},
15
+ currentMessages: [],
16
+
17
+ // Mock the reminder message generation logic
18
+ buildReminderMessage(options) {
19
+ let reminderContent;
20
+ if (options.schema) {
21
+ // Schema-aware reminder
22
+ reminderContent = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
23
+
24
+ Remember: Use proper XML format with BOTH opening and closing tags:
25
+
26
+ <tool_name>
27
+ <parameter>value</parameter>
28
+ </tool_name>
29
+
30
+ IMPORTANT: A schema was provided for the final output format.
31
+
32
+ You MUST use attempt_completion to provide your answer:
33
+ <attempt_completion>
34
+ [Your complete answer here - provide in natural language, it will be automatically formatted to match the schema]
35
+ </attempt_completion>
36
+
37
+ Your response will be automatically formatted to JSON. You can provide your answer in natural language or as JSON - either will work.`;
38
+ } else {
39
+ // Standard reminder without schema
40
+ reminderContent = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
41
+
42
+ Remember: Use proper XML format with BOTH opening and closing tags:
43
+
44
+ <tool_name>
45
+ <parameter>value</parameter>
46
+ </tool_name>
47
+
48
+ Or for quick completion if your previous response was already correct:
49
+ <attempt_complete>`;
50
+ }
51
+ return reminderContent;
52
+ }
53
+ };
54
+ });
55
+
56
+ describe('With Schema Provided', () => {
57
+ test('should include schema-specific instructions when JSON schema is provided', () => {
58
+ const options = {
59
+ schema: '{"result": "string", "confidence": "number"}'
60
+ };
61
+
62
+ const reminder = mockAgent.buildReminderMessage(options);
63
+
64
+ expect(reminder).toContain('A schema was provided');
65
+ expect(reminder).toContain('You MUST use attempt_completion');
66
+ expect(reminder).toContain('attempt_completion');
67
+ expect(reminder).toContain('provide in natural language');
68
+ expect(reminder).toContain('automatically formatted to JSON');
69
+
70
+ // Should NOT contain the shorthand attempt_complete
71
+ expect(reminder).not.toContain('<attempt_complete>');
72
+ });
73
+
74
+ test('should include schema instructions in reminder', () => {
75
+ const longSchema = `{
76
+ "type": "object",
77
+ "properties": {
78
+ "analysis": {"type": "string"},
79
+ "findings": {
80
+ "type": "array",
81
+ "items": {"type": "string"}
82
+ },
83
+ "confidence": {"type": "number", "minimum": 0, "maximum": 1},
84
+ "recommendations": {
85
+ "type": "array",
86
+ "items": {
87
+ "type": "object",
88
+ "properties": {
89
+ "action": {"type": "string"},
90
+ "priority": {"type": "string", "enum": ["high", "medium", "low"]}
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }`;
96
+
97
+ const options = { schema: longSchema };
98
+ const reminder = mockAgent.buildReminderMessage(options);
99
+
100
+ // Should include schema-related instructions
101
+ expect(reminder).toContain('A schema was provided');
102
+ expect(reminder).toContain('automatically formatted');
103
+ });
104
+
105
+ test('should work with non-JSON schemas too', () => {
106
+ const mermaidSchema = `graph TD
107
+ A[Start] --> B[Process]
108
+ B --> C[End]`;
109
+
110
+ const options = { schema: mermaidSchema };
111
+ const reminder = mockAgent.buildReminderMessage(options);
112
+
113
+ expect(reminder).toContain('A schema was provided');
114
+ expect(reminder).toContain('You MUST use attempt_completion');
115
+ expect(reminder).toContain('automatically formatted');
116
+ });
117
+
118
+ test('should provide clear example of attempt_completion format', () => {
119
+ const options = {
120
+ schema: '{"status": "string", "message": "string"}'
121
+ };
122
+
123
+ const reminder = mockAgent.buildReminderMessage(options);
124
+
125
+ expect(reminder).toContain('<attempt_completion>');
126
+ expect(reminder).toContain('provide in natural language');
127
+ expect(reminder).toContain('</attempt_completion>');
128
+ expect(reminder).toContain('automatically formatted');
129
+
130
+ // Should show the direct content format, not <result> wrapper
131
+ expect(reminder).not.toContain('<result>');
132
+ });
133
+ });
134
+
135
+ describe('Without Schema', () => {
136
+ test('should provide standard reminder when no schema is present', () => {
137
+ const options = {}; // No schema
138
+
139
+ const reminder = mockAgent.buildReminderMessage(options);
140
+
141
+ expect(reminder).toContain('Please use one of the available tools');
142
+ expect(reminder).toContain('attempt_completion');
143
+ expect(reminder).toContain('<attempt_complete>');
144
+
145
+ // Should NOT contain schema-specific instructions
146
+ expect(reminder).not.toContain('A schema was provided');
147
+ expect(reminder).not.toContain('matches this schema');
148
+ expect(reminder).not.toContain('conform to this schema');
149
+ });
150
+
151
+ test('should include attempt_complete shorthand when no schema', () => {
152
+ const options = {}; // No schema
153
+
154
+ const reminder = mockAgent.buildReminderMessage(options);
155
+
156
+ expect(reminder).toContain('for quick completion if your previous response was already correct:');
157
+ expect(reminder).toContain('<attempt_complete>');
158
+ });
159
+
160
+ test('should provide standard XML formatting guidance', () => {
161
+ const options = {}; // No schema
162
+
163
+ const reminder = mockAgent.buildReminderMessage(options);
164
+
165
+ expect(reminder).toContain('Use proper XML format with BOTH opening and closing tags');
166
+ expect(reminder).toContain('<tool_name>');
167
+ expect(reminder).toContain('<parameter>value</parameter>');
168
+ expect(reminder).toContain('</tool_name>');
169
+ });
170
+ });
171
+
172
+ describe('Edge Cases', () => {
173
+ test('should handle empty schema string', () => {
174
+ const options = { schema: '' };
175
+
176
+ const reminder = mockAgent.buildReminderMessage(options);
177
+
178
+ // Empty string is falsy, so should get standard treatment
179
+ expect(reminder).toContain('Please use one of the available tools');
180
+ expect(reminder).toContain('<attempt_complete>');
181
+ expect(reminder).not.toContain('A schema was provided');
182
+ });
183
+
184
+ test('should handle schema with special characters', () => {
185
+ const options = {
186
+ schema: '{"special": "characters like <>&\\"\\n\\t"}'
187
+ };
188
+
189
+ const reminder = mockAgent.buildReminderMessage(options);
190
+
191
+ expect(reminder).toContain('A schema was provided');
192
+ expect(reminder).toContain('You MUST use attempt_completion');
193
+ expect(reminder).toContain('automatically formatted');
194
+ });
195
+
196
+ test('should be consistent with tool formatting instructions', () => {
197
+ const optionsWithSchema = { schema: '{"test": "value"}' };
198
+ const optionsWithoutSchema = {};
199
+
200
+ const reminderWithSchema = mockAgent.buildReminderMessage(optionsWithSchema);
201
+ const reminderWithoutSchema = mockAgent.buildReminderMessage(optionsWithoutSchema);
202
+
203
+ // Both should have the same XML formatting instructions
204
+ const xmlInstructions = 'Use proper XML format with BOTH opening and closing tags';
205
+ expect(reminderWithSchema).toContain(xmlInstructions);
206
+ expect(reminderWithoutSchema).toContain(xmlInstructions);
207
+
208
+ // Both should mention attempt_completion
209
+ expect(reminderWithSchema).toContain('attempt_completion');
210
+ expect(reminderWithoutSchema).toContain('attempt_completion');
211
+ });
212
+ });
213
+ });
214
+
215
+ describe('Integration with ProbeAgent Flow', () => {
216
+ let integrationMockAgent;
217
+
218
+ beforeEach(() => {
219
+ // Create a fresh mock agent for integration tests
220
+ integrationMockAgent = {
221
+ buildReminderMessage(options) {
222
+ let reminderContent;
223
+ if (options.schema) {
224
+ // Schema-aware reminder
225
+ reminderContent = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
226
+
227
+ Remember: Use proper XML format with BOTH opening and closing tags:
228
+
229
+ <tool_name>
230
+ <parameter>value</parameter>
231
+ </tool_name>
232
+
233
+ IMPORTANT: A schema was provided for the final output format.
234
+
235
+ You MUST use attempt_completion to provide your answer:
236
+ <attempt_completion>
237
+ [Your complete answer here - provide in natural language, it will be automatically formatted to match the schema]
238
+ </attempt_completion>
239
+
240
+ Your response will be automatically formatted to JSON. You can provide your answer in natural language or as JSON - either will work.`;
241
+ } else {
242
+ // Standard reminder without schema
243
+ reminderContent = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
244
+
245
+ Remember: Use proper XML format with BOTH opening and closing tags:
246
+
247
+ <tool_name>
248
+ <parameter>value</parameter>
249
+ </tool_name>
250
+
251
+ Or for quick completion if your previous response was already correct:
252
+ <attempt_complete>`;
253
+ }
254
+ return reminderContent;
255
+ }
256
+ };
257
+ });
258
+
259
+ test('should prevent JSON validation loops by providing clear upfront instructions', () => {
260
+ // This test validates that our schema-aware reminders solve the original problem
261
+ const options = {
262
+ schema: '{"analysis": "string", "score": "number"}'
263
+ };
264
+
265
+ const reminder = integrationMockAgent.buildReminderMessage(options);
266
+
267
+ // The reminder should clearly state what's expected
268
+ expect(reminder).toContain('A schema was provided');
269
+ expect(reminder).toContain('You MUST use attempt_completion');
270
+
271
+ // Should show the exact format expected
272
+ expect(reminder).toContain('<attempt_completion>');
273
+ expect(reminder).toContain('provide in natural language');
274
+ expect(reminder).toContain('</attempt_completion>');
275
+ expect(reminder).toContain('automatically formatted');
276
+ });
277
+
278
+ test('should maintain backward compatibility for non-schema usage', () => {
279
+ const options = {}; // No schema - existing behavior
280
+
281
+ const reminder = integrationMockAgent.buildReminderMessage(options);
282
+
283
+ // Should still work like before for non-schema cases
284
+ expect(reminder).toContain('Please use one of the available tools');
285
+ expect(reminder).toContain('<attempt_complete>');
286
+ expect(reminder).not.toContain('schema');
287
+ });
288
+ });