@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,353 @@
1
+ /**
2
+ * Configuration tests for delegate tool
3
+ * Tests the core functionality without mocking complex process spawning
4
+ */
5
+
6
+ import { jest } from '@jest/globals';
7
+
8
+ // Mock just the delegate function itself
9
+ const mockDelegate = jest.fn();
10
+ const mockIsDelegateAvailable = jest.fn(() => Promise.resolve(true));
11
+ jest.unstable_mockModule('../src/delegate.js', () => ({
12
+ delegate: mockDelegate,
13
+ isDelegateAvailable: mockIsDelegateAvailable
14
+ }));
15
+
16
+ // Import after mocking
17
+ const { delegateTool } = await import('../src/tools/vercel.js');
18
+ const { ACPToolManager } = await import('../src/agent/acp/tools.js');
19
+
20
+ describe('Delegate Tool Configuration', () => {
21
+ beforeEach(() => {
22
+ jest.clearAllMocks();
23
+ mockDelegate.mockResolvedValue('Mock delegate response');
24
+ });
25
+
26
+ describe('Vercel AI SDK Tool', () => {
27
+ it('should create delegate tool with correct configuration', () => {
28
+ const tool = delegateTool({ debug: true, timeout: 600 });
29
+
30
+ expect(tool.name).toBe('delegate');
31
+ expect(tool.description).toContain('Automatically delegate');
32
+ expect(tool.description).toContain('agentic loop');
33
+ expect(tool.description).toContain('specialized probe subagents');
34
+ expect(tool.execute).toBeDefined();
35
+ });
36
+
37
+ it('should execute delegate tool with correct parameters', async () => {
38
+ const tool = delegateTool({ debug: true, timeout: 600 });
39
+ const task = 'Analyze security vulnerabilities in authentication code';
40
+
41
+ const result = await tool.execute({ task });
42
+
43
+ // Tool now passes all parameters including defaults
44
+ expect(mockDelegate).toHaveBeenCalledWith({
45
+ task,
46
+ timeout: 600,
47
+ debug: true,
48
+ currentIteration: 0,
49
+ maxIterations: 30,
50
+ parentSessionId: undefined,
51
+ path: undefined, // No cwd or allowedFolders configured
52
+ provider: undefined,
53
+ model: undefined,
54
+ tracer: undefined
55
+ });
56
+
57
+ expect(result).toBe('Mock delegate response');
58
+ });
59
+
60
+ it('should use cwd when path is not specified in call', async () => {
61
+ const tool = delegateTool({
62
+ debug: false,
63
+ timeout: 300,
64
+ cwd: '/project/workspace'
65
+ });
66
+ const task = 'Analyze code in workspace';
67
+
68
+ await tool.execute({ task });
69
+
70
+ expect(mockDelegate).toHaveBeenCalledWith(
71
+ expect.objectContaining({
72
+ task,
73
+ path: '/project/workspace'
74
+ })
75
+ );
76
+ });
77
+
78
+ it('should use allowedFolders[0] when path and cwd are not specified', async () => {
79
+ const tool = delegateTool({
80
+ debug: false,
81
+ timeout: 300,
82
+ allowedFolders: ['/allowed/folder1', '/allowed/folder2']
83
+ });
84
+ const task = 'Search allowed folders';
85
+
86
+ await tool.execute({ task });
87
+
88
+ expect(mockDelegate).toHaveBeenCalledWith(
89
+ expect.objectContaining({
90
+ task,
91
+ path: '/allowed/folder1'
92
+ })
93
+ );
94
+ });
95
+
96
+ it('should prioritize explicit path over cwd', async () => {
97
+ const tool = delegateTool({
98
+ debug: false,
99
+ timeout: 300,
100
+ cwd: '/default/path',
101
+ allowedFolders: ['/allowed/folder']
102
+ });
103
+ const task = 'Search specific path';
104
+
105
+ await tool.execute({ task, path: '/explicit/path' });
106
+
107
+ expect(mockDelegate).toHaveBeenCalledWith(
108
+ expect.objectContaining({
109
+ task,
110
+ path: '/explicit/path'
111
+ })
112
+ );
113
+ });
114
+
115
+ it('should prioritize cwd over allowedFolders', async () => {
116
+ const tool = delegateTool({
117
+ debug: false,
118
+ timeout: 300,
119
+ cwd: '/default/path',
120
+ allowedFolders: ['/allowed/folder']
121
+ });
122
+ const task = 'Use cwd priority';
123
+
124
+ await tool.execute({ task });
125
+
126
+ expect(mockDelegate).toHaveBeenCalledWith(
127
+ expect.objectContaining({
128
+ task,
129
+ path: '/default/path'
130
+ })
131
+ );
132
+ });
133
+
134
+ it('should handle execution errors gracefully', async () => {
135
+ const tool = delegateTool();
136
+ const task = 'Task that will fail';
137
+
138
+ mockDelegate.mockRejectedValue(new Error('Delegation process failed'));
139
+
140
+ // Tool now throws errors instead of returning error strings
141
+ await expect(tool.execute({ task })).rejects.toThrow('Delegation process failed');
142
+ });
143
+ });
144
+
145
+ describe('ACP Tool Manager Integration', () => {
146
+ let toolManager;
147
+ let mockServer;
148
+ let mockProbeAgent;
149
+
150
+ beforeEach(() => {
151
+ mockServer = {
152
+ options: { debug: true },
153
+ sendToolCallProgress: jest.fn()
154
+ };
155
+
156
+ mockProbeAgent = {
157
+ wrappedTools: {
158
+ delegateToolInstance: {
159
+ execute: jest.fn().mockResolvedValue('ACP delegate response')
160
+ }
161
+ },
162
+ sessionId: 'test-session-123'
163
+ };
164
+
165
+ toolManager = new ACPToolManager(mockServer, mockProbeAgent);
166
+ });
167
+
168
+ it('should classify delegate tool as execute kind', () => {
169
+ const toolKind = toolManager.getToolKind('delegate');
170
+ expect(toolKind).toBe('execute');
171
+ });
172
+
173
+ it('should execute delegate tool through ACP with lifecycle tracking', async () => {
174
+ const task = 'Review API security implementations';
175
+
176
+ const result = await toolManager.executeToolCall('test-session', 'delegate', { task });
177
+
178
+ expect(mockProbeAgent.wrappedTools.delegateToolInstance.execute).toHaveBeenCalledWith({
179
+ task,
180
+ sessionId: 'test-session-123'
181
+ });
182
+
183
+ expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
184
+ 'test-session',
185
+ expect.any(String),
186
+ 'pending'
187
+ );
188
+
189
+ expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
190
+ 'test-session',
191
+ expect.any(String),
192
+ 'completed',
193
+ 'ACP delegate response'
194
+ );
195
+
196
+ expect(result).toBe('ACP delegate response');
197
+ });
198
+
199
+ it('should provide delegate tool in definitions', () => {
200
+ const definitions = ACPToolManager.getToolDefinitions();
201
+
202
+ const delegateTool = definitions.find(d => d.name === 'delegate');
203
+ expect(delegateTool).toBeDefined();
204
+ expect(delegateTool.kind).toBe('execute');
205
+ expect(delegateTool.description).toContain('Automatically delegate');
206
+ expect(delegateTool.inputSchema.properties.task).toBeDefined();
207
+ expect(delegateTool.inputSchema.required).toContain('task');
208
+ });
209
+ });
210
+
211
+ describe('XML Parsing and Agentic Usage', () => {
212
+ it('should support XML tool format for AI agents', () => {
213
+ const xmlExamples = [
214
+ '<delegate><task>Analyze authentication code for security vulnerabilities</task></delegate>',
215
+ '<delegate><task>Review database performance and optimization opportunities</task></delegate>',
216
+ '<delegate><task>Examine code structure and maintainability patterns</task></delegate>'
217
+ ];
218
+
219
+ xmlExamples.forEach(xml => {
220
+ expect(xml).toMatch(/<delegate>/);
221
+ expect(xml).toMatch(/<task>.*<\/task>/);
222
+ expect(xml).toMatch(/<\/delegate>/);
223
+
224
+ // Extract task content
225
+ const taskMatch = xml.match(/<task>(.*?)<\/task>/);
226
+ expect(taskMatch).not.toBeNull();
227
+ expect(taskMatch[1].length).toBeGreaterThan(20);
228
+ });
229
+ });
230
+
231
+ it('should demonstrate proper task separation patterns', () => {
232
+ const complexRequest = 'Analyze my application for security, performance, and maintainability';
233
+
234
+ const separatedTasks = [
235
+ 'Analyze all authentication, authorization, and input validation code for security vulnerabilities',
236
+ 'Review database queries, API endpoints, and resource usage for performance bottlenecks',
237
+ 'Examine code structure, design patterns, and documentation for maintainability improvements'
238
+ ];
239
+
240
+ separatedTasks.forEach(task => {
241
+ expect(task.length).toBeGreaterThan(50);
242
+ expect(task).toMatch(/^(Analyze|Review|Examine)/);
243
+
244
+ // Each task should focus on one domain
245
+ const domains = ['security', 'performance', 'maintainability'];
246
+ const matchedDomains = domains.filter(domain =>
247
+ task.toLowerCase().includes(domain) ||
248
+ (domain === 'security' && task.includes('vulnerabilities')) ||
249
+ (domain === 'performance' && task.includes('bottlenecks')) ||
250
+ (domain === 'maintainability' && task.includes('design patterns'))
251
+ );
252
+
253
+ expect(matchedDomains.length).toBeGreaterThanOrEqual(1);
254
+ });
255
+ });
256
+
257
+ it('should validate task self-containment', () => {
258
+ const validTasks = [
259
+ 'Find all SQL injection vulnerabilities in database queries and provide fix recommendations',
260
+ 'Identify memory leaks and performance bottlenecks in async operations',
261
+ 'Review error handling patterns and suggest improvements for better reliability'
262
+ ];
263
+
264
+ validTasks.forEach(task => {
265
+ // Should be actionable
266
+ expect(task).toMatch(/^(Find|Identify|Review|Analyze|Examine|Search)/);
267
+
268
+ // Should be specific
269
+ expect(task.length).toBeGreaterThan(30);
270
+ expect(task.length).toBeLessThan(200);
271
+
272
+ // Should not contain coordination words
273
+ expect(task).not.toMatch(/\band then\b|\bafter that\b|\balso\b/i);
274
+ });
275
+ });
276
+
277
+ it('should handle multi-line tasks in XML', () => {
278
+ const multilineTask = `Review database performance including:
279
+ - Query optimization opportunities
280
+ - Index usage patterns
281
+ - Connection pooling efficiency
282
+ - N+1 query detection`;
283
+
284
+ const xml = `<delegate><task>${multilineTask}</task></delegate>`;
285
+
286
+ expect(xml).toContain('Review database performance');
287
+ expect(xml).toContain('Query optimization');
288
+ expect(xml).toContain('N+1 query detection');
289
+ expect(xml).toMatch(/<delegate><task>[\s\S]*<\/task><\/delegate>/);
290
+ });
291
+ });
292
+
293
+ describe('Iteration Limit Logic', () => {
294
+ it('should test remaining iterations calculation', () => {
295
+ // Test the logic that would be used in the delegate function
296
+ const testCases = [
297
+ { current: 5, max: 20, expected: 15 },
298
+ { current: 25, max: 30, expected: 5 },
299
+ { current: 35, max: 30, expected: 1 }, // Should always allow at least 1
300
+ { current: 0, max: 10, expected: 10 }
301
+ ];
302
+
303
+ testCases.forEach(({ current, max, expected }) => {
304
+ const remaining = Math.max(1, max - current);
305
+ expect(remaining).toBe(expected);
306
+ });
307
+ });
308
+ });
309
+
310
+ describe('Tool Parameters and Schema', () => {
311
+ it('should validate delegate tool parameters', () => {
312
+ // Test parameter validation logic
313
+ const validTasks = [
314
+ 'Analyze code for security issues',
315
+ 'Find performance bottlenecks',
316
+ 'Review error handling'
317
+ ];
318
+
319
+ validTasks.forEach(task => {
320
+ expect(typeof task).toBe('string');
321
+ expect(task.length).toBeGreaterThan(0);
322
+ expect(task.trim()).toBe(task); // No leading/trailing whitespace
323
+ });
324
+
325
+ // Test invalid parameters
326
+ const invalidTasks = [null, undefined, '', 123, {}, []];
327
+
328
+ invalidTasks.forEach(task => {
329
+ expect(typeof task === 'string' && task.length > 0).toBe(false);
330
+ });
331
+ });
332
+
333
+ it('should have correct automatic flag configuration', () => {
334
+ // Test that automatic flags are properly defined
335
+ const expectedFlags = [
336
+ '--prompt-type', 'code-researcher',
337
+ '--no-schema-validation',
338
+ '--no-mermaid-validation'
339
+ ];
340
+
341
+ expectedFlags.forEach(flag => {
342
+ expect(typeof flag).toBe('string');
343
+ expect(flag.length).toBeGreaterThan(0);
344
+ });
345
+
346
+ // Verify flag patterns
347
+ expect('--prompt-type').toMatch(/^--[a-z-]+$/);
348
+ expect('code-researcher').toMatch(/^[a-z-]+$/);
349
+ expect('--no-schema-validation').toMatch(/^--no-[a-z-]+$/);
350
+ expect('--no-mermaid-validation').toMatch(/^--no-[a-z-]+$/);
351
+ });
352
+ });
353
+ });
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Integration tests for delegate tool with Vercel AI SDK and ACP
3
+ */
4
+
5
+ import { jest } from '@jest/globals';
6
+
7
+ // Mock the delegate function
8
+ const mockDelegate = jest.fn();
9
+ const mockIsDelegateAvailable = jest.fn(() => Promise.resolve(true));
10
+ jest.unstable_mockModule('../src/delegate.js', () => ({
11
+ delegate: mockDelegate,
12
+ isDelegateAvailable: mockIsDelegateAvailable
13
+ }));
14
+
15
+ // Mock ProbeAgent to avoid API key requirements
16
+ const mockProbeAgent = jest.fn().mockImplementation((options) => {
17
+ const instance = {
18
+ sessionId: options.sessionId,
19
+ debug: options.debug,
20
+ maxIterations: options.maxIterations,
21
+ currentIteration: 0,
22
+ executeTool: jest.fn()
23
+ };
24
+
25
+ instance.executeTool.mockImplementation(async (toolName, params) => {
26
+ if (toolName === 'delegate') {
27
+ // Simulate ProbeAgent calling delegate with iteration context
28
+ const enhancedParams = {
29
+ ...params,
30
+ currentIteration: instance.currentIteration,
31
+ maxIterations: instance.maxIterations,
32
+ debug: instance.debug
33
+ };
34
+ return await mockDelegate(enhancedParams);
35
+ }
36
+ return `Mock result for ${toolName}`;
37
+ });
38
+
39
+ return instance;
40
+ });
41
+ jest.unstable_mockModule('../src/agent/ProbeAgent.js', () => ({
42
+ ProbeAgent: mockProbeAgent
43
+ }));
44
+
45
+ // Import after mocking
46
+ const { delegateTool } = await import('../src/tools/vercel.js');
47
+ const { ACPToolManager } = await import('../src/agent/acp/tools.js');
48
+ const { ProbeAgent } = await import('../src/agent/ProbeAgent.js');
49
+
50
+ describe('Delegate Tool Integration', () => {
51
+ describe('Vercel AI SDK Integration', () => {
52
+ beforeEach(() => {
53
+ jest.clearAllMocks();
54
+ });
55
+
56
+ afterEach(() => {
57
+ jest.clearAllMocks();
58
+ });
59
+
60
+ it('should create delegate tool with proper schema', () => {
61
+ const tool = delegateTool({ debug: true, timeout: 600 });
62
+
63
+ expect(tool.name).toBe('delegate');
64
+ expect(tool.description).toContain('Automatically delegate');
65
+ expect(tool.description).toContain('agentic loop');
66
+
67
+ // Zod schema should be an object
68
+ expect(tool.inputSchema).toBeDefined();
69
+ expect(typeof tool.inputSchema).toBe('object');
70
+
71
+ // Check that the schema can parse valid input
72
+ const validInput = { task: 'Test task' };
73
+ expect(() => tool.inputSchema.parse(validInput)).not.toThrow();
74
+
75
+ // Check that invalid input throws
76
+ expect(() => tool.inputSchema.parse({})).toThrow(); // Missing required task
77
+ });
78
+
79
+ it('should execute delegate tool with correct parameters', async () => {
80
+ const tool = delegateTool({ debug: true, timeout: 600 });
81
+ const task = 'Analyze security vulnerabilities in authentication code';
82
+
83
+ mockDelegate.mockResolvedValue('Security analysis complete: Found 3 vulnerabilities');
84
+
85
+ const result = await tool.execute({ task });
86
+
87
+ expect(mockDelegate).toHaveBeenCalledWith({
88
+ task,
89
+ timeout: 600,
90
+ debug: true,
91
+ currentIteration: 0,
92
+ maxIterations: 30,
93
+ parentSessionId: undefined,
94
+ path: undefined,
95
+ provider: undefined,
96
+ model: undefined,
97
+ tracer: undefined
98
+ });
99
+
100
+ expect(result).toBe('Security analysis complete: Found 3 vulnerabilities');
101
+ });
102
+
103
+ it('should handle delegate execution errors gracefully', async () => {
104
+ const tool = delegateTool();
105
+ const task = 'Invalid task that will fail';
106
+
107
+ mockDelegate.mockRejectedValue(new Error('Delegation process failed'));
108
+
109
+ // Tool now throws errors instead of returning error strings
110
+ await expect(tool.execute({ task })).rejects.toThrow('Delegation process failed');
111
+ });
112
+
113
+ it('should support XML parsing format', () => {
114
+ // Test that the tool definition supports XML parsing by AI agents
115
+ const tool = delegateTool();
116
+
117
+ // Simulate AI agent parsing XML and converting to tool call
118
+ const xmlInput = '<delegate><task>Find all TODO comments in the codebase</task></delegate>';
119
+ const parsedTask = xmlInput.match(/<task>(.*?)<\/task>/s)?.[1];
120
+
121
+ expect(parsedTask).toBe('Find all TODO comments in the codebase');
122
+
123
+ // This would be how AI agent converts XML to tool call
124
+ const toolCall = {
125
+ name: tool.name,
126
+ arguments: { task: parsedTask }
127
+ };
128
+
129
+ expect(toolCall.name).toBe('delegate');
130
+ expect(toolCall.arguments.task).toBe('Find all TODO comments in the codebase');
131
+ });
132
+ });
133
+
134
+ describe('ACP Tool Manager Integration', () => {
135
+ let toolManager;
136
+ let mockServer;
137
+ let mockProbeAgent;
138
+ let mockDelegate;
139
+
140
+ beforeEach(async () => {
141
+ // Mock server
142
+ mockServer = {
143
+ options: { debug: true },
144
+ sendToolCallProgress: jest.fn()
145
+ };
146
+
147
+ // Mock probe agent with delegate tool
148
+ mockProbeAgent = {
149
+ wrappedTools: {
150
+ delegateToolInstance: {
151
+ execute: jest.fn()
152
+ }
153
+ },
154
+ sessionId: 'test-session-123'
155
+ };
156
+
157
+ toolManager = new ACPToolManager(mockServer, mockProbeAgent);
158
+
159
+ // Mock delegate function
160
+ const delegateModule = await import('../src/delegate.js');
161
+ mockDelegate = delegateModule.delegate;
162
+ });
163
+
164
+ afterEach(() => {
165
+ jest.clearAllMocks();
166
+ });
167
+
168
+ it('should execute delegate tool through ACP with proper lifecycle tracking', async () => {
169
+ const task = 'Review API security implementations';
170
+ const mockResponse = 'API security review completed';
171
+
172
+ mockProbeAgent.wrappedTools.delegateToolInstance.execute.mockResolvedValue(mockResponse);
173
+
174
+ const result = await toolManager.executeToolCall('test-session', 'delegate', { task });
175
+
176
+ // Verify tool execution
177
+ expect(mockProbeAgent.wrappedTools.delegateToolInstance.execute).toHaveBeenCalledWith({
178
+ task,
179
+ sessionId: 'test-session-123'
180
+ });
181
+
182
+ // Verify lifecycle notifications
183
+ expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
184
+ 'test-session',
185
+ expect.any(String),
186
+ 'pending'
187
+ );
188
+
189
+ expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
190
+ 'test-session',
191
+ expect.any(String),
192
+ 'in_progress'
193
+ );
194
+
195
+ expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
196
+ 'test-session',
197
+ expect.any(String),
198
+ 'completed',
199
+ mockResponse
200
+ );
201
+
202
+ expect(result).toBe(mockResponse);
203
+ });
204
+
205
+ it('should classify delegate tool as execute kind', () => {
206
+ const toolKind = toolManager.getToolKind('delegate');
207
+ expect(toolKind).toBe('execute');
208
+ });
209
+
210
+ it('should handle delegate tool failures with proper error reporting', async () => {
211
+ const task = 'Task that will fail';
212
+ const errorMessage = 'Delegation failed: Process terminated unexpectedly';
213
+
214
+ mockProbeAgent.wrappedTools.delegateToolInstance.execute.mockRejectedValue(
215
+ new Error(errorMessage)
216
+ );
217
+
218
+ await expect(
219
+ toolManager.executeToolCall('test-session', 'delegate', { task })
220
+ ).rejects.toThrow(errorMessage);
221
+
222
+ // Verify error was reported through ACP
223
+ expect(mockServer.sendToolCallProgress).toHaveBeenCalledWith(
224
+ 'test-session',
225
+ expect.any(String),
226
+ 'failed',
227
+ null,
228
+ errorMessage
229
+ );
230
+ });
231
+ });
232
+
233
+ describe('ProbeAgent Integration', () => {
234
+ let probeAgent;
235
+ let mockDelegate;
236
+
237
+ beforeEach(async () => {
238
+ // Mock delegate function
239
+ const delegateModule = await import('../src/delegate.js');
240
+ mockDelegate = delegateModule.delegate;
241
+
242
+ // Create probe agent instance
243
+ probeAgent = new ProbeAgent({
244
+ sessionId: 'integration-test-session',
245
+ debug: true,
246
+ maxIterations: 25
247
+ });
248
+ });
249
+
250
+ afterEach(() => {
251
+ jest.clearAllMocks();
252
+ });
253
+
254
+ it('should pass iteration context to delegate tool execution', async () => {
255
+ const task = 'Complex task requiring delegation';
256
+ const expectedResponse = 'Task completed by subagent';
257
+
258
+ mockDelegate.mockResolvedValue(expectedResponse);
259
+
260
+ // Simulate some iterations have already occurred
261
+ probeAgent.currentIteration = 8;
262
+
263
+ // Execute delegate tool through ProbeAgent
264
+ const result = await probeAgent.executeTool('delegate', { task });
265
+
266
+ // Verify delegate was called with iteration context
267
+ expect(mockDelegate).toHaveBeenCalledWith({
268
+ task,
269
+ currentIteration: 8,
270
+ maxIterations: 25,
271
+ debug: true
272
+ });
273
+
274
+ expect(result).toBe(expectedResponse);
275
+ });
276
+
277
+ it('should handle delegate tool when near iteration limit', async () => {
278
+ const task = 'Last minute delegation';
279
+
280
+ mockDelegate.mockResolvedValue('Quick response from subagent');
281
+
282
+ // Set current iteration very close to limit
283
+ probeAgent.currentIteration = 24;
284
+ probeAgent.maxIterations = 25;
285
+
286
+ await probeAgent.executeTool('delegate', { task });
287
+
288
+ // Should still allow delegation but with very limited iterations
289
+ expect(mockDelegate).toHaveBeenCalledWith({
290
+ task,
291
+ currentIteration: 24,
292
+ maxIterations: 25,
293
+ debug: true
294
+ });
295
+ });
296
+ });
297
+
298
+ // Note: Automatic flag verification is covered in delegate.test.js unit tests
299
+
300
+ describe('Agentic Loop Scenarios', () => {
301
+ it('should demonstrate multi-task delegation scenario', async () => {
302
+ // Simulate AI agent receiving complex request and breaking it down
303
+ const complexRequest = 'Analyze my Node.js application for security issues, performance problems, and code quality concerns';
304
+
305
+ const expectedDelegations = [
306
+ 'Analyze all input validation, authentication, authorization, and dependency vulnerabilities in the Node.js application',
307
+ 'Review database queries, async operations, memory usage, and API response times for performance optimization opportunities',
308
+ 'Examine code structure, documentation, test coverage, and maintainability patterns across the application'
309
+ ];
310
+
311
+ // Each delegation should be independent and focused
312
+ expectedDelegations.forEach(task => {
313
+ expect(task.length).toBeGreaterThan(50); // Substantial task
314
+ expect(task).not.toContain('and also'); // Single focus
315
+
316
+ // Verify task is complete and actionable
317
+ if (task.includes('security') || task.includes('vulnerabilities')) {
318
+ expect(task).toMatch(/authentication|authorization|validation|vulnerabilities/);
319
+ } else if (task.includes('performance')) {
320
+ expect(task).toMatch(/database|async|memory|response|optimization/);
321
+ } else if (task.includes('quality') || task.includes('maintainability')) {
322
+ expect(task).toMatch(/structure|documentation|test|maintainability|patterns/);
323
+ }
324
+ });
325
+ });
326
+
327
+ it('should validate task self-containment for parallel execution', () => {
328
+ const tasks = [
329
+ 'Find all SQL injection vulnerabilities in the database layer',
330
+ 'Identify performance bottlenecks in the API endpoints',
331
+ 'Review error handling patterns across all modules'
332
+ ];
333
+
334
+ // Each task should be executable independently
335
+ tasks.forEach(task => {
336
+ // Should have clear scope and action
337
+ expect(task).toMatch(/^(Find|Identify|Review|Analyze|Examine)/);
338
+
339
+ // Should specify domain clearly
340
+ expect(task).toMatch(/(vulnerabilities|bottlenecks|patterns|security|performance|error)/);
341
+
342
+ // Should be specific enough to execute
343
+ expect(task.length).toBeGreaterThan(30);
344
+ expect(task.length).toBeLessThan(200);
345
+ });
346
+ });
347
+ });
348
+ });