@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,476 @@
1
+ import { describe, test, expect, beforeEach } from '@jest/globals';
2
+ import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
3
+
4
+ describe('ProbeAgent.clone()', () => {
5
+ let baseAgent;
6
+
7
+ beforeEach(async () => {
8
+ baseAgent = new ProbeAgent({
9
+ sessionId: 'test-base',
10
+ path: process.cwd(),
11
+ debug: false
12
+ });
13
+
14
+ // Don't initialize - we'll manually set history for testing
15
+ });
16
+
17
+ describe('Basic Cloning', () => {
18
+ test('should clone agent with same configuration', () => {
19
+ baseAgent.history = [
20
+ { role: 'system', content: 'You are a helpful assistant' },
21
+ { role: 'user', content: 'Hello' },
22
+ { role: 'assistant', content: 'Hi there!' }
23
+ ];
24
+
25
+ const cloned = baseAgent.clone();
26
+
27
+ expect(cloned).toBeInstanceOf(ProbeAgent);
28
+ expect(cloned.sessionId).not.toBe(baseAgent.sessionId);
29
+ expect(cloned.history).toHaveLength(3);
30
+ expect(cloned.allowedFolders).toEqual(baseAgent.allowedFolders);
31
+ });
32
+
33
+ test('should use custom session ID when provided', () => {
34
+ baseAgent.history = [
35
+ { role: 'system', content: 'System' }
36
+ ];
37
+
38
+ const cloned = baseAgent.clone({
39
+ sessionId: 'custom-session-id'
40
+ });
41
+
42
+ expect(cloned.sessionId).toBe('custom-session-id');
43
+ });
44
+
45
+ test('should deep copy history by default', () => {
46
+ baseAgent.history = [
47
+ { role: 'system', content: 'System' },
48
+ { role: 'user', content: 'Test' }
49
+ ];
50
+
51
+ const cloned = baseAgent.clone();
52
+
53
+ // Modify cloned history
54
+ cloned.history[1].content = 'Modified';
55
+
56
+ // Original should be unchanged
57
+ expect(baseAgent.history[1].content).toBe('Test');
58
+ });
59
+
60
+ test('should shallow copy when deepCopy is false', () => {
61
+ baseAgent.history = [
62
+ { role: 'user', content: 'Test' }
63
+ ];
64
+
65
+ const cloned = baseAgent.clone({ deepCopy: false });
66
+
67
+ // Arrays are different
68
+ expect(cloned.history).not.toBe(baseAgent.history);
69
+
70
+ // But they share the same objects
71
+ expect(cloned.history[0]).toBe(baseAgent.history[0]);
72
+ });
73
+ });
74
+
75
+ describe('Internal Message Filtering', () => {
76
+ test('should truncate at first schema reminder message', () => {
77
+ baseAgent.history = [
78
+ { role: 'system', content: 'System' },
79
+ { role: 'user', content: 'List functions' },
80
+ { role: 'assistant', content: 'Here are the functions...' },
81
+ {
82
+ role: 'user',
83
+ content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\nYour response must conform to this schema: {...}'
84
+ },
85
+ { role: 'assistant', content: '{"functions": [...]}' }
86
+ ];
87
+
88
+ const cloned = baseAgent.clone({
89
+ stripInternalMessages: true
90
+ });
91
+
92
+ // Should truncate at the schema reminder (index 3), removing everything from there
93
+ expect(cloned.history).toHaveLength(3); // system + 2 messages before schema
94
+ expect(cloned.history.some(m => m.content && m.content.includes('IMPORTANT: A schema was provided'))).toBe(false);
95
+ expect(cloned.history.some(m => m.content && m.content.includes('{"functions":'))).toBe(false); // Assistant response after schema also removed
96
+
97
+ // Verify what remains
98
+ expect(cloned.history[0].role).toBe('system');
99
+ expect(cloned.history[1].content).toBe('List functions');
100
+ expect(cloned.history[2].content).toBe('Here are the functions...');
101
+ });
102
+
103
+ test('should strip tool use reminder messages', () => {
104
+ baseAgent.history = [
105
+ { role: 'system', content: 'System' },
106
+ { role: 'user', content: 'Search for files' },
107
+ { role: 'assistant', content: 'I will search...' },
108
+ {
109
+ role: 'user',
110
+ content: 'Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information.\n\nRemember: Use proper XML format with BOTH opening and closing tags:\n\n<tool_name>\n<parameter>value</parameter>\n</tool_name>'
111
+ },
112
+ { role: 'assistant', content: '<search><query>files</query></search>' }
113
+ ];
114
+
115
+ const cloned = baseAgent.clone({
116
+ stripInternalMessages: true
117
+ });
118
+
119
+ // Should remove the tool reminder (index 3)
120
+ expect(cloned.history).toHaveLength(4);
121
+ expect(cloned.history.some(m => m.content.includes('Please use one of the available tools'))).toBe(false);
122
+ });
123
+
124
+ test('should strip mermaid fix prompts', () => {
125
+ baseAgent.history = [
126
+ { role: 'system', content: 'System' },
127
+ { role: 'user', content: 'Create a diagram' },
128
+ { role: 'assistant', content: 'graph TD\nA -> B' },
129
+ {
130
+ role: 'user',
131
+ content: 'The mermaid diagram in your response has syntax errors. Please fix the mermaid syntax errors.\n\nHere is the corrected version:\n```mermaid\ngraph TD\nA --> B\n```'
132
+ },
133
+ { role: 'assistant', content: 'Fixed diagram' }
134
+ ];
135
+
136
+ const cloned = baseAgent.clone({
137
+ stripInternalMessages: true
138
+ });
139
+
140
+ // Should remove the mermaid fix prompt (index 3)
141
+ expect(cloned.history).toHaveLength(4);
142
+ expect(cloned.history.some(m => m.content.includes('mermaid diagram in your response has syntax errors'))).toBe(false);
143
+ });
144
+
145
+ test('should strip JSON correction prompts', () => {
146
+ baseAgent.history = [
147
+ { role: 'system', content: 'System' },
148
+ { role: 'user', content: 'Generate JSON' },
149
+ { role: 'assistant', content: 'Invalid JSON' },
150
+ {
151
+ role: 'user',
152
+ content: 'Your response does not match the expected JSON schema. Please provide a valid JSON response.\n\nSchema validation error: ...'
153
+ },
154
+ { role: 'assistant', content: '{"valid": true}' }
155
+ ];
156
+
157
+ const cloned = baseAgent.clone({
158
+ stripInternalMessages: true
159
+ });
160
+
161
+ // Should remove the JSON correction prompt (index 3)
162
+ expect(cloned.history).toHaveLength(4);
163
+ expect(cloned.history.some(m => m.content.includes('does not match the expected JSON schema'))).toBe(false);
164
+ });
165
+
166
+ test('should truncate at CRITICAL schema formatting prompt', () => {
167
+ baseAgent.history = [
168
+ { role: 'system', content: 'System' },
169
+ { role: 'user', content: 'Generate report' },
170
+ { role: 'assistant', content: 'Here is my report' },
171
+ {
172
+ role: 'user',
173
+ content: 'CRITICAL: You MUST respond with ONLY valid JSON DATA that conforms to this schema structure. DO NOT return the schema definition itself.\n\nSchema to follow (this is just the structure - provide ACTUAL DATA):\n{"type": "object", "properties": {...}}'
174
+ },
175
+ { role: 'assistant', content: '{"report": "data"}' }
176
+ ];
177
+
178
+ const cloned = baseAgent.clone({
179
+ stripInternalMessages: true
180
+ });
181
+
182
+ // Should truncate at CRITICAL message (index 3), removing it and everything after
183
+ expect(cloned.history).toHaveLength(3); // system + 2 messages before CRITICAL
184
+ expect(cloned.history.some(m => m.content && m.content.includes('CRITICAL: You MUST respond with ONLY valid JSON DATA'))).toBe(false);
185
+ expect(cloned.history.some(m => m.content && m.content.includes('Schema to follow (this is just the structure'))).toBe(false);
186
+ expect(cloned.history.some(m => m.content && m.content.includes('{"report": "data"}'))).toBe(false); // Assistant response after CRITICAL also removed
187
+ });
188
+
189
+ test('should keep all messages when stripInternalMessages is false', () => {
190
+ baseAgent.history = [
191
+ { role: 'system', content: 'System' },
192
+ { role: 'user', content: 'Test' },
193
+ { role: 'user', content: 'IMPORTANT: A schema was provided. You MUST respond...' },
194
+ { role: 'assistant', content: 'Response' }
195
+ ];
196
+
197
+ const cloned = baseAgent.clone({
198
+ stripInternalMessages: false
199
+ });
200
+
201
+ // Should keep all messages including internal ones
202
+ expect(cloned.history).toHaveLength(4);
203
+ expect(cloned.history.some(m => m.content.includes('IMPORTANT: A schema was provided'))).toBe(true);
204
+ });
205
+
206
+ test('should only detect schema messages from user role', () => {
207
+ baseAgent.history = [
208
+ { role: 'system', content: 'IMPORTANT: A schema was provided' }, // Not detected (system)
209
+ { role: 'assistant', content: 'IMPORTANT: A schema was provided' }, // Not detected (assistant)
210
+ { role: 'user', content: 'Regular question' },
211
+ { role: 'user', content: 'IMPORTANT: A schema was provided' } // Detected - truncate from here
212
+ ];
213
+
214
+ const cloned = baseAgent.clone({
215
+ stripInternalMessages: true
216
+ });
217
+
218
+ // Should truncate at the user schema message (index 3)
219
+ expect(cloned.history).toHaveLength(3); // system + assistant + user question
220
+ expect(cloned.history[0].role).toBe('system');
221
+ expect(cloned.history[0].content).toContain('IMPORTANT'); // System message kept even with similar text
222
+ expect(cloned.history[1].role).toBe('assistant');
223
+ expect(cloned.history[2].content).toBe('Regular question');
224
+ });
225
+ });
226
+
227
+ describe('System Message Handling', () => {
228
+ test('should keep system message by default', () => {
229
+ baseAgent.history = [
230
+ { role: 'system', content: 'You are a helpful assistant' },
231
+ { role: 'user', content: 'Hello' }
232
+ ];
233
+
234
+ const cloned = baseAgent.clone();
235
+
236
+ expect(cloned.history[0].role).toBe('system');
237
+ expect(cloned.history[0].content).toBe('You are a helpful assistant');
238
+ });
239
+
240
+ test('should remove system message when keepSystemMessage is false', () => {
241
+ baseAgent.history = [
242
+ { role: 'system', content: 'You are a helpful assistant' },
243
+ { role: 'user', content: 'Hello' },
244
+ { role: 'assistant', content: 'Hi!' }
245
+ ];
246
+
247
+ const cloned = baseAgent.clone({
248
+ keepSystemMessage: false
249
+ });
250
+
251
+ expect(cloned.history).toHaveLength(2);
252
+ expect(cloned.history[0].role).toBe('user');
253
+ });
254
+ });
255
+
256
+ describe('Configuration Overrides', () => {
257
+ test('should override configuration with provided options', () => {
258
+ baseAgent.debug = false;
259
+ baseAgent.allowEdit = false;
260
+ baseAgent.maxIterations = 30;
261
+
262
+ const cloned = baseAgent.clone({
263
+ overrides: {
264
+ debug: true,
265
+ allowEdit: true,
266
+ maxIterations: 50
267
+ }
268
+ });
269
+
270
+ expect(cloned.debug).toBe(true);
271
+ expect(cloned.allowEdit).toBe(true);
272
+ expect(cloned.maxIterations).toBe(50);
273
+ });
274
+
275
+ test('should allow changing promptType via overrides', () => {
276
+ baseAgent.promptType = 'code-explorer';
277
+
278
+ const cloned = baseAgent.clone({
279
+ overrides: {
280
+ promptType: 'architect'
281
+ }
282
+ });
283
+
284
+ expect(cloned.promptType).toBe('architect');
285
+ });
286
+
287
+ test('should preserve non-overridden configuration', () => {
288
+ baseAgent.outline = true;
289
+ baseAgent.maxResponseTokens = 2000;
290
+
291
+ const cloned = baseAgent.clone({
292
+ overrides: {
293
+ debug: true
294
+ }
295
+ });
296
+
297
+ expect(cloned.outline).toBe(true);
298
+ expect(cloned.maxResponseTokens).toBe(2000);
299
+ });
300
+ });
301
+
302
+ describe('Complex History Scenarios', () => {
303
+ test('should handle mixed internal and regular messages', () => {
304
+ baseAgent.history = [
305
+ { role: 'system', content: 'System' },
306
+ { role: 'user', content: 'Question 1' },
307
+ { role: 'assistant', content: 'Answer 1' },
308
+ { role: 'user', content: 'Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information.\n\nRemember: Use proper XML format with BOTH opening and closing tags:' }, // Internal
309
+ { role: 'assistant', content: 'Tool call' },
310
+ { role: 'user', content: 'Question 2' },
311
+ { role: 'assistant', content: 'Answer 2' },
312
+ { role: 'user', content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.' }, // Internal
313
+ { role: 'assistant', content: 'Schema response' }
314
+ ];
315
+
316
+ const cloned = baseAgent.clone({
317
+ stripInternalMessages: true
318
+ });
319
+
320
+ // Truncates at schema (index 7), keeps 0-6
321
+ // Then filters tool reminder at index 3
322
+ // Result: 6 messages (1 system + 2 user + 3 assistant)
323
+ expect(cloned.history).toHaveLength(6);
324
+ expect(cloned.history.filter(m => m.role === 'user')).toHaveLength(2);
325
+ expect(cloned.history.filter(m => m.role === 'assistant')).toHaveLength(3);
326
+ });
327
+
328
+ test('should handle empty history', () => {
329
+ baseAgent.history = [];
330
+
331
+ const cloned = baseAgent.clone();
332
+
333
+ expect(cloned.history).toHaveLength(0);
334
+ });
335
+
336
+ test('should handle history with only system message', () => {
337
+ baseAgent.history = [
338
+ { role: 'system', content: 'System only' }
339
+ ];
340
+
341
+ const cloned = baseAgent.clone();
342
+
343
+ expect(cloned.history).toHaveLength(1);
344
+ expect(cloned.history[0].role).toBe('system');
345
+ });
346
+
347
+ test('should handle messages with complex content structure', () => {
348
+ baseAgent.history = [
349
+ { role: 'system', content: 'System' },
350
+ {
351
+ role: 'user',
352
+ content: [
353
+ { type: 'text', text: 'Hello' },
354
+ { type: 'image', image: 'base64...' }
355
+ ]
356
+ },
357
+ { role: 'assistant', content: 'Response' }
358
+ ];
359
+
360
+ const cloned = baseAgent.clone();
361
+
362
+ expect(cloned.history).toHaveLength(3);
363
+ expect(Array.isArray(cloned.history[1].content)).toBe(true);
364
+ });
365
+ });
366
+
367
+ describe('Cache Efficiency', () => {
368
+ test('should preserve system message for cache efficiency', () => {
369
+ baseAgent.history = [
370
+ { role: 'system', content: 'Long expensive system prompt...' },
371
+ { role: 'user', content: 'Q1' },
372
+ { role: 'assistant', content: 'A1' },
373
+ { role: 'user', content: 'IMPORTANT: A schema was provided...' }, // Internal
374
+ { role: 'assistant', content: 'A2' }
375
+ ];
376
+
377
+ const cloned = baseAgent.clone();
378
+
379
+ // System message should be at index 0 for cache efficiency
380
+ expect(cloned.history[0].role).toBe('system');
381
+ expect(cloned.history[0].content).toBe('Long expensive system prompt...');
382
+
383
+ // Internal message should be removed
384
+ expect(cloned.history.some(m =>
385
+ m.content && m.content.includes('IMPORTANT: A schema was provided')
386
+ )).toBe(false);
387
+ });
388
+ });
389
+
390
+ describe('Edge Cases', () => {
391
+ test('should handle null content', () => {
392
+ baseAgent.history = [
393
+ { role: 'system', content: 'System' },
394
+ { role: 'user', content: null },
395
+ { role: 'assistant', content: 'Response' }
396
+ ];
397
+
398
+ const cloned = baseAgent.clone();
399
+
400
+ expect(cloned.history).toHaveLength(3);
401
+ });
402
+
403
+ test('should handle undefined content', () => {
404
+ baseAgent.history = [
405
+ { role: 'system', content: 'System' },
406
+ { role: 'user', content: undefined },
407
+ { role: 'assistant', content: 'Response' }
408
+ ];
409
+
410
+ const cloned = baseAgent.clone();
411
+
412
+ expect(cloned.history).toHaveLength(3);
413
+ });
414
+
415
+ test('should handle messages with empty content', () => {
416
+ baseAgent.history = [
417
+ { role: 'system', content: 'System' },
418
+ { role: 'user', content: '' },
419
+ { role: 'assistant', content: 'Response' }
420
+ ];
421
+
422
+ const cloned = baseAgent.clone();
423
+
424
+ expect(cloned.history).toHaveLength(3);
425
+ });
426
+ });
427
+
428
+ describe('Multiple Clones', () => {
429
+ test('should allow creating multiple independent clones', () => {
430
+ baseAgent.history = [
431
+ { role: 'system', content: 'System' },
432
+ { role: 'user', content: 'Test' }
433
+ ];
434
+
435
+ const clone1 = baseAgent.clone({ sessionId: 'clone1' });
436
+ const clone2 = baseAgent.clone({ sessionId: 'clone2' });
437
+ const clone3 = baseAgent.clone({ sessionId: 'clone3' });
438
+
439
+ // All should have independent histories
440
+ clone1.history.push({ role: 'user', content: 'Clone1' });
441
+ clone2.history.push({ role: 'user', content: 'Clone2' });
442
+ clone3.history.push({ role: 'user', content: 'Clone3' });
443
+
444
+ expect(clone1.history).toHaveLength(3);
445
+ expect(clone2.history).toHaveLength(3);
446
+ expect(clone3.history).toHaveLength(3);
447
+ expect(baseAgent.history).toHaveLength(2); // Unchanged
448
+
449
+ expect(clone1.history[2].content).toBe('Clone1');
450
+ expect(clone2.history[2].content).toBe('Clone2');
451
+ expect(clone3.history[2].content).toBe('Clone3');
452
+ });
453
+
454
+ test('should allow chaining clones', () => {
455
+ baseAgent.history = [
456
+ { role: 'system', content: 'System' },
457
+ { role: 'user', content: 'Q1' },
458
+ { role: 'assistant', content: 'A1' }
459
+ ];
460
+
461
+ const clone1 = baseAgent.clone({ sessionId: 'gen1' });
462
+ clone1.history.push({ role: 'user', content: 'Q2' });
463
+ clone1.history.push({ role: 'assistant', content: 'A2' });
464
+
465
+ const clone2 = clone1.clone({ sessionId: 'gen2' });
466
+ clone2.history.push({ role: 'user', content: 'Q3' });
467
+
468
+ const clone3 = clone2.clone({ sessionId: 'gen3' });
469
+
470
+ expect(baseAgent.history).toHaveLength(3);
471
+ expect(clone1.history).toHaveLength(5);
472
+ expect(clone2.history).toHaveLength(6);
473
+ expect(clone3.history).toHaveLength(6);
474
+ });
475
+ });
476
+ });