@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,643 @@
1
+ import { describe, test, expect, beforeEach } from '@jest/globals';
2
+ import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
3
+
4
+ /**
5
+ * Realistic integration test for clone() method
6
+ * Simulates a real conversation with schema, mermaid fixes, tool reminders, etc.
7
+ */
8
+ describe('ProbeAgent.clone() - Realistic Integration', () => {
9
+ let baseAgent;
10
+
11
+ beforeEach(() => {
12
+ baseAgent = new ProbeAgent({
13
+ sessionId: 'realistic-test',
14
+ path: process.cwd(),
15
+ debug: false
16
+ });
17
+ });
18
+
19
+ test('should clean a realistic session with all types of internal messages', () => {
20
+ // Simulate a realistic conversation with schema, mermaid, and multiple reminders
21
+ baseAgent.history = [
22
+ // 1. System message (should be kept)
23
+ {
24
+ role: 'system',
25
+ content: 'You are a helpful AI coding assistant with access to code search tools.'
26
+ },
27
+
28
+ // 2. User's first question
29
+ {
30
+ role: 'user',
31
+ content: 'Analyze the authentication system and create a diagram'
32
+ },
33
+
34
+ // 3. Assistant starts working
35
+ {
36
+ role: 'assistant',
37
+ content: 'I\'ll analyze the authentication system for you.\n\n<search>\n<query>authentication login</query>\n</search>'
38
+ },
39
+
40
+ // 4. Tool reminder (should be stripped)
41
+ {
42
+ role: 'user',
43
+ 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>'
44
+ },
45
+
46
+ // 5. Assistant uses tool
47
+ {
48
+ role: 'assistant',
49
+ content: '<search>\n<query>auth</query>\n</search>'
50
+ },
51
+
52
+ // 6. User provides tool result
53
+ {
54
+ role: 'user',
55
+ content: 'Found 15 results for "auth":\n\n1. src/auth/login.js - Login handler\n2. src/auth/token.js - JWT token management'
56
+ },
57
+
58
+ // 7. Assistant creates a mermaid diagram (with errors)
59
+ {
60
+ role: 'assistant',
61
+ content: 'Here\'s the authentication flow:\n\n```mermaid\ngraph TD\nA -> B\nC -> D\n```'
62
+ },
63
+
64
+ // 8. Mermaid fix prompt (should be stripped)
65
+ {
66
+ role: 'user',
67
+ 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\nC --> D\n```'
68
+ },
69
+
70
+ // 9. Assistant fixes mermaid
71
+ {
72
+ role: 'assistant',
73
+ content: 'Thank you, here\'s the corrected diagram:\n\n```mermaid\ngraph TD\nA --> B\nC --> D\n```'
74
+ },
75
+
76
+ // 10. User asks for structured output
77
+ {
78
+ role: 'user',
79
+ content: 'Now provide a security analysis in JSON format'
80
+ },
81
+
82
+ // 11. Assistant responds (not matching schema)
83
+ {
84
+ role: 'assistant',
85
+ content: 'Here is my analysis: The authentication system looks good.'
86
+ },
87
+
88
+ // 12. Schema reminder (should be stripped)
89
+ {
90
+ role: 'user',
91
+ content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\n\nYour response must conform to this schema:\n{\n "type": "object",\n "properties": {\n "vulnerabilities": { "type": "array" },\n "recommendations": { "type": "array" }\n }\n}'
92
+ },
93
+
94
+ // 13. Assistant provides structured response
95
+ {
96
+ role: 'assistant',
97
+ content: '{\n "vulnerabilities": ["No password hashing detected"],\n "recommendations": ["Implement bcrypt for password hashing"]\n}'
98
+ },
99
+
100
+ // 14. Another tool reminder (should be stripped)
101
+ {
102
+ role: 'user',
103
+ 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>\n\nOr for quick completion if your previous response was already correct and complete:\n<attempt_complete>\n\nIMPORTANT: When using <attempt_complete>, this must be the ONLY content in your response.'
104
+ },
105
+
106
+ // 15. Assistant completes
107
+ {
108
+ role: 'assistant',
109
+ content: '<attempt_completion>\nI\'ve completed the security analysis of the authentication system.\n</attempt_completion>'
110
+ },
111
+
112
+ // 16. User asks another question
113
+ {
114
+ role: 'user',
115
+ content: 'What about the authorization system?'
116
+ },
117
+
118
+ // 17. Assistant responds
119
+ {
120
+ role: 'assistant',
121
+ content: 'Let me search for authorization code.\n\n<search>\n<query>authorization permissions</query>\n</search>'
122
+ },
123
+
124
+ // 18. JSON correction prompt (should be stripped)
125
+ {
126
+ role: 'user',
127
+ content: 'Your response does not match the expected JSON schema. Please provide a valid JSON response.\n\nSchema validation error: Expected object with "status" field'
128
+ },
129
+
130
+ // 19. Assistant fixes JSON
131
+ {
132
+ role: 'assistant',
133
+ content: '{\n "status": "analyzing",\n "findings": []\n}'
134
+ }
135
+ ];
136
+
137
+ // Clone with default settings (strip internal messages)
138
+ const clonedAgent = baseAgent.clone({
139
+ stripInternalMessages: true
140
+ });
141
+
142
+ // Verify the clone has cleaned history
143
+ expect(clonedAgent.history.length).toBeLessThan(baseAgent.history.length);
144
+
145
+ // Count message types in original
146
+ const originalUserMessages = baseAgent.history.filter(m => m.role === 'user').length;
147
+ const originalAssistantMessages = baseAgent.history.filter(m => m.role === 'assistant').length;
148
+ const originalSystemMessages = baseAgent.history.filter(m => m.role === 'system').length;
149
+
150
+ console.log(`\n📊 Original history: ${baseAgent.history.length} messages`);
151
+ console.log(` - System: ${originalSystemMessages}`);
152
+ console.log(` - User: ${originalUserMessages}`);
153
+ console.log(` - Assistant: ${originalAssistantMessages}`);
154
+
155
+ // Count message types in clone
156
+ const clonedUserMessages = clonedAgent.history.filter(m => m.role === 'user').length;
157
+ const clonedAssistantMessages = clonedAgent.history.filter(m => m.role === 'assistant').length;
158
+ const clonedSystemMessages = clonedAgent.history.filter(m => m.role === 'system').length;
159
+
160
+ console.log(`\n📊 Cloned history: ${clonedAgent.history.length} messages`);
161
+ console.log(` - System: ${clonedSystemMessages}`);
162
+ console.log(` - User: ${clonedUserMessages}`);
163
+ console.log(` - Assistant: ${clonedAssistantMessages}`);
164
+
165
+ // Verify expectations
166
+ // Original: 19 messages (1 system, 9 user, 9 assistant)
167
+ expect(baseAgent.history).toHaveLength(19);
168
+ expect(originalSystemMessages).toBe(1);
169
+ expect(originalUserMessages).toBe(9);
170
+ expect(originalAssistantMessages).toBe(9);
171
+
172
+ // New truncation behavior: Find FIRST schema message (index 11) and truncate from there
173
+ // Messages before index 11:
174
+ // 0: system, 1: user, 2: assistant, 3: user (tool reminder - REMOVED), 4: assistant,
175
+ // 5: user (tool result), 6: assistant, 7: user (mermaid fix - REMOVED), 8: assistant,
176
+ // 9: user, 10: assistant
177
+ // 11: FIRST SCHEMA MESSAGE → truncate from here
178
+ // After truncation and removing non-schema internal messages (tool reminder at 3, mermaid at 7):
179
+ // System + 2 real user messages + 1 tool result + 5 assistant responses = 9 total
180
+ expect(clonedAgent.history).toHaveLength(9);
181
+ expect(clonedSystemMessages).toBe(1);
182
+ expect(clonedUserMessages).toBe(3); // 2 real questions + 1 tool result
183
+ expect(clonedAssistantMessages).toBe(5); // Assistant responses before schema
184
+
185
+ // Verify system message is preserved
186
+ expect(clonedAgent.history[0].role).toBe('system');
187
+ expect(clonedAgent.history[0].content).toContain('helpful AI coding assistant');
188
+
189
+ // Verify real user questions are kept (before schema truncation)
190
+ const userContents = clonedAgent.history
191
+ .filter(m => m.role === 'user')
192
+ .map(m => m.content);
193
+
194
+ expect(userContents).toContain('Analyze the authentication system and create a diagram');
195
+ expect(userContents.some(c => c.includes('Found 15 results'))).toBe(true); // Tool result
196
+ expect(userContents).toContain('Now provide a security analysis in JSON format');
197
+
198
+ // Verify internal messages are NOT in clone
199
+ const allContent = clonedAgent.history.map(m => m.content).join('\n');
200
+
201
+ expect(allContent).not.toContain('IMPORTANT: A schema was provided');
202
+ expect(allContent).not.toContain('Please use one of the available tools');
203
+ expect(allContent).not.toContain('The mermaid diagram in your response has syntax errors');
204
+ expect(allContent).not.toContain('Your response does not match the expected JSON schema');
205
+ expect(allContent).not.toContain('When using <attempt_complete>, this must be the ONLY content');
206
+
207
+ // Verify assistant responses before schema are kept
208
+ expect(allContent).toContain('I\'ll analyze the authentication system');
209
+ expect(allContent).toContain('corrected diagram');
210
+ // These are AFTER the schema message, so should NOT be in clone:
211
+ expect(allContent).not.toContain('vulnerabilities'); // After schema at index 12
212
+ expect(allContent).not.toContain('authorization permissions'); // After schema at index 16
213
+
214
+ console.log(`\n✅ Successfully removed ${baseAgent.history.length - clonedAgent.history.length} internal messages`);
215
+ console.log('✅ All meaningful conversation content preserved');
216
+ });
217
+
218
+ test('should preserve all messages when stripInternalMessages is false', () => {
219
+ // Same realistic history
220
+ baseAgent.history = [
221
+ { role: 'system', content: 'System' },
222
+ { role: 'user', content: 'Real question' },
223
+ { role: 'assistant', content: 'Answer' },
224
+ { role: 'user', content: 'IMPORTANT: A schema was provided. You MUST respond...' },
225
+ { role: 'assistant', content: 'Schema response' },
226
+ { role: 'user', content: 'Please use one of the available tools...' },
227
+ { role: 'assistant', content: 'Tool call' }
228
+ ];
229
+
230
+ const clonedAgent = baseAgent.clone({
231
+ stripInternalMessages: false
232
+ });
233
+
234
+ // Should keep ALL messages including internal ones
235
+ expect(clonedAgent.history).toHaveLength(baseAgent.history.length);
236
+ expect(clonedAgent.history).toHaveLength(7);
237
+
238
+ const allContent = clonedAgent.history.map(m => m.content).join('\n');
239
+ expect(allContent).toContain('IMPORTANT: A schema was provided');
240
+ expect(allContent).toContain('Please use one of the available tools');
241
+ });
242
+
243
+ test('should handle complex content structures in realistic scenario', () => {
244
+ baseAgent.history = [
245
+ { role: 'system', content: 'System' },
246
+ // User message with images
247
+ {
248
+ role: 'user',
249
+ content: [
250
+ { type: 'text', text: 'Analyze this screenshot' },
251
+ { type: 'image', image: 'data:image/png;base64,iVBORw0KGg...' }
252
+ ]
253
+ },
254
+ { role: 'assistant', content: 'I can see the screenshot shows...' },
255
+ // Internal reminder (should be stripped)
256
+ {
257
+ role: 'user',
258
+ content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.'
259
+ },
260
+ // User message with complex content (should be kept)
261
+ {
262
+ role: 'user',
263
+ content: [
264
+ { type: 'text', text: 'Provide analysis in JSON' }
265
+ ]
266
+ },
267
+ { role: 'assistant', content: '{"analysis": "complete"}' }
268
+ ];
269
+
270
+ const clonedAgent = baseAgent.clone();
271
+
272
+ // Truncates at schema message (index 3)
273
+ // Keeps: 0 (system), 1 (user with image), 2 (assistant)
274
+ // Removes: 3 (schema), 4 (user), 5 (assistant)
275
+ expect(clonedAgent.history).toHaveLength(3);
276
+
277
+ // Verify complex content structures are preserved
278
+ const userWithImage = clonedAgent.history.find(m =>
279
+ Array.isArray(m.content) && m.content.some(c => c.type === 'image')
280
+ );
281
+ expect(userWithImage).toBeDefined();
282
+ expect(userWithImage.content).toHaveLength(2);
283
+ expect(userWithImage.content[1].type).toBe('image');
284
+
285
+ // Verify internal message was removed (via truncation)
286
+ const schemaReminder = clonedAgent.history.find(m =>
287
+ typeof m.content === 'string' && m.content.includes('IMPORTANT: A schema was provided')
288
+ );
289
+ expect(schemaReminder).toBeUndefined();
290
+ });
291
+
292
+ test('should handle session with multiple schema attempts', () => {
293
+ // Realistic scenario: AI fails schema validation multiple times
294
+ baseAgent.history = [
295
+ { role: 'system', content: 'System' },
296
+ { role: 'user', content: 'Generate a report' },
297
+ { role: 'assistant', content: 'Here is my report' },
298
+ // First schema reminder
299
+ {
300
+ role: 'user',
301
+ content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\nYour response must conform to this schema: {...}'
302
+ },
303
+ { role: 'assistant', content: '{"incomplete": true}' },
304
+ // Second schema reminder (JSON correction)
305
+ {
306
+ role: 'user',
307
+ content: 'Your response does not match the expected JSON schema. Please provide a valid JSON response.\n\nSchema validation error: Missing required field "status"'
308
+ },
309
+ { role: 'assistant', content: '{"status": "complete", "data": {}}' },
310
+ // Third schema reminder
311
+ {
312
+ role: 'user',
313
+ content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.'
314
+ },
315
+ { role: 'assistant', content: '{"status": "complete", "data": {}, "metadata": {}}' }
316
+ ];
317
+
318
+ const clonedAgent = baseAgent.clone();
319
+
320
+ // Truncates at first schema message (index 3)
321
+ // Original: 9 messages (0-8)
322
+ // Keeps: 0 (system), 1 (user), 2 (assistant)
323
+ // Removes: 3 (schema), 4 (assistant), 5 (schema), 6 (assistant), 7 (schema), 8 (assistant)
324
+ expect(baseAgent.history).toHaveLength(9);
325
+ expect(clonedAgent.history).toHaveLength(3);
326
+
327
+ expect(clonedAgent.history.filter(m => m.role === 'system')).toHaveLength(1);
328
+ expect(clonedAgent.history.filter(m => m.role === 'user')).toHaveLength(1); // Only the real user question
329
+ expect(clonedAgent.history.filter(m => m.role === 'assistant')).toHaveLength(1); // Only first attempt before schema
330
+
331
+ // Verify no schema reminders remain
332
+ const allContent = clonedAgent.history.map(m => m.content).join('\n');
333
+ expect(allContent).not.toContain('IMPORTANT: A schema was provided');
334
+ expect(allContent).not.toContain('does not match the expected JSON schema');
335
+ expect(allContent).not.toContain('{"incomplete": true}'); // After schema
336
+ expect(allContent).not.toContain('{"status": "complete"'); // After schema
337
+
338
+ // Verify the real user message is kept
339
+ const userMessages = clonedAgent.history.filter(m => m.role === 'user');
340
+ expect(userMessages[0].content).toBe('Generate a report');
341
+ });
342
+
343
+ test('should handle session with multiple mermaid fix attempts', () => {
344
+ // Realistic scenario: Multiple mermaid syntax errors
345
+ baseAgent.history = [
346
+ { role: 'system', content: 'System' },
347
+ { role: 'user', content: 'Create a flowchart' },
348
+ { role: 'assistant', content: '```mermaid\ngraph TD\nA -> B\n```' },
349
+ // First mermaid fix
350
+ {
351
+ role: 'user',
352
+ 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```'
353
+ },
354
+ { role: 'assistant', content: '```mermaid\ngraph TD\nA --> B\nC -> D\n```' },
355
+ // Second mermaid fix
356
+ {
357
+ role: 'user',
358
+ content: 'The mermaid diagram in your response has syntax errors. Please fix the mermaid syntax errors.'
359
+ },
360
+ { role: 'assistant', content: '```mermaid\ngraph TD\nA --> B\nC --> D\n```' }
361
+ ];
362
+
363
+ const clonedAgent = baseAgent.clone();
364
+
365
+ // Should remove both mermaid fix prompts
366
+ expect(baseAgent.history).toHaveLength(7);
367
+ expect(clonedAgent.history).toHaveLength(5);
368
+
369
+ // Verify no mermaid fix prompts remain
370
+ const allContent = clonedAgent.history.map(m => m.content).join('\n');
371
+ expect(allContent).not.toContain('mermaid diagram in your response has syntax errors');
372
+ });
373
+
374
+ test('should handle empty and null content in realistic scenario', () => {
375
+ baseAgent.history = [
376
+ { role: 'system', content: 'System' },
377
+ { role: 'user', content: 'Question' },
378
+ { role: 'assistant', content: null }, // Edge case
379
+ { role: 'user', content: 'IMPORTANT: A schema was provided...' }, // Should be stripped
380
+ { role: 'assistant', content: '' }, // Edge case
381
+ { role: 'user', content: undefined }, // Edge case
382
+ { role: 'assistant', content: 'Final answer' }
383
+ ];
384
+
385
+ const clonedAgent = baseAgent.clone();
386
+
387
+ // Truncates at schema message (index 3)
388
+ // Keeps: 0 (system), 1 (user), 2 (assistant with null)
389
+ // Removes: 3 (schema), 4 (assistant), 5 (user), 6 (assistant)
390
+ expect(clonedAgent.history).toHaveLength(3);
391
+
392
+ // Verify schema reminder was removed (via truncation)
393
+ const schemaReminder = clonedAgent.history.find(m =>
394
+ m.content && m.content.includes('IMPORTANT: A schema was provided')
395
+ );
396
+ expect(schemaReminder).toBeUndefined();
397
+ });
398
+
399
+ test('should correctly identify partial matches vs full internal messages', () => {
400
+ baseAgent.history = [
401
+ { role: 'system', content: 'System' },
402
+ // Actual user question that happens to contain similar words (should be kept)
403
+ { role: 'user', content: 'Can you use the available tools to search?' },
404
+ { role: 'assistant', content: 'Yes, I will' },
405
+ // Real internal message (should be stripped)
406
+ {
407
+ role: 'user',
408
+ 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:'
409
+ },
410
+ { role: 'assistant', content: '<search><query>test</query></search>' }
411
+ ];
412
+
413
+ const clonedAgent = baseAgent.clone();
414
+
415
+ // Should keep user question but strip internal reminder
416
+ expect(clonedAgent.history).toHaveLength(4);
417
+
418
+ const userMessages = clonedAgent.history.filter(m => m.role === 'user');
419
+ expect(userMessages).toHaveLength(1);
420
+ expect(userMessages[0].content).toBe('Can you use the available tools to search?');
421
+ });
422
+
423
+ test('should provide clean context for parallel task execution', () => {
424
+ // Simulate building context with one agent, then cloning for parallel tasks
425
+ baseAgent.history = [
426
+ { role: 'system', content: 'You are a code reviewer' },
427
+ { role: 'user', content: 'Review the codebase' },
428
+ { role: 'assistant', content: '<search><query>code review</query></search>' },
429
+ // Full tool reminder (internal - should be stripped)
430
+ {
431
+ role: 'user',
432
+ 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:'
433
+ },
434
+ { role: 'assistant', content: '<search><query>code</query></search>' },
435
+ { role: 'user', content: 'Found 100 files' },
436
+ { role: 'assistant', content: 'Analyzed the codebase structure' },
437
+ { role: 'user', content: 'Provide security analysis' },
438
+ { role: 'assistant', content: 'Security looks good' },
439
+ // Schema reminder (internal - should be stripped)
440
+ { role: 'user', content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.' },
441
+ { role: 'assistant', content: '{"security": "good"}' }
442
+ ];
443
+
444
+ // Clone for different parallel tasks
445
+ const securityClone = baseAgent.clone({ sessionId: 'security-check' });
446
+ const performanceClone = baseAgent.clone({ sessionId: 'performance-check' });
447
+ const styleClone = baseAgent.clone({ sessionId: 'style-check' });
448
+
449
+ // All clones should have clean history
450
+ [securityClone, performanceClone, styleClone].forEach(clone => {
451
+ // Original: 11 messages (0-10)
452
+ // Truncates at schema (index 9), keeps 0-8
453
+ // Then filters tool reminder at index 3
454
+ // Result: 8 messages (1 system + 2 user + 5 assistant)
455
+ expect(clone.history).toHaveLength(8);
456
+
457
+ // Should not contain internal messages
458
+ const content = clone.history.map(m => m.content).join('\n');
459
+ expect(content).not.toContain('Please use one of the available tools to help answer');
460
+ expect(content).not.toContain('IMPORTANT: A schema was provided');
461
+
462
+ // Should contain real conversation
463
+ expect(content).toContain('Review the codebase');
464
+ expect(content).toContain('Found 100 files');
465
+ expect(content).toContain('Analyzed the codebase structure');
466
+ });
467
+
468
+ // Each clone should have unique session ID
469
+ expect(securityClone.sessionId).toBe('security-check');
470
+ expect(performanceClone.sessionId).toBe('performance-check');
471
+ expect(styleClone.sessionId).toBe('style-check');
472
+ });
473
+
474
+ test('should strip CRITICAL schema formatting messages (recursive answer call)', () => {
475
+ // Simulate a realistic scenario where schema causes a recursive answer() call
476
+ // with CRITICAL formatting prompt
477
+ baseAgent.history = [
478
+ { role: 'system', content: 'You are a helpful AI assistant' },
479
+ { role: 'user', content: 'Provide an overview of the codebase' },
480
+ { role: 'assistant', content: 'Here is my analysis of the codebase...' },
481
+ // First schema reminder (should be stripped)
482
+ {
483
+ role: 'user',
484
+ content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\nUse attempt_completion with your response directly inside the tags:\n\n<attempt_completion>\n[Your response content matching the provided schema format]\n</attempt_completion>\n\nYour response must conform to this schema:\n{"type": "object", "properties": {"overview": {"type": "string"}}}'
485
+ },
486
+ { role: 'assistant', content: '<attempt_completion>\nOverview content\n</attempt_completion>' },
487
+ // CRITICAL schema formatting prompt from recursive answer() call (should be stripped)
488
+ {
489
+ role: 'user',
490
+ 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": {"overview": {"type": "string"}, "summary": {"type": "string"}}}\n\nREQUIREMENTS:\n- Return ONLY the JSON object/array with REAL DATA that matches the schema structure\n- DO NOT return the schema definition itself (no "$schema", "$id", "type", "properties", etc.)\n- NO additional text, explanations, or markdown formatting'
491
+ },
492
+ { role: 'assistant', content: '{"overview": "The codebase analysis", "summary": "Summary text"}' }
493
+ ];
494
+
495
+ const clonedAgent = baseAgent.clone({
496
+ stripInternalMessages: true
497
+ });
498
+
499
+ // Truncation behavior: First schema message at index 3 (IMPORTANT), truncate from there
500
+ // Original: 7 messages (0: system, 1: user, 2: assistant, 3: IMPORTANT, 4: assistant, 5: CRITICAL, 6: assistant)
501
+ // Cloned: 3 messages (0: system, 1: user, 2: assistant) - everything from index 3 removed
502
+ expect(baseAgent.history).toHaveLength(7);
503
+ expect(clonedAgent.history).toHaveLength(3);
504
+
505
+ expect(clonedAgent.history.filter(m => m.role === 'system')).toHaveLength(1);
506
+ expect(clonedAgent.history.filter(m => m.role === 'user')).toHaveLength(1); // Only real question
507
+ expect(clonedAgent.history.filter(m => m.role === 'assistant')).toHaveLength(1); // Only first assistant response
508
+
509
+ // Verify internal messages are NOT in clone
510
+ const allContent = clonedAgent.history.map(m => m.content).join('\n');
511
+ expect(allContent).not.toContain('IMPORTANT: A schema was provided');
512
+ expect(allContent).not.toContain('CRITICAL: You MUST respond with ONLY valid JSON DATA');
513
+ expect(allContent).not.toContain('Schema to follow (this is just the structure');
514
+ expect(allContent).not.toContain('DO NOT return the schema definition itself');
515
+ expect(allContent).not.toContain('Overview content'); // This was after schema, so removed
516
+ expect(allContent).not.toContain('"overview": "The codebase analysis"'); // This was after schema, so removed
517
+
518
+ // Verify content before schema is kept
519
+ expect(allContent).toContain('Provide an overview of the codebase');
520
+ expect(allContent).toContain('Here is my analysis');
521
+ });
522
+
523
+ test('should handle visor-style session cloning scenario (overview → code-review)', () => {
524
+ // Simulate the exact scenario from visor where:
525
+ // 1. Overview check runs with schema="overview"
526
+ // 2. Session is cloned for code-review with schema="code-review"
527
+ // 3. The CRITICAL schema message from overview should NOT leak into code-review
528
+ baseAgent.history = [
529
+ { role: 'system', content: 'You are a code review assistant' },
530
+
531
+ // Overview check conversation
532
+ { role: 'user', content: 'Analyze this PR and provide an overview' },
533
+ { role: 'assistant', content: '<search><query>PR changes</query></search>' },
534
+ { role: 'user', content: '<tool_result>\nFound 5 files changed\n</tool_result>' },
535
+ { role: 'assistant', content: 'Based on the changes, here is my overview...' },
536
+
537
+ // Schema reminder for overview (should be stripped)
538
+ {
539
+ role: 'user',
540
+ content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.\nYour response must conform to this schema:\n{"$id": "overview", "type": "object", "properties": {"summary": {"type": "string"}}}'
541
+ },
542
+ { role: 'assistant', content: '<attempt_completion>\n{"summary": "Overview of changes"}\n</attempt_completion>' },
543
+
544
+ // CRITICAL schema formatting for overview (should be stripped)
545
+ {
546
+ role: 'user',
547
+ 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{"$id": "overview", "type": "object", "properties": {"summary": {"type": "string"}}}\n\nREQUIREMENTS:\n- Return ONLY the JSON object/array with REAL DATA'
548
+ },
549
+ { role: 'assistant', content: '{"summary": "Overview of changes"}' }
550
+ ];
551
+
552
+ // Clone for code-review (simulating visor's session cloning)
553
+ const codeReviewClone = baseAgent.clone({
554
+ sessionId: 'code-review-session',
555
+ stripInternalMessages: true,
556
+ keepSystemMessage: true,
557
+ deepCopy: true
558
+ });
559
+
560
+ // Truncation at first schema message (index 5)
561
+ // Original: 9 messages (0-8)
562
+ // Cloned: 5 messages (0-4) - truncated at index 5 where IMPORTANT appears
563
+ expect(codeReviewClone.history).toHaveLength(5);
564
+ expect(codeReviewClone.sessionId).toBe('code-review-session');
565
+
566
+ // Verify NO schema messages remain
567
+ const cloneContent = codeReviewClone.history.map(m => m.content).join('\n');
568
+ expect(cloneContent).not.toContain('IMPORTANT: A schema was provided');
569
+ expect(cloneContent).not.toContain('CRITICAL: You MUST respond');
570
+ expect(cloneContent).not.toContain('Schema to follow');
571
+ expect(cloneContent).not.toContain('"$id": "overview"');
572
+ expect(cloneContent).not.toContain('attempt_completion'); // This was after schema
573
+
574
+ // Verify real conversation before schema is kept
575
+ expect(cloneContent).toContain('Analyze this PR');
576
+ expect(cloneContent).toContain('Found 5 files changed');
577
+ expect(cloneContent).toContain('here is my overview');
578
+
579
+ // Verify assistant's responses before schema are kept
580
+ const assistantMessages = codeReviewClone.history.filter(m => m.role === 'assistant');
581
+ expect(assistantMessages).toHaveLength(2); // Only 2 assistant messages before schema
582
+ expect(assistantMessages[0].content).toContain('<search>');
583
+ expect(assistantMessages[1].content).toContain('here is my overview');
584
+ });
585
+
586
+ test('should strip multiple CRITICAL messages from multiple schema iterations', () => {
587
+ // Test scenario where schema validation fails multiple times,
588
+ // generating multiple CRITICAL messages
589
+ baseAgent.history = [
590
+ { role: 'system', content: 'System' },
591
+ { role: 'user', content: 'Generate report' },
592
+ { role: 'assistant', content: 'Report content' },
593
+
594
+ // First schema attempt
595
+ {
596
+ role: 'user',
597
+ content: 'IMPORTANT: A schema was provided. You MUST respond with data that matches this schema.'
598
+ },
599
+ { role: 'assistant', content: '<attempt_completion>\nReport\n</attempt_completion>' },
600
+
601
+ // First CRITICAL formatting
602
+ {
603
+ role: 'user',
604
+ content: 'CRITICAL: You MUST respond with ONLY valid JSON DATA that conforms to this schema structure.\n\nSchema to follow (this is just the structure - provide ACTUAL DATA):\n{"type": "object"}'
605
+ },
606
+ { role: 'assistant', content: '{"invalid": true}' },
607
+
608
+ // JSON correction
609
+ {
610
+ role: 'user',
611
+ content: 'Your response does not match the expected JSON schema. Please provide a valid JSON response.'
612
+ },
613
+
614
+ // Second CRITICAL formatting
615
+ {
616
+ role: 'user',
617
+ content: 'CRITICAL: You MUST respond with ONLY valid JSON DATA that conforms to this schema structure.\n\nSchema to follow (this is just the structure - provide ACTUAL DATA):\n{"type": "object", "properties": {"report": {"type": "string"}}}'
618
+ },
619
+ { role: 'assistant', content: '{"report": "Final report"}' }
620
+ ];
621
+
622
+ const cloned = baseAgent.clone();
623
+
624
+ // Truncation at first schema message (index 3 - IMPORTANT)
625
+ // Original: 10 messages (0-9)
626
+ // Cloned: 3 messages (0-2) - truncated at index 3
627
+ expect(baseAgent.history).toHaveLength(10);
628
+ expect(cloned.history).toHaveLength(3); // system + user + assistant (before schema)
629
+
630
+ const content = cloned.history.map(m => m.content).join('\n');
631
+ expect(content).not.toContain('IMPORTANT: A schema was provided');
632
+ expect(content).not.toContain('CRITICAL: You MUST respond');
633
+ expect(content).not.toContain('Schema to follow');
634
+ expect(content).not.toContain('does not match the expected JSON schema');
635
+ expect(content).not.toContain('attempt_completion'); // After schema
636
+ expect(content).not.toContain('{"invalid": true}'); // After schema
637
+ expect(content).not.toContain('Final report'); // After schema
638
+
639
+ // Only content before schema remains
640
+ expect(content).toContain('Generate report');
641
+ expect(content).toContain('Report content');
642
+ });
643
+ });