@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,400 @@
1
+ import { describe, test, expect, beforeEach, jest } from '@jest/globals';
2
+ import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
3
+ import { delegateTool } from '../../src/tools/vercel.js';
4
+ import { delegate } from '../../src/delegate.js';
5
+
6
+ describe('ProbeAgent enableDelegate option', () => {
7
+ describe('Constructor and initialization', () => {
8
+ test('should default enableDelegate to false', () => {
9
+ const agent = new ProbeAgent({});
10
+ expect(agent.enableDelegate).toBe(false);
11
+ });
12
+
13
+ test('should set enableDelegate to true when explicitly enabled', () => {
14
+ const agent = new ProbeAgent({ enableDelegate: true });
15
+ expect(agent.enableDelegate).toBe(true);
16
+ });
17
+
18
+ test('should set enableDelegate to false when explicitly disabled', () => {
19
+ const agent = new ProbeAgent({ enableDelegate: false });
20
+ expect(agent.enableDelegate).toBe(false);
21
+ });
22
+
23
+ test('should handle truthy values correctly', () => {
24
+ const agent1 = new ProbeAgent({ enableDelegate: 1 });
25
+ expect(agent1.enableDelegate).toBe(true);
26
+
27
+ const agent2 = new ProbeAgent({ enableDelegate: 'true' });
28
+ expect(agent2.enableDelegate).toBe(true);
29
+ });
30
+
31
+ test('should handle falsy values correctly', () => {
32
+ const agent1 = new ProbeAgent({ enableDelegate: 0 });
33
+ expect(agent1.enableDelegate).toBe(false);
34
+
35
+ const agent2 = new ProbeAgent({ enableDelegate: null });
36
+ expect(agent2.enableDelegate).toBe(false);
37
+
38
+ const agent3 = new ProbeAgent({ enableDelegate: undefined });
39
+ expect(agent3.enableDelegate).toBe(false);
40
+ });
41
+ });
42
+
43
+ describe('System message integration', () => {
44
+ test('should include delegate tool definition when enabled', async () => {
45
+ const agent = new ProbeAgent({ enableDelegate: true });
46
+ const systemMessage = await agent.getSystemMessage();
47
+
48
+ expect(systemMessage).toContain('delegate');
49
+ expect(systemMessage).toContain('Delegate big distinct tasks to specialized probe subagents');
50
+ expect(systemMessage).toMatch(/##\s*delegate/);
51
+ });
52
+
53
+ test('should not include delegate tool definition when disabled', async () => {
54
+ const agent = new ProbeAgent({ enableDelegate: false });
55
+ const systemMessage = await agent.getSystemMessage();
56
+
57
+ // Should not contain delegate tool definition section
58
+ expect(systemMessage).not.toMatch(/##\s*delegate/);
59
+ expect(systemMessage).not.toContain('Delegate big distinct tasks to specialized probe subagents');
60
+ });
61
+
62
+ test('should include delegate in available tools list when enabled', async () => {
63
+ const agent = new ProbeAgent({ enableDelegate: true });
64
+ const systemMessage = await agent.getSystemMessage();
65
+
66
+ // Check for delegate in the available tools list
67
+ expect(systemMessage).toContain('- delegate: Delegate big distinct tasks to specialized probe subagents');
68
+ });
69
+
70
+ test('should not include delegate in available tools list when disabled', async () => {
71
+ const agent = new ProbeAgent({ enableDelegate: false });
72
+ const systemMessage = await agent.getSystemMessage();
73
+
74
+ // Should not contain delegate in tools list
75
+ const toolsSection = systemMessage.match(/Available Tools:([\s\S]*?)(?=\n\n|$)/);
76
+ if (toolsSection) {
77
+ expect(toolsSection[1]).not.toContain('- delegate:');
78
+ }
79
+ });
80
+
81
+ test('should work independently from allowEdit option', async () => {
82
+ // Test all combinations
83
+ const agent1 = new ProbeAgent({ enableDelegate: true, allowEdit: false });
84
+ const message1 = await agent1.getSystemMessage();
85
+ expect(message1).toContain('delegate');
86
+ expect(message1).not.toContain('implement');
87
+
88
+ const agent2 = new ProbeAgent({ enableDelegate: false, allowEdit: true });
89
+ const message2 = await agent2.getSystemMessage();
90
+ expect(message2).not.toContain('## delegate');
91
+ expect(message2).toContain('implement');
92
+
93
+ const agent3 = new ProbeAgent({ enableDelegate: true, allowEdit: true });
94
+ const message3 = await agent3.getSystemMessage();
95
+ expect(message3).toContain('delegate');
96
+ expect(message3).toContain('implement');
97
+ });
98
+ });
99
+
100
+ describe('Valid tools array', () => {
101
+ test('should include delegate in validTools when parsing tool calls', async () => {
102
+ const agent = new ProbeAgent({
103
+ enableDelegate: true,
104
+ provider: 'anthropic'
105
+ });
106
+
107
+ // We need to check that delegate is in validTools during answer() execution
108
+ // This is tested indirectly by ensuring the system message is correct
109
+ const systemMessage = await agent.getSystemMessage();
110
+
111
+ // Verify the tool definition exists, which means it should be in validTools
112
+ expect(systemMessage).toContain('## delegate');
113
+ });
114
+
115
+ test('should not include delegate in validTools when disabled', async () => {
116
+ const agent = new ProbeAgent({
117
+ enableDelegate: false,
118
+ provider: 'anthropic'
119
+ });
120
+
121
+ const systemMessage = await agent.getSystemMessage();
122
+
123
+ // Verify the tool definition doesn't exist
124
+ expect(systemMessage).not.toMatch(/##\s*delegate/);
125
+ });
126
+ });
127
+
128
+ describe('Clone functionality', () => {
129
+ test('should preserve enableDelegate setting when cloning', () => {
130
+ const baseAgent = new ProbeAgent({ enableDelegate: true });
131
+ const cloned = baseAgent.clone();
132
+
133
+ expect(cloned.enableDelegate).toBe(true);
134
+ });
135
+
136
+ test('should allow overriding enableDelegate when cloning', () => {
137
+ const baseAgent = new ProbeAgent({ enableDelegate: true });
138
+ const cloned = baseAgent.clone({ overrides: { enableDelegate: false } });
139
+
140
+ expect(baseAgent.enableDelegate).toBe(true);
141
+ expect(cloned.enableDelegate).toBe(false);
142
+ });
143
+
144
+ test('should clone with enableDelegate false by default', () => {
145
+ const baseAgent = new ProbeAgent({ enableDelegate: false });
146
+ const cloned = baseAgent.clone();
147
+
148
+ expect(cloned.enableDelegate).toBe(false);
149
+ });
150
+ });
151
+
152
+ describe('Combined with other options', () => {
153
+ test('should work with custom prompt', async () => {
154
+ const customPrompt = 'You are a specialized code analyzer.';
155
+ const agent = new ProbeAgent({
156
+ enableDelegate: true,
157
+ customPrompt
158
+ });
159
+
160
+ const systemMessage = await agent.getSystemMessage();
161
+
162
+ expect(systemMessage).toContain(customPrompt);
163
+ expect(systemMessage).toContain('delegate');
164
+ });
165
+
166
+ test('should work with different prompt types', async () => {
167
+ const promptTypes = ['code-explorer', 'engineer', 'code-review', 'support', 'architect'];
168
+
169
+ for (const promptType of promptTypes) {
170
+ const agent = new ProbeAgent({
171
+ enableDelegate: true,
172
+ promptType
173
+ });
174
+
175
+ const systemMessage = await agent.getSystemMessage();
176
+ expect(systemMessage).toContain('delegate');
177
+ }
178
+ });
179
+
180
+ test('should work with debug mode', () => {
181
+ const agent = new ProbeAgent({
182
+ enableDelegate: true,
183
+ debug: true
184
+ });
185
+
186
+ expect(agent.enableDelegate).toBe(true);
187
+ expect(agent.debug).toBe(true);
188
+ });
189
+
190
+ test('should work with path configuration', () => {
191
+ const agent = new ProbeAgent({
192
+ enableDelegate: true,
193
+ path: '/test/path'
194
+ });
195
+
196
+ expect(agent.enableDelegate).toBe(true);
197
+ expect(agent.allowedFolders).toContain('/test/path');
198
+ });
199
+ });
200
+
201
+ describe('Type safety', () => {
202
+ test('should handle various input types without errors', () => {
203
+ // String
204
+ expect(() => new ProbeAgent({ enableDelegate: 'yes' })).not.toThrow();
205
+
206
+ // Number
207
+ expect(() => new ProbeAgent({ enableDelegate: 42 })).not.toThrow();
208
+
209
+ // Boolean
210
+ expect(() => new ProbeAgent({ enableDelegate: true })).not.toThrow();
211
+ expect(() => new ProbeAgent({ enableDelegate: false })).not.toThrow();
212
+
213
+ // Null/undefined
214
+ expect(() => new ProbeAgent({ enableDelegate: null })).not.toThrow();
215
+ expect(() => new ProbeAgent({ enableDelegate: undefined })).not.toThrow();
216
+ });
217
+ });
218
+
219
+ describe('System message structure', () => {
220
+ test('should maintain proper tool definition format when delegate is enabled', async () => {
221
+ const agent = new ProbeAgent({ enableDelegate: true });
222
+ const systemMessage = await agent.getSystemMessage();
223
+
224
+ // Check for proper markdown structure
225
+ expect(systemMessage).toMatch(/##\s*delegate/);
226
+ expect(systemMessage).toMatch(/Description:.*delegate/i);
227
+ expect(systemMessage).toMatch(/Parameters:/);
228
+ expect(systemMessage).toContain('task:');
229
+ });
230
+
231
+ test('should place delegate tool in logical position', async () => {
232
+ const agent = new ProbeAgent({ enableDelegate: true });
233
+ const systemMessage = await agent.getSystemMessage();
234
+
235
+ // Delegate should appear after attempt_completion (at the end with optional tools)
236
+ const searchIndex = systemMessage.indexOf('## search');
237
+ const completionIndex = systemMessage.indexOf('## attempt_completion');
238
+ const delegateIndex = systemMessage.indexOf('## delegate');
239
+
240
+ expect(searchIndex).toBeGreaterThan(-1);
241
+ expect(completionIndex).toBeGreaterThan(searchIndex);
242
+ expect(delegateIndex).toBeGreaterThan(completionIndex);
243
+ });
244
+ });
245
+
246
+ describe('Provider inheritance for delegation', () => {
247
+ test('should have apiType as string for all provider types', () => {
248
+ // Test that apiType is always a string identifier
249
+ const providerTypes = ['anthropic', 'openai', 'google', 'bedrock', 'claude-code', 'codex'];
250
+
251
+ for (const providerType of providerTypes) {
252
+ const agent = new ProbeAgent({ provider: providerType });
253
+ // apiType should be set based on provider
254
+ // For providers without API keys, it may fall back to different values
255
+ expect(typeof agent.apiType).toBe('string');
256
+ }
257
+ });
258
+
259
+ test('should store provider as string in clientApiProvider', () => {
260
+ // Verify clientApiProvider stores the string identifier
261
+ const agent = new ProbeAgent({ provider: 'google' });
262
+ expect(agent.clientApiProvider).toBe('google');
263
+
264
+ const agent2 = new ProbeAgent({ provider: 'claude-code' });
265
+ expect(agent2.clientApiProvider).toBe('claude-code');
266
+
267
+ const agent3 = new ProbeAgent({ provider: 'codex' });
268
+ expect(agent3.clientApiProvider).toBe('codex');
269
+ });
270
+
271
+ test('should store claude-code provider in clientApiProvider', () => {
272
+ const agent = new ProbeAgent({ provider: 'claude-code' });
273
+ // clientApiProvider should always store the input provider string
274
+ expect(agent.clientApiProvider).toBe('claude-code');
275
+ });
276
+
277
+ test('should store codex provider in clientApiProvider', () => {
278
+ const agent = new ProbeAgent({ provider: 'codex' });
279
+ // clientApiProvider should always store the input provider string
280
+ expect(agent.clientApiProvider).toBe('codex');
281
+ });
282
+
283
+ test('should have apiType as string type (not function)', () => {
284
+ // Test that apiType is always a string, never a function
285
+ // This is critical for delegation since the delegate tool validates
286
+ // that provider must be a string, null, or undefined
287
+ const agent = new ProbeAgent({});
288
+
289
+ // apiType should always be a string
290
+ expect(typeof agent.apiType).toBe('string');
291
+
292
+ // If provider is set (for non-mock environments), it should be different from apiType
293
+ // apiType = string identifier ('google', 'anthropic', etc.)
294
+ // provider = AI SDK factory function or null
295
+ if (agent.provider !== null && agent.provider !== undefined) {
296
+ // provider is either a function (AI SDK factory) or null
297
+ expect(agent.apiType).not.toBe(agent.provider);
298
+ }
299
+ });
300
+ });
301
+ });
302
+
303
+ describe('Delegate tool validation', () => {
304
+ // These tests focus on the parameter validation in the delegate tool
305
+ // They check that invalid types are rejected immediately before delegation starts
306
+
307
+ test('should reject function as provider', async () => {
308
+ const delegate = delegateTool();
309
+
310
+ await expect(delegate.execute({
311
+ task: 'Test task',
312
+ provider: () => {}, // Function instead of string
313
+ model: 'test-model'
314
+ })).rejects.toThrow('provider must be a string, null, or undefined');
315
+ });
316
+
317
+ test('should reject object as provider', async () => {
318
+ const delegate = delegateTool();
319
+
320
+ await expect(delegate.execute({
321
+ task: 'Test task',
322
+ provider: { name: 'google' }, // Object instead of string
323
+ model: 'test-model'
324
+ })).rejects.toThrow('provider must be a string, null, or undefined');
325
+ });
326
+
327
+ test('should reject number as provider', async () => {
328
+ const delegate = delegateTool();
329
+
330
+ await expect(delegate.execute({
331
+ task: 'Test task',
332
+ provider: 123, // Number instead of string
333
+ model: 'test-model'
334
+ })).rejects.toThrow('provider must be a string, null, or undefined');
335
+ });
336
+
337
+ test('should reject array as provider', async () => {
338
+ const delegate = delegateTool();
339
+
340
+ await expect(delegate.execute({
341
+ task: 'Test task',
342
+ provider: ['google'], // Array instead of string
343
+ model: 'test-model'
344
+ })).rejects.toThrow('provider must be a string, null, or undefined');
345
+ });
346
+
347
+ test('should validate provider type at runtime', () => {
348
+ // The delegate tool schema only defines 'task' as a public parameter.
349
+ // The provider, model, etc. are internal parameters added by ProbeAgent.
350
+ // Runtime validation in the execute function ensures provider is a string.
351
+ // This test verifies the validation works by checking invalid types are rejected.
352
+
353
+ const delegateToolInstance = delegateTool();
354
+
355
+ // The tool should have a task parameter in its schema
356
+ expect(delegateToolInstance).toBeDefined();
357
+ expect(typeof delegateToolInstance.execute).toBe('function');
358
+ });
359
+ });
360
+
361
+ describe('Delegate tracer handling', () => {
362
+ test('should not throw when tracer is missing createDelegationSpan method', async () => {
363
+ // This test ensures that a tracer object without createDelegationSpan method
364
+ // doesn't cause "tracer.createDelegationSpan is not a function" error
365
+ const incompleteTracer = {
366
+ // tracer object without createDelegationSpan
367
+ someOtherMethod: () => {}
368
+ };
369
+
370
+ // The delegate should handle this gracefully and not throw
371
+ // It will fail for other reasons (no task, etc.), but NOT because of tracer
372
+ await expect(delegate({
373
+ task: 'Test task',
374
+ tracer: incompleteTracer
375
+ })).rejects.not.toThrow('createDelegationSpan is not a function');
376
+ });
377
+
378
+ test('should not throw when tracer is an empty object', async () => {
379
+ const emptyTracer = {};
380
+
381
+ await expect(delegate({
382
+ task: 'Test task',
383
+ tracer: emptyTracer
384
+ })).rejects.not.toThrow('createDelegationSpan is not a function');
385
+ });
386
+
387
+ test('should not throw when tracer is null', async () => {
388
+ await expect(delegate({
389
+ task: 'Test task',
390
+ tracer: null
391
+ })).rejects.not.toThrow('createDelegationSpan is not a function');
392
+ });
393
+
394
+ test('should not throw when tracer is undefined', async () => {
395
+ await expect(delegate({
396
+ task: 'Test task',
397
+ tracer: undefined
398
+ })).rejects.not.toThrow('createDelegationSpan is not a function');
399
+ });
400
+ });
@@ -0,0 +1,118 @@
1
+ import { describe, test, expect, beforeEach, afterEach } from '@jest/globals';
2
+ import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
3
+
4
+ describe('ProbeAgent model option', () => {
5
+ let originalModelName;
6
+
7
+ beforeEach(() => {
8
+ // Save original MODEL_NAME environment variable
9
+ originalModelName = process.env.MODEL_NAME;
10
+ });
11
+
12
+ afterEach(() => {
13
+ // Restore original MODEL_NAME
14
+ if (originalModelName === undefined) {
15
+ delete process.env.MODEL_NAME;
16
+ } else {
17
+ process.env.MODEL_NAME = originalModelName;
18
+ }
19
+ });
20
+
21
+ test('should store model option in constructor', () => {
22
+ const agent = new ProbeAgent({
23
+ model: 'custom-model-123',
24
+ path: process.cwd()
25
+ });
26
+
27
+ expect(agent.clientApiModel).toBe('custom-model-123');
28
+ });
29
+
30
+ test('should default to null when no model option provided', () => {
31
+ const agent = new ProbeAgent({
32
+ path: process.cwd()
33
+ });
34
+
35
+ expect(agent.clientApiModel).toBeNull();
36
+ });
37
+
38
+ test('should use model option over MODEL_NAME environment variable', () => {
39
+ process.env.MODEL_NAME = 'env-model';
40
+
41
+ const agent = new ProbeAgent({
42
+ model: 'option-model',
43
+ path: process.cwd()
44
+ });
45
+
46
+ expect(agent.clientApiModel).toBe('option-model');
47
+ // The actual model name would be set during initializeModel()
48
+ // which uses clientApiModel || process.env.MODEL_NAME
49
+ });
50
+
51
+ test('should fall back to MODEL_NAME when model option not provided', () => {
52
+ process.env.MODEL_NAME = 'env-model';
53
+
54
+ const agent = new ProbeAgent({
55
+ path: process.cwd()
56
+ });
57
+
58
+ expect(agent.clientApiModel).toBeNull();
59
+ // initializeModel() would use process.env.MODEL_NAME as fallback
60
+ });
61
+
62
+ test('should preserve model option in clone', () => {
63
+ const baseAgent = new ProbeAgent({
64
+ model: 'original-model',
65
+ path: process.cwd()
66
+ });
67
+
68
+ const cloned = baseAgent.clone();
69
+
70
+ // The clone should preserve the user's model preference (clientApiModel)
71
+ expect(cloned.clientApiModel).toBe(baseAgent.clientApiModel);
72
+ expect(cloned.clientApiModel).toBe('original-model');
73
+ // Both should resolve to the same actual model
74
+ expect(cloned.model).toBe('original-model');
75
+ });
76
+
77
+ test('should preserve absence of model option in clone', () => {
78
+ const baseAgent = new ProbeAgent({
79
+ path: process.cwd()
80
+ // No model specified
81
+ });
82
+
83
+ const cloned = baseAgent.clone();
84
+
85
+ // The clone should not have a model preference either
86
+ expect(cloned.clientApiModel).toBeNull();
87
+ expect(baseAgent.clientApiModel).toBeNull();
88
+ // Both should use the default mock model
89
+ expect(cloned.model).toBe('mock-model');
90
+ expect(baseAgent.model).toBe('mock-model');
91
+ });
92
+
93
+ test('should allow override of model option in clone', () => {
94
+ const baseAgent = new ProbeAgent({
95
+ model: 'original-model',
96
+ path: process.cwd()
97
+ });
98
+
99
+ const cloned = baseAgent.clone({
100
+ overrides: {
101
+ model: 'cloned-model'
102
+ }
103
+ });
104
+
105
+ // The clone should have the overridden model stored in clientApiModel
106
+ expect(cloned.clientApiModel).toBe('cloned-model');
107
+ });
108
+
109
+ test('should handle empty string model option', () => {
110
+ const agent = new ProbeAgent({
111
+ model: '',
112
+ path: process.cwd()
113
+ });
114
+
115
+ // Empty string is falsy, so it becomes null due to || operator
116
+ expect(agent.clientApiModel).toBeNull();
117
+ });
118
+ });