@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,282 @@
1
+ /**
2
+ * Unit tests for SimpleTelemetry and SimpleAppTracer
3
+ * @module tests/unit/simpleTelemetry
4
+ */
5
+
6
+ import { jest, describe, test, expect, beforeEach, afterEach } from '@jest/globals';
7
+ import { SimpleTelemetry, SimpleAppTracer } from '../../src/agent/simpleTelemetry.js';
8
+
9
+ describe('SimpleTelemetry', () => {
10
+ let telemetry;
11
+
12
+ beforeEach(() => {
13
+ telemetry = new SimpleTelemetry({
14
+ serviceName: 'test-service',
15
+ enableConsole: false,
16
+ enableFile: false
17
+ });
18
+ });
19
+
20
+ afterEach(async () => {
21
+ await telemetry.shutdown();
22
+ });
23
+
24
+ describe('createSpan', () => {
25
+ test('should create a span with name and attributes', () => {
26
+ const span = telemetry.createSpan('test-span', { 'test.attr': 'value' });
27
+
28
+ expect(span.name).toBe('test-span');
29
+ expect(span.attributes).toMatchObject({
30
+ 'test.attr': 'value',
31
+ service: 'test-service'
32
+ });
33
+ expect(span.traceId).toBeDefined();
34
+ expect(span.spanId).toBeDefined();
35
+ });
36
+
37
+ test('should allow adding events to spans', () => {
38
+ const span = telemetry.createSpan('test-span');
39
+
40
+ span.addEvent('test-event', { 'event.data': 'test' });
41
+
42
+ expect(span.events).toHaveLength(1);
43
+ expect(span.events[0].name).toBe('test-event');
44
+ expect(span.events[0].attributes).toMatchObject({ 'event.data': 'test' });
45
+ });
46
+
47
+ test('should allow setting attributes', () => {
48
+ const span = telemetry.createSpan('test-span');
49
+
50
+ span.setAttributes({ 'new.attr': 'new-value' });
51
+
52
+ expect(span.attributes['new.attr']).toBe('new-value');
53
+ });
54
+
55
+ test('should allow setting status', () => {
56
+ const span = telemetry.createSpan('test-span');
57
+
58
+ // setStatus modifies the internal span state used during export
59
+ // The function should not throw and should be callable
60
+ expect(() => span.setStatus('ERROR')).not.toThrow();
61
+ });
62
+ });
63
+ });
64
+
65
+ describe('SimpleAppTracer', () => {
66
+ let telemetry;
67
+ let tracer;
68
+
69
+ beforeEach(() => {
70
+ telemetry = new SimpleTelemetry({
71
+ serviceName: 'test-service',
72
+ enableConsole: false,
73
+ enableFile: false
74
+ });
75
+ tracer = new SimpleAppTracer(telemetry, 'test-session-123');
76
+ });
77
+
78
+ afterEach(async () => {
79
+ await tracer.shutdown();
80
+ });
81
+
82
+ describe('constructor', () => {
83
+ test('should initialize with provided session ID', () => {
84
+ expect(tracer.sessionId).toBe('test-session-123');
85
+ });
86
+
87
+ test('should generate session ID if not provided', () => {
88
+ const tracerWithoutSession = new SimpleAppTracer(telemetry);
89
+ expect(tracerWithoutSession.sessionId).toBeDefined();
90
+ expect(tracerWithoutSession.sessionId.length).toBeGreaterThan(0);
91
+ });
92
+ });
93
+
94
+ describe('isEnabled', () => {
95
+ test('should return true when telemetry is provided', () => {
96
+ expect(tracer.isEnabled()).toBe(true);
97
+ });
98
+
99
+ test('should return false when telemetry is null', () => {
100
+ const disabledTracer = new SimpleAppTracer(null, 'session-123');
101
+ expect(disabledTracer.isEnabled()).toBe(false);
102
+ });
103
+ });
104
+
105
+ describe('recordEvent', () => {
106
+ test('should record event with name and attributes', () => {
107
+ // Mock addEvent
108
+ const addEventSpy = jest.spyOn(tracer, 'addEvent');
109
+
110
+ tracer.recordEvent('test.event', { 'custom.attr': 'value' });
111
+
112
+ expect(addEventSpy).toHaveBeenCalledWith('test.event', {
113
+ 'session.id': 'test-session-123',
114
+ 'custom.attr': 'value'
115
+ });
116
+ });
117
+
118
+ test('should not record event when tracer is disabled', () => {
119
+ const disabledTracer = new SimpleAppTracer(null, 'session-123');
120
+ const addEventSpy = jest.spyOn(disabledTracer, 'addEvent');
121
+
122
+ disabledTracer.recordEvent('test.event', { 'custom.attr': 'value' });
123
+
124
+ expect(addEventSpy).not.toHaveBeenCalled();
125
+ });
126
+
127
+ test('should support completion_prompt.started event', () => {
128
+ const addEventSpy = jest.spyOn(tracer, 'addEvent');
129
+
130
+ tracer.recordEvent('completion_prompt.started', {
131
+ 'completion_prompt.original_result_length': 100
132
+ });
133
+
134
+ expect(addEventSpy).toHaveBeenCalledWith('completion_prompt.started', {
135
+ 'session.id': 'test-session-123',
136
+ 'completion_prompt.original_result_length': 100
137
+ });
138
+ });
139
+
140
+ test('should support completion_prompt.completed event', () => {
141
+ const addEventSpy = jest.spyOn(tracer, 'addEvent');
142
+
143
+ tracer.recordEvent('completion_prompt.completed', {
144
+ 'completion_prompt.final_result_length': 200
145
+ });
146
+
147
+ expect(addEventSpy).toHaveBeenCalledWith('completion_prompt.completed', {
148
+ 'session.id': 'test-session-123',
149
+ 'completion_prompt.final_result_length': 200
150
+ });
151
+ });
152
+
153
+ test('should support completion_prompt.error event', () => {
154
+ const addEventSpy = jest.spyOn(tracer, 'addEvent');
155
+
156
+ tracer.recordEvent('completion_prompt.error', {
157
+ 'completion_prompt.error': 'Test error message'
158
+ });
159
+
160
+ expect(addEventSpy).toHaveBeenCalledWith('completion_prompt.error', {
161
+ 'session.id': 'test-session-123',
162
+ 'completion_prompt.error': 'Test error message'
163
+ });
164
+ });
165
+ });
166
+
167
+ describe('recordDelegationEvent', () => {
168
+ test('should record delegation event with type and data', () => {
169
+ const addEventSpy = jest.spyOn(tracer, 'addEvent');
170
+
171
+ tracer.recordDelegationEvent('started', { task: 'analyze code' });
172
+
173
+ expect(addEventSpy).toHaveBeenCalledWith('delegation.started', {
174
+ 'session.id': 'test-session-123',
175
+ task: 'analyze code'
176
+ });
177
+ });
178
+ });
179
+
180
+ describe('recordJsonValidationEvent', () => {
181
+ test('should record JSON validation event with type and data', () => {
182
+ const addEventSpy = jest.spyOn(tracer, 'addEvent');
183
+
184
+ tracer.recordJsonValidationEvent('validation_started', { schema: 'user' });
185
+
186
+ expect(addEventSpy).toHaveBeenCalledWith('json_validation.validation_started', {
187
+ 'session.id': 'test-session-123',
188
+ schema: 'user'
189
+ });
190
+ });
191
+ });
192
+
193
+ describe('recordMermaidValidationEvent', () => {
194
+ test('should record Mermaid validation event with type and data', () => {
195
+ const addEventSpy = jest.spyOn(tracer, 'addEvent');
196
+
197
+ tracer.recordMermaidValidationEvent('validation_complete', { valid: true });
198
+
199
+ expect(addEventSpy).toHaveBeenCalledWith('mermaid_validation.validation_complete', {
200
+ 'session.id': 'test-session-123',
201
+ valid: true
202
+ });
203
+ });
204
+ });
205
+
206
+ describe('createSessionSpan', () => {
207
+ test('should create session span with attributes', () => {
208
+ const span = tracer.createSessionSpan({ 'custom.attr': 'value' });
209
+
210
+ expect(span).not.toBeNull();
211
+ expect(span.name).toBe('agent.session');
212
+ expect(span.attributes).toMatchObject({
213
+ 'session.id': 'test-session-123',
214
+ 'custom.attr': 'value'
215
+ });
216
+ });
217
+
218
+ test('should return null when tracer is disabled', () => {
219
+ const disabledTracer = new SimpleAppTracer(null);
220
+ const span = disabledTracer.createSessionSpan();
221
+
222
+ expect(span).toBeNull();
223
+ });
224
+ });
225
+
226
+ describe('createAISpan', () => {
227
+ test('should create AI span with model and provider', () => {
228
+ const span = tracer.createAISpan('gpt-4', 'openai', { 'custom.attr': 'value' });
229
+
230
+ expect(span).not.toBeNull();
231
+ expect(span.name).toBe('ai.request');
232
+ expect(span.attributes).toMatchObject({
233
+ 'ai.model': 'gpt-4',
234
+ 'ai.provider': 'openai',
235
+ 'session.id': 'test-session-123',
236
+ 'custom.attr': 'value'
237
+ });
238
+ });
239
+ });
240
+
241
+ describe('createToolSpan', () => {
242
+ test('should create tool span with tool name', () => {
243
+ const span = tracer.createToolSpan('search', { query: 'test' });
244
+
245
+ expect(span).not.toBeNull();
246
+ expect(span.name).toBe('tool.call');
247
+ expect(span.attributes).toMatchObject({
248
+ 'tool.name': 'search',
249
+ 'session.id': 'test-session-123',
250
+ query: 'test'
251
+ });
252
+ });
253
+ });
254
+
255
+ describe('withSpan', () => {
256
+ test('should execute function within span context', async () => {
257
+ let result;
258
+
259
+ result = await tracer.withSpan('test.operation', async () => {
260
+ return 'success';
261
+ }, { 'operation.type': 'test' });
262
+
263
+ expect(result).toBe('success');
264
+ });
265
+
266
+ test('should handle errors within span', async () => {
267
+ await expect(tracer.withSpan('test.operation', async () => {
268
+ throw new Error('Test error');
269
+ })).rejects.toThrow('Test error');
270
+ });
271
+
272
+ test('should execute function directly when tracer is disabled', async () => {
273
+ const disabledTracer = new SimpleAppTracer(null);
274
+
275
+ const result = await disabledTracer.withSpan('test.operation', async () => {
276
+ return 'executed';
277
+ });
278
+
279
+ expect(result).toBe('executed');
280
+ });
281
+ });
282
+ });
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Tests for simplified attempt_completion tool - without command parameter and JSON issues
3
+ */
4
+ import { jest, describe, test, expect, beforeEach } from '@jest/globals';
5
+ import { attemptCompletionSchema } from '../../src/tools/common.js';
6
+ import { parseXmlToolCallWithThinking } from '../../src/agent/tools.js';
7
+
8
+ describe('Simplified attempt_completion Schema', () => {
9
+ test('should accept valid plain text result', () => {
10
+ const params = {
11
+ result: 'I have successfully analyzed the authentication system. It uses JWT tokens with RS256 encryption.'
12
+ };
13
+
14
+ const validation = attemptCompletionSchema.safeParse(params);
15
+ expect(validation.success).toBe(true);
16
+ expect(validation.data.result).toBe(params.result);
17
+ });
18
+
19
+ test('should accept multiline text result', () => {
20
+ const params = {
21
+ result: `Analysis complete:
22
+
23
+ 1. The authentication system uses JWT tokens
24
+ 2. Password hashing is implemented with bcrypt
25
+ 3. Rate limiting is in place for login attempts
26
+
27
+ Security recommendations:
28
+ - Consider adding 2FA
29
+ - Implement session timeout`
30
+ };
31
+
32
+ const validation = attemptCompletionSchema.safeParse(params);
33
+ expect(validation.success).toBe(true);
34
+ expect(validation.data.result).toBe(params.result);
35
+ });
36
+
37
+ test('should accept empty result', () => {
38
+ const params = {
39
+ result: ''
40
+ };
41
+
42
+ const validation = attemptCompletionSchema.safeParse(params);
43
+ expect(validation.success).toBe(true);
44
+ });
45
+
46
+ test('should reject missing result parameter', () => {
47
+ const params = {};
48
+
49
+ const validation = attemptCompletionSchema.safeParse(params);
50
+ expect(validation.success).toBe(false);
51
+ expect(validation.error.issues[0].code).toBe('invalid_type');
52
+ });
53
+
54
+ test('should reject non-string result', () => {
55
+ const params = {
56
+ result: 123
57
+ };
58
+
59
+ const validation = attemptCompletionSchema.safeParse(params);
60
+ expect(validation.success).toBe(false);
61
+ });
62
+
63
+ test('should not have command parameter in schema', () => {
64
+ // Test that the command parameter is no longer accepted
65
+ const params = {
66
+ result: 'Test result',
67
+ command: 'echo "test"'
68
+ };
69
+
70
+ const validation = attemptCompletionSchema.safeParse(params);
71
+ expect(validation.success).toBe(true);
72
+
73
+ // Command should be ignored (not present in validated data)
74
+ expect(validation.data).toEqual({ result: 'Test result' });
75
+ expect(validation.data.command).toBeUndefined();
76
+ });
77
+ });
78
+
79
+ describe('Simplified attempt_completion XML Parsing', () => {
80
+ test('should parse simple attempt_completion with direct content (no result wrapper)', () => {
81
+ const xml = `<attempt_completion>
82
+ The authentication system has been analyzed successfully. It uses secure JWT tokens.
83
+ </attempt_completion>`;
84
+
85
+ const parsed = parseXmlToolCallWithThinking(xml);
86
+
87
+ expect(parsed).toBeDefined();
88
+ expect(parsed.toolName).toBe('attempt_completion');
89
+ expect(parsed.params.result).toBe('The authentication system has been analyzed successfully. It uses secure JWT tokens.');
90
+ });
91
+
92
+ test('should parse multiline result with formatting', () => {
93
+ const xml = `<attempt_completion>
94
+ Analysis Complete:
95
+
96
+ **Security Findings:**
97
+ - JWT tokens are properly signed
98
+ - Password hashing uses bcrypt
99
+ - Rate limiting is implemented
100
+
101
+ **Recommendations:**
102
+ 1. Add 2FA support
103
+ 2. Implement session timeouts
104
+ 3. Add audit logging
105
+ </attempt_completion>`;
106
+
107
+ const parsed = parseXmlToolCallWithThinking(xml);
108
+
109
+ expect(parsed).toBeDefined();
110
+ expect(parsed.toolName).toBe('attempt_completion');
111
+ expect(parsed.params.result).toContain('Analysis Complete:');
112
+ expect(parsed.params.result).toContain('**Security Findings:**');
113
+ expect(parsed.params.result).toContain('**Recommendations:**');
114
+ });
115
+
116
+ test('should handle result with code blocks', () => {
117
+ const xml = `<attempt_completion>
118
+ I found the authentication function:
119
+
120
+ \`\`\`javascript
121
+ function authenticate(token) {
122
+ return jwt.verify(token, secret);
123
+ }
124
+ \`\`\`
125
+
126
+ This function validates JWT tokens using the secret key.
127
+ </attempt_completion>`;
128
+
129
+ const parsed = parseXmlToolCallWithThinking(xml);
130
+
131
+ expect(parsed).toBeDefined();
132
+ expect(parsed.toolName).toBe('attempt_completion');
133
+ expect(parsed.params.result).toContain('```javascript');
134
+ expect(parsed.params.result).toContain('function authenticate');
135
+ });
136
+
137
+ test('should handle result with XML-like content', () => {
138
+ const xml = `<attempt_completion>
139
+ The config file contains: &lt;database&gt;&lt;host&gt;localhost&lt;/host&gt;&lt;/database&gt;
140
+ </attempt_completion>`;
141
+
142
+ const parsed = parseXmlToolCallWithThinking(xml);
143
+
144
+ expect(parsed).toBeDefined();
145
+ // XML entities should remain as-is in the result (not decoded)
146
+ expect(parsed.params.result).toContain('&lt;database&gt;&lt;host&gt;localhost&lt;/host&gt;&lt;/database&gt;');
147
+ });
148
+
149
+ test('should treat all content as direct content (including old-style tags)', () => {
150
+ // Test that everything inside attempt_completion is treated as content
151
+ const xml = `<attempt_completion>
152
+ <result>Analysis complete. The system is secure.</result>
153
+ <command>echo "test"</command>
154
+ </attempt_completion>`;
155
+
156
+ const parsed = parseXmlToolCallWithThinking(xml);
157
+
158
+ expect(parsed).toBeDefined();
159
+ expect(parsed.toolName).toBe('attempt_completion');
160
+ expect(parsed.params.result).toContain('Analysis complete. The system is secure.');
161
+ expect(parsed.params.result).toContain('<result>');
162
+ expect(parsed.params.result).toContain('<command>echo "test"</command>');
163
+ expect(parsed.params.command).toBeUndefined(); // Command should not be a separate parameter
164
+ });
165
+
166
+ test('should handle empty content', () => {
167
+ const xml = `<attempt_completion>
168
+ </attempt_completion>`;
169
+
170
+ const parsed = parseXmlToolCallWithThinking(xml);
171
+
172
+ expect(parsed).toBeDefined();
173
+ expect(parsed.params.result).toBe('');
174
+ });
175
+
176
+ test('should handle content with special characters', () => {
177
+ const xml = `<attempt_completion>
178
+ Found 5 files with "special" characters: @#$%^&*()[]{}|\\:";'<>?,./
179
+ </attempt_completion>`;
180
+
181
+ const parsed = parseXmlToolCallWithThinking(xml);
182
+
183
+ expect(parsed).toBeDefined();
184
+ expect(parsed.params.result).toContain('special');
185
+ expect(parsed.params.result).toContain('@#$%^&*()[]{}|\\:');
186
+ });
187
+ });
188
+
189
+ describe('Integration with ProbeAgent (Mocked)', () => {
190
+ test('should handle valid attempt_completion without JSON validation', () => {
191
+ // Mock the schema validation that would happen in ProbeAgent
192
+ const params = {
193
+ result: 'The search functionality has been implemented successfully with BM25 ranking.'
194
+ };
195
+
196
+ const validation = attemptCompletionSchema.safeParse(params);
197
+ expect(validation.success).toBe(true);
198
+
199
+ // Simulate what ProbeAgent.js does - just extract the result
200
+ const finalResult = validation.data.result;
201
+
202
+ expect(finalResult).toBe(params.result);
203
+ expect(typeof finalResult).toBe('string');
204
+ });
205
+
206
+ test('should handle attempt_completion with markdown formatting', () => {
207
+ const params = {
208
+ result: `# Authentication Analysis
209
+
210
+ ## Overview
211
+ The system implements secure authentication using:
212
+ - JWT tokens with RS256 signing
213
+ - bcrypt password hashing
214
+ - Rate limiting on login attempts
215
+
216
+ ## Security Score: A-
217
+
218
+ The implementation follows security best practices.`
219
+ };
220
+
221
+ const validation = attemptCompletionSchema.safeParse(params);
222
+ expect(validation.success).toBe(true);
223
+
224
+ const finalResult = validation.data.result;
225
+ expect(finalResult).toContain('# Authentication Analysis');
226
+ expect(finalResult).toContain('## Security Score: A-');
227
+ });
228
+
229
+ test('should not require JSON cleaning or validation for plain text', () => {
230
+ // This test ensures we don't need the complex JSON cleaning logic anymore
231
+ const plainTextResult = 'Simple analysis result without any JSON formatting.';
232
+
233
+ // Direct validation - no JSON parsing needed
234
+ const validation = attemptCompletionSchema.safeParse({ result: plainTextResult });
235
+ expect(validation.success).toBe(true);
236
+
237
+ // No need for cleanSchemaResponse or validateJsonResponse
238
+ expect(validation.data.result).toBe(plainTextResult);
239
+ });
240
+ });
241
+
242
+ describe('Legacy Compatibility', () => {
243
+ test('should maintain backward compatibility with direct content format', () => {
244
+ // Ensure direct content attempt_completion XML works
245
+ const directXml = `<attempt_completion>
246
+ Task completed successfully.
247
+ </attempt_completion>`;
248
+
249
+ const parsed = parseXmlToolCallWithThinking(directXml);
250
+
251
+ expect(parsed).toBeDefined();
252
+ expect(parsed.toolName).toBe('attempt_completion');
253
+ expect(parsed.params.result).toBe('Task completed successfully.');
254
+ });
255
+
256
+ test('should handle content that includes old-style tags', () => {
257
+ // Content might include old-style tags, which should be treated as content now
258
+ const xmlWithOldTags = `<attempt_completion>
259
+ Task completed.
260
+ <command>npm test</command>
261
+ </attempt_completion>`;
262
+
263
+ const parsed = parseXmlToolCallWithThinking(xmlWithOldTags);
264
+
265
+ expect(parsed).toBeDefined();
266
+ expect(parsed.toolName).toBe('attempt_completion');
267
+ expect(parsed.params.result).toContain('Task completed.');
268
+ expect(parsed.params.result).toContain('<command>npm test</command>');
269
+
270
+ // The result should include everything as content
271
+ const validation = attemptCompletionSchema.safeParse(parsed.params);
272
+ expect(validation.success).toBe(true);
273
+ });
274
+ });