@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,720 @@
1
+ import { parseXmlToolCall, parseXmlToolCallWithThinking } from '../../src/agent/tools.js';
2
+
3
+ describe('XML Tool Call Parsing', () => {
4
+ describe('parseXmlToolCall', () => {
5
+ describe('Valid tool parsing', () => {
6
+ test('should parse valid search tool call', () => {
7
+ const xmlString = '<search><query>test query</query></search>';
8
+ const result = parseXmlToolCall(xmlString);
9
+
10
+ expect(result).toEqual({
11
+ toolName: 'search',
12
+ params: { query: 'test query' }
13
+ });
14
+ });
15
+
16
+ test('should parse extract tool call with multiple params', () => {
17
+ const xmlString = '<extract><targets>src/test.js:10-20 other.js#func</targets><input_content>some diff</input_content></extract>';
18
+ const result = parseXmlToolCall(xmlString);
19
+
20
+ expect(result).toEqual({
21
+ toolName: 'extract',
22
+ params: {
23
+ targets: 'src/test.js:10-20 other.js#func',
24
+ input_content: 'some diff'
25
+ }
26
+ });
27
+ });
28
+
29
+ test('should parse attempt_completion with direct content', () => {
30
+ const xmlString = '<attempt_completion>Task completed successfully</attempt_completion>';
31
+ const result = parseXmlToolCall(xmlString);
32
+
33
+ expect(result).toEqual({
34
+ toolName: 'attempt_completion',
35
+ params: {
36
+ result: 'Task completed successfully'
37
+ }
38
+ });
39
+ });
40
+
41
+ test('should parse boolean parameters correctly', () => {
42
+ const xmlString = '<listFiles><recursive>true</recursive><includeHidden>false</includeHidden></listFiles>';
43
+ const result = parseXmlToolCall(xmlString);
44
+
45
+ expect(result).toEqual({
46
+ toolName: 'listFiles',
47
+ params: {
48
+ recursive: true,
49
+ includeHidden: false
50
+ }
51
+ });
52
+ });
53
+
54
+ test('should handle all valid tools with structured parameters', () => {
55
+ // Test tools with valid parameters from their schemas
56
+ const testCases = [
57
+ { tool: 'search', xml: '<search><query>test</query></search>', expected: { query: 'test' } },
58
+ { tool: 'query', xml: '<query><pattern>$NAME</pattern></query>', expected: { pattern: '$NAME' } },
59
+ { tool: 'extract', xml: '<extract><targets>file.js</targets></extract>', expected: { targets: 'file.js' } },
60
+ { tool: 'listFiles', xml: '<listFiles><directory>src</directory></listFiles>', expected: { directory: 'src' } },
61
+ { tool: 'searchFiles', xml: '<searchFiles><pattern>*.js</pattern></searchFiles>', expected: { pattern: '*.js' } },
62
+ { tool: 'implement', xml: '<implement><task>test</task></implement>', expected: { task: 'test' } }
63
+ ];
64
+
65
+ testCases.forEach(({ tool, xml, expected }) => {
66
+ const result = parseXmlToolCall(xml);
67
+
68
+ expect(result).toEqual({
69
+ toolName: tool,
70
+ params: expected
71
+ });
72
+ });
73
+ });
74
+ });
75
+
76
+ describe('Non-tool XML tag filtering', () => {
77
+ test('should ignore HTML formatting tags', () => {
78
+ const xmlString = '<ins>This is inserted text</ins>';
79
+ const result = parseXmlToolCall(xmlString);
80
+
81
+ expect(result).toBeNull();
82
+ });
83
+
84
+ test('should ignore HTML emphasis tags', () => {
85
+ const xmlString = '<em>emphasized text</em>';
86
+ const result = parseXmlToolCall(xmlString);
87
+
88
+ expect(result).toBeNull();
89
+ });
90
+
91
+ test('should ignore HTML deletion tags', () => {
92
+ const xmlString = '<del>deleted text</del>';
93
+ const result = parseXmlToolCall(xmlString);
94
+
95
+ expect(result).toBeNull();
96
+ });
97
+
98
+ test('should ignore HTML strong tags', () => {
99
+ const xmlString = '<strong>bold text</strong>';
100
+ const result = parseXmlToolCall(xmlString);
101
+
102
+ expect(result).toBeNull();
103
+ });
104
+
105
+ test('should ignore custom XML tags', () => {
106
+ const xmlString = '<customTag>custom content</customTag>';
107
+ const result = parseXmlToolCall(xmlString);
108
+
109
+ expect(result).toBeNull();
110
+ });
111
+
112
+ test('should ignore markdown-style tags', () => {
113
+ const xmlString = '<code>sample code</code>';
114
+ const result = parseXmlToolCall(xmlString);
115
+
116
+ expect(result).toBeNull();
117
+ });
118
+
119
+ test('should ignore multiple non-tool tags in sequence', () => {
120
+ const xmlString = '<ins>inserted</ins><del>deleted</del><em>emphasized</em>';
121
+ const result = parseXmlToolCall(xmlString);
122
+
123
+ expect(result).toBeNull();
124
+ });
125
+ });
126
+
127
+ describe('Custom valid tools list', () => {
128
+ test('should respect custom valid tools list', () => {
129
+ const customValidTools = ['search', 'extract'];
130
+
131
+ // Should parse tools in the custom list
132
+ const validXml = '<search><query>test</query></search>';
133
+ const validResult = parseXmlToolCall(validXml, customValidTools);
134
+ expect(validResult).toEqual({
135
+ toolName: 'search',
136
+ params: { query: 'test' }
137
+ });
138
+
139
+ // Should ignore tools not in the custom list
140
+ const invalidXml = '<query><pattern>test</pattern></query>';
141
+ const invalidResult = parseXmlToolCall(invalidXml, customValidTools);
142
+ expect(invalidResult).toBeNull();
143
+ });
144
+
145
+ test('should handle empty valid tools list', () => {
146
+ const emptyValidTools = [];
147
+ const xmlString = '<search><query>test</query></search>';
148
+ const result = parseXmlToolCall(xmlString, emptyValidTools);
149
+
150
+ expect(result).toBeNull();
151
+ });
152
+
153
+ test('should work with single tool in valid list', () => {
154
+ const singleTool = ['attempt_completion'];
155
+ const xmlString = '<attempt_completion>done</attempt_completion>';
156
+ const result = parseXmlToolCall(xmlString, singleTool);
157
+
158
+ expect(result).toEqual({
159
+ toolName: 'attempt_completion',
160
+ params: { result: 'done' }
161
+ });
162
+ });
163
+ });
164
+
165
+ describe('Edge cases', () => {
166
+ test('should handle malformed XML gracefully', () => {
167
+ const xmlString = '<search><query>unclosed tag</search>';
168
+ const result = parseXmlToolCall(xmlString);
169
+
170
+ // With improved parser, it now handles unclosed parameter tags
171
+ // The parser finds <search></search> and extracts the unclosed <query> param
172
+ expect(result).toEqual({
173
+ toolName: 'search',
174
+ params: { query: 'unclosed tag' }
175
+ });
176
+ });
177
+
178
+ test('should handle empty XML string', () => {
179
+ const xmlString = '';
180
+ const result = parseXmlToolCall(xmlString);
181
+
182
+ expect(result).toBeNull();
183
+ });
184
+
185
+ test('should handle XML with no closing tag', () => {
186
+ const xmlString = '<search><query>test</query>';
187
+ const result = parseXmlToolCall(xmlString);
188
+
189
+ // With improved parser, it handles unclosed tool tags
190
+ // Finds <search> (unclosed) with properly closed <query> parameter
191
+ expect(result).toEqual({
192
+ toolName: 'search',
193
+ params: { query: 'test' }
194
+ });
195
+ });
196
+
197
+ test('should handle whitespace and formatting', () => {
198
+ const xmlString = `
199
+ <search>
200
+ <query> test query </query>
201
+ <path> ./src </path>
202
+ </search>
203
+ `;
204
+ const result = parseXmlToolCall(xmlString);
205
+
206
+ expect(result).toEqual({
207
+ toolName: 'search',
208
+ params: {
209
+ query: 'test query',
210
+ path: './src'
211
+ }
212
+ });
213
+ });
214
+ });
215
+ });
216
+
217
+ describe('parseXmlToolCallWithThinking', () => {
218
+ test('should parse tool call and ignore thinking tags', () => {
219
+ const xmlString = `
220
+ <thinking>
221
+ I need to search for the user's query about testing.
222
+ </thinking>
223
+ <search>
224
+ <query>testing framework</query>
225
+ </search>
226
+ `;
227
+
228
+ const result = parseXmlToolCallWithThinking(xmlString);
229
+
230
+ expect(result).toEqual({
231
+ toolName: 'search',
232
+ params: { query: 'testing framework' }
233
+ });
234
+ });
235
+
236
+ test('should handle multiple thinking blocks', () => {
237
+ const xmlString = `
238
+ <thinking>First thought</thinking>
239
+ <thinking>Second thought</thinking>
240
+ <extract>
241
+ <targets>test.js</targets>
242
+ </extract>
243
+ `;
244
+
245
+ const result = parseXmlToolCallWithThinking(xmlString);
246
+
247
+ expect(result).toEqual({
248
+ toolName: 'extract',
249
+ params: { targets: 'test.js' }
250
+ });
251
+ });
252
+
253
+ test('should ignore non-tool tags even with thinking', () => {
254
+ const xmlString = `
255
+ <thinking>I should format this text</thinking>
256
+ <ins>This is inserted text</ins>
257
+ <thinking>But I need to use a tool instead</thinking>
258
+ `;
259
+
260
+ const result = parseXmlToolCallWithThinking(xmlString);
261
+
262
+ expect(result).toBeNull();
263
+ });
264
+
265
+ test('should pass custom valid tools to underlying parser', () => {
266
+ const customValidTools = ['search'];
267
+ const xmlString = `
268
+ <thinking>I'll use query tool</thinking>
269
+ <query>
270
+ <pattern>test pattern</pattern>
271
+ </query>
272
+ `;
273
+
274
+ // Should be null because query is not in custom valid tools
275
+ const result = parseXmlToolCallWithThinking(xmlString, customValidTools);
276
+
277
+ expect(result).toBeNull();
278
+ });
279
+
280
+ test('should handle thinking without tool calls', () => {
281
+ const xmlString = `
282
+ <thinking>
283
+ Just thinking about the problem, no tool call needed yet.
284
+ </thinking>
285
+ `;
286
+
287
+ const result = parseXmlToolCallWithThinking(xmlString);
288
+
289
+ expect(result).toBeNull();
290
+ });
291
+ });
292
+
293
+ describe('Real-world scenarios', () => {
294
+ test('should handle AI response with formatting and tool call', () => {
295
+ const aiResponse = `
296
+ I need to search for information about this topic.
297
+
298
+ <ins>Let me search for the relevant code:</ins>
299
+
300
+ <search>
301
+ <query>authentication middleware</query>
302
+ </search>
303
+
304
+ <em>This search should help us find the authentication logic.</em>
305
+ `;
306
+
307
+ const result = parseXmlToolCallWithThinking(aiResponse);
308
+
309
+ expect(result).toEqual({
310
+ toolName: 'search',
311
+ params: { query: 'authentication middleware' }
312
+ });
313
+ });
314
+
315
+ test('should handle response with only HTML formatting (no tools)', () => {
316
+ const aiResponse = `
317
+ Here's the analysis:
318
+
319
+ <strong>Key Points:</strong>
320
+ - <ins>The code needs refactoring</ins>
321
+ - <del>Old approach is deprecated</del>
322
+ - <em>New pattern is more efficient</em>
323
+
324
+ <code>function example() { return true; }</code>
325
+ `;
326
+
327
+ const result = parseXmlToolCallWithThinking(aiResponse);
328
+
329
+ expect(result).toBeNull();
330
+ });
331
+
332
+ test('should handle mixed content with thinking and HTML tags', () => {
333
+ const aiResponse = `
334
+ <thinking>
335
+ The user wants me to extract code from a specific file.
336
+ I should use the extract tool for this.
337
+ </thinking>
338
+
339
+ I understand you need the code. <ins>Let me extract it for you:</ins>
340
+
341
+ <extract>
342
+ <targets>src/components/Header.js:1-50</targets>
343
+ </extract>
344
+
345
+ <em>This will show you the first 50 lines of the Header component.</em>
346
+ `;
347
+
348
+ const result = parseXmlToolCallWithThinking(aiResponse);
349
+
350
+ expect(result).toEqual({
351
+ toolName: 'extract',
352
+ params: {
353
+ targets: 'src/components/Header.js:1-50'
354
+ }
355
+ });
356
+ });
357
+
358
+ test('should handle implement tool when allowed', () => {
359
+ const aiResponse = `
360
+ <thinking>
361
+ I need to implement this feature using the implement tool.
362
+ </thinking>
363
+
364
+ <implement>
365
+ <task>Add user authentication</task>
366
+ </implement>
367
+ `;
368
+
369
+ const validToolsWithImplement = ['search', 'query', 'extract', 'implement', 'attempt_completion'];
370
+ const result = parseXmlToolCallWithThinking(aiResponse, validToolsWithImplement);
371
+
372
+ expect(result).toEqual({
373
+ toolName: 'implement',
374
+ params: { task: 'Add user authentication' }
375
+ });
376
+ });
377
+
378
+ test('should ignore implement tool when not allowed', () => {
379
+ const aiResponse = `
380
+ <implement>
381
+ <task>Add user authentication</task>
382
+ </implement>
383
+ `;
384
+
385
+ const validToolsWithoutImplement = ['search', 'query', 'extract', 'attempt_completion'];
386
+ const result = parseXmlToolCallWithThinking(aiResponse, validToolsWithoutImplement);
387
+
388
+ expect(result).toBeNull();
389
+ });
390
+ });
391
+
392
+ describe('Unclosed attempt_completion tag handling', () => {
393
+ test('should handle attempt_completion with content but no closing tag', () => {
394
+ const aiResponse = `<attempt_completion>
395
+ \`\`\`json
396
+ {
397
+ "issues": [
398
+ {
399
+ "file": "test.ts",
400
+ "line": 442,
401
+ "message": "Security issue"
402
+ }
403
+ ]
404
+ }
405
+ \`\`\``;
406
+
407
+ const result = parseXmlToolCallWithThinking(aiResponse);
408
+
409
+ expect(result).toEqual({
410
+ toolName: 'attempt_completion',
411
+ params: {
412
+ result: `\`\`\`json
413
+ {
414
+ "issues": [
415
+ {
416
+ "file": "test.ts",
417
+ "line": 442,
418
+ "message": "Security issue"
419
+ }
420
+ ]
421
+ }
422
+ \`\`\``
423
+ }
424
+ });
425
+ });
426
+
427
+ test('should handle attempt_completion with text content and no closing tag', () => {
428
+ const aiResponse = `Some explanation text before the tag.
429
+
430
+ <attempt_completion>
431
+ The task has been completed successfully.
432
+ All tests are passing.`;
433
+
434
+ const result = parseXmlToolCallWithThinking(aiResponse);
435
+
436
+ expect(result).toEqual({
437
+ toolName: 'attempt_completion',
438
+ params: {
439
+ result: `The task has been completed successfully.
440
+ All tests are passing.`
441
+ }
442
+ });
443
+ });
444
+
445
+ test('should handle attempt_completion with closing tag (normal case)', () => {
446
+ const aiResponse = `<attempt_completion>
447
+ Task completed with all requirements met.
448
+ </attempt_completion>`;
449
+
450
+ const result = parseXmlToolCallWithThinking(aiResponse);
451
+
452
+ expect(result).toEqual({
453
+ toolName: 'attempt_completion',
454
+ params: {
455
+ result: 'Task completed with all requirements met.'
456
+ }
457
+ });
458
+ });
459
+
460
+ test('should handle empty attempt_completion tag without closing', () => {
461
+ const aiResponse = `<attempt_completion>`;
462
+
463
+ const result = parseXmlToolCallWithThinking(aiResponse);
464
+
465
+ expect(result).toEqual({
466
+ toolName: 'attempt_completion',
467
+ params: {
468
+ result: '__PREVIOUS_RESPONSE__'
469
+ }
470
+ });
471
+ });
472
+
473
+ test('should prioritize attempt_completion over other content', () => {
474
+ const aiResponse = `Here's some explanation text.
475
+
476
+ <ins>Important:</ins> The analysis is complete.
477
+
478
+ <attempt_completion>
479
+ \`\`\`json
480
+ {"status": "complete"}
481
+ \`\`\``;
482
+
483
+ const result = parseXmlToolCallWithThinking(aiResponse);
484
+
485
+ expect(result).toEqual({
486
+ toolName: 'attempt_completion',
487
+ params: {
488
+ result: `\`\`\`json
489
+ {"status": "complete"}
490
+ \`\`\``
491
+ }
492
+ });
493
+ });
494
+ });
495
+
496
+ describe('Unclosed thinking tag handling', () => {
497
+ test('should remove unclosed thinking tag and its content', () => {
498
+ const aiResponse = `<thinking>
499
+ I need to search for the authentication code.
500
+ This is my reasoning...
501
+
502
+ <search>
503
+ <query>authentication</query>
504
+ </search>`;
505
+
506
+ const result = parseXmlToolCallWithThinking(aiResponse);
507
+
508
+ expect(result).toEqual({
509
+ toolName: 'search',
510
+ params: { query: 'authentication' }
511
+ });
512
+ });
513
+
514
+ test('should handle properly closed thinking tag', () => {
515
+ const aiResponse = `<thinking>
516
+ Let me analyze this.
517
+ </thinking>
518
+
519
+ <extract>
520
+ <targets>src/auth.js</targets>
521
+ </extract>`;
522
+
523
+ const result = parseXmlToolCallWithThinking(aiResponse);
524
+
525
+ expect(result).toEqual({
526
+ toolName: 'extract',
527
+ params: { targets: 'src/auth.js' }
528
+ });
529
+ });
530
+
531
+ test('should handle multiple thinking tags with one unclosed', () => {
532
+ const aiResponse = `<thinking>First thought</thinking>
533
+ <thinking>Second thought that never ends...
534
+
535
+ <query>
536
+ <pattern>test</pattern>
537
+ </query>`;
538
+
539
+ const result = parseXmlToolCallWithThinking(aiResponse);
540
+
541
+ expect(result).toEqual({
542
+ toolName: 'query',
543
+ params: { pattern: 'test' }
544
+ });
545
+ });
546
+ });
547
+
548
+ describe('Unclosed tool tag handling', () => {
549
+ test('should handle search tool without closing tag', () => {
550
+ const aiResponse = `<search>
551
+ <query>function definition`;
552
+
553
+ const result = parseXmlToolCall(aiResponse);
554
+
555
+ expect(result).toEqual({
556
+ toolName: 'search',
557
+ params: { query: 'function definition' }
558
+ });
559
+ });
560
+
561
+ test('should handle extract tool without closing tag', () => {
562
+ const aiResponse = `<extract>
563
+ <targets>src/index.js:42`;
564
+
565
+ const result = parseXmlToolCall(aiResponse);
566
+
567
+ expect(result).toEqual({
568
+ toolName: 'extract',
569
+ params: {
570
+ targets: 'src/index.js:42'
571
+ }
572
+ });
573
+ });
574
+
575
+ test('should handle query tool without closing tag', () => {
576
+ const aiResponse = `<query>
577
+ <pattern>class \\w+`;
578
+
579
+ const result = parseXmlToolCall(aiResponse);
580
+
581
+ expect(result).toEqual({
582
+ toolName: 'query',
583
+ params: { pattern: 'class \\w+' }
584
+ });
585
+ });
586
+
587
+ test('should handle listFiles tool without closing tag', () => {
588
+ const aiResponse = `<listFiles>
589
+ <path>src/</path>
590
+ <recursive>true`;
591
+
592
+ const result = parseXmlToolCall(aiResponse);
593
+
594
+ expect(result).toEqual({
595
+ toolName: 'listFiles',
596
+ params: {
597
+ path: 'src/',
598
+ recursive: true
599
+ }
600
+ });
601
+ });
602
+ });
603
+
604
+ describe('Unclosed parameter tag handling', () => {
605
+ test('should handle parameter without closing tag followed by another param', () => {
606
+ const aiResponse = `<search>
607
+ <query>authentication
608
+ <path>./src</path>
609
+ </search>`;
610
+
611
+ const result = parseXmlToolCall(aiResponse);
612
+
613
+ expect(result).toEqual({
614
+ toolName: 'search',
615
+ params: {
616
+ query: 'authentication',
617
+ path: './src'
618
+ }
619
+ });
620
+ });
621
+
622
+ test('should handle last parameter without closing tag', () => {
623
+ const aiResponse = `<extract>
624
+ <targets>src/test.js:10
625
+ </extract>`;
626
+
627
+ const result = parseXmlToolCall(aiResponse);
628
+
629
+ expect(result).toEqual({
630
+ toolName: 'extract',
631
+ params: {
632
+ targets: 'src/test.js:10'
633
+ }
634
+ });
635
+ });
636
+
637
+ test('should handle multiple unclosed parameter tags', () => {
638
+ const aiResponse = `<extract>
639
+ <targets>src/app.js:1-100
640
+ <input_content>some diff content
641
+ </extract>`;
642
+
643
+ const result = parseXmlToolCall(aiResponse);
644
+
645
+ expect(result).toEqual({
646
+ toolName: 'extract',
647
+ params: {
648
+ targets: 'src/app.js:1-100',
649
+ input_content: 'some diff content'
650
+ }
651
+ });
652
+ });
653
+
654
+ test('should handle unclosed param with multiline content', () => {
655
+ const aiResponse = `<search>
656
+ <query>function test() {
657
+ return true;
658
+ }
659
+ <path>./src</path>
660
+ </search>`;
661
+
662
+ const result = parseXmlToolCall(aiResponse);
663
+
664
+ expect(result).toEqual({
665
+ toolName: 'search',
666
+ params: {
667
+ query: `function test() {
668
+ return true;
669
+ }`,
670
+ path: './src'
671
+ }
672
+ });
673
+ });
674
+ });
675
+
676
+ describe('Complex unclosed tag scenarios', () => {
677
+ test('should handle tool and param both unclosed', () => {
678
+ const aiResponse = `<search>
679
+ <query>test query`;
680
+
681
+ const result = parseXmlToolCall(aiResponse);
682
+
683
+ expect(result).toEqual({
684
+ toolName: 'search',
685
+ params: { query: 'test query' }
686
+ });
687
+ });
688
+
689
+ test('should handle unclosed thinking + unclosed tool', () => {
690
+ const aiResponse = `<thinking>
691
+ I should search for this...
692
+
693
+ <search>
694
+ <query>authentication middleware`;
695
+
696
+ const result = parseXmlToolCallWithThinking(aiResponse);
697
+
698
+ expect(result).toEqual({
699
+ toolName: 'search',
700
+ params: { query: 'authentication middleware' }
701
+ });
702
+ });
703
+
704
+ test('should handle mixed properly closed and unclosed tags', () => {
705
+ const aiResponse = `<extract>
706
+ <targets>src/auth.js:10-20
707
+ <input_content>some content</input_content>`;
708
+
709
+ const result = parseXmlToolCall(aiResponse);
710
+
711
+ expect(result).toEqual({
712
+ toolName: 'extract',
713
+ params: {
714
+ targets: 'src/auth.js:10-20',
715
+ input_content: 'some content'
716
+ }
717
+ });
718
+ });
719
+ });
720
+ });